xref: /phasta/phastaIO/phastaIO.cc (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen /*
2*59599516SKenneth E. Jansen  *
3*59599516SKenneth E. Jansen  * This is the SyncIO library that uses MPI-IO collective functions to
4*59599516SKenneth E. Jansen  * implement a flexible I/O checkpoint solution for a large number of
5*59599516SKenneth E. Jansen  * processors.
6*59599516SKenneth E. Jansen  *
7*59599516SKenneth E. Jansen  * Previous developer: Ning Liu         (liun2@cs.rpi.edu)
8*59599516SKenneth E. Jansen  *                     Jing Fu          (fuj@cs.rpi.edu)
9*59599516SKenneth E. Jansen  * Current developers: Michel Rasquin   (Michel.Rasquin@colorado.edu),
10*59599516SKenneth E. Jansen  *                     Ben Matthews     (benjamin.a.matthews@colorado.edu)
11*59599516SKenneth E. Jansen  *
12*59599516SKenneth E. Jansen  */
13*59599516SKenneth E. Jansen 
14*59599516SKenneth E. Jansen #include <map>
15*59599516SKenneth E. Jansen #include <vector>
16*59599516SKenneth E. Jansen #include <string>
17*59599516SKenneth E. Jansen #include <string.h>
18*59599516SKenneth E. Jansen #include <ctype.h>
19*59599516SKenneth E. Jansen #include <stdlib.h>
20*59599516SKenneth E. Jansen #include <stdio.h>
21*59599516SKenneth E. Jansen #include <math.h>
22*59599516SKenneth E. Jansen #include "phastaIO.h"
23*59599516SKenneth E. Jansen #include "mpi.h"
24*59599516SKenneth E. Jansen #include "phiotmrc.h"
25*59599516SKenneth E. Jansen 
26*59599516SKenneth E. Jansen #define VERSION_INFO_HEADER_SIZE 8192
27*59599516SKenneth E. Jansen #define DB_HEADER_SIZE 1024
28*59599516SKenneth E. Jansen #define ONE_MEGABYTE 1048576
29*59599516SKenneth E. Jansen #define TWO_MEGABYTE 2097152
30*59599516SKenneth E. Jansen #define ENDIAN_TEST_NUMBER 12180 // Troy's Zip Code!!
31*59599516SKenneth E. Jansen #define MAX_PHASTA_FILES 64
32*59599516SKenneth E. Jansen #define MAX_PHASTA_FILE_NAME_LENGTH 1024
33*59599516SKenneth 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
34*59599516SKenneth E. Jansen // -3 for MPI_IO_Tag, nFields and nppf, -4 for extra security (former nFiles)
35*59599516SKenneth E. Jansen #define MAX_FIELDS_NAME_LENGTH 128
36*59599516SKenneth E. Jansen #define DefaultMHSize (4*ONE_MEGABYTE)
37*59599516SKenneth E. Jansen //#define DefaultMHSize (8350) //For test
38*59599516SKenneth E. Jansen #define LATEST_WRITE_VERSION 1
39*59599516SKenneth E. Jansen #define inv1024sq 953.674316406e-9 // = 1/1024/1024
40*59599516SKenneth E. Jansen int MasterHeaderSize = -1;
41*59599516SKenneth E. Jansen 
42*59599516SKenneth E. Jansen bool PRINT_PERF = false; // default print no perf results
43*59599516SKenneth E. Jansen int irank = -1; // global rank, should never be manually manipulated
44*59599516SKenneth E. Jansen int mysize = -1;
45*59599516SKenneth E. Jansen 
46*59599516SKenneth E. Jansen // Static variables are bad but used here to store the subcommunicator and associated variables
47*59599516SKenneth 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)
48*59599516SKenneth E. Jansen static int s_assign_local_comm = 0;
49*59599516SKenneth E. Jansen static MPI_Comm s_local_comm;
50*59599516SKenneth E. Jansen static int s_local_size = -1;
51*59599516SKenneth E. Jansen static int s_local_rank = -1;
52*59599516SKenneth E. Jansen 
53*59599516SKenneth E. Jansen //unsigned long long pool_align = 8;
54*59599516SKenneth E. Jansen //unsigned long long mem_address;
55*59599516SKenneth E. Jansen 
56*59599516SKenneth E. Jansen // the following defines are for debug printf
57*59599516SKenneth E. Jansen #define PHASTAIO_PREFIX "phastaIO debug: "
58*59599516SKenneth E. Jansen #define PHASTAIO_DEBUG 0 //default to not print any debugging info
59*59599516SKenneth E. Jansen 
60*59599516SKenneth E. Jansen #if PHASTAIO_DEBUG
61*59599516SKenneth E. Jansen #define phprintf( s, arg...) printf(PHASTAIO_PREFIX s "\n", ##arg)
62*59599516SKenneth E. Jansen #define phprintf_0( s, arg...) do{ \
63*59599516SKenneth E. Jansen 	MPI_Comm_rank(MPI_COMM_WORLD, &irank); \
64*59599516SKenneth E. Jansen 	if(irank == 0){ \
65*59599516SKenneth E. Jansen 		printf(PHASTAIO_PREFIX "irank=0: " s "\n", ##arg); \
66*59599516SKenneth E. Jansen 	} \
67*59599516SKenneth E. Jansen } while(0)
68*59599516SKenneth E. Jansen #else
69*59599516SKenneth E. Jansen #define phprintf( s, arg...)
70*59599516SKenneth E. Jansen #define phprintf_0( s, arg...)
71*59599516SKenneth E. Jansen #endif
72*59599516SKenneth E. Jansen 
73*59599516SKenneth E. Jansen enum PhastaIO_Errors
74*59599516SKenneth E. Jansen {
75*59599516SKenneth E. Jansen 	MAX_PHASTA_FILES_EXCEEDED = -1,
76*59599516SKenneth E. Jansen 	UNABLE_TO_OPEN_FILE = -2,
77*59599516SKenneth E. Jansen 	NOT_A_MPI_FILE = -3,
78*59599516SKenneth E. Jansen 	GPID_EXCEEDED = -4,
79*59599516SKenneth E. Jansen 	DATA_TYPE_ILLEGAL = -5,
80*59599516SKenneth E. Jansen };
81*59599516SKenneth E. Jansen 
82*59599516SKenneth E. Jansen using namespace std;
83*59599516SKenneth E. Jansen 
84*59599516SKenneth E. Jansen namespace{
85*59599516SKenneth E. Jansen 
86*59599516SKenneth E. Jansen 	map< int , char* > LastHeaderKey;
87*59599516SKenneth E. Jansen 	vector< FILE* > fileArray;
88*59599516SKenneth E. Jansen 	vector< bool > byte_order;
89*59599516SKenneth E. Jansen 	vector< int > header_type;
90*59599516SKenneth E. Jansen 	int DataSize=0;
91*59599516SKenneth E. Jansen 	bool LastHeaderNotFound = false;
92*59599516SKenneth E. Jansen 	bool Wrong_Endian = false ;
93*59599516SKenneth E. Jansen 	bool Strict_Error = false ;
94*59599516SKenneth E. Jansen 	bool binary_format = true;
95*59599516SKenneth E. Jansen 
96*59599516SKenneth E. Jansen 	/***********************************************************************/
97*59599516SKenneth E. Jansen 	/***************** NEW PHASTA IO CODE STARTS HERE **********************/
98*59599516SKenneth E. Jansen 	/***********************************************************************/
99*59599516SKenneth E. Jansen 
100*59599516SKenneth E. Jansen 	typedef struct
101*59599516SKenneth E. Jansen 	{
102*59599516SKenneth E. Jansen 		char filename[MAX_PHASTA_FILE_NAME_LENGTH];   /* defafults to 1024 */
103*59599516SKenneth E. Jansen 		unsigned long long my_offset;
104*59599516SKenneth E. Jansen 		unsigned long long next_start_address;
105*59599516SKenneth E. Jansen 		unsigned long long **my_offset_table;
106*59599516SKenneth E. Jansen 		unsigned long long **my_read_table;
107*59599516SKenneth E. Jansen 
108*59599516SKenneth E. Jansen 		double * double_chunk;
109*59599516SKenneth E. Jansen 		double * read_double_chunk;
110*59599516SKenneth E. Jansen 
111*59599516SKenneth E. Jansen 		int field_count;
112*59599516SKenneth E. Jansen 		int part_count;
113*59599516SKenneth E. Jansen 		int read_field_count;
114*59599516SKenneth E. Jansen 		int read_part_count;
115*59599516SKenneth E. Jansen 		int GPid;
116*59599516SKenneth E. Jansen 		int start_id;
117*59599516SKenneth E. Jansen 
118*59599516SKenneth E. Jansen 		int mhsize;
119*59599516SKenneth E. Jansen 
120*59599516SKenneth E. Jansen 		int myrank;
121*59599516SKenneth E. Jansen 		int numprocs;
122*59599516SKenneth E. Jansen 		int local_myrank;
123*59599516SKenneth E. Jansen 		int local_numprocs;
124*59599516SKenneth E. Jansen 
125*59599516SKenneth E. Jansen 		int nppp;
126*59599516SKenneth E. Jansen 		int nPPF;
127*59599516SKenneth E. Jansen 		int nFiles;
128*59599516SKenneth E. Jansen 		int nFields;
129*59599516SKenneth E. Jansen 
130*59599516SKenneth E. Jansen 		int * int_chunk;
131*59599516SKenneth E. Jansen 		int * read_int_chunk;
132*59599516SKenneth E. Jansen 
133*59599516SKenneth E. Jansen 		int Wrong_Endian;                            /* default to false */
134*59599516SKenneth E. Jansen 		char * master_header;
135*59599516SKenneth E. Jansen 		MPI_File file_handle;
136*59599516SKenneth E. Jansen 		MPI_Comm local_comm;
137*59599516SKenneth E. Jansen 	} phastaio_file_t;
138*59599516SKenneth E. Jansen 
139*59599516SKenneth E. Jansen 	typedef struct
140*59599516SKenneth E. Jansen 	{
141*59599516SKenneth E. Jansen 		//unsigned long long my_offset;
142*59599516SKenneth E. Jansen 		//unsigned long long **offset_table;
143*59599516SKenneth E. Jansen 		//int fileID;
144*59599516SKenneth E. Jansen 		int nppf, nfields;
145*59599516SKenneth E. Jansen 		//int GPid;
146*59599516SKenneth E. Jansen 		//int read_field_count;
147*59599516SKenneth E. Jansen 		char * masterHeader;
148*59599516SKenneth E. Jansen 	}serial_file;
149*59599516SKenneth E. Jansen 
150*59599516SKenneth E. Jansen 	serial_file *SerialFile;
151*59599516SKenneth E. Jansen 	phastaio_file_t *PhastaIOActiveFiles[MAX_PHASTA_FILES];
152*59599516SKenneth E. Jansen 	int PhastaIONextActiveIndex = 0; /* indicates next index to allocate */
153*59599516SKenneth E. Jansen 
154*59599516SKenneth E. Jansen 	// the caller has the responsibility to delete the returned string
155*59599516SKenneth E. Jansen 	// TODO: StringStipper("nbc value? ") returns NULL?
156*59599516SKenneth E. Jansen 	char*
157*59599516SKenneth E. Jansen 		StringStripper( const char  istring[] ) {
158*59599516SKenneth E. Jansen 
159*59599516SKenneth E. Jansen 			int length = strlen( istring );
160*59599516SKenneth E. Jansen 
161*59599516SKenneth E. Jansen 			//char* dest = new char [ length + 1 ];
162*59599516SKenneth E. Jansen 			char* dest = (char *)malloc( length + 1 );
163*59599516SKenneth E. Jansen 
164*59599516SKenneth E. Jansen 			//char * dest;
165*59599516SKenneth E. Jansen 			//dest = (char *)malloc( length + 1 + pool_align );
166*59599516SKenneth E. Jansen 			//if (dest & 0x0F != 0) printf("not aligned!!!!\n");
167*59599516SKenneth E. Jansen 			//mem_address = (long long )dest;
168*59599516SKenneth E. Jansen 			//if( mem_address & (pool_align -1) )
169*59599516SKenneth E. Jansen 			//  dest += pool_align - (mem_address & (pool_align -1));
170*59599516SKenneth E. Jansen 
171*59599516SKenneth E. Jansen 			strcpy( dest, istring );
172*59599516SKenneth E. Jansen 			dest[ length ] = '\0';
173*59599516SKenneth E. Jansen 
174*59599516SKenneth E. Jansen 			if ( char* p = strpbrk( dest, " ") )
175*59599516SKenneth E. Jansen 				*p = '\0';
176*59599516SKenneth E. Jansen 
177*59599516SKenneth E. Jansen 			return dest;
178*59599516SKenneth E. Jansen 		}
179*59599516SKenneth E. Jansen 
180*59599516SKenneth E. Jansen 	inline int
181*59599516SKenneth E. Jansen 		cscompare( const char teststring[],
182*59599516SKenneth E. Jansen 				const char targetstring[] ) {
183*59599516SKenneth E. Jansen 
184*59599516SKenneth E. Jansen 			char* s1 = const_cast<char*>(teststring);
185*59599516SKenneth E. Jansen 			char* s2 = const_cast<char*>(targetstring);
186*59599516SKenneth E. Jansen 
187*59599516SKenneth E. Jansen 			while( *s1 == ' ') s1++;
188*59599516SKenneth E. Jansen 			while( *s2 == ' ') s2++;
189*59599516SKenneth E. Jansen 			while( ( *s1 )
190*59599516SKenneth E. Jansen 					&& ( *s2 )
191*59599516SKenneth E. Jansen 					&& ( *s2 != '?')
192*59599516SKenneth E. Jansen 					&& ( tolower( *s1 )==tolower( *s2 ) ) ) {
193*59599516SKenneth E. Jansen 				s1++;
194*59599516SKenneth E. Jansen 				s2++;
195*59599516SKenneth E. Jansen 				while( *s1 == ' ') s1++;
196*59599516SKenneth E. Jansen 				while( *s2 == ' ') s2++;
197*59599516SKenneth E. Jansen 			}
198*59599516SKenneth E. Jansen 			if ( !( *s1 ) || ( *s1 == '?') ) return 1;
199*59599516SKenneth E. Jansen 			else return 0;
200*59599516SKenneth E. Jansen 		}
201*59599516SKenneth E. Jansen 
202*59599516SKenneth E. Jansen 	inline void
203*59599516SKenneth E. Jansen 		isBinary( const char iotype[] ) {
204*59599516SKenneth E. Jansen 
205*59599516SKenneth E. Jansen 			char* fname = StringStripper( iotype );
206*59599516SKenneth E. Jansen 			if ( cscompare( fname, "binary" ) ) binary_format = true;
207*59599516SKenneth E. Jansen 			else binary_format = false;
208*59599516SKenneth E. Jansen 			free (fname);
209*59599516SKenneth E. Jansen 
210*59599516SKenneth E. Jansen 		}
211*59599516SKenneth E. Jansen 
212*59599516SKenneth E. Jansen 	inline size_t
213*59599516SKenneth E. Jansen 		typeSize( const char typestring[] ) {
214*59599516SKenneth E. Jansen 
215*59599516SKenneth E. Jansen 			char* ts1 = StringStripper( typestring );
216*59599516SKenneth E. Jansen 
217*59599516SKenneth E. Jansen 			if ( cscompare( "integer", ts1 ) ) {
218*59599516SKenneth E. Jansen 				free (ts1);
219*59599516SKenneth E. Jansen 				return sizeof(int);
220*59599516SKenneth E. Jansen 			} else if ( cscompare( "double", ts1 ) ) {
221*59599516SKenneth E. Jansen 				free (ts1);
222*59599516SKenneth E. Jansen 				return sizeof( double );
223*59599516SKenneth E. Jansen 			} else {
224*59599516SKenneth E. Jansen 				free (ts1);
225*59599516SKenneth E. Jansen 				fprintf(stderr,"unknown type : %s\n",ts1);
226*59599516SKenneth E. Jansen 				return 0;
227*59599516SKenneth E. Jansen 			}
228*59599516SKenneth E. Jansen 		}
229*59599516SKenneth E. Jansen 
230*59599516SKenneth E. Jansen 	int
231*59599516SKenneth E. Jansen 		readHeader( FILE*       fileObject,
232*59599516SKenneth E. Jansen 				const char  phrase[],
233*59599516SKenneth E. Jansen 				int*        params,
234*59599516SKenneth E. Jansen 				int         expect ) {
235*59599516SKenneth E. Jansen 
236*59599516SKenneth E. Jansen 			char* text_header;
237*59599516SKenneth E. Jansen 			char* token;
238*59599516SKenneth E. Jansen 			char Line[1024];
239*59599516SKenneth E. Jansen 			char junk;
240*59599516SKenneth E. Jansen 			bool FOUND = false ;
241*59599516SKenneth E. Jansen 			int real_length;
242*59599516SKenneth E. Jansen 			int skip_size, integer_value;
243*59599516SKenneth E. Jansen 			int rewind_count=0;
244*59599516SKenneth E. Jansen 
245*59599516SKenneth E. Jansen 			if( !fgets( Line, 1024, fileObject ) && feof( fileObject ) ) {
246*59599516SKenneth E. Jansen 				rewind( fileObject );
247*59599516SKenneth E. Jansen 				clearerr( fileObject );
248*59599516SKenneth E. Jansen 				rewind_count++;
249*59599516SKenneth E. Jansen 				fgets( Line, 1024, fileObject );
250*59599516SKenneth E. Jansen 			}
251*59599516SKenneth E. Jansen 
252*59599516SKenneth E. Jansen 			while( !FOUND  && ( rewind_count < 2 ) )  {
253*59599516SKenneth E. Jansen 				if ( ( Line[0] != '\n' ) && ( real_length = strcspn( Line, "#" )) ){
254*59599516SKenneth E. Jansen 					//text_header = new char [ real_length + 1 ];
255*59599516SKenneth E. Jansen 					text_header = (char *)malloc( real_length + 1 );
256*59599516SKenneth E. Jansen 					//text_header = (char *)malloc( real_length + 1 + pool_align );
257*59599516SKenneth E. Jansen 					//mem_address = (long long )text_header;
258*59599516SKenneth E. Jansen 					//if( mem_address & (pool_align -1) )
259*59599516SKenneth E. Jansen 					//  text_header += pool_align - (mem_address & (pool_align -1));
260*59599516SKenneth E. Jansen 
261*59599516SKenneth E. Jansen 					strncpy( text_header, Line, real_length );
262*59599516SKenneth E. Jansen 					text_header[ real_length ] =static_cast<char>(NULL);
263*59599516SKenneth E. Jansen 					token = strtok ( text_header, ":" );
264*59599516SKenneth E. Jansen 					//if( cscompare( phrase , token ) ) {
265*59599516SKenneth E. Jansen                                         // Double comparison required because different fields can still start
266*59599516SKenneth E. Jansen                                         // with the same name for mixed meshes (nbc code, nbc values, etc).
267*59599516SKenneth E. Jansen                                         // Would be easy to fix cscompare instead but would it break sth else?
268*59599516SKenneth E. Jansen 					if( cscompare( phrase , token ) && cscompare( token , phrase ) ) {
269*59599516SKenneth E. Jansen 						FOUND = true ;
270*59599516SKenneth E. Jansen 						token = strtok( NULL, " ,;<>" );
271*59599516SKenneth E. Jansen 						skip_size = atoi( token );
272*59599516SKenneth E. Jansen 						int i;
273*59599516SKenneth E. Jansen 						for( i=0; i < expect && ( token = strtok( NULL," ,;<>") ); i++) {
274*59599516SKenneth E. Jansen 							params[i] = atoi( token );
275*59599516SKenneth E. Jansen 						}
276*59599516SKenneth E. Jansen 						if ( i < expect ) {
277*59599516SKenneth E. Jansen 							fprintf(stderr,"Aloha Expected # of ints not found for: %s\n",phrase );
278*59599516SKenneth E. Jansen 						}
279*59599516SKenneth E. Jansen 					} else if ( cscompare(token,"byteorder magic number") ) {
280*59599516SKenneth E. Jansen 						if ( binary_format ) {
281*59599516SKenneth E. Jansen 							fread((void*)&integer_value,sizeof(int),1,fileObject);
282*59599516SKenneth E. Jansen 							fread( &junk, sizeof(char), 1 , fileObject );
283*59599516SKenneth E. Jansen 							if ( 362436 != integer_value ) Wrong_Endian = true;
284*59599516SKenneth E. Jansen 						} else{
285*59599516SKenneth E. Jansen 							fscanf(fileObject, "%d\n", &integer_value );
286*59599516SKenneth E. Jansen 						}
287*59599516SKenneth E. Jansen 					} else {
288*59599516SKenneth E. Jansen 						/* some other header, so just skip over */
289*59599516SKenneth E. Jansen 						token = strtok( NULL, " ,;<>" );
290*59599516SKenneth E. Jansen 						skip_size = atoi( token );
291*59599516SKenneth E. Jansen 						if ( binary_format)
292*59599516SKenneth E. Jansen 							fseek( fileObject, skip_size, SEEK_CUR );
293*59599516SKenneth E. Jansen 						else
294*59599516SKenneth E. Jansen 							for( int gama=0; gama < skip_size; gama++ )
295*59599516SKenneth E. Jansen 								fgets( Line, 1024, fileObject );
296*59599516SKenneth E. Jansen 					}
297*59599516SKenneth E. Jansen 					free (text_header);
298*59599516SKenneth E. Jansen 				} // end of if before while loop
299*59599516SKenneth E. Jansen 
300*59599516SKenneth E. Jansen 				if ( !FOUND )
301*59599516SKenneth E. Jansen 					if( !fgets( Line, 1024, fileObject ) && feof( fileObject ) ) {
302*59599516SKenneth E. Jansen 						rewind( fileObject );
303*59599516SKenneth E. Jansen 						clearerr( fileObject );
304*59599516SKenneth E. Jansen 						rewind_count++;
305*59599516SKenneth E. Jansen 						fgets( Line, 1024, fileObject );
306*59599516SKenneth E. Jansen 					}
307*59599516SKenneth E. Jansen 			}
308*59599516SKenneth E. Jansen 
309*59599516SKenneth E. Jansen 			if ( !FOUND ) {
310*59599516SKenneth E. Jansen 				//fprintf(stderr, "Error: Could not find: %s\n", phrase);
311*59599516SKenneth E. Jansen 				if(irank == 0) printf("WARNING: Could not find: %s\n", phrase);
312*59599516SKenneth E. Jansen 				return 1;
313*59599516SKenneth E. Jansen 			}
314*59599516SKenneth E. Jansen 			return 0;
315*59599516SKenneth E. Jansen 		}
316*59599516SKenneth E. Jansen 
317*59599516SKenneth E. Jansen } // end unnamed namespace
318*59599516SKenneth E. Jansen 
319*59599516SKenneth E. Jansen 
320*59599516SKenneth E. Jansen // begin of publicly visible functions
321*59599516SKenneth E. Jansen 
322*59599516SKenneth E. Jansen /**
323*59599516SKenneth E. Jansen  * This function takes a long long pointer and assign (start) phiotmrc value to it
324*59599516SKenneth E. Jansen  */
325*59599516SKenneth E. Jansen //void startTimer(unsigned long long* start) {
326*59599516SKenneth E. Jansen void startTimer(double* start) {
327*59599516SKenneth E. Jansen 
328*59599516SKenneth E. Jansen         if( !PRINT_PERF ) return;
329*59599516SKenneth E. Jansen 
330*59599516SKenneth E. Jansen 	MPI_Barrier(MPI_COMM_WORLD);
331*59599516SKenneth E. Jansen 	*start =  phiotmrc();
332*59599516SKenneth E. Jansen }
333*59599516SKenneth E. Jansen 
334*59599516SKenneth E. Jansen /**
335*59599516SKenneth E. Jansen  * This function takes a long long pointer and assign (end) phiotmrc value to it
336*59599516SKenneth E. Jansen  */
337*59599516SKenneth E. Jansen void endTimer(double* end) {
338*59599516SKenneth E. Jansen 
339*59599516SKenneth E. Jansen         if( !PRINT_PERF ) return;
340*59599516SKenneth E. Jansen 
341*59599516SKenneth E. Jansen 	*end = phiotmrc();
342*59599516SKenneth E. Jansen 	MPI_Barrier(MPI_COMM_WORLD);
343*59599516SKenneth E. Jansen }
344*59599516SKenneth E. Jansen 
345*59599516SKenneth E. Jansen /**
346*59599516SKenneth E. Jansen  * choose to print some performance results (or not) according to
347*59599516SKenneth E. Jansen  * the PRINT_PERF macro
348*59599516SKenneth E. Jansen  */
349*59599516SKenneth E. Jansen void printPerf(
350*59599516SKenneth E. Jansen 		const char* func_name,
351*59599516SKenneth E. Jansen 		double start,
352*59599516SKenneth E. Jansen 		double end,
353*59599516SKenneth E. Jansen 		unsigned long long datasize,
354*59599516SKenneth E. Jansen 		int printdatainfo,
355*59599516SKenneth E. Jansen 		const char* extra_msg) {
356*59599516SKenneth E. Jansen 
357*59599516SKenneth E. Jansen 	if( !PRINT_PERF ) return;
358*59599516SKenneth E. Jansen 
359*59599516SKenneth E. Jansen 	unsigned long long data_size = datasize;
360*59599516SKenneth E. Jansen 
361*59599516SKenneth E. Jansen 	double time = end - start;
362*59599516SKenneth E. Jansen 
363*59599516SKenneth E. Jansen 	unsigned long long isizemin,isizemax,isizetot;
364*59599516SKenneth E. Jansen 	double sizemin,sizemax,sizeavg,sizetot,rate;
365*59599516SKenneth E. Jansen 	double tmin, tmax, tavg, ttot;
366*59599516SKenneth E. Jansen 
367*59599516SKenneth E. Jansen 	MPI_Allreduce(&time, &tmin,1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD);
368*59599516SKenneth E. Jansen 	MPI_Allreduce(&time, &tmax,1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);
369*59599516SKenneth E. Jansen 	MPI_Allreduce(&time, &ttot,1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
370*59599516SKenneth E. Jansen 	tavg = ttot/mysize;
371*59599516SKenneth E. Jansen 
372*59599516SKenneth E. Jansen 	if(irank == 0) {
373*59599516SKenneth E. Jansen 		if ( PhastaIONextActiveIndex == 0 ) printf("** 1PFPP ");
374*59599516SKenneth E. Jansen 		else  printf("** syncIO ");
375*59599516SKenneth E. Jansen 		printf("%s(): Tmax = %f sec, Tmin = %f sec, Tavg = %f sec", func_name, tmax, tmin, tavg);
376*59599516SKenneth E. Jansen 	}
377*59599516SKenneth E. Jansen 
378*59599516SKenneth E. Jansen 	if(printdatainfo == 1) { // if printdatainfo ==1, compute I/O rate and block size
379*59599516SKenneth E. Jansen 		MPI_Allreduce(&data_size,&isizemin,1,MPI_LONG_LONG_INT,MPI_MIN,MPI_COMM_WORLD);
380*59599516SKenneth E. Jansen 		MPI_Allreduce(&data_size,&isizemax,1,MPI_LONG_LONG_INT,MPI_MAX,MPI_COMM_WORLD);
381*59599516SKenneth E. Jansen 		MPI_Allreduce(&data_size,&isizetot,1,MPI_LONG_LONG_INT,MPI_SUM,MPI_COMM_WORLD);
382*59599516SKenneth E. Jansen 
383*59599516SKenneth E. Jansen 		sizemin=(double)(isizemin*inv1024sq);
384*59599516SKenneth E. Jansen 		sizemax=(double)(isizemax*inv1024sq);
385*59599516SKenneth E. Jansen 		sizetot=(double)(isizetot*inv1024sq);
386*59599516SKenneth E. Jansen 		sizeavg=(double)(1.0*sizetot/mysize);
387*59599516SKenneth E. Jansen 		rate=(double)(1.0*sizetot/tmax);
388*59599516SKenneth E. Jansen 
389*59599516SKenneth E. Jansen 		if( irank == 0) {
390*59599516SKenneth 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);
391*59599516SKenneth E. Jansen 		}
392*59599516SKenneth E. Jansen 	}
393*59599516SKenneth E. Jansen 	else {
394*59599516SKenneth E. Jansen 		if(irank == 0) {
395*59599516SKenneth E. Jansen 			printf(" \n");
396*59599516SKenneth E. Jansen 			//printf(" (%s) \n", extra_msg);
397*59599516SKenneth E. Jansen 		}
398*59599516SKenneth E. Jansen 	}
399*59599516SKenneth E. Jansen }
400*59599516SKenneth E. Jansen 
401*59599516SKenneth E. Jansen /**
402*59599516SKenneth E. Jansen  * This function is normally called at the beginning of a read operation, before
403*59599516SKenneth E. Jansen  * init function.
404*59599516SKenneth E. Jansen  * This function (uses rank 0) reads out nfields, nppf, master header size,
405*59599516SKenneth E. Jansen  * endianess and allocates for masterHeader string.
406*59599516SKenneth E. Jansen  * These values are essential for following read operations. Rank 0 will bcast
407*59599516SKenneth E. Jansen  * these values to other ranks in the commm world
408*59599516SKenneth E. Jansen  *
409*59599516SKenneth E. Jansen  * If the file set is of old POSIX format, it would throw error and exit
410*59599516SKenneth E. Jansen  */
411*59599516SKenneth E. Jansen void queryphmpiio(const char filename[],int *nfields, int *nppf)
412*59599516SKenneth E. Jansen {
413*59599516SKenneth E. Jansen 	MPI_Comm_rank(MPI_COMM_WORLD, &irank);
414*59599516SKenneth E. Jansen 	MPI_Comm_size(MPI_COMM_WORLD, &mysize);
415*59599516SKenneth E. Jansen 
416*59599516SKenneth E. Jansen 	if(irank == 0) {
417*59599516SKenneth E. Jansen 		FILE * fileHandle;
418*59599516SKenneth E. Jansen 		char* fname = StringStripper( filename );
419*59599516SKenneth E. Jansen 
420*59599516SKenneth E. Jansen 		fileHandle = fopen (fname,"rb");
421*59599516SKenneth E. Jansen 		if (fileHandle == NULL ) {
422*59599516SKenneth E. Jansen 			printf("\nError: File %s doesn't exist! Please check!\n",fname);
423*59599516SKenneth E. Jansen 		}
424*59599516SKenneth E. Jansen 		else {
425*59599516SKenneth E. Jansen 			SerialFile =(serial_file *)calloc( 1,  sizeof( serial_file) );
426*59599516SKenneth E. Jansen 			//SerialFile = (serial_file *)malloc( sizeof( serial_file ) + pool_align );
427*59599516SKenneth E. Jansen 			//mem_address = (long long )SerialFile;
428*59599516SKenneth E. Jansen 			//if( mem_address & (pool_align -1) )
429*59599516SKenneth E. Jansen 			//	SerialFile += pool_align - (mem_address & (pool_align -1));
430*59599516SKenneth E. Jansen 
431*59599516SKenneth E. Jansen 			//SerialFile->masterHeader = (char *)malloc(MasterHeaderSize);
432*59599516SKenneth E. Jansen 			//int meta_size_limit = 4*ONE_MEGABYTE;
433*59599516SKenneth E. Jansen 			//int meta_size_limit = (4+ MAX_FIELDS_NUMBER ) * MAX_FIELDS_NAME_LENGTH;
434*59599516SKenneth E. Jansen 			int meta_size_limit = VERSION_INFO_HEADER_SIZE;
435*59599516SKenneth E. Jansen 			SerialFile->masterHeader = (char *)malloc( meta_size_limit );
436*59599516SKenneth E. Jansen 			//SerialFile->masterHeader = (char *)malloc( meta_size_limit + pool_align );
437*59599516SKenneth E. Jansen 			//mem_address = (long long )SerialFile;
438*59599516SKenneth E. Jansen 			//if( mem_address & (pool_align -1) )
439*59599516SKenneth E. Jansen 			//	SerialFile->masterHeader += pool_align - (mem_address & (pool_align -1));
440*59599516SKenneth E. Jansen 
441*59599516SKenneth E. Jansen 			fread(SerialFile->masterHeader, 1, meta_size_limit, fileHandle);
442*59599516SKenneth E. Jansen 
443*59599516SKenneth E. Jansen 			char read_out_tag[MAX_FIELDS_NAME_LENGTH];
444*59599516SKenneth E. Jansen 			char version[MAX_FIELDS_NAME_LENGTH/4];
445*59599516SKenneth E. Jansen 			int mhsize;
446*59599516SKenneth E. Jansen 			char * token;
447*59599516SKenneth E. Jansen 			int magic_number;
448*59599516SKenneth E. Jansen 
449*59599516SKenneth E. Jansen 			memcpy( read_out_tag,
450*59599516SKenneth E. Jansen 					SerialFile->masterHeader,
451*59599516SKenneth E. Jansen 					MAX_FIELDS_NAME_LENGTH-1 );
452*59599516SKenneth E. Jansen 
453*59599516SKenneth E. Jansen 			if ( cscompare ("MPI_IO_Tag",read_out_tag) ) {
454*59599516SKenneth E. Jansen 				// Test endianess ...
455*59599516SKenneth E. Jansen 				memcpy (&magic_number,
456*59599516SKenneth E. Jansen 						SerialFile->masterHeader + sizeof("MPI_IO_Tag : ")-1, //-1 sizeof returns the size of the string+1 for "\0"
457*59599516SKenneth E. Jansen 						sizeof(int) );                                        // masterheader should look like "MPI_IO_Tag : 12180 " with 12180 in binary format
458*59599516SKenneth E. Jansen 
459*59599516SKenneth E. Jansen 				if ( magic_number != ENDIAN_TEST_NUMBER ) {
460*59599516SKenneth E. Jansen 					printf("Endian is different!\n");
461*59599516SKenneth E. Jansen 					// Will do swap later
462*59599516SKenneth E. Jansen 				}
463*59599516SKenneth E. Jansen 
464*59599516SKenneth E. Jansen 				// test version, old version, default masterheader size is 4M
465*59599516SKenneth E. Jansen 				// newer version masterheader size is read from first line
466*59599516SKenneth E. Jansen 				memcpy(version,
467*59599516SKenneth E. Jansen 						SerialFile->masterHeader + MAX_FIELDS_NAME_LENGTH/2,
468*59599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH/4 - 1); //TODO: why -1?
469*59599516SKenneth E. Jansen 
470*59599516SKenneth E. Jansen 				if( cscompare ("version",version) ) {
471*59599516SKenneth E. Jansen 					// if there is "version" tag in the file, then it is newer format
472*59599516SKenneth E. Jansen 					// read master header size from here, otherwise use default
473*59599516SKenneth E. Jansen 					// Note: if version is "1", we know mhsize is at 3/4 place...
474*59599516SKenneth E. Jansen 
475*59599516SKenneth E. Jansen 					token = strtok(version, ":");
476*59599516SKenneth E. Jansen 					token = strtok(NULL, " ,;<>" );
477*59599516SKenneth E. Jansen 					int iversion = atoi(token);
478*59599516SKenneth E. Jansen 
479*59599516SKenneth E. Jansen 					if( iversion == 1) {
480*59599516SKenneth E. Jansen 						memcpy( &mhsize,
481*59599516SKenneth E. Jansen 								SerialFile->masterHeader + MAX_FIELDS_NAME_LENGTH/4*3 + sizeof("mhsize : ")-1,
482*59599516SKenneth E. Jansen 								sizeof(int));
483*59599516SKenneth E. Jansen 						if ( magic_number != ENDIAN_TEST_NUMBER )
484*59599516SKenneth E. Jansen 							SwapArrayByteOrder(&mhsize, sizeof(int), 1);
485*59599516SKenneth E. Jansen 
486*59599516SKenneth E. Jansen 						if( mhsize > DefaultMHSize ) {
487*59599516SKenneth E. Jansen 							//if actual headersize is larger than default, let's re-read
488*59599516SKenneth E. Jansen 							free(SerialFile->masterHeader);
489*59599516SKenneth E. Jansen 							SerialFile->masterHeader = (char *)malloc(mhsize);
490*59599516SKenneth E. Jansen 							fseek(fileHandle, 0, SEEK_SET); // reset the file stream position
491*59599516SKenneth E. Jansen 							fread(SerialFile->masterHeader,1,mhsize,fileHandle);
492*59599516SKenneth E. Jansen 						}
493*59599516SKenneth E. Jansen 					}
494*59599516SKenneth E. Jansen 					//TODO: check if this is a valid int??
495*59599516SKenneth E. Jansen 					MasterHeaderSize = mhsize;
496*59599516SKenneth E. Jansen 				}
497*59599516SKenneth E. Jansen 				else { // else it's version 0's format w/o version tag, implicating MHSize=4M
498*59599516SKenneth E. Jansen 					MasterHeaderSize = DefaultMHSize;
499*59599516SKenneth E. Jansen 				}
500*59599516SKenneth E. Jansen 
501*59599516SKenneth E. Jansen 				memcpy( read_out_tag,
502*59599516SKenneth E. Jansen 						SerialFile->masterHeader+MAX_FIELDS_NAME_LENGTH+1,
503*59599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH ); //TODO: why +1
504*59599516SKenneth E. Jansen 
505*59599516SKenneth E. Jansen 				// Read in # fields ...
506*59599516SKenneth E. Jansen 				token = strtok( read_out_tag, ":" );
507*59599516SKenneth E. Jansen 				token = strtok( NULL," ,;<>" );
508*59599516SKenneth E. Jansen 				*nfields = atoi( token );
509*59599516SKenneth E. Jansen 				if ( *nfields > MAX_FIELDS_NUMBER) {
510*59599516SKenneth E. Jansen 					printf("Error queryphmpiio: nfields is larger than MAX_FIELDS_NUMBER!\n");
511*59599516SKenneth E. Jansen 				}
512*59599516SKenneth E. Jansen 				SerialFile->nfields=*nfields; //TODO: sanity check of this int?
513*59599516SKenneth E. Jansen 
514*59599516SKenneth E. Jansen 				memcpy( read_out_tag,
515*59599516SKenneth E. Jansen 						SerialFile->masterHeader + MAX_FIELDS_NAME_LENGTH * 2
516*59599516SKenneth E. Jansen 						+ *nfields * MAX_FIELDS_NAME_LENGTH,
517*59599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH);
518*59599516SKenneth E. Jansen 
519*59599516SKenneth E. Jansen 				token = strtok( read_out_tag, ":" );
520*59599516SKenneth E. Jansen 				token = strtok( NULL," ,;<>" );
521*59599516SKenneth E. Jansen 				*nppf = atoi( token );
522*59599516SKenneth E. Jansen 				SerialFile->nppf=*nppf; //TODO: sanity check of int
523*59599516SKenneth E. Jansen 			} // end of if("MPI_IO_TAG")
524*59599516SKenneth E. Jansen 			else {
525*59599516SKenneth 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);
526*59599516SKenneth E. Jansen                                 exit(1);
527*59599516SKenneth E. Jansen 			}
528*59599516SKenneth E. Jansen 			fclose(fileHandle);
529*59599516SKenneth E. Jansen                         free(SerialFile->masterHeader);
530*59599516SKenneth E. Jansen                         free(SerialFile);
531*59599516SKenneth E. Jansen 		} //end of else
532*59599516SKenneth E. Jansen                 free(fname);
533*59599516SKenneth E. Jansen 	}
534*59599516SKenneth E. Jansen 
535*59599516SKenneth E. Jansen 	// Bcast value to every one
536*59599516SKenneth E. Jansen 	MPI_Bcast( nfields, 1, MPI_INT, 0, MPI_COMM_WORLD );
537*59599516SKenneth E. Jansen 	MPI_Bcast( nppf, 1, MPI_INT, 0, MPI_COMM_WORLD );
538*59599516SKenneth E. Jansen 	MPI_Bcast( &MasterHeaderSize, 1, MPI_INT, 0, MPI_COMM_WORLD );
539*59599516SKenneth E. Jansen 	phprintf("Info queryphmpiio: myrank = %d, MasterHeaderSize = %d", irank, MasterHeaderSize);
540*59599516SKenneth E. Jansen }
541*59599516SKenneth E. Jansen 
542*59599516SKenneth E. Jansen /**
543*59599516SKenneth E. Jansen  * This function computes the right master header size (round to size of 2^n).
544*59599516SKenneth E. Jansen  * This is only needed for file format version 1 in "write" mode.
545*59599516SKenneth E. Jansen  */
546*59599516SKenneth E. Jansen int computeMHSize(int nfields, int nppf, int version) {
547*59599516SKenneth E. Jansen 	int mhsize;
548*59599516SKenneth E. Jansen 	if(version == 1) {
549*59599516SKenneth 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
550*59599516SKenneth E. Jansen 		int meta_info_size = VERSION_INFO_HEADER_SIZE;
551*59599516SKenneth E. Jansen 		int actual_size =  nfields * nppf * sizeof(long long) + meta_info_size;
552*59599516SKenneth E. Jansen 		//printf("actual_size = %d, offset table size = %d\n", actual_size,  nfields * nppf * sizeof(long long));
553*59599516SKenneth E. Jansen 		if (actual_size > DefaultMHSize) {
554*59599516SKenneth E. Jansen 			mhsize = (int) ceil( (double) actual_size/DefaultMHSize); // it's rounded to ceiling of this value
555*59599516SKenneth E. Jansen 			mhsize *= DefaultMHSize;
556*59599516SKenneth E. Jansen 		}
557*59599516SKenneth E. Jansen 		else {
558*59599516SKenneth E. Jansen 			mhsize = DefaultMHSize;
559*59599516SKenneth E. Jansen 		}
560*59599516SKenneth E. Jansen 	}
561*59599516SKenneth E. Jansen 	return mhsize;
562*59599516SKenneth E. Jansen }
563*59599516SKenneth E. Jansen 
564*59599516SKenneth E. Jansen /**
565*59599516SKenneth E. Jansen  * Computes correct color of a rank according to number of files.
566*59599516SKenneth E. Jansen  */
567*59599516SKenneth E. Jansen extern "C" int computeColor( int myrank, int numprocs, int nfiles) {
568*59599516SKenneth E. Jansen 	int color =
569*59599516SKenneth E. Jansen 		(int)(myrank / (numprocs / nfiles));
570*59599516SKenneth E. Jansen 	return color;
571*59599516SKenneth E. Jansen }
572*59599516SKenneth E. Jansen 
573*59599516SKenneth E. Jansen 
574*59599516SKenneth E. Jansen /**
575*59599516SKenneth E. Jansen  * Check the file descriptor.
576*59599516SKenneth E. Jansen  */
577*59599516SKenneth E. Jansen void checkFileDescriptor(const char fctname[],
578*59599516SKenneth E. Jansen                          int*  fileDescriptor ) {
579*59599516SKenneth E. Jansen 	if ( *fileDescriptor < 0 ) {
580*59599516SKenneth E. Jansen 		printf("Error: File descriptor = %d in %s\n",*fileDescriptor,fctname);
581*59599516SKenneth E. Jansen 		exit(1);
582*59599516SKenneth E. Jansen 	}
583*59599516SKenneth E. Jansen }
584*59599516SKenneth E. Jansen 
585*59599516SKenneth E. Jansen /**
586*59599516SKenneth E. Jansen  * Initialize the file struct members and allocate space for file struct
587*59599516SKenneth E. Jansen  * buffers.
588*59599516SKenneth E. Jansen  *
589*59599516SKenneth E. Jansen  * Note: this function is only called when we are using new format. Old POSIX
590*59599516SKenneth E. Jansen  * format should skip this routine and call openfile() directly instead.
591*59599516SKenneth E. Jansen  */
592*59599516SKenneth E. Jansen int initphmpiio( int *nfields, int *nppf, int *nfiles, int *filehandle, const char mode[])
593*59599516SKenneth E. Jansen {
594*59599516SKenneth E. Jansen 	// we init irank again in case query not called (e.g. syncIO write case)
595*59599516SKenneth E. Jansen 	MPI_Comm_rank(MPI_COMM_WORLD, &irank);
596*59599516SKenneth E. Jansen 	MPI_Comm_size(MPI_COMM_WORLD, &mysize);
597*59599516SKenneth E. Jansen 
598*59599516SKenneth E. Jansen 	phprintf("Info initphmpiio: entering function, myrank = %d, MasterHeaderSize = %d", irank, MasterHeaderSize);
599*59599516SKenneth E. Jansen 
600*59599516SKenneth E. Jansen 	double timer_start, timer_end;
601*59599516SKenneth E. Jansen 	startTimer(&timer_start);
602*59599516SKenneth E. Jansen 
603*59599516SKenneth E. Jansen 	char* imode = StringStripper( mode );
604*59599516SKenneth E. Jansen 
605*59599516SKenneth E. Jansen 	// Note: if it's read, we presume query was called prior to init and
606*59599516SKenneth E. Jansen 	// MasterHeaderSize is already set to correct value from parsing header
607*59599516SKenneth E. Jansen 	// otherwise it's write then it needs some computation to be set
608*59599516SKenneth E. Jansen 	if ( cscompare( "read", imode ) ) {
609*59599516SKenneth E. Jansen 		// do nothing
610*59599516SKenneth E. Jansen 	}
611*59599516SKenneth E. Jansen 	else if( cscompare( "write", imode ) ) {
612*59599516SKenneth E. Jansen 		MasterHeaderSize =  computeMHSize(*nfields, *nppf, LATEST_WRITE_VERSION);
613*59599516SKenneth E. Jansen 	}
614*59599516SKenneth E. Jansen 	else {
615*59599516SKenneth E. Jansen 		printf("Error initphmpiio: can't recognize the mode %s", imode);
616*59599516SKenneth E. Jansen                 exit(1);
617*59599516SKenneth E. Jansen 	}
618*59599516SKenneth E. Jansen         free ( imode );
619*59599516SKenneth E. Jansen 
620*59599516SKenneth E. Jansen 	phprintf("Info initphmpiio: myrank = %d, MasterHeaderSize = %d", irank, MasterHeaderSize);
621*59599516SKenneth E. Jansen 
622*59599516SKenneth E. Jansen 	int i, j;
623*59599516SKenneth E. Jansen 
624*59599516SKenneth E. Jansen 	if( PhastaIONextActiveIndex == MAX_PHASTA_FILES ) {
625*59599516SKenneth E. Jansen 		printf("Error initphmpiio: PhastaIONextActiveIndex = MAX_PHASTA_FILES");
626*59599516SKenneth E. Jansen                 endTimer(&timer_end);
627*59599516SKenneth E. Jansen 	        printPerf("initphmpiio", timer_start, timer_end, 0, 0, "");
628*59599516SKenneth E. Jansen 		return MAX_PHASTA_FILES_EXCEEDED;
629*59599516SKenneth E. Jansen 	}
630*59599516SKenneth E. Jansen 	//		else if( PhastaIONextActiveIndex == 0 )  //Hang in debug mode on Intrepid
631*59599516SKenneth E. Jansen 	//		{
632*59599516SKenneth E. Jansen 	//			for( i = 0; i < MAX_PHASTA_FILES; i++ );
633*59599516SKenneth E. Jansen 	//			{
634*59599516SKenneth E. Jansen 	//				PhastaIOActiveFiles[i] = NULL;
635*59599516SKenneth E. Jansen 	//			}
636*59599516SKenneth E. Jansen 	//		}
637*59599516SKenneth E. Jansen 
638*59599516SKenneth E. Jansen 
639*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[PhastaIONextActiveIndex] = (phastaio_file_t *)calloc( 1,  sizeof( phastaio_file_t) );
640*59599516SKenneth E. Jansen 	//PhastaIOActiveFiles[PhastaIONextActiveIndex] = ( phastaio_file_t *)calloc( 1 + 1, sizeof( phastaio_file_t ) );
641*59599516SKenneth E. Jansen 	//mem_address = (long long )PhastaIOActiveFiles[PhastaIONextActiveIndex];
642*59599516SKenneth E. Jansen 	//if( mem_address & (pool_align -1) )
643*59599516SKenneth E. Jansen 	//	PhastaIOActiveFiles[PhastaIONextActiveIndex] += pool_align - (mem_address & (pool_align -1));
644*59599516SKenneth E. Jansen 
645*59599516SKenneth E. Jansen 	i = PhastaIONextActiveIndex;
646*59599516SKenneth E. Jansen 	PhastaIONextActiveIndex++;
647*59599516SKenneth E. Jansen 
648*59599516SKenneth E. Jansen 	//PhastaIOActiveFiles[i]->next_start_address = 2*TWO_MEGABYTE;
649*59599516SKenneth E. Jansen 
650*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->next_start_address = MasterHeaderSize;  // what does this mean??? TODO
651*59599516SKenneth E. Jansen 
652*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->Wrong_Endian = false;
653*59599516SKenneth E. Jansen 
654*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->nFields = *nfields;
655*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->nPPF = *nppf;
656*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->nFiles = *nfiles;
657*59599516SKenneth E. Jansen 	MPI_Comm_rank(MPI_COMM_WORLD, &(PhastaIOActiveFiles[i]->myrank));
658*59599516SKenneth E. Jansen 	MPI_Comm_size(MPI_COMM_WORLD, &(PhastaIOActiveFiles[i]->numprocs));
659*59599516SKenneth E. Jansen 
660*59599516SKenneth E. Jansen 
661*59599516SKenneth E. Jansen 	if( *nfiles > 1 ) { // split the ranks according to each mpiio file
662*59599516SKenneth E. Jansen 
663*59599516SKenneth E. Jansen 		if ( s_assign_local_comm == 0) { // call mpi_comm_split for the first (and only) time
664*59599516SKenneth E. Jansen 
665*59599516SKenneth E. Jansen 			if (PhastaIOActiveFiles[i]->myrank == 0) printf("Building subcommunicator\n");
666*59599516SKenneth E. Jansen 
667*59599516SKenneth E. Jansen 			int color = computeColor(PhastaIOActiveFiles[i]->myrank, PhastaIOActiveFiles[i]->numprocs, PhastaIOActiveFiles[i]->nFiles);
668*59599516SKenneth E. Jansen 			MPI_Comm_split(MPI_COMM_WORLD,
669*59599516SKenneth E. Jansen 					color,
670*59599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->myrank,
671*59599516SKenneth E. Jansen 					&(PhastaIOActiveFiles[i]->local_comm));
672*59599516SKenneth E. Jansen 			MPI_Comm_size(PhastaIOActiveFiles[i]->local_comm,
673*59599516SKenneth E. Jansen 					&(PhastaIOActiveFiles[i]->local_numprocs));
674*59599516SKenneth E. Jansen 			MPI_Comm_rank(PhastaIOActiveFiles[i]->local_comm,
675*59599516SKenneth E. Jansen 					&(PhastaIOActiveFiles[i]->local_myrank));
676*59599516SKenneth E. Jansen 
677*59599516SKenneth E. Jansen 			// back up now these variables so that we do not need to call comm_split again
678*59599516SKenneth E. Jansen 			s_local_comm = PhastaIOActiveFiles[i]->local_comm;
679*59599516SKenneth E. Jansen 			s_local_size = PhastaIOActiveFiles[i]->local_numprocs;
680*59599516SKenneth E. Jansen 			s_local_rank = PhastaIOActiveFiles[i]->local_myrank;
681*59599516SKenneth E. Jansen 			s_assign_local_comm = 1;
682*59599516SKenneth E. Jansen 		}
683*59599516SKenneth E. Jansen 		else { // recycle the subcommunicator
684*59599516SKenneth E. Jansen 			if (PhastaIOActiveFiles[i]->myrank == 0) printf("Recycling subcommunicator\n");
685*59599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->local_comm = s_local_comm;
686*59599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->local_numprocs = s_local_size;
687*59599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->local_myrank = s_local_rank;
688*59599516SKenneth E. Jansen 		}
689*59599516SKenneth E. Jansen 	}
690*59599516SKenneth E. Jansen 	else { // *nfiles == 1 here - no need to call mpi_comm_split here
691*59599516SKenneth E. Jansen 
692*59599516SKenneth E. Jansen 		if (PhastaIOActiveFiles[i]->myrank == 0) printf("Bypassing subcommunicator\n");
693*59599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->local_comm = MPI_COMM_WORLD;
694*59599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->local_numprocs = PhastaIOActiveFiles[i]->numprocs;
695*59599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->local_myrank = PhastaIOActiveFiles[i]->myrank;
696*59599516SKenneth E. Jansen 
697*59599516SKenneth E. Jansen 	}
698*59599516SKenneth E. Jansen 
699*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->nppp =
700*59599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->nPPF/PhastaIOActiveFiles[i]->local_numprocs;
701*59599516SKenneth E. Jansen 
702*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->start_id = PhastaIOActiveFiles[i]->nPPF *
703*59599516SKenneth E. Jansen 		(int)(PhastaIOActiveFiles[i]->myrank/PhastaIOActiveFiles[i]->local_numprocs) +
704*59599516SKenneth E. Jansen 		(PhastaIOActiveFiles[i]->local_myrank * PhastaIOActiveFiles[i]->nppp);
705*59599516SKenneth E. Jansen 
706*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->my_offset_table =
707*59599516SKenneth E. Jansen 		( unsigned long long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long long *) );
708*59599516SKenneth E. Jansen 	//( unsigned long long **)calloc( MAX_FIELDS_NUMBER + pool_align, sizeof(unsigned long long *) );
709*59599516SKenneth E. Jansen 	//mem_address = (long long )PhastaIOActiveFiles[i]->my_offset_table;
710*59599516SKenneth E. Jansen 	//if( mem_address & (pool_align -1) )
711*59599516SKenneth E. Jansen 	//	PhastaIOActiveFiles[i]->my_offset_table += pool_align - (mem_address & (pool_align -1));
712*59599516SKenneth E. Jansen 
713*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->my_read_table =
714*59599516SKenneth E. Jansen 		( unsigned long long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long long *) );
715*59599516SKenneth E. Jansen 	//( unsigned long long **)calloc( MAX_FIELDS_NUMBER + pool_align, sizeof( unsigned long long *) );
716*59599516SKenneth E. Jansen 	//mem_address = (long long )PhastaIOActiveFiles[i]->my_read_table;
717*59599516SKenneth E. Jansen 	//if( mem_address & (pool_align -1) )
718*59599516SKenneth E. Jansen 	//	PhastaIOActiveFiles[i]->my_read_table += pool_align - (mem_address & (pool_align -1));
719*59599516SKenneth E. Jansen 
720*59599516SKenneth E. Jansen 	for (j=0; j<*nfields; j++)
721*59599516SKenneth E. Jansen 	{
722*59599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->my_offset_table[j] =
723*59599516SKenneth E. Jansen 			( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long long) );
724*59599516SKenneth E. Jansen 		//( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp + pool_align, sizeof( unsigned long long)  );
725*59599516SKenneth E. Jansen 		//mem_address = (long long )PhastaIOActiveFiles[i]->my_offset_table[j];
726*59599516SKenneth E. Jansen 		//if( mem_address & (pool_align -1) )
727*59599516SKenneth E. Jansen 		//	PhastaIOActiveFiles[i]->my_offset_table[j] += pool_align - (mem_address & (pool_align -1));
728*59599516SKenneth E. Jansen 
729*59599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->my_read_table[j] =
730*59599516SKenneth E. Jansen 			( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long long) );
731*59599516SKenneth E. Jansen 		//( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long long) + pool_align );
732*59599516SKenneth E. Jansen 		//mem_address = (long long )PhastaIOActiveFiles[i]->my_read_table[j];
733*59599516SKenneth E. Jansen 		//if( mem_address & (pool_align -1) )
734*59599516SKenneth E. Jansen 		//	PhastaIOActiveFiles[i]->my_read_table[j] += pool_align - (mem_address & (pool_align -1));
735*59599516SKenneth E. Jansen 	}
736*59599516SKenneth E. Jansen 	*filehandle = i;
737*59599516SKenneth E. Jansen 
738*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->master_header = (char *)calloc(MasterHeaderSize,sizeof( char ));
739*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->double_chunk = (double *)calloc(1,sizeof( double ));
740*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->int_chunk = (int *)calloc(1,sizeof( int ));
741*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->read_double_chunk = (double *)calloc(1,sizeof( double ));
742*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->read_int_chunk = (int *)calloc(1,sizeof( int ));
743*59599516SKenneth E. Jansen 
744*59599516SKenneth E. Jansen 	/*
745*59599516SKenneth E. Jansen 		 PhastaIOActiveFiles[i]->master_header =
746*59599516SKenneth E. Jansen 		 ( char * ) calloc( MasterHeaderSize + pool_align, sizeof( char )  );
747*59599516SKenneth E. Jansen 		 mem_address = (long long )PhastaIOActiveFiles[i]->master_header;
748*59599516SKenneth E. Jansen 		 if( mem_address & (pool_align -1) )
749*59599516SKenneth E. Jansen 		 PhastaIOActiveFiles[i]->master_header += pool_align - (mem_address & (pool_align -1));
750*59599516SKenneth E. Jansen 
751*59599516SKenneth E. Jansen 		 PhastaIOActiveFiles[i]->double_chunk =
752*59599516SKenneth E. Jansen 		 ( double * ) calloc( 1 + pool_align , sizeof( double ) );
753*59599516SKenneth E. Jansen 		 mem_address = (long long )PhastaIOActiveFiles[i]->double_chunk;
754*59599516SKenneth E. Jansen 		 if( mem_address & (pool_align -1) )
755*59599516SKenneth E. Jansen 		 PhastaIOActiveFiles[i]->double_chunk += pool_align - (mem_address & (pool_align -1));
756*59599516SKenneth E. Jansen 
757*59599516SKenneth E. Jansen 		 PhastaIOActiveFiles[i]->int_chunk =
758*59599516SKenneth E. Jansen 		 ( int * ) calloc( 1 + pool_align , sizeof( int ) );
759*59599516SKenneth E. Jansen 		 mem_address = (long long )PhastaIOActiveFiles[i]->int_chunk;
760*59599516SKenneth E. Jansen 		 if( mem_address & (pool_align -1) )
761*59599516SKenneth E. Jansen 		 PhastaIOActiveFiles[i]->int_chunk += pool_align - (mem_address & (pool_align -1));
762*59599516SKenneth E. Jansen 
763*59599516SKenneth E. Jansen 		 PhastaIOActiveFiles[i]->read_double_chunk =
764*59599516SKenneth E. Jansen 		 ( double * ) calloc( 1 + pool_align , sizeof( double ) );
765*59599516SKenneth E. Jansen 		 mem_address = (long long )PhastaIOActiveFiles[i]->read_double_chunk;
766*59599516SKenneth E. Jansen 		 if( mem_address & (pool_align -1) )
767*59599516SKenneth E. Jansen 		 PhastaIOActiveFiles[i]->read_double_chunk += pool_align - (mem_address & (pool_align -1));
768*59599516SKenneth E. Jansen 
769*59599516SKenneth E. Jansen 		 PhastaIOActiveFiles[i]->read_int_chunk =
770*59599516SKenneth E. Jansen 		 ( int * ) calloc( 1 + pool_align , sizeof( int ) );
771*59599516SKenneth E. Jansen 		 mem_address = (long long )PhastaIOActiveFiles[i]->read_int_chunk;
772*59599516SKenneth E. Jansen 		 if( mem_address & (pool_align -1) )
773*59599516SKenneth E. Jansen 		 PhastaIOActiveFiles[i]->read_int_chunk += pool_align - (mem_address & (pool_align -1));
774*59599516SKenneth E. Jansen 		 */
775*59599516SKenneth E. Jansen 
776*59599516SKenneth E. Jansen 	// Time monitoring
777*59599516SKenneth E. Jansen 	endTimer(&timer_end);
778*59599516SKenneth E. Jansen 	printPerf("initphmpiio", timer_start, timer_end, 0, 0, "");
779*59599516SKenneth E. Jansen 
780*59599516SKenneth E. Jansen 	phprintf_0("Info initphmpiio: quiting function");
781*59599516SKenneth E. Jansen 
782*59599516SKenneth E. Jansen 	return i;
783*59599516SKenneth E. Jansen }
784*59599516SKenneth E. Jansen 
785*59599516SKenneth E. Jansen /**
786*59599516SKenneth E. Jansen  * Destruct the file struct and free buffers allocated in init function.
787*59599516SKenneth E. Jansen  */
788*59599516SKenneth E. Jansen void finalizephmpiio( int *fileDescriptor )
789*59599516SKenneth E. Jansen {
790*59599516SKenneth E. Jansen 	double timer_start, timer_end;
791*59599516SKenneth E. Jansen 	startTimer(&timer_start);
792*59599516SKenneth E. Jansen 
793*59599516SKenneth E. Jansen 	int i, j;
794*59599516SKenneth E. Jansen 	i = *fileDescriptor;
795*59599516SKenneth E. Jansen 	//PhastaIONextActiveIndex--;
796*59599516SKenneth E. Jansen 
797*59599516SKenneth E. Jansen 	/* //free the offset table for this phasta file */
798*59599516SKenneth E. Jansen 	//for(j=0; j<MAX_FIELDS_NUMBER; j++) //Danger: undefined behavior for my_*_table.[j] not allocated or not initialized to NULL
799*59599516SKenneth E. Jansen 	for(j=0; j<PhastaIOActiveFiles[i]->nFields; j++)
800*59599516SKenneth E. Jansen 	{
801*59599516SKenneth E. Jansen 		free( PhastaIOActiveFiles[i]->my_offset_table[j]);
802*59599516SKenneth E. Jansen 		free( PhastaIOActiveFiles[i]->my_read_table[j]);
803*59599516SKenneth E. Jansen 	}
804*59599516SKenneth E. Jansen 	free ( PhastaIOActiveFiles[i]->my_offset_table );
805*59599516SKenneth E. Jansen 	free ( PhastaIOActiveFiles[i]->my_read_table );
806*59599516SKenneth E. Jansen 	free ( PhastaIOActiveFiles[i]->master_header );
807*59599516SKenneth E. Jansen 	free ( PhastaIOActiveFiles[i]->double_chunk );
808*59599516SKenneth E. Jansen 	free ( PhastaIOActiveFiles[i]->int_chunk );
809*59599516SKenneth E. Jansen 	free ( PhastaIOActiveFiles[i]->read_double_chunk );
810*59599516SKenneth E. Jansen 	free ( PhastaIOActiveFiles[i]->read_int_chunk );
811*59599516SKenneth E. Jansen 
812*59599516SKenneth E. Jansen 	free( PhastaIOActiveFiles[i]);
813*59599516SKenneth E. Jansen 
814*59599516SKenneth E. Jansen 	endTimer(&timer_end);
815*59599516SKenneth E. Jansen 	printPerf("finalizempiio", timer_start, timer_end, 0, 0, "");
816*59599516SKenneth E. Jansen 
817*59599516SKenneth E. Jansen 	PhastaIONextActiveIndex--;
818*59599516SKenneth E. Jansen }
819*59599516SKenneth E. Jansen 
820*59599516SKenneth E. Jansen 
821*59599516SKenneth E. Jansen /**
822*59599516SKenneth E. Jansen  * Special init for M2N in order to create a subcommunicator for the reduced solution (requires PRINT_PERF to be false for now)
823*59599516SKenneth E. Jansen  * Initialize the file struct members and allocate space for file struct buffers.
824*59599516SKenneth E. Jansen  *
825*59599516SKenneth E. Jansen  * Note: this function is only called when we are using new format. Old POSIX
826*59599516SKenneth E. Jansen  * format should skip this routine and call openfile() directly instead.
827*59599516SKenneth E. Jansen  */
828*59599516SKenneth E. Jansen int initphmpiiosub( int *nfields, int *nppf, int *nfiles, int *filehandle, const char mode[],MPI_Comm my_local_comm)
829*59599516SKenneth E. Jansen {
830*59599516SKenneth E. Jansen 	// we init irank again in case query not called (e.g. syncIO write case)
831*59599516SKenneth E. Jansen 
832*59599516SKenneth E. Jansen 	MPI_Comm_rank(my_local_comm, &irank);
833*59599516SKenneth E. Jansen 	MPI_Comm_size(my_local_comm, &mysize);
834*59599516SKenneth E. Jansen 
835*59599516SKenneth E. Jansen 	phprintf("Info initphmpiio: entering function, myrank = %d, MasterHeaderSize = %d", irank, MasterHeaderSize);
836*59599516SKenneth E. Jansen 
837*59599516SKenneth E. Jansen 	double timer_start, timer_end;
838*59599516SKenneth E. Jansen 	startTimer(&timer_start);
839*59599516SKenneth E. Jansen 
840*59599516SKenneth E. Jansen 	char* imode = StringStripper( mode );
841*59599516SKenneth E. Jansen 
842*59599516SKenneth E. Jansen 	// Note: if it's read, we presume query was called prior to init and
843*59599516SKenneth E. Jansen 	// MasterHeaderSize is already set to correct value from parsing header
844*59599516SKenneth E. Jansen 	// otherwise it's write then it needs some computation to be set
845*59599516SKenneth E. Jansen 	if ( cscompare( "read", imode ) ) {
846*59599516SKenneth E. Jansen 		// do nothing
847*59599516SKenneth E. Jansen 	}
848*59599516SKenneth E. Jansen 	else if( cscompare( "write", imode ) ) {
849*59599516SKenneth E. Jansen 		MasterHeaderSize =  computeMHSize(*nfields, *nppf, LATEST_WRITE_VERSION);
850*59599516SKenneth E. Jansen 	}
851*59599516SKenneth E. Jansen 	else {
852*59599516SKenneth E. Jansen 		printf("Error initphmpiio: can't recognize the mode %s", imode);
853*59599516SKenneth E. Jansen                 exit(1);
854*59599516SKenneth E. Jansen 	}
855*59599516SKenneth E. Jansen         free ( imode );
856*59599516SKenneth E. Jansen 
857*59599516SKenneth E. Jansen 	phprintf("Info initphmpiio: myrank = %d, MasterHeaderSize = %d", irank, MasterHeaderSize);
858*59599516SKenneth E. Jansen 
859*59599516SKenneth E. Jansen 	int i, j;
860*59599516SKenneth E. Jansen 
861*59599516SKenneth E. Jansen 	if( PhastaIONextActiveIndex == MAX_PHASTA_FILES ) {
862*59599516SKenneth E. Jansen 		printf("Error initphmpiio: PhastaIONextActiveIndex = MAX_PHASTA_FILES");
863*59599516SKenneth E. Jansen                 endTimer(&timer_end);
864*59599516SKenneth E. Jansen 	        printPerf("initphmpiio", timer_start, timer_end, 0, 0, "");
865*59599516SKenneth E. Jansen 		return MAX_PHASTA_FILES_EXCEEDED;
866*59599516SKenneth E. Jansen 	}
867*59599516SKenneth E. Jansen 	//		else if( PhastaIONextActiveIndex == 0 )  //Hang in debug mode on Intrepid
868*59599516SKenneth E. Jansen 	//		{
869*59599516SKenneth E. Jansen 	//			for( i = 0; i < MAX_PHASTA_FILES; i++ );
870*59599516SKenneth E. Jansen 	//			{
871*59599516SKenneth E. Jansen 	//				PhastaIOActiveFiles[i] = NULL;
872*59599516SKenneth E. Jansen 	//			}
873*59599516SKenneth E. Jansen 	//		}
874*59599516SKenneth E. Jansen 
875*59599516SKenneth E. Jansen 
876*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[PhastaIONextActiveIndex] = (phastaio_file_t *)calloc( 1,  sizeof( phastaio_file_t) );
877*59599516SKenneth E. Jansen 	//PhastaIOActiveFiles[PhastaIONextActiveIndex] = ( phastaio_file_t *)calloc( 1 + 1, sizeof( phastaio_file_t ) );
878*59599516SKenneth E. Jansen 	//mem_address = (long long )PhastaIOActiveFiles[PhastaIONextActiveIndex];
879*59599516SKenneth E. Jansen 	//if( mem_address & (pool_align -1) )
880*59599516SKenneth E. Jansen 	//	PhastaIOActiveFiles[PhastaIONextActiveIndex] += pool_align - (mem_address & (pool_align -1));
881*59599516SKenneth E. Jansen 
882*59599516SKenneth E. Jansen 	i = PhastaIONextActiveIndex;
883*59599516SKenneth E. Jansen 	PhastaIONextActiveIndex++;
884*59599516SKenneth E. Jansen 
885*59599516SKenneth E. Jansen 	//PhastaIOActiveFiles[i]->next_start_address = 2*TWO_MEGABYTE;
886*59599516SKenneth E. Jansen 
887*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->next_start_address = MasterHeaderSize;  // what does this mean??? TODO
888*59599516SKenneth E. Jansen 
889*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->Wrong_Endian = false;
890*59599516SKenneth E. Jansen 
891*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->nFields = *nfields;
892*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->nPPF = *nppf;
893*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->nFiles = *nfiles;
894*59599516SKenneth E. Jansen 	MPI_Comm_rank(my_local_comm, &(PhastaIOActiveFiles[i]->myrank));
895*59599516SKenneth E. Jansen 	MPI_Comm_size(my_local_comm, &(PhastaIOActiveFiles[i]->numprocs));
896*59599516SKenneth E. Jansen 
897*59599516SKenneth E. Jansen 	int color = computeColor(PhastaIOActiveFiles[i]->myrank, PhastaIOActiveFiles[i]->numprocs, PhastaIOActiveFiles[i]->nFiles);
898*59599516SKenneth E. Jansen 	MPI_Comm_split(my_local_comm,
899*59599516SKenneth E. Jansen 			color,
900*59599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->myrank,
901*59599516SKenneth E. Jansen 			&(PhastaIOActiveFiles[i]->local_comm));
902*59599516SKenneth E. Jansen 	MPI_Comm_size(PhastaIOActiveFiles[i]->local_comm,
903*59599516SKenneth E. Jansen 			&(PhastaIOActiveFiles[i]->local_numprocs));
904*59599516SKenneth E. Jansen 	MPI_Comm_rank(PhastaIOActiveFiles[i]->local_comm,
905*59599516SKenneth E. Jansen 			&(PhastaIOActiveFiles[i]->local_myrank));
906*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->nppp =
907*59599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->nPPF/PhastaIOActiveFiles[i]->local_numprocs;
908*59599516SKenneth E. Jansen 
909*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->start_id = PhastaIOActiveFiles[i]->nPPF *
910*59599516SKenneth E. Jansen 		(int)(PhastaIOActiveFiles[i]->myrank/PhastaIOActiveFiles[i]->local_numprocs) +
911*59599516SKenneth E. Jansen 		(PhastaIOActiveFiles[i]->local_myrank * PhastaIOActiveFiles[i]->nppp);
912*59599516SKenneth E. Jansen 
913*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->my_offset_table =
914*59599516SKenneth E. Jansen 		( unsigned long long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long long *) );
915*59599516SKenneth E. Jansen 	//( unsigned long long **)calloc( MAX_FIELDS_NUMBER + pool_align, sizeof(unsigned long long *) );
916*59599516SKenneth E. Jansen 	//mem_address = (long long )PhastaIOActiveFiles[i]->my_offset_table;
917*59599516SKenneth E. Jansen 	//if( mem_address & (pool_align -1) )
918*59599516SKenneth E. Jansen 	//	PhastaIOActiveFiles[i]->my_offset_table += pool_align - (mem_address & (pool_align -1));
919*59599516SKenneth E. Jansen 
920*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->my_read_table =
921*59599516SKenneth E. Jansen 		( unsigned long long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long long *) );
922*59599516SKenneth E. Jansen 	//( unsigned long long **)calloc( MAX_FIELDS_NUMBER + pool_align, sizeof( unsigned long long *) );
923*59599516SKenneth E. Jansen 	//mem_address = (long long )PhastaIOActiveFiles[i]->my_read_table;
924*59599516SKenneth E. Jansen 	//if( mem_address & (pool_align -1) )
925*59599516SKenneth E. Jansen 	//	PhastaIOActiveFiles[i]->my_read_table += pool_align - (mem_address & (pool_align -1));
926*59599516SKenneth E. Jansen 
927*59599516SKenneth E. Jansen 	for (j=0; j<*nfields; j++)
928*59599516SKenneth E. Jansen 	{
929*59599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->my_offset_table[j] =
930*59599516SKenneth E. Jansen 			( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long long) );
931*59599516SKenneth E. Jansen 		//( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp + pool_align, sizeof( unsigned long long)  );
932*59599516SKenneth E. Jansen 		//mem_address = (long long )PhastaIOActiveFiles[i]->my_offset_table[j];
933*59599516SKenneth E. Jansen 		//if( mem_address & (pool_align -1) )
934*59599516SKenneth E. Jansen 		//	PhastaIOActiveFiles[i]->my_offset_table[j] += pool_align - (mem_address & (pool_align -1));
935*59599516SKenneth E. Jansen 
936*59599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->my_read_table[j] =
937*59599516SKenneth E. Jansen 			( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long long) );
938*59599516SKenneth E. Jansen 		//( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long long) + pool_align );
939*59599516SKenneth E. Jansen 		//mem_address = (long long )PhastaIOActiveFiles[i]->my_read_table[j];
940*59599516SKenneth E. Jansen 		//if( mem_address & (pool_align -1) )
941*59599516SKenneth E. Jansen 		//	PhastaIOActiveFiles[i]->my_read_table[j] += pool_align - (mem_address & (pool_align -1));
942*59599516SKenneth E. Jansen 	}
943*59599516SKenneth E. Jansen 	*filehandle = i;
944*59599516SKenneth E. Jansen 
945*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->master_header = (char *)calloc(MasterHeaderSize,sizeof( char ));
946*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->double_chunk = (double *)calloc(1,sizeof( double ));
947*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->int_chunk = (int *)calloc(1,sizeof( int ));
948*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->read_double_chunk = (double *)calloc(1,sizeof( double ));
949*59599516SKenneth E. Jansen 	PhastaIOActiveFiles[i]->read_int_chunk = (int *)calloc(1,sizeof( int ));
950*59599516SKenneth E. Jansen 
951*59599516SKenneth E. Jansen 	/*
952*59599516SKenneth E. Jansen 		 PhastaIOActiveFiles[i]->master_header =
953*59599516SKenneth E. Jansen 		 ( char * ) calloc( MasterHeaderSize + pool_align, sizeof( char )  );
954*59599516SKenneth E. Jansen 		 mem_address = (long long )PhastaIOActiveFiles[i]->master_header;
955*59599516SKenneth E. Jansen 		 if( mem_address & (pool_align -1) )
956*59599516SKenneth E. Jansen 		 PhastaIOActiveFiles[i]->master_header += pool_align - (mem_address & (pool_align -1));
957*59599516SKenneth E. Jansen 
958*59599516SKenneth E. Jansen 		 PhastaIOActiveFiles[i]->double_chunk =
959*59599516SKenneth E. Jansen 		 ( double * ) calloc( 1 + pool_align , sizeof( double ) );
960*59599516SKenneth E. Jansen 		 mem_address = (long long )PhastaIOActiveFiles[i]->double_chunk;
961*59599516SKenneth E. Jansen 		 if( mem_address & (pool_align -1) )
962*59599516SKenneth E. Jansen 		 PhastaIOActiveFiles[i]->double_chunk += pool_align - (mem_address & (pool_align -1));
963*59599516SKenneth E. Jansen 
964*59599516SKenneth E. Jansen 		 PhastaIOActiveFiles[i]->int_chunk =
965*59599516SKenneth E. Jansen 		 ( int * ) calloc( 1 + pool_align , sizeof( int ) );
966*59599516SKenneth E. Jansen 		 mem_address = (long long )PhastaIOActiveFiles[i]->int_chunk;
967*59599516SKenneth E. Jansen 		 if( mem_address & (pool_align -1) )
968*59599516SKenneth E. Jansen 		 PhastaIOActiveFiles[i]->int_chunk += pool_align - (mem_address & (pool_align -1));
969*59599516SKenneth E. Jansen 
970*59599516SKenneth E. Jansen 		 PhastaIOActiveFiles[i]->read_double_chunk =
971*59599516SKenneth E. Jansen 		 ( double * ) calloc( 1 + pool_align , sizeof( double ) );
972*59599516SKenneth E. Jansen 		 mem_address = (long long )PhastaIOActiveFiles[i]->read_double_chunk;
973*59599516SKenneth E. Jansen 		 if( mem_address & (pool_align -1) )
974*59599516SKenneth E. Jansen 		 PhastaIOActiveFiles[i]->read_double_chunk += pool_align - (mem_address & (pool_align -1));
975*59599516SKenneth E. Jansen 
976*59599516SKenneth E. Jansen 		 PhastaIOActiveFiles[i]->read_int_chunk =
977*59599516SKenneth E. Jansen 		 ( int * ) calloc( 1 + pool_align , sizeof( int ) );
978*59599516SKenneth E. Jansen 		 mem_address = (long long )PhastaIOActiveFiles[i]->read_int_chunk;
979*59599516SKenneth E. Jansen 		 if( mem_address & (pool_align -1) )
980*59599516SKenneth E. Jansen 		 PhastaIOActiveFiles[i]->read_int_chunk += pool_align - (mem_address & (pool_align -1));
981*59599516SKenneth E. Jansen 		 */
982*59599516SKenneth E. Jansen 
983*59599516SKenneth E. Jansen 	// Time monitoring
984*59599516SKenneth E. Jansen 	endTimer(&timer_end);
985*59599516SKenneth E. Jansen 	printPerf("initphmpiiosub", timer_start, timer_end, 0, 0, "");
986*59599516SKenneth E. Jansen 
987*59599516SKenneth E. Jansen 	phprintf_0("Info initphmpiiosub: quiting function");
988*59599516SKenneth E. Jansen 
989*59599516SKenneth E. Jansen 	return i;
990*59599516SKenneth E. Jansen }
991*59599516SKenneth E. Jansen 
992*59599516SKenneth E. Jansen 
993*59599516SKenneth E. Jansen 
994*59599516SKenneth E. Jansen /** open file for both POSIX and MPI-IO syncIO format.
995*59599516SKenneth E. Jansen  *
996*59599516SKenneth E. Jansen  * If it's old POSIX format, simply call posix fopen().
997*59599516SKenneth E. Jansen  *
998*59599516SKenneth E. Jansen  * If it's MPI-IO foramt:
999*59599516SKenneth E. Jansen  * in "read" mode, it builds the header table that points to the offset of
1000*59599516SKenneth E. Jansen  * fields for parts;
1001*59599516SKenneth E. Jansen  * in "write" mode, it opens the file with MPI-IO open routine.
1002*59599516SKenneth E. Jansen  */
1003*59599516SKenneth E. Jansen void openfile(const char filename[],
1004*59599516SKenneth E. Jansen                const char mode[],
1005*59599516SKenneth E. Jansen                int*  fileDescriptor )
1006*59599516SKenneth E. Jansen {
1007*59599516SKenneth E. Jansen 	phprintf_0("Info: entering openfile");
1008*59599516SKenneth E. Jansen 
1009*59599516SKenneth E. Jansen 	double timer_start, timer_end;
1010*59599516SKenneth E. Jansen 	startTimer(&timer_start);
1011*59599516SKenneth E. Jansen 
1012*59599516SKenneth E. Jansen 	if ( PhastaIONextActiveIndex == 0 )
1013*59599516SKenneth E. Jansen 	{
1014*59599516SKenneth E. Jansen 		FILE* file=NULL ;
1015*59599516SKenneth E. Jansen 		*fileDescriptor = 0;
1016*59599516SKenneth E. Jansen 		char* fname = StringStripper( filename );
1017*59599516SKenneth E. Jansen 		char* imode = StringStripper( mode );
1018*59599516SKenneth E. Jansen 
1019*59599516SKenneth E. Jansen 		if ( cscompare( "read", imode ) ) file = fopen(fname, "rb" );
1020*59599516SKenneth E. Jansen 		else if( cscompare( "write", imode ) ) file = fopen(fname, "wb" );
1021*59599516SKenneth E. Jansen 		else if( cscompare( "append", imode ) ) file = fopen(fname, "ab" );
1022*59599516SKenneth E. Jansen 
1023*59599516SKenneth E. Jansen 		if ( !file ){
1024*59599516SKenneth E. Jansen 			fprintf(stderr,"Error openfile: unable to open file %s",fname ) ;
1025*59599516SKenneth E. Jansen 		} else {
1026*59599516SKenneth E. Jansen 			fileArray.push_back( file );
1027*59599516SKenneth E. Jansen 			byte_order.push_back( false );
1028*59599516SKenneth E. Jansen 			header_type.push_back( sizeof(int) );
1029*59599516SKenneth E. Jansen 			*fileDescriptor = fileArray.size();
1030*59599516SKenneth E. Jansen 		}
1031*59599516SKenneth E. Jansen 		free (fname);
1032*59599516SKenneth E. Jansen 		free (imode);
1033*59599516SKenneth E. Jansen 	}
1034*59599516SKenneth E. Jansen 	else // else it would be parallel I/O, opposed to posix io
1035*59599516SKenneth E. Jansen 	{
1036*59599516SKenneth E. Jansen 		char* fname = StringStripper( filename );
1037*59599516SKenneth E. Jansen 		char* imode = StringStripper( mode );
1038*59599516SKenneth E. Jansen 		int rc;
1039*59599516SKenneth E. Jansen                 int i = *fileDescriptor;
1040*59599516SKenneth E. Jansen 		checkFileDescriptor("openfile",&i);
1041*59599516SKenneth E. Jansen 		char* token;
1042*59599516SKenneth E. Jansen 
1043*59599516SKenneth E. Jansen 		if ( cscompare( "read", imode ) )
1044*59599516SKenneth E. Jansen 		{
1045*59599516SKenneth E. Jansen 			//	      if (PhastaIOActiveFiles[i]->myrank == 0)
1046*59599516SKenneth E. Jansen 			//                printf("\n **********\nRead open ... ... regular version\n");
1047*59599516SKenneth E. Jansen 
1048*59599516SKenneth E. Jansen 			rc = MPI_File_open( PhastaIOActiveFiles[i]->local_comm,
1049*59599516SKenneth E. Jansen 					fname,
1050*59599516SKenneth E. Jansen 					MPI_MODE_RDONLY,
1051*59599516SKenneth E. Jansen 					MPI_INFO_NULL,
1052*59599516SKenneth E. Jansen 					&(PhastaIOActiveFiles[i]->file_handle) );
1053*59599516SKenneth E. Jansen 
1054*59599516SKenneth E. Jansen 			if(rc)
1055*59599516SKenneth E. Jansen 			{
1056*59599516SKenneth E. Jansen 				*fileDescriptor = UNABLE_TO_OPEN_FILE;
1057*59599516SKenneth E. Jansen 				printf("Error openfile: Unable to open file %s! File descriptor = %d\n",fname,*fileDescriptor);
1058*59599516SKenneth E. Jansen                                 endTimer(&timer_end);
1059*59599516SKenneth E. Jansen                                 printPerf("openfile", timer_start, timer_end, 0, 0, "");
1060*59599516SKenneth E. Jansen 				return;
1061*59599516SKenneth E. Jansen 			}
1062*59599516SKenneth E. Jansen 
1063*59599516SKenneth E. Jansen 			MPI_Status read_tag_status;
1064*59599516SKenneth E. Jansen 			char read_out_tag[MAX_FIELDS_NAME_LENGTH];
1065*59599516SKenneth E. Jansen 			int j;
1066*59599516SKenneth E. Jansen 			int magic_number;
1067*59599516SKenneth E. Jansen 
1068*59599516SKenneth E. Jansen 			if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) {
1069*59599516SKenneth E. Jansen 				MPI_File_read_at( PhastaIOActiveFiles[i]->file_handle,
1070*59599516SKenneth E. Jansen 						0,
1071*59599516SKenneth E. Jansen 						PhastaIOActiveFiles[i]->master_header,
1072*59599516SKenneth E. Jansen 						MasterHeaderSize,
1073*59599516SKenneth E. Jansen 						MPI_CHAR,
1074*59599516SKenneth E. Jansen 						&read_tag_status );
1075*59599516SKenneth E. Jansen 			}
1076*59599516SKenneth E. Jansen 
1077*59599516SKenneth E. Jansen 			MPI_Bcast( PhastaIOActiveFiles[i]->master_header,
1078*59599516SKenneth E. Jansen 					MasterHeaderSize,
1079*59599516SKenneth E. Jansen 					MPI_CHAR,
1080*59599516SKenneth E. Jansen 					0,
1081*59599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->local_comm );
1082*59599516SKenneth E. Jansen 
1083*59599516SKenneth E. Jansen 			memcpy( read_out_tag,
1084*59599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->master_header,
1085*59599516SKenneth E. Jansen 					MAX_FIELDS_NAME_LENGTH-1 );
1086*59599516SKenneth E. Jansen 
1087*59599516SKenneth E. Jansen 			if ( cscompare ("MPI_IO_Tag",read_out_tag) )
1088*59599516SKenneth E. Jansen 			{
1089*59599516SKenneth E. Jansen 				// Test endianess ...
1090*59599516SKenneth E. Jansen 				memcpy ( &magic_number,
1091*59599516SKenneth E. Jansen 						PhastaIOActiveFiles[i]->master_header+sizeof("MPI_IO_Tag : ")-1, //-1 sizeof returns the size of the string+1 for "\0"
1092*59599516SKenneth E. Jansen 						sizeof(int) );                                                   // masterheader should look like "MPI_IO_Tag : 12180 " with 12180 in binary format
1093*59599516SKenneth E. Jansen 
1094*59599516SKenneth E. Jansen 				if ( magic_number != ENDIAN_TEST_NUMBER )
1095*59599516SKenneth E. Jansen 				{
1096*59599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->Wrong_Endian = true;
1097*59599516SKenneth E. Jansen 				}
1098*59599516SKenneth E. Jansen 
1099*59599516SKenneth E. Jansen 				memcpy( read_out_tag,
1100*59599516SKenneth E. Jansen 						PhastaIOActiveFiles[i]->master_header+MAX_FIELDS_NAME_LENGTH+1, // TODO: WHY +1???
1101*59599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH );
1102*59599516SKenneth E. Jansen 
1103*59599516SKenneth E. Jansen 				// Read in # fields ...
1104*59599516SKenneth E. Jansen 				token = strtok ( read_out_tag, ":" );
1105*59599516SKenneth E. Jansen 				token = strtok( NULL," ,;<>" );
1106*59599516SKenneth E. Jansen 				PhastaIOActiveFiles[i]->nFields = atoi( token );
1107*59599516SKenneth E. Jansen 
1108*59599516SKenneth E. Jansen 				unsigned long long **header_table;
1109*59599516SKenneth E. Jansen 				header_table = ( unsigned long long ** )calloc(PhastaIOActiveFiles[i]->nFields, sizeof(unsigned long long *));
1110*59599516SKenneth E. Jansen 				//header_table = ( unsigned long long ** ) calloc( PhastaIOActiveFiles[i]->nFields  + pool_align, sizeof(unsigned long long *));
1111*59599516SKenneth E. Jansen 				//mem_address = (long long )header_table;
1112*59599516SKenneth E. Jansen 				//if( mem_address & (pool_align -1) )
1113*59599516SKenneth E. Jansen 				//	header_table += pool_align - (mem_address & (pool_align -1));
1114*59599516SKenneth E. Jansen 
1115*59599516SKenneth E. Jansen 				for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ )
1116*59599516SKenneth E. Jansen 				{
1117*59599516SKenneth E. Jansen 					header_table[j]=( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nPPF , sizeof( unsigned long long));
1118*59599516SKenneth E. Jansen 					//header_table[j]=( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nPPF + pool_align, sizeof(unsigned long long *));
1119*59599516SKenneth E. Jansen 					//mem_address = (long long )header_table[j];
1120*59599516SKenneth E. Jansen 					//if( mem_address & (pool_align -1) )
1121*59599516SKenneth E. Jansen 					//	header_table[j] += pool_align - (mem_address & (pool_align -1));
1122*59599516SKenneth E. Jansen 				}
1123*59599516SKenneth E. Jansen 
1124*59599516SKenneth E. Jansen 				// Read in the offset table ...
1125*59599516SKenneth E. Jansen 				for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ )
1126*59599516SKenneth E. Jansen 				{
1127*59599516SKenneth E. Jansen                                         if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) {
1128*59599516SKenneth E. Jansen 						memcpy( header_table[j],
1129*59599516SKenneth E. Jansen 							PhastaIOActiveFiles[i]->master_header +
1130*59599516SKenneth E. Jansen 							VERSION_INFO_HEADER_SIZE +
1131*59599516SKenneth E. Jansen 							j * PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long long),
1132*59599516SKenneth E. Jansen 							PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long long) );
1133*59599516SKenneth E. Jansen                                         }
1134*59599516SKenneth E. Jansen 
1135*59599516SKenneth E. Jansen 					MPI_Scatter( header_table[j],
1136*59599516SKenneth E. Jansen 							PhastaIOActiveFiles[i]->nppp,
1137*59599516SKenneth E. Jansen 							MPI_LONG_LONG_INT,
1138*59599516SKenneth E. Jansen 							PhastaIOActiveFiles[i]->my_read_table[j],
1139*59599516SKenneth E. Jansen 							PhastaIOActiveFiles[i]->nppp,
1140*59599516SKenneth E. Jansen 							MPI_LONG_LONG_INT,
1141*59599516SKenneth E. Jansen 							0,
1142*59599516SKenneth E. Jansen 							PhastaIOActiveFiles[i]->local_comm );
1143*59599516SKenneth E. Jansen 
1144*59599516SKenneth E. Jansen 					// Swap byte order if endianess is different ...
1145*59599516SKenneth E. Jansen 					if ( PhastaIOActiveFiles[i]->Wrong_Endian ) {
1146*59599516SKenneth E. Jansen 						SwapArrayByteOrder( PhastaIOActiveFiles[i]->my_read_table[j],
1147*59599516SKenneth E. Jansen 								sizeof(long long int),
1148*59599516SKenneth E. Jansen 								PhastaIOActiveFiles[i]->nppp );
1149*59599516SKenneth E. Jansen 					}
1150*59599516SKenneth E. Jansen 				}
1151*59599516SKenneth E. Jansen 
1152*59599516SKenneth E. Jansen                                 for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) {
1153*59599516SKenneth E. Jansen                                 	free ( header_table[j] );
1154*59599516SKenneth E. Jansen                                 }
1155*59599516SKenneth E. Jansen                                 free (header_table);
1156*59599516SKenneth E. Jansen 
1157*59599516SKenneth E. Jansen 			} // end of if MPI_IO_TAG
1158*59599516SKenneth E. Jansen 			else //else not valid MPI file
1159*59599516SKenneth E. Jansen 			{
1160*59599516SKenneth E. Jansen 				*fileDescriptor = NOT_A_MPI_FILE;
1161*59599516SKenneth 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);
1162*59599516SKenneth E. Jansen 				//Printing MasterHeaderSize is useful to test a compiler bug on Intrepid BGP
1163*59599516SKenneth E. Jansen                                 endTimer(&timer_end);
1164*59599516SKenneth E. Jansen                                 printPerf("openfile", timer_start, timer_end, 0, 0, "");
1165*59599516SKenneth E. Jansen 				return;
1166*59599516SKenneth E. Jansen 			}
1167*59599516SKenneth E. Jansen 		} // end of if "read"
1168*59599516SKenneth E. Jansen 		else if( cscompare( "write", imode ) )
1169*59599516SKenneth E. Jansen 		{
1170*59599516SKenneth E. Jansen 			rc = MPI_File_open( PhastaIOActiveFiles[i]->local_comm,
1171*59599516SKenneth E. Jansen 					fname,
1172*59599516SKenneth E. Jansen 					MPI_MODE_WRONLY | MPI_MODE_CREATE,
1173*59599516SKenneth E. Jansen 					MPI_INFO_NULL,
1174*59599516SKenneth E. Jansen 					&(PhastaIOActiveFiles[i]->file_handle) );
1175*59599516SKenneth E. Jansen 			if(rc)
1176*59599516SKenneth E. Jansen 			{
1177*59599516SKenneth E. Jansen 				*fileDescriptor = UNABLE_TO_OPEN_FILE;
1178*59599516SKenneth E. Jansen 				return;
1179*59599516SKenneth E. Jansen 			}
1180*59599516SKenneth E. Jansen 		} // end of if "write"
1181*59599516SKenneth E. Jansen 		free (fname);
1182*59599516SKenneth E. Jansen 		free (imode);
1183*59599516SKenneth E. Jansen 	} // end of if FileIndex != 0
1184*59599516SKenneth E. Jansen 
1185*59599516SKenneth E. Jansen 	endTimer(&timer_end);
1186*59599516SKenneth E. Jansen 	printPerf("openfile", timer_start, timer_end, 0, 0, "");
1187*59599516SKenneth E. Jansen }
1188*59599516SKenneth E. Jansen 
1189*59599516SKenneth E. Jansen /** close file for both POSIX and MPI-IO syncIO format.
1190*59599516SKenneth E. Jansen  *
1191*59599516SKenneth E. Jansen  * If it's old POSIX format, simply call posix fclose().
1192*59599516SKenneth E. Jansen  *
1193*59599516SKenneth E. Jansen  * If it's MPI-IO foramt:
1194*59599516SKenneth E. Jansen  * in "read" mode, it simply close file with MPI-IO close routine.
1195*59599516SKenneth E. Jansen  * in "write" mode, rank 0 in each group will re-assemble the master header and
1196*59599516SKenneth E. Jansen  * offset table and write to the beginning of file, then close the file.
1197*59599516SKenneth E. Jansen  */
1198*59599516SKenneth E. Jansen void closefile( int* fileDescriptor,
1199*59599516SKenneth E. Jansen                  const char mode[] )
1200*59599516SKenneth E. Jansen {
1201*59599516SKenneth E. Jansen 	double timer_start, timer_end;
1202*59599516SKenneth E. Jansen 	startTimer(&timer_start);
1203*59599516SKenneth E. Jansen 
1204*59599516SKenneth E. Jansen 	int i = *fileDescriptor;
1205*59599516SKenneth E. Jansen 	checkFileDescriptor("closefile",&i);
1206*59599516SKenneth E. Jansen 
1207*59599516SKenneth E. Jansen 	if ( PhastaIONextActiveIndex == 0 ) {
1208*59599516SKenneth E. Jansen 		char* imode = StringStripper( mode );
1209*59599516SKenneth E. Jansen 
1210*59599516SKenneth E. Jansen 		if( cscompare( "write", imode )
1211*59599516SKenneth E. Jansen 				|| cscompare( "append", imode ) ) {
1212*59599516SKenneth E. Jansen 			fflush( fileArray[ *fileDescriptor - 1 ] );
1213*59599516SKenneth E. Jansen 		}
1214*59599516SKenneth E. Jansen 
1215*59599516SKenneth E. Jansen 		fclose( fileArray[ *fileDescriptor - 1 ] );
1216*59599516SKenneth E. Jansen 		free (imode);
1217*59599516SKenneth E. Jansen 	}
1218*59599516SKenneth E. Jansen 	else {
1219*59599516SKenneth E. Jansen 		char* imode = StringStripper( mode );
1220*59599516SKenneth E. Jansen 
1221*59599516SKenneth E. Jansen 		//write master header here:
1222*59599516SKenneth E. Jansen 		if ( cscompare( "write", imode ) ) {
1223*59599516SKenneth E. Jansen 			//	      if ( PhastaIOActiveFiles[i]->nPPF * PhastaIOActiveFiles[i]->nFields < 2*ONE_MEGABYTE/8 )  //SHOULD BE CHECKED
1224*59599516SKenneth E. Jansen 			//		MasterHeaderSize = 4*ONE_MEGABYTE;
1225*59599516SKenneth E. Jansen 			//	      else
1226*59599516SKenneth E. Jansen 			//		MasterHeaderSize = 4*ONE_MEGABYTE + PhastaIOActiveFiles[i]->nPPF * PhastaIOActiveFiles[i]->nFields * 8 - 2*ONE_MEGABYTE;
1227*59599516SKenneth E. Jansen 
1228*59599516SKenneth E. Jansen 			MasterHeaderSize = computeMHSize( PhastaIOActiveFiles[i]->nFields, PhastaIOActiveFiles[i]->nPPF, LATEST_WRITE_VERSION);
1229*59599516SKenneth E. Jansen 			phprintf_0("Info closefile: myrank = %d, MasterHeaderSize = %d\n", PhastaIOActiveFiles[i]->myrank, MasterHeaderSize);
1230*59599516SKenneth E. Jansen 
1231*59599516SKenneth E. Jansen 			MPI_Status write_header_status;
1232*59599516SKenneth E. Jansen 			char mpi_tag[MAX_FIELDS_NAME_LENGTH];
1233*59599516SKenneth E. Jansen 			char version[MAX_FIELDS_NAME_LENGTH/4];
1234*59599516SKenneth E. Jansen 			char mhsize[MAX_FIELDS_NAME_LENGTH/4];
1235*59599516SKenneth E. Jansen 			int magic_number = ENDIAN_TEST_NUMBER;
1236*59599516SKenneth E. Jansen 
1237*59599516SKenneth E. Jansen 			if ( PhastaIOActiveFiles[i]->local_myrank == 0 )
1238*59599516SKenneth E. Jansen 			{
1239*59599516SKenneth E. Jansen 				bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH);
1240*59599516SKenneth E. Jansen 				sprintf(mpi_tag, "MPI_IO_Tag : ");
1241*59599516SKenneth E. Jansen 				memcpy(PhastaIOActiveFiles[i]->master_header,
1242*59599516SKenneth E. Jansen 						mpi_tag,
1243*59599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH);
1244*59599516SKenneth E. Jansen 
1245*59599516SKenneth E. Jansen 				bzero((void*)version,MAX_FIELDS_NAME_LENGTH/4);
1246*59599516SKenneth E. Jansen 				// this version is "1", print version in ASCII
1247*59599516SKenneth E. Jansen 				sprintf(version, "version : %d",1);
1248*59599516SKenneth E. Jansen 				memcpy(PhastaIOActiveFiles[i]->master_header + MAX_FIELDS_NAME_LENGTH/2,
1249*59599516SKenneth E. Jansen 						version,
1250*59599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH/4);
1251*59599516SKenneth E. Jansen 
1252*59599516SKenneth E. Jansen 				// master header size is computed using the formula above
1253*59599516SKenneth E. Jansen 				bzero((void*)mhsize,MAX_FIELDS_NAME_LENGTH/4);
1254*59599516SKenneth E. Jansen 				sprintf(mhsize, "mhsize : ");
1255*59599516SKenneth E. Jansen 				memcpy(PhastaIOActiveFiles[i]->master_header + MAX_FIELDS_NAME_LENGTH/4*3,
1256*59599516SKenneth E. Jansen 						mhsize,
1257*59599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH/4);
1258*59599516SKenneth E. Jansen 
1259*59599516SKenneth E. Jansen 				bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH);
1260*59599516SKenneth E. Jansen 				sprintf(mpi_tag,
1261*59599516SKenneth E. Jansen 						"\nnFields : %d\n",
1262*59599516SKenneth E. Jansen 						PhastaIOActiveFiles[i]->nFields);
1263*59599516SKenneth E. Jansen 				memcpy(PhastaIOActiveFiles[i]->master_header+MAX_FIELDS_NAME_LENGTH,
1264*59599516SKenneth E. Jansen 						mpi_tag,
1265*59599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH);
1266*59599516SKenneth E. Jansen 
1267*59599516SKenneth E. Jansen 				bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH);
1268*59599516SKenneth E. Jansen 				sprintf(mpi_tag, "\nnPPF : %d\n", PhastaIOActiveFiles[i]->nPPF);
1269*59599516SKenneth E. Jansen 				memcpy( PhastaIOActiveFiles[i]->master_header+
1270*59599516SKenneth E. Jansen 						PhastaIOActiveFiles[i]->nFields *
1271*59599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH +
1272*59599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH * 2,
1273*59599516SKenneth E. Jansen 						mpi_tag,
1274*59599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH);
1275*59599516SKenneth E. Jansen 
1276*59599516SKenneth E. Jansen 				memcpy( PhastaIOActiveFiles[i]->master_header+sizeof("MPI_IO_Tag : ")-1, //-1 sizeof returns the size of the string+1 for "\0"
1277*59599516SKenneth E. Jansen 						&magic_number,
1278*59599516SKenneth E. Jansen 						sizeof(int));
1279*59599516SKenneth E. Jansen 
1280*59599516SKenneth E. Jansen 				memcpy( PhastaIOActiveFiles[i]->master_header+sizeof("mhsize : ") -1 + MAX_FIELDS_NAME_LENGTH/4*3,
1281*59599516SKenneth E. Jansen 						&MasterHeaderSize,
1282*59599516SKenneth E. Jansen 						sizeof(int));
1283*59599516SKenneth E. Jansen 			}
1284*59599516SKenneth E. Jansen 
1285*59599516SKenneth E. Jansen 			int j = 0;
1286*59599516SKenneth E. Jansen 			unsigned long long **header_table;
1287*59599516SKenneth E. Jansen 			header_table = ( unsigned long long ** )calloc(PhastaIOActiveFiles[i]->nFields, sizeof(unsigned long long *));
1288*59599516SKenneth E. Jansen 			//header_table = ( unsigned long long ** ) calloc( PhastaIOActiveFiles[i]->nFields  + pool_align, sizeof(unsigned long long *));
1289*59599516SKenneth E. Jansen 			//mem_address = (long long )header_table;
1290*59599516SKenneth E. Jansen 			//if( mem_address & (pool_align -1) )
1291*59599516SKenneth E. Jansen 			//	header_table += pool_align - (mem_address & (pool_align -1));
1292*59599516SKenneth E. Jansen 
1293*59599516SKenneth E. Jansen 			for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) {
1294*59599516SKenneth E. Jansen 				header_table[j]=( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nPPF , sizeof( unsigned long long));
1295*59599516SKenneth E. Jansen 				//header_table[j]=( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nPPF + pool_align, sizeof (unsigned long long *));
1296*59599516SKenneth E. Jansen 				//mem_address = (long long )header_table[j];
1297*59599516SKenneth E. Jansen 				//if( mem_address & (pool_align -1) )
1298*59599516SKenneth E. Jansen 				//	header_table[j] += pool_align - (mem_address & (pool_align - 1));
1299*59599516SKenneth E. Jansen 			}
1300*59599516SKenneth E. Jansen 
1301*59599516SKenneth E. Jansen 			//if( irank == 0 ) printf("gonna mpi_gather, myrank = %d\n", irank);
1302*59599516SKenneth E. Jansen 			for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) {
1303*59599516SKenneth E. Jansen 				MPI_Gather( PhastaIOActiveFiles[i]->my_offset_table[j],
1304*59599516SKenneth E. Jansen 						PhastaIOActiveFiles[i]->nppp,
1305*59599516SKenneth E. Jansen 						MPI_LONG_LONG_INT,
1306*59599516SKenneth E. Jansen 						header_table[j],
1307*59599516SKenneth E. Jansen 						PhastaIOActiveFiles[i]->nppp,
1308*59599516SKenneth E. Jansen 						MPI_LONG_LONG_INT,
1309*59599516SKenneth E. Jansen 						0,
1310*59599516SKenneth E. Jansen 						PhastaIOActiveFiles[i]->local_comm );
1311*59599516SKenneth E. Jansen 			}
1312*59599516SKenneth E. Jansen 
1313*59599516SKenneth E. Jansen 			if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) {
1314*59599516SKenneth E. Jansen 
1315*59599516SKenneth E. Jansen 			        //if( irank == 0 ) printf("gonna memcpy for every procs, myrank = %d\n", irank);
1316*59599516SKenneth E. Jansen 				for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) {
1317*59599516SKenneth E. Jansen 					memcpy ( PhastaIOActiveFiles[i]->master_header +
1318*59599516SKenneth E. Jansen 						VERSION_INFO_HEADER_SIZE +
1319*59599516SKenneth E. Jansen 						j * PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long long),
1320*59599516SKenneth E. Jansen 						header_table[j],
1321*59599516SKenneth E. Jansen 						PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long long) );
1322*59599516SKenneth E. Jansen 				}
1323*59599516SKenneth E. Jansen 
1324*59599516SKenneth E. Jansen 				//if( irank == 0 ) printf("gonna file_write_at(), myrank = %d\n", irank);
1325*59599516SKenneth E. Jansen 				MPI_File_write_at( PhastaIOActiveFiles[i]->file_handle,
1326*59599516SKenneth E. Jansen 						0,
1327*59599516SKenneth E. Jansen 						PhastaIOActiveFiles[i]->master_header,
1328*59599516SKenneth E. Jansen 						MasterHeaderSize,
1329*59599516SKenneth E. Jansen 						MPI_CHAR,
1330*59599516SKenneth E. Jansen 						&write_header_status );
1331*59599516SKenneth E. Jansen 			}
1332*59599516SKenneth E. Jansen 
1333*59599516SKenneth E. Jansen 			////free(PhastaIOActiveFiles[i]->master_header);
1334*59599516SKenneth E. Jansen 
1335*59599516SKenneth E. Jansen 			for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) {
1336*59599516SKenneth E. Jansen 				free ( header_table[j] );
1337*59599516SKenneth E. Jansen 			}
1338*59599516SKenneth E. Jansen 			free (header_table);
1339*59599516SKenneth E. Jansen 		}
1340*59599516SKenneth E. Jansen 
1341*59599516SKenneth E. Jansen 		//if( irank == 0 ) printf("gonna file_close(), myrank = %d\n", irank);
1342*59599516SKenneth E. Jansen 		MPI_File_close( &( PhastaIOActiveFiles[i]->file_handle ) );
1343*59599516SKenneth E. Jansen 		free ( imode );
1344*59599516SKenneth E. Jansen 	}
1345*59599516SKenneth E. Jansen 
1346*59599516SKenneth E. Jansen 	endTimer(&timer_end);
1347*59599516SKenneth E. Jansen 	printPerf("closefile_", timer_start, timer_end, 0, 0, "");
1348*59599516SKenneth E. Jansen }
1349*59599516SKenneth E. Jansen 
1350*59599516SKenneth E. Jansen void readheader( int* fileDescriptor,
1351*59599516SKenneth E. Jansen                   const  char keyphrase[],
1352*59599516SKenneth E. Jansen                   void* valueArray,
1353*59599516SKenneth E. Jansen                   int*  nItems,
1354*59599516SKenneth E. Jansen                   const char  datatype[],
1355*59599516SKenneth E. Jansen                   const char  iotype[] )
1356*59599516SKenneth E. Jansen {
1357*59599516SKenneth E. Jansen 	double timer_start, timer_end;
1358*59599516SKenneth E. Jansen 	//MPI_Comm_rank(MPI_COMM_WORLD, &irank); //This should not be required if irank is indeed a global variable. irank should be initialized by either query and/or init
1359*59599516SKenneth E. Jansen 	//if(irank == 0) printf("entering readheader() - %s\n", keyphrase);
1360*59599516SKenneth E. Jansen 	startTimer(&timer_start);
1361*59599516SKenneth E. Jansen 
1362*59599516SKenneth E. Jansen 	int i = *fileDescriptor;
1363*59599516SKenneth E. Jansen 	checkFileDescriptor("readheader",&i);
1364*59599516SKenneth E. Jansen 
1365*59599516SKenneth E. Jansen 	if ( PhastaIONextActiveIndex == 0 ) {
1366*59599516SKenneth E. Jansen 		int filePtr = *fileDescriptor - 1;
1367*59599516SKenneth E. Jansen 		FILE* fileObject;
1368*59599516SKenneth E. Jansen 		int* valueListInt;
1369*59599516SKenneth E. Jansen 
1370*59599516SKenneth E. Jansen 		if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) {
1371*59599516SKenneth E. Jansen 			fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor);
1372*59599516SKenneth E. Jansen 			fprintf(stderr,"openfile_ function has to be called before \n") ;
1373*59599516SKenneth E. Jansen 			fprintf(stderr,"acessing the file\n ") ;
1374*59599516SKenneth E. Jansen 			fprintf(stderr,"fatal error: cannot continue, returning out of call\n");
1375*59599516SKenneth E. Jansen                         endTimer(&timer_end);
1376*59599516SKenneth E. Jansen                         printPerf("readheader", timer_start, timer_end, 0, 0, "");
1377*59599516SKenneth E. Jansen 			return;
1378*59599516SKenneth E. Jansen 		}
1379*59599516SKenneth E. Jansen 
1380*59599516SKenneth E. Jansen 		LastHeaderKey[ filePtr ] = const_cast< char* >( keyphrase );
1381*59599516SKenneth E. Jansen 		LastHeaderNotFound = false;
1382*59599516SKenneth E. Jansen 
1383*59599516SKenneth E. Jansen 		fileObject = fileArray[ filePtr ] ;
1384*59599516SKenneth E. Jansen 		Wrong_Endian = byte_order[ filePtr ];
1385*59599516SKenneth E. Jansen 
1386*59599516SKenneth E. Jansen 		isBinary( iotype );
1387*59599516SKenneth E. Jansen 		typeSize( datatype );   //redundant call, just avoid a compiler warning.
1388*59599516SKenneth E. Jansen 
1389*59599516SKenneth E. Jansen 		// right now we are making the assumption that we will only write integers
1390*59599516SKenneth E. Jansen 		// on the header line.
1391*59599516SKenneth E. Jansen 
1392*59599516SKenneth E. Jansen 		valueListInt = static_cast< int* >( valueArray );
1393*59599516SKenneth E. Jansen 		int ierr = readHeader( fileObject ,
1394*59599516SKenneth E. Jansen 				keyphrase,
1395*59599516SKenneth E. Jansen 				valueListInt,
1396*59599516SKenneth E. Jansen 				*nItems ) ;
1397*59599516SKenneth E. Jansen 
1398*59599516SKenneth E. Jansen 		byte_order[ filePtr ] = Wrong_Endian ;
1399*59599516SKenneth E. Jansen 
1400*59599516SKenneth E. Jansen 		if ( ierr ) LastHeaderNotFound = true;
1401*59599516SKenneth E. Jansen 
1402*59599516SKenneth E. Jansen 		//return ; // don't return, go to the end to print perf
1403*59599516SKenneth E. Jansen 	}
1404*59599516SKenneth E. Jansen 	else {
1405*59599516SKenneth E. Jansen 		unsigned int skip_size;
1406*59599516SKenneth E. Jansen 		int* valueListInt;
1407*59599516SKenneth E. Jansen 		valueListInt = static_cast <int*>(valueArray);
1408*59599516SKenneth E. Jansen 		char* token;
1409*59599516SKenneth E. Jansen 		bool FOUND = false ;
1410*59599516SKenneth E. Jansen 		isBinary( iotype );
1411*59599516SKenneth E. Jansen 
1412*59599516SKenneth E. Jansen 		MPI_Status read_offset_status;
1413*59599516SKenneth E. Jansen 		char read_out_tag[MAX_FIELDS_NAME_LENGTH];
1414*59599516SKenneth E. Jansen 		char readouttag[MAX_FIELDS_NUMBER][MAX_FIELDS_NAME_LENGTH];
1415*59599516SKenneth E. Jansen 		int j;
1416*59599516SKenneth E. Jansen 
1417*59599516SKenneth E. Jansen 		int string_length = strlen( keyphrase );
1418*59599516SKenneth E. Jansen 		char* buffer = (char*) malloc ( string_length+1 );
1419*59599516SKenneth E. Jansen 		//char* buffer = ( char * ) malloc( string_length + 1 + pool_align );
1420*59599516SKenneth E. Jansen 		//mem_address = (long long )buffer;
1421*59599516SKenneth E. Jansen 		//if( mem_address & (pool_align -1) )
1422*59599516SKenneth E. Jansen 		//  buffer += pool_align - (mem_address & (pool_align -1));
1423*59599516SKenneth E. Jansen 
1424*59599516SKenneth E. Jansen 		strcpy ( buffer, keyphrase );
1425*59599516SKenneth E. Jansen 		buffer[ string_length ] = '\0';
1426*59599516SKenneth E. Jansen 
1427*59599516SKenneth E. Jansen 		char* st2 = strtok ( buffer, "@" );
1428*59599516SKenneth E. Jansen 		st2 = strtok (NULL, "@");
1429*59599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->GPid = atoi(st2);
1430*59599516SKenneth E. Jansen 		if ( char* p = strpbrk(buffer, "@") )
1431*59599516SKenneth E. Jansen 			*p = '\0';
1432*59599516SKenneth E. Jansen 
1433*59599516SKenneth E. Jansen 		// Check if the user has input the right GPid
1434*59599516SKenneth E. Jansen 		if ( ( PhastaIOActiveFiles[i]->GPid <=
1435*59599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->myrank *
1436*59599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->nppp )||
1437*59599516SKenneth E. Jansen 				( PhastaIOActiveFiles[i]->GPid >
1438*59599516SKenneth E. Jansen 					( PhastaIOActiveFiles[i]->myrank + 1 ) *
1439*59599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->nppp ) )
1440*59599516SKenneth E. Jansen 		{
1441*59599516SKenneth E. Jansen 			*fileDescriptor = NOT_A_MPI_FILE;
1442*59599516SKenneth 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);
1443*59599516SKenneth E. Jansen                         // It is possible atoi could not generate a clear integer from st2 because of additional garbage character in keyphrase
1444*59599516SKenneth E. Jansen                         endTimer(&timer_end);
1445*59599516SKenneth E. Jansen                         printPerf("readheader", timer_start, timer_end, 0, 0, "");
1446*59599516SKenneth E. Jansen 			return;
1447*59599516SKenneth E. Jansen 		}
1448*59599516SKenneth E. Jansen 
1449*59599516SKenneth E. Jansen 		// Find the field we want ...
1450*59599516SKenneth E. Jansen 		//for ( j = 0; j<MAX_FIELDS_NUMBER; j++ )
1451*59599516SKenneth E. Jansen 		for ( j = 0; j<PhastaIOActiveFiles[i]->nFields; j++ )
1452*59599516SKenneth E. Jansen 		{
1453*59599516SKenneth E. Jansen 			memcpy( readouttag[j],
1454*59599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->master_header + j*MAX_FIELDS_NAME_LENGTH+MAX_FIELDS_NAME_LENGTH*2+1,
1455*59599516SKenneth E. Jansen 					MAX_FIELDS_NAME_LENGTH-1 );
1456*59599516SKenneth E. Jansen 		}
1457*59599516SKenneth E. Jansen 
1458*59599516SKenneth E. Jansen 		for ( j = 0; j<PhastaIOActiveFiles[i]->nFields; j++ )
1459*59599516SKenneth E. Jansen 		{
1460*59599516SKenneth E. Jansen 			token = strtok ( readouttag[j], ":" );
1461*59599516SKenneth E. Jansen 
1462*59599516SKenneth E. Jansen 			//if ( cscompare( buffer, token ) )
1463*59599516SKenneth E. Jansen 			if ( cscompare( token , buffer ) && cscompare( buffer, token ) )
1464*59599516SKenneth 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").
1465*59599516SKenneth 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).
1466*59599516SKenneth 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.
1467*59599516SKenneth E. Jansen 			{
1468*59599516SKenneth E. Jansen 				PhastaIOActiveFiles[i]->read_field_count = j;
1469*59599516SKenneth E. Jansen 				FOUND = true;
1470*59599516SKenneth E. Jansen                                 //printf("buffer: %s | token: %s | j: %d\n",buffer,token,j);
1471*59599516SKenneth E. Jansen 				break;
1472*59599516SKenneth E. Jansen 			}
1473*59599516SKenneth E. Jansen 		}
1474*59599516SKenneth E. Jansen                 free(buffer);
1475*59599516SKenneth E. Jansen 
1476*59599516SKenneth E. Jansen 		if (!FOUND)
1477*59599516SKenneth E. Jansen 		{
1478*59599516SKenneth E. Jansen 			//if(irank==0) printf("Warning readheader: Not found %s \n",keyphrase); //PhastaIOActiveFiles[i]->myrank is certainly initialized here.
1479*59599516SKenneth E. Jansen 			if(PhastaIOActiveFiles[i]->myrank == 0) printf("WARNING readheader: Not found %s\n",keyphrase);
1480*59599516SKenneth E. Jansen                         endTimer(&timer_end);
1481*59599516SKenneth E. Jansen                         printPerf("readheader", timer_start, timer_end, 0, 0, "");
1482*59599516SKenneth E. Jansen 			return;
1483*59599516SKenneth E. Jansen 		}
1484*59599516SKenneth E. Jansen 
1485*59599516SKenneth E. Jansen 		// Find the part we want ...
1486*59599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->read_part_count = PhastaIOActiveFiles[i]->GPid -
1487*59599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->myrank * PhastaIOActiveFiles[i]->nppp - 1;
1488*59599516SKenneth E. Jansen 
1489*59599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->my_offset =
1490*59599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->my_read_table[PhastaIOActiveFiles[i]->read_field_count][PhastaIOActiveFiles[i]->read_part_count];
1491*59599516SKenneth E. Jansen 
1492*59599516SKenneth E. Jansen 		// 	  printf("****Rank %d offset is %d\n",PhastaIOActiveFiles[i]->myrank,PhastaIOActiveFiles[i]->my_offset);
1493*59599516SKenneth E. Jansen 
1494*59599516SKenneth E. Jansen 		// Read each datablock header here ...
1495*59599516SKenneth E. Jansen 
1496*59599516SKenneth E. Jansen 		MPI_File_read_at_all( PhastaIOActiveFiles[i]->file_handle,
1497*59599516SKenneth E. Jansen 				PhastaIOActiveFiles[i]->my_offset+1,
1498*59599516SKenneth E. Jansen 				read_out_tag,
1499*59599516SKenneth E. Jansen 				MAX_FIELDS_NAME_LENGTH-1,
1500*59599516SKenneth E. Jansen 				MPI_CHAR,
1501*59599516SKenneth E. Jansen 				&read_offset_status );
1502*59599516SKenneth E. Jansen 		token = strtok ( read_out_tag, ":" );
1503*59599516SKenneth E. Jansen 
1504*59599516SKenneth E. Jansen 		// 	  printf("&&&&Rank %d read_out_tag is %s\n",PhastaIOActiveFiles[i]->myrank,read_out_tag);
1505*59599516SKenneth E. Jansen 
1506*59599516SKenneth 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.
1507*59599516SKenneth E. Jansen 		{
1508*59599516SKenneth E. Jansen 			FOUND = true ;
1509*59599516SKenneth E. Jansen 			token = strtok( NULL, " ,;<>" );
1510*59599516SKenneth E. Jansen 			skip_size = atoi( token );
1511*59599516SKenneth E. Jansen 			for( j=0; j < *nItems && ( token = strtok( NULL," ,;<>") ); j++ )
1512*59599516SKenneth E. Jansen 				valueListInt[j] = atoi( token );
1513*59599516SKenneth E. Jansen 
1514*59599516SKenneth E. Jansen 			if ( j < *nItems )
1515*59599516SKenneth E. Jansen 			{
1516*59599516SKenneth E. Jansen 				fprintf( stderr, "Expected # of ints not found for: %s\n", keyphrase );
1517*59599516SKenneth E. Jansen 			}
1518*59599516SKenneth E. Jansen 		}
1519*59599516SKenneth E. Jansen                 else {
1520*59599516SKenneth E. Jansen                   //if(irank==0)
1521*59599516SKenneth E. Jansen 		  if(PhastaIOActiveFiles[i]->myrank == 0)
1522*59599516SKenneth E. Jansen                   // If we enter this if, there is a problem with the name of some fields
1523*59599516SKenneth E. Jansen                   {
1524*59599516SKenneth E. Jansen                     printf("Error readheader: Unexpected mismatch between keyphrase = %s and token = %s\n",keyphrase,token);
1525*59599516SKenneth E. Jansen                   }
1526*59599516SKenneth E. Jansen                 }
1527*59599516SKenneth E. Jansen 	}
1528*59599516SKenneth E. Jansen 
1529*59599516SKenneth E. Jansen 	endTimer(&timer_end);
1530*59599516SKenneth E. Jansen 	printPerf("readheader", timer_start, timer_end, 0, 0, "");
1531*59599516SKenneth E. Jansen 
1532*59599516SKenneth E. Jansen }
1533*59599516SKenneth E. Jansen 
1534*59599516SKenneth E. Jansen void readdatablock( int*  fileDescriptor,
1535*59599516SKenneth E. Jansen                      const char keyphrase[],
1536*59599516SKenneth E. Jansen                      void* valueArray,
1537*59599516SKenneth E. Jansen                      int*  nItems,
1538*59599516SKenneth E. Jansen                      const char  datatype[],
1539*59599516SKenneth E. Jansen                      const char  iotype[] )
1540*59599516SKenneth E. Jansen {
1541*59599516SKenneth E. Jansen 
1542*59599516SKenneth E. Jansen 	//if(irank == 0) printf("entering readdatablock()\n");
1543*59599516SKenneth E. Jansen 	unsigned long long data_size = 0;
1544*59599516SKenneth E. Jansen 	double timer_start, timer_end;
1545*59599516SKenneth E. Jansen 	startTimer(&timer_start);
1546*59599516SKenneth E. Jansen 
1547*59599516SKenneth E. Jansen 	int i = *fileDescriptor;
1548*59599516SKenneth E. Jansen 	checkFileDescriptor("readdatablock",&i);
1549*59599516SKenneth E. Jansen 
1550*59599516SKenneth E. Jansen 	if ( PhastaIONextActiveIndex == 0 ) {
1551*59599516SKenneth E. Jansen 		int filePtr = *fileDescriptor - 1;
1552*59599516SKenneth E. Jansen 		FILE* fileObject;
1553*59599516SKenneth E. Jansen 		char junk;
1554*59599516SKenneth E. Jansen 
1555*59599516SKenneth E. Jansen 		if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) {
1556*59599516SKenneth E. Jansen 			fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor);
1557*59599516SKenneth E. Jansen 			fprintf(stderr,"openfile_ function has to be called before\n") ;
1558*59599516SKenneth E. Jansen 			fprintf(stderr,"acessing the file\n ") ;
1559*59599516SKenneth E. Jansen 			fprintf(stderr,"fatal error: cannot continue, returning out of call\n");
1560*59599516SKenneth E. Jansen                         endTimer(&timer_end);
1561*59599516SKenneth E. Jansen                         printPerf("readdatablock", timer_start, timer_end, 0, 0, "");
1562*59599516SKenneth E. Jansen 			return;
1563*59599516SKenneth E. Jansen 		}
1564*59599516SKenneth E. Jansen 
1565*59599516SKenneth E. Jansen 		// error check..
1566*59599516SKenneth E. Jansen 		// since we require that a consistant header always preceed the data block
1567*59599516SKenneth E. Jansen 		// let us check to see that it is actually the case.
1568*59599516SKenneth E. Jansen 
1569*59599516SKenneth E. Jansen 		if ( ! cscompare( LastHeaderKey[ filePtr ], keyphrase ) ) {
1570*59599516SKenneth E. Jansen 			fprintf(stderr, "Header not consistant with data block\n");
1571*59599516SKenneth E. Jansen 			fprintf(stderr, "Header: %s\n", LastHeaderKey[ filePtr ] );
1572*59599516SKenneth E. Jansen 			fprintf(stderr, "DataBlock: %s\n ", keyphrase );
1573*59599516SKenneth E. Jansen 			fprintf(stderr, "Please recheck read sequence \n");
1574*59599516SKenneth E. Jansen 			if( Strict_Error ) {
1575*59599516SKenneth E. Jansen 				fprintf(stderr, "fatal error: cannot continue, returning out of call\n");
1576*59599516SKenneth E. Jansen                                 endTimer(&timer_end);
1577*59599516SKenneth E. Jansen                                 printPerf("readdatablock", timer_start, timer_end, 0, 0, "");
1578*59599516SKenneth E. Jansen 				return;
1579*59599516SKenneth E. Jansen 			}
1580*59599516SKenneth E. Jansen 		}
1581*59599516SKenneth E. Jansen 
1582*59599516SKenneth E. Jansen 		if ( LastHeaderNotFound ) {
1583*59599516SKenneth E. Jansen                         endTimer(&timer_end);
1584*59599516SKenneth E. Jansen                         printPerf("readdatablock", timer_start, timer_end, 0, 0, "");
1585*59599516SKenneth E. Jansen                         return;
1586*59599516SKenneth E. Jansen                 }
1587*59599516SKenneth E. Jansen 		fileObject = fileArray[ filePtr ];
1588*59599516SKenneth E. Jansen 		Wrong_Endian = byte_order[ filePtr ];
1589*59599516SKenneth E. Jansen 
1590*59599516SKenneth E. Jansen 		size_t type_size = typeSize( datatype );
1591*59599516SKenneth E. Jansen 		int nUnits = *nItems;
1592*59599516SKenneth E. Jansen 		isBinary( iotype );
1593*59599516SKenneth E. Jansen 
1594*59599516SKenneth E. Jansen 		if ( binary_format ) {
1595*59599516SKenneth E. Jansen 			fread( valueArray, type_size, nUnits, fileObject );
1596*59599516SKenneth E. Jansen 			fread( &junk, sizeof(char), 1 , fileObject );
1597*59599516SKenneth E. Jansen 			if ( Wrong_Endian ) SwapArrayByteOrder( valueArray, type_size, nUnits );
1598*59599516SKenneth E. Jansen 		} else {
1599*59599516SKenneth E. Jansen 
1600*59599516SKenneth E. Jansen 			char* ts1 = StringStripper( datatype );
1601*59599516SKenneth E. Jansen 			if ( cscompare( "integer", ts1 ) ) {
1602*59599516SKenneth E. Jansen 				for( int n=0; n < nUnits ; n++ )
1603*59599516SKenneth E. Jansen 					fscanf(fileObject, "%d\n",(int*)((int*)valueArray+n) );
1604*59599516SKenneth E. Jansen 			} else if ( cscompare( "double", ts1 ) ) {
1605*59599516SKenneth E. Jansen 				for( int n=0; n < nUnits ; n++ )
1606*59599516SKenneth E. Jansen 					fscanf(fileObject, "%lf\n",(double*)((double*)valueArray+n) );
1607*59599516SKenneth E. Jansen 			}
1608*59599516SKenneth E. Jansen 			free (ts1);
1609*59599516SKenneth E. Jansen 		}
1610*59599516SKenneth E. Jansen 
1611*59599516SKenneth E. Jansen 		//return;
1612*59599516SKenneth E. Jansen 	}
1613*59599516SKenneth E. Jansen 	else {
1614*59599516SKenneth E. Jansen 		// 	  printf("read data block\n");
1615*59599516SKenneth E. Jansen 		MPI_Status read_data_status;
1616*59599516SKenneth E. Jansen 		size_t type_size = typeSize( datatype );
1617*59599516SKenneth E. Jansen 		int nUnits = *nItems;
1618*59599516SKenneth E. Jansen 		isBinary( iotype );
1619*59599516SKenneth E. Jansen 
1620*59599516SKenneth E. Jansen 		// read datablock then
1621*59599516SKenneth E. Jansen 		//MR CHANGE
1622*59599516SKenneth E. Jansen 		//             if ( cscompare ( datatype, "double"))
1623*59599516SKenneth E. Jansen 		char* ts2 = StringStripper( datatype );
1624*59599516SKenneth E. Jansen 		if ( cscompare ( "double" , ts2))
1625*59599516SKenneth E. Jansen 			//MR CHANGE END
1626*59599516SKenneth E. Jansen 		{
1627*59599516SKenneth E. Jansen 
1628*59599516SKenneth E. Jansen 			MPI_File_read_at_all_begin( PhastaIOActiveFiles[i]->file_handle,
1629*59599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->my_offset + DB_HEADER_SIZE,
1630*59599516SKenneth E. Jansen 					valueArray,
1631*59599516SKenneth E. Jansen 					nUnits,
1632*59599516SKenneth E. Jansen 					MPI_DOUBLE );
1633*59599516SKenneth E. Jansen 			MPI_File_read_at_all_end( PhastaIOActiveFiles[i]->file_handle,
1634*59599516SKenneth E. Jansen 					valueArray,
1635*59599516SKenneth E. Jansen 					&read_data_status );
1636*59599516SKenneth E. Jansen 			data_size=8*nUnits;
1637*59599516SKenneth E. Jansen 
1638*59599516SKenneth E. Jansen 		}
1639*59599516SKenneth E. Jansen 		//MR CHANGE
1640*59599516SKenneth E. Jansen 		//             else if ( cscompare ( datatype, "integer"))
1641*59599516SKenneth E. Jansen 		else if ( cscompare ( "integer" , ts2))
1642*59599516SKenneth E. Jansen 			//MR CHANGE END
1643*59599516SKenneth E. Jansen 		{
1644*59599516SKenneth E. Jansen 			MPI_File_read_at_all_begin(PhastaIOActiveFiles[i]->file_handle,
1645*59599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->my_offset + DB_HEADER_SIZE,
1646*59599516SKenneth E. Jansen 					valueArray,
1647*59599516SKenneth E. Jansen 					nUnits,
1648*59599516SKenneth E. Jansen 					MPI_INT );
1649*59599516SKenneth E. Jansen 			MPI_File_read_at_all_end( PhastaIOActiveFiles[i]->file_handle,
1650*59599516SKenneth E. Jansen 					valueArray,
1651*59599516SKenneth E. Jansen 					&read_data_status );
1652*59599516SKenneth E. Jansen 			data_size=4*nUnits;
1653*59599516SKenneth E. Jansen 		}
1654*59599516SKenneth E. Jansen 		else
1655*59599516SKenneth E. Jansen 		{
1656*59599516SKenneth E. Jansen 			*fileDescriptor = DATA_TYPE_ILLEGAL;
1657*59599516SKenneth E. Jansen 			printf("readdatablock - DATA_TYPE_ILLEGAL - %s\n",datatype);
1658*59599516SKenneth E. Jansen                         endTimer(&timer_end);
1659*59599516SKenneth E. Jansen                         printPerf("readdatablock", timer_start, timer_end, 0, 0, "");
1660*59599516SKenneth E. Jansen 			return;
1661*59599516SKenneth E. Jansen 		}
1662*59599516SKenneth E. Jansen                 free(ts2);
1663*59599516SKenneth E. Jansen 
1664*59599516SKenneth E. Jansen 
1665*59599516SKenneth E. Jansen 		// 	  printf("%d Read finishe\n",PhastaIOActiveFiles[i]->myrank);
1666*59599516SKenneth E. Jansen 
1667*59599516SKenneth E. Jansen 		// Swap data byte order if endianess is different ...
1668*59599516SKenneth E. Jansen 		if ( PhastaIOActiveFiles[i]->Wrong_Endian )
1669*59599516SKenneth E. Jansen 		{
1670*59599516SKenneth E. Jansen 			SwapArrayByteOrder( valueArray, type_size, nUnits );
1671*59599516SKenneth E. Jansen 		}
1672*59599516SKenneth E. Jansen 	}
1673*59599516SKenneth E. Jansen 
1674*59599516SKenneth E. Jansen 	endTimer(&timer_end);
1675*59599516SKenneth E. Jansen 	char extra_msg[1024];
1676*59599516SKenneth E. Jansen 	memset(extra_msg, '\0', 1024);
1677*59599516SKenneth E. Jansen 	char* key = StringStripper(keyphrase);
1678*59599516SKenneth E. Jansen 	sprintf(extra_msg, " field is %s ", key);
1679*59599516SKenneth E. Jansen 	printPerf("readdatablock", timer_start, timer_end, data_size, 1, extra_msg);
1680*59599516SKenneth E. Jansen         free(key);
1681*59599516SKenneth E. Jansen 
1682*59599516SKenneth E. Jansen }
1683*59599516SKenneth E. Jansen 
1684*59599516SKenneth E. Jansen void writeheader(  const int* fileDescriptor,
1685*59599516SKenneth E. Jansen                     const char keyphrase[],
1686*59599516SKenneth E. Jansen                     const void* valueArray,
1687*59599516SKenneth E. Jansen                     const int* nItems,
1688*59599516SKenneth E. Jansen                     const int* ndataItems,
1689*59599516SKenneth E. Jansen                     const char datatype[],
1690*59599516SKenneth E. Jansen                     const char iotype[])
1691*59599516SKenneth E. Jansen {
1692*59599516SKenneth E. Jansen 
1693*59599516SKenneth E. Jansen 	//if(irank == 0) printf("entering writeheader()\n");
1694*59599516SKenneth E. Jansen 
1695*59599516SKenneth E. Jansen 	double timer_start, timer_end;
1696*59599516SKenneth E. Jansen 	startTimer(&timer_start);
1697*59599516SKenneth E. Jansen 
1698*59599516SKenneth E. Jansen 	int i = *fileDescriptor;
1699*59599516SKenneth E. Jansen 	checkFileDescriptor("writeheader",&i);
1700*59599516SKenneth E. Jansen 
1701*59599516SKenneth E. Jansen 	if ( PhastaIONextActiveIndex == 0 ) {
1702*59599516SKenneth E. Jansen 		int filePtr = *fileDescriptor - 1;
1703*59599516SKenneth E. Jansen 		FILE* fileObject;
1704*59599516SKenneth E. Jansen 
1705*59599516SKenneth E. Jansen 		if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) {
1706*59599516SKenneth E. Jansen 			fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor);
1707*59599516SKenneth E. Jansen 			fprintf(stderr,"openfile_ function has to be called before \n") ;
1708*59599516SKenneth E. Jansen 			fprintf(stderr,"acessing the file\n ") ;
1709*59599516SKenneth E. Jansen 			fprintf(stderr,"fatal error: cannot continue, returning out of call\n");
1710*59599516SKenneth E. Jansen                         endTimer(&timer_end);
1711*59599516SKenneth E. Jansen                         printPerf("writeheader", timer_start, timer_end, 0, 0, "");
1712*59599516SKenneth E. Jansen 			return;
1713*59599516SKenneth E. Jansen 		}
1714*59599516SKenneth E. Jansen 
1715*59599516SKenneth E. Jansen 		LastHeaderKey[ filePtr ] = const_cast< char* >( keyphrase );
1716*59599516SKenneth E. Jansen 		DataSize = *ndataItems;
1717*59599516SKenneth E. Jansen 		fileObject = fileArray[ filePtr ] ;
1718*59599516SKenneth E. Jansen 		size_t type_size = typeSize( datatype );
1719*59599516SKenneth E. Jansen 		isBinary( iotype );
1720*59599516SKenneth E. Jansen 		header_type[ filePtr ] = type_size;
1721*59599516SKenneth E. Jansen 
1722*59599516SKenneth E. Jansen 		int _newline = ( *ndataItems > 0 ) ? sizeof( char ) : 0;
1723*59599516SKenneth E. Jansen 		int size_of_nextblock =
1724*59599516SKenneth E. Jansen 			( binary_format ) ? type_size*( *ndataItems )+ _newline : *ndataItems ;
1725*59599516SKenneth E. Jansen 
1726*59599516SKenneth E. Jansen 		fprintf( fileObject, "%s : < %d > ", keyphrase, size_of_nextblock );
1727*59599516SKenneth E. Jansen 		for( int i = 0; i < *nItems; i++ )
1728*59599516SKenneth E. Jansen 			fprintf(fileObject, "%d ", *((int*)((int*)valueArray+i)));
1729*59599516SKenneth E. Jansen 		fprintf(fileObject, "\n");
1730*59599516SKenneth E. Jansen 
1731*59599516SKenneth E. Jansen 		//return ;
1732*59599516SKenneth E. Jansen 	}
1733*59599516SKenneth E. Jansen 	else { // else it's parallel I/O
1734*59599516SKenneth E. Jansen 		DataSize = *ndataItems;
1735*59599516SKenneth E. Jansen 		size_t type_size = typeSize( datatype );
1736*59599516SKenneth E. Jansen 		isBinary( iotype );
1737*59599516SKenneth E. Jansen 		char mpi_tag[MAX_FIELDS_NAME_LENGTH];
1738*59599516SKenneth E. Jansen 
1739*59599516SKenneth E. Jansen 		int string_length = strlen( keyphrase );
1740*59599516SKenneth E. Jansen 		char* buffer = (char*) malloc ( string_length+1 );
1741*59599516SKenneth E. Jansen 		//char* buffer = ( char * ) malloc( string_length + 1 + pool_align );
1742*59599516SKenneth E. Jansen 		//mem_address = (long long )buffer;
1743*59599516SKenneth E. Jansen 		//if( mem_address & (pool_align -1) )
1744*59599516SKenneth E. Jansen 		// buffer += pool_align - (mem_address & (pool_align -1));
1745*59599516SKenneth E. Jansen 
1746*59599516SKenneth E. Jansen 		strcpy ( buffer, keyphrase);
1747*59599516SKenneth E. Jansen 		buffer[ string_length ] = '\0';
1748*59599516SKenneth E. Jansen 
1749*59599516SKenneth E. Jansen 		char* st2 = strtok ( buffer, "@" );
1750*59599516SKenneth E. Jansen 		st2 = strtok (NULL, "@");
1751*59599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->GPid = atoi(st2);
1752*59599516SKenneth E. Jansen 
1753*59599516SKenneth E. Jansen 		if ( char* p = strpbrk(buffer, "@") )
1754*59599516SKenneth E. Jansen 			*p = '\0';
1755*59599516SKenneth E. Jansen 
1756*59599516SKenneth E. Jansen 	        bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH);
1757*59599516SKenneth E. Jansen 		sprintf(mpi_tag, "\n%s : %d\n", buffer, PhastaIOActiveFiles[i]->field_count);
1758*59599516SKenneth E. Jansen 		unsigned long long offset_value;
1759*59599516SKenneth E. Jansen 
1760*59599516SKenneth E. Jansen 		int temp = *ndataItems;
1761*59599516SKenneth E. Jansen 		unsigned long long number_of_items = (unsigned long long)temp;
1762*59599516SKenneth E. Jansen 		MPI_Barrier(PhastaIOActiveFiles[i]->local_comm);
1763*59599516SKenneth E. Jansen 
1764*59599516SKenneth E. Jansen 		MPI_Scan( &number_of_items,
1765*59599516SKenneth E. Jansen 				&offset_value,
1766*59599516SKenneth E. Jansen 				1,
1767*59599516SKenneth E. Jansen 				MPI_LONG_LONG_INT,
1768*59599516SKenneth E. Jansen 				MPI_SUM,
1769*59599516SKenneth E. Jansen 				PhastaIOActiveFiles[i]->local_comm );
1770*59599516SKenneth E. Jansen 
1771*59599516SKenneth E. Jansen 		offset_value = (offset_value - number_of_items) * type_size;
1772*59599516SKenneth E. Jansen 
1773*59599516SKenneth E. Jansen 		offset_value += PhastaIOActiveFiles[i]->local_myrank *
1774*59599516SKenneth E. Jansen 			DB_HEADER_SIZE +
1775*59599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->next_start_address;
1776*59599516SKenneth E. Jansen 		// This offset is the starting address of each datablock header...
1777*59599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->my_offset = offset_value;
1778*59599516SKenneth E. Jansen 
1779*59599516SKenneth E. Jansen 		// Write in my offset table ...
1780*59599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->my_offset_table[PhastaIOActiveFiles[i]->field_count][PhastaIOActiveFiles[i]->part_count] =
1781*59599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->my_offset;
1782*59599516SKenneth E. Jansen 
1783*59599516SKenneth E. Jansen 		// Update the next-start-address ...
1784*59599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->next_start_address = offset_value +
1785*59599516SKenneth E. Jansen 			number_of_items * type_size +
1786*59599516SKenneth E. Jansen 			DB_HEADER_SIZE;
1787*59599516SKenneth E. Jansen 		MPI_Bcast( &(PhastaIOActiveFiles[i]->next_start_address),
1788*59599516SKenneth E. Jansen 				1,
1789*59599516SKenneth E. Jansen 				MPI_LONG_LONG_INT,
1790*59599516SKenneth E. Jansen 				PhastaIOActiveFiles[i]->local_numprocs-1,
1791*59599516SKenneth E. Jansen 				PhastaIOActiveFiles[i]->local_comm );
1792*59599516SKenneth E. Jansen 
1793*59599516SKenneth E. Jansen 		// Prepare datablock header ...
1794*59599516SKenneth E. Jansen 		int _newline = (*ndataItems>0)?sizeof(char):0;
1795*59599516SKenneth E. Jansen 		unsigned int size_of_nextblock = type_size * (*ndataItems) + _newline;
1796*59599516SKenneth E. Jansen 
1797*59599516SKenneth E. Jansen 		//char datablock_header[255];
1798*59599516SKenneth E. Jansen 		//bzero((void*)datablock_header,255);
1799*59599516SKenneth E. Jansen 		char datablock_header[DB_HEADER_SIZE];
1800*59599516SKenneth E. Jansen 		bzero((void*)datablock_header,DB_HEADER_SIZE);
1801*59599516SKenneth E. Jansen 
1802*59599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->GPid = PhastaIOActiveFiles[i]->nppp*PhastaIOActiveFiles[i]->myrank+PhastaIOActiveFiles[i]->part_count;
1803*59599516SKenneth E. Jansen 		sprintf( datablock_header,
1804*59599516SKenneth E. Jansen 				"\n%s : < %u >",
1805*59599516SKenneth E. Jansen 				keyphrase,
1806*59599516SKenneth E. Jansen 				size_of_nextblock );
1807*59599516SKenneth E. Jansen 
1808*59599516SKenneth E. Jansen 		for ( int j = 0; j < *nItems; j++ )
1809*59599516SKenneth E. Jansen 		{
1810*59599516SKenneth E. Jansen 			sprintf( datablock_header,
1811*59599516SKenneth E. Jansen 					"%s %d ",
1812*59599516SKenneth E. Jansen 					datablock_header,
1813*59599516SKenneth E. Jansen 					*((int*)((int*)valueArray+j)));
1814*59599516SKenneth E. Jansen 		}
1815*59599516SKenneth E. Jansen 		sprintf( datablock_header,
1816*59599516SKenneth E. Jansen 				"%s\n ",
1817*59599516SKenneth E. Jansen 				datablock_header );
1818*59599516SKenneth E. Jansen 
1819*59599516SKenneth E. Jansen 		// Write datablock header ...
1820*59599516SKenneth E. Jansen 		//MR CHANGE
1821*59599516SKenneth E. Jansen 		// 	if ( cscompare(datatype,"double") )
1822*59599516SKenneth E. Jansen 		char* ts1 = StringStripper( datatype );
1823*59599516SKenneth E. Jansen 		if ( cscompare("double",ts1) )
1824*59599516SKenneth E. Jansen 			//MR CHANGE END
1825*59599516SKenneth E. Jansen 		{
1826*59599516SKenneth E. Jansen 			free ( PhastaIOActiveFiles[i]->double_chunk );
1827*59599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->double_chunk = ( double * )malloc( (sizeof( double )*number_of_items+ DB_HEADER_SIZE));
1828*59599516SKenneth E. Jansen 			//PhastaIOActiveFiles[i]->double_chunk = ( double * ) malloc( sizeof( double )*number_of_items+ DB_HEADER_SIZE + pool_align );
1829*59599516SKenneth E. Jansen 			//mem_address = (long long )PhastaIOActiveFiles[i]->double_chunk;
1830*59599516SKenneth E. Jansen 			//if( mem_address & (pool_align -1) )
1831*59599516SKenneth E. Jansen 			// PhastaIOActiveFiles[i]->double_chunk += pool_align - (mem_address & (pool_align -1));
1832*59599516SKenneth E. Jansen 
1833*59599516SKenneth E. Jansen 			double * aa = ( double * )datablock_header;
1834*59599516SKenneth E. Jansen 			memcpy(PhastaIOActiveFiles[i]->double_chunk, aa, DB_HEADER_SIZE);
1835*59599516SKenneth E. Jansen 		}
1836*59599516SKenneth E. Jansen 		//MR CHANGE
1837*59599516SKenneth E. Jansen 		// 	if  ( cscompare(datatype,"integer") )
1838*59599516SKenneth E. Jansen 		else if ( cscompare("integer",ts1) )
1839*59599516SKenneth E. Jansen 			//MR CHANGE END
1840*59599516SKenneth E. Jansen 		{
1841*59599516SKenneth E. Jansen 			free ( PhastaIOActiveFiles[i]->int_chunk );
1842*59599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->int_chunk = ( int * )malloc( (sizeof( int )*number_of_items+ DB_HEADER_SIZE));
1843*59599516SKenneth E. Jansen 			//PhastaIOActiveFiles[i]->int_chunk = ( int * ) malloc( sizeof( int )*number_of_items+ DB_HEADER_SIZE + pool_align );
1844*59599516SKenneth E. Jansen 			//mem_address = (long long )PhastaIOActiveFiles[i]->int_chunk;
1845*59599516SKenneth E. Jansen 			//if( mem_address & (pool_align -1) )
1846*59599516SKenneth E. Jansen 			// PhastaIOActiveFiles[i]->int_chunk += pool_align - (mem_address & ( pool_align -1));
1847*59599516SKenneth E. Jansen 
1848*59599516SKenneth E. Jansen 			int * aa = ( int * )datablock_header;
1849*59599516SKenneth E. Jansen 			memcpy(PhastaIOActiveFiles[i]->int_chunk, aa, DB_HEADER_SIZE);
1850*59599516SKenneth E. Jansen 		}
1851*59599516SKenneth E. Jansen 		else {
1852*59599516SKenneth E. Jansen 			//             *fileDescriptor = DATA_TYPE_ILLEGAL;
1853*59599516SKenneth E. Jansen 			printf("writeheader - DATA_TYPE_ILLEGAL - %s\n",datatype);
1854*59599516SKenneth E. Jansen                         endTimer(&timer_end);
1855*59599516SKenneth E. Jansen                         printPerf("writeheader", timer_start, timer_end, 0, 0, "");
1856*59599516SKenneth E. Jansen 			return;
1857*59599516SKenneth E. Jansen 		}
1858*59599516SKenneth E. Jansen 		free(ts1);
1859*59599516SKenneth E. Jansen 
1860*59599516SKenneth E. Jansen 		PhastaIOActiveFiles[i]->part_count++;
1861*59599516SKenneth E. Jansen 		if ( PhastaIOActiveFiles[i]->part_count == PhastaIOActiveFiles[i]->nppp ) {
1862*59599516SKenneth E. Jansen 			//A new field will be written
1863*59599516SKenneth E. Jansen 			if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) {
1864*59599516SKenneth E. Jansen 				memcpy( PhastaIOActiveFiles[i]->master_header +
1865*59599516SKenneth E. Jansen 						PhastaIOActiveFiles[i]->field_count *
1866*59599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH +
1867*59599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH * 2,
1868*59599516SKenneth E. Jansen 						mpi_tag,
1869*59599516SKenneth E. Jansen 						MAX_FIELDS_NAME_LENGTH-1);
1870*59599516SKenneth E. Jansen 			}
1871*59599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->field_count++;
1872*59599516SKenneth E. Jansen 			PhastaIOActiveFiles[i]->part_count=0;
1873*59599516SKenneth E. Jansen 		}
1874*59599516SKenneth E. Jansen                 free(buffer);
1875*59599516SKenneth E. Jansen 	}
1876*59599516SKenneth E. Jansen 
1877*59599516SKenneth E. Jansen 	endTimer(&timer_end);
1878*59599516SKenneth E. Jansen 	printPerf("writeheader", timer_start, timer_end, 0, 0, "");
1879*59599516SKenneth E. Jansen }
1880*59599516SKenneth E. Jansen 
1881*59599516SKenneth E. Jansen void writedatablock( const int* fileDescriptor,
1882*59599516SKenneth E. Jansen                       const char keyphrase[],
1883*59599516SKenneth E. Jansen                       const void* valueArray,
1884*59599516SKenneth E. Jansen                       const int* nItems,
1885*59599516SKenneth E. Jansen                       const char datatype[],
1886*59599516SKenneth E. Jansen                       const char iotype[] )
1887*59599516SKenneth E. Jansen {
1888*59599516SKenneth E. Jansen 	//if(irank == 0) printf("entering writedatablock()\n");
1889*59599516SKenneth E. Jansen 
1890*59599516SKenneth E. Jansen 	unsigned long long data_size = 0;
1891*59599516SKenneth E. Jansen 	double timer_start, timer_end;
1892*59599516SKenneth E. Jansen 	startTimer(&timer_start);
1893*59599516SKenneth E. Jansen 
1894*59599516SKenneth E. Jansen 	int i = *fileDescriptor;
1895*59599516SKenneth E. Jansen 	checkFileDescriptor("writedatablock",&i);
1896*59599516SKenneth E. Jansen 
1897*59599516SKenneth E. Jansen 	if ( PhastaIONextActiveIndex == 0 ) {
1898*59599516SKenneth E. Jansen 		int filePtr = *fileDescriptor - 1;
1899*59599516SKenneth E. Jansen 
1900*59599516SKenneth E. Jansen 		if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) {
1901*59599516SKenneth E. Jansen 			fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor);
1902*59599516SKenneth E. Jansen 			fprintf(stderr,"openfile_ function has to be called before \n") ;
1903*59599516SKenneth E. Jansen 			fprintf(stderr,"acessing the file\n ") ;
1904*59599516SKenneth E. Jansen 			fprintf(stderr,"fatal error: cannot continue, returning out of call\n");
1905*59599516SKenneth E. Jansen                         endTimer(&timer_end);
1906*59599516SKenneth E. Jansen                         printPerf("writedatablock", timer_start, timer_end, 0, 0, "");
1907*59599516SKenneth E. Jansen 			return;
1908*59599516SKenneth E. Jansen 		}
1909*59599516SKenneth E. Jansen 		// since we require that a consistant header always preceed the data block
1910*59599516SKenneth E. Jansen 		// let us check to see that it is actually the case.
1911*59599516SKenneth E. Jansen 
1912*59599516SKenneth E. Jansen 		if ( ! cscompare( LastHeaderKey[ filePtr ], keyphrase ) ) {
1913*59599516SKenneth E. Jansen 			fprintf(stderr, "Header not consistant with data block\n");
1914*59599516SKenneth E. Jansen 			fprintf(stderr, "Header: %s\n", LastHeaderKey[ filePtr ] );
1915*59599516SKenneth E. Jansen 			fprintf(stderr, "DataBlock: %s\n ", keyphrase );
1916*59599516SKenneth E. Jansen 			fprintf(stderr, "Please recheck write sequence \n");
1917*59599516SKenneth E. Jansen 			if( Strict_Error ) {
1918*59599516SKenneth E. Jansen 				fprintf(stderr, "fatal error: cannot continue, returning out of call\n");
1919*59599516SKenneth E. Jansen                                 endTimer(&timer_end);
1920*59599516SKenneth E. Jansen                                 printPerf("writedatablock", timer_start, timer_end, 0, 0, "");
1921*59599516SKenneth E. Jansen 				return;
1922*59599516SKenneth E. Jansen 			}
1923*59599516SKenneth E. Jansen 		}
1924*59599516SKenneth E. Jansen 
1925*59599516SKenneth E. Jansen 		FILE* fileObject =  fileArray[ filePtr ] ;
1926*59599516SKenneth E. Jansen 		size_t type_size=typeSize( datatype );
1927*59599516SKenneth E. Jansen 		isBinary( iotype );
1928*59599516SKenneth E. Jansen 
1929*59599516SKenneth E. Jansen 		if ( header_type[filePtr] != (int)type_size ) {
1930*59599516SKenneth E. Jansen 			fprintf(stderr,"header and datablock differ on typeof data in the block for\n");
1931*59599516SKenneth E. Jansen 			fprintf(stderr,"keyphrase : %s\n", keyphrase);
1932*59599516SKenneth E. Jansen 			if( Strict_Error ) {
1933*59599516SKenneth E. Jansen 				fprintf(stderr,"fatal error: cannot continue, returning out of call\n" );
1934*59599516SKenneth E. Jansen                                 endTimer(&timer_end);
1935*59599516SKenneth E. Jansen                                 printPerf("writedatablock", timer_start, timer_end, 0, 0, "");
1936*59599516SKenneth E. Jansen 				return;
1937*59599516SKenneth E. Jansen 			}
1938*59599516SKenneth E. Jansen 		}
1939*59599516SKenneth E. Jansen 
1940*59599516SKenneth E. Jansen 		int nUnits = *nItems;
1941*59599516SKenneth E. Jansen 
1942*59599516SKenneth E. Jansen 		if ( nUnits != DataSize ) {
1943*59599516SKenneth E. Jansen 			fprintf(stderr,"header and datablock differ on number of data items for\n");
1944*59599516SKenneth E. Jansen 			fprintf(stderr,"keyphrase : %s\n", keyphrase);
1945*59599516SKenneth E. Jansen 			if( Strict_Error ) {
1946*59599516SKenneth E. Jansen 				fprintf(stderr,"fatal error: cannot continue, returning out of call\n" );
1947*59599516SKenneth E. Jansen                                 endTimer(&timer_end);
1948*59599516SKenneth E. Jansen                                 printPerf("writedatablock", timer_start, timer_end, 0, 0, "");
1949*59599516SKenneth E. Jansen 				return;
1950*59599516SKenneth E. Jansen 			}
1951*59599516SKenneth E. Jansen 		}
1952*59599516SKenneth E. Jansen 
1953*59599516SKenneth E. Jansen 		if ( binary_format ) {
1954*59599516SKenneth E. Jansen 
1955*59599516SKenneth E. Jansen 			fwrite( valueArray, type_size, nUnits, fileObject );
1956*59599516SKenneth E. Jansen 			fprintf( fileObject,"\n");
1957*59599516SKenneth E. Jansen 
1958*59599516SKenneth E. Jansen 		} else {
1959*59599516SKenneth E. Jansen 
1960*59599516SKenneth E. Jansen 			char* ts1 = StringStripper( datatype );
1961*59599516SKenneth E. Jansen 			if ( cscompare( "integer", ts1 ) ) {
1962*59599516SKenneth E. Jansen 				for( int n=0; n < nUnits ; n++ )
1963*59599516SKenneth E. Jansen 					fprintf(fileObject,"%d\n",*((int*)((int*)valueArray+n)));
1964*59599516SKenneth E. Jansen 			} else if ( cscompare( "double", ts1 ) ) {
1965*59599516SKenneth E. Jansen 				for( int n=0; n < nUnits ; n++ )
1966*59599516SKenneth E. Jansen 					fprintf(fileObject,"%lf\n",*((double*)((double*)valueArray+n)));
1967*59599516SKenneth E. Jansen 			}
1968*59599516SKenneth E. Jansen 			free (ts1);
1969*59599516SKenneth E. Jansen 		}
1970*59599516SKenneth E. Jansen 		//return ;
1971*59599516SKenneth E. Jansen 	}
1972*59599516SKenneth E. Jansen 	else {  // syncIO case
1973*59599516SKenneth E. Jansen 		MPI_Status write_data_status;
1974*59599516SKenneth E. Jansen 		isBinary( iotype );
1975*59599516SKenneth E. Jansen 		int nUnits = *nItems;
1976*59599516SKenneth E. Jansen 
1977*59599516SKenneth E. Jansen 		//MR CHANGE
1978*59599516SKenneth E. Jansen 		// 	if ( cscompare(datatype,"double") )
1979*59599516SKenneth E. Jansen 		char* ts1 = StringStripper( datatype );
1980*59599516SKenneth E. Jansen 		if ( cscompare("double",ts1) )
1981*59599516SKenneth E. Jansen 			//MR CHANGE END
1982*59599516SKenneth E. Jansen 		{
1983*59599516SKenneth E. Jansen 			memcpy((PhastaIOActiveFiles[i]->double_chunk+DB_HEADER_SIZE/sizeof(double)), valueArray, nUnits*sizeof(double));
1984*59599516SKenneth E. Jansen 			MPI_File_write_at_all_begin( PhastaIOActiveFiles[i]->file_handle,
1985*59599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->my_offset,
1986*59599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->double_chunk,
1987*59599516SKenneth E. Jansen 					//BLOCK_SIZE/sizeof(double),
1988*59599516SKenneth E. Jansen 					nUnits+DB_HEADER_SIZE/sizeof(double),
1989*59599516SKenneth E. Jansen 					MPI_DOUBLE );
1990*59599516SKenneth E. Jansen 			MPI_File_write_at_all_end( PhastaIOActiveFiles[i]->file_handle,
1991*59599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->double_chunk,
1992*59599516SKenneth E. Jansen 					&write_data_status );
1993*59599516SKenneth E. Jansen 			data_size=8*nUnits;
1994*59599516SKenneth E. Jansen 		}
1995*59599516SKenneth E. Jansen 		//MR CHANGE
1996*59599516SKenneth E. Jansen 		// 	else if ( cscompare ( datatype, "integer"))
1997*59599516SKenneth E. Jansen 		else if ( cscompare("integer",ts1) )
1998*59599516SKenneth E. Jansen 			//MR CHANGE END
1999*59599516SKenneth E. Jansen 		{
2000*59599516SKenneth E. Jansen 			memcpy((PhastaIOActiveFiles[i]->int_chunk+DB_HEADER_SIZE/sizeof(int)), valueArray, nUnits*sizeof(int));
2001*59599516SKenneth E. Jansen 			MPI_File_write_at_all_begin( PhastaIOActiveFiles[i]->file_handle,
2002*59599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->my_offset,
2003*59599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->int_chunk,
2004*59599516SKenneth E. Jansen 					nUnits+DB_HEADER_SIZE/sizeof(int),
2005*59599516SKenneth E. Jansen 					MPI_INT );
2006*59599516SKenneth E. Jansen 			MPI_File_write_at_all_end( PhastaIOActiveFiles[i]->file_handle,
2007*59599516SKenneth E. Jansen 					PhastaIOActiveFiles[i]->int_chunk,
2008*59599516SKenneth E. Jansen 					&write_data_status );
2009*59599516SKenneth E. Jansen 			data_size=4*nUnits;
2010*59599516SKenneth E. Jansen 		}
2011*59599516SKenneth E. Jansen 		else {
2012*59599516SKenneth E. Jansen 			printf("Error: writedatablock - DATA_TYPE_ILLEGAL - %s\n",datatype);
2013*59599516SKenneth E. Jansen                         endTimer(&timer_end);
2014*59599516SKenneth E. Jansen                         printPerf("writedatablock", timer_start, timer_end, 0, 0, "");
2015*59599516SKenneth E. Jansen 			return;
2016*59599516SKenneth E. Jansen 		}
2017*59599516SKenneth E. Jansen                 free(ts1);
2018*59599516SKenneth E. Jansen 	}
2019*59599516SKenneth E. Jansen 
2020*59599516SKenneth E. Jansen 	endTimer(&timer_end);
2021*59599516SKenneth E. Jansen 	char extra_msg[1024];
2022*59599516SKenneth E. Jansen 	memset(extra_msg, '\0', 1024);
2023*59599516SKenneth E. Jansen 	char* key = StringStripper(keyphrase);
2024*59599516SKenneth E. Jansen 	sprintf(extra_msg, " field is %s ", key);
2025*59599516SKenneth E. Jansen 	printPerf("writedatablock", timer_start, timer_end, data_size, 1, extra_msg);
2026*59599516SKenneth E. Jansen         free(key);
2027*59599516SKenneth E. Jansen 
2028*59599516SKenneth E. Jansen }
2029*59599516SKenneth E. Jansen 
2030*59599516SKenneth E. Jansen void
2031*59599516SKenneth E. Jansen SwapArrayByteOrder( void* array,
2032*59599516SKenneth E. Jansen                      int   nbytes,
2033*59599516SKenneth E. Jansen                      int   nItems )
2034*59599516SKenneth E. Jansen {
2035*59599516SKenneth E. Jansen 	/* This swaps the byte order for the array of nItems each
2036*59599516SKenneth E. Jansen 		 of size nbytes , This will be called only locally  */
2037*59599516SKenneth E. Jansen 	int i,j;
2038*59599516SKenneth E. Jansen 	unsigned char* ucDst = (unsigned char*)array;
2039*59599516SKenneth E. Jansen 
2040*59599516SKenneth E. Jansen 	for(i=0; i < nItems; i++) {
2041*59599516SKenneth E. Jansen 		for(j=0; j < (nbytes/2); j++)
2042*59599516SKenneth E. Jansen 			std::swap( ucDst[j] , ucDst[(nbytes - 1) - j] );
2043*59599516SKenneth E. Jansen 		ucDst += nbytes;
2044*59599516SKenneth E. Jansen 	}
2045*59599516SKenneth E. Jansen }
2046*59599516SKenneth E. Jansen 
2047*59599516SKenneth E. Jansen void
2048*59599516SKenneth E. Jansen writestring( int* fileDescriptor,
2049*59599516SKenneth E. Jansen               const char inString[] )
2050*59599516SKenneth E. Jansen {
2051*59599516SKenneth E. Jansen 
2052*59599516SKenneth E. Jansen 	int filePtr = *fileDescriptor - 1;
2053*59599516SKenneth E. Jansen 	FILE* fileObject = fileArray[filePtr] ;
2054*59599516SKenneth E. Jansen 	fprintf(fileObject,"%s",inString );
2055*59599516SKenneth E. Jansen 	return;
2056*59599516SKenneth E. Jansen }
2057*59599516SKenneth E. Jansen 
2058*59599516SKenneth E. Jansen void
2059*59599516SKenneth E. Jansen Gather_Headers( int* fileDescriptor,
2060*59599516SKenneth E. Jansen                 vector< string >& headers )
2061*59599516SKenneth E. Jansen {
2062*59599516SKenneth E. Jansen 
2063*59599516SKenneth E. Jansen 	FILE* fileObject;
2064*59599516SKenneth E. Jansen 	char Line[1024];
2065*59599516SKenneth E. Jansen 
2066*59599516SKenneth E. Jansen 	fileObject = fileArray[ (*fileDescriptor)-1 ];
2067*59599516SKenneth E. Jansen 
2068*59599516SKenneth E. Jansen 	while( !feof(fileObject) ) {
2069*59599516SKenneth E. Jansen 		fgets( Line, 1024, fileObject);
2070*59599516SKenneth E. Jansen 		if ( Line[0] == '#' ) {
2071*59599516SKenneth E. Jansen 			headers.push_back( Line );
2072*59599516SKenneth E. Jansen 		} else {
2073*59599516SKenneth E. Jansen 			break;
2074*59599516SKenneth E. Jansen 		}
2075*59599516SKenneth E. Jansen 	}
2076*59599516SKenneth E. Jansen 	rewind( fileObject );
2077*59599516SKenneth E. Jansen 	clearerr( fileObject );
2078*59599516SKenneth E. Jansen }
2079*59599516SKenneth E. Jansen void
2080*59599516SKenneth E. Jansen isWrong( void ) { (Wrong_Endian) ? fprintf(stdout,"YES\n"): fprintf(stdout,"NO\n") ; }
2081*59599516SKenneth E. Jansen 
2082*59599516SKenneth E. Jansen void
2083*59599516SKenneth E. Jansen togglestrictmode( void ) { Strict_Error = !Strict_Error; }
2084*59599516SKenneth E. Jansen 
2085*59599516SKenneth E. Jansen int
2086*59599516SKenneth E. Jansen isLittleEndian( void )
2087*59599516SKenneth E. Jansen {
2088*59599516SKenneth E. Jansen 	// this function returns a 1 if the current running architecture is
2089*59599516SKenneth E. Jansen 	// LittleEndian Byte Ordered, else it returns a zero
2090*59599516SKenneth E. Jansen 
2091*59599516SKenneth E. Jansen 	union  {
2092*59599516SKenneth E. Jansen 		long a;
2093*59599516SKenneth E. Jansen 		char c[sizeof( long )];
2094*59599516SKenneth E. Jansen 	} endianUnion;
2095*59599516SKenneth E. Jansen 
2096*59599516SKenneth E. Jansen 	endianUnion.a = 1 ;
2097*59599516SKenneth E. Jansen 
2098*59599516SKenneth E. Jansen 	if ( endianUnion.c[sizeof(long)-1] != 1 ) return 1 ;
2099*59599516SKenneth E. Jansen 	else return 0;
2100*59599516SKenneth E. Jansen }
2101*59599516SKenneth E. Jansen 
2102*59599516SKenneth E. Jansen namespace PHASTA {
2103*59599516SKenneth E. Jansen 	const char* const PhastaIO_traits<int>::type_string = "integer";
2104*59599516SKenneth E. Jansen 	const char* const PhastaIO_traits<double>::type_string = "double";
2105*59599516SKenneth E. Jansen }
2106