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

Comparing trunk/src/primitives/Torsion.hpp (file contents):
Revision 1390 by gezelter, Wed Nov 25 20:02:06 2009 UTC vs.
Revision 1955 by gezelter, Thu Dec 5 21:55:42 2013 UTC

# Line 35 | Line 35
35   *                                                                      
36   * [1]  Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).            
37   * [2]  Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).          
38 < * [3]  Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008).          
39 < * [4]  Vardeman & Gezelter, in progress (2009).                        
38 > * [3]  Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008).          
39 > * [4]  Kuang & Gezelter,  J. Chem. Phys. 133, 164101 (2010).
40 > * [5]  Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
41   */
42  
43   /**
# Line 49 | Line 50
50   #ifndef PRIMITIVES_TORSION_HPP
51   #define PRIMITIVES_TORSION_HPP
52  
53 + #include "primitives/ShortRangeInteraction.hpp"
54   #include "primitives/Atom.hpp"
53
55   #include "types/TorsionType.hpp"
56 + #include <limits>
57  
58   namespace OpenMD {
59   struct TorsionData {
# Line 69 | Line 71 | struct TorsionDataSet {
71    /**
72     * @class Torsion Torsion.hpp "types/Torsion.hpp"
73     */
74 <  class Torsion {
74 >  class Torsion : public ShortRangeInteraction {
75    public:
76 +    using ShortRangeInteraction::getValue;
77 +    using ShortRangeInteraction::getPrevValue;
78 +
79      Torsion(Atom* atom1, Atom* atom2, Atom* atom3, Atom* atom4, TorsionType* tt);
80      virtual ~Torsion() {}
81 <    virtual void calcForce(RealType& angle);
82 <        
81 >    virtual void calcForce(RealType& angle, bool doParticlePot);
82 >                
83 >    RealType getValue(int snapshotNo) {
84 >      Vector3d pos1 = atoms_[0]->getPos(snapshotNo);
85 >      Vector3d pos2 = atoms_[1]->getPos(snapshotNo);
86 >      Vector3d pos3 = atoms_[2]->getPos(snapshotNo);
87 >      Vector3d pos4 = atoms_[3]->getPos(snapshotNo);
88 >      
89 >      Vector3d r21 = pos1 - pos2;
90 >      Vector3d r32 = pos2 - pos3;
91 >      Vector3d r43 = pos3 - pos4;
92 >      
93 >      //  Calculate the cross products and distances
94 >      Vector3d A = cross(r21, r32);
95 >      RealType rA = A.length();
96 >      Vector3d B = cross(r32, r43);
97 >      RealType rB = B.length();
98 >      
99 >      /*
100 >         If either of the two cross product vectors is tiny, that means
101 >         the three atoms involved are colinear, and the torsion angle is
102 >         going to be undefined.  The easiest check for this problem is
103 >         to use the product of the two lengths.
104 >      */
105 >      if (rA * rB < OpenMD::epsilon) return numeric_limits<double>::quiet_NaN();
106 >      
107 >      A.normalize();
108 >      B.normalize();  
109 >      
110 >      //  Calculate the sin and cos
111 >      RealType cos_phi = dot(A, B) ;
112 >      if (cos_phi > 1.0) cos_phi = 1.0;
113 >      if (cos_phi < -1.0) cos_phi = -1.0;            
114 >      return acos(cos_phi);
115 >    }
116 >    
117 >
118      RealType getPotential() {
119        return potential_;
120      }
121  
122      Atom* getAtomA() {
123 <      return atom1_;
123 >      return atoms_[0];
124      }
125  
126      Atom* getAtomB() {
127 <      return atom2_;
127 >      return atoms_[1];
128      }
129  
130      Atom* getAtomC() {
131 <      return atom3_;
131 >      return atoms_[2];
132      }
133  
134      Atom* getAtomD() {
135 <      return atom4_;
135 >      return atoms_[3];
136      }
137  
138      TorsionType * getTorsionType() {
139        return torsionType_;
140      }
141          
142 <  protected:
142 >    virtual std::string getName() { return name_;}        
143 >    /** Sets the name of this torsion for selections */
144 >    virtual void setName(const std::string& name) { name_ = name;}
145  
146 <    Atom* atom1_;
147 <    Atom* atom2_;
148 <    Atom* atom3_;
107 <    Atom* atom4_;
146 >    void accept(BaseVisitor* v) {
147 >      v->visit(this);
148 >    }    
149  
150 +  protected:
151 +
152      TorsionType* torsionType_;
153 +    std::string name_;        
154  
155      RealType potential_;
156    };    

Comparing trunk/src/primitives/Torsion.hpp (property svn:keywords):
Revision 1390 by gezelter, Wed Nov 25 20:02:06 2009 UTC vs.
Revision 1955 by gezelter, Thu Dec 5 21:55:42 2013 UTC

# Line 0 | Line 1
1 + Author Id Revision Date

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines