ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/brains/ForceField.cpp
Revision: 1808
Committed: Mon Oct 22 20:42:10 2012 UTC (12 years, 6 months ago) by gezelter
File size: 25718 byte(s)
Log Message:
A bug fix in the electric field for the new electrostatic code.  Also comment fixes for Doxygen 

File Contents

# User Rev Content
1 gezelter 507 /*
2 gezelter 246 * 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 gezelter 1390 * 1. Redistributions of source code must retain the above copyright
10 gezelter 246 * notice, this list of conditions and the following disclaimer.
11     *
12 gezelter 1390 * 2. Redistributions in binary form must reproduce the above copyright
13 gezelter 246 * 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 gezelter 1390 *
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 gezelter 1665 * [4] Kuang & Gezelter, J. Chem. Phys. 133, 164101 (2010).
40     * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
41 gezelter 246 */
42    
43 gezelter 507 /**
44     * @file ForceField.cpp
45     * @author tlin
46     * @date 11/04/2004
47     * @version 1.0
48     */
49 gezelter 246
50 gezelter 1269 #include <algorithm>
51 gezelter 1725 #include "brains/ForceField.hpp"
52 gezelter 246 #include "utils/simError.h"
53 gezelter 1725
54     #include "io/OptionSectionParser.hpp"
55     #include "io/BaseAtomTypesSectionParser.hpp"
56     #include "io/DirectionalAtomTypesSectionParser.hpp"
57     #include "io/AtomTypesSectionParser.hpp"
58     #include "io/BendTypesSectionParser.hpp"
59     #include "io/BondTypesSectionParser.hpp"
60     #include "io/ChargeAtomTypesSectionParser.hpp"
61     #include "io/EAMAtomTypesSectionParser.hpp"
62     #include "io/FluctuatingChargeAtomTypesSectionParser.hpp"
63     #include "io/GayBerneAtomTypesSectionParser.hpp"
64     #include "io/InversionTypesSectionParser.hpp"
65     #include "io/LennardJonesAtomTypesSectionParser.hpp"
66     #include "io/MultipoleAtomTypesSectionParser.hpp"
67     #include "io/NonBondedInteractionsSectionParser.hpp"
68     #include "io/PolarizableAtomTypesSectionParser.hpp"
69     #include "io/SCAtomTypesSectionParser.hpp"
70     #include "io/ShapeAtomTypesSectionParser.hpp"
71     #include "io/StickyAtomTypesSectionParser.hpp"
72     #include "io/StickyPowerAtomTypesSectionParser.hpp"
73     #include "io/TorsionTypesSectionParser.hpp"
74    
75 gezelter 1710 #include "types/LennardJonesAdapter.hpp"
76 gezelter 1725 #include "types/EAMAdapter.hpp"
77     #include "types/SuttonChenAdapter.hpp"
78     #include "types/GayBerneAdapter.hpp"
79     #include "types/StickyAdapter.hpp"
80 gezelter 1710
81 gezelter 1390 namespace OpenMD {
82 gezelter 206
83 gezelter 1725 ForceField::ForceField(std::string ffName) {
84 gezelter 1460
85 gezelter 246 char* tempPath;
86     tempPath = getenv("FORCE_PARAM_PATH");
87 gezelter 1460
88 gezelter 246 if (tempPath == NULL) {
89 gezelter 1460 //convert a macro from compiler to a string in c++
90     STR_DEFINE(ffPath_, FRC_PATH );
91 gezelter 246 } else {
92 gezelter 507 ffPath_ = tempPath;
93 gezelter 246 }
94 gezelter 1725
95     setForceFieldFileName(ffName + ".frc");
96    
97     /**
98     * The order of adding section parsers is important.
99     *
100     * OptionSectionParser must come first to set options for other
101     * parsers
102     *
103     * DirectionalAtomTypesSectionParser should be added before
104     * AtomTypesSectionParser, and these two section parsers will
105     * actually create "real" AtomTypes (AtomTypesSectionParser will
106     * create AtomType and DirectionalAtomTypesSectionParser will
107     * create DirectionalAtomType, which is a subclass of AtomType and
108     * should come first).
109     *
110     * Other AtomTypes Section Parsers will not create the "real"
111     * AtomType, they only add and set some attributes of the AtomType
112     * (via the Adapters). Thus ordering of these is not important.
113     * AtomTypesSectionParser should be added before other atom type
114     *
115     * The order of BondTypesSectionParser, BendTypesSectionParser and
116     * TorsionTypesSectionParser, etc. are not important.
117     */
118    
119     spMan_.push_back(new OptionSectionParser(forceFieldOptions_));
120     spMan_.push_back(new BaseAtomTypesSectionParser());
121     spMan_.push_back(new DirectionalAtomTypesSectionParser(forceFieldOptions_));
122     spMan_.push_back(new AtomTypesSectionParser());
123    
124     spMan_.push_back(new LennardJonesAtomTypesSectionParser(forceFieldOptions_));
125     spMan_.push_back(new ChargeAtomTypesSectionParser(forceFieldOptions_));
126     spMan_.push_back(new MultipoleAtomTypesSectionParser(forceFieldOptions_));
127     spMan_.push_back(new FluctuatingChargeAtomTypesSectionParser(forceFieldOptions_));
128     spMan_.push_back(new PolarizableAtomTypesSectionParser(forceFieldOptions_));
129     spMan_.push_back(new GayBerneAtomTypesSectionParser(forceFieldOptions_));
130     spMan_.push_back(new EAMAtomTypesSectionParser(forceFieldOptions_));
131     spMan_.push_back(new SCAtomTypesSectionParser(forceFieldOptions_));
132     spMan_.push_back(new ShapeAtomTypesSectionParser(forceFieldOptions_));
133     spMan_.push_back(new StickyAtomTypesSectionParser(forceFieldOptions_));
134     spMan_.push_back(new StickyPowerAtomTypesSectionParser(forceFieldOptions_));
135    
136     spMan_.push_back(new BondTypesSectionParser(forceFieldOptions_));
137     spMan_.push_back(new BendTypesSectionParser(forceFieldOptions_));
138     spMan_.push_back(new TorsionTypesSectionParser(forceFieldOptions_));
139     spMan_.push_back(new InversionTypesSectionParser(forceFieldOptions_));
140    
141     spMan_.push_back(new NonBondedInteractionsSectionParser(forceFieldOptions_));
142 gezelter 507 }
143 gezelter 206
144 gezelter 1725 void ForceField::parse(const std::string& filename) {
145     ifstrstream* ffStream;
146    
147     ffStream = openForceFieldFile(filename);
148    
149     spMan_.parse(*ffStream, *this);
150    
151     ForceField::AtomTypeContainer::MapTypeIterator i;
152     AtomType* at;
153    
154     for (at = atomTypeCont_.beginType(i); at != NULL;
155     at = atomTypeCont_.nextType(i)) {
156    
157     // useBase sets the responsibilities, and these have to be done
158     // after the atomTypes and Base types have all been scanned:
159    
160     std::vector<AtomType*> ayb = at->allYourBase();
161     if (ayb.size() > 1) {
162     for (int j = ayb.size()-1; j > 0; j--) {
163    
164     ayb[j-1]->useBase(ayb[j]);
165    
166     }
167     }
168     }
169    
170     delete ffStream;
171     }
172    
173 gezelter 1535 /**
174     * getAtomType by string
175     *
176     * finds the requested atom type in this force field using the string
177     * name of the atom type.
178     */
179 gezelter 507 AtomType* ForceField::getAtomType(const std::string &at) {
180 gezelter 246 std::vector<std::string> keys;
181     keys.push_back(at);
182     return atomTypeCont_.find(keys);
183 gezelter 507 }
184 gezelter 206
185 gezelter 1535 /**
186     * getAtomType by ident
187     *
188     * finds the requested atom type in this force field using the
189     * integer ident instead of the string name of the atom type.
190     */
191     AtomType* ForceField::getAtomType(int ident) {
192     std::string at = atypeIdentToName.find(ident)->second;
193     return getAtomType(at);
194     }
195    
196 cpuglis 1195 BondType* ForceField::getBondType(const std::string &at1,
197     const std::string &at2) {
198 gezelter 246 std::vector<std::string> keys;
199     keys.push_back(at1);
200     keys.push_back(at2);
201 gezelter 206
202 gezelter 246 //try exact match first
203     BondType* bondType = bondTypeCont_.find(keys);
204     if (bondType) {
205 gezelter 507 return bondType;
206 gezelter 246 } else {
207 gezelter 1269 AtomType* atype1;
208     AtomType* atype2;
209     std::vector<std::string> at1key;
210     at1key.push_back(at1);
211     atype1 = atomTypeCont_.find(at1key);
212    
213     std::vector<std::string> at2key;
214     at2key.push_back(at2);
215     atype2 = atomTypeCont_.find(at2key);
216    
217     // query atom types for their chains of responsibility
218     std::vector<AtomType*> at1Chain = atype1->allYourBase();
219     std::vector<AtomType*> at2Chain = atype2->allYourBase();
220    
221     std::vector<AtomType*>::iterator i;
222     std::vector<AtomType*>::iterator j;
223    
224     int ii = 0;
225     int jj = 0;
226     int bondTypeScore;
227    
228     std::vector<std::pair<int, std::vector<std::string> > > foundBonds;
229    
230     for (i = at1Chain.begin(); i != at1Chain.end(); i++) {
231     jj = 0;
232     for (j = at2Chain.begin(); j != at2Chain.end(); j++) {
233    
234     bondTypeScore = ii + jj;
235    
236     std::vector<std::string> myKeys;
237     myKeys.push_back((*i)->getName());
238     myKeys.push_back((*j)->getName());
239    
240     BondType* bondType = bondTypeCont_.find(myKeys);
241     if (bondType) {
242     foundBonds.push_back(std::make_pair(bondTypeScore, myKeys));
243     }
244     jj++;
245     }
246     ii++;
247     }
248    
249    
250 gezelter 1277 if (foundBonds.size() > 0) {
251     // sort the foundBonds by the score:
252     std::sort(foundBonds.begin(), foundBonds.end());
253    
254     int bestScore = foundBonds[0].first;
255     std::vector<std::string> theKeys = foundBonds[0].second;
256    
257     BondType* bestType = bondTypeCont_.find(theKeys);
258    
259     return bestType;
260     } else {
261     //if no exact match found, try wild card match
262     return bondTypeCont_.find(keys, wildCardAtomTypeName_);
263 gezelter 1269 }
264 gezelter 246 }
265 gezelter 507 }
266 gezelter 1269
267 cpuglis 1195 BendType* ForceField::getBendType(const std::string &at1,
268     const std::string &at2,
269 gezelter 507 const std::string &at3) {
270 gezelter 246 std::vector<std::string> keys;
271     keys.push_back(at1);
272     keys.push_back(at2);
273     keys.push_back(at3);
274 gezelter 206
275 gezelter 246 //try exact match first
276     BendType* bendType = bendTypeCont_.find(keys);
277     if (bendType) {
278 gezelter 507 return bendType;
279 gezelter 246 } else {
280 gezelter 1269
281     AtomType* atype1;
282     AtomType* atype2;
283     AtomType* atype3;
284     std::vector<std::string> at1key;
285     at1key.push_back(at1);
286     atype1 = atomTypeCont_.find(at1key);
287    
288     std::vector<std::string> at2key;
289     at2key.push_back(at2);
290     atype2 = atomTypeCont_.find(at2key);
291    
292     std::vector<std::string> at3key;
293     at3key.push_back(at3);
294     atype3 = atomTypeCont_.find(at3key);
295    
296     // query atom types for their chains of responsibility
297     std::vector<AtomType*> at1Chain = atype1->allYourBase();
298     std::vector<AtomType*> at2Chain = atype2->allYourBase();
299     std::vector<AtomType*> at3Chain = atype3->allYourBase();
300    
301     std::vector<AtomType*>::iterator i;
302     std::vector<AtomType*>::iterator j;
303     std::vector<AtomType*>::iterator k;
304    
305     int ii = 0;
306     int jj = 0;
307     int kk = 0;
308     int IKscore;
309    
310     std::vector<tuple3<int, int, std::vector<std::string> > > foundBends;
311    
312     for (j = at2Chain.begin(); j != at2Chain.end(); j++) {
313     ii = 0;
314     for (i = at1Chain.begin(); i != at1Chain.end(); i++) {
315     kk = 0;
316     for (k = at3Chain.begin(); k != at3Chain.end(); k++) {
317    
318     IKscore = ii + kk;
319    
320     std::vector<std::string> myKeys;
321     myKeys.push_back((*i)->getName());
322     myKeys.push_back((*j)->getName());
323     myKeys.push_back((*k)->getName());
324    
325     BendType* bendType = bendTypeCont_.find(myKeys);
326     if (bendType) {
327     foundBends.push_back( make_tuple3(jj, IKscore, myKeys) );
328     }
329     kk++;
330     }
331     ii++;
332     }
333     jj++;
334     }
335    
336 gezelter 1277 if (foundBends.size() > 0) {
337     std::sort(foundBends.begin(), foundBends.end());
338     int jscore = foundBends[0].first;
339     int ikscore = foundBends[0].second;
340 cli2 1289 std::vector<std::string> theKeys = foundBends[0].third;
341 gezelter 1277
342     BendType* bestType = bendTypeCont_.find(theKeys);
343     return bestType;
344     } else {
345 gezelter 1269 //if no exact match found, try wild card match
346     return bendTypeCont_.find(keys, wildCardAtomTypeName_);
347     }
348 gezelter 246 }
349 gezelter 507 }
350 gezelter 206
351 cpuglis 1195 TorsionType* ForceField::getTorsionType(const std::string &at1,
352     const std::string &at2,
353     const std::string &at3,
354     const std::string &at4) {
355 gezelter 246 std::vector<std::string> keys;
356     keys.push_back(at1);
357     keys.push_back(at2);
358     keys.push_back(at3);
359     keys.push_back(at4);
360 gezelter 206
361 gezelter 1269
362     //try exact match first
363 gezelter 246 TorsionType* torsionType = torsionTypeCont_.find(keys);
364     if (torsionType) {
365 gezelter 507 return torsionType;
366 gezelter 246 } else {
367 gezelter 1269
368     AtomType* atype1;
369     AtomType* atype2;
370     AtomType* atype3;
371     AtomType* atype4;
372     std::vector<std::string> at1key;
373     at1key.push_back(at1);
374     atype1 = atomTypeCont_.find(at1key);
375    
376     std::vector<std::string> at2key;
377     at2key.push_back(at2);
378     atype2 = atomTypeCont_.find(at2key);
379    
380     std::vector<std::string> at3key;
381     at3key.push_back(at3);
382     atype3 = atomTypeCont_.find(at3key);
383    
384     std::vector<std::string> at4key;
385     at4key.push_back(at4);
386     atype4 = atomTypeCont_.find(at4key);
387    
388     // query atom types for their chains of responsibility
389     std::vector<AtomType*> at1Chain = atype1->allYourBase();
390     std::vector<AtomType*> at2Chain = atype2->allYourBase();
391     std::vector<AtomType*> at3Chain = atype3->allYourBase();
392     std::vector<AtomType*> at4Chain = atype4->allYourBase();
393    
394     std::vector<AtomType*>::iterator i;
395     std::vector<AtomType*>::iterator j;
396     std::vector<AtomType*>::iterator k;
397     std::vector<AtomType*>::iterator l;
398    
399     int ii = 0;
400     int jj = 0;
401     int kk = 0;
402     int ll = 0;
403     int ILscore;
404     int JKscore;
405    
406     std::vector<tuple3<int, int, std::vector<std::string> > > foundTorsions;
407    
408     for (j = at2Chain.begin(); j != at2Chain.end(); j++) {
409     kk = 0;
410     for (k = at3Chain.begin(); k != at3Chain.end(); k++) {
411     ii = 0;
412     for (i = at1Chain.begin(); i != at1Chain.end(); i++) {
413     ll = 0;
414     for (l = at4Chain.begin(); l != at4Chain.end(); l++) {
415    
416     ILscore = ii + ll;
417     JKscore = jj + kk;
418    
419     std::vector<std::string> myKeys;
420     myKeys.push_back((*i)->getName());
421     myKeys.push_back((*j)->getName());
422     myKeys.push_back((*k)->getName());
423     myKeys.push_back((*l)->getName());
424    
425     TorsionType* torsionType = torsionTypeCont_.find(myKeys);
426     if (torsionType) {
427     foundTorsions.push_back( make_tuple3(JKscore, ILscore, myKeys) );
428     }
429     ll++;
430     }
431     ii++;
432     }
433     kk++;
434     }
435     jj++;
436     }
437    
438 gezelter 1277 if (foundTorsions.size() > 0) {
439     std::sort(foundTorsions.begin(), foundTorsions.end());
440     int jkscore = foundTorsions[0].first;
441     int ilscore = foundTorsions[0].second;
442     std::vector<std::string> theKeys = foundTorsions[0].third;
443    
444     TorsionType* bestType = torsionTypeCont_.find(theKeys);
445     return bestType;
446 gezelter 1269 } else {
447     //if no exact match found, try wild card match
448     return torsionTypeCont_.find(keys, wildCardAtomTypeName_);
449     }
450 gezelter 246 }
451 gezelter 507 }
452 gezelter 206
453 cli2 1275 InversionType* ForceField::getInversionType(const std::string &at1,
454     const std::string &at2,
455     const std::string &at3,
456     const std::string &at4) {
457     std::vector<std::string> keys;
458     keys.push_back(at1);
459     keys.push_back(at2);
460     keys.push_back(at3);
461     keys.push_back(at4);
462    
463     //try exact match first
464 cli2 1303 InversionType* inversionType = inversionTypeCont_.permutedFindSkippingFirstElement(keys);
465 cli2 1275 if (inversionType) {
466     return inversionType;
467     } else {
468    
469     AtomType* atype1;
470     AtomType* atype2;
471     AtomType* atype3;
472     AtomType* atype4;
473     std::vector<std::string> at1key;
474     at1key.push_back(at1);
475     atype1 = atomTypeCont_.find(at1key);
476    
477     std::vector<std::string> at2key;
478     at2key.push_back(at2);
479     atype2 = atomTypeCont_.find(at2key);
480    
481     std::vector<std::string> at3key;
482     at3key.push_back(at3);
483     atype3 = atomTypeCont_.find(at3key);
484    
485     std::vector<std::string> at4key;
486     at4key.push_back(at4);
487     atype4 = atomTypeCont_.find(at4key);
488    
489     // query atom types for their chains of responsibility
490     std::vector<AtomType*> at1Chain = atype1->allYourBase();
491     std::vector<AtomType*> at2Chain = atype2->allYourBase();
492     std::vector<AtomType*> at3Chain = atype3->allYourBase();
493     std::vector<AtomType*> at4Chain = atype4->allYourBase();
494    
495     std::vector<AtomType*>::iterator i;
496     std::vector<AtomType*>::iterator j;
497     std::vector<AtomType*>::iterator k;
498     std::vector<AtomType*>::iterator l;
499    
500     int ii = 0;
501     int jj = 0;
502     int kk = 0;
503     int ll = 0;
504     int Iscore;
505     int JKLscore;
506    
507     std::vector<tuple3<int, int, std::vector<std::string> > > foundInversions;
508    
509     for (j = at2Chain.begin(); j != at2Chain.end(); j++) {
510     kk = 0;
511     for (k = at3Chain.begin(); k != at3Chain.end(); k++) {
512     ii = 0;
513     for (i = at1Chain.begin(); i != at1Chain.end(); i++) {
514     ll = 0;
515     for (l = at4Chain.begin(); l != at4Chain.end(); l++) {
516    
517     Iscore = ii;
518     JKLscore = jj + kk + ll;
519    
520     std::vector<std::string> myKeys;
521     myKeys.push_back((*i)->getName());
522     myKeys.push_back((*j)->getName());
523     myKeys.push_back((*k)->getName());
524     myKeys.push_back((*l)->getName());
525    
526 cli2 1303 InversionType* inversionType = inversionTypeCont_.permutedFindSkippingFirstElement(myKeys);
527 cli2 1275 if (inversionType) {
528     foundInversions.push_back( make_tuple3(Iscore, JKLscore, myKeys) );
529     }
530     ll++;
531     }
532     ii++;
533     }
534     kk++;
535     }
536     jj++;
537     }
538 gezelter 1277
539     if (foundInversions.size() > 0) {
540     std::sort(foundInversions.begin(), foundInversions.end());
541     int iscore = foundInversions[0].first;
542     int jklscore = foundInversions[0].second;
543     std::vector<std::string> theKeys = foundInversions[0].third;
544    
545 cli2 1303 InversionType* bestType = inversionTypeCont_.permutedFindSkippingFirstElement(theKeys);
546 gezelter 1277 return bestType;
547 cli2 1275 } else {
548     //if no exact match found, try wild card match
549     return inversionTypeCont_.find(keys, wildCardAtomTypeName_);
550     }
551     }
552     }
553    
554 chuckv 1151 NonBondedInteractionType* ForceField::getNonBondedInteractionType(const std::string &at1, const std::string &at2) {
555 gezelter 1629
556 chuckv 1151 std::vector<std::string> keys;
557     keys.push_back(at1);
558     keys.push_back(at2);
559 gezelter 1629
560 chuckv 1151 //try exact match first
561     NonBondedInteractionType* nbiType = nonBondedInteractionTypeCont_.find(keys);
562     if (nbiType) {
563     return nbiType;
564     } else {
565 gezelter 1629 AtomType* atype1;
566     AtomType* atype2;
567     std::vector<std::string> at1key;
568     at1key.push_back(at1);
569     atype1 = atomTypeCont_.find(at1key);
570    
571     std::vector<std::string> at2key;
572     at2key.push_back(at2);
573     atype2 = atomTypeCont_.find(at2key);
574    
575     // query atom types for their chains of responsibility
576     std::vector<AtomType*> at1Chain = atype1->allYourBase();
577     std::vector<AtomType*> at2Chain = atype2->allYourBase();
578    
579     std::vector<AtomType*>::iterator i;
580     std::vector<AtomType*>::iterator j;
581    
582     int ii = 0;
583     int jj = 0;
584     int nbiTypeScore;
585    
586     std::vector<std::pair<int, std::vector<std::string> > > foundNBI;
587    
588     for (i = at1Chain.begin(); i != at1Chain.end(); i++) {
589     jj = 0;
590     for (j = at2Chain.begin(); j != at2Chain.end(); j++) {
591    
592     nbiTypeScore = ii + jj;
593    
594     std::vector<std::string> myKeys;
595     myKeys.push_back((*i)->getName());
596     myKeys.push_back((*j)->getName());
597    
598     NonBondedInteractionType* nbiType = nonBondedInteractionTypeCont_.find(myKeys);
599     if (nbiType) {
600     foundNBI.push_back(std::make_pair(nbiTypeScore, myKeys));
601     }
602     jj++;
603     }
604     ii++;
605     }
606    
607    
608     if (foundNBI.size() > 0) {
609     // sort the foundNBI by the score:
610     std::sort(foundNBI.begin(), foundNBI.end());
611    
612     int bestScore = foundNBI[0].first;
613     std::vector<std::string> theKeys = foundNBI[0].second;
614    
615     NonBondedInteractionType* bestType = nonBondedInteractionTypeCont_.find(theKeys);
616     return bestType;
617     } else {
618     //if no exact match found, try wild card match
619     return nonBondedInteractionTypeCont_.find(keys, wildCardAtomTypeName_);
620     }
621     }
622 chuckv 1151 }
623 cpuglis 1195
624     BondType* ForceField::getExactBondType(const std::string &at1,
625     const std::string &at2){
626 gezelter 246 std::vector<std::string> keys;
627     keys.push_back(at1);
628     keys.push_back(at2);
629     return bondTypeCont_.find(keys);
630 gezelter 507 }
631 cpuglis 1195
632     BendType* ForceField::getExactBendType(const std::string &at1,
633     const std::string &at2,
634 gezelter 507 const std::string &at3){
635 gezelter 246 std::vector<std::string> keys;
636     keys.push_back(at1);
637     keys.push_back(at2);
638     keys.push_back(at3);
639     return bendTypeCont_.find(keys);
640 gezelter 507 }
641 cpuglis 1195
642     TorsionType* ForceField::getExactTorsionType(const std::string &at1,
643     const std::string &at2,
644     const std::string &at3,
645     const std::string &at4){
646 gezelter 246 std::vector<std::string> keys;
647     keys.push_back(at1);
648     keys.push_back(at2);
649     keys.push_back(at3);
650     keys.push_back(at4);
651     return torsionTypeCont_.find(keys);
652 gezelter 507 }
653 cli2 1275
654     InversionType* ForceField::getExactInversionType(const std::string &at1,
655     const std::string &at2,
656     const std::string &at3,
657     const std::string &at4){
658     std::vector<std::string> keys;
659     keys.push_back(at1);
660     keys.push_back(at2);
661     keys.push_back(at3);
662     keys.push_back(at4);
663     return inversionTypeCont_.find(keys);
664     }
665    
666 chuckv 1151 NonBondedInteractionType* ForceField::getExactNonBondedInteractionType(const std::string &at1, const std::string &at2){
667     std::vector<std::string> keys;
668     keys.push_back(at1);
669     keys.push_back(at2);
670     return nonBondedInteractionTypeCont_.find(keys);
671     }
672 cli2 1275
673 chuckv 1151
674 gezelter 507 bool ForceField::addAtomType(const std::string &at, AtomType* atomType) {
675 gezelter 246 std::vector<std::string> keys;
676     keys.push_back(at);
677 gezelter 1535 atypeIdentToName[atomType->getIdent()] = at;
678 gezelter 246 return atomTypeCont_.add(keys, atomType);
679 gezelter 507 }
680 gezelter 206
681 gezelter 1282 bool ForceField::replaceAtomType(const std::string &at, AtomType* atomType) {
682     std::vector<std::string> keys;
683     keys.push_back(at);
684 gezelter 1535 atypeIdentToName[atomType->getIdent()] = at;
685 gezelter 1282 return atomTypeCont_.replace(keys, atomType);
686     }
687    
688 cpuglis 1195 bool ForceField::addBondType(const std::string &at1, const std::string &at2,
689     BondType* bondType) {
690 gezelter 246 std::vector<std::string> keys;
691     keys.push_back(at1);
692     keys.push_back(at2);
693 cpuglis 1195 return bondTypeCont_.add(keys, bondType);
694 gezelter 507 }
695 cpuglis 1195
696 gezelter 507 bool ForceField::addBendType(const std::string &at1, const std::string &at2,
697     const std::string &at3, BendType* bendType) {
698 gezelter 246 std::vector<std::string> keys;
699     keys.push_back(at1);
700     keys.push_back(at2);
701     keys.push_back(at3);
702     return bendTypeCont_.add(keys, bendType);
703 gezelter 507 }
704 cpuglis 1195
705     bool ForceField::addTorsionType(const std::string &at1,
706     const std::string &at2,
707     const std::string &at3,
708     const std::string &at4,
709     TorsionType* torsionType) {
710 gezelter 246 std::vector<std::string> keys;
711     keys.push_back(at1);
712     keys.push_back(at2);
713     keys.push_back(at3);
714     keys.push_back(at4);
715     return torsionTypeCont_.add(keys, torsionType);
716 gezelter 507 }
717 gezelter 206
718 cli2 1275 bool ForceField::addInversionType(const std::string &at1,
719     const std::string &at2,
720     const std::string &at3,
721     const std::string &at4,
722     InversionType* inversionType) {
723     std::vector<std::string> keys;
724     keys.push_back(at1);
725     keys.push_back(at2);
726     keys.push_back(at3);
727     keys.push_back(at4);
728     return inversionTypeCont_.add(keys, inversionType);
729     }
730    
731 cpuglis 1195 bool ForceField::addNonBondedInteractionType(const std::string &at1,
732     const std::string &at2,
733     NonBondedInteractionType* nbiType) {
734 chuckv 1151 std::vector<std::string> keys;
735     keys.push_back(at1);
736     keys.push_back(at2);
737     return nonBondedInteractionTypeCont_.add(keys, nbiType);
738     }
739 cpuglis 1195
740 tim 963 RealType ForceField::getRcutFromAtomType(AtomType* at) {
741 gezelter 1725 RealType rcut(0.0);
742 cpuglis 1195
743 gezelter 1710 LennardJonesAdapter lja = LennardJonesAdapter(at);
744     if (lja.isLennardJones()) {
745     rcut = 2.5 * lja.getSigma();
746 gezelter 246 }
747 gezelter 1725 EAMAdapter ea = EAMAdapter(at);
748     if (ea.isEAM()) {
749     rcut = max(rcut, ea.getRcut());
750     }
751     SuttonChenAdapter sca = SuttonChenAdapter(at);
752     if (sca.isSuttonChen()) {
753     rcut = max(rcut, 2.0 * sca.getAlpha());
754     }
755     GayBerneAdapter gba = GayBerneAdapter(at);
756     if (gba.isGayBerne()) {
757     rcut = max(rcut, 2.5 * sqrt(2.0) * max(gba.getD(), gba.getL()));
758     }
759     StickyAdapter sa = StickyAdapter(at);
760     if (sa.isSticky()) {
761     rcut = max(rcut, max(sa.getRu(), sa.getRup()));
762     }
763    
764 gezelter 246 return rcut;
765 gezelter 507 }
766 cpuglis 1195
767 gezelter 206
768 gezelter 507 ifstrstream* ForceField::openForceFieldFile(const std::string& filename) {
769 gezelter 246 std::string forceFieldFilename(filename);
770     ifstrstream* ffStream = new ifstrstream();
771    
772     //try to open the force filed file in current directory first
773     ffStream->open(forceFieldFilename.c_str());
774     if(!ffStream->is_open()){
775    
776 gezelter 507 forceFieldFilename = ffPath_ + "/" + forceFieldFilename;
777     ffStream->open( forceFieldFilename.c_str() );
778 gezelter 246
779 gezelter 507 //if current directory does not contain the force field file,
780     //try to open it in the path
781     if(!ffStream->is_open()){
782 gezelter 246
783 gezelter 507 sprintf( painCave.errMsg,
784     "Error opening the force field parameter file:\n"
785     "\t%s\n"
786     "\tHave you tried setting the FORCE_PARAM_PATH environment "
787     "variable?\n",
788     forceFieldFilename.c_str() );
789 gezelter 1390 painCave.severity = OPENMD_ERROR;
790 gezelter 507 painCave.isFatal = 1;
791     simError();
792     }
793 gezelter 246 }
794     return ffStream;
795 gezelter 507 }
796 gezelter 246
797 gezelter 1390 } //end namespace OpenMD

Properties

Name Value
svn:keywords Author Id Revision Date