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

Comparing trunk/src/primitives/GhostTorsion.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/GhostTorsion.hpp"
43  
44   namespace oopse {
45 <
46 <  GhostTorsion::GhostTorsion(Atom *atom1, Atom *atom2,  DirectionalAtom* ghostAtom,
47 <                             TorsionType *tt) : Torsion(atom1, atom2, ghostAtom, ghostAtom, tt) {}
48 <
45 >  
46 >  GhostTorsion::GhostTorsion(Atom *atom1, Atom *atom2,  
47 >                             DirectionalAtom* ghostAtom, TorsionType *tt)
48 >    : Torsion(atom1, atom2, ghostAtom, ghostAtom, tt) {}
49 >  
50    void GhostTorsion::calcForce(RealType& angle) {
51      DirectionalAtom* ghostAtom = static_cast<DirectionalAtom*>(atom3_);    
52 <
52 >    
53      Vector3d pos1 = atom1_->getPos();
54      Vector3d pos2 = atom2_->getPos();
55      Vector3d pos3 = ghostAtom->getPos();
56 <
56 >    
57      Vector3d r21 = pos1 - pos2;
58      Vector3d r32 = pos2 - pos3;
59      Vector3d r43 = ghostAtom->getElectroFrame().getColumn(2);
60 <
60 >    
61      //  Calculate the cross products and distances
62      Vector3d A = cross(r21, r32);
63      RealType rA = A.length();
# Line 64 | Line 65 | namespace oopse {
65      RealType rB = B.length();
66      Vector3d C = cross(r32, A);
67      RealType rC = C.length();
68 <
68 >    
69      A.normalize();
70      B.normalize();
71      C.normalize();
72      
73      //  Calculate the sin and cos
74      RealType cos_phi = dot(A, B) ;
75 <
75 >    
76      RealType dVdcosPhi;
77      torsionType_->calcForce(cos_phi, potential_, dVdcosPhi);
78 <
78 >    
79      Vector3d dcosdA = (cos_phi * A - B) /rA;
80      Vector3d dcosdB = (cos_phi * B - A) /rB;
81 <
81 >    
82      Vector3d f1 = dVdcosPhi * cross(r32, dcosdA);
83      Vector3d f2 = dVdcosPhi * ( cross(r43, dcosdB) - cross(r21, dcosdA));
84      Vector3d f3 = dVdcosPhi * cross(dcosdB, r32);
85 <
85 >    
86      atom1_->addFrc(f1);
87      atom2_->addFrc(f2 - f1);
88 <
88 >    
89      ghostAtom->addFrc(-f2);
90 <
90 >    
91      f3.negate();
92      ghostAtom->addTrq(cross(r43, f3));    
93 <
93 >    
94      angle = acos(cos_phi) /M_PI * 180.0;
95    }
95
96   }
97  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines