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