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