1064bab1dSCameron Smith #include "phIO.h" 2064bab1dSCameron Smith #include "phio_sync.h" 3064bab1dSCameron Smith #include "phComm.h" 4064bab1dSCameron Smith #include <stdio.h> 5064bab1dSCameron Smith #include <stdlib.h> 6064bab1dSCameron Smith #include <string.h> 7064bab1dSCameron Smith #include <assert.h> 8064bab1dSCameron Smith #include <phastaIO.h> 9064bab1dSCameron Smith #include <sstream> 10064bab1dSCameron Smith #include <string> 11064bab1dSCameron Smith 12064bab1dSCameron Smith namespace { 13064bab1dSCameron Smith void appendRank(std::stringstream& ss, const char* phrase) { 14064bab1dSCameron Smith ss << phrase << "@" << phcomm_rank()+1; 15064bab1dSCameron Smith } 16064bab1dSCameron Smith std::string appendSync(const char* phrase) { 17064bab1dSCameron Smith std::stringstream ss; 18064bab1dSCameron Smith appendRank(ss,phrase); 19064bab1dSCameron Smith ss << "?"; 20064bab1dSCameron Smith return ss.str(); 21064bab1dSCameron Smith } 22064bab1dSCameron Smith std::string appendSyncWrite(const char* phrase) { 23064bab1dSCameron Smith std::stringstream ss; 24064bab1dSCameron Smith appendRank(ss,phrase); 25064bab1dSCameron Smith return ss.str(); 26064bab1dSCameron Smith } 27064bab1dSCameron Smith std::string appendColor(const char* phrase, int numFiles) { 28064bab1dSCameron Smith const int color = computeColor(phcomm_rank(), phcomm_size(), numFiles); 29064bab1dSCameron Smith std::stringstream ss; 30064bab1dSCameron Smith ss << phrase << color+1; 31064bab1dSCameron Smith return ss.str(); 32064bab1dSCameron Smith } 33ab645d52SCameron Smith void close(sync_fp f, const char* mode) { 34*9a3ccc9bSCameron Smith int* file = f->file; 35ab645d52SCameron Smith closefile(file, mode); 36ab645d52SCameron Smith finalizephmpiio(file); 37ab645d52SCameron Smith free(file); 3857517afcSCameron Smith free(f); 3957517afcSCameron Smith } 40064bab1dSCameron Smith } 41064bab1dSCameron Smith 42ab645d52SCameron Smith void sync_openfile_read( 43ab645d52SCameron Smith const char filename[], 44ab645d52SCameron Smith phio_fp f) { 45ab645d52SCameron Smith sync_fp sf = (sync_fp) f; 46ab645d52SCameron Smith std::string syncName = appendColor(filename, sf->nfiles); 47ab645d52SCameron Smith int nfields=0; 48ab645d52SCameron Smith int nppf=0; 49ab645d52SCameron Smith queryphmpiio(syncName.c_str(), &nfields, &nppf); 50ab645d52SCameron Smith const char* mode = "read"; 51*9a3ccc9bSCameron Smith int* file = sf->file; 52ab645d52SCameron Smith initphmpiio(&nfields, &nppf, &(sf->nfiles), file, mode); 53ab645d52SCameron Smith openfile(syncName.c_str(), mode, file); 54ab645d52SCameron Smith } 55ab645d52SCameron Smith 56ab645d52SCameron Smith void sync_openfile_write( 57ab645d52SCameron Smith const char filename[], 58ab645d52SCameron Smith phio_fp f) { 59ab645d52SCameron Smith sync_fp sf = (sync_fp) f; 60ab645d52SCameron Smith std::string syncName = appendColor(filename, sf->nfiles); 61ab645d52SCameron Smith const char* mode = "write"; 62*9a3ccc9bSCameron Smith int* file = sf->file; 63ab645d52SCameron Smith initphmpiio(&(sf->nfields), &(sf->nppf), 64ab645d52SCameron Smith &(sf->nfiles), file, mode); 65ab645d52SCameron Smith openfile(syncName.c_str(), mode, file); 66ab645d52SCameron Smith } 67ab645d52SCameron Smith 68ab645d52SCameron Smith void sync_closefile(phio_fp f) { 69ab645d52SCameron Smith sync_fp sf = (sync_fp) f; 70*9a3ccc9bSCameron Smith const char m = sf->mode; 71ab645d52SCameron Smith if(m == 'r') 72ab645d52SCameron Smith close(sf, "read"); 73ab645d52SCameron Smith else if(m == 'w') 74ab645d52SCameron Smith close(sf, "write"); 75ab645d52SCameron Smith else { 76ab645d52SCameron Smith fprintf(stderr, "ERROR unsupported file mode in %s on line %d" 77ab645d52SCameron Smith "... exiting", __FILE__, __LINE__); 78ab645d52SCameron Smith exit(EXIT_FAILURE); 79ab645d52SCameron Smith } 80ab645d52SCameron Smith } 81064bab1dSCameron Smith 82064bab1dSCameron Smith void sync_readheader( 83064bab1dSCameron Smith int* fileDescriptor, 84064bab1dSCameron Smith const char keyphrase[], 85064bab1dSCameron Smith void* valueArray, 86064bab1dSCameron Smith int* nItems, 87064bab1dSCameron Smith const char datatype[], 88064bab1dSCameron Smith const char iotype[] ) { 89064bab1dSCameron Smith std::string syncPhrase = appendSync(keyphrase); 90064bab1dSCameron Smith readheader(fileDescriptor, syncPhrase.c_str(), 91064bab1dSCameron Smith valueArray, nItems, datatype, iotype); 92064bab1dSCameron Smith } 93064bab1dSCameron Smith 94064bab1dSCameron Smith void sync_writeheader( 95064bab1dSCameron Smith const int* fileDescriptor, 96064bab1dSCameron Smith const char keyphrase[], 97064bab1dSCameron Smith const void* valueArray, 98064bab1dSCameron Smith const int* nItems, 99064bab1dSCameron Smith const int* ndataItems, 100064bab1dSCameron Smith const char datatype[], 101064bab1dSCameron Smith const char iotype[] ) { 102064bab1dSCameron Smith std::string syncPhrase = appendSyncWrite(keyphrase); 103064bab1dSCameron Smith writeheader(fileDescriptor, syncPhrase.c_str(), 104064bab1dSCameron Smith valueArray, nItems, ndataItems, datatype, iotype); 105064bab1dSCameron Smith } 106064bab1dSCameron Smith 107064bab1dSCameron Smith void sync_readdatablock( 108064bab1dSCameron Smith int* fileDescriptor, 109064bab1dSCameron Smith const char keyphrase[], 110064bab1dSCameron Smith void* valueArray, 111064bab1dSCameron Smith int* nItems, 112064bab1dSCameron Smith const char datatype[], 113064bab1dSCameron Smith const char iotype[] ) { 114064bab1dSCameron Smith std::string syncPhrase = appendSync(keyphrase); 115064bab1dSCameron Smith readdatablock(fileDescriptor, syncPhrase.c_str(), 116064bab1dSCameron Smith valueArray, nItems, datatype, iotype); 117064bab1dSCameron Smith } 118064bab1dSCameron Smith 119064bab1dSCameron Smith void sync_writedatablock( 120064bab1dSCameron Smith const int* fileDescriptor, 121064bab1dSCameron Smith const char keyphrase[], 122064bab1dSCameron Smith const void* valueArray, 123064bab1dSCameron Smith const int* nItems, 124064bab1dSCameron Smith const char datatype[], 125064bab1dSCameron Smith const char iotype[]) { 126064bab1dSCameron Smith std::string syncPhrase = appendSyncWrite(keyphrase); 127064bab1dSCameron Smith writedatablock(fileDescriptor, syncPhrase.c_str(), 128064bab1dSCameron Smith valueArray, nItems, datatype, iotype); 129064bab1dSCameron Smith } 130