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" 254600f8abSCameron Smith #include "phiompi.h" 2659599516SKenneth E. Jansen #include "mpi.h" 2759599516SKenneth E. Jansen #include "phiotmrc.h" 28f42e0444SCameron Smith #include "phiostats.h" 2997a07b0aSCameron Smith #include <assert.h> 3059599516SKenneth E. Jansen 314600f8abSCameron Smith /* OS-specific things try to stay here */ 324600f8abSCameron Smith #include <sys/stat.h> 334600f8abSCameron Smith #include <unistd.h> 344600f8abSCameron Smith #include <errno.h> 354600f8abSCameron Smith 364600f8abSCameron Smith 3759599516SKenneth E. Jansen #define VERSION_INFO_HEADER_SIZE 8192 3859599516SKenneth E. Jansen #define DB_HEADER_SIZE 1024 3959599516SKenneth E. Jansen #define ONE_MEGABYTE 1048576 4059599516SKenneth E. Jansen #define TWO_MEGABYTE 2097152 4159599516SKenneth E. Jansen #define ENDIAN_TEST_NUMBER 12180 // Troy's Zip Code!! 4259599516SKenneth E. Jansen #define MAX_PHASTA_FILES 64 4359599516SKenneth E. Jansen #define MAX_PHASTA_FILE_NAME_LENGTH 1024 4459599516SKenneth 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 4559599516SKenneth E. Jansen // -3 for MPI_IO_Tag, nFields and nppf, -4 for extra security (former nFiles) 4659599516SKenneth E. Jansen #define MAX_FIELDS_NAME_LENGTH 128 4759599516SKenneth E. Jansen #define DefaultMHSize (4*ONE_MEGABYTE) 4859599516SKenneth E. Jansen //#define DefaultMHSize (8350) //For test 4959599516SKenneth E. Jansen #define LATEST_WRITE_VERSION 1 5059599516SKenneth E. Jansen #define inv1024sq 953.674316406e-9 // = 1/1024/1024 5159599516SKenneth E. Jansen int MasterHeaderSize = -1; 5259599516SKenneth E. Jansen 5359599516SKenneth E. Jansen bool PRINT_PERF = false; // default print no perf results 5459599516SKenneth E. Jansen int irank = -1; // global rank, should never be manually manipulated 5559599516SKenneth E. Jansen int mysize = -1; 5659599516SKenneth E. Jansen 5759599516SKenneth E. Jansen // Static variables are bad but used here to store the subcommunicator and associated variables 5859599516SKenneth 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) 5959599516SKenneth E. Jansen static int s_assign_local_comm = 0; 6059599516SKenneth E. Jansen static MPI_Comm s_local_comm; 6159599516SKenneth E. Jansen static int s_local_size = -1; 6259599516SKenneth E. Jansen static int s_local_rank = -1; 6359599516SKenneth E. Jansen 6459599516SKenneth E. Jansen // the following defines are for debug printf 6559599516SKenneth E. Jansen #define PHASTAIO_DEBUG 0 //default to not print any debugging info 6659599516SKenneth E. Jansen 67fe03b87fSCameron Smith void phprintf(const char* fmt, ...) { 68be3da47bSCameron Smith (void)fmt; 6959599516SKenneth E. Jansen #if PHASTAIO_DEBUG 70fe03b87fSCameron Smith char format[1024]; 71fe03b87fSCameron Smith snprintf(format, sizeof(format), "phastaIO debug: %s", fmt); 72fe03b87fSCameron Smith va_list ap; 73fe03b87fSCameron Smith va_start(ap,fmt); 74a746c838SCameron Smith vprintf(format,ap); 75fe03b87fSCameron Smith va_end(ap); 7659599516SKenneth E. Jansen #endif 77fe03b87fSCameron Smith } 78fe03b87fSCameron Smith 79fe03b87fSCameron Smith void phprintf_0(const char* fmt, ...) { 80be3da47bSCameron Smith (void)fmt; 81fe03b87fSCameron Smith #if PHASTAIO_DEBUG 82fe03b87fSCameron Smith int rank = 0; 83fe03b87fSCameron Smith MPI_Comm_rank(MPI_COMM_WORLD, &rank); 84fe03b87fSCameron Smith if(rank == 0){ 85fe03b87fSCameron Smith char format[1024]; 86fe03b87fSCameron Smith snprintf(format, sizeof(format), "phastaIO debug: irank=0 %s", fmt); 87fe03b87fSCameron Smith va_list ap; 88a746c838SCameron Smith va_start(ap,fmt); 89fe03b87fSCameron Smith vprintf(format, ap); 90fe03b87fSCameron Smith va_end(ap); 91fe03b87fSCameron Smith } 92fe03b87fSCameron Smith #endif 93fe03b87fSCameron Smith } 9459599516SKenneth E. Jansen 9559599516SKenneth E. Jansen enum PhastaIO_Errors 9659599516SKenneth E. Jansen { 9759599516SKenneth E. Jansen MAX_PHASTA_FILES_EXCEEDED = -1, 9859599516SKenneth E. Jansen UNABLE_TO_OPEN_FILE = -2, 9959599516SKenneth E. Jansen NOT_A_MPI_FILE = -3, 10059599516SKenneth E. Jansen GPID_EXCEEDED = -4, 10110d56689SCameron Smith DATA_TYPE_ILLEGAL = -5 10259599516SKenneth E. Jansen }; 10359599516SKenneth E. Jansen 10459599516SKenneth E. Jansen using namespace std; 10559599516SKenneth E. Jansen 10659599516SKenneth E. Jansen namespace{ 10759599516SKenneth E. Jansen 108961a4ff6SCameron Smith map<int, std::string> LastHeaderKey; 10959599516SKenneth E. Jansen vector< FILE* > fileArray; 11059599516SKenneth E. Jansen vector< bool > byte_order; 11159599516SKenneth E. Jansen vector< int > header_type; 11259599516SKenneth E. Jansen int DataSize=0; 11359599516SKenneth E. Jansen bool LastHeaderNotFound = false; 11459599516SKenneth E. Jansen bool Wrong_Endian = false ; 11559599516SKenneth E. Jansen bool Strict_Error = false ; 11659599516SKenneth E. Jansen bool binary_format = true; 11759599516SKenneth E. Jansen 11859599516SKenneth E. Jansen /***********************************************************************/ 11959599516SKenneth E. Jansen /***************** NEW PHASTA IO CODE STARTS HERE **********************/ 12059599516SKenneth E. Jansen /***********************************************************************/ 12159599516SKenneth E. Jansen 12259599516SKenneth E. Jansen typedef struct 12359599516SKenneth E. Jansen { 12459599516SKenneth E. Jansen char filename[MAX_PHASTA_FILE_NAME_LENGTH]; /* defafults to 1024 */ 1252dd307a1SCameron Smith unsigned long my_offset; 1262dd307a1SCameron Smith unsigned long next_start_address; 1272dd307a1SCameron Smith unsigned long **my_offset_table; 1282dd307a1SCameron Smith unsigned long **my_read_table; 12959599516SKenneth E. Jansen 13059599516SKenneth E. Jansen double * double_chunk; 13159599516SKenneth E. Jansen double * read_double_chunk; 13259599516SKenneth E. Jansen 13359599516SKenneth E. Jansen int field_count; 13459599516SKenneth E. Jansen int part_count; 13559599516SKenneth E. Jansen int read_field_count; 13659599516SKenneth E. Jansen int read_part_count; 13759599516SKenneth E. Jansen int GPid; 13859599516SKenneth E. Jansen int start_id; 13959599516SKenneth E. Jansen 14059599516SKenneth E. Jansen int mhsize; 14159599516SKenneth E. Jansen 14259599516SKenneth E. Jansen int myrank; 14359599516SKenneth E. Jansen int numprocs; 14459599516SKenneth E. Jansen int local_myrank; 14559599516SKenneth E. Jansen int local_numprocs; 14659599516SKenneth E. Jansen 14759599516SKenneth E. Jansen int nppp; 14859599516SKenneth E. Jansen int nPPF; 14959599516SKenneth E. Jansen int nFiles; 15059599516SKenneth E. Jansen int nFields; 15159599516SKenneth E. Jansen 15259599516SKenneth E. Jansen int * int_chunk; 15359599516SKenneth E. Jansen int * read_int_chunk; 15459599516SKenneth E. Jansen 15559599516SKenneth E. Jansen int Wrong_Endian; /* default to false */ 15659599516SKenneth E. Jansen char * master_header; 15759599516SKenneth E. Jansen MPI_File file_handle; 15859599516SKenneth E. Jansen MPI_Comm local_comm; 15959599516SKenneth E. Jansen } phastaio_file_t; 16059599516SKenneth E. Jansen 16159599516SKenneth E. Jansen typedef struct 16259599516SKenneth E. Jansen { 16359599516SKenneth E. Jansen int nppf, nfields; 16459599516SKenneth E. Jansen char * masterHeader; 16559599516SKenneth E. Jansen }serial_file; 16659599516SKenneth E. Jansen 16759599516SKenneth E. Jansen serial_file *SerialFile; 16859599516SKenneth E. Jansen phastaio_file_t *PhastaIOActiveFiles[MAX_PHASTA_FILES]; 16959599516SKenneth E. Jansen int PhastaIONextActiveIndex = 0; /* indicates next index to allocate */ 17059599516SKenneth E. Jansen 17159599516SKenneth E. Jansen // the caller has the responsibility to delete the returned string 17259599516SKenneth E. Jansen // TODO: StringStipper("nbc value? ") returns NULL? 173103be424SCameron Smith char* StringStripper( const char istring[] ) { 17459599516SKenneth E. Jansen int length = strlen( istring ); 17559599516SKenneth E. Jansen char* dest = (char *)malloc( length + 1 ); 17659599516SKenneth E. Jansen strcpy( dest, istring ); 17759599516SKenneth E. Jansen dest[ length ] = '\0'; 17859599516SKenneth E. Jansen if ( char* p = strpbrk( dest, " ") ) 17959599516SKenneth E. Jansen *p = '\0'; 18059599516SKenneth E. Jansen return dest; 18159599516SKenneth E. Jansen } 18259599516SKenneth E. Jansen 183103be424SCameron Smith inline int cscompare( const char teststring[], const char targetstring[] ) { 18459599516SKenneth E. Jansen char* s1 = const_cast<char*>(teststring); 18559599516SKenneth E. Jansen char* s2 = const_cast<char*>(targetstring); 18659599516SKenneth E. Jansen 18759599516SKenneth E. Jansen while( *s1 == ' ') s1++; 18859599516SKenneth E. Jansen while( *s2 == ' ') s2++; 18959599516SKenneth E. Jansen while( ( *s1 ) 19059599516SKenneth E. Jansen && ( *s2 ) 19159599516SKenneth E. Jansen && ( *s2 != '?') 19259599516SKenneth E. Jansen && ( tolower( *s1 )==tolower( *s2 ) ) ) { 19359599516SKenneth E. Jansen s1++; 19459599516SKenneth E. Jansen s2++; 19559599516SKenneth E. Jansen while( *s1 == ' ') s1++; 19659599516SKenneth E. Jansen while( *s2 == ' ') s2++; 19759599516SKenneth E. Jansen } 19859599516SKenneth E. Jansen if ( !( *s1 ) || ( *s1 == '?') ) return 1; 19959599516SKenneth E. Jansen else return 0; 20059599516SKenneth E. Jansen } 20159599516SKenneth E. Jansen 202103be424SCameron Smith inline void isBinary( const char iotype[] ) { 20359599516SKenneth E. Jansen char* fname = StringStripper( iotype ); 20459599516SKenneth E. Jansen if ( cscompare( fname, "binary" ) ) binary_format = true; 20559599516SKenneth E. Jansen else binary_format = false; 20659599516SKenneth E. Jansen free (fname); 20759599516SKenneth E. Jansen 20859599516SKenneth E. Jansen } 20959599516SKenneth E. Jansen 210103be424SCameron Smith inline size_t typeSize( const char typestring[] ) { 21159599516SKenneth E. Jansen char* ts1 = StringStripper( typestring ); 21259599516SKenneth E. Jansen if ( cscompare( "integer", ts1 ) ) { 21359599516SKenneth E. Jansen free (ts1); 21459599516SKenneth E. Jansen return sizeof(int); 21559599516SKenneth E. Jansen } else if ( cscompare( "double", ts1 ) ) { 21659599516SKenneth E. Jansen free (ts1); 21759599516SKenneth E. Jansen return sizeof( double ); 21859599516SKenneth E. Jansen } else { 21959599516SKenneth E. Jansen free (ts1); 22059599516SKenneth E. Jansen fprintf(stderr,"unknown type : %s\n",ts1); 22159599516SKenneth E. Jansen return 0; 22259599516SKenneth E. Jansen } 22359599516SKenneth E. Jansen } 22459599516SKenneth E. Jansen 225103be424SCameron Smith int readHeader( 226103be424SCameron Smith FILE* fileObject, 22759599516SKenneth E. Jansen const char phrase[], 22859599516SKenneth E. Jansen int* params, 22959599516SKenneth E. Jansen int expect ) { 23059599516SKenneth E. Jansen char* text_header; 23159599516SKenneth E. Jansen char* token; 23297a07b0aSCameron Smith char Line[1024] = "\0"; 23359599516SKenneth E. Jansen char junk; 23459599516SKenneth E. Jansen bool FOUND = false ; 23559599516SKenneth E. Jansen int real_length; 23659599516SKenneth E. Jansen int skip_size, integer_value; 23759599516SKenneth E. Jansen int rewind_count=0; 23859599516SKenneth E. Jansen 23959599516SKenneth E. Jansen if( !fgets( Line, 1024, fileObject ) && feof( fileObject ) ) { 24059599516SKenneth E. Jansen rewind( fileObject ); 24159599516SKenneth E. Jansen clearerr( fileObject ); 24259599516SKenneth E. Jansen rewind_count++; 24359599516SKenneth E. Jansen fgets( Line, 1024, fileObject ); 24459599516SKenneth E. Jansen } 24559599516SKenneth E. Jansen 24659599516SKenneth E. Jansen while( !FOUND && ( rewind_count < 2 ) ) { 24759599516SKenneth E. Jansen if ( ( Line[0] != '\n' ) && ( real_length = strcspn( Line, "#" )) ) { 24859599516SKenneth E. Jansen text_header = (char *)malloc( real_length + 1 ); 24959599516SKenneth E. Jansen strncpy( text_header, Line, real_length ); 25059599516SKenneth E. Jansen text_header[ real_length ] =static_cast<char>(NULL); 25159599516SKenneth E. Jansen token = strtok ( text_header, ":" ); 25297a07b0aSCameron Smith assert(token); 25397a07b0aSCameron Smith if( cscompare( phrase , token ) ) { 25459599516SKenneth E. Jansen FOUND = true ; 25559599516SKenneth E. Jansen token = strtok( NULL, " ,;<>" ); 25697a07b0aSCameron Smith assert(token); 25759599516SKenneth E. Jansen skip_size = atoi( token ); 25859599516SKenneth E. Jansen int i; 25959599516SKenneth E. Jansen for( i=0; i < expect && ( token = strtok( NULL," ,;<>") ); i++) { 26097a07b0aSCameron Smith assert(token); 26159599516SKenneth E. Jansen params[i] = atoi( token ); 26259599516SKenneth E. Jansen } 26359599516SKenneth E. Jansen if ( i < expect ) { 264103be424SCameron Smith fprintf(stderr, 265103be424SCameron Smith "Aloha Expected # of ints not found for: %s\n",phrase ); 26659599516SKenneth E. Jansen } 26759599516SKenneth E. Jansen } else if ( cscompare(token,"byteorder magic number") ) { 26859599516SKenneth E. Jansen if ( binary_format ) { 26959599516SKenneth E. Jansen fread((void*)&integer_value,sizeof(int),1,fileObject); 27059599516SKenneth E. Jansen fread( &junk, sizeof(char), 1 , fileObject ); 27159599516SKenneth E. Jansen if ( 362436 != integer_value ) Wrong_Endian = true; 27259599516SKenneth E. Jansen } else{ 27359599516SKenneth E. Jansen fscanf(fileObject, "%d\n", &integer_value ); 27459599516SKenneth E. Jansen } 27559599516SKenneth E. Jansen } else { 27659599516SKenneth E. Jansen /* some other header, so just skip over */ 27759599516SKenneth E. Jansen token = strtok( NULL, " ,;<>" ); 27897a07b0aSCameron Smith assert(token); 27959599516SKenneth E. Jansen skip_size = atoi( token ); 28059599516SKenneth E. Jansen if ( binary_format) 28159599516SKenneth E. Jansen fseek( fileObject, skip_size, SEEK_CUR ); 28259599516SKenneth E. Jansen else 28359599516SKenneth E. Jansen for( int gama=0; gama < skip_size; gama++ ) 28459599516SKenneth E. Jansen fgets( Line, 1024, fileObject ); 28559599516SKenneth E. Jansen } 28659599516SKenneth E. Jansen free (text_header); 28759599516SKenneth E. Jansen } // end of if before while loop 28859599516SKenneth E. Jansen 28959599516SKenneth E. Jansen if ( !FOUND ) 29059599516SKenneth E. Jansen if( !fgets( Line, 1024, fileObject ) && feof( fileObject ) ) { 29159599516SKenneth E. Jansen rewind( fileObject ); 29259599516SKenneth E. Jansen clearerr( fileObject ); 29359599516SKenneth E. Jansen rewind_count++; 29459599516SKenneth E. Jansen fgets( Line, 1024, fileObject ); 29559599516SKenneth E. Jansen } 29659599516SKenneth E. Jansen } 29759599516SKenneth E. Jansen 29859599516SKenneth E. Jansen if ( !FOUND ) { 29959599516SKenneth E. Jansen //fprintf(stderr, "Error: Could not find: %s\n", phrase); 30059599516SKenneth E. Jansen if(irank == 0) printf("WARNING: Could not find: %s\n", phrase); 30159599516SKenneth E. Jansen return 1; 30259599516SKenneth E. Jansen } 30359599516SKenneth E. Jansen return 0; 30459599516SKenneth E. Jansen } 30559599516SKenneth E. Jansen 30659599516SKenneth E. Jansen } // end unnamed namespace 30759599516SKenneth E. Jansen 30859599516SKenneth E. Jansen 30959599516SKenneth E. Jansen // begin of publicly visible functions 31059599516SKenneth E. Jansen 31159599516SKenneth E. Jansen /** 31259599516SKenneth E. Jansen * This function takes a long long pointer and assign (start) phiotmrc value to it 31359599516SKenneth E. Jansen */ 31459599516SKenneth E. Jansen void startTimer(double* start) { 31559599516SKenneth E. Jansen if( !PRINT_PERF ) return; 31659599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 31759599516SKenneth E. Jansen *start = phiotmrc(); 31859599516SKenneth E. Jansen } 31959599516SKenneth E. Jansen 32059599516SKenneth E. Jansen /** 32159599516SKenneth E. Jansen * This function takes a long long pointer and assign (end) phiotmrc value to it 32259599516SKenneth E. Jansen */ 32359599516SKenneth E. Jansen void endTimer(double* end) { 32459599516SKenneth E. Jansen if( !PRINT_PERF ) return; 32559599516SKenneth E. Jansen *end = phiotmrc(); 32659599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 32759599516SKenneth E. Jansen } 32859599516SKenneth E. Jansen 32959599516SKenneth E. Jansen /** 33059599516SKenneth E. Jansen * choose to print some performance results (or not) according to 33159599516SKenneth E. Jansen * the PRINT_PERF macro 33259599516SKenneth E. Jansen */ 33359599516SKenneth E. Jansen void printPerf( 33459599516SKenneth E. Jansen const char* func_name, 33559599516SKenneth E. Jansen double start, 33659599516SKenneth E. Jansen double end, 3372dd307a1SCameron Smith unsigned long datasize, 33859599516SKenneth E. Jansen int printdatainfo, 33959599516SKenneth E. Jansen const char* extra_msg) { 34059599516SKenneth E. Jansen if( !PRINT_PERF ) return; 3412dd307a1SCameron Smith unsigned long data_size = datasize; 34259599516SKenneth E. Jansen double time = end - start; 3432dd307a1SCameron Smith unsigned long isizemin,isizemax,isizetot; 34459599516SKenneth E. Jansen double sizemin,sizemax,sizeavg,sizetot,rate; 34559599516SKenneth E. Jansen double tmin, tmax, tavg, ttot; 34659599516SKenneth E. Jansen 34759599516SKenneth E. Jansen MPI_Allreduce(&time, &tmin,1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD); 34859599516SKenneth E. Jansen MPI_Allreduce(&time, &tmax,1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); 34959599516SKenneth E. Jansen MPI_Allreduce(&time, &ttot,1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); 35059599516SKenneth E. Jansen tavg = ttot/mysize; 35159599516SKenneth E. Jansen 35259599516SKenneth E. Jansen if(irank == 0) { 35359599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) printf("** 1PFPP "); 35459599516SKenneth E. Jansen else printf("** syncIO "); 35559599516SKenneth E. Jansen printf("%s(): Tmax = %f sec, Tmin = %f sec, Tavg = %f sec", func_name, tmax, tmin, tavg); 35659599516SKenneth E. Jansen } 35759599516SKenneth E. Jansen 35859599516SKenneth E. Jansen if(printdatainfo == 1) { // if printdatainfo ==1, compute I/O rate and block size 35959599516SKenneth E. Jansen MPI_Allreduce(&data_size,&isizemin,1,MPI_LONG_LONG_INT,MPI_MIN,MPI_COMM_WORLD); 36059599516SKenneth E. Jansen MPI_Allreduce(&data_size,&isizemax,1,MPI_LONG_LONG_INT,MPI_MAX,MPI_COMM_WORLD); 36159599516SKenneth E. Jansen MPI_Allreduce(&data_size,&isizetot,1,MPI_LONG_LONG_INT,MPI_SUM,MPI_COMM_WORLD); 36259599516SKenneth E. Jansen 36359599516SKenneth E. Jansen sizemin=(double)(isizemin*inv1024sq); 36459599516SKenneth E. Jansen sizemax=(double)(isizemax*inv1024sq); 36559599516SKenneth E. Jansen sizetot=(double)(isizetot*inv1024sq); 36659599516SKenneth E. Jansen sizeavg=(double)(1.0*sizetot/mysize); 36759599516SKenneth E. Jansen rate=(double)(1.0*sizetot/tmax); 36859599516SKenneth E. Jansen 36959599516SKenneth E. Jansen if( irank == 0) { 370103be424SCameron Smith printf(", Rate = %f MB/s [%s] \n \t\t\t" 371103be424SCameron Smith " block size: Min= %f MB; Max= %f MB; Avg= %f MB; Tot= %f MB\n", 372103be424SCameron Smith rate, extra_msg, sizemin,sizemax,sizeavg,sizetot); 37359599516SKenneth E. Jansen } 37459599516SKenneth E. Jansen } 37559599516SKenneth E. Jansen else { 37659599516SKenneth E. Jansen if(irank == 0) { 37759599516SKenneth E. Jansen printf(" \n"); 37859599516SKenneth E. Jansen //printf(" (%s) \n", extra_msg); 37959599516SKenneth E. Jansen } 38059599516SKenneth E. Jansen } 38159599516SKenneth E. Jansen } 38259599516SKenneth E. Jansen 38359599516SKenneth E. Jansen /** 38459599516SKenneth E. Jansen * This function is normally called at the beginning of a read operation, before 38559599516SKenneth E. Jansen * init function. 38659599516SKenneth E. Jansen * This function (uses rank 0) reads out nfields, nppf, master header size, 38759599516SKenneth E. Jansen * endianess and allocates for masterHeader string. 38859599516SKenneth E. Jansen * These values are essential for following read operations. Rank 0 will bcast 38959599516SKenneth E. Jansen * these values to other ranks in the commm world 39059599516SKenneth E. Jansen * 39159599516SKenneth E. Jansen * If the file set is of old POSIX format, it would throw error and exit 39259599516SKenneth E. Jansen */ 39359599516SKenneth E. Jansen void queryphmpiio(const char filename[],int *nfields, int *nppf) 39459599516SKenneth E. Jansen { 39559599516SKenneth E. Jansen MPI_Comm_rank(MPI_COMM_WORLD, &irank); 39659599516SKenneth E. Jansen MPI_Comm_size(MPI_COMM_WORLD, &mysize); 39759599516SKenneth E. Jansen 39859599516SKenneth E. Jansen if(irank == 0) { 39959599516SKenneth E. Jansen FILE * fileHandle; 40059599516SKenneth E. Jansen char* fname = StringStripper( filename ); 40159599516SKenneth E. Jansen 402389f1f6aSCameron Smith phioTime t0,t1; 403389f1f6aSCameron Smith phastaio_time(&t0); 40459599516SKenneth E. Jansen fileHandle = fopen (fname,"rb"); 405389f1f6aSCameron Smith phastaio_time(&t1); 406389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 407389f1f6aSCameron Smith phastaio_addOpenTime(elapsed); 40859599516SKenneth E. Jansen if (fileHandle == NULL ) { 40959599516SKenneth E. Jansen printf("\nError: File %s doesn't exist! Please check!\n",fname); 41059599516SKenneth E. Jansen } 41159599516SKenneth E. Jansen else { 41259599516SKenneth E. Jansen SerialFile =(serial_file *)calloc( 1, sizeof( serial_file) ); 41359599516SKenneth E. Jansen int meta_size_limit = VERSION_INFO_HEADER_SIZE; 41459599516SKenneth E. Jansen SerialFile->masterHeader = (char *)malloc( meta_size_limit ); 41559599516SKenneth E. Jansen fread(SerialFile->masterHeader, 1, meta_size_limit, fileHandle); 41659599516SKenneth E. Jansen 41759599516SKenneth E. Jansen char read_out_tag[MAX_FIELDS_NAME_LENGTH]; 41859599516SKenneth E. Jansen char version[MAX_FIELDS_NAME_LENGTH/4]; 41959599516SKenneth E. Jansen int mhsize; 42059599516SKenneth E. Jansen char * token; 42159599516SKenneth E. Jansen int magic_number; 42259599516SKenneth E. Jansen 42359599516SKenneth E. Jansen memcpy( read_out_tag, 42459599516SKenneth E. Jansen SerialFile->masterHeader, 42559599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH-1 ); 42659599516SKenneth E. Jansen 42759599516SKenneth E. Jansen if ( cscompare ("MPI_IO_Tag",read_out_tag) ) { 42859599516SKenneth E. Jansen // Test endianess ... 42959599516SKenneth E. Jansen memcpy (&magic_number, 43059599516SKenneth E. Jansen SerialFile->masterHeader + sizeof("MPI_IO_Tag : ")-1, //-1 sizeof returns the size of the string+1 for "\0" 43159599516SKenneth E. Jansen sizeof(int) ); // masterheader should look like "MPI_IO_Tag : 12180 " with 12180 in binary format 43259599516SKenneth E. Jansen 43359599516SKenneth E. Jansen if ( magic_number != ENDIAN_TEST_NUMBER ) { 43459599516SKenneth E. Jansen printf("Endian is different!\n"); 43559599516SKenneth E. Jansen // Will do swap later 43659599516SKenneth E. Jansen } 43759599516SKenneth E. Jansen 43859599516SKenneth E. Jansen // test version, old version, default masterheader size is 4M 43959599516SKenneth E. Jansen // newer version masterheader size is read from first line 44059599516SKenneth E. Jansen memcpy(version, 44159599516SKenneth E. Jansen SerialFile->masterHeader + MAX_FIELDS_NAME_LENGTH/2, 44259599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH/4 - 1); //TODO: why -1? 44359599516SKenneth E. Jansen 44459599516SKenneth E. Jansen if( cscompare ("version",version) ) { 44559599516SKenneth E. Jansen // if there is "version" tag in the file, then it is newer format 44659599516SKenneth E. Jansen // read master header size from here, otherwise use default 44759599516SKenneth E. Jansen // Note: if version is "1", we know mhsize is at 3/4 place... 44859599516SKenneth E. Jansen 44959599516SKenneth E. Jansen token = strtok(version, ":"); 45059599516SKenneth E. Jansen token = strtok(NULL, " ,;<>" ); 45159599516SKenneth E. Jansen int iversion = atoi(token); 45259599516SKenneth E. Jansen 45359599516SKenneth E. Jansen if( iversion == 1) { 45459599516SKenneth E. Jansen memcpy( &mhsize, 45559599516SKenneth E. Jansen SerialFile->masterHeader + MAX_FIELDS_NAME_LENGTH/4*3 + sizeof("mhsize : ")-1, 45659599516SKenneth E. Jansen sizeof(int)); 45759599516SKenneth E. Jansen if ( magic_number != ENDIAN_TEST_NUMBER ) 45859599516SKenneth E. Jansen SwapArrayByteOrder(&mhsize, sizeof(int), 1); 45959599516SKenneth E. Jansen 46059599516SKenneth E. Jansen if( mhsize > DefaultMHSize ) { 46159599516SKenneth E. Jansen //if actual headersize is larger than default, let's re-read 46259599516SKenneth E. Jansen free(SerialFile->masterHeader); 46359599516SKenneth E. Jansen SerialFile->masterHeader = (char *)malloc(mhsize); 46459599516SKenneth E. Jansen fseek(fileHandle, 0, SEEK_SET); // reset the file stream position 46559599516SKenneth E. Jansen fread(SerialFile->masterHeader,1,mhsize,fileHandle); 46659599516SKenneth E. Jansen } 46759599516SKenneth E. Jansen } 46859599516SKenneth E. Jansen //TODO: check if this is a valid int?? 46959599516SKenneth E. Jansen MasterHeaderSize = mhsize; 47059599516SKenneth E. Jansen } 47159599516SKenneth E. Jansen else { // else it's version 0's format w/o version tag, implicating MHSize=4M 47259599516SKenneth E. Jansen MasterHeaderSize = DefaultMHSize; 47359599516SKenneth E. Jansen } 47459599516SKenneth E. Jansen 47559599516SKenneth E. Jansen memcpy( read_out_tag, 47659599516SKenneth E. Jansen SerialFile->masterHeader+MAX_FIELDS_NAME_LENGTH+1, 47759599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH ); //TODO: why +1 47859599516SKenneth E. Jansen 47959599516SKenneth E. Jansen // Read in # fields ... 48059599516SKenneth E. Jansen token = strtok( read_out_tag, ":" ); 48159599516SKenneth E. Jansen token = strtok( NULL," ,;<>" ); 48259599516SKenneth E. Jansen *nfields = atoi( token ); 48359599516SKenneth E. Jansen if ( *nfields > MAX_FIELDS_NUMBER) { 48459599516SKenneth E. Jansen printf("Error queryphmpiio: nfields is larger than MAX_FIELDS_NUMBER!\n"); 48559599516SKenneth E. Jansen } 48659599516SKenneth E. Jansen SerialFile->nfields=*nfields; //TODO: sanity check of this int? 48759599516SKenneth E. Jansen 48859599516SKenneth E. Jansen memcpy( read_out_tag, 48959599516SKenneth E. Jansen SerialFile->masterHeader + MAX_FIELDS_NAME_LENGTH * 2 49059599516SKenneth E. Jansen + *nfields * MAX_FIELDS_NAME_LENGTH, 49159599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH); 49259599516SKenneth E. Jansen 49359599516SKenneth E. Jansen token = strtok( read_out_tag, ":" ); 49459599516SKenneth E. Jansen token = strtok( NULL," ,;<>" ); 49559599516SKenneth E. Jansen *nppf = atoi( token ); 49659599516SKenneth E. Jansen SerialFile->nppf=*nppf; //TODO: sanity check of int 49759599516SKenneth E. Jansen } // end of if("MPI_IO_TAG") 49859599516SKenneth E. Jansen else { 49959599516SKenneth 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); 50059599516SKenneth E. Jansen exit(1); 50159599516SKenneth E. Jansen } 502389f1f6aSCameron Smith phioTime t0,t1; 503389f1f6aSCameron Smith phastaio_time(&t0); 50459599516SKenneth E. Jansen fclose(fileHandle); 505389f1f6aSCameron Smith phastaio_time(&t1); 506389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 507389f1f6aSCameron Smith phastaio_addCloseTime(elapsed); 50859599516SKenneth E. Jansen free(SerialFile->masterHeader); 50959599516SKenneth E. Jansen free(SerialFile); 51059599516SKenneth E. Jansen } //end of else 51159599516SKenneth E. Jansen free(fname); 51259599516SKenneth E. Jansen } 51359599516SKenneth E. Jansen 51459599516SKenneth E. Jansen // Bcast value to every one 51559599516SKenneth E. Jansen MPI_Bcast( nfields, 1, MPI_INT, 0, MPI_COMM_WORLD ); 51659599516SKenneth E. Jansen MPI_Bcast( nppf, 1, MPI_INT, 0, MPI_COMM_WORLD ); 51759599516SKenneth E. Jansen MPI_Bcast( &MasterHeaderSize, 1, MPI_INT, 0, MPI_COMM_WORLD ); 518a746c838SCameron Smith phprintf("Info queryphmpiio: myrank = %d, MasterHeaderSize = %d\n", irank, MasterHeaderSize); 51959599516SKenneth E. Jansen } 52059599516SKenneth E. Jansen 52159599516SKenneth E. Jansen /** 52259599516SKenneth E. Jansen * This function computes the right master header size (round to size of 2^n). 52359599516SKenneth E. Jansen * This is only needed for file format version 1 in "write" mode. 52459599516SKenneth E. Jansen */ 52559599516SKenneth E. Jansen int computeMHSize(int nfields, int nppf, int version) { 52610d56689SCameron Smith int mhsize=0; 52759599516SKenneth E. Jansen if(version == 1) { 52859599516SKenneth 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 52959599516SKenneth E. Jansen int meta_info_size = VERSION_INFO_HEADER_SIZE; 5302dd307a1SCameron Smith int actual_size = nfields * nppf * sizeof(unsigned long) + meta_info_size; 53159599516SKenneth E. Jansen //printf("actual_size = %d, offset table size = %d\n", actual_size, nfields * nppf * sizeof(long long)); 53259599516SKenneth E. Jansen if (actual_size > DefaultMHSize) { 53359599516SKenneth E. Jansen mhsize = (int) ceil( (double) actual_size/DefaultMHSize); // it's rounded to ceiling of this value 53459599516SKenneth E. Jansen mhsize *= DefaultMHSize; 53559599516SKenneth E. Jansen } 53659599516SKenneth E. Jansen else { 53759599516SKenneth E. Jansen mhsize = DefaultMHSize; 53859599516SKenneth E. Jansen } 539b744cbcaSCameron Smith } else { 540b744cbcaSCameron Smith int rank = 0; 541b744cbcaSCameron Smith MPI_Comm_rank(MPI_COMM_WORLD, &rank); 542b744cbcaSCameron Smith if(!rank) { 543b744cbcaSCameron Smith fprintf(stderr, 544b744cbcaSCameron Smith "ERROR invalid version passed to %s... exiting\n", __func__); 545b744cbcaSCameron Smith exit(EXIT_FAILURE); 546b744cbcaSCameron Smith } 54759599516SKenneth E. Jansen } 54859599516SKenneth E. Jansen return mhsize; 54959599516SKenneth E. Jansen } 55059599516SKenneth E. Jansen 55159599516SKenneth E. Jansen /** 55259599516SKenneth E. Jansen * Computes correct color of a rank according to number of files. 55359599516SKenneth E. Jansen */ 55459599516SKenneth E. Jansen extern "C" int computeColor( int myrank, int numprocs, int nfiles) { 55559599516SKenneth E. Jansen int color = 55659599516SKenneth E. Jansen (int)(myrank / (numprocs / nfiles)); 55759599516SKenneth E. Jansen return color; 55859599516SKenneth E. Jansen } 55959599516SKenneth E. Jansen 56059599516SKenneth E. Jansen 56159599516SKenneth E. Jansen /** 56259599516SKenneth E. Jansen * Check the file descriptor. 56359599516SKenneth E. Jansen */ 564103be424SCameron Smith void checkFileDescriptor(const char fctname[], int* fileDescriptor ) { 56559599516SKenneth E. Jansen if ( *fileDescriptor < 0 ) { 56659599516SKenneth E. Jansen printf("Error: File descriptor = %d in %s\n",*fileDescriptor,fctname); 56759599516SKenneth E. Jansen exit(1); 56859599516SKenneth E. Jansen } 56959599516SKenneth E. Jansen } 57059599516SKenneth E. Jansen 57159599516SKenneth E. Jansen /** 57259599516SKenneth E. Jansen * Initialize the file struct members and allocate space for file struct 57359599516SKenneth E. Jansen * buffers. 57459599516SKenneth E. Jansen * 57559599516SKenneth E. Jansen * Note: this function is only called when we are using new format. Old POSIX 57659599516SKenneth E. Jansen * format should skip this routine and call openfile() directly instead. 57759599516SKenneth E. Jansen */ 57859599516SKenneth E. Jansen int initphmpiio( int *nfields, int *nppf, int *nfiles, int *filehandle, const char mode[]) 57959599516SKenneth E. Jansen { 58059599516SKenneth E. Jansen // we init irank again in case query not called (e.g. syncIO write case) 58159599516SKenneth E. Jansen MPI_Comm_rank(MPI_COMM_WORLD, &irank); 58259599516SKenneth E. Jansen MPI_Comm_size(MPI_COMM_WORLD, &mysize); 58359599516SKenneth E. Jansen 584a746c838SCameron Smith phprintf("Info initphmpiio: entering function, myrank = %d, MasterHeaderSize = %d, nfields %d, nppf %d, nfiles %d\n", irank, MasterHeaderSize, *nfields, *nppf, *nfiles); 58559599516SKenneth E. Jansen 58659599516SKenneth E. Jansen double timer_start, timer_end; 58759599516SKenneth E. Jansen startTimer(&timer_start); 58859599516SKenneth E. Jansen 58959599516SKenneth E. Jansen char* imode = StringStripper( mode ); 59059599516SKenneth E. Jansen 59159599516SKenneth E. Jansen // Note: if it's read, we presume query was called prior to init and 59259599516SKenneth E. Jansen // MasterHeaderSize is already set to correct value from parsing header 59359599516SKenneth E. Jansen // otherwise it's write then it needs some computation to be set 59459599516SKenneth E. Jansen if ( cscompare( "read", imode ) ) { 59559599516SKenneth E. Jansen // do nothing 59659599516SKenneth E. Jansen } 59759599516SKenneth E. Jansen else if( cscompare( "write", imode ) ) { 59859599516SKenneth E. Jansen MasterHeaderSize = computeMHSize(*nfields, *nppf, LATEST_WRITE_VERSION); 59959599516SKenneth E. Jansen } 60059599516SKenneth E. Jansen else { 60159599516SKenneth E. Jansen printf("Error initphmpiio: can't recognize the mode %s", imode); 60259599516SKenneth E. Jansen exit(1); 60359599516SKenneth E. Jansen } 60459599516SKenneth E. Jansen free ( imode ); 60559599516SKenneth E. Jansen 606a746c838SCameron Smith phprintf("Info initphmpiio: myrank = %d, MasterHeaderSize = %d\n", irank, MasterHeaderSize); 60759599516SKenneth E. Jansen 60859599516SKenneth E. Jansen int i, j; 60959599516SKenneth E. Jansen 61059599516SKenneth E. Jansen if( PhastaIONextActiveIndex == MAX_PHASTA_FILES ) { 61159599516SKenneth E. Jansen printf("Error initphmpiio: PhastaIONextActiveIndex = MAX_PHASTA_FILES"); 61259599516SKenneth E. Jansen endTimer(&timer_end); 61359599516SKenneth E. Jansen printPerf("initphmpiio", timer_start, timer_end, 0, 0, ""); 61459599516SKenneth E. Jansen return MAX_PHASTA_FILES_EXCEEDED; 61559599516SKenneth E. Jansen } 61659599516SKenneth E. Jansen // else if( PhastaIONextActiveIndex == 0 ) //Hang in debug mode on Intrepid 61759599516SKenneth E. Jansen // { 61859599516SKenneth E. Jansen // for( i = 0; i < MAX_PHASTA_FILES; i++ ); 61959599516SKenneth E. Jansen // { 62059599516SKenneth E. Jansen // PhastaIOActiveFiles[i] = NULL; 62159599516SKenneth E. Jansen // } 62259599516SKenneth E. Jansen // } 62359599516SKenneth E. Jansen 62459599516SKenneth E. Jansen 62559599516SKenneth E. Jansen PhastaIOActiveFiles[PhastaIONextActiveIndex] = (phastaio_file_t *)calloc( 1, sizeof( phastaio_file_t) ); 62659599516SKenneth E. Jansen 62759599516SKenneth E. Jansen i = PhastaIONextActiveIndex; 62859599516SKenneth E. Jansen PhastaIONextActiveIndex++; 62959599516SKenneth E. Jansen 63059599516SKenneth E. Jansen //PhastaIOActiveFiles[i]->next_start_address = 2*TWO_MEGABYTE; 63159599516SKenneth E. Jansen 63259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->next_start_address = MasterHeaderSize; // what does this mean??? TODO 63359599516SKenneth E. Jansen 63459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->Wrong_Endian = false; 63559599516SKenneth E. Jansen 63659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFields = *nfields; 63759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nPPF = *nppf; 63859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFiles = *nfiles; 63959599516SKenneth E. Jansen MPI_Comm_rank(MPI_COMM_WORLD, &(PhastaIOActiveFiles[i]->myrank)); 64059599516SKenneth E. Jansen MPI_Comm_size(MPI_COMM_WORLD, &(PhastaIOActiveFiles[i]->numprocs)); 64159599516SKenneth E. Jansen 64259599516SKenneth E. Jansen 64359599516SKenneth E. Jansen if( *nfiles > 1 ) { // split the ranks according to each mpiio file 64459599516SKenneth E. Jansen 64559599516SKenneth E. Jansen if ( s_assign_local_comm == 0) { // call mpi_comm_split for the first (and only) time 64659599516SKenneth E. Jansen 64759599516SKenneth E. Jansen if (PhastaIOActiveFiles[i]->myrank == 0) printf("Building subcommunicator\n"); 64859599516SKenneth E. Jansen 64959599516SKenneth E. Jansen int color = computeColor(PhastaIOActiveFiles[i]->myrank, PhastaIOActiveFiles[i]->numprocs, PhastaIOActiveFiles[i]->nFiles); 65059599516SKenneth E. Jansen MPI_Comm_split(MPI_COMM_WORLD, 65159599516SKenneth E. Jansen color, 65259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->myrank, 65359599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_comm)); 65459599516SKenneth E. Jansen MPI_Comm_size(PhastaIOActiveFiles[i]->local_comm, 65559599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_numprocs)); 65659599516SKenneth E. Jansen MPI_Comm_rank(PhastaIOActiveFiles[i]->local_comm, 65759599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_myrank)); 65859599516SKenneth E. Jansen 65959599516SKenneth E. Jansen // back up now these variables so that we do not need to call comm_split again 66059599516SKenneth E. Jansen s_local_comm = PhastaIOActiveFiles[i]->local_comm; 66159599516SKenneth E. Jansen s_local_size = PhastaIOActiveFiles[i]->local_numprocs; 66259599516SKenneth E. Jansen s_local_rank = PhastaIOActiveFiles[i]->local_myrank; 66359599516SKenneth E. Jansen s_assign_local_comm = 1; 66459599516SKenneth E. Jansen } 66559599516SKenneth E. Jansen else { // recycle the subcommunicator 66659599516SKenneth E. Jansen if (PhastaIOActiveFiles[i]->myrank == 0) printf("Recycling subcommunicator\n"); 66759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm = s_local_comm; 66859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_numprocs = s_local_size; 66959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_myrank = s_local_rank; 67059599516SKenneth E. Jansen } 67159599516SKenneth E. Jansen } 67259599516SKenneth E. Jansen else { // *nfiles == 1 here - no need to call mpi_comm_split here 67359599516SKenneth E. Jansen 67459599516SKenneth E. Jansen if (PhastaIOActiveFiles[i]->myrank == 0) printf("Bypassing subcommunicator\n"); 67559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm = MPI_COMM_WORLD; 67659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_numprocs = PhastaIOActiveFiles[i]->numprocs; 67759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_myrank = PhastaIOActiveFiles[i]->myrank; 67859599516SKenneth E. Jansen 67959599516SKenneth E. Jansen } 68059599516SKenneth E. Jansen 68159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp = 68259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nPPF/PhastaIOActiveFiles[i]->local_numprocs; 68359599516SKenneth E. Jansen 68459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->start_id = PhastaIOActiveFiles[i]->nPPF * 68559599516SKenneth E. Jansen (int)(PhastaIOActiveFiles[i]->myrank/PhastaIOActiveFiles[i]->local_numprocs) + 68659599516SKenneth E. Jansen (PhastaIOActiveFiles[i]->local_myrank * PhastaIOActiveFiles[i]->nppp); 68759599516SKenneth E. Jansen 68859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset_table = 6892dd307a1SCameron Smith ( unsigned long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long *) ); 69059599516SKenneth E. Jansen 69159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table = 6922dd307a1SCameron Smith ( unsigned long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long *) ); 69359599516SKenneth E. Jansen 69459599516SKenneth E. Jansen for (j=0; j<*nfields; j++) 69559599516SKenneth E. Jansen { 69659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset_table[j] = 6972dd307a1SCameron Smith ( unsigned long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long) ); 69859599516SKenneth E. Jansen 69959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table[j] = 7002dd307a1SCameron Smith ( unsigned long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long) ); 70159599516SKenneth E. Jansen } 70259599516SKenneth E. Jansen *filehandle = i; 70359599516SKenneth E. Jansen 70459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header = (char *)calloc(MasterHeaderSize,sizeof( char )); 70559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk = (double *)calloc(1,sizeof( double )); 70659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk = (int *)calloc(1,sizeof( int )); 70759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_double_chunk = (double *)calloc(1,sizeof( double )); 70859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_int_chunk = (int *)calloc(1,sizeof( int )); 70959599516SKenneth E. Jansen 71059599516SKenneth E. Jansen // Time monitoring 71159599516SKenneth E. Jansen endTimer(&timer_end); 71259599516SKenneth E. Jansen printPerf("initphmpiio", timer_start, timer_end, 0, 0, ""); 71359599516SKenneth E. Jansen 71459599516SKenneth E. Jansen phprintf_0("Info initphmpiio: quiting function"); 71559599516SKenneth E. Jansen 71659599516SKenneth E. Jansen return i; 71759599516SKenneth E. Jansen } 71859599516SKenneth E. Jansen 71959599516SKenneth E. Jansen /** 72059599516SKenneth E. Jansen * Destruct the file struct and free buffers allocated in init function. 72159599516SKenneth E. Jansen */ 72259599516SKenneth E. Jansen void finalizephmpiio( int *fileDescriptor ) 72359599516SKenneth E. Jansen { 72459599516SKenneth E. Jansen double timer_start, timer_end; 72559599516SKenneth E. Jansen startTimer(&timer_start); 72659599516SKenneth E. Jansen 72759599516SKenneth E. Jansen int i, j; 72859599516SKenneth E. Jansen i = *fileDescriptor; 72959599516SKenneth E. Jansen //PhastaIONextActiveIndex--; 73059599516SKenneth E. Jansen 73159599516SKenneth E. Jansen /* //free the offset table for this phasta file */ 73259599516SKenneth E. Jansen //for(j=0; j<MAX_FIELDS_NUMBER; j++) //Danger: undefined behavior for my_*_table.[j] not allocated or not initialized to NULL 73359599516SKenneth E. Jansen for(j=0; j<PhastaIOActiveFiles[i]->nFields; j++) 73459599516SKenneth E. Jansen { 73559599516SKenneth E. Jansen free( PhastaIOActiveFiles[i]->my_offset_table[j]); 73659599516SKenneth E. Jansen free( PhastaIOActiveFiles[i]->my_read_table[j]); 73759599516SKenneth E. Jansen } 73859599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->my_offset_table ); 73959599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->my_read_table ); 74059599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->master_header ); 74159599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->double_chunk ); 74259599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->int_chunk ); 74359599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->read_double_chunk ); 74459599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->read_int_chunk ); 74559599516SKenneth E. Jansen 746946a6cddSCameron Smith if( PhastaIOActiveFiles[i]->nFiles > 1 && s_assign_local_comm ) { // the comm was split 747946a6cddSCameron Smith if (PhastaIOActiveFiles[i]->myrank == 0) printf("Freeing subcommunicator\n"); 748946a6cddSCameron Smith s_assign_local_comm = 0; 749946a6cddSCameron Smith MPI_Comm_free(&(PhastaIOActiveFiles[i]->local_comm)); 750946a6cddSCameron Smith } 751946a6cddSCameron Smith 75259599516SKenneth E. Jansen free( PhastaIOActiveFiles[i]); 75359599516SKenneth E. Jansen 75459599516SKenneth E. Jansen endTimer(&timer_end); 75559599516SKenneth E. Jansen printPerf("finalizempiio", timer_start, timer_end, 0, 0, ""); 75659599516SKenneth E. Jansen 75759599516SKenneth E. Jansen PhastaIONextActiveIndex--; 75859599516SKenneth E. Jansen } 75959599516SKenneth E. Jansen 76059599516SKenneth E. Jansen 76159599516SKenneth E. Jansen /** 76259599516SKenneth E. Jansen * Special init for M2N in order to create a subcommunicator for the reduced solution (requires PRINT_PERF to be false for now) 76359599516SKenneth E. Jansen * Initialize the file struct members and allocate space for file struct buffers. 76459599516SKenneth E. Jansen * 76559599516SKenneth E. Jansen * Note: this function is only called when we are using new format. Old POSIX 76659599516SKenneth E. Jansen * format should skip this routine and call openfile() directly instead. 76759599516SKenneth E. Jansen */ 76859599516SKenneth E. Jansen int initphmpiiosub( int *nfields, int *nppf, int *nfiles, int *filehandle, const char mode[],MPI_Comm my_local_comm) 76959599516SKenneth E. Jansen { 77059599516SKenneth E. Jansen // we init irank again in case query not called (e.g. syncIO write case) 77159599516SKenneth E. Jansen 77259599516SKenneth E. Jansen MPI_Comm_rank(my_local_comm, &irank); 77359599516SKenneth E. Jansen MPI_Comm_size(my_local_comm, &mysize); 77459599516SKenneth E. Jansen 775a746c838SCameron Smith phprintf("Info initphmpiio: entering function, myrank = %d, MasterHeaderSize = %d\n", irank, MasterHeaderSize); 77659599516SKenneth E. Jansen 77759599516SKenneth E. Jansen double timer_start, timer_end; 77859599516SKenneth E. Jansen startTimer(&timer_start); 77959599516SKenneth E. Jansen 78059599516SKenneth E. Jansen char* imode = StringStripper( mode ); 78159599516SKenneth E. Jansen 78259599516SKenneth E. Jansen // Note: if it's read, we presume query was called prior to init and 78359599516SKenneth E. Jansen // MasterHeaderSize is already set to correct value from parsing header 78459599516SKenneth E. Jansen // otherwise it's write then it needs some computation to be set 78559599516SKenneth E. Jansen if ( cscompare( "read", imode ) ) { 78659599516SKenneth E. Jansen // do nothing 78759599516SKenneth E. Jansen } 78859599516SKenneth E. Jansen else if( cscompare( "write", imode ) ) { 78959599516SKenneth E. Jansen MasterHeaderSize = computeMHSize(*nfields, *nppf, LATEST_WRITE_VERSION); 79059599516SKenneth E. Jansen } 79159599516SKenneth E. Jansen else { 79259599516SKenneth E. Jansen printf("Error initphmpiio: can't recognize the mode %s", imode); 79359599516SKenneth E. Jansen exit(1); 79459599516SKenneth E. Jansen } 79559599516SKenneth E. Jansen free ( imode ); 79659599516SKenneth E. Jansen 797a746c838SCameron Smith phprintf("Info initphmpiio: myrank = %d, MasterHeaderSize = %d\n", irank, MasterHeaderSize); 79859599516SKenneth E. Jansen 79959599516SKenneth E. Jansen int i, j; 80059599516SKenneth E. Jansen 80159599516SKenneth E. Jansen if( PhastaIONextActiveIndex == MAX_PHASTA_FILES ) { 80259599516SKenneth E. Jansen printf("Error initphmpiio: PhastaIONextActiveIndex = MAX_PHASTA_FILES"); 80359599516SKenneth E. Jansen endTimer(&timer_end); 80459599516SKenneth E. Jansen printPerf("initphmpiio", timer_start, timer_end, 0, 0, ""); 80559599516SKenneth E. Jansen return MAX_PHASTA_FILES_EXCEEDED; 80659599516SKenneth E. Jansen } 80759599516SKenneth E. Jansen // else if( PhastaIONextActiveIndex == 0 ) //Hang in debug mode on Intrepid 80859599516SKenneth E. Jansen // { 80959599516SKenneth E. Jansen // for( i = 0; i < MAX_PHASTA_FILES; i++ ); 81059599516SKenneth E. Jansen // { 81159599516SKenneth E. Jansen // PhastaIOActiveFiles[i] = NULL; 81259599516SKenneth E. Jansen // } 81359599516SKenneth E. Jansen // } 81459599516SKenneth E. Jansen 81559599516SKenneth E. Jansen 81659599516SKenneth E. Jansen PhastaIOActiveFiles[PhastaIONextActiveIndex] = (phastaio_file_t *)calloc( 1, sizeof( phastaio_file_t) ); 81759599516SKenneth E. Jansen 81859599516SKenneth E. Jansen i = PhastaIONextActiveIndex; 81959599516SKenneth E. Jansen PhastaIONextActiveIndex++; 82059599516SKenneth E. Jansen 82159599516SKenneth E. Jansen //PhastaIOActiveFiles[i]->next_start_address = 2*TWO_MEGABYTE; 82259599516SKenneth E. Jansen 82359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->next_start_address = MasterHeaderSize; // what does this mean??? TODO 82459599516SKenneth E. Jansen 82559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->Wrong_Endian = false; 82659599516SKenneth E. Jansen 82759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFields = *nfields; 82859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nPPF = *nppf; 82959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFiles = *nfiles; 83059599516SKenneth E. Jansen MPI_Comm_rank(my_local_comm, &(PhastaIOActiveFiles[i]->myrank)); 83159599516SKenneth E. Jansen MPI_Comm_size(my_local_comm, &(PhastaIOActiveFiles[i]->numprocs)); 83259599516SKenneth E. Jansen 83359599516SKenneth E. Jansen int color = computeColor(PhastaIOActiveFiles[i]->myrank, PhastaIOActiveFiles[i]->numprocs, PhastaIOActiveFiles[i]->nFiles); 83459599516SKenneth E. Jansen MPI_Comm_split(my_local_comm, 83559599516SKenneth E. Jansen color, 83659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->myrank, 83759599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_comm)); 83859599516SKenneth E. Jansen MPI_Comm_size(PhastaIOActiveFiles[i]->local_comm, 83959599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_numprocs)); 84059599516SKenneth E. Jansen MPI_Comm_rank(PhastaIOActiveFiles[i]->local_comm, 84159599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_myrank)); 84259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp = 84359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nPPF/PhastaIOActiveFiles[i]->local_numprocs; 84459599516SKenneth E. Jansen 84559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->start_id = PhastaIOActiveFiles[i]->nPPF * 84659599516SKenneth E. Jansen (int)(PhastaIOActiveFiles[i]->myrank/PhastaIOActiveFiles[i]->local_numprocs) + 84759599516SKenneth E. Jansen (PhastaIOActiveFiles[i]->local_myrank * PhastaIOActiveFiles[i]->nppp); 84859599516SKenneth E. Jansen 84959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset_table = 8502dd307a1SCameron Smith ( unsigned long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long *) ); 85159599516SKenneth E. Jansen 85259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table = 8532dd307a1SCameron Smith ( unsigned long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long *) ); 85459599516SKenneth E. Jansen 85559599516SKenneth E. Jansen for (j=0; j<*nfields; j++) 85659599516SKenneth E. Jansen { 85759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset_table[j] = 8582dd307a1SCameron Smith ( unsigned long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long) ); 85959599516SKenneth E. Jansen 86059599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table[j] = 8612dd307a1SCameron Smith ( unsigned long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long) ); 86259599516SKenneth E. Jansen } 86359599516SKenneth E. Jansen *filehandle = i; 86459599516SKenneth E. Jansen 86559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header = (char *)calloc(MasterHeaderSize,sizeof( char )); 86659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk = (double *)calloc(1,sizeof( double )); 86759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk = (int *)calloc(1,sizeof( int )); 86859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_double_chunk = (double *)calloc(1,sizeof( double )); 86959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_int_chunk = (int *)calloc(1,sizeof( int )); 87059599516SKenneth E. Jansen 87159599516SKenneth E. Jansen // Time monitoring 87259599516SKenneth E. Jansen endTimer(&timer_end); 87359599516SKenneth E. Jansen printPerf("initphmpiiosub", timer_start, timer_end, 0, 0, ""); 87459599516SKenneth E. Jansen 87559599516SKenneth E. Jansen phprintf_0("Info initphmpiiosub: quiting function"); 87659599516SKenneth E. Jansen 87759599516SKenneth E. Jansen return i; 87859599516SKenneth E. Jansen } 87959599516SKenneth E. Jansen 8804600f8abSCameron Smith namespace { 88159599516SKenneth E. Jansen 8824600f8abSCameron Smith enum { 8834600f8abSCameron Smith DIR_MODE = S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH 8844600f8abSCameron Smith }; 8854600f8abSCameron Smith 886*5f4c514aSCameron Smith bool my_mkdir(std::string name) { 887*5f4c514aSCameron Smith if(name.empty()) 888*5f4c514aSCameron Smith return true; 8894600f8abSCameron Smith errno = 0; 890*5f4c514aSCameron Smith int err = mkdir(name.c_str(), DIR_MODE); 8914600f8abSCameron Smith if ((err == -1) && (errno == EEXIST)) { 8924600f8abSCameron Smith errno = 0; 8934600f8abSCameron Smith err = 0; 8944600f8abSCameron Smith return false; 8954600f8abSCameron Smith } 8964600f8abSCameron Smith assert(!err); 8974600f8abSCameron Smith return true; 8984600f8abSCameron Smith } 8994600f8abSCameron Smith 9004600f8abSCameron Smith enum { 9014600f8abSCameron Smith DIR_FANOUT = 2048 9024600f8abSCameron Smith }; 9034600f8abSCameron Smith 9044600f8abSCameron Smith std::string getSubDirPrefix() { 9054600f8abSCameron Smith if (phio_peers() <= DIR_FANOUT) 9064600f8abSCameron Smith return string(""); 9074600f8abSCameron Smith int self = phio_self(); 9084600f8abSCameron Smith int subSelf = self % DIR_FANOUT; 9094600f8abSCameron Smith int subGroup = self / DIR_FANOUT; 9104600f8abSCameron Smith std::stringstream ss; 9114600f8abSCameron Smith ss << subGroup << '/'; 9124600f8abSCameron Smith return ss.str(); 9134600f8abSCameron Smith } 9144600f8abSCameron Smith } 91559599516SKenneth E. Jansen 91659599516SKenneth E. Jansen /** open file for both POSIX and MPI-IO syncIO format. 91759599516SKenneth E. Jansen * 91859599516SKenneth E. Jansen * If it's old POSIX format, simply call posix fopen(). 91959599516SKenneth E. Jansen * 92059599516SKenneth E. Jansen * If it's MPI-IO foramt: 92159599516SKenneth E. Jansen * in "read" mode, it builds the header table that points to the offset of 92259599516SKenneth E. Jansen * fields for parts; 92359599516SKenneth E. Jansen * in "write" mode, it opens the file with MPI-IO open routine. 92459599516SKenneth E. Jansen */ 925103be424SCameron Smith void openfile(const char filename[], const char mode[], int* fileDescriptor ) 92659599516SKenneth E. Jansen { 92759599516SKenneth E. Jansen phprintf_0("Info: entering openfile"); 92859599516SKenneth E. Jansen 92959599516SKenneth E. Jansen double timer_start, timer_end; 93059599516SKenneth E. Jansen startTimer(&timer_start); 93159599516SKenneth E. Jansen 93259599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) 93359599516SKenneth E. Jansen { 93459599516SKenneth E. Jansen FILE* file=NULL ; 93559599516SKenneth E. Jansen *fileDescriptor = 0; 93659599516SKenneth E. Jansen char* fname = StringStripper( filename ); 93759599516SKenneth E. Jansen char* imode = StringStripper( mode ); 93859599516SKenneth E. Jansen 9394600f8abSCameron Smith std::string posixname = getSubDirPrefix(); 9404600f8abSCameron Smith if (!phio_self()) 941*5f4c514aSCameron Smith my_mkdir(posixname); 9424600f8abSCameron Smith phio_barrier(); 9434600f8abSCameron Smith posixname += string(fname); 944389f1f6aSCameron Smith phioTime t0,t1; 945389f1f6aSCameron Smith phastaio_time(&t0); 9464600f8abSCameron Smith if ( cscompare( "read", imode ) ) 9474600f8abSCameron Smith file = fopen(posixname.c_str(), "rb" ); 9484600f8abSCameron Smith else if( cscompare( "write", imode ) ) 9494600f8abSCameron Smith file = fopen(posixname.c_str(), "wb" ); 9504600f8abSCameron Smith else if( cscompare( "append", imode ) ) 9514600f8abSCameron Smith file = fopen(posixname.c_str(), "ab" ); 952389f1f6aSCameron Smith phastaio_time(&t1); 953389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 954389f1f6aSCameron Smith phastaio_addOpenTime(elapsed); 95559599516SKenneth E. Jansen 95659599516SKenneth E. Jansen if ( !file ){ 95767701978SCameron Smith fprintf(stderr,"Error openfile: unable to open file %s\n",fname); 95859599516SKenneth E. Jansen } else { 95959599516SKenneth E. Jansen fileArray.push_back( file ); 96059599516SKenneth E. Jansen byte_order.push_back( false ); 96159599516SKenneth E. Jansen header_type.push_back( sizeof(int) ); 96259599516SKenneth E. Jansen *fileDescriptor = fileArray.size(); 96359599516SKenneth E. Jansen } 96459599516SKenneth E. Jansen free (fname); 96559599516SKenneth E. Jansen free (imode); 96659599516SKenneth E. Jansen } 96759599516SKenneth E. Jansen else // else it would be parallel I/O, opposed to posix io 96859599516SKenneth E. Jansen { 96959599516SKenneth E. Jansen char* fname = StringStripper( filename ); 97059599516SKenneth E. Jansen char* imode = StringStripper( mode ); 97159599516SKenneth E. Jansen int rc; 97259599516SKenneth E. Jansen int i = *fileDescriptor; 97359599516SKenneth E. Jansen checkFileDescriptor("openfile",&i); 97459599516SKenneth E. Jansen char* token; 97559599516SKenneth E. Jansen 97659599516SKenneth E. Jansen if ( cscompare( "read", imode ) ) 97759599516SKenneth E. Jansen { 97859599516SKenneth E. Jansen // if (PhastaIOActiveFiles[i]->myrank == 0) 97959599516SKenneth E. Jansen // printf("\n **********\nRead open ... ... regular version\n"); 98059599516SKenneth E. Jansen 981389f1f6aSCameron Smith phioTime t0,t1; 982389f1f6aSCameron Smith phastaio_time(&t0); 98359599516SKenneth E. Jansen rc = MPI_File_open( PhastaIOActiveFiles[i]->local_comm, 98459599516SKenneth E. Jansen fname, 98559599516SKenneth E. Jansen MPI_MODE_RDONLY, 98659599516SKenneth E. Jansen MPI_INFO_NULL, 98759599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->file_handle) ); 988389f1f6aSCameron Smith phastaio_time(&t1); 989389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 990389f1f6aSCameron Smith phastaio_addOpenTime(elapsed); 99159599516SKenneth E. Jansen 99259599516SKenneth E. Jansen if(rc) 99359599516SKenneth E. Jansen { 99459599516SKenneth E. Jansen *fileDescriptor = UNABLE_TO_OPEN_FILE; 9954d60bba2SCameron Smith int error_string_length; 9964d60bba2SCameron Smith char error_string[4096]; 9974d60bba2SCameron Smith MPI_Error_string(rc, error_string, &error_string_length); 9984d60bba2SCameron Smith fprintf(stderr, "Error openfile: Unable to open file %s! MPI reports \"%s\"\n",fname,error_string); 99959599516SKenneth E. Jansen endTimer(&timer_end); 100059599516SKenneth E. Jansen printPerf("openfile", timer_start, timer_end, 0, 0, ""); 100159599516SKenneth E. Jansen return; 100259599516SKenneth E. Jansen } 100359599516SKenneth E. Jansen 100459599516SKenneth E. Jansen MPI_Status read_tag_status; 100559599516SKenneth E. Jansen char read_out_tag[MAX_FIELDS_NAME_LENGTH]; 100659599516SKenneth E. Jansen int j; 100759599516SKenneth E. Jansen int magic_number; 100859599516SKenneth E. Jansen 100959599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) { 101059599516SKenneth E. Jansen MPI_File_read_at( PhastaIOActiveFiles[i]->file_handle, 101159599516SKenneth E. Jansen 0, 101259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header, 101359599516SKenneth E. Jansen MasterHeaderSize, 101459599516SKenneth E. Jansen MPI_CHAR, 101559599516SKenneth E. Jansen &read_tag_status ); 101659599516SKenneth E. Jansen } 101759599516SKenneth E. Jansen 101859599516SKenneth E. Jansen MPI_Bcast( PhastaIOActiveFiles[i]->master_header, 101959599516SKenneth E. Jansen MasterHeaderSize, 102059599516SKenneth E. Jansen MPI_CHAR, 102159599516SKenneth E. Jansen 0, 102259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm ); 102359599516SKenneth E. Jansen 102459599516SKenneth E. Jansen memcpy( read_out_tag, 102559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header, 102659599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH-1 ); 102759599516SKenneth E. Jansen 102859599516SKenneth E. Jansen if ( cscompare ("MPI_IO_Tag",read_out_tag) ) 102959599516SKenneth E. Jansen { 103059599516SKenneth E. Jansen // Test endianess ... 103159599516SKenneth E. Jansen memcpy ( &magic_number, 103259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header+sizeof("MPI_IO_Tag : ")-1, //-1 sizeof returns the size of the string+1 for "\0" 103359599516SKenneth E. Jansen sizeof(int) ); // masterheader should look like "MPI_IO_Tag : 12180 " with 12180 in binary format 103459599516SKenneth E. Jansen 103559599516SKenneth E. Jansen if ( magic_number != ENDIAN_TEST_NUMBER ) 103659599516SKenneth E. Jansen { 103759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->Wrong_Endian = true; 103859599516SKenneth E. Jansen } 103959599516SKenneth E. Jansen 104059599516SKenneth E. Jansen memcpy( read_out_tag, 104159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header+MAX_FIELDS_NAME_LENGTH+1, // TODO: WHY +1??? 104259599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH ); 104359599516SKenneth E. Jansen 104459599516SKenneth E. Jansen // Read in # fields ... 104559599516SKenneth E. Jansen token = strtok ( read_out_tag, ":" ); 104659599516SKenneth E. Jansen token = strtok( NULL," ,;<>" ); 104759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFields = atoi( token ); 104859599516SKenneth E. Jansen 10492dd307a1SCameron Smith unsigned long **header_table; 10502dd307a1SCameron Smith header_table = ( unsigned long ** )calloc(PhastaIOActiveFiles[i]->nFields, sizeof(unsigned long *)); 105159599516SKenneth E. Jansen 105259599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) 105359599516SKenneth E. Jansen { 10542dd307a1SCameron Smith header_table[j]=( unsigned long * ) calloc( PhastaIOActiveFiles[i]->nPPF , sizeof( unsigned long)); 105559599516SKenneth E. Jansen } 105659599516SKenneth E. Jansen 105759599516SKenneth E. Jansen // Read in the offset table ... 105859599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) 105959599516SKenneth E. Jansen { 106059599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) { 106159599516SKenneth E. Jansen memcpy( header_table[j], 106259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header + 106359599516SKenneth E. Jansen VERSION_INFO_HEADER_SIZE + 10642dd307a1SCameron Smith j * PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long), 10652dd307a1SCameron Smith PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long) ); 106659599516SKenneth E. Jansen } 106759599516SKenneth E. Jansen 106859599516SKenneth E. Jansen MPI_Scatter( header_table[j], 106959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp, 107059599516SKenneth E. Jansen MPI_LONG_LONG_INT, 107159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table[j], 107259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp, 107359599516SKenneth E. Jansen MPI_LONG_LONG_INT, 107459599516SKenneth E. Jansen 0, 107559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm ); 107659599516SKenneth E. Jansen 107759599516SKenneth E. Jansen // Swap byte order if endianess is different ... 107859599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->Wrong_Endian ) { 107959599516SKenneth E. Jansen SwapArrayByteOrder( PhastaIOActiveFiles[i]->my_read_table[j], 10804187599aSCameron Smith sizeof(unsigned long), 108159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp ); 108259599516SKenneth E. Jansen } 108359599516SKenneth E. Jansen } 108459599516SKenneth E. Jansen 108559599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) { 108659599516SKenneth E. Jansen free ( header_table[j] ); 108759599516SKenneth E. Jansen } 108859599516SKenneth E. Jansen free (header_table); 108959599516SKenneth E. Jansen 109059599516SKenneth E. Jansen } // end of if MPI_IO_TAG 109159599516SKenneth E. Jansen else //else not valid MPI file 109259599516SKenneth E. Jansen { 109359599516SKenneth E. Jansen *fileDescriptor = NOT_A_MPI_FILE; 109459599516SKenneth 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); 109559599516SKenneth E. Jansen //Printing MasterHeaderSize is useful to test a compiler bug on Intrepid BGP 109659599516SKenneth E. Jansen endTimer(&timer_end); 109759599516SKenneth E. Jansen printPerf("openfile", timer_start, timer_end, 0, 0, ""); 109859599516SKenneth E. Jansen return; 109959599516SKenneth E. Jansen } 110059599516SKenneth E. Jansen } // end of if "read" 110159599516SKenneth E. Jansen else if( cscompare( "write", imode ) ) 110259599516SKenneth E. Jansen { 1103389f1f6aSCameron Smith phioTime t0,t1; 1104389f1f6aSCameron Smith phastaio_time(&t0); 110559599516SKenneth E. Jansen rc = MPI_File_open( PhastaIOActiveFiles[i]->local_comm, 110659599516SKenneth E. Jansen fname, 110759599516SKenneth E. Jansen MPI_MODE_WRONLY | MPI_MODE_CREATE, 110859599516SKenneth E. Jansen MPI_INFO_NULL, 110959599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->file_handle) ); 1110389f1f6aSCameron Smith phastaio_time(&t1); 1111389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 1112389f1f6aSCameron Smith phastaio_addOpenTime(elapsed); 11134d60bba2SCameron Smith if(rc != MPI_SUCCESS) 111459599516SKenneth E. Jansen { 111559599516SKenneth E. Jansen *fileDescriptor = UNABLE_TO_OPEN_FILE; 11164d60bba2SCameron Smith int error_string_length; 11174d60bba2SCameron Smith char error_string[4096]; 11184d60bba2SCameron Smith MPI_Error_string(rc, error_string, &error_string_length); 11194d60bba2SCameron Smith fprintf(stderr, "Error openfile: Unable to open file %s! MPI reports \"%s\"\n",fname,error_string); 112059599516SKenneth E. Jansen return; 112159599516SKenneth E. Jansen } 112259599516SKenneth E. Jansen } // end of if "write" 112359599516SKenneth E. Jansen free (fname); 112459599516SKenneth E. Jansen free (imode); 112559599516SKenneth E. Jansen } // end of if FileIndex != 0 112659599516SKenneth E. Jansen 112759599516SKenneth E. Jansen endTimer(&timer_end); 112859599516SKenneth E. Jansen printPerf("openfile", timer_start, timer_end, 0, 0, ""); 112959599516SKenneth E. Jansen } 113059599516SKenneth E. Jansen 113159599516SKenneth E. Jansen /** close file for both POSIX and MPI-IO syncIO format. 113259599516SKenneth E. Jansen * 113359599516SKenneth E. Jansen * If it's old POSIX format, simply call posix fclose(). 113459599516SKenneth E. Jansen * 113559599516SKenneth E. Jansen * If it's MPI-IO foramt: 113659599516SKenneth E. Jansen * in "read" mode, it simply close file with MPI-IO close routine. 113759599516SKenneth E. Jansen * in "write" mode, rank 0 in each group will re-assemble the master header and 113859599516SKenneth E. Jansen * offset table and write to the beginning of file, then close the file. 113959599516SKenneth E. Jansen */ 1140103be424SCameron Smith void closefile( int* fileDescriptor, const char mode[] ) 114159599516SKenneth E. Jansen { 114259599516SKenneth E. Jansen double timer_start, timer_end; 114359599516SKenneth E. Jansen startTimer(&timer_start); 114459599516SKenneth E. Jansen 114559599516SKenneth E. Jansen int i = *fileDescriptor; 114659599516SKenneth E. Jansen checkFileDescriptor("closefile",&i); 114759599516SKenneth E. Jansen 114859599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) { 114959599516SKenneth E. Jansen char* imode = StringStripper( mode ); 115059599516SKenneth E. Jansen 115159599516SKenneth E. Jansen if( cscompare( "write", imode ) 115259599516SKenneth E. Jansen || cscompare( "append", imode ) ) { 115359599516SKenneth E. Jansen fflush( fileArray[ *fileDescriptor - 1 ] ); 115459599516SKenneth E. Jansen } 115559599516SKenneth E. Jansen 1156389f1f6aSCameron Smith phioTime t0,t1; 1157389f1f6aSCameron Smith phastaio_time(&t0); 115859599516SKenneth E. Jansen fclose( fileArray[ *fileDescriptor - 1 ] ); 1159389f1f6aSCameron Smith phastaio_time(&t1); 1160389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 1161389f1f6aSCameron Smith phastaio_addCloseTime(elapsed); 116259599516SKenneth E. Jansen free (imode); 116359599516SKenneth E. Jansen } 116459599516SKenneth E. Jansen else { 116559599516SKenneth E. Jansen char* imode = StringStripper( mode ); 116659599516SKenneth E. Jansen 116759599516SKenneth E. Jansen //write master header here: 116859599516SKenneth E. Jansen if ( cscompare( "write", imode ) ) { 116959599516SKenneth E. Jansen // if ( PhastaIOActiveFiles[i]->nPPF * PhastaIOActiveFiles[i]->nFields < 2*ONE_MEGABYTE/8 ) //SHOULD BE CHECKED 117059599516SKenneth E. Jansen // MasterHeaderSize = 4*ONE_MEGABYTE; 117159599516SKenneth E. Jansen // else 117259599516SKenneth E. Jansen // MasterHeaderSize = 4*ONE_MEGABYTE + PhastaIOActiveFiles[i]->nPPF * PhastaIOActiveFiles[i]->nFields * 8 - 2*ONE_MEGABYTE; 117359599516SKenneth E. Jansen 117459599516SKenneth E. Jansen MasterHeaderSize = computeMHSize( PhastaIOActiveFiles[i]->nFields, PhastaIOActiveFiles[i]->nPPF, LATEST_WRITE_VERSION); 117559599516SKenneth E. Jansen phprintf_0("Info closefile: myrank = %d, MasterHeaderSize = %d\n", PhastaIOActiveFiles[i]->myrank, MasterHeaderSize); 117659599516SKenneth E. Jansen 117759599516SKenneth E. Jansen MPI_Status write_header_status; 117859599516SKenneth E. Jansen char mpi_tag[MAX_FIELDS_NAME_LENGTH]; 117959599516SKenneth E. Jansen char version[MAX_FIELDS_NAME_LENGTH/4]; 118059599516SKenneth E. Jansen char mhsize[MAX_FIELDS_NAME_LENGTH/4]; 118159599516SKenneth E. Jansen int magic_number = ENDIAN_TEST_NUMBER; 118259599516SKenneth E. Jansen 118359599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) 118459599516SKenneth E. Jansen { 118559599516SKenneth E. Jansen bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH); 118659599516SKenneth E. Jansen sprintf(mpi_tag, "MPI_IO_Tag : "); 118759599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->master_header, 118859599516SKenneth E. Jansen mpi_tag, 118959599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH); 119059599516SKenneth E. Jansen 119159599516SKenneth E. Jansen bzero((void*)version,MAX_FIELDS_NAME_LENGTH/4); 119259599516SKenneth E. Jansen // this version is "1", print version in ASCII 119359599516SKenneth E. Jansen sprintf(version, "version : %d",1); 119459599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->master_header + MAX_FIELDS_NAME_LENGTH/2, 119559599516SKenneth E. Jansen version, 119659599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH/4); 119759599516SKenneth E. Jansen 119859599516SKenneth E. Jansen // master header size is computed using the formula above 119959599516SKenneth E. Jansen bzero((void*)mhsize,MAX_FIELDS_NAME_LENGTH/4); 120059599516SKenneth E. Jansen sprintf(mhsize, "mhsize : "); 120159599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->master_header + MAX_FIELDS_NAME_LENGTH/4*3, 120259599516SKenneth E. Jansen mhsize, 120359599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH/4); 120459599516SKenneth E. Jansen 120559599516SKenneth E. Jansen bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH); 120659599516SKenneth E. Jansen sprintf(mpi_tag, 120759599516SKenneth E. Jansen "\nnFields : %d\n", 120859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFields); 120959599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->master_header+MAX_FIELDS_NAME_LENGTH, 121059599516SKenneth E. Jansen mpi_tag, 121159599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH); 121259599516SKenneth E. Jansen 121359599516SKenneth E. Jansen bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH); 121459599516SKenneth E. Jansen sprintf(mpi_tag, "\nnPPF : %d\n", PhastaIOActiveFiles[i]->nPPF); 121559599516SKenneth E. Jansen memcpy( PhastaIOActiveFiles[i]->master_header+ 121659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFields * 121759599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH + 121859599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH * 2, 121959599516SKenneth E. Jansen mpi_tag, 122059599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH); 122159599516SKenneth E. Jansen 122259599516SKenneth E. Jansen memcpy( PhastaIOActiveFiles[i]->master_header+sizeof("MPI_IO_Tag : ")-1, //-1 sizeof returns the size of the string+1 for "\0" 122359599516SKenneth E. Jansen &magic_number, 122459599516SKenneth E. Jansen sizeof(int)); 122559599516SKenneth E. Jansen 122659599516SKenneth E. Jansen memcpy( PhastaIOActiveFiles[i]->master_header+sizeof("mhsize : ") -1 + MAX_FIELDS_NAME_LENGTH/4*3, 122759599516SKenneth E. Jansen &MasterHeaderSize, 122859599516SKenneth E. Jansen sizeof(int)); 122959599516SKenneth E. Jansen } 123059599516SKenneth E. Jansen 123159599516SKenneth E. Jansen int j = 0; 12322dd307a1SCameron Smith unsigned long **header_table; 12332dd307a1SCameron Smith header_table = ( unsigned long ** )calloc(PhastaIOActiveFiles[i]->nFields, sizeof(unsigned long *)); 123459599516SKenneth E. Jansen 123559599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) { 12362dd307a1SCameron Smith header_table[j]=( unsigned long * ) calloc( PhastaIOActiveFiles[i]->nPPF , sizeof( unsigned long)); 123759599516SKenneth E. Jansen } 123859599516SKenneth E. Jansen 123959599516SKenneth E. Jansen //if( irank == 0 ) printf("gonna mpi_gather, myrank = %d\n", irank); 124059599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) { 124159599516SKenneth E. Jansen MPI_Gather( PhastaIOActiveFiles[i]->my_offset_table[j], 124259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp, 124359599516SKenneth E. Jansen MPI_LONG_LONG_INT, 124459599516SKenneth E. Jansen header_table[j], 124559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp, 124659599516SKenneth E. Jansen MPI_LONG_LONG_INT, 124759599516SKenneth E. Jansen 0, 124859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm ); 124959599516SKenneth E. Jansen } 125059599516SKenneth E. Jansen 125159599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) { 125259599516SKenneth E. Jansen 125359599516SKenneth E. Jansen //if( irank == 0 ) printf("gonna memcpy for every procs, myrank = %d\n", irank); 125459599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) { 125559599516SKenneth E. Jansen memcpy ( PhastaIOActiveFiles[i]->master_header + 125659599516SKenneth E. Jansen VERSION_INFO_HEADER_SIZE + 12572dd307a1SCameron Smith j * PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long), 125859599516SKenneth E. Jansen header_table[j], 12592dd307a1SCameron Smith PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long) ); 126059599516SKenneth E. Jansen } 126159599516SKenneth E. Jansen 126259599516SKenneth E. Jansen //if( irank == 0 ) printf("gonna file_write_at(), myrank = %d\n", irank); 126359599516SKenneth E. Jansen MPI_File_write_at( PhastaIOActiveFiles[i]->file_handle, 126459599516SKenneth E. Jansen 0, 126559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header, 126659599516SKenneth E. Jansen MasterHeaderSize, 126759599516SKenneth E. Jansen MPI_CHAR, 126859599516SKenneth E. Jansen &write_header_status ); 126959599516SKenneth E. Jansen } 127059599516SKenneth E. Jansen 127159599516SKenneth E. Jansen ////free(PhastaIOActiveFiles[i]->master_header); 127259599516SKenneth E. Jansen 127359599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) { 127459599516SKenneth E. Jansen free ( header_table[j] ); 127559599516SKenneth E. Jansen } 127659599516SKenneth E. Jansen free (header_table); 127759599516SKenneth E. Jansen } 127859599516SKenneth E. Jansen 127959599516SKenneth E. Jansen //if( irank == 0 ) printf("gonna file_close(), myrank = %d\n", irank); 1280389f1f6aSCameron Smith phioTime t0,t1; 1281389f1f6aSCameron Smith phastaio_time(&t0); 128259599516SKenneth E. Jansen MPI_File_close( &( PhastaIOActiveFiles[i]->file_handle ) ); 1283389f1f6aSCameron Smith phastaio_time(&t1); 1284389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 1285389f1f6aSCameron Smith phastaio_addCloseTime(elapsed); 128659599516SKenneth E. Jansen free ( imode ); 128759599516SKenneth E. Jansen } 128859599516SKenneth E. Jansen 128959599516SKenneth E. Jansen endTimer(&timer_end); 129059599516SKenneth E. Jansen printPerf("closefile_", timer_start, timer_end, 0, 0, ""); 129159599516SKenneth E. Jansen } 129259599516SKenneth E. Jansen 12933872e963SCameron Smith int readHeader( FILE* f, const char phrase[], 12943872e963SCameron Smith int* params, int numParams, const char* iotype) { 12953872e963SCameron Smith isBinary(iotype); 12963872e963SCameron Smith return readHeader(f,phrase,params,numParams); 12973872e963SCameron Smith } 12983872e963SCameron Smith 1299103be424SCameron Smith void readheader( 1300103be424SCameron Smith int* fileDescriptor, 130159599516SKenneth E. Jansen const char keyphrase[], 130259599516SKenneth E. Jansen void* valueArray, 130359599516SKenneth E. Jansen int* nItems, 130459599516SKenneth E. Jansen const char datatype[], 130559599516SKenneth E. Jansen const char iotype[] ) 130659599516SKenneth E. Jansen { 130759599516SKenneth E. Jansen double timer_start, timer_end; 1308d3337298SCameron Smith 130959599516SKenneth E. Jansen startTimer(&timer_start); 131059599516SKenneth E. Jansen 131159599516SKenneth E. Jansen int i = *fileDescriptor; 131259599516SKenneth E. Jansen checkFileDescriptor("readheader",&i); 131359599516SKenneth E. Jansen 131459599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) { 131559599516SKenneth E. Jansen int filePtr = *fileDescriptor - 1; 131659599516SKenneth E. Jansen FILE* fileObject; 131759599516SKenneth E. Jansen int* valueListInt; 131859599516SKenneth E. Jansen 131959599516SKenneth E. Jansen if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) { 132059599516SKenneth E. Jansen fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor); 132159599516SKenneth E. Jansen fprintf(stderr,"openfile_ function has to be called before \n") ; 132259599516SKenneth E. Jansen fprintf(stderr,"acessing the file\n ") ; 132359599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n"); 132459599516SKenneth E. Jansen endTimer(&timer_end); 132559599516SKenneth E. Jansen printPerf("readheader", timer_start, timer_end, 0, 0, ""); 132659599516SKenneth E. Jansen return; 132759599516SKenneth E. Jansen } 132859599516SKenneth E. Jansen 1329961a4ff6SCameron Smith LastHeaderKey[filePtr] = std::string(keyphrase); 133059599516SKenneth E. Jansen LastHeaderNotFound = false; 133159599516SKenneth E. Jansen 133259599516SKenneth E. Jansen fileObject = fileArray[ filePtr ] ; 133359599516SKenneth E. Jansen Wrong_Endian = byte_order[ filePtr ]; 133459599516SKenneth E. Jansen 133559599516SKenneth E. Jansen isBinary( iotype ); 133659599516SKenneth E. Jansen typeSize( datatype ); //redundant call, just avoid a compiler warning. 133759599516SKenneth E. Jansen 133859599516SKenneth E. Jansen // right now we are making the assumption that we will only write integers 133959599516SKenneth E. Jansen // on the header line. 134059599516SKenneth E. Jansen 134159599516SKenneth E. Jansen valueListInt = static_cast< int* >( valueArray ); 134259599516SKenneth E. Jansen int ierr = readHeader( fileObject , 134359599516SKenneth E. Jansen keyphrase, 134459599516SKenneth E. Jansen valueListInt, 134559599516SKenneth E. Jansen *nItems ) ; 134659599516SKenneth E. Jansen 134759599516SKenneth E. Jansen byte_order[ filePtr ] = Wrong_Endian ; 134859599516SKenneth E. Jansen 134959599516SKenneth E. Jansen if ( ierr ) LastHeaderNotFound = true; 135059599516SKenneth E. Jansen 135159599516SKenneth E. Jansen //return ; // don't return, go to the end to print perf 135259599516SKenneth E. Jansen } 135359599516SKenneth E. Jansen else { 135459599516SKenneth E. Jansen int* valueListInt; 135559599516SKenneth E. Jansen valueListInt = static_cast <int*>(valueArray); 1356400e9fc0SCameron Smith char* token = NULL; 135759599516SKenneth E. Jansen bool FOUND = false ; 135859599516SKenneth E. Jansen isBinary( iotype ); 135959599516SKenneth E. Jansen 136059599516SKenneth E. Jansen MPI_Status read_offset_status; 136159599516SKenneth E. Jansen char read_out_tag[MAX_FIELDS_NAME_LENGTH]; 1362400e9fc0SCameron Smith memset(read_out_tag, '\0', MAX_FIELDS_NAME_LENGTH); 136359599516SKenneth E. Jansen char readouttag[MAX_FIELDS_NUMBER][MAX_FIELDS_NAME_LENGTH]; 136459599516SKenneth E. Jansen int j; 136559599516SKenneth E. Jansen 136659599516SKenneth E. Jansen int string_length = strlen( keyphrase ); 136759599516SKenneth E. Jansen char* buffer = (char*) malloc ( string_length+1 ); 136859599516SKenneth E. Jansen 136959599516SKenneth E. Jansen strcpy ( buffer, keyphrase ); 137059599516SKenneth E. Jansen buffer[ string_length ] = '\0'; 137159599516SKenneth E. Jansen 137259599516SKenneth E. Jansen char* st2 = strtok ( buffer, "@" ); 137359599516SKenneth E. Jansen st2 = strtok (NULL, "@"); 137459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->GPid = atoi(st2); 137559599516SKenneth E. Jansen if ( char* p = strpbrk(buffer, "@") ) 137659599516SKenneth E. Jansen *p = '\0'; 137759599516SKenneth E. Jansen 137859599516SKenneth E. Jansen // Check if the user has input the right GPid 137959599516SKenneth E. Jansen if ( ( PhastaIOActiveFiles[i]->GPid <= 138059599516SKenneth E. Jansen PhastaIOActiveFiles[i]->myrank * 138159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp )|| 138259599516SKenneth E. Jansen ( PhastaIOActiveFiles[i]->GPid > 138359599516SKenneth E. Jansen ( PhastaIOActiveFiles[i]->myrank + 1 ) * 138459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp ) ) 138559599516SKenneth E. Jansen { 138659599516SKenneth E. Jansen *fileDescriptor = NOT_A_MPI_FILE; 138759599516SKenneth 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); 138859599516SKenneth E. Jansen // It is possible atoi could not generate a clear integer from st2 because of additional garbage character in keyphrase 138959599516SKenneth E. Jansen endTimer(&timer_end); 139059599516SKenneth E. Jansen printPerf("readheader", timer_start, timer_end, 0, 0, ""); 139159599516SKenneth E. Jansen return; 139259599516SKenneth E. Jansen } 139359599516SKenneth E. Jansen 139459599516SKenneth E. Jansen // Find the field we want ... 139559599516SKenneth E. Jansen //for ( j = 0; j<MAX_FIELDS_NUMBER; j++ ) 139659599516SKenneth E. Jansen for ( j = 0; j<PhastaIOActiveFiles[i]->nFields; j++ ) 139759599516SKenneth E. Jansen { 139859599516SKenneth E. Jansen memcpy( readouttag[j], 139959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header + j*MAX_FIELDS_NAME_LENGTH+MAX_FIELDS_NAME_LENGTH*2+1, 140059599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH-1 ); 140159599516SKenneth E. Jansen } 140259599516SKenneth E. Jansen 140359599516SKenneth E. Jansen for ( j = 0; j<PhastaIOActiveFiles[i]->nFields; j++ ) 140459599516SKenneth E. Jansen { 140559599516SKenneth E. Jansen token = strtok ( readouttag[j], ":" ); 140659599516SKenneth E. Jansen 140759599516SKenneth E. Jansen //if ( cscompare( buffer, token ) ) 140859599516SKenneth E. Jansen if ( cscompare( token , buffer ) && cscompare( buffer, token ) ) 140959599516SKenneth 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"). 141059599516SKenneth 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). 141159599516SKenneth 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. 141259599516SKenneth E. Jansen { 141359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_field_count = j; 141459599516SKenneth E. Jansen FOUND = true; 141559599516SKenneth E. Jansen //printf("buffer: %s | token: %s | j: %d\n",buffer,token,j); 141659599516SKenneth E. Jansen break; 141759599516SKenneth E. Jansen } 141859599516SKenneth E. Jansen } 141959599516SKenneth E. Jansen free(buffer); 142059599516SKenneth E. Jansen 142159599516SKenneth E. Jansen if (!FOUND) 142259599516SKenneth E. Jansen { 142359599516SKenneth E. Jansen //if(irank==0) printf("Warning readheader: Not found %s \n",keyphrase); //PhastaIOActiveFiles[i]->myrank is certainly initialized here. 142459599516SKenneth E. Jansen if(PhastaIOActiveFiles[i]->myrank == 0) printf("WARNING readheader: Not found %s\n",keyphrase); 142559599516SKenneth E. Jansen endTimer(&timer_end); 142659599516SKenneth E. Jansen printPerf("readheader", timer_start, timer_end, 0, 0, ""); 142759599516SKenneth E. Jansen return; 142859599516SKenneth E. Jansen } 142959599516SKenneth E. Jansen 143059599516SKenneth E. Jansen // Find the part we want ... 143159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_part_count = PhastaIOActiveFiles[i]->GPid - 143259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->myrank * PhastaIOActiveFiles[i]->nppp - 1; 143359599516SKenneth E. Jansen 143459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset = 143559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table[PhastaIOActiveFiles[i]->read_field_count][PhastaIOActiveFiles[i]->read_part_count]; 143659599516SKenneth E. Jansen 143759599516SKenneth E. Jansen // printf("****Rank %d offset is %d\n",PhastaIOActiveFiles[i]->myrank,PhastaIOActiveFiles[i]->my_offset); 143859599516SKenneth E. Jansen 143959599516SKenneth E. Jansen // Read each datablock header here ... 144059599516SKenneth E. Jansen 144159599516SKenneth E. Jansen MPI_File_read_at_all( PhastaIOActiveFiles[i]->file_handle, 144259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset+1, 144359599516SKenneth E. Jansen read_out_tag, 144459599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH-1, 144559599516SKenneth E. Jansen MPI_CHAR, 144659599516SKenneth E. Jansen &read_offset_status ); 144759599516SKenneth E. Jansen token = strtok ( read_out_tag, ":" ); 144859599516SKenneth E. Jansen 144959599516SKenneth E. Jansen // printf("&&&&Rank %d read_out_tag is %s\n",PhastaIOActiveFiles[i]->myrank,read_out_tag); 145059599516SKenneth E. Jansen 145159599516SKenneth 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. 145259599516SKenneth E. Jansen { 145359599516SKenneth E. Jansen FOUND = true ; 145459599516SKenneth E. Jansen token = strtok( NULL, " ,;<>" ); 145559599516SKenneth E. Jansen for( j=0; j < *nItems && ( token = strtok( NULL," ,;<>") ); j++ ) 145659599516SKenneth E. Jansen valueListInt[j] = atoi( token ); 145759599516SKenneth E. Jansen 145859599516SKenneth E. Jansen if ( j < *nItems ) 145959599516SKenneth E. Jansen { 146059599516SKenneth E. Jansen fprintf( stderr, "Expected # of ints not found for: %s\n", keyphrase ); 146159599516SKenneth E. Jansen } 146259599516SKenneth E. Jansen } 146359599516SKenneth E. Jansen else { 146459599516SKenneth E. Jansen //if(irank==0) 146559599516SKenneth E. Jansen if(PhastaIOActiveFiles[i]->myrank == 0) 146659599516SKenneth E. Jansen // If we enter this if, there is a problem with the name of some fields 146759599516SKenneth E. Jansen { 146859599516SKenneth E. Jansen printf("Error readheader: Unexpected mismatch between keyphrase = %s and token = %s\n",keyphrase,token); 146959599516SKenneth E. Jansen } 147059599516SKenneth E. Jansen } 147159599516SKenneth E. Jansen } 147259599516SKenneth E. Jansen 147359599516SKenneth E. Jansen endTimer(&timer_end); 147459599516SKenneth E. Jansen printPerf("readheader", timer_start, timer_end, 0, 0, ""); 147559599516SKenneth E. Jansen 147659599516SKenneth E. Jansen } 147759599516SKenneth E. Jansen 14783956dcfeSCameron Smith void readDataBlock( 14793956dcfeSCameron Smith FILE* fileObject, 14803956dcfeSCameron Smith void* valueArray, 14813956dcfeSCameron Smith int nItems, 14823956dcfeSCameron Smith const char datatype[], 14833956dcfeSCameron Smith const char iotype[] ) 14843956dcfeSCameron Smith { 14853956dcfeSCameron Smith isBinary(iotype); 14863956dcfeSCameron Smith size_t type_size = typeSize( datatype ); 1487389f1f6aSCameron Smith phioTime t0,t1; 1488389f1f6aSCameron Smith phastaio_time(&t0); 14893956dcfeSCameron Smith if ( binary_format ) { 14903956dcfeSCameron Smith char junk = '\0'; 14913956dcfeSCameron Smith fread( valueArray, type_size, nItems, fileObject ); 14923956dcfeSCameron Smith fread( &junk, sizeof(char), 1 , fileObject ); 14933956dcfeSCameron Smith if ( Wrong_Endian ) SwapArrayByteOrder( valueArray, type_size, nItems ); 14943956dcfeSCameron Smith } else { 14953956dcfeSCameron Smith char* ts1 = StringStripper( datatype ); 14963956dcfeSCameron Smith if ( cscompare( "integer", ts1 ) ) { 14973956dcfeSCameron Smith for( int n=0; n < nItems ; n++ ) 14983956dcfeSCameron Smith fscanf(fileObject, "%d\n",(int*)((int*)valueArray+n) ); 14993956dcfeSCameron Smith } else if ( cscompare( "double", ts1 ) ) { 15003956dcfeSCameron Smith for( int n=0; n < nItems ; n++ ) 15013956dcfeSCameron Smith fscanf(fileObject, "%lf\n",(double*)((double*)valueArray+n) ); 15023956dcfeSCameron Smith } 15033956dcfeSCameron Smith free (ts1); 15043956dcfeSCameron Smith } 1505389f1f6aSCameron Smith phastaio_time(&t1); 1506389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 1507389f1f6aSCameron Smith phastaio_addReadTime(elapsed); 1508f42e0444SCameron Smith phastaio_addReadBytes(nItems*type_size); 15093956dcfeSCameron Smith } 15103956dcfeSCameron Smith 1511103be424SCameron Smith void readdatablock( 1512103be424SCameron Smith int* fileDescriptor, 151359599516SKenneth E. Jansen const char keyphrase[], 151459599516SKenneth E. Jansen void* valueArray, 151559599516SKenneth E. Jansen int* nItems, 151659599516SKenneth E. Jansen const char datatype[], 151759599516SKenneth E. Jansen const char iotype[] ) 151859599516SKenneth E. Jansen { 151959599516SKenneth E. Jansen //if(irank == 0) printf("entering readdatablock()\n"); 15202dd307a1SCameron Smith unsigned long data_size = 0; 152159599516SKenneth E. Jansen double timer_start, timer_end; 152259599516SKenneth E. Jansen startTimer(&timer_start); 152359599516SKenneth E. Jansen 152459599516SKenneth E. Jansen int i = *fileDescriptor; 152559599516SKenneth E. Jansen checkFileDescriptor("readdatablock",&i); 152659599516SKenneth E. Jansen 152759599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) { 152859599516SKenneth E. Jansen int filePtr = *fileDescriptor - 1; 152959599516SKenneth E. Jansen FILE* fileObject; 153059599516SKenneth E. Jansen 153159599516SKenneth E. Jansen if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) { 153259599516SKenneth E. Jansen fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor); 153359599516SKenneth E. Jansen fprintf(stderr,"openfile_ function has to be called before\n") ; 153459599516SKenneth E. Jansen fprintf(stderr,"acessing the file\n ") ; 153559599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n"); 153659599516SKenneth E. Jansen endTimer(&timer_end); 153759599516SKenneth E. Jansen printPerf("readdatablock", timer_start, timer_end, 0, 0, ""); 153859599516SKenneth E. Jansen return; 153959599516SKenneth E. Jansen } 154059599516SKenneth E. Jansen 154159599516SKenneth E. Jansen // error check.. 154259599516SKenneth E. Jansen // since we require that a consistant header always preceed the data block 154359599516SKenneth E. Jansen // let us check to see that it is actually the case. 154459599516SKenneth E. Jansen 1545961a4ff6SCameron Smith if ( ! cscompare( LastHeaderKey[ filePtr ].c_str(), keyphrase ) ) { 154659599516SKenneth E. Jansen fprintf(stderr, "Header not consistant with data block\n"); 1547961a4ff6SCameron Smith fprintf(stderr, "Header: %s\n", LastHeaderKey[ filePtr ].c_str() ); 154859599516SKenneth E. Jansen fprintf(stderr, "DataBlock: %s\n ", keyphrase ); 154959599516SKenneth E. Jansen fprintf(stderr, "Please recheck read sequence \n"); 155059599516SKenneth E. Jansen if( Strict_Error ) { 155159599516SKenneth E. Jansen fprintf(stderr, "fatal error: cannot continue, returning out of call\n"); 155259599516SKenneth E. Jansen endTimer(&timer_end); 155359599516SKenneth E. Jansen printPerf("readdatablock", timer_start, timer_end, 0, 0, ""); 155459599516SKenneth E. Jansen return; 155559599516SKenneth E. Jansen } 155659599516SKenneth E. Jansen } 155759599516SKenneth E. Jansen 155859599516SKenneth E. Jansen if ( LastHeaderNotFound ) { 155959599516SKenneth E. Jansen endTimer(&timer_end); 156059599516SKenneth E. Jansen printPerf("readdatablock", timer_start, timer_end, 0, 0, ""); 156159599516SKenneth E. Jansen return; 156259599516SKenneth E. Jansen } 156359599516SKenneth E. Jansen fileObject = fileArray[ filePtr ]; 156459599516SKenneth E. Jansen Wrong_Endian = byte_order[ filePtr ]; 1565bae968b9SCameron Smith LastHeaderKey.erase(filePtr); 15663956dcfeSCameron Smith readDataBlock(fileObject,valueArray,*nItems,datatype,iotype); 156759599516SKenneth E. Jansen 156859599516SKenneth E. Jansen //return; 156959599516SKenneth E. Jansen } 157059599516SKenneth E. Jansen else { 157159599516SKenneth E. Jansen // printf("read data block\n"); 157259599516SKenneth E. Jansen MPI_Status read_data_status; 157359599516SKenneth E. Jansen size_t type_size = typeSize( datatype ); 157459599516SKenneth E. Jansen int nUnits = *nItems; 157559599516SKenneth E. Jansen isBinary( iotype ); 157659599516SKenneth E. Jansen 157759599516SKenneth E. Jansen // read datablock then 157859599516SKenneth E. Jansen //MR CHANGE 157959599516SKenneth E. Jansen // if ( cscompare ( datatype, "double")) 158059599516SKenneth E. Jansen char* ts2 = StringStripper( datatype ); 158159599516SKenneth E. Jansen if ( cscompare ( "double" , ts2)) 158259599516SKenneth E. Jansen //MR CHANGE END 158359599516SKenneth E. Jansen { 158459599516SKenneth E. Jansen 1585389f1f6aSCameron Smith phioTime t0,t1; 1586389f1f6aSCameron Smith phastaio_time(&t0); 158759599516SKenneth E. Jansen MPI_File_read_at_all_begin( PhastaIOActiveFiles[i]->file_handle, 158859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset + DB_HEADER_SIZE, 158959599516SKenneth E. Jansen valueArray, 159059599516SKenneth E. Jansen nUnits, 159159599516SKenneth E. Jansen MPI_DOUBLE ); 159259599516SKenneth E. Jansen MPI_File_read_at_all_end( PhastaIOActiveFiles[i]->file_handle, 159359599516SKenneth E. Jansen valueArray, 159459599516SKenneth E. Jansen &read_data_status ); 159559599516SKenneth E. Jansen data_size=8*nUnits; 1596389f1f6aSCameron Smith phastaio_time(&t1); 1597389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 1598389f1f6aSCameron Smith phastaio_addReadTime(elapsed); 1599f42e0444SCameron Smith phastaio_addReadBytes(nUnits*sizeof(double)); 160059599516SKenneth E. Jansen } 160159599516SKenneth E. Jansen //MR CHANGE 160259599516SKenneth E. Jansen // else if ( cscompare ( datatype, "integer")) 160359599516SKenneth E. Jansen else if ( cscompare ( "integer" , ts2)) 160459599516SKenneth E. Jansen //MR CHANGE END 160559599516SKenneth E. Jansen { 1606389f1f6aSCameron Smith phioTime t0,t1; 1607389f1f6aSCameron Smith phastaio_time(&t0); 160859599516SKenneth E. Jansen MPI_File_read_at_all_begin(PhastaIOActiveFiles[i]->file_handle, 160959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset + DB_HEADER_SIZE, 161059599516SKenneth E. Jansen valueArray, 161159599516SKenneth E. Jansen nUnits, 161259599516SKenneth E. Jansen MPI_INT ); 161359599516SKenneth E. Jansen MPI_File_read_at_all_end( PhastaIOActiveFiles[i]->file_handle, 161459599516SKenneth E. Jansen valueArray, 161559599516SKenneth E. Jansen &read_data_status ); 161659599516SKenneth E. Jansen data_size=4*nUnits; 1617389f1f6aSCameron Smith phastaio_time(&t1); 1618389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 1619389f1f6aSCameron Smith phastaio_addReadTime(elapsed); 1620f42e0444SCameron Smith phastaio_addReadBytes(nUnits*sizeof(int)); 162159599516SKenneth E. Jansen } 162259599516SKenneth E. Jansen else 162359599516SKenneth E. Jansen { 162459599516SKenneth E. Jansen *fileDescriptor = DATA_TYPE_ILLEGAL; 162559599516SKenneth E. Jansen printf("readdatablock - DATA_TYPE_ILLEGAL - %s\n",datatype); 162659599516SKenneth E. Jansen endTimer(&timer_end); 162759599516SKenneth E. Jansen printPerf("readdatablock", timer_start, timer_end, 0, 0, ""); 162859599516SKenneth E. Jansen return; 162959599516SKenneth E. Jansen } 163059599516SKenneth E. Jansen free(ts2); 163159599516SKenneth E. Jansen 163259599516SKenneth E. Jansen 163359599516SKenneth E. Jansen // printf("%d Read finishe\n",PhastaIOActiveFiles[i]->myrank); 163459599516SKenneth E. Jansen 163559599516SKenneth E. Jansen // Swap data byte order if endianess is different ... 163659599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->Wrong_Endian ) 163759599516SKenneth E. Jansen { 163859599516SKenneth E. Jansen SwapArrayByteOrder( valueArray, type_size, nUnits ); 163959599516SKenneth E. Jansen } 164059599516SKenneth E. Jansen } 164159599516SKenneth E. Jansen 164259599516SKenneth E. Jansen endTimer(&timer_end); 164359599516SKenneth E. Jansen char extra_msg[1024]; 164459599516SKenneth E. Jansen memset(extra_msg, '\0', 1024); 164559599516SKenneth E. Jansen char* key = StringStripper(keyphrase); 164659599516SKenneth E. Jansen sprintf(extra_msg, " field is %s ", key); 164759599516SKenneth E. Jansen printPerf("readdatablock", timer_start, timer_end, data_size, 1, extra_msg); 164859599516SKenneth E. Jansen free(key); 164959599516SKenneth E. Jansen 165059599516SKenneth E. Jansen } 165159599516SKenneth E. Jansen 1652103be424SCameron Smith void writeHeader( 1653103be424SCameron Smith FILE* f, 1654ea868eb1SCameron Smith const char keyphrase[], 1655ea868eb1SCameron Smith const void* valueArray, 1656ea868eb1SCameron Smith const int nItems, 1657ea868eb1SCameron Smith const int ndataItems, 1658ea868eb1SCameron Smith const char datatype[], 1659ea868eb1SCameron Smith const char iotype[]) 1660ea868eb1SCameron Smith { 1661ea868eb1SCameron Smith isBinary( iotype ); 1662ea868eb1SCameron Smith 1663ea868eb1SCameron Smith const int _newline = 1664ea868eb1SCameron Smith ( ndataItems > 0 ) ? sizeof( char ) : 0; 1665ea868eb1SCameron Smith int size_of_nextblock = 1666ea868eb1SCameron Smith ( binary_format ) ? typeSize(datatype) * ndataItems + _newline : ndataItems; 1667ea868eb1SCameron Smith 1668ea868eb1SCameron Smith fprintf( f, "%s : < %d > ", keyphrase, size_of_nextblock ); 1669ea868eb1SCameron Smith for( int i = 0; i < nItems; i++ ) 1670ea868eb1SCameron Smith fprintf( f, "%d ", *((int*)((int*)valueArray+i))); 1671ea868eb1SCameron Smith fprintf( f, "\n"); 1672ea868eb1SCameron Smith } 1673ea868eb1SCameron Smith 1674103be424SCameron Smith void writeheader( 1675103be424SCameron Smith const int* fileDescriptor, 167659599516SKenneth E. Jansen const char keyphrase[], 167759599516SKenneth E. Jansen const void* valueArray, 167859599516SKenneth E. Jansen const int* nItems, 167959599516SKenneth E. Jansen const int* ndataItems, 168059599516SKenneth E. Jansen const char datatype[], 168159599516SKenneth E. Jansen const char iotype[]) 168259599516SKenneth E. Jansen { 168359599516SKenneth E. Jansen 168459599516SKenneth E. Jansen //if(irank == 0) printf("entering writeheader()\n"); 168559599516SKenneth E. Jansen 168659599516SKenneth E. Jansen double timer_start, timer_end; 168759599516SKenneth E. Jansen startTimer(&timer_start); 168859599516SKenneth E. Jansen 168959599516SKenneth E. Jansen int i = *fileDescriptor; 169059599516SKenneth E. Jansen checkFileDescriptor("writeheader",&i); 169159599516SKenneth E. Jansen 169259599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) { 169359599516SKenneth E. Jansen int filePtr = *fileDescriptor - 1; 169459599516SKenneth E. Jansen if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) { 169559599516SKenneth E. Jansen fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor); 169659599516SKenneth E. Jansen fprintf(stderr,"openfile_ function has to be called before \n") ; 169759599516SKenneth E. Jansen fprintf(stderr,"acessing the file\n ") ; 169859599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n"); 169959599516SKenneth E. Jansen endTimer(&timer_end); 170059599516SKenneth E. Jansen printPerf("writeheader", timer_start, timer_end, 0, 0, ""); 170159599516SKenneth E. Jansen return; 170259599516SKenneth E. Jansen } 170359599516SKenneth E. Jansen 1704961a4ff6SCameron Smith LastHeaderKey[filePtr] = std::string(keyphrase); 170559599516SKenneth E. Jansen DataSize = *ndataItems; 1706ea868eb1SCameron Smith FILE* fileObject = fileArray[ filePtr ] ; 1707ea868eb1SCameron Smith header_type[ filePtr ] = typeSize( datatype ); 1708ea868eb1SCameron Smith writeHeader(fileObject,keyphrase,valueArray,*nItems, 1709ea868eb1SCameron Smith *ndataItems,datatype,iotype); 171059599516SKenneth E. Jansen } 171159599516SKenneth E. Jansen else { // else it's parallel I/O 171259599516SKenneth E. Jansen DataSize = *ndataItems; 171359599516SKenneth E. Jansen size_t type_size = typeSize( datatype ); 171459599516SKenneth E. Jansen isBinary( iotype ); 171559599516SKenneth E. Jansen char mpi_tag[MAX_FIELDS_NAME_LENGTH]; 171659599516SKenneth E. Jansen 171759599516SKenneth E. Jansen int string_length = strlen( keyphrase ); 171859599516SKenneth E. Jansen char* buffer = (char*) malloc ( string_length+1 ); 171959599516SKenneth E. Jansen 172059599516SKenneth E. Jansen strcpy ( buffer, keyphrase); 172159599516SKenneth E. Jansen buffer[ string_length ] = '\0'; 172259599516SKenneth E. Jansen 172359599516SKenneth E. Jansen char* st2 = strtok ( buffer, "@" ); 172459599516SKenneth E. Jansen st2 = strtok (NULL, "@"); 172559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->GPid = atoi(st2); 172659599516SKenneth E. Jansen 172759599516SKenneth E. Jansen if ( char* p = strpbrk(buffer, "@") ) 172859599516SKenneth E. Jansen *p = '\0'; 172959599516SKenneth E. Jansen 173059599516SKenneth E. Jansen bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH); 173159599516SKenneth E. Jansen sprintf(mpi_tag, "\n%s : %d\n", buffer, PhastaIOActiveFiles[i]->field_count); 17322dd307a1SCameron Smith unsigned long offset_value; 173359599516SKenneth E. Jansen 173459599516SKenneth E. Jansen int temp = *ndataItems; 17352dd307a1SCameron Smith unsigned long number_of_items = (unsigned long)temp; 173659599516SKenneth E. Jansen MPI_Barrier(PhastaIOActiveFiles[i]->local_comm); 173759599516SKenneth E. Jansen 173859599516SKenneth E. Jansen MPI_Scan( &number_of_items, 173959599516SKenneth E. Jansen &offset_value, 174059599516SKenneth E. Jansen 1, 174159599516SKenneth E. Jansen MPI_LONG_LONG_INT, 174259599516SKenneth E. Jansen MPI_SUM, 174359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm ); 174459599516SKenneth E. Jansen 174559599516SKenneth E. Jansen offset_value = (offset_value - number_of_items) * type_size; 174659599516SKenneth E. Jansen 174759599516SKenneth E. Jansen offset_value += PhastaIOActiveFiles[i]->local_myrank * 174859599516SKenneth E. Jansen DB_HEADER_SIZE + 174959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->next_start_address; 175059599516SKenneth E. Jansen // This offset is the starting address of each datablock header... 175159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset = offset_value; 175259599516SKenneth E. Jansen 175359599516SKenneth E. Jansen // Write in my offset table ... 175459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset_table[PhastaIOActiveFiles[i]->field_count][PhastaIOActiveFiles[i]->part_count] = 175559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset; 175659599516SKenneth E. Jansen 175759599516SKenneth E. Jansen // Update the next-start-address ... 175859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->next_start_address = offset_value + 175959599516SKenneth E. Jansen number_of_items * type_size + 176059599516SKenneth E. Jansen DB_HEADER_SIZE; 176159599516SKenneth E. Jansen MPI_Bcast( &(PhastaIOActiveFiles[i]->next_start_address), 176259599516SKenneth E. Jansen 1, 176359599516SKenneth E. Jansen MPI_LONG_LONG_INT, 176459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_numprocs-1, 176559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm ); 176659599516SKenneth E. Jansen 176759599516SKenneth E. Jansen // Prepare datablock header ... 176859599516SKenneth E. Jansen int _newline = (*ndataItems>0)?sizeof(char):0; 176959599516SKenneth E. Jansen unsigned int size_of_nextblock = type_size * (*ndataItems) + _newline; 177059599516SKenneth E. Jansen 177159599516SKenneth E. Jansen //char datablock_header[255]; 177259599516SKenneth E. Jansen //bzero((void*)datablock_header,255); 177359599516SKenneth E. Jansen char datablock_header[DB_HEADER_SIZE]; 177459599516SKenneth E. Jansen bzero((void*)datablock_header,DB_HEADER_SIZE); 177559599516SKenneth E. Jansen 177659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->GPid = PhastaIOActiveFiles[i]->nppp*PhastaIOActiveFiles[i]->myrank+PhastaIOActiveFiles[i]->part_count; 177759599516SKenneth E. Jansen sprintf( datablock_header, 177859599516SKenneth E. Jansen "\n%s : < %u >", 177959599516SKenneth E. Jansen keyphrase, 178059599516SKenneth E. Jansen size_of_nextblock ); 178159599516SKenneth E. Jansen 178259599516SKenneth E. Jansen for ( int j = 0; j < *nItems; j++ ) 178359599516SKenneth E. Jansen { 178459599516SKenneth E. Jansen sprintf( datablock_header, 178559599516SKenneth E. Jansen "%s %d ", 178659599516SKenneth E. Jansen datablock_header, 178759599516SKenneth E. Jansen *((int*)((int*)valueArray+j))); 178859599516SKenneth E. Jansen } 178959599516SKenneth E. Jansen sprintf( datablock_header, 179059599516SKenneth E. Jansen "%s\n ", 179159599516SKenneth E. Jansen datablock_header ); 179259599516SKenneth E. Jansen 179359599516SKenneth E. Jansen // Write datablock header ... 179459599516SKenneth E. Jansen //MR CHANGE 179559599516SKenneth E. Jansen // if ( cscompare(datatype,"double") ) 179659599516SKenneth E. Jansen char* ts1 = StringStripper( datatype ); 179759599516SKenneth E. Jansen if ( cscompare("double",ts1) ) 179859599516SKenneth E. Jansen //MR CHANGE END 179959599516SKenneth E. Jansen { 180059599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->double_chunk ); 180159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk = ( double * )malloc( (sizeof( double )*number_of_items+ DB_HEADER_SIZE)); 180259599516SKenneth E. Jansen 180359599516SKenneth E. Jansen double * aa = ( double * )datablock_header; 180459599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->double_chunk, aa, DB_HEADER_SIZE); 180559599516SKenneth E. Jansen } 180659599516SKenneth E. Jansen //MR CHANGE 180759599516SKenneth E. Jansen // if ( cscompare(datatype,"integer") ) 180859599516SKenneth E. Jansen else if ( cscompare("integer",ts1) ) 180959599516SKenneth E. Jansen //MR CHANGE END 181059599516SKenneth E. Jansen { 181159599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->int_chunk ); 181259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk = ( int * )malloc( (sizeof( int )*number_of_items+ DB_HEADER_SIZE)); 181359599516SKenneth E. Jansen 181459599516SKenneth E. Jansen int * aa = ( int * )datablock_header; 181559599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->int_chunk, aa, DB_HEADER_SIZE); 181659599516SKenneth E. Jansen } 181759599516SKenneth E. Jansen else { 181859599516SKenneth E. Jansen // *fileDescriptor = DATA_TYPE_ILLEGAL; 181959599516SKenneth E. Jansen printf("writeheader - DATA_TYPE_ILLEGAL - %s\n",datatype); 182059599516SKenneth E. Jansen endTimer(&timer_end); 182159599516SKenneth E. Jansen printPerf("writeheader", timer_start, timer_end, 0, 0, ""); 182259599516SKenneth E. Jansen return; 182359599516SKenneth E. Jansen } 182459599516SKenneth E. Jansen free(ts1); 182559599516SKenneth E. Jansen 182659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->part_count++; 182759599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->part_count == PhastaIOActiveFiles[i]->nppp ) { 182859599516SKenneth E. Jansen //A new field will be written 182959599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) { 183059599516SKenneth E. Jansen memcpy( PhastaIOActiveFiles[i]->master_header + 183159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->field_count * 183259599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH + 183359599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH * 2, 183459599516SKenneth E. Jansen mpi_tag, 183559599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH-1); 183659599516SKenneth E. Jansen } 183759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->field_count++; 183859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->part_count=0; 183959599516SKenneth E. Jansen } 184059599516SKenneth E. Jansen free(buffer); 184159599516SKenneth E. Jansen } 184259599516SKenneth E. Jansen 184359599516SKenneth E. Jansen endTimer(&timer_end); 184459599516SKenneth E. Jansen printPerf("writeheader", timer_start, timer_end, 0, 0, ""); 184559599516SKenneth E. Jansen } 184659599516SKenneth E. Jansen 1847103be424SCameron Smith void writeDataBlock( 1848103be424SCameron Smith FILE* f, 1849ea868eb1SCameron Smith const void* valueArray, 1850ea868eb1SCameron Smith const int nItems, 1851ea868eb1SCameron Smith const char datatype[], 1852ea868eb1SCameron Smith const char iotype[] ) 1853ea868eb1SCameron Smith { 1854ea868eb1SCameron Smith isBinary( iotype ); 1855ea868eb1SCameron Smith size_t type_size = typeSize( datatype ); 1856389f1f6aSCameron Smith phioTime t0,t1; 1857389f1f6aSCameron Smith phastaio_time(&t0); 1858ea868eb1SCameron Smith if ( binary_format ) { 1859ea868eb1SCameron Smith fwrite( valueArray, type_size, nItems, f ); 1860ea868eb1SCameron Smith fprintf( f,"\n"); 1861ea868eb1SCameron Smith } else { 1862ea868eb1SCameron Smith char* ts1 = StringStripper( datatype ); 1863ea868eb1SCameron Smith if ( cscompare( "integer", ts1 ) ) { 1864be3da47bSCameron Smith const int* vals = (int*) valueArray; 1865ea868eb1SCameron Smith for( int n=0; n < nItems ; n++ ) 1866be3da47bSCameron Smith fprintf(f,"%d\n",vals[n]); 1867ea868eb1SCameron Smith } else if ( cscompare( "double", ts1 ) ) { 1868be3da47bSCameron Smith const double* vals = (double*) valueArray; 1869ea868eb1SCameron Smith for( int n=0; n < nItems ; n++ ) 1870be3da47bSCameron Smith fprintf(f,"%f\n",vals[n]); 1871ea868eb1SCameron Smith } 1872ea868eb1SCameron Smith free (ts1); 1873ea868eb1SCameron Smith } 1874389f1f6aSCameron Smith phastaio_time(&t1); 1875389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 1876389f1f6aSCameron Smith phastaio_addWriteTime(elapsed); 1877f42e0444SCameron Smith phastaio_addWriteBytes(nItems*type_size); 1878ea868eb1SCameron Smith } 1879ea868eb1SCameron Smith 1880103be424SCameron Smith void writedatablock( 1881103be424SCameron Smith const int* fileDescriptor, 188259599516SKenneth E. Jansen const char keyphrase[], 188359599516SKenneth E. Jansen const void* valueArray, 188459599516SKenneth E. Jansen const int* nItems, 188559599516SKenneth E. Jansen const char datatype[], 188659599516SKenneth E. Jansen const char iotype[] ) 188759599516SKenneth E. Jansen { 188859599516SKenneth E. Jansen //if(irank == 0) printf("entering writedatablock()\n"); 188959599516SKenneth E. Jansen 18902dd307a1SCameron Smith unsigned long data_size = 0; 189159599516SKenneth E. Jansen double timer_start, timer_end; 189259599516SKenneth E. Jansen startTimer(&timer_start); 189359599516SKenneth E. Jansen 189459599516SKenneth E. Jansen int i = *fileDescriptor; 189559599516SKenneth E. Jansen checkFileDescriptor("writedatablock",&i); 189659599516SKenneth E. Jansen 189759599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) { 189859599516SKenneth E. Jansen int filePtr = *fileDescriptor - 1; 189959599516SKenneth E. Jansen 190059599516SKenneth E. Jansen if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) { 190159599516SKenneth E. Jansen fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor); 190259599516SKenneth E. Jansen fprintf(stderr,"openfile_ function has to be called before \n") ; 190359599516SKenneth E. Jansen fprintf(stderr,"acessing the file\n ") ; 190459599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n"); 190559599516SKenneth E. Jansen endTimer(&timer_end); 190659599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, 0, 0, ""); 190759599516SKenneth E. Jansen return; 190859599516SKenneth E. Jansen } 190959599516SKenneth E. Jansen // since we require that a consistant header always preceed the data block 191059599516SKenneth E. Jansen // let us check to see that it is actually the case. 191159599516SKenneth E. Jansen 1912961a4ff6SCameron Smith if ( ! cscompare( LastHeaderKey[ filePtr ].c_str(), keyphrase ) ) { 191359599516SKenneth E. Jansen fprintf(stderr, "Header not consistant with data block\n"); 1914961a4ff6SCameron Smith fprintf(stderr, "Header: %s\n", LastHeaderKey[ filePtr ].c_str() ); 191559599516SKenneth E. Jansen fprintf(stderr, "DataBlock: %s\n ", keyphrase ); 191659599516SKenneth E. Jansen fprintf(stderr, "Please recheck write sequence \n"); 191759599516SKenneth E. Jansen if( Strict_Error ) { 191859599516SKenneth E. Jansen fprintf(stderr, "fatal error: cannot continue, returning out of call\n"); 191959599516SKenneth E. Jansen endTimer(&timer_end); 192059599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, 0, 0, ""); 192159599516SKenneth E. Jansen return; 192259599516SKenneth E. Jansen } 192359599516SKenneth E. Jansen } 192459599516SKenneth E. Jansen 192559599516SKenneth E. Jansen FILE* fileObject = fileArray[ filePtr ] ; 192659599516SKenneth E. Jansen size_t type_size=typeSize( datatype ); 192759599516SKenneth E. Jansen isBinary( iotype ); 192859599516SKenneth E. Jansen 1929bae968b9SCameron Smith LastHeaderKey.erase(filePtr); 1930bae968b9SCameron Smith 193159599516SKenneth E. Jansen if ( header_type[filePtr] != (int)type_size ) { 193259599516SKenneth E. Jansen fprintf(stderr,"header and datablock differ on typeof data in the block for\n"); 193359599516SKenneth E. Jansen fprintf(stderr,"keyphrase : %s\n", keyphrase); 193459599516SKenneth E. Jansen if( Strict_Error ) { 193559599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n" ); 193659599516SKenneth E. Jansen endTimer(&timer_end); 193759599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, 0, 0, ""); 193859599516SKenneth E. Jansen return; 193959599516SKenneth E. Jansen } 194059599516SKenneth E. Jansen } 194159599516SKenneth E. Jansen 194259599516SKenneth E. Jansen int nUnits = *nItems; 194359599516SKenneth E. Jansen 194459599516SKenneth E. Jansen if ( nUnits != DataSize ) { 194559599516SKenneth E. Jansen fprintf(stderr,"header and datablock differ on number of data items for\n"); 194659599516SKenneth E. Jansen fprintf(stderr,"keyphrase : %s\n", keyphrase); 194759599516SKenneth E. Jansen if( Strict_Error ) { 194859599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n" ); 194959599516SKenneth E. Jansen endTimer(&timer_end); 195059599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, 0, 0, ""); 195159599516SKenneth E. Jansen return; 195259599516SKenneth E. Jansen } 195359599516SKenneth E. Jansen } 1954ea868eb1SCameron Smith writeDataBlock(fileObject,valueArray,*nItems,datatype,iotype); 195559599516SKenneth E. Jansen } 195659599516SKenneth E. Jansen else { // syncIO case 195759599516SKenneth E. Jansen MPI_Status write_data_status; 195859599516SKenneth E. Jansen isBinary( iotype ); 195959599516SKenneth E. Jansen int nUnits = *nItems; 196059599516SKenneth E. Jansen 196159599516SKenneth E. Jansen //MR CHANGE 196259599516SKenneth E. Jansen // if ( cscompare(datatype,"double") ) 196359599516SKenneth E. Jansen char* ts1 = StringStripper( datatype ); 196459599516SKenneth E. Jansen if ( cscompare("double",ts1) ) 196559599516SKenneth E. Jansen //MR CHANGE END 196659599516SKenneth E. Jansen { 196759599516SKenneth E. Jansen memcpy((PhastaIOActiveFiles[i]->double_chunk+DB_HEADER_SIZE/sizeof(double)), valueArray, nUnits*sizeof(double)); 1968389f1f6aSCameron Smith phioTime t0,t1; 1969389f1f6aSCameron Smith phastaio_time(&t0); 197059599516SKenneth E. Jansen MPI_File_write_at_all_begin( PhastaIOActiveFiles[i]->file_handle, 197159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset, 197259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk, 197359599516SKenneth E. Jansen //BLOCK_SIZE/sizeof(double), 197459599516SKenneth E. Jansen nUnits+DB_HEADER_SIZE/sizeof(double), 197559599516SKenneth E. Jansen MPI_DOUBLE ); 197659599516SKenneth E. Jansen MPI_File_write_at_all_end( PhastaIOActiveFiles[i]->file_handle, 197759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk, 197859599516SKenneth E. Jansen &write_data_status ); 197959599516SKenneth E. Jansen data_size=8*nUnits; 1980389f1f6aSCameron Smith phastaio_time(&t1); 1981389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 1982389f1f6aSCameron Smith phastaio_addWriteTime(elapsed); 1983f42e0444SCameron Smith phastaio_addWriteBytes((nUnits*sizeof(double))+DB_HEADER_SIZE); 198459599516SKenneth E. Jansen } 198559599516SKenneth E. Jansen //MR CHANGE 198659599516SKenneth E. Jansen // else if ( cscompare ( datatype, "integer")) 198759599516SKenneth E. Jansen else if ( cscompare("integer",ts1) ) 198859599516SKenneth E. Jansen //MR CHANGE END 198959599516SKenneth E. Jansen { 199059599516SKenneth E. Jansen memcpy((PhastaIOActiveFiles[i]->int_chunk+DB_HEADER_SIZE/sizeof(int)), valueArray, nUnits*sizeof(int)); 1991389f1f6aSCameron Smith phioTime t0,t1; 1992389f1f6aSCameron Smith phastaio_time(&t0); 199359599516SKenneth E. Jansen MPI_File_write_at_all_begin( PhastaIOActiveFiles[i]->file_handle, 199459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset, 199559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk, 199659599516SKenneth E. Jansen nUnits+DB_HEADER_SIZE/sizeof(int), 199759599516SKenneth E. Jansen MPI_INT ); 199859599516SKenneth E. Jansen MPI_File_write_at_all_end( PhastaIOActiveFiles[i]->file_handle, 199959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk, 200059599516SKenneth E. Jansen &write_data_status ); 200159599516SKenneth E. Jansen data_size=4*nUnits; 2002389f1f6aSCameron Smith phastaio_time(&t1); 2003389f1f6aSCameron Smith const size_t elapsed = phastaio_time_diff(&t0,&t1); 2004389f1f6aSCameron Smith phastaio_addWriteTime(elapsed); 2005f42e0444SCameron Smith phastaio_addWriteBytes((nUnits*sizeof(int))+DB_HEADER_SIZE); 200659599516SKenneth E. Jansen } 200759599516SKenneth E. Jansen else { 200859599516SKenneth E. Jansen printf("Error: writedatablock - DATA_TYPE_ILLEGAL - %s\n",datatype); 200959599516SKenneth E. Jansen endTimer(&timer_end); 201059599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, 0, 0, ""); 201159599516SKenneth E. Jansen return; 201259599516SKenneth E. Jansen } 201359599516SKenneth E. Jansen free(ts1); 201459599516SKenneth E. Jansen } 201559599516SKenneth E. Jansen 201659599516SKenneth E. Jansen endTimer(&timer_end); 201759599516SKenneth E. Jansen char extra_msg[1024]; 201859599516SKenneth E. Jansen memset(extra_msg, '\0', 1024); 201959599516SKenneth E. Jansen char* key = StringStripper(keyphrase); 202059599516SKenneth E. Jansen sprintf(extra_msg, " field is %s ", key); 202159599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, data_size, 1, extra_msg); 202259599516SKenneth E. Jansen free(key); 202359599516SKenneth E. Jansen 202459599516SKenneth E. Jansen } 202559599516SKenneth E. Jansen 2026103be424SCameron Smith void SwapArrayByteOrder( void* array, int nbytes, int nItems ) 202759599516SKenneth E. Jansen { 202859599516SKenneth E. Jansen /* This swaps the byte order for the array of nItems each 202959599516SKenneth E. Jansen of size nbytes , This will be called only locally */ 203059599516SKenneth E. Jansen int i,j; 203159599516SKenneth E. Jansen unsigned char* ucDst = (unsigned char*)array; 203259599516SKenneth E. Jansen for(i=0; i < nItems; i++) { 203359599516SKenneth E. Jansen for(j=0; j < (nbytes/2); j++) 203459599516SKenneth E. Jansen std::swap( ucDst[j] , ucDst[(nbytes - 1) - j] ); 203559599516SKenneth E. Jansen ucDst += nbytes; 203659599516SKenneth E. Jansen } 203759599516SKenneth E. Jansen } 203859599516SKenneth E. Jansen 2039103be424SCameron Smith void writestring( int* fileDescriptor, const char inString[] ) 204059599516SKenneth E. Jansen { 204159599516SKenneth E. Jansen int filePtr = *fileDescriptor - 1; 204259599516SKenneth E. Jansen FILE* fileObject = fileArray[filePtr] ; 204359599516SKenneth E. Jansen fprintf(fileObject,"%s",inString ); 204459599516SKenneth E. Jansen return; 204559599516SKenneth E. Jansen } 204659599516SKenneth E. Jansen 2047103be424SCameron Smith void Gather_Headers( int* fileDescriptor, vector< string >& headers ) 204859599516SKenneth E. Jansen { 204959599516SKenneth E. Jansen FILE* fileObject; 205059599516SKenneth E. Jansen char Line[1024]; 205159599516SKenneth E. Jansen 205259599516SKenneth E. Jansen fileObject = fileArray[ (*fileDescriptor)-1 ]; 205359599516SKenneth E. Jansen 205459599516SKenneth E. Jansen while( !feof(fileObject) ) { 205559599516SKenneth E. Jansen fgets( Line, 1024, fileObject); 205659599516SKenneth E. Jansen if ( Line[0] == '#' ) { 205759599516SKenneth E. Jansen headers.push_back( Line ); 205859599516SKenneth E. Jansen } else { 205959599516SKenneth E. Jansen break; 206059599516SKenneth E. Jansen } 206159599516SKenneth E. Jansen } 206259599516SKenneth E. Jansen rewind( fileObject ); 206359599516SKenneth E. Jansen clearerr( fileObject ); 206459599516SKenneth E. Jansen } 206559599516SKenneth E. Jansen 2066103be424SCameron Smith void isWrong( void ) { 2067103be424SCameron Smith (Wrong_Endian) ? fprintf(stdout,"YES\n") : fprintf(stdout,"NO\n"); 2068103be424SCameron Smith } 206959599516SKenneth E. Jansen 2070103be424SCameron Smith void togglestrictmode( void ) { Strict_Error = !Strict_Error; } 2071103be424SCameron Smith 2072103be424SCameron Smith int isLittleEndian( void ) 207359599516SKenneth E. Jansen { 207459599516SKenneth E. Jansen // this function returns a 1 if the current running architecture is 207559599516SKenneth E. Jansen // LittleEndian Byte Ordered, else it returns a zero 207659599516SKenneth E. Jansen union { 207759599516SKenneth E. Jansen long a; 207859599516SKenneth E. Jansen char c[sizeof( long )]; 207959599516SKenneth E. Jansen } endianUnion; 208059599516SKenneth E. Jansen endianUnion.a = 1 ; 208159599516SKenneth E. Jansen if ( endianUnion.c[sizeof(long)-1] != 1 ) return 1 ; 208259599516SKenneth E. Jansen else return 0; 208359599516SKenneth E. Jansen } 208459599516SKenneth E. Jansen 208559599516SKenneth E. Jansen namespace PHASTA { 208659599516SKenneth E. Jansen const char* const PhastaIO_traits<int>::type_string = "integer"; 208759599516SKenneth E. Jansen const char* const PhastaIO_traits<double>::type_string = "double"; 208859599516SKenneth E. Jansen } 2089