Simpatico  v1.10
AverageAnalyzer.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 "AverageAnalyzer.h"
9 #include <ddMd/simulation/Simulation.h>
10 #include <util/accumulators/Average.h>
11 #include <util/format/Int.h>
12 #include <util/format/Dbl.h>
13 #include <util/mpi/MpiLoader.h>
14 #include <util/misc/ioUtil.h>
15 
16 #include <sstream>
17 
18 namespace DdMd
19 {
20 
21  using namespace Util;
22 
23  /*
24  * Constructor.
25  */
27  : Analyzer(simulation),
28  outputFile_(),
29  accumulatorPtr_(0),
30  nSamplePerBlock_(0),
31  isInitialized_(false)
32  { setClassName("AverageAnalyzer"); }
33 
34  /*
35  * Destructor.
36  */
38  {
39  if (accumulatorPtr_) {
40  delete accumulatorPtr_;
41  }
42  }
43 
44  /*
45  * Read interval and outputFileName.
46  */
47  void AverageAnalyzer::readParameters(std::istream& in)
48  {
49  readInterval(in);
51  nSamplePerBlock_ = 0;
52  readOptional<int>(in, "nSamplePerBlock", nSamplePerBlock_);
53 
54  if (simulation().domain().isMaster()) {
55  accumulatorPtr_ = new Average;
56  accumulatorPtr_->setNSamplePerBlock(nSamplePerBlock_);
57  }
58 
59  isInitialized_ = true;
60  }
61 
62  /*
63  * Load internal state from an archive.
64  */
66  {
67  loadInterval(ar);
69  nSamplePerBlock_ = 0;
70  bool isRequired = false;
71  loadParameter<int>(ar, "nSamplePerBlock", nSamplePerBlock_,
72  isRequired);
73 
74  if (simulation().domain().isMaster()) {
75  accumulatorPtr_ = new Average;
76  ar >> *accumulatorPtr_;
77  if (nSamplePerBlock_ != accumulatorPtr_->nSamplePerBlock()) {
78  UTIL_THROW("Inconsistent values of nSamplePerBlock");
79  }
80  } else {
81  accumulatorPtr_ = 0;
82  }
83  isInitialized_ = true;
84  }
85 
86  /*
87  * Save internal state to an archive.
88  */
90  {
91  assert(simulation().domain().isMaster());
92  assert(accumulatorPtr_);
93 
94  saveInterval(ar);
96  bool isActive = (bool)nSamplePerBlock_;
97  Parameter::saveOptional<int>(ar, nSamplePerBlock_, isActive);
98  ar << *accumulatorPtr_;
99  }
100 
101  /*
102  * Clear accumulator (do nothing on slave processors).
103  */
105  {
106  if (simulation().domain().isMaster()){
107  accumulatorPtr_->clear();
108  }
109  }
110 
111  /*
112  * Open outputfile
113  */
115  {
116  if (simulation().domain().isMaster()) {
117  if (nSamplePerBlock_) {
118  std::string filename = outputFileName(".dat");
119  simulation().fileMaster().openOutputFile(filename, outputFile_);
120  }
121  }
122  }
123 
124  /*
125  * Compute value.
126  */
127  void AverageAnalyzer::sample(long iStep)
128  {
129  if (!isAtInterval(iStep)) {
130  UTIL_THROW("Time step index is not a multiple of interval");
131  }
132  compute();
133  if (simulation().domain().isMaster()) {
134  double data = value();
135  accumulatorPtr_->sample(data);
136  if (nSamplePerBlock_ > 0 && accumulatorPtr_->isBlockComplete()) {
137  double block = accumulatorPtr_->blockAverage();
138  int beginStep = iStep - (nSamplePerBlock_ - 1)*interval();
139  outputFile_ << Int(beginStep) << Dbl(block) << "\n";
140  }
141  }
142  }
143 
144  /*
145  * Output results to file after simulation is completed.
146  */
148  {
149  if (simulation().domain().isMaster()) {
150  // Close data (*.dat) file, if any
151  if (outputFile_.is_open()) {
152  outputFile_.close();
153  }
154  // Write parameter (*.prm) file
155  simulation().fileMaster().openOutputFile(outputFileName(".prm"), outputFile_);
156  ParamComposite::writeParam(outputFile_);
157  outputFile_.close();
158  // Write average (*.ave) file
159  simulation().fileMaster().openOutputFile(outputFileName(".ave"), outputFile_);
160  double ave = accumulatorPtr_->average();
161  double err = accumulatorPtr_->blockingError();
162  outputFile_ << "Average " << Dbl(ave) << " +- " << Dbl(err, 9, 2) << "\n";
163  outputFile_.close();
164  // Write error analysis (*.aer) file
165  simulation().fileMaster().openOutputFile(outputFileName(".aer"), outputFile_);
166  accumulatorPtr_->output(outputFile_);
167  outputFile_.close();
168  }
169  }
170 
171 }
Abstract base for periodic output and/or analysis actions.
void clear()
Clear all accumulators, set to empty initial state.
Definition: Average.cpp:42
virtual void clear()
Clear accumulator on master, do nothing on other processors.
Simulation & simulation()
Get the parent Simulation by reference.
bool isBlockComplete() const
Is the current block average complete?
Definition: Average.h:232
void readOutputFileName(std::istream &in)
Read outputFileName from file.
bool isRequired() const
Is this ParamComposite required in the input 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
double average() const
Return the average of all sampled values.
virtual void readParameters(std::istream &in)
Read interval, outputFileName and (optionally) nSamplePerBlock.
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 output()
Write final results to file after a simulation.
virtual void loadParameters(Serializable::IArchive &ar)
Load internal state from an input archive.
void readInterval(std::istream &in)
Read parameter interval from file.
Wrapper for a double precision number, for formatted ostream output.
Definition: Dbl.h:39
double blockingError() const
Return estimated error on average from blocking analysis.
Definition: Average.cpp:133
Parallel domain decomposition (DD) MD simulation.
Main object for a domain-decomposition MD simulation.
bool isActive() const
Is this parameter active?
Saving / output archive for binary ostream.
void loadOutputFileName(Serializable::IArchive &ar)
Load output file name to 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.
virtual ~AverageAnalyzer()
Destructor.
bool isAtInterval(long counter) const
Return true iff counter is a multiple of the interval.
Utility classes for scientific computation.
Definition: accumulators.mod:1
AverageAnalyzer(Simulation &simulation)
Constructor.
Wrapper for an int, for formatted ostream output.
Definition: Int.h:36
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
virtual void compute()=0
Compute value of sampled quantity.
Saving archive for binary istream.
virtual double value()=0
Get current value, set by compute function.
void sample(double value)
Add a sampled value to the ensemble.
Definition: Average.cpp:94
virtual void save(Serializable::OArchive &ar)
Save internal state to an output archive.
virtual void sample(long iStep)
Compute a sampled value and update the accumulator.
void setClassName(const char *className)
Set class name string.
void loadInterval(Serializable::IArchive &ar)
Load parameter interval from input archive.
virtual void setup()
Setup before loop.
int interval() const
Get interval value.
void saveOutputFileName(Serializable::OArchive &ar)
Save output file name to an archive.
Domain & domain()
Get the Domain by reference.