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 494 by tim, Wed Apr 13 22:43:43 2005 UTC vs.
Revision 1955 by gezelter, Thu Dec 5 21:55:42 2013 UTC

# Line 1 | Line 1
1 < /*
1 > /*
2   * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3   *
4   * The University of Notre Dame grants you ("Licensee") a
# 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;
62 > };
63  
64 < /**
65 < * @class Torsion Torsion.hpp "types/Torsion.hpp"
66 < */
67 < class Torsion {
68 <    public:
63 <        Torsion(Atom* atom1, Atom* atom2, Atom* atom3, Atom* atom4, TorsionType* tt);
64 <        virtual ~Torsion() {}
65 <        virtual void calcForce();
66 <        
67 <        double getPotential() {
68 <            return potential_;
69 <        }
64 > struct TorsionDataSet {
65 >    RealType deltaV;
66 >    TorsionData prev;
67 >    TorsionData curr;
68 > };
69  
71        Atom* getAtomA() {
72            return atom1_;
73        }
70  
71 <        Atom* getAtomB() {
72 <            return atom2_;
73 <        }
71 >  /**
72 >   * @class Torsion Torsion.hpp "types/Torsion.hpp"
73 >   */
74 >  class Torsion : public ShortRangeInteraction {
75 >  public:
76 >    using ShortRangeInteraction::getValue;
77 >    using ShortRangeInteraction::getPrevValue;
78  
79 <        Atom* getAtomC() {
80 <            return atom3_;
81 <        }
79 >    Torsion(Atom* atom1, Atom* atom2, Atom* atom3, Atom* atom4, TorsionType* tt);
80 >    virtual ~Torsion() {}
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 <        Atom* getAtomD() {
119 <            return atom4_;
120 <        }
118 >    RealType getPotential() {
119 >      return potential_;
120 >    }
121  
122 <        TorsionType * getTorsionType() {
123 <            return torsionType_;
124 <        }
122 >    Atom* getAtomA() {
123 >      return atoms_[0];
124 >    }
125 >
126 >    Atom* getAtomB() {
127 >      return atoms_[1];
128 >    }
129 >
130 >    Atom* getAtomC() {
131 >      return atoms_[2];
132 >    }
133 >
134 >    Atom* getAtomD() {
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_;
96 <        Atom* atom4_;
146 >    void accept(BaseVisitor* v) {
147 >      v->visit(this);
148 >    }    
149  
150 <        TorsionType* torsionType_;
150 >  protected:
151  
152 <        double potential_;
153 < };    
152 >    TorsionType* torsionType_;
153 >    std::string name_;        
154  
155 +    RealType potential_;
156 +  };    
157 +
158   }
159   #endif //PRIMITIVES_TORSION_HPP

Comparing trunk/src/primitives/Torsion.hpp (property svn:keywords):
Revision 494 by tim, Wed Apr 13 22:43:43 2005 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