1*59599516SKenneth E. Jansen /* This file provides interface functions for 'partial ' random 2*59599516SKenneth E. Jansen access into the PHASTA input files 3*59599516SKenneth E. Jansen 4*59599516SKenneth E. Jansen Anil Karanam March 2001 */ 5*59599516SKenneth E. Jansen 6*59599516SKenneth E. Jansen #include <stdio.h> 7*59599516SKenneth E. Jansen #include <string.h> 8*59599516SKenneth E. Jansen #include <ctype.h> 9*59599516SKenneth E. Jansen #include <stdlib.h> 10*59599516SKenneth E. Jansen #include <time.h> 11*59599516SKenneth E. Jansen #include <math.h> 12*59599516SKenneth E. Jansen #include <mpi.h> 13*59599516SKenneth E. Jansen #include "phastaIO.h" 14*59599516SKenneth E. Jansen #include <FCMangle.h> 15*59599516SKenneth E. Jansen #include "new_interfaceAcuStat.h" 16*59599516SKenneth E. Jansen 17*59599516SKenneth E. Jansen //MR CHANGE 18*59599516SKenneth E. Jansen #include "commonAcuStat_c.h" 19*59599516SKenneth E. Jansen //MR CHANGE END 20*59599516SKenneth E. Jansen 21*59599516SKenneth E. Jansen #ifdef intel 22*59599516SKenneth E. Jansen #include <winsock2.h> 23*59599516SKenneth E. Jansen #else 24*59599516SKenneth E. Jansen #include <unistd.h> 25*59599516SKenneth E. Jansen #include <strings.h> 26*59599516SKenneth E. Jansen #endif 27*59599516SKenneth E. Jansen 28*59599516SKenneth E. Jansen 29*59599516SKenneth E. Jansen void 30*59599516SKenneth E. Jansen Write_AcuStat( int* pid, 31*59599516SKenneth E. Jansen int* stepstart, 32*59599516SKenneth E. Jansen int* stepend, 33*59599516SKenneth E. Jansen int* steptot, 34*59599516SKenneth E. Jansen int* nshg, 35*59599516SKenneth E. Jansen int* numVars, 36*59599516SKenneth E. Jansen double* array1 ) { 37*59599516SKenneth E. Jansen 38*59599516SKenneth E. Jansen char fname[255]; 39*59599516SKenneth E. Jansen char rfile[60]; 40*59599516SKenneth E. Jansen char existingfile[30], linkfile[30]; 41*59599516SKenneth E. Jansen int irstou; 42*59599516SKenneth E. Jansen int magic_number = 362436; 43*59599516SKenneth E. Jansen int* mptr = &magic_number; 44*59599516SKenneth E. Jansen double version=0.0; 45*59599516SKenneth E. Jansen int isize, nitems; 46*59599516SKenneth E. Jansen int iarray[10]; 47*59599516SKenneth E. Jansen int nfiles; 48*59599516SKenneth E. Jansen int nfields; 49*59599516SKenneth E. Jansen int numparts; 50*59599516SKenneth E. Jansen int irank; 51*59599516SKenneth E. Jansen int nprocs; 52*59599516SKenneth E. Jansen 53*59599516SKenneth E. Jansen 54*59599516SKenneth E. Jansen irank = *pid; 55*59599516SKenneth E. Jansen 56*59599516SKenneth E. Jansen // Retrieve and compute the parameters required for SyncIO 57*59599516SKenneth E. Jansen nfiles = outpar.nsynciofiles; //We use the same number of files as before 58*59599516SKenneth E. Jansen nfields = outpar.nsynciofieldswriterestart; // >=4 59*59599516SKenneth E. Jansen numparts = workfc.numpe; 60*59599516SKenneth E. Jansen nprocs= workfc.numpe; 61*59599516SKenneth E. Jansen 62*59599516SKenneth E. Jansen int nppf = numparts/nfiles; 63*59599516SKenneth E. Jansen int GPID; 64*59599516SKenneth E. Jansen 65*59599516SKenneth E. Jansen // Calculate number of parts each proc deal with and where it start and end ... 66*59599516SKenneth E. Jansen int nppp = numparts/nprocs;// nppp : Number of parts per proc ... 67*59599516SKenneth E. Jansen int startpart = irank * nppp +1;// Part id from which I (myrank) start ... 68*59599516SKenneth E. Jansen int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ... 69*59599516SKenneth E. Jansen 70*59599516SKenneth E. Jansen int descriptor; 71*59599516SKenneth E. Jansen char filename[255],path[255],fieldtag_s[255]; 72*59599516SKenneth E. Jansen bzero((void*)filename,255); 73*59599516SKenneth E. Jansen bzero((void*)fieldtag_s,255); 74*59599516SKenneth E. Jansen 75*59599516SKenneth E. Jansen //sprintf(filename,"restartAcuStat-dat.%d.%d",*stepend,((int)(irank/(nprocs/nfiles))+1)); 76*59599516SKenneth E. Jansen sprintf(filename,"restartAcuStat.%d.%d.%d.%d",*stepstart,*stepend,*steptot,((int)(irank/(nprocs/nfiles))+1)); 77*59599516SKenneth E. Jansen if (*pid==0) { 78*59599516SKenneth E. Jansen printf("Filename is %s \n",filename); 79*59599516SKenneth E. Jansen } 80*59599516SKenneth E. Jansen 81*59599516SKenneth E. Jansen initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "write"); 82*59599516SKenneth E. Jansen openfile(filename, "write", &f_descriptor); 83*59599516SKenneth E. Jansen 84*59599516SKenneth E. Jansen field_flag=0; 85*59599516SKenneth E. Jansen // solution 86*59599516SKenneth E. Jansen int i; 87*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor 88*59599516SKenneth E. Jansen // GPID : global part id, corresponds to rank ... 89*59599516SKenneth E. Jansen // e.g : (in this example) 90*59599516SKenneth E. Jansen // proc 0 : 1--4 91*59599516SKenneth E. Jansen // proc 1 : 5--8 ... 92*59599516SKenneth E. Jansen GPID = startpart + i; 93*59599516SKenneth E. Jansen 94*59599516SKenneth E. Jansen // Write solution field ... 95*59599516SKenneth E. Jansen sprintf(fieldtag_s,"solution@%d",GPID); 96*59599516SKenneth E. Jansen 97*59599516SKenneth E. Jansen isize = (*nshg)*(*numVars); 98*59599516SKenneth E. Jansen nitems = 3; 99*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 100*59599516SKenneth E. Jansen iarray[ 1 ] = (*numVars); 101*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepend); 102*59599516SKenneth E. Jansen writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype); 103*59599516SKenneth E. Jansen writedatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype ); 104*59599516SKenneth E. Jansen } 105*59599516SKenneth E. Jansen field_flag++; 106*59599516SKenneth E. Jansen 107*59599516SKenneth E. Jansen if (field_flag==nfields){ 108*59599516SKenneth E. Jansen closefile(&f_descriptor, "write"); 109*59599516SKenneth E. Jansen finalizephmpiio(&f_descriptor); 110*59599516SKenneth E. Jansen printf("file closed\n"); 111*59599516SKenneth E. Jansen if (*pid==0) { 112*59599516SKenneth E. Jansen printf("\n"); 113*59599516SKenneth E. Jansen } 114*59599516SKenneth E. Jansen } 115*59599516SKenneth E. Jansen 116*59599516SKenneth E. Jansen return; 117*59599516SKenneth E. Jansen } 118*59599516SKenneth E. Jansen 119*59599516SKenneth E. Jansen 120*59599516SKenneth E. Jansen 121*59599516SKenneth E. Jansen void 122*59599516SKenneth E. Jansen Write_AcuStat2( int* pid, 123*59599516SKenneth E. Jansen int* stepstart, 124*59599516SKenneth E. Jansen int* stepend, 125*59599516SKenneth E. Jansen int* steptot, 126*59599516SKenneth E. Jansen int* nshg, 127*59599516SKenneth E. Jansen int* numVars, 128*59599516SKenneth E. Jansen int* ndoferrors, 129*59599516SKenneth E. Jansen int* ndofybar, 130*59599516SKenneth E. Jansen double* array1, 131*59599516SKenneth E. Jansen double* array2, 132*59599516SKenneth E. Jansen double* array3, 133*59599516SKenneth E. Jansen double* array4 ) { 134*59599516SKenneth E. Jansen 135*59599516SKenneth E. Jansen char fname[255]; 136*59599516SKenneth E. Jansen char rfile[60]; 137*59599516SKenneth E. Jansen char existingfile[30], linkfile[30]; 138*59599516SKenneth E. Jansen int irstou; 139*59599516SKenneth E. Jansen int magic_number = 362436; 140*59599516SKenneth E. Jansen int* mptr = &magic_number; 141*59599516SKenneth E. Jansen double version=0.0; 142*59599516SKenneth E. Jansen int isize, nitems; 143*59599516SKenneth E. Jansen int iarray[10]; 144*59599516SKenneth E. Jansen int nfiles; 145*59599516SKenneth E. Jansen int nfields; 146*59599516SKenneth E. Jansen int numparts; 147*59599516SKenneth E. Jansen int irank; 148*59599516SKenneth E. Jansen int nprocs; 149*59599516SKenneth E. Jansen 150*59599516SKenneth E. Jansen 151*59599516SKenneth E. Jansen irank = *pid; 152*59599516SKenneth E. Jansen 153*59599516SKenneth E. Jansen // Retrieve and compute the parameters required for SyncIO 154*59599516SKenneth E. Jansen nfiles = outpar.nsynciofiles; //We use the same number of files as before 155*59599516SKenneth E. Jansen nfields = outpar.nsynciofieldswriterestart; // >=4 156*59599516SKenneth E. Jansen numparts = workfc.numpe; 157*59599516SKenneth E. Jansen nprocs= workfc.numpe; 158*59599516SKenneth E. Jansen 159*59599516SKenneth E. Jansen int nppf = numparts/nfiles; 160*59599516SKenneth E. Jansen int GPID; 161*59599516SKenneth E. Jansen 162*59599516SKenneth E. Jansen // Calculate number of parts each proc deal with and where it start and end ... 163*59599516SKenneth E. Jansen int nppp = numparts/nprocs;// nppp : Number of parts per proc ... 164*59599516SKenneth E. Jansen int startpart = irank * nppp +1;// Part id from which I (myrank) start ... 165*59599516SKenneth E. Jansen int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ... 166*59599516SKenneth E. Jansen 167*59599516SKenneth E. Jansen int descriptor; 168*59599516SKenneth E. Jansen char filename[255],fieldtag_s[255]; 169*59599516SKenneth E. Jansen bzero((void*)filename,255); 170*59599516SKenneth E. Jansen bzero((void*)fieldtag_s,255); 171*59599516SKenneth E. Jansen 172*59599516SKenneth E. Jansen sprintf(filename,"restartAcuStat.%d.%d.%d.%d",*stepstart,*stepend,*steptot,((int)(irank/(nprocs/nfiles))+1)); 173*59599516SKenneth E. Jansen if (*pid==0) { 174*59599516SKenneth E. Jansen printf("Filename is %s \n",filename); 175*59599516SKenneth E. Jansen } 176*59599516SKenneth E. Jansen 177*59599516SKenneth E. Jansen initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "write"); 178*59599516SKenneth E. Jansen openfile(filename, "write", &f_descriptor); 179*59599516SKenneth E. Jansen 180*59599516SKenneth E. Jansen field_flag=0; 181*59599516SKenneth E. Jansen // solution 182*59599516SKenneth E. Jansen int i; 183*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor 184*59599516SKenneth E. Jansen // GPID : global part id, corresponds to rank ... 185*59599516SKenneth E. Jansen // e.g : (in this example) 186*59599516SKenneth E. Jansen // proc 0 : 1--4 187*59599516SKenneth E. Jansen // proc 1 : 5--8 ... 188*59599516SKenneth E. Jansen GPID = startpart + i; 189*59599516SKenneth E. Jansen 190*59599516SKenneth E. Jansen // Write solution field ... 191*59599516SKenneth E. Jansen sprintf(fieldtag_s,"solution@%d",GPID); 192*59599516SKenneth E. Jansen 193*59599516SKenneth E. Jansen isize = (*nshg)*(*numVars); 194*59599516SKenneth E. Jansen nitems = 3; 195*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 196*59599516SKenneth E. Jansen iarray[ 1 ] = (*numVars); 197*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepend); 198*59599516SKenneth E. Jansen writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype); 199*59599516SKenneth E. Jansen writedatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype ); 200*59599516SKenneth E. Jansen } 201*59599516SKenneth E. Jansen field_flag++; 202*59599516SKenneth E. Jansen 203*59599516SKenneth E. Jansen // dwal 204*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor 205*59599516SKenneth E. Jansen // GPID : global part id, corresponds to rank ... 206*59599516SKenneth E. Jansen // e.g : (in this example) 207*59599516SKenneth E. Jansen // proc 0 : 1--4 208*59599516SKenneth E. Jansen // proc 1 : 5--8 ... 209*59599516SKenneth E. Jansen GPID = startpart + i; 210*59599516SKenneth E. Jansen 211*59599516SKenneth E. Jansen // Write solution field ... 212*59599516SKenneth E. Jansen sprintf(fieldtag_s,"dwal@%d",GPID); 213*59599516SKenneth E. Jansen 214*59599516SKenneth E. Jansen isize = (*nshg)*1; 215*59599516SKenneth E. Jansen nitems = 3; 216*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 217*59599516SKenneth E. Jansen iarray[ 1 ] = 1; 218*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepend); 219*59599516SKenneth E. Jansen writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype); 220*59599516SKenneth E. Jansen writedatablock( &f_descriptor, fieldtag_s, (void*)(array2), &isize, "double", phasta_iotype ); 221*59599516SKenneth E. Jansen } 222*59599516SKenneth E. Jansen field_flag++; 223*59599516SKenneth E. Jansen 224*59599516SKenneth E. Jansen // errors 225*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor 226*59599516SKenneth E. Jansen // GPID : global part id, corresponds to rank ... 227*59599516SKenneth E. Jansen // e.g : (in this example) 228*59599516SKenneth E. Jansen // proc 0 : 1--4 229*59599516SKenneth E. Jansen // proc 1 : 5--8 ... 230*59599516SKenneth E. Jansen GPID = startpart + i; 231*59599516SKenneth E. Jansen 232*59599516SKenneth E. Jansen // Write solution field ... 233*59599516SKenneth E. Jansen sprintf(fieldtag_s,"errors@%d",GPID); 234*59599516SKenneth E. Jansen 235*59599516SKenneth E. Jansen isize = (*nshg)*(*ndoferrors); 236*59599516SKenneth E. Jansen nitems = 3; 237*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 238*59599516SKenneth E. Jansen iarray[ 1 ] = (*ndoferrors); 239*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepend); 240*59599516SKenneth E. Jansen writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype); 241*59599516SKenneth E. Jansen writedatablock( &f_descriptor, fieldtag_s, (void*)(array3), &isize, "double", phasta_iotype ); 242*59599516SKenneth E. Jansen } 243*59599516SKenneth E. Jansen field_flag++; 244*59599516SKenneth E. Jansen 245*59599516SKenneth E. Jansen // ybar 246*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor 247*59599516SKenneth E. Jansen // GPID : global part id, corresponds to rank ... 248*59599516SKenneth E. Jansen // e.g : (in this example) 249*59599516SKenneth E. Jansen // proc 0 : 1--4 250*59599516SKenneth E. Jansen // proc 1 : 5--8 ... 251*59599516SKenneth E. Jansen GPID = startpart + i; 252*59599516SKenneth E. Jansen 253*59599516SKenneth E. Jansen // Write solution field ... 254*59599516SKenneth E. Jansen sprintf(fieldtag_s,"ybar@%d",GPID); 255*59599516SKenneth E. Jansen 256*59599516SKenneth E. Jansen isize = (*nshg)*(*ndofybar); 257*59599516SKenneth E. Jansen nitems = 3; 258*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 259*59599516SKenneth E. Jansen iarray[ 1 ] = (*ndofybar); 260*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepend); 261*59599516SKenneth E. Jansen writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype); 262*59599516SKenneth E. Jansen writedatablock( &f_descriptor, fieldtag_s, (void*)(array4), &isize, "double", phasta_iotype ); 263*59599516SKenneth E. Jansen } 264*59599516SKenneth E. Jansen field_flag++; 265*59599516SKenneth E. Jansen 266*59599516SKenneth E. Jansen 267*59599516SKenneth E. Jansen if (field_flag==nfields){ 268*59599516SKenneth E. Jansen closefile(&f_descriptor, "write"); 269*59599516SKenneth E. Jansen finalizephmpiio(&f_descriptor); 270*59599516SKenneth E. Jansen printf("file closed\n"); 271*59599516SKenneth E. Jansen if (*pid==0) { 272*59599516SKenneth E. Jansen printf("\n"); 273*59599516SKenneth E. Jansen } 274*59599516SKenneth E. Jansen } 275*59599516SKenneth E. Jansen 276*59599516SKenneth E. Jansen 277*59599516SKenneth E. Jansen return; 278*59599516SKenneth E. Jansen } 279*59599516SKenneth E. Jansen 280*59599516SKenneth E. Jansen void 281*59599516SKenneth E. Jansen Write_Ybar( int* pid, 282*59599516SKenneth E. Jansen int* stepstart, 283*59599516SKenneth E. Jansen int* stepend, 284*59599516SKenneth E. Jansen int* steptot, 285*59599516SKenneth E. Jansen int* nshg, 286*59599516SKenneth E. Jansen int* numVars, 287*59599516SKenneth E. Jansen double* array1) { 288*59599516SKenneth E. Jansen 289*59599516SKenneth E. Jansen char fname[255]; 290*59599516SKenneth E. Jansen char rfile[60]; 291*59599516SKenneth E. Jansen char existingfile[30], linkfile[30]; 292*59599516SKenneth E. Jansen int irstou; 293*59599516SKenneth E. Jansen int magic_number = 362436; 294*59599516SKenneth E. Jansen int* mptr = &magic_number; 295*59599516SKenneth E. Jansen double version=0.0; 296*59599516SKenneth E. Jansen int isize, nitems; 297*59599516SKenneth E. Jansen int iarray[10]; 298*59599516SKenneth E. Jansen 299*59599516SKenneth E. Jansen int nfiles; 300*59599516SKenneth E. Jansen int nfields; 301*59599516SKenneth E. Jansen int numparts; 302*59599516SKenneth E. Jansen int irank; 303*59599516SKenneth E. Jansen int nprocs; 304*59599516SKenneth E. Jansen 305*59599516SKenneth E. Jansen // First, count the number of fields to write and store the result in 306*59599516SKenneth E. Jansen //countfieldstowriterestart(); 307*59599516SKenneth E. Jansen 308*59599516SKenneth E. Jansen // Retrieve and compute the parameters required for SyncIO 309*59599516SKenneth E. Jansen nfiles = outpar.nsynciofiles; 310*59599516SKenneth E. Jansen //nfields = outpar.nsynciofieldswriterestart; 311*59599516SKenneth E. Jansen nfields=1; 312*59599516SKenneth E. Jansen numparts = workfc.numpe; 313*59599516SKenneth E. Jansen irank = *pid; //workfc.myrank; 314*59599516SKenneth E. Jansen nprocs = workfc.numpe; 315*59599516SKenneth E. Jansen int nppf = numparts/nfiles; 316*59599516SKenneth E. Jansen int GPID; 317*59599516SKenneth E. Jansen 318*59599516SKenneth E. Jansen // Calculate number of parts each proc deal with and where it start and end ... 319*59599516SKenneth E. Jansen int nppp = numparts/nprocs;// nppp : Number of parts per proc ... 320*59599516SKenneth E. Jansen int startpart = irank * nppp +1;// Part id from which I (myrank) start ... 321*59599516SKenneth E. Jansen int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ... 322*59599516SKenneth E. Jansen 323*59599516SKenneth E. Jansen int descriptor; 324*59599516SKenneth E. Jansen char filename[255],fieldtag_s[255]; 325*59599516SKenneth E. Jansen bzero((void*)filename,255); 326*59599516SKenneth E. Jansen bzero((void*)fieldtag_s,255); 327*59599516SKenneth E. Jansen 328*59599516SKenneth E. Jansen // sprintf(filename,"ybar.%d.%d",*stepno,((int)(irank/(nprocs/nfiles))+1)); 329*59599516SKenneth E. Jansen sprintf(filename,"restartAcuStat.%d.%d.%d.%d",*stepstart,*stepend,*steptot,((int)(irank/(nprocs/nfiles))+1)); 330*59599516SKenneth E. Jansen 331*59599516SKenneth E. Jansen initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "write"); 332*59599516SKenneth E. Jansen 333*59599516SKenneth E. Jansen if (*pid==0) { 334*59599516SKenneth E. Jansen printf("Filename is %s \n",filename); 335*59599516SKenneth E. Jansen } 336*59599516SKenneth E. Jansen 337*59599516SKenneth E. Jansen openfile(filename, "write", &f_descriptor); 338*59599516SKenneth E. Jansen 339*59599516SKenneth E. Jansen field_flag=0; 340*59599516SKenneth E. Jansen 341*59599516SKenneth E. Jansen int i; 342*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor 343*59599516SKenneth E. Jansen // GPID : global part id, corresponds to rank ... 344*59599516SKenneth E. Jansen // e.g : (in this example) 345*59599516SKenneth E. Jansen // proc 0 : 1--4 346*59599516SKenneth E. Jansen // proc 1 : 5--8 ... 347*59599516SKenneth E. Jansen GPID = startpart + i; 348*59599516SKenneth E. Jansen 349*59599516SKenneth E. Jansen // Write ybar field ... 350*59599516SKenneth E. Jansen sprintf(fieldtag_s,"ybar@%d",GPID); 351*59599516SKenneth E. Jansen 352*59599516SKenneth E. Jansen isize = (*nshg)*(*numVars); 353*59599516SKenneth E. Jansen nitems = 3; 354*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 355*59599516SKenneth E. Jansen iarray[ 1 ] = (*numVars); 356*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepend); 357*59599516SKenneth E. Jansen writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype); 358*59599516SKenneth E. Jansen writedatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype ); 359*59599516SKenneth E. Jansen } 360*59599516SKenneth E. Jansen field_flag++; 361*59599516SKenneth E. Jansen 362*59599516SKenneth E. Jansen if (field_flag==nfields){ 363*59599516SKenneth E. Jansen closefile(&f_descriptor, "write"); 364*59599516SKenneth E. Jansen finalizephmpiio(&f_descriptor); 365*59599516SKenneth E. Jansen if (*pid==0) { 366*59599516SKenneth E. Jansen printf("\n"); 367*59599516SKenneth E. Jansen } 368*59599516SKenneth E. Jansen } 369*59599516SKenneth E. Jansen } 370*59599516SKenneth E. Jansen 371*59599516SKenneth E. Jansen void 372*59599516SKenneth E. Jansen Write_Restart( int* pid, 373*59599516SKenneth E. Jansen int* stepno, 374*59599516SKenneth E. Jansen int* nshg, 375*59599516SKenneth E. Jansen int* numVars, 376*59599516SKenneth E. Jansen double* array1, 377*59599516SKenneth E. Jansen double* array2 ) { 378*59599516SKenneth E. Jansen 379*59599516SKenneth E. Jansen char fname[255]; 380*59599516SKenneth E. Jansen char rfile[60]; 381*59599516SKenneth E. Jansen char existingfile[30], linkfile[30]; 382*59599516SKenneth E. Jansen int irstou; 383*59599516SKenneth E. Jansen int magic_number = 362436; 384*59599516SKenneth E. Jansen int* mptr = &magic_number; 385*59599516SKenneth E. Jansen double version=0.0; 386*59599516SKenneth E. Jansen int isize, nitems; 387*59599516SKenneth E. Jansen int iarray[10]; 388*59599516SKenneth E. Jansen int nfiles; 389*59599516SKenneth E. Jansen int nfields; 390*59599516SKenneth E. Jansen int numparts; 391*59599516SKenneth E. Jansen int irank; 392*59599516SKenneth E. Jansen int nprocs; 393*59599516SKenneth E. Jansen 394*59599516SKenneth E. Jansen // First, count the number of fields to write and store the result in 395*59599516SKenneth E. Jansen //countfieldstowriterestart(); 396*59599516SKenneth E. Jansen 397*59599516SKenneth E. Jansen // Retrieve and compute the parameters required for SyncIO 398*59599516SKenneth E. Jansen nfiles = outpar.nsynciofiles; 399*59599516SKenneth E. Jansen nfields = outpar.nsynciofieldswriterestart; 400*59599516SKenneth E. Jansen numparts = workfc.numpe; 401*59599516SKenneth E. Jansen irank = *pid; //workfc.myrank; 402*59599516SKenneth E. Jansen nprocs = workfc.numpe; 403*59599516SKenneth E. Jansen int nppf = numparts/nfiles; 404*59599516SKenneth E. Jansen int GPID; 405*59599516SKenneth E. Jansen 406*59599516SKenneth E. Jansen // Calculate number of parts each proc deal with and where it start and end ... 407*59599516SKenneth E. Jansen int nppp = numparts/nprocs;// nppp : Number of parts per proc ... 408*59599516SKenneth E. Jansen int startpart = irank * nppp +1;// Part id from which I (myrank) start ... 409*59599516SKenneth E. Jansen int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ... 410*59599516SKenneth E. Jansen 411*59599516SKenneth E. Jansen int descriptor; 412*59599516SKenneth E. Jansen char filename[255],fieldtag_s[255]; 413*59599516SKenneth E. Jansen bzero((void*)filename,255); 414*59599516SKenneth E. Jansen bzero((void*)fieldtag_s,255); 415*59599516SKenneth E. Jansen 416*59599516SKenneth E. Jansen sprintf(filename,"restart-dat.%d.%d",*stepno,((int)(irank/(nprocs/nfiles))+1)); 417*59599516SKenneth E. Jansen 418*59599516SKenneth E. Jansen initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "write"); 419*59599516SKenneth E. Jansen 420*59599516SKenneth E. Jansen if (*pid==0) { 421*59599516SKenneth E. Jansen printf("Filename is %s \n",filename); 422*59599516SKenneth E. Jansen } 423*59599516SKenneth E. Jansen 424*59599516SKenneth E. Jansen openfile(filename, "write", &f_descriptor); 425*59599516SKenneth E. Jansen 426*59599516SKenneth E. Jansen field_flag=0; 427*59599516SKenneth E. Jansen 428*59599516SKenneth E. Jansen int i; 429*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor 430*59599516SKenneth E. Jansen // GPID : global part id, corresponds to rank ... 431*59599516SKenneth E. Jansen // e.g : (in this example) 432*59599516SKenneth E. Jansen // proc 0 : 1--4 433*59599516SKenneth E. Jansen // proc 1 : 5--8 ... 434*59599516SKenneth E. Jansen GPID = startpart + i; 435*59599516SKenneth E. Jansen 436*59599516SKenneth E. Jansen // Write solution field ... 437*59599516SKenneth E. Jansen sprintf(fieldtag_s,"solution@%d",GPID); 438*59599516SKenneth E. Jansen 439*59599516SKenneth E. Jansen isize = (*nshg)*(*numVars); 440*59599516SKenneth E. Jansen nitems = 3; 441*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 442*59599516SKenneth E. Jansen iarray[ 1 ] = (*numVars); 443*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepno); 444*59599516SKenneth E. Jansen writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype); 445*59599516SKenneth E. Jansen writedatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype ); 446*59599516SKenneth E. Jansen } 447*59599516SKenneth E. Jansen field_flag++; 448*59599516SKenneth E. Jansen 449*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++) { 450*59599516SKenneth E. Jansen 451*59599516SKenneth E. Jansen // GPID : global part id, corresponds to rank ... 452*59599516SKenneth E. Jansen // e.g : (in this example) 453*59599516SKenneth E. Jansen // proc 0 : 1--4 454*59599516SKenneth E. Jansen // proc 1 : 5--8 ... 455*59599516SKenneth E. Jansen GPID = startpart + i; 456*59599516SKenneth E. Jansen 457*59599516SKenneth E. Jansen // Write solution field ... 458*59599516SKenneth E. Jansen sprintf(fieldtag_s,"time derivative of solution@%d",GPID); 459*59599516SKenneth E. Jansen 460*59599516SKenneth E. Jansen isize = (*nshg)*(*numVars); 461*59599516SKenneth E. Jansen nitems = 3; 462*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 463*59599516SKenneth E. Jansen iarray[ 1 ] = (*numVars); 464*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepno); 465*59599516SKenneth E. Jansen writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype); 466*59599516SKenneth E. Jansen writedatablock( &f_descriptor, fieldtag_s, (void*)(array2), &isize, "double", phasta_iotype ); 467*59599516SKenneth E. Jansen } 468*59599516SKenneth E. Jansen field_flag++; 469*59599516SKenneth E. Jansen 470*59599516SKenneth E. Jansen if (field_flag==nfields){ 471*59599516SKenneth E. Jansen closefile(&f_descriptor, "write"); 472*59599516SKenneth E. Jansen finalizephmpiio(&f_descriptor); 473*59599516SKenneth E. Jansen if (*pid==0) { 474*59599516SKenneth E. Jansen printf("\n"); 475*59599516SKenneth E. Jansen } 476*59599516SKenneth E. Jansen } 477*59599516SKenneth E. Jansen } 478*59599516SKenneth E. Jansen 479*59599516SKenneth E. Jansen 480*59599516SKenneth E. Jansen void 481*59599516SKenneth E. Jansen Write_Error( int* pid, 482*59599516SKenneth E. Jansen int* stepno, 483*59599516SKenneth E. Jansen int* nshg, 484*59599516SKenneth E. Jansen int* numVars, 485*59599516SKenneth E. Jansen double* array1 ) { 486*59599516SKenneth E. Jansen 487*59599516SKenneth E. Jansen 488*59599516SKenneth E. Jansen char fname[255]; 489*59599516SKenneth E. Jansen char rfile[60]; 490*59599516SKenneth E. Jansen int irstou; 491*59599516SKenneth E. Jansen int magic_number = 362436; 492*59599516SKenneth E. Jansen int* mptr = &magic_number; 493*59599516SKenneth E. Jansen double version=0.0; 494*59599516SKenneth E. Jansen int isize, nitems; 495*59599516SKenneth E. Jansen int iarray[10]; 496*59599516SKenneth E. Jansen 497*59599516SKenneth E. Jansen /////////////////////////////// Start of writing using new-lib //////////////////////////// 498*59599516SKenneth E. Jansen 499*59599516SKenneth E. Jansen int nfiles; 500*59599516SKenneth E. Jansen int nfields; 501*59599516SKenneth E. Jansen int numparts; 502*59599516SKenneth E. Jansen int irank; 503*59599516SKenneth E. Jansen int nprocs; 504*59599516SKenneth E. Jansen 505*59599516SKenneth E. Jansen nfiles = outpar.nsynciofiles; 506*59599516SKenneth E. Jansen nfields = outpar.nsynciofieldswriterestart; 507*59599516SKenneth E. Jansen numparts = workfc.numpe; 508*59599516SKenneth E. Jansen irank = *pid; //workfc.myrank; 509*59599516SKenneth E. Jansen nprocs = workfc.numpe; 510*59599516SKenneth E. Jansen 511*59599516SKenneth E. Jansen int nppf = numparts/nfiles; 512*59599516SKenneth E. Jansen int GPID; 513*59599516SKenneth E. Jansen 514*59599516SKenneth E. Jansen // Calculate number of parts each proc deal with and where it start and end ... 515*59599516SKenneth E. Jansen int nppp = numparts/nprocs;// nppp : Number of parts per proc ... 516*59599516SKenneth E. Jansen int startpart = irank * nppp +1;// Part id from which I (myrank) start ... 517*59599516SKenneth E. Jansen int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ... 518*59599516SKenneth E. Jansen 519*59599516SKenneth E. Jansen field_flag++; 520*59599516SKenneth E. Jansen 521*59599516SKenneth E. Jansen char fieldtag[255]; 522*59599516SKenneth E. Jansen 523*59599516SKenneth E. Jansen int i; 524*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++ ) { 525*59599516SKenneth E. Jansen GPID = startpart + i; 526*59599516SKenneth E. Jansen sprintf(fieldtag,"errors@%d",GPID); 527*59599516SKenneth E. Jansen 528*59599516SKenneth E. Jansen if(*pid==0) { 529*59599516SKenneth E. Jansen printf("\n"); 530*59599516SKenneth E. Jansen printf("The %d/%d th field to be written is '%s'\n",field_flag,nfields,fieldtag); 531*59599516SKenneth E. Jansen } 532*59599516SKenneth E. Jansen 533*59599516SKenneth E. Jansen isize = (*nshg)*(*numVars); 534*59599516SKenneth E. Jansen nitems = 3; 535*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 536*59599516SKenneth E. Jansen iarray[ 1 ] = (*numVars); 537*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepno); 538*59599516SKenneth E. Jansen writeheader( &f_descriptor, fieldtag, (void*)iarray, &nitems, &isize, "double", phasta_iotype); 539*59599516SKenneth E. Jansen writedatablock( &f_descriptor, fieldtag, (void*)array1, &isize, "double", phasta_iotype ); 540*59599516SKenneth E. Jansen } 541*59599516SKenneth E. Jansen 542*59599516SKenneth E. Jansen if (field_flag==nfields){ 543*59599516SKenneth E. Jansen closefile(&f_descriptor, "write"); 544*59599516SKenneth E. Jansen finalizephmpiio(&f_descriptor); 545*59599516SKenneth E. Jansen if (*pid==0) { 546*59599516SKenneth E. Jansen printf("Last field %d '%s' finished! \n",nfields, fieldtag); 547*59599516SKenneth E. Jansen printf("\n"); 548*59599516SKenneth E. Jansen } 549*59599516SKenneth E. Jansen } 550*59599516SKenneth E. Jansen 551*59599516SKenneth E. Jansen } 552*59599516SKenneth E. Jansen 553*59599516SKenneth E. Jansen void 554*59599516SKenneth E. Jansen Write_Displ( int* pid, 555*59599516SKenneth E. Jansen int* stepno, 556*59599516SKenneth E. Jansen int* nshg, 557*59599516SKenneth E. Jansen int* numVars, 558*59599516SKenneth E. Jansen double* array1 ) { //TO BE UPDATED FOR SYNCIO 559*59599516SKenneth E. Jansen 560*59599516SKenneth E. Jansen 561*59599516SKenneth E. Jansen char fname[255]; 562*59599516SKenneth E. Jansen char rfile[60]; 563*59599516SKenneth E. Jansen int irstou; 564*59599516SKenneth E. Jansen int magic_number = 362436; 565*59599516SKenneth E. Jansen int* mptr = &magic_number; 566*59599516SKenneth E. Jansen time_t timenow = time ( &timenow); 567*59599516SKenneth E. Jansen double version=0.0; 568*59599516SKenneth E. Jansen int isize, nitems; 569*59599516SKenneth E. Jansen int iarray[10]; 570*59599516SKenneth E. Jansen 571*59599516SKenneth E. Jansen sprintf(rfile,"restart.%d.%d",*stepno,*pid+1); 572*59599516SKenneth E. Jansen openfile(rfile,"append", &irstou); 573*59599516SKenneth E. Jansen 574*59599516SKenneth E. Jansen isize = (*nshg)*(*numVars); 575*59599516SKenneth E. Jansen nitems = 3; 576*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 577*59599516SKenneth E. Jansen iarray[ 1 ] = (*numVars); 578*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepno); 579*59599516SKenneth E. Jansen writeheader( &irstou, "displacement", (void*)iarray, &nitems, &isize, "double", phasta_iotype ); 580*59599516SKenneth E. Jansen writedatablock( &irstou, "displacement", (void*)(array1), &isize, "double", phasta_iotype ); 581*59599516SKenneth E. Jansen 582*59599516SKenneth E. Jansen closefile( &irstou, "append" ); 583*59599516SKenneth E. Jansen } 584*59599516SKenneth E. Jansen 585*59599516SKenneth E. Jansen void 586*59599516SKenneth E. Jansen Write_Field( int *pid, 587*59599516SKenneth E. Jansen char* filemode, 588*59599516SKenneth E. Jansen char* fieldtag, 589*59599516SKenneth E. Jansen int* tagsize, 590*59599516SKenneth E. Jansen void* array, 591*59599516SKenneth E. Jansen char* arraytype, 592*59599516SKenneth E. Jansen int* nshg, 593*59599516SKenneth E. Jansen int* numvars, 594*59599516SKenneth E. Jansen int* stepno) { 595*59599516SKenneth E. Jansen 596*59599516SKenneth E. Jansen //printf("Rank is %d, field is %s, tagsize is %d, nshg is %d, numvars is %d\n",*pid,fieldtag,*tagsize,*nshg,*numvars); 597*59599516SKenneth E. Jansen 598*59599516SKenneth E. Jansen char *fieldlabel = (char *)malloc((*tagsize+1)*sizeof(char)); 599*59599516SKenneth E. Jansen strncpy(fieldlabel, fieldtag, *tagsize); 600*59599516SKenneth E. Jansen fieldlabel[*tagsize] = '\0'; 601*59599516SKenneth E. Jansen 602*59599516SKenneth E. Jansen int irstou; 603*59599516SKenneth E. Jansen int magic_number = 362436; 604*59599516SKenneth E. Jansen int* mptr = &magic_number; 605*59599516SKenneth E. Jansen double version=0.0; 606*59599516SKenneth E. Jansen int isize, nitems; 607*59599516SKenneth E. Jansen int iarray[10]; 608*59599516SKenneth E. Jansen 609*59599516SKenneth E. Jansen char fmode[10]; 610*59599516SKenneth E. Jansen if(!strncmp(filemode,"w",1)) 611*59599516SKenneth E. Jansen strcpy(fmode,"write"); 612*59599516SKenneth E. Jansen else // default is append 613*59599516SKenneth E. Jansen strcpy(fmode,"append"); 614*59599516SKenneth E. Jansen 615*59599516SKenneth E. Jansen char datatype[10]; 616*59599516SKenneth E. Jansen if(!strncmp(arraytype,"i",1)) 617*59599516SKenneth E. Jansen strcpy(datatype,"int"); 618*59599516SKenneth E. Jansen else // default is double 619*59599516SKenneth E. Jansen strcpy(datatype,"double"); 620*59599516SKenneth E. Jansen 621*59599516SKenneth E. Jansen // Old posix format 622*59599516SKenneth E. Jansen /* openfile_(rfile, fmode, &irstou); 623*59599516SKenneth E. Jansen 624*59599516SKenneth E. Jansen nitems = 3; // assuming field will write 3 items in iarray 625*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 626*59599516SKenneth E. Jansen iarray[ 1 ] = (*numvars); 627*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepno); 628*59599516SKenneth E. Jansen 629*59599516SKenneth E. Jansen isize = (*nshg)*(*numvars); 630*59599516SKenneth E. Jansen writeheader_( &irstou, fieldlabel, (void*)iarray, &nitems, &isize, datatype, phasta_iotype ); 631*59599516SKenneth E. Jansen 632*59599516SKenneth E. Jansen nitems = (*nshg)*(*numvars); 633*59599516SKenneth E. Jansen writedatablock_( &irstou, fieldlabel, array, &nitems, datatype, phasta_iotype ); 634*59599516SKenneth E. Jansen closefile_( &irstou, fmode); 635*59599516SKenneth E. Jansen */ 636*59599516SKenneth E. Jansen /////////////////////////////// Start of writing using new-lib //////////////////////////// 637*59599516SKenneth E. Jansen 638*59599516SKenneth E. Jansen int nfiles; 639*59599516SKenneth E. Jansen int nfields; 640*59599516SKenneth E. Jansen int numparts; 641*59599516SKenneth E. Jansen int irank; 642*59599516SKenneth E. Jansen int nprocs; 643*59599516SKenneth E. Jansen 644*59599516SKenneth E. Jansen // unsigned long long timer_start; 645*59599516SKenneth E. Jansen // unsigned long long timer_end; 646*59599516SKenneth E. Jansen // double time_span; 647*59599516SKenneth E. Jansen 648*59599516SKenneth E. Jansen nfiles = outpar.nsynciofiles; 649*59599516SKenneth E. Jansen nfields = outpar.nsynciofieldswriterestart; 650*59599516SKenneth E. Jansen numparts = workfc.numpe; 651*59599516SKenneth E. Jansen irank = *pid; //workfc.myrank; 652*59599516SKenneth E. Jansen nprocs = workfc.numpe; 653*59599516SKenneth E. Jansen 654*59599516SKenneth E. Jansen int nppf = numparts/nfiles; 655*59599516SKenneth E. Jansen int GPID; 656*59599516SKenneth E. Jansen 657*59599516SKenneth E. Jansen // Calculate number of parts each proc deal with and where it start and end ... 658*59599516SKenneth E. Jansen int nppp = numparts/nprocs;// nppp : Number of parts per proc ... 659*59599516SKenneth E. Jansen int startpart = irank * nppp +1;// Part id from which I (myrank) start ... 660*59599516SKenneth E. Jansen int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ... 661*59599516SKenneth E. Jansen 662*59599516SKenneth E. Jansen char fieldtag_s[255]; 663*59599516SKenneth E. Jansen bzero((void*)fieldtag_s,255); 664*59599516SKenneth E. Jansen 665*59599516SKenneth E. Jansen strncpy(fieldlabel, fieldtag, *tagsize); 666*59599516SKenneth E. Jansen 667*59599516SKenneth E. Jansen field_flag++; 668*59599516SKenneth E. Jansen if(*pid==0) { 669*59599516SKenneth E. Jansen printf("\n"); 670*59599516SKenneth E. Jansen printf("The %d/%d th field to be written is '%s'\n",field_flag,nfields,fieldlabel); 671*59599516SKenneth E. Jansen } 672*59599516SKenneth E. Jansen 673*59599516SKenneth E. Jansen int i; 674*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++ ) { 675*59599516SKenneth E. Jansen GPID = startpart + i; 676*59599516SKenneth E. Jansen 677*59599516SKenneth E. Jansen // Write solution field ... 678*59599516SKenneth E. Jansen sprintf(fieldtag_s,"%s@%d",fieldlabel,GPID); 679*59599516SKenneth E. Jansen 680*59599516SKenneth E. Jansen isize = (*nshg)*(*numvars); 681*59599516SKenneth E. Jansen nitems = 3; 682*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 683*59599516SKenneth E. Jansen iarray[ 1 ] = (*numvars); 684*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepno); 685*59599516SKenneth E. Jansen writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, datatype, phasta_iotype); 686*59599516SKenneth E. Jansen writedatablock( &f_descriptor, fieldtag_s, array, &isize, datatype, phasta_iotype ); 687*59599516SKenneth E. Jansen } 688*59599516SKenneth E. Jansen 689*59599516SKenneth E. Jansen if (field_flag==nfields){ 690*59599516SKenneth E. Jansen closefile(&f_descriptor, "write"); 691*59599516SKenneth E. Jansen finalizephmpiio(&f_descriptor); 692*59599516SKenneth E. Jansen if (*pid==0) { 693*59599516SKenneth E. Jansen printf("Last field %d '%s' finished! \n",nfields, fieldtag); 694*59599516SKenneth E. Jansen printf("\n"); 695*59599516SKenneth E. Jansen } 696*59599516SKenneth E. Jansen } 697*59599516SKenneth E. Jansen 698*59599516SKenneth E. Jansen free(fieldlabel); 699*59599516SKenneth E. Jansen } 700*59599516SKenneth E. Jansen 701*59599516SKenneth E. Jansen void 702*59599516SKenneth E. Jansen Write_PhAvg( int* pid, 703*59599516SKenneth E. Jansen char* filemode, 704*59599516SKenneth E. Jansen char* fieldtag, 705*59599516SKenneth E. Jansen int* tagsize, 706*59599516SKenneth E. Jansen int* iphase, 707*59599516SKenneth E. Jansen void* array, 708*59599516SKenneth E. Jansen char* arraytype, 709*59599516SKenneth E. Jansen int* nshg, 710*59599516SKenneth E. Jansen int* numvars, 711*59599516SKenneth E. Jansen int* stepno) { 712*59599516SKenneth E. Jansen 713*59599516SKenneth E. Jansen char rfile[32]; 714*59599516SKenneth E. Jansen // assuming restart_phase_avg_<sn>.<iphase>.<pid+1> 715*59599516SKenneth E. Jansen sprintf(rfile,"restart_phase_avg_%d.%d.%d",*stepno,*iphase,*pid+1); 716*59599516SKenneth E. Jansen 717*59599516SKenneth E. Jansen char *fieldlabel = (char *)malloc((*tagsize+1)*sizeof(char)); 718*59599516SKenneth E. Jansen strncpy(fieldlabel, fieldtag, *tagsize); 719*59599516SKenneth E. Jansen fieldlabel[*tagsize] = '\0'; 720*59599516SKenneth E. Jansen 721*59599516SKenneth E. Jansen int irstou; 722*59599516SKenneth E. Jansen int isize, nitems; 723*59599516SKenneth E. Jansen int iarray[10]; 724*59599516SKenneth E. Jansen 725*59599516SKenneth E. Jansen char fmode[10]; 726*59599516SKenneth E. Jansen if(!strncmp(filemode,"w",1)) 727*59599516SKenneth E. Jansen strcpy(fmode,"write"); 728*59599516SKenneth E. Jansen else // default is append 729*59599516SKenneth E. Jansen strcpy(fmode,"append"); 730*59599516SKenneth E. Jansen 731*59599516SKenneth E. Jansen char datatype[10]; 732*59599516SKenneth E. Jansen if(!strncmp(arraytype,"i",1)) 733*59599516SKenneth E. Jansen strcpy(datatype,"int"); 734*59599516SKenneth E. Jansen else // default is double 735*59599516SKenneth E. Jansen strcpy(datatype,"double"); 736*59599516SKenneth E. Jansen 737*59599516SKenneth E. Jansen openfile(rfile, fmode, &irstou); 738*59599516SKenneth E. Jansen 739*59599516SKenneth E. Jansen if(!strcmp(fmode,"write")) { 740*59599516SKenneth E. Jansen // may be create a routine for 'top' portion under write mode 741*59599516SKenneth E. Jansen int magic_number = 362436; 742*59599516SKenneth E. Jansen int* mptr = &magic_number; 743*59599516SKenneth E. Jansen time_t timenow = time ( &timenow); 744*59599516SKenneth E. Jansen double version=0.0; 745*59599516SKenneth E. Jansen 746*59599516SKenneth E. Jansen /* writing the top ascii header for the restart file */ 747*59599516SKenneth E. Jansen 748*59599516SKenneth E. Jansen writestring( &irstou,"# PHASTA Input File Version 2.0\n"); 749*59599516SKenneth E. Jansen writestring( &irstou, 750*59599516SKenneth E. Jansen "# format \"keyphrase : sizeofnextblock usual headers\"\n"); 751*59599516SKenneth E. Jansen 752*59599516SKenneth E. Jansen char fname[255]; 753*59599516SKenneth E. Jansen bzero( (void*)fname, 255 ); 754*59599516SKenneth E. Jansen sprintf(fname,"# Output generated by phasta version (NOT YET CURRENT): %lf \n", version); 755*59599516SKenneth E. Jansen writestring( &irstou, fname ); 756*59599516SKenneth E. Jansen 757*59599516SKenneth E. Jansen bzero( (void*)fname, 255 ); 758*59599516SKenneth E. Jansen gethostname(fname,255); 759*59599516SKenneth E. Jansen writestring( &irstou,"# This result was produced on: "); 760*59599516SKenneth E. Jansen writestring( &irstou, fname ); 761*59599516SKenneth E. Jansen writestring( &irstou,"\n"); 762*59599516SKenneth E. Jansen 763*59599516SKenneth E. Jansen bzero( (void*)fname, 255 ); 764*59599516SKenneth E. Jansen sprintf(fname,"# %s\n", ctime( &timenow )); 765*59599516SKenneth E. Jansen writestring( &irstou, fname ); 766*59599516SKenneth E. Jansen 767*59599516SKenneth E. Jansen isize = 1; 768*59599516SKenneth E. Jansen nitems = 1; 769*59599516SKenneth E. Jansen iarray[ 0 ] = 1; 770*59599516SKenneth E. Jansen writeheader( &irstou, "byteorder magic number ", 771*59599516SKenneth E. Jansen (void*)iarray, &nitems, &isize, "integer", phasta_iotype ); 772*59599516SKenneth E. Jansen writedatablock( &irstou, "byteorder magic number ", 773*59599516SKenneth E. Jansen (void*)mptr, &isize, "integer", phasta_iotype ); 774*59599516SKenneth E. Jansen } 775*59599516SKenneth E. Jansen 776*59599516SKenneth E. Jansen isize = (*nshg)*(*numvars); 777*59599516SKenneth E. Jansen nitems = 3; // assuming field will write 3 items in iarray 778*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 779*59599516SKenneth E. Jansen iarray[ 1 ] = (*numvars); 780*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepno); 781*59599516SKenneth E. Jansen writeheader( &irstou, fieldlabel, (void*)iarray, &nitems, &isize, datatype, phasta_iotype ); 782*59599516SKenneth E. Jansen writedatablock( &irstou, fieldlabel, array, &isize, datatype, phasta_iotype ); 783*59599516SKenneth E. Jansen 784*59599516SKenneth E. Jansen closefile( &irstou, fmode); 785*59599516SKenneth E. Jansen 786*59599516SKenneth E. Jansen free(fieldlabel); 787*59599516SKenneth E. Jansen } 788*59599516SKenneth E. Jansen 789*59599516SKenneth E. Jansen void 790*59599516SKenneth E. Jansen Write_PhAvg2( int* pid, 791*59599516SKenneth E. Jansen char* filemode, 792*59599516SKenneth E. Jansen char* fieldtag, 793*59599516SKenneth E. Jansen int* tagsize, 794*59599516SKenneth E. Jansen int* iphase, 795*59599516SKenneth E. Jansen int* nphasesincycle, 796*59599516SKenneth E. Jansen void* array, 797*59599516SKenneth E. Jansen char* arraytype, 798*59599516SKenneth E. Jansen int* nshg, 799*59599516SKenneth E. Jansen int* numvars, 800*59599516SKenneth E. Jansen int* stepno) { 801*59599516SKenneth E. Jansen 802*59599516SKenneth E. Jansen int addtagsize; // phase number is added to the name of the field 803*59599516SKenneth E. Jansen if(*iphase<10) 804*59599516SKenneth E. Jansen addtagsize=1; 805*59599516SKenneth E. Jansen else if(*iphase<100) 806*59599516SKenneth E. Jansen addtagsize=2; 807*59599516SKenneth E. Jansen else if(*iphase<1000) 808*59599516SKenneth E. Jansen addtagsize=3; 809*59599516SKenneth E. Jansen 810*59599516SKenneth E. Jansen int tagsize2; 811*59599516SKenneth E. Jansen tagsize2=*tagsize+addtagsize; 812*59599516SKenneth E. Jansen 813*59599516SKenneth E. Jansen char *fieldlabel = (char *)malloc((tagsize2+1)*sizeof(char)); 814*59599516SKenneth E. Jansen strncpy(fieldlabel, fieldtag, *tagsize); 815*59599516SKenneth E. Jansen fieldlabel[tagsize2] = '\0'; 816*59599516SKenneth E. Jansen 817*59599516SKenneth E. Jansen char straddtagsize[10]; 818*59599516SKenneth E. Jansen sprintf(straddtagsize,"%d",*iphase); 819*59599516SKenneth E. Jansen 820*59599516SKenneth E. Jansen if(*iphase<10) { 821*59599516SKenneth E. Jansen fieldlabel[tagsize2-1]=straddtagsize[0]; 822*59599516SKenneth E. Jansen } 823*59599516SKenneth E. Jansen else if(*iphase<100) { 824*59599516SKenneth E. Jansen fieldlabel[tagsize2-2]=straddtagsize[0]; 825*59599516SKenneth E. Jansen fieldlabel[tagsize2-1]=straddtagsize[1]; 826*59599516SKenneth E. Jansen } 827*59599516SKenneth E. Jansen else if(*iphase<1000) { 828*59599516SKenneth E. Jansen fieldlabel[tagsize2-3]=straddtagsize[0]; 829*59599516SKenneth E. Jansen fieldlabel[tagsize2-2]=straddtagsize[1]; 830*59599516SKenneth E. Jansen fieldlabel[tagsize2-1]=straddtagsize[2]; 831*59599516SKenneth E. Jansen } 832*59599516SKenneth E. Jansen 833*59599516SKenneth E. Jansen int irstou; 834*59599516SKenneth E. Jansen int magic_number = 362436; 835*59599516SKenneth E. Jansen int* mptr = &magic_number; 836*59599516SKenneth E. Jansen double version=0.0; 837*59599516SKenneth E. Jansen int isize, nitems; 838*59599516SKenneth E. Jansen int iarray[10]; 839*59599516SKenneth E. Jansen 840*59599516SKenneth E. Jansen char fmode[10]; 841*59599516SKenneth E. Jansen if(!strncmp(filemode,"w",1)) 842*59599516SKenneth E. Jansen strcpy(fmode,"write"); 843*59599516SKenneth E. Jansen else // default is append 844*59599516SKenneth E. Jansen strcpy(fmode,"append"); 845*59599516SKenneth E. Jansen 846*59599516SKenneth E. Jansen char datatype[10]; 847*59599516SKenneth E. Jansen if(!strncmp(arraytype,"i",1)) 848*59599516SKenneth E. Jansen strcpy(datatype,"int"); 849*59599516SKenneth E. Jansen else // default is double 850*59599516SKenneth E. Jansen strcpy(datatype,"double"); 851*59599516SKenneth E. Jansen 852*59599516SKenneth E. Jansen /////////////////////////////// Start of writing using new-lib //////////////////////////// 853*59599516SKenneth E. Jansen 854*59599516SKenneth E. Jansen int nfiles; 855*59599516SKenneth E. Jansen int nfields; 856*59599516SKenneth E. Jansen int numparts; 857*59599516SKenneth E. Jansen int irank; 858*59599516SKenneth E. Jansen int nprocs; 859*59599516SKenneth E. Jansen 860*59599516SKenneth E. Jansen nfiles = outpar.nsynciofiles; 861*59599516SKenneth E. Jansen nfields = outpar.nsynciofieldswriterestart; 862*59599516SKenneth E. Jansen numparts = workfc.numpe; 863*59599516SKenneth E. Jansen irank = *pid; //workfc.myrank; 864*59599516SKenneth E. Jansen nprocs = workfc.numpe; 865*59599516SKenneth E. Jansen 866*59599516SKenneth E. Jansen int nppf = numparts/nfiles; 867*59599516SKenneth E. Jansen int GPID; 868*59599516SKenneth E. Jansen 869*59599516SKenneth E. Jansen // Calculate number of parts each proc deal with and where it start and end ... 870*59599516SKenneth E. Jansen int nppp = numparts/nprocs;// nppp : Number of parts per proc ... 871*59599516SKenneth E. Jansen int startpart = irank * nppp +1;// Part id from which I (myrank) start ... 872*59599516SKenneth E. Jansen int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ... 873*59599516SKenneth E. Jansen 874*59599516SKenneth E. Jansen char fieldtag_s[255]; 875*59599516SKenneth E. Jansen bzero((void*)fieldtag_s,255); 876*59599516SKenneth E. Jansen 877*59599516SKenneth E. Jansen field_flag++; 878*59599516SKenneth E. Jansen if(*pid==0) { 879*59599516SKenneth E. Jansen printf("\n"); 880*59599516SKenneth E. Jansen printf("The %d/%d th field to be written is '%s'\n",field_flag,nfields,fieldlabel); 881*59599516SKenneth E. Jansen } 882*59599516SKenneth E. Jansen 883*59599516SKenneth E. Jansen int i; 884*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++ ) { 885*59599516SKenneth E. Jansen GPID = startpart + i; 886*59599516SKenneth E. Jansen 887*59599516SKenneth E. Jansen // Write solution field ... 888*59599516SKenneth E. Jansen sprintf(fieldtag_s,"%s@%d",fieldlabel,GPID); 889*59599516SKenneth E. Jansen 890*59599516SKenneth E. Jansen isize = (*nshg)*(*numvars); 891*59599516SKenneth E. Jansen nitems = 3; 892*59599516SKenneth E. Jansen iarray[ 0 ] = (*nshg); 893*59599516SKenneth E. Jansen iarray[ 1 ] = (*numvars); 894*59599516SKenneth E. Jansen iarray[ 2 ] = (*stepno); 895*59599516SKenneth E. Jansen writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype); 896*59599516SKenneth E. Jansen writedatablock( &f_descriptor, fieldtag_s, array, &isize, "double", phasta_iotype ); 897*59599516SKenneth E. Jansen } 898*59599516SKenneth E. Jansen 899*59599516SKenneth E. Jansen if (field_flag==nfields){ 900*59599516SKenneth E. Jansen closefile(&f_descriptor, "write"); 901*59599516SKenneth E. Jansen finalizephmpiio(&f_descriptor); 902*59599516SKenneth E. Jansen if (*pid==0) { 903*59599516SKenneth E. Jansen printf("\n"); 904*59599516SKenneth E. Jansen } 905*59599516SKenneth E. Jansen } 906*59599516SKenneth E. Jansen 907*59599516SKenneth E. Jansen free(fieldlabel); 908*59599516SKenneth E. Jansen } 909*59599516SKenneth E. Jansen 910*59599516SKenneth E. Jansen 911*59599516SKenneth E. Jansen void 912*59599516SKenneth E. Jansen Write_d2wall( int* pid, 913*59599516SKenneth E. Jansen int* numnp, 914*59599516SKenneth E. Jansen double* array1 ) { 915*59599516SKenneth E. Jansen 916*59599516SKenneth E. Jansen int isize, nitems; 917*59599516SKenneth E. Jansen int iarray[10]; 918*59599516SKenneth E. Jansen 919*59599516SKenneth E. Jansen /////////////////////////////// Start of writing using new-lib //////////////////////////// 920*59599516SKenneth E. Jansen 921*59599516SKenneth E. Jansen int nfiles; 922*59599516SKenneth E. Jansen int nfields; 923*59599516SKenneth E. Jansen int numparts; 924*59599516SKenneth E. Jansen int irank; 925*59599516SKenneth E. Jansen int nprocs; 926*59599516SKenneth E. Jansen 927*59599516SKenneth E. Jansen // First, count the number of fields to write and store the result in 928*59599516SKenneth E. Jansen //countfieldstowriterestart(); 929*59599516SKenneth E. Jansen 930*59599516SKenneth E. Jansen // Retrieve and compute the parameters required for SyncIO 931*59599516SKenneth E. Jansen nfiles = outpar.nsynciofiles; 932*59599516SKenneth E. Jansen nfields = 1; //outpar.nsynciofieldswriterestart; // Only the distance to the walls in d2wall 933*59599516SKenneth E. Jansen numparts = workfc.numpe; 934*59599516SKenneth E. Jansen irank = *pid; //workfc.myrank; 935*59599516SKenneth E. Jansen nprocs = workfc.numpe; 936*59599516SKenneth E. Jansen int nppf = numparts/nfiles; 937*59599516SKenneth E. Jansen int GPID; 938*59599516SKenneth E. Jansen 939*59599516SKenneth E. Jansen // Calculate number of parts each proc deal with and where it start and end ... 940*59599516SKenneth E. Jansen int nppp = numparts/nprocs;// nppp : Number of parts per proc ... 941*59599516SKenneth E. Jansen int startpart = irank * nppp +1;// Part id from which I (myrank) start ... 942*59599516SKenneth E. Jansen int endpart = startpart + nppp - 1;// Part id to which I (myrank) end ... 943*59599516SKenneth E. Jansen 944*59599516SKenneth E. Jansen int descriptor; 945*59599516SKenneth E. Jansen char filename[255],fieldtag_s[255]; 946*59599516SKenneth E. Jansen bzero((void*)filename,255); 947*59599516SKenneth E. Jansen bzero((void*)fieldtag_s,255); 948*59599516SKenneth E. Jansen 949*59599516SKenneth E. Jansen sprintf(filename,"d2wall.%d",((int)(irank/(nprocs/nfiles))+1)); 950*59599516SKenneth E. Jansen 951*59599516SKenneth E. Jansen if (irank==0) { 952*59599516SKenneth E. Jansen printf("Filename is %s \n",filename); 953*59599516SKenneth E. Jansen } 954*59599516SKenneth E. Jansen 955*59599516SKenneth E. Jansen initphmpiio(&nfields, &nppf, &nfiles, &f_descriptor, "write"); 956*59599516SKenneth E. Jansen 957*59599516SKenneth E. Jansen openfile(filename, "write", &f_descriptor); 958*59599516SKenneth E. Jansen 959*59599516SKenneth E. Jansen field_flag=0; 960*59599516SKenneth E. Jansen 961*59599516SKenneth E. Jansen int i; 962*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++) { //This loop is useful only if several parts per processor 963*59599516SKenneth E. Jansen // GPID : global part id, corresponds to rank ... 964*59599516SKenneth E. Jansen // e.g : (in this example) 965*59599516SKenneth E. Jansen // proc 0 : 1--4 966*59599516SKenneth E. Jansen // proc 1 : 5--8 ... 967*59599516SKenneth E. Jansen GPID = startpart + i; 968*59599516SKenneth E. Jansen 969*59599516SKenneth E. Jansen // Write solution field ... 970*59599516SKenneth E. Jansen sprintf(fieldtag_s,"d2wall@%d",GPID); 971*59599516SKenneth E. Jansen 972*59599516SKenneth E. Jansen isize = (*numnp); 973*59599516SKenneth E. Jansen nitems = 2; 974*59599516SKenneth E. Jansen iarray[ 0 ] = (*numnp); 975*59599516SKenneth E. Jansen iarray[ 1 ] = 1; //numVars = 1 976*59599516SKenneth E. Jansen writeheader( &f_descriptor, fieldtag_s, (void*)iarray, &nitems, &isize, "double", phasta_iotype); 977*59599516SKenneth E. Jansen writedatablock( &f_descriptor, fieldtag_s, (void*)(array1), &isize, "double", phasta_iotype ); 978*59599516SKenneth E. Jansen } 979*59599516SKenneth E. Jansen field_flag++; 980*59599516SKenneth E. Jansen 981*59599516SKenneth E. Jansen if (field_flag==nfields){ 982*59599516SKenneth E. Jansen closefile(&f_descriptor, "write"); 983*59599516SKenneth E. Jansen finalizephmpiio(&f_descriptor); 984*59599516SKenneth E. Jansen if (irank==0) { 985*59599516SKenneth E. Jansen printf("\n"); 986*59599516SKenneth E. Jansen } 987*59599516SKenneth E. Jansen } 988*59599516SKenneth E. Jansen } 989*59599516SKenneth E. Jansen 990