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 1955 by gezelter, Thu Dec 5 21:55:42 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 +    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 963 by tim, Wed May 17 21:51:42 2006 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