ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/io/NonBondedInteractionsSectionParser.cpp
Revision: 1725
Committed: Sat May 26 18:13:43 2012 UTC (12 years, 11 months ago) by gezelter
File size: 7144 byte(s)
Log Message:
Individual ForceField classes have been removed (they were essentially
all duplicates anyway).  

ForceField has moved to brains, and since only one force field is in
play at any time, the ForceFieldFactory and Register methods have been
removed.  


File Contents

# User Rev Content
1 gezelter 1501 /*
2     * Copyright (c) 2007 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 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 1501 */
42    
43     #include "io/NonBondedInteractionsSectionParser.hpp"
44     #include "types/AtomType.hpp"
45 gezelter 1664 #include "types/MorseInteractionType.hpp"
46 gezelter 1501 #include "types/MAWInteractionType.hpp"
47     #include "types/LennardJonesInteractionType.hpp"
48 gezelter 1624 #include "types/RepulsivePowerInteractionType.hpp"
49 gezelter 1725 #include "brains/ForceField.hpp"
50 gezelter 1501 #include "utils/simError.h"
51     namespace OpenMD {
52    
53     NonBondedInteractionsSectionParser::NonBondedInteractionsSectionParser(ForceFieldOptions& options) : options_(options){
54     setSectionName("NonBondedInteractions");
55    
56     stringToEnumMap_["MAW"] = MAW;
57 gezelter 1624 stringToEnumMap_["ShiftedMorse"] = ShiftedMorse;
58 gezelter 1501 stringToEnumMap_["LennardJones"] = LennardJones;
59     stringToEnumMap_["RepulsiveMorse"] = RepulsiveMorse;
60 gezelter 1624 stringToEnumMap_["RepulsivePower"] = RepulsivePower;
61 gezelter 1501
62     }
63    
64     void NonBondedInteractionsSectionParser::parseLine(ForceField& ff,const std::string& line, int lineNo){
65     StringTokenizer tokenizer(line);
66     NonBondedInteractionType* nbiType = NULL;
67     int nTokens = tokenizer.countTokens();
68    
69     if (nTokens < 3) {
70     sprintf(painCave.errMsg, "NonBondedInteractionsSectionParser Error: Not enough tokens at line %d\n",
71     lineNo);
72     painCave.isFatal = 1;
73     simError();
74     }
75    
76     std::string at1 = tokenizer.nextToken();
77     std::string at2 = tokenizer.nextToken();
78     std::string itype = tokenizer.nextToken();
79    
80     NonBondedInteractionTypeEnum nbit = getNonBondedInteractionTypeEnum(itype);
81     nTokens -= 3;
82     NonBondedInteractionType* interactionType;
83    
84     //switch is a nightmare to maintain
85     switch(nbit) {
86     case MAW :
87     if (nTokens < 5) {
88     sprintf(painCave.errMsg, "NonBondedInteractionsSectionParser Error: Not enough tokens at line %d\n",
89     lineNo);
90     painCave.isFatal = 1;
91     simError();
92     } else {
93     RealType r_e = tokenizer.nextTokenAsDouble();
94     RealType D_e = tokenizer.nextTokenAsDouble();
95     RealType beta = tokenizer.nextTokenAsDouble();
96     RealType ca1 = tokenizer.nextTokenAsDouble();
97     RealType cb1 = tokenizer.nextTokenAsDouble();
98     interactionType = new MAWInteractionType(D_e, beta, r_e, ca1, cb1);
99     }
100     break;
101    
102     case ShiftedMorse :
103     if (nTokens < 3) {
104     sprintf(painCave.errMsg, "NonBondedInteractionsSectionParser Error: Not enough tokens at line %d\n",
105     lineNo);
106     painCave.isFatal = 1;
107     simError();
108     } else {
109     RealType r0 = tokenizer.nextTokenAsDouble();
110     RealType D0 = tokenizer.nextTokenAsDouble();
111     RealType beta0 = tokenizer.nextTokenAsDouble();
112 gezelter 1664 interactionType = new MorseInteractionType(D0, beta0, r0, mtShifted);
113 gezelter 1501 }
114     break;
115    
116     case RepulsiveMorse :
117     if (nTokens < 3) {
118     sprintf(painCave.errMsg, "NonBondedInteractionsSectionParser Error: Not enough tokens at line %d\n",
119     lineNo);
120     painCave.isFatal = 1;
121     simError();
122     } else {
123     RealType r0 = tokenizer.nextTokenAsDouble();
124     RealType D0 = tokenizer.nextTokenAsDouble();
125     RealType beta0 = tokenizer.nextTokenAsDouble();
126 gezelter 1664 interactionType = new MorseInteractionType(D0, beta0, r0, mtRepulsive);
127 gezelter 1501 }
128     break;
129    
130     case LennardJones :
131     if (nTokens < 2) {
132     sprintf(painCave.errMsg, "NonBondedInteractionsSectionParser Error: Not enough tokens at line %d\n",
133     lineNo);
134     painCave.isFatal = 1;
135     simError();
136     } else {
137     RealType sigma = tokenizer.nextTokenAsDouble();
138     RealType epsilon = tokenizer.nextTokenAsDouble();
139     interactionType = new LennardJonesInteractionType(sigma, epsilon);
140     }
141     break;
142 gezelter 1624
143     case RepulsivePower :
144     if (nTokens < 3) {
145     sprintf(painCave.errMsg, "NonBondedInteractionsSectionParser Error: Not enough tokens at line %d\n",
146     lineNo);
147     painCave.isFatal = 1;
148     simError();
149     } else {
150     RealType sigma = tokenizer.nextTokenAsDouble();
151     RealType epsilon = tokenizer.nextTokenAsDouble();
152     int nRep = tokenizer.nextTokenAsInt();
153     interactionType = new RepulsivePowerInteractionType(sigma, epsilon, nRep);
154     }
155     break;
156 gezelter 1501
157     case Unknown :
158     default:
159     sprintf(painCave.errMsg, "NonBondedInteractionsSectionParser Error: Unknown Interaction Type at line %d\n",
160     lineNo);
161     painCave.isFatal = 1;
162     simError();
163    
164     break;
165    
166     }
167    
168     if (interactionType != NULL) {
169     ff.addNonBondedInteractionType(at1, at2, interactionType);
170     }
171    
172     }
173    
174     NonBondedInteractionsSectionParser::NonBondedInteractionTypeEnum NonBondedInteractionsSectionParser::getNonBondedInteractionTypeEnum(const std::string& str) {
175     std::map<std::string, NonBondedInteractionTypeEnum>::iterator i;
176     i = stringToEnumMap_.find(str);
177    
178     return i == stringToEnumMap_.end() ? Unknown : i->second;
179     }
180    
181     } //end namespace OpenMD
182    

Properties

Name Value
svn:eol-style native