Simpatico  v1.10
ExternalEnergyAverage.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 "ExternalEnergyAverage.h"
9 #include <ddMd/potentials/pair/PairPotential.h>
10 #include <ddMd/potentials/external/ExternalPotential.h>
11 #include <util/format/Int.h>
12 #include <util/format/Dbl.h>
13 #include <util/accumulators/Average.h> // member template
14 #include <util/mpi/MpiLoader.h>
15 #include <util/misc/ioUtil.h>
16 
17 #include <sstream>
18 
19 namespace DdMd
20 {
21 
22  using namespace Util;
23 
24  /*
25  * Constructor.
26  */
28  : Analyzer(simulation),
29  outputFile_(),
30  accumulator_(NULL),
31  nSamplePerBlock_(1),
32  isInitialized_(false)
33  { setClassName("ExternalEnergyAverage"); }
34 
35  /*
36  * Destructor.
37  */
39  {
40  if(accumulator_ != NULL) {
41  delete accumulator_;
42  }
43  }
44 
45  /*
46  * Read interval and outputFileName.
47  */
48  void ExternalEnergyAverage::readParameters(std::istream& in)
49  {
50  readInterval(in);
52  read<int>(in,"nSamplePerBlock", nSamplePerBlock_);
53 
54  if (simulation().domain().isMaster()) {
55  accumulator_ = new Average;
56  accumulator_->setNSamplePerBlock(nSamplePerBlock_);
57  }
58 
59  isInitialized_ = true;
60  }
61 
62  /*
63  * Load internal state from an archive.
64  */
66  {
67  loadInterval(ar);
69  loadParameter<int>(ar,"nSamplePerBlock", nSamplePerBlock_);
70  if (simulation().domain().isMaster()) {
71  accumulator_ = new Average;
72  accumulator_->loadParameters(ar);
73  if (nSamplePerBlock_ != accumulator_->nSamplePerBlock()) {
74  UTIL_THROW("Inconsistent values of nSamplePerBlock");
75  }
76  }
77  isInitialized_ = true;
78  }
79 
80  /*
81  * Save internal state to an archive.
82  */
84  {
85  assert(simulation().domain().isMaster());
86  saveInterval(ar);
88  ar << nSamplePerBlock_;
89  ar << *accumulator_;
90  }
91 
92  /*
93  * Reset nSample.
94  */
96  {
97  if (simulation().domain().isMaster()){
98  accumulator_->clear();
99  }
100  }
101 
102  /*
103  * Dump configuration to file
104  */
106  {
107  if (isAtInterval(iStep)) {
108  double external = 0.0;
110  #ifdef SIMP_EXTERNAL
111  if (simulation().hasExternal()) {
112  external = simulation().externalPotential().energy();
113  }
114  #endif
115  if (simulation().domain().isMaster()) {
116  accumulator_->sample(external);
117  }
118  }
119  }
120 
121  /*
122  * Output results to file after simulation is completed.
123  */
125  {
126  if (simulation().domain().isMaster()) {
127  simulation().fileMaster().openOutputFile(outputFileName(".prm"), outputFile_);
128  ParamComposite::writeParam(outputFile_);
129  outputFile_.close();
130 
131  simulation().fileMaster().openOutputFile(outputFileName(".ave"), outputFile_);
132  accumulator_->output(outputFile_);
133  outputFile_.close();
134  }
135  }
136 
137 }
Abstract base for periodic output and/or analysis actions.
void clear()
Clear all accumulators, set to empty initial state.
Definition: Average.cpp:42
Simulation & simulation()
Get the parent Simulation by reference.
virtual void loadParameters(Serializable::IArchive &ar)
Load internal state from an archive.
Definition: Average.cpp:74
void readOutputFileName(std::istream &in)
Read outputFileName from file.
void saveInterval(Serializable::OArchive &ar)
Save interval parameter to an archive.
Calculates the average and variance of a sampled property.
Definition: Average.h:43
virtual void save(Serializable::OArchive &ar)
Save internal state to an archive.
virtual void sample(long iStep)
Dump configuration to file.
virtual void output()
Dump configuration to file.
void openOutputFile(const std::string &filename, std::ofstream &out, std::ios_base::openmode mode=std::ios_base::out) const
Open an output file.
Definition: FileMaster.cpp:290
virtual void clear()
Clear nSample counter.
void readInterval(std::istream &in)
Read parameter interval from file.
Parallel domain decomposition (DD) MD simulation.
Main object for a domain-decomposition MD simulation.
const ExternalPotential & externalPotential() const
Get the ExternalPotential by reference.
virtual void readParameters(std::istream &in)
Read dumpPrefix and interval.
Saving / output archive for binary ostream.
void loadOutputFileName(Serializable::IArchive &ar)
Load output file name to an archive.
virtual void loadParameters(Serializable::IArchive &ar)
Load internal state from an archive.
FileMaster & fileMaster()
Get the associated FileMaster by reference.
#define UTIL_THROW(msg)
Macro for throwing an Exception, reporting function, file and line number.
Definition: global.h:51
virtual void writeParam(std::ostream &out)
Write all parameters to an output stream.
void computePotentialEnergies()
Calculate and store total potential energy on all processors.
bool isAtInterval(long counter) const
Return true iff counter is a multiple of the interval.
Utility classes for scientific computation.
Definition: accumulators.mod:1
const std::string & outputFileName() const
Return outputFileName string.
void output(std::ostream &out) const
Output final statistical properties to file.
Definition: Average.cpp:178
bool isMaster() const
Is this the master processor (gridRank == 0) ?
Definition: Domain.h:313
void setNSamplePerBlock(int nSamplePerBlock)
Set nSamplePerBlock.
Definition: Average.cpp:63
double energy() const
Return the total potential, from all processors.
Definition: Potential.cpp:39
virtual ~ExternalEnergyAverage()
Destructor.
Saving archive for binary istream.
void sample(double value)
Add a sampled value to the ensemble.
Definition: Average.cpp:94
int nSamplePerBlock() const
Get number of samples per block average.
Definition: Average.h:220
void setClassName(const char *className)
Set class name string.
void loadInterval(Serializable::IArchive &ar)
Load parameter interval from input archive.
ExternalEnergyAverage(Simulation &simulation)
Constructor.
void saveOutputFileName(Serializable::OArchive &ar)
Save output file name to an archive.
Domain & domain()
Get the Domain by reference.