# | Line 42 | Line 42 | namespace oopse { | |
---|---|---|
42 | #include "primitives/Bend.hpp" | |
43 | ||
44 | namespace oopse { | |
45 | < | |
45 | > | |
46 | /**@todo still a lot left to improve*/ | |
47 | void Bend::calcForce(RealType& angle) { | |
48 | Vector3d pos1 = atom1_->getPos(); | |
49 | Vector3d pos2 = atom2_->getPos(); | |
50 | Vector3d pos3 = atom3_->getPos(); | |
51 | < | |
51 | > | |
52 | Vector3d r21 = pos1 - pos2; | |
53 | RealType d21 = r21.length(); | |
54 | < | |
54 | > | |
55 | RealType d21inv = 1.0 / d21; | |
56 | < | |
56 | > | |
57 | Vector3d r23 = pos3 - pos2; | |
58 | RealType d23 = r23.length(); | |
59 | < | |
59 | > | |
60 | RealType d23inv = 1.0 / d23; | |
61 | < | |
61 | > | |
62 | RealType cosTheta = dot(r21, r23) / (d21 * d23); | |
63 | < | |
63 | > | |
64 | //check roundoff | |
65 | if (cosTheta > 1.0) { | |
66 | cosTheta = 1.0; | |
67 | } else if (cosTheta < -1.0) { | |
68 | cosTheta = -1.0; | |
69 | } | |
70 | < | |
70 | > | |
71 | RealType theta = acos(cosTheta); | |
72 | < | |
72 | > | |
73 | RealType dVdTheta; | |
74 | ||
75 | bendType_->calcForce(theta, potential_, dVdTheta); | |
76 | < | //std::cout << atom1_->getType() << "\t" << atom2_->getType() << "\t" << atom3_->getType() << "\t"; |
77 | < | //std::cout << "theta = " << theta/M_PI * 180.0 <<", potential = " << potential_ << std::endl; |
78 | < | |
76 | > | |
77 | RealType sinTheta = sqrt(1.0 - cosTheta * cosTheta); | |
78 | < | |
78 | > | |
79 | if (fabs(sinTheta) < 1.0E-6) { | |
80 | sinTheta = 1.0E-6; | |
81 | } | |
82 | < | |
82 | > | |
83 | RealType commonFactor1 = dVdTheta / sinTheta * d21inv; | |
84 | RealType commonFactor2 = dVdTheta / sinTheta * d23inv; | |
85 | < | |
85 | > | |
86 | Vector3d force1 = commonFactor1 * (r23 * d23inv - r21*d21inv*cosTheta); | |
87 | Vector3d force3 = commonFactor2 * (r21 * d21inv - r23*d23inv*cosTheta); | |
88 | ||
89 | < | //total force in current bend is zero |
89 | > | // Total force in current bend is zero |
90 | Vector3d force2 = force1 + force3; | |
91 | force2 *= -1.0; | |
92 | < | |
92 | > | |
93 | atom1_->addFrc(force1); | |
94 | atom2_->addFrc(force2); | |
95 | atom3_->addFrc(force3); | |
96 | < | |
96 | > | |
97 | angle = theta /M_PI * 180.0; | |
98 | } | |
99 |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |