OpenMD 3.0
Molecular Dynamics in the Open
Loading...
Searching...
No Matches
CollectiveDipoleDisplacement.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/dynamicProps/CollectiveDipoleDisplacement.hpp"
46
47#include "types/FixedChargeAdapter.hpp"
48#include "types/FluctuatingChargeAdapter.hpp"
49#include "utils/Revision.hpp"
50
51using namespace std;
52namespace OpenMD {
53 CollectiveDipoleDisplacement::CollectiveDipoleDisplacement(
54 SimInfo* info, const string& filename, const string& sele1,
55 const std::string& sele2) :
56 SystemACF<Vector3d>(info, filename, sele1, sele2) {
57 setCorrFuncType("Collective Dipole Displacement Function");
58 setOutputName(getPrefix(dumpFilename_) + ".ddisp");
59
60 std::stringstream label;
61 label << "<|Mtrans(t)-Mtrans(0)|^2>\t"
62 << "<|Mtot(t)-Mtot(0)|^2>\t"
63 << "<|Mrot(t)-Mrot(0)|^2>";
64 const std::string labelString = label.str();
65 setLabelString(labelString);
66
67 CRcm_.resize(nFrames_, V3Zero);
68 CRtot_.resize(nFrames_, V3Zero);
69 CRrot_.resize(nFrames_, V3Zero);
70
71 // We'll need thermo to compute the volume:
72 thermo_ = new Thermo(info_);
73 }
74
75 void CollectiveDipoleDisplacement::computeProperty1(int frame) {
76 SimInfo::MoleculeIterator mi;
77 Molecule* mol;
78 Molecule::AtomIterator ai;
79 Atom* atom;
80 AtomType* atype;
81
82 RealType q, qtot;
83 RealType m, mtot;
84 Vector3d r(0.0), rcm(0.0), rcq(0.0);
85
86 for (mol = info_->beginMolecule(mi); mol != NULL;
87 mol = info_->nextMolecule(mi)) {
88 qtot = 0.0;
89 mtot = 0.0;
90 rcm *= 0.0;
91 rcq *= 0.0;
92
93 for (atom = mol->beginAtom(ai); atom != NULL; atom = mol->nextAtom(ai)) {
94 q = 0.0;
95 atype = atom->getAtomType();
97 if (fca.isFixedCharge()) q = fca.getCharge();
99 if (fqa.isFluctuatingCharge()) q += atom->getFlucQPos();
100
101 r = atom->getPos();
102 m = atom->getMass();
103
104 qtot += q;
105 mtot += m;
106
107 rcm += r * m;
108 rcq += r * q;
109 }
110
111 rcm /= mtot;
112
113 if (qtot <= std::numeric_limits<RealType>::min()) {
114 rcq = rcm;
115 } else {
116 rcq /= qtot;
117 }
118
119 CRcm_[frame] += qtot * rcm;
120 CRtot_[frame] += qtot * rcq;
121 CRrot_[frame] += qtot * (rcq - rcm);
122 count_[frame]++;
123 }
124
125 RealType vol = thermo_->getVolume();
126
127 CRcm_[frame] /= (vol * Constants::chargeDensityConvert);
128 CRtot_[frame] /= (vol * Constants::chargeDensityConvert);
129 CRrot_[frame] /= (vol * Constants::chargeDensityConvert);
130 }
131
132 Vector3d CollectiveDipoleDisplacement::calcCorrVal(int frame1, int frame2) {
133 Vector3d diff;
134 RealType dcm, dtot, drot;
135 diff = CRcm_[frame2] - CRcm_[frame1];
136 dcm = diff.lengthSquare();
137 diff = CRtot_[frame2] - CRtot_[frame1];
138 dtot = diff.lengthSquare();
139 diff = CRrot_[frame2] - CRrot_[frame1];
140 drot = diff.lengthSquare();
141
142 return Vector3d(dcm, dtot, drot);
143 }
144} // namespace OpenMD
AtomType is what OpenMD looks to for unchanging data about an atom.
Definition AtomType.hpp:66
One of the heavy-weight classes of OpenMD, SimInfo maintains objects and variables relating to the cu...
Definition SimInfo.hpp:93
Molecule * beginMolecule(MoleculeIterator &i)
Returns the first molecule in this SimInfo and intialize the iterator.
Definition SimInfo.cpp:240
Molecule * nextMolecule(MoleculeIterator &i)
Returns the next avaliable Molecule based on the iterator.
Definition SimInfo.cpp:245
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.
std::string getPrefix(const std::string &str)