OpenMD 3.2
Molecular Dynamics in the Open
Loading...
Searching...
No Matches
ObjectRestraint.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 following paper when you publish your work:
33 *
34 * [1] Drisko et al., J. Open Source Softw. 9, 7004 (2024).
35 *
36 * Good starting points for code and simulation methodology are:
37 *
38 * [2] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).
39 * [3] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).
40 * [4] Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008).
41 * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
42 * [6] Kuang & Gezelter, Mol. Phys., 110, 691-701 (2012).
43 * [7] Lamichhane, Gezelter & Newman, J. Chem. Phys. 141, 134109 (2014).
44 * [8] Bhattarai, Newman & Gezelter, Phys. Rev. B 99, 094106 (2019).
45 * [9] Drisko & Gezelter, J. Chem. Theory Comput. 20, 4986-4997 (2024).
46 */
47
48#include "restraints/ObjectRestraint.hpp"
49
50namespace OpenMD {
51
52 void ObjectRestraint::calcForce(Vector3d struc) {
53 pot_ = 0.0;
54 force_ = V3Zero;
55
56 if (restType_ & rtDisplacement) {
57 Vector3d del = struc - refPos_;
58 RealType r = del.length();
59 Vector3d frc = -kDisp_ * del;
60 RealType p = 0.5 * kDisp_ * del.lengthSquare();
61
62 pot_ += p;
63 force_ += frc * scaleFactor_;
64 if (printRest_) restInfo_[rtDisplacement] = std::make_pair(r, p);
65 }
66
67 if (restType_ & rtDisplacementX) {
68 Vector3d del = struc - refPos_;
69 RealType r = del.x();
70 Vector3d frc = -kDispX_ * r * V3X;
71 RealType p = 0.5 * kDisp_ * r * r;
72
73 pot_ += p;
74 force_ += frc * scaleFactor_;
75 if (printRest_) restInfo_[rtDisplacementX] = std::make_pair(r, p);
76 }
77
78 if (restType_ & rtDisplacementY) {
79 Vector3d del = struc - refPos_;
80 RealType r = del.y();
81 Vector3d frc = -kDispY_ * r * V3Y;
82 RealType p = 0.5 * kDisp_ * r * r;
83
84 pot_ += p;
85 force_ += frc * scaleFactor_;
86 if (printRest_) restInfo_[rtDisplacementY] = std::make_pair(r, p);
87 }
88
89 if (restType_ & rtDisplacementZ) {
90 Vector3d del = struc - refPos_;
91 RealType r = del.z();
92 Vector3d frc = -kDispZ_ * r * V3Z;
93 RealType p = 0.5 * kDisp_ * r * r;
94
95 pot_ += p;
96 force_ += frc * scaleFactor_;
97 if (printRest_) restInfo_[rtDisplacementZ] = std::make_pair(r, p);
98 }
99
100 if (restType_ & rtAbsoluteZ) {
101 RealType r = struc(2) - posZ0_;
102 Vector3d frc = Vector3d(0.0, 0.0, -kAbs_ * r);
103 RealType p = 0.5 * kAbs_ * r * r;
104
105 pot_ += p;
106 force_ += frc * scaleFactor_;
107 if (printRest_) restInfo_[rtAbsoluteZ] = std::make_pair(r, p);
108 }
109 }
110
111 void ObjectRestraint::calcForce(Vector3d struc, RotMat3x3d A) {
112 calcForce(struc);
113
114 // Anything higher than 32 requires orientations:
115
116 if (restType_ >= 32) {
117 Vector3d tBody(0.0);
118
119 RotMat3x3d temp = A * refA_.transpose();
120 Quat4d quat = temp.toQuaternion();
121
122 RealType twistAngle;
123 RealType swingX, swingY;
124
125 quat.toTwistSwing(twistAngle, swingX, swingY);
126
127 RealType p;
128 Vector3d tTwist, tSwing;
129
130 if (restType_ & rtTwist) {
131 RealType dTwist = twistAngle - twist0_;
132 /// RealType dVdtwist = kTwist_ * sin(dTwist);
133 /// p = kTwist_ * (1.0 - cos(dTwist) );
134 RealType dVdtwist = kTwist_ * dTwist;
135 p = 0.5 * kTwist_ * dTwist * dTwist;
136 pot_ += p;
137 tBody -= dVdtwist * V3Z;
138
139 if (printRest_) restInfo_[rtTwist] = std::make_pair(twistAngle, p);
140 }
141
142 if (restType_ & rtSwingX) {
143 RealType dSwingX = swingX - swingX0_;
144 /// RealType dVdswingX = kSwingX_ * 0.5 * sin(2.0 * dSwingX);
145 /// p = 0.25 * kSwingX_ * (1.0 - cos(2.0 * dSwingX));
146 RealType dVdswingX = kSwingX_ * dSwingX;
147 p = 0.5 * kSwingX_ * dSwingX * dSwingX;
148 pot_ += p;
149 tBody -= dVdswingX * V3X;
150 if (printRest_) restInfo_[rtSwingX] = std::make_pair(swingX, p);
151 }
152
153 if (restType_ & rtSwingY) {
154 RealType dSwingY = swingY - swingY0_;
155 /// RealType dVdswingY = kSwingY_ * 0.5 * sin(2.0 * dSwingY);
156 /// p = 0.25 * kSwingY_ * (1.0 - cos(2.0 * dSwingY));
157 RealType dVdswingY = kSwingY_ * dSwingY;
158 p = 0.5 * kSwingX_ * dSwingY * dSwingY;
159 pot_ += p;
160 tBody -= dVdswingY * V3Y;
161 if (printRest_) restInfo_[rtSwingY] = std::make_pair(swingY, p);
162 }
163
164 Vector3d tLab = A.transpose() * tBody;
165 torque_ = tLab * scaleFactor_;
166 }
167 }
168} // namespace OpenMD
Quaternion< Real > toQuaternion()
Returns the quaternion from this rotation matrix.
Real & z()
Returns reference of the third element of Vector3.
Definition Vector3.hpp:123
Real & x()
Returns reference of the first element of Vector3.
Definition Vector3.hpp:99
Real & y()
Returns reference of the second element of Vector3.
Definition Vector3.hpp:111
Real length() const
Returns the length of this vector.
Definition Vector.hpp:397
Real lengthSquare() const
Returns the squared length of this vector.
Definition Vector.hpp:403
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.