xref: /phasta/converterIO/converterO2N.cc (revision 8746ab438bbda91291f8cdd62b94f8385f2d26f1)
159599516SKenneth E. Jansen #include <stdio.h>
259599516SKenneth E. Jansen #include <iostream>
359599516SKenneth E. Jansen #include <string.h>
459599516SKenneth E. Jansen #include <stdlib.h>
559599516SKenneth E. Jansen //#define OMPI_SKIP_MPICXX 1 //Added in the CMakeList.txt file
659599516SKenneth E. Jansen #include <mpi.h>
759599516SKenneth E. Jansen #include <math.h>
859599516SKenneth E. Jansen #include "phastaIO.h"
959599516SKenneth E. Jansen #include <sys/stat.h>
1059599516SKenneth E. Jansen #include <sys/types.h>
1159599516SKenneth E. Jansen 
1259599516SKenneth E. Jansen enum {
1359599516SKenneth E. Jansen   DIR_FANOUT = 2048
1459599516SKenneth E. Jansen };
1559599516SKenneth E. Jansen 
1659599516SKenneth E. Jansen inline int
cscompare(const char teststring[],const char targetstring[])1759599516SKenneth E. Jansen cscompare( const char teststring[],
1859599516SKenneth E. Jansen 	   const char targetstring[] )
1959599516SKenneth E. Jansen {
2059599516SKenneth E. Jansen   char* s1 = const_cast<char*>(teststring);
2159599516SKenneth E. Jansen   char* s2 = const_cast<char*>(targetstring);
2259599516SKenneth E. Jansen 
2359599516SKenneth E. Jansen   while( *s1 == ' ') s1++;
2459599516SKenneth E. Jansen   while( *s2 == ' ') s2++;
2559599516SKenneth E. Jansen   while( ( *s1 )
2659599516SKenneth E. Jansen 	 && ( *s2 )
2759599516SKenneth E. Jansen 	 && ( *s2 != '?')
2859599516SKenneth E. Jansen 	 && ( tolower( *s1 )==tolower( *s2 ) ) ) {
2959599516SKenneth E. Jansen     s1++;
3059599516SKenneth E. Jansen     s2++;
3159599516SKenneth E. Jansen     while( *s1 == ' ') s1++;
3259599516SKenneth E. Jansen     while( *s2 == ' ') s2++;
3359599516SKenneth E. Jansen   }
3459599516SKenneth E. Jansen   if ( !( *s1 ) || ( *s1 == '?') ) return 1;
3559599516SKenneth E. Jansen   else return 0;
3659599516SKenneth E. Jansen }
3759599516SKenneth E. Jansen 
3859599516SKenneth E. Jansen inline int
computenitems(const int localpartid,const int fieldid,const int myrank,const char * fieldName,int *** para,const int intHeader,const int numVariables)3959599516SKenneth E. Jansen computenitems(const int localpartid, const int fieldid, const int myrank, const char *fieldName, int ***para, const int intHeader, const int numVariables) {
4059599516SKenneth E. Jansen // This routine computes the number of items in the data block based on
4159599516SKenneth E. Jansen // - the name of the fields
4259599516SKenneth E. Jansen // - the integers read from the header
4359599516SKenneth E. Jansen 
4459599516SKenneth E. Jansen   int nItems = -1;
4559599516SKenneth E. Jansen 
4659599516SKenneth E. Jansen   if (cscompare("nbc values",fieldName))
4759599516SKenneth E. Jansen     nItems = para[localpartid][fieldid][0] * (numVariables+1);
4859599516SKenneth E. Jansen   else if  (cscompare("nbc codes",fieldName))
4959599516SKenneth E. Jansen     nItems = para[localpartid][fieldid][0] * 2;
5059599516SKenneth E. Jansen   else if ( intHeader==1)
5159599516SKenneth E. Jansen     nItems = para[localpartid][fieldid][0];
5259599516SKenneth E. Jansen   else
5359599516SKenneth E. Jansen     nItems = para[localpartid][fieldid][0] * para[localpartid][fieldid][1];
5459599516SKenneth E. Jansen   return nItems;
5559599516SKenneth E. Jansen }
5659599516SKenneth E. Jansen 
5759599516SKenneth E. Jansen 
main(int argc,char * argv[])5859599516SKenneth E. Jansen int main(int argc, char *argv[]) {
5959599516SKenneth E. Jansen 
6059599516SKenneth E. Jansen   MPI_Init(&argc,&argv);
6159599516SKenneth E. Jansen 
6259599516SKenneth E. Jansen   int myrank, N_procs;
6359599516SKenneth E. Jansen   MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
6459599516SKenneth E. Jansen   MPI_Comm_size(MPI_COMM_WORLD, &N_procs);
6559599516SKenneth E. Jansen 
6659599516SKenneth E. Jansen   FILE * pFile,* AccessoryFileHandle;
6759599516SKenneth E. Jansen   char target[1024], pool[256], tempString[128],numpe[8],numstart[8];
6859599516SKenneth E. Jansen   char * temp, * token;
6959599516SKenneth E. Jansen   int fieldCompareMark;
7059599516SKenneth E. Jansen   bool readField;
7159599516SKenneth E. Jansen   int i, j, k, N_geombc_double, N_geombc_integer, N_restart_double;
7259599516SKenneth E. Jansen   int N_restart_integer, N_steps, N_parts, N_files;
7359599516SKenneth E. Jansen 
7459599516SKenneth E. Jansen   pFile = fopen("./IO.O2N.input","r");
7559599516SKenneth E. Jansen   if (pFile == NULL)
7659599516SKenneth E. Jansen     printf("Error openning\n");
7759599516SKenneth E. Jansen 
7859599516SKenneth E. Jansen   fgets( target, 1024, pFile );
7959599516SKenneth E. Jansen   token = strtok ( target, ";" );strcpy(pool,token);
8059599516SKenneth E. Jansen   temp = strtok ( pool, ":" );temp = strtok ( NULL, ":" );
8159599516SKenneth E. Jansen   N_geombc_double = atoi(temp);
8259599516SKenneth E. Jansen 
8359599516SKenneth E. Jansen   fgets( target, 1024, pFile );
8459599516SKenneth E. Jansen   token = strtok ( target, ";" );strcpy(pool,token);
8559599516SKenneth E. Jansen   temp = strtok ( pool, ":" );temp = strtok ( NULL, ":" );
8659599516SKenneth E. Jansen   N_geombc_integer = atoi(temp);
8759599516SKenneth E. Jansen 
8859599516SKenneth E. Jansen   fgets( target, 1024, pFile );
8959599516SKenneth E. Jansen   token = strtok ( target, ";" );strcpy(pool,token);
9059599516SKenneth E. Jansen   temp = strtok ( pool, ":" );temp = strtok ( NULL, ":" );
9159599516SKenneth E. Jansen   N_restart_double = atoi(temp);
9259599516SKenneth E. Jansen 
9359599516SKenneth E. Jansen   fgets( target, 1024, pFile );
9459599516SKenneth E. Jansen   token = strtok ( target, ";" );strcpy(pool,token);
9559599516SKenneth E. Jansen   temp = strtok ( pool, ":" );temp = strtok ( NULL, ":" );
9659599516SKenneth E. Jansen   N_restart_integer = atoi(temp);
9759599516SKenneth E. Jansen 
9859599516SKenneth E. Jansen   fgets( target, 1024, pFile );
9959599516SKenneth E. Jansen   token = strtok ( target, ";" );strcpy(pool,token);
10059599516SKenneth E. Jansen   temp = strtok ( pool, ":" );temp = strtok ( NULL, ":" );
10159599516SKenneth E. Jansen   strncpy(numstart,temp,1);
10259599516SKenneth E. Jansen   N_steps = atoi(temp);
10359599516SKenneth E. Jansen 
10459599516SKenneth E. Jansen   fgets( target, 1024, pFile );
10559599516SKenneth E. Jansen   token = strtok ( target, ";" );strcpy(pool,token);
10659599516SKenneth E. Jansen   temp = strtok ( pool, ":" );temp = strtok ( NULL, ":" );
10759599516SKenneth E. Jansen   strncpy(numpe,temp,1);
10859599516SKenneth E. Jansen   N_parts = atoi(temp);
10959599516SKenneth E. Jansen 
11059599516SKenneth E. Jansen   if(myrank==0){
11159599516SKenneth E. Jansen     printf("numpe is %d and start is %d\n",N_parts,N_steps);
11259599516SKenneth E. Jansen   }
11359599516SKenneth E. Jansen 
11459599516SKenneth E. Jansen   fgets( target, 1024, pFile );
11559599516SKenneth E. Jansen   token = strtok ( target, ";" );strcpy(pool,token);
11659599516SKenneth E. Jansen   temp = strtok ( pool, ":" );temp = strtok ( NULL, ":" );
11759599516SKenneth E. Jansen   N_files = atoi(temp);
11859599516SKenneth E. Jansen 
11959599516SKenneth E. Jansen   double ***Dfield; int ***Ifield;
12059599516SKenneth E. Jansen   int ***paraD, ***paraI, *expectD, *expectI;
12159599516SKenneth E. Jansen   char **fieldNameD, **fileTypeD, **dataTypeD, **headerTypeD;
12259599516SKenneth E. Jansen   char **fieldNameI, **fileTypeI, **dataTypeI, **headerTypeI;
12359599516SKenneth E. Jansen 
124*13c09bf6SCameron Smith   int* WriteLockD = new int[N_geombc_double];
125*13c09bf6SCameron Smith   int* WriteLockI = new int[N_geombc_integer];
12659599516SKenneth E. Jansen 
12759599516SKenneth E. Jansen   int nppp = N_parts/N_procs;
12859599516SKenneth E. Jansen   int startpart = myrank * nppp +1;
12959599516SKenneth E. Jansen   int endpart = startpart + nppp - 1;
13059599516SKenneth E. Jansen   char gfname[64], numTemp[128];
13159599516SKenneth E. Jansen   int iarray[10], igeom, isize,TempFileHandle;
13259599516SKenneth E. Jansen 
13359599516SKenneth E. Jansen   ////////////////////////////////////////
13459599516SKenneth E. Jansen   // Test if the user has given the right  parameters related to the number of parts, procs and SyncIO files
13559599516SKenneth E. Jansen   ////////////////////////////////////////
13659599516SKenneth E. Jansen 
13759599516SKenneth E. Jansen   if (N_parts%N_files!=0)
13859599516SKenneth E. Jansen     {
13959599516SKenneth E. Jansen       printf("Input error: number of parts should be a multiple of number of files!\n");
14059599516SKenneth E. Jansen       printf("Please modify the IO.O2N.input file!\n");
14159599516SKenneth E. Jansen       return 0;
14259599516SKenneth E. Jansen     }
14359599516SKenneth E. Jansen   if (N_procs%N_files!=0)
14459599516SKenneth E. Jansen     {
14559599516SKenneth E. Jansen       printf("Input error: number of procs should be a multiple of number of files!\n");
14659599516SKenneth E. Jansen       printf("Please modify the IO.O2N.input file!\n");
14759599516SKenneth E. Jansen       return 0;
14859599516SKenneth E. Jansen     }
14959599516SKenneth E. Jansen   if (N_parts%N_procs!=0)
15059599516SKenneth E. Jansen     {
15159599516SKenneth E. Jansen       printf("Input error: number of parts should be a multiple of number of procs!\n");
15259599516SKenneth E. Jansen       printf("Please modify the IO.O2N.input file!\n");
15359599516SKenneth E. Jansen       return 0;
15459599516SKenneth E. Jansen     }
15559599516SKenneth E. Jansen 
15659599516SKenneth E. Jansen   /////////////////////////////////////
15759599516SKenneth E. Jansen   // Create numpe.in and numstart.dat
15859599516SKenneth E. Jansen   ////////////////////////////////////////
15959599516SKenneth E. Jansen 
16059599516SKenneth E. Jansen   if (myrank==0)
16159599516SKenneth E. Jansen     {
16259599516SKenneth E. Jansen 
16359599516SKenneth E. Jansen //MR CHANGE
16459599516SKenneth E. Jansen       bzero((void*)gfname,64);
16559599516SKenneth E. Jansen       sprintf(gfname,"./%d-procs_case-SyncIO-%d",N_parts,N_files);
16659599516SKenneth E. Jansen       if(0<mkdir(gfname,0777)) { printf("ERROR - Could not create procs_case-SyncIO directory\n"); return 1; }
16759599516SKenneth E. Jansen //MR CHANGE END
16859599516SKenneth E. Jansen 
16959599516SKenneth E. Jansen       bzero((void*)gfname,64);
17059599516SKenneth E. Jansen       sprintf(gfname,"./%d-procs_case-SyncIO-%d/numstart.dat",N_parts,N_files);
17159599516SKenneth E. Jansen       AccessoryFileHandle=fopen(gfname,"w");
17259599516SKenneth E. Jansen       fprintf(AccessoryFileHandle,"%d",N_steps);
17359599516SKenneth E. Jansen       fclose(AccessoryFileHandle);
17459599516SKenneth E. Jansen 
17559599516SKenneth E. Jansen       bzero((void*)gfname,64);
17659599516SKenneth E. Jansen       sprintf(gfname,"./%d-procs_case-SyncIO-%d/numpe.in",N_parts,N_files);
17759599516SKenneth E. Jansen       AccessoryFileHandle=fopen(gfname,"w");
17859599516SKenneth E. Jansen       fprintf(AccessoryFileHandle,"%d",N_parts);
17959599516SKenneth E. Jansen       fclose(AccessoryFileHandle);
18059599516SKenneth E. Jansen     }
18159599516SKenneth E. Jansen 
18259599516SKenneth E. Jansen   ///////////////////////////////////////
18359599516SKenneth E. Jansen   Dfield = new double**[nppp];
18459599516SKenneth E. Jansen   Ifield = new int**[nppp];
18559599516SKenneth E. Jansen 
18659599516SKenneth E. Jansen   paraD = new int**[nppp];
18759599516SKenneth E. Jansen   paraI = new int**[nppp];
18859599516SKenneth E. Jansen   /////////////////////////////////////
18959599516SKenneth E. Jansen 
190*13c09bf6SCameron Smith   int* interiorMark = new int[nppp];
191*13c09bf6SCameron Smith   int* boundaryMark = new int[nppp];
192*13c09bf6SCameron Smith   int* codesMark = new int[nppp];
193*13c09bf6SCameron Smith   int* valuesMark = new int[nppp];
194*13c09bf6SCameron Smith   int* numVariables = new int[nppp];
19559599516SKenneth E. Jansen //  int numBoundaryFields[nppp], numInteriorFields[nppp];
19659599516SKenneth E. Jansen 
19759599516SKenneth E. Jansen   if(myrank==0){
19859599516SKenneth E. Jansen     printf("Starting to read some headers in the restart.##.## and geombc.dat.## files\n");
19959599516SKenneth E. Jansen   }
20059599516SKenneth E. Jansen 
20159599516SKenneth E. Jansen   // The number of variables does not vary from one part to another. Do not read this info from every part.
20259599516SKenneth 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.
20359599516SKenneth 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.
20459599516SKenneth E. Jansen     int ithree = 3;
20559599516SKenneth E. Jansen     j = 0;
20659599516SKenneth E. Jansen 
20759599516SKenneth E. Jansen     // Test if file exist in the procs_case directory
20859599516SKenneth E. Jansen     bzero((void*)gfname,64);
20959599516SKenneth E. Jansen     sprintf(gfname,"./%d-procs_case/restart.%d.%d", N_parts, N_steps, startpart+j);
21059599516SKenneth E. Jansen     int subdir = -1;
21159599516SKenneth E. Jansen     bool existsubdir = false;
21259599516SKenneth E. Jansen     FILE *pfiletest;
21359599516SKenneth E. Jansen     pfiletest = fopen(gfname, "r");
21459599516SKenneth E. Jansen     if (pfiletest == NULL ) {
21559599516SKenneth E. Jansen       // Test if file exist in the procs_case/subdir directory
21659599516SKenneth E. Jansen       subdir = (startpart+j-1) / DIR_FANOUT;
21759599516SKenneth E. Jansen       bzero((void*)gfname,64);
21859599516SKenneth E. Jansen       sprintf(gfname,"./%d-procs_case/%d/restart.%d.%d",N_parts, subdir, N_steps, startpart+j);
21959599516SKenneth E. Jansen       pfiletest = fopen(gfname, "r");
22059599516SKenneth E. Jansen       if (pfiletest == NULL ) {
22159599516SKenneth E. Jansen         printf("[%d] File %s does not exit - abort\n",myrank, gfname);
22259599516SKenneth E. Jansen         abort();
22359599516SKenneth E. Jansen       }
22459599516SKenneth E. Jansen       else{
22559599516SKenneth E. Jansen         existsubdir = true;
22659599516SKenneth E. Jansen         fclose(pfiletest);
22759599516SKenneth E. Jansen       }
22859599516SKenneth E. Jansen     }
22959599516SKenneth E. Jansen     else {
23059599516SKenneth E. Jansen       fclose(pfiletest);
23159599516SKenneth E. Jansen     }
23259599516SKenneth E. Jansen 
23359599516SKenneth E. Jansen     // Debug
23459599516SKenneth E. Jansen     //printf("Rank: %d - subdir: %d - path: %s\n",myrank, subdir, gfname);
23559599516SKenneth E. Jansen 
23659599516SKenneth E. Jansen     openfile(gfname,"read",&TempFileHandle);
23759599516SKenneth E. Jansen     readheader( &TempFileHandle,
23859599516SKenneth E. Jansen 		   "solution",
23959599516SKenneth E. Jansen 		   (void*)iarray,
24059599516SKenneth E. Jansen 		   &ithree,
24159599516SKenneth E. Jansen 		   "double",
24259599516SKenneth E. Jansen 		   "binary" );
24359599516SKenneth E. Jansen     closefile(&TempFileHandle, "read");
24459599516SKenneth E. Jansen     for ( j = 0; j < nppp; j++ )
24559599516SKenneth E. Jansen       numVariables[j] = iarray[1]; //iarray[i] contains the number of variables from the header of the solution field
24659599516SKenneth E. Jansen 
24759599516SKenneth E. Jansen     MPI_Barrier(MPI_COMM_WORLD); //added by MR
24859599516SKenneth E. Jansen 
24959599516SKenneth E. Jansen 
25059599516SKenneth E. Jansen   /////////////////////////
25159599516SKenneth E. Jansen   for ( i = 0; i < nppp; i++ )
25259599516SKenneth E. Jansen     {
25359599516SKenneth E. Jansen       Dfield[i] = new double*[N_geombc_double]; // Space for the datablock of double format
25459599516SKenneth E. Jansen       paraD[i] = new int*[N_geombc_double];     // Integers in the header of each field of double format
25559599516SKenneth E. Jansen       Ifield[i] = new int*[N_geombc_integer];   // Space for the datablock of integer format
25659599516SKenneth E. Jansen       paraI[i] = new int*[N_geombc_integer];    // Integers in the header of each field of integer format
25759599516SKenneth E. Jansen 
25859599516SKenneth E. Jansen     }
25959599516SKenneth E. Jansen 
26059599516SKenneth E. Jansen   expectD = new int[N_geombc_double];          // Expected number of integers in the header for each field of double format
26159599516SKenneth E. Jansen   expectI = new int[N_geombc_integer];         // Expected number of integers in the header for each field of integer format
26259599516SKenneth E. Jansen 
26359599516SKenneth E. Jansen   fieldNameD = new char*[N_geombc_double];     // Name of the field in double format
26459599516SKenneth E. Jansen   fileTypeD = new char*[N_geombc_double];      // geombc or restart (useless if associated with geombc file but read)
26559599516SKenneth E. Jansen   dataTypeD = new char*[N_geombc_double];      // Integer or double (useless if associated with double data but read)
26659599516SKenneth E. Jansen   headerTypeD = new char*[N_geombc_double];    // block (means with data block) or header (just a header with no block)
26759599516SKenneth E. Jansen 
26859599516SKenneth E. Jansen   fieldNameI = new char*[N_geombc_integer];
26959599516SKenneth E. Jansen   fileTypeI = new char*[N_geombc_integer];
27059599516SKenneth E. Jansen   dataTypeI = new char*[N_geombc_integer];
27159599516SKenneth E. Jansen   headerTypeI = new char*[N_geombc_integer];
27259599516SKenneth E. Jansen 
27359599516SKenneth E. Jansen   /////////////////////////
27459599516SKenneth E. Jansen 
27559599516SKenneth E. Jansen   for ( i = 0; i < N_geombc_double; i++ )
27659599516SKenneth E. Jansen     {
27759599516SKenneth E. Jansen       WriteLockD[i]=0;
27859599516SKenneth E. Jansen 
27959599516SKenneth E. Jansen       fieldNameD[i] = new char[128];
28059599516SKenneth E. Jansen       fileTypeD[i] = new char[128];
28159599516SKenneth E. Jansen       dataTypeD[i] = new char[128];
28259599516SKenneth E. Jansen       headerTypeD[i] = new char[128];
28359599516SKenneth E. Jansen     }
28459599516SKenneth E. Jansen 
28559599516SKenneth E. Jansen   for ( i = 0; i < N_geombc_integer; i++ )
28659599516SKenneth E. Jansen     {
28759599516SKenneth E. Jansen       WriteLockI[i]=0; //This take value 1 if the field requested in IO.input is not found (typically for tpblocks)
28859599516SKenneth E. Jansen 
28959599516SKenneth E. Jansen       fieldNameI[i] = new char[128];
29059599516SKenneth E. Jansen       fileTypeI[i] = new char[128];
29159599516SKenneth E. Jansen       dataTypeI[i] = new char[128];
29259599516SKenneth E. Jansen       headerTypeI[i] = new char[128];
29359599516SKenneth E. Jansen     }
29459599516SKenneth E. Jansen 
29559599516SKenneth E. Jansen   ////////////////////////////////////////////////////////////////
29659599516SKenneth E. Jansen   // Reading IO.input
29759599516SKenneth E. Jansen   // temporary fix: in the new version the double and integer
29859599516SKenneth E. Jansen   //                can mix and match to avoid the order confusion
29959599516SKenneth E. Jansen   ////////////////////////////////////////////////////////////////
30059599516SKenneth E. Jansen 
30159599516SKenneth E. Jansen   char S1[128],S2[128],S3[128],S4[128],S5[128];
30259599516SKenneth E. Jansen   int double_counter=0,int_counter=0;
30359599516SKenneth E. Jansen 
30459599516SKenneth E. Jansen   for ( i = 0; i < N_geombc_double+N_geombc_integer; i++ )
30559599516SKenneth E. Jansen     {
30659599516SKenneth E. Jansen       fgets( target, 1024, pFile );
30759599516SKenneth E. Jansen       temp = strtok( target, ";" );
30859599516SKenneth E. Jansen       token = strtok( temp, "," );
30959599516SKenneth E. Jansen       strcpy( S1, token );
31059599516SKenneth E. Jansen       token = strtok ( NULL, "," );
31159599516SKenneth E. Jansen       strcpy( S2, token );
31259599516SKenneth E. Jansen       token = strtok ( NULL, "," );
31359599516SKenneth E. Jansen       strcpy( S3, token );
31459599516SKenneth E. Jansen       token = strtok ( NULL, "," );
31559599516SKenneth E. Jansen       strcpy( S4, token );
31659599516SKenneth E. Jansen       token = strtok ( NULL, "," );
31759599516SKenneth E. Jansen       strcpy( S5, token );
31859599516SKenneth E. Jansen 
31959599516SKenneth E. Jansen       //if (cscompare(S3,"double"))
32059599516SKenneth E. Jansen       if (cscompare("double",S3))
32159599516SKenneth E. Jansen 	{
32259599516SKenneth E. Jansen 	  strcpy( fileTypeD[double_counter], S1 );
32359599516SKenneth E. Jansen 	  strcpy( fieldNameD[double_counter], S2 );
32459599516SKenneth E. Jansen 	  strcpy( dataTypeD[double_counter], S3 );
32559599516SKenneth E. Jansen 	  strcpy( headerTypeD[double_counter], S4 );
32659599516SKenneth E. Jansen 	  strcpy( numTemp, S5 );
32759599516SKenneth E. Jansen 	  expectD[double_counter] = atoi (numTemp);
32859599516SKenneth E. Jansen 	  double_counter++;
32959599516SKenneth E. Jansen 	}
33059599516SKenneth E. Jansen 
33159599516SKenneth E. Jansen       //if (cscompare(S3,"integer"))
33259599516SKenneth E. Jansen       if (cscompare("integer",S3))
33359599516SKenneth E. Jansen 	{
33459599516SKenneth E. Jansen 	  strcpy( fileTypeI[int_counter], S1 );
33559599516SKenneth E. Jansen 	  strcpy( fieldNameI[int_counter], S2 );
33659599516SKenneth E. Jansen 	  strcpy( dataTypeI[int_counter], S3 );
33759599516SKenneth E. Jansen 	  strcpy( headerTypeI[int_counter], S4 );
33859599516SKenneth E. Jansen 	  strcpy( numTemp, S5 );
33959599516SKenneth E. Jansen 	  expectI[int_counter] = atoi (numTemp);
34059599516SKenneth E. Jansen 	  int_counter++;
34159599516SKenneth E. Jansen 	}
34259599516SKenneth E. Jansen     }
34359599516SKenneth E. Jansen 
34459599516SKenneth E. Jansen   //////////////////////////////////////////////////////////////
34559599516SKenneth E. Jansen 
34659599516SKenneth E. Jansen   //for ( i = 0; i < N_geombc_double; i++) {
34759599516SKenneth E. Jansen     //printf("%d %s %s %s %s %d\n", myrank, fileTypeD[i], fieldNameD[i], dataTypeD[i], headerTypeD[i], expectD[i]);
34859599516SKenneth E. Jansen   //}
34959599516SKenneth E. Jansen 
35059599516SKenneth E. Jansen 
35159599516SKenneth E. Jansen //  printf("rank %d is waiting\n",myrank);
35259599516SKenneth E. Jansen   MPI_Barrier(MPI_COMM_WORLD); //already there
35359599516SKenneth E. Jansen 
35459599516SKenneth E. Jansen   if(myrank==0){
35559599516SKenneth E. Jansen     printf("Starting to read some blocks (doubles) in the geombc.dat.## files\n");
35659599516SKenneth E. Jansen   }
35759599516SKenneth E. Jansen 
35859599516SKenneth E. Jansen   for ( i = 0; i < nppp; i++ )
35959599516SKenneth E. Jansen     {
36059599516SKenneth E. Jansen       if(existsubdir) {
36159599516SKenneth E. Jansen         subdir = (startpart+i-1) / DIR_FANOUT;
36259599516SKenneth E. Jansen         sprintf(gfname,"./%d-procs_case/%d/geombc.dat.%d",N_parts, subdir, startpart+i);
36359599516SKenneth E. Jansen       }
36459599516SKenneth E. Jansen       else
36559599516SKenneth E. Jansen         sprintf(gfname,"./%d-procs_case/geombc.dat.%d",N_parts,startpart+i);
36659599516SKenneth E. Jansen 
36759599516SKenneth E. Jansen       openfile(gfname,"read",&igeom);
36859599516SKenneth E. Jansen 
36959599516SKenneth E. Jansen //      MPI_Barrier(MPI_COMM_WORLD);
37059599516SKenneth E. Jansen 
37159599516SKenneth E. Jansen       for ( j = 0; j < N_geombc_double; j++ )
37259599516SKenneth E. Jansen 	{
37359599516SKenneth E. Jansen 
37459599516SKenneth E. Jansen //	  printf("rank: %d - read double: %s\n",myrank,fieldNameD[j]);
37559599516SKenneth E. Jansen 	  paraD[i][j] = new int[expectD[j]];
37659599516SKenneth E. Jansen 
37759599516SKenneth E. Jansen 	  for ( k = 0; k < 10; k++ )
37859599516SKenneth E. Jansen 	    iarray[k]=0;
37959599516SKenneth E. Jansen 
38059599516SKenneth E. Jansen 	  iarray[0]=-1;
38159599516SKenneth E. Jansen 	  WriteLockD[j]=0;
38259599516SKenneth E. Jansen 	  readheader( &igeom,
38359599516SKenneth E. Jansen 		       fieldNameD[j],
38459599516SKenneth E. Jansen 		       (void*)iarray,
38559599516SKenneth E. Jansen 		       &expectD[j],
38659599516SKenneth E. Jansen 		       "double",
38759599516SKenneth E. Jansen 		       "binary" );
38859599516SKenneth E. Jansen 	  if ( iarray[0]==-1 )  // The field requested in IO.O2N.input has not been found (should be a tpblocks)
38959599516SKenneth E. Jansen 	      WriteLockD[j]=1;
39059599516SKenneth E. Jansen 
39159599516SKenneth E. Jansen //          printf("rank: %d - part: %d - field: %s - iarray: %d\n",myrank,startpart+i,fieldNameD[j],iarray[0]);
39259599516SKenneth E. Jansen 
39359599516SKenneth E. Jansen //	  MPI_Barrier(MPI_COMM_WORLD);
39459599516SKenneth E. Jansen 
39559599516SKenneth E. Jansen 	  // get the parameter list in data header ...
39659599516SKenneth E. Jansen 	  // different fields have different ways to get this list ...
39759599516SKenneth E. Jansen 	  for ( k = 0; k < expectD[j]; k++ )
39859599516SKenneth E. Jansen 	    paraD[i][j][k] = iarray[k];
39959599516SKenneth E. Jansen 
40059599516SKenneth E. Jansen 	  if ( WriteLockD[j]==1) // Put the value of the expected integers in the header to 0 when field not present
40159599516SKenneth E. Jansen 	    for ( k = 0; k < expectD[j]; k++ )
40259599516SKenneth E. Jansen 	      paraD[i][j][k] = 0;
40359599516SKenneth E. Jansen 
40459599516SKenneth E. Jansen /*          int iproc;
40559599516SKenneth E. Jansen           for(iproc=0; iproc<N_procs; iproc++){
40659599516SKenneth E. Jansen             MPI_Barrier(MPI_COMM_WORLD);
40759599516SKenneth E. Jansen             if(iproc == myrank){
40859599516SKenneth E. Jansen               printf(" iproc: %d ", iproc);
40959599516SKenneth E. Jansen               printf("part: %d myrank: %d field: %s header: ",startpart+i,myrank,fieldNameD[j]);
41059599516SKenneth E. Jansen               for ( k = 0; k < expectD[j]; k++ )
41159599516SKenneth E. Jansen                 printf(" %d ",iarray[k]);
41259599516SKenneth E. Jansen               printf("\n");
41359599516SKenneth E. Jansen             }
41459599516SKenneth E. Jansen             usleep(100);
41559599516SKenneth E. Jansen             MPI_Barrier(MPI_COMM_WORLD);
41659599516SKenneth E. Jansen           }*/
41759599516SKenneth E. Jansen 
41859599516SKenneth E. Jansen 
41959599516SKenneth E. Jansen 	  if ( cscompare("block",headerTypeD[j]) )
42059599516SKenneth E. Jansen 	    {
42159599516SKenneth E. Jansen /*	      if ( expectD[j]==1)
42259599516SKenneth E. Jansen 		isize = paraD[i][j][0];
42359599516SKenneth E. Jansen 	      else
42459599516SKenneth E. Jansen 		isize = paraD[i][j][0] * paraD[i][j][1];
42559599516SKenneth E. Jansen 
42659599516SKenneth E. Jansen 	      if (cscompare("nbc values",fieldNameD[j]))
42759599516SKenneth E. Jansen 		isize = paraD[i][j][0] * (numVariables[i]+1);
42859599516SKenneth E. Jansen */
42959599516SKenneth E. Jansen 
43059599516SKenneth E. Jansen //              int test;
43159599516SKenneth E. Jansen //              test = computenitems(i,j,myrank,fieldNameD[j],paraD,expectD[j],numVariables[i]);
43259599516SKenneth E. Jansen //              printf("irank: %d fieldname: %s ParaD: %d\n",myrank,fieldNameD[j], paraD[0][0][0], numVariables[i]);
43359599516SKenneth E. Jansen //              if(test != isize)
43459599516SKenneth E. Jansen //                printf("PROBLEM fieldname: %s part: %d isize: %d test: %d\n",fieldNameD[j],startpart+i,isize,test);
43559599516SKenneth E. Jansen //              else
43659599516SKenneth E. Jansen //                printf("fieldname: %s part: %d isize: %d test: %d\n",fieldNameD[j],startpart+i,isize,test);
43759599516SKenneth E. Jansen 
43859599516SKenneth E. Jansen               isize = computenitems(i,j,myrank,fieldNameD[j],paraD,expectD[j],numVariables[i]);
43959599516SKenneth E. Jansen               //printf("fieldname: %s part: %d isize: %d\n",fieldNameD[j],startpart+i,isize);
44059599516SKenneth E. Jansen 
44159599516SKenneth E. Jansen 	      Dfield[i][j] = new double[isize];
44259599516SKenneth E. Jansen 	      readdatablock( &igeom,
44359599516SKenneth E. Jansen 			      fieldNameD[j],
44459599516SKenneth E. Jansen 			      (void*)Dfield[i][j],
44559599516SKenneth E. Jansen 			      &isize,
44659599516SKenneth E. Jansen 			      "double",
44759599516SKenneth E. Jansen 			      "binary" );
44859599516SKenneth E. Jansen 	    }
44959599516SKenneth E. Jansen 	}
45059599516SKenneth E. Jansen //      MPI_Barrier(MPI_COMM_WORLD);
45159599516SKenneth E. Jansen       closefile(&igeom, "read");
45259599516SKenneth E. Jansen     }
45359599516SKenneth E. Jansen 
45459599516SKenneth E. Jansen   MPI_Barrier(MPI_COMM_WORLD);
45559599516SKenneth E. Jansen   if(myrank==0){
45659599516SKenneth E. Jansen     printf("Starting to read some blocks (integers) in the geombc.dat.## files\n");
45759599516SKenneth E. Jansen   }
45859599516SKenneth E. Jansen 
45959599516SKenneth E. Jansen   // Count the number of interior and boundary tpblocks for 2 new headers named
46059599516SKenneth E. Jansen   // 'total number of different interior tpblocks' and
46159599516SKenneth E. Jansen   // 'total number of different boundary tpblocks'
46259599516SKenneth E. Jansen   int interiorCounter, boundaryCounter;
46359599516SKenneth E. Jansen   interiorCounter=0;
46459599516SKenneth E. Jansen   boundaryCounter=0;
46559599516SKenneth E. Jansen   for ( j = 0; j < N_geombc_integer; j++ )
46659599516SKenneth E. Jansen     {
46759599516SKenneth E. Jansen        if (cscompare("connectivity interior",fieldNameI[j]))
46859599516SKenneth E. Jansen 	{
46959599516SKenneth E. Jansen                   //printf("part: %d, fieldNameI[j]: %s\n",GPID,fieldNameI[j]);
47059599516SKenneth E. Jansen 		  interiorCounter++;
47159599516SKenneth E. Jansen         }
47259599516SKenneth E. Jansen         else if (cscompare("connectivity boundary",fieldNameI[j]))
47359599516SKenneth E. Jansen 	{
47459599516SKenneth E. Jansen                   //printf("part: %d, fieldNameI[j]: %s\n",GPID,fieldNameI[j]);
47559599516SKenneth E. Jansen 		  boundaryCounter++;
47659599516SKenneth E. Jansen         }
47759599516SKenneth E. Jansen     }
47859599516SKenneth E. Jansen 
47959599516SKenneth E. Jansen   MPI_Barrier(MPI_COMM_WORLD);
48059599516SKenneth E. Jansen   if(myrank==0){
48159599516SKenneth E. Jansen     printf("There are %d total connectivity interior and %d total connectivity boundary\n", interiorCounter, boundaryCounter);
48259599516SKenneth E. Jansen   }
48359599516SKenneth E. Jansen 
48459599516SKenneth E. Jansen 
48559599516SKenneth E. Jansen 
48659599516SKenneth E. Jansen   // Now, start to read the integer fields
48759599516SKenneth E. Jansen   for ( i = 0; i < nppp; i++ )
48859599516SKenneth E. Jansen     {
48959599516SKenneth E. Jansen       if(existsubdir) {
49059599516SKenneth E. Jansen         subdir = (startpart+i-1) / DIR_FANOUT;
49159599516SKenneth E. Jansen         sprintf(gfname,"./%d-procs_case/%d/geombc.dat.%d",N_parts, subdir, startpart+i);
49259599516SKenneth E. Jansen       }
49359599516SKenneth E. Jansen       else
49459599516SKenneth E. Jansen         sprintf(gfname,"./%d-procs_case/geombc.dat.%d", N_parts, startpart+i);
49559599516SKenneth E. Jansen 
49659599516SKenneth E. Jansen       openfile(gfname,"read",&igeom);
49759599516SKenneth E. Jansen 
49859599516SKenneth E. Jansen //      MPI_Barrier(MPI_COMM_WORLD);
49959599516SKenneth E. Jansen 
50059599516SKenneth E. Jansen //      printf("gfname is %s and nppp is %d myrank %d\n",gfname,i,myrank);
50159599516SKenneth E. Jansen 
50259599516SKenneth E. Jansen       for ( j = 0; j < N_geombc_integer; j++ )
50359599516SKenneth E. Jansen 	{
50459599516SKenneth E. Jansen 
50559599516SKenneth E. Jansen //	  printf("Writing integer ... %s\n",fieldNameI[j]);
50659599516SKenneth E. Jansen 	  paraI[i][j] = new int[expectI[j]];
50759599516SKenneth E. Jansen 
50859599516SKenneth E. Jansen 	  for ( k = 0; k < 10; k++ )
50959599516SKenneth E. Jansen 	    iarray[k]=0;
51059599516SKenneth E. Jansen 
51159599516SKenneth E. Jansen 	  //	  printf("myrank %d and i %d j %d numBou is %d\n",myrank,i,j,numBoundaryFields[i]);
51259599516SKenneth E. Jansen 
51359599516SKenneth E. Jansen 	  WriteLockI[j]=0;
51459599516SKenneth E. Jansen 	  iarray[0]=-1;
51559599516SKenneth E. Jansen 
51659599516SKenneth E. Jansen           if ( cscompare("total number of interior tpblocks",fieldNameI[j] ) )
51759599516SKenneth E. Jansen           {
51859599516SKenneth E. Jansen              iarray[0] = interiorCounter; //New header that does not exist in the posix file
51959599516SKenneth E. Jansen           }
52059599516SKenneth E. Jansen           else if ( cscompare("total number of boundary tpblocks",fieldNameI[j] ) )
52159599516SKenneth E. Jansen           {
52259599516SKenneth E. Jansen              iarray[0] = boundaryCounter; //New header that does not exist in the posix file
52359599516SKenneth E. Jansen           }
52459599516SKenneth E. Jansen           else
52559599516SKenneth E. Jansen           {
52659599516SKenneth E. Jansen 	     readheader( &igeom,
52759599516SKenneth E. Jansen 		          fieldNameI[j],
52859599516SKenneth E. Jansen 		          (void*)iarray,
52959599516SKenneth E. Jansen 		          &expectI[j],
53059599516SKenneth E. Jansen 		          "integer",
53159599516SKenneth E. Jansen 		          "binary" );
53259599516SKenneth E. Jansen 	     if ( iarray[0]==-1)
53359599516SKenneth E. Jansen 	       WriteLockI[j]=1; // The field was not found in the posix geombc file
53459599516SKenneth E. Jansen           }
53559599516SKenneth E. Jansen 
53659599516SKenneth E. Jansen 	  //MPI_Barrier(MPI_COMM_WORLD);
53759599516SKenneth E. Jansen 
53859599516SKenneth E. Jansen /*          int iproc;
53959599516SKenneth E. Jansen           for(iproc=0; iproc<N_procs; iproc++){
54059599516SKenneth E. Jansen             MPI_Barrier(MPI_COMM_WORLD);
54159599516SKenneth E. Jansen             if(iproc == myrank){
54259599516SKenneth E. Jansen               printf(" iproc: %d ", iproc);
54359599516SKenneth E. Jansen               printf("part: %d myrank: %d field: %s header: ",startpart+i,myrank,fieldNameI[j]);
54459599516SKenneth E. Jansen               for ( k = 0; k < expectI[j]; k++ )
54559599516SKenneth E. Jansen                 printf(" %d ",iarray[k]);
54659599516SKenneth E. Jansen               printf("\n");
54759599516SKenneth E. Jansen             }
54859599516SKenneth E. Jansen             usleep(100);
54959599516SKenneth E. Jansen             MPI_Barrier(MPI_COMM_WORLD);
55059599516SKenneth E. Jansen           }*/
55159599516SKenneth E. Jansen 
55259599516SKenneth E. Jansen 	  for ( k = 0; k < expectI[j]; k++ )
55359599516SKenneth E. Jansen 	    paraI[i][j][k] = iarray[k];
55459599516SKenneth E. Jansen 
55559599516SKenneth E. Jansen 	  if ( WriteLockI[j]==1) //The field is not present but SyncIO needs it to read collectively. Put 0.
55659599516SKenneth E. Jansen 	    for ( k = 0; k < expectI[j]; k++ )
55759599516SKenneth E. Jansen 	      paraI[i][j][k] = 0;
55859599516SKenneth E. Jansen 
55959599516SKenneth E. Jansen 	  if ( cscompare("block",headerTypeI[j]) )
56059599516SKenneth E. Jansen 	    {
56159599516SKenneth E. Jansen /*	      if ( expectI[j]==1)
56259599516SKenneth E. Jansen 		isize = paraI[i][j][0];
56359599516SKenneth E. Jansen 	      else
56459599516SKenneth E. Jansen 		isize = paraI[i][j][0] * paraI[i][j][1];
56559599516SKenneth E. Jansen 
56659599516SKenneth E. Jansen 	      if (cscompare("nbc codes",fieldNameI[j]))
56759599516SKenneth E. Jansen 		isize = paraI[i][j][0] * 2;
56859599516SKenneth E. Jansen */
56959599516SKenneth E. Jansen //              int test;
57059599516SKenneth E. Jansen //              test = computenitems(i,j,myrank,fieldNameI[j],paraI,expectI[j],numVariables[i]);
57159599516SKenneth E. Jansen //              printf("irank: %d fieldname: %s ParaI: %d\n",myrank,fieldNameI[j], parapI[0][0][0], numVariables[i]);
57259599516SKenneth E. Jansen //              if(test != isize)
57359599516SKenneth E. Jansen //                printf("PROBLEM fieldname: %s part: %d isize: %d test: %d\n",fieldNameI[j],startpart+i,isize,test);
57459599516SKenneth E. Jansen //              else
57559599516SKenneth E. Jansen //                printf("fieldname: %s part: %d isize: %d test: %d\n",fieldNameI[j],startpart+i,isize,test);
57659599516SKenneth E. Jansen 
57759599516SKenneth E. Jansen               isize = computenitems(i,j,myrank,fieldNameI[j],paraI,expectI[j],numVariables[i]);
57859599516SKenneth E. Jansen               //printf("fieldname: %s part: %d isize: %d\n",fieldNameI[j],startpart+i,isize);
57959599516SKenneth E. Jansen 
58059599516SKenneth E. Jansen 	      Ifield[i][j] = new int[isize];
58159599516SKenneth E. Jansen 	      readdatablock( &igeom,
58259599516SKenneth E. Jansen 			      fieldNameI[j],
58359599516SKenneth E. Jansen 			      (void*)Ifield[i][j],
58459599516SKenneth E. Jansen 			      &isize,
58559599516SKenneth E. Jansen 			      "integer",
58659599516SKenneth E. Jansen 			      "binary" );
58759599516SKenneth E. Jansen 	    }
58859599516SKenneth E. Jansen 	}
58959599516SKenneth E. Jansen //      MPI_Barrier(MPI_COMM_WORLD);
59059599516SKenneth E. Jansen       closefile(&igeom, "read");
59159599516SKenneth E. Jansen     }
59259599516SKenneth E. Jansen 
59359599516SKenneth E. Jansen   MPI_Barrier(MPI_COMM_WORLD); //added by MR
59459599516SKenneth E. Jansen 
59559599516SKenneth E. Jansen   ///////////////////// Writing ///////////////////////////////
59659599516SKenneth E. Jansen 
59759599516SKenneth E. Jansen   int nppf = N_parts/N_files;
59859599516SKenneth E. Jansen   int N_geombc = N_geombc_double + N_geombc_integer;
59959599516SKenneth E. Jansen   int writeHandle, GPID;
60059599516SKenneth E. Jansen   char fname[255],fieldtag[255];
60159599516SKenneth E. Jansen 
60259599516SKenneth E. Jansen   bzero((void*)fname,255);
60359599516SKenneth E. Jansen //MR CHANGE
60459599516SKenneth E. Jansen //  sprintf(fname,"./%d-procs_case-SyncIO",N_parts);
60559599516SKenneth E. Jansen //  if(0<mkdir(fname,0777)) { printf("ERROR - Could not create procs_case-SyncIO directory\n"); return 1; }
60659599516SKenneth E. Jansen //MR CHANGE END
60759599516SKenneth E. Jansen   sprintf(fname,"./%d-procs_case-SyncIO-%d/geombc-dat.%d",N_parts,N_files,((int)(myrank/(N_procs/N_files))+1));
60859599516SKenneth E. Jansen 
60959599516SKenneth E. Jansen   MPI_Barrier(MPI_COMM_WORLD);
61059599516SKenneth E. Jansen   if(myrank==0){
61159599516SKenneth E. Jansen     printf("Starting to write some blocks (doubles) in the geombc.dat-## files\n");
61259599516SKenneth E. Jansen   }
61359599516SKenneth E. Jansen 
61459599516SKenneth E. Jansen   initphmpiio(&N_geombc, &nppf, &N_files,&writeHandle, "write");
61559599516SKenneth E. Jansen //  initphmpiio(&N_geombc, &nppf, &N_files,&writeHandle);
61659599516SKenneth E. Jansen   openfile(fname, "write", &writeHandle);
61759599516SKenneth E. Jansen 
61859599516SKenneth E. Jansen   for (  i = 0; i < nppp; i++  )
61959599516SKenneth E. Jansen     {
62059599516SKenneth E. Jansen       valuesMark[i]=0;
62159599516SKenneth E. Jansen     }
62259599516SKenneth E. Jansen 
62359599516SKenneth E. Jansen   for ( j = 0; j < N_geombc_double; j++ )
62459599516SKenneth E. Jansen     {
62559599516SKenneth E. Jansen       for (  i = 0; i < nppp; i++  )
62659599516SKenneth E. Jansen 	{
62759599516SKenneth E. Jansen 
62859599516SKenneth E. Jansen 	  //if ( WriteLockD[i] == 0 )
62959599516SKenneth E. Jansen 	    {
63059599516SKenneth E. Jansen 	      GPID = startpart + i;
63159599516SKenneth E. Jansen 	      bzero((void*)fieldtag,255);
63259599516SKenneth E. Jansen 
63359599516SKenneth E. Jansen 	      fieldCompareMark=0;
63459599516SKenneth E. Jansen 	      if (cscompare("nbc values",fieldNameD[j]))
63559599516SKenneth E. Jansen 		{
63659599516SKenneth E. Jansen 		  fieldCompareMark = 1;
63759599516SKenneth E. Jansen 		  valuesMark[i]++;
63859599516SKenneth E. Jansen 		  bzero((void*)fieldNameD[j],128);
63959599516SKenneth E. Jansen 		  sprintf(fieldNameD[j],"nbc values%d",valuesMark[i]);
64059599516SKenneth E. Jansen 
64159599516SKenneth E. Jansen //		  if ( valuesMark[i]>numBoundaryFields[i] )
64259599516SKenneth E. Jansen //		   for ( k = 0; k < expectD[j]; k++ )
64359599516SKenneth E. Jansen //		      paraD[i][j][k] = 0;
64459599516SKenneth E. Jansen 		}
64559599516SKenneth E. Jansen 
64659599516SKenneth E. Jansen 	      sprintf(fieldtag,"%s@%d",fieldNameD[j],GPID);
64759599516SKenneth E. Jansen 
64859599516SKenneth E. Jansen 
64959599516SKenneth E. Jansen /*	      if ( expectD[j]==1 )
65059599516SKenneth E. Jansen 		isize = paraD[i][j][0];
65159599516SKenneth E. Jansen 	      else
65259599516SKenneth E. Jansen 		isize = paraD[i][j][0] * paraD[i][j][1];
65359599516SKenneth E. Jansen 
65459599516SKenneth E. Jansen 	      //specially designed for nbc values fields
65559599516SKenneth E. Jansen 	      //check the size in presolver codes
65659599516SKenneth E. Jansen 	      //Yeah, you have to open restart to get the size
65759599516SKenneth E. Jansen 	      if ( fieldCompareMark==1 )
65859599516SKenneth E. Jansen 		isize = paraD[i][j][0] * (numVariables[i]+1);
65959599516SKenneth E. Jansen */
66059599516SKenneth E. Jansen 	      if ( cscompare("header",headerTypeD[j]) )
66159599516SKenneth E. Jansen 		isize = 0;
66259599516SKenneth E. Jansen               else // block
66359599516SKenneth E. Jansen                 isize = computenitems(i,j,myrank,fieldNameD[j],paraD,expectD[j],numVariables[i]);
66459599516SKenneth E. Jansen 
66559599516SKenneth E. Jansen 	      for ( k = 0; k < expectD[j]; k++ )
66659599516SKenneth E. Jansen 		iarray[k] = paraD[i][j][k];
66759599516SKenneth E. Jansen 
66859599516SKenneth E. Jansen               //printf("write fieldname: %s part: %d isize: %d iarray: %d\n",fieldNameD[j],startpart+i,isize, iarray[0]);
66959599516SKenneth E. Jansen 
67059599516SKenneth E. Jansen 	      writeheader( &writeHandle,
67159599516SKenneth E. Jansen 			    fieldtag,
67259599516SKenneth E. Jansen 			    (void*)iarray,
67359599516SKenneth E. Jansen 			    &expectD[j],
67459599516SKenneth E. Jansen 			    &isize,
67559599516SKenneth E. Jansen 			    "double",
67659599516SKenneth E. Jansen 			    "binary");
67759599516SKenneth E. Jansen 	      writedatablock( &writeHandle,
67859599516SKenneth E. Jansen 			       fieldtag,
67959599516SKenneth E. Jansen 			       (void*)Dfield[i][j],
68059599516SKenneth E. Jansen 			       &isize,
68159599516SKenneth E. Jansen 			       "double",
68259599516SKenneth E. Jansen 			       "binary");
68359599516SKenneth E. Jansen 
68459599516SKenneth E. Jansen 	      if ( cscompare("block",headerTypeD[j]) )
68559599516SKenneth E. Jansen 		delete [] Dfield[i][j];
68659599516SKenneth E. Jansen 	    }
68759599516SKenneth E. Jansen 	  delete [] paraD[i][j];
68859599516SKenneth E. Jansen 	}
68959599516SKenneth E. Jansen     }
69059599516SKenneth E. Jansen 
69159599516SKenneth E. Jansen   for (  i = 0; i < nppp; i++  )
69259599516SKenneth E. Jansen     {
69359599516SKenneth E. Jansen       interiorMark[i]=0;
69459599516SKenneth E. Jansen       boundaryMark[i]=0;
69559599516SKenneth E. Jansen       codesMark[i]=0;
69659599516SKenneth E. Jansen     }
69759599516SKenneth E. Jansen 
69859599516SKenneth E. Jansen   MPI_Barrier(MPI_COMM_WORLD);
69959599516SKenneth E. Jansen   if(myrank==0){
70059599516SKenneth E. Jansen     printf("Starting to write some blocks (integers) in the geombc.dat-## files\n");
70159599516SKenneth E. Jansen   }
70259599516SKenneth E. Jansen 
70359599516SKenneth E. Jansen   // Now the other fields listed in IO.O2N.input
70459599516SKenneth E. Jansen   for ( j = 0; j < N_geombc_integer; j++ )
70559599516SKenneth E. Jansen     {
70659599516SKenneth E. Jansen       for (  i = 0; i < nppp; i++  )
70759599516SKenneth E. Jansen 	{
70859599516SKenneth E. Jansen 	  //if ( WriteLockI[i] == 0 )
70959599516SKenneth E. Jansen 	    {
71059599516SKenneth E. Jansen 	      GPID = startpart + i;
71159599516SKenneth E. Jansen 	      bzero((void*)fieldtag,255);
71259599516SKenneth E. Jansen 
71359599516SKenneth E. Jansen 	      if (cscompare("connectivity interior",fieldNameI[j]))
71459599516SKenneth E. Jansen 		{
71559599516SKenneth E. Jansen 		  interiorMark[i]++;
71659599516SKenneth E. Jansen 		  bzero((void*)fieldNameI[j],128);
71759599516SKenneth E. Jansen 		  sprintf(fieldNameI[j],"connectivity interior%d",interiorMark[i]);
71859599516SKenneth E. Jansen 
71959599516SKenneth E. Jansen //		  if ( interiorMark[i]>numInteriorFields[i] )
72059599516SKenneth E. Jansen //		    for ( k = 0; k < expectI[j]; k++ )
72159599516SKenneth E. Jansen //		      paraI[i][j][k] = 0;
72259599516SKenneth E. Jansen 
72359599516SKenneth E. Jansen 		}
72459599516SKenneth E. Jansen 
72559599516SKenneth E. Jansen 	      if (cscompare("connectivity boundary",fieldNameI[j]))
72659599516SKenneth E. Jansen 		{
72759599516SKenneth E. Jansen 		  boundaryMark[i]++;
72859599516SKenneth E. Jansen 		  bzero((void*)fieldNameI[j],128);
72959599516SKenneth E. Jansen 		  sprintf(fieldNameI[j],"connectivity boundary%d",boundaryMark[i]);
73059599516SKenneth E. Jansen 
73159599516SKenneth E. Jansen //		  if ( boundaryMark[i]>numBoundaryFields[i] )
73259599516SKenneth E. Jansen //		    for ( k = 0; k < expectI[j]; k++ )
73359599516SKenneth E. Jansen //		      paraI[i][j][k] = 0;
73459599516SKenneth E. Jansen 		}
73559599516SKenneth E. Jansen 
73659599516SKenneth E. Jansen 	      fieldCompareMark=0;
73759599516SKenneth E. Jansen 	      if (cscompare("nbc codes",fieldNameI[j]))
73859599516SKenneth E. Jansen 		{
73959599516SKenneth E. Jansen 		  fieldCompareMark=1;
74059599516SKenneth E. Jansen 		  codesMark[i]++;
74159599516SKenneth E. Jansen 		  bzero((void*)fieldNameI[j],128);
74259599516SKenneth E. Jansen 		  sprintf(fieldNameI[j],"nbc codes%d",codesMark[i]);
74359599516SKenneth E. Jansen 
74459599516SKenneth E. Jansen //		  if ( codesMark[i]>numBoundaryFields[i] )
74559599516SKenneth E. Jansen //		    for ( k = 0; k < expectI[j]; k++ )
74659599516SKenneth E. Jansen //		      paraI[i][j][k] = 0;
74759599516SKenneth E. Jansen 		}
74859599516SKenneth E. Jansen 
74959599516SKenneth E. Jansen 	      sprintf(fieldtag,"%s@%d",fieldNameI[j],GPID);
75059599516SKenneth E. Jansen 
75159599516SKenneth E. Jansen //	      if ( expectI[j]==1)
75259599516SKenneth E. Jansen //		isize = paraI[i][j][0];
75359599516SKenneth E. Jansen //	      else
75459599516SKenneth E. Jansen //		isize = paraI[i][j][0] * paraI[i][j][1];
75559599516SKenneth E. Jansen 
75659599516SKenneth E. Jansen //MR CHANGE
75759599516SKenneth E. Jansen //              printf("rank,j,i,isize %d %d %d %d\n",myrank,j,i,isize);
75859599516SKenneth E. Jansen 
75959599516SKenneth E. Jansen 
76059599516SKenneth E. Jansen 	      //specially designed for nbc codes fields
76159599516SKenneth E. Jansen 	      //check the size in presolver codes
76259599516SKenneth E. Jansen //	      if (fieldCompareMark==1)
76359599516SKenneth E. Jansen //		isize = paraI[i][j][0] * 2;
76459599516SKenneth E. Jansen 
76559599516SKenneth E. Jansen 	      if ( cscompare("header",headerTypeI[j]) )
76659599516SKenneth E. Jansen 		isize = 0;
76759599516SKenneth E. Jansen               else
76859599516SKenneth E. Jansen                 isize = computenitems(i,j,myrank,fieldNameI[j],paraI,expectI[j],numVariables[i]);
76959599516SKenneth E. Jansen 
77059599516SKenneth E. Jansen 	      for ( k = 0; k < expectI[j]; k++ )
77159599516SKenneth E. Jansen 		iarray[k] = paraI[i][j][k];
77259599516SKenneth E. Jansen 
77359599516SKenneth E. Jansen //              printf("write fieldname: %s part: %d isize: %d iarray: %d\n",fieldNameI[j],startpart+i,isize, iarray[0]);
77459599516SKenneth E. Jansen 
77559599516SKenneth E. Jansen 	      writeheader( &writeHandle,
77659599516SKenneth E. Jansen 			    fieldtag,
77759599516SKenneth E. Jansen 			    (void*)iarray,
77859599516SKenneth E. Jansen 			    &expectI[j],
77959599516SKenneth E. Jansen 			    &isize,
78059599516SKenneth E. Jansen 			    "integer",
78159599516SKenneth E. Jansen 			    "binary");
78259599516SKenneth E. Jansen 	      writedatablock( &writeHandle,
78359599516SKenneth E. Jansen 			       fieldtag,
78459599516SKenneth E. Jansen 			       (void*)Ifield[i][j],
78559599516SKenneth E. Jansen 			       &isize,
78659599516SKenneth E. Jansen 			       "integer",
78759599516SKenneth E. Jansen 			       "binary" );
78859599516SKenneth E. Jansen 
78959599516SKenneth E. Jansen 	      if ( cscompare("block",headerTypeI[j]) ){
79059599516SKenneth E. Jansen //                printf("rank %d - deleting Ifield %d %d\n",myrank,i,j);
79159599516SKenneth E. Jansen 		delete [] Ifield[i][j];
79259599516SKenneth E. Jansen //                printf("rank %d - Ifield deleted %d %d\n",myrank,i,j);
79359599516SKenneth E. Jansen               }
79459599516SKenneth E. Jansen 	    }
79559599516SKenneth E. Jansen //          printf("rank %d - deleting paraI %d %d\n",myrank,i,j);
79659599516SKenneth E. Jansen 	  delete [] paraI[i][j];
79759599516SKenneth E. Jansen //          printf("rank %d - paraI deleted %d %d\n",myrank,i,j);
79859599516SKenneth E. Jansen 	}
79959599516SKenneth E. Jansen 
80059599516SKenneth E. Jansen     }
80159599516SKenneth E. Jansen 
80259599516SKenneth E. Jansen   MPI_Barrier(MPI_COMM_WORLD);
80359599516SKenneth E. Jansen   if(myrank==0){
80459599516SKenneth E. Jansen     printf("Closing geombc-dat.##.## files\n");
80559599516SKenneth E. Jansen   }
80659599516SKenneth E. Jansen 
80759599516SKenneth E. Jansen   closefile(&writeHandle, "write");
80859599516SKenneth E. Jansen   finalizephmpiio(&writeHandle);
80959599516SKenneth E. Jansen 
81059599516SKenneth E. Jansen   if(myrank==0){
81159599516SKenneth E. Jansen     printf("Free memory related to geombc-dat.##.## files\n");
81259599516SKenneth E. Jansen   }
81359599516SKenneth E. Jansen 
81459599516SKenneth E. Jansen   for ( i = 0; i < nppp; i++ )
81559599516SKenneth E. Jansen     {
81659599516SKenneth E. Jansen       delete [] Dfield[i];
81759599516SKenneth E. Jansen       delete [] paraD[i];
81859599516SKenneth E. Jansen 
81959599516SKenneth E. Jansen       delete [] Ifield[i];
82059599516SKenneth E. Jansen       delete [] paraI[i];
82159599516SKenneth E. Jansen 
82259599516SKenneth E. Jansen      }
82359599516SKenneth E. Jansen 
82459599516SKenneth E. Jansen   for ( i = 0; i < N_geombc_double; i++ )
82559599516SKenneth E. Jansen     {
82659599516SKenneth E. Jansen       delete [] fieldNameD[i];
82759599516SKenneth E. Jansen       delete [] fileTypeD[i];
82859599516SKenneth E. Jansen       delete [] dataTypeD[i];
82959599516SKenneth E. Jansen       delete [] headerTypeD[i];
83059599516SKenneth E. Jansen     }
83159599516SKenneth E. Jansen 
83259599516SKenneth E. Jansen   for ( i = 0; i < N_geombc_integer; i++ )
83359599516SKenneth E. Jansen     {
83459599516SKenneth E. Jansen 
83559599516SKenneth E. Jansen       delete [] fieldNameI[i];
83659599516SKenneth E. Jansen       delete [] fileTypeI[i];
83759599516SKenneth E. Jansen       delete [] dataTypeI[i];
83859599516SKenneth E. Jansen       delete [] headerTypeI[i];
83959599516SKenneth E. Jansen     }
84059599516SKenneth E. Jansen 
84159599516SKenneth E. Jansen   delete [] Dfield;
84259599516SKenneth E. Jansen   delete [] Ifield;
84359599516SKenneth E. Jansen 
84459599516SKenneth E. Jansen   delete [] paraD;
84559599516SKenneth E. Jansen   delete [] paraI;
84659599516SKenneth E. Jansen 
84759599516SKenneth E. Jansen   delete [] expectD;
84859599516SKenneth E. Jansen   delete [] expectI;
84959599516SKenneth E. Jansen 
85059599516SKenneth E. Jansen   delete [] fieldNameD;
85159599516SKenneth E. Jansen   delete [] fileTypeD;
85259599516SKenneth E. Jansen   delete [] dataTypeD;
85359599516SKenneth E. Jansen   delete [] headerTypeD;
85459599516SKenneth E. Jansen 
85559599516SKenneth E. Jansen   delete [] fieldNameI;
85659599516SKenneth E. Jansen   delete [] fileTypeI;
85759599516SKenneth E. Jansen   delete [] dataTypeI;
85859599516SKenneth E. Jansen   delete [] headerTypeI;
85959599516SKenneth E. Jansen 
86059599516SKenneth E. Jansen   MPI_Barrier(MPI_COMM_WORLD);
86159599516SKenneth E. Jansen   if(myrank==0){
86259599516SKenneth E. Jansen     printf("Done with geombc-dat.##.## files\n");
86359599516SKenneth E. Jansen   }
86459599516SKenneth E. Jansen 
86559599516SKenneth E. Jansen   /////////////////////// restart data ////////////////////////////
86659599516SKenneth E. Jansen 
86759599516SKenneth E. Jansen   int irestart;
86859599516SKenneth E. Jansen 
86959599516SKenneth E. Jansen   Dfield = new double**[N_restart_double];
87059599516SKenneth E. Jansen   Ifield = new int**[N_restart_integer];
87159599516SKenneth E. Jansen 
87259599516SKenneth E. Jansen   paraD = new int**[N_restart_double];
87359599516SKenneth E. Jansen   paraI = new int**[N_restart_integer];
87459599516SKenneth E. Jansen 
87559599516SKenneth E. Jansen   expectD = new int[N_restart_double];
87659599516SKenneth E. Jansen   expectI = new int[N_restart_integer];
87759599516SKenneth E. Jansen 
87859599516SKenneth E. Jansen   fieldNameD = new char*[N_restart_double];
87959599516SKenneth E. Jansen   fileTypeD = new char*[N_restart_double];
88059599516SKenneth E. Jansen   dataTypeD = new char*[N_restart_double];
88159599516SKenneth E. Jansen   headerTypeD = new char*[N_restart_double];
88259599516SKenneth E. Jansen 
88359599516SKenneth E. Jansen   fieldNameI = new char*[N_restart_integer];
88459599516SKenneth E. Jansen   fileTypeI = new char*[N_restart_integer];
88559599516SKenneth E. Jansen   dataTypeI = new char*[N_restart_integer];
88659599516SKenneth E. Jansen   headerTypeI = new char*[N_restart_integer];
88759599516SKenneth E. Jansen 
88859599516SKenneth E. Jansen   if (N_restart_double>0)
88959599516SKenneth E. Jansen     for ( i = 0; i < N_restart_double; i++ )
89059599516SKenneth E. Jansen       {
89159599516SKenneth E. Jansen 	WriteLockD[i]=0;
89259599516SKenneth E. Jansen 	Dfield[i] = new double*[nppp];
89359599516SKenneth E. Jansen 
89459599516SKenneth E. Jansen 	paraD[i] = new int*[nppp];
89559599516SKenneth E. Jansen 
89659599516SKenneth E. Jansen 	fieldNameD[i] = new char[128];
89759599516SKenneth E. Jansen 	fileTypeD[i] = new char[128];
89859599516SKenneth E. Jansen 	dataTypeD[i] = new char[128];
89959599516SKenneth E. Jansen 	headerTypeD[i] = new char[128];
90059599516SKenneth E. Jansen       }
90159599516SKenneth E. Jansen 
90259599516SKenneth E. Jansen   if (N_restart_integer>0)
90359599516SKenneth E. Jansen     for ( i = 0; i < N_restart_integer; i++ )
90459599516SKenneth E. Jansen       {
90559599516SKenneth E. Jansen 	WriteLockI[i]=0;
90659599516SKenneth E. Jansen 	Ifield[i] = new int*[nppp];
90759599516SKenneth E. Jansen 
90859599516SKenneth E. Jansen 	paraI[i] = new int*[nppp];
90959599516SKenneth E. Jansen 
91059599516SKenneth E. Jansen 	fieldNameI[i] = new char[128];
91159599516SKenneth E. Jansen 	fileTypeI[i] = new char[128];
91259599516SKenneth E. Jansen 	dataTypeI[i] = new char[128];
91359599516SKenneth E. Jansen 	headerTypeI[i] = new char[128];
91459599516SKenneth E. Jansen       }
91559599516SKenneth E. Jansen 
91659599516SKenneth E. Jansen   ////////////////////////////////////////////////////////////////
91759599516SKenneth E. Jansen   // temporary fix: in the new version the double and integer
91859599516SKenneth E. Jansen   //                can mix and match to avoid the order confusion
91959599516SKenneth E. Jansen   ////////////////////////////////////////////////////////////////
92059599516SKenneth E. Jansen 
92159599516SKenneth E. Jansen   double_counter=0,int_counter=0;
92259599516SKenneth E. Jansen 
92359599516SKenneth E. Jansen   for ( i = 0; i < N_restart_double+N_restart_integer; i++ )
92459599516SKenneth E. Jansen     {
92559599516SKenneth E. Jansen       fgets( target, 1024, pFile );
92659599516SKenneth E. Jansen       temp = strtok( target, ";" );
92759599516SKenneth E. Jansen       token = strtok( temp, "," );
92859599516SKenneth E. Jansen       strcpy( S1, token );
92959599516SKenneth E. Jansen       token = strtok ( NULL, "," );
93059599516SKenneth E. Jansen       strcpy( S2, token );
93159599516SKenneth E. Jansen       token = strtok ( NULL, "," );
93259599516SKenneth E. Jansen       strcpy( S3, token );
93359599516SKenneth E. Jansen       token = strtok ( NULL, "," );
93459599516SKenneth E. Jansen       strcpy( S4, token );
93559599516SKenneth E. Jansen       token = strtok ( NULL, "," );
93659599516SKenneth E. Jansen       strcpy( S5, token );
93759599516SKenneth E. Jansen 
93859599516SKenneth E. Jansen       if (cscompare(S3,"double"))
93959599516SKenneth E. Jansen 	{
94059599516SKenneth E. Jansen 	  strcpy( fileTypeD[double_counter], S1 );
94159599516SKenneth E. Jansen 	  strcpy( fieldNameD[double_counter], S2 );
94259599516SKenneth E. Jansen 	  strcpy( dataTypeD[double_counter], S3 );
94359599516SKenneth E. Jansen 	  strcpy( headerTypeD[double_counter], S4 );
94459599516SKenneth E. Jansen 	  strcpy( numTemp, S5 );
94559599516SKenneth E. Jansen 	  expectD[double_counter] = atoi (numTemp);
94659599516SKenneth E. Jansen 	  double_counter++;
94759599516SKenneth E. Jansen 	}
94859599516SKenneth E. Jansen 
94959599516SKenneth E. Jansen       if (cscompare(S3,"integer"))
95059599516SKenneth E. Jansen 	{
95159599516SKenneth E. Jansen 	  strcpy( fileTypeI[int_counter], S1 );
95259599516SKenneth E. Jansen 	  strcpy( fieldNameI[int_counter], S2 );
95359599516SKenneth E. Jansen 	  strcpy( dataTypeI[int_counter], S3 );
95459599516SKenneth E. Jansen 	  strcpy( headerTypeI[int_counter], S4 );
95559599516SKenneth E. Jansen 	  strcpy( numTemp, S5 );
95659599516SKenneth E. Jansen 	  expectI[int_counter] = atoi (numTemp);
95759599516SKenneth E. Jansen 	  int_counter++;
95859599516SKenneth E. Jansen 	}
95959599516SKenneth E. Jansen     }
96059599516SKenneth E. Jansen 
96159599516SKenneth E. Jansen   MPI_Barrier(MPI_COMM_WORLD);
96259599516SKenneth E. Jansen   if(myrank==0){
96359599516SKenneth E. Jansen     printf("Starting to read some blocks (doubles) in the restart.dat.##.## files\n");
96459599516SKenneth E. Jansen   }
96559599516SKenneth E. Jansen 
96659599516SKenneth E. Jansen   for ( i = 0; i < N_restart_double; i++ )
96759599516SKenneth E. Jansen     {
96859599516SKenneth E. Jansen       for ( j = 0; j < nppp; j++ )
96959599516SKenneth E. Jansen 	{
97059599516SKenneth E. Jansen 
97159599516SKenneth E. Jansen           if(existsubdir) {
97259599516SKenneth E. Jansen             subdir = (startpart+j-1) / DIR_FANOUT;
97359599516SKenneth E. Jansen 	    sprintf(gfname,"./%d-procs_case/%d/restart.%d.%d",N_parts, subdir, N_steps,startpart+j);
97459599516SKenneth E. Jansen           }
97559599516SKenneth E. Jansen           else
97659599516SKenneth E. Jansen 	    sprintf(gfname,"./%d-procs_case/restart.%d.%d",N_parts, N_steps, startpart+j);
97759599516SKenneth E. Jansen 
97859599516SKenneth E. Jansen 	  openfile(gfname,"read",&irestart);
97959599516SKenneth E. Jansen 
98059599516SKenneth E. Jansen 	  for ( k = 0; k < 10; k++ )
98159599516SKenneth E. Jansen 	    iarray[k]=0;
98259599516SKenneth E. Jansen 
98359599516SKenneth E. Jansen 	  paraD[i][j] = new int[expectD[i]];
98459599516SKenneth E. Jansen 
98559599516SKenneth E. Jansen 	  iarray[0]=-1;
98659599516SKenneth E. Jansen 	  readheader( &irestart,
98759599516SKenneth E. Jansen 		       fieldNameD[i],
98859599516SKenneth E. Jansen 		       (void*)iarray,
98959599516SKenneth E. Jansen 		       &expectD[i],
99059599516SKenneth E. Jansen 		       "double",
99159599516SKenneth E. Jansen 		       "binary" );
99259599516SKenneth E. Jansen 
99359599516SKenneth E. Jansen 	  for ( k = 0; k < expectD[i]; k++ )
99459599516SKenneth E. Jansen 	    paraD[i][j][k] = iarray[k];
99559599516SKenneth E. Jansen 
99659599516SKenneth E. Jansen 	  if ( iarray[0]==-1 )
99759599516SKenneth E. Jansen 	      WriteLockD[i]=1;
99859599516SKenneth E. Jansen 	  if ( WriteLockD[i]==0 )
99959599516SKenneth E. Jansen 	    {
100059599516SKenneth E. Jansen 	      if ( cscompare("block",headerTypeD[i]) )
100159599516SKenneth E. Jansen 		{
100259599516SKenneth E. Jansen 		  if ( expectD[i]==1)
100359599516SKenneth E. Jansen 		    isize = paraD[i][j][0];
100459599516SKenneth E. Jansen 		  else
100559599516SKenneth E. Jansen 		    isize = paraD[i][j][0] * paraD[i][j][1];
100659599516SKenneth E. Jansen 
100759599516SKenneth E. Jansen 		  Dfield[i][j] = new double[isize];
100859599516SKenneth E. Jansen 		  readdatablock( &irestart,
100959599516SKenneth E. Jansen 				  fieldNameD[i],
101059599516SKenneth E. Jansen 				  (void*)Dfield[i][j],
101159599516SKenneth E. Jansen 				  &isize,
101259599516SKenneth E. Jansen 				  "double",
101359599516SKenneth E. Jansen 				  "binary" );
101459599516SKenneth E. Jansen 
101559599516SKenneth E. Jansen 		}
101659599516SKenneth E. Jansen 	    }
101759599516SKenneth E. Jansen 	  closefile(&irestart, "read");
101859599516SKenneth E. Jansen 	}
101959599516SKenneth E. Jansen     }
102059599516SKenneth E. Jansen 
102159599516SKenneth E. Jansen   MPI_Barrier(MPI_COMM_WORLD);
102259599516SKenneth E. Jansen   if(myrank==0){
102359599516SKenneth E. Jansen     printf("Starting to read some blocks (integers) in the restart.dat.##.## files\n");
102459599516SKenneth E. Jansen   }
102559599516SKenneth E. Jansen 
102659599516SKenneth E. Jansen 
102759599516SKenneth E. Jansen   for ( i = 0; i < N_restart_integer; i++ )
102859599516SKenneth E. Jansen     {
102959599516SKenneth E. Jansen       for ( j = 0; j < nppp; j++ )
103059599516SKenneth E. Jansen 	{
103159599516SKenneth E. Jansen 
103259599516SKenneth E. Jansen           if(existsubdir) {
103359599516SKenneth E. Jansen             subdir = (startpart+j-1) / DIR_FANOUT;
103459599516SKenneth E. Jansen 	    sprintf(gfname,"./%d-procs_case/%d/restart.%d.%d",N_parts, subdir, N_steps, startpart+j);
103559599516SKenneth E. Jansen           }
103659599516SKenneth E. Jansen           else
103759599516SKenneth E. Jansen 	    sprintf(gfname,"./%d-procs_case/restart.%d.%d",N_parts, N_steps, startpart+j);
103859599516SKenneth E. Jansen 
103959599516SKenneth E. Jansen 	  openfile(gfname,"read",&irestart);
104059599516SKenneth E. Jansen 
104159599516SKenneth E. Jansen 	  for ( k = 0; k < 10; k++ )
104259599516SKenneth E. Jansen 	    iarray[k]=0;
104359599516SKenneth E. Jansen 
104459599516SKenneth E. Jansen 	  paraI[i][j] = new int[expectI[i]];
104559599516SKenneth E. Jansen 
104659599516SKenneth E. Jansen 	  iarray[0]=-1;
104759599516SKenneth E. Jansen 	  readheader( &irestart,
104859599516SKenneth E. Jansen 		       fieldNameI[i],
104959599516SKenneth E. Jansen 		       (void*)iarray,
105059599516SKenneth E. Jansen 		       &expectI[i],
105159599516SKenneth E. Jansen 		       "integer",
105259599516SKenneth E. Jansen 		       "binary" );
105359599516SKenneth E. Jansen 
105459599516SKenneth E. Jansen 	  for ( k = 0; k < expectI[i]; k++ )
105559599516SKenneth E. Jansen 	    paraI[i][j][k] = iarray[k];
105659599516SKenneth E. Jansen 
105759599516SKenneth E. Jansen 	  if ( iarray[0]==-1 )
105859599516SKenneth E. Jansen 	      WriteLockI[i]=1;
105959599516SKenneth E. Jansen 	  if ( WriteLockI[i]==0 )
106059599516SKenneth E. Jansen 	    {
106159599516SKenneth E. Jansen 
106259599516SKenneth E. Jansen 	      if ( cscompare("block",headerTypeI[i]) )
106359599516SKenneth E. Jansen 		{
106459599516SKenneth E. Jansen 		  if ( expectI[i]==1)
106559599516SKenneth E. Jansen 		    isize = paraI[i][j][0];
106659599516SKenneth E. Jansen 		  else
106759599516SKenneth E. Jansen 		    isize = paraI[i][j][0] * paraI[i][j][1];
106859599516SKenneth E. Jansen 
106959599516SKenneth E. Jansen 		  Ifield[i][j] = new int[isize];
107059599516SKenneth E. Jansen 		  readdatablock( &irestart,
107159599516SKenneth E. Jansen 				  fieldNameI[i],
107259599516SKenneth E. Jansen 				  (void*)Ifield[i][j],
107359599516SKenneth E. Jansen 				  &isize,
107459599516SKenneth E. Jansen 				  "integer",
107559599516SKenneth E. Jansen 				  "binary" );
107659599516SKenneth E. Jansen 		}
107759599516SKenneth E. Jansen 	    }
107859599516SKenneth E. Jansen 	  closefile(&irestart, "read");
107959599516SKenneth E. Jansen 	}
108059599516SKenneth E. Jansen     }
108159599516SKenneth E. Jansen 
108259599516SKenneth E. Jansen   fclose(pFile);
108359599516SKenneth E. Jansen 
108459599516SKenneth E. Jansen   ///////////////////// Writing ///////////////////////////////
108559599516SKenneth E. Jansen 
108659599516SKenneth E. Jansen   int N_restart = N_restart_double + N_restart_integer;
108759599516SKenneth E. Jansen 
108859599516SKenneth E. Jansen   bzero((void*)fname,255);
108959599516SKenneth E. Jansen //MR CHANGE
109059599516SKenneth E. Jansen //  sprintf(fname,"./%d-procs_case/restart-dat.%d.%d",N_parts,N_steps,((int)(myrank/(N_procs/N_files))+1));
109159599516SKenneth 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));
109259599516SKenneth E. Jansen //MR CHANGE END
109359599516SKenneth E. Jansen   initphmpiio(&N_restart, &nppf, &N_files,&writeHandle, "write");
109459599516SKenneth E. Jansen //  initphmpiio(&N_restart, &nppf, &N_files,&writeHandle);
109559599516SKenneth E. Jansen   openfile(fname, "write", &writeHandle);
109659599516SKenneth E. Jansen 
109759599516SKenneth E. Jansen   MPI_Barrier(MPI_COMM_WORLD);
109859599516SKenneth E. Jansen   if(myrank==0){
109959599516SKenneth E. Jansen     printf("Starting to write some blocks (doubles) in the restart-dat.##.## files\n");
110059599516SKenneth E. Jansen   }
110159599516SKenneth E. Jansen 
110259599516SKenneth E. Jansen   for ( i = 0; i < N_restart_double; i++ )
110359599516SKenneth E. Jansen     {
110459599516SKenneth E. Jansen       for (  j = 0; j < nppp; j++  )
110559599516SKenneth E. Jansen 	{
110659599516SKenneth E. Jansen 
110759599516SKenneth E. Jansen 	  if (WriteLockD[i]==0)
110859599516SKenneth E. Jansen 	    {
110959599516SKenneth E. Jansen 	      GPID = startpart + j;
111059599516SKenneth E. Jansen 	      bzero((void*)fieldtag,255);
111159599516SKenneth E. Jansen 	      sprintf(fieldtag,"%s@%d",fieldNameD[i],GPID);
111259599516SKenneth E. Jansen 
111359599516SKenneth E. Jansen 	      if ( expectD[i]==1)
111459599516SKenneth E. Jansen 		isize = paraD[i][j][0];
111559599516SKenneth E. Jansen 	      else
111659599516SKenneth E. Jansen 		isize = paraD[i][j][0] * paraD[i][j][1];
111759599516SKenneth E. Jansen 
111859599516SKenneth E. Jansen 	      for ( k = 0; k < expectD[i]; k++ )
111959599516SKenneth E. Jansen 		iarray[k] = paraD[i][j][k];
112059599516SKenneth E. Jansen 
112159599516SKenneth E. Jansen 	      if ( cscompare("header",headerTypeD[i]) )
112259599516SKenneth E. Jansen 		isize = 0;
112359599516SKenneth E. Jansen 
112459599516SKenneth E. Jansen 	      writeheader( &writeHandle,
112559599516SKenneth E. Jansen 			    fieldtag,
112659599516SKenneth E. Jansen 			    (void*)iarray,
112759599516SKenneth E. Jansen 			    &expectD[i],
112859599516SKenneth E. Jansen 			    &isize,
112959599516SKenneth E. Jansen 			    "double",
113059599516SKenneth E. Jansen 			    "binary");
113159599516SKenneth E. Jansen 
113259599516SKenneth E. Jansen 	      writedatablock( &writeHandle,
113359599516SKenneth E. Jansen 			       fieldtag,
113459599516SKenneth E. Jansen 			       (void*)Dfield[i][j],
113559599516SKenneth E. Jansen 			       &isize,
113659599516SKenneth E. Jansen 			       "double",
113759599516SKenneth E. Jansen 			       "binary" );
113859599516SKenneth E. Jansen 	      if ( cscompare("block",headerTypeD[i]) )
113959599516SKenneth E. Jansen 		delete [] Dfield[i][j];
114059599516SKenneth E. Jansen 	    }
114159599516SKenneth E. Jansen 	  delete [] paraD[i][j];
114259599516SKenneth E. Jansen 	}
114359599516SKenneth E. Jansen     }
114459599516SKenneth E. Jansen 
114559599516SKenneth E. Jansen   MPI_Barrier(MPI_COMM_WORLD);
114659599516SKenneth E. Jansen   if(myrank==0){
114759599516SKenneth E. Jansen     printf("Starting to write some blocks (integers) in the restart.dat.##.## files\n");
114859599516SKenneth E. Jansen   }
114959599516SKenneth E. Jansen 
115059599516SKenneth E. Jansen   for ( i = 0; i < N_restart_integer; i++ )
115159599516SKenneth E. Jansen     {
115259599516SKenneth E. Jansen       for (  j = 0; j < nppp; j++  )
115359599516SKenneth E. Jansen 	{
115459599516SKenneth E. Jansen 
115559599516SKenneth E. Jansen 	  if (WriteLockI[i]==0)
115659599516SKenneth E. Jansen 	    {
115759599516SKenneth E. Jansen 	      GPID = startpart + j;
115859599516SKenneth E. Jansen 	      bzero((void*)fieldtag,255);
115959599516SKenneth E. Jansen 	      sprintf(fieldtag,"%s@%d",fieldNameI[i],GPID);
116059599516SKenneth E. Jansen 
116159599516SKenneth E. Jansen 	      if ( expectI[i]==1)
116259599516SKenneth E. Jansen 		isize = paraI[i][j][0];
116359599516SKenneth E. Jansen 	      else
116459599516SKenneth E. Jansen 		isize = paraI[i][j][0] * paraI[i][j][1];
116559599516SKenneth E. Jansen 
116659599516SKenneth E. Jansen 	      for ( k = 0; k < expectI[i]; k++ )
116759599516SKenneth E. Jansen 		iarray[k] = paraI[i][j][k];
116859599516SKenneth E. Jansen 
116959599516SKenneth E. Jansen 	      if ( cscompare("header",headerTypeI[i]) )
117059599516SKenneth E. Jansen 		isize = 0;
117159599516SKenneth E. Jansen 
117259599516SKenneth E. Jansen 	      writeheader( &writeHandle,
117359599516SKenneth E. Jansen 			    fieldtag,
117459599516SKenneth E. Jansen 			    (void*)iarray,
117559599516SKenneth E. Jansen 			    &expectI[i],
117659599516SKenneth E. Jansen 			    &isize,
117759599516SKenneth E. Jansen 			    "integer",
117859599516SKenneth E. Jansen 			    "binary");
117959599516SKenneth E. Jansen 
118059599516SKenneth E. Jansen 	      writedatablock( &writeHandle,
118159599516SKenneth E. Jansen 			       fieldtag,
118259599516SKenneth E. Jansen 			       (void*)Ifield[i][j],
118359599516SKenneth E. Jansen 			       &isize,
118459599516SKenneth E. Jansen 			       "integer",
118559599516SKenneth E. Jansen 			       "binary" );
118659599516SKenneth E. Jansen 
118759599516SKenneth E. Jansen 	      if ( cscompare("block",headerTypeI[i]) )
118859599516SKenneth E. Jansen 		delete [] Ifield[i][j];
118959599516SKenneth E. Jansen 	    }
119059599516SKenneth E. Jansen 	  delete [] paraI[i][j];
119159599516SKenneth E. Jansen 	}
119259599516SKenneth E. Jansen 
119359599516SKenneth E. Jansen     }
119459599516SKenneth E. Jansen 
119559599516SKenneth E. Jansen   MPI_Barrier(MPI_COMM_WORLD);
119659599516SKenneth E. Jansen   if(myrank==0){
119759599516SKenneth E. Jansen     printf("Closing restart-dat.##.## files\n");
119859599516SKenneth E. Jansen   }
119959599516SKenneth E. Jansen 
120059599516SKenneth E. Jansen   closefile(&writeHandle, "write");
120159599516SKenneth E. Jansen   finalizephmpiio(&writeHandle);
120259599516SKenneth E. Jansen 
120359599516SKenneth E. Jansen   MPI_Barrier(MPI_COMM_WORLD);
120459599516SKenneth E. Jansen   if(myrank==0){
120559599516SKenneth E. Jansen     printf("Free memory related to restart-dat.##.## files\n");
120659599516SKenneth E. Jansen   }
120759599516SKenneth E. Jansen 
120859599516SKenneth E. Jansen 
120959599516SKenneth E. Jansen   for ( i = 0; i < N_restart_double; i++ )
121059599516SKenneth E. Jansen     {
121159599516SKenneth E. Jansen       delete [] Dfield[i];
121259599516SKenneth E. Jansen       delete [] paraD[i];
121359599516SKenneth E. Jansen 
121459599516SKenneth E. Jansen       delete [] fieldNameD[i];
121559599516SKenneth E. Jansen       delete [] fileTypeD[i];
121659599516SKenneth E. Jansen       delete [] dataTypeD[i];
121759599516SKenneth E. Jansen       delete [] headerTypeD[i];
121859599516SKenneth E. Jansen     }
121959599516SKenneth E. Jansen 
122059599516SKenneth E. Jansen   for ( i = 0; i < N_restart_integer; i++ )
122159599516SKenneth E. Jansen     {
122259599516SKenneth E. Jansen       delete [] Ifield[i];
122359599516SKenneth E. Jansen       delete [] paraI[i];
122459599516SKenneth E. Jansen 
122559599516SKenneth E. Jansen       delete [] fieldNameI[i];
122659599516SKenneth E. Jansen       delete [] fileTypeI[i];
122759599516SKenneth E. Jansen       delete [] dataTypeI[i];
122859599516SKenneth E. Jansen       delete [] headerTypeI[i];
122959599516SKenneth E. Jansen     }
123059599516SKenneth E. Jansen 
123159599516SKenneth E. Jansen   delete [] Dfield;
123259599516SKenneth E. Jansen   delete [] Ifield;
123359599516SKenneth E. Jansen 
123459599516SKenneth E. Jansen   delete [] paraD;
123559599516SKenneth E. Jansen   delete [] paraI;
123659599516SKenneth E. Jansen 
123759599516SKenneth E. Jansen   delete [] expectD;
123859599516SKenneth E. Jansen   delete [] expectI;
123959599516SKenneth E. Jansen 
124059599516SKenneth E. Jansen   delete [] fieldNameD;
124159599516SKenneth E. Jansen   delete [] fileTypeD;
124259599516SKenneth E. Jansen   delete [] dataTypeD;
124359599516SKenneth E. Jansen   delete [] headerTypeD;
124459599516SKenneth E. Jansen 
124559599516SKenneth E. Jansen   delete [] fieldNameI;
124659599516SKenneth E. Jansen   delete [] fileTypeI;
124759599516SKenneth E. Jansen   delete [] dataTypeI;
124859599516SKenneth E. Jansen   delete [] headerTypeI;
124959599516SKenneth E. Jansen 
1250*13c09bf6SCameron Smith   delete [] WriteLockD;
1251*13c09bf6SCameron Smith   delete [] WriteLockI;
1252*13c09bf6SCameron Smith 
1253*13c09bf6SCameron Smith   delete [] interiorMark;
1254*13c09bf6SCameron Smith   delete [] boundaryMark;
1255*13c09bf6SCameron Smith   delete [] codesMark;
1256*13c09bf6SCameron Smith   delete [] valuesMark;
1257*13c09bf6SCameron Smith   delete [] numVariables;
125859599516SKenneth E. Jansen 
125959599516SKenneth E. Jansen   if (myrank==0)
126059599516SKenneth E. Jansen     {
126159599516SKenneth E. Jansen       printf("\nFinished transfer, please check data using:\n");
126259599516SKenneth E. Jansen       printf(" grep -a ': <' filename \n\n");
126359599516SKenneth E. Jansen       printf("Note that the size of the fields is computed based on previous geombc files\n");
126459599516SKenneth 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");
126559599516SKenneth E. Jansen     }
126659599516SKenneth E. Jansen 
126759599516SKenneth E. Jansen   MPI_Finalize();
126859599516SKenneth E. Jansen 
126959599516SKenneth E. Jansen }
127059599516SKenneth E. Jansen 
127159599516SKenneth E. Jansen 
1272