xref: /phasta/phSolver/common/phIO.cc (revision ade0e30f85bbeef856b58b9c2c94a3f41a6e36ac)
1d1293ce9SCameron Smith #include "phIO.h"
2d1293ce9SCameron Smith #include "phComm.h"
3f262839cSCameron Smith #include <stdio.h>
482f286aaSCameron Smith #include <string.h>
5*ade0e30fSCameron Smith #include <assert.h>
6d1293ce9SCameron Smith #include <phastaIO.h>
7d1293ce9SCameron Smith #include <sstream>
8d1293ce9SCameron Smith #include <string>
9d1293ce9SCameron Smith 
10f262839cSCameron Smith namespace {
11f262839cSCameron Smith   std::string appendSync(const char* phrase) {
12f262839cSCameron Smith     std::stringstream ss;
13f262839cSCameron Smith     ss << phrase << "@" << phcomm_rank()+1 << "?";
14f262839cSCameron Smith     std::string s = ss.str();
15f262839cSCameron Smith     return s;
16f262839cSCameron Smith   }
1782f286aaSCameron Smith   std::string appendColor(const char* phrase, int numFiles) {
1882f286aaSCameron Smith     const int color = computeColor(phcomm_rank(), phcomm_size(), numFiles);
1982f286aaSCameron Smith     std::stringstream ss;
2082f286aaSCameron Smith     ss << phrase << color+1;
2182f286aaSCameron Smith     std::string s = ss.str();
2282f286aaSCameron Smith     return s;
2382f286aaSCameron Smith   }
24f262839cSCameron Smith }
25f262839cSCameron Smith 
2682f286aaSCameron Smith void phio_readheader(
2782f286aaSCameron Smith     int* fileDescriptor,
28d1293ce9SCameron Smith     const  char keyphrase[],
29d1293ce9SCameron Smith     void* valueArray,
30d1293ce9SCameron Smith     int*  nItems,
31d1293ce9SCameron Smith     const char  datatype[],
32d1293ce9SCameron Smith     const char  iotype[] ) {
33f262839cSCameron Smith   std::string syncPhrase = appendSync(keyphrase);
34f262839cSCameron Smith   readheader(fileDescriptor, syncPhrase.c_str(),
35d1293ce9SCameron Smith       valueArray, nItems, datatype, iotype);
36d1293ce9SCameron Smith }
37d1293ce9SCameron Smith 
38f262839cSCameron Smith void phio_readdatablock(
39f262839cSCameron Smith     int*  fileDescriptor,
40f262839cSCameron Smith     const char keyphrase[],
41f262839cSCameron Smith     void* valueArray,
42f262839cSCameron Smith     int*  nItems,
43f262839cSCameron Smith     const char  datatype[],
44f262839cSCameron Smith     const char  iotype[] ) {
45f262839cSCameron Smith   std::string syncPhrase = appendSync(keyphrase);
46f262839cSCameron Smith   readdatablock(fileDescriptor, syncPhrase.c_str(),
47f262839cSCameron Smith       valueArray, nItems, datatype, iotype);
48f262839cSCameron Smith }
49f262839cSCameron Smith 
5082f286aaSCameron Smith void phio_openfile(
5182f286aaSCameron Smith     const char filename[],
5282f286aaSCameron Smith     const char mode[],
5382f286aaSCameron Smith     int* numFiles,
54*ade0e30fSCameron Smith     int* numFields,
55*ade0e30fSCameron Smith     int* numPPF,
5682f286aaSCameron Smith     int* fileDescriptor) {
5782f286aaSCameron Smith   std::string syncName = appendColor(filename, *numFiles);
58*ade0e30fSCameron Smith   int nfields = *numFields;
59*ade0e30fSCameron Smith   int nppf = *numPPF;
60*ade0e30fSCameron Smith   if( std::string(mode) == "read" )
6182f286aaSCameron Smith     queryphmpiio(syncName.c_str(), &nfields, &nppf);
62*ade0e30fSCameron Smith   //TODO - define a good upper bound
63*ade0e30fSCameron Smith   assert(nfields > 0 && nfields < 1024);
64*ade0e30fSCameron Smith   assert(nppf > 0 && nppf < 1024);
6582f286aaSCameron Smith   initphmpiio(&nfields, &nppf, numFiles, fileDescriptor, mode);
6682f286aaSCameron Smith   openfile(syncName.c_str(), mode, fileDescriptor);
6782f286aaSCameron Smith }
68f262839cSCameron Smith 
6982f286aaSCameron Smith void phio_restartname(int* step, char* filename) {
7082f286aaSCameron Smith   std::stringstream ss;
7182f286aaSCameron Smith   ss << "restart-dat." << *step << '.';
7282f286aaSCameron Smith   std::string s = ss.str();
7382f286aaSCameron Smith   strcpy(filename, s.c_str());
7482f286aaSCameron Smith }
75