OpenMD 3.0
Molecular Dynamics in the Open
Loading...
Searching...
No Matches
ChargeR.cpp
1/*
2 * Copyright (c) 2004-present, The University of Notre Dame. All rights
3 * reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 *
31 * SUPPORT OPEN SCIENCE! If you use OpenMD or its source code in your
32 * research, please cite the appropriate papers when you publish your
33 * work. Good starting points are:
34 *
35 * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).
36 * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).
37 * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008).
38 * [4] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
39 * [5] Kuang & Gezelter, Mol. Phys., 110, 691-701 (2012).
40 * [6] Lamichhane, Gezelter & Newman, J. Chem. Phys. 141, 134109 (2014).
41 * [7] Lamichhane, Newman & Gezelter, J. Chem. Phys. 141, 134110 (2014).
42 * [8] Bhattarai, Newman & Gezelter, Phys. Rev. B 99, 094106 (2019).
43 */
44
45#include "applications/staticProps/ChargeR.hpp"
46
47#include <algorithm>
48#include <fstream>
49
50#include "brains/Thermo.hpp"
51#include "io/DumpReader.hpp"
53#include "types/FixedChargeAdapter.hpp"
54#include "types/FluctuatingChargeAdapter.hpp"
55#include "utils/simError.h"
56
57namespace OpenMD {
58
59 ChargeR::ChargeR(SimInfo* info, const std::string& filename,
60 const std::string& sele, RealType len, int nrbins) :
61 StaticAnalyser(info, filename, nrbins),
62 selectionScript_(sele), evaluator_(info), seleMan_(info), thermo_(info),
63 len_(len) {
64 evaluator_.loadScriptString(sele);
65 if (!evaluator_.isDynamic()) {
66 seleMan_.setSelectionSet(evaluator_.evaluate());
67 }
68
69 deltaR_ = len_ / nBins_;
70
71 // fixed number of bins
72
73 sliceSDLists_.resize(nBins_);
74 sliceSDCount_.resize(nBins_);
75 std::fill(sliceSDCount_.begin(), sliceSDCount_.end(), 0);
76
77 chargeR_.resize(nBins_);
78 setOutputName(getPrefix(filename) + ".ChargeR");
79 std::stringstream params;
80 params << " len = " << len_ << ", nrbins = " << nBins_;
81 const std::string paramString = params.str();
82 setParameterString(paramString);
83 }
84
85 void ChargeR::process() {
86 StuntDouble* sd;
87 int ii;
88
89 DumpReader reader(info_, dumpFilename_);
90 int nFrames = reader.getNFrames();
91 nProcessed_ = nFrames / step_;
92
93 for (int istep = 0; istep < nFrames; istep += step_) {
94 reader.readFrame(istep);
95 currentSnapshot_ = info_->getSnapshotManager()->getCurrentSnapshot();
96
97 for (unsigned int i = 0; i < nBins_; i++) {
98 sliceSDLists_[i].clear();
99 }
100
101 if (evaluator_.isDynamic()) {
102 seleMan_.setSelectionSet(evaluator_.evaluate());
103 }
104
105 // determine which atom belongs to which slice
106 for (sd = seleMan_.beginSelected(ii); sd != NULL;
107 sd = seleMan_.nextSelected(ii)) {
108 Vector3d pos = sd->getPos();
109 RealType distance = pos.length();
110
111 if (distance < len_) {
112 int binNo = int(distance / deltaR_);
113 sliceSDLists_[binNo].push_back(sd);
114 sliceSDCount_[binNo]++;
115 }
116 }
117
118 // loop over the slices to calculate the charge
119 for (unsigned int i = 0; i < nBins_; i++) {
120 RealType binC = 0;
121 for (unsigned int k = 0; k < sliceSDLists_[i].size(); ++k) {
122 RealType q = 0.0;
123 Atom* atom = static_cast<Atom*>(sliceSDLists_[i][k]);
124
125 AtomType* atomType = atom->getAtomType();
126
127 if (sliceSDLists_[i][k]->isAtom()) {
129 if (fca.isFixedCharge()) { q += fca.getCharge(); }
130
132 if (fqa.isFluctuatingCharge()) { q += atom->getFlucQPos(); }
133 }
134
135 binC += q;
136 }
137 chargeR_[i] += binC;
138 // Units of (e / Ang^2 / fs)
139 }
140 }
141
142 writeChargeR();
143 }
144
145 void ChargeR::writeChargeR() {
146 std::ofstream rdfStream(outputFilename_.c_str());
147 if (rdfStream.is_open()) {
148 rdfStream << "#ChargeR "
149 << "\n";
150 rdfStream << "#selection: (" << selectionScript_ << ")\n";
151 rdfStream << "# r "
152 << "\tcharge\n";
153 RealType binCharge;
154 for (unsigned int i = 0; i < chargeR_.size(); ++i) {
155 RealType rLower = i * deltaR_;
156 RealType rUpper = rLower + deltaR_;
157 RealType volShell =
158 (4.0 * Constants::PI) * (pow(rUpper, 3) - pow(rLower, 3)) / 3.0;
159
160 RealType r = deltaR_ * (i + 0.5);
161
162 binCharge = chargeR_[i] / (volShell * nProcessed_);
163
164 rdfStream << r << "\t" << binCharge << "\n";
165 }
166
167 } else {
168 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
169 "ChargeR: unable to open %s\n", outputFilename_.c_str());
170 painCave.isFatal = 1;
171 simError();
172 }
173
174 rdfStream.close();
175 }
176} // namespace OpenMD
AtomType is what OpenMD looks to for unchanging data about an atom.
Definition AtomType.hpp:66
bool isDynamic()
Tests if the result from evaluation of script is dynamic.
StuntDouble * nextSelected(int &i)
Finds the next selected StuntDouble in the selection.
StuntDouble * beginSelected(int &i)
Finds the first selected StuntDouble in the selection.
One of the heavy-weight classes of OpenMD, SimInfo maintains objects and variables relating to the cu...
Definition SimInfo.hpp:93
SnapshotManager * getSnapshotManager()
Returns the snapshot manager.
Definition SimInfo.hpp:248
Snapshot * getCurrentSnapshot()
Returns the pointer of current snapshot.
"Don't move, or you're dead! Stand up! Captain, we've got them!"
Vector3d getPos()
Returns the current position of this stuntDouble.
Real length()
Returns the length of this vector.
Definition Vector.hpp:393
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.
std::string getPrefix(const std::string &str)
Real distance(const DynamicVector< Real > &v1, const DynamicVector< Real > &v2)
Returns the distance between two DynamicVectors.