Simpatico  v1.10
EndtoEndXYZ.cpp
1 #ifndef END_TO_END_XYZ_CPP
2 #define END_TO_END_XYZ_CPP
3 
4 /*
5 * Simpatico - Simulation Package for Polymeric and Molecular Liquids
6 *
7 * Copyright 2010 - 2014, The Regents of the University of Minnesota
8 * Distributed under the terms of the GNU General Public License.
9 */
10 
11 #include "EndtoEndXYZ.h"
12 #include <mcMd/simulation/Simulation.h>
13 #include <mcMd/chemistry/Molecule.h>
14 #include <mcMd/chemistry/Atom.h>
15 #include <simp/species/Species.h>
16 #include <simp/boundary/Boundary.h>
17 #include <util/misc/FileMaster.h>
18 
19 
20 namespace McMd
21 {
22 
23  using namespace Util;
24  using namespace Simp;
25 
28  : SystemAnalyzer<System>(system)
29  { setClassName("EndtoEndXYZ"); }
30 
32  void EndtoEndXYZ::readParameters(std::istream& in)
33  {
34 
35  readInterval(in);
37  read<int>(in,"nSamplePerBlock", nSamplePerBlock_);
38 
39  accumulatorX_.setNSamplePerBlock(nSamplePerBlock_);
40  accumulatorY_.setNSamplePerBlock(nSamplePerBlock_);
41  accumulatorZ_.setNSamplePerBlock(nSamplePerBlock_);
42 
43  // If nSamplePerBlock != 0, open an output file for block averages.
44  if (nSamplePerBlock_ != 0) {
45  fileMaster().openOutputFile(outputFileName("X.dat"), outputFileX_);
46  fileMaster().openOutputFile(outputFileName("Y.dat"), outputFileY_);
47  fileMaster().openOutputFile(outputFileName("Z.dat"), outputFileZ_);
48  }
49 
50  read<int>(in, "speciesId", speciesId_);
51  if (speciesId_ < 0) {
52  UTIL_THROW("Negative speciesId");
53  }
54 
55  if (speciesId_ >= system().simulation().nSpecies()) {
56  UTIL_THROW("speciesId > nSpecies");
57  }
58 
59  speciesPtr_ = &system().simulation().species(speciesId_);
60  nAtom_ = speciesPtr_->nAtom();
61 
62  // Allocate an array of separation Vectors
63  positions_.allocate(nAtom_);
64  }
65 
66  /*
67  * Clear accumulator.
68  */
70  { accumulatorX_.clear();
71  accumulatorY_.clear();
72  accumulatorZ_.clear();
73  }
74 
76  void EndtoEndXYZ::sample(long iStep)
77  {
78  if (isAtInterval(iStep)) {
79 
80  Molecule* moleculePtr;
81  Vector r1, r2, dR;
82  double dxSq, dySq, dzSq;
83  int i, j, nMolecule;
84 
85  dxSq = 0.0;
86  dySq = 0.0;
87  dzSq = 0.0;
88  nMolecule = system().nMolecule(speciesId_);
89  for (i = 0; i < system().nMolecule(speciesId_); i++) {
90  moleculePtr = &system().molecule(speciesId_, i);
91 
92  // Construct map of molecule with no periodic boundary conditions
93  positions_[0] = moleculePtr->atom(0).position();
94  for (j = 1 ; j < nAtom_; j++) {
95  r1 = moleculePtr->atom(j-1).position();
96  r2 = moleculePtr->atom(j).position();
97  system().boundary().distanceSq(r1, r2, dR);
98  positions_[j] = positions_[j-1];
99  positions_[j] += dR;
100  }
101 
102  dR.subtract(positions_[0], positions_[nAtom_-1]);
103  dxSq += dR[0]*dR[0];
104  dySq += dR[1]*dR[1];
105  dzSq += dR[2]*dR[2];
106 
107 
108  }
109  dxSq /= double(nMolecule);
110  dySq /= double(nMolecule);
111  dzSq /= double(nMolecule);
112 
113  accumulatorX_.sample(dxSq, outputFileX_);
114  accumulatorY_.sample(dySq, outputFileY_);
115  accumulatorZ_.sample(dzSq, outputFileZ_);
116 
117  } // if isAtInterval
118 
119  }
120 
121  /*
122  * Output results to file after simulation is completed.
123  */
125  {
126  // If outputFile_ was used to write block averages, close it.
127  if (nSamplePerBlock_ != 0) {
128  outputFileX_.close();
129  outputFileY_.close();
130  outputFileZ_.close();
131  }
132 
133  // Write parameters to file
134  fileMaster().openOutputFile(outputFileName("X.prm"), outputFileX_);
135  ParamComposite::writeParam(outputFileX_);
136  outputFileX_.close();
137  fileMaster().openOutputFile(outputFileName("Y.prm"), outputFileY_);
138  ParamComposite::writeParam(outputFileY_);
139  outputFileY_.close();
140  fileMaster().openOutputFile(outputFileName("Z.prm"), outputFileZ_);
141  ParamComposite::writeParam(outputFileZ_);
142  outputFileZ_.close();
143 
144  // Write average to file
145  fileMaster().openOutputFile(outputFileName("X.ave"), outputFileX_);
146  accumulatorX_.output(outputFileX_);
147  outputFileX_.close();
148  fileMaster().openOutputFile(outputFileName("Y.ave"), outputFileY_);
149  accumulatorY_.output(outputFileY_);
150  outputFileY_.close();
151  fileMaster().openOutputFile(outputFileName("Z.ave"), outputFileZ_);
152  accumulatorZ_.output(outputFileZ_);
153  outputFileZ_.close();
154  }
155 
156 }
157 #endif
void clear()
Clear all accumulators, set to empty initial state.
Definition: Average.cpp:42
A Vector is a Cartesian vector.
Definition: Vector.h:75
int nAtom() const
Get number of atoms per molecule for this Species.
double distanceSq(const Vector &r1, const Vector &r2) const
Return square distance between positions r1 and r2.
virtual void output()
Output results at end of simulation.
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 setup()
Clear accumulator.
Definition: EndtoEndXYZ.cpp:69
A set of interacting Molecules enclosed by a Boundary.
Definition: System.h:115
System & system()
Return reference to parent system.
Classes used by all simpatico molecular simulations.
void readOutputFileName(std::istream &in)
Read outputFileName from file.
Molecule & molecule(int speciesId, int moleculeId)
Get a specific Molecule in this System, by integer index.
Definition: System.h:1137
int nMolecule(int speciesId) const
Get the number of molecules of one Species in this System.
Definition: System.h:1128
#define UTIL_THROW(msg)
Macro for throwing an Exception, reporting function, file and line number.
Definition: global.h:51
Simulation & simulation() const
Get the parent Simulation by reference.
Definition: System.h:1055
virtual void writeParam(std::ostream &out)
Write all parameters to an output stream.
virtual void sample(long iStep)
Evaluate squared radii of gyration for all molecules, add to ensemble.
Definition: EndtoEndXYZ.cpp:76
void readInterval(std::istream &in)
Read interval from file, with error checking.
Utility classes for scientific computation.
Definition: accumulators.mod:1
EndtoEndXYZ(System &system)
Constructor.
Definition: EndtoEndXYZ.cpp:27
Template for Analyzer associated with one System.
void output(std::ostream &out) const
Output final statistical properties to file.
Definition: Average.cpp:178
void setNSamplePerBlock(int nSamplePerBlock)
Set nSamplePerBlock.
Definition: Average.cpp:63
virtual void readParameters(std::istream &in)
Read parameters from file, and allocate data array.
Definition: EndtoEndXYZ.cpp:32
Boundary & boundary() const
Get the Boundary by reference.
Definition: System.h:1064
void sample(double value)
Add a sampled value to the ensemble.
Definition: Average.cpp:94
Single-processor Monte Carlo (MC) and molecular dynamics (MD).
Vector & subtract(const Vector &v1, const Vector &v2)
Subtract vector v2 from v1.
Definition: Vector.h:672
void setClassName(const char *className)
Set class name string.
const Atom & atom(int localId) const
Get a specific Atom in this Molecule.
FileMaster & fileMaster()
Get the FileMaster by reference.
bool isAtInterval(long counter) const
Return true iff counter is a multiple of the interval.
const std::string & outputFileName() const
Return outputFileName string.
A physical molecule (a set of covalently bonded Atoms).
const Vector & position() const
Get the position Vector by const reference.
Species & species(int i)
Get a specific Species by reference.