ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/InitializeFromFile.cpp
Revision: 447
Committed: Thu Apr 3 20:21:54 2003 UTC (21 years, 3 months ago) by mmeineke
File size: 13274 byte(s)
Log Message:
fixed some small things with simError.h

File Contents

# User Rev Content
1 mmeineke 377 #include <iostream>
2     #include <cmath>
3    
4     #include <stdio.h>
5     #include <stdlib.h>
6     #include <string.h>
7     #include <unistd.h>
8     #include <sys/types.h>
9     #include <sys/stat.h>
10    
11     #include "ReadWrite.hpp"
12     #include "simError.h"
13    
14     #ifdef IS_MPI
15 gezelter 417 #include <mpi.h>
16 mmeineke 377 #include "mpiSimulation.hpp"
17 chuckv 436 #define TAKE_THIS_TAG_CHAR 0
18     #define TAKE_THIS_TAG_INT 1
19    
20 mmeineke 440 namespace initFile{
21     void nodeZeroError( void );
22     void anonymousNodeDie( void );
23     }
24 chuckv 436
25 mmeineke 440 using namespace initFile;
26    
27 mmeineke 377 #endif // is_mpi
28    
29     InitializeFromFile :: InitializeFromFile( char *in_name ){
30     #ifdef IS_MPI
31     if (worldRank == 0) {
32     #endif
33    
34     c_in_file = fopen(in_name, "r");
35     if(c_in_file == NULL){
36     sprintf(painCave.errMsg,
37     "Cannot open file: %s\n", in_name);
38     painCave.isFatal = 1;
39     simError();
40     }
41    
42     strcpy( c_in_name, in_name);
43     #ifdef IS_MPI
44     }
45     strcpy( checkPointMsg, "Infile opened for reading successfully." );
46     MPIcheckPoint();
47     #endif
48     return;
49     }
50    
51     InitializeFromFile :: ~InitializeFromFile( ){
52     #ifdef IS_MPI
53     if (worldRank == 0) {
54     #endif
55     int error;
56     error = fclose( c_in_file );
57     if( error ){
58     sprintf( painCave.errMsg,
59     "Error closing %s\n", c_in_name );
60     simError();
61     }
62     #ifdef IS_MPI
63     }
64     strcpy( checkPointMsg, "Infile closed successfully." );
65     MPIcheckPoint();
66     #endif
67    
68     return;
69     }
70    
71    
72     void InitializeFromFile :: read_xyz( SimInfo* the_entry_plug ){
73    
74 gezelter 417 int i, j, done, which_node, which_atom; // loop counter
75 mmeineke 377
76     const int BUFFERSIZE = 2000; // size of the read buffer
77     int n_atoms; // the number of atoms
78     char read_buffer[BUFFERSIZE]; //the line buffer for reading
79     #ifdef IS_MPI
80     char send_buffer[BUFFERSIZE];
81     #endif
82    
83     char *eof_test; // ptr to see when we reach the end of the file
84     char *parseErr;
85     int procIndex;
86    
87     entry_plug = the_entry_plug;
88    
89    
90     #ifndef IS_MPI
91     eof_test = fgets(read_buffer, sizeof(read_buffer), c_in_file);
92     if( eof_test == NULL ){
93     sprintf( painCave.errMsg,
94     "InitializeFromFile error: error reading 1st line of \"%s\"\n",
95     c_in_name );
96     painCave.isFatal = 1;
97     simError();
98     }
99    
100     n_atoms = atoi( read_buffer );
101    
102     Atom **atoms = entry_plug->atoms;
103     DirectionalAtom* dAtom;
104    
105     if( n_atoms != entry_plug->n_atoms ){
106     sprintf( painCave.errMsg,
107     "Initialize from File error. %s n_atoms, %d, "
108     "does not match the BASS file's n_atoms, %d.\n",
109     c_in_name, n_atoms, entry_plug->n_atoms );
110     painCave.isFatal = 1;
111     simError();
112     }
113    
114     //read and toss the comment line
115    
116     eof_test = fgets(read_buffer, sizeof(read_buffer), c_in_file);
117     if(eof_test == NULL){
118     sprintf( painCave.errMsg,
119     "error in reading commment in %s\n", c_in_name);
120     painCave.isFatal = 1;
121     simError();
122     }
123    
124     for( i=0; i < n_atoms; i++){
125    
126     eof_test = fgets(read_buffer, sizeof(read_buffer), c_in_file);
127     if(eof_test == NULL){
128     sprintf(painCave.errMsg,
129     "error in reading file %s\n"
130     "natoms = %d; index = %d\n"
131     "error reading the line from the file.\n",
132     c_in_name, n_atoms, i );
133     painCave.isFatal = 1;
134     simError();
135     }
136    
137    
138     parseErr = parseDumpLine( read_buffer, i );
139     if( parseErr != NULL ){
140     strcpy( painCave.errMsg, parseErr );
141     painCave.isFatal = 1;
142     simError();
143     }
144     }
145    
146    
147     // MPI Section of code..........
148     #else //IS_MPI
149    
150 chuckv 436 // first thing first, suspend fatalities.
151     painCave.isEventLoop = 1;
152    
153     int myStatus; // 1 = wakeup & success; 0 = error; -1 = AllDone
154     int haveError;
155    
156 mmeineke 447 MPI_Status istatus;
157 gezelter 417 int *AtomToProcMap = mpiSim->getAtomToProcMap();
158 mmeineke 377
159 chuckv 436
160     haveError = 0;
161 mmeineke 377 if (worldRank == 0) {
162 chuckv 436
163 mmeineke 377 eof_test = fgets(read_buffer, sizeof(read_buffer), c_in_file);
164     if( eof_test == NULL ){
165     sprintf( painCave.errMsg,
166     "Error reading 1st line of %d \n ",c_in_name);
167 chuckv 436 haveError = 1;
168 mmeineke 377 simError();
169     }
170    
171     n_atoms = atoi( read_buffer );
172    
173     Atom **atoms = entry_plug->atoms;
174     DirectionalAtom* dAtom;
175    
176     // Check to see that the number of atoms in the intial configuration file is the
177     // same as declared in simBass.
178    
179     if( n_atoms != mpiSim->getTotAtoms() ){
180     sprintf( painCave.errMsg,
181     "Initialize from File error. %s n_atoms, %d, "
182     "does not match the BASS file's n_atoms, %d.\n",
183     c_in_name, n_atoms, entry_plug->n_atoms );
184 chuckv 436 haveError= 1;
185 mmeineke 377 simError();
186     }
187    
188     //read and toss the comment line
189    
190     eof_test = fgets(read_buffer, sizeof(read_buffer), c_in_file);
191     if(eof_test == NULL){
192     sprintf( painCave.errMsg,
193     "error in reading commment in %s\n", c_in_name);
194 chuckv 436 haveError= 1;
195 mmeineke 377 simError();
196     }
197    
198 chuckv 436 if(haveError) nodeZeroError();
199 gezelter 417
200     for (i=0 ; i < mpiSim->getTotAtoms(); i++) {
201    
202 mmeineke 377 eof_test = fgets(read_buffer, sizeof(read_buffer), c_in_file);
203     if(eof_test == NULL){
204     sprintf(painCave.errMsg,
205     "error in reading file %s\n"
206     "natoms = %d; index = %d\n"
207     "error reading the line from the file.\n",
208     c_in_name, n_atoms, i );
209 chuckv 436 haveError= 1;
210 mmeineke 377 simError();
211     }
212    
213 chuckv 436 if(haveError) nodeZeroError();
214    
215 gezelter 417 // Get the Node number which wants this atom:
216     which_node = AtomToProcMap[i];
217 chuckv 436 if (which_node == 0) {
218 gezelter 417 parseErr = parseDumpLine( read_buffer, i );
219     if( parseErr != NULL ){
220     strcpy( painCave.errMsg, parseErr );
221 chuckv 436 haveError = 1;
222 gezelter 417 simError();
223     }
224 chuckv 436 if(haveError) nodeZeroError();
225     }
226    
227     else {
228    
229     myStatus = 1;
230 mmeineke 447 MPI_Send(&myStatus, 1, MPI_INT, which_node,
231     TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
232     MPI_Send(read_buffer, BUFFERSIZE, MPI_CHAR, which_node,
233     TAKE_THIS_TAG_CHAR, MPI_COMM_WORLD);
234     MPI_Send(&i, 1, MPI_INT, which_node, TAKE_THIS_TAG_INT,
235     MPI_COMM_WORLD);
236     MPI_Recv(&myStatus, 1, MPI_INT, which_node, TAKE_THIS_TAG_INT,
237     MPI_COMM_WORLD, &istatus);
238 chuckv 436
239     if(!myStatus) nodeZeroError();
240 mmeineke 377 }
241     }
242 chuckv 436 myStatus = -1;
243 gezelter 417 for (j = 0; j < mpiSim->getNumberProcessors(); j++) {
244 mmeineke 447 MPI_Send( &myStatus, 1, MPI_INT, j,
245     TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
246 gezelter 417 }
247 gezelter 419
248 gezelter 417 } else {
249 gezelter 419
250 gezelter 417 done = 0;
251     while (!done) {
252 chuckv 436
253 mmeineke 447 MPI_Recv(&myStatus, 1, MPI_INT, 0,
254     TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
255 chuckv 436
256     if(!myStatus) anonymousNodeDie();
257    
258     if(myStatus < 0) break;
259    
260 mmeineke 447 MPI_Recv(read_buffer, BUFFERSIZE, MPI_CHAR, 0,
261     TAKE_THIS_TAG_CHAR, MPI_COMM_WORLD, &istatus);
262     MPI_Recv(&which_atom, 1, MPI_INT, 0,
263     TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
264 chuckv 436
265     myStatus = 1;
266     parseErr = parseDumpLine( read_buffer, which_atom );
267     if( parseErr != NULL ){
268     strcpy( painCave.errMsg, parseErr );
269     myStatus = 0;;
270     simError();
271 mmeineke 377 }
272 chuckv 436
273 mmeineke 447 MPI_Send( &myStatus, 1, MPI_INT, 0,
274     TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
275 chuckv 436
276 mmeineke 377 }
277     }
278 chuckv 436
279     // last thing last, enable fatalities.
280     painCave.isEventLoop = 0;
281    
282 mmeineke 377 #endif
283     }
284    
285 gezelter 419 char* InitializeFromFile::parseDumpLine(char* readLine, int globalIndex){
286 mmeineke 377
287     char *foo; // the pointer to the current string token
288    
289     double rx, ry, rz; // position place holders
290     double vx, vy, vz; // velocity placeholders
291     double q[4]; // the quaternions
292     double jx, jy, jz; // angular velocity placeholders;
293     double qSqr, qLength; // needed to normalize the quaternion vector.
294    
295     Atom **atoms = entry_plug->atoms;
296     DirectionalAtom* dAtom;
297    
298 gezelter 419 int j, n_atoms, atomIndex;
299 mmeineke 377
300     #ifdef IS_MPI
301     n_atoms = mpiSim->getTotAtoms();
302 gezelter 419 atomIndex=-1;
303     for (j=0; j < mpiSim->getMyNlocal(); j++) {
304     if (atoms[j]->getGlobalIndex() == globalIndex) atomIndex = j;
305     }
306     if (atomIndex == -1) {
307     sprintf( painCave.errMsg,
308     "Initialize from file error. Atom at index %d "
309     "in file %s does not exist on processor %d .\n",
310     globalIndex, c_in_name, mpiSim->getMyNode() );
311     return strdup( painCave.errMsg );
312     }
313 mmeineke 377 #else
314     n_atoms = entry_plug->n_atoms;
315 gezelter 419 atomIndex = globalIndex;
316 mmeineke 377 #endif // is_mpi
317    
318     // set the string tokenizer
319    
320     foo = strtok(readLine, " ,;\t");
321    
322     // check the atom name to the current atom
323    
324     if( strcmp( foo, atoms[atomIndex]->getType() ) ){
325     sprintf( painCave.errMsg,
326     "Initialize from file error. Atom %s at index %d "
327     "in file %s does not"
328     " match the BASS atom %s.\n",
329     foo, atomIndex, c_in_name, atoms[atomIndex]->getType() );
330     return strdup( painCave.errMsg );
331     }
332    
333     // get the positions
334    
335     foo = strtok(NULL, " ,;\t");
336     if(foo == NULL){
337     sprintf( painCave.errMsg,
338     "error in reading postition x from %s\n"
339     "natoms = %d, index = %d\n",
340     c_in_name, n_atoms, atomIndex );
341     return strdup( painCave.errMsg );
342     }
343     rx = atof( foo );
344    
345     foo = strtok(NULL, " ,;\t");
346     if(foo == NULL){
347     sprintf( painCave.errMsg,
348     "error in reading postition y from %s\n"
349     "natoms = %d, index = %d\n",
350     c_in_name, n_atoms, atomIndex );
351     return strdup( painCave.errMsg );
352     }
353     ry = atof( foo );
354    
355     foo = strtok(NULL, " ,;\t");
356     if(foo == NULL){
357     sprintf( painCave.errMsg,
358     "error in reading postition z from %s\n"
359     "natoms = %d, index = %d\n",
360     c_in_name, n_atoms, atomIndex );
361     return strdup( painCave.errMsg );
362     }
363     rz = atof( foo );
364    
365    
366     // get the velocities
367    
368     foo = strtok(NULL, " ,;\t");
369     if(foo == NULL){
370     sprintf( painCave.errMsg,
371     "error in reading velocity x from %s\n"
372     "natoms = %d, index = %d\n",
373     c_in_name, n_atoms, atomIndex );
374     return strdup( painCave.errMsg );
375     }
376     vx = atof( foo );
377    
378     foo = strtok(NULL, " ,;\t");
379     if(foo == NULL){
380     sprintf( painCave.errMsg,
381     "error in reading velocity y from %s\n"
382     "natoms = %d, index = %d\n",
383     c_in_name, n_atoms, atomIndex );
384     return strdup( painCave.errMsg );
385     }
386     vy = atof( foo );
387    
388     foo = strtok(NULL, " ,;\t");
389     if(foo == NULL){
390     sprintf( painCave.errMsg,
391     "error in reading velocity z from %s\n"
392     "natoms = %d, index = %d\n",
393     c_in_name, n_atoms, atomIndex );
394     return strdup( painCave.errMsg );
395     }
396     vz = atof( foo );
397    
398    
399     // get the quaternions
400    
401     if( atoms[atomIndex]->isDirectional() ){
402    
403     foo = strtok(NULL, " ,;\t");
404     if(foo == NULL){
405     sprintf(painCave.errMsg,
406     "error in reading quaternion 0 from %s\n"
407     "natoms = %d, index = %d\n",
408     c_in_name, n_atoms, atomIndex );
409     return strdup( painCave.errMsg );
410     }
411     q[0] = atof( foo );
412    
413     foo = strtok(NULL, " ,;\t");
414     if(foo == NULL){
415     sprintf( painCave.errMsg,
416     "error in reading quaternion 1 from %s\n"
417     "natoms = %d, index = %d\n",
418     c_in_name, n_atoms, atomIndex );
419     return strdup( painCave.errMsg );
420     }
421     q[1] = atof( foo );
422    
423     foo = strtok(NULL, " ,;\t");
424     if(foo == NULL){
425     sprintf( painCave.errMsg,
426     "error in reading quaternion 2 from %s\n"
427     "natoms = %d, index = %d\n",
428     c_in_name, n_atoms, atomIndex );
429     return strdup( painCave.errMsg );
430     }
431     q[2] = atof( foo );
432    
433     foo = strtok(NULL, " ,;\t");
434     if(foo == NULL){
435     sprintf( painCave.errMsg,
436     "error in reading quaternion 3 from %s\n"
437     "natoms = %d, index = %d\n",
438     c_in_name, n_atoms, atomIndex );
439     return strdup( painCave.errMsg );
440     }
441     q[3] = atof( foo );
442    
443     // get the angular velocities
444    
445     foo = strtok(NULL, " ,;\t");
446     if(foo == NULL){
447     sprintf( painCave.errMsg,
448     "error in reading angular momentum jx from %s\n"
449     "natoms = %d, index = %d\n",
450     c_in_name, n_atoms, atomIndex );
451     return strdup( painCave.errMsg );
452     }
453     jx = atof( foo );
454    
455     foo = strtok(NULL, " ,;\t");
456     if(foo == NULL){
457     sprintf( painCave.errMsg,
458     "error in reading angular momentum jy from %s\n"
459     "natoms = %d, index = %d\n",
460     c_in_name, n_atoms, atomIndex );
461     return strdup( painCave.errMsg );
462     }
463     jy = atof(foo );
464    
465     foo = strtok(NULL, " ,;\t");
466     if(foo == NULL){
467     sprintf( painCave.errMsg,
468     "error in reading angular momentum jz from %s\n"
469     "natoms = %d, index = %d\n",
470     c_in_name, n_atoms, atomIndex );
471     return strdup( painCave.errMsg );
472     }
473     jz = atof( foo );
474    
475     dAtom = ( DirectionalAtom* )atoms[atomIndex];
476    
477     // check that the quaternion vector is normalized
478    
479     qSqr = (q[0] * q[0]) + (q[1] * q[1]) + (q[2] * q[2]) + (q[3] * q[3]);
480    
481     qLength = sqrt( qSqr );
482     q[0] = q[0] / qLength;
483     q[1] = q[1] / qLength;
484     q[2] = q[2] / qLength;
485     q[3] = q[3] / qLength;
486    
487     dAtom->setQ( q );
488    
489     // add the angular velocities
490    
491     dAtom->setJx( jx );
492     dAtom->setJy( jy );
493     dAtom->setJz( jz );
494     }
495    
496     // add the positions and velocities to the atom
497    
498     atoms[atomIndex]->setX( rx );
499     atoms[atomIndex]->setY( ry );
500     atoms[atomIndex]->setZ( rz );
501    
502     atoms[atomIndex]->set_vx( vx );
503     atoms[atomIndex]->set_vy( vy );
504     atoms[atomIndex]->set_vz( vz );
505    
506     return NULL;
507     }
508 chuckv 436
509    
510     #ifdef IS_MPI
511    
512     // a couple of functions to let us escape the read loop
513    
514 mmeineke 440 void initFile::nodeZeroError( void ){
515 chuckv 436 int j, myStatus;
516    
517     myStatus = 0;
518     for (j = 0; j < mpiSim->getNumberProcessors(); j++) {
519 mmeineke 447 MPI_Send( &myStatus, 1, MPI_INT, j,
520     TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
521 chuckv 436 }
522    
523    
524     MPI_Finalize();
525     exit (0);
526    
527     }
528    
529 mmeineke 440 void initFile::anonymousNodeDie( void ){
530 chuckv 436
531     MPI_Finalize();
532     exit (0);
533     }
534    
535     #endif //is_mpi