Simpatico  v1.10
PairEnergyAverage.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 "PairEnergyAverage.h"
9 #include <ddMd/potentials/pair/PairPotential.h>
10 #include <util/format/Int.h>
11 #include <util/format/Dbl.h>
12 #include <util/accumulators/Average.h> // member template
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  pairs_(),
30  accumulator_(NULL),
31  nSamplePerBlock_(1),
32  isInitialized_(false)
33  { setClassName("PairEnergyAverage"); }
34 
35  /*
36  * Destructor.
37  */
39  {
40  if(simulation().domain().isMaster()) {
41  delete accumulator_;
42  }
43  }
44 
45  /*
46  * Read interval and outputFileName.
47  */
48  void PairEnergyAverage::readParameters(std::istream& in)
49  {
50  readInterval(in);
52  pairs_.allocate(2);
53  readDArray<int>(in, "pairs", pairs_, 2);
54  read<int>(in,"nSamplePerBlock", nSamplePerBlock_);
55  if(simulation().domain().isMaster()) {
56  accumulator_ = new Average;
57  accumulator_->setNSamplePerBlock(nSamplePerBlock_);
58  }
59 
60  isInitialized_ = true;
61  }
62 
63  /*
64  * Load internal state from an archive.
65  */
67  {
68  loadInterval(ar);
70  pairs_.allocate(2);
71  loadDArray<int>(ar, "pairs", pairs_, 2);
72  loadParameter<int>(ar,"nSamplePerBlock", nSamplePerBlock_);
73  if (simulation().domain().isMaster()) {
74  accumulator_ = new Average;
75  ar >> *accumulator_;
76  if (nSamplePerBlock_ != accumulator_->nSamplePerBlock()) {
77  UTIL_THROW("Inconsistent values of nSamplePerBlock");
78  }
79  }
80  isInitialized_ = true;
81  }
82 
83  /*
84  * Save internal state to an archive.
85  */
87  {
88  saveInterval(ar);
90  ar << pairs_;
91  ar << nSamplePerBlock_;
92  ar << *accumulator_;
93  }
94 
95  /*
96  * Reset nSample.
97  */
99  {
100  if (simulation().domain().isMaster()){
101  accumulator_->clear();
102  }
103  }
104 
105  /*
106  * Dump configuration to file
107  */
108  void PairEnergyAverage::sample(long iStep)
109  {
110  if (isAtInterval(iStep)) {
112  if (simulation().domain().isMaster()) {
114  for (int i = 0; i < simulation().nAtomType(); ++i){
115  for (int j = 0; j < simulation().nAtomType(); ++j){
116  pair(i,j) = 0.5*( pair(i,j)+pair(j,i) );
117  pair(j,i) = pair(i,j);
118  }
119  }
120  accumulator_->sample(pair(pairs_[0],pairs_[1]));
121  }
122  }
123  }
124 
125  /*
126  * Output results to file after simulation is completed.
127  */
129  {
130  if (simulation().domain().isMaster()) {
131  simulation().fileMaster().openOutputFile(outputFileName(".prm"), outputFile_);
132  ParamComposite::writeParam(outputFile_);
133  outputFile_.close();
134  simulation().fileMaster().openOutputFile(outputFileName(".ave"), outputFile_);
135  accumulator_->output(outputFile_);
136  outputFile_.close();
137  }
138  }
139 }
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.
PairEnergyAverage(Simulation &simulation)
Constructor.
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
DMatrix< double > pairEnergies() const
Return precomputed pair energies.
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
void readInterval(std::istream &in)
Read parameter interval from file.
virtual void save(Serializable::OArchive &ar)
Save internal state to an archive.
Parallel domain decomposition (DD) MD simulation.
Main object for a domain-decomposition MD simulation.
virtual void loadParameters(Serializable::IArchive &ar)
Load internal state from an archive.
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 output()
Dump configuration to file.
virtual void writeParam(std::ostream &out)
Write all parameters to an output stream.
bool isAtInterval(long counter) const
Return true iff counter is a multiple of the interval.
Utility classes for scientific computation.
Definition: accumulators.mod:1
void computePairEnergies()
Compute pair energies for each pair of atom types.
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
Saving archive for binary istream.
void sample(double value)
Add a sampled value to the ensemble.
Definition: Average.cpp:94
virtual ~PairEnergyAverage()
Destructor.
virtual void sample(long iStep)
Dump configuration to file.
void setClassName(const char *className)
Set class name string.
void loadInterval(Serializable::IArchive &ar)
Load parameter interval from input archive.
int nAtomType()
Get maximum number of atom types.
void allocate(int capacity)
Allocate the underlying C array.
Definition: DArray.h:191
virtual void clear()
Clear nSample counter.
void saveOutputFileName(Serializable::OArchive &ar)
Save output file name to an archive.
Domain & domain()
Get the Domain by reference.
virtual void readParameters(std::istream &in)
Read dumpPrefix and interval.