48#include "io/NonBondedInteractionsSectionParser.hpp"
51#include "types/AtomType.hpp"
52#include "types/BuckinghamInteractionType.hpp"
53#include "types/EAMInteractionType.hpp"
54#include "types/InversePowerSeriesInteractionType.hpp"
55#include "types/LennardJonesInteractionType.hpp"
56#include "types/MAWInteractionType.hpp"
57#include "types/MieInteractionType.hpp"
58#include "types/MorseInteractionType.hpp"
59#include "types/RepulsivePowerInteractionType.hpp"
60#include "utils/simError.h"
64 NonBondedInteractionsSectionParser::NonBondedInteractionsSectionParser(
67 setSectionName(
"NonBondedInteractions");
69 stringToEnumMap_[
"MAW"] = MAW;
70 stringToEnumMap_[
"ShiftedMorse"] = ShiftedMorse;
71 stringToEnumMap_[
"LennardJones"] = LennardJones;
72 stringToEnumMap_[
"RepulsiveMorse"] = RepulsiveMorse;
73 stringToEnumMap_[
"RepulsivePower"] = RepulsivePower;
74 stringToEnumMap_[
"Mie"] = Mie;
75 stringToEnumMap_[
"Buckingham"] = Buckingham;
76 stringToEnumMap_[
"EAMTable"] = EAMTable;
77 stringToEnumMap_[
"EAMZhou"] = EAMZhou;
78 stringToEnumMap_[
"EAMOxides"] = EAMOxides;
79 stringToEnumMap_[
"InversePowerSeries"] = InversePowerSeries;
82 void NonBondedInteractionsSectionParser::parseLine(ForceField& ff,
83 const std::string& line,
85 StringTokenizer tokenizer(line);
86 int nTokens = tokenizer.countTokens();
88 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
89 "NonBondedInteractionsSectionParser Error: Not enough tokens at "
96 meus_ = options_.getMetallicEnergyUnitScaling();
97 eus_ = options_.getEnergyUnitScaling();
98 dus_ = options_.getDistanceUnitScaling();
100 std::string at1 = tokenizer.nextToken();
101 std::string at2 = tokenizer.nextToken();
102 std::string itype = tokenizer.nextToken();
104 NonBondedInteractionTypeEnum nbit = getNonBondedInteractionTypeEnum(itype);
106 NonBondedInteractionType* interactionType = NULL;
112 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
113 "NonBondedInteractionsSectionParser Error: Token number "
115 "%d. 8 tokens expected. \n",
117 painCave.isFatal = 1;
120 RealType r_e = dus_ * tokenizer.nextTokenAsDouble();
121 RealType D_e = eus_ * tokenizer.nextTokenAsDouble();
122 RealType beta = tokenizer.nextTokenAsDouble() / dus_;
123 RealType ca1 = tokenizer.nextTokenAsDouble();
124 RealType cb1 = tokenizer.nextTokenAsDouble();
125 interactionType =
new MAWInteractionType(D_e, beta, r_e, ca1, cb1);
131 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
132 "NonBondedInteractionsSectionParser Error: Token number "
134 "%d. 6 tokens expected. \n",
136 painCave.isFatal = 1;
139 RealType r0 = dus_ * tokenizer.nextTokenAsDouble();
140 RealType D0 = eus_ * tokenizer.nextTokenAsDouble();
141 RealType beta0 = tokenizer.nextTokenAsDouble() / dus_;
142 interactionType =
new MorseInteractionType(D0, beta0, r0, mtShifted);
148 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
149 "NonBondedInteractionsSectionParser Error: Token number "
151 "%d. 6 tokens expected. \n",
153 painCave.isFatal = 1;
156 RealType r0 = dus_ * tokenizer.nextTokenAsDouble();
157 RealType D0 = eus_ * tokenizer.nextTokenAsDouble();
158 RealType beta0 = tokenizer.nextTokenAsDouble() / dus_;
159 interactionType =
new MorseInteractionType(D0, beta0, r0, mtRepulsive);
165 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
166 "NonBondedInteractionsSectionParser Error: Token number "
168 "%d. 5 tokens expected. \n",
170 painCave.isFatal = 1;
173 RealType sigma = dus_ * tokenizer.nextTokenAsDouble();
174 RealType epsilon = eus_ * tokenizer.nextTokenAsDouble();
175 interactionType =
new LennardJonesInteractionType(sigma, epsilon);
181 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
182 "NonBondedInteractionsSectionParser Error: Token number "
184 "%d. 6 tokens expected. \n",
186 painCave.isFatal = 1;
189 RealType sigma = dus_ * tokenizer.nextTokenAsDouble();
190 RealType epsilon = eus_ * tokenizer.nextTokenAsDouble();
191 int nRep = tokenizer.nextTokenAsInt();
193 new RepulsivePowerInteractionType(sigma, epsilon, nRep);
199 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
200 "NonBondedInteractionsSectionParser Error: Token number "
202 "%d. 7 tokens expected. \n",
204 painCave.isFatal = 1;
207 RealType sigma = dus_ * tokenizer.nextTokenAsDouble();
208 RealType epsilon = eus_ * tokenizer.nextTokenAsDouble();
209 int nRep = tokenizer.nextTokenAsInt();
210 int mAtt = tokenizer.nextTokenAsInt();
211 interactionType =
new MieInteractionType(sigma, epsilon, nRep, mAtt);
217 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
218 "NonBondedInteractionsSectionParser Error: Not enough tokens "
221 painCave.isFatal = 1;
224 std::string btype = tokenizer.nextToken();
227 RealType A = eus_ * tokenizer.nextTokenAsDouble();
228 RealType B = tokenizer.nextTokenAsDouble() / dus_;
230 tokenizer.nextTokenAsDouble();
231 RealType sigma = 0.0;
232 RealType epsilon = 0.0;
234 if (btype.compare(
"MODIFIED")) {
235 sigma = dus_ * tokenizer.nextTokenAsDouble();
236 epsilon = eus_ * tokenizer.nextTokenAsDouble();
237 interactionType =
new BuckinghamInteractionType(A, B, C, sigma,
238 epsilon, btModified);
240 }
else if (btype.compare(
"TRADITIONAL")) {
242 new BuckinghamInteractionType(A, B, C, btTraditional);
244 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
245 "NonBondedInteractionsSectionParser Error: Unknown "
246 "Buckingham Type at "
249 painCave.isFatal = 1;
257 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
258 "NonBondedInteractionsSectionParser Error: Token number "
260 "%d. 10 tokens expected. \n",
262 painCave.isFatal = 1;
265 RealType re = dus_ * tokenizer.nextTokenAsDouble();
266 RealType alpha = tokenizer.nextTokenAsDouble();
267 RealType beta = tokenizer.nextTokenAsDouble();
270 RealType A = meus_ * tokenizer.nextTokenAsDouble();
271 RealType B = meus_ * tokenizer.nextTokenAsDouble();
272 RealType kappa = tokenizer.nextTokenAsDouble();
273 RealType lambda = tokenizer.nextTokenAsDouble();
276 new EAMInteractionType(re, alpha, beta, A, B, kappa, lambda);
282 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
283 "NonBondedInteractionsSectionParser Error: Token number "
285 "%d. 8 tokens expected. \n",
287 painCave.isFatal = 1;
290 RealType re = dus_ * tokenizer.nextTokenAsDouble();
291 RealType alpha = tokenizer.nextTokenAsDouble();
294 RealType A = meus_ * tokenizer.nextTokenAsDouble();
295 RealType Ci = tokenizer.nextTokenAsDouble();
296 RealType Cj = tokenizer.nextTokenAsDouble();
298 interactionType =
new EAMInteractionType(re, alpha, A, Ci, Cj);
302 case InversePowerSeries:
303 if (nTokens < 2 || nTokens % 2 != 0) {
304 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
305 "NonBondedInteractionsSectionParser Error: Not enough tokens "
308 painCave.isFatal = 1;
311 std::vector<std::pair<int, RealType>> series;
312 int nPairs = nTokens / 2;
314 RealType coefficient;
316 for (
int i = 0; i < nPairs; ++i) {
317 power = tokenizer.nextTokenAsInt();
318 coefficient = tokenizer.nextTokenAsDouble() * eus_ * pow(dus_, power);
319 series.push_back(std::make_pair(power, coefficient));
321 interactionType =
new InversePowerSeriesInteractionType(series);
327 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
328 "NonBondedInteractionsSectionParser Error: Unknown Interaction "
332 painCave.isFatal = 1;
338 if (interactionType != NULL) {
339 ff.addNonBondedInteractionType(at1, at2, interactionType);
343 NonBondedInteractionsSectionParser::NonBondedInteractionTypeEnum
344 NonBondedInteractionsSectionParser::getNonBondedInteractionTypeEnum(
345 const std::string& str) {
346 std::map<std::string, NonBondedInteractionTypeEnum>::iterator i;
347 i = stringToEnumMap_.find(str);
349 return i == stringToEnumMap_.end() ? Unknown : i->second;
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.