ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/mdtools/interface_implementation/DipoleTestFF.cpp
Revision: 176
Committed: Thu Nov 14 22:00:44 2002 UTC (21 years, 7 months ago) by mmeineke
File size: 7051 byte(s)
Log Message:
*** empty log message ***

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 mmeineke 176 #include "simError.h"
11 mmeineke 10
12    
13     DipoleTestFF::DipoleTestFF(){
14    
15 mmeineke 176 #ifdef IS_MPI
16     sprintf( painCave.errMsg,
17     "DipoleTest ForceField does not currently support mpi" );
18     painCave.isFatal = 1;
19     simError();
20     #endif // is_mpi
21    
22 mmeineke 10 char fileName[200];
23     char* ffPath_env = "FORCE_PARAM_PATH";
24     char* ffPath;
25     char temp[200];
26    
27     // generate the force file name
28    
29     strcpy( fileName, "DipoleTest.frc" );
30    
31     // attempt to open the file in the current directory first.
32    
33     frcFile = fopen( fileName, "r" );
34    
35     if( frcFile == NULL ){
36    
37     // next see if the force path enviorment variable is set
38    
39     ffPath = getenv( ffPath_env );
40     strcpy( temp, ffPath );
41     strcat( temp, "/" );
42     strcat( temp, fileName );
43     strcpy( fileName, temp );
44    
45     frcFile = fopen( fileName, "r" );
46    
47     if( frcFile == NULL ){
48    
49     fprintf( stderr,
50     "Error opening the force field parameter file: %s\n"
51     "Have you tried setting the FORCE_PARAM_PATH environment "
52     "vairable?\n",
53     fileName );
54     exit( 8 );
55     }
56     }
57     }
58    
59     DipoleTestFF::~DipoleTestFF(){
60    
61     fclose( frcFile );
62     }
63    
64     void DipoleTestFF::initializeAtoms( void ){
65    
66     class LinkedType {
67     public:
68     LinkedType(){
69     next = NULL;
70     name[0] = '\0';
71     }
72     ~LinkedType(){ if( next != NULL ) delete next; }
73    
74     LinkedType* find(char* key){
75     if( !strcmp(name, key) ) return this;
76     if( next != NULL ) return next->find(key);
77     return NULL;
78     }
79    
80     char name[15];
81     int isDipole;
82     double mass;
83     double epslon;
84     double sigma;
85     double dipole;
86     LinkedType* next;
87     };
88    
89     LinkedType* headAtomType;
90     LinkedType* currentAtomType;
91     LinkedType* tempAtomType;
92    
93     char readLine[500];
94     char* the_token;
95     char* eof_test;
96     int foundAtom = 0;
97     int lineNum = 0;
98     int i;
99    
100     //////////////////////////////////////////////////
101     // a quick water fix
102    
103     double testI[3][3];
104     testI[0][0] = 1.76958347772500;
105     testI[0][1] = 0.0;
106     testI[0][2] = 0.0;
107    
108     testI[1][0] = 0.0;
109     testI[1][1] = 0.614537057924513;
110     testI[1][2] = 0.0;
111    
112     testI[2][0] = 0.0;
113     testI[2][1] = 0.0;
114     testI[2][2] = 1.15504641980049;
115    
116     //////////////////////////////////////////////////
117    
118     Atom** the_atoms;
119     int nAtoms;
120     the_atoms = entry_plug->atoms;
121     nAtoms = entry_plug->n_atoms;
122    
123     // read in the atom types.
124    
125     rewind( frcFile );
126     headAtomType = new LinkedType;
127     currentAtomType = headAtomType;
128    
129     eof_test = fgets( readLine, sizeof(readLine), frcFile );
130     lineNum++;
131     if( eof_test == NULL ){
132     fprintf( stderr, "Error in reading Atoms from force file.\n" );
133     exit(8);
134     }
135    
136    
137     while( !foundAtom ){
138     while( eof_test != NULL && readLine[0] != '#' ){
139     eof_test = fgets( readLine, sizeof(readLine), frcFile );
140     lineNum++;
141     }
142     if( eof_test == NULL ){
143     fprintf( stderr,
144     "Error in reading Atoms from force file at line %d.\n",
145     lineNum );
146     exit(8);
147     }
148    
149     the_token = strtok( readLine, " ,;\t#\n" );
150     foundAtom = !strcmp( "AtomTypes", the_token );
151    
152     if( !foundAtom ){
153     eof_test = fgets( readLine, sizeof(readLine), frcFile );
154     lineNum++;
155    
156     if( eof_test == NULL ){
157     fprintf( stderr,
158     "Error in reading Atoms from force file at line %d.\n",
159     lineNum );
160     exit(8);
161     }
162     }
163     }
164    
165     // we are now at the AtomTypes section.
166    
167     eof_test = fgets( readLine, sizeof(readLine), frcFile );
168     lineNum++;
169    
170     if( eof_test == NULL ){
171     fprintf( stderr,
172     "Error in reading Atoms from force file at line %d.\n",
173     lineNum );
174     exit(8);
175     }
176    
177     while( readLine[0] != '#' && eof_test != NULL ){
178    
179     if( readLine[0] != '!' ){
180    
181     the_token = strtok( readLine, " \n\t,;" );
182     if( the_token != NULL ){
183    
184     strcpy( currentAtomType->name, the_token );
185    
186     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
187     fprintf( stderr, "Error parseing AtomTypes: line %d\n", lineNum );
188     exit(8);
189     }
190    
191     sscanf( the_token, "%d", &currentAtomType->isDipole );
192    
193     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
194     fprintf( stderr, "Error parseing AtomTypes: line %d\n", lineNum );
195     exit(8);
196     }
197    
198     sscanf( the_token, "%lf", &currentAtomType->mass );
199    
200     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
201     fprintf( stderr, "Error parseing AtomTypes: line %d\n", lineNum );
202     exit(8);
203     }
204    
205     sscanf( the_token, "%lf", &currentAtomType->epslon );
206    
207     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
208     fprintf( stderr, "Error parseing AtomTypes: line %d\n", lineNum );
209     exit(8);
210     }
211    
212     sscanf( the_token, "%lf", &currentAtomType->sigma );
213    
214     if( currentAtomType->isDipole ){
215     if( ( the_token = strtok( NULL, " \n\t,;" ) ) == NULL ){
216     fprintf( stderr, "Error parseing AtomTypes: line %d\n", lineNum );
217     exit(8);
218     }
219    
220     sscanf( the_token, "%lf", &currentAtomType->dipole );
221     }
222     }
223     }
224    
225     tempAtomType = new LinkedType;
226     currentAtomType->next = tempAtomType;
227     currentAtomType = tempAtomType;
228    
229     eof_test = fgets( readLine, sizeof(readLine), frcFile );
230     lineNum++;
231     }
232    
233    
234     // initialize the atoms
235    
236     DirectionalAtom* dAtom;
237    
238     for( i=0; i<nAtoms; i++ ){
239    
240     currentAtomType = headAtomType->find( the_atoms[i]->getType() );
241     if( currentAtomType == NULL ){
242     fprintf( stderr, "AtomType error, %s not found in force file.\n",
243     the_atoms[i]->getType() );
244     exit(8);
245     }
246    
247     the_atoms[i]->setMass( currentAtomType->mass );
248     the_atoms[i]->setEpslon( currentAtomType->epslon );
249     the_atoms[i]->setSigma( currentAtomType->sigma );
250     the_atoms[i]->setLJ();
251    
252     if( currentAtomType->isDipole ){
253     if( the_atoms[i]->isDirectional() ){
254     dAtom = (DirectionalAtom *) the_atoms[i];
255     dAtom->setMu( currentAtomType->dipole );
256     dAtom->setHasDipole( 1 );
257     dAtom->setSSD( 1 );
258     dAtom->setJx( 0.0 );
259     dAtom->setJy( 0.0 );
260     dAtom->setJz( 0.0 );
261    
262     dAtom->setI( testI );
263    
264     entry_plug->n_dipoles++;
265     }
266     else{
267     std::cerr
268     << "DipoleTestFF error: Atom \""
269     << currentAtomType->name << "\" is a dipole, yet no standard"
270     << " orientation was specifed in the BASS file.\n";
271     exit(8);
272     }
273     }
274     else{
275     if( the_atoms[i]->isDirectional() ){
276     std::cerr
277     << "DipoleTestFF error: Atom \""
278     << currentAtomType->name << "\" was given a standard orientation"
279     << " in the BASS file, yet it is not a dipole.\n";
280     exit(8);
281     }
282     }
283     }
284    
285    
286     // clean up the memory
287    
288     delete headAtomType;
289     }
290    
291     void DipoleTestFF::initializeBonds( bond_pair* the_bonds ){
292    
293     if( entry_plug->n_bonds ){
294     std::cerr << "DipoleTest does not support bonds!\n";
295     exit(8);
296     }
297     }
298    
299     void DipoleTestFF::initializeBends( bend_set* the_bends ){
300    
301     if( entry_plug->n_bends ){
302     std::cerr << "DipoleTest does not support bends!\n";
303     exit(8);
304     }
305     }
306    
307     void DipoleTestFF::initializeTorsions( torsion_set* the_torsions ){
308    
309     if( entry_plug->n_torsions ){
310     std::cerr << "DipoleTest does not support torsions!\n";
311     exit(8);
312     }
313     }