ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/mdtools/interface_implementation/TraPPE_ExFF.cpp
Revision: 141
Committed: Wed Oct 16 22:24:44 2002 UTC (21 years, 11 months ago) by chuckv
File size: 24605 byte(s)
Log Message:

adding ForceField mpi awareness


adding mpi FOrceField awareness

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