ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/primitives/Bend.cpp
(Generate patch)

Comparing trunk/src/primitives/Bend.cpp (file contents):
Revision 963 by tim, Wed May 17 21:51:42 2006 UTC vs.
Revision 1211 by gezelter, Wed Jan 23 16:38:22 2008 UTC

# 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  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines