ls1-MarDyn
ls1-MarDyn molecular dynamics code
Site.h
1#ifndef SITE_H_
2#define SITE_H_
3
4#include "utils/mardyn_assert.h"
5
6#include "utils/Logger.h"
8#include <array>
9#include <cmath>
10#include <cstdint>
11
12using Log::global_log;
13
20class Site {
21public:
22 double rx() const { return _r[0]; }
23 double ry() const { return _r[1]; }
24 double rz() const { return _r[2]; }
25 std::array<double, 3> r() const { return _r; }
26 double m() const { return _m; }
29 void setR(int d, double r) {
30 mardyn_assert(d < 3);
31 _r[d] = r;
32 }
33
35 void setM(double m) { _m = m; }
36
47 virtual void readXML(XMLfileUnits& xmlconfig) {
48 xmlconfig.getNodeValueReduced("coords/x", _r[0]);
49 xmlconfig.getNodeValueReduced("coords/y", _r[1]);
50 xmlconfig.getNodeValueReduced("coords/z", _r[2]);
51 xmlconfig.getNodeValueReduced("mass", _m);
52 }
53
54 virtual ~~Site() {}
55
56 virtual void write(std::ostream& ostrm) const {
57 ostrm << _r[0] << " " << _r[1] << " " << _r[2];
58 }
59
60protected:
61
68 Site(double x = 0., double y = 0., double z = 0., double m = 0.) : _r{{x, y, z}}, _m(m) {}
69
70 std::array<double, 3> _r;
71 double _m;
72};
73
74
84class LJcenter : public Site {
85public:
87 LJcenter(): Site(0., 0., 0., 0.), _epsilon(0.), _sigma(0.), _uLJshift6(0.) {}
97 LJcenter(double x, double y, double z, double m, double epsilon, double sigma, double shift)
98 : Site(x, y, z, m), _epsilon(epsilon), _sigma(sigma), _uLJshift6(shift) {}
99
112 void readXML(XMLfileUnits& xmlconfig) {
113 Site::readXML(xmlconfig);
114 xmlconfig.getNodeValueReduced("epsilon", _epsilon);
115 xmlconfig.getNodeValueReduced("sigma", _sigma);
116 xmlconfig.getNodeValueReduced("shifted", _uLJshift6);
117 }
118
120 void write(std::ostream& ostrm) const {
121 Site::write(ostrm);
122 ostrm << "\t" << eps() << " " << sigma() << " " << shift6();
123 }
124 /* @todo TODO: rename to epsilon */
125 double eps() const { return _epsilon; }
126 double sigma() const { return _sigma; }
127 double shift6() const { return _uLJshift6; }
130 void setEps(double epsilon) { _epsilon = epsilon; }
132 void setSigma(double sigma) { _sigma = sigma; }
134 void setULJShift6(double uLJshift6) { _uLJshift6 = uLJshift6; }
135
136
137private:
138 double _epsilon;
139 double _sigma;
140 double _uLJshift6;
141};
142
154class Charge : public Site {
155public:
156 Charge() : Site(0., 0., 0., 0.), _q(0.) {}
164 Charge(double x, double y, double z, double m, double q) : Site(x, y, z, m), _q(q) {}
165
166
177 void readXML(XMLfileUnits& xmlconfig) {
178 Site::readXML(xmlconfig);
179 xmlconfig.getNodeValueReduced("charge", _q);
180 }
181
183 void write(std::ostream& ostrm) const {
184 ostrm << _r[0] << " " << _r[1] << " " << _r[2] << "\t" << _m << " " << _q;
185 }
186
187 double q() const { return _q; }
190 void setQ(double q) { _q = q; }
191
192private:
193 double _q;
194};
195
196
200class OrientedSite : public Site {
201public:
202 double ex() const { return _e[0]; }
203 double ey() const { return _e[1]; }
204 double ez() const { return _e[2]; }
205 std::array<double, 3> e() const { return _e; }
206 double abs() const { return _abs; }
210 void write(std::ostream& ostrm) const {
211 Site::write(ostrm);
212 ostrm << "\t" << ex() << " " << ey() << " " << ez() << "\t" << abs();
213 }
214
219 void setOrientationVectorByPolarAngles(const double& theta_deg, const double& phi_deg) {
220 const double fac = M_PI / 180.; // translate: degrees --> rad
221 double theta_rad = theta_deg * fac;
222 double phi_rad = phi_deg * fac;
223 _e[0] = sin(theta_rad) * cos(phi_rad);
224 _e[1] = sin(theta_rad) * sin(phi_rad);
225 _e[2] = cos(theta_rad);
226 }
228 void setAbs(double abs) {_abs = abs; }
229
234 void setE(int d, double e) {
235 mardyn_assert(d < 3);
236 _e[d] = e;
237 }
239 void normalize_e() {
240 _abs = sqrt(ex()*ex() + ey()*ey() + ez()*ez());
241 for(int d = 0; d < 3; ++d) { _e[d] /= _abs; }
242 }
243
244protected:
254 OrientedSite(double x = 0., double y = 0., double z = 0., double m = 0., double ex = 0., double ey = 0., double ez = 0., double abs = 0.)
255 : Site(x, y, z, m), _e{{ex, ey, ez}}, _abs(abs) {}
256
257 std::array<double, 3> _e;
258 double _abs;
259};
260
261
266class Dipole : public OrientedSite {
267public:
268 Dipole() : OrientedSite(0., 0., 0., 0., 0., 0., 0., 0.) {}
278 Dipole(double x, double y, double z, double eMyx, double eMyy, double eMyz, double absMy)
279 : OrientedSite(x, y, z, 0., eMyx, eMyy, eMyz, absMy) {}
280
298 void readXML(XMLfileUnits& xmlconfig) {
299 Site::readXML(xmlconfig);
300 bool bAngleInput = true;
301 double theta, phi;
302 bAngleInput = bAngleInput && xmlconfig.getNodeValueReduced("dipolemoment/theta", theta);
303 bAngleInput = bAngleInput && xmlconfig.getNodeValueReduced("dipolemoment/phi", phi);
304 if(true == bAngleInput) {
305 this->setOrientationVectorByPolarAngles(theta, phi);
306 } else {
307 xmlconfig.getNodeValueReduced("dipolemoment/x", _e[0]);
308 xmlconfig.getNodeValueReduced("dipolemoment/y", _e[1]);
309 xmlconfig.getNodeValueReduced("dipolemoment/z", _e[2]);
310 normalize_e();
311 }
312 xmlconfig.getNodeValueReduced("dipolemoment/abs", _abs);
313 }
314
315 double absMy() const { return abs(); }
321 void setAbyMy(double my) { setAbs(my); }
322};
323
328class Quadrupole : public OrientedSite {
329public:
330 Quadrupole() : OrientedSite(0., 0., 0., 0., 0., 0., 0., 0.) {}
340 Quadrupole(double x, double y, double z, double eQx, double eQy, double eQz, double absQ)
341 : OrientedSite(x, y, z, 0., eQx, eQy, eQz, absQ) {}
342
360 void readXML(XMLfileUnits& xmlconfig) {
361 Site::readXML(xmlconfig);
362 bool bAngleInput = true;
363 double theta, phi;
364 bAngleInput = bAngleInput && xmlconfig.getNodeValueReduced("quadrupolemoment/theta", theta);
365 bAngleInput = bAngleInput && xmlconfig.getNodeValueReduced("quadrupolemoment/phi", phi);
366 if(true == bAngleInput) {
368 } else {
369 xmlconfig.getNodeValueReduced("quadrupolemoment/x", _e[0]);
370 xmlconfig.getNodeValueReduced("quadrupolemoment/y", _e[1]);
371 xmlconfig.getNodeValueReduced("quadrupolemoment/z", _e[2]);
372 normalize_e();
373 }
374 xmlconfig.getNodeValueReduced("quadrupolemoment/abs", _abs);
375 }
376
377 double absQ() const { return abs(); }
383 void setAbsQ(double q) { setAbs(q); }
384};
385
386#endif /* SITE_H_ */
Charge center.
Definition: Site.h:154
void setQ(double q)
Definition: Site.h:190
void write(std::ostream &ostrm) const
write to stream
Definition: Site.h:183
double q() const
Definition: Site.h:187
void readXML(XMLfileUnits &xmlconfig)
Read in XML configuration for a Charge and all its included objects.
Definition: Site.h:177
Charge(double x, double y, double z, double m, double q)
Constructor.
Definition: Site.h:164
Dipole center.
Definition: Site.h:266
void readXML(XMLfileUnits &xmlconfig)
Read in XML configuration for a Dipole and all its included objects.
Definition: Site.h:298
void setAbyMy(double my)
Definition: Site.h:321
Dipole(double x, double y, double z, double eMyx, double eMyy, double eMyz, double absMy)
Constructor.
Definition: Site.h:278
double absMy() const
Definition: Site.h:315
Lennard-Jones 12-6 center.
Definition: Site.h:84
void setULJShift6(double uLJshift6)
Definition: Site.h:134
void setSigma(double sigma)
Definition: Site.h:132
LJcenter(double x, double y, double z, double m, double epsilon, double sigma, double shift)
Constructor.
Definition: Site.h:97
void setEps(double epsilon)
Definition: Site.h:130
double sigma() const
Definition: Site.h:126
void write(std::ostream &ostrm) const
write to stream
Definition: Site.h:120
void readXML(XMLfileUnits &xmlconfig)
Read in XML configuration for a LJcenter and all its included objects.
Definition: Site.h:112
LJcenter()
Constructor.
Definition: Site.h:87
double eps() const
Definition: Site.h:125
double shift6() const
Definition: Site.h:127
The OrientedSite class is the basis for the implementation of physical interactions based on directed...
Definition: Site.h:200
std::array< double, 3 > e() const
Definition: Site.h:205
double abs() const
Definition: Site.h:206
double ex() const
Definition: Site.h:202
void write(std::ostream &ostrm) const
write to stream
Definition: Site.h:210
OrientedSite(double x=0., double y=0., double z=0., double m=0., double ex=0., double ey=0., double ez=0., double abs=0.)
Constructor.
Definition: Site.h:254
double _abs
Definition: Site.h:258
std::array< double, 3 > _e
Definition: Site.h:257
void normalize_e()
Definition: Site.h:239
void setE(int d, double e)
Definition: Site.h:234
void setOrientationVectorByPolarAngles(const double &theta_deg, const double &phi_deg)
set orientation vector using polar angles
Definition: Site.h:219
double ez() const
Definition: Site.h:204
void setAbs(double abs)
Definition: Site.h:228
double ey() const
Definition: Site.h:203
Quadrupole center.
Definition: Site.h:328
Quadrupole(double x, double y, double z, double eQx, double eQy, double eQz, double absQ)
Constructor.
Definition: Site.h:340
void readXML(XMLfileUnits &xmlconfig)
Read in XML configuration for a Dipole and all its included objects.
Definition: Site.h:360
double absQ() const
Definition: Site.h:377
void setAbsQ(double q)
Definition: Site.h:383
The Site class is the basis for the implementation of physical interactions.
Definition: Site.h:20
double rz() const
Definition: Site.h:24
double rx() const
Definition: Site.h:22
void setR(int d, double r)
Definition: Site.h:29
void setM(double m)
Definition: Site.h:35
double ry() const
Definition: Site.h:23
double m() const
Definition: Site.h:26
virtual void readXML(XMLfileUnits &xmlconfig)
Read in XML configuration for a site and all its included objects.
Definition: Site.h:47
std::array< double, 3 > r() const
Definition: Site.h:25
Site(double x=0., double y=0., double z=0., double m=0.)
Constructor.
Definition: Site.h:68
std::array< double, 3 > _r
Definition: Site.h:70
double _m
Definition: Site.h:71
XML file with unit attributes abstraction.
Definition: xmlfileUnits.h:25
XML input file with unit handling/conversion support.