ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/nonbonded/NonBondedInteraction.hpp
Revision: 1504
Committed: Sat Oct 2 20:41:53 2010 UTC (14 years, 9 months ago) by gezelter
File size: 10104 byte(s)
Log Message:
The C++ side now compiles.  Moving on to doForces

File Contents

# User Rev Content
1 gezelter 1502 /*
2     * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3     *
4     * The University of Notre Dame grants you ("Licensee") a
5     * non-exclusive, royalty free, license to use, modify and
6     * redistribute this software in source and binary code form, provided
7     * that the following conditions are met:
8     *
9     * 1. Redistributions of source code must retain the above copyright
10     * notice, this list of conditions and the following disclaimer.
11     *
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.
16     *
17     * This software is provided "AS IS," without a warranty of any
18     * kind. All express or implied conditions, representations and
19     * warranties, including any implied warranty of merchantability,
20     * fitness for a particular purpose or non-infringement, are hereby
21     * excluded. The University of Notre Dame and its licensors shall not
22     * be liable for any damages suffered by licensee as a result of
23     * using, modifying or distributing the software or its
24     * derivatives. In no event will the University of Notre Dame or its
25     * licensors be liable for any lost revenue, profit or data, or for
26     * direct, indirect, special, consequential, incidental or punitive
27     * damages, however caused and regardless of the theory of liability,
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, 24107 (2008).
39     * [4] Vardeman & Gezelter, in progress (2009).
40     */
41    
42     #ifndef NONBONDED_NONBONDEDINTERACTION_HPP
43     #define NONBONDED_NONBONDEDINTERACTION_HPP
44    
45     #include "types/AtomType.hpp"
46     #include "math/SquareMatrix3.hpp"
47    
48     using namespace std;
49     namespace OpenMD {
50    
51     /**
52     * The InteractionFamily enum.
53     *
54     * This is used to sort different types of non-bonded interaction
55     * and to prevent multiple interactions in the same family from
56     * being applied to any given pair of atom types.
57     */
58     enum InteractionFamily {
59     NO_FAMILY, /**< No family defined */
60     VANDERWAALS_FAMILY, /**< Long-range dispersion and short-range pauli repulsion */
61     ELECTROSTATIC_FAMILY, /**< Coulombic and point-multipole interactions */
62     METALLIC_FAMILY, /**< Transition metal interactions involving electron density */
63     HYDROGENBONDING_FAMILY /**< Short-range directional interactions */
64     };
65    
66     /**
67     * The InteractionData struct.
68     *
69     * This is used to pass data to specific non-bonded interactions for
70     * force calculations. Not all of the struct members are utilized
71     * by any given interaction.
72     */
73     struct InteractionData {
74     AtomType* atype1; /**< pointer to AtomType of first atom */
75     AtomType* atype2; /**< pointer to AtomType of second atom */
76     Vector3d d; /**< interatomic vector (already wrapped into box) */
77     RealType rij; /**< interatomic separation (precomputed) */
78     RealType r2; /**< square of rij (precomputed) */
79     RealType rcut; /**< cutoff radius for this interaction */
80     RealType sw; /**< switching function value at rij (precomputed) */
81     RealType vdwMult; /**< multiplier for van der Waals interactions */
82     RealType electroMult; /**< multiplier for electrostatic interactions */
83     RealType pot; /**< total potential */
84     RealType vpair; /**< pair potential */
85     Vector3d f1; /**< force between the two atoms */
86     Mat3x3d eFrame1; /**< pointer to electrostatic frame for first atom */
87     Mat3x3d eFrame2; /**< pointer to electrostatic frame for second atom*/
88     RotMat3x3d A1; /**< pointer to rotation matrix of first atom */
89     RotMat3x3d A2; /**< pointer to rotation matrix of second atom */
90     Vector3d t1; /**< pointer to torque on first atom */
91     Vector3d t2; /**< pointer to torque on second atom */
92     RealType rho1; /**< electron density at first atom */
93     RealType rho2; /**< electron density at second atom */
94     RealType dfrho1; /**< derivative of density functional for atom 1 */
95     RealType dfrho2; /**< derivative of density functional for atom 2 */
96     RealType fshift1; /**< indirect potential contribution from atom 1 */
97     RealType fshift2; /**< indirect potential contribution from atom 2 */
98     };
99    
100     /**
101     * The SkipCorrectionData struct.
102     *
103     * This is used to pass data for corrections due to "skipped" pairs
104     * of atoms. These are atoms that are topologically bonded to each
105     * other, but which have indirect effects by way of long range
106     * interactions. In the normal pair interaction loop, these atoms
107     * are skipped entirely, so a second pass must be made to compute
108     * their indirect interactions on each other.
109     */
110     struct SkipCorrectionData {
111     AtomType* atype1; /**< pointer to AtomType of first atom */
112     AtomType* atype2; /**< pointer to AtomType of second atom */
113     Vector3d d; /**< interatomic vector (already wrapped into box) */
114     RealType rij; /**< interatomic separation (precomputed) */
115     RealType skippedCharge1; /**< charge skipped in normal pairwise interaction loop */
116     RealType skippedCharge2; /**< charge skipped in normal pairwise interaction loop */
117     RealType sw; /**< switching function value at rij (precomputed) */
118     RealType electroMult; /**< multiplier for electrostatic interactions */
119     RealType pot; /**< total potential */
120     RealType vpair; /**< pair potential */
121     Vector3d f1; /**< force correction */
122 gezelter 1504 Mat3x3d eFrame1; /**< pointer to electrostatic frame for first atom */
123     Mat3x3d eFrame2; /**< pointer to electrostatic frame for second atom*/
124     Vector3d t1; /**< pointer to torque on first atom */
125     Vector3d t2; /**< pointer to torque on second atom */
126 gezelter 1502 };
127    
128     /**
129     * The SelfCorrectionData struct.
130     *
131     * This is used to pass data for the self-interaction (used by
132     * electrostatic methods) that have long-range corrections involving
133     * interactions with a medium or a boundary.
134     */
135     struct SelfCorrectionData {
136     AtomType* atype; /**< pointer to AtomType of the atom */
137 gezelter 1504 Mat3x3d eFrame; /**< pointer to electrostatic frame for first atom */
138 gezelter 1502 RealType skippedCharge; /**< charge skipped in normal pairwise interaction loop */
139     RealType pot; /**< total potential contribution */
140 gezelter 1504 Vector3d t; /**< pointer to resultant torque on atom */
141 gezelter 1502 };
142    
143    
144    
145     /**
146     * The DensityData struct.
147     *
148     * This is used to pass data to specific metallic interactions for
149     * electron density calculations.
150     */
151    
152     struct DensityData {
153     AtomType* atype1; /**< pointer to AtomType of first atom */
154     AtomType* atype2; /**< pointer to AtomType of second atom */
155     RealType rij; /**< interatomic separation (precomputed) */
156     RealType rho_i_at_j; /**< electron density at second atom due to first */
157     RealType rho_j_at_i; /**< electron density at first atom due to second */
158     };
159    
160     /**
161     * The FunctionalData struct.
162     *
163     * This is used to pass data to specific metallic interactions for
164     * electron density functional calculations.
165     */
166    
167     struct FunctionalData {
168     AtomType* atype; /**< pointer to AtomType of the atom */
169     RealType rho; /**< electron density (precomputed) */
170     RealType frho; /**< value of density functional for the atom */
171     RealType dfrhodrho; /**< derivative of density functional for the atom */
172     };
173    
174     /**
175     * The basic interface for non-bonded interactions.
176     */
177     class NonBondedInteraction {
178     public:
179     NonBondedInteraction() {}
180     virtual ~NonBondedInteraction() {}
181     virtual void calcForce(InteractionData idat) = 0;
182     virtual InteractionFamily getFamily() = 0;
183     virtual string getName() = 0;
184     };
185    
186     /**
187     * The basic interface for van der Waals interactions.
188     */
189     class VanDerWaalsInteraction : public NonBondedInteraction {
190     public:
191     VanDerWaalsInteraction() : NonBondedInteraction() { }
192     virtual ~VanDerWaalsInteraction() {}
193     virtual InteractionFamily getFamily() {return VANDERWAALS_FAMILY;}
194     };
195    
196     /**
197     * The basic interface for electrostatic interactions.
198     */
199     class ElectrostaticInteraction : public NonBondedInteraction {
200     public:
201     ElectrostaticInteraction() : NonBondedInteraction() { }
202     virtual ~ElectrostaticInteraction() {}
203     virtual void calcSkipCorrection(SkipCorrectionData skdat) = 0;
204     virtual void calcSelfCorrection(SelfCorrectionData scdat) = 0;
205     virtual InteractionFamily getFamily() {return ELECTROSTATIC_FAMILY;}
206     };
207    
208     /**
209     * The basic interface for metallic interactions.
210     */
211     class MetallicInteraction : public NonBondedInteraction {
212     public:
213     MetallicInteraction() : NonBondedInteraction() { }
214     virtual ~MetallicInteraction() {}
215     virtual void calcDensity(DensityData ddat) = 0;
216     virtual void calcFunctional(FunctionalData fdat) = 0;
217     virtual InteractionFamily getFamily() {return METALLIC_FAMILY;}
218     };
219    
220     /**
221     * The basic interface for hydrogen bonding interactions.
222     */
223     class HydrogenBondingInteraction : public NonBondedInteraction {
224     public:
225     HydrogenBondingInteraction() : NonBondedInteraction() { }
226     virtual ~HydrogenBondingInteraction() {}
227     virtual InteractionFamily getFamily() {return HYDROGENBONDING_FAMILY;}
228     };
229    
230     } //end namespace OpenMD
231     #endif

Properties

Name Value
svn:eol-style native
svn:executable *