ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/brains/ForceField.cpp
Revision: 1790
Committed: Thu Aug 30 17:18:22 2012 UTC (12 years, 8 months ago) by gezelter
File size: 25826 byte(s)
Log Message:
Various Windows compilation fixes

File Contents

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

Properties

Name Value
svn:keywords Author Id Revision Date