source: src/molecule_template.hpp@ db6bf74

Action_Thermostats Add_AtomRandomPerturbation Add_FitFragmentPartialChargesAction Add_RotateAroundBondAction Add_SelectAtomByNameAction Added_ParseSaveFragmentResults AddingActions_SaveParseParticleParameters Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_ParticleName_to_Atom Adding_StructOpt_integration_tests AtomFragments Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.5.4 Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator CombiningParticlePotentialParsing Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_BoundInBox_CenterInBox_MoleculeActions Fix_ChargeSampling_PBC Fix_ChronosMutex Fix_FitPartialCharges Fix_FitPotential_needs_atomicnumbers Fix_ForceAnnealing Fix_IndependentFragmentGrids Fix_ParseParticles Fix_ParseParticles_split_forward_backward_Actions Fix_PopActions Fix_QtFragmentList_sorted_selection Fix_Restrictedkeyset_FragmentMolecule Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns Fix_fitting_potentials Fixes ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion FragmentAction_writes_AtomFragments FragmentMolecule_checks_bonddegrees GeometryObjects Gui_Fixes Gui_displays_atomic_force_velocity ImplicitCharges IndependentFragmentGrids IndependentFragmentGrids_IndividualZeroInstances IndependentFragmentGrids_IntegrationTest IndependentFragmentGrids_Sole_NN_Calculation JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix MoreRobust_FragmentAutomation ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PdbParser_setsAtomName PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks Rewrite_FitPartialCharges RotateToPrincipalAxisSystem_UndoRedo SaturateAtoms_findBestMatching SaturateAtoms_singleDegree StoppableMakroAction Subpackage_CodePatterns Subpackage_JobMarket Subpackage_LinearAlgebra Subpackage_levmar Subpackage_mpqc_open Subpackage_vmg Switchable_LogView ThirdParty_MPQC_rebuilt_buildsystem TrajectoryDependenant_MaxOrder TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps TremoloParser_setsAtomName Ubuntu_1604_changes stable
Last change on this file since db6bf74 was 5034e1, checked in by Frederik Heber <heber@…>, 16 years ago

First half of molecule_fragmentation.cpp refactoring.

  • Property mode set to 100644
File size: 15.3 KB
Line 
1/*
2 * molecule_template.hpp
3 *
4 * Created on: Oct 6, 2009
5 * Author: heber
6 */
7
8#ifndef MOLECULE_TEMPLATE_HPP_
9#define MOLECULE_TEMPLATE_HPP_
10
11/*********************************************** includes ***********************************/
12
13// include config.h
14#ifdef HAVE_CONFIG_H
15#include <config.h>
16#endif
17
18/********************************************** declarations *******************************/
19
20// ================== Acting on all Vectors ========================== //
21
22// zero arguments
23template <typename res> void molecule::ActOnAllVectors( res (Vector::*f)() )
24{
25 atom *Walker = start;
26 while (Walker->next != end) {
27 Walker = Walker->next;
28 ((Walker->node)->*f)();
29 }
30};
31template <typename res> void molecule::ActOnAllVectors( res (Vector::*f)() const )
32{
33 atom *Walker = start;
34 while (Walker->next != end) {
35 Walker = Walker->next;
36 ((Walker->node)->*f)();
37 }
38};
39template <typename res> void molecule::ActOnAllVectors( res (Vector::*f)() ) const
40 {
41 atom *Walker = start;
42 while (Walker->next != end) {
43 Walker = Walker->next;
44 ((Walker->node)->*f)();
45 }
46};
47template <typename res> void molecule::ActOnAllVectors( res (Vector::*f)() const ) const
48 {
49 atom *Walker = start;
50 while (Walker->next != end) {
51 Walker = Walker->next;
52 ((Walker->node)->*f)();
53 }
54};
55// one argument
56template <typename res, typename T> void molecule::ActOnAllVectors( res (Vector::*f)(T), T t )
57{
58 atom *Walker = start;
59 while (Walker->next != end) {
60 Walker = Walker->next;
61 ((Walker->node)->*f)(t);
62 }
63};
64template <typename res, typename T> void molecule::ActOnAllVectors( res (Vector::*f)(T) const, T t )
65{
66 atom *Walker = start;
67 while (Walker->next != end) {
68 Walker = Walker->next;
69 ((Walker->node)->*f)(t);
70 }
71};
72template <typename res, typename T> void molecule::ActOnAllVectors( res (Vector::*f)(T), T t ) const
73{
74 atom *Walker = start;
75 while (Walker->next != end) {
76 Walker = Walker->next;
77 ((Walker->node)->*f)(t);
78 }
79};
80template <typename res, typename T> void molecule::ActOnAllVectors( res (Vector::*f)(T) const, T t ) const
81{
82 atom *Walker = start;
83 while (Walker->next != end) {
84 Walker = Walker->next;
85 ((Walker->node)->*f)(t);
86 }
87};
88// two arguments
89template <typename res, typename T, typename U> void molecule::ActOnAllVectors( res (Vector::*f)(T, U), T t, U u )
90{
91 atom *Walker = start;
92 while (Walker->next != end) {
93 Walker = Walker->next;
94 ((Walker->node)->*f)(t, u);
95 }
96};
97template <typename res, typename T, typename U> void molecule::ActOnAllVectors( res (Vector::*f)(T, U) const, T t, U u )
98{
99 atom *Walker = start;
100 while (Walker->next != end) {
101 Walker = Walker->next;
102 ((Walker->node)->*f)(t, u);
103 }
104};
105template <typename res, typename T, typename U> void molecule::ActOnAllVectors( res (Vector::*f)(T, U), T t, U u ) const
106{
107 atom *Walker = start;
108 while (Walker->next != end) {
109 Walker = Walker->next;
110 ((Walker->node)->*f)(t, u);
111 }
112};
113template <typename res, typename T, typename U> void molecule::ActOnAllVectors( res (Vector::*f)(T, U) const, T t, U u ) const
114{
115 atom *Walker = start;
116 while (Walker->next != end) {
117 Walker = Walker->next;
118 ((Walker->node)->*f)(t, u);
119 }
120};
121// three arguments
122template <typename res, typename T, typename U, typename V> void molecule::ActOnAllVectors( res (Vector::*f)(T, U, V), T t, U u, V v)
123{
124 atom *Walker = start;
125 while (Walker->next != end) {
126 Walker = Walker->next;
127 ((Walker->node)->*f)(t, u, v);
128 }
129};
130template <typename res, typename T, typename U, typename V> void molecule::ActOnAllVectors( res (Vector::*f)(T, U, V) const, T t, U u, V v)
131{
132 atom *Walker = start;
133 while (Walker->next != end) {
134 Walker = Walker->next;
135 ((Walker->node)->*f)(t, u, v);
136 }
137};
138template <typename res, typename T, typename U, typename V> void molecule::ActOnAllVectors( res (Vector::*f)(T, U, V), T t, U u, V v) const
139{
140 atom *Walker = start;
141 while (Walker->next != end) {
142 Walker = Walker->next;
143 ((Walker->node)->*f)(t, u, v);
144 }
145};
146template <typename res, typename T, typename U, typename V> void molecule::ActOnAllVectors( res (Vector::*f)(T, U, V) const, T t, U u, V v) const
147{
148 atom *Walker = start;
149 while (Walker->next != end) {
150 Walker = Walker->next;
151 ((Walker->node)->*f)(t, u, v);
152 }
153};
154
155// ================== Acting with each Atoms on same molecule ========================== //
156
157// zero arguments
158template <typename res> void molecule::ActWithEachAtom( res (molecule::*f)(atom *))
159{
160 atom *Walker = start;
161 while (Walker->next != end) {
162 Walker = Walker->next;
163 (*f)(Walker);
164 }
165};
166template <typename res> void molecule::ActWithEachAtom( res (molecule::*f)(atom *) const)
167{
168 atom *Walker = start;
169 while (Walker->next != end) {
170 Walker = Walker->next;
171 (*f)(Walker);
172 }
173};
174template <typename res> void molecule::ActWithEachAtom( res (molecule::*f)(atom *)) const
175{
176 atom *Walker = start;
177 while (Walker->next != end) {
178 Walker = Walker->next;
179 (*f)(Walker);
180 }
181};
182template <typename res> void molecule::ActWithEachAtom( res (molecule::*f)(atom *) const) const
183{
184 atom *Walker = start;
185 while (Walker->next != end) {
186 Walker = Walker->next;
187 (*f)(Walker);
188 }
189};
190
191// ================== Acting with each Atoms on copy molecule ========================== //
192
193// zero arguments
194template <typename res> void molecule::ActOnCopyWithEachAtom( res (molecule::*f)(atom *) , molecule *copy)
195{
196 atom *Walker = start;
197 while (Walker->next != end) {
198 Walker = Walker->next;
199 (copy->*f)(Walker);
200 }
201};
202template <typename res> void molecule::ActOnCopyWithEachAtom( res (molecule::*f)(atom *) const , molecule *copy)
203{
204 atom *Walker = start;
205 while (Walker->next != end) {
206 Walker = Walker->next;
207 (copy->*f)(Walker);
208 }
209};
210template <typename res> void molecule::ActOnCopyWithEachAtom( res (molecule::*f)(atom *) , molecule *copy) const
211{
212 atom *Walker = start;
213 while (Walker->next != end) {
214 Walker = Walker->next;
215 (copy->*f)(Walker);
216 }
217};
218template <typename res> void molecule::ActOnCopyWithEachAtom( res (molecule::*f)(atom *) const, molecule *copy) const
219{
220 atom *Walker = start;
221 while (Walker->next != end) {
222 Walker = Walker->next;
223 (copy->*f)(Walker);
224 }
225};
226
227// ================== Acting with each Atoms on copy molecule if true ========================== //
228
229// zero arguments
230template <typename res> void molecule::ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) , molecule *copy, bool (atom::*condition) () )
231{
232 atom *Walker = start;
233 while (Walker->next != end) {
234 Walker = Walker->next;
235 if ((Walker->*condition)())
236 (copy->*f)(Walker);
237 }
238};
239// one argument
240template <typename res, typename T> void molecule::ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) , molecule *copy, bool (atom::*condition) (T), T t )
241{
242 atom *Walker = start;
243 while (Walker->next != end) {
244 Walker = Walker->next;
245 if ((Walker->*condition)(t))
246 (copy->*f)(Walker);
247 }
248};
249// two arguments
250template <typename res, typename T, typename U> void molecule::ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) , molecule *copy, bool (atom::*condition) (T, U), T t, U u )
251{
252 atom *Walker = start;
253 while (Walker->next != end) {
254 Walker = Walker->next;
255 if ((Walker->*condition)(t,u))
256 (copy->*f)(Walker);
257 }
258};
259// three arguments
260template <typename res, typename T, typename U, typename V> void molecule::ActOnCopyWithEachAtomIfTrue( res (molecule::*f)(atom *) , molecule *copy, bool (atom::*condition) (T, U, V), T t, U u, V v )
261{
262 atom *Walker = start;
263 while (Walker->next != end) {
264 Walker = Walker->next;
265 if ((Walker->*condition)(t,u,v))
266 (copy->*f)(Walker);
267 }
268};
269
270// ================== Acting on all Atoms ========================== //
271
272// zero arguments
273template <typename res> void molecule::ActOnAllAtoms( res (atom::*f)())
274{
275 atom *Walker = start;
276 while (Walker->next != end) {
277 Walker = Walker->next;
278 (Walker->*f)();
279 }
280};
281template <typename res> void molecule::ActOnAllAtoms( res (atom::*f)() const)
282{
283 atom *Walker = start;
284 while (Walker->next != end) {
285 Walker = Walker->next;
286 (Walker->*f)();
287 }
288};
289template <typename res> void molecule::ActOnAllAtoms( res (atom::*f)()) const
290{
291 atom *Walker = start;
292 while (Walker->next != end) {
293 Walker = Walker->next;
294 (Walker->*f)();
295 }
296};
297template <typename res> void molecule::ActOnAllAtoms( res (atom::*f)() const) const
298{
299 atom *Walker = start;
300 while (Walker->next != end) {
301 Walker = Walker->next;
302 (Walker->*f)();
303 }
304};
305// one argument
306template <typename res, typename T> void molecule::ActOnAllAtoms( res (atom::*f)(T), T t )
307{
308 atom *Walker = start;
309 while (Walker->next != end) {
310 Walker = Walker->next;
311 (Walker->*f)(t);
312 }
313};
314template <typename res, typename T> void molecule::ActOnAllAtoms( res (atom::*f)(T) const, T t )
315{
316 atom *Walker = start;
317 while (Walker->next != end) {
318 Walker = Walker->next;
319 (Walker->*f)(t);
320 }
321};
322template <typename res, typename T> void molecule::ActOnAllAtoms( res (atom::*f)(T), T t ) const
323{
324 atom *Walker = start;
325 while (Walker->next != end) {
326 Walker = Walker->next;
327 (Walker->*f)(t);
328 }
329};
330template <typename res, typename T> void molecule::ActOnAllAtoms( res (atom::*f)(T) const, T t ) const
331{
332 atom *Walker = start;
333 while (Walker->next != end) {
334 Walker = Walker->next;
335 (Walker->*f)(t);
336 }
337};
338// two argument
339template <typename res, typename T, typename U> void molecule::ActOnAllAtoms( res (atom::*f)(T, U), T t, U u )
340{
341 atom *Walker = start;
342 while (Walker->next != end) {
343 Walker = Walker->next;
344 (Walker->*f)(t, u);
345 }
346};
347template <typename res, typename T, typename U> void molecule::ActOnAllAtoms( res (atom::*f)(T, U) const, T t, U u )
348{
349 atom *Walker = start;
350 while (Walker->next != end) {
351 Walker = Walker->next;
352 (Walker->*f)(t, u);
353 }
354};
355template <typename res, typename T, typename U> void molecule::ActOnAllAtoms( res (atom::*f)(T, U), T t, U u ) const
356{
357 atom *Walker = start;
358 while (Walker->next != end) {
359 Walker = Walker->next;
360 (Walker->*f)(t, u);
361 }
362};
363template <typename res, typename T, typename U> void molecule::ActOnAllAtoms( res (atom::*f)(T, U) const, T t, U u ) const
364{
365 atom *Walker = start;
366 while (Walker->next != end) {
367 Walker = Walker->next;
368 (Walker->*f)(t, u);
369 }
370};
371// three argument
372template <typename res, typename T, typename U, typename V> void molecule::ActOnAllAtoms( res (atom::*f)(T, U, V), T t, U u, V v)
373{
374 atom *Walker = start;
375 while (Walker->next != end) {
376 Walker = Walker->next;
377 (Walker->*f)(t, u, v);
378 }
379};
380template <typename res, typename T, typename U, typename V> void molecule::ActOnAllAtoms( res (atom::*f)(T, U, V) const, T t, U u, V v)
381{
382 atom *Walker = start;
383 while (Walker->next != end) {
384 Walker = Walker->next;
385 (Walker->*f)(t, u, v);
386 }
387};
388template <typename res, typename T, typename U, typename V> void molecule::ActOnAllAtoms( res (atom::*f)(T, U, V), T t, U u, V v) const
389{
390 atom *Walker = start;
391 while (Walker->next != end) {
392 Walker = Walker->next;
393 (Walker->*f)(t, u, v);
394 }
395};
396template <typename res, typename T, typename U, typename V> void molecule::ActOnAllAtoms( res (atom::*f)(T, U, V) const, T t, U u, V v) const
397{
398 atom *Walker = start;
399 while (Walker->next != end) {
400 Walker = Walker->next;
401 (Walker->*f)(t, u, v);
402 }
403};
404// four arguments
405template <typename res, typename T, typename U, typename V, typename W> void molecule::ActOnAllAtoms( res (atom::*f)(T, U, V, W), T t, U u, V v, W w)
406{
407 atom *Walker = start;
408 while (Walker->next != end) {
409 Walker = Walker->next;
410 (Walker->*f)(t, u, v, w);
411 }
412};
413template <typename res, typename T, typename U, typename V, typename W> void molecule::ActOnAllAtoms( res (atom::*f)(T, U, V, W) const, T t, U u, V v, W w)
414{
415 atom *Walker = start;
416 while (Walker->next != end) {
417 Walker = Walker->next;
418 (Walker->*f)(t, u, v, w);
419 }
420};
421template <typename res, typename T, typename U, typename V, typename W> void molecule::ActOnAllAtoms( res (atom::*f)(T, U, V, W), T t, U u, V v, W w) const
422{
423 atom *Walker = start;
424 while (Walker->next != end) {
425 Walker = Walker->next;
426 (Walker->*f)(t, u, v, w);
427 }
428};
429template <typename res, typename T, typename U, typename V, typename W> void molecule::ActOnAllAtoms( res (atom::*f)(T, U, V, W) const, T t, U u, V v, W w) const
430{
431 atom *Walker = start;
432 while (Walker->next != end) {
433 Walker = Walker->next;
434 (Walker->*f)(t, u, v, w);
435 }
436};
437
438// ===================== Accessing arrays indexed by some integer for each atom ======================
439
440// for atom ints
441template <typename T> void molecule::SetIndexedArrayForEachAtomTo ( T *array, int TesselPoint::*index, void (*Setor)(T *, T *) )
442{
443 atom *Walker = start;
444 int inc = 1;
445 while (Walker->next != end) {
446 Walker = Walker->next;
447 (*Setor) (&array[(Walker->*index)], &inc);
448 }
449};
450template <typename T> void molecule::SetIndexedArrayForEachAtomTo ( T *array, int TesselPoint::*index, void (*Setor)(T *, T *), T value )
451{
452 atom *Walker = start;
453 while (Walker->next != end) {
454 Walker = Walker->next;
455 (*Setor) (&array[(Walker->*index)], &value);
456 }
457};
458template <typename T> void molecule::SetIndexedArrayForEachAtomTo ( T *array, int TesselPoint::*index, void (*Setor)(T *, T *), T *value )
459{
460 atom *Walker = start;
461 while (Walker->next != end) {
462 Walker = Walker->next;
463 (*Setor) (&array[(Walker->*index)], value);
464 }
465};
466// for element ints inside atom class
467template <typename T> void molecule::SetIndexedArrayForEachAtomTo ( T *array, int element::*index, void (*Setor)(T *, T *) )
468{
469 atom *Walker = start;
470 int inc = 1;
471 while (Walker->next != end) {
472 Walker = Walker->next;
473 (*Setor) (&array[(Walker->type->*index)], &inc);
474 }
475};
476template <typename T> void molecule::SetIndexedArrayForEachAtomTo ( T *array, int element::*index, void (*Setor)(T *, T *), T value )
477{
478 atom *Walker = start;
479 while (Walker->next != end) {
480 Walker = Walker->next;
481 (*Setor) (&array[(Walker->type->*index)], &value);
482 }
483};
484template <typename T> void molecule::SetIndexedArrayForEachAtomTo ( T *array, int element::*index, void (*Setor)(T *, T *), T *value )
485{
486 atom *Walker = start;
487 while (Walker->next != end) {
488 Walker = Walker->next;
489 (*Setor) (&array[(Walker->type->*index)], value);
490 }
491};
492template <typename T> void molecule::SetIndexedArrayForEachAtomTo ( T *array, int TesselPoint::*index, T (atom::*Setor)(Vector &), Vector atom::*value )
493{
494 atom *Walker = start;
495 while (Walker->next != end) {
496 Walker = Walker->next;
497 array[(Walker->*index)] = (Walker->*Setor) (Walker->*value);
498 }
499};
500template <typename T> void molecule::SetIndexedArrayForEachAtomTo ( T *array, int TesselPoint::*index, T (atom::*Setor)(Vector &), Vector &vect )
501{
502 atom *Walker = start;
503 while (Walker->next != end) {
504 Walker = Walker->next;
505 array[(Walker->*index)] = (Walker->*Setor) (vect);
506 }
507};
508
509template <typename T> void molecule::SetAtomValueToIndexedArray ( T *array, int TesselPoint::*index, T atom::*value )
510{
511 atom *Walker = start;
512 while (Walker->next != end) {
513 Walker = Walker->next;
514 Walker->*value = array[(Walker->*index)];
515 //cout << Verbose(2) << *Walker << " gets " << (Walker->*value); << endl;
516 }
517};
518
519template <typename T> void molecule::SetAtomValueToIndexedArray ( T *array, int element::*index, T atom::*value )
520{
521 atom *Walker = start;
522 while (Walker->next != end) {
523 Walker = Walker->next;
524 Walker->*value = array[(Walker->type->*index)];
525 //cout << Verbose(2) << *Walker << " gets " << (Walker->*value) << endl;
526 }
527};
528
529#endif /* MOLECULE_TEMPLATE_HPP_ */
Note: See TracBrowser for help on using the repository browser.