--- trunk/OOPSE/libmdtools/InitializeFromFile.cpp 2003/03/28 21:45:03 436 +++ trunk/OOPSE/libmdtools/InitializeFromFile.cpp 2003/07/21 16:23:10 641 @@ -13,14 +13,17 @@ #ifdef IS_MPI #include -#include #include "mpiSimulation.hpp" #define TAKE_THIS_TAG_CHAR 0 #define TAKE_THIS_TAG_INT 1 -void nodeZeroError( void ); -void anonymousNodeDie( void ); +namespace initFile{ + void nodeZeroError( void ); + void anonymousNodeDie( void ); +} +using namespace initFile; + #endif // is_mpi InitializeFromFile :: InitializeFromFile( char *in_name ){ @@ -66,7 +69,7 @@ InitializeFromFile :: ~InitializeFromFile( ){ } -void InitializeFromFile :: read_xyz( SimInfo* the_entry_plug ){ +void InitializeFromFile :: readInit( SimInfo* the_simnfo ){ int i, j, done, which_node, which_atom; // loop counter @@ -80,8 +83,10 @@ void InitializeFromFile :: read_xyz( SimInfo* the_entr char *eof_test; // ptr to see when we reach the end of the file char *parseErr; int procIndex; + double boxMat[9]; + double theBoxMat3[3][3]; - entry_plug = the_entry_plug; + simnfo = the_simnfo; #ifndef IS_MPI @@ -96,19 +101,19 @@ void InitializeFromFile :: read_xyz( SimInfo* the_entr n_atoms = atoi( read_buffer ); - Atom **atoms = entry_plug->atoms; + Atom **atoms = simnfo->atoms; DirectionalAtom* dAtom; - if( n_atoms != entry_plug->n_atoms ){ + if( n_atoms != simnfo->n_atoms ){ sprintf( painCave.errMsg, "Initialize from File error. %s n_atoms, %d, " "does not match the BASS file's n_atoms, %d.\n", - c_in_name, n_atoms, entry_plug->n_atoms ); + c_in_name, n_atoms, simnfo->n_atoms ); painCave.isFatal = 1; simError(); } - //read and toss the comment line + //read the box mat from the comment line eof_test = fgets(read_buffer, sizeof(read_buffer), c_in_file); if(eof_test == NULL){ @@ -118,6 +123,19 @@ void InitializeFromFile :: read_xyz( SimInfo* the_entr simError(); } + parseErr = parseBoxLine( read_buffer, boxMat ); + if( parseErr != NULL ){ + strcpy( painCave.errMsg, parseErr ); + painCave.isFatal = 1; + simError(); + } + + for(i=0;i<3;i++) + for(j=0;j<3;j++) theBoxMat3[i][j] = boxMat[3*j+i]; + + simnfo->setBoxM( theBoxMat3 ); + + for( i=0; i < n_atoms; i++){ eof_test = fgets(read_buffer, sizeof(read_buffer), c_in_file); @@ -137,7 +155,7 @@ void InitializeFromFile :: read_xyz( SimInfo* the_entr strcpy( painCave.errMsg, parseErr ); painCave.isFatal = 1; simError(); - } + } } @@ -150,7 +168,7 @@ void InitializeFromFile :: read_xyz( SimInfo* the_entr int myStatus; // 1 = wakeup & success; 0 = error; -1 = AllDone int haveError; - MPI::Status istatus; + MPI_Status istatus; int *AtomToProcMap = mpiSim->getAtomToProcMap(); @@ -167,7 +185,7 @@ void InitializeFromFile :: read_xyz( SimInfo* the_entr n_atoms = atoi( read_buffer ); - Atom **atoms = entry_plug->atoms; + Atom **atoms = simnfo->atoms; DirectionalAtom* dAtom; // Check to see that the number of atoms in the intial configuration file is the @@ -177,20 +195,29 @@ void InitializeFromFile :: read_xyz( SimInfo* the_entr sprintf( painCave.errMsg, "Initialize from File error. %s n_atoms, %d, " "does not match the BASS file's n_atoms, %d.\n", - c_in_name, n_atoms, entry_plug->n_atoms ); + c_in_name, n_atoms, simnfo->n_atoms ); haveError= 1; simError(); } - //read and toss the comment line + //read the boxMat from the comment line eof_test = fgets(read_buffer, sizeof(read_buffer), c_in_file); if(eof_test == NULL){ sprintf( painCave.errMsg, "error in reading commment in %s\n", c_in_name); - haveError= 1; + haveError = 1; + simError(); + } + + parseErr = parseBoxLine( read_buffer, boxMat ); + if( parseErr != NULL ){ + strcpy( painCave.errMsg, parseErr ); + haveError = 1; simError(); } + + MPI_Bcast(boxMat, 9, MPI_DOUBLE, 0, MPI_COMM_WORLD ); if(haveError) nodeZeroError(); @@ -224,38 +251,42 @@ void InitializeFromFile :: read_xyz( SimInfo* the_entr else { myStatus = 1; - MPI::COMM_WORLD.Send(&myStatus, 1, MPI_INT, which_node, - TAKE_THIS_TAG_INT); - MPI::COMM_WORLD.Send(read_buffer, BUFFERSIZE, MPI_CHAR, which_node, - TAKE_THIS_TAG_CHAR); - MPI::COMM_WORLD.Send(&i, 1, MPI_INT, which_node, TAKE_THIS_TAG_INT); - MPI::COMM_WORLD.Recv(&myStatus, 1, MPI_INT, which_node, TAKE_THIS_TAG_INT, istatus); + MPI_Send(&myStatus, 1, MPI_INT, which_node, + TAKE_THIS_TAG_INT, MPI_COMM_WORLD); + MPI_Send(read_buffer, BUFFERSIZE, MPI_CHAR, which_node, + TAKE_THIS_TAG_CHAR, MPI_COMM_WORLD); + MPI_Send(&i, 1, MPI_INT, which_node, TAKE_THIS_TAG_INT, + MPI_COMM_WORLD); + MPI_Recv(&myStatus, 1, MPI_INT, which_node, TAKE_THIS_TAG_INT, + MPI_COMM_WORLD, &istatus); if(!myStatus) nodeZeroError(); } } myStatus = -1; for (j = 0; j < mpiSim->getNumberProcessors(); j++) { - MPI::COMM_WORLD.Send( &myStatus, 1, MPI_INT, j, - TAKE_THIS_TAG_INT); + MPI_Send( &myStatus, 1, MPI_INT, j, + TAKE_THIS_TAG_INT, MPI_COMM_WORLD); } } else { + MPI_Bcast(boxMat, 9, MPI_DOUBLE, 0, MPI_COMM_WORLD); + done = 0; while (!done) { - MPI::COMM_WORLD.Recv(&myStatus, 1, MPI_INT, 0, - TAKE_THIS_TAG_INT, istatus); + MPI_Recv(&myStatus, 1, MPI_INT, 0, + TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus); if(!myStatus) anonymousNodeDie(); if(myStatus < 0) break; - MPI::COMM_WORLD.Recv(read_buffer, BUFFERSIZE, MPI_CHAR, 0, - TAKE_THIS_TAG_CHAR, istatus); - MPI::COMM_WORLD.Recv(&which_atom, 1, MPI_INT, 0, - TAKE_THIS_TAG_INT, istatus); + MPI_Recv(read_buffer, BUFFERSIZE, MPI_CHAR, 0, + TAKE_THIS_TAG_CHAR, MPI_COMM_WORLD, &istatus); + MPI_Recv(&which_atom, 1, MPI_INT, 0, + TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus); myStatus = 1; parseErr = parseDumpLine( read_buffer, which_atom ); @@ -265,14 +296,20 @@ void InitializeFromFile :: read_xyz( SimInfo* the_entr simError(); } - MPI::COMM_WORLD.Send( &myStatus, 1, MPI_INT, 0, - TAKE_THIS_TAG_INT); + MPI_Send( &myStatus, 1, MPI_INT, 0, + TAKE_THIS_TAG_INT, MPI_COMM_WORLD); } } // last thing last, enable fatalities. painCave.isEventLoop = 0; + + for(i=0;i<3;i++) + for(j=0;j<3;j++) theBoxMat3[i][j] = boxMat[3*j+i]; + + simnfo->setBoxM( theBoxMat3 ); + #endif } @@ -287,7 +324,7 @@ char* InitializeFromFile::parseDumpLine(char* readLine double jx, jy, jz; // angular velocity placeholders; double qSqr, qLength; // needed to normalize the quaternion vector. - Atom **atoms = entry_plug->atoms; + Atom **atoms = simnfo->atoms; DirectionalAtom* dAtom; int j, n_atoms, atomIndex; @@ -306,7 +343,7 @@ char* InitializeFromFile::parseDumpLine(char* readLine return strdup( painCave.errMsg ); } #else - n_atoms = entry_plug->n_atoms; + n_atoms = simnfo->n_atoms; atomIndex = globalIndex; #endif // is_mpi @@ -497,7 +534,116 @@ char* InitializeFromFile::parseDumpLine(char* readLine atoms[atomIndex]->set_vx( vx ); atoms[atomIndex]->set_vy( vy ); atoms[atomIndex]->set_vz( vz ); + + return NULL; +} + + +char* InitializeFromFile::parseBoxLine(char* readLine, double boxMat[9]){ + + char *foo; // the pointer to the current string token + int j; + // set the string tokenizer + + foo = strtok(readLine, " ,;\t"); + // set the timeToken. + + if(foo == NULL){ + sprintf( painCave.errMsg, + "error in reading Time from %s\n", + c_in_name ); + return strdup( painCave.errMsg ); + } + simnfo->currentTime = atof( foo ); + + // get the Hx vector + + foo = strtok(NULL, " ,;\t"); + if(foo == NULL){ + sprintf( painCave.errMsg, + "error in reading Hx[0] from %s\n", + c_in_name ); + return strdup( painCave.errMsg ); + } + boxMat[0] = atof( foo ); + + foo = strtok(NULL, " ,;\t"); + if(foo == NULL){ + sprintf( painCave.errMsg, + "error in reading Hx[1] from %s\n", + c_in_name ); + return strdup( painCave.errMsg ); + } + boxMat[1] = atof( foo ); + + foo = strtok(NULL, " ,;\t"); + if(foo == NULL){ + sprintf( painCave.errMsg, + "error in reading Hx[2] from %s\n", + c_in_name ); + return strdup( painCave.errMsg ); + } + boxMat[2] = atof( foo ); + + // get the Hy vector + + foo = strtok(NULL, " ,;\t"); + if(foo == NULL){ + sprintf( painCave.errMsg, + "error in reading Hy[0] from %s\n", + c_in_name ); + return strdup( painCave.errMsg ); + } + boxMat[3] = atof( foo ); + + foo = strtok(NULL, " ,;\t"); + if(foo == NULL){ + sprintf( painCave.errMsg, + "error in reading Hy[1] from %s\n", + c_in_name ); + return strdup( painCave.errMsg ); + } + boxMat[4] = atof( foo ); + + foo = strtok(NULL, " ,;\t"); + if(foo == NULL){ + sprintf( painCave.errMsg, + "error in reading Hy[2] from %s\n", + c_in_name ); + return strdup( painCave.errMsg ); + } + boxMat[5] = atof( foo ); + + // get the Hz vector + + foo = strtok(NULL, " ,;\t"); + if(foo == NULL){ + sprintf( painCave.errMsg, + "error in reading Hz[0] from %s\n", + c_in_name ); + return strdup( painCave.errMsg ); + } + boxMat[6] = atof( foo ); + + foo = strtok(NULL, " ,;\t"); + if(foo == NULL){ + sprintf( painCave.errMsg, + "error in reading Hz[1] from %s\n", + c_in_name ); + return strdup( painCave.errMsg ); + } + boxMat[7] = atof( foo ); + + foo = strtok(NULL, " ,;\t"); + if(foo == NULL){ + sprintf( painCave.errMsg, + "error in reading Hz[2] from %s\n", + c_in_name ); + return strdup( painCave.errMsg ); + } + boxMat[8] = atof( foo ); + return NULL; } @@ -506,13 +652,13 @@ char* InitializeFromFile::parseDumpLine(char* readLine // a couple of functions to let us escape the read loop -void nodeZeroError( void ){ +void initFile::nodeZeroError( void ){ int j, myStatus; myStatus = 0; for (j = 0; j < mpiSim->getNumberProcessors(); j++) { - MPI::COMM_WORLD.Send( &myStatus, 1, MPI_INT, j, - TAKE_THIS_TAG_INT); + MPI_Send( &myStatus, 1, MPI_INT, j, + TAKE_THIS_TAG_INT, MPI_COMM_WORLD); } @@ -521,7 +667,7 @@ void nodeZeroError( void ){ } -void anonymousNodeDie( void ){ +void initFile::anonymousNodeDie( void ){ MPI_Finalize(); exit (0);