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

Comparing trunk/src/primitives/Inversion.cpp (file contents):
Revision 1275 by cli2, Fri Jul 4 20:54:29 2008 UTC vs.
Revision 1290 by cli2, Wed Sep 10 19:51:45 2008 UTC

# Line 40 | Line 40
40   */
41  
42   #include "primitives/Inversion.hpp"
43 + #include "fstream"
44  
45   namespace oopse {
46  
# Line 56 | Line 57 | namespace oopse {
57      // is treated as atom *3* in a standard torsion form:
58  
59      Vector3d pos1 = atom2_->getPos();
60 <    Vector3d pos2 = atom3_->getPos();
61 <    Vector3d pos3 = atom1_->getPos();
62 <    Vector3d pos4 = atom4_->getPos();
60 >    Vector3d pos2 = atom1_->getPos();
61 >    Vector3d pos3 = atom4_->getPos();
62 >    Vector3d pos4 = atom3_->getPos();
63  
64 +   /*std::ofstream myfile;
65 +   myfile.open("Inversion", std::ios::app);      
66 +   myfile << atom1_->getType() << " - atom1; "
67 +              << atom2_->getType() << " - atom2; "
68 +              << atom3_->getType() << " - atom3; "
69 +              << atom4_->getType() << " - atom4; "
70 +              << std::endl;
71 + */
72      Vector3d r21 = pos1 - pos2;
73      Vector3d r32 = pos2 - pos3;
74 <    Vector3d r43 = pos3 - pos4;
74 >    Vector3d r42 = pos2 - pos4;
75  
76      //  Calculate the cross products and distances
77      Vector3d A = cross(r21, r32);
78      RealType rA = A.length();
79 <    Vector3d B = cross(r32, r43);
79 >    Vector3d B = cross(r32, r42);
80      RealType rB = B.length();
81 <    Vector3d C = cross(r32, A);
82 <    RealType rC = C.length();
81 >    //Vector3d C = cross(r23, A);
82 >    //RealType rC = C.length();
83  
84      A.normalize();
85      B.normalize();
86 <    C.normalize();
86 >    //C.normalize();
87      
88      //  Calculate the sin and cos
89      RealType cos_phi = dot(A, B) ;
90 <    if (cos_phi > 1.0) cos_phi = 1.0;
91 <    if (cos_phi < -1.0) cos_phi = -1.0;
90 >    if (cos_phi > 1.0) {cos_phi = 1.0; std::cout << "!!!! cos_phi is bigger than 1.0"
91 >                                                 << std::endl;}
92 >    if (cos_phi < -1.0) {cos_phi = -1.0; std::cout << "!!!! cos_phi is less than -1.0"
93 >                                                   << std::endl;}
94 >    //std::cout << "We actually use this inversion!!!!" << std::endl;
95  
96      RealType dVdcosPhi;
97 +    //cos_phi = 2.0*cos_phi*cos_phi - 1.0;
98      inversionType_->calcForce(cos_phi, potential_, dVdcosPhi);
99 <    Vector3d f1;
100 <    Vector3d f2;
101 <    Vector3d f3;
99 >    Vector3d f1 ;
100 >    Vector3d f2 ;
101 >    Vector3d f3 ;
102  
103      Vector3d dcosdA = (cos_phi * A - B) /rA;
104      Vector3d dcosdB = (cos_phi * B - A) /rB;
105  
106      f1 = dVdcosPhi * cross(r32, dcosdA);
107 <    f2 = dVdcosPhi * ( cross(r43, dcosdB) - cross(r21, dcosdA));
107 >    f2 = dVdcosPhi * ( cross(r42, dcosdB) - cross(r21, dcosdA));
108      f3 = dVdcosPhi * cross(dcosdB, r32);
109  
110      // In OOPSE's version of an improper torsion, the central atom
# Line 104 | Line 117 | namespace oopse {
117  
118      // Confusing enough?  Good.
119  
120 <    atom3_->addFrc(f1);
121 <    atom1_->addFrc(f2 - f1);
122 <    atom2_->addFrc(f3 - f2);
123 <    atom4_->addFrc(-f3);
120 >    atom2_->addFrc(f1);
121 >    atom1_->addFrc(f2 - f1 + f3);
122 >    atom4_->addFrc(-f2);
123 >    atom3_->addFrc(-f3);
124 >
125      angle = acos(cos_phi) /M_PI * 180.0;
126    }
127  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines