ls1-MarDyn
ls1-MarDyn molecular dynamics code
MoleculeInterface.h
1/*
2 * MoleculeInterface.h
3 *
4 * Created on: 21 Jan 2017
5 * Author: tchipevn
6 */
7
8#ifndef SRC_MOLECULES_MOLECULEINTERFACE_H_
9#define SRC_MOLECULES_MOLECULEINTERFACE_H_
10
11#include <array>
12
13#include "molecules/Component.h"
14#include "molecules/Quaternion.h"
15#include "particleContainer/adapter/CellDataSoABase.h"
17
19public:
20 static std::array<vcp_real_calc, 3> convert_double_to_vcp_real_calc(const std::array<double,3>& v) {
21 std::array<vcp_real_calc, 3> ret;
22 for (int d = 0; d < 3; ++d) {
23 ret[d] = static_cast<vcp_real_calc>(v[d]);
24 }
25 return ret;
26 }
27
28 virtual ~~MoleculeInterface() {}
29 virtual unsigned long getID() const = 0;
30 virtual void setid(unsigned long id) = 0;
31 virtual void setComponent(Component *component) = 0;
32 virtual void setr(unsigned short d, double r) = 0;
33 virtual void setv(unsigned short d, double v) = 0;
34 virtual void setF(unsigned short d, double F) = 0;
35 unsigned int componentid() const {
36 return component()->ID();
37 }
38 virtual Component* component() const = 0;
39 virtual unsigned getComponentLookUpID() const {
40 return component()->getLookUpId();
41 }
42 virtual double r(unsigned short d) const = 0;
43 std::array<double, 3> r_arr() const {
44 std::array<double, 3> ret;
45 for(int d=0; d < 3; ++d) {
46 ret[d] = r(d);
47 }
48 return ret;
49 }
50 virtual double v(unsigned short d) const = 0;
51 std::array<double, 3> v_arr() const {
52 std::array<double, 3> ret = {v(0), v(1), v(2)};
53 return ret;
54 }
55 virtual double mass() const {
56 return component()->m();
57 }
58 virtual double F(unsigned short d) const = 0;
59
60 virtual std::array<double, 3> F_arr() {
61 std::array<double, 3> f_ret{F(0), F(1), F(2)};
62 return f_ret;
63 }
64
65 virtual std::array<double, 3> M_arr() {
66 std::array<double, 3> m_ret{M(0), M(1), M(2)};
67 return m_ret;
68 }
69 virtual std::array<double, 3> Vi_arr() {
70 std::array<double, 3> vi_ret{Vi(0), Vi(1), Vi(2)};
71 return vi_ret;
72 }
73
74 virtual const Quaternion& q() const = 0;
75
76
77 virtual void setq(Quaternion q)= 0;
78
79 virtual double D(unsigned short d) const = 0;
80 std::array<double, 3> D_arr() const {
81 std::array<double, 3> ret{D(0), D(1), D(2)};
82 return ret;
83 }
84 virtual double M(unsigned short d) const = 0;
85 virtual double Vi(unsigned short d) const = 0;
86
87 virtual void setD(unsigned short d, double D) = 0;
88
89 inline virtual void move(int d, double dr) = 0;
90
91 //by Stefan Becker
92 virtual double getI(unsigned short d) const = 0;
93
94
95 virtual double v2() const {return v(0)*v(0)+v(1)*v(1)+v(2)*v(2); }
96 virtual double F2() const {return F(0)*F(0)+F(1)*F(1)+F(2)*F(2); }
97 virtual double L2() const {return D(0)*D(0)+D(1)*D(1)+D(2)*D(2); }
98 virtual double M2() const {return M(0)*M(0)+M(1)*M(1)+M(2)*M(2); }
99
100 virtual double U_trans() const { return 0.5 * mass() * v2(); }
101 virtual double U_trans_2() const { return mass() * v2(); }
102 virtual double U_rot() = 0;
103 virtual double U_rot_2() = 0;
104 virtual double U_kin() { return U_trans() + U_rot(); }
105
106 virtual void updateMassInertia() = 0;
107
108 virtual void setupSoACache(CellDataSoABase * const s, unsigned iLJ, unsigned iC, unsigned iD, unsigned iQ) = 0;
109
110 virtual void setSoA(CellDataSoABase * const s) = 0;
111 virtual void setStartIndexSoA_LJ(unsigned i) = 0;
112 virtual void setStartIndexSoA_C(unsigned i) = 0;
113 virtual void setStartIndexSoA_D(unsigned i) = 0;
114 virtual void setStartIndexSoA_Q(unsigned i) = 0;
115
116 virtual unsigned int numSites() const = 0;
117 virtual unsigned int numOrientedSites() const = 0;
118 virtual unsigned int numLJcenters() const = 0;
119 virtual unsigned int numCharges() const = 0;
120 virtual unsigned int numDipoles() const = 0;
121 virtual unsigned int numQuadrupoles() const = 0;
122
123 // relative positions to CM
124 virtual std::array<double, 3> site_d(unsigned int i) const = 0;
125 virtual std::array<double, 3> ljcenter_d(unsigned int i) const = 0;
126 virtual std::array<double, 3> charge_d(unsigned int i) const = 0;
127 virtual std::array<double, 3> dipole_d(unsigned int i) const = 0;
128 virtual std::array<double, 3> quadrupole_d(unsigned int i) const = 0;
129
130 // absolute positions to global zero
131 virtual std::array<double, 3> site_d_abs(unsigned int i) const = 0;
132 virtual std::array<double, 3> ljcenter_d_abs(unsigned int i) const = 0;
133 virtual std::array<double, 3> charge_d_abs(unsigned int i) const = 0;
134 virtual std::array<double, 3> dipole_d_abs(unsigned int i) const = 0;
135 virtual std::array<double, 3> quadrupole_d_abs(unsigned int i) const = 0;
136
137 virtual std::array<double, 3> dipole_e(unsigned int i) const = 0;
138 virtual std::array<double, 3> quadrupole_e(unsigned int i) const = 0;
139
140 virtual std::array<double, 3> site_F(unsigned int i) const = 0;
141 virtual std::array<double, 3> ljcenter_F(unsigned int i) const = 0;
142 virtual std::array<double, 3> charge_F(unsigned int i) const = 0;
143 virtual std::array<double, 3> dipole_F(unsigned int i) const = 0;
144 virtual std::array<double, 3> quadrupole_F(unsigned int i) const = 0;
145
146 virtual void normalizeQuaternion() = 0;
147 virtual std::array<double, 3> computeLJcenter_d(unsigned int i) const = 0;
148 virtual std::array<double, 3> computeCharge_d(unsigned int i) const = 0;
149 virtual std::array<double, 3> computeDipole_d(unsigned int i) const = 0;
150 virtual std::array<double, 3> computeQuadrupole_d(unsigned int i) const = 0;
151 virtual std::array<double, 3> computeDipole_e(unsigned int i) const = 0;
152 virtual std::array<double, 3> computeQuadrupole_e(unsigned int i) const = 0;
153
154
155 virtual unsigned long totalMemsize() const = 0;
156
157 double dist2(const MoleculeInterface& molecule2, double dr[3]) const {
158 double d2 = 0.;
159 for (unsigned short d = 0; d < 3; d++) {
160 dr[d] = molecule2.r(d) - r(d);
161 d2 += dr[d] * dr[d];
162 }
163 return d2;
164 }
165
166 //calculates orientation angle for ARDF
167 double orientationAngle(const MoleculeInterface& molecule2, double dr[3], double d2) const {
168
169 double cosPhi = 0.;
170 double orientationVector[3];
171 double orientationVectorSquared = 0.;
172 double roundingThreshold = 0.0001;
173
174 orientationVector[0] = 2. * (q().qx() * q().qz() + q().qw() * q().qy());
175 orientationVector[1] = 2. * (q().qy() * q().qz() - q().qw() * q().qx());
176 orientationVector[2] = 1. - 2. * (q().qx() * q().qx() + q().qy() * q().qy());
177
178
179
180 for (unsigned short d = 0; d < 3; d++) {
181 dr[d] = molecule2.r(d) - r(d);
182 orientationVectorSquared += orientationVector[d] * orientationVector[d];
183 }
184
185 for (unsigned short d = 0; d < 3; d++) {
186 cosPhi += orientationVector[d] * dr[d] / sqrt(orientationVectorSquared) / sqrt(d2);
187 }
188 return cosPhi;
189
190 }
191
192 virtual void setF(double F[3]) = 0;
193 virtual void setM(double M[3]) = 0;
194 virtual void setVi(double Vi[3]) = 0;
195 void scale_v(double s) {
196 for(int d = 0; d < 3; ++d) {
197 setv(d, v(d) * s);
198 }
199 }
200 void scale_v(double s, double offx, double offy, double offz) {
201 vsub(offx, offy, offz);
202 scale_v(s);
203 vadd(offx, offy, offz);
204 }
205 void scale_F(double s) {
206 double Fscaled[3] = {F(0) * s, F(1) * s, F(2) * s};
207 setF(Fscaled);
208 }
209 void scale_D(double s) {
210 for (int d = 0; d < 3; ++d) {
211 setD(d, D(d) * s);
212 }
213 }
214 void scale_M(double s) {
215 double Mscaled[3] = {M(0) * s, M(1) * s, M(2) * s};
216 setM(Mscaled);
217 }
218 virtual void Fadd(const double a[]) = 0;
219 virtual void Madd(const double a[]) = 0;
220 virtual void Viadd(const double a[]) = 0;
221 virtual void vadd(const double ax, const double ay, const double az) = 0;
222 virtual void vsub(const double ax, const double ay, const double az) = 0;
223 virtual void Fljcenteradd(unsigned int i, double a[]) = 0;
224 virtual void Fljcentersub(unsigned int i, double a[]) = 0;
225 virtual void Fchargeadd(unsigned int i, double a[]) = 0;
226 virtual void Fchargesub(unsigned int i, double a[]) = 0;
227 virtual void Fdipoleadd(unsigned int i, double a[]) = 0;
228 virtual void Fdipolesub(unsigned int i, double a[]) = 0;
229 virtual void Fquadrupoleadd(unsigned int i, double a[]) = 0;
230 virtual void Fquadrupolesub(unsigned int i, double a[]) = 0;
231
232 // Leapfrog integration:
233 virtual void upd_preF(double dt) = 0;
234 virtual void upd_postF(double dt_halve, double& summv2, double& sumIw2) = 0;
235
236 // Integration for single-centered molecules in RMM mode.
237 // Explicit Euler and LeapFrog without time-splitting for single-centered molecules are identical
238 // up to interpretation of whether the velocities are stored at (t) or at (t+dt/2) (right?)
239 // Placing it here, so that we can
240 // verify the RMM code against the non-RMM code.
241 void ee_upd_preF(double dt) {
242 for (unsigned short d = 0; d < 3; ++d) {
243 setr(d,r(d) + dt * v(d));
244 }
245 }
246 void ee_upd_postF(double
247#ifndef ENABLE_REDUCED_MEMORY_MODE
248 dt
249#endif
250 , double& summv2) {
251
252 //calcFM(); //NOTE: This was moved to simulation.cpp calculateForces() and is called in simulate()
253
254#ifndef ENABLE_REDUCED_MEMORY_MODE
255 double dtInvM = dt / component()->m();
256 for (unsigned short d = 0; d < 3; ++d) {
257 setv(d, v(d) + dtInvM * F(d));
258 }
259#endif /*ENABLE_REDUCED_MEMORY_MODE */
260
261 summv2 += component()->m() * v2();
262 }
263
264 virtual void calculate_mv2_Iw2(double& summv2, double& sumIw2) = 0;
265 virtual void calculate_mv2_Iw2(double& summv2, double& sumIw2, double offx, double offy, double offz) = 0;
266 static std::string getWriteFormat(); // TODO
267 virtual void write(std::ostream& ostrm) const = 0;
268 virtual void writeBinary(std::ostream& ostrm) const = 0;
269 virtual void clearFM() = 0;
270 virtual void calcFM() = 0;
271 virtual void check(unsigned long id) = 0;
272
292 bool isLessThan(const MoleculeInterface& m2) const;
293
300 virtual bool inBox(const double l[3], const double u[3]) const {
301 bool in = true;
302 for (int d = 0; d < 3; ++d) {
303#ifdef __INTEL_COMPILER
304 #pragma float_control(precise, on)
305 #pragma fenv_access(on)
306#endif
307 in &= (r(d) >= l[d] and r(d) < u[d]);
308 }
309 return in;
310 }
311
317 virtual void buildOwnSoA() = 0;
318
320 virtual void releaseOwnSoA() = 0;
321};
322
332inline void SiteSiteDistance(const double drm[3], const double ds1[3], const double ds2[3], double drs[3], double& dr2)
333{
334 for (unsigned short d = 0; d < 3; ++d)
335 drs[d] = drm[d] + ds1[d] - ds2[d];
336 dr2 = drs[0]*drs[0] + drs[1]*drs[1] + drs[2]*drs[2];
337}
338
347inline void SiteSiteDistanceAbs(const double ds1[3], const double ds2[3], double drs[3], double& dr2)
348{
349 for (unsigned short d = 0; d < 3; ++d)
350 drs[d] = ds1[d] - ds2[d];
351 dr2 = drs[0]*drs[0] + drs[1]*drs[1] + drs[2]*drs[2];
352}
353
354
355inline void minusSiteSiteDistance(const double drm[3], const double ds1[3], const double ds2[3], double drs[3], double& dr2)
356{
357 for (unsigned short d = 0; d < 3; ++d)
358 drs[d] = ds2[d] - drm[d] - ds1[d];
359 dr2 = drs[0]*drs[0] + drs[1]*drs[1] + drs[2]*drs[2];
360}
361
362inline void minusSiteSiteDistanceAbs(const double ds1[3], const double ds2[3], double drs[3], double& dr2)
363{
364 for (unsigned short d = 0; d < 3; ++d)
365 drs[d] = ds2[d] - ds1[d];
366 dr2 = drs[0]*drs[0] + drs[1]*drs[1] + drs[2]*drs[2];
367}
368
369#endif /* SRC_MOLECULES_MOLECULEINTERFACE_H_ */
Defines the length of the vectors and the corresponding functions.
Definition: CellDataSoABase.h:13
Class implementing molecules as rigid rotators consisting out of different interaction sites (LJcente...
Definition: Component.h:14
double m() const
Definition: Component.h:53
unsigned int ID() const
Definition: Component.h:33
Definition: MoleculeInterface.h:18
virtual bool inBox(const double l[3], const double u[3]) const
test whether molecule is inside a cuboid region
Definition: MoleculeInterface.h:300
virtual void buildOwnSoA()=0
virtual void releaseOwnSoA()=0
bool isLessThan(const MoleculeInterface &m2) const
find out whether m1 is before m2 (in some global ordering)
Definition: MoleculeInterface.cpp:21
Definition: Quaternion.h:10
::xsd::cxx::tree::string< char, simple_type > string
C++ type corresponding to the string XML Schema built-in type.
Definition: vtk-punstructured.h:270