Simpatico  v1.10
PeriodicExternal.h
1 #ifndef SIMP_PERIODIC_EXTERNAL_H
2 #define SIMP_PERIODIC_EXTERNAL_H
3 
4 /*
5 * Simpatico - Simulation Package for Polymeric and Molecular Liquids
6 *
7 * Copyright 2010 - 2017, The Regents of the University of Minnesota
8 * Distributed under the terms of the GNU General Public License.
9 */
10 
11 #include <simp/boundary/Boundary.h>
12 #include <util/space/Dimension.h>
13 #include <util/space/Vector.h>
14 #include <util/param/ParamComposite.h>
15 #include <util/global.h>
16 #include <cmath>
17 
18 namespace Simp
19 {
20 
21  using namespace Util;
22 
38  {
39 
40  public:
41 
46 
50  PeriodicExternal(const PeriodicExternal& other);
51 
56 
62  void setNAtomType(int nAtomType);
63 
70 
76  void setBoundary(Boundary &boundary);
77 
86  void readParameters(std::istream &in);
87 
93  virtual void loadParameters(Serializable::IArchive &ar);
94 
100  virtual void save(Serializable::OArchive &ar);
101 
102  /*
103  * Set a potential energy parameter, identified by a string.
104  */
105  void set(std::string name, double value);
106 
107  /*
108  * Get a parameter value, identified by a string.
109  */
110  double get(std::string name) const;
111 
117  double externalParameter() const;
118 
126  double energy(const Vector& position, int i) const;
127 
135  void getForce(const Vector& position, int type, Vector& force) const;
136 
140  std::string className() const;
141 
142  private:
143 
145  static const int MaxAtomType = 3;
146 
148  DArray<double> prefactor_;
149 
151  double externalParameter_;
152 
154  int nWaveVectors_;
155 
157  DArray<Vector> waveVectors_;
158 
160  DArray<double> phases_;
161 
163  Vector shift_;
164 
166  double C_;
167 
169  int periodicity_;
170 
172  double interfaceWidth_;
173 
175  Boundary *boundaryPtr_;
176 
178  int nAtomType_;
179 
181  bool isInitialized_;
182 
183  };
184 
185  // inline methods
186 
187  /*
188  * Calculate external potential energy for a single atom.
189  */
190  inline double PeriodicExternal::energy(const Vector& position, int type) const
191  {
192  const Vector cellLengths = boundaryPtr_->lengths();
193  double clipParameter = 1.0/(2.0*M_PI*periodicity_*interfaceWidth_);
194 
195  Vector r = position;
196  r -= shift_;
197  double cosine = 0.0;
198  for (int i = 0; i < nWaveVectors_; ++i) {
199  Vector q;
200  q[0] = 2.0*M_PI*periodicity_*waveVectors_[i][0]/cellLengths[0];
201  q[1] = 2.0*M_PI*periodicity_*waveVectors_[i][1]/cellLengths[1];
202  q[2] = 2.0*M_PI*periodicity_*waveVectors_[i][2]/cellLengths[2];
203  double arg = q.dot(r)+phases_[i];
204  cosine += cos(arg);
205  }
206  cosine *= clipParameter;
207  return prefactor_[type]*externalParameter_*tanh(C_+cosine);
208  }
209 
210  /*
211  * Calculate external force for a single atom.
212  */
213  inline
214  void PeriodicExternal::getForce(const Vector& position, int type,
215  Vector& force) const
216  {
217  const Vector cellLengths = boundaryPtr_->lengths();
218  double clipParameter = 1.0/(2.0*M_PI*periodicity_*interfaceWidth_);
219 
220  Vector r = position;
221  r -= shift_;
222  double cosine = 0.0;
223  Vector deriv;
224  deriv.zero();
225  for (int i = 0; i < nWaveVectors_; ++i) {
226  Vector q;
227  q[0] = 2.0*M_PI*periodicity_*waveVectors_[i][0]/cellLengths[0];
228  q[1] = 2.0*M_PI*periodicity_*waveVectors_[i][1]/cellLengths[1];
229  q[2] = 2.0*M_PI*periodicity_*waveVectors_[i][2]/cellLengths[2];
230  double arg = q.dot(r)+phases_[i];
231  cosine += cos(arg);
232  double sine = -1.0*sin(arg);
233  q *= sine;
234  deriv += q;
235  }
236  cosine *= clipParameter;
237  deriv *= clipParameter;
238  double tanH = tanh(C_+cosine);
239  double sechSq = (1.0 - tanH*tanH);
240  double f = prefactor_[type]*externalParameter_*sechSq;
241  deriv *= -1.0*f;
242  force = deriv;
243  }
244 
245 }
246 #endif
Vector & zero()
Set all elements of a 3D vector to zero.
Definition: Vector.h:514
A Vector is a Cartesian vector.
Definition: Vector.h:75
void setExternalParameter(double externalParameter)
Sets external parameter.
void setBoundary(Boundary &boundary)
Set pointer to Boundary.
double dot(const Vector &v) const
Return dot product of this vector and vector v.
Definition: Vector.h:632
An orthorhombic periodic unit cell.
virtual void save(Serializable::OArchive &ar)
Save internal state to an archive.
void readParameters(std::istream &in)
Read potential parameters, and initialize other variables.
double energy(const Vector &position, int i) const
Returns external potential energy of a single particle.
File containing preprocessor macros for error handling.
Classes used by all simpatico molecular simulations.
void getForce(const Vector &position, int type, Vector &force) const
Returns force caused by the external potential.
std::string className() const
Return name string "PeriodicExternal".
Saving / output archive for binary ostream.
Utility classes for scientific computation.
Definition: accumulators.mod:1
double externalParameter() const
Returns external parameter.
Saving archive for binary istream.
A clipped cosine potential that induces ordering along directions specified by waveIntVectors, w_i.
PeriodicExternal()
Default constructor.
void setNAtomType(int nAtomType)
Set nAtomType value.
PeriodicExternal & operator=(const PeriodicExternal &other)
Assignment.
virtual void loadParameters(Serializable::IArchive &ar)
Load internal state from an archive.
An object that can read multiple parameters from file.