Simpatico  v1.10
CosineAngle.h
1 #ifndef SIMP_COSINE_ANGLE_H
2 #define SIMP_COSINE_ANGLE_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 <util/global.h>
12 #include <util/space/Vector.h>
13 #include <util/param/ParamComposite.h> // base class
14 #include <cmath>
15 
16 namespace Util{class Random;}
17 
18 namespace Simp
19 {
20 
21  using namespace Util;
22 
32  class CosineAngle : public ParamComposite
33  {
34 
35  public:
36 
40  CosineAngle();
41 
45  CosineAngle(const CosineAngle& other);
46 
50  ~CosineAngle();
51 
55  CosineAngle& operator = (const CosineAngle& other);
56 
62  void setNAngleType(int nAngleType);
63 
74  void readParameters(std::istream &in);
75 
81  virtual void loadParameters(Serializable::IArchive &ar);
82 
88  virtual void save(Serializable::OArchive &ar);
89 
97  void set(std::string name, int type, double value);
98 
105  double energy(double cosTheta, int type) const;
106 
119  void force(const Vector& R1, const Vector& R2,
120  Vector& F1, Vector& F2, int type) const;
121 
136  double randomAngle(Random *random, double beta, int type) const;
137 
152  double randomCosineAngle(Random *random, double beta, int type) const;
153 
161  double get(std::string name, int type) const;
162 
166  std::string className() const;
167 
168  private:
169 
171  static const int MaxNAngleType = 4;
172 
173  double kappa_[MaxNAngleType];
174  int nAngleType_;
175 
176  };
177 
178  // Inline method definitions
179 
180  /*
181  * Return angle energy.
182  */
183  inline double CosineAngle::energy(double cosTheta, int type) const
184  { return kappa_[type]*(1.0-cosTheta); }
185 
186  /*
187  * Return:
188  * F1 = d energy / d(R1)
189  * F2 = d energy / d(R2)
190  * for use in MD and stress calculation.
191  */
192  inline
193  void CosineAngle::force(const Vector& R1, const Vector& R2,
194  Vector& F1, Vector& F2, int type) const
195  {
196  Vector u1 = R1;
197  Vector u2 = R2;
198  double r1 = R1.abs();
199  double r2 = R2.abs();
200  double cosTheta;
201 
202  u1 /= r1;
203  u2 /= r2;
204  cosTheta = u1.dot(u2);
205 
206  F1.multiply(u1, cosTheta);
207  F1 -= u2;
208  F1 *= kappa_[type]/r1;
209 
210  F2.multiply(u2, cosTheta);
211  F2 -= u1;
212  F2 *= kappa_[type]/r2;
213  }
214 
215 }
216 #endif
std::string className() const
Return name string "CosineAngle" for this evaluator class.
CosineAngle & operator=(const CosineAngle &other)
Assignment.
Definition: CosineAngle.cpp:51
A Vector is a Cartesian vector.
Definition: Vector.h:75
void setNAngleType(int nAngleType)
Set the number of angle types.
Definition: CosineAngle.cpp:65
double randomAngle(Random *random, double beta, int type) const
Return bond angle chosen from equilibrium distribution.
double dot(const Vector &v) const
Return dot product of this vector and vector v.
Definition: Vector.h:632
Vector & multiply(const Vector &v, double s)
Multiply a vector v by a scalar s.
Definition: Vector.h:686
A three body angle potential, as a function of angle cosine.
Definition: CosineAngle.h:32
File containing preprocessor macros for error handling.
Classes used by all simpatico molecular simulations.
void force(const Vector &R1, const Vector &R2, Vector &F1, Vector &F2, int type) const
Returns angle forces.
Definition: CosineAngle.h:193
double energy(double cosTheta, int type) const
Returns potential energy for one angle.
Definition: CosineAngle.h:183
Saving / output archive for binary ostream.
virtual void loadParameters(Serializable::IArchive &ar)
Load internal state from an archive.
Definition: CosineAngle.cpp:85
Utility classes for scientific computation.
Definition: accumulators.mod:1
double randomCosineAngle(Random *random, double beta, int type) const
Return bond angle cosine chosen from equilibrium distribution.
virtual void save(Serializable::OArchive &ar)
Save internal state to an archive.
Definition: CosineAngle.cpp:94
~CosineAngle()
Destructor.
Definition: CosineAngle.cpp:45
Saving archive for binary istream.
CosineAngle()
Default constructor.
Definition: CosineAngle.cpp:21
double abs() const
Return absolute magnitude of this vector.
Definition: Vector.h:625
void readParameters(std::istream &in)
Read angle interaction parameters from input stream.
Definition: CosineAngle.cpp:76
Random number generator.
Definition: Random.h:46
An object that can read multiple parameters from file.