8#ifndef SRC_MOLECULES_MOLECULEINTERFACE_H_
9#define SRC_MOLECULES_MOLECULEINTERFACE_H_
13#include "molecules/Component.h"
14#include "molecules/Quaternion.h"
15#include "particleContainer/adapter/CellDataSoABase.h"
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]);
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();
39 virtual unsigned getComponentLookUpID()
const {
40 return component()->getLookUpId();
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) {
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)};
55 virtual double mass()
const {
56 return component()->
m();
58 virtual double F(
unsigned short d)
const = 0;
60 virtual std::array<double, 3> F_arr() {
61 std::array<double, 3> f_ret{F(0), F(1), F(2)};
65 virtual std::array<double, 3> M_arr() {
66 std::array<double, 3> m_ret{M(0), M(1), M(2)};
69 virtual std::array<double, 3> Vi_arr() {
70 std::array<double, 3> vi_ret{Vi(0), Vi(1), Vi(2)};
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)};
84 virtual double M(
unsigned short d)
const = 0;
85 virtual double Vi(
unsigned short d)
const = 0;
87 virtual void setD(
unsigned short d,
double D) = 0;
89 inline virtual void move(
int d,
double dr) = 0;
92 virtual double getI(
unsigned short d)
const = 0;
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); }
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(); }
106 virtual void updateMassInertia() = 0;
108 virtual void setupSoACache(
CellDataSoABase *
const s,
unsigned iLJ,
unsigned iC,
unsigned iD,
unsigned iQ) = 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;
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;
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;
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;
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;
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;
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;
155 virtual unsigned long totalMemsize()
const = 0;
159 for (
unsigned short d = 0; d < 3; d++) {
160 dr[d] = molecule2.r(d) - r(d);
167 double orientationAngle(
const MoleculeInterface& molecule2,
double dr[3],
double d2)
const {
170 double orientationVector[3];
171 double orientationVectorSquared = 0.;
172 double roundingThreshold = 0.0001;
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());
180 for (
unsigned short d = 0; d < 3; d++) {
181 dr[d] = molecule2.r(d) - r(d);
182 orientationVectorSquared += orientationVector[d] * orientationVector[d];
185 for (
unsigned short d = 0; d < 3; d++) {
186 cosPhi += orientationVector[d] * dr[d] / sqrt(orientationVectorSquared) / sqrt(d2);
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) {
200 void scale_v(
double s,
double offx,
double offy,
double offz) {
201 vsub(offx, offy, offz);
203 vadd(offx, offy, offz);
205 void scale_F(
double s) {
206 double Fscaled[3] = {F(0) * s, F(1) * s, F(2) * s};
209 void scale_D(
double s) {
210 for (
int d = 0; d < 3; ++d) {
214 void scale_M(
double s) {
215 double Mscaled[3] = {M(0) * s, M(1) * s, M(2) * s};
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;
233 virtual void upd_preF(
double dt) = 0;
234 virtual void upd_postF(
double dt_halve,
double& summv2,
double& sumIw2) = 0;
241 void ee_upd_preF(
double dt) {
242 for (
unsigned short d = 0; d < 3; ++d) {
243 setr(d,r(d) + dt * v(d));
246 void ee_upd_postF(
double
247#ifndef ENABLE_REDUCED_MEMORY_MODE
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));
261 summv2 += component()->
m() * v2();
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;
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;
300 virtual bool inBox(
const double l[3],
const double u[3])
const {
302 for (
int d = 0; d < 3; ++d) {
303#ifdef __INTEL_COMPILER
304 #pragma float_control(precise, on)
305 #pragma fenv_access(on)
307 in &= (r(d) >= l[d] and r(d) < u[d]);
332inline void SiteSiteDistance(
const double drm[3],
const double ds1[3],
const double ds2[3],
double drs[3],
double& dr2)
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];
347inline void SiteSiteDistanceAbs(
const double ds1[3],
const double ds2[3],
double drs[3],
double& dr2)
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];
355inline void minusSiteSiteDistance(
const double drm[3],
const double ds1[3],
const double ds2[3],
double drs[3],
double& dr2)
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];
362inline void minusSiteSiteDistanceAbs(
const double ds1[3],
const double ds2[3],
double drs[3],
double& dr2)
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];
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