Simpatico  v1.10
BoxExternal.h
1 #ifndef SIMP_BOX_EXTERNAL_H
2 #define SIMP_BOX_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/param/ParamComposite.h>
14 #include <util/global.h>
15 #include <cmath>
16 
17 namespace Simp
18 {
19 
20  using namespace Util;
21 
42  class BoxExternal : public ParamComposite
43  {
44 
45  public:
46 
50  BoxExternal();
51 
55  BoxExternal(const BoxExternal& other);
56 
60  BoxExternal& operator = (const BoxExternal& other);
61 
63 
64 
70  void setNAtomType(int nAtomType);
71 
77  void setBoundary(Boundary &boundary);
78 
85 
94  void readParameters(std::istream &in);
95 
101  virtual void loadParameters(Serializable::IArchive &ar);
102 
108  virtual void save(Serializable::OArchive &ar);
109 
110  /*
111  * Set a potential energy parameter, identified by a string.
112  */
113  void set(std::string name, double value);
114 
115  /*
116  * Get a parameter value, identified by a string.
117  */
118  double get(std::string name) const;
119 
121 
123 
124 
128  std::string className() const;
129 
135  double externalParameter() const;
136 
144  double energy(double d, int i) const;
145 
153  double energy(const Vector& position, int i) const;
154 
165  double forceScalar(double d, int i) const;
166 
174  void getForce(const Vector& position, int type, Vector& force) const;
175 
177 
178  private:
179 
181  static const int MaxAtomType = 2;
182 
184  double epsilon_;
185 
187  double sigma_;
188 
190  double sigmaCb_;
191 
193  double cutoff_;
194 
196  double coeff_;
197 
199  Boundary *boundaryPtr_;
200 
202  int nAtomType_;
203 
205  bool isInitialized_;
206 
207  };
208 
209  // inline methods
210 
211  /*
212  * Calculate repulsive potential energy for particle of type i.
213  *
214  * 7.905694 = 25/sqrt(10), which is the negative of the minimum of the
215  * unshifted 9-3 potential.
216  */
217  inline double BoxExternal::energy(double d, int type) const
218  {
219  if (d < cutoff_) {
220  double r3i;
221  r3i = d * d * d;
222  if (r3i < 0.129615*sigmaCb_) r3i = 0.129615 * sigmaCb_;
223  r3i = sigmaCb_ / r3i;
224  return coeff_ * (r3i*(r3i*r3i - 7.5) + 7.905694);
225  } else {
226  return 0.0;
227  }
228  }
229 
230  /*
231  * Calculate external potential energy for a single atom.
232  */
233  inline double BoxExternal::energy(const Vector& position, int type) const
234  {
235  double d, totalEnergy;
236  Vector halfL = boundaryPtr_->lengths();
237  halfL *= 0.5;
238  totalEnergy = 0.0;
239  for (int i = 0; i < Dimension; ++i) {
240  d = position[i];
241  if (d > halfL[i]) d = halfL[i] + halfL[i] - d;
242  totalEnergy += energy(d, type);
243  }
244  return totalEnergy;
245  }
246 
247  /*
248  * Calculate force for a particle as a function of distance to boundary.
249  */
250  inline double BoxExternal::forceScalar(double d, int i) const
251  {
252  if (d < cutoff_) {
253  double r3i;
254  r3i = d * d * d;
255  if (r3i < 0.129615 * sigmaCb_) r3i = 0.129615 * sigmaCb_;
256  r3i = sigmaCb_ / r3i;
257  return coeff_ * (9.0*r3i*r3i - 22.5) * r3i / d;
258  } else {
259  return 0.0;
260  }
261  }
262 
263  /*
264  * Calculate external force for a single atom.
265  */
266  inline void
267  BoxExternal::getForce(const Vector& position, int type, Vector& force) const
268  {
269  double d = position[2];
270  double scalarf;
271  Vector halfL = boundaryPtr_->lengths();
272  halfL *= 0.5;
273  for (int i = 0; i < Dimension; ++i) {
274  d = position[i];
275  if (d > halfL[i]) {
276  d = halfL[i] + halfL[i] - d;
277  scalarf = forceScalar(d, type);
278  force[i] = -scalarf;
279  } else {
280  scalarf = forceScalar(d, type);
281  force[i] = scalarf;
282  }
283  }
284  }
285 
286 }
287 #endif
double forceScalar(double d, int i) const
Returns magnitude of the repulsive force.
Definition: BoxExternal.h:250
const int Dimension
Dimensionality of space.
Definition: Dimension.h:19
A Vector is a Cartesian vector.
Definition: Vector.h:75
virtual void loadParameters(Serializable::IArchive &ar)
Load internal state from an archive.
double energy(double d, int i) const
Returns external potential energy of a particle of type i.
Definition: BoxExternal.h:217
An orthorhombic periodic unit cell.
void readParameters(std::istream &in)
Read potential parameters, and initialize other variables.
Definition: BoxExternal.cpp:92
void setExternalParameter(double externalParameter)
Sets external parameter.
Definition: BoxExternal.cpp:79
File containing preprocessor macros for error handling.
Classes used by all simpatico molecular simulations.
BoxExternal & operator=(const BoxExternal &other)
Assignment.
Definition: BoxExternal.cpp:43
Saving / output archive for binary ostream.
std::string className() const
Return name string "LJPair" for this evaluator class.
virtual void save(Serializable::OArchive &ar)
Save internal state to an archive.
BoxExternal()
Default constructor.
Definition: BoxExternal.cpp:20
Utility classes for scientific computation.
Definition: accumulators.mod:1
double externalParameter() const
Returns external parameter.
A repulsive 9-3 potential confining particles within a box.
Definition: BoxExternal.h:42
Saving archive for binary istream.
void setNAtomType(int nAtomType)
Set nAtomType value.
Definition: BoxExternal.cpp:59
void setBoundary(Boundary &boundary)
Set pointer to Boundary.
Definition: BoxExternal.cpp:73
An object that can read multiple parameters from file.
void getForce(const Vector &position, int type, Vector &force) const
Returns force caused by the external potential.
Definition: BoxExternal.h:267