ls1-MarDyn
ls1-MarDyn molecular dynamics code
TemperatureControl.h
1/*
2 * TemperatureControl.h
3 *
4 * Created on: 27.05.2015
5 * Author: mheinen
6 */
7
8#ifndef TEMPERATURECONTROL_H_
9#define TEMPERATURECONTROL_H_
10
11#include <cstdint>
12#include <string>
13#include <vector>
14
15#include "ThermostatVariables.h"
16#include "integrators/Integrator.h"
17#include "molecules/Molecule.h"
18#include "plugins/NEMD/DistControl.h"
19#include "utils/CommVar.h"
20#include "utils/ObserverBase.h"
21#include "utils/Random.h"
22#include "utils/Region.h"
23
24class DistControl;
25class XMLfileUnits;
28class Accumulator;
31public:
34
83 void readXML(XMLfileUnits& xmlconfig);
84 unsigned int GetID() { return _nID; }
85 void VelocityScalingInit(XMLfileUnits& xmlconfig, std::string strDirections);
86 void CalcGlobalValues(DomainDecompBase* domainDecomp);
87 void MeasureKineticEnergy(Molecule* mol, DomainDecompBase* domainDecomp);
88 void ControlTemperature(Molecule* mol);
89 void ResetLocalValues();
90
91 // beta log file
92 void InitBetaLogfile();
93 void WriteBetaLogfile(unsigned long simstep);
94
95 enum LocalControlMethod {
96 VelocityScaling,
97 Andersen,
98 };
99 LocalControlMethod _localMethod;
100
101 void registerAsObserver();
102 void update(SubjectBase* subject) override;
103
104 // measure added kin. energy
105 void writeAddedEkin(DomainDecompBase* domainDecomp, const uint64_t& simstep);
106
107private:
108 // create accumulator object dependent on which translatoric directions should be thermostated (xyz)
109 Accumulator* CreateAccumulatorInstance(const std::string& strTransDirections);
110
111 // observer mechanism: update region coords dependent on the interface position, determined by plugin DistControl
112 DistControl* getDistControl();
113
114 // instances / ID
115 static unsigned short _nStaticID;
116
117 unsigned int _nNumSlabs;
118 double _dSlabWidth;
119
123 std::vector<std::vector<LocalThermostatVariables>> _localThermVarsThreadBuffer;
124 std::vector<GlobalThermostatVariables> _globalThermVars;
125
126 double _dTargetTemperature;
127 double _dTemperatureExponent;
128 unsigned int _nTargetComponentID;
129 unsigned short _nNumThermostatedTransDirections;
130
131 Accumulator* _accumulator;
132
133 std::string _strFilenamePrefixBetaLog;
134 unsigned long _nWriteFreqBeta;
135 unsigned long _numSampledConfigs;
136 double _dBetaTransSumGlobal;
137 double _dBetaRotSumGlobal;
138 double _nuAndersen;
139 double _timestep;
140 double _nuDt;
141 Random _rand;
142
143 bool _bIsObserver;
144
145 struct AddedEkin {
146 uint32_t writeFreq;
147 CommVar<std::vector<double>> data; // \Delta E_kin * 2/m = v^2_2 - v^2_1
148 } _addedEkin;
149
153 std::vector<std::vector<double>> _addedEkinLocalThreadBuffer;
154
155 struct Ramp {
156 bool enabled;
157 float start, end, delta, slope;
158 struct Update {
159 uint64_t start, stop, delta, elapsed;
160 uint32_t freq;
161 } update;
162 } _ramp;
163};
164
165class Domain;
167public:
170
171 std::string getShortName() override { return "TeC"; }
172 void readXML(XMLfileUnits& xmlconfig);
173 void AddRegion(ControlRegionT* region);
174 int GetNumRegions() { return _vecControlRegions.size(); }
175 ControlRegionT* GetControlRegion(unsigned short nRegionID) {
176 return _vecControlRegions.at(nRegionID - 1);
177 } // vector index starts with 0, region index with 1
178 void prepare_start();
179
180 void Init(unsigned long simstep);
181 void MeasureKineticEnergy(Molecule* mol, DomainDecompBase* domainDecomp, unsigned long simstep);
182 void CalcGlobalValues(DomainDecompBase* domainDecomp, unsigned long simstep);
183 void ControlTemperature(Molecule* mol, unsigned long simstep);
184
185 unsigned long GetStart() { return _nStart; }
186 unsigned long GetStop() { return _nStop; }
187
188 // beta log file
189 void InitBetaLogfiles();
190 void WriteBetaLogfiles(unsigned long simstep);
191
192 // loops over molecule container
193 void DoLoopsOverMolecules(DomainDecompBase*, ParticleContainer* particleContainer, unsigned long simstep);
194 void VelocityScalingPreparation(DomainDecompBase*, ParticleContainer*, unsigned long simstep);
195
196 // measure added kin. energy
197 void writeAddedEkin(DomainDecompBase* domainDecomp, const uint64_t& simstep);
198
199private:
200 std::vector<ControlRegionT*> _vecControlRegions;
201 unsigned long _nControlFreq;
202 unsigned long _nStart;
203 unsigned long _nStop;
204
205 enum ControlMethod { VelocityScaling, Andersen, Mixed };
206 ControlMethod _method = VelocityScaling;
207};
208
209// Accumulate kinetic energy dependent on which translatoric directions should be thermostated
210
212private:
213 bool _accumulateX, _accumulateY, _accumulateZ;
214
215public:
216 Accumulator(bool accX, bool accY, bool accZ) : _accumulateX(accX), _accumulateY(accY), _accumulateZ(accZ) {}
217
218 double CalcKineticEnergyContribution(Molecule* mol) {
219 double vx = _accumulateX ? mol->v(0) : 0.0;
220 double vy = _accumulateY ? mol->v(1) : 0.0;
221 double vz = _accumulateZ ? mol->v(2) : 0.0;
222 double m = mol->mass();
223
224 return m * (vx * vx + vy * vy + vz * vz);
225 }
226 void ScaleVelocityComponents(Molecule* mol, double vcorr) {
227 if (_accumulateX) mol->setv(0, mol->v(0) * vcorr);
228 if (_accumulateY) mol->setv(1, mol->v(1) * vcorr);
229 if (_accumulateZ) mol->setv(2, mol->v(2) * vcorr);
230 }
231};
232
233#endif /* TEMPERATURECONTROL_H_ */
Definition: TemperatureControl.h:211
Definition: CommVar.h:17
Definition: Region.h:29
Definition: TemperatureControl.h:30
void readXML(XMLfileUnits &xmlconfig)
Read in XML configuration for TemperatureControl and all its included objects.
Definition: TemperatureControl.cpp:90
Definition: Region.h:113
Definition: DistControl.h:48
handle boundary region and multiple processes
Definition: DomainDecompBase.h:51
This class is used to read in the phasespace and to handle macroscopic values.
Definition: Domain.h:47
FullMolecule modeled as LJ sphere with point polarities.
Definition: FullMolecule.h:18
void setv(unsigned short d, double v) override
Definition: FullMolecule.h:57
double mass() const override
Definition: FullMolecule.h:59
double v(unsigned short d) const override
Definition: FullMolecule.h:55
This Interface is used to get access to particles and pairs of particles.
Definition: ParticleContainer.h:69
Definition: Random.h:12
Definition: ObserverBase.h:20
Definition: TemperatureControl.h:166
void DoLoopsOverMolecules(DomainDecompBase *, ParticleContainer *particleContainer, unsigned long simstep)
Decide which ControlMethod to use.
Definition: TemperatureControl.cpp:685
void VelocityScalingPreparation(DomainDecompBase *, ParticleContainer *, unsigned long simstep)
Prepare for VelocityScaling control method.
Definition: TemperatureControl.cpp:716
XML file with unit attributes abstraction.
Definition: xmlfileUnits.h:25
::xsd::cxx::tree::string< char, simple_type > string
C++ type corresponding to the string XML Schema built-in type.
Definition: vtk-punstructured.h:270
Definition: TemperatureControl.h:158