ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/UseTheForce/ForceField.cpp
Revision: 3153
Committed: Fri Jul 6 18:15:03 2007 UTC (17 years ago) by chuckv
File size: 9497 byte(s)
Log Message:
Changes to allow for non-bonded interactions.

File Contents

# User Rev Content
1 gezelter 2204 /*
2 gezelter 1930 * 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. 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
19     * notice, this list of conditions and the following disclaimer.
20     *
21     * 3. Redistributions in binary form must reproduce the above copyright
22     * notice, this list of conditions and the following disclaimer in the
23     * documentation and/or other materials provided with the
24     * distribution.
25     *
26     * This software is provided "AS IS," without a warranty of any
27     * kind. All express or implied conditions, representations and
28     * warranties, including any implied warranty of merchantability,
29     * fitness for a particular purpose or non-infringement, are hereby
30     * excluded. The University of Notre Dame and its licensors shall not
31     * be liable for any damages suffered by licensee as a result of
32     * using, modifying or distributing the software or its
33     * derivatives. In no event will the University of Notre Dame or its
34     * licensors be liable for any lost revenue, profit or data, or for
35     * direct, indirect, special, consequential, incidental or punitive
36     * damages, however caused and regardless of the theory of liability,
37     * arising out of the use of or inability to use software, even if the
38     * University of Notre Dame has been advised of the possibility of
39     * such damages.
40     */
41    
42 gezelter 2204 /**
43     * @file ForceField.cpp
44     * @author tlin
45     * @date 11/04/2004
46     * @time 22:51am
47     * @version 1.0
48     */
49 gezelter 1930
50 gezelter 1711 #include "UseTheForce/ForceField.hpp"
51 gezelter 1930 #include "utils/simError.h"
52 tim 2172 #include "UseTheForce/DarkSide/atype_interface.h"
53 chuckv 2520 #include "UseTheForce/DarkSide/fForceOptions_interface.h"
54 gezelter 2722 #include "UseTheForce/DarkSide/switcheroo_interface.h"
55 gezelter 1930 namespace oopse {
56 gezelter 1711
57 gezelter 2204 ForceField::ForceField() {
58 gezelter 1930 char* tempPath;
59     tempPath = getenv("FORCE_PARAM_PATH");
60 gezelter 1711
61 gezelter 1930 if (tempPath == NULL) {
62 gezelter 2204 //convert a macro from compiler to a string in c++
63     STR_DEFINE(ffPath_, FRC_PATH );
64 gezelter 1930 } else {
65 gezelter 2204 ffPath_ = tempPath;
66 gezelter 1930 }
67 gezelter 2204 }
68 gezelter 1711
69 tim 2172
70 gezelter 2204 ForceField::~ForceField() {
71 tim 2172 deleteAtypes();
72 gezelter 2722 deleteSwitch();
73 gezelter 2204 }
74 tim 2172
75 gezelter 2204 AtomType* ForceField::getAtomType(const std::string &at) {
76 gezelter 1930 std::vector<std::string> keys;
77     keys.push_back(at);
78     return atomTypeCont_.find(keys);
79 gezelter 2204 }
80 gezelter 1711
81 gezelter 2204 BondType* ForceField::getBondType(const std::string &at1, const std::string &at2) {
82 gezelter 1930 std::vector<std::string> keys;
83     keys.push_back(at1);
84     keys.push_back(at2);
85 gezelter 1711
86 gezelter 1930 //try exact match first
87     BondType* bondType = bondTypeCont_.find(keys);
88     if (bondType) {
89 gezelter 2204 return bondType;
90 gezelter 1930 } else {
91 gezelter 2204 //if no exact match found, try wild card match
92     return bondTypeCont_.find(keys, wildCardAtomTypeName_);
93 gezelter 1930 }
94 gezelter 1711
95 gezelter 2204 }
96 gezelter 1711
97 gezelter 2204 BendType* ForceField::getBendType(const std::string &at1, const std::string &at2,
98     const std::string &at3) {
99 gezelter 1930 std::vector<std::string> keys;
100     keys.push_back(at1);
101     keys.push_back(at2);
102     keys.push_back(at3);
103 gezelter 1711
104 gezelter 1930 //try exact match first
105     BendType* bendType = bendTypeCont_.find(keys);
106     if (bendType) {
107 gezelter 2204 return bendType;
108 gezelter 1930 } else {
109 gezelter 2204 //if no exact match found, try wild card match
110     return bendTypeCont_.find(keys, wildCardAtomTypeName_);
111 gezelter 1930 }
112 gezelter 2204 }
113 gezelter 1711
114 gezelter 2204 TorsionType* ForceField::getTorsionType(const std::string &at1, const std::string &at2,
115     const std::string &at3, const std::string &at4) {
116 gezelter 1930 std::vector<std::string> keys;
117     keys.push_back(at1);
118     keys.push_back(at2);
119     keys.push_back(at3);
120     keys.push_back(at4);
121 gezelter 1711
122 gezelter 1930 TorsionType* torsionType = torsionTypeCont_.find(keys);
123     if (torsionType) {
124 gezelter 2204 return torsionType;
125 gezelter 1930 } else {
126 gezelter 2204 //if no exact match found, try wild card match
127     return torsionTypeCont_.find(keys, wildCardAtomTypeName_);
128 gezelter 1930 }
129 gezelter 1711
130 gezelter 1930 return torsionTypeCont_.find(keys, wildCardAtomTypeName_);
131 gezelter 1711
132 gezelter 2204 }
133 gezelter 1711
134 chuckv 3153 NonBondedInteractionType* ForceField::getNonBondedInteractionType(const std::string &at1, const std::string &at2) {
135     std::vector<std::string> keys;
136     keys.push_back(at1);
137     keys.push_back(at2);
138    
139     //try exact match first
140     NonBondedInteractionType* nbiType = nonBondedInteractionTypeCont_.find(keys);
141     if (nbiType) {
142     return nbiType;
143     } else {
144     //if no exact match found, try wild card match
145     return nonBondedInteractionTypeCont_.find(keys, wildCardAtomTypeName_);
146     }
147    
148     }
149    
150 gezelter 2204 BondType* ForceField::getExactBondType(const std::string &at1, const std::string &at2){
151 gezelter 1930 std::vector<std::string> keys;
152     keys.push_back(at1);
153     keys.push_back(at2);
154     return bondTypeCont_.find(keys);
155 gezelter 2204 }
156 gezelter 1711
157 gezelter 2204 BendType* ForceField::getExactBendType(const std::string &at1, const std::string &at2,
158     const std::string &at3){
159 gezelter 1930 std::vector<std::string> keys;
160     keys.push_back(at1);
161     keys.push_back(at2);
162     keys.push_back(at3);
163     return bendTypeCont_.find(keys);
164 gezelter 2204 }
165 gezelter 1711
166 gezelter 2204 TorsionType* ForceField::getExactTorsionType(const std::string &at1, const std::string &at2,
167     const std::string &at3, const std::string &at4){
168 gezelter 1930 std::vector<std::string> keys;
169     keys.push_back(at1);
170     keys.push_back(at2);
171     keys.push_back(at3);
172     keys.push_back(at4);
173     return torsionTypeCont_.find(keys);
174 gezelter 2204 }
175 chuckv 3153
176     NonBondedInteractionType* ForceField::getExactNonBondedInteractionType(const std::string &at1, const std::string &at2){
177     std::vector<std::string> keys;
178     keys.push_back(at1);
179     keys.push_back(at2);
180     return nonBondedInteractionTypeCont_.find(keys);
181     }
182    
183    
184 gezelter 2204 bool ForceField::addAtomType(const std::string &at, AtomType* atomType) {
185 gezelter 1930 std::vector<std::string> keys;
186     keys.push_back(at);
187     return atomTypeCont_.add(keys, atomType);
188 gezelter 2204 }
189 gezelter 1711
190 gezelter 2204 bool ForceField::addBondType(const std::string &at1, const std::string &at2, BondType* bondType) {
191 gezelter 1930 std::vector<std::string> keys;
192     keys.push_back(at1);
193     keys.push_back(at2);
194     return bondTypeCont_.add(keys, bondType);
195 gezelter 1711
196 gezelter 2204 }
197 gezelter 1711
198 gezelter 2204 bool ForceField::addBendType(const std::string &at1, const std::string &at2,
199     const std::string &at3, BendType* bendType) {
200 gezelter 1930 std::vector<std::string> keys;
201     keys.push_back(at1);
202     keys.push_back(at2);
203     keys.push_back(at3);
204     return bendTypeCont_.add(keys, bendType);
205 gezelter 2204 }
206 gezelter 1711
207 gezelter 2204 bool ForceField::addTorsionType(const std::string &at1, const std::string &at2,
208     const std::string &at3, const std::string &at4, TorsionType* torsionType) {
209 gezelter 1930 std::vector<std::string> keys;
210     keys.push_back(at1);
211     keys.push_back(at2);
212     keys.push_back(at3);
213     keys.push_back(at4);
214     return torsionTypeCont_.add(keys, torsionType);
215 gezelter 2204 }
216 gezelter 1711
217 chuckv 3153 bool ForceField::addNonBondedInteractionType(const std::string &at1, const std::string &at2, NonBondedInteractionType* nbiType) {
218     std::vector<std::string> keys;
219     keys.push_back(at1);
220     keys.push_back(at2);
221     return nonBondedInteractionTypeCont_.add(keys, nbiType);
222    
223     }
224    
225 tim 2759 RealType ForceField::getRcutFromAtomType(AtomType* at) {
226 gezelter 1930 /**@todo */
227     GenericData* data;
228 tim 2759 RealType rcut = 0.0;
229 gezelter 1711
230 gezelter 1930 if (at->isLennardJones()) {
231 gezelter 2204 data = at->getPropertyByName("LennardJones");
232     if (data != NULL) {
233     LJParamGenericData* ljData = dynamic_cast<LJParamGenericData*>(data);
234 gezelter 1711
235 gezelter 2204 if (ljData != NULL) {
236     LJParam ljParam = ljData->getData();
237 gezelter 1711
238 gezelter 2204 //by default use 2.5*sigma as cutoff radius
239     rcut = 2.5 * ljParam.sigma;
240 gezelter 1930
241 gezelter 2204 } else {
242     sprintf( painCave.errMsg,
243     "Can not cast GenericData to LJParam\n");
244     painCave.severity = OOPSE_ERROR;
245     painCave.isFatal = 1;
246     simError();
247     }
248     } else {
249     sprintf( painCave.errMsg, "Can not find Parameters for LennardJones\n");
250     painCave.severity = OOPSE_ERROR;
251     painCave.isFatal = 1;
252     simError();
253     }
254 gezelter 1930 }
255 gezelter 1711
256 gezelter 1930 return rcut;
257 gezelter 2204 }
258 gezelter 1711
259 gezelter 1930
260 gezelter 2204 ifstrstream* ForceField::openForceFieldFile(const std::string& filename) {
261 gezelter 1930 std::string forceFieldFilename(filename);
262     ifstrstream* ffStream = new ifstrstream();
263    
264     //try to open the force filed file in current directory first
265     ffStream->open(forceFieldFilename.c_str());
266     if(!ffStream->is_open()){
267    
268 gezelter 2204 forceFieldFilename = ffPath_ + "/" + forceFieldFilename;
269     ffStream->open( forceFieldFilename.c_str() );
270 gezelter 1930
271 gezelter 2204 //if current directory does not contain the force field file,
272     //try to open it in the path
273     if(!ffStream->is_open()){
274 gezelter 1930
275 gezelter 2204 sprintf( painCave.errMsg,
276     "Error opening the force field parameter file:\n"
277     "\t%s\n"
278     "\tHave you tried setting the FORCE_PARAM_PATH environment "
279     "variable?\n",
280     forceFieldFilename.c_str() );
281     painCave.severity = OOPSE_ERROR;
282     painCave.isFatal = 1;
283     simError();
284     }
285 gezelter 1930 }
286    
287     return ffStream;
288    
289 gezelter 2204 }
290 gezelter 1930
291 chuckv 2520 void ForceField::setFortranForceOptions(){
292     ForceOptions theseFortranOptions;
293     forceFieldOptions_.makeFortranOptions(theseFortranOptions);
294     setfForceOptions(&theseFortranOptions);
295     }
296 gezelter 1930 } //end namespace oopse