1*59599516SKenneth E. Jansen #include <stdio.h> 2*59599516SKenneth E. Jansen #include <iostream> 3*59599516SKenneth E. Jansen #include <string.h> 4*59599516SKenneth E. Jansen #include <stdlib.h> 5*59599516SKenneth E. Jansen //#define OMPI_SKIP_MPICXX 1 //Added in the CMakeList.txt file 6*59599516SKenneth E. Jansen #include <mpi.h> 7*59599516SKenneth E. Jansen #include <math.h> 8*59599516SKenneth E. Jansen #include "phastaIO.h" 9*59599516SKenneth E. Jansen #include <sys/stat.h> 10*59599516SKenneth E. Jansen #include <sys/types.h> 11*59599516SKenneth E. Jansen 12*59599516SKenneth E. Jansen enum { 13*59599516SKenneth E. Jansen DIR_FANOUT = 2048 14*59599516SKenneth E. Jansen }; 15*59599516SKenneth E. Jansen 16*59599516SKenneth E. Jansen inline int 17*59599516SKenneth E. Jansen cscompare( const char teststring[], 18*59599516SKenneth E. Jansen const char targetstring[] ) 19*59599516SKenneth E. Jansen { 20*59599516SKenneth E. Jansen char* s1 = const_cast<char*>(teststring); 21*59599516SKenneth E. Jansen char* s2 = const_cast<char*>(targetstring); 22*59599516SKenneth E. Jansen 23*59599516SKenneth E. Jansen while( *s1 == ' ') s1++; 24*59599516SKenneth E. Jansen while( *s2 == ' ') s2++; 25*59599516SKenneth E. Jansen while( ( *s1 ) 26*59599516SKenneth E. Jansen && ( *s2 ) 27*59599516SKenneth E. Jansen && ( *s2 != '?') 28*59599516SKenneth E. Jansen && ( tolower( *s1 )==tolower( *s2 ) ) ) { 29*59599516SKenneth E. Jansen s1++; 30*59599516SKenneth E. Jansen s2++; 31*59599516SKenneth E. Jansen while( *s1 == ' ') s1++; 32*59599516SKenneth E. Jansen while( *s2 == ' ') s2++; 33*59599516SKenneth E. Jansen } 34*59599516SKenneth E. Jansen if ( !( *s1 ) || ( *s1 == '?') ) return 1; 35*59599516SKenneth E. Jansen else return 0; 36*59599516SKenneth E. Jansen } 37*59599516SKenneth E. Jansen 38*59599516SKenneth E. Jansen inline int 39*59599516SKenneth E. Jansen computenitems(const int localpartid, const int fieldid, const int myrank, const char *fieldName, int ***para, const int intHeader, const int numVariables) { 40*59599516SKenneth E. Jansen // This routine computes the number of items in the data block based on 41*59599516SKenneth E. Jansen // - the name of the fields 42*59599516SKenneth E. Jansen // - the integers read from the header 43*59599516SKenneth E. Jansen 44*59599516SKenneth E. Jansen int nItems = -1; 45*59599516SKenneth E. Jansen 46*59599516SKenneth E. Jansen if (cscompare("nbc values",fieldName)) 47*59599516SKenneth E. Jansen nItems = para[localpartid][fieldid][0] * (numVariables+1); 48*59599516SKenneth E. Jansen else if (cscompare("nbc codes",fieldName)) 49*59599516SKenneth E. Jansen nItems = para[localpartid][fieldid][0] * 2; 50*59599516SKenneth E. Jansen else if ( intHeader==1) 51*59599516SKenneth E. Jansen nItems = para[localpartid][fieldid][0]; 52*59599516SKenneth E. Jansen else 53*59599516SKenneth E. Jansen nItems = para[localpartid][fieldid][0] * para[localpartid][fieldid][1]; 54*59599516SKenneth E. Jansen return nItems; 55*59599516SKenneth E. Jansen } 56*59599516SKenneth E. Jansen 57*59599516SKenneth E. Jansen 58*59599516SKenneth E. Jansen int main(int argc, char *argv[]) { 59*59599516SKenneth E. Jansen 60*59599516SKenneth E. Jansen MPI_Init(&argc,&argv); 61*59599516SKenneth E. Jansen 62*59599516SKenneth E. Jansen int myrank, N_procs; 63*59599516SKenneth E. Jansen MPI_Comm_rank(MPI_COMM_WORLD, &myrank); 64*59599516SKenneth E. Jansen MPI_Comm_size(MPI_COMM_WORLD, &N_procs); 65*59599516SKenneth E. Jansen 66*59599516SKenneth E. Jansen FILE * pFile,* AccessoryFileHandle; 67*59599516SKenneth E. Jansen char target[1024], pool[256], tempString[128],numpe[8],numstart[8]; 68*59599516SKenneth E. Jansen char * temp, * token; 69*59599516SKenneth E. Jansen int fieldCompareMark; 70*59599516SKenneth E. Jansen bool readField; 71*59599516SKenneth E. Jansen int i, j, k, N_geombc_double, N_geombc_integer, N_restart_double; 72*59599516SKenneth E. Jansen int N_restart_integer, N_steps, N_parts, N_files; 73*59599516SKenneth E. Jansen 74*59599516SKenneth E. Jansen pFile = fopen("./IO.O2N.input","r"); 75*59599516SKenneth E. Jansen if (pFile == NULL) 76*59599516SKenneth E. Jansen printf("Error openning\n"); 77*59599516SKenneth E. Jansen 78*59599516SKenneth E. Jansen fgets( target, 1024, pFile ); 79*59599516SKenneth E. Jansen token = strtok ( target, ";" );strcpy(pool,token); 80*59599516SKenneth E. Jansen temp = strtok ( pool, ":" );temp = strtok ( NULL, ":" ); 81*59599516SKenneth E. Jansen N_geombc_double = atoi(temp); 82*59599516SKenneth E. Jansen 83*59599516SKenneth E. Jansen fgets( target, 1024, pFile ); 84*59599516SKenneth E. Jansen token = strtok ( target, ";" );strcpy(pool,token); 85*59599516SKenneth E. Jansen temp = strtok ( pool, ":" );temp = strtok ( NULL, ":" ); 86*59599516SKenneth E. Jansen N_geombc_integer = atoi(temp); 87*59599516SKenneth E. Jansen 88*59599516SKenneth E. Jansen fgets( target, 1024, pFile ); 89*59599516SKenneth E. Jansen token = strtok ( target, ";" );strcpy(pool,token); 90*59599516SKenneth E. Jansen temp = strtok ( pool, ":" );temp = strtok ( NULL, ":" ); 91*59599516SKenneth E. Jansen N_restart_double = atoi(temp); 92*59599516SKenneth E. Jansen 93*59599516SKenneth E. Jansen fgets( target, 1024, pFile ); 94*59599516SKenneth E. Jansen token = strtok ( target, ";" );strcpy(pool,token); 95*59599516SKenneth E. Jansen temp = strtok ( pool, ":" );temp = strtok ( NULL, ":" ); 96*59599516SKenneth E. Jansen N_restart_integer = atoi(temp); 97*59599516SKenneth E. Jansen 98*59599516SKenneth E. Jansen fgets( target, 1024, pFile ); 99*59599516SKenneth E. Jansen token = strtok ( target, ";" );strcpy(pool,token); 100*59599516SKenneth E. Jansen temp = strtok ( pool, ":" );temp = strtok ( NULL, ":" ); 101*59599516SKenneth E. Jansen strncpy(numstart,temp,1); 102*59599516SKenneth E. Jansen N_steps = atoi(temp); 103*59599516SKenneth E. Jansen 104*59599516SKenneth E. Jansen fgets( target, 1024, pFile ); 105*59599516SKenneth E. Jansen token = strtok ( target, ";" );strcpy(pool,token); 106*59599516SKenneth E. Jansen temp = strtok ( pool, ":" );temp = strtok ( NULL, ":" ); 107*59599516SKenneth E. Jansen strncpy(numpe,temp,1); 108*59599516SKenneth E. Jansen N_parts = atoi(temp); 109*59599516SKenneth E. Jansen 110*59599516SKenneth E. Jansen if(myrank==0){ 111*59599516SKenneth E. Jansen printf("numpe is %d and start is %d\n",N_parts,N_steps); 112*59599516SKenneth E. Jansen } 113*59599516SKenneth E. Jansen 114*59599516SKenneth E. Jansen fgets( target, 1024, pFile ); 115*59599516SKenneth E. Jansen token = strtok ( target, ";" );strcpy(pool,token); 116*59599516SKenneth E. Jansen temp = strtok ( pool, ":" );temp = strtok ( NULL, ":" ); 117*59599516SKenneth E. Jansen N_files = atoi(temp); 118*59599516SKenneth E. Jansen 119*59599516SKenneth E. Jansen double ***Dfield; int ***Ifield; 120*59599516SKenneth E. Jansen int ***paraD, ***paraI, *expectD, *expectI; 121*59599516SKenneth E. Jansen char **fieldNameD, **fileTypeD, **dataTypeD, **headerTypeD; 122*59599516SKenneth E. Jansen char **fieldNameI, **fileTypeI, **dataTypeI, **headerTypeI; 123*59599516SKenneth E. Jansen 124*59599516SKenneth E. Jansen int WriteLockD[N_geombc_double]; 125*59599516SKenneth E. Jansen int WriteLockI[N_geombc_integer]; 126*59599516SKenneth E. Jansen 127*59599516SKenneth E. Jansen int nppp = N_parts/N_procs; 128*59599516SKenneth E. Jansen int startpart = myrank * nppp +1; 129*59599516SKenneth E. Jansen int endpart = startpart + nppp - 1; 130*59599516SKenneth E. Jansen char gfname[64], numTemp[128]; 131*59599516SKenneth E. Jansen int iarray[10], igeom, isize,TempFileHandle; 132*59599516SKenneth E. Jansen 133*59599516SKenneth E. Jansen //////////////////////////////////////// 134*59599516SKenneth E. Jansen // Test if the user has given the right parameters related to the number of parts, procs and SyncIO files 135*59599516SKenneth E. Jansen //////////////////////////////////////// 136*59599516SKenneth E. Jansen 137*59599516SKenneth E. Jansen if (N_parts%N_files!=0) 138*59599516SKenneth E. Jansen { 139*59599516SKenneth E. Jansen printf("Input error: number of parts should be a multiple of number of files!\n"); 140*59599516SKenneth E. Jansen printf("Please modify the IO.O2N.input file!\n"); 141*59599516SKenneth E. Jansen return 0; 142*59599516SKenneth E. Jansen } 143*59599516SKenneth E. Jansen if (N_procs%N_files!=0) 144*59599516SKenneth E. Jansen { 145*59599516SKenneth E. Jansen printf("Input error: number of procs should be a multiple of number of files!\n"); 146*59599516SKenneth E. Jansen printf("Please modify the IO.O2N.input file!\n"); 147*59599516SKenneth E. Jansen return 0; 148*59599516SKenneth E. Jansen } 149*59599516SKenneth E. Jansen if (N_parts%N_procs!=0) 150*59599516SKenneth E. Jansen { 151*59599516SKenneth E. Jansen printf("Input error: number of parts should be a multiple of number of procs!\n"); 152*59599516SKenneth E. Jansen printf("Please modify the IO.O2N.input file!\n"); 153*59599516SKenneth E. Jansen return 0; 154*59599516SKenneth E. Jansen } 155*59599516SKenneth E. Jansen 156*59599516SKenneth E. Jansen ///////////////////////////////////// 157*59599516SKenneth E. Jansen // Create numpe.in and numstart.dat 158*59599516SKenneth E. Jansen //////////////////////////////////////// 159*59599516SKenneth E. Jansen 160*59599516SKenneth E. Jansen if (myrank==0) 161*59599516SKenneth E. Jansen { 162*59599516SKenneth E. Jansen 163*59599516SKenneth E. Jansen //MR CHANGE 164*59599516SKenneth E. Jansen bzero((void*)gfname,64); 165*59599516SKenneth E. Jansen sprintf(gfname,"./%d-procs_case-SyncIO-%d",N_parts,N_files); 166*59599516SKenneth E. Jansen if(0<mkdir(gfname,0777)) { printf("ERROR - Could not create procs_case-SyncIO directory\n"); return 1; } 167*59599516SKenneth E. Jansen //MR CHANGE END 168*59599516SKenneth E. Jansen 169*59599516SKenneth E. Jansen bzero((void*)gfname,64); 170*59599516SKenneth E. Jansen sprintf(gfname,"./%d-procs_case-SyncIO-%d/numstart.dat",N_parts,N_files); 171*59599516SKenneth E. Jansen AccessoryFileHandle=fopen(gfname,"w"); 172*59599516SKenneth E. Jansen fprintf(AccessoryFileHandle,"%d",N_steps); 173*59599516SKenneth E. Jansen fclose(AccessoryFileHandle); 174*59599516SKenneth E. Jansen 175*59599516SKenneth E. Jansen bzero((void*)gfname,64); 176*59599516SKenneth E. Jansen sprintf(gfname,"./%d-procs_case-SyncIO-%d/numpe.in",N_parts,N_files); 177*59599516SKenneth E. Jansen AccessoryFileHandle=fopen(gfname,"w"); 178*59599516SKenneth E. Jansen fprintf(AccessoryFileHandle,"%d",N_parts); 179*59599516SKenneth E. Jansen fclose(AccessoryFileHandle); 180*59599516SKenneth E. Jansen } 181*59599516SKenneth E. Jansen 182*59599516SKenneth E. Jansen /////////////////////////////////////// 183*59599516SKenneth E. Jansen Dfield = new double**[nppp]; 184*59599516SKenneth E. Jansen Ifield = new int**[nppp]; 185*59599516SKenneth E. Jansen 186*59599516SKenneth E. Jansen paraD = new int**[nppp]; 187*59599516SKenneth E. Jansen paraI = new int**[nppp]; 188*59599516SKenneth E. Jansen ///////////////////////////////////// 189*59599516SKenneth E. Jansen 190*59599516SKenneth E. Jansen int interiorMark[nppp], boundaryMark[nppp], codesMark[nppp], valuesMark[nppp]; 191*59599516SKenneth E. Jansen int numVariables[nppp]; 192*59599516SKenneth E. Jansen // int numBoundaryFields[nppp], numInteriorFields[nppp]; 193*59599516SKenneth E. Jansen 194*59599516SKenneth E. Jansen if(myrank==0){ 195*59599516SKenneth E. Jansen printf("Starting to read some headers in the restart.##.## and geombc.dat.## files\n"); 196*59599516SKenneth E. Jansen } 197*59599516SKenneth E. Jansen 198*59599516SKenneth E. Jansen // The number of variables does not vary from one part to another. Do not read this info from every part. 199*59599516SKenneth E. Jansen // The ideal would be to ask only rank 0 to read only part 0 and broadcast the information to the other ranks. It saves a lot of time for very big meshes. 200*59599516SKenneth E. Jansen // Right now, every rank will read the number of variables from the solution field of one part only, which is already better than reading this info from every part. 201*59599516SKenneth E. Jansen int ithree = 3; 202*59599516SKenneth E. Jansen j = 0; 203*59599516SKenneth E. Jansen 204*59599516SKenneth E. Jansen // Test if file exist in the procs_case directory 205*59599516SKenneth E. Jansen bzero((void*)gfname,64); 206*59599516SKenneth E. Jansen sprintf(gfname,"./%d-procs_case/restart.%d.%d", N_parts, N_steps, startpart+j); 207*59599516SKenneth E. Jansen int subdir = -1; 208*59599516SKenneth E. Jansen bool existsubdir = false; 209*59599516SKenneth E. Jansen FILE *pfiletest; 210*59599516SKenneth E. Jansen pfiletest = fopen(gfname, "r"); 211*59599516SKenneth E. Jansen if (pfiletest == NULL ) { 212*59599516SKenneth E. Jansen // Test if file exist in the procs_case/subdir directory 213*59599516SKenneth E. Jansen subdir = (startpart+j-1) / DIR_FANOUT; 214*59599516SKenneth E. Jansen bzero((void*)gfname,64); 215*59599516SKenneth E. Jansen sprintf(gfname,"./%d-procs_case/%d/restart.%d.%d",N_parts, subdir, N_steps, startpart+j); 216*59599516SKenneth E. Jansen pfiletest = fopen(gfname, "r"); 217*59599516SKenneth E. Jansen if (pfiletest == NULL ) { 218*59599516SKenneth E. Jansen printf("[%d] File %s does not exit - abort\n",myrank, gfname); 219*59599516SKenneth E. Jansen abort(); 220*59599516SKenneth E. Jansen } 221*59599516SKenneth E. Jansen else{ 222*59599516SKenneth E. Jansen existsubdir = true; 223*59599516SKenneth E. Jansen fclose(pfiletest); 224*59599516SKenneth E. Jansen } 225*59599516SKenneth E. Jansen } 226*59599516SKenneth E. Jansen else { 227*59599516SKenneth E. Jansen fclose(pfiletest); 228*59599516SKenneth E. Jansen } 229*59599516SKenneth E. Jansen 230*59599516SKenneth E. Jansen // Debug 231*59599516SKenneth E. Jansen //printf("Rank: %d - subdir: %d - path: %s\n",myrank, subdir, gfname); 232*59599516SKenneth E. Jansen 233*59599516SKenneth E. Jansen openfile(gfname,"read",&TempFileHandle); 234*59599516SKenneth E. Jansen readheader( &TempFileHandle, 235*59599516SKenneth E. Jansen "solution", 236*59599516SKenneth E. Jansen (void*)iarray, 237*59599516SKenneth E. Jansen &ithree, 238*59599516SKenneth E. Jansen "double", 239*59599516SKenneth E. Jansen "binary" ); 240*59599516SKenneth E. Jansen closefile(&TempFileHandle, "read"); 241*59599516SKenneth E. Jansen for ( j = 0; j < nppp; j++ ) 242*59599516SKenneth E. Jansen numVariables[j] = iarray[1]; //iarray[i] contains the number of variables from the header of the solution field 243*59599516SKenneth E. Jansen 244*59599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); //added by MR 245*59599516SKenneth E. Jansen 246*59599516SKenneth E. Jansen 247*59599516SKenneth E. Jansen ///////////////////////// 248*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++ ) 249*59599516SKenneth E. Jansen { 250*59599516SKenneth E. Jansen Dfield[i] = new double*[N_geombc_double]; // Space for the datablock of double format 251*59599516SKenneth E. Jansen paraD[i] = new int*[N_geombc_double]; // Integers in the header of each field of double format 252*59599516SKenneth E. Jansen Ifield[i] = new int*[N_geombc_integer]; // Space for the datablock of integer format 253*59599516SKenneth E. Jansen paraI[i] = new int*[N_geombc_integer]; // Integers in the header of each field of integer format 254*59599516SKenneth E. Jansen 255*59599516SKenneth E. Jansen } 256*59599516SKenneth E. Jansen 257*59599516SKenneth E. Jansen expectD = new int[N_geombc_double]; // Expected number of integers in the header for each field of double format 258*59599516SKenneth E. Jansen expectI = new int[N_geombc_integer]; // Expected number of integers in the header for each field of integer format 259*59599516SKenneth E. Jansen 260*59599516SKenneth E. Jansen fieldNameD = new char*[N_geombc_double]; // Name of the field in double format 261*59599516SKenneth E. Jansen fileTypeD = new char*[N_geombc_double]; // geombc or restart (useless if associated with geombc file but read) 262*59599516SKenneth E. Jansen dataTypeD = new char*[N_geombc_double]; // Integer or double (useless if associated with double data but read) 263*59599516SKenneth E. Jansen headerTypeD = new char*[N_geombc_double]; // block (means with data block) or header (just a header with no block) 264*59599516SKenneth E. Jansen 265*59599516SKenneth E. Jansen fieldNameI = new char*[N_geombc_integer]; 266*59599516SKenneth E. Jansen fileTypeI = new char*[N_geombc_integer]; 267*59599516SKenneth E. Jansen dataTypeI = new char*[N_geombc_integer]; 268*59599516SKenneth E. Jansen headerTypeI = new char*[N_geombc_integer]; 269*59599516SKenneth E. Jansen 270*59599516SKenneth E. Jansen ///////////////////////// 271*59599516SKenneth E. Jansen 272*59599516SKenneth E. Jansen for ( i = 0; i < N_geombc_double; i++ ) 273*59599516SKenneth E. Jansen { 274*59599516SKenneth E. Jansen WriteLockD[i]=0; 275*59599516SKenneth E. Jansen 276*59599516SKenneth E. Jansen fieldNameD[i] = new char[128]; 277*59599516SKenneth E. Jansen fileTypeD[i] = new char[128]; 278*59599516SKenneth E. Jansen dataTypeD[i] = new char[128]; 279*59599516SKenneth E. Jansen headerTypeD[i] = new char[128]; 280*59599516SKenneth E. Jansen } 281*59599516SKenneth E. Jansen 282*59599516SKenneth E. Jansen for ( i = 0; i < N_geombc_integer; i++ ) 283*59599516SKenneth E. Jansen { 284*59599516SKenneth E. Jansen WriteLockI[i]=0; //This take value 1 if the field requested in IO.input is not found (typically for tpblocks) 285*59599516SKenneth E. Jansen 286*59599516SKenneth E. Jansen fieldNameI[i] = new char[128]; 287*59599516SKenneth E. Jansen fileTypeI[i] = new char[128]; 288*59599516SKenneth E. Jansen dataTypeI[i] = new char[128]; 289*59599516SKenneth E. Jansen headerTypeI[i] = new char[128]; 290*59599516SKenneth E. Jansen } 291*59599516SKenneth E. Jansen 292*59599516SKenneth E. Jansen //////////////////////////////////////////////////////////////// 293*59599516SKenneth E. Jansen // Reading IO.input 294*59599516SKenneth E. Jansen // temporary fix: in the new version the double and integer 295*59599516SKenneth E. Jansen // can mix and match to avoid the order confusion 296*59599516SKenneth E. Jansen //////////////////////////////////////////////////////////////// 297*59599516SKenneth E. Jansen 298*59599516SKenneth E. Jansen char S1[128],S2[128],S3[128],S4[128],S5[128]; 299*59599516SKenneth E. Jansen int double_counter=0,int_counter=0; 300*59599516SKenneth E. Jansen 301*59599516SKenneth E. Jansen for ( i = 0; i < N_geombc_double+N_geombc_integer; i++ ) 302*59599516SKenneth E. Jansen { 303*59599516SKenneth E. Jansen fgets( target, 1024, pFile ); 304*59599516SKenneth E. Jansen temp = strtok( target, ";" ); 305*59599516SKenneth E. Jansen token = strtok( temp, "," ); 306*59599516SKenneth E. Jansen strcpy( S1, token ); 307*59599516SKenneth E. Jansen token = strtok ( NULL, "," ); 308*59599516SKenneth E. Jansen strcpy( S2, token ); 309*59599516SKenneth E. Jansen token = strtok ( NULL, "," ); 310*59599516SKenneth E. Jansen strcpy( S3, token ); 311*59599516SKenneth E. Jansen token = strtok ( NULL, "," ); 312*59599516SKenneth E. Jansen strcpy( S4, token ); 313*59599516SKenneth E. Jansen token = strtok ( NULL, "," ); 314*59599516SKenneth E. Jansen strcpy( S5, token ); 315*59599516SKenneth E. Jansen 316*59599516SKenneth E. Jansen //if (cscompare(S3,"double")) 317*59599516SKenneth E. Jansen if (cscompare("double",S3)) 318*59599516SKenneth E. Jansen { 319*59599516SKenneth E. Jansen strcpy( fileTypeD[double_counter], S1 ); 320*59599516SKenneth E. Jansen strcpy( fieldNameD[double_counter], S2 ); 321*59599516SKenneth E. Jansen strcpy( dataTypeD[double_counter], S3 ); 322*59599516SKenneth E. Jansen strcpy( headerTypeD[double_counter], S4 ); 323*59599516SKenneth E. Jansen strcpy( numTemp, S5 ); 324*59599516SKenneth E. Jansen expectD[double_counter] = atoi (numTemp); 325*59599516SKenneth E. Jansen double_counter++; 326*59599516SKenneth E. Jansen } 327*59599516SKenneth E. Jansen 328*59599516SKenneth E. Jansen //if (cscompare(S3,"integer")) 329*59599516SKenneth E. Jansen if (cscompare("integer",S3)) 330*59599516SKenneth E. Jansen { 331*59599516SKenneth E. Jansen strcpy( fileTypeI[int_counter], S1 ); 332*59599516SKenneth E. Jansen strcpy( fieldNameI[int_counter], S2 ); 333*59599516SKenneth E. Jansen strcpy( dataTypeI[int_counter], S3 ); 334*59599516SKenneth E. Jansen strcpy( headerTypeI[int_counter], S4 ); 335*59599516SKenneth E. Jansen strcpy( numTemp, S5 ); 336*59599516SKenneth E. Jansen expectI[int_counter] = atoi (numTemp); 337*59599516SKenneth E. Jansen int_counter++; 338*59599516SKenneth E. Jansen } 339*59599516SKenneth E. Jansen } 340*59599516SKenneth E. Jansen 341*59599516SKenneth E. Jansen ////////////////////////////////////////////////////////////// 342*59599516SKenneth E. Jansen 343*59599516SKenneth E. Jansen //for ( i = 0; i < N_geombc_double; i++) { 344*59599516SKenneth E. Jansen //printf("%d %s %s %s %s %d\n", myrank, fileTypeD[i], fieldNameD[i], dataTypeD[i], headerTypeD[i], expectD[i]); 345*59599516SKenneth E. Jansen //} 346*59599516SKenneth E. Jansen 347*59599516SKenneth E. Jansen 348*59599516SKenneth E. Jansen // printf("rank %d is waiting\n",myrank); 349*59599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); //already there 350*59599516SKenneth E. Jansen 351*59599516SKenneth E. Jansen if(myrank==0){ 352*59599516SKenneth E. Jansen printf("Starting to read some blocks (doubles) in the geombc.dat.## files\n"); 353*59599516SKenneth E. Jansen } 354*59599516SKenneth E. Jansen 355*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++ ) 356*59599516SKenneth E. Jansen { 357*59599516SKenneth E. Jansen if(existsubdir) { 358*59599516SKenneth E. Jansen subdir = (startpart+i-1) / DIR_FANOUT; 359*59599516SKenneth E. Jansen sprintf(gfname,"./%d-procs_case/%d/geombc.dat.%d",N_parts, subdir, startpart+i); 360*59599516SKenneth E. Jansen } 361*59599516SKenneth E. Jansen else 362*59599516SKenneth E. Jansen sprintf(gfname,"./%d-procs_case/geombc.dat.%d",N_parts,startpart+i); 363*59599516SKenneth E. Jansen 364*59599516SKenneth E. Jansen openfile(gfname,"read",&igeom); 365*59599516SKenneth E. Jansen 366*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 367*59599516SKenneth E. Jansen 368*59599516SKenneth E. Jansen for ( j = 0; j < N_geombc_double; j++ ) 369*59599516SKenneth E. Jansen { 370*59599516SKenneth E. Jansen 371*59599516SKenneth E. Jansen // printf("rank: %d - read double: %s\n",myrank,fieldNameD[j]); 372*59599516SKenneth E. Jansen paraD[i][j] = new int[expectD[j]]; 373*59599516SKenneth E. Jansen 374*59599516SKenneth E. Jansen for ( k = 0; k < 10; k++ ) 375*59599516SKenneth E. Jansen iarray[k]=0; 376*59599516SKenneth E. Jansen 377*59599516SKenneth E. Jansen iarray[0]=-1; 378*59599516SKenneth E. Jansen WriteLockD[j]=0; 379*59599516SKenneth E. Jansen readheader( &igeom, 380*59599516SKenneth E. Jansen fieldNameD[j], 381*59599516SKenneth E. Jansen (void*)iarray, 382*59599516SKenneth E. Jansen &expectD[j], 383*59599516SKenneth E. Jansen "double", 384*59599516SKenneth E. Jansen "binary" ); 385*59599516SKenneth E. Jansen if ( iarray[0]==-1 ) // The field requested in IO.O2N.input has not been found (should be a tpblocks) 386*59599516SKenneth E. Jansen WriteLockD[j]=1; 387*59599516SKenneth E. Jansen 388*59599516SKenneth E. Jansen // printf("rank: %d - part: %d - field: %s - iarray: %d\n",myrank,startpart+i,fieldNameD[j],iarray[0]); 389*59599516SKenneth E. Jansen 390*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 391*59599516SKenneth E. Jansen 392*59599516SKenneth E. Jansen // get the parameter list in data header ... 393*59599516SKenneth E. Jansen // different fields have different ways to get this list ... 394*59599516SKenneth E. Jansen for ( k = 0; k < expectD[j]; k++ ) 395*59599516SKenneth E. Jansen paraD[i][j][k] = iarray[k]; 396*59599516SKenneth E. Jansen 397*59599516SKenneth E. Jansen if ( WriteLockD[j]==1) // Put the value of the expected integers in the header to 0 when field not present 398*59599516SKenneth E. Jansen for ( k = 0; k < expectD[j]; k++ ) 399*59599516SKenneth E. Jansen paraD[i][j][k] = 0; 400*59599516SKenneth E. Jansen 401*59599516SKenneth E. Jansen /* int iproc; 402*59599516SKenneth E. Jansen for(iproc=0; iproc<N_procs; iproc++){ 403*59599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 404*59599516SKenneth E. Jansen if(iproc == myrank){ 405*59599516SKenneth E. Jansen printf(" iproc: %d ", iproc); 406*59599516SKenneth E. Jansen printf("part: %d myrank: %d field: %s header: ",startpart+i,myrank,fieldNameD[j]); 407*59599516SKenneth E. Jansen for ( k = 0; k < expectD[j]; k++ ) 408*59599516SKenneth E. Jansen printf(" %d ",iarray[k]); 409*59599516SKenneth E. Jansen printf("\n"); 410*59599516SKenneth E. Jansen } 411*59599516SKenneth E. Jansen usleep(100); 412*59599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 413*59599516SKenneth E. Jansen }*/ 414*59599516SKenneth E. Jansen 415*59599516SKenneth E. Jansen 416*59599516SKenneth E. Jansen if ( cscompare("block",headerTypeD[j]) ) 417*59599516SKenneth E. Jansen { 418*59599516SKenneth E. Jansen /* if ( expectD[j]==1) 419*59599516SKenneth E. Jansen isize = paraD[i][j][0]; 420*59599516SKenneth E. Jansen else 421*59599516SKenneth E. Jansen isize = paraD[i][j][0] * paraD[i][j][1]; 422*59599516SKenneth E. Jansen 423*59599516SKenneth E. Jansen if (cscompare("nbc values",fieldNameD[j])) 424*59599516SKenneth E. Jansen isize = paraD[i][j][0] * (numVariables[i]+1); 425*59599516SKenneth E. Jansen */ 426*59599516SKenneth E. Jansen 427*59599516SKenneth E. Jansen // int test; 428*59599516SKenneth E. Jansen // test = computenitems(i,j,myrank,fieldNameD[j],paraD,expectD[j],numVariables[i]); 429*59599516SKenneth E. Jansen // printf("irank: %d fieldname: %s ParaD: %d\n",myrank,fieldNameD[j], paraD[0][0][0], numVariables[i]); 430*59599516SKenneth E. Jansen // if(test != isize) 431*59599516SKenneth E. Jansen // printf("PROBLEM fieldname: %s part: %d isize: %d test: %d\n",fieldNameD[j],startpart+i,isize,test); 432*59599516SKenneth E. Jansen // else 433*59599516SKenneth E. Jansen // printf("fieldname: %s part: %d isize: %d test: %d\n",fieldNameD[j],startpart+i,isize,test); 434*59599516SKenneth E. Jansen 435*59599516SKenneth E. Jansen isize = computenitems(i,j,myrank,fieldNameD[j],paraD,expectD[j],numVariables[i]); 436*59599516SKenneth E. Jansen //printf("fieldname: %s part: %d isize: %d\n",fieldNameD[j],startpart+i,isize); 437*59599516SKenneth E. Jansen 438*59599516SKenneth E. Jansen Dfield[i][j] = new double[isize]; 439*59599516SKenneth E. Jansen readdatablock( &igeom, 440*59599516SKenneth E. Jansen fieldNameD[j], 441*59599516SKenneth E. Jansen (void*)Dfield[i][j], 442*59599516SKenneth E. Jansen &isize, 443*59599516SKenneth E. Jansen "double", 444*59599516SKenneth E. Jansen "binary" ); 445*59599516SKenneth E. Jansen } 446*59599516SKenneth E. Jansen } 447*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 448*59599516SKenneth E. Jansen closefile(&igeom, "read"); 449*59599516SKenneth E. Jansen } 450*59599516SKenneth E. Jansen 451*59599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 452*59599516SKenneth E. Jansen if(myrank==0){ 453*59599516SKenneth E. Jansen printf("Starting to read some blocks (integers) in the geombc.dat.## files\n"); 454*59599516SKenneth E. Jansen } 455*59599516SKenneth E. Jansen 456*59599516SKenneth E. Jansen // Count the number of interior and boundary tpblocks for 2 new headers named 457*59599516SKenneth E. Jansen // 'total number of different interior tpblocks' and 458*59599516SKenneth E. Jansen // 'total number of different boundary tpblocks' 459*59599516SKenneth E. Jansen int interiorCounter, boundaryCounter; 460*59599516SKenneth E. Jansen interiorCounter=0; 461*59599516SKenneth E. Jansen boundaryCounter=0; 462*59599516SKenneth E. Jansen for ( j = 0; j < N_geombc_integer; j++ ) 463*59599516SKenneth E. Jansen { 464*59599516SKenneth E. Jansen if (cscompare("connectivity interior",fieldNameI[j])) 465*59599516SKenneth E. Jansen { 466*59599516SKenneth E. Jansen //printf("part: %d, fieldNameI[j]: %s\n",GPID,fieldNameI[j]); 467*59599516SKenneth E. Jansen interiorCounter++; 468*59599516SKenneth E. Jansen } 469*59599516SKenneth E. Jansen else if (cscompare("connectivity boundary",fieldNameI[j])) 470*59599516SKenneth E. Jansen { 471*59599516SKenneth E. Jansen //printf("part: %d, fieldNameI[j]: %s\n",GPID,fieldNameI[j]); 472*59599516SKenneth E. Jansen boundaryCounter++; 473*59599516SKenneth E. Jansen } 474*59599516SKenneth E. Jansen } 475*59599516SKenneth E. Jansen 476*59599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 477*59599516SKenneth E. Jansen if(myrank==0){ 478*59599516SKenneth E. Jansen printf("There are %d total connectivity interior and %d total connectivity boundary\n", interiorCounter, boundaryCounter); 479*59599516SKenneth E. Jansen } 480*59599516SKenneth E. Jansen 481*59599516SKenneth E. Jansen 482*59599516SKenneth E. Jansen 483*59599516SKenneth E. Jansen // Now, start to read the integer fields 484*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++ ) 485*59599516SKenneth E. Jansen { 486*59599516SKenneth E. Jansen if(existsubdir) { 487*59599516SKenneth E. Jansen subdir = (startpart+i-1) / DIR_FANOUT; 488*59599516SKenneth E. Jansen sprintf(gfname,"./%d-procs_case/%d/geombc.dat.%d",N_parts, subdir, startpart+i); 489*59599516SKenneth E. Jansen } 490*59599516SKenneth E. Jansen else 491*59599516SKenneth E. Jansen sprintf(gfname,"./%d-procs_case/geombc.dat.%d", N_parts, startpart+i); 492*59599516SKenneth E. Jansen 493*59599516SKenneth E. Jansen openfile(gfname,"read",&igeom); 494*59599516SKenneth E. Jansen 495*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 496*59599516SKenneth E. Jansen 497*59599516SKenneth E. Jansen // printf("gfname is %s and nppp is %d myrank %d\n",gfname,i,myrank); 498*59599516SKenneth E. Jansen 499*59599516SKenneth E. Jansen for ( j = 0; j < N_geombc_integer; j++ ) 500*59599516SKenneth E. Jansen { 501*59599516SKenneth E. Jansen 502*59599516SKenneth E. Jansen // printf("Writing integer ... %s\n",fieldNameI[j]); 503*59599516SKenneth E. Jansen paraI[i][j] = new int[expectI[j]]; 504*59599516SKenneth E. Jansen 505*59599516SKenneth E. Jansen for ( k = 0; k < 10; k++ ) 506*59599516SKenneth E. Jansen iarray[k]=0; 507*59599516SKenneth E. Jansen 508*59599516SKenneth E. Jansen // printf("myrank %d and i %d j %d numBou is %d\n",myrank,i,j,numBoundaryFields[i]); 509*59599516SKenneth E. Jansen 510*59599516SKenneth E. Jansen WriteLockI[j]=0; 511*59599516SKenneth E. Jansen iarray[0]=-1; 512*59599516SKenneth E. Jansen 513*59599516SKenneth E. Jansen if ( cscompare("total number of interior tpblocks",fieldNameI[j] ) ) 514*59599516SKenneth E. Jansen { 515*59599516SKenneth E. Jansen iarray[0] = interiorCounter; //New header that does not exist in the posix file 516*59599516SKenneth E. Jansen } 517*59599516SKenneth E. Jansen else if ( cscompare("total number of boundary tpblocks",fieldNameI[j] ) ) 518*59599516SKenneth E. Jansen { 519*59599516SKenneth E. Jansen iarray[0] = boundaryCounter; //New header that does not exist in the posix file 520*59599516SKenneth E. Jansen } 521*59599516SKenneth E. Jansen else 522*59599516SKenneth E. Jansen { 523*59599516SKenneth E. Jansen readheader( &igeom, 524*59599516SKenneth E. Jansen fieldNameI[j], 525*59599516SKenneth E. Jansen (void*)iarray, 526*59599516SKenneth E. Jansen &expectI[j], 527*59599516SKenneth E. Jansen "integer", 528*59599516SKenneth E. Jansen "binary" ); 529*59599516SKenneth E. Jansen if ( iarray[0]==-1) 530*59599516SKenneth E. Jansen WriteLockI[j]=1; // The field was not found in the posix geombc file 531*59599516SKenneth E. Jansen } 532*59599516SKenneth E. Jansen 533*59599516SKenneth E. Jansen //MPI_Barrier(MPI_COMM_WORLD); 534*59599516SKenneth E. Jansen 535*59599516SKenneth E. Jansen /* int iproc; 536*59599516SKenneth E. Jansen for(iproc=0; iproc<N_procs; iproc++){ 537*59599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 538*59599516SKenneth E. Jansen if(iproc == myrank){ 539*59599516SKenneth E. Jansen printf(" iproc: %d ", iproc); 540*59599516SKenneth E. Jansen printf("part: %d myrank: %d field: %s header: ",startpart+i,myrank,fieldNameI[j]); 541*59599516SKenneth E. Jansen for ( k = 0; k < expectI[j]; k++ ) 542*59599516SKenneth E. Jansen printf(" %d ",iarray[k]); 543*59599516SKenneth E. Jansen printf("\n"); 544*59599516SKenneth E. Jansen } 545*59599516SKenneth E. Jansen usleep(100); 546*59599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 547*59599516SKenneth E. Jansen }*/ 548*59599516SKenneth E. Jansen 549*59599516SKenneth E. Jansen for ( k = 0; k < expectI[j]; k++ ) 550*59599516SKenneth E. Jansen paraI[i][j][k] = iarray[k]; 551*59599516SKenneth E. Jansen 552*59599516SKenneth E. Jansen if ( WriteLockI[j]==1) //The field is not present but SyncIO needs it to read collectively. Put 0. 553*59599516SKenneth E. Jansen for ( k = 0; k < expectI[j]; k++ ) 554*59599516SKenneth E. Jansen paraI[i][j][k] = 0; 555*59599516SKenneth E. Jansen 556*59599516SKenneth E. Jansen if ( cscompare("block",headerTypeI[j]) ) 557*59599516SKenneth E. Jansen { 558*59599516SKenneth E. Jansen /* if ( expectI[j]==1) 559*59599516SKenneth E. Jansen isize = paraI[i][j][0]; 560*59599516SKenneth E. Jansen else 561*59599516SKenneth E. Jansen isize = paraI[i][j][0] * paraI[i][j][1]; 562*59599516SKenneth E. Jansen 563*59599516SKenneth E. Jansen if (cscompare("nbc codes",fieldNameI[j])) 564*59599516SKenneth E. Jansen isize = paraI[i][j][0] * 2; 565*59599516SKenneth E. Jansen */ 566*59599516SKenneth E. Jansen // int test; 567*59599516SKenneth E. Jansen // test = computenitems(i,j,myrank,fieldNameI[j],paraI,expectI[j],numVariables[i]); 568*59599516SKenneth E. Jansen // printf("irank: %d fieldname: %s ParaI: %d\n",myrank,fieldNameI[j], parapI[0][0][0], numVariables[i]); 569*59599516SKenneth E. Jansen // if(test != isize) 570*59599516SKenneth E. Jansen // printf("PROBLEM fieldname: %s part: %d isize: %d test: %d\n",fieldNameI[j],startpart+i,isize,test); 571*59599516SKenneth E. Jansen // else 572*59599516SKenneth E. Jansen // printf("fieldname: %s part: %d isize: %d test: %d\n",fieldNameI[j],startpart+i,isize,test); 573*59599516SKenneth E. Jansen 574*59599516SKenneth E. Jansen isize = computenitems(i,j,myrank,fieldNameI[j],paraI,expectI[j],numVariables[i]); 575*59599516SKenneth E. Jansen //printf("fieldname: %s part: %d isize: %d\n",fieldNameI[j],startpart+i,isize); 576*59599516SKenneth E. Jansen 577*59599516SKenneth E. Jansen Ifield[i][j] = new int[isize]; 578*59599516SKenneth E. Jansen readdatablock( &igeom, 579*59599516SKenneth E. Jansen fieldNameI[j], 580*59599516SKenneth E. Jansen (void*)Ifield[i][j], 581*59599516SKenneth E. Jansen &isize, 582*59599516SKenneth E. Jansen "integer", 583*59599516SKenneth E. Jansen "binary" ); 584*59599516SKenneth E. Jansen } 585*59599516SKenneth E. Jansen } 586*59599516SKenneth E. Jansen // MPI_Barrier(MPI_COMM_WORLD); 587*59599516SKenneth E. Jansen closefile(&igeom, "read"); 588*59599516SKenneth E. Jansen } 589*59599516SKenneth E. Jansen 590*59599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); //added by MR 591*59599516SKenneth E. Jansen 592*59599516SKenneth E. Jansen ///////////////////// Writing /////////////////////////////// 593*59599516SKenneth E. Jansen 594*59599516SKenneth E. Jansen int nppf = N_parts/N_files; 595*59599516SKenneth E. Jansen int N_geombc = N_geombc_double + N_geombc_integer; 596*59599516SKenneth E. Jansen int writeHandle, GPID; 597*59599516SKenneth E. Jansen char fname[255],fieldtag[255]; 598*59599516SKenneth E. Jansen 599*59599516SKenneth E. Jansen bzero((void*)fname,255); 600*59599516SKenneth E. Jansen //MR CHANGE 601*59599516SKenneth E. Jansen // sprintf(fname,"./%d-procs_case-SyncIO",N_parts); 602*59599516SKenneth E. Jansen // if(0<mkdir(fname,0777)) { printf("ERROR - Could not create procs_case-SyncIO directory\n"); return 1; } 603*59599516SKenneth E. Jansen //MR CHANGE END 604*59599516SKenneth E. Jansen sprintf(fname,"./%d-procs_case-SyncIO-%d/geombc-dat.%d",N_parts,N_files,((int)(myrank/(N_procs/N_files))+1)); 605*59599516SKenneth E. Jansen 606*59599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 607*59599516SKenneth E. Jansen if(myrank==0){ 608*59599516SKenneth E. Jansen printf("Starting to write some blocks (doubles) in the geombc.dat-## files\n"); 609*59599516SKenneth E. Jansen } 610*59599516SKenneth E. Jansen 611*59599516SKenneth E. Jansen initphmpiio(&N_geombc, &nppf, &N_files,&writeHandle, "write"); 612*59599516SKenneth E. Jansen // initphmpiio(&N_geombc, &nppf, &N_files,&writeHandle); 613*59599516SKenneth E. Jansen openfile(fname, "write", &writeHandle); 614*59599516SKenneth E. Jansen 615*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++ ) 616*59599516SKenneth E. Jansen { 617*59599516SKenneth E. Jansen valuesMark[i]=0; 618*59599516SKenneth E. Jansen } 619*59599516SKenneth E. Jansen 620*59599516SKenneth E. Jansen for ( j = 0; j < N_geombc_double; j++ ) 621*59599516SKenneth E. Jansen { 622*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++ ) 623*59599516SKenneth E. Jansen { 624*59599516SKenneth E. Jansen 625*59599516SKenneth E. Jansen //if ( WriteLockD[i] == 0 ) 626*59599516SKenneth E. Jansen { 627*59599516SKenneth E. Jansen GPID = startpart + i; 628*59599516SKenneth E. Jansen bzero((void*)fieldtag,255); 629*59599516SKenneth E. Jansen 630*59599516SKenneth E. Jansen fieldCompareMark=0; 631*59599516SKenneth E. Jansen if (cscompare("nbc values",fieldNameD[j])) 632*59599516SKenneth E. Jansen { 633*59599516SKenneth E. Jansen fieldCompareMark = 1; 634*59599516SKenneth E. Jansen valuesMark[i]++; 635*59599516SKenneth E. Jansen bzero((void*)fieldNameD[j],128); 636*59599516SKenneth E. Jansen sprintf(fieldNameD[j],"nbc values%d",valuesMark[i]); 637*59599516SKenneth E. Jansen 638*59599516SKenneth E. Jansen // if ( valuesMark[i]>numBoundaryFields[i] ) 639*59599516SKenneth E. Jansen // for ( k = 0; k < expectD[j]; k++ ) 640*59599516SKenneth E. Jansen // paraD[i][j][k] = 0; 641*59599516SKenneth E. Jansen } 642*59599516SKenneth E. Jansen 643*59599516SKenneth E. Jansen sprintf(fieldtag,"%s@%d",fieldNameD[j],GPID); 644*59599516SKenneth E. Jansen 645*59599516SKenneth E. Jansen 646*59599516SKenneth E. Jansen /* if ( expectD[j]==1 ) 647*59599516SKenneth E. Jansen isize = paraD[i][j][0]; 648*59599516SKenneth E. Jansen else 649*59599516SKenneth E. Jansen isize = paraD[i][j][0] * paraD[i][j][1]; 650*59599516SKenneth E. Jansen 651*59599516SKenneth E. Jansen //specially designed for nbc values fields 652*59599516SKenneth E. Jansen //check the size in presolver codes 653*59599516SKenneth E. Jansen //Yeah, you have to open restart to get the size 654*59599516SKenneth E. Jansen if ( fieldCompareMark==1 ) 655*59599516SKenneth E. Jansen isize = paraD[i][j][0] * (numVariables[i]+1); 656*59599516SKenneth E. Jansen */ 657*59599516SKenneth E. Jansen if ( cscompare("header",headerTypeD[j]) ) 658*59599516SKenneth E. Jansen isize = 0; 659*59599516SKenneth E. Jansen else // block 660*59599516SKenneth E. Jansen isize = computenitems(i,j,myrank,fieldNameD[j],paraD,expectD[j],numVariables[i]); 661*59599516SKenneth E. Jansen 662*59599516SKenneth E. Jansen for ( k = 0; k < expectD[j]; k++ ) 663*59599516SKenneth E. Jansen iarray[k] = paraD[i][j][k]; 664*59599516SKenneth E. Jansen 665*59599516SKenneth E. Jansen //printf("write fieldname: %s part: %d isize: %d iarray: %d\n",fieldNameD[j],startpart+i,isize, iarray[0]); 666*59599516SKenneth E. Jansen 667*59599516SKenneth E. Jansen writeheader( &writeHandle, 668*59599516SKenneth E. Jansen fieldtag, 669*59599516SKenneth E. Jansen (void*)iarray, 670*59599516SKenneth E. Jansen &expectD[j], 671*59599516SKenneth E. Jansen &isize, 672*59599516SKenneth E. Jansen "double", 673*59599516SKenneth E. Jansen "binary"); 674*59599516SKenneth E. Jansen writedatablock( &writeHandle, 675*59599516SKenneth E. Jansen fieldtag, 676*59599516SKenneth E. Jansen (void*)Dfield[i][j], 677*59599516SKenneth E. Jansen &isize, 678*59599516SKenneth E. Jansen "double", 679*59599516SKenneth E. Jansen "binary"); 680*59599516SKenneth E. Jansen 681*59599516SKenneth E. Jansen if ( cscompare("block",headerTypeD[j]) ) 682*59599516SKenneth E. Jansen delete [] Dfield[i][j]; 683*59599516SKenneth E. Jansen } 684*59599516SKenneth E. Jansen delete [] paraD[i][j]; 685*59599516SKenneth E. Jansen } 686*59599516SKenneth E. Jansen } 687*59599516SKenneth E. Jansen 688*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++ ) 689*59599516SKenneth E. Jansen { 690*59599516SKenneth E. Jansen interiorMark[i]=0; 691*59599516SKenneth E. Jansen boundaryMark[i]=0; 692*59599516SKenneth E. Jansen codesMark[i]=0; 693*59599516SKenneth E. Jansen } 694*59599516SKenneth E. Jansen 695*59599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 696*59599516SKenneth E. Jansen if(myrank==0){ 697*59599516SKenneth E. Jansen printf("Starting to write some blocks (integers) in the geombc.dat-## files\n"); 698*59599516SKenneth E. Jansen } 699*59599516SKenneth E. Jansen 700*59599516SKenneth E. Jansen // Now the other fields listed in IO.O2N.input 701*59599516SKenneth E. Jansen for ( j = 0; j < N_geombc_integer; j++ ) 702*59599516SKenneth E. Jansen { 703*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++ ) 704*59599516SKenneth E. Jansen { 705*59599516SKenneth E. Jansen //if ( WriteLockI[i] == 0 ) 706*59599516SKenneth E. Jansen { 707*59599516SKenneth E. Jansen GPID = startpart + i; 708*59599516SKenneth E. Jansen bzero((void*)fieldtag,255); 709*59599516SKenneth E. Jansen 710*59599516SKenneth E. Jansen if (cscompare("connectivity interior",fieldNameI[j])) 711*59599516SKenneth E. Jansen { 712*59599516SKenneth E. Jansen interiorMark[i]++; 713*59599516SKenneth E. Jansen bzero((void*)fieldNameI[j],128); 714*59599516SKenneth E. Jansen sprintf(fieldNameI[j],"connectivity interior%d",interiorMark[i]); 715*59599516SKenneth E. Jansen 716*59599516SKenneth E. Jansen // if ( interiorMark[i]>numInteriorFields[i] ) 717*59599516SKenneth E. Jansen // for ( k = 0; k < expectI[j]; k++ ) 718*59599516SKenneth E. Jansen // paraI[i][j][k] = 0; 719*59599516SKenneth E. Jansen 720*59599516SKenneth E. Jansen } 721*59599516SKenneth E. Jansen 722*59599516SKenneth E. Jansen if (cscompare("connectivity boundary",fieldNameI[j])) 723*59599516SKenneth E. Jansen { 724*59599516SKenneth E. Jansen boundaryMark[i]++; 725*59599516SKenneth E. Jansen bzero((void*)fieldNameI[j],128); 726*59599516SKenneth E. Jansen sprintf(fieldNameI[j],"connectivity boundary%d",boundaryMark[i]); 727*59599516SKenneth E. Jansen 728*59599516SKenneth E. Jansen // if ( boundaryMark[i]>numBoundaryFields[i] ) 729*59599516SKenneth E. Jansen // for ( k = 0; k < expectI[j]; k++ ) 730*59599516SKenneth E. Jansen // paraI[i][j][k] = 0; 731*59599516SKenneth E. Jansen } 732*59599516SKenneth E. Jansen 733*59599516SKenneth E. Jansen fieldCompareMark=0; 734*59599516SKenneth E. Jansen if (cscompare("nbc codes",fieldNameI[j])) 735*59599516SKenneth E. Jansen { 736*59599516SKenneth E. Jansen fieldCompareMark=1; 737*59599516SKenneth E. Jansen codesMark[i]++; 738*59599516SKenneth E. Jansen bzero((void*)fieldNameI[j],128); 739*59599516SKenneth E. Jansen sprintf(fieldNameI[j],"nbc codes%d",codesMark[i]); 740*59599516SKenneth E. Jansen 741*59599516SKenneth E. Jansen // if ( codesMark[i]>numBoundaryFields[i] ) 742*59599516SKenneth E. Jansen // for ( k = 0; k < expectI[j]; k++ ) 743*59599516SKenneth E. Jansen // paraI[i][j][k] = 0; 744*59599516SKenneth E. Jansen } 745*59599516SKenneth E. Jansen 746*59599516SKenneth E. Jansen sprintf(fieldtag,"%s@%d",fieldNameI[j],GPID); 747*59599516SKenneth E. Jansen 748*59599516SKenneth E. Jansen // if ( expectI[j]==1) 749*59599516SKenneth E. Jansen // isize = paraI[i][j][0]; 750*59599516SKenneth E. Jansen // else 751*59599516SKenneth E. Jansen // isize = paraI[i][j][0] * paraI[i][j][1]; 752*59599516SKenneth E. Jansen 753*59599516SKenneth E. Jansen //MR CHANGE 754*59599516SKenneth E. Jansen // printf("rank,j,i,isize %d %d %d %d\n",myrank,j,i,isize); 755*59599516SKenneth E. Jansen 756*59599516SKenneth E. Jansen 757*59599516SKenneth E. Jansen //specially designed for nbc codes fields 758*59599516SKenneth E. Jansen //check the size in presolver codes 759*59599516SKenneth E. Jansen // if (fieldCompareMark==1) 760*59599516SKenneth E. Jansen // isize = paraI[i][j][0] * 2; 761*59599516SKenneth E. Jansen 762*59599516SKenneth E. Jansen if ( cscompare("header",headerTypeI[j]) ) 763*59599516SKenneth E. Jansen isize = 0; 764*59599516SKenneth E. Jansen else 765*59599516SKenneth E. Jansen isize = computenitems(i,j,myrank,fieldNameI[j],paraI,expectI[j],numVariables[i]); 766*59599516SKenneth E. Jansen 767*59599516SKenneth E. Jansen for ( k = 0; k < expectI[j]; k++ ) 768*59599516SKenneth E. Jansen iarray[k] = paraI[i][j][k]; 769*59599516SKenneth E. Jansen 770*59599516SKenneth E. Jansen // printf("write fieldname: %s part: %d isize: %d iarray: %d\n",fieldNameI[j],startpart+i,isize, iarray[0]); 771*59599516SKenneth E. Jansen 772*59599516SKenneth E. Jansen writeheader( &writeHandle, 773*59599516SKenneth E. Jansen fieldtag, 774*59599516SKenneth E. Jansen (void*)iarray, 775*59599516SKenneth E. Jansen &expectI[j], 776*59599516SKenneth E. Jansen &isize, 777*59599516SKenneth E. Jansen "integer", 778*59599516SKenneth E. Jansen "binary"); 779*59599516SKenneth E. Jansen writedatablock( &writeHandle, 780*59599516SKenneth E. Jansen fieldtag, 781*59599516SKenneth E. Jansen (void*)Ifield[i][j], 782*59599516SKenneth E. Jansen &isize, 783*59599516SKenneth E. Jansen "integer", 784*59599516SKenneth E. Jansen "binary" ); 785*59599516SKenneth E. Jansen 786*59599516SKenneth E. Jansen if ( cscompare("block",headerTypeI[j]) ){ 787*59599516SKenneth E. Jansen // printf("rank %d - deleting Ifield %d %d\n",myrank,i,j); 788*59599516SKenneth E. Jansen delete [] Ifield[i][j]; 789*59599516SKenneth E. Jansen // printf("rank %d - Ifield deleted %d %d\n",myrank,i,j); 790*59599516SKenneth E. Jansen } 791*59599516SKenneth E. Jansen } 792*59599516SKenneth E. Jansen // printf("rank %d - deleting paraI %d %d\n",myrank,i,j); 793*59599516SKenneth E. Jansen delete [] paraI[i][j]; 794*59599516SKenneth E. Jansen // printf("rank %d - paraI deleted %d %d\n",myrank,i,j); 795*59599516SKenneth E. Jansen } 796*59599516SKenneth E. Jansen 797*59599516SKenneth E. Jansen } 798*59599516SKenneth E. Jansen 799*59599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 800*59599516SKenneth E. Jansen if(myrank==0){ 801*59599516SKenneth E. Jansen printf("Closing geombc-dat.##.## files\n"); 802*59599516SKenneth E. Jansen } 803*59599516SKenneth E. Jansen 804*59599516SKenneth E. Jansen closefile(&writeHandle, "write"); 805*59599516SKenneth E. Jansen finalizephmpiio(&writeHandle); 806*59599516SKenneth E. Jansen 807*59599516SKenneth E. Jansen if(myrank==0){ 808*59599516SKenneth E. Jansen printf("Free memory related to geombc-dat.##.## files\n"); 809*59599516SKenneth E. Jansen } 810*59599516SKenneth E. Jansen 811*59599516SKenneth E. Jansen for ( i = 0; i < nppp; i++ ) 812*59599516SKenneth E. Jansen { 813*59599516SKenneth E. Jansen delete [] Dfield[i]; 814*59599516SKenneth E. Jansen delete [] paraD[i]; 815*59599516SKenneth E. Jansen 816*59599516SKenneth E. Jansen delete [] Ifield[i]; 817*59599516SKenneth E. Jansen delete [] paraI[i]; 818*59599516SKenneth E. Jansen 819*59599516SKenneth E. Jansen } 820*59599516SKenneth E. Jansen 821*59599516SKenneth E. Jansen for ( i = 0; i < N_geombc_double; i++ ) 822*59599516SKenneth E. Jansen { 823*59599516SKenneth E. Jansen delete [] fieldNameD[i]; 824*59599516SKenneth E. Jansen delete [] fileTypeD[i]; 825*59599516SKenneth E. Jansen delete [] dataTypeD[i]; 826*59599516SKenneth E. Jansen delete [] headerTypeD[i]; 827*59599516SKenneth E. Jansen } 828*59599516SKenneth E. Jansen 829*59599516SKenneth E. Jansen for ( i = 0; i < N_geombc_integer; i++ ) 830*59599516SKenneth E. Jansen { 831*59599516SKenneth E. Jansen 832*59599516SKenneth E. Jansen delete [] fieldNameI[i]; 833*59599516SKenneth E. Jansen delete [] fileTypeI[i]; 834*59599516SKenneth E. Jansen delete [] dataTypeI[i]; 835*59599516SKenneth E. Jansen delete [] headerTypeI[i]; 836*59599516SKenneth E. Jansen } 837*59599516SKenneth E. Jansen 838*59599516SKenneth E. Jansen delete [] Dfield; 839*59599516SKenneth E. Jansen delete [] Ifield; 840*59599516SKenneth E. Jansen 841*59599516SKenneth E. Jansen delete [] paraD; 842*59599516SKenneth E. Jansen delete [] paraI; 843*59599516SKenneth E. Jansen 844*59599516SKenneth E. Jansen delete [] expectD; 845*59599516SKenneth E. Jansen delete [] expectI; 846*59599516SKenneth E. Jansen 847*59599516SKenneth E. Jansen delete [] fieldNameD; 848*59599516SKenneth E. Jansen delete [] fileTypeD; 849*59599516SKenneth E. Jansen delete [] dataTypeD; 850*59599516SKenneth E. Jansen delete [] headerTypeD; 851*59599516SKenneth E. Jansen 852*59599516SKenneth E. Jansen delete [] fieldNameI; 853*59599516SKenneth E. Jansen delete [] fileTypeI; 854*59599516SKenneth E. Jansen delete [] dataTypeI; 855*59599516SKenneth E. Jansen delete [] headerTypeI; 856*59599516SKenneth E. Jansen 857*59599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 858*59599516SKenneth E. Jansen if(myrank==0){ 859*59599516SKenneth E. Jansen printf("Done with geombc-dat.##.## files\n"); 860*59599516SKenneth E. Jansen } 861*59599516SKenneth E. Jansen 862*59599516SKenneth E. Jansen /////////////////////// restart data //////////////////////////// 863*59599516SKenneth E. Jansen 864*59599516SKenneth E. Jansen int irestart; 865*59599516SKenneth E. Jansen 866*59599516SKenneth E. Jansen Dfield = new double**[N_restart_double]; 867*59599516SKenneth E. Jansen Ifield = new int**[N_restart_integer]; 868*59599516SKenneth E. Jansen 869*59599516SKenneth E. Jansen paraD = new int**[N_restart_double]; 870*59599516SKenneth E. Jansen paraI = new int**[N_restart_integer]; 871*59599516SKenneth E. Jansen 872*59599516SKenneth E. Jansen expectD = new int[N_restart_double]; 873*59599516SKenneth E. Jansen expectI = new int[N_restart_integer]; 874*59599516SKenneth E. Jansen 875*59599516SKenneth E. Jansen fieldNameD = new char*[N_restart_double]; 876*59599516SKenneth E. Jansen fileTypeD = new char*[N_restart_double]; 877*59599516SKenneth E. Jansen dataTypeD = new char*[N_restart_double]; 878*59599516SKenneth E. Jansen headerTypeD = new char*[N_restart_double]; 879*59599516SKenneth E. Jansen 880*59599516SKenneth E. Jansen fieldNameI = new char*[N_restart_integer]; 881*59599516SKenneth E. Jansen fileTypeI = new char*[N_restart_integer]; 882*59599516SKenneth E. Jansen dataTypeI = new char*[N_restart_integer]; 883*59599516SKenneth E. Jansen headerTypeI = new char*[N_restart_integer]; 884*59599516SKenneth E. Jansen 885*59599516SKenneth E. Jansen if (N_restart_double>0) 886*59599516SKenneth E. Jansen for ( i = 0; i < N_restart_double; i++ ) 887*59599516SKenneth E. Jansen { 888*59599516SKenneth E. Jansen WriteLockD[i]=0; 889*59599516SKenneth E. Jansen Dfield[i] = new double*[nppp]; 890*59599516SKenneth E. Jansen 891*59599516SKenneth E. Jansen paraD[i] = new int*[nppp]; 892*59599516SKenneth E. Jansen 893*59599516SKenneth E. Jansen fieldNameD[i] = new char[128]; 894*59599516SKenneth E. Jansen fileTypeD[i] = new char[128]; 895*59599516SKenneth E. Jansen dataTypeD[i] = new char[128]; 896*59599516SKenneth E. Jansen headerTypeD[i] = new char[128]; 897*59599516SKenneth E. Jansen } 898*59599516SKenneth E. Jansen 899*59599516SKenneth E. Jansen if (N_restart_integer>0) 900*59599516SKenneth E. Jansen for ( i = 0; i < N_restart_integer; i++ ) 901*59599516SKenneth E. Jansen { 902*59599516SKenneth E. Jansen WriteLockI[i]=0; 903*59599516SKenneth E. Jansen Ifield[i] = new int*[nppp]; 904*59599516SKenneth E. Jansen 905*59599516SKenneth E. Jansen paraI[i] = new int*[nppp]; 906*59599516SKenneth E. Jansen 907*59599516SKenneth E. Jansen fieldNameI[i] = new char[128]; 908*59599516SKenneth E. Jansen fileTypeI[i] = new char[128]; 909*59599516SKenneth E. Jansen dataTypeI[i] = new char[128]; 910*59599516SKenneth E. Jansen headerTypeI[i] = new char[128]; 911*59599516SKenneth E. Jansen } 912*59599516SKenneth E. Jansen 913*59599516SKenneth E. Jansen //////////////////////////////////////////////////////////////// 914*59599516SKenneth E. Jansen // temporary fix: in the new version the double and integer 915*59599516SKenneth E. Jansen // can mix and match to avoid the order confusion 916*59599516SKenneth E. Jansen //////////////////////////////////////////////////////////////// 917*59599516SKenneth E. Jansen 918*59599516SKenneth E. Jansen double_counter=0,int_counter=0; 919*59599516SKenneth E. Jansen 920*59599516SKenneth E. Jansen for ( i = 0; i < N_restart_double+N_restart_integer; i++ ) 921*59599516SKenneth E. Jansen { 922*59599516SKenneth E. Jansen fgets( target, 1024, pFile ); 923*59599516SKenneth E. Jansen temp = strtok( target, ";" ); 924*59599516SKenneth E. Jansen token = strtok( temp, "," ); 925*59599516SKenneth E. Jansen strcpy( S1, token ); 926*59599516SKenneth E. Jansen token = strtok ( NULL, "," ); 927*59599516SKenneth E. Jansen strcpy( S2, token ); 928*59599516SKenneth E. Jansen token = strtok ( NULL, "," ); 929*59599516SKenneth E. Jansen strcpy( S3, token ); 930*59599516SKenneth E. Jansen token = strtok ( NULL, "," ); 931*59599516SKenneth E. Jansen strcpy( S4, token ); 932*59599516SKenneth E. Jansen token = strtok ( NULL, "," ); 933*59599516SKenneth E. Jansen strcpy( S5, token ); 934*59599516SKenneth E. Jansen 935*59599516SKenneth E. Jansen if (cscompare(S3,"double")) 936*59599516SKenneth E. Jansen { 937*59599516SKenneth E. Jansen strcpy( fileTypeD[double_counter], S1 ); 938*59599516SKenneth E. Jansen strcpy( fieldNameD[double_counter], S2 ); 939*59599516SKenneth E. Jansen strcpy( dataTypeD[double_counter], S3 ); 940*59599516SKenneth E. Jansen strcpy( headerTypeD[double_counter], S4 ); 941*59599516SKenneth E. Jansen strcpy( numTemp, S5 ); 942*59599516SKenneth E. Jansen expectD[double_counter] = atoi (numTemp); 943*59599516SKenneth E. Jansen double_counter++; 944*59599516SKenneth E. Jansen } 945*59599516SKenneth E. Jansen 946*59599516SKenneth E. Jansen if (cscompare(S3,"integer")) 947*59599516SKenneth E. Jansen { 948*59599516SKenneth E. Jansen strcpy( fileTypeI[int_counter], S1 ); 949*59599516SKenneth E. Jansen strcpy( fieldNameI[int_counter], S2 ); 950*59599516SKenneth E. Jansen strcpy( dataTypeI[int_counter], S3 ); 951*59599516SKenneth E. Jansen strcpy( headerTypeI[int_counter], S4 ); 952*59599516SKenneth E. Jansen strcpy( numTemp, S5 ); 953*59599516SKenneth E. Jansen expectI[int_counter] = atoi (numTemp); 954*59599516SKenneth E. Jansen int_counter++; 955*59599516SKenneth E. Jansen } 956*59599516SKenneth E. Jansen } 957*59599516SKenneth E. Jansen 958*59599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 959*59599516SKenneth E. Jansen if(myrank==0){ 960*59599516SKenneth E. Jansen printf("Starting to read some blocks (doubles) in the restart.dat.##.## files\n"); 961*59599516SKenneth E. Jansen } 962*59599516SKenneth E. Jansen 963*59599516SKenneth E. Jansen for ( i = 0; i < N_restart_double; i++ ) 964*59599516SKenneth E. Jansen { 965*59599516SKenneth E. Jansen for ( j = 0; j < nppp; j++ ) 966*59599516SKenneth E. Jansen { 967*59599516SKenneth E. Jansen 968*59599516SKenneth E. Jansen if(existsubdir) { 969*59599516SKenneth E. Jansen subdir = (startpart+j-1) / DIR_FANOUT; 970*59599516SKenneth E. Jansen sprintf(gfname,"./%d-procs_case/%d/restart.%d.%d",N_parts, subdir, N_steps,startpart+j); 971*59599516SKenneth E. Jansen } 972*59599516SKenneth E. Jansen else 973*59599516SKenneth E. Jansen sprintf(gfname,"./%d-procs_case/restart.%d.%d",N_parts, N_steps, startpart+j); 974*59599516SKenneth E. Jansen 975*59599516SKenneth E. Jansen openfile(gfname,"read",&irestart); 976*59599516SKenneth E. Jansen 977*59599516SKenneth E. Jansen for ( k = 0; k < 10; k++ ) 978*59599516SKenneth E. Jansen iarray[k]=0; 979*59599516SKenneth E. Jansen 980*59599516SKenneth E. Jansen paraD[i][j] = new int[expectD[i]]; 981*59599516SKenneth E. Jansen 982*59599516SKenneth E. Jansen iarray[0]=-1; 983*59599516SKenneth E. Jansen readheader( &irestart, 984*59599516SKenneth E. Jansen fieldNameD[i], 985*59599516SKenneth E. Jansen (void*)iarray, 986*59599516SKenneth E. Jansen &expectD[i], 987*59599516SKenneth E. Jansen "double", 988*59599516SKenneth E. Jansen "binary" ); 989*59599516SKenneth E. Jansen 990*59599516SKenneth E. Jansen for ( k = 0; k < expectD[i]; k++ ) 991*59599516SKenneth E. Jansen paraD[i][j][k] = iarray[k]; 992*59599516SKenneth E. Jansen 993*59599516SKenneth E. Jansen if ( iarray[0]==-1 ) 994*59599516SKenneth E. Jansen WriteLockD[i]=1; 995*59599516SKenneth E. Jansen if ( WriteLockD[i]==0 ) 996*59599516SKenneth E. Jansen { 997*59599516SKenneth E. Jansen if ( cscompare("block",headerTypeD[i]) ) 998*59599516SKenneth E. Jansen { 999*59599516SKenneth E. Jansen if ( expectD[i]==1) 1000*59599516SKenneth E. Jansen isize = paraD[i][j][0]; 1001*59599516SKenneth E. Jansen else 1002*59599516SKenneth E. Jansen isize = paraD[i][j][0] * paraD[i][j][1]; 1003*59599516SKenneth E. Jansen 1004*59599516SKenneth E. Jansen Dfield[i][j] = new double[isize]; 1005*59599516SKenneth E. Jansen readdatablock( &irestart, 1006*59599516SKenneth E. Jansen fieldNameD[i], 1007*59599516SKenneth E. Jansen (void*)Dfield[i][j], 1008*59599516SKenneth E. Jansen &isize, 1009*59599516SKenneth E. Jansen "double", 1010*59599516SKenneth E. Jansen "binary" ); 1011*59599516SKenneth E. Jansen 1012*59599516SKenneth E. Jansen } 1013*59599516SKenneth E. Jansen } 1014*59599516SKenneth E. Jansen closefile(&irestart, "read"); 1015*59599516SKenneth E. Jansen } 1016*59599516SKenneth E. Jansen } 1017*59599516SKenneth E. Jansen 1018*59599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 1019*59599516SKenneth E. Jansen if(myrank==0){ 1020*59599516SKenneth E. Jansen printf("Starting to read some blocks (integers) in the restart.dat.##.## files\n"); 1021*59599516SKenneth E. Jansen } 1022*59599516SKenneth E. Jansen 1023*59599516SKenneth E. Jansen 1024*59599516SKenneth E. Jansen for ( i = 0; i < N_restart_integer; i++ ) 1025*59599516SKenneth E. Jansen { 1026*59599516SKenneth E. Jansen for ( j = 0; j < nppp; j++ ) 1027*59599516SKenneth E. Jansen { 1028*59599516SKenneth E. Jansen 1029*59599516SKenneth E. Jansen if(existsubdir) { 1030*59599516SKenneth E. Jansen subdir = (startpart+j-1) / DIR_FANOUT; 1031*59599516SKenneth E. Jansen sprintf(gfname,"./%d-procs_case/%d/restart.%d.%d",N_parts, subdir, N_steps, startpart+j); 1032*59599516SKenneth E. Jansen } 1033*59599516SKenneth E. Jansen else 1034*59599516SKenneth E. Jansen sprintf(gfname,"./%d-procs_case/restart.%d.%d",N_parts, N_steps, startpart+j); 1035*59599516SKenneth E. Jansen 1036*59599516SKenneth E. Jansen openfile(gfname,"read",&irestart); 1037*59599516SKenneth E. Jansen 1038*59599516SKenneth E. Jansen for ( k = 0; k < 10; k++ ) 1039*59599516SKenneth E. Jansen iarray[k]=0; 1040*59599516SKenneth E. Jansen 1041*59599516SKenneth E. Jansen paraI[i][j] = new int[expectI[i]]; 1042*59599516SKenneth E. Jansen 1043*59599516SKenneth E. Jansen iarray[0]=-1; 1044*59599516SKenneth E. Jansen readheader( &irestart, 1045*59599516SKenneth E. Jansen fieldNameI[i], 1046*59599516SKenneth E. Jansen (void*)iarray, 1047*59599516SKenneth E. Jansen &expectI[i], 1048*59599516SKenneth E. Jansen "integer", 1049*59599516SKenneth E. Jansen "binary" ); 1050*59599516SKenneth E. Jansen 1051*59599516SKenneth E. Jansen for ( k = 0; k < expectI[i]; k++ ) 1052*59599516SKenneth E. Jansen paraI[i][j][k] = iarray[k]; 1053*59599516SKenneth E. Jansen 1054*59599516SKenneth E. Jansen if ( iarray[0]==-1 ) 1055*59599516SKenneth E. Jansen WriteLockI[i]=1; 1056*59599516SKenneth E. Jansen if ( WriteLockI[i]==0 ) 1057*59599516SKenneth E. Jansen { 1058*59599516SKenneth E. Jansen 1059*59599516SKenneth E. Jansen if ( cscompare("block",headerTypeI[i]) ) 1060*59599516SKenneth E. Jansen { 1061*59599516SKenneth E. Jansen if ( expectI[i]==1) 1062*59599516SKenneth E. Jansen isize = paraI[i][j][0]; 1063*59599516SKenneth E. Jansen else 1064*59599516SKenneth E. Jansen isize = paraI[i][j][0] * paraI[i][j][1]; 1065*59599516SKenneth E. Jansen 1066*59599516SKenneth E. Jansen Ifield[i][j] = new int[isize]; 1067*59599516SKenneth E. Jansen readdatablock( &irestart, 1068*59599516SKenneth E. Jansen fieldNameI[i], 1069*59599516SKenneth E. Jansen (void*)Ifield[i][j], 1070*59599516SKenneth E. Jansen &isize, 1071*59599516SKenneth E. Jansen "integer", 1072*59599516SKenneth E. Jansen "binary" ); 1073*59599516SKenneth E. Jansen } 1074*59599516SKenneth E. Jansen } 1075*59599516SKenneth E. Jansen closefile(&irestart, "read"); 1076*59599516SKenneth E. Jansen } 1077*59599516SKenneth E. Jansen } 1078*59599516SKenneth E. Jansen 1079*59599516SKenneth E. Jansen fclose(pFile); 1080*59599516SKenneth E. Jansen 1081*59599516SKenneth E. Jansen ///////////////////// Writing /////////////////////////////// 1082*59599516SKenneth E. Jansen 1083*59599516SKenneth E. Jansen int N_restart = N_restart_double + N_restart_integer; 1084*59599516SKenneth E. Jansen 1085*59599516SKenneth E. Jansen bzero((void*)fname,255); 1086*59599516SKenneth E. Jansen //MR CHANGE 1087*59599516SKenneth E. Jansen // sprintf(fname,"./%d-procs_case/restart-dat.%d.%d",N_parts,N_steps,((int)(myrank/(N_procs/N_files))+1)); 1088*59599516SKenneth E. Jansen sprintf(fname,"./%d-procs_case-SyncIO-%d/restart-dat.%d.%d",N_parts,N_files,N_steps,((int)(myrank/(N_procs/N_files))+1)); 1089*59599516SKenneth E. Jansen //MR CHANGE END 1090*59599516SKenneth E. Jansen initphmpiio(&N_restart, &nppf, &N_files,&writeHandle, "write"); 1091*59599516SKenneth E. Jansen // initphmpiio(&N_restart, &nppf, &N_files,&writeHandle); 1092*59599516SKenneth E. Jansen openfile(fname, "write", &writeHandle); 1093*59599516SKenneth E. Jansen 1094*59599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 1095*59599516SKenneth E. Jansen if(myrank==0){ 1096*59599516SKenneth E. Jansen printf("Starting to write some blocks (doubles) in the restart-dat.##.## files\n"); 1097*59599516SKenneth E. Jansen } 1098*59599516SKenneth E. Jansen 1099*59599516SKenneth E. Jansen for ( i = 0; i < N_restart_double; i++ ) 1100*59599516SKenneth E. Jansen { 1101*59599516SKenneth E. Jansen for ( j = 0; j < nppp; j++ ) 1102*59599516SKenneth E. Jansen { 1103*59599516SKenneth E. Jansen 1104*59599516SKenneth E. Jansen if (WriteLockD[i]==0) 1105*59599516SKenneth E. Jansen { 1106*59599516SKenneth E. Jansen GPID = startpart + j; 1107*59599516SKenneth E. Jansen bzero((void*)fieldtag,255); 1108*59599516SKenneth E. Jansen sprintf(fieldtag,"%s@%d",fieldNameD[i],GPID); 1109*59599516SKenneth E. Jansen 1110*59599516SKenneth E. Jansen if ( expectD[i]==1) 1111*59599516SKenneth E. Jansen isize = paraD[i][j][0]; 1112*59599516SKenneth E. Jansen else 1113*59599516SKenneth E. Jansen isize = paraD[i][j][0] * paraD[i][j][1]; 1114*59599516SKenneth E. Jansen 1115*59599516SKenneth E. Jansen for ( k = 0; k < expectD[i]; k++ ) 1116*59599516SKenneth E. Jansen iarray[k] = paraD[i][j][k]; 1117*59599516SKenneth E. Jansen 1118*59599516SKenneth E. Jansen if ( cscompare("header",headerTypeD[i]) ) 1119*59599516SKenneth E. Jansen isize = 0; 1120*59599516SKenneth E. Jansen 1121*59599516SKenneth E. Jansen writeheader( &writeHandle, 1122*59599516SKenneth E. Jansen fieldtag, 1123*59599516SKenneth E. Jansen (void*)iarray, 1124*59599516SKenneth E. Jansen &expectD[i], 1125*59599516SKenneth E. Jansen &isize, 1126*59599516SKenneth E. Jansen "double", 1127*59599516SKenneth E. Jansen "binary"); 1128*59599516SKenneth E. Jansen 1129*59599516SKenneth E. Jansen writedatablock( &writeHandle, 1130*59599516SKenneth E. Jansen fieldtag, 1131*59599516SKenneth E. Jansen (void*)Dfield[i][j], 1132*59599516SKenneth E. Jansen &isize, 1133*59599516SKenneth E. Jansen "double", 1134*59599516SKenneth E. Jansen "binary" ); 1135*59599516SKenneth E. Jansen if ( cscompare("block",headerTypeD[i]) ) 1136*59599516SKenneth E. Jansen delete [] Dfield[i][j]; 1137*59599516SKenneth E. Jansen } 1138*59599516SKenneth E. Jansen delete [] paraD[i][j]; 1139*59599516SKenneth E. Jansen } 1140*59599516SKenneth E. Jansen } 1141*59599516SKenneth E. Jansen 1142*59599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 1143*59599516SKenneth E. Jansen if(myrank==0){ 1144*59599516SKenneth E. Jansen printf("Starting to write some blocks (integers) in the restart.dat.##.## files\n"); 1145*59599516SKenneth E. Jansen } 1146*59599516SKenneth E. Jansen 1147*59599516SKenneth E. Jansen for ( i = 0; i < N_restart_integer; i++ ) 1148*59599516SKenneth E. Jansen { 1149*59599516SKenneth E. Jansen for ( j = 0; j < nppp; j++ ) 1150*59599516SKenneth E. Jansen { 1151*59599516SKenneth E. Jansen 1152*59599516SKenneth E. Jansen if (WriteLockI[i]==0) 1153*59599516SKenneth E. Jansen { 1154*59599516SKenneth E. Jansen GPID = startpart + j; 1155*59599516SKenneth E. Jansen bzero((void*)fieldtag,255); 1156*59599516SKenneth E. Jansen sprintf(fieldtag,"%s@%d",fieldNameI[i],GPID); 1157*59599516SKenneth E. Jansen 1158*59599516SKenneth E. Jansen if ( expectI[i]==1) 1159*59599516SKenneth E. Jansen isize = paraI[i][j][0]; 1160*59599516SKenneth E. Jansen else 1161*59599516SKenneth E. Jansen isize = paraI[i][j][0] * paraI[i][j][1]; 1162*59599516SKenneth E. Jansen 1163*59599516SKenneth E. Jansen for ( k = 0; k < expectI[i]; k++ ) 1164*59599516SKenneth E. Jansen iarray[k] = paraI[i][j][k]; 1165*59599516SKenneth E. Jansen 1166*59599516SKenneth E. Jansen if ( cscompare("header",headerTypeI[i]) ) 1167*59599516SKenneth E. Jansen isize = 0; 1168*59599516SKenneth E. Jansen 1169*59599516SKenneth E. Jansen writeheader( &writeHandle, 1170*59599516SKenneth E. Jansen fieldtag, 1171*59599516SKenneth E. Jansen (void*)iarray, 1172*59599516SKenneth E. Jansen &expectI[i], 1173*59599516SKenneth E. Jansen &isize, 1174*59599516SKenneth E. Jansen "integer", 1175*59599516SKenneth E. Jansen "binary"); 1176*59599516SKenneth E. Jansen 1177*59599516SKenneth E. Jansen writedatablock( &writeHandle, 1178*59599516SKenneth E. Jansen fieldtag, 1179*59599516SKenneth E. Jansen (void*)Ifield[i][j], 1180*59599516SKenneth E. Jansen &isize, 1181*59599516SKenneth E. Jansen "integer", 1182*59599516SKenneth E. Jansen "binary" ); 1183*59599516SKenneth E. Jansen 1184*59599516SKenneth E. Jansen if ( cscompare("block",headerTypeI[i]) ) 1185*59599516SKenneth E. Jansen delete [] Ifield[i][j]; 1186*59599516SKenneth E. Jansen } 1187*59599516SKenneth E. Jansen delete [] paraI[i][j]; 1188*59599516SKenneth E. Jansen } 1189*59599516SKenneth E. Jansen 1190*59599516SKenneth E. Jansen } 1191*59599516SKenneth E. Jansen 1192*59599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 1193*59599516SKenneth E. Jansen if(myrank==0){ 1194*59599516SKenneth E. Jansen printf("Closing restart-dat.##.## files\n"); 1195*59599516SKenneth E. Jansen } 1196*59599516SKenneth E. Jansen 1197*59599516SKenneth E. Jansen closefile(&writeHandle, "write"); 1198*59599516SKenneth E. Jansen finalizephmpiio(&writeHandle); 1199*59599516SKenneth E. Jansen 1200*59599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 1201*59599516SKenneth E. Jansen if(myrank==0){ 1202*59599516SKenneth E. Jansen printf("Free memory related to restart-dat.##.## files\n"); 1203*59599516SKenneth E. Jansen } 1204*59599516SKenneth E. Jansen 1205*59599516SKenneth E. Jansen 1206*59599516SKenneth E. Jansen for ( i = 0; i < N_restart_double; i++ ) 1207*59599516SKenneth E. Jansen { 1208*59599516SKenneth E. Jansen delete [] Dfield[i]; 1209*59599516SKenneth E. Jansen delete [] paraD[i]; 1210*59599516SKenneth E. Jansen 1211*59599516SKenneth E. Jansen delete [] fieldNameD[i]; 1212*59599516SKenneth E. Jansen delete [] fileTypeD[i]; 1213*59599516SKenneth E. Jansen delete [] dataTypeD[i]; 1214*59599516SKenneth E. Jansen delete [] headerTypeD[i]; 1215*59599516SKenneth E. Jansen } 1216*59599516SKenneth E. Jansen 1217*59599516SKenneth E. Jansen for ( i = 0; i < N_restart_integer; i++ ) 1218*59599516SKenneth E. Jansen { 1219*59599516SKenneth E. Jansen delete [] Ifield[i]; 1220*59599516SKenneth E. Jansen delete [] paraI[i]; 1221*59599516SKenneth E. Jansen 1222*59599516SKenneth E. Jansen delete [] fieldNameI[i]; 1223*59599516SKenneth E. Jansen delete [] fileTypeI[i]; 1224*59599516SKenneth E. Jansen delete [] dataTypeI[i]; 1225*59599516SKenneth E. Jansen delete [] headerTypeI[i]; 1226*59599516SKenneth E. Jansen } 1227*59599516SKenneth E. Jansen 1228*59599516SKenneth E. Jansen delete [] Dfield; 1229*59599516SKenneth E. Jansen delete [] Ifield; 1230*59599516SKenneth E. Jansen 1231*59599516SKenneth E. Jansen delete [] paraD; 1232*59599516SKenneth E. Jansen delete [] paraI; 1233*59599516SKenneth E. Jansen 1234*59599516SKenneth E. Jansen delete [] expectD; 1235*59599516SKenneth E. Jansen delete [] expectI; 1236*59599516SKenneth E. Jansen 1237*59599516SKenneth E. Jansen delete [] fieldNameD; 1238*59599516SKenneth E. Jansen delete [] fileTypeD; 1239*59599516SKenneth E. Jansen delete [] dataTypeD; 1240*59599516SKenneth E. Jansen delete [] headerTypeD; 1241*59599516SKenneth E. Jansen 1242*59599516SKenneth E. Jansen delete [] fieldNameI; 1243*59599516SKenneth E. Jansen delete [] fileTypeI; 1244*59599516SKenneth E. Jansen delete [] dataTypeI; 1245*59599516SKenneth E. Jansen delete [] headerTypeI; 1246*59599516SKenneth E. Jansen 1247*59599516SKenneth E. Jansen 1248*59599516SKenneth E. Jansen if (myrank==0) 1249*59599516SKenneth E. Jansen { 1250*59599516SKenneth E. Jansen printf("\nFinished transfer, please check data using:\n"); 1251*59599516SKenneth E. Jansen printf(" grep -a ': <' filename \n\n"); 1252*59599516SKenneth E. Jansen printf("Note that the size of the fields is computed based on previous geombc files\n"); 1253*59599516SKenneth E. Jansen printf("Check the routine 'computenitems' if you have any reason to think it has changes for the fields you are interested in\n\n"); 1254*59599516SKenneth E. Jansen } 1255*59599516SKenneth E. Jansen 1256*59599516SKenneth E. Jansen MPI_Finalize(); 1257*59599516SKenneth E. Jansen 1258*59599516SKenneth E. Jansen } 1259*59599516SKenneth E. Jansen 1260*59599516SKenneth E. Jansen 1261