source: src/AtomSet.hpp@ c38826

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 c38826 was 5ac690, checked in by Tillmann Crueger <crueger@…>, 14 years ago

Added a method to the AtomSetMixin that allows adding a velocity to all velocity elements of the trajectory of a set of atoms

  • Property mode set to 100644
File size: 3.6 KB
Line 
1/*
2 * AtomSet.hpp
3 *
4 * Created on: Jul 30, 2010
5 * Author: crueger
6 */
7
8#ifndef ATOMSET_HPP_
9#define ATOMSET_HPP_
10
11
12#include <functional>
13#include <numeric>
14#include <algorithm>
15#include <boost/foreach.hpp>
16#include <limits>
17
18/**
19 * A simple mixin to give any STL conforming structure fast Vector abilities
20 *
21 * TODO: make this work for maps
22 */
23
24#include "atom.hpp"
25
26// this tests, whether we actually have a Vector
27template <class V>
28struct is_atom{};
29
30template <>
31struct is_atom<atom*>{
32 typedef void wrong_type;
33};
34
35template <class Set>
36class AtomSetMixin : public Set
37{
38 // when our set carries something besides a atom* this will produce an error
39 typedef typename is_atom<typename Set::value_type>::wrong_type check_for_atom;
40public:
41 // typedefs for STL conforming structure
42 typedef typename Set::iterator iterator;
43 typedef typename Set::const_iterator const_iterator;
44
45 AtomSetMixin() :
46 Set()
47 {}
48
49 AtomSetMixin(const Set& src) :
50 Set(src)
51 {}
52 virtual ~AtomSetMixin(){}
53
54 /**
55 * translate all Atoms within this set by a specified amount
56 */
57 void translate(const Vector &translater);
58 void addVelocityAtStep(const Vector velocity, unsigned int step);
59
60 template<class Function>
61 void transformNodes(Function f);
62 double totalMass() const;
63 double totalTemperatureAtStep(unsigned int step) const;
64 Vector totalMomentumAtStep(unsigned int step) const;
65
66private:
67 template<class Function>
68 struct workOnNodePointer {
69 workOnNodePointer(Function &_f) : f(_f){}
70 void operator()(atom *atom){
71 atom->setPosition(f(atom->getPosition()));
72 }
73 Function &f;
74 };
75
76 template<class T>
77 struct valueSum {
78 valueSum(T (atom::*_f)() const,T startValue) :
79 f(_f),
80 value(startValue)
81 {}
82 T operator+(atom *atom){
83 return value + (atom->*f)();
84 }
85 T operator=(T _value){
86 value = _value;
87 return value;
88 }
89 T (atom::*f)() const;
90 T value;
91 };
92
93 template<class T>
94 struct stepValueSum {
95 stepValueSum(unsigned int _step, T (atom::*_f)(unsigned int) const,T startValue) :
96 step(_step),
97 f(_f),
98 value(startValue)
99 {}
100 T operator+(atom *atom){
101 return value + (atom->*f)(step);
102 }
103 T operator=(T _value){
104 value = _value;
105 return value;
106 }
107 unsigned int step;
108 T (atom::*f)(unsigned int) const;
109 T value;
110 };
111};
112
113template<class Set>
114inline void AtomSetMixin<Set>::translate(const Vector &translater){
115 BOOST_FOREACH(atom *atom,*this){
116 *(atom) += translater;
117 }
118}
119
120template<class Set>
121inline void AtomSetMixin<Set>::addVelocityAtStep(const Vector velocity, unsigned int step){
122 BOOST_FOREACH(atom *atom,*this){
123 atom->Trajectory.U.at(step) += velocity;
124 }
125}
126
127template<class Set>
128template<class Function>
129inline void AtomSetMixin<Set>::transformNodes(Function f){
130 std::for_each(this->begin(),
131 this->end(),
132 AtomSetMixin::workOnNodePointer<Function>(f));
133}
134
135template<class Set>
136inline double AtomSetMixin<Set>::totalMass() const{
137 return accumulate(this->begin(),this->end(),valueSum<double>(&atom::getMass,0)).value;
138}
139
140template<class Set>
141inline double AtomSetMixin<Set>::totalTemperatureAtStep(unsigned int step) const{
142 return accumulate(this->begin(),this->end(),stepValueSum<double>(step,&atom::getKineticEnergy,0)).value;
143}
144
145template<class Set>
146inline Vector AtomSetMixin<Set>::totalMomentumAtStep(unsigned int step) const{
147 return accumulate(this->begin(),this->end(),stepValueSum<Vector>(step,&atom::getMomentum,Vector())).value;
148}
149
150// allows simpler definition of AtomSets
151#define ATOMSET(container_type) AtomSetMixin<container_type<atom*> >
152
153#endif /* ATOMSET_HPP_ */
Note: See TracBrowser for help on using the repository browser.