44#include "types/BendTypeParser.hpp"
48#include "io/BendTypesSectionParser.hpp"
50#include "types/CosineSeriesBendType.hpp"
51#include "types/CubicBendType.hpp"
56#include "types/SDKBendType.hpp"
58#include "utils/Constants.hpp"
59#include "utils/OpenMDException.hpp"
64 BendTypeParser::BendTypeParser() {
65 stringToEnumMap_[
"Harmonic"] = btHarmonic;
66 stringToEnumMap_[
"GhostBend"] = btGhostBend;
67 stringToEnumMap_[
"UreyBradley"] = btUreyBradley;
68 stringToEnumMap_[
"Cubic"] = btCubic;
69 stringToEnumMap_[
"Quartic"] = btQuartic;
70 stringToEnumMap_[
"Polynomial"] = btPolynomial;
71 stringToEnumMap_[
"Cosine"] = btCosine;
72 stringToEnumMap_[
"SDK"] = btSDK;
73 stringToEnumMap_[
"CosineSeries"] = btCosineSeries;
74 stringToEnumMap_[
"HarmonicSine"] = btHarmonicSine;
77 BendType* BendTypeParser::parseTypeAndPars(
const std::string& type,
78 std::vector<RealType> pars) {
79 std::string line(type);
81 std::vector<RealType>::iterator it;
82 for (it = pars.begin(); it != pars.end(); ++it) {
84 line.append(std::to_string(*it));
87 return parseLine(line, 1.0);
90 BendType* BendTypeParser::parseLine(
const std::string& line,
94 int nTokens = tokenizer.countTokens();
95 RealType theta0, ktheta;
96 RealType deg2rad = Constants::PI / 180.0;
102 BendTypeEnum bt = getBendTypeEnum(tokenizer.nextToken());
112 theta0 = tokenizer.nextTokenAsDouble() * deg2rad;
113 ktheta = tokenizer.nextTokenAsDouble() * kScale;
121 theta0 = tokenizer.nextTokenAsDouble() * deg2rad;
122 ktheta = tokenizer.nextTokenAsDouble() * kScale;
131 theta0 = tokenizer.nextTokenAsDouble() * deg2rad;
132 ktheta = tokenizer.nextTokenAsDouble();
133 RealType s0 = tokenizer.nextTokenAsDouble();
134 RealType kub = tokenizer.nextTokenAsDouble();
143 theta0 = tokenizer.nextTokenAsDouble() * deg2rad;
144 RealType k3 = tokenizer.nextTokenAsDouble();
145 RealType k2 = tokenizer.nextTokenAsDouble();
146 RealType k1 = tokenizer.nextTokenAsDouble();
147 RealType k0 = tokenizer.nextTokenAsDouble();
157 theta0 = tokenizer.nextTokenAsDouble() * deg2rad;
158 RealType k4 = tokenizer.nextTokenAsDouble();
159 RealType k3 = tokenizer.nextTokenAsDouble();
160 RealType k2 = tokenizer.nextTokenAsDouble();
161 RealType k1 = tokenizer.nextTokenAsDouble();
162 RealType k0 = tokenizer.nextTokenAsDouble();
169 theta0 = tokenizer.nextTokenAsDouble() * deg2rad;
171 if (nTokens < 2 || nTokens % 2 != 0) {
174 int nPairs = nTokens / 2;
176 RealType coefficient;
179 for (
int i = 0; i < nPairs; ++i) {
180 power = tokenizer.nextTokenAsInt();
181 coefficient = tokenizer.nextTokenAsDouble();
182 pbt->setCoefficient(power, coefficient);
192 theta0 = tokenizer.nextTokenAsDouble() * deg2rad;
193 ktheta = tokenizer.nextTokenAsDouble();
202 theta0 = tokenizer.nextTokenAsDouble() * deg2rad;
203 ktheta = tokenizer.nextTokenAsDouble();
204 RealType sigma = tokenizer.nextTokenAsDouble();
205 RealType epsilon = tokenizer.nextTokenAsDouble();
206 int nRep = tokenizer.nextTokenAsInt();
207 int mAtt = tokenizer.nextTokenAsInt();
208 bendType =
new SDKBendType(theta0, ktheta, sigma, epsilon, nRep, mAtt);
217 theta0 = tokenizer.nextTokenAsDouble() * deg2rad;
218 ktheta = tokenizer.nextTokenAsDouble() * kScale;
228 ktheta = tokenizer.nextTokenAsDouble() * kScale;
241 BendTypeParser::BendTypeEnum BendTypeParser::getBendTypeEnum(
242 const std::string& str) {
243 std::map<std::string, BendTypeEnum>::iterator i;
244 i = stringToEnumMap_.find(str);
246 return i == stringToEnumMap_.end() ? btUnknown : i->second;
A simple harmonic bend using the cosine of the angle instead of the angle itself:
A bend used primarily in UFF that utilizes a Fourier series in terms of the cosine of the bend angle:
A bend using the square of the sine of the angle instead of the angle itself:
"types/PolynomialBendType.hpp"
The string tokenizer class allows an application to break a string into tokens The set of delimiters ...
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.