ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-2.0/src/UseTheForce/DUFF.cpp
Revision: 1636
Committed: Fri Oct 22 22:54:01 2004 UTC (19 years, 8 months ago) by chrisfen
File size: 44816 byte(s)
Log Message:
fixey fixey the breakey breakey

File Contents

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