ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/UseTheForce/ForceField.cpp
(Generate patch)

Comparing trunk/OOPSE-4/src/UseTheForce/ForceField.cpp (file contents):
Revision 1711 by gezelter, Thu Nov 4 20:51:23 2004 UTC vs.
Revision 1930 by gezelter, Wed Jan 12 22:41:40 2005 UTC

# Line 1 | Line 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
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 + /**
43 +  * @file ForceField.cpp
44 +  * @author tlin
45 +  * @date 11/04/2004
46 +  * @time 22:51am
47 +  * @version 1.0
48 +  */
49 +  
50   #include "UseTheForce/ForceField.hpp"
51 + #include "utils/simError.h"
52 + namespace oopse {
53  
54 < AtomType* ForceField::getMatchingAtomType(const string &at) {
54 > ForceField::ForceField() {
55 >    char* tempPath;
56 >    tempPath = getenv("FORCE_PARAM_PATH");
57  
58 <  map<string, AtomType*>::iterator iter;
59 <  
60 <  iter = atomTypeMap.find(at);
61 <  if (iter != atomTypeMap.end()) {
62 <    return iter->second;
63 <  } else {
11 <    return NULL;
12 <  }
58 >    if (tempPath == NULL) {
59 >        //convert a macro from compiler to a string in c++
60 >        STR_DEFINE(ffPath_, FRC_PATH );
61 >    } else {
62 >        ffPath_ = tempPath;
63 >    }
64   }
65  
66 < BondType* ForceField::getMatchingBondType(const string &at1,
67 <                                          const string &at2) {
66 > AtomType* ForceField::getAtomType(const std::string &at) {
67 >    std::vector<std::string> keys;
68 >    keys.push_back(at);
69 >    return atomTypeCont_.find(keys);
70 > }
71  
72 <  map<pair<string,string>, BondType*>::iterator iter;
73 <  vector<BondType*> foundTypes;
72 > BondType* ForceField::getBondType(const std::string &at1, const std::string &at2) {
73 >    std::vector<std::string> keys;
74 >    keys.push_back(at1);
75 >    keys.push_back(at2);    
76  
77 <  iter = bondTypeMap.find(pair<at1, at2>);
78 <  if (iter != bondTypeMap.end()) {
79 <    // exact match, so just return it
80 <    return iter->second;
81 <  }
77 >    //try exact match first
78 >    BondType* bondType = bondTypeCont_.find(keys);
79 >    if (bondType) {
80 >        return bondType;
81 >    } else {
82 >        //if no exact match found, try wild card match
83 >        return bondTypeCont_.find(keys, wildCardAtomTypeName_);
84 >    }
85  
86 <  iter = bondTypeMap.find(pair<at2, at1>);
28 <  if (iter != bondTypeMap.end()) {
29 <    // exact match in reverse order, so just return it
30 <    return iter->second;
31 <  }
86 > }
87  
88 <  iter = bondTypeMap.find(pair<at1, wildCardAtomTypeName>);
89 <  if (iter != bondTypeMap.end()) {
90 <    foundTypes.push_back(iter->second);
91 <  }
88 > BendType* ForceField::getBendType(const std::string &at1, const std::string &at2,
89 >                        const std::string &at3) {
90 >    std::vector<std::string> keys;
91 >    keys.push_back(at1);
92 >    keys.push_back(at2);    
93 >    keys.push_back(at3);    
94  
95 <  iter = bondTypeMap.find(pair<at2, wildCardAtomTypeName>);
96 <  if (iter != bondTypeMap.end()) {
97 <    foundTypes.push_back(iter->second);
98 <  }
95 >    //try exact match first
96 >    BendType* bendType = bendTypeCont_.find(keys);
97 >    if (bendType) {
98 >        return bendType;
99 >    } else {
100 >        //if no exact match found, try wild card match
101 >        return bendTypeCont_.find(keys, wildCardAtomTypeName_);
102 >    }
103 > }
104  
105 <  iter = bondTypeMap.find(pair<wildCardAtomTypeName, at1>);
106 <  if (iter != bondTypeMap.end()) {
107 <    foundTypes.push_back(iter->second);
108 <  }
105 > TorsionType* ForceField::getTorsionType(const std::string &at1, const std::string &at2,
106 >                              const std::string &at3, const std::string &at4) {
107 >    std::vector<std::string> keys;
108 >    keys.push_back(at1);
109 >    keys.push_back(at2);    
110 >    keys.push_back(at3);    
111 >    keys.push_back(at4);    
112  
113 <  iter = bondTypeMap.find(pair<wildCardAtomTypeName, at2>);
114 <  if (iter != bondTypeMap.end()) {
115 <    foundTypes.push_back(iter->second);
116 <  }
117 <  
118 <  if (foundTypes.empty()) {
119 <    return NULL;
55 <  } else {
113 >    TorsionType* torsionType = torsionTypeCont_.find(keys);
114 >    if (torsionType) {
115 >        return torsionType;
116 >    } else {
117 >        //if no exact match found, try wild card match
118 >        return torsionTypeCont_.find(keys, wildCardAtomTypeName_);
119 >    }
120      
121 +    return torsionTypeCont_.find(keys, wildCardAtomTypeName_);
122  
123 <
123 > }
124  
125 + BondType* ForceField::getExactBondType(const std::string &at1, const std::string &at2){
126 +    std::vector<std::string> keys;
127 +    keys.push_back(at1);
128 +    keys.push_back(at2);    
129 +    return bondTypeCont_.find(keys);
130 + }
131  
132 + BendType* ForceField::getExactBendType(const std::string &at1, const std::string &at2,
133 +                            const std::string &at3){
134 +    std::vector<std::string> keys;
135 +    keys.push_back(at1);
136 +    keys.push_back(at2);    
137 +    keys.push_back(at3);    
138 +    return bendTypeCont_.find(keys);
139 + }
140  
141 <  
141 > TorsionType* ForceField::getExactTorsionType(const std::string &at1, const std::string &at2,
142 >                                  const std::string &at3, const std::string &at4){
143 >    std::vector<std::string> keys;
144 >    keys.push_back(at1);
145 >    keys.push_back(at2);    
146 >    keys.push_back(at3);    
147 >    keys.push_back(at4);  
148 >    return torsionTypeCont_.find(keys);
149 > }
150 > bool ForceField::addAtomType(const std::string &at, AtomType* atomType) {
151 >    std::vector<std::string> keys;
152 >    keys.push_back(at);
153 >    return atomTypeCont_.add(keys, atomType);
154 > }
155  
156 + bool ForceField::addBondType(const std::string &at1, const std::string &at2, BondType* bondType) {
157 +    std::vector<std::string> keys;
158 +    keys.push_back(at1);
159 +    keys.push_back(at2);    
160 +    return bondTypeCont_.add(keys, bondType);
161  
162 < BendType* ForceField::getMatchingBendType(const string &at1, const string &at2,
66 <                                          const string &at3);
67 < TorsionType* ForceField::getMatchingTorsionType(const string &at1, const string &at2,
68 <                                                const string &at3, const string &at4);
162 > }
163  
164 < double ForceField::getRcutForAtomType(AtomType* at);
164 > bool ForceField::addBendType(const std::string &at1, const std::string &at2,
165 >                        const std::string &at3, BendType* bendType) {
166 >    std::vector<std::string> keys;
167 >    keys.push_back(at1);
168 >    keys.push_back(at2);    
169 >    keys.push_back(at3);    
170 >    return bendTypeCont_.add(keys, bendType);
171 > }
172  
173 + bool ForceField::addTorsionType(const std::string &at1, const std::string &at2,
174 +                              const std::string &at3, const std::string &at4, TorsionType* torsionType) {
175 +    std::vector<std::string> keys;
176 +    keys.push_back(at1);
177 +    keys.push_back(at2);    
178 +    keys.push_back(at3);    
179 +    keys.push_back(at4);    
180 +    return torsionTypeCont_.add(keys, torsionType);
181 + }
182  
183 < vector<vector<string> > generateWildcardSequence(const vector<string> atomTypes) {
184 <  
185 <   vector<vector<string> > results;
183 > double ForceField::getRcutFromAtomType(AtomType* at) {
184 >    /**@todo */
185 >    GenericData* data;
186 >    double rcut = 0.0;
187  
188 <  
188 >    if (at->isLennardJones()) {
189 >        data = at->getPropertyByName("LennardJones");
190 >        if (data != NULL) {
191 >            LJParamGenericData* ljData = dynamic_cast<LJParamGenericData*>(data);
192  
193 +            if (ljData != NULL) {
194 +                LJParam ljParam = ljData->getData();
195  
196 <   vector<vector< string> > getAllWildcardPermutations(const vector<string> myAts) {
197 <    
198 <     int nStrings;
199 <     vector<string> oneResult;
200 <     vector<vector<string> > allResults;
196 >                //by default use 2.5*sigma as cutoff radius
197 >                rcut = 2.5 * ljParam.sigma;
198 >                
199 >            } else {
200 >                    sprintf( painCave.errMsg,
201 >                           "Can not cast GenericData to LJParam\n");
202 >                    painCave.severity = OOPSE_ERROR;
203 >                    painCave.isFatal = 1;
204 >                    simError();          
205 >            }            
206 >        } else {
207 >            sprintf( painCave.errMsg, "Can not find Parameters for LennardJones\n");
208 >            painCave.severity = OOPSE_ERROR;
209 >            painCave.isFatal = 1;
210 >            simError();          
211 >        }
212 >    }
213  
214 <     nStrings = myAts.size();
214 >    return rcut;    
215 > }
216  
217 <     if (nStrings == 1) {
218 <       oneResult.push_back(wildcardCharacter);
219 <       allResults.push_back(oneResult);
220 <       return allResults;
221 <     } else {
222 <      
223 <       for (i=0; i < nStrings; i++) {
224 <         oneResult = myAts;
225 <         replace(oneResult.begin(), oneResult.end(),
217 >
218 > ifstrstream* ForceField::openForceFieldFile(const std::string& filename) {
219 >    std::string forceFieldFilename(filename);
220 >    ifstrstream* ffStream = new ifstrstream();
221 >    
222 >    //try to open the force filed file in current directory first    
223 >    ffStream->open(forceFieldFilename.c_str());
224 >    if(!ffStream->is_open()){
225 >
226 >        forceFieldFilename = ffPath_ + "/" + forceFieldFilename;
227 >        ffStream->open( forceFieldFilename.c_str() );
228 >
229 >        //if current directory does not contain the force field file,
230 >        //try to open it in the path        
231 >        if(!ffStream->is_open()){
232 >
233 >            sprintf( painCave.errMsg,
234 >               "Error opening the force field parameter file:\n"
235 >               "\t%s\n"
236 >               "\tHave you tried setting the FORCE_PARAM_PATH environment "
237 >               "variable?\n",
238 >               forceFieldFilename.c_str() );
239 >            painCave.severity = OOPSE_ERROR;
240 >            painCave.isFatal = 1;
241 >            simError();
242 >        }
243 >    }  
244 >
245 >    return ffStream;
246 >
247 > }
248 >
249 > } //end namespace oopse

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines