xref: /phasta/converterIO/converterO2N.cc (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
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