25 #include "tools/Tools.h"
26 #include "tools/Exception.h"
54 void setVirial(
void*);
56 void setp(
void*p,
int i);
57 void setf(
void*f,
int i);
60 d=double(*(static_cast<const T*>(m)));
63 *(
static_cast<T*
>(
m))=T(d);
65 void getBox(
Tensor &)
const;
66 void getPositions(
const vector<int>&index,vector<Vector>&positions)
const;
67 void getMasses(
const vector<int>&index,vector<double>&)
const;
68 void getCharges(
const vector<int>&index,vector<double>&)
const;
69 void updateVirial(
const Tensor&)
const;
70 void updateForces(
const vector<int>&index,
const vector<Vector>&);
71 void rescaleForces(
const vector<int>&index,
double factor);
72 unsigned getRealPrecision()
const;
89 if(this->box)
for(
int i=0;i<3;i++)
for(
int j=0;j<3;j++) box(i,j)=this->box[3*i+j]*scaleb;
95 for(
unsigned i=0;i<index.size();++i){
96 positions[index[i]][0]=px[stride*i]*scalep;
97 positions[index[i]][1]=py[stride*i]*scalep;
98 positions[index[i]][2]=pz[stride*i]*scalep;
104 if(
m)
for(
unsigned i=0;i<index.size();++i) masses[index[i]]=
m[i];
105 else for(
unsigned i=0;i<index.size();++i) masses[index[i]]=0.0;
110 if(c)
for(
unsigned i=0;i<index.size();++i) charges[index[i]]=c[i];
111 else for(
unsigned i=0;i<index.size();++i) charges[index[i]]=0.0;
116 if(this->virial)
for(
int i=0;i<3;i++)
for(
int j=0;j<3;j++) this->virial[3*i+j]+=T(virial(i,j)*scalev);
121 for(
unsigned i=0;i<index.size();++i){
122 fx[stride*i]+=T(scalef*forces[index[i]][0]);
123 fy[stride*i]+=T(scalef*forces[index[i]][1]);
124 fz[stride*i]+=T(scalef*forces[index[i]][2]);
130 if(virial)
for(
unsigned i=0;i<3;i++)
for(
unsigned j=0;j<3;j++) virial[3*i+j]*=T(factor);
131 for(
unsigned i=0;i<index.size();++i){
132 fx[stride*i]*=T(factor);
133 fy[stride*i]*=T(factor);
134 fz[stride*i]*=T(factor);
145 T*p=
static_cast<T*
>(pp);
146 plumed_assert(stride==0 || stride==3);
155 box=
static_cast<T*
>(pp);
161 T*f=
static_cast<T*
>(ff);
162 plumed_assert(stride==0 || stride==3);
171 T*p=
static_cast<T*
>(pp);
172 plumed_assert(stride==0 || stride==1);
181 virial=
static_cast<T*
>(pp);
187 T*f=
static_cast<T*
>(ff);
188 plumed_assert(stride==0 || stride==1);
197 this->m=
static_cast<T*
>(
m);
202 this->c=
static_cast<T*
>(c);
225 if(p==
sizeof(
double)){
227 }
else if (p==
sizeof(
float)){
232 plumed_merror(
"cannot create an MD interface with sizeof(real)=="+ pp);
void zero()
set it to zero
Class implementing fixed size matrices of doubles.
Class containing interface to MDAtomsTyped.
Small utility class that contains information about units.
const double & getEnergy() const
Get energy units as double.
void double2MD(const double &d, void *m) const
Convert a double to a pointer to an MD-real.
const double & getLength() const
Get length units as double.
void MD2double(const void *m, double &d) const
Convert a pointer to an MD-real to a double.
Class containing the pointers to the MD data It is templated so that single and double precision vers...
static MDAtomsBase * create(unsigned n)
Creates an MDAtomsTyped object such that sizeof(T)==n.