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> 5*7d6b7e55SCameron 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 int GPID; 13459599516SKenneth E. Jansen 13559599516SKenneth E. Jansen // Calculate number of parts each proc deal with and where it start and end ... 13659599516SKenneth E. Jansen int nppp = numparts/nprocs;// nppp : Number of parts per proc ... 13759599516SKenneth E. Jansen int startpart = irank * nppp +1;// Part id from which I (myrank) start ... 13859599516SKenneth E. Jansen int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ... 13959599516SKenneth E. Jansen 14059599516SKenneth E. Jansen int descriptor; 14159599516SKenneth E. Jansen char filename[255],path[255],fieldtag_s[255]; 142*7d6b7e55SCameron Smith memset((void*)filename,0,255); 143*7d6b7e55SCameron Smith memset((void*)fieldtag_s,0,255); 14459599516SKenneth E. Jansen *foundd2wall = 0; 14559599516SKenneth E. Jansen //////////////////////////////////////////////////// 14659599516SKenneth E. Jansen // First we try to read dwal from the restart files. 14759599516SKenneth E. Jansen //////////////////////////////////////////////////// 14859599516SKenneth E. Jansen 14959599516SKenneth E. Jansen sprintf(filename,"restart-dat.%d.%d", timdat.lstep, ((int)(irank/(nprocs/nfiles))+1)); 15059599516SKenneth E. Jansen queryphmpiio(filename, &nfields, &nppf); 15159599516SKenneth E. Jansen initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "read"); 15259599516SKenneth E. Jansen 15359599516SKenneth E. Jansen if (irank==0) { 15459599516SKenneth E. Jansen printf("Filename is %s \n",filename); 15559599516SKenneth E. Jansen } 15659599516SKenneth E. Jansen openfile(filename, "read", &f_descriptor); 15759599516SKenneth E. Jansen 15859599516SKenneth E. Jansen int i; 15959599516SKenneth E. Jansen for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor 16059599516SKenneth E. Jansen // GPID : global part id, corresponds to rank ... 16159599516SKenneth E. Jansen // e.g : (in this example) 16259599516SKenneth E. Jansen // proc 0 : 1--4 16359599516SKenneth E. Jansen // proc 1 : 5--8 ... 16459599516SKenneth E. Jansen GPID = startpart + i; 16559599516SKenneth E. Jansen 16659599516SKenneth E. Jansen // Write solution field ... 16759599516SKenneth E. Jansen sprintf(fieldtag_s,"dwal@%d",GPID); 16859599516SKenneth E. Jansen 16959599516SKenneth E. Jansen nitems = 2; 17059599516SKenneth E. Jansen readheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, "double", phasta_iotype); 17159599516SKenneth E. Jansen //iarray[ 0 ] = (*numnp); What we should get from readheader 17259599516SKenneth E. Jansen //iarray[ 1 ] = 1; 17359599516SKenneth E. Jansen 17459599516SKenneth E. Jansen if (iarray[0] == (*numnp)) { 17559599516SKenneth E. Jansen if (irank==0) { 17659599516SKenneth E. Jansen printf("d2wall field found in %s\n",filename); 17759599516SKenneth E. Jansen } 17859599516SKenneth E. Jansen *foundd2wall = 1; 17959599516SKenneth E. Jansen isize = (*numnp); 18059599516SKenneth E. Jansen readdatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype ); 18159599516SKenneth E. Jansen } 18259599516SKenneth E. Jansen else { //d2wall fields was not found in the restart file 18359599516SKenneth E. Jansen *foundd2wall = 0; 18459599516SKenneth E. Jansen if (irank==0) { 18559599516SKenneth E. Jansen printf("d2wall field not found in %s - trying d2wall files now\n",filename); 18659599516SKenneth E. Jansen } 18759599516SKenneth E. Jansen } 18859599516SKenneth E. Jansen } 18959599516SKenneth E. Jansen closefile(&f_descriptor, "read"); 19059599516SKenneth E. Jansen finalizephmpiio(&f_descriptor); 19159599516SKenneth E. Jansen 19259599516SKenneth E. Jansen //////////////////////////////////////////////////// 19359599516SKenneth E. Jansen // We try to read dwal from the d2wall files if not found in the restart files 19459599516SKenneth E. Jansen //////////////////////////////////////////////////// 19559599516SKenneth E. Jansen 19659599516SKenneth E. Jansen int numd2wallfiles; 19759599516SKenneth E. Jansen if (*foundd2wall == 0) { 19859599516SKenneth E. Jansen 19959599516SKenneth E. Jansen detectd2wallfiles(&numd2wallfiles); 20059599516SKenneth E. Jansen 20159599516SKenneth E. Jansen if (numd2wallfiles == outpar.nsynciofiles ) { 20259599516SKenneth E. Jansen // Read the d2wall field from the d2wall files 203*7d6b7e55SCameron Smith memset((void*)filename,0,255); 204*7d6b7e55SCameron Smith memset((void*)fieldtag_s,0,255); 20559599516SKenneth E. Jansen 20659599516SKenneth E. Jansen sprintf(filename,"d2wall.%d",((int)(irank/(nprocs/nfiles))+1)); 20759599516SKenneth E. Jansen queryphmpiio(filename, &nfields, &nppf); 20859599516SKenneth E. Jansen initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "read"); 20959599516SKenneth E. Jansen 21059599516SKenneth E. Jansen if (irank==0) { 21159599516SKenneth E. Jansen printf("Filename is %s \n",filename); 21259599516SKenneth E. Jansen } 21359599516SKenneth E. Jansen openfile(filename, "read", &f_descriptor); 21459599516SKenneth E. Jansen 21559599516SKenneth E. Jansen int i; 21659599516SKenneth E. Jansen for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor 21759599516SKenneth E. Jansen // GPID : global part id, corresponds to rank ... 21859599516SKenneth E. Jansen // e.g : (in this example) 21959599516SKenneth E. Jansen // proc 0 : 1--4 22059599516SKenneth E. Jansen // proc 1 : 5--8 ... 22159599516SKenneth E. Jansen GPID = startpart + i; 22259599516SKenneth E. Jansen 22359599516SKenneth E. Jansen // Write solution field ... 22459599516SKenneth E. Jansen sprintf(fieldtag_s,"d2wall@%d",GPID); 22559599516SKenneth E. Jansen 22659599516SKenneth E. Jansen nitems = 2; 22759599516SKenneth E. Jansen readheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, "double", phasta_iotype); 22859599516SKenneth E. Jansen //iarray[ 0 ] = (*numnp); What we should get from readheader 22959599516SKenneth E. Jansen //iarray[ 1 ] = 1; 23059599516SKenneth E. Jansen 23159599516SKenneth E. Jansen if (iarray[0] == (*numnp)) { 23259599516SKenneth E. Jansen if (irank==0) { 23359599516SKenneth E. Jansen printf("d2wall field found in %s\n",filename); 23459599516SKenneth E. Jansen } 23559599516SKenneth E. Jansen *foundd2wall = 1; 23659599516SKenneth E. Jansen isize = (*numnp); 23759599516SKenneth E. Jansen readdatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype ); 23859599516SKenneth E. Jansen } 23959599516SKenneth E. Jansen else { 24059599516SKenneth E. Jansen *foundd2wall = 0; 24159599516SKenneth E. Jansen printf("WARNING - numnp not coherent in d2wall files: %d - %d\n",iarray[0],*numnp); 24259599516SKenneth E. Jansen printf("WARNING - Recomputing the d2wall field for safety\n"); 24359599516SKenneth E. Jansen } 24459599516SKenneth E. Jansen } 24559599516SKenneth E. Jansen 24659599516SKenneth E. Jansen closefile(&f_descriptor, "read"); 24759599516SKenneth E. Jansen finalizephmpiio(&f_descriptor); 24859599516SKenneth E. Jansen } 24959599516SKenneth E. Jansen else if (numd2wallfiles != 0) { 25059599516SKenneth E. Jansen // The number of d2wall file should be either 0 or outpar.nsynciofiles 25159599516SKenneth E. Jansen if (irank==0) { 25259599516SKenneth E. Jansen printf("WARNING - Number of d2wall files not coherent: %d - %d\n",numd2wallfiles,outpar.nsynciofiles); 25359599516SKenneth E. Jansen printf("WARNING - Recomputing the d2wall field for safety\n"); 25459599516SKenneth E. Jansen *foundd2wall = 0; 25559599516SKenneth E. Jansen } 25659599516SKenneth E. Jansen } 25759599516SKenneth E. Jansen } // end of tentative reading from d2wall files 25859599516SKenneth E. Jansen 25959599516SKenneth E. Jansen if (irank==0) { 26059599516SKenneth E. Jansen printf("\n"); 26159599516SKenneth E. Jansen } 26259599516SKenneth E. Jansen } 263