1*59599516SKenneth E. Jansen #include <stdlib.h> 2*59599516SKenneth E. Jansen #include <FCMangle.h> 3*59599516SKenneth E. Jansen #include <new_interface.h> 4*59599516SKenneth E. Jansen #include <stdio.h> 5*59599516SKenneth E. Jansen #include "common_c.h" 6*59599516SKenneth E. Jansen #include "phastaIO.h" 7*59599516SKenneth E. Jansen #include "setsyncioparam.h" 8*59599516SKenneth E. Jansen 9*59599516SKenneth E. Jansen /* 10*59599516SKenneth E. Jansen void 11*59599516SKenneth E. Jansen read_d2wall( int* pid, 12*59599516SKenneth E. Jansen int* numnp, 13*59599516SKenneth E. Jansen double* array1 ) { 14*59599516SKenneth E. Jansen 15*59599516SKenneth E. Jansen // time_t timenow = time ( &timenow); 16*59599516SKenneth E. Jansen int isize, nitems; 17*59599516SKenneth E. Jansen int iarray[10]; 18*59599516SKenneth E. Jansen 19*59599516SKenneth E. Jansen //MPI_Barrier(MPI_COMM_WORLD); 20*59599516SKenneth E. Jansen 21*59599516SKenneth E. Jansen /////////////////////////////// Start of writing using new-lib //////////////////////////// 22*59599516SKenneth E. Jansen 23*59599516SKenneth E. Jansen int nfiles; 24*59599516SKenneth E. Jansen int nfields; 25*59599516SKenneth E. Jansen int numparts; 26*59599516SKenneth E. Jansen int irank; 27*59599516SKenneth E. Jansen int nprocs; 28*59599516SKenneth E. Jansen 29*59599516SKenneth E. Jansen // First, count the number of fields to write and store the result in 30*59599516SKenneth E. Jansen //countfieldstowriterestart(); 31*59599516SKenneth E. Jansen 32*59599516SKenneth E. Jansen // Retrieve and compute the parameters required for SyncIO 33*59599516SKenneth E. Jansen nfiles = outpar.nsynciofiles; 34*59599516SKenneth E. Jansen // nfields = 1; //outpar.nsynciofieldswriterestart; // Only the distance to the walls in d2wall 35*59599516SKenneth E. Jansen numparts = workfc.numpe; 36*59599516SKenneth E. Jansen irank = *pid; // workfc.myrank; 37*59599516SKenneth E. Jansen nprocs = workfc.numpe; 38*59599516SKenneth E. Jansen int nppf = numparts/nfiles; 39*59599516SKenneth E. Jansen int GPID; 40*59599516SKenneth E. Jansen 41*59599516SKenneth E. Jansen // Calculate number of parts each proc deal with and where it start and end ... 42*59599516SKenneth E. Jansen int nppp = numparts/nprocs;// nppp : Number of parts per proc ... 43*59599516SKenneth E. Jansen int startpart = irank * nppp +1;// Part id from which I (myrank) start ... 44*59599516SKenneth E. Jansen int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ... 45*59599516SKenneth E. Jansen 46*59599516SKenneth E. Jansen int descriptor; 47*59599516SKenneth E. Jansen char filename[255],path[255],fieldtag_s[255]; 48*59599516SKenneth E. Jansen bzero((void*)filename,255); 49*59599516SKenneth E. Jansen bzero((void*)fieldtag_s,255); 50*59599516SKenneth E. Jansen 51*59599516SKenneth E. Jansen sprintf(filename,"d2wall.%d",((int)(irank/(nprocs/nfiles))+1)); 52*59599516SKenneth E. Jansen 53*59599516SKenneth E. Jansen queryphmpiio(filename, &nfields, &nppf); 54*59599516SKenneth E. Jansen 55*59599516SKenneth E. Jansen initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "read"); 56*59599516SKenneth E. Jansen 57*59599516SKenneth E. Jansen if (irank==0) { 58*59599516SKenneth E. Jansen printf("Filename is %s \n",filename); 59*59599516SKenneth E. Jansen } 60*59599516SKenneth E. Jansen openfile(filename, "read", &f_descriptor); 61*59599516SKenneth E. Jansen 62*59599516SKenneth E. Jansen field_flag=0; 63*59599516SKenneth E. Jansen 64*59599516SKenneth E. Jansen int i; 65*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor 66*59599516SKenneth E. Jansen // GPID : global part id, corresponds to rank ... 67*59599516SKenneth E. Jansen // e.g : (in this example) 68*59599516SKenneth E. Jansen // proc 0 : 1--4 69*59599516SKenneth E. Jansen // proc 1 : 5--8 ... 70*59599516SKenneth E. Jansen GPID = startpart + i; 71*59599516SKenneth E. Jansen 72*59599516SKenneth E. Jansen // Write solution field ... 73*59599516SKenneth E. Jansen sprintf(fieldtag_s,"d2wall@%d",GPID); 74*59599516SKenneth E. Jansen 75*59599516SKenneth E. Jansen nitems = 2; 76*59599516SKenneth E. Jansen readheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, "double", phasta_iotype); 77*59599516SKenneth E. Jansen //iarray[ 0 ] = (*numnp); What we should get from readheader 78*59599516SKenneth E. Jansen //iarray[ 1 ] = 1; 79*59599516SKenneth E. Jansen 80*59599516SKenneth E. Jansen if (iarray[0] != (*numnp)) { 81*59599516SKenneth E. Jansen printf("ERROR - numnp in d2wall.dat not coherent %d %d/n", iarray[0], *numnp); 82*59599516SKenneth E. Jansen } 83*59599516SKenneth E. Jansen 84*59599516SKenneth E. Jansen isize = (*numnp); 85*59599516SKenneth E. Jansen readdatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype ); 86*59599516SKenneth E. Jansen 87*59599516SKenneth E. Jansen } 88*59599516SKenneth E. Jansen field_flag++; 89*59599516SKenneth E. Jansen 90*59599516SKenneth E. Jansen if (field_flag==1){ 91*59599516SKenneth E. Jansen 92*59599516SKenneth E. Jansen closefile(&f_descriptor, "read"); 93*59599516SKenneth E. Jansen 94*59599516SKenneth E. Jansen finalizephmpiio(&f_descriptor); 95*59599516SKenneth E. Jansen 96*59599516SKenneth E. Jansen if (irank==0) { 97*59599516SKenneth E. Jansen printf("\n"); 98*59599516SKenneth E. Jansen } 99*59599516SKenneth E. Jansen } 100*59599516SKenneth E. Jansen } 101*59599516SKenneth E. Jansen */ 102*59599516SKenneth E. Jansen 103*59599516SKenneth E. Jansen 104*59599516SKenneth E. Jansen void 105*59599516SKenneth E. Jansen read_d2wall( int* pid, 106*59599516SKenneth E. Jansen int* numnp, 107*59599516SKenneth E. Jansen double* array1, 108*59599516SKenneth E. Jansen int* foundd2wall ) { 109*59599516SKenneth E. Jansen 110*59599516SKenneth E. Jansen // time_t timenow = time ( &timenow); 111*59599516SKenneth E. Jansen 112*59599516SKenneth E. Jansen int isize, nitems; 113*59599516SKenneth E. Jansen int iarray[10]; 114*59599516SKenneth E. Jansen int j; 115*59599516SKenneth E. Jansen for ( j = 0; j < 10; j++) { 116*59599516SKenneth E. Jansen //Initialize iarray to 0 so that we can assess the result of readheader 117*59599516SKenneth E. Jansen iarray[j] = 0; 118*59599516SKenneth E. Jansen } 119*59599516SKenneth E. Jansen 120*59599516SKenneth E. Jansen int nfiles; 121*59599516SKenneth E. Jansen int nfields; 122*59599516SKenneth E. Jansen int numparts; 123*59599516SKenneth E. Jansen int irank; 124*59599516SKenneth E. Jansen int nprocs; 125*59599516SKenneth E. Jansen 126*59599516SKenneth E. Jansen // Retrieve and compute the parameters required for SyncIO 127*59599516SKenneth E. Jansen nfiles = outpar.nsynciofiles; 128*59599516SKenneth E. Jansen numparts = workfc.numpe; 129*59599516SKenneth E. Jansen irank = *pid; // workfc.myrank; 130*59599516SKenneth E. Jansen nprocs = workfc.numpe; 131*59599516SKenneth E. Jansen int nppf = numparts/nfiles; 132*59599516SKenneth E. Jansen int GPID; 133*59599516SKenneth E. Jansen 134*59599516SKenneth E. Jansen // Calculate number of parts each proc deal with and where it start and end ... 135*59599516SKenneth E. Jansen int nppp = numparts/nprocs;// nppp : Number of parts per proc ... 136*59599516SKenneth E. Jansen int startpart = irank * nppp +1;// Part id from which I (myrank) start ... 137*59599516SKenneth E. Jansen int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ... 138*59599516SKenneth E. Jansen 139*59599516SKenneth E. Jansen int descriptor; 140*59599516SKenneth E. Jansen char filename[255],path[255],fieldtag_s[255]; 141*59599516SKenneth E. Jansen bzero((void*)filename,255); 142*59599516SKenneth E. Jansen bzero((void*)fieldtag_s,255); 143*59599516SKenneth E. Jansen *foundd2wall = 0; 144*59599516SKenneth E. Jansen //////////////////////////////////////////////////// 145*59599516SKenneth E. Jansen // First we try to read dwal from the restart files. 146*59599516SKenneth E. Jansen //////////////////////////////////////////////////// 147*59599516SKenneth E. Jansen 148*59599516SKenneth E. Jansen sprintf(filename,"restart-dat.%d.%d", timdat.lstep, ((int)(irank/(nprocs/nfiles))+1)); 149*59599516SKenneth E. Jansen queryphmpiio(filename, &nfields, &nppf); 150*59599516SKenneth E. Jansen initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "read"); 151*59599516SKenneth E. Jansen 152*59599516SKenneth E. Jansen if (irank==0) { 153*59599516SKenneth E. Jansen printf("Filename is %s \n",filename); 154*59599516SKenneth E. Jansen } 155*59599516SKenneth E. Jansen openfile(filename, "read", &f_descriptor); 156*59599516SKenneth E. Jansen 157*59599516SKenneth E. Jansen int i; 158*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor 159*59599516SKenneth E. Jansen // GPID : global part id, corresponds to rank ... 160*59599516SKenneth E. Jansen // e.g : (in this example) 161*59599516SKenneth E. Jansen // proc 0 : 1--4 162*59599516SKenneth E. Jansen // proc 1 : 5--8 ... 163*59599516SKenneth E. Jansen GPID = startpart + i; 164*59599516SKenneth E. Jansen 165*59599516SKenneth E. Jansen // Write solution field ... 166*59599516SKenneth E. Jansen sprintf(fieldtag_s,"dwal@%d",GPID); 167*59599516SKenneth E. Jansen 168*59599516SKenneth E. Jansen nitems = 2; 169*59599516SKenneth E. Jansen readheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, "double", phasta_iotype); 170*59599516SKenneth E. Jansen //iarray[ 0 ] = (*numnp); What we should get from readheader 171*59599516SKenneth E. Jansen //iarray[ 1 ] = 1; 172*59599516SKenneth E. Jansen 173*59599516SKenneth E. Jansen if (iarray[0] == (*numnp)) { 174*59599516SKenneth E. Jansen if (irank==0) { 175*59599516SKenneth E. Jansen printf("d2wall field found in %s\n",filename); 176*59599516SKenneth E. Jansen } 177*59599516SKenneth E. Jansen *foundd2wall = 1; 178*59599516SKenneth E. Jansen isize = (*numnp); 179*59599516SKenneth E. Jansen readdatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype ); 180*59599516SKenneth E. Jansen } 181*59599516SKenneth E. Jansen else { //d2wall fields was not found in the restart file 182*59599516SKenneth E. Jansen *foundd2wall = 0; 183*59599516SKenneth E. Jansen if (irank==0) { 184*59599516SKenneth E. Jansen printf("d2wall field not found in %s - trying d2wall files now\n",filename); 185*59599516SKenneth E. Jansen } 186*59599516SKenneth E. Jansen } 187*59599516SKenneth E. Jansen } 188*59599516SKenneth E. Jansen closefile(&f_descriptor, "read"); 189*59599516SKenneth E. Jansen finalizephmpiio(&f_descriptor); 190*59599516SKenneth E. Jansen 191*59599516SKenneth E. Jansen //////////////////////////////////////////////////// 192*59599516SKenneth E. Jansen // We try to read dwal from the d2wall files if not found in the restart files 193*59599516SKenneth E. Jansen //////////////////////////////////////////////////// 194*59599516SKenneth E. Jansen 195*59599516SKenneth E. Jansen int numd2wallfiles; 196*59599516SKenneth E. Jansen if (*foundd2wall == 0) { 197*59599516SKenneth E. Jansen 198*59599516SKenneth E. Jansen detectd2wallfiles(&numd2wallfiles); 199*59599516SKenneth E. Jansen 200*59599516SKenneth E. Jansen if (numd2wallfiles == outpar.nsynciofiles ) { 201*59599516SKenneth E. Jansen // Read the d2wall field from the d2wall files 202*59599516SKenneth E. Jansen bzero((void*)filename,255); 203*59599516SKenneth E. Jansen bzero((void*)fieldtag_s,255); 204*59599516SKenneth E. Jansen 205*59599516SKenneth E. Jansen sprintf(filename,"d2wall.%d",((int)(irank/(nprocs/nfiles))+1)); 206*59599516SKenneth E. Jansen queryphmpiio(filename, &nfields, &nppf); 207*59599516SKenneth E. Jansen initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "read"); 208*59599516SKenneth E. Jansen 209*59599516SKenneth E. Jansen if (irank==0) { 210*59599516SKenneth E. Jansen printf("Filename is %s \n",filename); 211*59599516SKenneth E. Jansen } 212*59599516SKenneth E. Jansen openfile(filename, "read", &f_descriptor); 213*59599516SKenneth E. Jansen 214*59599516SKenneth E. Jansen int i; 215*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor 216*59599516SKenneth E. Jansen // GPID : global part id, corresponds to rank ... 217*59599516SKenneth E. Jansen // e.g : (in this example) 218*59599516SKenneth E. Jansen // proc 0 : 1--4 219*59599516SKenneth E. Jansen // proc 1 : 5--8 ... 220*59599516SKenneth E. Jansen GPID = startpart + i; 221*59599516SKenneth E. Jansen 222*59599516SKenneth E. Jansen // Write solution field ... 223*59599516SKenneth E. Jansen sprintf(fieldtag_s,"d2wall@%d",GPID); 224*59599516SKenneth E. Jansen 225*59599516SKenneth E. Jansen nitems = 2; 226*59599516SKenneth E. Jansen readheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, "double", phasta_iotype); 227*59599516SKenneth E. Jansen //iarray[ 0 ] = (*numnp); What we should get from readheader 228*59599516SKenneth E. Jansen //iarray[ 1 ] = 1; 229*59599516SKenneth E. Jansen 230*59599516SKenneth E. Jansen if (iarray[0] == (*numnp)) { 231*59599516SKenneth E. Jansen if (irank==0) { 232*59599516SKenneth E. Jansen printf("d2wall field found in %s\n",filename); 233*59599516SKenneth E. Jansen } 234*59599516SKenneth E. Jansen *foundd2wall = 1; 235*59599516SKenneth E. Jansen isize = (*numnp); 236*59599516SKenneth E. Jansen readdatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype ); 237*59599516SKenneth E. Jansen } 238*59599516SKenneth E. Jansen else { 239*59599516SKenneth E. Jansen *foundd2wall = 0; 240*59599516SKenneth E. Jansen printf("WARNING - numnp not coherent in d2wall files: %d - %d\n",iarray[0],*numnp); 241*59599516SKenneth E. Jansen printf("WARNING - Recomputing the d2wall field for safety\n"); 242*59599516SKenneth E. Jansen } 243*59599516SKenneth E. Jansen } 244*59599516SKenneth E. Jansen 245*59599516SKenneth E. Jansen closefile(&f_descriptor, "read"); 246*59599516SKenneth E. Jansen finalizephmpiio(&f_descriptor); 247*59599516SKenneth E. Jansen } 248*59599516SKenneth E. Jansen else if (numd2wallfiles != 0) { 249*59599516SKenneth E. Jansen // The number of d2wall file should be either 0 or outpar.nsynciofiles 250*59599516SKenneth E. Jansen if (irank==0) { 251*59599516SKenneth E. Jansen printf("WARNING - Number of d2wall files not coherent: %d - %d\n",numd2wallfiles,outpar.nsynciofiles); 252*59599516SKenneth E. Jansen printf("WARNING - Recomputing the d2wall field for safety\n"); 253*59599516SKenneth E. Jansen *foundd2wall = 0; 254*59599516SKenneth E. Jansen } 255*59599516SKenneth E. Jansen } 256*59599516SKenneth E. Jansen } // end of tentative reading from d2wall files 257*59599516SKenneth E. Jansen 258*59599516SKenneth E. Jansen if (irank==0) { 259*59599516SKenneth E. Jansen printf("\n"); 260*59599516SKenneth E. Jansen } 261*59599516SKenneth E. Jansen } 262