ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE_old/src/mdtools/libmdCode/TraPPE_ExFF.cpp
Revision: 294
Committed: Thu Mar 6 17:04:09 2003 UTC (21 years, 4 months ago) by mmeineke
File size: 39899 byte(s)
Log Message:
finished conversion of all function wrapping into fortranWrappers.cpp and .hpp respectively

File Contents

# User Rev Content
1 mmeineke 270 #include <cstdlib>
2     #include <cstdio>
3     #include <cstring>
4    
5     #include <iostream>
6     using namespace std;
7    
8     #include "ForceFields.hpp"
9     #include "SRI.hpp"
10     #include "simError.h"
11    
12 mmeineke 294 #include <fortranWrappers.hpp>
13    
14 mmeineke 291 #ifdef IS_MPI
15     #include "mpiForceField.h"
16     #endif // is_mpi
17 mmeineke 270
18 mmeineke 291 namespace TPE { // restrict the access of the folowing to this file only.
19    
20    
21     // Declare the structures that will be passed by MPI
22    
23     typedef struct{
24     char name[15];
25     double mass;
26     double epslon;
27     double sigma;
28     double dipole;
29     double w0;
30     double v0;
31     int isSSD;
32     int isDipole;
33     int ident;
34     int last; // 0 -> default
35     // 1 -> tells nodes to stop listening
36     } atomStruct;
37    
38    
39     typedef struct{
40     char nameA[15];
41     char nameB[15];
42     char type[30];
43     double d0;
44     int last; // 0 -> default
45     // 1 -> tells nodes to stop listening
46     } bondStruct;
47    
48    
49     typedef struct{
50     char nameA[15];
51     char nameB[15];
52     char nameC[15];
53     char type[30];
54     double k1, k2, k3, t0;
55     int last; // 0 -> default
56     // 1 -> tells nodes to stop listening
57     } bendStruct;
58    
59    
60     typedef struct{
61     char nameA[15];
62     char nameB[15];
63     char nameC[15];
64     char nameD[15];
65     char type[30];
66     double k1, k2, k3, k4;
67     int last; // 0 -> default
68     // 1 -> tells nodes to stop listening
69     } torsionStruct;
70    
71    
72     int parseAtom( char *lineBuffer, int lineNum, atomStruct &info );
73     int parseBond( char *lineBuffer, int lineNum, bondStruct &info );
74     int parseBend( char *lineBuffer, int lineNum, bendStruct &info );
75     int parseTorsion( char *lineBuffer, int lineNum, torsionStruct &info );
76    
77    
78 mmeineke 270 #ifdef IS_MPI
79    
80 mmeineke 291 MPI_Datatype mpiAtomStructType;
81     MPI_Datatype mpiBondStructType;
82     MPI_Datatype mpiBendStructType;
83     MPI_Datatype mpiTorsionStructType;
84 mmeineke 270
85 mmeineke 291 #endif
86 mmeineke 270
87 mmeineke 291 } // namespace
88 mmeineke 270
89 mmeineke 291 using namespace TPE;
90    
91    
92     //****************************************************************
93     // begins the actual forcefield stuff.
94     //****************************************************************
95    
96    
97 mmeineke 270 TraPPE_ExFF::TraPPE_ExFF(){
98    
99     char fileName[200];
100     char* ffPath_env = "FORCE_PARAM_PATH";
101     char* ffPath;
102     char temp[200];
103     char errMsg[1000];
104    
105 mmeineke 291 // do the funtion wrapping
106 mmeineke 294 wrapMeFF( this );
107 mmeineke 291
108    
109 mmeineke 270 #ifdef IS_MPI
110     int i;
111    
112 mmeineke 291 // **********************************************************************
113 mmeineke 270 // Init the atomStruct mpi type
114    
115     atomStruct atomProto; // mpiPrototype
116 mmeineke 291 int atomBC[3] = {15,6,4}; // block counts
117 mmeineke 270 MPI_Aint atomDspls[3]; // displacements
118     MPI_Datatype atomMbrTypes[3]; // member mpi types
119    
120     MPI_Address(&atomProto.name, &atomDspls[0]);
121     MPI_Address(&atomProto.mass, &atomDspls[1]);
122 mmeineke 291 MPI_Address(&atomProto.isSSD, &atomDspls[2]);
123 mmeineke 270
124     atomMbrTypes[0] = MPI_CHAR;
125     atomMbrTypes[1] = MPI_DOUBLE;
126     atomMbrTypes[2] = MPI_INT;
127    
128     for (i=2; i >= 0; i--) atomDspls[i] -= atomDspls[0];
129    
130     MPI_Type_struct(3, atomBC, atomDspls, atomMbrTypes, &mpiAtomStructType);
131     MPI_Type_commit(&mpiAtomStructType);
132    
133    
134     // **********************************************************************
135     // Init the bondStruct mpi type
136    
137     bondStruct bondProto; // mpiPrototype
138     int bondBC[3] = {60,1,1}; // block counts
139     MPI_Aint bondDspls[3]; // displacements
140     MPI_Datatype bondMbrTypes[3]; // member mpi types
141    
142     MPI_Address(&bondProto.nameA, &bondDspls[0]);
143     MPI_Address(&bondProto.d0, &bondDspls[1]);
144     MPI_Address(&bondProto.last, &bondDspls[2]);
145    
146     bondMbrTypes[0] = MPI_CHAR;
147     bondMbrTypes[1] = MPI_DOUBLE;
148     bondMbrTypes[2] = MPI_INT;
149    
150     for (i=2; i >= 0; i--) bondDspls[i] -= bondDspls[0];
151    
152     MPI_Type_struct(3, bondBC, bondDspls, bondMbrTypes, &mpiBondStructType);
153     MPI_Type_commit(&mpiBondStructType);
154    
155    
156     // **********************************************************************
157     // Init the bendStruct mpi type
158    
159     bendStruct bendProto; // mpiPrototype
160     int bendBC[3] = {75,4,1}; // block counts
161     MPI_Aint bendDspls[3]; // displacements
162     MPI_Datatype bendMbrTypes[3]; // member mpi types
163    
164     MPI_Address(&bendProto.nameA, &bendDspls[0]);
165     MPI_Address(&bendProto.k1, &bendDspls[1]);
166     MPI_Address(&bendProto.last, &bendDspls[2]);
167    
168     bendMbrTypes[0] = MPI_CHAR;
169     bendMbrTypes[1] = MPI_DOUBLE;
170     bendMbrTypes[2] = MPI_INT;
171    
172     for (i=2; i >= 0; i--) bendDspls[i] -= bendDspls[0];
173    
174     MPI_Type_struct(3, bendBC, bendDspls, bendMbrTypes, &mpiBendStructType);
175     MPI_Type_commit(&mpiBendStructType);
176    
177    
178     // **********************************************************************
179     // Init the torsionStruct mpi type
180    
181     torsionStruct torsionProto; // mpiPrototype
182     int torsionBC[3] = {90,4,1}; // block counts
183     MPI_Aint torsionDspls[3]; // displacements
184     MPI_Datatype torsionMbrTypes[3]; // member mpi types
185    
186     MPI_Address(&torsionProto.nameA, &torsionDspls[0]);
187     MPI_Address(&torsionProto.k1, &torsionDspls[1]);
188     MPI_Address(&torsionProto.last, &torsionDspls[2]);
189    
190     torsionMbrTypes[0] = MPI_CHAR;
191     torsionMbrTypes[1] = MPI_DOUBLE;
192     torsionMbrTypes[2] = MPI_INT;
193    
194     for (i=2; i >= 0; i--) torsionDspls[i] -= torsionDspls[0];
195    
196     MPI_Type_struct(3, torsionBC, torsionDspls, torsionMbrTypes,
197     &mpiTorsionStructType);
198     MPI_Type_commit(&mpiTorsionStructType);
199    
200     // ***********************************************************************
201    
202     if( worldRank == 0 ){
203     #endif
204    
205     // generate the force file name
206    
207     strcpy( fileName, "TraPPE_Ex.frc" );
208     // fprintf( stderr,"Trying to open %s\n", fileName );
209    
210     // attempt to open the file in the current directory first.
211    
212     frcFile = fopen( fileName, "r" );
213    
214     if( frcFile == NULL ){
215    
216     // next see if the force path enviorment variable is set
217    
218     ffPath = getenv( ffPath_env );
219     if( ffPath == NULL ) {
220     sprintf( painCave.errMsg,
221     "Error opening the force field parameter file: %s\n"
222     "Have you tried setting the FORCE_PARAM_PATH environment "
223     "vairable?\n",
224     fileName );
225     painCave.isFatal = 1;
226     simError();
227     }
228    
229    
230     strcpy( temp, ffPath );
231     strcat( temp, "/" );
232     strcat( temp, fileName );
233     strcpy( fileName, temp );
234    
235     frcFile = fopen( fileName, "r" );
236    
237     if( frcFile == NULL ){
238    
239     sprintf( painCave.errMsg,
240     "Error opening the force field parameter file: %s\n"
241     "Have you tried setting the FORCE_PARAM_PATH environment "
242     "vairable?\n",
243     fileName );
244     painCave.isFatal = 1;
245     simError();
246     }
247     }
248    
249     #ifdef IS_MPI
250     }
251    
252     sprintf( checkPointMsg, "TraPPE_ExFF file opened sucessfully." );
253     MPIcheckPoint();
254    
255     #endif // is_mpi
256     }
257    
258    
259     TraPPE_ExFF::~TraPPE_ExFF(){
260    
261     #ifdef IS_MPI
262     if( worldRank == 0 ){
263     #endif // is_mpi
264    
265     fclose( frcFile );
266    
267     #ifdef IS_MPI
268     }
269     #endif // is_mpi
270     }
271    
272 mmeineke 291
273 mmeineke 270 void TraPPE_ExFF::initializeAtoms( void ){
274    
275     class LinkedType {
276     public:
277     LinkedType(){
278     next = NULL;
279     name[0] = '\0';
280     }
281     ~LinkedType(){ if( next != NULL ) delete next; }
282    
283     LinkedType* find(char* key){
284     if( !strcmp(name, key) ) return this;
285     if( next != NULL ) return next->find(key);
286     return NULL;
287     }
288    
289     void add( atomStruct &info ){
290 mmeineke 291
291     // check for duplicates
292    
293     if( !strcmp( info.name, name ) ){
294     sprintf( painCave.errMsg,
295     "Duplicate TraPPE_Ex atom type \"%s\" found in "
296     "the TraPPE_ExFF param file./n",
297     name );
298     painCave.isFatal = 1;
299     simError();
300     }
301    
302 mmeineke 270 if( next != NULL ) next->add(info);
303     else{
304     next = new LinkedType();
305     strcpy(next->name, info.name);
306 mmeineke 291 next->isDipole = info.isDipole;
307     next->isSSD = info.isSSD;
308 mmeineke 270 next->mass = info.mass;
309     next->epslon = info.epslon;
310     next->sigma = info.sigma;
311     next->dipole = info.dipole;
312 mmeineke 291 next->w0 = info.w0;
313     next->v0 = info.v0;
314     next->ident = info.ident;
315 mmeineke 270 }
316     }
317 mmeineke 291
318     #ifdef IS_MPI
319 mmeineke 270
320     void duplicate( atomStruct &info ){
321     strcpy(info.name, name);
322 mmeineke 291 info.isDipole = isDipole;
323     info.isSSD = isSSD;
324 mmeineke 270 info.mass = mass;
325     info.epslon = epslon;
326     info.sigma = sigma;
327     info.dipole = dipole;
328 mmeineke 291 info.w0 = w0;
329     info.v0 = v0;
330 mmeineke 270 info.last = 0;
331     }
332    
333    
334     #endif
335    
336     char name[15];
337     int isDipole;
338 mmeineke 291 int isSSD;
339 mmeineke 270 double mass;
340     double epslon;
341     double sigma;
342     double dipole;
343 mmeineke 291 double w0;
344     double v0;
345     int ident;
346 mmeineke 270 LinkedType* next;
347     };
348    
349     LinkedType* headAtomType;
350     LinkedType* currentAtomType;
351     atomStruct info;
352     info.last = 1; // initialize last to have the last set.
353     // if things go well, last will be set to 0
354 mmeineke 291
355 mmeineke 270
356    
357     int i;
358 mmeineke 291 int identNum;
359 mmeineke 270
360 mmeineke 291 Atom** the_atoms;
361     int nAtoms;
362     the_atoms = entry_plug->atoms;
363     nAtoms = entry_plug->n_atoms;
364    
365    
366 mmeineke 270 //////////////////////////////////////////////////
367     // a quick water fix
368    
369     double waterI[3][3];
370     waterI[0][0] = 1.76958347772500;
371     waterI[0][1] = 0.0;
372     waterI[0][2] = 0.0;
373    
374     waterI[1][0] = 0.0;
375     waterI[1][1] = 0.614537057924513;
376     waterI[1][2] = 0.0;
377    
378     waterI[2][0] = 0.0;
379     waterI[2][1] = 0.0;
380     waterI[2][2] = 1.15504641980049;
381    
382    
383     double headI[3][3];
384     headI[0][0] = 1125;
385     headI[0][1] = 0.0;
386     headI[0][2] = 0.0;
387    
388     headI[1][0] = 0.0;
389     headI[1][1] = 1125;
390     headI[1][2] = 0.0;
391    
392     headI[2][0] = 0.0;
393     headI[2][1] = 0.0;
394     headI[2][2] = 250;
395    
396    
397    
398     //////////////////////////////////////////////////
399    
400 mmeineke 291
401 mmeineke 270 #ifdef IS_MPI
402     if( worldRank == 0 ){
403     #endif
404    
405     // read in the atom types.
406 mmeineke 291
407 mmeineke 270 headAtomType = new LinkedType;
408    
409 mmeineke 291 fastForward( "AtomTypes", "initializeAtoms" );
410    
411 mmeineke 270 // we are now at the AtomTypes section.
412    
413     eof_test = fgets( readLine, sizeof(readLine), frcFile );
414     lineNum++;
415    
416 mmeineke 291
417     // read a line, and start parseing out the atom types
418    
419 mmeineke 270 if( eof_test == NULL ){
420     sprintf( painCave.errMsg,
421     "Error in reading Atoms from force file at line %d.\n",
422     lineNum );
423     painCave.isFatal = 1;
424     simError();
425     }
426    
427 mmeineke 291 identNum = 1;
428     // stop reading at end of file, or at next section
429 mmeineke 270 while( readLine[0] != '#' && eof_test != NULL ){
430 mmeineke 291
431     // toss comment lines
432 mmeineke 270 if( readLine[0] != '!' ){
433    
434 mmeineke 291 // the parser returns 0 if the line was blank
435     if( parseAtom( readLine, lineNum, info ) ){
436     info.ident = identNum;
437     headAtomType->add( info );;
438     identNum++;
439 mmeineke 270 }
440     }
441     eof_test = fgets( readLine, sizeof(readLine), frcFile );
442     lineNum++;
443     }
444    
445     #ifdef IS_MPI
446    
447     // send out the linked list to all the other processes
448    
449     sprintf( checkPointMsg,
450 mmeineke 291 "TraPPE_ExFF atom structures read successfully." );
451 mmeineke 270 MPIcheckPoint();
452    
453 mmeineke 291 currentAtomType = headAtomType->next; //skip the first element who is a place holder.
454 mmeineke 270 while( currentAtomType != NULL ){
455     currentAtomType->duplicate( info );
456 mmeineke 291
457    
458    
459 mmeineke 270 sendFrcStruct( &info, mpiAtomStructType );
460 mmeineke 291
461     sprintf( checkPointMsg,
462     "successfully sent TraPPE_Ex force type: \"%s\"\n",
463     info.name );
464     MPIcheckPoint();
465    
466 mmeineke 270 currentAtomType = currentAtomType->next;
467     }
468     info.last = 1;
469     sendFrcStruct( &info, mpiAtomStructType );
470    
471     }
472    
473     else{
474    
475     // listen for node 0 to send out the force params
476    
477     MPIcheckPoint();
478    
479     headAtomType = new LinkedType;
480     recieveFrcStruct( &info, mpiAtomStructType );
481 mmeineke 291
482 mmeineke 270 while( !info.last ){
483    
484 mmeineke 291
485    
486 mmeineke 270 headAtomType->add( info );
487 mmeineke 291
488     MPIcheckPoint();
489    
490 mmeineke 270 recieveFrcStruct( &info, mpiAtomStructType );
491     }
492     }
493     #endif // is_mpi
494    
495 mmeineke 291 // call new A_types in fortran
496 mmeineke 270
497 mmeineke 291 int isError;
498     currentAtomType = headAtomType;
499     while( currentAtomType != NULL ){
500    
501     if( currentAtomType->name[0] != '\0' ){
502     isError = 0;
503     newTPEtype( &(currentAtomType->ident),
504     &(currentAtomType->mass),
505     &(currentAtomType->epslon),
506     &(currentAtomType->sigma),
507     &(currentAtomType->isDipole),
508     &(currentAtomType->isSSD),
509     &(currentAtomType->dipole),
510     &(currentAtomType->w0),
511     &(currentAtomType->v0),
512     &isError );
513     if( isError ){
514     sprintf( painCave.errMsg,
515     "Error initializing the \"%s\" atom type in fortran\n",
516     currentAtomType->name );
517     painCave.isFatal = 1;
518     simError();
519     }
520     }
521     currentAtomType = currentAtomType->next;
522     }
523    
524     #ifdef IS_MPI
525     sprintf( checkPointMsg,
526     "TraPPE_ExFF atom structures successfully sent to fortran\n" );
527     MPIcheckPoint();
528     #endif // is_mpi
529    
530    
531 mmeineke 270 // initialize the atoms
532    
533 mmeineke 291 double bigSigma = 0.0;
534 mmeineke 270 DirectionalAtom* dAtom;
535    
536     for( i=0; i<nAtoms; i++ ){
537    
538     currentAtomType = headAtomType->find( the_atoms[i]->getType() );
539     if( currentAtomType == NULL ){
540     sprintf( painCave.errMsg,
541     "AtomType error, %s not found in force file.\n",
542     the_atoms[i]->getType() );
543     painCave.isFatal = 1;
544     simError();
545     }
546    
547     the_atoms[i]->setMass( currentAtomType->mass );
548     the_atoms[i]->setEpslon( currentAtomType->epslon );
549     the_atoms[i]->setSigma( currentAtomType->sigma );
550     the_atoms[i]->setLJ();
551    
552 mmeineke 291 if( bigSigma < currentAtomType->sigma ) bigSigma = currentAtomType->sigma;
553    
554 mmeineke 270 if( currentAtomType->isDipole ){
555     if( the_atoms[i]->isDirectional() ){
556    
557     dAtom = (DirectionalAtom *) the_atoms[i];
558     dAtom->setMu( currentAtomType->dipole );
559     dAtom->setHasDipole( 1 );
560     dAtom->setJx( 0.0 );
561     dAtom->setJy( 0.0 );
562     dAtom->setJz( 0.0 );
563    
564     if(!strcmp("SSD",the_atoms[i]->getType())){
565     dAtom->setI( waterI );
566     dAtom->setSSD( 1 );
567     }
568     else if(!strcmp("HEAD",the_atoms[i]->getType())){
569     dAtom->setI( headI );
570     dAtom->setSSD( 0 );
571     }
572     else{
573     sprintf(painCave.errMsg,
574     "AtmType error, %s does not have a moment of inertia set.\n",
575     the_atoms[i]->getType() );
576     painCave.isFatal = 1;
577     simError();
578     }
579     entry_plug->n_dipoles++;
580     }
581     else{
582    
583     sprintf( painCave.errMsg,
584     "TraPPE_ExFF error: Atom \"%s\" is a dipole, yet no standard"
585     " orientation was specifed in the BASS file.\n",
586     currentAtomType->name );
587     painCave.isFatal = 1;
588     simError();
589     }
590     }
591     else{
592     if( the_atoms[i]->isDirectional() ){
593     sprintf( painCave.errMsg,
594     "TraPPE_ExFF error: Atom \"%s\" was given a standard"
595     "orientation in the BASS file, yet it is not a dipole.\n",
596     currentAtomType->name);
597     painCave.isFatal = 1;
598     simError();
599     }
600     }
601     }
602    
603 mmeineke 291 #ifdef IS_MPI
604     double tempBig = bigSigma;
605     MPI::COMM_WORLD.Allreduce( &tempBig, &bigSigma, 1, MPI_DOUBLE, MPI_MAX );
606     #endif //is_mpi
607 mmeineke 270
608 mmeineke 291 //calc rCut and rList
609    
610     entry_plug->rCut = 2.5 * bigSigma;
611    
612     if(entry_plug->rCut > (entry_plug->box_x / 2.0))
613     entry_plug->rCut = entry_plug->box_x / 2.0;
614    
615     if(entry_plug->rCut > (entry_plug->box_y / 2.0))
616     entry_plug->rCut = entry_plug->box_y / 2.0;
617    
618     if(entry_plug->rCut > (entry_plug->box_z / 2.0))
619     entry_plug->rCut = entry_plug->box_z / 2.0;
620    
621     entry_plug->rList = entry_plug->rCut + 1.0;
622    
623    
624 mmeineke 270 // clean up the memory
625    
626     delete headAtomType;
627    
628     #ifdef IS_MPI
629     sprintf( checkPointMsg, "TraPPE_Ex atoms initialized succesfully" );
630     MPIcheckPoint();
631     #endif // is_mpi
632    
633     }
634    
635     void TraPPE_ExFF::initializeBonds( bond_pair* the_bonds ){
636    
637     class LinkedType {
638     public:
639     LinkedType(){
640     next = NULL;
641     nameA[0] = '\0';
642     nameB[0] = '\0';
643     type[0] = '\0';
644     }
645     ~LinkedType(){ if( next != NULL ) delete next; }
646    
647     LinkedType* find(char* key1, char* key2){
648     if( !strcmp(nameA, key1 ) && !strcmp( nameB, key2 ) ) return this;
649     if( !strcmp(nameA, key2 ) && !strcmp( nameB, key1 ) ) return this;
650     if( next != NULL ) return next->find(key1, key2);
651     return NULL;
652     }
653    
654 mmeineke 291
655 mmeineke 270 void add( bondStruct &info ){
656 mmeineke 291
657     // check for duplicates
658     int dup = 0;
659    
660     if( !strcmp(nameA, info.nameA ) && !strcmp( nameB, info.nameB ) ) dup = 1;
661     if( !strcmp(nameA, info.nameB ) && !strcmp( nameB, info.nameA ) ) dup = 1;
662    
663     if(dup){
664     sprintf( painCave.errMsg,
665     "Duplicate TraPPE_Ex bond type \"%s - %s\" found in "
666     "the TraPPE_ExFF param file./n",
667     nameA, nameB );
668     painCave.isFatal = 1;
669     simError();
670     }
671    
672    
673 mmeineke 270 if( next != NULL ) next->add(info);
674     else{
675     next = new LinkedType();
676     strcpy(next->nameA, info.nameA);
677     strcpy(next->nameB, info.nameB);
678     strcpy(next->type, info.type);
679     next->d0 = info.d0;
680     }
681     }
682    
683 mmeineke 291 #ifdef IS_MPI
684 mmeineke 270 void duplicate( bondStruct &info ){
685     strcpy(info.nameA, nameA);
686     strcpy(info.nameB, nameB);
687     strcpy(info.type, type);
688     info.d0 = d0;
689     info.last = 0;
690     }
691    
692    
693     #endif
694    
695     char nameA[15];
696     char nameB[15];
697     char type[30];
698     double d0;
699    
700     LinkedType* next;
701     };
702    
703    
704    
705     LinkedType* headBondType;
706     LinkedType* currentBondType;
707     bondStruct info;
708     info.last = 1; // initialize last to have the last set.
709     // if things go well, last will be set to 0
710    
711     SRI **the_sris;
712     Atom** the_atoms;
713     int nBonds;
714     the_sris = entry_plug->sr_interactions;
715     the_atoms = entry_plug->atoms;
716     nBonds = entry_plug->n_bonds;
717    
718 mmeineke 291 int i, a, b;
719     char* atomA;
720     char* atomB;
721 mmeineke 270
722     #ifdef IS_MPI
723     if( worldRank == 0 ){
724     #endif
725    
726     // read in the bond types.
727    
728     headBondType = new LinkedType;
729    
730 mmeineke 291 fastForward( "BondTypes", "initializeBonds" );
731    
732     // we are now at the bondTypes section
733    
734     eof_test = fgets( readLine, sizeof(readLine), frcFile );
735 mmeineke 270 lineNum++;
736    
737    
738 mmeineke 291 // read a line, and start parseing out the atom types
739    
740 mmeineke 270 if( eof_test == NULL ){
741     sprintf( painCave.errMsg,
742 mmeineke 291 "Error in reading bonds from force file at line %d.\n",
743 mmeineke 270 lineNum );
744     painCave.isFatal = 1;
745     simError();
746     }
747    
748 mmeineke 291 // stop reading at end of file, or at next section
749 mmeineke 270 while( readLine[0] != '#' && eof_test != NULL ){
750 mmeineke 291
751     // toss comment lines
752 mmeineke 270 if( readLine[0] != '!' ){
753    
754 mmeineke 291 // the parser returns 0 if the line was blank
755     if( parseBond( readLine, lineNum, info ) ){
756     headBondType->add( info );
757 mmeineke 270 }
758     }
759     eof_test = fgets( readLine, sizeof(readLine), frcFile );
760     lineNum++;
761     }
762 mmeineke 291
763 mmeineke 270 #ifdef IS_MPI
764    
765     // send out the linked list to all the other processes
766    
767     sprintf( checkPointMsg,
768     "TraPPE_Ex bond structures read successfully." );
769     MPIcheckPoint();
770    
771     currentBondType = headBondType;
772     while( currentBondType != NULL ){
773     currentBondType->duplicate( info );
774     sendFrcStruct( &info, mpiBondStructType );
775     currentBondType = currentBondType->next;
776     }
777     info.last = 1;
778     sendFrcStruct( &info, mpiBondStructType );
779    
780     }
781    
782     else{
783    
784     // listen for node 0 to send out the force params
785    
786     MPIcheckPoint();
787    
788     headBondType = new LinkedType;
789     recieveFrcStruct( &info, mpiBondStructType );
790     while( !info.last ){
791    
792     headBondType->add( info );
793     recieveFrcStruct( &info, mpiBondStructType );
794     }
795     }
796     #endif // is_mpi
797    
798    
799     // initialize the Bonds
800    
801    
802     for( i=0; i<nBonds; i++ ){
803    
804     a = the_bonds[i].a;
805     b = the_bonds[i].b;
806    
807     atomA = the_atoms[a]->getType();
808     atomB = the_atoms[b]->getType();
809     currentBondType = headBondType->find( atomA, atomB );
810     if( currentBondType == NULL ){
811     sprintf( painCave.errMsg,
812     "BondType error, %s - %s not found in force file.\n",
813     atomA, atomB );
814     painCave.isFatal = 1;
815     simError();
816     }
817    
818     if( !strcmp( currentBondType->type, "fixed" ) ){
819    
820     the_sris[i] = new ConstrainedBond( *the_atoms[a],
821     *the_atoms[b],
822     currentBondType->d0 );
823     entry_plug->n_constraints++;
824     }
825     }
826    
827    
828     // clean up the memory
829    
830     delete headBondType;
831    
832     #ifdef IS_MPI
833     sprintf( checkPointMsg, "TraPPE_Ex bonds initialized succesfully" );
834     MPIcheckPoint();
835     #endif // is_mpi
836    
837     }
838    
839     void TraPPE_ExFF::initializeBends( bend_set* the_bends ){
840    
841     class LinkedType {
842     public:
843     LinkedType(){
844     next = NULL;
845     nameA[0] = '\0';
846     nameB[0] = '\0';
847     nameC[0] = '\0';
848     type[0] = '\0';
849     }
850     ~LinkedType(){ if( next != NULL ) delete next; }
851    
852     LinkedType* find( char* key1, char* key2, char* key3 ){
853     if( !strcmp( nameA, key1 ) && !strcmp( nameB, key2 )
854     && !strcmp( nameC, key3 ) ) return this;
855     if( !strcmp( nameA, key3 ) && !strcmp( nameB, key2 )
856     && !strcmp( nameC, key1 ) ) return this;
857     if( next != NULL ) return next->find(key1, key2, key3);
858     return NULL;
859     }
860    
861 mmeineke 291 void add( bendStruct &info ){
862 mmeineke 270
863 mmeineke 291 // check for duplicates
864     int dup = 0;
865    
866     if( !strcmp( nameA, info.nameA ) && !strcmp( nameB, info.nameB )
867     && !strcmp( nameC, info.nameC ) ) dup = 1;
868     if( !strcmp( nameA, info.nameC ) && !strcmp( nameB, info.nameB )
869     && !strcmp( nameC, info.nameA ) ) dup = 1;
870    
871     if(dup){
872     sprintf( painCave.errMsg,
873     "Duplicate TraPPE_Ex bend type \"%s - %s - %s\" found in "
874     "the TraPPE_ExFF param file./n",
875     nameA, nameB, nameC );
876     painCave.isFatal = 1;
877     simError();
878     }
879    
880 mmeineke 270 if( next != NULL ) next->add(info);
881     else{
882     next = new LinkedType();
883     strcpy(next->nameA, info.nameA);
884     strcpy(next->nameB, info.nameB);
885     strcpy(next->nameC, info.nameC);
886     strcpy(next->type, info.type);
887     next->k1 = info.k1;
888     next->k2 = info.k2;
889     next->k3 = info.k3;
890     next->t0 = info.t0;
891     }
892     }
893 mmeineke 291
894     #ifdef IS_MPI
895    
896 mmeineke 270 void duplicate( bendStruct &info ){
897     strcpy(info.nameA, nameA);
898     strcpy(info.nameB, nameB);
899     strcpy(info.nameC, nameC);
900     strcpy(info.type, type);
901     info.k1 = k1;
902     info.k2 = k2;
903     info.k3 = k3;
904     info.t0 = t0;
905     info.last = 0;
906     }
907    
908     #endif // is_mpi
909    
910     char nameA[15];
911     char nameB[15];
912     char nameC[15];
913     char type[30];
914     double k1, k2, k3, t0;
915    
916     LinkedType* next;
917     };
918    
919     LinkedType* headBendType;
920     LinkedType* currentBendType;
921     bendStruct info;
922     info.last = 1; // initialize last to have the last set.
923     // if things go well, last will be set to 0
924    
925     QuadraticBend* qBend;
926     SRI **the_sris;
927     Atom** the_atoms;
928     int nBends;
929     the_sris = entry_plug->sr_interactions;
930     the_atoms = entry_plug->atoms;
931     nBends = entry_plug->n_bends;
932    
933 mmeineke 291 int i, a, b, c;
934     char* atomA;
935     char* atomB;
936     char* atomC;
937 mmeineke 270
938 mmeineke 291
939 mmeineke 270 #ifdef IS_MPI
940     if( worldRank == 0 ){
941     #endif
942    
943     // read in the bend types.
944    
945     headBendType = new LinkedType;
946    
947 mmeineke 291 fastForward( "BendTypes", "initializeBends" );
948 mmeineke 270
949 mmeineke 291 // we are now at the bendTypes section
950 mmeineke 270
951 mmeineke 291 eof_test = fgets( readLine, sizeof(readLine), frcFile );
952     lineNum++;
953    
954     // read a line, and start parseing out the bend types
955 mmeineke 270
956     if( eof_test == NULL ){
957     sprintf( painCave.errMsg,
958 mmeineke 291 "Error in reading bends from force file at line %d.\n",
959 mmeineke 270 lineNum );
960     painCave.isFatal = 1;
961     simError();
962     }
963 mmeineke 291
964     // stop reading at end of file, or at next section
965 mmeineke 270 while( readLine[0] != '#' && eof_test != NULL ){
966 mmeineke 291
967     // toss comment lines
968 mmeineke 270 if( readLine[0] != '!' ){
969    
970 mmeineke 291 // the parser returns 0 if the line was blank
971     if( parseBend( readLine, lineNum, info ) ){
972     headBendType->add( info );
973 mmeineke 270 }
974     }
975     eof_test = fgets( readLine, sizeof(readLine), frcFile );
976     lineNum++;
977     }
978 mmeineke 291
979 mmeineke 270 #ifdef IS_MPI
980    
981     // send out the linked list to all the other processes
982    
983     sprintf( checkPointMsg,
984     "TraPPE_Ex bend structures read successfully." );
985     MPIcheckPoint();
986    
987     currentBendType = headBendType;
988     while( currentBendType != NULL ){
989     currentBendType->duplicate( info );
990     sendFrcStruct( &info, mpiBendStructType );
991     currentBendType = currentBendType->next;
992     }
993     info.last = 1;
994     sendFrcStruct( &info, mpiBendStructType );
995    
996     }
997    
998     else{
999    
1000     // listen for node 0 to send out the force params
1001    
1002     MPIcheckPoint();
1003    
1004     headBendType = new LinkedType;
1005     recieveFrcStruct( &info, mpiBendStructType );
1006     while( !info.last ){
1007    
1008     headBendType->add( info );
1009     recieveFrcStruct( &info, mpiBendStructType );
1010     }
1011     }
1012     #endif // is_mpi
1013    
1014     // initialize the Bends
1015 mmeineke 291
1016     int index;
1017 mmeineke 270
1018     for( i=0; i<nBends; i++ ){
1019    
1020     a = the_bends[i].a;
1021     b = the_bends[i].b;
1022     c = the_bends[i].c;
1023    
1024     atomA = the_atoms[a]->getType();
1025     atomB = the_atoms[b]->getType();
1026     atomC = the_atoms[c]->getType();
1027     currentBendType = headBendType->find( atomA, atomB, atomC );
1028     if( currentBendType == NULL ){
1029     sprintf( painCave.errMsg, "BendType error, %s - %s - %s not found"
1030     " in force file.\n",
1031     atomA, atomB, atomC );
1032     painCave.isFatal = 1;
1033     simError();
1034     }
1035    
1036     if( !strcmp( currentBendType->type, "quadratic" ) ){
1037    
1038     index = i + entry_plug->n_bonds;
1039     qBend = new QuadraticBend( *the_atoms[a],
1040     *the_atoms[b],
1041     *the_atoms[c] );
1042     qBend->setConstants( currentBendType->k1,
1043     currentBendType->k2,
1044     currentBendType->k3,
1045     currentBendType->t0 );
1046     the_sris[index] = qBend;
1047     }
1048     }
1049    
1050    
1051     // clean up the memory
1052    
1053     delete headBendType;
1054    
1055     #ifdef IS_MPI
1056     sprintf( checkPointMsg, "TraPPE_Ex bends initialized succesfully" );
1057     MPIcheckPoint();
1058     #endif // is_mpi
1059    
1060     }
1061    
1062     void TraPPE_ExFF::initializeTorsions( torsion_set* the_torsions ){
1063    
1064     class LinkedType {
1065     public:
1066     LinkedType(){
1067     next = NULL;
1068     nameA[0] = '\0';
1069     nameB[0] = '\0';
1070     nameC[0] = '\0';
1071     type[0] = '\0';
1072     }
1073     ~LinkedType(){ if( next != NULL ) delete next; }
1074    
1075     LinkedType* find( char* key1, char* key2, char* key3, char* key4 ){
1076     if( !strcmp( nameA, key1 ) && !strcmp( nameB, key2 ) &&
1077     !strcmp( nameC, key3 ) && !strcmp( nameD, key4 ) ) return this;
1078    
1079     if( !strcmp( nameA, key4 ) && !strcmp( nameB, key3 ) &&
1080 mmeineke 291 !strcmp( nameC, key2 ) && !strcmp( nameD, key1 ) ) return this;
1081 mmeineke 270
1082     if( next != NULL ) return next->find(key1, key2, key3, key4);
1083     return NULL;
1084     }
1085    
1086     void add( torsionStruct &info ){
1087 mmeineke 291
1088     // check for duplicates
1089     int dup = 0;
1090    
1091     if( !strcmp( nameA, info.nameA ) && !strcmp( nameB, info.nameB ) &&
1092     !strcmp( nameC, info.nameC ) && !strcmp( nameD, info.nameD ) ) dup = 1;
1093    
1094     if( !strcmp( nameA, info.nameD ) && !strcmp( nameB, info.nameC ) &&
1095     !strcmp( nameC, info.nameB ) && !strcmp( nameD, info.nameA ) ) dup = 1;
1096    
1097     if(dup){
1098     sprintf( painCave.errMsg,
1099     "Duplicate TraPPE_Ex torsion type \"%s - %s - %s - %s\" found in "
1100     "the TraPPE_ExFF param file./n", nameA, nameB, nameC, nameD );
1101     painCave.isFatal = 1;
1102     simError();
1103     }
1104    
1105 mmeineke 270 if( next != NULL ) next->add(info);
1106     else{
1107     next = new LinkedType();
1108     strcpy(next->nameA, info.nameA);
1109     strcpy(next->nameB, info.nameB);
1110     strcpy(next->nameC, info.nameC);
1111     strcpy(next->type, info.type);
1112     next->k1 = info.k1;
1113     next->k2 = info.k2;
1114     next->k3 = info.k3;
1115     next->k4 = info.k4;
1116     }
1117     }
1118 mmeineke 291
1119     #ifdef IS_MPI
1120 mmeineke 270
1121     void duplicate( torsionStruct &info ){
1122     strcpy(info.nameA, nameA);
1123     strcpy(info.nameB, nameB);
1124     strcpy(info.nameC, nameC);
1125     strcpy(info.nameD, nameD);
1126     strcpy(info.type, type);
1127     info.k1 = k1;
1128     info.k2 = k2;
1129     info.k3 = k3;
1130     info.k4 = k4;
1131     info.last = 0;
1132     }
1133    
1134     #endif
1135    
1136     char nameA[15];
1137     char nameB[15];
1138     char nameC[15];
1139     char nameD[15];
1140     char type[30];
1141     double k1, k2, k3, k4;
1142    
1143     LinkedType* next;
1144     };
1145    
1146     LinkedType* headTorsionType;
1147     LinkedType* currentTorsionType;
1148     torsionStruct info;
1149     info.last = 1; // initialize last to have the last set.
1150     // if things go well, last will be set to 0
1151    
1152     int i, a, b, c, d, index;
1153     char* atomA;
1154     char* atomB;
1155     char* atomC;
1156     char* atomD;
1157     CubicTorsion* cTors;
1158    
1159     SRI **the_sris;
1160     Atom** the_atoms;
1161     int nTorsions;
1162     the_sris = entry_plug->sr_interactions;
1163     the_atoms = entry_plug->atoms;
1164     nTorsions = entry_plug->n_torsions;
1165    
1166     #ifdef IS_MPI
1167     if( worldRank == 0 ){
1168     #endif
1169    
1170     // read in the torsion types.
1171    
1172     headTorsionType = new LinkedType;
1173 mmeineke 291
1174     fastForward( "TorsionTypes", "initializeTorsions" );
1175 mmeineke 270
1176 mmeineke 291 // we are now at the torsionTypes section
1177 mmeineke 270
1178 mmeineke 291 eof_test = fgets( readLine, sizeof(readLine), frcFile );
1179     lineNum++;
1180 mmeineke 270
1181 mmeineke 291
1182     // read a line, and start parseing out the atom types
1183 mmeineke 270
1184     if( eof_test == NULL ){
1185     sprintf( painCave.errMsg,
1186 mmeineke 291 "Error in reading torsions from force file at line %d.\n",
1187 mmeineke 270 lineNum );
1188     painCave.isFatal = 1;
1189     simError();
1190     }
1191 mmeineke 291
1192     // stop reading at end of file, or at next section
1193     while( readLine[0] != '#' && eof_test != NULL ){
1194 mmeineke 270
1195 mmeineke 291 // toss comment lines
1196 mmeineke 270 if( readLine[0] != '!' ){
1197    
1198 mmeineke 291 // the parser returns 0 if the line was blank
1199     if( parseTorsion( readLine, lineNum, info ) ){
1200     headTorsionType->add( info );
1201 mmeineke 270 }
1202     }
1203     eof_test = fgets( readLine, sizeof(readLine), frcFile );
1204     lineNum++;
1205     }
1206    
1207     #ifdef IS_MPI
1208    
1209     // send out the linked list to all the other processes
1210    
1211     sprintf( checkPointMsg,
1212     "TraPPE_Ex torsion structures read successfully." );
1213     MPIcheckPoint();
1214    
1215     currentTorsionType = headTorsionType;
1216     while( currentTorsionType != NULL ){
1217     currentTorsionType->duplicate( info );
1218     sendFrcStruct( &info, mpiTorsionStructType );
1219     currentTorsionType = currentTorsionType->next;
1220     }
1221     info.last = 1;
1222     sendFrcStruct( &info, mpiTorsionStructType );
1223    
1224     }
1225    
1226     else{
1227    
1228     // listen for node 0 to send out the force params
1229    
1230     MPIcheckPoint();
1231    
1232     headTorsionType = new LinkedType;
1233     recieveFrcStruct( &info, mpiTorsionStructType );
1234     while( !info.last ){
1235    
1236     headTorsionType->add( info );
1237     recieveFrcStruct( &info, mpiTorsionStructType );
1238     }
1239     }
1240     #endif // is_mpi
1241    
1242     // initialize the Torsions
1243    
1244     for( i=0; i<nTorsions; i++ ){
1245    
1246     a = the_torsions[i].a;
1247     b = the_torsions[i].b;
1248     c = the_torsions[i].c;
1249     d = the_torsions[i].d;
1250    
1251     atomA = the_atoms[a]->getType();
1252     atomB = the_atoms[b]->getType();
1253     atomC = the_atoms[c]->getType();
1254     atomD = the_atoms[d]->getType();
1255     currentTorsionType = headTorsionType->find( atomA, atomB, atomC, atomD );
1256     if( currentTorsionType == NULL ){
1257     sprintf( painCave.errMsg,
1258     "TorsionType error, %s - %s - %s - %s not found"
1259     " in force file.\n",
1260     atomA, atomB, atomC, atomD );
1261     painCave.isFatal = 1;
1262     simError();
1263     }
1264    
1265     if( !strcmp( currentTorsionType->type, "cubic" ) ){
1266     index = i + entry_plug->n_bonds + entry_plug->n_bends;
1267    
1268     cTors = new CubicTorsion( *the_atoms[a], *the_atoms[b],
1269     *the_atoms[c], *the_atoms[d] );
1270     cTors->setConstants( currentTorsionType->k1, currentTorsionType->k2,
1271     currentTorsionType->k3, currentTorsionType->k4 );
1272     the_sris[index] = cTors;
1273     }
1274     }
1275    
1276    
1277     // clean up the memory
1278    
1279     delete headTorsionType;
1280    
1281     #ifdef IS_MPI
1282     sprintf( checkPointMsg, "TraPPE_Ex torsions initialized succesfully" );
1283     MPIcheckPoint();
1284     #endif // is_mpi
1285    
1286     }
1287 mmeineke 291
1288     void TraPPE_ExFF::fastForward( char* stopText, char* searchOwner ){
1289    
1290     int foundText = 0;
1291     char* the_token;
1292    
1293     rewind( frcFile );
1294     lineNum = 0;
1295    
1296     eof_test = fgets( readLine, sizeof(readLine), frcFile );
1297     lineNum++;
1298     if( eof_test == NULL ){
1299     sprintf( painCave.errMsg, "Error fast forwarding force file for %s: "
1300     " file is empty.\n",
1301     searchOwner );
1302     painCave.isFatal = 1;
1303     simError();
1304     }
1305    
1306    
1307     while( !foundText ){
1308     while( eof_test != NULL && readLine[0] != '#' ){
1309     eof_test = fgets( readLine, sizeof(readLine), frcFile );
1310     lineNum++;
1311     }
1312     if( eof_test == NULL ){
1313     sprintf( painCave.errMsg,
1314     "Error fast forwarding force file for %s at "
1315     "line %d: file ended unexpectedly.\n",
1316     searchOwner,
1317     lineNum );
1318     painCave.isFatal = 1;
1319     simError();
1320     }
1321    
1322     the_token = strtok( readLine, " ,;\t#\n" );
1323     foundText = !strcmp( stopText, the_token );
1324    
1325     if( !foundText ){
1326     eof_test = fgets( readLine, sizeof(readLine), frcFile );
1327     lineNum++;
1328    
1329     if( eof_test == NULL ){
1330     sprintf( painCave.errMsg,
1331     "Error fast forwarding force file for %s at "
1332     "line %d: file ended unexpectedly.\n",
1333     searchOwner,
1334     lineNum );
1335     painCave.isFatal = 1;
1336     simError();
1337     }
1338     }
1339     }
1340     }
1341    
1342    
1343     int parseAtom( char *lineBuffer, int lineNum, atomStruct &info ){
1344    
1345     char* the_token;
1346    
1347     the_token = strtok( lineBuffer, " \n\t,;" );
1348     if( the_token != NULL ){
1349    
1350     strcpy( info.name, the_token );
1351    
1352     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1353     sprintf( painCave.errMsg,
1354     "Error parseing AtomTypes: line %d\n", lineNum );
1355     painCave.isFatal = 1;
1356     simError();
1357     }
1358    
1359     info.isDipole = atoi( the_token );
1360    
1361     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1362     sprintf( painCave.errMsg,
1363     "Error parseing AtomTypes: line %d\n", lineNum );
1364     painCave.isFatal = 1;
1365     simError();
1366     }
1367    
1368     info.isSSD = atoi( the_token );
1369    
1370     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1371     sprintf( painCave.errMsg,
1372     "Error parseing AtomTypes: line %d\n", lineNum );
1373     painCave.isFatal = 1;
1374     simError();
1375     }
1376    
1377     info.mass = atof( the_token );
1378    
1379     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1380     sprintf( painCave.errMsg,
1381     "Error parseing AtomTypes: line %d\n", lineNum );
1382     painCave.isFatal = 1;
1383     simError();
1384     }
1385    
1386     info.epslon = atof( the_token );
1387    
1388     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1389     sprintf( painCave.errMsg,
1390     "Error parseing AtomTypes: line %d\n", lineNum );
1391     painCave.isFatal = 1;
1392     simError();
1393     }
1394    
1395     info.sigma = atof( the_token );
1396    
1397     if( info.isDipole ){
1398    
1399     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1400     sprintf( painCave.errMsg,
1401     "Error parseing AtomTypes: line %d\n", lineNum );
1402     painCave.isFatal = 1;
1403     simError();
1404     }
1405    
1406     info.dipole = atof( the_token );
1407     }
1408     else info.dipole = 0.0;
1409    
1410     if( info.isSSD ){
1411    
1412     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1413     sprintf( painCave.errMsg,
1414     "Error parseing AtomTypes: line %d\n", lineNum );
1415     painCave.isFatal = 1;
1416     simError();
1417     }
1418    
1419     info.w0 = atof( the_token );
1420    
1421     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1422     sprintf( painCave.errMsg,
1423     "Error parseing AtomTypes: line %d\n", lineNum );
1424     painCave.isFatal = 1;
1425     simError();
1426     }
1427    
1428     info.v0 = atof( the_token );
1429     }
1430     else info.v0 = info.w0 = 0.0;
1431    
1432     return 1;
1433     }
1434     else return 0;
1435     }
1436    
1437     int parseBond( char *lineBuffer, int lineNum, bondStruct &info ){
1438    
1439     char* the_token;
1440    
1441     the_token = strtok( lineBuffer, " \n\t,;" );
1442     if( the_token != NULL ){
1443    
1444     strcpy( info.nameA, the_token );
1445    
1446     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1447     sprintf( painCave.errMsg,
1448     "Error parseing BondTypes: line %d\n", lineNum );
1449     painCave.isFatal = 1;
1450     simError();
1451     }
1452    
1453     strcpy( info.nameB, the_token );
1454    
1455     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1456     sprintf( painCave.errMsg,
1457     "Error parseing BondTypes: line %d\n", lineNum );
1458     painCave.isFatal = 1;
1459     simError();
1460     }
1461    
1462     strcpy( info.type, the_token );
1463    
1464     if( !strcmp( info.type, "fixed" ) ){
1465     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1466     sprintf( painCave.errMsg,
1467     "Error parseing BondTypes: line %d\n", lineNum );
1468     painCave.isFatal = 1;
1469     simError();
1470     }
1471    
1472     info.d0 = atof( the_token );
1473     }
1474     else{
1475     sprintf( painCave.errMsg,
1476     "Unknown TraPPE_Ex bond type \"%s\" at line %d\n",
1477     info.type,
1478     lineNum );
1479     painCave.isFatal = 1;
1480     simError();
1481     }
1482    
1483     return 1;
1484     }
1485     else return 0;
1486     }
1487    
1488    
1489     int parseBend( char *lineBuffer, int lineNum, bendStruct &info ){
1490    
1491     char* the_token;
1492    
1493     the_token = strtok( lineBuffer, " \n\t,;" );
1494     if( the_token != NULL ){
1495    
1496     strcpy( info.nameA, the_token );
1497    
1498     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1499     sprintf( painCave.errMsg,
1500     "Error parseing BondTypes: line %d\n", lineNum );
1501     painCave.isFatal = 1;
1502     simError();
1503     }
1504    
1505     strcpy( info.nameB, the_token );
1506    
1507     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1508     sprintf( painCave.errMsg,
1509     "Error parseing BondTypes: line %d\n", lineNum );
1510     painCave.isFatal = 1;
1511     simError();
1512     }
1513    
1514     strcpy( info.nameC, the_token );
1515    
1516     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1517     sprintf( painCave.errMsg,
1518     "Error parseing BondTypes: line %d\n", lineNum );
1519     painCave.isFatal = 1;
1520     simError();
1521     }
1522    
1523     strcpy( info.type, the_token );
1524    
1525     if( !strcmp( info.type, "quadratic" ) ){
1526     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1527     sprintf( painCave.errMsg,
1528     "Error parseing BendTypes: line %d\n", lineNum );
1529     painCave.isFatal = 1;
1530     simError();
1531     }
1532    
1533     info.k1 = atof( the_token );
1534    
1535     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1536     sprintf( painCave.errMsg,
1537     "Error parseing BendTypes: line %d\n", lineNum );
1538     painCave.isFatal = 1;
1539     simError();
1540     }
1541    
1542     info.k2 = atof( the_token );
1543    
1544     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1545     sprintf( painCave.errMsg,
1546     "Error parseing BendTypes: line %d\n", lineNum );
1547     painCave.isFatal = 1;
1548     simError();
1549     }
1550    
1551     info.k3 = atof( the_token );
1552    
1553     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1554     sprintf( painCave.errMsg,
1555     "Error parseing BendTypes: line %d\n", lineNum );
1556     painCave.isFatal = 1;
1557     simError();
1558     }
1559    
1560     info.t0 = atof( the_token );
1561     }
1562    
1563     else{
1564     sprintf( painCave.errMsg,
1565     "Unknown TraPPE_Ex bend type \"%s\" at line %d\n",
1566     info.type,
1567     lineNum );
1568     painCave.isFatal = 1;
1569     simError();
1570     }
1571    
1572     return 1;
1573     }
1574     else return 0;
1575     }
1576    
1577     int parseTorsion( char *lineBuffer, int lineNum, torsionStruct &info ){
1578    
1579     char* the_token;
1580    
1581     the_token = strtok( lineBuffer, " \n\t,;" );
1582     if( the_token != NULL ){
1583    
1584     strcpy( info.nameA, the_token );
1585    
1586     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1587     sprintf( painCave.errMsg,
1588     "Error parseing TorsionTypes: line %d\n", lineNum );
1589     painCave.isFatal = 1;
1590     simError();
1591     }
1592    
1593     strcpy( info.nameB, the_token );
1594    
1595     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1596     sprintf( painCave.errMsg,
1597     "Error parseing TorsionTypes: line %d\n", lineNum );
1598     painCave.isFatal = 1;
1599     simError();
1600     }
1601    
1602     strcpy( info.nameC, the_token );
1603    
1604     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1605     sprintf( painCave.errMsg,
1606     "Error parseing TorsionTypes: line %d\n", lineNum );
1607     painCave.isFatal = 1;
1608     simError();
1609     }
1610    
1611     strcpy( info.nameD, the_token );
1612    
1613     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1614     sprintf( painCave.errMsg,
1615     "Error parseing TorsionTypes: line %d\n", lineNum );
1616     painCave.isFatal = 1;
1617     simError();
1618     }
1619    
1620     strcpy( info.type, the_token );
1621    
1622     if( !strcmp( info.type, "cubic" ) ){
1623     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1624     sprintf( painCave.errMsg,
1625     "Error parseing TorsionTypes: line %d\n", lineNum );
1626     painCave.isFatal = 1;
1627     simError();
1628     }
1629    
1630     info.k1 = atof( the_token );
1631    
1632     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1633     sprintf( painCave.errMsg,
1634     "Error parseing TorsionTypes: line %d\n", lineNum );
1635     painCave.isFatal = 1;
1636     simError();
1637     }
1638    
1639     info.k2 = atof( the_token );
1640    
1641     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1642     sprintf( painCave.errMsg,
1643     "Error parseing TorsionTypes: line %d\n", lineNum );
1644     painCave.isFatal = 1;
1645     simError();
1646     }
1647    
1648     info.k3 = atof( the_token );
1649    
1650     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1651     sprintf( painCave.errMsg,
1652     "Error parseing TorsionTypes: line %d\n", lineNum );
1653     painCave.isFatal = 1;
1654     simError();
1655     }
1656    
1657     info.k4 = atof( the_token );
1658    
1659     }
1660    
1661     else{
1662     sprintf( painCave.errMsg,
1663     "Unknown TraPPE_Ex torsion type \"%s\" at line %d\n",
1664     info.type,
1665     lineNum );
1666     painCave.isFatal = 1;
1667     simError();
1668     }
1669    
1670     return 1;
1671     }
1672    
1673     else return 0;
1674     }