ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/mdtools/interface_implementation/TraPPE_ExFF.cpp
Revision: 146
Committed: Fri Oct 18 16:15:05 2002 UTC (21 years, 8 months ago) by mmeineke
File size: 27409 byte(s)
Log Message:

finished adding in the extra structures needed to pass info through mpi. Still need to add the implementation.

File Contents

# User Rev Content
1 mmeineke 10 #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    
11    
12 chuckv 141 #ifdef IS_MPI
13    
14     int myNode;
15    
16     // Declare the structures that will be passed by MPI
17    
18     typedef struct{
19     char name[15];
20     double mass;
21     double epslon;
22     double sigma;
23     double dipole;
24     int isDipole;
25     int last; // 0 -> default
26     // 1 -> tells nodes to stop listening
27     // -1 -> an error has occured. (handled in mpiForceField)
28     } atomStruct;
29     MPI_Datatype mpiAtomStructType;
30    
31 mmeineke 146 typedef struct{
32     char nameA[15];
33     char nameB[15];
34     char type[30];
35     double d0;
36     int last; // 0 -> default
37     // 1 -> tells nodes to stop listening
38     // -1 -> an error has occured. (handled in mpiForceField)
39     } bondStruct;
40     MPI_Datatype mpiBondStructType;
41    
42     typedef struct{
43     char nameA[15];
44     char nameB[15];
45     char nameC[15];
46     char type[30];
47     double k1, k2, k3, t0;
48     int last; // 0 -> default
49     // 1 -> tells nodes to stop listening
50     // -1 -> an error has occured. (handled in mpiForceField)
51     } bendStruct;
52     MPI_Datatype mpiBendStructType;
53    
54     typedef struct{
55     char nameA[15];
56     char nameB[15];
57     char nameC[15];
58     char nameD[15];
59     char type[30];
60     double k1, k2, k3, k4;
61     int last; // 0 -> default
62     // 1 -> tells nodes to stop listening
63     // -1 -> an error has occured. (handled in mpiForceField)
64     } TorsionStruct;
65     MPI_Datatype mpiTorsionStructType;
66    
67 chuckv 141 #endif
68    
69    
70    
71 mmeineke 10 TraPPE_ExFF::TraPPE_ExFF(){
72    
73     char fileName[200];
74     char* ffPath_env = "FORCE_PARAM_PATH";
75     char* ffPath;
76     char temp[200];
77    
78 chuckv 141 #ifdef IS_MPI
79     int i;
80     int mpiError;
81 mmeineke 10
82 chuckv 141 mpiError = MPI_Comm_rank(MPI_COMM_WORLD,&myNode);
83    
84     atomStruct atomProto; // mpiPrototype
85     int atomBC[3] = {15,4,2}; // block counts
86     MPI_Aint atomDspls[3]; // displacements
87     MPI_Datatype atomMbrTypes[3]; // member mpi types
88    
89 chuckv 137
90    
91 chuckv 141 MPI_Address(&atomProto.name, &atomDspls[0]);
92     MPI_Address(&atomProto.mass, &atomDspls[1]);
93     MPI_Address(&atomProto.isDipole, &atomDspls[2]);
94 mmeineke 10
95 chuckv 141 atomMbrTypes[0] = MPI_CHAR;
96     atomMbrTypes[1] = MPI_DOUBLE;
97     atomMbrTypes[2] = MPI_INT;
98 mmeineke 10
99 chuckv 141 for (i=2; i >= 0; i--) atomDspls[i] -= atomDspls[0];
100    
101     MPI_Type_struct(3, atomBC, atomDspls, atomMbrTypes, &mpiAtomStructType);
102     MPI_Type_commit(&mpiAtomStructType);
103 mmeineke 10
104 chuckv 137
105    
106 mmeineke 10
107 chuckv 141 if( myNode == 0 ){
108     #endif
109    
110     // generate the force file name
111    
112     strcpy( fileName, "TraPPE_Ex.frc" );
113     fprintf( stderr,"Trying to open %s\n", fileName );
114    
115     // attempt to open the file in the current directory first.
116    
117 mmeineke 10 frcFile = fopen( fileName, "r" );
118    
119     if( frcFile == NULL ){
120    
121 chuckv 141 // next see if the force path enviorment variable is set
122    
123     ffPath = getenv( ffPath_env );
124     if( ffPath == NULL ) {
125     fprintf( stderr,
126     "Error opening the force field parameter file: %s\n"
127     "Have you tried setting the FORCE_PARAM_PATH environment "
128     "vairable?\n",
129     fileName );
130     exit( 8 );
131     }
132    
133    
134     strcpy( temp, ffPath );
135     strcat( temp, "/" );
136     strcat( temp, fileName );
137     strcpy( fileName, temp );
138    
139     frcFile = fopen( fileName, "r" );
140    
141     if( frcFile == NULL ){
142    
143     fprintf( stderr,
144     "Error opening the force field parameter file: %s\n"
145     "Have you tried setting the FORCE_PARAM_PATH environment "
146     "vairable?\n",
147     fileName );
148     exit( 8 );
149     }
150 mmeineke 10 }
151 chuckv 141 #ifdef IS_MPI
152 mmeineke 10 }
153 chuckv 141 #endif
154 mmeineke 10 }
155    
156 chuckv 141
157 mmeineke 10 TraPPE_ExFF::~TraPPE_ExFF(){
158    
159     fclose( frcFile );
160     }
161    
162     void TraPPE_ExFF::initializeAtoms( void ){
163    
164     class LinkedType {
165     public:
166     LinkedType(){
167     next = NULL;
168     name[0] = '\0';
169     }
170     ~LinkedType(){ if( next != NULL ) delete next; }
171    
172     LinkedType* find(char* key){
173     if( !strcmp(name, key) ) return this;
174     if( next != NULL ) return next->find(key);
175     return NULL;
176     }
177    
178 chuckv 141 #ifdef IS_MPI
179     void add( atomStruct &info ){
180     if( next != NULL ) next->add(info);
181     else{
182     next = new LinkedType();
183     strcpy(next->name, info.name);
184     next->isDipole = info.dipole;
185     next->mass = info.mass;
186     next->epslon = info.epslon;
187     next->sigma = info.sigma;
188     next->dipole = info.dipole;
189     }
190     }
191    
192     void duplicate( atomStruct &info ){
193     strcpy(info.name, name);
194     info.isDipole = dipole;
195     info.mass = mass;
196     info.epslon = epslon;
197     info.sigma = sigma;
198     info.dipole = dipole;
199     info.last = 0;
200     }
201    
202    
203     #endif
204    
205 mmeineke 10 char name[15];
206     int isDipole;
207     double mass;
208     double epslon;
209     double sigma;
210     double dipole;
211     LinkedType* next;
212     };
213    
214     LinkedType* headAtomType;
215     LinkedType* currentAtomType;
216     LinkedType* tempAtomType;
217    
218     char readLine[500];
219     char* the_token;
220     char* eof_test;
221     int foundAtom = 0;
222     int lineNum = 0;
223     int i;
224    
225     //////////////////////////////////////////////////
226     // a quick water fix
227    
228     double waterI[3][3];
229     waterI[0][0] = 1.76958347772500;
230     waterI[0][1] = 0.0;
231     waterI[0][2] = 0.0;
232    
233     waterI[1][0] = 0.0;
234     waterI[1][1] = 0.614537057924513;
235     waterI[1][2] = 0.0;
236    
237     waterI[2][0] = 0.0;
238     waterI[2][1] = 0.0;
239     waterI[2][2] = 1.15504641980049;
240    
241    
242     double headI[3][3];
243     headI[0][0] = 1125;
244     headI[0][1] = 0.0;
245     headI[0][2] = 0.0;
246    
247     headI[1][0] = 0.0;
248     headI[1][1] = 1125;
249     headI[1][2] = 0.0;
250    
251     headI[2][0] = 0.0;
252     headI[2][1] = 0.0;
253     headI[2][2] = 250;
254    
255    
256    
257     //////////////////////////////////////////////////
258    
259     Atom** the_atoms;
260     int nAtoms;
261     the_atoms = entry_plug->atoms;
262     nAtoms = entry_plug->n_atoms;
263    
264     // read in the atom types.
265    
266     rewind( frcFile );
267     headAtomType = new LinkedType;
268     currentAtomType = headAtomType;
269    
270     eof_test = fgets( readLine, sizeof(readLine), frcFile );
271     lineNum++;
272     if( eof_test == NULL ){
273     fprintf( stderr, "Error in reading Atoms from force file.\n" );
274     exit(8);
275     }
276    
277    
278     while( !foundAtom ){
279     while( eof_test != NULL && readLine[0] != '#' ){
280     eof_test = fgets( readLine, sizeof(readLine), frcFile );
281     lineNum++;
282     }
283     if( eof_test == NULL ){
284     fprintf( stderr,
285     "Error in reading Atoms from force file at line %d.\n",
286     lineNum );
287     exit(8);
288     }
289    
290     the_token = strtok( readLine, " ,;\t#\n" );
291     foundAtom = !strcmp( "AtomTypes", the_token );
292    
293     if( !foundAtom ){
294     eof_test = fgets( readLine, sizeof(readLine), frcFile );
295     lineNum++;
296    
297     if( eof_test == NULL ){
298     fprintf( stderr,
299     "Error in reading Atoms from force file at line %d.\n",
300     lineNum );
301     exit(8);
302     }
303     }
304     }
305    
306     // we are now at the AtomTypes section.
307    
308     eof_test = fgets( readLine, sizeof(readLine), frcFile );
309     lineNum++;
310    
311     if( eof_test == NULL ){
312     fprintf( stderr,
313     "Error in reading Atoms from force file at line %d.\n",
314     lineNum );
315     exit(8);
316     }
317    
318     while( readLine[0] != '#' && eof_test != NULL ){
319    
320     if( readLine[0] != '!' ){
321    
322     the_token = strtok( readLine, " \n\t,;" );
323     if( the_token != NULL ){
324    
325     strcpy( currentAtomType->name, the_token );
326    
327     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
328     fprintf( stderr, "Error parseing AtomTypes: line %d\n", lineNum );
329     exit(8);
330     }
331    
332     sscanf( the_token, "%d", &currentAtomType->isDipole );
333    
334     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
335     fprintf( stderr, "Error parseing AtomTypes: line %d\n", lineNum );
336     exit(8);
337     }
338    
339     sscanf( the_token, "%lf", &currentAtomType->mass );
340    
341     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
342     fprintf( stderr, "Error parseing AtomTypes: line %d\n", lineNum );
343     exit(8);
344     }
345    
346     sscanf( the_token, "%lf", &currentAtomType->epslon );
347    
348     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
349     fprintf( stderr, "Error parseing AtomTypes: line %d\n", lineNum );
350     exit(8);
351     }
352    
353     sscanf( the_token, "%lf", &currentAtomType->sigma );
354    
355     if( currentAtomType->isDipole ){
356     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
357     fprintf( stderr, "Error parseing AtomTypes: line %d\n", lineNum );
358     exit(8);
359     }
360    
361     sscanf( the_token, "%lf", &currentAtomType->dipole );
362     }
363     }
364     }
365    
366     tempAtomType = new LinkedType;
367     currentAtomType->next = tempAtomType;
368     currentAtomType = tempAtomType;
369    
370     eof_test = fgets( readLine, sizeof(readLine), frcFile );
371     lineNum++;
372     }
373    
374    
375     // initialize the atoms
376    
377     DirectionalAtom* dAtom;
378    
379     for( i=0; i<nAtoms; i++ ){
380    
381     currentAtomType = headAtomType->find( the_atoms[i]->getType() );
382     if( currentAtomType == NULL ){
383     fprintf( stderr, "AtomType error, %s not found in force file.\n",
384     the_atoms[i]->getType() );
385     exit(8);
386     }
387    
388     the_atoms[i]->setMass( currentAtomType->mass );
389     the_atoms[i]->setEpslon( currentAtomType->epslon );
390     the_atoms[i]->setSigma( currentAtomType->sigma );
391     the_atoms[i]->setLJ();
392    
393     if( currentAtomType->isDipole ){
394     if( the_atoms[i]->isDirectional() ){
395    
396     dAtom = (DirectionalAtom *) the_atoms[i];
397     dAtom->setMu( currentAtomType->dipole );
398     dAtom->setHasDipole( 1 );
399     dAtom->setJx( 0.0 );
400     dAtom->setJy( 0.0 );
401     dAtom->setJz( 0.0 );
402    
403     if(!strcmp("SSD",the_atoms[i]->getType())){
404     dAtom->setI( waterI );
405     dAtom->setSSD( 1 );
406     }
407     else if(!strcmp("HEAD",the_atoms[i]->getType())){
408     dAtom->setI( headI );
409     dAtom->setSSD( 0 );
410     }
411     else{
412     fprintf(stderr,
413     "AtmType error, %s does not have a moment of inertia set.\n",
414     the_atoms[i]->getType() );
415     exit(8);
416     }
417     entry_plug->n_dipoles++;
418     }
419     else{
420     std::cerr
421     << "TraPPE_ExFF error: Atom \""
422     << currentAtomType->name << "\" is a dipole, yet no standard"
423     << " orientation was specifed in the BASS file.\n";
424     exit(8);
425     }
426     }
427     else{
428     if( the_atoms[i]->isDirectional() ){
429     std::cerr
430     << "TraPPE_ExFF error: Atom \""
431     << currentAtomType->name << "\" was given a standard orientation"
432     << " in the BASS file, yet it is not a dipole.\n";
433     exit(8);
434     }
435     }
436     }
437    
438    
439     // clean up the memory
440    
441     delete headAtomType;
442     }
443    
444     void TraPPE_ExFF::initializeBonds( bond_pair* the_bonds ){
445    
446     class LinkedType {
447     public:
448     LinkedType(){
449     next = NULL;
450     nameA[0] = '\0';
451     nameB[0] = '\0';
452     type[0] = '\0';
453     }
454     ~LinkedType(){ if( next != NULL ) delete next; }
455    
456     LinkedType* find(char* key1, char* key2){
457     if( !strcmp(nameA, key1 ) && !strcmp( nameB, key2 ) ) return this;
458     if( !strcmp(nameA, key2 ) && !strcmp( nameB, key1 ) ) return this;
459     if( next != NULL ) return next->find(key1, key2);
460     return NULL;
461     }
462    
463 mmeineke 146 #ifdef IS_MPI
464     void add( bondStruct &info ){
465     if( next != NULL ) next->add(info);
466     else{
467     next = new LinkedType();
468     strcpy(next->nameA, info.nameA);
469     strcpy(next->nameB, info.nameB);
470     strcpy(next->type, info.type);
471     next->d0 = info.d0;
472     }
473     }
474    
475     void duplicate( bondStruct &info ){
476     strcpy(info.nameA, nameA);
477     strcpy(info.nameB, nameB);
478     strcpy(info.type, type);
479     info.d0 = d0;
480     info.last = 0;
481     }
482    
483    
484     #endif
485    
486 mmeineke 10 char nameA[15];
487     char nameB[15];
488     char type[30];
489     double d0;
490    
491     LinkedType* next;
492     };
493    
494    
495    
496     LinkedType* headBondType;
497     LinkedType* currentBondType;
498     LinkedType* tempBondType;
499    
500     char readLine[500];
501     char* the_token;
502     char* eof_test;
503     int foundBond = 0;
504     int lineNum = 0;
505     int i, a, b;
506     char* atomA;
507     char* atomB;
508    
509     SRI **the_sris;
510     Atom** the_atoms;
511     int nBonds;
512     the_sris = entry_plug->sr_interactions;
513     the_atoms = entry_plug->atoms;
514     nBonds = entry_plug->n_bonds;
515    
516     // read in the bond types.
517    
518     rewind( frcFile );
519     headBondType = new LinkedType;
520     currentBondType = headBondType;
521    
522     eof_test = fgets( readLine, sizeof(readLine), frcFile );
523     lineNum++;
524     if( eof_test == NULL ){
525     fprintf( stderr, "Error in reading Bonds from force file.\n" );
526     exit(8);
527     }
528    
529    
530     while( !foundBond ){
531     while( eof_test != NULL && readLine[0] != '#' ){
532     eof_test = fgets( readLine, sizeof(readLine), frcFile );
533     lineNum++;
534     }
535     if( eof_test == NULL ){
536     fprintf( stderr,
537     "Error in reading Bonds from force file at line %d.\n",
538     lineNum );
539     exit(8);
540     }
541    
542     the_token = strtok( readLine, " ,;\t#\n" );
543     foundBond = !strcmp( "BondTypes", the_token );
544    
545     if( !foundBond ){
546     eof_test = fgets( readLine, sizeof(readLine), frcFile );
547     lineNum++;
548    
549     if( eof_test == NULL ){
550     fprintf( stderr,
551     "Error in reading Bonds from force file at line %d.\n",
552     lineNum );
553     exit(8);
554     }
555     }
556     }
557    
558     // we are now at the BondTypes section.
559    
560     eof_test = fgets( readLine, sizeof(readLine), frcFile );
561     lineNum++;
562    
563     if( eof_test == NULL ){
564     fprintf( stderr,
565     "Error in reading Bonds from force file at line %d.\n",
566     lineNum );
567     exit(8);
568     }
569    
570     while( readLine[0] != '#' && eof_test != NULL ){
571    
572     if( readLine[0] != '!' ){
573    
574     the_token = strtok( readLine, " \n\t,;" );
575     if( the_token != NULL ){
576    
577     strcpy( currentBondType->nameA, the_token );
578    
579     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
580     fprintf( stderr, "Error parseing BondTypes: line %d\n", lineNum );
581     exit(8);
582     }
583    
584     strcpy( currentBondType->nameB, the_token );
585    
586     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
587     fprintf( stderr, "Error parseing BondTypes: line %d\n", lineNum );
588     exit(8);
589     }
590    
591     strcpy( currentBondType->type, the_token );
592    
593     if( !strcmp( currentBondType->type, "fixed" ) ){
594     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
595     fprintf( stderr, "Error parseing BondTypes: line %d\n", lineNum );
596     exit(8);
597     }
598    
599     sscanf( the_token, "%lf", &currentBondType->d0 );
600     }
601    
602     else{
603     fprintf(stderr,
604     "Unknown TraPPE_Ex bond type \"%s\" at line %d\n",
605     currentBondType->type,
606     lineNum );
607     exit(8);
608     }
609     }
610     }
611    
612     tempBondType = new LinkedType;
613     currentBondType->next = tempBondType;
614     currentBondType = tempBondType;
615    
616     eof_test = fgets( readLine, sizeof(readLine), frcFile );
617     lineNum++;
618     }
619    
620    
621     // initialize the Bonds
622    
623    
624     for( i=0; i<nBonds; i++ ){
625    
626     a = the_bonds[i].a;
627     b = the_bonds[i].b;
628    
629     atomA = the_atoms[a]->getType();
630     atomB = the_atoms[b]->getType();
631     currentBondType = headBondType->find( atomA, atomB );
632     if( currentBondType == NULL ){
633     fprintf( stderr, "BondType error, %s - %s not found in force file.\n",
634     atomA, atomB );
635     exit(8);
636     }
637    
638     if( !strcmp( currentBondType->type, "fixed" ) ){
639    
640     the_sris[i] = new ConstrainedBond( *the_atoms[a],
641     *the_atoms[b],
642     currentBondType->d0 );
643     entry_plug->n_constraints++;
644     }
645     }
646    
647    
648     // clean up the memory
649    
650     delete headBondType;
651    
652     }
653    
654     void TraPPE_ExFF::initializeBends( bend_set* the_bends ){
655    
656     class LinkedType {
657     public:
658     LinkedType(){
659     next = NULL;
660     nameA[0] = '\0';
661     nameB[0] = '\0';
662     nameC[0] = '\0';
663     type[0] = '\0';
664     }
665     ~LinkedType(){ if( next != NULL ) delete next; }
666    
667     LinkedType* find( char* key1, char* key2, char* key3 ){
668     if( !strcmp( nameA, key1 ) && !strcmp( nameB, key2 )
669     && !strcmp( nameC, key3 ) ) return this;
670     if( !strcmp( nameA, key3 ) && !strcmp( nameB, key2 )
671     && !strcmp( nameC, key1 ) ) return this;
672     if( next != NULL ) return next->find(key1, key2, key3);
673     return NULL;
674     }
675    
676 mmeineke 146 #ifdef IS_MPI
677    
678     void add( bendStruct &info ){
679     if( next != NULL ) next->add(info);
680     else{
681     next = new LinkedType();
682     strcpy(next->nameA, info.nameA);
683     strcpy(next->nameB, info.nameB);
684     strcpy(next->nameC, info.nameC);
685     strcpy(next->type, info.type);
686     next->k1 = info.k1;
687     next->k2 = info.k2;
688     next->k3 = info.k3;
689     next->t0 = info.t0;
690     }
691     }
692    
693     void duplicate( bendStruct &info ){
694     strcpy(info.nameA, nameA);
695     strcpy(info.nameB, nameB);
696     strcpy(info.nameC, nameC);
697     strcpy(info.type, type);
698     info.k1 = k1;
699     info.k2 = k2;
700     info.k3 = k3;
701     info.t0 = t0;
702     info.last = 0;
703     }
704    
705     #endif
706    
707 mmeineke 10 char nameA[15];
708     char nameB[15];
709     char nameC[15];
710     char type[30];
711     double k1, k2, k3, t0;
712    
713     LinkedType* next;
714     };
715    
716     LinkedType* headBendType;
717     LinkedType* currentBendType;
718     LinkedType* tempBendType;
719    
720     char readLine[500];
721     char* the_token;
722     char* eof_test;
723     int foundBend = 0;
724     int lineNum = 0;
725     int i, a, b, c, index;
726     char* atomA;
727     char* atomB;
728     char* atomC;
729     QuadraticBend* qBend;
730    
731     SRI **the_sris;
732     Atom** the_atoms;
733     int nBends;
734     the_sris = entry_plug->sr_interactions;
735     the_atoms = entry_plug->atoms;
736     nBends = entry_plug->n_bends;
737    
738     // read in the bend types.
739    
740     rewind( frcFile );
741     headBendType = new LinkedType;
742     currentBendType = headBendType;
743    
744     eof_test = fgets( readLine, sizeof(readLine), frcFile );
745     lineNum++;
746     if( eof_test == NULL ){
747     fprintf( stderr, "Error in reading Bends from force file.\n" );
748     exit(8);
749     }
750    
751    
752     while( !foundBend ){
753     while( eof_test != NULL && readLine[0] != '#' ){
754     eof_test = fgets( readLine, sizeof(readLine), frcFile );
755     lineNum++;
756     }
757     if( eof_test == NULL ){
758     fprintf( stderr,
759     "Error in reading Bends from force file at line %d.\n",
760     lineNum );
761     exit(8);
762     }
763    
764     the_token = strtok( readLine, " ,;\t#\n" );
765     foundBend = !strcmp( "BendTypes", the_token );
766    
767     if( !foundBend ){
768     eof_test = fgets( readLine, sizeof(readLine), frcFile );
769     lineNum++;
770    
771     if( eof_test == NULL ){
772     fprintf( stderr,
773     "Error in reading Bends from force file at line %d.\n",
774     lineNum );
775     exit(8);
776     }
777     }
778     }
779    
780     // we are now at the BendTypes section.
781    
782     eof_test = fgets( readLine, sizeof(readLine), frcFile );
783     lineNum++;
784    
785     if( eof_test == NULL ){
786     fprintf( stderr,
787     "Error in reading Bends from force file at line %d.\n",
788     lineNum );
789     exit(8);
790     }
791    
792     while( readLine[0] != '#' && eof_test != NULL ){
793    
794     if( readLine[0] != '!' ){
795    
796     the_token = strtok( readLine, " \n\t,;" );
797     if( the_token != NULL ){
798    
799     strcpy( currentBendType->nameA, the_token );
800    
801     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
802     fprintf( stderr, "Error parseing BendTypes: line %d\n", lineNum );
803     exit(8);
804     }
805    
806     strcpy( currentBendType->nameB, the_token );
807    
808     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
809     fprintf( stderr, "Error parseing BendTypes: line %d\n", lineNum );
810     exit(8);
811     }
812    
813     strcpy( currentBendType->nameC, the_token );
814    
815     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
816     fprintf( stderr, "Error parseing BendTypes: line %d\n", lineNum );
817     exit(8);
818     }
819    
820     strcpy( currentBendType->type, the_token );
821    
822     if( !strcmp( currentBendType->type, "quadratic" ) ){
823     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
824     fprintf( stderr, "Error parseing BendTypes: line %d\n", lineNum );
825     exit(8);
826     }
827    
828     sscanf( the_token, "%lf", &currentBendType->k1 );
829    
830     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
831     fprintf( stderr, "Error parseing BendTypes: line %d\n", lineNum );
832     exit(8);
833     }
834    
835     sscanf( the_token, "%lf", &currentBendType->k2 );
836    
837     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
838     fprintf( stderr, "Error parseing BendTypes: line %d\n", lineNum );
839     exit(8);
840     }
841    
842     sscanf( the_token, "%lf", &currentBendType->k3 );
843    
844     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
845     fprintf( stderr, "Error parseing BendTypes: line %d\n", lineNum );
846     exit(8);
847     }
848    
849     sscanf( the_token, "%lf", &currentBendType->t0 );
850     }
851    
852     else{
853     fprintf(stderr,
854     "Unknown TraPPE_Ex bend type \"%s\" at line %d\n",
855     currentBendType->type,
856     lineNum );
857     exit(8);
858     }
859     }
860     }
861    
862     tempBendType = new LinkedType;
863     currentBendType->next = tempBendType;
864     currentBendType = tempBendType;
865    
866     eof_test = fgets( readLine, sizeof(readLine), frcFile );
867     lineNum++;
868     }
869    
870    
871     // initialize the Bends
872    
873     for( i=0; i<nBends; i++ ){
874    
875     a = the_bends[i].a;
876     b = the_bends[i].b;
877     c = the_bends[i].c;
878    
879     atomA = the_atoms[a]->getType();
880     atomB = the_atoms[b]->getType();
881     atomC = the_atoms[c]->getType();
882     currentBendType = headBendType->find( atomA, atomB, atomC );
883     if( currentBendType == NULL ){
884     fprintf( stderr, "BendType error, %s - %s - %s not found"
885     " in force file.\n",
886     atomA, atomB, atomC );
887     exit(8);
888     }
889    
890     if( !strcmp( currentBendType->type, "quadratic" ) ){
891    
892     index = i + entry_plug->n_bonds;
893     qBend = new QuadraticBend( *the_atoms[a],
894     *the_atoms[b],
895     *the_atoms[c] );
896     qBend->setConstants( currentBendType->k1,
897     currentBendType->k2,
898     currentBendType->k3,
899     currentBendType->t0 );
900     the_sris[index] = qBend;
901     }
902     }
903    
904    
905     // clean up the memory
906    
907     delete headBendType;
908    
909     }
910    
911     void TraPPE_ExFF::initializeTorsions( torsion_set* the_torsions ){
912    
913     class LinkedType {
914     public:
915     LinkedType(){
916     next = NULL;
917     nameA[0] = '\0';
918     nameB[0] = '\0';
919     nameC[0] = '\0';
920     type[0] = '\0';
921     }
922     ~LinkedType(){ if( next != NULL ) delete next; }
923    
924     LinkedType* find( char* key1, char* key2, char* key3, char* key4 ){
925     if( !strcmp( nameA, key1 ) && !strcmp( nameB, key2 ) &&
926     !strcmp( nameC, key3 ) && !strcmp( nameD, key4 ) ) return this;
927    
928     if( !strcmp( nameA, key4 ) && !strcmp( nameB, key3 ) &&
929     !strcmp( nameC, key2 ) && !strcmp( nameD, key4 ) ) return this;
930    
931     if( next != NULL ) return next->find(key1, key2, key3, key4);
932     return NULL;
933     }
934    
935 mmeineke 146 #ifdef IS_MPI
936    
937     void add( torsionStruct &info ){
938     if( next != NULL ) next->add(info);
939     else{
940     next = new LinkedType();
941     strcpy(next->nameA, info.nameA);
942     strcpy(next->nameB, info.nameB);
943     strcpy(next->nameC, info.nameC);
944     strcpy(next->type, info.type);
945     next->k1 = info.k1;
946     next->k2 = info.k2;
947     next->k3 = info.k3;
948     next->k4 = info.k4;
949     }
950     }
951    
952     void duplicate( torsionStruct &info ){
953     strcpy(info.nameA, nameA);
954     strcpy(info.nameB, nameB);
955     strcpy(info.nameC, nameC);
956     strcpy(info.nameD, nameD);
957     strcpy(info.type, type);
958     info.k1 = k1;
959     info.k2 = k2;
960     info.k3 = k3;
961     info.k4 = k4;
962     info.last = 0;
963     }
964    
965     #endif
966    
967 mmeineke 10 char nameA[15];
968     char nameB[15];
969     char nameC[15];
970     char nameD[15];
971     char type[30];
972     double k1, k2, k3, k4;
973    
974     LinkedType* next;
975     };
976    
977     LinkedType* headTorsionType;
978     LinkedType* currentTorsionType;
979     LinkedType* tempTorsionType;
980    
981     char readLine[500];
982     char* the_token;
983     char* eof_test;
984     int foundTorsion = 0;
985     int lineNum = 0;
986     int i, a, b, c, d, index;
987     char* atomA;
988     char* atomB;
989     char* atomC;
990     char* atomD;
991     CubicTorsion* cTors;
992    
993     SRI **the_sris;
994     Atom** the_atoms;
995     int nTorsions;
996     the_sris = entry_plug->sr_interactions;
997     the_atoms = entry_plug->atoms;
998     nTorsions = entry_plug->n_torsions;
999    
1000     // read in the torsion types.
1001    
1002     rewind( frcFile );
1003     headTorsionType = new LinkedType;
1004     currentTorsionType = headTorsionType;
1005    
1006     eof_test = fgets( readLine, sizeof(readLine), frcFile );
1007     lineNum++;
1008     if( eof_test == NULL ){
1009     fprintf( stderr, "Error in reading Torsions from force file.\n" );
1010     exit(8);
1011     }
1012    
1013    
1014     while( !foundTorsion ){
1015     while( eof_test != NULL && readLine[0] != '#' ){
1016     eof_test = fgets( readLine, sizeof(readLine), frcFile );
1017     lineNum++;
1018     }
1019     if( eof_test == NULL ){
1020     fprintf( stderr,
1021     "Error in reading Torsions from force file at line %d.\n",
1022     lineNum );
1023     exit(8);
1024     }
1025    
1026     the_token = strtok( readLine, " ,;\t#\n" );
1027     foundTorsion = !strcmp( "TorsionTypes", the_token );
1028    
1029     if( !foundTorsion ){
1030     eof_test = fgets( readLine, sizeof(readLine), frcFile );
1031     lineNum++;
1032    
1033     if( eof_test == NULL ){
1034     fprintf( stderr,
1035     "Error in reading Torsions from force file at line %d.\n",
1036     lineNum );
1037     exit(8);
1038     }
1039     }
1040     }
1041    
1042     // we are now at the TorsionTypes section.
1043    
1044     eof_test = fgets( readLine, sizeof(readLine), frcFile );
1045     lineNum++;
1046    
1047     if( eof_test == NULL ){
1048     fprintf( stderr,
1049     "Error in reading Torsions from force file at line %d.\n",
1050     lineNum );
1051     exit(8);
1052     }
1053    
1054     while( readLine[0] != '#' && eof_test != NULL ){
1055    
1056     if( readLine[0] != '!' ){
1057    
1058     the_token = strtok( readLine, " \n\t,;" );
1059     if( the_token != NULL ){
1060    
1061     strcpy( currentTorsionType->nameA, the_token );
1062    
1063     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1064     fprintf( stderr, "Error parseing TorsionTypes: line %d\n", lineNum );
1065     exit(8);
1066     }
1067    
1068     strcpy( currentTorsionType->nameB, the_token );
1069    
1070     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1071     fprintf( stderr, "Error parseing TorsionTypes: line %d\n", lineNum );
1072     exit(8);
1073     }
1074    
1075     strcpy( currentTorsionType->nameC, the_token );
1076    
1077     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1078     fprintf( stderr, "Error parseing TorsionTypes: line %d\n", lineNum );
1079     exit(8);
1080     }
1081    
1082     strcpy( currentTorsionType->nameD, the_token );
1083    
1084     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1085     fprintf( stderr, "Error parseing TorsionTypes: line %d\n", lineNum );
1086     exit(8);
1087     }
1088    
1089     strcpy( currentTorsionType->type, the_token );
1090    
1091     if( !strcmp( currentTorsionType->type, "cubic" ) ){
1092     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1093     fprintf(stderr,"Error parseing TorsionTypes: line %d\n", lineNum );
1094     exit(8);
1095     }
1096    
1097     sscanf( the_token, "%lf", &currentTorsionType->k1 );
1098    
1099     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1100     fprintf(stderr,"Error parseing TorsionTypes: line %d\n", lineNum );
1101     exit(8);
1102     }
1103    
1104     sscanf( the_token, "%lf", &currentTorsionType->k2 );
1105    
1106     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1107     fprintf(stderr,"Error parseing TorsionTypes: line %d\n", lineNum );
1108     exit(8);
1109     }
1110    
1111     sscanf( the_token, "%lf", &currentTorsionType->k3 );
1112    
1113     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
1114     fprintf(stderr,"Error parseing TorsionTypes: line %d\n", lineNum );
1115     exit(8);
1116     }
1117    
1118     sscanf( the_token, "%lf", &currentTorsionType->k4 );
1119     }
1120    
1121     else{
1122     fprintf(stderr,
1123     "Unknown TraPPE_Ex torsion type \"%s\" at line %d\n",
1124     currentTorsionType->type,
1125     lineNum );
1126     exit(8);
1127     }
1128     }
1129     }
1130    
1131     tempTorsionType = new LinkedType;
1132     currentTorsionType->next = tempTorsionType;
1133     currentTorsionType = tempTorsionType;
1134    
1135     eof_test = fgets( readLine, sizeof(readLine), frcFile );
1136     lineNum++;
1137     }
1138    
1139    
1140     // initialize the Torsions
1141    
1142     for( i=0; i<nTorsions; i++ ){
1143    
1144     a = the_torsions[i].a;
1145     b = the_torsions[i].b;
1146     c = the_torsions[i].c;
1147     d = the_torsions[i].d;
1148    
1149     atomA = the_atoms[a]->getType();
1150     atomB = the_atoms[b]->getType();
1151     atomC = the_atoms[c]->getType();
1152     atomD = the_atoms[d]->getType();
1153     currentTorsionType = headTorsionType->find( atomA, atomB, atomC, atomD );
1154     if( currentTorsionType == NULL ){
1155     fprintf( stderr, "TorsionType error, %s - %s - %s - %s not found"
1156     " in force file.\n",
1157     atomA, atomB, atomC, atomD );
1158     exit(8);
1159     }
1160    
1161     if( !strcmp( currentTorsionType->type, "cubic" ) ){
1162     index = i + entry_plug->n_bonds + entry_plug->n_bends;
1163    
1164     cTors = new CubicTorsion( *the_atoms[a], *the_atoms[b],
1165     *the_atoms[c], *the_atoms[d] );
1166     cTors->setConstants( currentTorsionType->k1, currentTorsionType->k2,
1167     currentTorsionType->k3, currentTorsionType->k4 );
1168     the_sris[index] = cTors;
1169     }
1170     }
1171    
1172    
1173     // clean up the memory
1174    
1175     delete headTorsionType;
1176    
1177     }