xref: /phasta/phastaIO/phastaIO.cc (revision b744cbcab9c8b1461938f078bf4a177da6ea0eca)
159599516SKenneth E. Jansen /*
259599516SKenneth E. Jansen  *
359599516SKenneth E. Jansen  * This is the SyncIO library that uses MPI-IO collective functions to
459599516SKenneth E. Jansen  * implement a flexible I/O checkpoint solution for a large number of
559599516SKenneth E. Jansen  * processors.
659599516SKenneth E. Jansen  *
759599516SKenneth E. Jansen  * Previous developer: Ning Liu         (liun2@cs.rpi.edu)
859599516SKenneth E. Jansen  *                     Jing Fu          (fuj@cs.rpi.edu)
959599516SKenneth E. Jansen  * Current developers: Michel Rasquin   (Michel.Rasquin@colorado.edu),
1059599516SKenneth E. Jansen  *                     Ben Matthews     (benjamin.a.matthews@colorado.edu)
1159599516SKenneth E. Jansen  *
1259599516SKenneth E. Jansen  */
1359599516SKenneth E. Jansen 
1459599516SKenneth E. Jansen #include <map>
1559599516SKenneth E. Jansen #include <vector>
1659599516SKenneth E. Jansen #include <string>
1759599516SKenneth E. Jansen #include <string.h>
1859599516SKenneth E. Jansen #include <ctype.h>
1959599516SKenneth E. Jansen #include <stdlib.h>
2059599516SKenneth E. Jansen #include <stdio.h>
2159599516SKenneth E. Jansen #include <math.h>
22d3337298SCameron Smith #include <sstream>
2359599516SKenneth E. Jansen #include "phastaIO.h"
2459599516SKenneth E. Jansen #include "mpi.h"
2559599516SKenneth E. Jansen #include "phiotmrc.h"
2659599516SKenneth E. Jansen 
2759599516SKenneth E. Jansen #define VERSION_INFO_HEADER_SIZE 8192
2859599516SKenneth E. Jansen #define DB_HEADER_SIZE 1024
2959599516SKenneth E. Jansen #define ONE_MEGABYTE 1048576
3059599516SKenneth E. Jansen #define TWO_MEGABYTE 2097152
3159599516SKenneth E. Jansen #define ENDIAN_TEST_NUMBER 12180 // Troy's Zip Code!!
3259599516SKenneth E. Jansen #define MAX_PHASTA_FILES 64
3359599516SKenneth E. Jansen #define MAX_PHASTA_FILE_NAME_LENGTH 1024
3459599516SKenneth E. Jansen #define MAX_FIELDS_NUMBER ((VERSION_INFO_HEADER_SIZE/MAX_FIELDS_NAME_LENGTH)-4) // The meta data include - MPI_IO_Tag, nFields, nFields*names of the fields, nppf
3559599516SKenneth E. Jansen // -3 for MPI_IO_Tag, nFields and nppf, -4 for extra security (former nFiles)
3659599516SKenneth E. Jansen #define MAX_FIELDS_NAME_LENGTH 128
3759599516SKenneth E. Jansen #define DefaultMHSize (4*ONE_MEGABYTE)
3859599516SKenneth E. Jansen //#define DefaultMHSize (8350) //For test
3959599516SKenneth E. Jansen #define LATEST_WRITE_VERSION 1
4059599516SKenneth E. Jansen #define inv1024sq 953.674316406e-9 // = 1/1024/1024
4159599516SKenneth E. Jansen int MasterHeaderSize = -1;
4259599516SKenneth E. Jansen 
4359599516SKenneth E. Jansen bool PRINT_PERF = false; // default print no perf results
4459599516SKenneth E. Jansen int irank = -1; // global rank, should never be manually manipulated
4559599516SKenneth E. Jansen int mysize = -1;
4659599516SKenneth E. Jansen 
4759599516SKenneth E. Jansen // Static variables are bad but used here to store the subcommunicator and associated variables
4859599516SKenneth E. Jansen // Prevent MPI_Comm_split to be called more than once, especially on BGQ with the V1R2M1 driver (leak detected in MPI_Comm_split - IBM working on it)
4959599516SKenneth E. Jansen static int s_assign_local_comm = 0;
5059599516SKenneth E. Jansen static MPI_Comm s_local_comm;
5159599516SKenneth E. Jansen static int s_local_size = -1;
5259599516SKenneth E. Jansen static int s_local_rank = -1;
5359599516SKenneth E. Jansen 
5459599516SKenneth E. Jansen // the following defines are for debug printf
5559599516SKenneth E. Jansen #define PHASTAIO_DEBUG 0 //default to not print any debugging info
5659599516SKenneth E. Jansen 
57fe03b87fSCameron Smith void phprintf(const char* fmt, ...) {
5859599516SKenneth E. Jansen #if PHASTAIO_DEBUG
59fe03b87fSCameron Smith   char format[1024];
60fe03b87fSCameron Smith   snprintf(format, sizeof(format), "phastaIO debug: %s", fmt);
61fe03b87fSCameron Smith   va_list ap;
62fe03b87fSCameron Smith   va_start(ap,fmt);
63fe03b87fSCameron Smith   vprintf(format,ap)
64fe03b87fSCameron Smith   va_end(ap);
6559599516SKenneth E. Jansen #endif
66fe03b87fSCameron Smith }
67fe03b87fSCameron Smith 
68fe03b87fSCameron Smith void phprintf_0(const char* fmt, ...) {
69fe03b87fSCameron Smith #if PHASTAIO_DEBUG
70fe03b87fSCameron Smith   int rank = 0;
71fe03b87fSCameron Smith   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
72fe03b87fSCameron Smith   if(rank == 0){
73fe03b87fSCameron Smith     char format[1024];
74fe03b87fSCameron Smith     snprintf(format, sizeof(format), "phastaIO debug: irank=0 %s", fmt);
75fe03b87fSCameron Smith     va_list ap;
76fe03b87fSCameron Smith     va_start(ap,s);
77fe03b87fSCameron Smith     vprintf(format, ap);
78fe03b87fSCameron Smith     va_end(ap);
79fe03b87fSCameron Smith   }
80fe03b87fSCameron Smith #endif
81fe03b87fSCameron Smith }
8259599516SKenneth E. Jansen 
8359599516SKenneth E. Jansen enum PhastaIO_Errors
8459599516SKenneth E. Jansen {
8559599516SKenneth E. Jansen 	MAX_PHASTA_FILES_EXCEEDED = -1,
8659599516SKenneth E. Jansen 	UNABLE_TO_OPEN_FILE = -2,
8759599516SKenneth E. Jansen 	NOT_A_MPI_FILE = -3,
8859599516SKenneth E. Jansen 	GPID_EXCEEDED = -4,
8910d56689SCameron Smith 	DATA_TYPE_ILLEGAL = -5
9059599516SKenneth E. Jansen };
9159599516SKenneth E. Jansen 
9259599516SKenneth E. Jansen using namespace std;
9359599516SKenneth E. Jansen 
9459599516SKenneth E. Jansen namespace{
9559599516SKenneth E. Jansen 
96961a4ff6SCameron Smith         map<int, std::string> LastHeaderKey;
9759599516SKenneth E. Jansen 	vector< FILE* > fileArray;
9859599516SKenneth E. Jansen 	vector< bool > byte_order;
9959599516SKenneth E. Jansen 	vector< int > header_type;
10059599516SKenneth E. Jansen 	int DataSize=0;
10159599516SKenneth E. Jansen 	bool LastHeaderNotFound = false;
10259599516SKenneth E. Jansen 	bool Wrong_Endian = false ;
10359599516SKenneth E. Jansen 	bool Strict_Error = false ;
10459599516SKenneth E. Jansen 	bool binary_format = true;
10559599516SKenneth E. Jansen 
10659599516SKenneth E. Jansen 	/***********************************************************************/
10759599516SKenneth E. Jansen 	/***************** NEW PHASTA IO CODE STARTS HERE **********************/
10859599516SKenneth E. Jansen 	/***********************************************************************/
10959599516SKenneth E. Jansen 
11059599516SKenneth E. Jansen 	typedef struct
11159599516SKenneth E. Jansen 	{
11259599516SKenneth E. Jansen 		char filename[MAX_PHASTA_FILE_NAME_LENGTH];   /* defafults to 1024 */
1132dd307a1SCameron Smith 		unsigned long my_offset;
1142dd307a1SCameron Smith 		unsigned long next_start_address;
1152dd307a1SCameron Smith 		unsigned long **my_offset_table;
1162dd307a1SCameron Smith 		unsigned long **my_read_table;
11759599516SKenneth E. Jansen 
11859599516SKenneth E. Jansen 		double * double_chunk;
11959599516SKenneth E. Jansen 		double * read_double_chunk;
12059599516SKenneth E. Jansen 
12159599516SKenneth E. Jansen 		int field_count;
12259599516SKenneth E. Jansen 		int part_count;
12359599516SKenneth E. Jansen 		int read_field_count;
12459599516SKenneth E. Jansen 		int read_part_count;
12559599516SKenneth E. Jansen 		int GPid;
12659599516SKenneth E. Jansen 		int start_id;
12759599516SKenneth E. Jansen 
12859599516SKenneth E. Jansen 		int mhsize;
12959599516SKenneth E. Jansen 
13059599516SKenneth E. Jansen 		int myrank;
13159599516SKenneth E. Jansen 		int numprocs;
13259599516SKenneth E. Jansen 		int local_myrank;
13359599516SKenneth E. Jansen 		int local_numprocs;
13459599516SKenneth E. Jansen 
13559599516SKenneth E. Jansen 		int nppp;
13659599516SKenneth E. Jansen 		int nPPF;
13759599516SKenneth E. Jansen 		int nFiles;
13859599516SKenneth E. Jansen 		int nFields;
13959599516SKenneth E. Jansen 
14059599516SKenneth E. Jansen 		int * int_chunk;
14159599516SKenneth E. Jansen 		int * read_int_chunk;
14259599516SKenneth E. Jansen 
14359599516SKenneth E. Jansen 		int Wrong_Endian;                            /* default to false */
14459599516SKenneth E. Jansen 		char * master_header;
14559599516SKenneth E. Jansen 		MPI_File file_handle;
14659599516SKenneth E. Jansen 		MPI_Comm local_comm;
14759599516SKenneth E. Jansen 	} phastaio_file_t;
14859599516SKenneth E. Jansen 
14959599516SKenneth E. Jansen 	typedef struct
15059599516SKenneth E. Jansen 	{
15159599516SKenneth E. Jansen 		int nppf, nfields;
15259599516SKenneth E. Jansen 		char * masterHeader;
15359599516SKenneth E. Jansen 	}serial_file;
15459599516SKenneth E. Jansen 
15559599516SKenneth E. Jansen 	serial_file *SerialFile;
15659599516SKenneth E. Jansen 	phastaio_file_t *PhastaIOActiveFiles[MAX_PHASTA_FILES];
15759599516SKenneth E. Jansen 	int PhastaIONextActiveIndex = 0; /* indicates next index to allocate */
15859599516SKenneth E. Jansen 
15959599516SKenneth E. Jansen 	// the caller has the responsibility to delete the returned string
16059599516SKenneth E. Jansen 	// TODO: StringStipper("nbc value? ") returns NULL?
16159599516SKenneth E. Jansen 	char*
16259599516SKenneth E. Jansen 		StringStripper( const char  istring[] ) {
16359599516SKenneth E. Jansen 
16459599516SKenneth E. Jansen 			int length = strlen( istring );
16559599516SKenneth E. Jansen 
16659599516SKenneth E. Jansen 			char* dest = (char *)malloc( length + 1 );
16759599516SKenneth E. Jansen 
16859599516SKenneth E. Jansen 			strcpy( dest, istring );
16959599516SKenneth E. Jansen 			dest[ length ] = '\0';
17059599516SKenneth E. Jansen 
17159599516SKenneth E. Jansen 			if ( char* p = strpbrk( dest, " ") )
17259599516SKenneth E. Jansen 				*p = '\0';
17359599516SKenneth E. Jansen 
17459599516SKenneth E. Jansen 			return dest;
17559599516SKenneth E. Jansen 		}
17659599516SKenneth E. Jansen 
17759599516SKenneth E. Jansen 	inline int
17859599516SKenneth E. Jansen 		cscompare( const char teststring[],
17959599516SKenneth E. Jansen 				const char targetstring[] ) {
18059599516SKenneth E. Jansen 
18159599516SKenneth E. Jansen 			char* s1 = const_cast<char*>(teststring);
18259599516SKenneth E. Jansen 			char* s2 = const_cast<char*>(targetstring);
18359599516SKenneth E. Jansen 
18459599516SKenneth E. Jansen 			while( *s1 == ' ') s1++;
18559599516SKenneth E. Jansen 			while( *s2 == ' ') s2++;
18659599516SKenneth E. Jansen 			while( ( *s1 )
18759599516SKenneth E. Jansen 					&& ( *s2 )
18859599516SKenneth E. Jansen 					&& ( *s2 != '?')
18959599516SKenneth E. Jansen 					&& ( tolower( *s1 )==tolower( *s2 ) ) ) {
19059599516SKenneth E. Jansen 				s1++;
19159599516SKenneth E. Jansen 				s2++;
19259599516SKenneth E. Jansen 				while( *s1 == ' ') s1++;
19359599516SKenneth E. Jansen 				while( *s2 == ' ') s2++;
19459599516SKenneth E. Jansen 			}
19559599516SKenneth E. Jansen 			if ( !( *s1 ) || ( *s1 == '?') ) return 1;
19659599516SKenneth E. Jansen 			else return 0;
19759599516SKenneth E. Jansen 		}
19859599516SKenneth E. Jansen 
19959599516SKenneth E. Jansen 	inline void
20059599516SKenneth E. Jansen 		isBinary( const char iotype[] ) {
20159599516SKenneth E. Jansen 
20259599516SKenneth E. Jansen 			char* fname = StringStripper( iotype );
20359599516SKenneth E. Jansen 			if ( cscompare( fname, "binary" ) ) binary_format = true;
20459599516SKenneth E. Jansen 			else binary_format = false;
20559599516SKenneth E. Jansen 			free (fname);
20659599516SKenneth E. Jansen 
20759599516SKenneth E. Jansen 		}
20859599516SKenneth E. Jansen 
20959599516SKenneth E. Jansen 	inline size_t
21059599516SKenneth E. Jansen 		typeSize( const char typestring[] ) {
21159599516SKenneth E. Jansen 
21259599516SKenneth E. Jansen 			char* ts1 = StringStripper( typestring );
21359599516SKenneth E. Jansen 
21459599516SKenneth E. Jansen 			if ( cscompare( "integer", ts1 ) ) {
21559599516SKenneth E. Jansen 				free (ts1);
21659599516SKenneth E. Jansen 				return sizeof(int);
21759599516SKenneth E. Jansen 			} else if ( cscompare( "double", ts1 ) ) {
21859599516SKenneth E. Jansen 				free (ts1);
21959599516SKenneth E. Jansen 				return sizeof( double );
22059599516SKenneth E. Jansen 			} else {
22159599516SKenneth E. Jansen 				free (ts1);
22259599516SKenneth E. Jansen 				fprintf(stderr,"unknown type : %s\n",ts1);
22359599516SKenneth E. Jansen 				return 0;
22459599516SKenneth E. Jansen 			}
22559599516SKenneth E. Jansen 		}
22659599516SKenneth E. Jansen 
22759599516SKenneth E. Jansen 	int
22859599516SKenneth E. Jansen 		readHeader( FILE*       fileObject,
22959599516SKenneth E. Jansen 				const char  phrase[],
23059599516SKenneth E. Jansen 				int*        params,
23159599516SKenneth E. Jansen 				int         expect ) {
23259599516SKenneth E. Jansen 
23359599516SKenneth E. Jansen 			char* text_header;
23459599516SKenneth E. Jansen 			char* token;
23559599516SKenneth E. Jansen 			char Line[1024];
23659599516SKenneth E. Jansen 			char junk;
23759599516SKenneth E. Jansen 			bool FOUND = false ;
23859599516SKenneth E. Jansen 			int real_length;
23959599516SKenneth E. Jansen 			int skip_size, integer_value;
24059599516SKenneth E. Jansen 			int rewind_count=0;
24159599516SKenneth E. Jansen 
24259599516SKenneth E. Jansen 			if( !fgets( Line, 1024, fileObject ) && feof( fileObject ) ) {
24359599516SKenneth E. Jansen 				rewind( fileObject );
24459599516SKenneth E. Jansen 				clearerr( fileObject );
24559599516SKenneth E. Jansen 				rewind_count++;
24659599516SKenneth E. Jansen 				fgets( Line, 1024, fileObject );
24759599516SKenneth E. Jansen 			}
24859599516SKenneth E. Jansen 
24959599516SKenneth E. Jansen 			while( !FOUND  && ( rewind_count < 2 ) )  {
25059599516SKenneth E. Jansen 				if ( ( Line[0] != '\n' ) && ( real_length = strcspn( Line, "#" )) ){
25159599516SKenneth E. Jansen 					text_header = (char *)malloc( real_length + 1 );
25259599516SKenneth E. Jansen 
25359599516SKenneth E. Jansen 					strncpy( text_header, Line, real_length );
25459599516SKenneth E. Jansen 					text_header[ real_length ] =static_cast<char>(NULL);
25559599516SKenneth E. Jansen 					token = strtok ( text_header, ":" );
25659599516SKenneth E. Jansen 					//if( cscompare( phrase , token ) ) {
25759599516SKenneth E. Jansen                                         // Double comparison required because different fields can still start
25859599516SKenneth E. Jansen                                         // with the same name for mixed meshes (nbc code, nbc values, etc).
25959599516SKenneth E. Jansen                                         // Would be easy to fix cscompare instead but would it break sth else?
26059599516SKenneth E. Jansen 					if( cscompare( phrase , token ) && cscompare( token , phrase ) ) {
26159599516SKenneth E. Jansen 						FOUND = true ;
26259599516SKenneth E. Jansen 						token = strtok( NULL, " ,;<>" );
26359599516SKenneth E. Jansen 						skip_size = atoi( token );
26459599516SKenneth E. Jansen 						int i;
26559599516SKenneth E. Jansen 						for( i=0; i < expect && ( token = strtok( NULL," ,;<>") ); i++) {
26659599516SKenneth E. Jansen 							params[i] = atoi( token );
26759599516SKenneth E. Jansen 						}
26859599516SKenneth E. Jansen 						if ( i < expect ) {
26959599516SKenneth E. Jansen 							fprintf(stderr,"Aloha Expected # of ints not found for: %s\n",phrase );
27059599516SKenneth E. Jansen 						}
27159599516SKenneth E. Jansen 					} else if ( cscompare(token,"byteorder magic number") ) {
27259599516SKenneth E. Jansen 						if ( binary_format ) {
27359599516SKenneth E. Jansen 							fread((void*)&integer_value,sizeof(int),1,fileObject);
27459599516SKenneth E. Jansen 							fread( &junk, sizeof(char), 1 , fileObject );
27559599516SKenneth E. Jansen 							if ( 362436 != integer_value ) Wrong_Endian = true;
27659599516SKenneth E. Jansen 						} else{
27759599516SKenneth E. Jansen 							fscanf(fileObject, "%d\n", &integer_value );
27859599516SKenneth E. Jansen 						}
27959599516SKenneth E. Jansen 					} else {
28059599516SKenneth E. Jansen 						/* some other header, so just skip over */
28159599516SKenneth E. Jansen 						token = strtok( NULL, " ,;<>" );
28259599516SKenneth E. Jansen 						skip_size = atoi( token );
28359599516SKenneth E. Jansen 						if ( binary_format)
28459599516SKenneth E. Jansen 							fseek( fileObject, skip_size, SEEK_CUR );
28559599516SKenneth E. Jansen 						else
28659599516SKenneth E. Jansen 							for( int gama=0; gama < skip_size; gama++ )
28759599516SKenneth E. Jansen 								fgets( Line, 1024, fileObject );
28859599516SKenneth E. Jansen 					}
28959599516SKenneth E. Jansen 					free (text_header);
29059599516SKenneth E. Jansen 				} // end of if before while loop
29159599516SKenneth E. Jansen 
29259599516SKenneth E. Jansen 				if ( !FOUND )
29359599516SKenneth E. Jansen 					if( !fgets( Line, 1024, fileObject ) && feof( fileObject ) ) {
29459599516SKenneth E. Jansen 						rewind( fileObject );
29559599516SKenneth E. Jansen 						clearerr( fileObject );
29659599516SKenneth E. Jansen 						rewind_count++;
29759599516SKenneth E. Jansen 						fgets( Line, 1024, fileObject );
29859599516SKenneth E. Jansen 					}
29959599516SKenneth E. Jansen 			}
30059599516SKenneth E. Jansen 
30159599516SKenneth E. Jansen 			if ( !FOUND ) {
30259599516SKenneth E. Jansen 				//fprintf(stderr, "Error: Could not find: %s\n", phrase);
30359599516SKenneth E. Jansen 				if(irank == 0) printf("WARNING: Could not find: %s\n", phrase);
30459599516SKenneth E. Jansen 				return 1;
30559599516SKenneth E. Jansen 			}
30659599516SKenneth E. Jansen 			return 0;
30759599516SKenneth E. Jansen 		}
30859599516SKenneth E. Jansen 
30959599516SKenneth E. Jansen } // end unnamed namespace
31059599516SKenneth E. Jansen 
31159599516SKenneth E. Jansen 
31259599516SKenneth E. Jansen // begin of publicly visible functions
31359599516SKenneth E. Jansen 
31459599516SKenneth E. Jansen /**
31559599516SKenneth E. Jansen  * This function takes a long long pointer and assign (start) phiotmrc value to it
31659599516SKenneth E. Jansen  */
31759599516SKenneth E. Jansen void startTimer(double* start) {
31859599516SKenneth E. Jansen 
31959599516SKenneth E. Jansen         if( !PRINT_PERF ) return;
32059599516SKenneth E. Jansen 
32159599516SKenneth E. Jansen 	MPI_Barrier(MPI_COMM_WORLD);
32259599516SKenneth E. Jansen 	*start =  phiotmrc();
32359599516SKenneth E. Jansen }
32459599516SKenneth E. Jansen 
32559599516SKenneth E. Jansen /**
32659599516SKenneth E. Jansen  * This function takes a long long pointer and assign (end) phiotmrc value to it
32759599516SKenneth E. Jansen  */
32859599516SKenneth E. Jansen void endTimer(double* end) {
32959599516SKenneth E. Jansen 
33059599516SKenneth E. Jansen         if( !PRINT_PERF ) return;
33159599516SKenneth E. Jansen 
33259599516SKenneth E. Jansen 	*end = phiotmrc();
33359599516SKenneth E. Jansen 	MPI_Barrier(MPI_COMM_WORLD);
33459599516SKenneth E. Jansen }
33559599516SKenneth E. Jansen 
33659599516SKenneth E. Jansen /**
33759599516SKenneth E. Jansen  * choose to print some performance results (or not) according to
33859599516SKenneth E. Jansen  * the PRINT_PERF macro
33959599516SKenneth E. Jansen  */
34059599516SKenneth E. Jansen void printPerf(
34159599516SKenneth E. Jansen 		const char* func_name,
34259599516SKenneth E. Jansen 		double start,
34359599516SKenneth E. Jansen 		double end,
3442dd307a1SCameron Smith 		unsigned long datasize,
34559599516SKenneth E. Jansen 		int printdatainfo,
34659599516SKenneth E. Jansen 		const char* extra_msg) {
34759599516SKenneth E. Jansen 
34859599516SKenneth E. Jansen 	if( !PRINT_PERF ) return;
34959599516SKenneth E. Jansen 
3502dd307a1SCameron Smith 	unsigned long data_size = datasize;
35159599516SKenneth E. Jansen 
35259599516SKenneth E. Jansen 	double time = end - start;
35359599516SKenneth E. Jansen 
3542dd307a1SCameron Smith 	unsigned long isizemin,isizemax,isizetot;
35559599516SKenneth E. Jansen 	double sizemin,sizemax,sizeavg,sizetot,rate;
35659599516SKenneth E. Jansen 	double tmin, tmax, tavg, ttot;
35759599516SKenneth E. Jansen 
35859599516SKenneth E. Jansen 	MPI_Allreduce(&time, &tmin,1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD);
35959599516SKenneth E. Jansen 	MPI_Allreduce(&time, &tmax,1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);
36059599516SKenneth E. Jansen 	MPI_Allreduce(&time, &ttot,1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
36159599516SKenneth E. Jansen 	tavg = ttot/mysize;
36259599516SKenneth E. Jansen 
36359599516SKenneth E. Jansen 	if(irank == 0) {
36459599516SKenneth E. Jansen 		if ( PhastaIONextActiveIndex == 0 ) printf("** 1PFPP ");
36559599516SKenneth E. Jansen 		else  printf("** syncIO ");
36659599516SKenneth E. Jansen 		printf("%s(): Tmax = %f sec, Tmin = %f sec, Tavg = %f sec", func_name, tmax, tmin, tavg);
36759599516SKenneth E. Jansen 	}
36859599516SKenneth E. Jansen 
36959599516SKenneth E. Jansen 	if(printdatainfo == 1) { // if printdatainfo ==1, compute I/O rate and block size
37059599516SKenneth E. Jansen 		MPI_Allreduce(&data_size,&isizemin,1,MPI_LONG_LONG_INT,MPI_MIN,MPI_COMM_WORLD);
37159599516SKenneth E. Jansen 		MPI_Allreduce(&data_size,&isizemax,1,MPI_LONG_LONG_INT,MPI_MAX,MPI_COMM_WORLD);
37259599516SKenneth E. Jansen 		MPI_Allreduce(&data_size,&isizetot,1,MPI_LONG_LONG_INT,MPI_SUM,MPI_COMM_WORLD);
37359599516SKenneth E. Jansen 
37459599516SKenneth E. Jansen 		sizemin=(double)(isizemin*inv1024sq);
37559599516SKenneth E. Jansen 		sizemax=(double)(isizemax*inv1024sq);
37659599516SKenneth E. Jansen 		sizetot=(double)(isizetot*inv1024sq);
37759599516SKenneth E. Jansen 		sizeavg=(double)(1.0*sizetot/mysize);
37859599516SKenneth E. Jansen 		rate=(double)(1.0*sizetot/tmax);
37959599516SKenneth E. Jansen 
38059599516SKenneth E. Jansen 		if( irank == 0) {
38159599516SKenneth E. Jansen 			printf(", Rate = %f MB/s [%s] \n \t\t\t block size: Min= %f MB; Max= %f MB; Avg= %f MB; Tot= %f MB\n", rate, extra_msg, sizemin,sizemax,sizeavg,sizetot);
38259599516SKenneth E. Jansen 		}
38359599516SKenneth E. Jansen 	}
38459599516SKenneth E. Jansen 	else {
38559599516SKenneth E. Jansen 		if(irank == 0) {
38659599516SKenneth E. Jansen 			printf(" \n");
38759599516SKenneth E. Jansen 			//printf(" (%s) \n", extra_msg);
38859599516SKenneth E. Jansen 		}
38959599516SKenneth E. Jansen 	}
39059599516SKenneth E. Jansen }
39159599516SKenneth E. Jansen 
39259599516SKenneth E. Jansen /**
39359599516SKenneth E. Jansen  * This function is normally called at the beginning of a read operation, before
39459599516SKenneth E. Jansen  * init function.
39559599516SKenneth E. Jansen  * This function (uses rank 0) reads out nfields, nppf, master header size,
39659599516SKenneth E. Jansen  * endianess and allocates for masterHeader string.
39759599516SKenneth E. Jansen  * These values are essential for following read operations. Rank 0 will bcast
39859599516SKenneth E. Jansen  * these values to other ranks in the commm world
39959599516SKenneth E. Jansen  *
40059599516SKenneth E. Jansen  * If the file set is of old POSIX format, it would throw error and exit
40159599516SKenneth E. Jansen  */
40259599516SKenneth E. Jansen void queryphmpiio(const char filename[],int *nfields, int *nppf)
40359599516SKenneth E. Jansen {
40459599516SKenneth E. Jansen 	MPI_Comm_rank(MPI_COMM_WORLD, &irank);
40559599516SKenneth E. Jansen 	MPI_Comm_size(MPI_COMM_WORLD, &mysize);
40659599516SKenneth E. Jansen 
40759599516SKenneth E. Jansen 	if(irank == 0) {
40859599516SKenneth E. Jansen 		FILE * fileHandle;
40959599516SKenneth E. Jansen 		char* fname = StringStripper( filename );
41059599516SKenneth E. Jansen 
41159599516SKenneth E. Jansen 		fileHandle = fopen (fname,"rb");
41259599516SKenneth E. Jansen 		if (fileHandle == NULL ) {
41359599516SKenneth E. Jansen 			printf("\nError: File %s doesn't exist! Please check!\n",fname);
41459599516SKenneth E. Jansen 		}
41559599516SKenneth E. Jansen 		else {
41659599516SKenneth E. Jansen 			SerialFile =(serial_file *)calloc( 1,  sizeof( serial_file) );
41759599516SKenneth E. Jansen 			int meta_size_limit = VERSION_INFO_HEADER_SIZE;
41859599516SKenneth E. Jansen 			SerialFile->masterHeader = (char *)malloc( meta_size_limit );
41959599516SKenneth E. Jansen 			fread(SerialFile->masterHeader, 1, meta_size_limit, fileHandle);
42059599516SKenneth E. Jansen 
42159599516SKenneth E. Jansen 			char read_out_tag[MAX_FIELDS_NAME_LENGTH];
42259599516SKenneth E. Jansen 			char version[MAX_FIELDS_NAME_LENGTH/4];
42359599516SKenneth E. Jansen 			int mhsize;
42459599516SKenneth E. Jansen 			char * token;
42559599516SKenneth E. Jansen 			int magic_number;
42659599516SKenneth E. Jansen 
42759599516SKenneth E. Jansen 			memcpy( read_out_tag,
42859599516SKenneth E. Jansen 					SerialFile->masterHeader,
42959599516SKenneth E. Jansen 					MAX_FIELDS_NAME_LENGTH-1 );
43059599516SKenneth E. Jansen 
43159599516SKenneth E. Jansen 			if ( cscompare ("MPI_IO_Tag",read_out_tag) ) {
43259599516SKenneth E. Jansen 				// Test endianess ...
43359599516SKenneth E. Jansen 				memcpy (&magic_number,
43459599516SKenneth E. Jansen 						SerialFile->masterHeader + sizeof("MPI_IO_Tag : ")-1, //-1 sizeof returns the size of the string+1 for "\0"
43559599516SKenneth E. Jansen 						sizeof(int) );                                        // masterheader should look like "MPI_IO_Tag : 12180 " with 12180 in binary format
43659599516SKenneth E. Jansen 
43759599516SKenneth E. Jansen 				if ( magic_number != ENDIAN_TEST_NUMBER ) {
43859599516SKenneth E. Jansen 					printf("Endian is different!\n");
43959599516SKenneth E. Jansen 					// Will do swap later
44059599516SKenneth E. Jansen 				}
44159599516SKenneth E. Jansen 
44259599516SKenneth E. Jansen 				// test version, old version, default masterheader size is 4M
44359599516SKenneth E. Jansen 				// newer version masterheader size is read from first line
44459599516SKenneth E. Jansen 				memcpy(version,
44559599516SKenneth E. Jansen 						SerialFile->masterHeader + MAX_FIELDS_NAME_LENGTH/2,
44659599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH/4 - 1); //TODO: why -1?
44759599516SKenneth E. Jansen 
44859599516SKenneth E. Jansen 				if( cscompare ("version",version) ) {
44959599516SKenneth E. Jansen 					// if there is "version" tag in the file, then it is newer format
45059599516SKenneth E. Jansen 					// read master header size from here, otherwise use default
45159599516SKenneth E. Jansen 					// Note: if version is "1", we know mhsize is at 3/4 place...
45259599516SKenneth E. Jansen 
45359599516SKenneth E. Jansen 					token = strtok(version, ":");
45459599516SKenneth E. Jansen 					token = strtok(NULL, " ,;<>" );
45559599516SKenneth E. Jansen 					int iversion = atoi(token);
45659599516SKenneth E. Jansen 
45759599516SKenneth E. Jansen 					if( iversion == 1) {
45859599516SKenneth E. Jansen 						memcpy( &mhsize,
45959599516SKenneth E. Jansen 								SerialFile->masterHeader + MAX_FIELDS_NAME_LENGTH/4*3 + sizeof("mhsize : ")-1,
46059599516SKenneth E. Jansen 								sizeof(int));
46159599516SKenneth E. Jansen 						if ( magic_number != ENDIAN_TEST_NUMBER )
46259599516SKenneth E. Jansen 							SwapArrayByteOrder(&mhsize, sizeof(int), 1);
46359599516SKenneth E. Jansen 
46459599516SKenneth E. Jansen 						if( mhsize > DefaultMHSize ) {
46559599516SKenneth E. Jansen 							//if actual headersize is larger than default, let's re-read
46659599516SKenneth E. Jansen 							free(SerialFile->masterHeader);
46759599516SKenneth E. Jansen 							SerialFile->masterHeader = (char *)malloc(mhsize);
46859599516SKenneth E. Jansen 							fseek(fileHandle, 0, SEEK_SET); // reset the file stream position
46959599516SKenneth E. Jansen 							fread(SerialFile->masterHeader,1,mhsize,fileHandle);
47059599516SKenneth E. Jansen 						}
47159599516SKenneth E. Jansen 					}
47259599516SKenneth E. Jansen 					//TODO: check if this is a valid int??
47359599516SKenneth E. Jansen 					MasterHeaderSize = mhsize;
47459599516SKenneth E. Jansen 				}
47559599516SKenneth E. Jansen 				else { // else it's version 0's format w/o version tag, implicating MHSize=4M
47659599516SKenneth E. Jansen 					MasterHeaderSize = DefaultMHSize;
47759599516SKenneth E. Jansen 				}
47859599516SKenneth E. Jansen 
47959599516SKenneth E. Jansen 				memcpy( read_out_tag,
48059599516SKenneth E. Jansen 						SerialFile->masterHeader+MAX_FIELDS_NAME_LENGTH+1,
48159599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH ); //TODO: why +1
48259599516SKenneth E. Jansen 
48359599516SKenneth E. Jansen 				// Read in # fields ...
48459599516SKenneth E. Jansen 				token = strtok( read_out_tag, ":" );
48559599516SKenneth E. Jansen 				token = strtok( NULL," ,;<>" );
48659599516SKenneth E. Jansen 				*nfields = atoi( token );
48759599516SKenneth E. Jansen 				if ( *nfields > MAX_FIELDS_NUMBER) {
48859599516SKenneth E. Jansen 					printf("Error queryphmpiio: nfields is larger than MAX_FIELDS_NUMBER!\n");
48959599516SKenneth E. Jansen 				}
49059599516SKenneth E. Jansen 				SerialFile->nfields=*nfields; //TODO: sanity check of this int?
49159599516SKenneth E. Jansen 
49259599516SKenneth E. Jansen 				memcpy( read_out_tag,
49359599516SKenneth E. Jansen 						SerialFile->masterHeader + MAX_FIELDS_NAME_LENGTH * 2
49459599516SKenneth E. Jansen 						+ *nfields * MAX_FIELDS_NAME_LENGTH,
49559599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH);
49659599516SKenneth E. Jansen 
49759599516SKenneth E. Jansen 				token = strtok( read_out_tag, ":" );
49859599516SKenneth E. Jansen 				token = strtok( NULL," ,;<>" );
49959599516SKenneth E. Jansen 				*nppf = atoi( token );
50059599516SKenneth E. Jansen 				SerialFile->nppf=*nppf; //TODO: sanity check of int
50159599516SKenneth E. Jansen 			} // end of if("MPI_IO_TAG")
50259599516SKenneth E. Jansen 			else {
50359599516SKenneth E. Jansen 				printf("Error queryphmpiio: The file you opened is not of syncIO new format, please check! read_out_tag = %s\n",read_out_tag);
50459599516SKenneth E. Jansen                                 exit(1);
50559599516SKenneth E. Jansen 			}
50659599516SKenneth E. Jansen 			fclose(fileHandle);
50759599516SKenneth E. Jansen                         free(SerialFile->masterHeader);
50859599516SKenneth E. Jansen                         free(SerialFile);
50959599516SKenneth E. Jansen 		} //end of else
51059599516SKenneth E. Jansen                 free(fname);
51159599516SKenneth E. Jansen 	}
51259599516SKenneth E. Jansen 
51359599516SKenneth E. Jansen 	// Bcast value to every one
51459599516SKenneth E. Jansen 	MPI_Bcast( nfields, 1, MPI_INT, 0, MPI_COMM_WORLD );
51559599516SKenneth E. Jansen 	MPI_Bcast( nppf, 1, MPI_INT, 0, MPI_COMM_WORLD );
51659599516SKenneth E. Jansen 	MPI_Bcast( &MasterHeaderSize, 1, MPI_INT, 0, MPI_COMM_WORLD );
51759599516SKenneth E. Jansen 	phprintf("Info queryphmpiio: myrank = %d, MasterHeaderSize = %d", irank, MasterHeaderSize);
51859599516SKenneth E. Jansen }
51959599516SKenneth E. Jansen 
52059599516SKenneth E. Jansen /**
52159599516SKenneth E. Jansen  * This function computes the right master header size (round to size of 2^n).
52259599516SKenneth E. Jansen  * This is only needed for file format version 1 in "write" mode.
52359599516SKenneth E. Jansen  */
52459599516SKenneth E. Jansen int computeMHSize(int nfields, int nppf, int version) {
52510d56689SCameron Smith 	int mhsize=0;
52659599516SKenneth E. Jansen 	if(version == 1) {
52759599516SKenneth E. Jansen 		//int meta_info_size = (2+nfields+1) * MAX_FIELDS_NAME_LENGTH; // 2 is MPI_IO_TAG and nFields, the others 1 is nppf
52859599516SKenneth E. Jansen 		int meta_info_size = VERSION_INFO_HEADER_SIZE;
5292dd307a1SCameron Smith 		int actual_size =  nfields * nppf * sizeof(unsigned long) + meta_info_size;
53059599516SKenneth E. Jansen 		//printf("actual_size = %d, offset table size = %d\n", actual_size,  nfields * nppf * sizeof(long long));
53159599516SKenneth E. Jansen 		if (actual_size > DefaultMHSize) {
53259599516SKenneth E. Jansen 			mhsize = (int) ceil( (double) actual_size/DefaultMHSize); // it's rounded to ceiling of this value
53359599516SKenneth E. Jansen 			mhsize *= DefaultMHSize;
53459599516SKenneth E. Jansen 		}
53559599516SKenneth E. Jansen 		else {
53659599516SKenneth E. Jansen 			mhsize = DefaultMHSize;
53759599516SKenneth E. Jansen 		}
538*b744cbcaSCameron Smith 	} else {
539*b744cbcaSCameron Smith           int rank = 0;
540*b744cbcaSCameron Smith           MPI_Comm_rank(MPI_COMM_WORLD, &rank);
541*b744cbcaSCameron Smith           if(!rank) {
542*b744cbcaSCameron Smith             fprintf(stderr,
543*b744cbcaSCameron Smith                 "ERROR invalid version passed to %s... exiting\n", __func__);
544*b744cbcaSCameron Smith             exit(EXIT_FAILURE);
545*b744cbcaSCameron Smith           }
54659599516SKenneth E. Jansen         }
54759599516SKenneth E. Jansen 	return mhsize;
54859599516SKenneth E. Jansen }
54959599516SKenneth E. Jansen 
55059599516SKenneth E. Jansen /**
55159599516SKenneth E. Jansen  * Computes correct color of a rank according to number of files.
55259599516SKenneth E. Jansen  */
55359599516SKenneth E. Jansen extern "C" int computeColor( int myrank, int numprocs, int nfiles) {
55459599516SKenneth E. Jansen 	int color =
55559599516SKenneth E. Jansen 		(int)(myrank / (numprocs / nfiles));
55659599516SKenneth E. Jansen 	return color;
55759599516SKenneth E. Jansen }
55859599516SKenneth E. Jansen 
55959599516SKenneth E. Jansen 
56059599516SKenneth E. Jansen /**
56159599516SKenneth E. Jansen  * Check the file descriptor.
56259599516SKenneth E. Jansen  */
56359599516SKenneth E. Jansen void checkFileDescriptor(const char fctname[],
56459599516SKenneth E. Jansen                          int*  fileDescriptor ) {
56559599516SKenneth E. Jansen 	if ( *fileDescriptor < 0 ) {
56659599516SKenneth E. Jansen 		printf("Error: File descriptor = %d in %s\n",*fileDescriptor,fctname);
56759599516SKenneth E. Jansen 		exit(1);
56859599516SKenneth E. Jansen 	}
56959599516SKenneth E. Jansen }
57059599516SKenneth E. Jansen 
57159599516SKenneth E. Jansen /**
57259599516SKenneth E. Jansen  * Initialize the file struct members and allocate space for file struct
57359599516SKenneth E. Jansen  * buffers.
57459599516SKenneth E. Jansen  *
57559599516SKenneth E. Jansen  * Note: this function is only called when we are using new format. Old POSIX
57659599516SKenneth E. Jansen  * format should skip this routine and call openfile() directly instead.
57759599516SKenneth E. Jansen  */
57859599516SKenneth E. Jansen int initphmpiio( int *nfields, int *nppf, int *nfiles, int *filehandle, const char mode[])
57959599516SKenneth E. Jansen {
58059599516SKenneth E. Jansen 	// we init irank again in case query not called (e.g. syncIO write case)
58159599516SKenneth E. Jansen 	MPI_Comm_rank(MPI_COMM_WORLD, &irank);
58259599516SKenneth E. Jansen 	MPI_Comm_size(MPI_COMM_WORLD, &mysize);
58359599516SKenneth E. Jansen 
58459599516SKenneth E. Jansen 	phprintf("Info initphmpiio: entering function, myrank = %d, MasterHeaderSize = %d", irank, MasterHeaderSize);
58559599516SKenneth E. Jansen 
58659599516SKenneth E. Jansen 	double timer_start, timer_end;
58759599516SKenneth E. Jansen 	startTimer(&timer_start);
58859599516SKenneth E. Jansen 
58959599516SKenneth E. Jansen 	char* imode = StringStripper( mode );
59059599516SKenneth E. Jansen 
59159599516SKenneth E. Jansen 	// Note: if it's read, we presume query was called prior to init and
59259599516SKenneth E. Jansen 	// MasterHeaderSize is already set to correct value from parsing header
59359599516SKenneth E. Jansen 	// otherwise it's write then it needs some computation to be set
59459599516SKenneth E. Jansen 	if ( cscompare( "read", imode ) ) {
59559599516SKenneth E. Jansen 		// do nothing
59659599516SKenneth E. Jansen 	}
59759599516SKenneth E. Jansen 	else if( cscompare( "write", imode ) ) {
59859599516SKenneth E. Jansen 		MasterHeaderSize =  computeMHSize(*nfields, *nppf, LATEST_WRITE_VERSION);
59959599516SKenneth E. Jansen 	}
60059599516SKenneth E. Jansen 	else {
60159599516SKenneth E. Jansen 		printf("Error initphmpiio: can't recognize the mode %s", imode);
60259599516SKenneth E. Jansen                 exit(1);
60359599516SKenneth E. Jansen 	}
60459599516SKenneth E. Jansen         free ( imode );
60559599516SKenneth E. Jansen 
60659599516SKenneth E. Jansen 	phprintf("Info initphmpiio: myrank = %d, MasterHeaderSize = %d", irank, MasterHeaderSize);
60759599516SKenneth E. Jansen 
60859599516SKenneth E. Jansen 	int i, j;
60959599516SKenneth E. Jansen 
61059599516SKenneth E. Jansen 	if( PhastaIONextActiveIndex == MAX_PHASTA_FILES ) {
61159599516SKenneth E. Jansen 		printf("Error initphmpiio: PhastaIONextActiveIndex = MAX_PHASTA_FILES");
61259599516SKenneth E. Jansen                 endTimer(&timer_end);
61359599516SKenneth E. Jansen 	        printPerf("initphmpiio", timer_start, timer_end, 0, 0, "");
61459599516SKenneth E. Jansen 		return MAX_PHASTA_FILES_EXCEEDED;
61559599516SKenneth E. Jansen 	}
61659599516SKenneth E. Jansen 	//		else if( PhastaIONextActiveIndex == 0 )  //Hang in debug mode on Intrepid
61759599516SKenneth E. Jansen 	//		{
61859599516SKenneth E. Jansen 	//			for( i = 0; i < MAX_PHASTA_FILES; i++ );
61959599516SKenneth E. Jansen 	//			{
62059599516SKenneth E. Jansen 	//				PhastaIOActiveFiles[i] = NULL;
62159599516SKenneth E. Jansen 	//			}
62259599516SKenneth E. Jansen 	//		}
62359599516SKenneth E. Jansen 
62459599516SKenneth E. Jansen 
62559599516SKenneth E. Jansen 	PhastaIOActiveFiles[PhastaIONextActiveIndex] = (phastaio_file_t *)calloc( 1,  sizeof( phastaio_file_t) );
62659599516SKenneth E. Jansen 
62759599516SKenneth E. Jansen 	i = PhastaIONextActiveIndex;
62859599516SKenneth E. Jansen 	PhastaIONextActiveIndex++;
62959599516SKenneth E. Jansen 
63059599516SKenneth E. Jansen 	//PhastaIOActiveFiles[i]->next_start_address = 2*TWO_MEGABYTE;
63159599516SKenneth E. Jansen 
63259599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->next_start_address = MasterHeaderSize;  // what does this mean??? TODO
63359599516SKenneth E. Jansen 
63459599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->Wrong_Endian = false;
63559599516SKenneth E. Jansen 
63659599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->nFields = *nfields;
63759599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->nPPF = *nppf;
63859599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->nFiles = *nfiles;
63959599516SKenneth E. Jansen 	MPI_Comm_rank(MPI_COMM_WORLD, &(PhastaIOActiveFiles[i]->myrank));
64059599516SKenneth E. Jansen 	MPI_Comm_size(MPI_COMM_WORLD, &(PhastaIOActiveFiles[i]->numprocs));
64159599516SKenneth E. Jansen 
64259599516SKenneth E. Jansen 
64359599516SKenneth E. Jansen 	if( *nfiles > 1 ) { // split the ranks according to each mpiio file
64459599516SKenneth E. Jansen 
64559599516SKenneth E. Jansen 		if ( s_assign_local_comm == 0) { // call mpi_comm_split for the first (and only) time
64659599516SKenneth E. Jansen 
64759599516SKenneth E. Jansen 			if (PhastaIOActiveFiles[i]->myrank == 0) printf("Building subcommunicator\n");
64859599516SKenneth E. Jansen 
64959599516SKenneth E. Jansen 			int color = computeColor(PhastaIOActiveFiles[i]->myrank, PhastaIOActiveFiles[i]->numprocs, PhastaIOActiveFiles[i]->nFiles);
65059599516SKenneth E. Jansen 			MPI_Comm_split(MPI_COMM_WORLD,
65159599516SKenneth E. Jansen 					color,
65259599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->myrank,
65359599516SKenneth E. Jansen 					&(PhastaIOActiveFiles[i]->local_comm));
65459599516SKenneth E. Jansen 			MPI_Comm_size(PhastaIOActiveFiles[i]->local_comm,
65559599516SKenneth E. Jansen 					&(PhastaIOActiveFiles[i]->local_numprocs));
65659599516SKenneth E. Jansen 			MPI_Comm_rank(PhastaIOActiveFiles[i]->local_comm,
65759599516SKenneth E. Jansen 					&(PhastaIOActiveFiles[i]->local_myrank));
65859599516SKenneth E. Jansen 
65959599516SKenneth E. Jansen 			// back up now these variables so that we do not need to call comm_split again
66059599516SKenneth E. Jansen 			s_local_comm = PhastaIOActiveFiles[i]->local_comm;
66159599516SKenneth E. Jansen 			s_local_size = PhastaIOActiveFiles[i]->local_numprocs;
66259599516SKenneth E. Jansen 			s_local_rank = PhastaIOActiveFiles[i]->local_myrank;
66359599516SKenneth E. Jansen 			s_assign_local_comm = 1;
66459599516SKenneth E. Jansen 		}
66559599516SKenneth E. Jansen 		else { // recycle the subcommunicator
66659599516SKenneth E. Jansen 			if (PhastaIOActiveFiles[i]->myrank == 0) printf("Recycling subcommunicator\n");
66759599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->local_comm = s_local_comm;
66859599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->local_numprocs = s_local_size;
66959599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->local_myrank = s_local_rank;
67059599516SKenneth E. Jansen 		}
67159599516SKenneth E. Jansen 	}
67259599516SKenneth E. Jansen 	else { // *nfiles == 1 here - no need to call mpi_comm_split here
67359599516SKenneth E. Jansen 
67459599516SKenneth E. Jansen 		if (PhastaIOActiveFiles[i]->myrank == 0) printf("Bypassing subcommunicator\n");
67559599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->local_comm = MPI_COMM_WORLD;
67659599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->local_numprocs = PhastaIOActiveFiles[i]->numprocs;
67759599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->local_myrank = PhastaIOActiveFiles[i]->myrank;
67859599516SKenneth E. Jansen 
67959599516SKenneth E. Jansen 	}
68059599516SKenneth E. Jansen 
68159599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->nppp =
68259599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->nPPF/PhastaIOActiveFiles[i]->local_numprocs;
68359599516SKenneth E. Jansen 
68459599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->start_id = PhastaIOActiveFiles[i]->nPPF *
68559599516SKenneth E. Jansen 		(int)(PhastaIOActiveFiles[i]->myrank/PhastaIOActiveFiles[i]->local_numprocs) +
68659599516SKenneth E. Jansen 		(PhastaIOActiveFiles[i]->local_myrank * PhastaIOActiveFiles[i]->nppp);
68759599516SKenneth E. Jansen 
68859599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->my_offset_table =
6892dd307a1SCameron Smith 		( unsigned long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long *) );
69059599516SKenneth E. Jansen 
69159599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->my_read_table =
6922dd307a1SCameron Smith 		( unsigned long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long *) );
69359599516SKenneth E. Jansen 
69459599516SKenneth E. Jansen 	for (j=0; j<*nfields; j++)
69559599516SKenneth E. Jansen 	{
69659599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->my_offset_table[j] =
6972dd307a1SCameron Smith 			( unsigned long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long) );
69859599516SKenneth E. Jansen 
69959599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->my_read_table[j] =
7002dd307a1SCameron Smith 			( unsigned long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long) );
70159599516SKenneth E. Jansen 	}
70259599516SKenneth E. Jansen 	*filehandle = i;
70359599516SKenneth E. Jansen 
70459599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->master_header = (char *)calloc(MasterHeaderSize,sizeof( char ));
70559599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->double_chunk = (double *)calloc(1,sizeof( double ));
70659599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->int_chunk = (int *)calloc(1,sizeof( int ));
70759599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->read_double_chunk = (double *)calloc(1,sizeof( double ));
70859599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->read_int_chunk = (int *)calloc(1,sizeof( int ));
70959599516SKenneth E. Jansen 
71059599516SKenneth E. Jansen 	// Time monitoring
71159599516SKenneth E. Jansen 	endTimer(&timer_end);
71259599516SKenneth E. Jansen 	printPerf("initphmpiio", timer_start, timer_end, 0, 0, "");
71359599516SKenneth E. Jansen 
71459599516SKenneth E. Jansen 	phprintf_0("Info initphmpiio: quiting function");
71559599516SKenneth E. Jansen 
71659599516SKenneth E. Jansen 	return i;
71759599516SKenneth E. Jansen }
71859599516SKenneth E. Jansen 
71959599516SKenneth E. Jansen /**
72059599516SKenneth E. Jansen  * Destruct the file struct and free buffers allocated in init function.
72159599516SKenneth E. Jansen  */
72259599516SKenneth E. Jansen void finalizephmpiio( int *fileDescriptor )
72359599516SKenneth E. Jansen {
72459599516SKenneth E. Jansen 	double timer_start, timer_end;
72559599516SKenneth E. Jansen 	startTimer(&timer_start);
72659599516SKenneth E. Jansen 
72759599516SKenneth E. Jansen 	int i, j;
72859599516SKenneth E. Jansen 	i = *fileDescriptor;
72959599516SKenneth E. Jansen 	//PhastaIONextActiveIndex--;
73059599516SKenneth E. Jansen 
73159599516SKenneth E. Jansen 	/* //free the offset table for this phasta file */
73259599516SKenneth E. Jansen 	//for(j=0; j<MAX_FIELDS_NUMBER; j++) //Danger: undefined behavior for my_*_table.[j] not allocated or not initialized to NULL
73359599516SKenneth E. Jansen 	for(j=0; j<PhastaIOActiveFiles[i]->nFields; j++)
73459599516SKenneth E. Jansen 	{
73559599516SKenneth E. Jansen 		free( PhastaIOActiveFiles[i]->my_offset_table[j]);
73659599516SKenneth E. Jansen 		free( PhastaIOActiveFiles[i]->my_read_table[j]);
73759599516SKenneth E. Jansen 	}
73859599516SKenneth E. Jansen 	free ( PhastaIOActiveFiles[i]->my_offset_table );
73959599516SKenneth E. Jansen 	free ( PhastaIOActiveFiles[i]->my_read_table );
74059599516SKenneth E. Jansen 	free ( PhastaIOActiveFiles[i]->master_header );
74159599516SKenneth E. Jansen 	free ( PhastaIOActiveFiles[i]->double_chunk );
74259599516SKenneth E. Jansen 	free ( PhastaIOActiveFiles[i]->int_chunk );
74359599516SKenneth E. Jansen 	free ( PhastaIOActiveFiles[i]->read_double_chunk );
74459599516SKenneth E. Jansen 	free ( PhastaIOActiveFiles[i]->read_int_chunk );
74559599516SKenneth E. Jansen 
746946a6cddSCameron Smith         if( PhastaIOActiveFiles[i]->nFiles > 1 && s_assign_local_comm ) { // the comm was split
747946a6cddSCameron Smith           if (PhastaIOActiveFiles[i]->myrank == 0) printf("Freeing subcommunicator\n");
748946a6cddSCameron Smith           s_assign_local_comm = 0;
749946a6cddSCameron Smith           MPI_Comm_free(&(PhastaIOActiveFiles[i]->local_comm));
750946a6cddSCameron Smith         }
751946a6cddSCameron Smith 
75259599516SKenneth E. Jansen 	free( PhastaIOActiveFiles[i]);
75359599516SKenneth E. Jansen 
75459599516SKenneth E. Jansen 	endTimer(&timer_end);
75559599516SKenneth E. Jansen 	printPerf("finalizempiio", timer_start, timer_end, 0, 0, "");
75659599516SKenneth E. Jansen 
75759599516SKenneth E. Jansen 	PhastaIONextActiveIndex--;
75859599516SKenneth E. Jansen }
75959599516SKenneth E. Jansen 
76059599516SKenneth E. Jansen 
76159599516SKenneth E. Jansen /**
76259599516SKenneth E. Jansen  * Special init for M2N in order to create a subcommunicator for the reduced solution (requires PRINT_PERF to be false for now)
76359599516SKenneth E. Jansen  * Initialize the file struct members and allocate space for file struct buffers.
76459599516SKenneth E. Jansen  *
76559599516SKenneth E. Jansen  * Note: this function is only called when we are using new format. Old POSIX
76659599516SKenneth E. Jansen  * format should skip this routine and call openfile() directly instead.
76759599516SKenneth E. Jansen  */
76859599516SKenneth E. Jansen int initphmpiiosub( int *nfields, int *nppf, int *nfiles, int *filehandle, const char mode[],MPI_Comm my_local_comm)
76959599516SKenneth E. Jansen {
77059599516SKenneth E. Jansen 	// we init irank again in case query not called (e.g. syncIO write case)
77159599516SKenneth E. Jansen 
77259599516SKenneth E. Jansen 	MPI_Comm_rank(my_local_comm, &irank);
77359599516SKenneth E. Jansen 	MPI_Comm_size(my_local_comm, &mysize);
77459599516SKenneth E. Jansen 
77559599516SKenneth E. Jansen 	phprintf("Info initphmpiio: entering function, myrank = %d, MasterHeaderSize = %d", irank, MasterHeaderSize);
77659599516SKenneth E. Jansen 
77759599516SKenneth E. Jansen 	double timer_start, timer_end;
77859599516SKenneth E. Jansen 	startTimer(&timer_start);
77959599516SKenneth E. Jansen 
78059599516SKenneth E. Jansen 	char* imode = StringStripper( mode );
78159599516SKenneth E. Jansen 
78259599516SKenneth E. Jansen 	// Note: if it's read, we presume query was called prior to init and
78359599516SKenneth E. Jansen 	// MasterHeaderSize is already set to correct value from parsing header
78459599516SKenneth E. Jansen 	// otherwise it's write then it needs some computation to be set
78559599516SKenneth E. Jansen 	if ( cscompare( "read", imode ) ) {
78659599516SKenneth E. Jansen 		// do nothing
78759599516SKenneth E. Jansen 	}
78859599516SKenneth E. Jansen 	else if( cscompare( "write", imode ) ) {
78959599516SKenneth E. Jansen 		MasterHeaderSize =  computeMHSize(*nfields, *nppf, LATEST_WRITE_VERSION);
79059599516SKenneth E. Jansen 	}
79159599516SKenneth E. Jansen 	else {
79259599516SKenneth E. Jansen 		printf("Error initphmpiio: can't recognize the mode %s", imode);
79359599516SKenneth E. Jansen                 exit(1);
79459599516SKenneth E. Jansen 	}
79559599516SKenneth E. Jansen         free ( imode );
79659599516SKenneth E. Jansen 
79759599516SKenneth E. Jansen 	phprintf("Info initphmpiio: myrank = %d, MasterHeaderSize = %d", irank, MasterHeaderSize);
79859599516SKenneth E. Jansen 
79959599516SKenneth E. Jansen 	int i, j;
80059599516SKenneth E. Jansen 
80159599516SKenneth E. Jansen 	if( PhastaIONextActiveIndex == MAX_PHASTA_FILES ) {
80259599516SKenneth E. Jansen 		printf("Error initphmpiio: PhastaIONextActiveIndex = MAX_PHASTA_FILES");
80359599516SKenneth E. Jansen                 endTimer(&timer_end);
80459599516SKenneth E. Jansen 	        printPerf("initphmpiio", timer_start, timer_end, 0, 0, "");
80559599516SKenneth E. Jansen 		return MAX_PHASTA_FILES_EXCEEDED;
80659599516SKenneth E. Jansen 	}
80759599516SKenneth E. Jansen 	//		else if( PhastaIONextActiveIndex == 0 )  //Hang in debug mode on Intrepid
80859599516SKenneth E. Jansen 	//		{
80959599516SKenneth E. Jansen 	//			for( i = 0; i < MAX_PHASTA_FILES; i++ );
81059599516SKenneth E. Jansen 	//			{
81159599516SKenneth E. Jansen 	//				PhastaIOActiveFiles[i] = NULL;
81259599516SKenneth E. Jansen 	//			}
81359599516SKenneth E. Jansen 	//		}
81459599516SKenneth E. Jansen 
81559599516SKenneth E. Jansen 
81659599516SKenneth E. Jansen 	PhastaIOActiveFiles[PhastaIONextActiveIndex] = (phastaio_file_t *)calloc( 1,  sizeof( phastaio_file_t) );
81759599516SKenneth E. Jansen 
81859599516SKenneth E. Jansen 	i = PhastaIONextActiveIndex;
81959599516SKenneth E. Jansen 	PhastaIONextActiveIndex++;
82059599516SKenneth E. Jansen 
82159599516SKenneth E. Jansen 	//PhastaIOActiveFiles[i]->next_start_address = 2*TWO_MEGABYTE;
82259599516SKenneth E. Jansen 
82359599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->next_start_address = MasterHeaderSize;  // what does this mean??? TODO
82459599516SKenneth E. Jansen 
82559599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->Wrong_Endian = false;
82659599516SKenneth E. Jansen 
82759599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->nFields = *nfields;
82859599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->nPPF = *nppf;
82959599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->nFiles = *nfiles;
83059599516SKenneth E. Jansen 	MPI_Comm_rank(my_local_comm, &(PhastaIOActiveFiles[i]->myrank));
83159599516SKenneth E. Jansen 	MPI_Comm_size(my_local_comm, &(PhastaIOActiveFiles[i]->numprocs));
83259599516SKenneth E. Jansen 
83359599516SKenneth E. Jansen 	int color = computeColor(PhastaIOActiveFiles[i]->myrank, PhastaIOActiveFiles[i]->numprocs, PhastaIOActiveFiles[i]->nFiles);
83459599516SKenneth E. Jansen 	MPI_Comm_split(my_local_comm,
83559599516SKenneth E. Jansen 			color,
83659599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->myrank,
83759599516SKenneth E. Jansen 			&(PhastaIOActiveFiles[i]->local_comm));
83859599516SKenneth E. Jansen 	MPI_Comm_size(PhastaIOActiveFiles[i]->local_comm,
83959599516SKenneth E. Jansen 			&(PhastaIOActiveFiles[i]->local_numprocs));
84059599516SKenneth E. Jansen 	MPI_Comm_rank(PhastaIOActiveFiles[i]->local_comm,
84159599516SKenneth E. Jansen 			&(PhastaIOActiveFiles[i]->local_myrank));
84259599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->nppp =
84359599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->nPPF/PhastaIOActiveFiles[i]->local_numprocs;
84459599516SKenneth E. Jansen 
84559599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->start_id = PhastaIOActiveFiles[i]->nPPF *
84659599516SKenneth E. Jansen 		(int)(PhastaIOActiveFiles[i]->myrank/PhastaIOActiveFiles[i]->local_numprocs) +
84759599516SKenneth E. Jansen 		(PhastaIOActiveFiles[i]->local_myrank * PhastaIOActiveFiles[i]->nppp);
84859599516SKenneth E. Jansen 
84959599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->my_offset_table =
8502dd307a1SCameron Smith 		( unsigned long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long *) );
85159599516SKenneth E. Jansen 
85259599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->my_read_table =
8532dd307a1SCameron Smith 		( unsigned long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long *) );
85459599516SKenneth E. Jansen 
85559599516SKenneth E. Jansen 	for (j=0; j<*nfields; j++)
85659599516SKenneth E. Jansen 	{
85759599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->my_offset_table[j] =
8582dd307a1SCameron Smith 			( unsigned long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long) );
85959599516SKenneth E. Jansen 
86059599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->my_read_table[j] =
8612dd307a1SCameron Smith 			( unsigned long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long) );
86259599516SKenneth E. Jansen 	}
86359599516SKenneth E. Jansen 	*filehandle = i;
86459599516SKenneth E. Jansen 
86559599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->master_header = (char *)calloc(MasterHeaderSize,sizeof( char ));
86659599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->double_chunk = (double *)calloc(1,sizeof( double ));
86759599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->int_chunk = (int *)calloc(1,sizeof( int ));
86859599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->read_double_chunk = (double *)calloc(1,sizeof( double ));
86959599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->read_int_chunk = (int *)calloc(1,sizeof( int ));
87059599516SKenneth E. Jansen 
87159599516SKenneth E. Jansen 	// Time monitoring
87259599516SKenneth E. Jansen 	endTimer(&timer_end);
87359599516SKenneth E. Jansen 	printPerf("initphmpiiosub", timer_start, timer_end, 0, 0, "");
87459599516SKenneth E. Jansen 
87559599516SKenneth E. Jansen 	phprintf_0("Info initphmpiiosub: quiting function");
87659599516SKenneth E. Jansen 
87759599516SKenneth E. Jansen 	return i;
87859599516SKenneth E. Jansen }
87959599516SKenneth E. Jansen 
88059599516SKenneth E. Jansen 
88159599516SKenneth E. Jansen 
88259599516SKenneth E. Jansen /** open file for both POSIX and MPI-IO syncIO format.
88359599516SKenneth E. Jansen  *
88459599516SKenneth E. Jansen  * If it's old POSIX format, simply call posix fopen().
88559599516SKenneth E. Jansen  *
88659599516SKenneth E. Jansen  * If it's MPI-IO foramt:
88759599516SKenneth E. Jansen  * in "read" mode, it builds the header table that points to the offset of
88859599516SKenneth E. Jansen  * fields for parts;
88959599516SKenneth E. Jansen  * in "write" mode, it opens the file with MPI-IO open routine.
89059599516SKenneth E. Jansen  */
89159599516SKenneth E. Jansen void openfile(const char filename[],
89259599516SKenneth E. Jansen                const char mode[],
89359599516SKenneth E. Jansen                int*  fileDescriptor )
89459599516SKenneth E. Jansen {
89559599516SKenneth E. Jansen 	phprintf_0("Info: entering openfile");
89659599516SKenneth E. Jansen 
89759599516SKenneth E. Jansen 	double timer_start, timer_end;
89859599516SKenneth E. Jansen 	startTimer(&timer_start);
89959599516SKenneth E. Jansen 
90059599516SKenneth E. Jansen 	if ( PhastaIONextActiveIndex == 0 )
90159599516SKenneth E. Jansen 	{
90259599516SKenneth E. Jansen 		FILE* file=NULL ;
90359599516SKenneth E. Jansen 		*fileDescriptor = 0;
90459599516SKenneth E. Jansen 		char* fname = StringStripper( filename );
90559599516SKenneth E. Jansen 		char* imode = StringStripper( mode );
90659599516SKenneth E. Jansen 
90759599516SKenneth E. Jansen 		if ( cscompare( "read", imode ) ) file = fopen(fname, "rb" );
90859599516SKenneth E. Jansen 		else if( cscompare( "write", imode ) ) file = fopen(fname, "wb" );
90959599516SKenneth E. Jansen 		else if( cscompare( "append", imode ) ) file = fopen(fname, "ab" );
91059599516SKenneth E. Jansen 
91159599516SKenneth E. Jansen 		if ( !file ){
91259599516SKenneth E. Jansen 			fprintf(stderr,"Error openfile: unable to open file %s",fname ) ;
91359599516SKenneth E. Jansen 		} else {
91459599516SKenneth E. Jansen 			fileArray.push_back( file );
91559599516SKenneth E. Jansen 			byte_order.push_back( false );
91659599516SKenneth E. Jansen 			header_type.push_back( sizeof(int) );
91759599516SKenneth E. Jansen 			*fileDescriptor = fileArray.size();
91859599516SKenneth E. Jansen 		}
91959599516SKenneth E. Jansen 		free (fname);
92059599516SKenneth E. Jansen 		free (imode);
92159599516SKenneth E. Jansen 	}
92259599516SKenneth E. Jansen 	else // else it would be parallel I/O, opposed to posix io
92359599516SKenneth E. Jansen 	{
92459599516SKenneth E. Jansen 		char* fname = StringStripper( filename );
92559599516SKenneth E. Jansen 		char* imode = StringStripper( mode );
92659599516SKenneth E. Jansen 		int rc;
92759599516SKenneth E. Jansen                 int i = *fileDescriptor;
92859599516SKenneth E. Jansen 		checkFileDescriptor("openfile",&i);
92959599516SKenneth E. Jansen 		char* token;
93059599516SKenneth E. Jansen 
93159599516SKenneth E. Jansen 		if ( cscompare( "read", imode ) )
93259599516SKenneth E. Jansen 		{
93359599516SKenneth E. Jansen 			//	      if (PhastaIOActiveFiles[i]->myrank == 0)
93459599516SKenneth E. Jansen 			//                printf("\n **********\nRead open ... ... regular version\n");
93559599516SKenneth E. Jansen 
93659599516SKenneth E. Jansen 			rc = MPI_File_open( PhastaIOActiveFiles[i]->local_comm,
93759599516SKenneth E. Jansen 					fname,
93859599516SKenneth E. Jansen 					MPI_MODE_RDONLY,
93959599516SKenneth E. Jansen 					MPI_INFO_NULL,
94059599516SKenneth E. Jansen 					&(PhastaIOActiveFiles[i]->file_handle) );
94159599516SKenneth E. Jansen 
94259599516SKenneth E. Jansen 			if(rc)
94359599516SKenneth E. Jansen 			{
94459599516SKenneth E. Jansen 				*fileDescriptor = UNABLE_TO_OPEN_FILE;
94559599516SKenneth E. Jansen 				printf("Error openfile: Unable to open file %s! File descriptor = %d\n",fname,*fileDescriptor);
94659599516SKenneth E. Jansen                                 endTimer(&timer_end);
94759599516SKenneth E. Jansen                                 printPerf("openfile", timer_start, timer_end, 0, 0, "");
94859599516SKenneth E. Jansen 				return;
94959599516SKenneth E. Jansen 			}
95059599516SKenneth E. Jansen 
95159599516SKenneth E. Jansen 			MPI_Status read_tag_status;
95259599516SKenneth E. Jansen 			char read_out_tag[MAX_FIELDS_NAME_LENGTH];
95359599516SKenneth E. Jansen 			int j;
95459599516SKenneth E. Jansen 			int magic_number;
95559599516SKenneth E. Jansen 
95659599516SKenneth E. Jansen 			if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) {
95759599516SKenneth E. Jansen 				MPI_File_read_at( PhastaIOActiveFiles[i]->file_handle,
95859599516SKenneth E. Jansen 						0,
95959599516SKenneth E. Jansen 						PhastaIOActiveFiles[i]->master_header,
96059599516SKenneth E. Jansen 						MasterHeaderSize,
96159599516SKenneth E. Jansen 						MPI_CHAR,
96259599516SKenneth E. Jansen 						&read_tag_status );
96359599516SKenneth E. Jansen 			}
96459599516SKenneth E. Jansen 
96559599516SKenneth E. Jansen 			MPI_Bcast( PhastaIOActiveFiles[i]->master_header,
96659599516SKenneth E. Jansen 					MasterHeaderSize,
96759599516SKenneth E. Jansen 					MPI_CHAR,
96859599516SKenneth E. Jansen 					0,
96959599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->local_comm );
97059599516SKenneth E. Jansen 
97159599516SKenneth E. Jansen 			memcpy( read_out_tag,
97259599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->master_header,
97359599516SKenneth E. Jansen 					MAX_FIELDS_NAME_LENGTH-1 );
97459599516SKenneth E. Jansen 
97559599516SKenneth E. Jansen 			if ( cscompare ("MPI_IO_Tag",read_out_tag) )
97659599516SKenneth E. Jansen 			{
97759599516SKenneth E. Jansen 				// Test endianess ...
97859599516SKenneth E. Jansen 				memcpy ( &magic_number,
97959599516SKenneth E. Jansen 						PhastaIOActiveFiles[i]->master_header+sizeof("MPI_IO_Tag : ")-1, //-1 sizeof returns the size of the string+1 for "\0"
98059599516SKenneth E. Jansen 						sizeof(int) );                                                   // masterheader should look like "MPI_IO_Tag : 12180 " with 12180 in binary format
98159599516SKenneth E. Jansen 
98259599516SKenneth E. Jansen 				if ( magic_number != ENDIAN_TEST_NUMBER )
98359599516SKenneth E. Jansen 				{
98459599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->Wrong_Endian = true;
98559599516SKenneth E. Jansen 				}
98659599516SKenneth E. Jansen 
98759599516SKenneth E. Jansen 				memcpy( read_out_tag,
98859599516SKenneth E. Jansen 						PhastaIOActiveFiles[i]->master_header+MAX_FIELDS_NAME_LENGTH+1, // TODO: WHY +1???
98959599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH );
99059599516SKenneth E. Jansen 
99159599516SKenneth E. Jansen 				// Read in # fields ...
99259599516SKenneth E. Jansen 				token = strtok ( read_out_tag, ":" );
99359599516SKenneth E. Jansen 				token = strtok( NULL," ,;<>" );
99459599516SKenneth E. Jansen 				PhastaIOActiveFiles[i]->nFields = atoi( token );
99559599516SKenneth E. Jansen 
9962dd307a1SCameron Smith 				unsigned long **header_table;
9972dd307a1SCameron Smith 				header_table = ( unsigned long ** )calloc(PhastaIOActiveFiles[i]->nFields, sizeof(unsigned long *));
99859599516SKenneth E. Jansen 
99959599516SKenneth E. Jansen 				for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ )
100059599516SKenneth E. Jansen 				{
10012dd307a1SCameron Smith 					header_table[j]=( unsigned long * ) calloc( PhastaIOActiveFiles[i]->nPPF , sizeof( unsigned long));
100259599516SKenneth E. Jansen 				}
100359599516SKenneth E. Jansen 
100459599516SKenneth E. Jansen 				// Read in the offset table ...
100559599516SKenneth E. Jansen 				for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ )
100659599516SKenneth E. Jansen 				{
100759599516SKenneth E. Jansen                                         if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) {
100859599516SKenneth E. Jansen 						memcpy( header_table[j],
100959599516SKenneth E. Jansen 							PhastaIOActiveFiles[i]->master_header +
101059599516SKenneth E. Jansen 							VERSION_INFO_HEADER_SIZE +
10112dd307a1SCameron Smith 							j * PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long),
10122dd307a1SCameron Smith 							PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long) );
101359599516SKenneth E. Jansen                                         }
101459599516SKenneth E. Jansen 
101559599516SKenneth E. Jansen 					MPI_Scatter( header_table[j],
101659599516SKenneth E. Jansen 							PhastaIOActiveFiles[i]->nppp,
101759599516SKenneth E. Jansen 							MPI_LONG_LONG_INT,
101859599516SKenneth E. Jansen 							PhastaIOActiveFiles[i]->my_read_table[j],
101959599516SKenneth E. Jansen 							PhastaIOActiveFiles[i]->nppp,
102059599516SKenneth E. Jansen 							MPI_LONG_LONG_INT,
102159599516SKenneth E. Jansen 							0,
102259599516SKenneth E. Jansen 							PhastaIOActiveFiles[i]->local_comm );
102359599516SKenneth E. Jansen 
102459599516SKenneth E. Jansen 					// Swap byte order if endianess is different ...
102559599516SKenneth E. Jansen 					if ( PhastaIOActiveFiles[i]->Wrong_Endian ) {
102659599516SKenneth E. Jansen 						SwapArrayByteOrder( PhastaIOActiveFiles[i]->my_read_table[j],
10274187599aSCameron Smith 								sizeof(unsigned long),
102859599516SKenneth E. Jansen 								PhastaIOActiveFiles[i]->nppp );
102959599516SKenneth E. Jansen 					}
103059599516SKenneth E. Jansen 				}
103159599516SKenneth E. Jansen 
103259599516SKenneth E. Jansen                                 for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) {
103359599516SKenneth E. Jansen                                 	free ( header_table[j] );
103459599516SKenneth E. Jansen                                 }
103559599516SKenneth E. Jansen                                 free (header_table);
103659599516SKenneth E. Jansen 
103759599516SKenneth E. Jansen 			} // end of if MPI_IO_TAG
103859599516SKenneth E. Jansen 			else //else not valid MPI file
103959599516SKenneth E. Jansen 			{
104059599516SKenneth E. Jansen 				*fileDescriptor = NOT_A_MPI_FILE;
104159599516SKenneth E. Jansen 				printf("Error openfile: The file %s you opened is not in syncIO new format, please check again! File descriptor = %d, MasterHeaderSize = %d, read_out_tag = %s\n",fname,*fileDescriptor,MasterHeaderSize,read_out_tag);
104259599516SKenneth E. Jansen 				//Printing MasterHeaderSize is useful to test a compiler bug on Intrepid BGP
104359599516SKenneth E. Jansen                                 endTimer(&timer_end);
104459599516SKenneth E. Jansen                                 printPerf("openfile", timer_start, timer_end, 0, 0, "");
104559599516SKenneth E. Jansen 				return;
104659599516SKenneth E. Jansen 			}
104759599516SKenneth E. Jansen 		} // end of if "read"
104859599516SKenneth E. Jansen 		else if( cscompare( "write", imode ) )
104959599516SKenneth E. Jansen 		{
105059599516SKenneth E. Jansen 			rc = MPI_File_open( PhastaIOActiveFiles[i]->local_comm,
105159599516SKenneth E. Jansen 					fname,
105259599516SKenneth E. Jansen 					MPI_MODE_WRONLY | MPI_MODE_CREATE,
105359599516SKenneth E. Jansen 					MPI_INFO_NULL,
105459599516SKenneth E. Jansen 					&(PhastaIOActiveFiles[i]->file_handle) );
105559599516SKenneth E. Jansen 			if(rc)
105659599516SKenneth E. Jansen 			{
105759599516SKenneth E. Jansen 				*fileDescriptor = UNABLE_TO_OPEN_FILE;
105859599516SKenneth E. Jansen 				return;
105959599516SKenneth E. Jansen 			}
106059599516SKenneth E. Jansen 		} // end of if "write"
106159599516SKenneth E. Jansen 		free (fname);
106259599516SKenneth E. Jansen 		free (imode);
106359599516SKenneth E. Jansen 	} // end of if FileIndex != 0
106459599516SKenneth E. Jansen 
106559599516SKenneth E. Jansen 	endTimer(&timer_end);
106659599516SKenneth E. Jansen 	printPerf("openfile", timer_start, timer_end, 0, 0, "");
106759599516SKenneth E. Jansen }
106859599516SKenneth E. Jansen 
106959599516SKenneth E. Jansen /** close file for both POSIX and MPI-IO syncIO format.
107059599516SKenneth E. Jansen  *
107159599516SKenneth E. Jansen  * If it's old POSIX format, simply call posix fclose().
107259599516SKenneth E. Jansen  *
107359599516SKenneth E. Jansen  * If it's MPI-IO foramt:
107459599516SKenneth E. Jansen  * in "read" mode, it simply close file with MPI-IO close routine.
107559599516SKenneth E. Jansen  * in "write" mode, rank 0 in each group will re-assemble the master header and
107659599516SKenneth E. Jansen  * offset table and write to the beginning of file, then close the file.
107759599516SKenneth E. Jansen  */
107859599516SKenneth E. Jansen void closefile( int* fileDescriptor,
107959599516SKenneth E. Jansen                  const char mode[] )
108059599516SKenneth E. Jansen {
108159599516SKenneth E. Jansen 	double timer_start, timer_end;
108259599516SKenneth E. Jansen 	startTimer(&timer_start);
108359599516SKenneth E. Jansen 
108459599516SKenneth E. Jansen 	int i = *fileDescriptor;
108559599516SKenneth E. Jansen 	checkFileDescriptor("closefile",&i);
108659599516SKenneth E. Jansen 
108759599516SKenneth E. Jansen 	if ( PhastaIONextActiveIndex == 0 ) {
108859599516SKenneth E. Jansen 		char* imode = StringStripper( mode );
108959599516SKenneth E. Jansen 
109059599516SKenneth E. Jansen 		if( cscompare( "write", imode )
109159599516SKenneth E. Jansen 				|| cscompare( "append", imode ) ) {
109259599516SKenneth E. Jansen 			fflush( fileArray[ *fileDescriptor - 1 ] );
109359599516SKenneth E. Jansen 		}
109459599516SKenneth E. Jansen 
109559599516SKenneth E. Jansen 		fclose( fileArray[ *fileDescriptor - 1 ] );
109659599516SKenneth E. Jansen 		free (imode);
109759599516SKenneth E. Jansen      	}
109859599516SKenneth E. Jansen 	else {
109959599516SKenneth E. Jansen 		char* imode = StringStripper( mode );
110059599516SKenneth E. Jansen 
110159599516SKenneth E. Jansen 		//write master header here:
110259599516SKenneth E. Jansen 		if ( cscompare( "write", imode ) ) {
110359599516SKenneth E. Jansen 			//	      if ( PhastaIOActiveFiles[i]->nPPF * PhastaIOActiveFiles[i]->nFields < 2*ONE_MEGABYTE/8 )  //SHOULD BE CHECKED
110459599516SKenneth E. Jansen 			//		MasterHeaderSize = 4*ONE_MEGABYTE;
110559599516SKenneth E. Jansen 			//	      else
110659599516SKenneth E. Jansen 			//		MasterHeaderSize = 4*ONE_MEGABYTE + PhastaIOActiveFiles[i]->nPPF * PhastaIOActiveFiles[i]->nFields * 8 - 2*ONE_MEGABYTE;
110759599516SKenneth E. Jansen 
110859599516SKenneth E. Jansen 			MasterHeaderSize = computeMHSize( PhastaIOActiveFiles[i]->nFields, PhastaIOActiveFiles[i]->nPPF, LATEST_WRITE_VERSION);
110959599516SKenneth E. Jansen 			phprintf_0("Info closefile: myrank = %d, MasterHeaderSize = %d\n", PhastaIOActiveFiles[i]->myrank, MasterHeaderSize);
111059599516SKenneth E. Jansen 
111159599516SKenneth E. Jansen 			MPI_Status write_header_status;
111259599516SKenneth E. Jansen 			char mpi_tag[MAX_FIELDS_NAME_LENGTH];
111359599516SKenneth E. Jansen 			char version[MAX_FIELDS_NAME_LENGTH/4];
111459599516SKenneth E. Jansen 			char mhsize[MAX_FIELDS_NAME_LENGTH/4];
111559599516SKenneth E. Jansen 			int magic_number = ENDIAN_TEST_NUMBER;
111659599516SKenneth E. Jansen 
111759599516SKenneth E. Jansen 			if ( PhastaIOActiveFiles[i]->local_myrank == 0 )
111859599516SKenneth E. Jansen 			{
111959599516SKenneth E. Jansen 				bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH);
112059599516SKenneth E. Jansen 				sprintf(mpi_tag, "MPI_IO_Tag : ");
112159599516SKenneth E. Jansen 				memcpy(PhastaIOActiveFiles[i]->master_header,
112259599516SKenneth E. Jansen 						mpi_tag,
112359599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH);
112459599516SKenneth E. Jansen 
112559599516SKenneth E. Jansen 				bzero((void*)version,MAX_FIELDS_NAME_LENGTH/4);
112659599516SKenneth E. Jansen 				// this version is "1", print version in ASCII
112759599516SKenneth E. Jansen 				sprintf(version, "version : %d",1);
112859599516SKenneth E. Jansen 				memcpy(PhastaIOActiveFiles[i]->master_header + MAX_FIELDS_NAME_LENGTH/2,
112959599516SKenneth E. Jansen 						version,
113059599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH/4);
113159599516SKenneth E. Jansen 
113259599516SKenneth E. Jansen 				// master header size is computed using the formula above
113359599516SKenneth E. Jansen 				bzero((void*)mhsize,MAX_FIELDS_NAME_LENGTH/4);
113459599516SKenneth E. Jansen 				sprintf(mhsize, "mhsize : ");
113559599516SKenneth E. Jansen 				memcpy(PhastaIOActiveFiles[i]->master_header + MAX_FIELDS_NAME_LENGTH/4*3,
113659599516SKenneth E. Jansen 						mhsize,
113759599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH/4);
113859599516SKenneth E. Jansen 
113959599516SKenneth E. Jansen 				bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH);
114059599516SKenneth E. Jansen 				sprintf(mpi_tag,
114159599516SKenneth E. Jansen 						"\nnFields : %d\n",
114259599516SKenneth E. Jansen 						PhastaIOActiveFiles[i]->nFields);
114359599516SKenneth E. Jansen 				memcpy(PhastaIOActiveFiles[i]->master_header+MAX_FIELDS_NAME_LENGTH,
114459599516SKenneth E. Jansen 						mpi_tag,
114559599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH);
114659599516SKenneth E. Jansen 
114759599516SKenneth E. Jansen 				bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH);
114859599516SKenneth E. Jansen 				sprintf(mpi_tag, "\nnPPF : %d\n", PhastaIOActiveFiles[i]->nPPF);
114959599516SKenneth E. Jansen 				memcpy( PhastaIOActiveFiles[i]->master_header+
115059599516SKenneth E. Jansen 						PhastaIOActiveFiles[i]->nFields *
115159599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH +
115259599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH * 2,
115359599516SKenneth E. Jansen 						mpi_tag,
115459599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH);
115559599516SKenneth E. Jansen 
115659599516SKenneth E. Jansen 				memcpy( PhastaIOActiveFiles[i]->master_header+sizeof("MPI_IO_Tag : ")-1, //-1 sizeof returns the size of the string+1 for "\0"
115759599516SKenneth E. Jansen 						&magic_number,
115859599516SKenneth E. Jansen 						sizeof(int));
115959599516SKenneth E. Jansen 
116059599516SKenneth E. Jansen 				memcpy( PhastaIOActiveFiles[i]->master_header+sizeof("mhsize : ") -1 + MAX_FIELDS_NAME_LENGTH/4*3,
116159599516SKenneth E. Jansen 						&MasterHeaderSize,
116259599516SKenneth E. Jansen 						sizeof(int));
116359599516SKenneth E. Jansen 			}
116459599516SKenneth E. Jansen 
116559599516SKenneth E. Jansen 			int j = 0;
11662dd307a1SCameron Smith 			unsigned long **header_table;
11672dd307a1SCameron Smith 			header_table = ( unsigned long ** )calloc(PhastaIOActiveFiles[i]->nFields, sizeof(unsigned long *));
116859599516SKenneth E. Jansen 
116959599516SKenneth E. Jansen 			for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) {
11702dd307a1SCameron Smith 				header_table[j]=( unsigned long * ) calloc( PhastaIOActiveFiles[i]->nPPF , sizeof( unsigned long));
117159599516SKenneth E. Jansen 			}
117259599516SKenneth E. Jansen 
117359599516SKenneth E. Jansen 			//if( irank == 0 ) printf("gonna mpi_gather, myrank = %d\n", irank);
117459599516SKenneth E. Jansen 			for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) {
117559599516SKenneth E. Jansen 				MPI_Gather( PhastaIOActiveFiles[i]->my_offset_table[j],
117659599516SKenneth E. Jansen 						PhastaIOActiveFiles[i]->nppp,
117759599516SKenneth E. Jansen 						MPI_LONG_LONG_INT,
117859599516SKenneth E. Jansen 						header_table[j],
117959599516SKenneth E. Jansen 						PhastaIOActiveFiles[i]->nppp,
118059599516SKenneth E. Jansen 						MPI_LONG_LONG_INT,
118159599516SKenneth E. Jansen 						0,
118259599516SKenneth E. Jansen 						PhastaIOActiveFiles[i]->local_comm );
118359599516SKenneth E. Jansen 			}
118459599516SKenneth E. Jansen 
118559599516SKenneth E. Jansen 			if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) {
118659599516SKenneth E. Jansen 
118759599516SKenneth E. Jansen 			        //if( irank == 0 ) printf("gonna memcpy for every procs, myrank = %d\n", irank);
118859599516SKenneth E. Jansen 				for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) {
118959599516SKenneth E. Jansen 					memcpy ( PhastaIOActiveFiles[i]->master_header +
119059599516SKenneth E. Jansen 						VERSION_INFO_HEADER_SIZE +
11912dd307a1SCameron Smith 						j * PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long),
119259599516SKenneth E. Jansen 						header_table[j],
11932dd307a1SCameron Smith 						PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long) );
119459599516SKenneth E. Jansen 				}
119559599516SKenneth E. Jansen 
119659599516SKenneth E. Jansen 				//if( irank == 0 ) printf("gonna file_write_at(), myrank = %d\n", irank);
119759599516SKenneth E. Jansen 				MPI_File_write_at( PhastaIOActiveFiles[i]->file_handle,
119859599516SKenneth E. Jansen 						0,
119959599516SKenneth E. Jansen 						PhastaIOActiveFiles[i]->master_header,
120059599516SKenneth E. Jansen 						MasterHeaderSize,
120159599516SKenneth E. Jansen 						MPI_CHAR,
120259599516SKenneth E. Jansen 						&write_header_status );
120359599516SKenneth E. Jansen 			}
120459599516SKenneth E. Jansen 
120559599516SKenneth E. Jansen 			////free(PhastaIOActiveFiles[i]->master_header);
120659599516SKenneth E. Jansen 
120759599516SKenneth E. Jansen 			for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) {
120859599516SKenneth E. Jansen 				free ( header_table[j] );
120959599516SKenneth E. Jansen 			}
121059599516SKenneth E. Jansen 			free (header_table);
121159599516SKenneth E. Jansen 		}
121259599516SKenneth E. Jansen 
121359599516SKenneth E. Jansen 		//if( irank == 0 ) printf("gonna file_close(), myrank = %d\n", irank);
121459599516SKenneth E. Jansen 		MPI_File_close( &( PhastaIOActiveFiles[i]->file_handle ) );
121559599516SKenneth E. Jansen 		free ( imode );
121659599516SKenneth E. Jansen 	}
121759599516SKenneth E. Jansen 
121859599516SKenneth E. Jansen 	endTimer(&timer_end);
121959599516SKenneth E. Jansen 	printPerf("closefile_", timer_start, timer_end, 0, 0, "");
122059599516SKenneth E. Jansen }
122159599516SKenneth E. Jansen 
12223872e963SCameron Smith int readHeader( FILE* f, const char phrase[],
12233872e963SCameron Smith     int* params, int numParams, const char* iotype) {
12243872e963SCameron Smith   isBinary(iotype);
12253872e963SCameron Smith   return readHeader(f,phrase,params,numParams);
12263872e963SCameron Smith }
12273872e963SCameron Smith 
122859599516SKenneth E. Jansen void readheader( int* fileDescriptor,
122959599516SKenneth E. Jansen                   const  char keyphrase[],
123059599516SKenneth E. Jansen                   void* valueArray,
123159599516SKenneth E. Jansen                   int*  nItems,
123259599516SKenneth E. Jansen                   const char  datatype[],
123359599516SKenneth E. Jansen                   const char  iotype[] )
123459599516SKenneth E. Jansen {
123559599516SKenneth E. Jansen      	double timer_start, timer_end;
1236d3337298SCameron Smith 
123759599516SKenneth E. Jansen 	startTimer(&timer_start);
123859599516SKenneth E. Jansen 
123959599516SKenneth E. Jansen 	int i = *fileDescriptor;
124059599516SKenneth E. Jansen 	checkFileDescriptor("readheader",&i);
124159599516SKenneth E. Jansen 
124259599516SKenneth E. Jansen 	if ( PhastaIONextActiveIndex == 0 ) {
124359599516SKenneth E. Jansen 		int filePtr = *fileDescriptor - 1;
124459599516SKenneth E. Jansen 		FILE* fileObject;
124559599516SKenneth E. Jansen 		int* valueListInt;
124659599516SKenneth E. Jansen 
124759599516SKenneth E. Jansen 		if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) {
124859599516SKenneth E. Jansen 			fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor);
124959599516SKenneth E. Jansen 			fprintf(stderr,"openfile_ function has to be called before \n") ;
125059599516SKenneth E. Jansen 			fprintf(stderr,"acessing the file\n ") ;
125159599516SKenneth E. Jansen 			fprintf(stderr,"fatal error: cannot continue, returning out of call\n");
125259599516SKenneth E. Jansen                         endTimer(&timer_end);
125359599516SKenneth E. Jansen                         printPerf("readheader", timer_start, timer_end, 0, 0, "");
125459599516SKenneth E. Jansen 			return;
125559599516SKenneth E. Jansen 		}
125659599516SKenneth E. Jansen 
1257961a4ff6SCameron Smith                 LastHeaderKey[filePtr] = std::string(keyphrase);
125859599516SKenneth E. Jansen 		LastHeaderNotFound = false;
125959599516SKenneth E. Jansen 
126059599516SKenneth E. Jansen 		fileObject = fileArray[ filePtr ] ;
126159599516SKenneth E. Jansen 		Wrong_Endian = byte_order[ filePtr ];
126259599516SKenneth E. Jansen 
126359599516SKenneth E. Jansen 		isBinary( iotype );
126459599516SKenneth E. Jansen 		typeSize( datatype );   //redundant call, just avoid a compiler warning.
126559599516SKenneth E. Jansen 
126659599516SKenneth E. Jansen 		// right now we are making the assumption that we will only write integers
126759599516SKenneth E. Jansen 		// on the header line.
126859599516SKenneth E. Jansen 
126959599516SKenneth E. Jansen 		valueListInt = static_cast< int* >( valueArray );
127059599516SKenneth E. Jansen 		int ierr = readHeader( fileObject ,
127159599516SKenneth E. Jansen 				keyphrase,
127259599516SKenneth E. Jansen 				valueListInt,
127359599516SKenneth E. Jansen 				*nItems ) ;
127459599516SKenneth E. Jansen 
127559599516SKenneth E. Jansen 		byte_order[ filePtr ] = Wrong_Endian ;
127659599516SKenneth E. Jansen 
127759599516SKenneth E. Jansen 		if ( ierr ) LastHeaderNotFound = true;
127859599516SKenneth E. Jansen 
127959599516SKenneth E. Jansen 		//return ; // don't return, go to the end to print perf
128059599516SKenneth E. Jansen 	}
128159599516SKenneth E. Jansen 	else {
128259599516SKenneth E. Jansen 		unsigned int skip_size;
128359599516SKenneth E. Jansen 		int* valueListInt;
128459599516SKenneth E. Jansen 		valueListInt = static_cast <int*>(valueArray);
1285400e9fc0SCameron Smith 		char* token = NULL;
128659599516SKenneth E. Jansen 		bool FOUND = false ;
128759599516SKenneth E. Jansen 		isBinary( iotype );
128859599516SKenneth E. Jansen 
128959599516SKenneth E. Jansen 		MPI_Status read_offset_status;
129059599516SKenneth E. Jansen 		char read_out_tag[MAX_FIELDS_NAME_LENGTH];
1291400e9fc0SCameron Smith                 memset(read_out_tag, '\0', MAX_FIELDS_NAME_LENGTH);
129259599516SKenneth E. Jansen 		char readouttag[MAX_FIELDS_NUMBER][MAX_FIELDS_NAME_LENGTH];
129359599516SKenneth E. Jansen 		int j;
129459599516SKenneth E. Jansen 
129559599516SKenneth E. Jansen 		int string_length = strlen( keyphrase );
129659599516SKenneth E. Jansen 		char* buffer = (char*) malloc ( string_length+1 );
129759599516SKenneth E. Jansen 
129859599516SKenneth E. Jansen 		strcpy ( buffer, keyphrase );
129959599516SKenneth E. Jansen 		buffer[ string_length ] = '\0';
130059599516SKenneth E. Jansen 
130159599516SKenneth E. Jansen 		char* st2 = strtok ( buffer, "@" );
130259599516SKenneth E. Jansen 		st2 = strtok (NULL, "@");
130359599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->GPid = atoi(st2);
130459599516SKenneth E. Jansen 		if ( char* p = strpbrk(buffer, "@") )
130559599516SKenneth E. Jansen 			*p = '\0';
130659599516SKenneth E. Jansen 
130759599516SKenneth E. Jansen 		// Check if the user has input the right GPid
130859599516SKenneth E. Jansen 		if ( ( PhastaIOActiveFiles[i]->GPid <=
130959599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->myrank *
131059599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->nppp )||
131159599516SKenneth E. Jansen 				( PhastaIOActiveFiles[i]->GPid >
131259599516SKenneth E. Jansen 					( PhastaIOActiveFiles[i]->myrank + 1 ) *
131359599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->nppp ) )
131459599516SKenneth E. Jansen 		{
131559599516SKenneth E. Jansen 			*fileDescriptor = NOT_A_MPI_FILE;
131659599516SKenneth E. Jansen 			printf("Error readheader: The file is not in syncIO new format, please check! myrank = %d, GPid = %d, nppp = %d, keyphrase = %s\n", PhastaIOActiveFiles[i]->myrank, PhastaIOActiveFiles[i]->GPid, PhastaIOActiveFiles[i]->nppp, keyphrase);
131759599516SKenneth E. Jansen                         // It is possible atoi could not generate a clear integer from st2 because of additional garbage character in keyphrase
131859599516SKenneth E. Jansen                         endTimer(&timer_end);
131959599516SKenneth E. Jansen                         printPerf("readheader", timer_start, timer_end, 0, 0, "");
132059599516SKenneth E. Jansen 			return;
132159599516SKenneth E. Jansen 		}
132259599516SKenneth E. Jansen 
132359599516SKenneth E. Jansen 		// Find the field we want ...
132459599516SKenneth E. Jansen 		//for ( j = 0; j<MAX_FIELDS_NUMBER; j++ )
132559599516SKenneth E. Jansen 		for ( j = 0; j<PhastaIOActiveFiles[i]->nFields; j++ )
132659599516SKenneth E. Jansen 		{
132759599516SKenneth E. Jansen 			memcpy( readouttag[j],
132859599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->master_header + j*MAX_FIELDS_NAME_LENGTH+MAX_FIELDS_NAME_LENGTH*2+1,
132959599516SKenneth E. Jansen 					MAX_FIELDS_NAME_LENGTH-1 );
133059599516SKenneth E. Jansen 		}
133159599516SKenneth E. Jansen 
133259599516SKenneth E. Jansen 		for ( j = 0; j<PhastaIOActiveFiles[i]->nFields; j++ )
133359599516SKenneth E. Jansen 		{
133459599516SKenneth E. Jansen 			token = strtok ( readouttag[j], ":" );
133559599516SKenneth E. Jansen 
133659599516SKenneth E. Jansen 			//if ( cscompare( buffer, token ) )
133759599516SKenneth E. Jansen 			if ( cscompare( token , buffer ) && cscompare( buffer, token ) )
133859599516SKenneth E. Jansen                         // This double comparison is required for the field "number of nodes" and all the other fields that start with "number of nodes" (i.g. number of nodes in the mesh").
133959599516SKenneth E. Jansen                         // Would be safer to rename "number of nodes" by "number of nodes in the part" so that the name are completely unique. But much more work to do that (Nspre, phParAdapt, etc).
134059599516SKenneth E. Jansen                         // Since the field name are unique in SyncIO (as it includes part ID), this should be safe and there should be no issue with the "?" trailing character.
134159599516SKenneth E. Jansen 			{
134259599516SKenneth E. Jansen 				PhastaIOActiveFiles[i]->read_field_count = j;
134359599516SKenneth E. Jansen 				FOUND = true;
134459599516SKenneth E. Jansen                                 //printf("buffer: %s | token: %s | j: %d\n",buffer,token,j);
134559599516SKenneth E. Jansen 				break;
134659599516SKenneth E. Jansen 			}
134759599516SKenneth E. Jansen 		}
134859599516SKenneth E. Jansen                 free(buffer);
134959599516SKenneth E. Jansen 
135059599516SKenneth E. Jansen 		if (!FOUND)
135159599516SKenneth E. Jansen 		{
135259599516SKenneth E. Jansen 			//if(irank==0) printf("Warning readheader: Not found %s \n",keyphrase); //PhastaIOActiveFiles[i]->myrank is certainly initialized here.
135359599516SKenneth E. Jansen 			if(PhastaIOActiveFiles[i]->myrank == 0) printf("WARNING readheader: Not found %s\n",keyphrase);
135459599516SKenneth E. Jansen                         endTimer(&timer_end);
135559599516SKenneth E. Jansen                         printPerf("readheader", timer_start, timer_end, 0, 0, "");
135659599516SKenneth E. Jansen 			return;
135759599516SKenneth E. Jansen 		}
135859599516SKenneth E. Jansen 
135959599516SKenneth E. Jansen 		// Find the part we want ...
136059599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->read_part_count = PhastaIOActiveFiles[i]->GPid -
136159599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->myrank * PhastaIOActiveFiles[i]->nppp - 1;
136259599516SKenneth E. Jansen 
136359599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->my_offset =
136459599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->my_read_table[PhastaIOActiveFiles[i]->read_field_count][PhastaIOActiveFiles[i]->read_part_count];
136559599516SKenneth E. Jansen 
136659599516SKenneth E. Jansen 		// 	  printf("****Rank %d offset is %d\n",PhastaIOActiveFiles[i]->myrank,PhastaIOActiveFiles[i]->my_offset);
136759599516SKenneth E. Jansen 
136859599516SKenneth E. Jansen 		// Read each datablock header here ...
136959599516SKenneth E. Jansen 
137059599516SKenneth E. Jansen 		MPI_File_read_at_all( PhastaIOActiveFiles[i]->file_handle,
137159599516SKenneth E. Jansen 				PhastaIOActiveFiles[i]->my_offset+1,
137259599516SKenneth E. Jansen 				read_out_tag,
137359599516SKenneth E. Jansen 				MAX_FIELDS_NAME_LENGTH-1,
137459599516SKenneth E. Jansen 				MPI_CHAR,
137559599516SKenneth E. Jansen 				&read_offset_status );
137659599516SKenneth E. Jansen 		token = strtok ( read_out_tag, ":" );
137759599516SKenneth E. Jansen 
137859599516SKenneth E. Jansen 		// 	  printf("&&&&Rank %d read_out_tag is %s\n",PhastaIOActiveFiles[i]->myrank,read_out_tag);
137959599516SKenneth E. Jansen 
138059599516SKenneth E. Jansen 		if( cscompare( keyphrase , token ) ) //No need to compare also token with keyphrase like above. We should already have the right one. Otherwise there is a problem.
138159599516SKenneth E. Jansen 		{
138259599516SKenneth E. Jansen 			FOUND = true ;
138359599516SKenneth E. Jansen 			token = strtok( NULL, " ,;<>" );
138459599516SKenneth E. Jansen 			skip_size = atoi( token );
138559599516SKenneth E. Jansen 			for( j=0; j < *nItems && ( token = strtok( NULL," ,;<>") ); j++ )
138659599516SKenneth E. Jansen 				valueListInt[j] = atoi( token );
138759599516SKenneth E. Jansen 
138859599516SKenneth E. Jansen 			if ( j < *nItems )
138959599516SKenneth E. Jansen 			{
139059599516SKenneth E. Jansen 				fprintf( stderr, "Expected # of ints not found for: %s\n", keyphrase );
139159599516SKenneth E. Jansen 			}
139259599516SKenneth E. Jansen 		}
139359599516SKenneth E. Jansen                 else {
139459599516SKenneth E. Jansen                   //if(irank==0)
139559599516SKenneth E. Jansen 		  if(PhastaIOActiveFiles[i]->myrank == 0)
139659599516SKenneth E. Jansen                   // If we enter this if, there is a problem with the name of some fields
139759599516SKenneth E. Jansen                   {
139859599516SKenneth E. Jansen                     printf("Error readheader: Unexpected mismatch between keyphrase = %s and token = %s\n",keyphrase,token);
139959599516SKenneth E. Jansen                   }
140059599516SKenneth E. Jansen                 }
140159599516SKenneth E. Jansen 	}
140259599516SKenneth E. Jansen 
140359599516SKenneth E. Jansen 	endTimer(&timer_end);
140459599516SKenneth E. Jansen 	printPerf("readheader", timer_start, timer_end, 0, 0, "");
140559599516SKenneth E. Jansen 
140659599516SKenneth E. Jansen }
140759599516SKenneth E. Jansen 
14083956dcfeSCameron Smith void readDataBlock(
14093956dcfeSCameron Smith     FILE* fileObject,
14103956dcfeSCameron Smith     void* valueArray,
14113956dcfeSCameron Smith     int nItems,
14123956dcfeSCameron Smith     const char  datatype[],
14133956dcfeSCameron Smith     const char  iotype[] )
14143956dcfeSCameron Smith {
14153956dcfeSCameron Smith   isBinary(iotype);
14163956dcfeSCameron Smith   size_t type_size = typeSize( datatype );
14173956dcfeSCameron Smith   if ( binary_format ) {
14183956dcfeSCameron Smith     char junk = '\0';
14193956dcfeSCameron Smith     fread( valueArray, type_size, nItems, fileObject );
14203956dcfeSCameron Smith     fread( &junk, sizeof(char), 1 , fileObject );
14213956dcfeSCameron Smith     if ( Wrong_Endian ) SwapArrayByteOrder( valueArray, type_size, nItems );
14223956dcfeSCameron Smith   } else {
14233956dcfeSCameron Smith     char* ts1 = StringStripper( datatype );
14243956dcfeSCameron Smith     if ( cscompare( "integer", ts1 ) ) {
14253956dcfeSCameron Smith       for( int n=0; n < nItems ; n++ )
14263956dcfeSCameron Smith         fscanf(fileObject, "%d\n",(int*)((int*)valueArray+n) );
14273956dcfeSCameron Smith     } else if ( cscompare( "double", ts1 ) ) {
14283956dcfeSCameron Smith       for( int n=0; n < nItems ; n++ )
14293956dcfeSCameron Smith         fscanf(fileObject, "%lf\n",(double*)((double*)valueArray+n) );
14303956dcfeSCameron Smith     }
14313956dcfeSCameron Smith     free (ts1);
14323956dcfeSCameron Smith   }
14333956dcfeSCameron Smith }
14343956dcfeSCameron Smith 
143559599516SKenneth E. Jansen void readdatablock( int*  fileDescriptor,
143659599516SKenneth E. Jansen                      const char keyphrase[],
143759599516SKenneth E. Jansen                      void* valueArray,
143859599516SKenneth E. Jansen                      int*  nItems,
143959599516SKenneth E. Jansen                      const char  datatype[],
144059599516SKenneth E. Jansen                      const char  iotype[] )
144159599516SKenneth E. Jansen {
144259599516SKenneth E. Jansen 	//if(irank == 0) printf("entering readdatablock()\n");
14432dd307a1SCameron Smith 	unsigned long data_size = 0;
144459599516SKenneth E. Jansen 	double timer_start, timer_end;
144559599516SKenneth E. Jansen 	startTimer(&timer_start);
144659599516SKenneth E. Jansen 
144759599516SKenneth E. Jansen 	int i = *fileDescriptor;
144859599516SKenneth E. Jansen 	checkFileDescriptor("readdatablock",&i);
144959599516SKenneth E. Jansen 
145059599516SKenneth E. Jansen 	if ( PhastaIONextActiveIndex == 0 ) {
145159599516SKenneth E. Jansen 		int filePtr = *fileDescriptor - 1;
145259599516SKenneth E. Jansen 		FILE* fileObject;
145359599516SKenneth E. Jansen 		char junk;
145459599516SKenneth E. Jansen 
145559599516SKenneth E. Jansen 		if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) {
145659599516SKenneth E. Jansen 			fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor);
145759599516SKenneth E. Jansen 			fprintf(stderr,"openfile_ function has to be called before\n") ;
145859599516SKenneth E. Jansen 			fprintf(stderr,"acessing the file\n ") ;
145959599516SKenneth E. Jansen 			fprintf(stderr,"fatal error: cannot continue, returning out of call\n");
146059599516SKenneth E. Jansen                         endTimer(&timer_end);
146159599516SKenneth E. Jansen                         printPerf("readdatablock", timer_start, timer_end, 0, 0, "");
146259599516SKenneth E. Jansen 			return;
146359599516SKenneth E. Jansen 		}
146459599516SKenneth E. Jansen 
146559599516SKenneth E. Jansen 		// error check..
146659599516SKenneth E. Jansen 		// since we require that a consistant header always preceed the data block
146759599516SKenneth E. Jansen 		// let us check to see that it is actually the case.
146859599516SKenneth E. Jansen 
1469961a4ff6SCameron Smith 		if ( ! cscompare( LastHeaderKey[ filePtr ].c_str(), keyphrase ) ) {
147059599516SKenneth E. Jansen 			fprintf(stderr, "Header not consistant with data block\n");
1471961a4ff6SCameron Smith 			fprintf(stderr, "Header: %s\n", LastHeaderKey[ filePtr ].c_str() );
147259599516SKenneth E. Jansen 			fprintf(stderr, "DataBlock: %s\n ", keyphrase );
147359599516SKenneth E. Jansen 			fprintf(stderr, "Please recheck read sequence \n");
147459599516SKenneth E. Jansen 			if( Strict_Error ) {
147559599516SKenneth E. Jansen 				fprintf(stderr, "fatal error: cannot continue, returning out of call\n");
147659599516SKenneth E. Jansen                                 endTimer(&timer_end);
147759599516SKenneth E. Jansen                                 printPerf("readdatablock", timer_start, timer_end, 0, 0, "");
147859599516SKenneth E. Jansen 				return;
147959599516SKenneth E. Jansen 			}
148059599516SKenneth E. Jansen 		}
148159599516SKenneth E. Jansen 
148259599516SKenneth E. Jansen 		if ( LastHeaderNotFound ) {
148359599516SKenneth E. Jansen                         endTimer(&timer_end);
148459599516SKenneth E. Jansen                         printPerf("readdatablock", timer_start, timer_end, 0, 0, "");
148559599516SKenneth E. Jansen                         return;
148659599516SKenneth E. Jansen                 }
148759599516SKenneth E. Jansen 		fileObject = fileArray[ filePtr ];
148859599516SKenneth E. Jansen 		Wrong_Endian = byte_order[ filePtr ];
1489bae968b9SCameron Smith                 LastHeaderKey.erase(filePtr);
14903956dcfeSCameron Smith                 readDataBlock(fileObject,valueArray,*nItems,datatype,iotype);
149159599516SKenneth E. Jansen 
149259599516SKenneth E. Jansen 		//return;
149359599516SKenneth E. Jansen 	}
149459599516SKenneth E. Jansen 	else {
149559599516SKenneth E. Jansen 		// 	  printf("read data block\n");
149659599516SKenneth E. Jansen 		MPI_Status read_data_status;
149759599516SKenneth E. Jansen 		size_t type_size = typeSize( datatype );
149859599516SKenneth E. Jansen 		int nUnits = *nItems;
149959599516SKenneth E. Jansen 		isBinary( iotype );
150059599516SKenneth E. Jansen 
150159599516SKenneth E. Jansen 		// read datablock then
150259599516SKenneth E. Jansen 		//MR CHANGE
150359599516SKenneth E. Jansen 		//             if ( cscompare ( datatype, "double"))
150459599516SKenneth E. Jansen 		char* ts2 = StringStripper( datatype );
150559599516SKenneth E. Jansen 		if ( cscompare ( "double" , ts2))
150659599516SKenneth E. Jansen 			//MR CHANGE END
150759599516SKenneth E. Jansen 		{
150859599516SKenneth E. Jansen 
150959599516SKenneth E. Jansen 			MPI_File_read_at_all_begin( PhastaIOActiveFiles[i]->file_handle,
151059599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->my_offset + DB_HEADER_SIZE,
151159599516SKenneth E. Jansen 					valueArray,
151259599516SKenneth E. Jansen 					nUnits,
151359599516SKenneth E. Jansen 					MPI_DOUBLE );
151459599516SKenneth E. Jansen 			MPI_File_read_at_all_end( PhastaIOActiveFiles[i]->file_handle,
151559599516SKenneth E. Jansen 					valueArray,
151659599516SKenneth E. Jansen 					&read_data_status );
151759599516SKenneth E. Jansen 			data_size=8*nUnits;
151859599516SKenneth E. Jansen 
151959599516SKenneth E. Jansen 		}
152059599516SKenneth E. Jansen 		//MR CHANGE
152159599516SKenneth E. Jansen 		//             else if ( cscompare ( datatype, "integer"))
152259599516SKenneth E. Jansen 		else if ( cscompare ( "integer" , ts2))
152359599516SKenneth E. Jansen 			//MR CHANGE END
152459599516SKenneth E. Jansen 		{
152559599516SKenneth E. Jansen 			MPI_File_read_at_all_begin(PhastaIOActiveFiles[i]->file_handle,
152659599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->my_offset + DB_HEADER_SIZE,
152759599516SKenneth E. Jansen 					valueArray,
152859599516SKenneth E. Jansen 					nUnits,
152959599516SKenneth E. Jansen 					MPI_INT );
153059599516SKenneth E. Jansen 			MPI_File_read_at_all_end( PhastaIOActiveFiles[i]->file_handle,
153159599516SKenneth E. Jansen 					valueArray,
153259599516SKenneth E. Jansen 					&read_data_status );
153359599516SKenneth E. Jansen 			data_size=4*nUnits;
153459599516SKenneth E. Jansen 		}
153559599516SKenneth E. Jansen 		else
153659599516SKenneth E. Jansen 		{
153759599516SKenneth E. Jansen 			*fileDescriptor = DATA_TYPE_ILLEGAL;
153859599516SKenneth E. Jansen 			printf("readdatablock - DATA_TYPE_ILLEGAL - %s\n",datatype);
153959599516SKenneth E. Jansen                         endTimer(&timer_end);
154059599516SKenneth E. Jansen                         printPerf("readdatablock", timer_start, timer_end, 0, 0, "");
154159599516SKenneth E. Jansen 			return;
154259599516SKenneth E. Jansen 		}
154359599516SKenneth E. Jansen                 free(ts2);
154459599516SKenneth E. Jansen 
154559599516SKenneth E. Jansen 
154659599516SKenneth E. Jansen 		// 	  printf("%d Read finishe\n",PhastaIOActiveFiles[i]->myrank);
154759599516SKenneth E. Jansen 
154859599516SKenneth E. Jansen 		// Swap data byte order if endianess is different ...
154959599516SKenneth E. Jansen 		if ( PhastaIOActiveFiles[i]->Wrong_Endian )
155059599516SKenneth E. Jansen 		{
155159599516SKenneth E. Jansen 			SwapArrayByteOrder( valueArray, type_size, nUnits );
155259599516SKenneth E. Jansen 		}
155359599516SKenneth E. Jansen 	}
155459599516SKenneth E. Jansen 
155559599516SKenneth E. Jansen 	endTimer(&timer_end);
155659599516SKenneth E. Jansen 	char extra_msg[1024];
155759599516SKenneth E. Jansen 	memset(extra_msg, '\0', 1024);
155859599516SKenneth E. Jansen 	char* key = StringStripper(keyphrase);
155959599516SKenneth E. Jansen 	sprintf(extra_msg, " field is %s ", key);
156059599516SKenneth E. Jansen 	printPerf("readdatablock", timer_start, timer_end, data_size, 1, extra_msg);
156159599516SKenneth E. Jansen         free(key);
156259599516SKenneth E. Jansen 
156359599516SKenneth E. Jansen }
156459599516SKenneth E. Jansen 
1565ea868eb1SCameron Smith void writeHeader(FILE* f,
1566ea868eb1SCameron Smith                  const char keyphrase[],
1567ea868eb1SCameron Smith                  const void* valueArray,
1568ea868eb1SCameron Smith                  const int nItems,
1569ea868eb1SCameron Smith                  const int ndataItems,
1570ea868eb1SCameron Smith                  const char datatype[],
1571ea868eb1SCameron Smith                  const char iotype[])
1572ea868eb1SCameron Smith {
1573ea868eb1SCameron Smith   isBinary( iotype );
1574ea868eb1SCameron Smith 
1575ea868eb1SCameron Smith   const int _newline =
1576ea868eb1SCameron Smith     ( ndataItems > 0 ) ? sizeof( char ) : 0;
1577ea868eb1SCameron Smith   int size_of_nextblock =
1578ea868eb1SCameron Smith     ( binary_format ) ? typeSize(datatype) * ndataItems + _newline : ndataItems;
1579ea868eb1SCameron Smith 
1580ea868eb1SCameron Smith   fprintf( f, "%s : < %d > ", keyphrase, size_of_nextblock );
1581ea868eb1SCameron Smith   for( int i = 0; i < nItems; i++ )
1582ea868eb1SCameron Smith     fprintf( f, "%d ", *((int*)((int*)valueArray+i)));
1583ea868eb1SCameron Smith   fprintf( f, "\n");
1584ea868eb1SCameron Smith }
1585ea868eb1SCameron Smith 
158659599516SKenneth E. Jansen void writeheader(  const int* fileDescriptor,
158759599516SKenneth E. Jansen                     const char keyphrase[],
158859599516SKenneth E. Jansen                     const void* valueArray,
158959599516SKenneth E. Jansen                     const int* nItems,
159059599516SKenneth E. Jansen                     const int* ndataItems,
159159599516SKenneth E. Jansen                     const char datatype[],
159259599516SKenneth E. Jansen                     const char iotype[])
159359599516SKenneth E. Jansen {
159459599516SKenneth E. Jansen 
159559599516SKenneth E. Jansen 	//if(irank == 0) printf("entering writeheader()\n");
159659599516SKenneth E. Jansen 
159759599516SKenneth E. Jansen 	double timer_start, timer_end;
159859599516SKenneth E. Jansen 	startTimer(&timer_start);
159959599516SKenneth E. Jansen 
160059599516SKenneth E. Jansen 	int i = *fileDescriptor;
160159599516SKenneth E. Jansen 	checkFileDescriptor("writeheader",&i);
160259599516SKenneth E. Jansen 
160359599516SKenneth E. Jansen 	if ( PhastaIONextActiveIndex == 0 ) {
160459599516SKenneth E. Jansen 		int filePtr = *fileDescriptor - 1;
160559599516SKenneth E. Jansen 		if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) {
160659599516SKenneth E. Jansen 			fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor);
160759599516SKenneth E. Jansen 			fprintf(stderr,"openfile_ function has to be called before \n") ;
160859599516SKenneth E. Jansen 			fprintf(stderr,"acessing the file\n ") ;
160959599516SKenneth E. Jansen 			fprintf(stderr,"fatal error: cannot continue, returning out of call\n");
161059599516SKenneth E. Jansen                         endTimer(&timer_end);
161159599516SKenneth E. Jansen                         printPerf("writeheader", timer_start, timer_end, 0, 0, "");
161259599516SKenneth E. Jansen 			return;
161359599516SKenneth E. Jansen 		}
161459599516SKenneth E. Jansen 
1615961a4ff6SCameron Smith                 LastHeaderKey[filePtr] = std::string(keyphrase);
161659599516SKenneth E. Jansen 		DataSize = *ndataItems;
1617ea868eb1SCameron Smith                 FILE* fileObject = fileArray[ filePtr ] ;
1618ea868eb1SCameron Smith                 header_type[ filePtr ] = typeSize( datatype );
1619ea868eb1SCameron Smith                 writeHeader(fileObject,keyphrase,valueArray,*nItems,
1620ea868eb1SCameron Smith                     *ndataItems,datatype,iotype);
162159599516SKenneth E. Jansen 	}
162259599516SKenneth E. Jansen 	else { // else it's parallel I/O
162359599516SKenneth E. Jansen 		DataSize = *ndataItems;
162459599516SKenneth E. Jansen 		size_t type_size = typeSize( datatype );
162559599516SKenneth E. Jansen 		isBinary( iotype );
162659599516SKenneth E. Jansen 		char mpi_tag[MAX_FIELDS_NAME_LENGTH];
162759599516SKenneth E. Jansen 
162859599516SKenneth E. Jansen 		int string_length = strlen( keyphrase );
162959599516SKenneth E. Jansen 		char* buffer = (char*) malloc ( string_length+1 );
163059599516SKenneth E. Jansen 
163159599516SKenneth E. Jansen 		strcpy ( buffer, keyphrase);
163259599516SKenneth E. Jansen 		buffer[ string_length ] = '\0';
163359599516SKenneth E. Jansen 
163459599516SKenneth E. Jansen 		char* st2 = strtok ( buffer, "@" );
163559599516SKenneth E. Jansen 		st2 = strtok (NULL, "@");
163659599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->GPid = atoi(st2);
163759599516SKenneth E. Jansen 
163859599516SKenneth E. Jansen 		if ( char* p = strpbrk(buffer, "@") )
163959599516SKenneth E. Jansen 			*p = '\0';
164059599516SKenneth E. Jansen 
164159599516SKenneth E. Jansen 	        bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH);
164259599516SKenneth E. Jansen 		sprintf(mpi_tag, "\n%s : %d\n", buffer, PhastaIOActiveFiles[i]->field_count);
16432dd307a1SCameron Smith 		unsigned long offset_value;
164459599516SKenneth E. Jansen 
164559599516SKenneth E. Jansen 		int temp = *ndataItems;
16462dd307a1SCameron Smith 		unsigned long number_of_items = (unsigned long)temp;
164759599516SKenneth E. Jansen 		MPI_Barrier(PhastaIOActiveFiles[i]->local_comm);
164859599516SKenneth E. Jansen 
164959599516SKenneth E. Jansen 		MPI_Scan( &number_of_items,
165059599516SKenneth E. Jansen 				&offset_value,
165159599516SKenneth E. Jansen 				1,
165259599516SKenneth E. Jansen 				MPI_LONG_LONG_INT,
165359599516SKenneth E. Jansen 				MPI_SUM,
165459599516SKenneth E. Jansen 				PhastaIOActiveFiles[i]->local_comm );
165559599516SKenneth E. Jansen 
165659599516SKenneth E. Jansen 		offset_value = (offset_value - number_of_items) * type_size;
165759599516SKenneth E. Jansen 
165859599516SKenneth E. Jansen 		offset_value += PhastaIOActiveFiles[i]->local_myrank *
165959599516SKenneth E. Jansen 			DB_HEADER_SIZE +
166059599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->next_start_address;
166159599516SKenneth E. Jansen 		// This offset is the starting address of each datablock header...
166259599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->my_offset = offset_value;
166359599516SKenneth E. Jansen 
166459599516SKenneth E. Jansen 		// Write in my offset table ...
166559599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->my_offset_table[PhastaIOActiveFiles[i]->field_count][PhastaIOActiveFiles[i]->part_count] =
166659599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->my_offset;
166759599516SKenneth E. Jansen 
166859599516SKenneth E. Jansen 		// Update the next-start-address ...
166959599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->next_start_address = offset_value +
167059599516SKenneth E. Jansen 			number_of_items * type_size +
167159599516SKenneth E. Jansen 			DB_HEADER_SIZE;
167259599516SKenneth E. Jansen 		MPI_Bcast( &(PhastaIOActiveFiles[i]->next_start_address),
167359599516SKenneth E. Jansen 				1,
167459599516SKenneth E. Jansen 				MPI_LONG_LONG_INT,
167559599516SKenneth E. Jansen 				PhastaIOActiveFiles[i]->local_numprocs-1,
167659599516SKenneth E. Jansen 				PhastaIOActiveFiles[i]->local_comm );
167759599516SKenneth E. Jansen 
167859599516SKenneth E. Jansen 		// Prepare datablock header ...
167959599516SKenneth E. Jansen 		int _newline = (*ndataItems>0)?sizeof(char):0;
168059599516SKenneth E. Jansen 		unsigned int size_of_nextblock = type_size * (*ndataItems) + _newline;
168159599516SKenneth E. Jansen 
168259599516SKenneth E. Jansen 		//char datablock_header[255];
168359599516SKenneth E. Jansen 		//bzero((void*)datablock_header,255);
168459599516SKenneth E. Jansen 		char datablock_header[DB_HEADER_SIZE];
168559599516SKenneth E. Jansen 		bzero((void*)datablock_header,DB_HEADER_SIZE);
168659599516SKenneth E. Jansen 
168759599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->GPid = PhastaIOActiveFiles[i]->nppp*PhastaIOActiveFiles[i]->myrank+PhastaIOActiveFiles[i]->part_count;
168859599516SKenneth E. Jansen 		sprintf( datablock_header,
168959599516SKenneth E. Jansen 				"\n%s : < %u >",
169059599516SKenneth E. Jansen 				keyphrase,
169159599516SKenneth E. Jansen 				size_of_nextblock );
169259599516SKenneth E. Jansen 
169359599516SKenneth E. Jansen 		for ( int j = 0; j < *nItems; j++ )
169459599516SKenneth E. Jansen 		{
169559599516SKenneth E. Jansen 			sprintf( datablock_header,
169659599516SKenneth E. Jansen 					"%s %d ",
169759599516SKenneth E. Jansen 					datablock_header,
169859599516SKenneth E. Jansen 					*((int*)((int*)valueArray+j)));
169959599516SKenneth E. Jansen 		}
170059599516SKenneth E. Jansen 		sprintf( datablock_header,
170159599516SKenneth E. Jansen 				"%s\n ",
170259599516SKenneth E. Jansen 				datablock_header );
170359599516SKenneth E. Jansen 
170459599516SKenneth E. Jansen 		// Write datablock header ...
170559599516SKenneth E. Jansen 		//MR CHANGE
170659599516SKenneth E. Jansen 		// 	if ( cscompare(datatype,"double") )
170759599516SKenneth E. Jansen 		char* ts1 = StringStripper( datatype );
170859599516SKenneth E. Jansen 		if ( cscompare("double",ts1) )
170959599516SKenneth E. Jansen 			//MR CHANGE END
171059599516SKenneth E. Jansen 		{
171159599516SKenneth E. Jansen 			free ( PhastaIOActiveFiles[i]->double_chunk );
171259599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->double_chunk = ( double * )malloc( (sizeof( double )*number_of_items+ DB_HEADER_SIZE));
171359599516SKenneth E. Jansen 
171459599516SKenneth E. Jansen 			double * aa = ( double * )datablock_header;
171559599516SKenneth E. Jansen 			memcpy(PhastaIOActiveFiles[i]->double_chunk, aa, DB_HEADER_SIZE);
171659599516SKenneth E. Jansen 		}
171759599516SKenneth E. Jansen 		//MR CHANGE
171859599516SKenneth E. Jansen 		// 	if  ( cscompare(datatype,"integer") )
171959599516SKenneth E. Jansen 		else if ( cscompare("integer",ts1) )
172059599516SKenneth E. Jansen 			//MR CHANGE END
172159599516SKenneth E. Jansen 		{
172259599516SKenneth E. Jansen 			free ( PhastaIOActiveFiles[i]->int_chunk );
172359599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->int_chunk = ( int * )malloc( (sizeof( int )*number_of_items+ DB_HEADER_SIZE));
172459599516SKenneth E. Jansen 
172559599516SKenneth E. Jansen 			int * aa = ( int * )datablock_header;
172659599516SKenneth E. Jansen 			memcpy(PhastaIOActiveFiles[i]->int_chunk, aa, DB_HEADER_SIZE);
172759599516SKenneth E. Jansen 		}
172859599516SKenneth E. Jansen 		else {
172959599516SKenneth E. Jansen 			//             *fileDescriptor = DATA_TYPE_ILLEGAL;
173059599516SKenneth E. Jansen 			printf("writeheader - DATA_TYPE_ILLEGAL - %s\n",datatype);
173159599516SKenneth E. Jansen                         endTimer(&timer_end);
173259599516SKenneth E. Jansen                         printPerf("writeheader", timer_start, timer_end, 0, 0, "");
173359599516SKenneth E. Jansen 			return;
173459599516SKenneth E. Jansen 		}
173559599516SKenneth E. Jansen 		free(ts1);
173659599516SKenneth E. Jansen 
173759599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->part_count++;
173859599516SKenneth E. Jansen 		if ( PhastaIOActiveFiles[i]->part_count == PhastaIOActiveFiles[i]->nppp ) {
173959599516SKenneth E. Jansen 			//A new field will be written
174059599516SKenneth E. Jansen 			if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) {
174159599516SKenneth E. Jansen 				memcpy( PhastaIOActiveFiles[i]->master_header +
174259599516SKenneth E. Jansen 						PhastaIOActiveFiles[i]->field_count *
174359599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH +
174459599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH * 2,
174559599516SKenneth E. Jansen 						mpi_tag,
174659599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH-1);
174759599516SKenneth E. Jansen 			}
174859599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->field_count++;
174959599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->part_count=0;
175059599516SKenneth E. Jansen 		}
175159599516SKenneth E. Jansen                 free(buffer);
175259599516SKenneth E. Jansen 	}
175359599516SKenneth E. Jansen 
175459599516SKenneth E. Jansen 	endTimer(&timer_end);
175559599516SKenneth E. Jansen 	printPerf("writeheader", timer_start, timer_end, 0, 0, "");
175659599516SKenneth E. Jansen }
175759599516SKenneth E. Jansen 
1758ea868eb1SCameron Smith void writeDataBlock( FILE* f,
1759ea868eb1SCameron Smith                      const void* valueArray,
1760ea868eb1SCameron Smith                      const int   nItems,
1761ea868eb1SCameron Smith                      const char  datatype[],
1762ea868eb1SCameron Smith                      const char  iotype[]  )
1763ea868eb1SCameron Smith {
1764ea868eb1SCameron Smith   isBinary( iotype );
1765ea868eb1SCameron Smith   size_t type_size = typeSize( datatype );
1766ea868eb1SCameron Smith   if ( binary_format ) {
1767ea868eb1SCameron Smith     fwrite( valueArray, type_size, nItems, f );
1768ea868eb1SCameron Smith     fprintf( f,"\n");
1769ea868eb1SCameron Smith   } else {
1770ea868eb1SCameron Smith     char* ts1 = StringStripper( datatype );
1771ea868eb1SCameron Smith     if ( cscompare( "integer", ts1 ) ) {
1772ea868eb1SCameron Smith       for( int n=0; n < nItems ; n++ )
1773ea868eb1SCameron Smith         fprintf(f,"%d\n",*((int*)((int*)valueArray+n)));
1774ea868eb1SCameron Smith     } else if ( cscompare( "double", ts1 ) ) {
1775ea868eb1SCameron Smith       for( int n=0; n < nItems ; n++ )
1776ea868eb1SCameron Smith         fprintf(f,"%lf\n",*((double*)((double*)valueArray+n)));
1777ea868eb1SCameron Smith     }
1778ea868eb1SCameron Smith     free (ts1);
1779ea868eb1SCameron Smith   }
1780ea868eb1SCameron Smith }
1781ea868eb1SCameron Smith 
178259599516SKenneth E. Jansen void writedatablock( const int* fileDescriptor,
178359599516SKenneth E. Jansen                       const char keyphrase[],
178459599516SKenneth E. Jansen                       const void* valueArray,
178559599516SKenneth E. Jansen                       const int* nItems,
178659599516SKenneth E. Jansen                       const char datatype[],
178759599516SKenneth E. Jansen                       const char iotype[] )
178859599516SKenneth E. Jansen {
178959599516SKenneth E. Jansen 	//if(irank == 0) printf("entering writedatablock()\n");
179059599516SKenneth E. Jansen 
17912dd307a1SCameron Smith 	unsigned long data_size = 0;
179259599516SKenneth E. Jansen 	double timer_start, timer_end;
179359599516SKenneth E. Jansen 	startTimer(&timer_start);
179459599516SKenneth E. Jansen 
179559599516SKenneth E. Jansen 	int i = *fileDescriptor;
179659599516SKenneth E. Jansen 	checkFileDescriptor("writedatablock",&i);
179759599516SKenneth E. Jansen 
179859599516SKenneth E. Jansen 	if ( PhastaIONextActiveIndex == 0 ) {
179959599516SKenneth E. Jansen 		int filePtr = *fileDescriptor - 1;
180059599516SKenneth E. Jansen 
180159599516SKenneth E. Jansen 		if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) {
180259599516SKenneth E. Jansen 			fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor);
180359599516SKenneth E. Jansen 			fprintf(stderr,"openfile_ function has to be called before \n") ;
180459599516SKenneth E. Jansen 			fprintf(stderr,"acessing the file\n ") ;
180559599516SKenneth E. Jansen 			fprintf(stderr,"fatal error: cannot continue, returning out of call\n");
180659599516SKenneth E. Jansen                         endTimer(&timer_end);
180759599516SKenneth E. Jansen                         printPerf("writedatablock", timer_start, timer_end, 0, 0, "");
180859599516SKenneth E. Jansen 			return;
180959599516SKenneth E. Jansen 		}
181059599516SKenneth E. Jansen 		// since we require that a consistant header always preceed the data block
181159599516SKenneth E. Jansen 		// let us check to see that it is actually the case.
181259599516SKenneth E. Jansen 
1813961a4ff6SCameron Smith 		if ( ! cscompare( LastHeaderKey[ filePtr ].c_str(), keyphrase ) ) {
181459599516SKenneth E. Jansen 			fprintf(stderr, "Header not consistant with data block\n");
1815961a4ff6SCameron Smith 			fprintf(stderr, "Header: %s\n", LastHeaderKey[ filePtr ].c_str() );
181659599516SKenneth E. Jansen 			fprintf(stderr, "DataBlock: %s\n ", keyphrase );
181759599516SKenneth E. Jansen 			fprintf(stderr, "Please recheck write sequence \n");
181859599516SKenneth E. Jansen 			if( Strict_Error ) {
181959599516SKenneth E. Jansen 				fprintf(stderr, "fatal error: cannot continue, returning out of call\n");
182059599516SKenneth E. Jansen                                 endTimer(&timer_end);
182159599516SKenneth E. Jansen                                 printPerf("writedatablock", timer_start, timer_end, 0, 0, "");
182259599516SKenneth E. Jansen 				return;
182359599516SKenneth E. Jansen 			}
182459599516SKenneth E. Jansen 		}
182559599516SKenneth E. Jansen 
182659599516SKenneth E. Jansen 		FILE* fileObject =  fileArray[ filePtr ] ;
182759599516SKenneth E. Jansen 		size_t type_size=typeSize( datatype );
182859599516SKenneth E. Jansen 		isBinary( iotype );
182959599516SKenneth E. Jansen 
1830bae968b9SCameron Smith                 LastHeaderKey.erase(filePtr);
1831bae968b9SCameron Smith 
183259599516SKenneth E. Jansen 		if ( header_type[filePtr] != (int)type_size ) {
183359599516SKenneth E. Jansen 			fprintf(stderr,"header and datablock differ on typeof data in the block for\n");
183459599516SKenneth E. Jansen 			fprintf(stderr,"keyphrase : %s\n", keyphrase);
183559599516SKenneth E. Jansen 			if( Strict_Error ) {
183659599516SKenneth E. Jansen 				fprintf(stderr,"fatal error: cannot continue, returning out of call\n" );
183759599516SKenneth E. Jansen                                 endTimer(&timer_end);
183859599516SKenneth E. Jansen                                 printPerf("writedatablock", timer_start, timer_end, 0, 0, "");
183959599516SKenneth E. Jansen 				return;
184059599516SKenneth E. Jansen 			}
184159599516SKenneth E. Jansen 		}
184259599516SKenneth E. Jansen 
184359599516SKenneth E. Jansen 		int nUnits = *nItems;
184459599516SKenneth E. Jansen 
184559599516SKenneth E. Jansen 		if ( nUnits != DataSize ) {
184659599516SKenneth E. Jansen 			fprintf(stderr,"header and datablock differ on number of data items for\n");
184759599516SKenneth E. Jansen 			fprintf(stderr,"keyphrase : %s\n", keyphrase);
184859599516SKenneth E. Jansen 			if( Strict_Error ) {
184959599516SKenneth E. Jansen 				fprintf(stderr,"fatal error: cannot continue, returning out of call\n" );
185059599516SKenneth E. Jansen                                 endTimer(&timer_end);
185159599516SKenneth E. Jansen                                 printPerf("writedatablock", timer_start, timer_end, 0, 0, "");
185259599516SKenneth E. Jansen 				return;
185359599516SKenneth E. Jansen 			}
185459599516SKenneth E. Jansen 		}
1855ea868eb1SCameron Smith                 writeDataBlock(fileObject,valueArray,*nItems,datatype,iotype);
185659599516SKenneth E. Jansen 	}
185759599516SKenneth E. Jansen 	else {  // syncIO case
185859599516SKenneth E. Jansen 		MPI_Status write_data_status;
185959599516SKenneth E. Jansen 		isBinary( iotype );
186059599516SKenneth E. Jansen 		int nUnits = *nItems;
186159599516SKenneth E. Jansen 
186259599516SKenneth E. Jansen 		//MR CHANGE
186359599516SKenneth E. Jansen 		// 	if ( cscompare(datatype,"double") )
186459599516SKenneth E. Jansen 		char* ts1 = StringStripper( datatype );
186559599516SKenneth E. Jansen 		if ( cscompare("double",ts1) )
186659599516SKenneth E. Jansen 			//MR CHANGE END
186759599516SKenneth E. Jansen 		{
186859599516SKenneth E. Jansen 			memcpy((PhastaIOActiveFiles[i]->double_chunk+DB_HEADER_SIZE/sizeof(double)), valueArray, nUnits*sizeof(double));
186959599516SKenneth E. Jansen 			MPI_File_write_at_all_begin( PhastaIOActiveFiles[i]->file_handle,
187059599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->my_offset,
187159599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->double_chunk,
187259599516SKenneth E. Jansen 					//BLOCK_SIZE/sizeof(double),
187359599516SKenneth E. Jansen 					nUnits+DB_HEADER_SIZE/sizeof(double),
187459599516SKenneth E. Jansen 					MPI_DOUBLE );
187559599516SKenneth E. Jansen 			MPI_File_write_at_all_end( PhastaIOActiveFiles[i]->file_handle,
187659599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->double_chunk,
187759599516SKenneth E. Jansen 					&write_data_status );
187859599516SKenneth E. Jansen 			data_size=8*nUnits;
187959599516SKenneth E. Jansen 		}
188059599516SKenneth E. Jansen 		//MR CHANGE
188159599516SKenneth E. Jansen 		// 	else if ( cscompare ( datatype, "integer"))
188259599516SKenneth E. Jansen 		else if ( cscompare("integer",ts1) )
188359599516SKenneth E. Jansen 			//MR CHANGE END
188459599516SKenneth E. Jansen 		{
188559599516SKenneth E. Jansen 			memcpy((PhastaIOActiveFiles[i]->int_chunk+DB_HEADER_SIZE/sizeof(int)), valueArray, nUnits*sizeof(int));
188659599516SKenneth E. Jansen 			MPI_File_write_at_all_begin( PhastaIOActiveFiles[i]->file_handle,
188759599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->my_offset,
188859599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->int_chunk,
188959599516SKenneth E. Jansen 					nUnits+DB_HEADER_SIZE/sizeof(int),
189059599516SKenneth E. Jansen 					MPI_INT );
189159599516SKenneth E. Jansen 			MPI_File_write_at_all_end( PhastaIOActiveFiles[i]->file_handle,
189259599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->int_chunk,
189359599516SKenneth E. Jansen 					&write_data_status );
189459599516SKenneth E. Jansen 			data_size=4*nUnits;
189559599516SKenneth E. Jansen 		}
189659599516SKenneth E. Jansen 		else {
189759599516SKenneth E. Jansen 			printf("Error: writedatablock - DATA_TYPE_ILLEGAL - %s\n",datatype);
189859599516SKenneth E. Jansen                         endTimer(&timer_end);
189959599516SKenneth E. Jansen                         printPerf("writedatablock", timer_start, timer_end, 0, 0, "");
190059599516SKenneth E. Jansen 			return;
190159599516SKenneth E. Jansen 		}
190259599516SKenneth E. Jansen                 free(ts1);
190359599516SKenneth E. Jansen 	}
190459599516SKenneth E. Jansen 
190559599516SKenneth E. Jansen 	endTimer(&timer_end);
190659599516SKenneth E. Jansen 	char extra_msg[1024];
190759599516SKenneth E. Jansen 	memset(extra_msg, '\0', 1024);
190859599516SKenneth E. Jansen 	char* key = StringStripper(keyphrase);
190959599516SKenneth E. Jansen 	sprintf(extra_msg, " field is %s ", key);
191059599516SKenneth E. Jansen 	printPerf("writedatablock", timer_start, timer_end, data_size, 1, extra_msg);
191159599516SKenneth E. Jansen         free(key);
191259599516SKenneth E. Jansen 
191359599516SKenneth E. Jansen }
191459599516SKenneth E. Jansen 
191559599516SKenneth E. Jansen void
191659599516SKenneth E. Jansen SwapArrayByteOrder( void* array,
191759599516SKenneth E. Jansen                      int   nbytes,
191859599516SKenneth E. Jansen                      int   nItems )
191959599516SKenneth E. Jansen {
192059599516SKenneth E. Jansen 	/* This swaps the byte order for the array of nItems each
192159599516SKenneth E. Jansen 		 of size nbytes , This will be called only locally  */
192259599516SKenneth E. Jansen 	int i,j;
192359599516SKenneth E. Jansen 	unsigned char* ucDst = (unsigned char*)array;
192459599516SKenneth E. Jansen 
192559599516SKenneth E. Jansen 	for(i=0; i < nItems; i++) {
192659599516SKenneth E. Jansen 		for(j=0; j < (nbytes/2); j++)
192759599516SKenneth E. Jansen 			std::swap( ucDst[j] , ucDst[(nbytes - 1) - j] );
192859599516SKenneth E. Jansen 		ucDst += nbytes;
192959599516SKenneth E. Jansen 	}
193059599516SKenneth E. Jansen }
193159599516SKenneth E. Jansen 
193259599516SKenneth E. Jansen void
193359599516SKenneth E. Jansen writestring( int* fileDescriptor,
193459599516SKenneth E. Jansen               const char inString[] )
193559599516SKenneth E. Jansen {
193659599516SKenneth E. Jansen 
193759599516SKenneth E. Jansen 	int filePtr = *fileDescriptor - 1;
193859599516SKenneth E. Jansen 	FILE* fileObject = fileArray[filePtr] ;
193959599516SKenneth E. Jansen 	fprintf(fileObject,"%s",inString );
194059599516SKenneth E. Jansen 	return;
194159599516SKenneth E. Jansen }
194259599516SKenneth E. Jansen 
194359599516SKenneth E. Jansen void
194459599516SKenneth E. Jansen Gather_Headers( int* fileDescriptor,
194559599516SKenneth E. Jansen                 vector< string >& headers )
194659599516SKenneth E. Jansen {
194759599516SKenneth E. Jansen 
194859599516SKenneth E. Jansen 	FILE* fileObject;
194959599516SKenneth E. Jansen 	char Line[1024];
195059599516SKenneth E. Jansen 
195159599516SKenneth E. Jansen 	fileObject = fileArray[ (*fileDescriptor)-1 ];
195259599516SKenneth E. Jansen 
195359599516SKenneth E. Jansen 	while( !feof(fileObject) ) {
195459599516SKenneth E. Jansen 		fgets( Line, 1024, fileObject);
195559599516SKenneth E. Jansen 		if ( Line[0] == '#' ) {
195659599516SKenneth E. Jansen 			headers.push_back( Line );
195759599516SKenneth E. Jansen 		} else {
195859599516SKenneth E. Jansen 			break;
195959599516SKenneth E. Jansen 		}
196059599516SKenneth E. Jansen 	}
196159599516SKenneth E. Jansen 	rewind( fileObject );
196259599516SKenneth E. Jansen 	clearerr( fileObject );
196359599516SKenneth E. Jansen }
196459599516SKenneth E. Jansen void
196559599516SKenneth E. Jansen isWrong( void ) { (Wrong_Endian) ? fprintf(stdout,"YES\n"): fprintf(stdout,"NO\n") ; }
196659599516SKenneth E. Jansen 
196759599516SKenneth E. Jansen void
196859599516SKenneth E. Jansen togglestrictmode( void ) { Strict_Error = !Strict_Error; }
196959599516SKenneth E. Jansen 
197059599516SKenneth E. Jansen int
197159599516SKenneth E. Jansen isLittleEndian( void )
197259599516SKenneth E. Jansen {
197359599516SKenneth E. Jansen 	// this function returns a 1 if the current running architecture is
197459599516SKenneth E. Jansen 	// LittleEndian Byte Ordered, else it returns a zero
197559599516SKenneth E. Jansen 
197659599516SKenneth E. Jansen 	union  {
197759599516SKenneth E. Jansen 		long a;
197859599516SKenneth E. Jansen 		char c[sizeof( long )];
197959599516SKenneth E. Jansen 	} endianUnion;
198059599516SKenneth E. Jansen 
198159599516SKenneth E. Jansen 	endianUnion.a = 1 ;
198259599516SKenneth E. Jansen 
198359599516SKenneth E. Jansen 	if ( endianUnion.c[sizeof(long)-1] != 1 ) return 1 ;
198459599516SKenneth E. Jansen 	else return 0;
198559599516SKenneth E. Jansen }
198659599516SKenneth E. Jansen 
198759599516SKenneth E. Jansen namespace PHASTA {
198859599516SKenneth E. Jansen 	const char* const PhastaIO_traits<int>::type_string = "integer";
198959599516SKenneth E. Jansen 	const char* const PhastaIO_traits<double>::type_string = "double";
199059599516SKenneth E. Jansen }
1991