OpenMD 3.1
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 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 "restraints/ObjectRestraint.hpp"
46
47namespace OpenMD {
48
49 void ObjectRestraint::calcForce(Vector3d struc) {
50 pot_ = 0.0;
51 force_ = V3Zero;
52
53 if (restType_ & rtDisplacement) {
54 Vector3d del = struc - refPos_;
55 RealType r = del.length();
56 Vector3d frc = -kDisp_ * del;
57 RealType p = 0.5 * kDisp_ * del.lengthSquare();
58
59 pot_ += p;
60 force_ += frc * scaleFactor_;
61 if (printRest_) restInfo_[rtDisplacement] = std::make_pair(r, p);
62 }
63
64 if (restType_ & rtAbsoluteZ) {
65 RealType r = struc(2) - posZ0_;
66 Vector3d frc = Vector3d(0.0, 0.0, -kAbs_ * r);
67 RealType p = 0.5 * kAbs_ * r * r;
68
69 pot_ += p;
70 force_ += frc * scaleFactor_;
71 if (printRest_) restInfo_[rtAbsoluteZ] = std::make_pair(r, p);
72 }
73 }
74
75 void ObjectRestraint::calcForce(Vector3d struc, RotMat3x3d A) {
76 calcForce(struc);
77
78 // rtDisplacement is 1, rtAbsolute is 2, so anything higher than 3
79 // that requires orientations:
80 if (restType_ > 3) {
81 Vector3d tBody(0.0);
82
83 RotMat3x3d temp = A * refA_.transpose();
84 Quat4d quat = temp.toQuaternion();
85
86 RealType twistAngle;
87 RealType swingX, swingY;
88
89 quat.toTwistSwing(twistAngle, swingX, swingY);
90
91 RealType p;
92 Vector3d tTwist, tSwing;
93
94 if (restType_ & rtTwist) {
95 RealType dTwist = twistAngle - twist0_;
96 /// RealType dVdtwist = kTwist_ * sin(dTwist);
97 /// p = kTwist_ * (1.0 - cos(dTwist) );
98 RealType dVdtwist = kTwist_ * dTwist;
99 p = 0.5 * kTwist_ * dTwist * dTwist;
100 pot_ += p;
101 tBody -= dVdtwist * V3Z;
102
103 if (printRest_) restInfo_[rtTwist] = std::make_pair(twistAngle, p);
104 }
105
106 if (restType_ & rtSwingX) {
107 RealType dSwingX = swingX - swingX0_;
108 /// RealType dVdswingX = kSwingX_ * 0.5 * sin(2.0 * dSwingX);
109 /// p = 0.25 * kSwingX_ * (1.0 - cos(2.0 * dSwingX));
110 RealType dVdswingX = kSwingX_ * dSwingX;
111 p = 0.5 * kSwingX_ * dSwingX * dSwingX;
112 pot_ += p;
113 tBody -= dVdswingX * V3X;
114 if (printRest_) restInfo_[rtSwingX] = std::make_pair(swingX, p);
115 }
116
117 if (restType_ & rtSwingY) {
118 RealType dSwingY = swingY - swingY0_;
119 /// RealType dVdswingY = kSwingY_ * 0.5 * sin(2.0 * dSwingY);
120 /// p = 0.25 * kSwingY_ * (1.0 - cos(2.0 * dSwingY));
121 RealType dVdswingY = kSwingY_ * dSwingY;
122 p = 0.5 * kSwingX_ * dSwingY * dSwingY;
123 pot_ += p;
124 tBody -= dVdswingY * V3Y;
125 if (printRest_) restInfo_[rtSwingY] = std::make_pair(swingY, p);
126 }
127
128 Vector3d tLab = A.transpose() * tBody;
129 torque_ = tLab * scaleFactor_;
130 }
131 }
132} // namespace OpenMD
Quaternion is a sort of a higher-level complex number.
Quaternion< Real > toQuaternion()
Returns the quaternion from this rotation matrix.
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.