Simpatico  v1.10
MultiHarmonicDihedral.cpp
1 /*
2 * Simpatico - Simulation Package for Polymeric and Molecular Liquids
3 *
4 * Copyright 2010 - 2017, The Regents of the University of Minnesota
5 * Distributed under the terms of the GNU General Public License.
6 */
7 
8 #include "MultiHarmonicDihedral.h"
9 #include <util/format/Int.h>
10 #include <util/format/Dbl.h>
11 
12 #include <iomanip>
13 namespace Simp
14 {
15 
16  using namespace Util;
17 
18  /*
19  * Constructor.
20  */
22  : nDihedralType_(0)
23  {
24  setClassName("MultiHarmonicDihedral");
25  }
26 
27  /*
28  * Copy constructor.
29  */
31  : nDihedralType_(other.nDihedralType_)
32  {
33  Parameter* ptr;
34  const Parameter* otherPtr;
35  if (nDihedralType_ > 0) {
36  parameters_.allocate(nDihedralType_);
37  for (int i = 0; i < nDihedralType_; ++i) {
38  ptr = &(parameters_[i]);
39  otherPtr = &(other.parameters_[i]);
40  ptr->k0 = otherPtr->k0;
41  ptr->k1 = otherPtr->k1;
42  ptr->k2 = otherPtr->k2;
43  ptr->k3 = otherPtr->k3;
44  ptr->k4 = otherPtr->k4;
45  ptr->init();
46  }
47  }
48  }
49 
50  /*
51  * Assignment.
52  */
55  {
56  if (!parameters_.isAllocated()) {
57  nDihedralType_ = other.nDihedralType_;
58  if (nDihedralType_ > 0) {
59  parameters_.allocate(nDihedralType_);
60  }
61  } else {
62  if (nDihedralType_ != other.nDihedralType_) {
63  UTIL_THROW("Unequal values of nDihedralType_");
64  }
65  }
66  if (nDihedralType_ > 0) {
67  Parameter* ptr;
68  const Parameter* otherPtr;
69  for (int i = 0; i < nDihedralType_; ++i) {
70  ptr = &(parameters_[i]);
71  otherPtr = &(other.parameters_[i]);
72  ptr->k0 = otherPtr->k0;
73  ptr->k1 = otherPtr->k1;
74  ptr->k2 = otherPtr->k2;
75  ptr->k3 = otherPtr->k3;
76  ptr->k4 = otherPtr->k4;
77  ptr->init();
78  }
79  }
80  return *this;
81  }
82 
83  /*
84  * Set the nDihedralType_ member.
85  */
87  {
88  if (nDihedralType <= 0) {
89  UTIL_THROW("nDihedralType must be positive");
90  }
91  nDihedralType_ = nDihedralType;
92  parameters_.allocate(nDihedralType_);
93  }
94 
95  /*
96  * Read Fourier coefficients from file.
97  */
98  void MultiHarmonicDihedral::readParameters(std::istream &in)
99  {
100  if (nDihedralType_ <= 0) {
101  UTIL_THROW("nDihedralType must be set before readParam");
102  }
103  Parameter* ptr;
104  int j;
105  for (int i = 0; i < nDihedralType_; ++i) {
106  in >> j;
107  if (i != j) UTIL_THROW("Inconsistent dihedral type index");
108  ptr = &(parameters_[i]);
109  in >> ptr->k0 >> ptr->k1 >> ptr->k2
110  >> ptr->k3 >> ptr->k4;
111  ptr->init();
112  }
113  }
114 
115  /*
116  * Write Fourier coefficients to file.
117  */
118  void MultiHarmonicDihedral::writeParam(std::ostream &out)
119  {
120  Parameter* ptr;
121  out.setf(std::ios_base::fixed);
122  for (int i = 0; i < nDihedralType_; ++i) {
123  ptr = &parameters_[i];
124  out << Int(i, 5) << " " << std::setprecision(6)
125  << std::setw(10) << ptr->k0 << " "
126  << std::setw(10) << ptr->k1 << " "
127  << std::setw(10) << ptr->k2 << " "
128  << std::setw(10) << ptr->k3 << " "
129  << std::setw(10) << ptr->k4 << " "
130  << std::endl;
131  }
132  }
133 
134  /*
135  * Load internal state from an archive.
136  */
138  {
139  ar >> nDihedralType_;
140  if (nDihedralType_ <= 0) {
141  UTIL_THROW( "nDihedralType must be positive");
142  }
143  parameters_.allocate(nDihedralType_);
144  Parameter* ptr;
145  for (int i = 0; i < nDihedralType_; ++i) {
146  ptr = &(parameters_[i]);
147  ar >> ptr->k0;
148  ar >> ptr->k1;
149  ar >> ptr->k2;
150  ar >> ptr->k3;
151  ar >> ptr->k4;
152  ar >> ptr->a0;
153  ar >> ptr->a1;
154  ar >> ptr->a2;
155  ar >> ptr->a3;
156  ar >> ptr->a4;
157  ar >> ptr->g2;
158  ar >> ptr->g3;
159  ar >> ptr->g4;
160  }
161  }
162 
163  /*
164  * Save internal state to an archive.
165  */
167  {
168  ar << nDihedralType_;
169  Parameter* ptr;
170  for (int i = 0; i < nDihedralType_; ++i) {
171  ptr = &(parameters_[i]);
172  ar << ptr->k0;
173  ar << ptr->k1;
174  ar << ptr->k2;
175  ar << ptr->k3;
176  ar << ptr->k4;
177  ar << ptr->a0;
178  ar << ptr->a1;
179  ar << ptr->a2;
180  ar << ptr->a3;
181  ar << ptr->a4;
182  ar << ptr->g2;
183  ar << ptr->g3;
184  ar << ptr->g4;
185  }
186  }
187 
188  /*
189  * Modify a parameter, identified by a string.
190  */
191  void MultiHarmonicDihedral::set(std::string name, int type, double value)
192  {
193  Parameter* ptr = &(parameters_[type]);
194  if (name == "k0") {
195  ptr->k0 = value;
196  } else
197  if (name == "k1") {
198  ptr->k1 = value;
199  } else
200  if (name == "k2") {
201  ptr->k2 = value;
202  } else
203  if (name == "k3") {
204  ptr->k3 = value;
205  } else
206  if (name == "k4") {
207  ptr->k4 = value;
208  } else {
209  UTIL_THROW("Unrecognized parameter name");
210  }
211  ptr->init();
212  }
213 
214  /*
215  * Get a parameter value, identified by a string.
216  */
217  double MultiHarmonicDihedral::get(std::string name, int type) const
218  {
219  double value = 0.0;
220  const Parameter* ptr = &(parameters_[type]);
221  if (name == "k0") {
222  value = ptr->k0;
223  } else
224  if (name == "k1") {
225  value = ptr->k1;
226  } else
227  if (name == "k2") {
228  value = ptr->k2;
229  } else
230  if (name == "k3") {
231  value = ptr->k3;
232  } else
233  if (name == "k4") {
234  value = ptr->k4;
235  } else {
236  UTIL_THROW("Unrecognized parameter name");
237  }
238  return value;
239  }
240 
241  /*
242  * Return class name string "MultiHarmonicDihedral".
243  */
245  { return std::string("MultiHarmonicDihedral"); }
246 
247 }
void setNDihedralType(int nDihedralType)
Set the number of dihedral types.
Classes used by all simpatico molecular simulations.
void readParameters(std::istream &in)
Read dihedral interaction parameters from input stream.
double get(std::string name, int type) const
Get a parameter value, identified by a string.
Saving / output archive for binary ostream.
#define UTIL_THROW(msg)
Macro for throwing an Exception, reporting function, file and line number.
Definition: global.h:51
std::string className() const
Return name string "MultiHarmonicDihedral".
Utility classes for scientific computation.
Definition: accumulators.mod:1
A truncated Fourier series dihedral potential.
Wrapper for an int, for formatted ostream output.
Definition: Int.h:36
Saving archive for binary istream.
virtual void loadParameters(Serializable::IArchive &ar)
Load internal state from an archive.
MultiHarmonicDihedral & operator=(const MultiHarmonicDihedral &other)
Assignment.
void setClassName(const char *className)
Set class name string.
virtual void save(Serializable::OArchive &ar)
Save internal state to an archive.
void writeParam(std::ostream &out)
Write Fourier coefficients to output stream.
MultiHarmonicDihedral()
Default constructor.
void set(std::string name, int type, double value)
Modify a parameter, identified by a string.