ls1-MarDyn
ls1-MarDyn molecular dynamics code
FullMolecule.h
1#ifndef FULLMOLECULE_H_
2#define FULLMOLECULE_H_
3
4#include "MoleculeInterface.h"
5#include "molecules/Comp2Param.h"
6#include "molecules/Site.h"
7
8#include <vector>
9#include <iostream>
10#include "utils/mardyn_assert.h"
11#include <string>
12
13
14class Domain;
15class CellDataSoA;
16
19
20public:
21 // TODO Correct this constructor: the components vector is optional,
22 // but if it is left away, all pointer data is not initialized (which is not
23 // neccessarily bad), but then assertions fail (e.g. in the destructor) and we can't
24 // use it's instances.
25 FullMolecule(unsigned long id = 0, Component *component = nullptr,
26 double rx = 0., double ry = 0., double rz = 0.,
27 double vx = 0., double vy = 0., double vz = 0.,
28 double q0 = 1., double q1 = 1., double q2 = 0., double q3 = 0.,
29 double Dx = 0., double Dy = 0., double Dz = 0.
30 );
31 FullMolecule(const FullMolecule& m);
32
33 FullMolecule& operator=(const FullMolecule& m);
34
35 ~~FullMolecule() override {
36 // don't delete SoA
37 _soa = nullptr;
38 }
39
41 unsigned long getID() const override { return _id; }
43 void setid(unsigned long id) override { _id = id; }
47 Component* component() const override { return _component; }
49 unsigned getComponentLookUpID() const override { return _component->getLookUpId();}
51 double r(unsigned short d) const override { return _r[d]; }
53 void setr(unsigned short d, double r) override { _r[d] = r; }
55 double v(unsigned short d) const override { return _v[d]; }
57 void setv(unsigned short d, double v) override { _v[d] = v; }
59 double mass() const override { return _m; }
60
61 void setF(unsigned short d, double F) override { _F[d] = F; }
63 double F(unsigned short d) const override {return _F[d]; }
64
66 const Quaternion& q() const override { return _q; }
67
68
70 void setq(Quaternion q) override{ _q = q; }
71
73 double D(unsigned short d) const override { return _L[d]; }
74
76 double M(unsigned short d) const override { return _M[d]; }
77
79 double Vi(unsigned short d) const override { return _Vi[d];}
80
81 void setD(unsigned short d, double D) override { this->_L[d] = D; }
82
83 inline void move(int d, double dr) override { _r[d] += dr; }
84
86 double getI(unsigned short d) const override { return _I[d]; }
88 void updateMassInertia() override {
89 if (_component != nullptr) {
90 _m = _component->m();
91 _I[0] = _component->I11();
92 _I[1] = _component->I22();
93 _I[2] = _component->I33();
94 for (unsigned short d = 0; d < 3; ++d) {
95 if (_I[d] != 0.)
96 _invI[d] = 1. / _I[d];
97 else
98 _invI[d] = 0.;
99 }
100 }
101 }
102
104 double v2() const override {return _v[0]*_v[0]+_v[1]*_v[1]+_v[2]*_v[2]; }
105
107 double L2() const override {return _L[0]*_L[0]+_L[1]*_L[1]+_L[2]*_L[2]; }
108
110 double F2() const override {return _F[0]*_F[0]+_F[1]*_F[1]+_F[2]*_F[2]; }
111
113 double M2() const override {return _M[0]*_M[0]+_M[1]*_M[1]+_M[2]*_M[2]; }
114
116 double U_trans() const override { return 0.5 * _m * v2(); }
117 double U_trans_2() const override { return _m * v2(); }
119 double U_rot() override ;
120 double U_rot_2() override ;
122 double U_kin() override { return U_trans() + U_rot(); }
123
124 void setupSoACache(CellDataSoABase * s, unsigned iLJ, unsigned iC, unsigned iD, unsigned iQ) override;
125
126 void setSoA(CellDataSoABase * s) override;
127 void setStartIndexSoA_LJ(unsigned i) override {_soa_index_lj = i;}
128 void setStartIndexSoA_C(unsigned i) override {_soa_index_c = i;}
129 void setStartIndexSoA_D(unsigned i) override {_soa_index_d = i;}
130 void setStartIndexSoA_Q(unsigned i) override {_soa_index_q = i;}
131
132 /* TODO: Maybe we should better do this using the component directly?
133 * In the GNU STL vector.size() causes two memory accesses and one subtraction!
134 */
136 unsigned int numSites() const override { return _component->numSites(); }
137 unsigned int numOrientedSites() const override { return _component->numOrientedSites(); }
138 unsigned int numLJcenters() const override { return _component->numLJcenters(); }
139 unsigned int numCharges() const override { return _component->numCharges(); }
140 unsigned int numDipoles() const override { return _component->numDipoles(); }
141 unsigned int numQuadrupoles() const override { return _component->numQuadrupoles(); }
142
143 std::array<double, 3> site_d(unsigned int i) const override {
144 const unsigned n1 = numLJcenters(), n2 = numCharges()+ n1, n3 = numDipoles() + n2;
145#ifndef NDEBUG
146 const unsigned n4 = numQuadrupoles() + n3;
147#endif
148 if(i < n1) {
149 return ljcenter_d(i);
150 } else if (i < n2) {
151 return charge_d(i - n1);
152 } else if (i < n3) {
153 return dipole_d(i - n2);
154 } else { mardyn_assert(i < n4);
155 return quadrupole_d(i - n3);
156 }
157 }
158 std::array<double, 3> ljcenter_d(unsigned int i) const override {
159 return computeLJcenter_d(i);
160 }
161 std::array<double, 3> charge_d(unsigned int i) const override {
162 return computeCharge_d(i);
163 }
164 std::array<double, 3> dipole_d(unsigned int i) const override {
165 return computeDipole_d(i);
166 }
167 std::array<double, 3> quadrupole_d(unsigned int i) const override {
168 return computeQuadrupole_d(i);
169 }
170
171 std::array<double, 3> site_d_abs(unsigned int i) const override {
172 const unsigned n1 = numLJcenters(), n2 = numCharges()+ n1, n3 = numDipoles() + n2;
173#ifndef NDEBUG
174 const unsigned n4 = numQuadrupoles() + n3;
175#endif
176 if(i < n1) {
177 return ljcenter_d_abs(i);
178 } else if (i < n2) {
179 return charge_d_abs(i - n1);
180 } else if (i < n3) {
181 return dipole_d_abs(i - n2);
182 } else { mardyn_assert(i < n4);
183 return quadrupole_d_abs(i - n3);
184 }
185 }
186 std::array<double, 3> ljcenter_d_abs(unsigned int i) const override;
187 std::array<double, 3> charge_d_abs(unsigned int i) const override;
188 std::array<double, 3> dipole_d_abs(unsigned int i) const override;
189 std::array<double, 3> quadrupole_d_abs(unsigned int i) const override;
190
191 std::array<double, 3> dipole_e(unsigned int i) const override;
192 std::array<double, 3> quadrupole_e(unsigned int i) const override;
193
194 std::array<double, 3> site_F(unsigned int i) const override {
195 const unsigned n1 = numLJcenters(), n2 = numCharges()+ n1, n3 = numDipoles() + n2;
196#ifndef NDEBUG
197 const unsigned n4 = numQuadrupoles() + n3;
198#endif
199 if(i < n1) {
200 return ljcenter_F(i);
201 } else if (i < n2) {
202 return charge_F(i - n1);
203 } else if (i < n3) {
204 return dipole_F(i - n2);
205 } else { mardyn_assert(i < n4);
206 return quadrupole_F(i - n3);
207 }
208 }
209 std::array<double, 3> ljcenter_F(unsigned int i) const override;
210 std::array<double, 3> charge_F(unsigned int i) const override;
211 std::array<double, 3> dipole_F(unsigned int i) const override;
212 std::array<double, 3> quadrupole_F(unsigned int i) const override;
213
214 void normalizeQuaternion() override {
215 _q.normalize();
216 }
217 std::array<double, 3> computeLJcenter_d(unsigned int i) const override {
218 mardyn_assert(_q.isNormalized());
219 return _q.rotate(_component->ljcenter(i).r());
220 }
221 std::array<double, 3> computeCharge_d(unsigned int i) const override {
222 mardyn_assert(_q.isNormalized());
223 return _q.rotate(_component->charge(i).r());
224 }
225 std::array<double, 3> computeDipole_d(unsigned int i) const override {
226 mardyn_assert(_q.isNormalized());
227 return _q.rotate(_component->dipole(i).r());
228 }
229 std::array<double, 3> computeQuadrupole_d(unsigned int i) const override {
230 mardyn_assert(_q.isNormalized());
231 return _q.rotate(_component->quadrupole(i).r());
232 }
233 std::array<double, 3> computeDipole_e(unsigned int i) const override {
234 mardyn_assert(_q.isNormalized());
235 return _q.rotate(_component->dipole(i).e());
236 }
237 std::array<double, 3> computeQuadrupole_e(unsigned int i) const override {
238 mardyn_assert(_q.isNormalized());
239 return _q.rotate(_component->quadrupole(i).e());
240 }
241
242
248 unsigned long totalMemsize() const override;
249
250
251 /* TODO: Is this realy necessary? Better use a function like dist2(m1.r(), m2.r()). */
256 double dist2(const FullMolecule& molecule2, double dr[3]) const {
257 double d2 = 0.;
258 for (unsigned short d = 0; d < 3; d++) {
259 dr[d] = molecule2._r[d] - _r[d];
260 d2 += dr[d] * dr[d];
261 }
262 return d2;
263 }
264
268 void setF(double F[3]) override { for(int d = 0; d < 3; d++ ) { _F[d] = F[d]; } }
269
273 void setM(double M[3]) override { for(int d = 0; d < 3; d++ ) { _M[d] = M[d]; } }
274 void setVi(double Vi[3]) override { for(int d = 0; d < 3; d++) { _Vi[d] = Vi[d]; } }
275
276 void Fadd(const double a[]) override { for(unsigned short d=0;d<3;++d) _F[d]+=a[d]; }
277 void Madd(const double a[]) override { for(unsigned short d=0;d<3;++d) _M[d]+=a[d]; }
278 void Viadd(const double a[]) override { for(unsigned short d=0;d<3;++d) _Vi[d]+=a[d]; }
279 void vadd(const double ax, const double ay, const double az) override {
280 _v[0] += ax; _v[1] += ay; _v[2] += az;
281 }
282 void vsub(const double ax, const double ay, const double az) override {
283 _v[0] -= ax; _v[1] -= ay; _v[2] -= az;
284 }
285
286 void Fljcenteradd(unsigned int i, double a[]) override;
287 void Fljcentersub(unsigned int i, double a[]) override;
288 void Fchargeadd(unsigned int i, double a[]) override;
289 void Fchargesub(unsigned int i, double a[]) override;
290 void Fdipoleadd(unsigned int i, double a[]) override;
291 void Fdipolesub(unsigned int i, double a[]) override;
292 void Fquadrupoleadd(unsigned int i, double a[]) override;
293 void Fquadrupolesub(unsigned int i, double a[]) override;
294
296 void upd_preF(double dt) override;
298 void upd_postF(double dt_halve, double& summv2, double& sumIw2) override;
299
304 void calculate_mv2_Iw2(double& summv2, double& sumIw2) override;
305 void calculate_mv2_Iw2(double& summv2, double& sumIw2, double offx, double offy, double offz) override;
306
311
313 void write(std::ostream& ostrm) const override;
314
316 void writeBinary(std::ostream& ostrm) const override;
317
319 void clearFM() override;
321 void calcFM() override;
322
324 void check(unsigned long id) override;
325
331 void buildOwnSoA() override;
332
334 void releaseOwnSoA() override;
335
336protected:
338 void calcFM_site(const std::array<double, 3>& d, const std::array<double, 3>& F);
339
341 double _r[3];
342 double _F[3];
343 double _v[3];
345 double _M[3];
346 double _L[3];
347 double _Vi[3];
348 unsigned long _id;
350 double _m;
351 double _I[3]{0.,0.,0.},_invI[3]{0.,0.,0.}; // moment of inertia for principal axes and it's inverse
352
353 /* absolute positions are stored in the soa. Work-arounds to get the relative ones*/
354 CellDataSoA * _soa;
355 unsigned _soa_index_lj;
356 unsigned _soa_index_c;
357 unsigned _soa_index_d;
358 unsigned _soa_index_q;
359
360};
361
362std::ostream& operator<<( std::ostream& os, const FullMolecule& m );
363
364#endif /* FULLMOLECULE_H_ */
Definition: CellDataSoABase.h:13
Structure of Arrays for vectorized force calculation.
Definition: CellDataSoA.h:22
Class implementing molecules as rigid rotators consisting out of different interaction sites (LJcente...
Definition: Component.h:14
unsigned int numOrientedSites() const
Definition: Component.h:42
unsigned int numLJcenters() const
Definition: Component.h:44
unsigned int numQuadrupoles() const
Definition: Component.h:50
unsigned int numCharges() const
Definition: Component.h:46
unsigned int numSites() const
Definition: Component.h:36
double m() const
Definition: Component.h:53
unsigned int numDipoles() const
Definition: Component.h:48
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
const Quaternion & q() const override
Definition: FullMolecule.h:66
double _F[3]
Definition: FullMolecule.h:342
double _L[3]
Definition: FullMolecule.h:346
void setid(unsigned long id) override
Definition: FullMolecule.h:43
Quaternion _q
Definition: FullMolecule.h:344
unsigned int numSites() const override
Definition: FullMolecule.h:136
void setF(double F[3]) override
Definition: FullMolecule.h:268
void clearFM() override
Definition: FullMolecule.cpp:479
void check(unsigned long id) override
Definition: FullMolecule.cpp:636
double Vi(unsigned short d) const override
Definition: FullMolecule.h:79
Component * component() const override
Definition: FullMolecule.h:47
double F2() const override
Definition: FullMolecule.h:110
unsigned long totalMemsize() const override
double M(unsigned short d) const override
Definition: FullMolecule.h:76
double F(unsigned short d) const override
Definition: FullMolecule.h:63
unsigned long getID() const override
Definition: FullMolecule.h:41
void setv(unsigned short d, double v) override
Definition: FullMolecule.h:57
double U_rot() override
Definition: FullMolecule.cpp:392
double _M[3]
Definition: FullMolecule.h:345
void buildOwnSoA() override
void updateMassInertia() override
Definition: FullMolecule.h:88
double mass() const override
Definition: FullMolecule.h:59
double getI(unsigned short d) const override
Definition: FullMolecule.h:86
double v(unsigned short d) const override
Definition: FullMolecule.h:55
double L2() const override
Definition: FullMolecule.h:107
double v2() const override
Definition: FullMolecule.h:104
double _v[3]
Definition: FullMolecule.h:343
unsigned long _id
Definition: FullMolecule.h:348
void setq(Quaternion q) override
Definition: FullMolecule.h:70
void setComponent(Component *component) override
Definition: FullMolecule.h:45
void setM(double M[3]) override
Definition: FullMolecule.h:273
double U_kin() override
Definition: FullMolecule.h:122
double dist2(const FullMolecule &molecule2, double dr[3]) const
Definition: FullMolecule.h:256
void upd_postF(double dt_halve, double &summv2, double &sumIw2) override
Definition: FullMolecule.cpp:366
double U_trans() const override
Definition: FullMolecule.h:116
void writeBinary(std::ostream &ostrm) const override
Definition: FullMolecule.cpp:451
void calcFM() override
Definition: FullMolecule.cpp:551
void upd_preF(double dt) override
Definition: FullMolecule.cpp:334
void calcFM_site(const std::array< double, 3 > &d, const std::array< double, 3 > &F)
Definition: FullMolecule.cpp:526
void calculate_mv2_Iw2(double &summv2, double &sumIw2) override
Calculate twice the translational and rotational kinetic energies.
Definition: FullMolecule.cpp:412
double D(unsigned short d) const override
Definition: FullMolecule.h:73
static std::string getWriteFormat()
Definition: FullMolecule.cpp:438
Component * _component
Definition: FullMolecule.h:340
void setr(unsigned short d, double r) override
Definition: FullMolecule.h:53
double r(unsigned short d) const override
Definition: FullMolecule.h:51
unsigned getComponentLookUpID() const override
Definition: FullMolecule.h:49
void write(std::ostream &ostrm) const override
Definition: FullMolecule.cpp:442
double _r[3]
Definition: FullMolecule.h:341
double _m
Definition: FullMolecule.h:350
void releaseOwnSoA() override
double M2() const override
Definition: FullMolecule.h:113
Definition: MoleculeInterface.h:18
std::array< double, 3 > e() const
Definition: Site.h:205
Definition: Quaternion.h:10
std::array< double, 3 > rotate(const std::array< double, 3 > &d) const
Definition: Quaternion.cpp:43
std::array< double, 3 > r() const
Definition: Site.h:25
std::ostream & operator<<(std::ostream &stream, const Vector3< type > &v)
Definition: Vector3.h:22
::xsd::cxx::tree::id< char, ncname > id
C++ type corresponding to the ID XML Schema built-in type.
Definition: vtk-punstructured.h:322
::xsd::cxx::tree::string< char, simple_type > string
C++ type corresponding to the string XML Schema built-in type.
Definition: vtk-punstructured.h:270