ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/nonbonded/NonBondedInteraction.hpp
Revision: 1544
Committed: Fri Mar 18 19:31:52 2011 UTC (14 years, 4 months ago) by gezelter
File size: 10190 byte(s)
Log Message:
More modifications for paralllel rewrite

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 gezelter 1544 HYDROGENBONDING_FAMILY,/**< Short-range directional interactions */
64     N_INTERACTION_FAMILIES
65 gezelter 1502 };
66    
67     /**
68     * The InteractionData struct.
69     *
70     * This is used to pass data to specific non-bonded interactions for
71     * force calculations. Not all of the struct members are utilized
72     * by any given interaction.
73     */
74     struct InteractionData {
75     AtomType* atype1; /**< pointer to AtomType of first atom */
76     AtomType* atype2; /**< pointer to AtomType of second atom */
77     Vector3d d; /**< interatomic vector (already wrapped into box) */
78     RealType rij; /**< interatomic separation (precomputed) */
79     RealType r2; /**< square of rij (precomputed) */
80     RealType rcut; /**< cutoff radius for this interaction */
81     RealType sw; /**< switching function value at rij (precomputed) */
82     RealType vdwMult; /**< multiplier for van der Waals interactions */
83     RealType electroMult; /**< multiplier for electrostatic interactions */
84 gezelter 1536 RealType pot[4]; /**< total potential */
85     RealType vpair[4]; /**< pair potential */
86     Vector3d f1; /**< force between the two atoms */
87     Mat3x3d eFrame1; /**< pointer to electrostatic frame for first atom */
88     Mat3x3d eFrame2; /**< pointer to electrostatic frame for second atom*/
89     RotMat3x3d A1; /**< pointer to rotation matrix of first atom */
90     RotMat3x3d A2; /**< pointer to rotation matrix of second atom */
91     Vector3d t1; /**< pointer to torque on first atom */
92     Vector3d t2; /**< pointer to torque on second atom */
93 gezelter 1502 RealType rho1; /**< electron density at first atom */
94     RealType rho2; /**< electron density at second atom */
95     RealType dfrho1; /**< derivative of density functional for atom 1 */
96     RealType dfrho2; /**< derivative of density functional for atom 2 */
97     RealType fshift1; /**< indirect potential contribution from atom 1 */
98     RealType fshift2; /**< indirect potential contribution from atom 2 */
99     };
100    
101     /**
102     * The SkipCorrectionData struct.
103     *
104     * This is used to pass data for corrections due to "skipped" pairs
105     * of atoms. These are atoms that are topologically bonded to each
106     * other, but which have indirect effects by way of long range
107     * interactions. In the normal pair interaction loop, these atoms
108     * are skipped entirely, so a second pass must be made to compute
109     * their indirect interactions on each other.
110     */
111     struct SkipCorrectionData {
112 gezelter 1536 AtomType* atype1; /**< pointer to AtomType of first atom */
113     AtomType* atype2; /**< pointer to AtomType of second atom */
114     Vector3d d; /**< interatomic vector (already wrapped into box) */
115     RealType rij; /**< interatomic separation (precomputed) */
116     RealType skippedCharge1; /**< charge skipped in normal pairwise interaction loop */
117     RealType skippedCharge2; /**< charge skipped in normal pairwise interaction loop */
118     RealType sw; /**< switching function value at rij (precomputed) */
119     RealType electroMult; /**< multiplier for electrostatic interactions */
120     RealType pot[4]; /**< total potential */
121     RealType vpair[4]; /**< pair potential */
122     Vector3d f1; /**< force correction */
123     Mat3x3d eFrame1; /**< pointer to electrostatic frame for first atom */
124     Mat3x3d eFrame2; /**< pointer to electrostatic frame for second atom*/
125     Vector3d t1; /**< pointer to torque on first atom */
126     Vector3d t2; /**< pointer to torque on second atom */
127 gezelter 1502 };
128    
129     /**
130     * The SelfCorrectionData struct.
131     *
132     * This is used to pass data for the self-interaction (used by
133     * electrostatic methods) that have long-range corrections involving
134     * interactions with a medium or a boundary.
135     */
136     struct SelfCorrectionData {
137     AtomType* atype; /**< pointer to AtomType of the atom */
138 gezelter 1504 Mat3x3d eFrame; /**< pointer to electrostatic frame for first atom */
139 gezelter 1502 RealType skippedCharge; /**< charge skipped in normal pairwise interaction loop */
140 gezelter 1536 RealType pot[4]; /**< total potential contribution */
141 gezelter 1504 Vector3d t; /**< pointer to resultant torque on atom */
142 gezelter 1502 };
143    
144    
145    
146     /**
147     * The DensityData struct.
148     *
149     * This is used to pass data to specific metallic interactions for
150     * electron density calculations.
151     */
152    
153     struct DensityData {
154     AtomType* atype1; /**< pointer to AtomType of first atom */
155     AtomType* atype2; /**< pointer to AtomType of second atom */
156     RealType rij; /**< interatomic separation (precomputed) */
157     RealType rho_i_at_j; /**< electron density at second atom due to first */
158     RealType rho_j_at_i; /**< electron density at first atom due to second */
159     };
160    
161     /**
162     * The FunctionalData struct.
163     *
164     * This is used to pass data to specific metallic interactions for
165     * electron density functional calculations.
166     */
167    
168     struct FunctionalData {
169     AtomType* atype; /**< pointer to AtomType of the atom */
170     RealType rho; /**< electron density (precomputed) */
171     RealType frho; /**< value of density functional for the atom */
172     RealType dfrhodrho; /**< derivative of density functional for the atom */
173     };
174    
175     /**
176     * The basic interface for non-bonded interactions.
177     */
178     class NonBondedInteraction {
179     public:
180     NonBondedInteraction() {}
181     virtual ~NonBondedInteraction() {}
182 gezelter 1536 virtual void calcForce(InteractionData &idat) = 0;
183 gezelter 1502 virtual InteractionFamily getFamily() = 0;
184 gezelter 1505 virtual RealType getSuggestedCutoffRadius(AtomType* at1, AtomType* at2) = 0;
185 gezelter 1502 virtual string getName() = 0;
186     };
187    
188     /**
189     * The basic interface for van der Waals interactions.
190     */
191     class VanDerWaalsInteraction : public NonBondedInteraction {
192     public:
193     VanDerWaalsInteraction() : NonBondedInteraction() { }
194     virtual ~VanDerWaalsInteraction() {}
195     virtual InteractionFamily getFamily() {return VANDERWAALS_FAMILY;}
196     };
197    
198     /**
199     * The basic interface for electrostatic interactions.
200     */
201     class ElectrostaticInteraction : public NonBondedInteraction {
202     public:
203     ElectrostaticInteraction() : NonBondedInteraction() { }
204     virtual ~ElectrostaticInteraction() {}
205 gezelter 1536 virtual void calcSkipCorrection(SkipCorrectionData &skdat) = 0;
206     virtual void calcSelfCorrection(SelfCorrectionData &scdat) = 0;
207     virtual InteractionFamily getFamily() {return ELECTROSTATIC_FAMILY;}
208 gezelter 1502 };
209    
210     /**
211     * The basic interface for metallic interactions.
212     */
213     class MetallicInteraction : public NonBondedInteraction {
214     public:
215     MetallicInteraction() : NonBondedInteraction() { }
216     virtual ~MetallicInteraction() {}
217 gezelter 1536 virtual void calcDensity(DensityData &ddat) = 0;
218     virtual void calcFunctional(FunctionalData &fdat) = 0;
219 gezelter 1502 virtual InteractionFamily getFamily() {return METALLIC_FAMILY;}
220     };
221    
222     /**
223     * The basic interface for hydrogen bonding interactions.
224     */
225     class HydrogenBondingInteraction : public NonBondedInteraction {
226     public:
227     HydrogenBondingInteraction() : NonBondedInteraction() { }
228     virtual ~HydrogenBondingInteraction() {}
229     virtual InteractionFamily getFamily() {return HYDROGENBONDING_FAMILY;}
230     };
231    
232     } //end namespace OpenMD
233     #endif

Properties

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