159599516SKenneth E. Jansen #include <stdlib.h> 259599516SKenneth E. Jansen #include <FCMangle.h> 359599516SKenneth E. Jansen #include <new_interface.h> 459599516SKenneth E. Jansen #include <stdio.h> 57d6b7e55SCameron Smith #include <string.h> //memset 6d0f7e5e6SCameron Smith #include <assert.h> 759599516SKenneth E. Jansen #include "common_c.h" 859599516SKenneth E. Jansen #include "phastaIO.h" 9*d1293ce9SCameron Smith #include "phIO.h" 1059599516SKenneth E. Jansen #include "setsyncioparam.h" 1159599516SKenneth E. Jansen 1259599516SKenneth E. Jansen /* 1359599516SKenneth E. Jansen void 1459599516SKenneth E. Jansen read_d2wall( int* pid, 1559599516SKenneth E. Jansen int* numnp, 1659599516SKenneth E. Jansen double* array1 ) { 1759599516SKenneth E. Jansen 1859599516SKenneth E. Jansen // time_t timenow = time ( &timenow); 1959599516SKenneth E. Jansen int isize, nitems; 2059599516SKenneth E. Jansen int iarray[10]; 2159599516SKenneth E. Jansen 2259599516SKenneth E. Jansen //MPI_Barrier(MPI_COMM_WORLD); 2359599516SKenneth E. Jansen 2459599516SKenneth E. Jansen /////////////////////////////// Start of writing using new-lib //////////////////////////// 2559599516SKenneth E. Jansen 2659599516SKenneth E. Jansen int nfiles; 2759599516SKenneth E. Jansen int nfields; 2859599516SKenneth E. Jansen int numparts; 2959599516SKenneth E. Jansen int irank; 3059599516SKenneth E. Jansen int nprocs; 3159599516SKenneth E. Jansen 3259599516SKenneth E. Jansen // First, count the number of fields to write and store the result in 3359599516SKenneth E. Jansen //countfieldstowriterestart(); 3459599516SKenneth E. Jansen 3559599516SKenneth E. Jansen // Retrieve and compute the parameters required for SyncIO 3659599516SKenneth E. Jansen nfiles = outpar.nsynciofiles; 3759599516SKenneth E. Jansen // nfields = 1; //outpar.nsynciofieldswriterestart; // Only the distance to the walls in d2wall 3859599516SKenneth E. Jansen numparts = workfc.numpe; 3959599516SKenneth E. Jansen irank = *pid; // workfc.myrank; 4059599516SKenneth E. Jansen nprocs = workfc.numpe; 4159599516SKenneth E. Jansen int nppf = numparts/nfiles; 4259599516SKenneth E. Jansen int GPID; 4359599516SKenneth E. Jansen 4459599516SKenneth E. Jansen // Calculate number of parts each proc deal with and where it start and end ... 4559599516SKenneth E. Jansen int nppp = numparts/nprocs;// nppp : Number of parts per proc ... 4659599516SKenneth E. Jansen int startpart = irank * nppp +1;// Part id from which I (myrank) start ... 4759599516SKenneth E. Jansen int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ... 4859599516SKenneth E. Jansen 4959599516SKenneth E. Jansen int descriptor; 5059599516SKenneth E. Jansen char filename[255],path[255],fieldtag_s[255]; 5159599516SKenneth E. Jansen bzero((void*)filename,255); 5259599516SKenneth E. Jansen bzero((void*)fieldtag_s,255); 5359599516SKenneth E. Jansen 5459599516SKenneth E. Jansen sprintf(filename,"d2wall.%d",((int)(irank/(nprocs/nfiles))+1)); 5559599516SKenneth E. Jansen 5659599516SKenneth E. Jansen queryphmpiio(filename, &nfields, &nppf); 5759599516SKenneth E. Jansen 5859599516SKenneth E. Jansen initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "read"); 5959599516SKenneth E. Jansen 6059599516SKenneth E. Jansen if (irank==0) { 6159599516SKenneth E. Jansen printf("Filename is %s \n",filename); 6259599516SKenneth E. Jansen } 6359599516SKenneth E. Jansen openfile(filename, "read", &f_descriptor); 6459599516SKenneth E. Jansen 6559599516SKenneth E. Jansen field_flag=0; 6659599516SKenneth E. Jansen 6759599516SKenneth E. Jansen int i; 6859599516SKenneth E. Jansen for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor 6959599516SKenneth E. Jansen // GPID : global part id, corresponds to rank ... 7059599516SKenneth E. Jansen // e.g : (in this example) 7159599516SKenneth E. Jansen // proc 0 : 1--4 7259599516SKenneth E. Jansen // proc 1 : 5--8 ... 7359599516SKenneth E. Jansen GPID = startpart + i; 7459599516SKenneth E. Jansen 7559599516SKenneth E. Jansen // Write solution field ... 7659599516SKenneth E. Jansen sprintf(fieldtag_s,"d2wall@%d",GPID); 7759599516SKenneth E. Jansen 7859599516SKenneth E. Jansen nitems = 2; 7959599516SKenneth E. Jansen readheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, "double", phasta_iotype); 8059599516SKenneth E. Jansen //iarray[ 0 ] = (*numnp); What we should get from readheader 8159599516SKenneth E. Jansen //iarray[ 1 ] = 1; 8259599516SKenneth E. Jansen 8359599516SKenneth E. Jansen if (iarray[0] != (*numnp)) { 8459599516SKenneth E. Jansen printf("ERROR - numnp in d2wall.dat not coherent %d %d/n", iarray[0], *numnp); 8559599516SKenneth E. Jansen } 8659599516SKenneth E. Jansen 8759599516SKenneth E. Jansen isize = (*numnp); 8859599516SKenneth E. Jansen readdatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype ); 8959599516SKenneth E. Jansen 9059599516SKenneth E. Jansen } 9159599516SKenneth E. Jansen field_flag++; 9259599516SKenneth E. Jansen 9359599516SKenneth E. Jansen if (field_flag==1){ 9459599516SKenneth E. Jansen 9559599516SKenneth E. Jansen closefile(&f_descriptor, "read"); 9659599516SKenneth E. Jansen 9759599516SKenneth E. Jansen finalizephmpiio(&f_descriptor); 9859599516SKenneth E. Jansen 9959599516SKenneth E. Jansen if (irank==0) { 10059599516SKenneth E. Jansen printf("\n"); 10159599516SKenneth E. Jansen } 10259599516SKenneth E. Jansen } 10359599516SKenneth E. Jansen } 10459599516SKenneth E. Jansen */ 10559599516SKenneth E. Jansen 10659599516SKenneth E. Jansen 10759599516SKenneth E. Jansen void 10859599516SKenneth E. Jansen read_d2wall( int* pid, 10959599516SKenneth E. Jansen int* numnp, 11059599516SKenneth E. Jansen double* array1, 11159599516SKenneth E. Jansen int* foundd2wall ) { 11259599516SKenneth E. Jansen 11359599516SKenneth E. Jansen // time_t timenow = time ( &timenow); 11459599516SKenneth E. Jansen 11559599516SKenneth E. Jansen int isize, nitems; 11659599516SKenneth E. Jansen int iarray[10]; 11759599516SKenneth E. Jansen int j; 11859599516SKenneth E. Jansen for ( j = 0; j < 10; j++) { 11959599516SKenneth E. Jansen //Initialize iarray to 0 so that we can assess the result of readheader 12059599516SKenneth E. Jansen iarray[j] = 0; 12159599516SKenneth E. Jansen } 12259599516SKenneth E. Jansen 12359599516SKenneth E. Jansen int nfiles; 12459599516SKenneth E. Jansen int nfields; 12559599516SKenneth E. Jansen int numparts; 12659599516SKenneth E. Jansen int irank; 12759599516SKenneth E. Jansen int nprocs; 12859599516SKenneth E. Jansen 12959599516SKenneth E. Jansen // Retrieve and compute the parameters required for SyncIO 13059599516SKenneth E. Jansen nfiles = outpar.nsynciofiles; 13159599516SKenneth E. Jansen numparts = workfc.numpe; 13259599516SKenneth E. Jansen irank = *pid; // workfc.myrank; 13359599516SKenneth E. Jansen nprocs = workfc.numpe; 13459599516SKenneth E. Jansen int nppf = numparts/nfiles; 13559599516SKenneth E. Jansen 13659599516SKenneth E. Jansen // Calculate number of parts each proc deal with and where it start and end ... 13759599516SKenneth E. Jansen int nppp = numparts/nprocs;// nppp : Number of parts per proc ... 138d0f7e5e6SCameron Smith assert(nppp==1); 13959599516SKenneth E. Jansen int startpart = irank * nppp +1;// Part id from which I (myrank) start ... 14059599516SKenneth E. Jansen int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ... 14159599516SKenneth E. Jansen 14259599516SKenneth E. Jansen int descriptor; 14360ca4d1eSCameron Smith char filename[255],path[255]; 1447d6b7e55SCameron Smith memset((void*)filename,0,255); 14559599516SKenneth E. Jansen *foundd2wall = 0; 14659599516SKenneth E. Jansen //////////////////////////////////////////////////// 14759599516SKenneth E. Jansen // First we try to read dwal from the restart files. 14859599516SKenneth E. Jansen //////////////////////////////////////////////////// 14959599516SKenneth E. Jansen 15059599516SKenneth E. Jansen sprintf(filename,"restart-dat.%d.%d", timdat.lstep, ((int)(irank/(nprocs/nfiles))+1)); 15159599516SKenneth E. Jansen queryphmpiio(filename, &nfields, &nppf); 15259599516SKenneth E. Jansen initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "read"); 15359599516SKenneth E. Jansen 15459599516SKenneth E. Jansen if (irank==0) { 15559599516SKenneth E. Jansen printf("Filename is %s \n",filename); 15659599516SKenneth E. Jansen } 15759599516SKenneth E. Jansen openfile(filename, "read", &f_descriptor); 15859599516SKenneth E. Jansen 15959599516SKenneth E. Jansen int i; 16059599516SKenneth E. Jansen for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor 16159599516SKenneth E. Jansen nitems = 2; 162*d1293ce9SCameron Smith phio_readheader( &f_descriptor, "dwal", (void*)iarray, &nitems, "double", phasta_iotype); 16359599516SKenneth E. Jansen //iarray[ 0 ] = (*numnp); What we should get from readheader 16459599516SKenneth E. Jansen //iarray[ 1 ] = 1; 16559599516SKenneth E. Jansen 16659599516SKenneth E. Jansen if (iarray[0] == (*numnp)) { 16759599516SKenneth E. Jansen if (irank==0) { 16859599516SKenneth E. Jansen printf("d2wall field found in %s\n",filename); 16959599516SKenneth E. Jansen } 17059599516SKenneth E. Jansen *foundd2wall = 1; 17159599516SKenneth E. Jansen isize = (*numnp); 17260ca4d1eSCameron Smith readdatablock( &f_descriptor, "dwal", (void*)(array1), &isize, "double", phasta_iotype ); 17359599516SKenneth E. Jansen } 17459599516SKenneth E. Jansen else { //d2wall fields was not found in the restart file 17559599516SKenneth E. Jansen *foundd2wall = 0; 17659599516SKenneth E. Jansen if (irank==0) { 17759599516SKenneth E. Jansen printf("d2wall field not found in %s - trying d2wall files now\n",filename); 17859599516SKenneth E. Jansen } 17959599516SKenneth E. Jansen } 18059599516SKenneth E. Jansen } 18159599516SKenneth E. Jansen closefile(&f_descriptor, "read"); 18259599516SKenneth E. Jansen finalizephmpiio(&f_descriptor); 18359599516SKenneth E. Jansen 18459599516SKenneth E. Jansen //////////////////////////////////////////////////// 18559599516SKenneth E. Jansen // We try to read dwal from the d2wall files if not found in the restart files 18659599516SKenneth E. Jansen //////////////////////////////////////////////////// 18759599516SKenneth E. Jansen 18859599516SKenneth E. Jansen int numd2wallfiles; 18959599516SKenneth E. Jansen if (*foundd2wall == 0) { 19059599516SKenneth E. Jansen 19159599516SKenneth E. Jansen detectd2wallfiles(&numd2wallfiles); 19259599516SKenneth E. Jansen 19359599516SKenneth E. Jansen if (numd2wallfiles == outpar.nsynciofiles ) { 19459599516SKenneth E. Jansen // Read the d2wall field from the d2wall files 1957d6b7e55SCameron Smith memset((void*)filename,0,255); 19659599516SKenneth E. Jansen 19759599516SKenneth E. Jansen sprintf(filename,"d2wall.%d",((int)(irank/(nprocs/nfiles))+1)); 19859599516SKenneth E. Jansen queryphmpiio(filename, &nfields, &nppf); 19959599516SKenneth E. Jansen initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "read"); 20059599516SKenneth E. Jansen 20159599516SKenneth E. Jansen if (irank==0) { 20259599516SKenneth E. Jansen printf("Filename is %s \n",filename); 20359599516SKenneth E. Jansen } 20459599516SKenneth E. Jansen openfile(filename, "read", &f_descriptor); 20559599516SKenneth E. Jansen 20659599516SKenneth E. Jansen int i; 20759599516SKenneth E. Jansen for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor 20859599516SKenneth E. Jansen nitems = 2; 209*d1293ce9SCameron Smith phio_readheader( &f_descriptor, "d2wall", (void*)iarray, &nitems, "double", phasta_iotype); 21059599516SKenneth E. Jansen //iarray[ 0 ] = (*numnp); What we should get from readheader 21159599516SKenneth E. Jansen //iarray[ 1 ] = 1; 21259599516SKenneth E. Jansen 21359599516SKenneth E. Jansen if (iarray[0] == (*numnp)) { 21459599516SKenneth E. Jansen if (irank==0) { 21559599516SKenneth E. Jansen printf("d2wall field found in %s\n",filename); 21659599516SKenneth E. Jansen } 21759599516SKenneth E. Jansen *foundd2wall = 1; 21859599516SKenneth E. Jansen isize = (*numnp); 21960ca4d1eSCameron Smith readdatablock( &f_descriptor, "d2wall", (void*)(array1), &isize, "double", phasta_iotype ); 22059599516SKenneth E. Jansen } 22159599516SKenneth E. Jansen else { 22259599516SKenneth E. Jansen *foundd2wall = 0; 22359599516SKenneth E. Jansen printf("WARNING - numnp not coherent in d2wall files: %d - %d\n",iarray[0],*numnp); 22459599516SKenneth E. Jansen printf("WARNING - Recomputing the d2wall field for safety\n"); 22559599516SKenneth E. Jansen } 22659599516SKenneth E. Jansen } 22759599516SKenneth E. Jansen 22859599516SKenneth E. Jansen closefile(&f_descriptor, "read"); 22959599516SKenneth E. Jansen finalizephmpiio(&f_descriptor); 23059599516SKenneth E. Jansen } 23159599516SKenneth E. Jansen else if (numd2wallfiles != 0) { 23259599516SKenneth E. Jansen // The number of d2wall file should be either 0 or outpar.nsynciofiles 23359599516SKenneth E. Jansen if (irank==0) { 23459599516SKenneth E. Jansen printf("WARNING - Number of d2wall files not coherent: %d - %d\n",numd2wallfiles,outpar.nsynciofiles); 23559599516SKenneth E. Jansen printf("WARNING - Recomputing the d2wall field for safety\n"); 23659599516SKenneth E. Jansen *foundd2wall = 0; 23759599516SKenneth E. Jansen } 23859599516SKenneth E. Jansen } 23959599516SKenneth E. Jansen } // end of tentative reading from d2wall files 24059599516SKenneth E. Jansen 24159599516SKenneth E. Jansen if (irank==0) { 24259599516SKenneth E. Jansen printf("\n"); 24359599516SKenneth E. Jansen } 24459599516SKenneth E. Jansen } 245