Simpatico  v1.10
ModifierManager.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 "ModifierManager.h"
9 #include "ModifierFactory.h"
10 
11 namespace DdMd
12 {
13 
14  using namespace Util;
15 
16  /*
17  * Default constructor.
18  */
20  : Manager<Modifier>(),
21  simulationPtr_(0),
22  setupModifiers_(),
23  preIntegrate1Modifiers_(),
24  postIntegrate1Modifiers_(),
25  preTransformModifiers_(),
26  preExchangeModifiers_(),
27  postExchangeModifiers_(),
28  postNeighborModifiers_(),
29  preUpdateModifiers_(),
30  postUpdateModifiers_(),
31  preForceModifiers_(),
32  postForceModifiers_(),
33  endOfStepModifiers_(),
34  exchangeModifiers_(),
35  updateModifiers_(),
36  reverseUpdateModifiers_()
37  { setClassName("ModifierManager"); }
38 
39  /*
40  * Constructor.
41  */
43  : Manager<Modifier>(),
44  simulationPtr_(&simulation),
45  setupModifiers_(),
46  preIntegrate1Modifiers_(),
47  postIntegrate1Modifiers_(),
48  preTransformModifiers_(),
49  preExchangeModifiers_(),
50  postExchangeModifiers_(),
51  postNeighborModifiers_(),
52  preUpdateModifiers_(),
53  postUpdateModifiers_(),
54  preForceModifiers_(),
55  postForceModifiers_(),
56  endOfStepModifiers_(),
57  exchangeModifiers_(),
58  updateModifiers_(),
59  reverseUpdateModifiers_()
60  { setClassName("ModifierManager"); }
61 
62  /*
63  * Destructor.
64  */
66  {}
67 
68  /*
69  * Read parameter file.
70  *
71  * \param in input parameter file stream.
72  */
73  void ModifierManager::readParameters(std::istream &in)
74  {
76 
77  Modifier* ptr;
78  for (int i = 0; i < size(); ++i) {
79  ptr = &(*this)[i];
80  if (ptr->isSet(Modifier::Flags::Setup)) {
81  setupModifiers_.append(*ptr);
82  }
84  preIntegrate1Modifiers_.append(*ptr);
85  }
87  postIntegrate1Modifiers_.append(*ptr);
88  }
90  preTransformModifiers_.append(*ptr);
91  }
93  preExchangeModifiers_.append(*ptr);
94  }
96  postExchangeModifiers_.append(*ptr);
97  }
99  postNeighborModifiers_.append(*ptr);
100  }
101  if (ptr->isSet(Modifier::Flags::PreUpdate)) {
102  preUpdateModifiers_.append(*ptr);
103  }
104  if (ptr->isSet(Modifier::Flags::PostUpdate)) {
105  postUpdateModifiers_.append(*ptr);
106  }
107  if (ptr->isSet(Modifier::Flags::PreForce)) {
108  preForceModifiers_.append(*ptr);
109  }
110  if (ptr->isSet(Modifier::Flags::PostForce)) {
111  postForceModifiers_.append(*ptr);
112  }
113  if (ptr->isSet(Modifier::Flags::EndOfStep)) {
114  endOfStepModifiers_.append(*ptr);
115  }
116  if (ptr->isSet(Modifier::Flags::Exchange)) {
117  exchangeModifiers_.append(*ptr);
118  }
119  if (ptr->isSet(Modifier::Flags::Update)) {
120  updateModifiers_.append(*ptr);
121  }
123  reverseUpdateModifiers_.append(*ptr);
124  }
125  } // end for i
126  }
127 
128  // Setup
129 
131  {
132  int n = setupModifiers_.size();
133  for (int i = 0; i < n; ++i) {
134  setupModifiers_[i].setup();
135  }
136  }
137 
138  // Integration actions
139 
141  {
142  Modifier* ptr;
143  int n = preIntegrate1Modifiers_.size();
144  for (int i = 0; i < n; ++i) {
145  ptr = &preIntegrate1Modifiers_[i];
146  if (ptr->isAtInterval(iStep)) {
147  ptr->preIntegrate1(iStep);
148  }
149  }
150  }
151 
153  {
154  Modifier* ptr;
155  int n = postIntegrate1Modifiers_.size();
156  for (int i = 0; i < n; ++i) {
157  ptr = &postIntegrate1Modifiers_[i];
158  if (ptr->isAtInterval(iStep)) {
159  ptr->postIntegrate1(iStep);
160  }
161  }
162  }
163 
165  {
166  Modifier* ptr;
167  int n = preTransformModifiers_.size();
168  for (int i = 0; i < n; ++i) {
169  ptr = &preTransformModifiers_[i];
170  if (ptr->isAtInterval(iStep)) {
171  ptr->preTransform(iStep);
172  }
173  }
174  }
175 
177  {
178  Modifier* ptr;
179  int n = preExchangeModifiers_.size();
180  for (int i = 0; i < n; ++i) {
181  ptr = &preExchangeModifiers_[i];
182  if (ptr->isAtInterval(iStep)) {
183  ptr->preExchange(iStep);
184  }
185  }
186  }
187 
189  {
190  Modifier* ptr;
191  int n = postExchangeModifiers_.size();
192  for (int i = 0; i < n; ++i) {
193  ptr = &postExchangeModifiers_[i];
194  if (ptr->isAtInterval(iStep)) {
195  ptr->postExchange(iStep);
196  }
197  }
198  }
199 
201  {
202  Modifier* ptr;
203  int n = postNeighborModifiers_.size();
204  for (int i = 0; i < n; ++i) {
205  ptr = &postNeighborModifiers_[i];
206  if (ptr->isAtInterval(iStep)) {
207  ptr->postNeighbor(iStep);
208  }
209  }
210  }
211 
212  void ModifierManager::preUpdate(long iStep)
213  {
214  Modifier* ptr;
215  int n = preUpdateModifiers_.size();
216  for (int i = 0; i < n; ++i) {
217  ptr = &preUpdateModifiers_[i];
218  if (ptr->isAtInterval(iStep)) {
219  ptr->preUpdate(iStep);
220  }
221  }
222  }
223 
225  {
226  Modifier* ptr;
227  int n = postUpdateModifiers_.size();
228  for (int i = 0; i < n; ++i) {
229  ptr = &postUpdateModifiers_[i];
230  if (ptr->isAtInterval(iStep)) {
231  ptr->postUpdate(iStep);
232  }
233  }
234  }
235 
236  void ModifierManager::preForce(long iStep)
237  {
238  Modifier* ptr;
239  int n = preForceModifiers_.size();
240  for (int i = 0; i < n; ++i) {
241  ptr = &preForceModifiers_[i];
242  if (ptr->isAtInterval(iStep)) {
243  ptr->preForce(iStep);
244  }
245  }
246  }
247 
248  void ModifierManager::postForce(long iStep)
249  {
250  Modifier* ptr;
251  int n = postForceModifiers_.size();
252  for (int i = 0; i < n; ++i) {
253  ptr = &postForceModifiers_[i];
254  if (ptr->isAtInterval(iStep)) {
255  ptr->postForce(iStep);
256  }
257  }
258  }
259 
260  void ModifierManager::endOfStep(long iStep)
261  {
262  Modifier* ptr;
263  int n = endOfStepModifiers_.size();
264  for (int i = 0; i < n; ++i) {
265  ptr = &endOfStepModifiers_[i];
266  if (ptr->isAtInterval(iStep)) {
267  ptr->endOfStep(iStep);
268  }
269  }
270  }
271 
272  // Communication
273 
275  {
276  Modifier* ptr;
277  int n = exchangeModifiers_.size();
278  for (int i = 0; i < n; ++i) {
279  ptr = &exchangeModifiers_[i];
280  ptr->packExchange();
281  }
282  }
283 
285  {
286  Modifier* ptr;
287  int n = exchangeModifiers_.size();
288  for (int i = 0; i < n; ++i) {
289  ptr = &exchangeModifiers_[i];
290  ptr->unpackExchange();
291  }
292  }
293 
295  {
296  Modifier* ptr;
297  int n = updateModifiers_.size();
298  for (int i = 0; i < n; ++i) {
299  ptr = &updateModifiers_[i];
300  ptr->packUpdate();
301  }
302  }
303 
305  {
306  Modifier* ptr;
307  int n = updateModifiers_.size();
308  for (int i = 0; i < n; ++i) {
309  ptr = &updateModifiers_[i];
310  ptr->unpackUpdate();
311  }
312  }
313 
315  {
316  Modifier* ptr;
317  int n = reverseUpdateModifiers_.size();
318  for (int i = 0; i < n; ++i) {
319  ptr = &reverseUpdateModifiers_[i];
320  ptr->packReverseUpdate();
321  }
322  }
323 
325  {
326  Modifier* ptr;
327  int n = reverseUpdateModifiers_.size();
328  for (int i = 0; i < n; ++i) {
329  ptr = &reverseUpdateModifiers_[i];
330  ptr->unpackReverseUpdate();
331  }
332  }
333 
334  /*
335  * Return pointer to default Modifier factory.
336  */
338  { return new ModifierFactory(*simulationPtr_); }
339 
340 }
virtual void preIntegrate1(long iStep)
Call just before the first step of velocity-Verlet algorithm.
Definition: Modifier.h:115
bool isAtInterval(long iStep) const
Return true iff iStep is a multiple of the interval.
Definition: Modifier.h:385
static const Bit Update
Flag to activate pack/unpack update functions.
Definition: Modifier.h:289
static const Bit PostForce
Flag to activate postForce() function.
Definition: Modifier.h:280
void unpackReverseUpdate(long iStep)
Unpack data from the buffer used to reverse update forces.
virtual void unpackExchange()
Unpack data from buffer used to exchange atoms.
Definition: Modifier.h:199
static const Bit PreTransform
Flag to activate preTransform() function.
Definition: Modifier.h:259
void postNeighbor(long iStep)
Call on exchange steps after re-building the neighbor list.
void preTransform(long iStep)
Call on exchange steps before transforming to scaled coordinates.
void postUpdate(long iStep)
Call on update steps after updating ghost positions.
static const Bit PreExchange
Flag to activate preExchange() function.
Definition: Modifier.h:262
virtual void postUpdate(long iStep)
Call on update steps after updating ghost positions.
Definition: Modifier.h:164
static const Bit Setup
Flag to activate setup() function.
Definition: Modifier.h:250
static const Bit ReverseUpdate
Flag to activate pack/unpack reverse update functions.
Definition: Modifier.h:292
virtual void packExchange()
Pack data into buffer used to exchange atoms.
Definition: Modifier.h:194
void endOfStep(long iStep)
Call after 2nd integration step, at end of the time step.
Factory< Modifier > * newDefaultFactory() const
Return pointer to a new default factory.
void packReverseUpdate(long iStep)
Pack data into buffer used to reverse update forces.
static const Bit PreIntegrate1
Flag to activate preIntegrate() function.
Definition: Modifier.h:253
Parallel domain decomposition (DD) MD simulation.
Main object for a domain-decomposition MD simulation.
static const Bit PostIntegrate1
Flag to activate postIntegrate1() function.
Definition: Modifier.h:256
void packExchange(long iStep)
Pack data into buffer used to exchange atoms.
static const Bit PreUpdate
Flag to activate preUpdate() function.
Definition: Modifier.h:271
virtual void preTransform(long iStep)
Call on exchange steps before transforming to scaled atomic coordinates.
Definition: Modifier.h:129
bool isSet(Bit flag) const
Return true if a flag is set, false otherwise.
Definition: Modifier.cpp:75
static const Bit PostExchange
Flag to activate postExchange() function.
Definition: Modifier.h:265
Template container for pointers to objects with a common base class.
Definition: Manager.h:38
void preIntegrate1(long iStep)
Call just before the first step of velocity-Verlet algorithm.
static const Bit PreForce
Flag to activate preForce() function.
Definition: Modifier.h:277
virtual void unpackUpdate()
Unpack data from buffer used to update ghost positions.
Definition: Modifier.h:209
void unpackExchange(long iStep)
Unpack data from buffer used to exchange atoms.
Utility classes for scientific computation.
Definition: accumulators.mod:1
~ModifierManager()
Destructor.
virtual void preExchange(long iStep)
Call on exchange steps after transforming but before exchanging atoms.
Definition: Modifier.h:136
static const Bit PostNeighbor
Flag to activate postNeighbor() function.
Definition: Modifier.h:268
static const Bit Exchange
Flag to activate pack/unpack exchange functions.
Definition: Modifier.h:286
void postExchange(long iStep)
Call on exchange steps after atom exchange, before reneighboring.
virtual void postForce(long iStep)
Call after calculating forces.
Definition: Modifier.h:178
Factory for DdMd::Modifier objects.
void preUpdate(long iStep)
Call on update steps before updating ghost positions.
void unpackUpdate(long iStep)
Unpack data from buffer used to update ghost positions.
static const Bit EndOfStep
Flag to activate endOfStep() function.
Definition: Modifier.h:283
virtual void readParameters(std::istream &in)
Read child blocks, return when closing bracket encountered.
Definition: Manager.h:356
virtual void unpackReverseUpdate()
Unpack data from the buffer used to reverse update forces.
Definition: Modifier.h:223
virtual void postIntegrate1(long iStep)
Call just after the first step of velocity-Verlet algorithm.
Definition: Modifier.h:122
virtual void postNeighbor(long iStep)
Call on exchange steps after re-building neighbor list (reneighboring).
Definition: Modifier.h:150
virtual void postExchange(long iStep)
Call on exchange steps after atom exchange, before reneighboring.
Definition: Modifier.h:143
void preForce(long iStep)
Call after updating but before calculating forces.
void packUpdate(long iStep)
Pack data into buffer used to update ghost positions.
virtual void packReverseUpdate()
Pack data into buffer used to reverse update forces.
Definition: Modifier.h:216
void postIntegrate1(long iStep)
Call just after the first step of velocity-Verlet algorithm.
void setClassName(const char *className)
Set class name string.
static const Bit PostUpdate
Flag to activate postUpdate() function.
Definition: Modifier.h:274
void readParameters(std::istream &in)
Read main block of parameter file.
virtual void packUpdate()
Pack data into buffer used to update ghost positions.
Definition: Modifier.h:204
virtual void preUpdate(long iStep)
Call on update steps before updating ghost positions.
Definition: Modifier.h:157
int size() const
Get logical size.
virtual void preForce(long iStep)
Call after updating but before calculating forces.
Definition: Modifier.h:171
virtual void endOfStep(long iStep)
Call at the end of the time step.
Definition: Modifier.h:185
void setup()
Setup before entering the main loop.
void preExchange(long iStep)
Call on exchange steps after transforming, before exchanging.
A Modifier can modify the time evolution of the simulation.
Definition: Modifier.h:82
ModifierManager()
Default constructor (for unit testing).
void postForce(long iStep)
Call after calculating forces.