ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/branches/new_design/OOPSE-3.0/src/UseTheForce/DUFF.cpp
Revision: 1757
Committed: Fri Nov 19 00:11:33 2004 UTC (19 years, 8 months ago) by tim
File size: 15349 byte(s)
Log Message:
adding DUFF parser

File Contents

# Content
1 /*
2 * Copyright (C) 2000-2004 Object Oriented Parallel Simulation Engine (OOPSE) project
3 *
4 * Contact: oopse@oopse.org
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public License
8 * as published by the Free Software Foundation; either version 2.1
9 * of the License, or (at your option) any later version.
10 * All we ask is that proper credit is given for our work, which includes
11 * - but is not limited to - adding the above copyright notice to the beginning
12 * of your source code files, and to any copyright notice that you may distribute
13 * with programs based on this work.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 *
24 */
25
26 #include "UseTheForce/DUFF.hpp"
27 #include "UseTheForce/DarkSide/lj_interface.h"
28
29 namespace oopse {
30
31 //definition of createDUFF
32 ForceField* createDUFF() {
33 return new DUFF();
34 }
35
36 //register createDUFF to ForceFieldCreator
37 ForceFieldFactory::getInstance()->registerForceField("DUFF", createDUFF);
38
39
40 ParseState DUFF::getSection(const std::string& section) {
41 ParseState result;
42
43 switch(section) {
44 case "AtomTypes" :
45 result = DUFF::AtomTypeSection;
46 break;
47
48 case "BondTypes" :
49 result = DUFF::BondTypeSection;
50 break;
51
52 case "BendTypes" :
53 result = DUFF::BendTypeSection;
54 break;
55
56 case "TorsionTypes" :
57 result = DUFF::TorsionTypeSection;
58 break;
59 default:
60 result = DUFF::UnknownSection;
61 }
62
63 return result;
64 }
65
66 void DUFF::parse(const std::string& filename) {
67 ifstrstream* ffStream;
68 ffStream = openForceFiledFile(filename);
69 const int bufferSize = 65535;
70 std::string line;
71 char buffer[bufferSize];
72 int lineNo = 0;
73 ParseState currentSection = DUFF::UnknownSection;
74
75 while(ffStream.getline(buffer, bufferSize)){
76 ++lineNo;
77
78 line = trimSpaces(buffer);
79 //a line begins with "//" is comment
80 if ( line.empty() || (line.size() >= 2 && line[0] == '/' && line[1] == '/')) {
81 continue;
82 } else {
83
84 switch(currentSection) {
85 case DUFF::AtomTypeSection :
86 parseAtomType(line, lineNo);
87 break;
88
89 case DUFF::BondTypeSection :
90 parseBondType(line, lineNo);
91 break;
92
93 case DUFF::BendTypeSection :
94 parseBendType(line, lineNo);
95 break;
96
97 case DUFF::TorsionTypeSection :
98 parseTorsionType(line, lineNo);
99 break;
100
101 case DUFF::UnknownSection:
102 StringTokenizer tokenizer(line);
103
104 std::string keyword = tokenizer.nextToken();
105 std::string section = tokenizer.nextToken();
106
107 ParseState newSection = getSection(section);
108 if (keyword != "begin" || keyword != "end") {
109 std::cerr << "DUFF Parsing Error at line " << lineNo << ": " << line << std::endl;
110 } else if (keyword == "begin") {
111 if (newSection == DUFF::UnknownSection) {
112 std::cerr << "DUFF Parsing Error at line " << lineNo << ": " << line << std::endl;
113 } else {
114 //enter a new section
115 currentSection = newSection;
116 }
117
118 } else if (keyword == "end"){
119 if (currentSection == newSection) ) {
120 //leave a section
121 currentSection = DUFF::UnknownSection;
122 } else {
123 std::cerr << "DUFF Parsing Error at line " << lineNo << ": " << line << std::endl;
124 }
125
126 }
127 break;
128 default :
129
130 }
131
132 }
133 }
134
135 delete ffStream;
136 }
137
138
139 void DUFF::parseAtomType(const std::string& line, int lineNo){
140 StringTokenizer tokenizer(line);
141
142 if (tokenizer.countTokens() >= 4) {
143 atomTypeName = tokenizer.nextToken();
144 mass = tokenizer.nextTokenAsFloat();
145 epsilon = tokenizer.nextTokenAsFloat();
146 sigma = tokenizer.nextTokenAsFloat();
147
148 atomType = new AtomType();
149 atomType->setName(atomTypeName);
150 atomType->setMass(mass);
151
152 //by default, all of the properties in AtomTypeProperties is set to 0
153 //In Lennard-Jones Force Field, we only need to set Lennard-Jones to true
154 atomType->setLennardJones();
155
156 atomType->setIdent(ident);
157 atomType->addProperty(new DoubleGenericData("Epsilon", epsilon));
158 atomType->addProperty(new DoubleGenericData("Sigma", sigma));
159 atomType->complete();
160 //notify a new LJtype atom type is created
161 newLJtype(&ident, &sigma, &epsilon, &status);
162
163 //add atom type to AtomTypeContainer
164 addAtomType(atomTypeName, atomType);
165 ++ident;
166
167 } else {
168 sprintf( painCave.errMsg,
169 "Not enough tokens when parsing Lennard-Jones Force Field : %s\n"
170 "in line %d : %s\n",
171 filename.c_str(), lineNo, line);
172 painCave.severity = OOPSE_ERROR;
173 painCave.isFatal = 1;
174 simError();
175 }
176 }
177
178 void DUFF::parseBondType(const std::string& line, int lineNo){
179
180 StringTokenizer tokenizer(line);
181 std::string at1;
182 std::string at2;
183 std::string bt;
184 BondType* bondType = NULL;
185 double b0;
186
187 int nTokens = tokenizer.countTokens();
188
189 if (nTokens < 4) {
190
191 return;
192 }
193
194 at1 = tokenizer.nextToken();
195 at2 = tokenizer.nextToken();
196 bt = tokenizer.nextToken();
197 b0 = tokenizer.nextTokenAsDouble();
198 nTokens -= 4;
199
200 //switch is a maintain nightmare
201 switch(bt) {
202 case "FixedBondType" :
203 bondType = new FixedBondType();
204 break;
205
206 case "HarmonicBondType" :
207 if (nTokens < 1) {
208
209 } else {
210
211 double kb = tokenizer.nextTokenAsDouble();
212 bondType = new HarmonicBondType(b0, kb);
213 }
214
215 break;
216
217 case "CubicBondType" :
218 if (nTokens < 4) {
219
220 } else {
221
222 double k3 = tokenizer.nextTokenAsDouble();
223 double k2 = tokenizer.nextTokenAsDouble();
224 double k1 = tokenizer.nextTokenAsDouble();
225 double k0 = tokenizer.nextTokenAsDouble();
226
227 bondType = new CubicBondType(b0, k3, k2, k1, k0);
228 }
229 break;
230
231 case "QuadraticBondType" :
232 if (nTokens < 5) {
233
234 } else {
235
236 b0 = tokenizer.nextTokenAsDouble();
237 double k4 = tokenizer.nextTokenAsDouble();
238 double k3 = tokenizer.nextTokenAsDouble();
239 double k2 = tokenizer.nextTokenAsDouble();
240 double k1 = tokenizer.nextTokenAsDouble();
241 double k0 = tokenizer.nextTokenAsDouble();
242
243 bondType = new QuadraticBondType(b0, k4, k3, k2, k1, k0);
244 }
245 break;
246
247 case "PolynomialBondType " :
248 if (nTokens < 2 || nTokens % 2 != 0) {
249
250 } else {
251 int nPairs = nTokens / 2;
252 int power;
253 double coefficient;
254 PolynomialBondType pbt = new PolynomialBondType();
255
256 for (int i = 0; i < nPairs; ++i) {
257 power = tokenizer.nextTokenAsInt();
258 coefficient = tokenizer.nextTokenAsDouble();
259
260 if (power < 0) {
261
262 } else {
263 pbt->setCoefficient(power, coefficient);
264 }
265 }
266 }
267
268 break;
269
270 default:
271
272 }
273
274 if (bondType != NULL) {
275 addBondType(at1, at2, bondType);
276 }
277 }
278
279 void DUFF::parseBendType(const std::string& line, int lineNo){
280 StringTokenizer tokenizer(line);
281 std::string at1;
282 std::string at2;
283 std::string at3;
284 std::string bt;
285 double theta0;
286 BendType* bendType = NULL;
287
288 int nTokens = tokenizer.countTokens();
289
290 if (nTokens < 5) {
291
292 return;
293 }
294
295 at1 = tokenizer.nextToken();
296 at2 = tokenizer.nextToken();
297 at3 = tokenizer.nextToken();
298 bt = tokenizer.nextToken();
299 theta0 = tokenizer.nextTokenAsDouble();
300 nTokens -= 5;
301
302 //switch is a maintain nightmare
303 switch(bt) {
304
305 case "HarmonicBendType" :
306
307 if (nTokens < 1) {
308
309 } else {
310
311 double ktheta = tokenizer.nextTokenAsDouble();
312 bendType = new HarmonicBendType(theta0, ktheta);
313 }
314 break;
315 case "GhostBendType" :
316 if (nTokens < 1) {
317
318 } else {
319 double ktheta = tokenizer.nextTokenAsDouble();
320 bendType = new HarmonicBendType(theta0, ktheta);
321 }
322 break;
323
324 case "UreyBradleyBendType" :
325 if (nTokens < 3) {
326
327 } else {
328 double ktheta = tokenizer.nextTokenAsDouble();
329 double s0 = tokenizer.nextTokenAsDouble();
330 double kub = tokenizer.nextTokenAsDouble();
331 bendType = new UreyBradleyBendType(theta0, ktheta, s0, kub);
332 }
333 break;
334
335 case "CubicBendType" :
336 if (nTokens < 4) {
337
338 } else {
339
340 double k3 = tokenizer.nextTokenAsDouble();
341 double k2 = tokenizer.nextTokenAsDouble();
342 double k1 = tokenizer.nextTokenAsDouble();
343 double k0 = tokenizer.nextTokenAsDouble();
344
345 bendType = new CubicBendType(theta0, k3, k2, k1, k0);
346 }
347 break;
348
349 case "QuadraticBendType" :
350 if (nTokens < 5) {
351
352 } else {
353
354 theta0 = tokenizer.nextTokenAsDouble();
355 double k4 = tokenizer.nextTokenAsDouble();
356 double k3 = tokenizer.nextTokenAsDouble();
357 double k2 = tokenizer.nextTokenAsDouble();
358 double k1 = tokenizer.nextTokenAsDouble();
359 double k0 = tokenizer.nextTokenAsDouble();
360
361 bendType = new QuadraticBendType(theta0, k4, k3, k2, k1, k0);
362 }
363 break;
364
365 case "PolynomialBendType " :
366 if (nTokens < 2 || nTokens % 2 != 0) {
367
368 } else {
369 int nPairs = nTokens / 2;
370 int power;
371 double coefficient;
372 PolynomialBendType* pbt = new PolynomialBendType();
373
374 for (int i = 0; i < nPairs; ++i) {
375 power = tokenizer.nextTokenAsInt();
376 coefficient = tokenizer.nextTokenAsDouble();
377
378 if (power < 0) {
379
380 } else {
381 pbt->setCoefficient(power, coefficient);
382 }
383 }
384 }
385
386 break;
387
388 default:
389
390 }
391
392 if (bendType != NULL) {
393 addBendType(at1, at2, at3, bendType);
394 }
395
396 }
397
398 void DUFF::parseTorsionType(const std::string& line, int lineNo){
399 StringTokenizer tokenizer(line);
400 std::string at1;
401 std::string at2;
402 std::string at3;
403 std::string at4;
404 std::string tt;
405 TorsionType* bendType = NULL;
406
407 int nTokens = tokenizer.countTokens();
408
409 if (nTokens < 5) {
410
411 return;
412 }
413
414 at1 = tokenizer.nextToken();
415 at2 = tokenizer.nextToken();
416 at3 = tokenizer.nextToken();
417 at4 = tokenizer.nextToken();
418 tt = tokenizer.nextToken();
419
420 nTokens -= 5;
421
422 switch(tt) {
423
424 case "CubicTorsionType" :
425 if (nTokens < 4) {
426
427 } else {
428
429 double k3 = tokenizer.nextTokenAsDouble();
430 double k2 = tokenizer.nextTokenAsDouble();
431 double k1 = tokenizer.nextTokenAsDouble();
432 double k0 = tokenizer.nextTokenAsDouble();
433
434 bendType = new CubicTorsionType(k3, k2, k1, k0);
435 }
436 break;
437
438 case "QuadraticTorsionType" :
439 if (nTokens < 5) {
440
441 } else {
442
443 theta0 = tokenizer.nextTokenAsDouble();
444 double k4 = tokenizer.nextTokenAsDouble();
445 double k3 = tokenizer.nextTokenAsDouble();
446 double k2 = tokenizer.nextTokenAsDouble();
447 double k1 = tokenizer.nextTokenAsDouble();
448 double k0 = tokenizer.nextTokenAsDouble();
449
450 bendType = new QuadraticTorsionType( k4, k3, k2, k1, k0);
451 }
452 break;
453
454 case "PolynomialTorsionType " :
455 if (nTokens < 2 || nTokens % 2 != 0) {
456
457 } else {
458 int nPairs = nTokens / 2;
459 int power;
460 double coefficient;
461 PolynomialTorsionType* pbt = new PolynomialTorsionType();
462
463 for (int i = 0; i < nPairs; ++i) {
464 power = tokenizer.nextTokenAsInt();
465 coefficient = tokenizer.nextTokenAsDouble();
466
467 if (power < 0) {
468
469 } else {
470 pbt->setCoefficient(power, coefficient);
471 }
472 }
473 }
474
475 break;
476 case "CharmmTorsionType" :
477
478 if (nTokens < 3 || nTokens % 3 != 0) {
479
480 } else {
481 int nSets = nTokens / 3;
482
483 double kchi;
484 int n;
485 double delta;
486 CharmmTorsionType* ctt = new CharmmTorsionType();
487
488 for (int i = 0; i < nSets; ++i) {
489 kchi = tokenizer.nextTokenAsDouble();
490 n = tokenizer.nextTokenAsInt();
491 delta = tokenizer.nextTokenAsDouble();
492
493 if (n < 0 || n > 6) {
494
495 } else {
496 ctt->setCharmmTorsionParameter(kchi, n, delta);
497 }
498 }
499 }
500 default:
501
502 }
503
504 if (bendType != NULL) {
505 addTorsionType(at1, at2, at3, bendType);
506 }
507 }
508
509 } //end namespace oopse
510