159599516SKenneth E. Jansen /* 259599516SKenneth E. Jansen * 359599516SKenneth E. Jansen * This is the SyncIO library that uses MPI-IO collective functions to 459599516SKenneth E. Jansen * implement a flexible I/O checkpoint solution for a large number of 559599516SKenneth E. Jansen * processors. 659599516SKenneth E. Jansen * 759599516SKenneth E. Jansen * Previous developer: Ning Liu (liun2@cs.rpi.edu) 859599516SKenneth E. Jansen * Jing Fu (fuj@cs.rpi.edu) 959599516SKenneth E. Jansen * Current developers: Michel Rasquin (Michel.Rasquin@colorado.edu), 1059599516SKenneth E. Jansen * Ben Matthews (benjamin.a.matthews@colorado.edu) 1159599516SKenneth E. Jansen * 1259599516SKenneth E. Jansen */ 1359599516SKenneth E. Jansen 1459599516SKenneth E. Jansen #include <map> 1559599516SKenneth E. Jansen #include <vector> 1659599516SKenneth E. Jansen #include <string> 17a746c838SCameron Smith #include <cstdarg> 1859599516SKenneth E. Jansen #include <string.h> 1959599516SKenneth E. Jansen #include <ctype.h> 2059599516SKenneth E. Jansen #include <stdlib.h> 2159599516SKenneth E. Jansen #include <stdio.h> 2259599516SKenneth E. Jansen #include <math.h> 23d3337298SCameron Smith #include <sstream> 2459599516SKenneth E. Jansen #include "phastaIO.h" 2559599516SKenneth E. Jansen #include "mpi.h" 2659599516SKenneth E. Jansen #include "phiotmrc.h" 27f42e0444SCameron Smith #include "phiostats.h" 2897a07b0aSCameron Smith #include <assert.h> 2959599516SKenneth E. Jansen 3059599516SKenneth E. Jansen #define VERSION_INFO_HEADER_SIZE 8192 3159599516SKenneth E. Jansen #define DB_HEADER_SIZE 1024 3259599516SKenneth E. Jansen #define ONE_MEGABYTE 1048576 3359599516SKenneth E. Jansen #define TWO_MEGABYTE 2097152 3459599516SKenneth E. Jansen #define ENDIAN_TEST_NUMBER 12180 // Troy's Zip Code!! 3559599516SKenneth E. Jansen #define MAX_PHASTA_FILES 64 3659599516SKenneth E. Jansen #define MAX_PHASTA_FILE_NAME_LENGTH 1024 3759599516SKenneth 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 3859599516SKenneth E. Jansen // -3 for MPI_IO_Tag, nFields and nppf, -4 for extra security (former nFiles) 3959599516SKenneth E. Jansen #define MAX_FIELDS_NAME_LENGTH 128 4059599516SKenneth E. Jansen #define DefaultMHSize (4*ONE_MEGABYTE) 4159599516SKenneth E. Jansen //#define DefaultMHSize (8350) //For test 4259599516SKenneth E. Jansen #define LATEST_WRITE_VERSION 1 4359599516SKenneth E. Jansen #define inv1024sq 953.674316406e-9 // = 1/1024/1024 4459599516SKenneth E. Jansen int MasterHeaderSize = -1; 4559599516SKenneth E. Jansen 4659599516SKenneth E. Jansen bool PRINT_PERF = false; // default print no perf results 4759599516SKenneth E. Jansen int irank = -1; // global rank, should never be manually manipulated 4859599516SKenneth E. Jansen int mysize = -1; 4959599516SKenneth E. Jansen 5059599516SKenneth E. Jansen // Static variables are bad but used here to store the subcommunicator and associated variables 5159599516SKenneth 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) 5259599516SKenneth E. Jansen static int s_assign_local_comm = 0; 5359599516SKenneth E. Jansen static MPI_Comm s_local_comm; 5459599516SKenneth E. Jansen static int s_local_size = -1; 5559599516SKenneth E. Jansen static int s_local_rank = -1; 5659599516SKenneth E. Jansen 5759599516SKenneth E. Jansen // the following defines are for debug printf 5859599516SKenneth E. Jansen #define PHASTAIO_DEBUG 0 //default to not print any debugging info 5959599516SKenneth E. Jansen 60fe03b87fSCameron Smith void phprintf(const char* fmt, ...) { 61be3da47bSCameron Smith (void)fmt; 6259599516SKenneth E. Jansen #if PHASTAIO_DEBUG 63fe03b87fSCameron Smith char format[1024]; 64fe03b87fSCameron Smith snprintf(format, sizeof(format), "phastaIO debug: %s", fmt); 65fe03b87fSCameron Smith va_list ap; 66fe03b87fSCameron Smith va_start(ap,fmt); 67a746c838SCameron Smith vprintf(format,ap); 68fe03b87fSCameron Smith va_end(ap); 6959599516SKenneth E. Jansen #endif 70fe03b87fSCameron Smith } 71fe03b87fSCameron Smith 72fe03b87fSCameron Smith void phprintf_0(const char* fmt, ...) { 73be3da47bSCameron Smith (void)fmt; 74fe03b87fSCameron Smith #if PHASTAIO_DEBUG 75fe03b87fSCameron Smith int rank = 0; 76fe03b87fSCameron Smith MPI_Comm_rank(MPI_COMM_WORLD, &rank); 77fe03b87fSCameron Smith if(rank == 0){ 78fe03b87fSCameron Smith char format[1024]; 79fe03b87fSCameron Smith snprintf(format, sizeof(format), "phastaIO debug: irank=0 %s", fmt); 80fe03b87fSCameron Smith va_list ap; 81a746c838SCameron Smith va_start(ap,fmt); 82fe03b87fSCameron Smith vprintf(format, ap); 83fe03b87fSCameron Smith va_end(ap); 84fe03b87fSCameron Smith } 85fe03b87fSCameron Smith #endif 86fe03b87fSCameron Smith } 8759599516SKenneth E. Jansen 8859599516SKenneth E. Jansen enum PhastaIO_Errors 8959599516SKenneth E. Jansen { 9059599516SKenneth E. Jansen MAX_PHASTA_FILES_EXCEEDED = -1, 9159599516SKenneth E. Jansen UNABLE_TO_OPEN_FILE = -2, 9259599516SKenneth E. Jansen NOT_A_MPI_FILE = -3, 9359599516SKenneth E. Jansen GPID_EXCEEDED = -4, 9410d56689SCameron Smith DATA_TYPE_ILLEGAL = -5 9559599516SKenneth E. Jansen }; 9659599516SKenneth E. Jansen 9759599516SKenneth E. Jansen using namespace std; 9859599516SKenneth E. Jansen 9959599516SKenneth E. Jansen namespace{ 10059599516SKenneth E. Jansen 101961a4ff6SCameron Smith map<int, std::string> LastHeaderKey; 10259599516SKenneth E. Jansen vector< FILE* > fileArray; 10359599516SKenneth E. Jansen vector< bool > byte_order; 10459599516SKenneth E. Jansen vector< int > header_type; 10559599516SKenneth E. Jansen int DataSize=0; 10659599516SKenneth E. Jansen bool LastHeaderNotFound = false; 10759599516SKenneth E. Jansen bool Wrong_Endian = false ; 10859599516SKenneth E. Jansen bool Strict_Error = false ; 10959599516SKenneth E. Jansen bool binary_format = true; 11059599516SKenneth E. Jansen 11159599516SKenneth E. Jansen /***********************************************************************/ 11259599516SKenneth E. Jansen /***************** NEW PHASTA IO CODE STARTS HERE **********************/ 11359599516SKenneth E. Jansen /***********************************************************************/ 11459599516SKenneth E. Jansen 11559599516SKenneth E. Jansen typedef struct 11659599516SKenneth E. Jansen { 11759599516SKenneth E. Jansen char filename[MAX_PHASTA_FILE_NAME_LENGTH]; /* defafults to 1024 */ 1182dd307a1SCameron Smith unsigned long my_offset; 1192dd307a1SCameron Smith unsigned long next_start_address; 1202dd307a1SCameron Smith unsigned long **my_offset_table; 1212dd307a1SCameron Smith unsigned long **my_read_table; 12259599516SKenneth E. Jansen 12359599516SKenneth E. Jansen double * double_chunk; 12459599516SKenneth E. Jansen double * read_double_chunk; 12559599516SKenneth E. Jansen 12659599516SKenneth E. Jansen int field_count; 12759599516SKenneth E. Jansen int part_count; 12859599516SKenneth E. Jansen int read_field_count; 12959599516SKenneth E. Jansen int read_part_count; 13059599516SKenneth E. Jansen int GPid; 13159599516SKenneth E. Jansen int start_id; 13259599516SKenneth E. Jansen 13359599516SKenneth E. Jansen int mhsize; 13459599516SKenneth E. Jansen 13559599516SKenneth E. Jansen int myrank; 13659599516SKenneth E. Jansen int numprocs; 13759599516SKenneth E. Jansen int local_myrank; 13859599516SKenneth E. Jansen int local_numprocs; 13959599516SKenneth E. Jansen 14059599516SKenneth E. Jansen int nppp; 14159599516SKenneth E. Jansen int nPPF; 14259599516SKenneth E. Jansen int nFiles; 14359599516SKenneth E. Jansen int nFields; 14459599516SKenneth E. Jansen 14559599516SKenneth E. Jansen int * int_chunk; 14659599516SKenneth E. Jansen int * read_int_chunk; 14759599516SKenneth E. Jansen 14859599516SKenneth E. Jansen int Wrong_Endian; /* default to false */ 14959599516SKenneth E. Jansen char * master_header; 15059599516SKenneth E. Jansen MPI_File file_handle; 15159599516SKenneth E. Jansen MPI_Comm local_comm; 15259599516SKenneth E. Jansen } phastaio_file_t; 15359599516SKenneth E. Jansen 15459599516SKenneth E. Jansen typedef struct 15559599516SKenneth E. Jansen { 15659599516SKenneth E. Jansen int nppf, nfields; 15759599516SKenneth E. Jansen char * masterHeader; 15859599516SKenneth E. Jansen }serial_file; 15959599516SKenneth E. Jansen 16059599516SKenneth E. Jansen serial_file *SerialFile; 16159599516SKenneth E. Jansen phastaio_file_t *PhastaIOActiveFiles[MAX_PHASTA_FILES]; 16259599516SKenneth E. Jansen int PhastaIONextActiveIndex = 0; /* indicates next index to allocate */ 16359599516SKenneth E. Jansen 16459599516SKenneth E. Jansen // the caller has the responsibility to delete the returned string 16559599516SKenneth E. Jansen // TODO: StringStipper("nbc value? ") returns NULL? 166103be424SCameron Smith char* StringStripper( const char istring[] ) { 16759599516SKenneth E. Jansen int length = strlen( istring ); 16859599516SKenneth E. Jansen char* dest = (char *)malloc( length + 1 ); 16959599516SKenneth E. Jansen strcpy( dest, istring ); 17059599516SKenneth E. Jansen dest[ length ] = '\0'; 17159599516SKenneth E. Jansen if ( char* p = strpbrk( dest, " ") ) 17259599516SKenneth E. Jansen *p = '\0'; 17359599516SKenneth E. Jansen return dest; 17459599516SKenneth E. Jansen } 17559599516SKenneth E. Jansen 176103be424SCameron Smith inline int cscompare( const char teststring[], const char targetstring[] ) { 17759599516SKenneth E. Jansen char* s1 = const_cast<char*>(teststring); 17859599516SKenneth E. Jansen char* s2 = const_cast<char*>(targetstring); 17959599516SKenneth E. Jansen 18059599516SKenneth E. Jansen while( *s1 == ' ') s1++; 18159599516SKenneth E. Jansen while( *s2 == ' ') s2++; 18259599516SKenneth E. Jansen while( ( *s1 ) 18359599516SKenneth E. Jansen && ( *s2 ) 18459599516SKenneth E. Jansen && ( *s2 != '?') 18559599516SKenneth E. Jansen && ( tolower( *s1 )==tolower( *s2 ) ) ) { 18659599516SKenneth E. Jansen s1++; 18759599516SKenneth E. Jansen s2++; 18859599516SKenneth E. Jansen while( *s1 == ' ') s1++; 18959599516SKenneth E. Jansen while( *s2 == ' ') s2++; 19059599516SKenneth E. Jansen } 19159599516SKenneth E. Jansen if ( !( *s1 ) || ( *s1 == '?') ) return 1; 19259599516SKenneth E. Jansen else return 0; 19359599516SKenneth E. Jansen } 19459599516SKenneth E. Jansen 195103be424SCameron Smith inline void isBinary( const char iotype[] ) { 19659599516SKenneth E. Jansen char* fname = StringStripper( iotype ); 19759599516SKenneth E. Jansen if ( cscompare( fname, "binary" ) ) binary_format = true; 19859599516SKenneth E. Jansen else binary_format = false; 19959599516SKenneth E. Jansen free (fname); 20059599516SKenneth E. Jansen 20159599516SKenneth E. Jansen } 20259599516SKenneth E. Jansen 203103be424SCameron Smith inline size_t typeSize( const char typestring[] ) { 20459599516SKenneth E. Jansen char* ts1 = StringStripper( typestring ); 20559599516SKenneth E. Jansen if ( cscompare( "integer", ts1 ) ) { 20659599516SKenneth E. Jansen free (ts1); 20759599516SKenneth E. Jansen return sizeof(int); 20859599516SKenneth E. Jansen } else if ( cscompare( "double", ts1 ) ) { 20959599516SKenneth E. Jansen free (ts1); 21059599516SKenneth E. Jansen return sizeof( double ); 21159599516SKenneth E. Jansen } else { 21259599516SKenneth E. Jansen free (ts1); 21359599516SKenneth E. Jansen fprintf(stderr,"unknown type : %s\n",ts1); 21459599516SKenneth E. Jansen return 0; 21559599516SKenneth E. Jansen } 21659599516SKenneth E. Jansen } 21759599516SKenneth E. Jansen 218103be424SCameron Smith int readHeader( 219103be424SCameron Smith FILE* fileObject, 22059599516SKenneth E. Jansen const char phrase[], 22159599516SKenneth E. Jansen int* params, 22259599516SKenneth E. Jansen int expect ) { 22359599516SKenneth E. Jansen char* text_header; 22459599516SKenneth E. Jansen char* token; 22597a07b0aSCameron Smith char Line[1024] = "\0"; 22659599516SKenneth E. Jansen char junk; 22759599516SKenneth E. Jansen bool FOUND = false ; 22859599516SKenneth E. Jansen int real_length; 22959599516SKenneth E. Jansen int skip_size, integer_value; 23059599516SKenneth E. Jansen int rewind_count=0; 23159599516SKenneth E. Jansen 23259599516SKenneth E. Jansen if( !fgets( Line, 1024, fileObject ) && feof( fileObject ) ) { 23359599516SKenneth E. Jansen rewind( fileObject ); 23459599516SKenneth E. Jansen clearerr( fileObject ); 23559599516SKenneth E. Jansen rewind_count++; 23659599516SKenneth E. Jansen fgets( Line, 1024, fileObject ); 23759599516SKenneth E. Jansen } 23859599516SKenneth E. Jansen 23959599516SKenneth E. Jansen while( !FOUND && ( rewind_count < 2 ) ) { 24059599516SKenneth E. Jansen if ( ( Line[0] != '\n' ) && ( real_length = strcspn( Line, "#" )) ) { 24159599516SKenneth E. Jansen text_header = (char *)malloc( real_length + 1 ); 24259599516SKenneth E. Jansen strncpy( text_header, Line, real_length ); 24359599516SKenneth E. Jansen text_header[ real_length ] =static_cast<char>(NULL); 24459599516SKenneth E. Jansen token = strtok ( text_header, ":" ); 24597a07b0aSCameron Smith assert(token); 24697a07b0aSCameron Smith if( cscompare( phrase , token ) ) { 24759599516SKenneth E. Jansen FOUND = true ; 24859599516SKenneth E. Jansen token = strtok( NULL, " ,;<>" ); 24997a07b0aSCameron Smith assert(token); 25059599516SKenneth E. Jansen skip_size = atoi( token ); 25159599516SKenneth E. Jansen int i; 25259599516SKenneth E. Jansen for( i=0; i < expect && ( token = strtok( NULL," ,;<>") ); i++) { 25397a07b0aSCameron Smith assert(token); 25459599516SKenneth E. Jansen params[i] = atoi( token ); 25559599516SKenneth E. Jansen } 25659599516SKenneth E. Jansen if ( i < expect ) { 257103be424SCameron Smith fprintf(stderr, 258103be424SCameron Smith "Aloha Expected # of ints not found for: %s\n",phrase ); 25959599516SKenneth E. Jansen } 26059599516SKenneth E. Jansen } else if ( cscompare(token,"byteorder magic number") ) { 26159599516SKenneth E. Jansen if ( binary_format ) { 26259599516SKenneth E. Jansen fread((void*)&integer_value,sizeof(int),1,fileObject); 26359599516SKenneth E. Jansen fread( &junk, sizeof(char), 1 , fileObject ); 26459599516SKenneth E. Jansen if ( 362436 != integer_value ) Wrong_Endian = true; 26559599516SKenneth E. Jansen } else{ 26659599516SKenneth E. Jansen fscanf(fileObject, "%d\n", &integer_value ); 26759599516SKenneth E. Jansen } 26859599516SKenneth E. Jansen } else { 26959599516SKenneth E. Jansen /* some other header, so just skip over */ 27059599516SKenneth E. Jansen token = strtok( NULL, " ,;<>" ); 27197a07b0aSCameron Smith assert(token); 27259599516SKenneth E. Jansen skip_size = atoi( token ); 27359599516SKenneth E. Jansen if ( binary_format) 27459599516SKenneth E. Jansen fseek( fileObject, skip_size, SEEK_CUR ); 27559599516SKenneth E. Jansen else 27659599516SKenneth E. Jansen for( int gama=0; gama < skip_size; gama++ ) 27759599516SKenneth E. Jansen fgets( Line, 1024, fileObject ); 27859599516SKenneth E. Jansen } 27959599516SKenneth E. Jansen free (text_header); 28059599516SKenneth E. Jansen } // end of if before while loop 28159599516SKenneth E. Jansen 28259599516SKenneth E. Jansen if ( !FOUND ) 28359599516SKenneth E. Jansen if( !fgets( Line, 1024, fileObject ) && feof( fileObject ) ) { 28459599516SKenneth E. Jansen rewind( fileObject ); 28559599516SKenneth E. Jansen clearerr( fileObject ); 28659599516SKenneth E. Jansen rewind_count++; 28759599516SKenneth E. Jansen fgets( Line, 1024, fileObject ); 28859599516SKenneth E. Jansen } 28959599516SKenneth E. Jansen } 29059599516SKenneth E. Jansen 29159599516SKenneth E. Jansen if ( !FOUND ) { 29259599516SKenneth E. Jansen //fprintf(stderr, "Error: Could not find: %s\n", phrase); 29359599516SKenneth E. Jansen if(irank == 0) printf("WARNING: Could not find: %s\n", phrase); 29459599516SKenneth E. Jansen return 1; 29559599516SKenneth E. Jansen } 29659599516SKenneth E. Jansen return 0; 29759599516SKenneth E. Jansen } 29859599516SKenneth E. Jansen 29959599516SKenneth E. Jansen } // end unnamed namespace 30059599516SKenneth E. Jansen 30159599516SKenneth E. Jansen 30259599516SKenneth E. Jansen // begin of publicly visible functions 30359599516SKenneth E. Jansen 30459599516SKenneth E. Jansen /** 30559599516SKenneth E. Jansen * This function takes a long long pointer and assign (start) phiotmrc value to it 30659599516SKenneth E. Jansen */ 30759599516SKenneth E. Jansen void startTimer(double* start) { 30859599516SKenneth E. Jansen if( !PRINT_PERF ) return; 30959599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 31059599516SKenneth E. Jansen *start = phiotmrc(); 31159599516SKenneth E. Jansen } 31259599516SKenneth E. Jansen 31359599516SKenneth E. Jansen /** 31459599516SKenneth E. Jansen * This function takes a long long pointer and assign (end) phiotmrc value to it 31559599516SKenneth E. Jansen */ 31659599516SKenneth E. Jansen void endTimer(double* end) { 31759599516SKenneth E. Jansen if( !PRINT_PERF ) return; 31859599516SKenneth E. Jansen *end = phiotmrc(); 31959599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 32059599516SKenneth E. Jansen } 32159599516SKenneth E. Jansen 32259599516SKenneth E. Jansen /** 32359599516SKenneth E. Jansen * choose to print some performance results (or not) according to 32459599516SKenneth E. Jansen * the PRINT_PERF macro 32559599516SKenneth E. Jansen */ 32659599516SKenneth E. Jansen void printPerf( 32759599516SKenneth E. Jansen const char* func_name, 32859599516SKenneth E. Jansen double start, 32959599516SKenneth E. Jansen double end, 3302dd307a1SCameron Smith unsigned long datasize, 33159599516SKenneth E. Jansen int printdatainfo, 33259599516SKenneth E. Jansen const char* extra_msg) { 33359599516SKenneth E. Jansen if( !PRINT_PERF ) return; 3342dd307a1SCameron Smith unsigned long data_size = datasize; 33559599516SKenneth E. Jansen double time = end - start; 3362dd307a1SCameron Smith unsigned long isizemin,isizemax,isizetot; 33759599516SKenneth E. Jansen double sizemin,sizemax,sizeavg,sizetot,rate; 33859599516SKenneth E. Jansen double tmin, tmax, tavg, ttot; 33959599516SKenneth E. Jansen 34059599516SKenneth E. Jansen MPI_Allreduce(&time, &tmin,1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD); 34159599516SKenneth E. Jansen MPI_Allreduce(&time, &tmax,1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); 34259599516SKenneth E. Jansen MPI_Allreduce(&time, &ttot,1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); 34359599516SKenneth E. Jansen tavg = ttot/mysize; 34459599516SKenneth E. Jansen 34559599516SKenneth E. Jansen if(irank == 0) { 34659599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) printf("** 1PFPP "); 34759599516SKenneth E. Jansen else printf("** syncIO "); 34859599516SKenneth E. Jansen printf("%s(): Tmax = %f sec, Tmin = %f sec, Tavg = %f sec", func_name, tmax, tmin, tavg); 34959599516SKenneth E. Jansen } 35059599516SKenneth E. Jansen 35159599516SKenneth E. Jansen if(printdatainfo == 1) { // if printdatainfo ==1, compute I/O rate and block size 35259599516SKenneth E. Jansen MPI_Allreduce(&data_size,&isizemin,1,MPI_LONG_LONG_INT,MPI_MIN,MPI_COMM_WORLD); 35359599516SKenneth E. Jansen MPI_Allreduce(&data_size,&isizemax,1,MPI_LONG_LONG_INT,MPI_MAX,MPI_COMM_WORLD); 35459599516SKenneth E. Jansen MPI_Allreduce(&data_size,&isizetot,1,MPI_LONG_LONG_INT,MPI_SUM,MPI_COMM_WORLD); 35559599516SKenneth E. Jansen 35659599516SKenneth E. Jansen sizemin=(double)(isizemin*inv1024sq); 35759599516SKenneth E. Jansen sizemax=(double)(isizemax*inv1024sq); 35859599516SKenneth E. Jansen sizetot=(double)(isizetot*inv1024sq); 35959599516SKenneth E. Jansen sizeavg=(double)(1.0*sizetot/mysize); 36059599516SKenneth E. Jansen rate=(double)(1.0*sizetot/tmax); 36159599516SKenneth E. Jansen 36259599516SKenneth E. Jansen if( irank == 0) { 363103be424SCameron Smith printf(", Rate = %f MB/s [%s] \n \t\t\t" 364103be424SCameron Smith " block size: Min= %f MB; Max= %f MB; Avg= %f MB; Tot= %f MB\n", 365103be424SCameron Smith rate, extra_msg, sizemin,sizemax,sizeavg,sizetot); 36659599516SKenneth E. Jansen } 36759599516SKenneth E. Jansen } 36859599516SKenneth E. Jansen else { 36959599516SKenneth E. Jansen if(irank == 0) { 37059599516SKenneth E. Jansen printf(" \n"); 37159599516SKenneth E. Jansen //printf(" (%s) \n", extra_msg); 37259599516SKenneth E. Jansen } 37359599516SKenneth E. Jansen } 37459599516SKenneth E. Jansen } 37559599516SKenneth E. Jansen 37659599516SKenneth E. Jansen /** 37759599516SKenneth E. Jansen * This function is normally called at the beginning of a read operation, before 37859599516SKenneth E. Jansen * init function. 37959599516SKenneth E. Jansen * This function (uses rank 0) reads out nfields, nppf, master header size, 38059599516SKenneth E. Jansen * endianess and allocates for masterHeader string. 38159599516SKenneth E. Jansen * These values are essential for following read operations. Rank 0 will bcast 38259599516SKenneth E. Jansen * these values to other ranks in the commm world 38359599516SKenneth E. Jansen * 38459599516SKenneth E. Jansen * If the file set is of old POSIX format, it would throw error and exit 38559599516SKenneth E. Jansen */ 38659599516SKenneth E. Jansen void queryphmpiio(const char filename[],int *nfields, int *nppf) 38759599516SKenneth E. Jansen { 38859599516SKenneth E. Jansen MPI_Comm_rank(MPI_COMM_WORLD, &irank); 38959599516SKenneth E. Jansen MPI_Comm_size(MPI_COMM_WORLD, &mysize); 39059599516SKenneth E. Jansen 39159599516SKenneth E. Jansen if(irank == 0) { 39259599516SKenneth E. Jansen FILE * fileHandle; 39359599516SKenneth E. Jansen char* fname = StringStripper( filename ); 39459599516SKenneth E. Jansen 395*389f1f6aSCameron Smith phioTime t0,t1; 396*389f1f6aSCameron Smith phastaio_time(&t0); 39759599516SKenneth E. Jansen fileHandle = fopen (fname,"rb"); 398*389f1f6aSCameron Smith phastaio_time(&t1); 399*389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 400*389f1f6aSCameron Smith phastaio_addOpenTime(elapsed); 40159599516SKenneth E. Jansen if (fileHandle == NULL ) { 40259599516SKenneth E. Jansen printf("\nError: File %s doesn't exist! Please check!\n",fname); 40359599516SKenneth E. Jansen } 40459599516SKenneth E. Jansen else { 40559599516SKenneth E. Jansen SerialFile =(serial_file *)calloc( 1, sizeof( serial_file) ); 40659599516SKenneth E. Jansen int meta_size_limit = VERSION_INFO_HEADER_SIZE; 40759599516SKenneth E. Jansen SerialFile->masterHeader = (char *)malloc( meta_size_limit ); 40859599516SKenneth E. Jansen fread(SerialFile->masterHeader, 1, meta_size_limit, fileHandle); 40959599516SKenneth E. Jansen 41059599516SKenneth E. Jansen char read_out_tag[MAX_FIELDS_NAME_LENGTH]; 41159599516SKenneth E. Jansen char version[MAX_FIELDS_NAME_LENGTH/4]; 41259599516SKenneth E. Jansen int mhsize; 41359599516SKenneth E. Jansen char * token; 41459599516SKenneth E. Jansen int magic_number; 41559599516SKenneth E. Jansen 41659599516SKenneth E. Jansen memcpy( read_out_tag, 41759599516SKenneth E. Jansen SerialFile->masterHeader, 41859599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH-1 ); 41959599516SKenneth E. Jansen 42059599516SKenneth E. Jansen if ( cscompare ("MPI_IO_Tag",read_out_tag) ) { 42159599516SKenneth E. Jansen // Test endianess ... 42259599516SKenneth E. Jansen memcpy (&magic_number, 42359599516SKenneth E. Jansen SerialFile->masterHeader + sizeof("MPI_IO_Tag : ")-1, //-1 sizeof returns the size of the string+1 for "\0" 42459599516SKenneth E. Jansen sizeof(int) ); // masterheader should look like "MPI_IO_Tag : 12180 " with 12180 in binary format 42559599516SKenneth E. Jansen 42659599516SKenneth E. Jansen if ( magic_number != ENDIAN_TEST_NUMBER ) { 42759599516SKenneth E. Jansen printf("Endian is different!\n"); 42859599516SKenneth E. Jansen // Will do swap later 42959599516SKenneth E. Jansen } 43059599516SKenneth E. Jansen 43159599516SKenneth E. Jansen // test version, old version, default masterheader size is 4M 43259599516SKenneth E. Jansen // newer version masterheader size is read from first line 43359599516SKenneth E. Jansen memcpy(version, 43459599516SKenneth E. Jansen SerialFile->masterHeader + MAX_FIELDS_NAME_LENGTH/2, 43559599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH/4 - 1); //TODO: why -1? 43659599516SKenneth E. Jansen 43759599516SKenneth E. Jansen if( cscompare ("version",version) ) { 43859599516SKenneth E. Jansen // if there is "version" tag in the file, then it is newer format 43959599516SKenneth E. Jansen // read master header size from here, otherwise use default 44059599516SKenneth E. Jansen // Note: if version is "1", we know mhsize is at 3/4 place... 44159599516SKenneth E. Jansen 44259599516SKenneth E. Jansen token = strtok(version, ":"); 44359599516SKenneth E. Jansen token = strtok(NULL, " ,;<>" ); 44459599516SKenneth E. Jansen int iversion = atoi(token); 44559599516SKenneth E. Jansen 44659599516SKenneth E. Jansen if( iversion == 1) { 44759599516SKenneth E. Jansen memcpy( &mhsize, 44859599516SKenneth E. Jansen SerialFile->masterHeader + MAX_FIELDS_NAME_LENGTH/4*3 + sizeof("mhsize : ")-1, 44959599516SKenneth E. Jansen sizeof(int)); 45059599516SKenneth E. Jansen if ( magic_number != ENDIAN_TEST_NUMBER ) 45159599516SKenneth E. Jansen SwapArrayByteOrder(&mhsize, sizeof(int), 1); 45259599516SKenneth E. Jansen 45359599516SKenneth E. Jansen if( mhsize > DefaultMHSize ) { 45459599516SKenneth E. Jansen //if actual headersize is larger than default, let's re-read 45559599516SKenneth E. Jansen free(SerialFile->masterHeader); 45659599516SKenneth E. Jansen SerialFile->masterHeader = (char *)malloc(mhsize); 45759599516SKenneth E. Jansen fseek(fileHandle, 0, SEEK_SET); // reset the file stream position 45859599516SKenneth E. Jansen fread(SerialFile->masterHeader,1,mhsize,fileHandle); 45959599516SKenneth E. Jansen } 46059599516SKenneth E. Jansen } 46159599516SKenneth E. Jansen //TODO: check if this is a valid int?? 46259599516SKenneth E. Jansen MasterHeaderSize = mhsize; 46359599516SKenneth E. Jansen } 46459599516SKenneth E. Jansen else { // else it's version 0's format w/o version tag, implicating MHSize=4M 46559599516SKenneth E. Jansen MasterHeaderSize = DefaultMHSize; 46659599516SKenneth E. Jansen } 46759599516SKenneth E. Jansen 46859599516SKenneth E. Jansen memcpy( read_out_tag, 46959599516SKenneth E. Jansen SerialFile->masterHeader+MAX_FIELDS_NAME_LENGTH+1, 47059599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH ); //TODO: why +1 47159599516SKenneth E. Jansen 47259599516SKenneth E. Jansen // Read in # fields ... 47359599516SKenneth E. Jansen token = strtok( read_out_tag, ":" ); 47459599516SKenneth E. Jansen token = strtok( NULL," ,;<>" ); 47559599516SKenneth E. Jansen *nfields = atoi( token ); 47659599516SKenneth E. Jansen if ( *nfields > MAX_FIELDS_NUMBER) { 47759599516SKenneth E. Jansen printf("Error queryphmpiio: nfields is larger than MAX_FIELDS_NUMBER!\n"); 47859599516SKenneth E. Jansen } 47959599516SKenneth E. Jansen SerialFile->nfields=*nfields; //TODO: sanity check of this int? 48059599516SKenneth E. Jansen 48159599516SKenneth E. Jansen memcpy( read_out_tag, 48259599516SKenneth E. Jansen SerialFile->masterHeader + MAX_FIELDS_NAME_LENGTH * 2 48359599516SKenneth E. Jansen + *nfields * MAX_FIELDS_NAME_LENGTH, 48459599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH); 48559599516SKenneth E. Jansen 48659599516SKenneth E. Jansen token = strtok( read_out_tag, ":" ); 48759599516SKenneth E. Jansen token = strtok( NULL," ,;<>" ); 48859599516SKenneth E. Jansen *nppf = atoi( token ); 48959599516SKenneth E. Jansen SerialFile->nppf=*nppf; //TODO: sanity check of int 49059599516SKenneth E. Jansen } // end of if("MPI_IO_TAG") 49159599516SKenneth E. Jansen else { 49259599516SKenneth 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); 49359599516SKenneth E. Jansen exit(1); 49459599516SKenneth E. Jansen } 495*389f1f6aSCameron Smith phioTime t0,t1; 496*389f1f6aSCameron Smith phastaio_time(&t0); 49759599516SKenneth E. Jansen fclose(fileHandle); 498*389f1f6aSCameron Smith phastaio_time(&t1); 499*389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 500*389f1f6aSCameron Smith phastaio_addCloseTime(elapsed); 50159599516SKenneth E. Jansen free(SerialFile->masterHeader); 50259599516SKenneth E. Jansen free(SerialFile); 50359599516SKenneth E. Jansen } //end of else 50459599516SKenneth E. Jansen free(fname); 50559599516SKenneth E. Jansen } 50659599516SKenneth E. Jansen 50759599516SKenneth E. Jansen // Bcast value to every one 50859599516SKenneth E. Jansen MPI_Bcast( nfields, 1, MPI_INT, 0, MPI_COMM_WORLD ); 50959599516SKenneth E. Jansen MPI_Bcast( nppf, 1, MPI_INT, 0, MPI_COMM_WORLD ); 51059599516SKenneth E. Jansen MPI_Bcast( &MasterHeaderSize, 1, MPI_INT, 0, MPI_COMM_WORLD ); 511a746c838SCameron Smith phprintf("Info queryphmpiio: myrank = %d, MasterHeaderSize = %d\n", irank, MasterHeaderSize); 51259599516SKenneth E. Jansen } 51359599516SKenneth E. Jansen 51459599516SKenneth E. Jansen /** 51559599516SKenneth E. Jansen * This function computes the right master header size (round to size of 2^n). 51659599516SKenneth E. Jansen * This is only needed for file format version 1 in "write" mode. 51759599516SKenneth E. Jansen */ 51859599516SKenneth E. Jansen int computeMHSize(int nfields, int nppf, int version) { 51910d56689SCameron Smith int mhsize=0; 52059599516SKenneth E. Jansen if(version == 1) { 52159599516SKenneth 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 52259599516SKenneth E. Jansen int meta_info_size = VERSION_INFO_HEADER_SIZE; 5232dd307a1SCameron Smith int actual_size = nfields * nppf * sizeof(unsigned long) + meta_info_size; 52459599516SKenneth E. Jansen //printf("actual_size = %d, offset table size = %d\n", actual_size, nfields * nppf * sizeof(long long)); 52559599516SKenneth E. Jansen if (actual_size > DefaultMHSize) { 52659599516SKenneth E. Jansen mhsize = (int) ceil( (double) actual_size/DefaultMHSize); // it's rounded to ceiling of this value 52759599516SKenneth E. Jansen mhsize *= DefaultMHSize; 52859599516SKenneth E. Jansen } 52959599516SKenneth E. Jansen else { 53059599516SKenneth E. Jansen mhsize = DefaultMHSize; 53159599516SKenneth E. Jansen } 532b744cbcaSCameron Smith } else { 533b744cbcaSCameron Smith int rank = 0; 534b744cbcaSCameron Smith MPI_Comm_rank(MPI_COMM_WORLD, &rank); 535b744cbcaSCameron Smith if(!rank) { 536b744cbcaSCameron Smith fprintf(stderr, 537b744cbcaSCameron Smith "ERROR invalid version passed to %s... exiting\n", __func__); 538b744cbcaSCameron Smith exit(EXIT_FAILURE); 539b744cbcaSCameron Smith } 54059599516SKenneth E. Jansen } 54159599516SKenneth E. Jansen return mhsize; 54259599516SKenneth E. Jansen } 54359599516SKenneth E. Jansen 54459599516SKenneth E. Jansen /** 54559599516SKenneth E. Jansen * Computes correct color of a rank according to number of files. 54659599516SKenneth E. Jansen */ 54759599516SKenneth E. Jansen extern "C" int computeColor( int myrank, int numprocs, int nfiles) { 54859599516SKenneth E. Jansen int color = 54959599516SKenneth E. Jansen (int)(myrank / (numprocs / nfiles)); 55059599516SKenneth E. Jansen return color; 55159599516SKenneth E. Jansen } 55259599516SKenneth E. Jansen 55359599516SKenneth E. Jansen 55459599516SKenneth E. Jansen /** 55559599516SKenneth E. Jansen * Check the file descriptor. 55659599516SKenneth E. Jansen */ 557103be424SCameron Smith void checkFileDescriptor(const char fctname[], int* fileDescriptor ) { 55859599516SKenneth E. Jansen if ( *fileDescriptor < 0 ) { 55959599516SKenneth E. Jansen printf("Error: File descriptor = %d in %s\n",*fileDescriptor,fctname); 56059599516SKenneth E. Jansen exit(1); 56159599516SKenneth E. Jansen } 56259599516SKenneth E. Jansen } 56359599516SKenneth E. Jansen 56459599516SKenneth E. Jansen /** 56559599516SKenneth E. Jansen * Initialize the file struct members and allocate space for file struct 56659599516SKenneth E. Jansen * buffers. 56759599516SKenneth E. Jansen * 56859599516SKenneth E. Jansen * Note: this function is only called when we are using new format. Old POSIX 56959599516SKenneth E. Jansen * format should skip this routine and call openfile() directly instead. 57059599516SKenneth E. Jansen */ 57159599516SKenneth E. Jansen int initphmpiio( int *nfields, int *nppf, int *nfiles, int *filehandle, const char mode[]) 57259599516SKenneth E. Jansen { 57359599516SKenneth E. Jansen // we init irank again in case query not called (e.g. syncIO write case) 57459599516SKenneth E. Jansen MPI_Comm_rank(MPI_COMM_WORLD, &irank); 57559599516SKenneth E. Jansen MPI_Comm_size(MPI_COMM_WORLD, &mysize); 57659599516SKenneth E. Jansen 577a746c838SCameron Smith phprintf("Info initphmpiio: entering function, myrank = %d, MasterHeaderSize = %d, nfields %d, nppf %d, nfiles %d\n", irank, MasterHeaderSize, *nfields, *nppf, *nfiles); 57859599516SKenneth E. Jansen 57959599516SKenneth E. Jansen double timer_start, timer_end; 58059599516SKenneth E. Jansen startTimer(&timer_start); 58159599516SKenneth E. Jansen 58259599516SKenneth E. Jansen char* imode = StringStripper( mode ); 58359599516SKenneth E. Jansen 58459599516SKenneth E. Jansen // Note: if it's read, we presume query was called prior to init and 58559599516SKenneth E. Jansen // MasterHeaderSize is already set to correct value from parsing header 58659599516SKenneth E. Jansen // otherwise it's write then it needs some computation to be set 58759599516SKenneth E. Jansen if ( cscompare( "read", imode ) ) { 58859599516SKenneth E. Jansen // do nothing 58959599516SKenneth E. Jansen } 59059599516SKenneth E. Jansen else if( cscompare( "write", imode ) ) { 59159599516SKenneth E. Jansen MasterHeaderSize = computeMHSize(*nfields, *nppf, LATEST_WRITE_VERSION); 59259599516SKenneth E. Jansen } 59359599516SKenneth E. Jansen else { 59459599516SKenneth E. Jansen printf("Error initphmpiio: can't recognize the mode %s", imode); 59559599516SKenneth E. Jansen exit(1); 59659599516SKenneth E. Jansen } 59759599516SKenneth E. Jansen free ( imode ); 59859599516SKenneth E. Jansen 599a746c838SCameron Smith phprintf("Info initphmpiio: myrank = %d, MasterHeaderSize = %d\n", irank, MasterHeaderSize); 60059599516SKenneth E. Jansen 60159599516SKenneth E. Jansen int i, j; 60259599516SKenneth E. Jansen 60359599516SKenneth E. Jansen if( PhastaIONextActiveIndex == MAX_PHASTA_FILES ) { 60459599516SKenneth E. Jansen printf("Error initphmpiio: PhastaIONextActiveIndex = MAX_PHASTA_FILES"); 60559599516SKenneth E. Jansen endTimer(&timer_end); 60659599516SKenneth E. Jansen printPerf("initphmpiio", timer_start, timer_end, 0, 0, ""); 60759599516SKenneth E. Jansen return MAX_PHASTA_FILES_EXCEEDED; 60859599516SKenneth E. Jansen } 60959599516SKenneth E. Jansen // else if( PhastaIONextActiveIndex == 0 ) //Hang in debug mode on Intrepid 61059599516SKenneth E. Jansen // { 61159599516SKenneth E. Jansen // for( i = 0; i < MAX_PHASTA_FILES; i++ ); 61259599516SKenneth E. Jansen // { 61359599516SKenneth E. Jansen // PhastaIOActiveFiles[i] = NULL; 61459599516SKenneth E. Jansen // } 61559599516SKenneth E. Jansen // } 61659599516SKenneth E. Jansen 61759599516SKenneth E. Jansen 61859599516SKenneth E. Jansen PhastaIOActiveFiles[PhastaIONextActiveIndex] = (phastaio_file_t *)calloc( 1, sizeof( phastaio_file_t) ); 61959599516SKenneth E. Jansen 62059599516SKenneth E. Jansen i = PhastaIONextActiveIndex; 62159599516SKenneth E. Jansen PhastaIONextActiveIndex++; 62259599516SKenneth E. Jansen 62359599516SKenneth E. Jansen //PhastaIOActiveFiles[i]->next_start_address = 2*TWO_MEGABYTE; 62459599516SKenneth E. Jansen 62559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->next_start_address = MasterHeaderSize; // what does this mean??? TODO 62659599516SKenneth E. Jansen 62759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->Wrong_Endian = false; 62859599516SKenneth E. Jansen 62959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFields = *nfields; 63059599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nPPF = *nppf; 63159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFiles = *nfiles; 63259599516SKenneth E. Jansen MPI_Comm_rank(MPI_COMM_WORLD, &(PhastaIOActiveFiles[i]->myrank)); 63359599516SKenneth E. Jansen MPI_Comm_size(MPI_COMM_WORLD, &(PhastaIOActiveFiles[i]->numprocs)); 63459599516SKenneth E. Jansen 63559599516SKenneth E. Jansen 63659599516SKenneth E. Jansen if( *nfiles > 1 ) { // split the ranks according to each mpiio file 63759599516SKenneth E. Jansen 63859599516SKenneth E. Jansen if ( s_assign_local_comm == 0) { // call mpi_comm_split for the first (and only) time 63959599516SKenneth E. Jansen 64059599516SKenneth E. Jansen if (PhastaIOActiveFiles[i]->myrank == 0) printf("Building subcommunicator\n"); 64159599516SKenneth E. Jansen 64259599516SKenneth E. Jansen int color = computeColor(PhastaIOActiveFiles[i]->myrank, PhastaIOActiveFiles[i]->numprocs, PhastaIOActiveFiles[i]->nFiles); 64359599516SKenneth E. Jansen MPI_Comm_split(MPI_COMM_WORLD, 64459599516SKenneth E. Jansen color, 64559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->myrank, 64659599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_comm)); 64759599516SKenneth E. Jansen MPI_Comm_size(PhastaIOActiveFiles[i]->local_comm, 64859599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_numprocs)); 64959599516SKenneth E. Jansen MPI_Comm_rank(PhastaIOActiveFiles[i]->local_comm, 65059599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_myrank)); 65159599516SKenneth E. Jansen 65259599516SKenneth E. Jansen // back up now these variables so that we do not need to call comm_split again 65359599516SKenneth E. Jansen s_local_comm = PhastaIOActiveFiles[i]->local_comm; 65459599516SKenneth E. Jansen s_local_size = PhastaIOActiveFiles[i]->local_numprocs; 65559599516SKenneth E. Jansen s_local_rank = PhastaIOActiveFiles[i]->local_myrank; 65659599516SKenneth E. Jansen s_assign_local_comm = 1; 65759599516SKenneth E. Jansen } 65859599516SKenneth E. Jansen else { // recycle the subcommunicator 65959599516SKenneth E. Jansen if (PhastaIOActiveFiles[i]->myrank == 0) printf("Recycling subcommunicator\n"); 66059599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm = s_local_comm; 66159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_numprocs = s_local_size; 66259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_myrank = s_local_rank; 66359599516SKenneth E. Jansen } 66459599516SKenneth E. Jansen } 66559599516SKenneth E. Jansen else { // *nfiles == 1 here - no need to call mpi_comm_split here 66659599516SKenneth E. Jansen 66759599516SKenneth E. Jansen if (PhastaIOActiveFiles[i]->myrank == 0) printf("Bypassing subcommunicator\n"); 66859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm = MPI_COMM_WORLD; 66959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_numprocs = PhastaIOActiveFiles[i]->numprocs; 67059599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_myrank = PhastaIOActiveFiles[i]->myrank; 67159599516SKenneth E. Jansen 67259599516SKenneth E. Jansen } 67359599516SKenneth E. Jansen 67459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp = 67559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nPPF/PhastaIOActiveFiles[i]->local_numprocs; 67659599516SKenneth E. Jansen 67759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->start_id = PhastaIOActiveFiles[i]->nPPF * 67859599516SKenneth E. Jansen (int)(PhastaIOActiveFiles[i]->myrank/PhastaIOActiveFiles[i]->local_numprocs) + 67959599516SKenneth E. Jansen (PhastaIOActiveFiles[i]->local_myrank * PhastaIOActiveFiles[i]->nppp); 68059599516SKenneth E. Jansen 68159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset_table = 6822dd307a1SCameron Smith ( unsigned long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long *) ); 68359599516SKenneth E. Jansen 68459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table = 6852dd307a1SCameron Smith ( unsigned long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long *) ); 68659599516SKenneth E. Jansen 68759599516SKenneth E. Jansen for (j=0; j<*nfields; j++) 68859599516SKenneth E. Jansen { 68959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset_table[j] = 6902dd307a1SCameron Smith ( unsigned long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long) ); 69159599516SKenneth E. Jansen 69259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table[j] = 6932dd307a1SCameron Smith ( unsigned long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long) ); 69459599516SKenneth E. Jansen } 69559599516SKenneth E. Jansen *filehandle = i; 69659599516SKenneth E. Jansen 69759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header = (char *)calloc(MasterHeaderSize,sizeof( char )); 69859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk = (double *)calloc(1,sizeof( double )); 69959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk = (int *)calloc(1,sizeof( int )); 70059599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_double_chunk = (double *)calloc(1,sizeof( double )); 70159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_int_chunk = (int *)calloc(1,sizeof( int )); 70259599516SKenneth E. Jansen 70359599516SKenneth E. Jansen // Time monitoring 70459599516SKenneth E. Jansen endTimer(&timer_end); 70559599516SKenneth E. Jansen printPerf("initphmpiio", timer_start, timer_end, 0, 0, ""); 70659599516SKenneth E. Jansen 70759599516SKenneth E. Jansen phprintf_0("Info initphmpiio: quiting function"); 70859599516SKenneth E. Jansen 70959599516SKenneth E. Jansen return i; 71059599516SKenneth E. Jansen } 71159599516SKenneth E. Jansen 71259599516SKenneth E. Jansen /** 71359599516SKenneth E. Jansen * Destruct the file struct and free buffers allocated in init function. 71459599516SKenneth E. Jansen */ 71559599516SKenneth E. Jansen void finalizephmpiio( int *fileDescriptor ) 71659599516SKenneth E. Jansen { 71759599516SKenneth E. Jansen double timer_start, timer_end; 71859599516SKenneth E. Jansen startTimer(&timer_start); 71959599516SKenneth E. Jansen 72059599516SKenneth E. Jansen int i, j; 72159599516SKenneth E. Jansen i = *fileDescriptor; 72259599516SKenneth E. Jansen //PhastaIONextActiveIndex--; 72359599516SKenneth E. Jansen 72459599516SKenneth E. Jansen /* //free the offset table for this phasta file */ 72559599516SKenneth E. Jansen //for(j=0; j<MAX_FIELDS_NUMBER; j++) //Danger: undefined behavior for my_*_table.[j] not allocated or not initialized to NULL 72659599516SKenneth E. Jansen for(j=0; j<PhastaIOActiveFiles[i]->nFields; j++) 72759599516SKenneth E. Jansen { 72859599516SKenneth E. Jansen free( PhastaIOActiveFiles[i]->my_offset_table[j]); 72959599516SKenneth E. Jansen free( PhastaIOActiveFiles[i]->my_read_table[j]); 73059599516SKenneth E. Jansen } 73159599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->my_offset_table ); 73259599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->my_read_table ); 73359599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->master_header ); 73459599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->double_chunk ); 73559599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->int_chunk ); 73659599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->read_double_chunk ); 73759599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->read_int_chunk ); 73859599516SKenneth E. Jansen 739946a6cddSCameron Smith if( PhastaIOActiveFiles[i]->nFiles > 1 && s_assign_local_comm ) { // the comm was split 740946a6cddSCameron Smith if (PhastaIOActiveFiles[i]->myrank == 0) printf("Freeing subcommunicator\n"); 741946a6cddSCameron Smith s_assign_local_comm = 0; 742946a6cddSCameron Smith MPI_Comm_free(&(PhastaIOActiveFiles[i]->local_comm)); 743946a6cddSCameron Smith } 744946a6cddSCameron Smith 74559599516SKenneth E. Jansen free( PhastaIOActiveFiles[i]); 74659599516SKenneth E. Jansen 74759599516SKenneth E. Jansen endTimer(&timer_end); 74859599516SKenneth E. Jansen printPerf("finalizempiio", timer_start, timer_end, 0, 0, ""); 74959599516SKenneth E. Jansen 75059599516SKenneth E. Jansen PhastaIONextActiveIndex--; 75159599516SKenneth E. Jansen } 75259599516SKenneth E. Jansen 75359599516SKenneth E. Jansen 75459599516SKenneth E. Jansen /** 75559599516SKenneth E. Jansen * Special init for M2N in order to create a subcommunicator for the reduced solution (requires PRINT_PERF to be false for now) 75659599516SKenneth E. Jansen * Initialize the file struct members and allocate space for file struct buffers. 75759599516SKenneth E. Jansen * 75859599516SKenneth E. Jansen * Note: this function is only called when we are using new format. Old POSIX 75959599516SKenneth E. Jansen * format should skip this routine and call openfile() directly instead. 76059599516SKenneth E. Jansen */ 76159599516SKenneth E. Jansen int initphmpiiosub( int *nfields, int *nppf, int *nfiles, int *filehandle, const char mode[],MPI_Comm my_local_comm) 76259599516SKenneth E. Jansen { 76359599516SKenneth E. Jansen // we init irank again in case query not called (e.g. syncIO write case) 76459599516SKenneth E. Jansen 76559599516SKenneth E. Jansen MPI_Comm_rank(my_local_comm, &irank); 76659599516SKenneth E. Jansen MPI_Comm_size(my_local_comm, &mysize); 76759599516SKenneth E. Jansen 768a746c838SCameron Smith phprintf("Info initphmpiio: entering function, myrank = %d, MasterHeaderSize = %d\n", irank, MasterHeaderSize); 76959599516SKenneth E. Jansen 77059599516SKenneth E. Jansen double timer_start, timer_end; 77159599516SKenneth E. Jansen startTimer(&timer_start); 77259599516SKenneth E. Jansen 77359599516SKenneth E. Jansen char* imode = StringStripper( mode ); 77459599516SKenneth E. Jansen 77559599516SKenneth E. Jansen // Note: if it's read, we presume query was called prior to init and 77659599516SKenneth E. Jansen // MasterHeaderSize is already set to correct value from parsing header 77759599516SKenneth E. Jansen // otherwise it's write then it needs some computation to be set 77859599516SKenneth E. Jansen if ( cscompare( "read", imode ) ) { 77959599516SKenneth E. Jansen // do nothing 78059599516SKenneth E. Jansen } 78159599516SKenneth E. Jansen else if( cscompare( "write", imode ) ) { 78259599516SKenneth E. Jansen MasterHeaderSize = computeMHSize(*nfields, *nppf, LATEST_WRITE_VERSION); 78359599516SKenneth E. Jansen } 78459599516SKenneth E. Jansen else { 78559599516SKenneth E. Jansen printf("Error initphmpiio: can't recognize the mode %s", imode); 78659599516SKenneth E. Jansen exit(1); 78759599516SKenneth E. Jansen } 78859599516SKenneth E. Jansen free ( imode ); 78959599516SKenneth E. Jansen 790a746c838SCameron Smith phprintf("Info initphmpiio: myrank = %d, MasterHeaderSize = %d\n", irank, MasterHeaderSize); 79159599516SKenneth E. Jansen 79259599516SKenneth E. Jansen int i, j; 79359599516SKenneth E. Jansen 79459599516SKenneth E. Jansen if( PhastaIONextActiveIndex == MAX_PHASTA_FILES ) { 79559599516SKenneth E. Jansen printf("Error initphmpiio: PhastaIONextActiveIndex = MAX_PHASTA_FILES"); 79659599516SKenneth E. Jansen endTimer(&timer_end); 79759599516SKenneth E. Jansen printPerf("initphmpiio", timer_start, timer_end, 0, 0, ""); 79859599516SKenneth E. Jansen return MAX_PHASTA_FILES_EXCEEDED; 79959599516SKenneth E. Jansen } 80059599516SKenneth E. Jansen // else if( PhastaIONextActiveIndex == 0 ) //Hang in debug mode on Intrepid 80159599516SKenneth E. Jansen // { 80259599516SKenneth E. Jansen // for( i = 0; i < MAX_PHASTA_FILES; i++ ); 80359599516SKenneth E. Jansen // { 80459599516SKenneth E. Jansen // PhastaIOActiveFiles[i] = NULL; 80559599516SKenneth E. Jansen // } 80659599516SKenneth E. Jansen // } 80759599516SKenneth E. Jansen 80859599516SKenneth E. Jansen 80959599516SKenneth E. Jansen PhastaIOActiveFiles[PhastaIONextActiveIndex] = (phastaio_file_t *)calloc( 1, sizeof( phastaio_file_t) ); 81059599516SKenneth E. Jansen 81159599516SKenneth E. Jansen i = PhastaIONextActiveIndex; 81259599516SKenneth E. Jansen PhastaIONextActiveIndex++; 81359599516SKenneth E. Jansen 81459599516SKenneth E. Jansen //PhastaIOActiveFiles[i]->next_start_address = 2*TWO_MEGABYTE; 81559599516SKenneth E. Jansen 81659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->next_start_address = MasterHeaderSize; // what does this mean??? TODO 81759599516SKenneth E. Jansen 81859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->Wrong_Endian = false; 81959599516SKenneth E. Jansen 82059599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFields = *nfields; 82159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nPPF = *nppf; 82259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFiles = *nfiles; 82359599516SKenneth E. Jansen MPI_Comm_rank(my_local_comm, &(PhastaIOActiveFiles[i]->myrank)); 82459599516SKenneth E. Jansen MPI_Comm_size(my_local_comm, &(PhastaIOActiveFiles[i]->numprocs)); 82559599516SKenneth E. Jansen 82659599516SKenneth E. Jansen int color = computeColor(PhastaIOActiveFiles[i]->myrank, PhastaIOActiveFiles[i]->numprocs, PhastaIOActiveFiles[i]->nFiles); 82759599516SKenneth E. Jansen MPI_Comm_split(my_local_comm, 82859599516SKenneth E. Jansen color, 82959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->myrank, 83059599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_comm)); 83159599516SKenneth E. Jansen MPI_Comm_size(PhastaIOActiveFiles[i]->local_comm, 83259599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_numprocs)); 83359599516SKenneth E. Jansen MPI_Comm_rank(PhastaIOActiveFiles[i]->local_comm, 83459599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_myrank)); 83559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp = 83659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nPPF/PhastaIOActiveFiles[i]->local_numprocs; 83759599516SKenneth E. Jansen 83859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->start_id = PhastaIOActiveFiles[i]->nPPF * 83959599516SKenneth E. Jansen (int)(PhastaIOActiveFiles[i]->myrank/PhastaIOActiveFiles[i]->local_numprocs) + 84059599516SKenneth E. Jansen (PhastaIOActiveFiles[i]->local_myrank * PhastaIOActiveFiles[i]->nppp); 84159599516SKenneth E. Jansen 84259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset_table = 8432dd307a1SCameron Smith ( unsigned long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long *) ); 84459599516SKenneth E. Jansen 84559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table = 8462dd307a1SCameron Smith ( unsigned long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long *) ); 84759599516SKenneth E. Jansen 84859599516SKenneth E. Jansen for (j=0; j<*nfields; j++) 84959599516SKenneth E. Jansen { 85059599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset_table[j] = 8512dd307a1SCameron Smith ( unsigned long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long) ); 85259599516SKenneth E. Jansen 85359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table[j] = 8542dd307a1SCameron Smith ( unsigned long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long) ); 85559599516SKenneth E. Jansen } 85659599516SKenneth E. Jansen *filehandle = i; 85759599516SKenneth E. Jansen 85859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header = (char *)calloc(MasterHeaderSize,sizeof( char )); 85959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk = (double *)calloc(1,sizeof( double )); 86059599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk = (int *)calloc(1,sizeof( int )); 86159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_double_chunk = (double *)calloc(1,sizeof( double )); 86259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_int_chunk = (int *)calloc(1,sizeof( int )); 86359599516SKenneth E. Jansen 86459599516SKenneth E. Jansen // Time monitoring 86559599516SKenneth E. Jansen endTimer(&timer_end); 86659599516SKenneth E. Jansen printPerf("initphmpiiosub", timer_start, timer_end, 0, 0, ""); 86759599516SKenneth E. Jansen 86859599516SKenneth E. Jansen phprintf_0("Info initphmpiiosub: quiting function"); 86959599516SKenneth E. Jansen 87059599516SKenneth E. Jansen return i; 87159599516SKenneth E. Jansen } 87259599516SKenneth E. Jansen 87359599516SKenneth E. Jansen 87459599516SKenneth E. Jansen 87559599516SKenneth E. Jansen /** open file for both POSIX and MPI-IO syncIO format. 87659599516SKenneth E. Jansen * 87759599516SKenneth E. Jansen * If it's old POSIX format, simply call posix fopen(). 87859599516SKenneth E. Jansen * 87959599516SKenneth E. Jansen * If it's MPI-IO foramt: 88059599516SKenneth E. Jansen * in "read" mode, it builds the header table that points to the offset of 88159599516SKenneth E. Jansen * fields for parts; 88259599516SKenneth E. Jansen * in "write" mode, it opens the file with MPI-IO open routine. 88359599516SKenneth E. Jansen */ 884103be424SCameron Smith void openfile(const char filename[], const char mode[], int* fileDescriptor ) 88559599516SKenneth E. Jansen { 88659599516SKenneth E. Jansen phprintf_0("Info: entering openfile"); 88759599516SKenneth E. Jansen 88859599516SKenneth E. Jansen double timer_start, timer_end; 88959599516SKenneth E. Jansen startTimer(&timer_start); 89059599516SKenneth E. Jansen 89159599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) 89259599516SKenneth E. Jansen { 89359599516SKenneth E. Jansen FILE* file=NULL ; 89459599516SKenneth E. Jansen *fileDescriptor = 0; 89559599516SKenneth E. Jansen char* fname = StringStripper( filename ); 89659599516SKenneth E. Jansen char* imode = StringStripper( mode ); 89759599516SKenneth E. Jansen 898*389f1f6aSCameron Smith phioTime t0,t1; 899*389f1f6aSCameron Smith phastaio_time(&t0); 90059599516SKenneth E. Jansen if ( cscompare( "read", imode ) ) file = fopen(fname, "rb" ); 90159599516SKenneth E. Jansen else if( cscompare( "write", imode ) ) file = fopen(fname, "wb" ); 90259599516SKenneth E. Jansen else if( cscompare( "append", imode ) ) file = fopen(fname, "ab" ); 903*389f1f6aSCameron Smith phastaio_time(&t1); 904*389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 905*389f1f6aSCameron Smith phastaio_addOpenTime(elapsed); 90659599516SKenneth E. Jansen 90759599516SKenneth E. Jansen if ( !file ){ 90867701978SCameron Smith fprintf(stderr,"Error openfile: unable to open file %s\n",fname); 90959599516SKenneth E. Jansen } else { 91059599516SKenneth E. Jansen fileArray.push_back( file ); 91159599516SKenneth E. Jansen byte_order.push_back( false ); 91259599516SKenneth E. Jansen header_type.push_back( sizeof(int) ); 91359599516SKenneth E. Jansen *fileDescriptor = fileArray.size(); 91459599516SKenneth E. Jansen } 91559599516SKenneth E. Jansen free (fname); 91659599516SKenneth E. Jansen free (imode); 91759599516SKenneth E. Jansen } 91859599516SKenneth E. Jansen else // else it would be parallel I/O, opposed to posix io 91959599516SKenneth E. Jansen { 92059599516SKenneth E. Jansen char* fname = StringStripper( filename ); 92159599516SKenneth E. Jansen char* imode = StringStripper( mode ); 92259599516SKenneth E. Jansen int rc; 92359599516SKenneth E. Jansen int i = *fileDescriptor; 92459599516SKenneth E. Jansen checkFileDescriptor("openfile",&i); 92559599516SKenneth E. Jansen char* token; 92659599516SKenneth E. Jansen 92759599516SKenneth E. Jansen if ( cscompare( "read", imode ) ) 92859599516SKenneth E. Jansen { 92959599516SKenneth E. Jansen // if (PhastaIOActiveFiles[i]->myrank == 0) 93059599516SKenneth E. Jansen // printf("\n **********\nRead open ... ... regular version\n"); 93159599516SKenneth E. Jansen 932*389f1f6aSCameron Smith phioTime t0,t1; 933*389f1f6aSCameron Smith phastaio_time(&t0); 93459599516SKenneth E. Jansen rc = MPI_File_open( PhastaIOActiveFiles[i]->local_comm, 93559599516SKenneth E. Jansen fname, 93659599516SKenneth E. Jansen MPI_MODE_RDONLY, 93759599516SKenneth E. Jansen MPI_INFO_NULL, 93859599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->file_handle) ); 939*389f1f6aSCameron Smith phastaio_time(&t1); 940*389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 941*389f1f6aSCameron Smith phastaio_addOpenTime(elapsed); 94259599516SKenneth E. Jansen 94359599516SKenneth E. Jansen if(rc) 94459599516SKenneth E. Jansen { 94559599516SKenneth E. Jansen *fileDescriptor = UNABLE_TO_OPEN_FILE; 9464d60bba2SCameron Smith int error_string_length; 9474d60bba2SCameron Smith char error_string[4096]; 9484d60bba2SCameron Smith MPI_Error_string(rc, error_string, &error_string_length); 9494d60bba2SCameron Smith fprintf(stderr, "Error openfile: Unable to open file %s! MPI reports \"%s\"\n",fname,error_string); 95059599516SKenneth E. Jansen endTimer(&timer_end); 95159599516SKenneth E. Jansen printPerf("openfile", timer_start, timer_end, 0, 0, ""); 95259599516SKenneth E. Jansen return; 95359599516SKenneth E. Jansen } 95459599516SKenneth E. Jansen 95559599516SKenneth E. Jansen MPI_Status read_tag_status; 95659599516SKenneth E. Jansen char read_out_tag[MAX_FIELDS_NAME_LENGTH]; 95759599516SKenneth E. Jansen int j; 95859599516SKenneth E. Jansen int magic_number; 95959599516SKenneth E. Jansen 96059599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) { 96159599516SKenneth E. Jansen MPI_File_read_at( PhastaIOActiveFiles[i]->file_handle, 96259599516SKenneth E. Jansen 0, 96359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header, 96459599516SKenneth E. Jansen MasterHeaderSize, 96559599516SKenneth E. Jansen MPI_CHAR, 96659599516SKenneth E. Jansen &read_tag_status ); 96759599516SKenneth E. Jansen } 96859599516SKenneth E. Jansen 96959599516SKenneth E. Jansen MPI_Bcast( PhastaIOActiveFiles[i]->master_header, 97059599516SKenneth E. Jansen MasterHeaderSize, 97159599516SKenneth E. Jansen MPI_CHAR, 97259599516SKenneth E. Jansen 0, 97359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm ); 97459599516SKenneth E. Jansen 97559599516SKenneth E. Jansen memcpy( read_out_tag, 97659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header, 97759599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH-1 ); 97859599516SKenneth E. Jansen 97959599516SKenneth E. Jansen if ( cscompare ("MPI_IO_Tag",read_out_tag) ) 98059599516SKenneth E. Jansen { 98159599516SKenneth E. Jansen // Test endianess ... 98259599516SKenneth E. Jansen memcpy ( &magic_number, 98359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header+sizeof("MPI_IO_Tag : ")-1, //-1 sizeof returns the size of the string+1 for "\0" 98459599516SKenneth E. Jansen sizeof(int) ); // masterheader should look like "MPI_IO_Tag : 12180 " with 12180 in binary format 98559599516SKenneth E. Jansen 98659599516SKenneth E. Jansen if ( magic_number != ENDIAN_TEST_NUMBER ) 98759599516SKenneth E. Jansen { 98859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->Wrong_Endian = true; 98959599516SKenneth E. Jansen } 99059599516SKenneth E. Jansen 99159599516SKenneth E. Jansen memcpy( read_out_tag, 99259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header+MAX_FIELDS_NAME_LENGTH+1, // TODO: WHY +1??? 99359599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH ); 99459599516SKenneth E. Jansen 99559599516SKenneth E. Jansen // Read in # fields ... 99659599516SKenneth E. Jansen token = strtok ( read_out_tag, ":" ); 99759599516SKenneth E. Jansen token = strtok( NULL," ,;<>" ); 99859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFields = atoi( token ); 99959599516SKenneth E. Jansen 10002dd307a1SCameron Smith unsigned long **header_table; 10012dd307a1SCameron Smith header_table = ( unsigned long ** )calloc(PhastaIOActiveFiles[i]->nFields, sizeof(unsigned long *)); 100259599516SKenneth E. Jansen 100359599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) 100459599516SKenneth E. Jansen { 10052dd307a1SCameron Smith header_table[j]=( unsigned long * ) calloc( PhastaIOActiveFiles[i]->nPPF , sizeof( unsigned long)); 100659599516SKenneth E. Jansen } 100759599516SKenneth E. Jansen 100859599516SKenneth E. Jansen // Read in the offset table ... 100959599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) 101059599516SKenneth E. Jansen { 101159599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) { 101259599516SKenneth E. Jansen memcpy( header_table[j], 101359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header + 101459599516SKenneth E. Jansen VERSION_INFO_HEADER_SIZE + 10152dd307a1SCameron Smith j * PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long), 10162dd307a1SCameron Smith PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long) ); 101759599516SKenneth E. Jansen } 101859599516SKenneth E. Jansen 101959599516SKenneth E. Jansen MPI_Scatter( header_table[j], 102059599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp, 102159599516SKenneth E. Jansen MPI_LONG_LONG_INT, 102259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table[j], 102359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp, 102459599516SKenneth E. Jansen MPI_LONG_LONG_INT, 102559599516SKenneth E. Jansen 0, 102659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm ); 102759599516SKenneth E. Jansen 102859599516SKenneth E. Jansen // Swap byte order if endianess is different ... 102959599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->Wrong_Endian ) { 103059599516SKenneth E. Jansen SwapArrayByteOrder( PhastaIOActiveFiles[i]->my_read_table[j], 10314187599aSCameron Smith sizeof(unsigned long), 103259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp ); 103359599516SKenneth E. Jansen } 103459599516SKenneth E. Jansen } 103559599516SKenneth E. Jansen 103659599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) { 103759599516SKenneth E. Jansen free ( header_table[j] ); 103859599516SKenneth E. Jansen } 103959599516SKenneth E. Jansen free (header_table); 104059599516SKenneth E. Jansen 104159599516SKenneth E. Jansen } // end of if MPI_IO_TAG 104259599516SKenneth E. Jansen else //else not valid MPI file 104359599516SKenneth E. Jansen { 104459599516SKenneth E. Jansen *fileDescriptor = NOT_A_MPI_FILE; 104559599516SKenneth 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); 104659599516SKenneth E. Jansen //Printing MasterHeaderSize is useful to test a compiler bug on Intrepid BGP 104759599516SKenneth E. Jansen endTimer(&timer_end); 104859599516SKenneth E. Jansen printPerf("openfile", timer_start, timer_end, 0, 0, ""); 104959599516SKenneth E. Jansen return; 105059599516SKenneth E. Jansen } 105159599516SKenneth E. Jansen } // end of if "read" 105259599516SKenneth E. Jansen else if( cscompare( "write", imode ) ) 105359599516SKenneth E. Jansen { 1054*389f1f6aSCameron Smith phioTime t0,t1; 1055*389f1f6aSCameron Smith phastaio_time(&t0); 105659599516SKenneth E. Jansen rc = MPI_File_open( PhastaIOActiveFiles[i]->local_comm, 105759599516SKenneth E. Jansen fname, 105859599516SKenneth E. Jansen MPI_MODE_WRONLY | MPI_MODE_CREATE, 105959599516SKenneth E. Jansen MPI_INFO_NULL, 106059599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->file_handle) ); 1061*389f1f6aSCameron Smith phastaio_time(&t1); 1062*389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 1063*389f1f6aSCameron Smith phastaio_addOpenTime(elapsed); 10644d60bba2SCameron Smith if(rc != MPI_SUCCESS) 106559599516SKenneth E. Jansen { 106659599516SKenneth E. Jansen *fileDescriptor = UNABLE_TO_OPEN_FILE; 10674d60bba2SCameron Smith int error_string_length; 10684d60bba2SCameron Smith char error_string[4096]; 10694d60bba2SCameron Smith MPI_Error_string(rc, error_string, &error_string_length); 10704d60bba2SCameron Smith fprintf(stderr, "Error openfile: Unable to open file %s! MPI reports \"%s\"\n",fname,error_string); 107159599516SKenneth E. Jansen return; 107259599516SKenneth E. Jansen } 107359599516SKenneth E. Jansen } // end of if "write" 107459599516SKenneth E. Jansen free (fname); 107559599516SKenneth E. Jansen free (imode); 107659599516SKenneth E. Jansen } // end of if FileIndex != 0 107759599516SKenneth E. Jansen 107859599516SKenneth E. Jansen endTimer(&timer_end); 107959599516SKenneth E. Jansen printPerf("openfile", timer_start, timer_end, 0, 0, ""); 108059599516SKenneth E. Jansen } 108159599516SKenneth E. Jansen 108259599516SKenneth E. Jansen /** close file for both POSIX and MPI-IO syncIO format. 108359599516SKenneth E. Jansen * 108459599516SKenneth E. Jansen * If it's old POSIX format, simply call posix fclose(). 108559599516SKenneth E. Jansen * 108659599516SKenneth E. Jansen * If it's MPI-IO foramt: 108759599516SKenneth E. Jansen * in "read" mode, it simply close file with MPI-IO close routine. 108859599516SKenneth E. Jansen * in "write" mode, rank 0 in each group will re-assemble the master header and 108959599516SKenneth E. Jansen * offset table and write to the beginning of file, then close the file. 109059599516SKenneth E. Jansen */ 1091103be424SCameron Smith void closefile( int* fileDescriptor, const char mode[] ) 109259599516SKenneth E. Jansen { 109359599516SKenneth E. Jansen double timer_start, timer_end; 109459599516SKenneth E. Jansen startTimer(&timer_start); 109559599516SKenneth E. Jansen 109659599516SKenneth E. Jansen int i = *fileDescriptor; 109759599516SKenneth E. Jansen checkFileDescriptor("closefile",&i); 109859599516SKenneth E. Jansen 109959599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) { 110059599516SKenneth E. Jansen char* imode = StringStripper( mode ); 110159599516SKenneth E. Jansen 110259599516SKenneth E. Jansen if( cscompare( "write", imode ) 110359599516SKenneth E. Jansen || cscompare( "append", imode ) ) { 110459599516SKenneth E. Jansen fflush( fileArray[ *fileDescriptor - 1 ] ); 110559599516SKenneth E. Jansen } 110659599516SKenneth E. Jansen 1107*389f1f6aSCameron Smith phioTime t0,t1; 1108*389f1f6aSCameron Smith phastaio_time(&t0); 110959599516SKenneth E. Jansen fclose( fileArray[ *fileDescriptor - 1 ] ); 1110*389f1f6aSCameron Smith phastaio_time(&t1); 1111*389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 1112*389f1f6aSCameron Smith phastaio_addCloseTime(elapsed); 111359599516SKenneth E. Jansen free (imode); 111459599516SKenneth E. Jansen } 111559599516SKenneth E. Jansen else { 111659599516SKenneth E. Jansen char* imode = StringStripper( mode ); 111759599516SKenneth E. Jansen 111859599516SKenneth E. Jansen //write master header here: 111959599516SKenneth E. Jansen if ( cscompare( "write", imode ) ) { 112059599516SKenneth E. Jansen // if ( PhastaIOActiveFiles[i]->nPPF * PhastaIOActiveFiles[i]->nFields < 2*ONE_MEGABYTE/8 ) //SHOULD BE CHECKED 112159599516SKenneth E. Jansen // MasterHeaderSize = 4*ONE_MEGABYTE; 112259599516SKenneth E. Jansen // else 112359599516SKenneth E. Jansen // MasterHeaderSize = 4*ONE_MEGABYTE + PhastaIOActiveFiles[i]->nPPF * PhastaIOActiveFiles[i]->nFields * 8 - 2*ONE_MEGABYTE; 112459599516SKenneth E. Jansen 112559599516SKenneth E. Jansen MasterHeaderSize = computeMHSize( PhastaIOActiveFiles[i]->nFields, PhastaIOActiveFiles[i]->nPPF, LATEST_WRITE_VERSION); 112659599516SKenneth E. Jansen phprintf_0("Info closefile: myrank = %d, MasterHeaderSize = %d\n", PhastaIOActiveFiles[i]->myrank, MasterHeaderSize); 112759599516SKenneth E. Jansen 112859599516SKenneth E. Jansen MPI_Status write_header_status; 112959599516SKenneth E. Jansen char mpi_tag[MAX_FIELDS_NAME_LENGTH]; 113059599516SKenneth E. Jansen char version[MAX_FIELDS_NAME_LENGTH/4]; 113159599516SKenneth E. Jansen char mhsize[MAX_FIELDS_NAME_LENGTH/4]; 113259599516SKenneth E. Jansen int magic_number = ENDIAN_TEST_NUMBER; 113359599516SKenneth E. Jansen 113459599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) 113559599516SKenneth E. Jansen { 113659599516SKenneth E. Jansen bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH); 113759599516SKenneth E. Jansen sprintf(mpi_tag, "MPI_IO_Tag : "); 113859599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->master_header, 113959599516SKenneth E. Jansen mpi_tag, 114059599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH); 114159599516SKenneth E. Jansen 114259599516SKenneth E. Jansen bzero((void*)version,MAX_FIELDS_NAME_LENGTH/4); 114359599516SKenneth E. Jansen // this version is "1", print version in ASCII 114459599516SKenneth E. Jansen sprintf(version, "version : %d",1); 114559599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->master_header + MAX_FIELDS_NAME_LENGTH/2, 114659599516SKenneth E. Jansen version, 114759599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH/4); 114859599516SKenneth E. Jansen 114959599516SKenneth E. Jansen // master header size is computed using the formula above 115059599516SKenneth E. Jansen bzero((void*)mhsize,MAX_FIELDS_NAME_LENGTH/4); 115159599516SKenneth E. Jansen sprintf(mhsize, "mhsize : "); 115259599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->master_header + MAX_FIELDS_NAME_LENGTH/4*3, 115359599516SKenneth E. Jansen mhsize, 115459599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH/4); 115559599516SKenneth E. Jansen 115659599516SKenneth E. Jansen bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH); 115759599516SKenneth E. Jansen sprintf(mpi_tag, 115859599516SKenneth E. Jansen "\nnFields : %d\n", 115959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFields); 116059599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->master_header+MAX_FIELDS_NAME_LENGTH, 116159599516SKenneth E. Jansen mpi_tag, 116259599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH); 116359599516SKenneth E. Jansen 116459599516SKenneth E. Jansen bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH); 116559599516SKenneth E. Jansen sprintf(mpi_tag, "\nnPPF : %d\n", PhastaIOActiveFiles[i]->nPPF); 116659599516SKenneth E. Jansen memcpy( PhastaIOActiveFiles[i]->master_header+ 116759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFields * 116859599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH + 116959599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH * 2, 117059599516SKenneth E. Jansen mpi_tag, 117159599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH); 117259599516SKenneth E. Jansen 117359599516SKenneth E. Jansen memcpy( PhastaIOActiveFiles[i]->master_header+sizeof("MPI_IO_Tag : ")-1, //-1 sizeof returns the size of the string+1 for "\0" 117459599516SKenneth E. Jansen &magic_number, 117559599516SKenneth E. Jansen sizeof(int)); 117659599516SKenneth E. Jansen 117759599516SKenneth E. Jansen memcpy( PhastaIOActiveFiles[i]->master_header+sizeof("mhsize : ") -1 + MAX_FIELDS_NAME_LENGTH/4*3, 117859599516SKenneth E. Jansen &MasterHeaderSize, 117959599516SKenneth E. Jansen sizeof(int)); 118059599516SKenneth E. Jansen } 118159599516SKenneth E. Jansen 118259599516SKenneth E. Jansen int j = 0; 11832dd307a1SCameron Smith unsigned long **header_table; 11842dd307a1SCameron Smith header_table = ( unsigned long ** )calloc(PhastaIOActiveFiles[i]->nFields, sizeof(unsigned long *)); 118559599516SKenneth E. Jansen 118659599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) { 11872dd307a1SCameron Smith header_table[j]=( unsigned long * ) calloc( PhastaIOActiveFiles[i]->nPPF , sizeof( unsigned long)); 118859599516SKenneth E. Jansen } 118959599516SKenneth E. Jansen 119059599516SKenneth E. Jansen //if( irank == 0 ) printf("gonna mpi_gather, myrank = %d\n", irank); 119159599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) { 119259599516SKenneth E. Jansen MPI_Gather( PhastaIOActiveFiles[i]->my_offset_table[j], 119359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp, 119459599516SKenneth E. Jansen MPI_LONG_LONG_INT, 119559599516SKenneth E. Jansen header_table[j], 119659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp, 119759599516SKenneth E. Jansen MPI_LONG_LONG_INT, 119859599516SKenneth E. Jansen 0, 119959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm ); 120059599516SKenneth E. Jansen } 120159599516SKenneth E. Jansen 120259599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) { 120359599516SKenneth E. Jansen 120459599516SKenneth E. Jansen //if( irank == 0 ) printf("gonna memcpy for every procs, myrank = %d\n", irank); 120559599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) { 120659599516SKenneth E. Jansen memcpy ( PhastaIOActiveFiles[i]->master_header + 120759599516SKenneth E. Jansen VERSION_INFO_HEADER_SIZE + 12082dd307a1SCameron Smith j * PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long), 120959599516SKenneth E. Jansen header_table[j], 12102dd307a1SCameron Smith PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long) ); 121159599516SKenneth E. Jansen } 121259599516SKenneth E. Jansen 121359599516SKenneth E. Jansen //if( irank == 0 ) printf("gonna file_write_at(), myrank = %d\n", irank); 121459599516SKenneth E. Jansen MPI_File_write_at( PhastaIOActiveFiles[i]->file_handle, 121559599516SKenneth E. Jansen 0, 121659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header, 121759599516SKenneth E. Jansen MasterHeaderSize, 121859599516SKenneth E. Jansen MPI_CHAR, 121959599516SKenneth E. Jansen &write_header_status ); 122059599516SKenneth E. Jansen } 122159599516SKenneth E. Jansen 122259599516SKenneth E. Jansen ////free(PhastaIOActiveFiles[i]->master_header); 122359599516SKenneth E. Jansen 122459599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) { 122559599516SKenneth E. Jansen free ( header_table[j] ); 122659599516SKenneth E. Jansen } 122759599516SKenneth E. Jansen free (header_table); 122859599516SKenneth E. Jansen } 122959599516SKenneth E. Jansen 123059599516SKenneth E. Jansen //if( irank == 0 ) printf("gonna file_close(), myrank = %d\n", irank); 1231*389f1f6aSCameron Smith phioTime t0,t1; 1232*389f1f6aSCameron Smith phastaio_time(&t0); 123359599516SKenneth E. Jansen MPI_File_close( &( PhastaIOActiveFiles[i]->file_handle ) ); 1234*389f1f6aSCameron Smith phastaio_time(&t1); 1235*389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 1236*389f1f6aSCameron Smith phastaio_addCloseTime(elapsed); 123759599516SKenneth E. Jansen free ( imode ); 123859599516SKenneth E. Jansen } 123959599516SKenneth E. Jansen 124059599516SKenneth E. Jansen endTimer(&timer_end); 124159599516SKenneth E. Jansen printPerf("closefile_", timer_start, timer_end, 0, 0, ""); 124259599516SKenneth E. Jansen } 124359599516SKenneth E. Jansen 12443872e963SCameron Smith int readHeader( FILE* f, const char phrase[], 12453872e963SCameron Smith int* params, int numParams, const char* iotype) { 12463872e963SCameron Smith isBinary(iotype); 12473872e963SCameron Smith return readHeader(f,phrase,params,numParams); 12483872e963SCameron Smith } 12493872e963SCameron Smith 1250103be424SCameron Smith void readheader( 1251103be424SCameron Smith int* fileDescriptor, 125259599516SKenneth E. Jansen const char keyphrase[], 125359599516SKenneth E. Jansen void* valueArray, 125459599516SKenneth E. Jansen int* nItems, 125559599516SKenneth E. Jansen const char datatype[], 125659599516SKenneth E. Jansen const char iotype[] ) 125759599516SKenneth E. Jansen { 125859599516SKenneth E. Jansen double timer_start, timer_end; 1259d3337298SCameron Smith 126059599516SKenneth E. Jansen startTimer(&timer_start); 126159599516SKenneth E. Jansen 126259599516SKenneth E. Jansen int i = *fileDescriptor; 126359599516SKenneth E. Jansen checkFileDescriptor("readheader",&i); 126459599516SKenneth E. Jansen 126559599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) { 126659599516SKenneth E. Jansen int filePtr = *fileDescriptor - 1; 126759599516SKenneth E. Jansen FILE* fileObject; 126859599516SKenneth E. Jansen int* valueListInt; 126959599516SKenneth E. Jansen 127059599516SKenneth E. Jansen if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) { 127159599516SKenneth E. Jansen fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor); 127259599516SKenneth E. Jansen fprintf(stderr,"openfile_ function has to be called before \n") ; 127359599516SKenneth E. Jansen fprintf(stderr,"acessing the file\n ") ; 127459599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n"); 127559599516SKenneth E. Jansen endTimer(&timer_end); 127659599516SKenneth E. Jansen printPerf("readheader", timer_start, timer_end, 0, 0, ""); 127759599516SKenneth E. Jansen return; 127859599516SKenneth E. Jansen } 127959599516SKenneth E. Jansen 1280961a4ff6SCameron Smith LastHeaderKey[filePtr] = std::string(keyphrase); 128159599516SKenneth E. Jansen LastHeaderNotFound = false; 128259599516SKenneth E. Jansen 128359599516SKenneth E. Jansen fileObject = fileArray[ filePtr ] ; 128459599516SKenneth E. Jansen Wrong_Endian = byte_order[ filePtr ]; 128559599516SKenneth E. Jansen 128659599516SKenneth E. Jansen isBinary( iotype ); 128759599516SKenneth E. Jansen typeSize( datatype ); //redundant call, just avoid a compiler warning. 128859599516SKenneth E. Jansen 128959599516SKenneth E. Jansen // right now we are making the assumption that we will only write integers 129059599516SKenneth E. Jansen // on the header line. 129159599516SKenneth E. Jansen 129259599516SKenneth E. Jansen valueListInt = static_cast< int* >( valueArray ); 129359599516SKenneth E. Jansen int ierr = readHeader( fileObject , 129459599516SKenneth E. Jansen keyphrase, 129559599516SKenneth E. Jansen valueListInt, 129659599516SKenneth E. Jansen *nItems ) ; 129759599516SKenneth E. Jansen 129859599516SKenneth E. Jansen byte_order[ filePtr ] = Wrong_Endian ; 129959599516SKenneth E. Jansen 130059599516SKenneth E. Jansen if ( ierr ) LastHeaderNotFound = true; 130159599516SKenneth E. Jansen 130259599516SKenneth E. Jansen //return ; // don't return, go to the end to print perf 130359599516SKenneth E. Jansen } 130459599516SKenneth E. Jansen else { 130559599516SKenneth E. Jansen int* valueListInt; 130659599516SKenneth E. Jansen valueListInt = static_cast <int*>(valueArray); 1307400e9fc0SCameron Smith char* token = NULL; 130859599516SKenneth E. Jansen bool FOUND = false ; 130959599516SKenneth E. Jansen isBinary( iotype ); 131059599516SKenneth E. Jansen 131159599516SKenneth E. Jansen MPI_Status read_offset_status; 131259599516SKenneth E. Jansen char read_out_tag[MAX_FIELDS_NAME_LENGTH]; 1313400e9fc0SCameron Smith memset(read_out_tag, '\0', MAX_FIELDS_NAME_LENGTH); 131459599516SKenneth E. Jansen char readouttag[MAX_FIELDS_NUMBER][MAX_FIELDS_NAME_LENGTH]; 131559599516SKenneth E. Jansen int j; 131659599516SKenneth E. Jansen 131759599516SKenneth E. Jansen int string_length = strlen( keyphrase ); 131859599516SKenneth E. Jansen char* buffer = (char*) malloc ( string_length+1 ); 131959599516SKenneth E. Jansen 132059599516SKenneth E. Jansen strcpy ( buffer, keyphrase ); 132159599516SKenneth E. Jansen buffer[ string_length ] = '\0'; 132259599516SKenneth E. Jansen 132359599516SKenneth E. Jansen char* st2 = strtok ( buffer, "@" ); 132459599516SKenneth E. Jansen st2 = strtok (NULL, "@"); 132559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->GPid = atoi(st2); 132659599516SKenneth E. Jansen if ( char* p = strpbrk(buffer, "@") ) 132759599516SKenneth E. Jansen *p = '\0'; 132859599516SKenneth E. Jansen 132959599516SKenneth E. Jansen // Check if the user has input the right GPid 133059599516SKenneth E. Jansen if ( ( PhastaIOActiveFiles[i]->GPid <= 133159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->myrank * 133259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp )|| 133359599516SKenneth E. Jansen ( PhastaIOActiveFiles[i]->GPid > 133459599516SKenneth E. Jansen ( PhastaIOActiveFiles[i]->myrank + 1 ) * 133559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp ) ) 133659599516SKenneth E. Jansen { 133759599516SKenneth E. Jansen *fileDescriptor = NOT_A_MPI_FILE; 133859599516SKenneth 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); 133959599516SKenneth E. Jansen // It is possible atoi could not generate a clear integer from st2 because of additional garbage character in keyphrase 134059599516SKenneth E. Jansen endTimer(&timer_end); 134159599516SKenneth E. Jansen printPerf("readheader", timer_start, timer_end, 0, 0, ""); 134259599516SKenneth E. Jansen return; 134359599516SKenneth E. Jansen } 134459599516SKenneth E. Jansen 134559599516SKenneth E. Jansen // Find the field we want ... 134659599516SKenneth E. Jansen //for ( j = 0; j<MAX_FIELDS_NUMBER; j++ ) 134759599516SKenneth E. Jansen for ( j = 0; j<PhastaIOActiveFiles[i]->nFields; j++ ) 134859599516SKenneth E. Jansen { 134959599516SKenneth E. Jansen memcpy( readouttag[j], 135059599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header + j*MAX_FIELDS_NAME_LENGTH+MAX_FIELDS_NAME_LENGTH*2+1, 135159599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH-1 ); 135259599516SKenneth E. Jansen } 135359599516SKenneth E. Jansen 135459599516SKenneth E. Jansen for ( j = 0; j<PhastaIOActiveFiles[i]->nFields; j++ ) 135559599516SKenneth E. Jansen { 135659599516SKenneth E. Jansen token = strtok ( readouttag[j], ":" ); 135759599516SKenneth E. Jansen 135859599516SKenneth E. Jansen //if ( cscompare( buffer, token ) ) 135959599516SKenneth E. Jansen if ( cscompare( token , buffer ) && cscompare( buffer, token ) ) 136059599516SKenneth 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"). 136159599516SKenneth 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). 136259599516SKenneth 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. 136359599516SKenneth E. Jansen { 136459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_field_count = j; 136559599516SKenneth E. Jansen FOUND = true; 136659599516SKenneth E. Jansen //printf("buffer: %s | token: %s | j: %d\n",buffer,token,j); 136759599516SKenneth E. Jansen break; 136859599516SKenneth E. Jansen } 136959599516SKenneth E. Jansen } 137059599516SKenneth E. Jansen free(buffer); 137159599516SKenneth E. Jansen 137259599516SKenneth E. Jansen if (!FOUND) 137359599516SKenneth E. Jansen { 137459599516SKenneth E. Jansen //if(irank==0) printf("Warning readheader: Not found %s \n",keyphrase); //PhastaIOActiveFiles[i]->myrank is certainly initialized here. 137559599516SKenneth E. Jansen if(PhastaIOActiveFiles[i]->myrank == 0) printf("WARNING readheader: Not found %s\n",keyphrase); 137659599516SKenneth E. Jansen endTimer(&timer_end); 137759599516SKenneth E. Jansen printPerf("readheader", timer_start, timer_end, 0, 0, ""); 137859599516SKenneth E. Jansen return; 137959599516SKenneth E. Jansen } 138059599516SKenneth E. Jansen 138159599516SKenneth E. Jansen // Find the part we want ... 138259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_part_count = PhastaIOActiveFiles[i]->GPid - 138359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->myrank * PhastaIOActiveFiles[i]->nppp - 1; 138459599516SKenneth E. Jansen 138559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset = 138659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table[PhastaIOActiveFiles[i]->read_field_count][PhastaIOActiveFiles[i]->read_part_count]; 138759599516SKenneth E. Jansen 138859599516SKenneth E. Jansen // printf("****Rank %d offset is %d\n",PhastaIOActiveFiles[i]->myrank,PhastaIOActiveFiles[i]->my_offset); 138959599516SKenneth E. Jansen 139059599516SKenneth E. Jansen // Read each datablock header here ... 139159599516SKenneth E. Jansen 139259599516SKenneth E. Jansen MPI_File_read_at_all( PhastaIOActiveFiles[i]->file_handle, 139359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset+1, 139459599516SKenneth E. Jansen read_out_tag, 139559599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH-1, 139659599516SKenneth E. Jansen MPI_CHAR, 139759599516SKenneth E. Jansen &read_offset_status ); 139859599516SKenneth E. Jansen token = strtok ( read_out_tag, ":" ); 139959599516SKenneth E. Jansen 140059599516SKenneth E. Jansen // printf("&&&&Rank %d read_out_tag is %s\n",PhastaIOActiveFiles[i]->myrank,read_out_tag); 140159599516SKenneth E. Jansen 140259599516SKenneth 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. 140359599516SKenneth E. Jansen { 140459599516SKenneth E. Jansen FOUND = true ; 140559599516SKenneth E. Jansen token = strtok( NULL, " ,;<>" ); 140659599516SKenneth E. Jansen for( j=0; j < *nItems && ( token = strtok( NULL," ,;<>") ); j++ ) 140759599516SKenneth E. Jansen valueListInt[j] = atoi( token ); 140859599516SKenneth E. Jansen 140959599516SKenneth E. Jansen if ( j < *nItems ) 141059599516SKenneth E. Jansen { 141159599516SKenneth E. Jansen fprintf( stderr, "Expected # of ints not found for: %s\n", keyphrase ); 141259599516SKenneth E. Jansen } 141359599516SKenneth E. Jansen } 141459599516SKenneth E. Jansen else { 141559599516SKenneth E. Jansen //if(irank==0) 141659599516SKenneth E. Jansen if(PhastaIOActiveFiles[i]->myrank == 0) 141759599516SKenneth E. Jansen // If we enter this if, there is a problem with the name of some fields 141859599516SKenneth E. Jansen { 141959599516SKenneth E. Jansen printf("Error readheader: Unexpected mismatch between keyphrase = %s and token = %s\n",keyphrase,token); 142059599516SKenneth E. Jansen } 142159599516SKenneth E. Jansen } 142259599516SKenneth E. Jansen } 142359599516SKenneth E. Jansen 142459599516SKenneth E. Jansen endTimer(&timer_end); 142559599516SKenneth E. Jansen printPerf("readheader", timer_start, timer_end, 0, 0, ""); 142659599516SKenneth E. Jansen 142759599516SKenneth E. Jansen } 142859599516SKenneth E. Jansen 14293956dcfeSCameron Smith void readDataBlock( 14303956dcfeSCameron Smith FILE* fileObject, 14313956dcfeSCameron Smith void* valueArray, 14323956dcfeSCameron Smith int nItems, 14333956dcfeSCameron Smith const char datatype[], 14343956dcfeSCameron Smith const char iotype[] ) 14353956dcfeSCameron Smith { 14363956dcfeSCameron Smith isBinary(iotype); 14373956dcfeSCameron Smith size_t type_size = typeSize( datatype ); 1438*389f1f6aSCameron Smith phioTime t0,t1; 1439*389f1f6aSCameron Smith phastaio_time(&t0); 14403956dcfeSCameron Smith if ( binary_format ) { 14413956dcfeSCameron Smith char junk = '\0'; 14423956dcfeSCameron Smith fread( valueArray, type_size, nItems, fileObject ); 14433956dcfeSCameron Smith fread( &junk, sizeof(char), 1 , fileObject ); 14443956dcfeSCameron Smith if ( Wrong_Endian ) SwapArrayByteOrder( valueArray, type_size, nItems ); 14453956dcfeSCameron Smith } else { 14463956dcfeSCameron Smith char* ts1 = StringStripper( datatype ); 14473956dcfeSCameron Smith if ( cscompare( "integer", ts1 ) ) { 14483956dcfeSCameron Smith for( int n=0; n < nItems ; n++ ) 14493956dcfeSCameron Smith fscanf(fileObject, "%d\n",(int*)((int*)valueArray+n) ); 14503956dcfeSCameron Smith } else if ( cscompare( "double", ts1 ) ) { 14513956dcfeSCameron Smith for( int n=0; n < nItems ; n++ ) 14523956dcfeSCameron Smith fscanf(fileObject, "%lf\n",(double*)((double*)valueArray+n) ); 14533956dcfeSCameron Smith } 14543956dcfeSCameron Smith free (ts1); 14553956dcfeSCameron Smith } 1456*389f1f6aSCameron Smith phastaio_time(&t1); 1457*389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 1458*389f1f6aSCameron Smith phastaio_addReadTime(elapsed); 1459f42e0444SCameron Smith phastaio_addReadBytes(nItems*type_size); 14603956dcfeSCameron Smith } 14613956dcfeSCameron Smith 1462103be424SCameron Smith void readdatablock( 1463103be424SCameron Smith int* fileDescriptor, 146459599516SKenneth E. Jansen const char keyphrase[], 146559599516SKenneth E. Jansen void* valueArray, 146659599516SKenneth E. Jansen int* nItems, 146759599516SKenneth E. Jansen const char datatype[], 146859599516SKenneth E. Jansen const char iotype[] ) 146959599516SKenneth E. Jansen { 147059599516SKenneth E. Jansen //if(irank == 0) printf("entering readdatablock()\n"); 14712dd307a1SCameron Smith unsigned long data_size = 0; 147259599516SKenneth E. Jansen double timer_start, timer_end; 147359599516SKenneth E. Jansen startTimer(&timer_start); 147459599516SKenneth E. Jansen 147559599516SKenneth E. Jansen int i = *fileDescriptor; 147659599516SKenneth E. Jansen checkFileDescriptor("readdatablock",&i); 147759599516SKenneth E. Jansen 147859599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) { 147959599516SKenneth E. Jansen int filePtr = *fileDescriptor - 1; 148059599516SKenneth E. Jansen FILE* fileObject; 148159599516SKenneth E. Jansen 148259599516SKenneth E. Jansen if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) { 148359599516SKenneth E. Jansen fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor); 148459599516SKenneth E. Jansen fprintf(stderr,"openfile_ function has to be called before\n") ; 148559599516SKenneth E. Jansen fprintf(stderr,"acessing the file\n ") ; 148659599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n"); 148759599516SKenneth E. Jansen endTimer(&timer_end); 148859599516SKenneth E. Jansen printPerf("readdatablock", timer_start, timer_end, 0, 0, ""); 148959599516SKenneth E. Jansen return; 149059599516SKenneth E. Jansen } 149159599516SKenneth E. Jansen 149259599516SKenneth E. Jansen // error check.. 149359599516SKenneth E. Jansen // since we require that a consistant header always preceed the data block 149459599516SKenneth E. Jansen // let us check to see that it is actually the case. 149559599516SKenneth E. Jansen 1496961a4ff6SCameron Smith if ( ! cscompare( LastHeaderKey[ filePtr ].c_str(), keyphrase ) ) { 149759599516SKenneth E. Jansen fprintf(stderr, "Header not consistant with data block\n"); 1498961a4ff6SCameron Smith fprintf(stderr, "Header: %s\n", LastHeaderKey[ filePtr ].c_str() ); 149959599516SKenneth E. Jansen fprintf(stderr, "DataBlock: %s\n ", keyphrase ); 150059599516SKenneth E. Jansen fprintf(stderr, "Please recheck read sequence \n"); 150159599516SKenneth E. Jansen if( Strict_Error ) { 150259599516SKenneth E. Jansen fprintf(stderr, "fatal error: cannot continue, returning out of call\n"); 150359599516SKenneth E. Jansen endTimer(&timer_end); 150459599516SKenneth E. Jansen printPerf("readdatablock", timer_start, timer_end, 0, 0, ""); 150559599516SKenneth E. Jansen return; 150659599516SKenneth E. Jansen } 150759599516SKenneth E. Jansen } 150859599516SKenneth E. Jansen 150959599516SKenneth E. Jansen if ( LastHeaderNotFound ) { 151059599516SKenneth E. Jansen endTimer(&timer_end); 151159599516SKenneth E. Jansen printPerf("readdatablock", timer_start, timer_end, 0, 0, ""); 151259599516SKenneth E. Jansen return; 151359599516SKenneth E. Jansen } 151459599516SKenneth E. Jansen fileObject = fileArray[ filePtr ]; 151559599516SKenneth E. Jansen Wrong_Endian = byte_order[ filePtr ]; 1516bae968b9SCameron Smith LastHeaderKey.erase(filePtr); 15173956dcfeSCameron Smith readDataBlock(fileObject,valueArray,*nItems,datatype,iotype); 151859599516SKenneth E. Jansen 151959599516SKenneth E. Jansen //return; 152059599516SKenneth E. Jansen } 152159599516SKenneth E. Jansen else { 152259599516SKenneth E. Jansen // printf("read data block\n"); 152359599516SKenneth E. Jansen MPI_Status read_data_status; 152459599516SKenneth E. Jansen size_t type_size = typeSize( datatype ); 152559599516SKenneth E. Jansen int nUnits = *nItems; 152659599516SKenneth E. Jansen isBinary( iotype ); 152759599516SKenneth E. Jansen 152859599516SKenneth E. Jansen // read datablock then 152959599516SKenneth E. Jansen //MR CHANGE 153059599516SKenneth E. Jansen // if ( cscompare ( datatype, "double")) 153159599516SKenneth E. Jansen char* ts2 = StringStripper( datatype ); 153259599516SKenneth E. Jansen if ( cscompare ( "double" , ts2)) 153359599516SKenneth E. Jansen //MR CHANGE END 153459599516SKenneth E. Jansen { 153559599516SKenneth E. Jansen 1536*389f1f6aSCameron Smith phioTime t0,t1; 1537*389f1f6aSCameron Smith phastaio_time(&t0); 153859599516SKenneth E. Jansen MPI_File_read_at_all_begin( PhastaIOActiveFiles[i]->file_handle, 153959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset + DB_HEADER_SIZE, 154059599516SKenneth E. Jansen valueArray, 154159599516SKenneth E. Jansen nUnits, 154259599516SKenneth E. Jansen MPI_DOUBLE ); 154359599516SKenneth E. Jansen MPI_File_read_at_all_end( PhastaIOActiveFiles[i]->file_handle, 154459599516SKenneth E. Jansen valueArray, 154559599516SKenneth E. Jansen &read_data_status ); 154659599516SKenneth E. Jansen data_size=8*nUnits; 1547*389f1f6aSCameron Smith phastaio_time(&t1); 1548*389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 1549*389f1f6aSCameron Smith phastaio_addReadTime(elapsed); 1550f42e0444SCameron Smith phastaio_addReadBytes(nUnits*sizeof(double)); 155159599516SKenneth E. Jansen } 155259599516SKenneth E. Jansen //MR CHANGE 155359599516SKenneth E. Jansen // else if ( cscompare ( datatype, "integer")) 155459599516SKenneth E. Jansen else if ( cscompare ( "integer" , ts2)) 155559599516SKenneth E. Jansen //MR CHANGE END 155659599516SKenneth E. Jansen { 1557*389f1f6aSCameron Smith phioTime t0,t1; 1558*389f1f6aSCameron Smith phastaio_time(&t0); 155959599516SKenneth E. Jansen MPI_File_read_at_all_begin(PhastaIOActiveFiles[i]->file_handle, 156059599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset + DB_HEADER_SIZE, 156159599516SKenneth E. Jansen valueArray, 156259599516SKenneth E. Jansen nUnits, 156359599516SKenneth E. Jansen MPI_INT ); 156459599516SKenneth E. Jansen MPI_File_read_at_all_end( PhastaIOActiveFiles[i]->file_handle, 156559599516SKenneth E. Jansen valueArray, 156659599516SKenneth E. Jansen &read_data_status ); 156759599516SKenneth E. Jansen data_size=4*nUnits; 1568*389f1f6aSCameron Smith phastaio_time(&t1); 1569*389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 1570*389f1f6aSCameron Smith phastaio_addReadTime(elapsed); 1571f42e0444SCameron Smith phastaio_addReadBytes(nUnits*sizeof(int)); 157259599516SKenneth E. Jansen } 157359599516SKenneth E. Jansen else 157459599516SKenneth E. Jansen { 157559599516SKenneth E. Jansen *fileDescriptor = DATA_TYPE_ILLEGAL; 157659599516SKenneth E. Jansen printf("readdatablock - DATA_TYPE_ILLEGAL - %s\n",datatype); 157759599516SKenneth E. Jansen endTimer(&timer_end); 157859599516SKenneth E. Jansen printPerf("readdatablock", timer_start, timer_end, 0, 0, ""); 157959599516SKenneth E. Jansen return; 158059599516SKenneth E. Jansen } 158159599516SKenneth E. Jansen free(ts2); 158259599516SKenneth E. Jansen 158359599516SKenneth E. Jansen 158459599516SKenneth E. Jansen // printf("%d Read finishe\n",PhastaIOActiveFiles[i]->myrank); 158559599516SKenneth E. Jansen 158659599516SKenneth E. Jansen // Swap data byte order if endianess is different ... 158759599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->Wrong_Endian ) 158859599516SKenneth E. Jansen { 158959599516SKenneth E. Jansen SwapArrayByteOrder( valueArray, type_size, nUnits ); 159059599516SKenneth E. Jansen } 159159599516SKenneth E. Jansen } 159259599516SKenneth E. Jansen 159359599516SKenneth E. Jansen endTimer(&timer_end); 159459599516SKenneth E. Jansen char extra_msg[1024]; 159559599516SKenneth E. Jansen memset(extra_msg, '\0', 1024); 159659599516SKenneth E. Jansen char* key = StringStripper(keyphrase); 159759599516SKenneth E. Jansen sprintf(extra_msg, " field is %s ", key); 159859599516SKenneth E. Jansen printPerf("readdatablock", timer_start, timer_end, data_size, 1, extra_msg); 159959599516SKenneth E. Jansen free(key); 160059599516SKenneth E. Jansen 160159599516SKenneth E. Jansen } 160259599516SKenneth E. Jansen 1603103be424SCameron Smith void writeHeader( 1604103be424SCameron Smith FILE* f, 1605ea868eb1SCameron Smith const char keyphrase[], 1606ea868eb1SCameron Smith const void* valueArray, 1607ea868eb1SCameron Smith const int nItems, 1608ea868eb1SCameron Smith const int ndataItems, 1609ea868eb1SCameron Smith const char datatype[], 1610ea868eb1SCameron Smith const char iotype[]) 1611ea868eb1SCameron Smith { 1612ea868eb1SCameron Smith isBinary( iotype ); 1613ea868eb1SCameron Smith 1614ea868eb1SCameron Smith const int _newline = 1615ea868eb1SCameron Smith ( ndataItems > 0 ) ? sizeof( char ) : 0; 1616ea868eb1SCameron Smith int size_of_nextblock = 1617ea868eb1SCameron Smith ( binary_format ) ? typeSize(datatype) * ndataItems + _newline : ndataItems; 1618ea868eb1SCameron Smith 1619ea868eb1SCameron Smith fprintf( f, "%s : < %d > ", keyphrase, size_of_nextblock ); 1620ea868eb1SCameron Smith for( int i = 0; i < nItems; i++ ) 1621ea868eb1SCameron Smith fprintf( f, "%d ", *((int*)((int*)valueArray+i))); 1622ea868eb1SCameron Smith fprintf( f, "\n"); 1623ea868eb1SCameron Smith } 1624ea868eb1SCameron Smith 1625103be424SCameron Smith void writeheader( 1626103be424SCameron Smith const int* fileDescriptor, 162759599516SKenneth E. Jansen const char keyphrase[], 162859599516SKenneth E. Jansen const void* valueArray, 162959599516SKenneth E. Jansen const int* nItems, 163059599516SKenneth E. Jansen const int* ndataItems, 163159599516SKenneth E. Jansen const char datatype[], 163259599516SKenneth E. Jansen const char iotype[]) 163359599516SKenneth E. Jansen { 163459599516SKenneth E. Jansen 163559599516SKenneth E. Jansen //if(irank == 0) printf("entering writeheader()\n"); 163659599516SKenneth E. Jansen 163759599516SKenneth E. Jansen double timer_start, timer_end; 163859599516SKenneth E. Jansen startTimer(&timer_start); 163959599516SKenneth E. Jansen 164059599516SKenneth E. Jansen int i = *fileDescriptor; 164159599516SKenneth E. Jansen checkFileDescriptor("writeheader",&i); 164259599516SKenneth E. Jansen 164359599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) { 164459599516SKenneth E. Jansen int filePtr = *fileDescriptor - 1; 164559599516SKenneth E. Jansen if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) { 164659599516SKenneth E. Jansen fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor); 164759599516SKenneth E. Jansen fprintf(stderr,"openfile_ function has to be called before \n") ; 164859599516SKenneth E. Jansen fprintf(stderr,"acessing the file\n ") ; 164959599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n"); 165059599516SKenneth E. Jansen endTimer(&timer_end); 165159599516SKenneth E. Jansen printPerf("writeheader", timer_start, timer_end, 0, 0, ""); 165259599516SKenneth E. Jansen return; 165359599516SKenneth E. Jansen } 165459599516SKenneth E. Jansen 1655961a4ff6SCameron Smith LastHeaderKey[filePtr] = std::string(keyphrase); 165659599516SKenneth E. Jansen DataSize = *ndataItems; 1657ea868eb1SCameron Smith FILE* fileObject = fileArray[ filePtr ] ; 1658ea868eb1SCameron Smith header_type[ filePtr ] = typeSize( datatype ); 1659ea868eb1SCameron Smith writeHeader(fileObject,keyphrase,valueArray,*nItems, 1660ea868eb1SCameron Smith *ndataItems,datatype,iotype); 166159599516SKenneth E. Jansen } 166259599516SKenneth E. Jansen else { // else it's parallel I/O 166359599516SKenneth E. Jansen DataSize = *ndataItems; 166459599516SKenneth E. Jansen size_t type_size = typeSize( datatype ); 166559599516SKenneth E. Jansen isBinary( iotype ); 166659599516SKenneth E. Jansen char mpi_tag[MAX_FIELDS_NAME_LENGTH]; 166759599516SKenneth E. Jansen 166859599516SKenneth E. Jansen int string_length = strlen( keyphrase ); 166959599516SKenneth E. Jansen char* buffer = (char*) malloc ( string_length+1 ); 167059599516SKenneth E. Jansen 167159599516SKenneth E. Jansen strcpy ( buffer, keyphrase); 167259599516SKenneth E. Jansen buffer[ string_length ] = '\0'; 167359599516SKenneth E. Jansen 167459599516SKenneth E. Jansen char* st2 = strtok ( buffer, "@" ); 167559599516SKenneth E. Jansen st2 = strtok (NULL, "@"); 167659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->GPid = atoi(st2); 167759599516SKenneth E. Jansen 167859599516SKenneth E. Jansen if ( char* p = strpbrk(buffer, "@") ) 167959599516SKenneth E. Jansen *p = '\0'; 168059599516SKenneth E. Jansen 168159599516SKenneth E. Jansen bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH); 168259599516SKenneth E. Jansen sprintf(mpi_tag, "\n%s : %d\n", buffer, PhastaIOActiveFiles[i]->field_count); 16832dd307a1SCameron Smith unsigned long offset_value; 168459599516SKenneth E. Jansen 168559599516SKenneth E. Jansen int temp = *ndataItems; 16862dd307a1SCameron Smith unsigned long number_of_items = (unsigned long)temp; 168759599516SKenneth E. Jansen MPI_Barrier(PhastaIOActiveFiles[i]->local_comm); 168859599516SKenneth E. Jansen 168959599516SKenneth E. Jansen MPI_Scan( &number_of_items, 169059599516SKenneth E. Jansen &offset_value, 169159599516SKenneth E. Jansen 1, 169259599516SKenneth E. Jansen MPI_LONG_LONG_INT, 169359599516SKenneth E. Jansen MPI_SUM, 169459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm ); 169559599516SKenneth E. Jansen 169659599516SKenneth E. Jansen offset_value = (offset_value - number_of_items) * type_size; 169759599516SKenneth E. Jansen 169859599516SKenneth E. Jansen offset_value += PhastaIOActiveFiles[i]->local_myrank * 169959599516SKenneth E. Jansen DB_HEADER_SIZE + 170059599516SKenneth E. Jansen PhastaIOActiveFiles[i]->next_start_address; 170159599516SKenneth E. Jansen // This offset is the starting address of each datablock header... 170259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset = offset_value; 170359599516SKenneth E. Jansen 170459599516SKenneth E. Jansen // Write in my offset table ... 170559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset_table[PhastaIOActiveFiles[i]->field_count][PhastaIOActiveFiles[i]->part_count] = 170659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset; 170759599516SKenneth E. Jansen 170859599516SKenneth E. Jansen // Update the next-start-address ... 170959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->next_start_address = offset_value + 171059599516SKenneth E. Jansen number_of_items * type_size + 171159599516SKenneth E. Jansen DB_HEADER_SIZE; 171259599516SKenneth E. Jansen MPI_Bcast( &(PhastaIOActiveFiles[i]->next_start_address), 171359599516SKenneth E. Jansen 1, 171459599516SKenneth E. Jansen MPI_LONG_LONG_INT, 171559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_numprocs-1, 171659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm ); 171759599516SKenneth E. Jansen 171859599516SKenneth E. Jansen // Prepare datablock header ... 171959599516SKenneth E. Jansen int _newline = (*ndataItems>0)?sizeof(char):0; 172059599516SKenneth E. Jansen unsigned int size_of_nextblock = type_size * (*ndataItems) + _newline; 172159599516SKenneth E. Jansen 172259599516SKenneth E. Jansen //char datablock_header[255]; 172359599516SKenneth E. Jansen //bzero((void*)datablock_header,255); 172459599516SKenneth E. Jansen char datablock_header[DB_HEADER_SIZE]; 172559599516SKenneth E. Jansen bzero((void*)datablock_header,DB_HEADER_SIZE); 172659599516SKenneth E. Jansen 172759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->GPid = PhastaIOActiveFiles[i]->nppp*PhastaIOActiveFiles[i]->myrank+PhastaIOActiveFiles[i]->part_count; 172859599516SKenneth E. Jansen sprintf( datablock_header, 172959599516SKenneth E. Jansen "\n%s : < %u >", 173059599516SKenneth E. Jansen keyphrase, 173159599516SKenneth E. Jansen size_of_nextblock ); 173259599516SKenneth E. Jansen 173359599516SKenneth E. Jansen for ( int j = 0; j < *nItems; j++ ) 173459599516SKenneth E. Jansen { 173559599516SKenneth E. Jansen sprintf( datablock_header, 173659599516SKenneth E. Jansen "%s %d ", 173759599516SKenneth E. Jansen datablock_header, 173859599516SKenneth E. Jansen *((int*)((int*)valueArray+j))); 173959599516SKenneth E. Jansen } 174059599516SKenneth E. Jansen sprintf( datablock_header, 174159599516SKenneth E. Jansen "%s\n ", 174259599516SKenneth E. Jansen datablock_header ); 174359599516SKenneth E. Jansen 174459599516SKenneth E. Jansen // Write datablock header ... 174559599516SKenneth E. Jansen //MR CHANGE 174659599516SKenneth E. Jansen // if ( cscompare(datatype,"double") ) 174759599516SKenneth E. Jansen char* ts1 = StringStripper( datatype ); 174859599516SKenneth E. Jansen if ( cscompare("double",ts1) ) 174959599516SKenneth E. Jansen //MR CHANGE END 175059599516SKenneth E. Jansen { 175159599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->double_chunk ); 175259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk = ( double * )malloc( (sizeof( double )*number_of_items+ DB_HEADER_SIZE)); 175359599516SKenneth E. Jansen 175459599516SKenneth E. Jansen double * aa = ( double * )datablock_header; 175559599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->double_chunk, aa, DB_HEADER_SIZE); 175659599516SKenneth E. Jansen } 175759599516SKenneth E. Jansen //MR CHANGE 175859599516SKenneth E. Jansen // if ( cscompare(datatype,"integer") ) 175959599516SKenneth E. Jansen else if ( cscompare("integer",ts1) ) 176059599516SKenneth E. Jansen //MR CHANGE END 176159599516SKenneth E. Jansen { 176259599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->int_chunk ); 176359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk = ( int * )malloc( (sizeof( int )*number_of_items+ DB_HEADER_SIZE)); 176459599516SKenneth E. Jansen 176559599516SKenneth E. Jansen int * aa = ( int * )datablock_header; 176659599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->int_chunk, aa, DB_HEADER_SIZE); 176759599516SKenneth E. Jansen } 176859599516SKenneth E. Jansen else { 176959599516SKenneth E. Jansen // *fileDescriptor = DATA_TYPE_ILLEGAL; 177059599516SKenneth E. Jansen printf("writeheader - DATA_TYPE_ILLEGAL - %s\n",datatype); 177159599516SKenneth E. Jansen endTimer(&timer_end); 177259599516SKenneth E. Jansen printPerf("writeheader", timer_start, timer_end, 0, 0, ""); 177359599516SKenneth E. Jansen return; 177459599516SKenneth E. Jansen } 177559599516SKenneth E. Jansen free(ts1); 177659599516SKenneth E. Jansen 177759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->part_count++; 177859599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->part_count == PhastaIOActiveFiles[i]->nppp ) { 177959599516SKenneth E. Jansen //A new field will be written 178059599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) { 178159599516SKenneth E. Jansen memcpy( PhastaIOActiveFiles[i]->master_header + 178259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->field_count * 178359599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH + 178459599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH * 2, 178559599516SKenneth E. Jansen mpi_tag, 178659599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH-1); 178759599516SKenneth E. Jansen } 178859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->field_count++; 178959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->part_count=0; 179059599516SKenneth E. Jansen } 179159599516SKenneth E. Jansen free(buffer); 179259599516SKenneth E. Jansen } 179359599516SKenneth E. Jansen 179459599516SKenneth E. Jansen endTimer(&timer_end); 179559599516SKenneth E. Jansen printPerf("writeheader", timer_start, timer_end, 0, 0, ""); 179659599516SKenneth E. Jansen } 179759599516SKenneth E. Jansen 1798103be424SCameron Smith void writeDataBlock( 1799103be424SCameron Smith FILE* f, 1800ea868eb1SCameron Smith const void* valueArray, 1801ea868eb1SCameron Smith const int nItems, 1802ea868eb1SCameron Smith const char datatype[], 1803ea868eb1SCameron Smith const char iotype[] ) 1804ea868eb1SCameron Smith { 1805ea868eb1SCameron Smith isBinary( iotype ); 1806ea868eb1SCameron Smith size_t type_size = typeSize( datatype ); 1807*389f1f6aSCameron Smith phioTime t0,t1; 1808*389f1f6aSCameron Smith phastaio_time(&t0); 1809ea868eb1SCameron Smith if ( binary_format ) { 1810ea868eb1SCameron Smith fwrite( valueArray, type_size, nItems, f ); 1811ea868eb1SCameron Smith fprintf( f,"\n"); 1812ea868eb1SCameron Smith } else { 1813ea868eb1SCameron Smith char* ts1 = StringStripper( datatype ); 1814ea868eb1SCameron Smith if ( cscompare( "integer", ts1 ) ) { 1815be3da47bSCameron Smith const int* vals = (int*) valueArray; 1816ea868eb1SCameron Smith for( int n=0; n < nItems ; n++ ) 1817be3da47bSCameron Smith fprintf(f,"%d\n",vals[n]); 1818ea868eb1SCameron Smith } else if ( cscompare( "double", ts1 ) ) { 1819be3da47bSCameron Smith const double* vals = (double*) valueArray; 1820ea868eb1SCameron Smith for( int n=0; n < nItems ; n++ ) 1821be3da47bSCameron Smith fprintf(f,"%f\n",vals[n]); 1822ea868eb1SCameron Smith } 1823ea868eb1SCameron Smith free (ts1); 1824ea868eb1SCameron Smith } 1825*389f1f6aSCameron Smith phastaio_time(&t1); 1826*389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 1827*389f1f6aSCameron Smith phastaio_addWriteTime(elapsed); 1828f42e0444SCameron Smith phastaio_addWriteBytes(nItems*type_size); 1829ea868eb1SCameron Smith } 1830ea868eb1SCameron Smith 1831103be424SCameron Smith void writedatablock( 1832103be424SCameron Smith const int* fileDescriptor, 183359599516SKenneth E. Jansen const char keyphrase[], 183459599516SKenneth E. Jansen const void* valueArray, 183559599516SKenneth E. Jansen const int* nItems, 183659599516SKenneth E. Jansen const char datatype[], 183759599516SKenneth E. Jansen const char iotype[] ) 183859599516SKenneth E. Jansen { 183959599516SKenneth E. Jansen //if(irank == 0) printf("entering writedatablock()\n"); 184059599516SKenneth E. Jansen 18412dd307a1SCameron Smith unsigned long data_size = 0; 184259599516SKenneth E. Jansen double timer_start, timer_end; 184359599516SKenneth E. Jansen startTimer(&timer_start); 184459599516SKenneth E. Jansen 184559599516SKenneth E. Jansen int i = *fileDescriptor; 184659599516SKenneth E. Jansen checkFileDescriptor("writedatablock",&i); 184759599516SKenneth E. Jansen 184859599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) { 184959599516SKenneth E. Jansen int filePtr = *fileDescriptor - 1; 185059599516SKenneth E. Jansen 185159599516SKenneth E. Jansen if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) { 185259599516SKenneth E. Jansen fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor); 185359599516SKenneth E. Jansen fprintf(stderr,"openfile_ function has to be called before \n") ; 185459599516SKenneth E. Jansen fprintf(stderr,"acessing the file\n ") ; 185559599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n"); 185659599516SKenneth E. Jansen endTimer(&timer_end); 185759599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, 0, 0, ""); 185859599516SKenneth E. Jansen return; 185959599516SKenneth E. Jansen } 186059599516SKenneth E. Jansen // since we require that a consistant header always preceed the data block 186159599516SKenneth E. Jansen // let us check to see that it is actually the case. 186259599516SKenneth E. Jansen 1863961a4ff6SCameron Smith if ( ! cscompare( LastHeaderKey[ filePtr ].c_str(), keyphrase ) ) { 186459599516SKenneth E. Jansen fprintf(stderr, "Header not consistant with data block\n"); 1865961a4ff6SCameron Smith fprintf(stderr, "Header: %s\n", LastHeaderKey[ filePtr ].c_str() ); 186659599516SKenneth E. Jansen fprintf(stderr, "DataBlock: %s\n ", keyphrase ); 186759599516SKenneth E. Jansen fprintf(stderr, "Please recheck write sequence \n"); 186859599516SKenneth E. Jansen if( Strict_Error ) { 186959599516SKenneth E. Jansen fprintf(stderr, "fatal error: cannot continue, returning out of call\n"); 187059599516SKenneth E. Jansen endTimer(&timer_end); 187159599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, 0, 0, ""); 187259599516SKenneth E. Jansen return; 187359599516SKenneth E. Jansen } 187459599516SKenneth E. Jansen } 187559599516SKenneth E. Jansen 187659599516SKenneth E. Jansen FILE* fileObject = fileArray[ filePtr ] ; 187759599516SKenneth E. Jansen size_t type_size=typeSize( datatype ); 187859599516SKenneth E. Jansen isBinary( iotype ); 187959599516SKenneth E. Jansen 1880bae968b9SCameron Smith LastHeaderKey.erase(filePtr); 1881bae968b9SCameron Smith 188259599516SKenneth E. Jansen if ( header_type[filePtr] != (int)type_size ) { 188359599516SKenneth E. Jansen fprintf(stderr,"header and datablock differ on typeof data in the block for\n"); 188459599516SKenneth E. Jansen fprintf(stderr,"keyphrase : %s\n", keyphrase); 188559599516SKenneth E. Jansen if( Strict_Error ) { 188659599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n" ); 188759599516SKenneth E. Jansen endTimer(&timer_end); 188859599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, 0, 0, ""); 188959599516SKenneth E. Jansen return; 189059599516SKenneth E. Jansen } 189159599516SKenneth E. Jansen } 189259599516SKenneth E. Jansen 189359599516SKenneth E. Jansen int nUnits = *nItems; 189459599516SKenneth E. Jansen 189559599516SKenneth E. Jansen if ( nUnits != DataSize ) { 189659599516SKenneth E. Jansen fprintf(stderr,"header and datablock differ on number of data items for\n"); 189759599516SKenneth E. Jansen fprintf(stderr,"keyphrase : %s\n", keyphrase); 189859599516SKenneth E. Jansen if( Strict_Error ) { 189959599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n" ); 190059599516SKenneth E. Jansen endTimer(&timer_end); 190159599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, 0, 0, ""); 190259599516SKenneth E. Jansen return; 190359599516SKenneth E. Jansen } 190459599516SKenneth E. Jansen } 1905ea868eb1SCameron Smith writeDataBlock(fileObject,valueArray,*nItems,datatype,iotype); 190659599516SKenneth E. Jansen } 190759599516SKenneth E. Jansen else { // syncIO case 190859599516SKenneth E. Jansen MPI_Status write_data_status; 190959599516SKenneth E. Jansen isBinary( iotype ); 191059599516SKenneth E. Jansen int nUnits = *nItems; 191159599516SKenneth E. Jansen 191259599516SKenneth E. Jansen //MR CHANGE 191359599516SKenneth E. Jansen // if ( cscompare(datatype,"double") ) 191459599516SKenneth E. Jansen char* ts1 = StringStripper( datatype ); 191559599516SKenneth E. Jansen if ( cscompare("double",ts1) ) 191659599516SKenneth E. Jansen //MR CHANGE END 191759599516SKenneth E. Jansen { 191859599516SKenneth E. Jansen memcpy((PhastaIOActiveFiles[i]->double_chunk+DB_HEADER_SIZE/sizeof(double)), valueArray, nUnits*sizeof(double)); 1919*389f1f6aSCameron Smith phioTime t0,t1; 1920*389f1f6aSCameron Smith phastaio_time(&t0); 192159599516SKenneth E. Jansen MPI_File_write_at_all_begin( PhastaIOActiveFiles[i]->file_handle, 192259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset, 192359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk, 192459599516SKenneth E. Jansen //BLOCK_SIZE/sizeof(double), 192559599516SKenneth E. Jansen nUnits+DB_HEADER_SIZE/sizeof(double), 192659599516SKenneth E. Jansen MPI_DOUBLE ); 192759599516SKenneth E. Jansen MPI_File_write_at_all_end( PhastaIOActiveFiles[i]->file_handle, 192859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk, 192959599516SKenneth E. Jansen &write_data_status ); 193059599516SKenneth E. Jansen data_size=8*nUnits; 1931*389f1f6aSCameron Smith phastaio_time(&t1); 1932*389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 1933*389f1f6aSCameron Smith phastaio_addWriteTime(elapsed); 1934f42e0444SCameron Smith phastaio_addWriteBytes((nUnits*sizeof(double))+DB_HEADER_SIZE); 193559599516SKenneth E. Jansen } 193659599516SKenneth E. Jansen //MR CHANGE 193759599516SKenneth E. Jansen // else if ( cscompare ( datatype, "integer")) 193859599516SKenneth E. Jansen else if ( cscompare("integer",ts1) ) 193959599516SKenneth E. Jansen //MR CHANGE END 194059599516SKenneth E. Jansen { 194159599516SKenneth E. Jansen memcpy((PhastaIOActiveFiles[i]->int_chunk+DB_HEADER_SIZE/sizeof(int)), valueArray, nUnits*sizeof(int)); 1942*389f1f6aSCameron Smith phioTime t0,t1; 1943*389f1f6aSCameron Smith phastaio_time(&t0); 194459599516SKenneth E. Jansen MPI_File_write_at_all_begin( PhastaIOActiveFiles[i]->file_handle, 194559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset, 194659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk, 194759599516SKenneth E. Jansen nUnits+DB_HEADER_SIZE/sizeof(int), 194859599516SKenneth E. Jansen MPI_INT ); 194959599516SKenneth E. Jansen MPI_File_write_at_all_end( PhastaIOActiveFiles[i]->file_handle, 195059599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk, 195159599516SKenneth E. Jansen &write_data_status ); 195259599516SKenneth E. Jansen data_size=4*nUnits; 1953*389f1f6aSCameron Smith phastaio_time(&t1); 1954*389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 1955*389f1f6aSCameron Smith phastaio_addWriteTime(elapsed); 1956f42e0444SCameron Smith phastaio_addWriteBytes((nUnits*sizeof(int))+DB_HEADER_SIZE); 195759599516SKenneth E. Jansen } 195859599516SKenneth E. Jansen else { 195959599516SKenneth E. Jansen printf("Error: writedatablock - DATA_TYPE_ILLEGAL - %s\n",datatype); 196059599516SKenneth E. Jansen endTimer(&timer_end); 196159599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, 0, 0, ""); 196259599516SKenneth E. Jansen return; 196359599516SKenneth E. Jansen } 196459599516SKenneth E. Jansen free(ts1); 196559599516SKenneth E. Jansen } 196659599516SKenneth E. Jansen 196759599516SKenneth E. Jansen endTimer(&timer_end); 196859599516SKenneth E. Jansen char extra_msg[1024]; 196959599516SKenneth E. Jansen memset(extra_msg, '\0', 1024); 197059599516SKenneth E. Jansen char* key = StringStripper(keyphrase); 197159599516SKenneth E. Jansen sprintf(extra_msg, " field is %s ", key); 197259599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, data_size, 1, extra_msg); 197359599516SKenneth E. Jansen free(key); 197459599516SKenneth E. Jansen 197559599516SKenneth E. Jansen } 197659599516SKenneth E. Jansen 1977103be424SCameron Smith void SwapArrayByteOrder( void* array, int nbytes, int nItems ) 197859599516SKenneth E. Jansen { 197959599516SKenneth E. Jansen /* This swaps the byte order for the array of nItems each 198059599516SKenneth E. Jansen of size nbytes , This will be called only locally */ 198159599516SKenneth E. Jansen int i,j; 198259599516SKenneth E. Jansen unsigned char* ucDst = (unsigned char*)array; 198359599516SKenneth E. Jansen for(i=0; i < nItems; i++) { 198459599516SKenneth E. Jansen for(j=0; j < (nbytes/2); j++) 198559599516SKenneth E. Jansen std::swap( ucDst[j] , ucDst[(nbytes - 1) - j] ); 198659599516SKenneth E. Jansen ucDst += nbytes; 198759599516SKenneth E. Jansen } 198859599516SKenneth E. Jansen } 198959599516SKenneth E. Jansen 1990103be424SCameron Smith void writestring( int* fileDescriptor, const char inString[] ) 199159599516SKenneth E. Jansen { 199259599516SKenneth E. Jansen int filePtr = *fileDescriptor - 1; 199359599516SKenneth E. Jansen FILE* fileObject = fileArray[filePtr] ; 199459599516SKenneth E. Jansen fprintf(fileObject,"%s",inString ); 199559599516SKenneth E. Jansen return; 199659599516SKenneth E. Jansen } 199759599516SKenneth E. Jansen 1998103be424SCameron Smith void Gather_Headers( int* fileDescriptor, vector< string >& headers ) 199959599516SKenneth E. Jansen { 200059599516SKenneth E. Jansen FILE* fileObject; 200159599516SKenneth E. Jansen char Line[1024]; 200259599516SKenneth E. Jansen 200359599516SKenneth E. Jansen fileObject = fileArray[ (*fileDescriptor)-1 ]; 200459599516SKenneth E. Jansen 200559599516SKenneth E. Jansen while( !feof(fileObject) ) { 200659599516SKenneth E. Jansen fgets( Line, 1024, fileObject); 200759599516SKenneth E. Jansen if ( Line[0] == '#' ) { 200859599516SKenneth E. Jansen headers.push_back( Line ); 200959599516SKenneth E. Jansen } else { 201059599516SKenneth E. Jansen break; 201159599516SKenneth E. Jansen } 201259599516SKenneth E. Jansen } 201359599516SKenneth E. Jansen rewind( fileObject ); 201459599516SKenneth E. Jansen clearerr( fileObject ); 201559599516SKenneth E. Jansen } 201659599516SKenneth E. Jansen 2017103be424SCameron Smith void isWrong( void ) { 2018103be424SCameron Smith (Wrong_Endian) ? fprintf(stdout,"YES\n") : fprintf(stdout,"NO\n"); 2019103be424SCameron Smith } 202059599516SKenneth E. Jansen 2021103be424SCameron Smith void togglestrictmode( void ) { Strict_Error = !Strict_Error; } 2022103be424SCameron Smith 2023103be424SCameron Smith int isLittleEndian( void ) 202459599516SKenneth E. Jansen { 202559599516SKenneth E. Jansen // this function returns a 1 if the current running architecture is 202659599516SKenneth E. Jansen // LittleEndian Byte Ordered, else it returns a zero 202759599516SKenneth E. Jansen union { 202859599516SKenneth E. Jansen long a; 202959599516SKenneth E. Jansen char c[sizeof( long )]; 203059599516SKenneth E. Jansen } endianUnion; 203159599516SKenneth E. Jansen endianUnion.a = 1 ; 203259599516SKenneth E. Jansen if ( endianUnion.c[sizeof(long)-1] != 1 ) return 1 ; 203359599516SKenneth E. Jansen else return 0; 203459599516SKenneth E. Jansen } 203559599516SKenneth E. Jansen 203659599516SKenneth E. Jansen namespace PHASTA { 203759599516SKenneth E. Jansen const char* const PhastaIO_traits<int>::type_string = "integer"; 203859599516SKenneth E. Jansen const char* const PhastaIO_traits<double>::type_string = "double"; 203959599516SKenneth E. Jansen } 2040