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 963 by tim, Wed May 17 21:51:42 2006 UTC vs.
Revision 1953 by gezelter, Thu Dec 5 18:19:26 2013 UTC

# Line 6 | Line 6
6   * redistribute this software in source and binary code form, provided
7   * that the following conditions are met:
8   *
9 < * 1. Acknowledgement of the program authors must be made in any
10 < *    publication of scientific results based in part on use of the
11 < *    program.  An acceptable form of acknowledgement is citation of
12 < *    the article in which the program was described (Matthew
13 < *    A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher
14 < *    J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented
15 < *    Parallel Simulation Engine for Molecular Dynamics,"
16 < *    J. Comput. Chem. 26, pp. 252-271 (2005))
17 < *
18 < * 2. Redistributions of source code must retain the above copyright
9 > * 1. Redistributions of source code must retain the above copyright
10   *    notice, this list of conditions and the following disclaimer.
11   *
12 < * 3. Redistributions in binary form must reproduce the above copyright
12 > * 2. Redistributions in binary form must reproduce the above copyright
13   *    notice, this list of conditions and the following disclaimer in the
14   *    documentation and/or other materials provided with the
15   *    distribution.
# Line 37 | Line 28
28   * arising out of the use of or inability to use software, even if the
29   * University of Notre Dame has been advised of the possibility of
30   * such damages.
31 + *
32 + * SUPPORT OPEN SCIENCE!  If you use OpenMD or its source code in your
33 + * research, please cite the appropriate papers when you publish your
34 + * work.  Good starting points are:
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, 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 oopse {
58 > namespace OpenMD {
59   struct TorsionData {
60      RealType angle;
61      RealType potential;
# 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      Torsion(Atom* atom1, Atom* atom2, Atom* atom3, Atom* atom4, TorsionType* tt);
77      virtual ~Torsion() {}
78 <    virtual void calcForce(RealType& angle);
79 <        
78 >    virtual void calcForce(RealType& angle, bool doParticlePot);
79 >                
80 >    RealType getValue(int snapshotNo) {
81 >      Vector3d pos1 = atoms_[0]->getPos(snapshotNo);
82 >      Vector3d pos2 = atoms_[1]->getPos(snapshotNo);
83 >      Vector3d pos3 = atoms_[2]->getPos(snapshotNo);
84 >      Vector3d pos4 = atoms_[3]->getPos(snapshotNo);
85 >      
86 >      Vector3d r21 = pos1 - pos2;
87 >      Vector3d r32 = pos2 - pos3;
88 >      Vector3d r43 = pos3 - pos4;
89 >      
90 >      //  Calculate the cross products and distances
91 >      Vector3d A = cross(r21, r32);
92 >      RealType rA = A.length();
93 >      Vector3d B = cross(r32, r43);
94 >      RealType rB = B.length();
95 >      
96 >      /*
97 >         If either of the two cross product vectors is tiny, that means
98 >         the three atoms involved are colinear, and the torsion angle is
99 >         going to be undefined.  The easiest check for this problem is
100 >         to use the product of the two lengths.
101 >      */
102 >      if (rA * rB < OpenMD::epsilon) return numeric_limits<double>::quiet_NaN();
103 >      
104 >      A.normalize();
105 >      B.normalize();  
106 >      
107 >      //  Calculate the sin and cos
108 >      RealType cos_phi = dot(A, B) ;
109 >      if (cos_phi > 1.0) cos_phi = 1.0;
110 >      if (cos_phi < -1.0) cos_phi = -1.0;            
111 >      return acos(cos_phi);
112 >    }
113 >    
114 >
115      RealType getPotential() {
116        return potential_;
117      }
118  
119      Atom* getAtomA() {
120 <      return atom1_;
120 >      return atoms_[0];
121      }
122  
123      Atom* getAtomB() {
124 <      return atom2_;
124 >      return atoms_[1];
125      }
126  
127      Atom* getAtomC() {
128 <      return atom3_;
128 >      return atoms_[2];
129      }
130  
131      Atom* getAtomD() {
132 <      return atom4_;
132 >      return atoms_[3];
133      }
134  
135      TorsionType * getTorsionType() {
136        return torsionType_;
137      }
138          
139 <  protected:
139 >    virtual std::string getName() { return name_;}        
140 >    /** Sets the name of this torsion for selections */
141 >    virtual void setName(const std::string& name) { name_ = name;}
142  
143 <    Atom* atom1_;
144 <    Atom* atom2_;
145 <    Atom* atom3_;
107 <    Atom* atom4_;
143 >    void accept(BaseVisitor* v) {
144 >      v->visit(this);
145 >    }    
146  
147 +  protected:
148 +
149      TorsionType* torsionType_;
150 +    std::string name_;        
151  
152      RealType potential_;
153    };    

Comparing trunk/src/primitives/Torsion.hpp (property svn:keywords):
Revision 963 by tim, Wed May 17 21:51:42 2006 UTC vs.
Revision 1953 by gezelter, Thu Dec 5 18:19:26 2013 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines