xref: /phasta/phSolver/common/phIO.cc (revision 66a3fa2cf7e805954547589463a2a908fd97bfd3)
1d1293ce9SCameron Smith #include "phIO.h"
2d1293ce9SCameron Smith #include "phComm.h"
3f262839cSCameron Smith #include <stdio.h>
482f286aaSCameron Smith #include <string.h>
5ade0e30fSCameron Smith #include <assert.h>
6d1293ce9SCameron Smith #include <phastaIO.h>
7d1293ce9SCameron Smith #include <sstream>
8d1293ce9SCameron Smith #include <string>
9d1293ce9SCameron Smith 
10f262839cSCameron Smith namespace {
11fa18c524SCameron Smith   void appendRank(std::stringstream& ss, const char* phrase) {
12fa18c524SCameron Smith     ss << phrase << "@" << phcomm_rank()+1;
13fa18c524SCameron Smith   }
14f262839cSCameron Smith   std::string appendSync(const char* phrase) {
15f262839cSCameron Smith     std::stringstream ss;
16fa18c524SCameron Smith     appendRank(ss,phrase);
17fa18c524SCameron Smith     ss << "?";
18fa18c524SCameron Smith     return ss.str();
19fa18c524SCameron Smith   }
20fa18c524SCameron Smith   std::string appendSyncWrite(const char* phrase) {
21fa18c524SCameron Smith     std::stringstream ss;
22fa18c524SCameron Smith     appendRank(ss,phrase);
23fa18c524SCameron Smith     return ss.str();
24f262839cSCameron Smith   }
2582f286aaSCameron Smith   std::string appendColor(const char* phrase, int numFiles) {
2682f286aaSCameron Smith     const int color = computeColor(phcomm_rank(), phcomm_size(), numFiles);
2782f286aaSCameron Smith     std::stringstream ss;
2882f286aaSCameron Smith     ss << phrase << color+1;
29fa18c524SCameron Smith     return ss.str();
3082f286aaSCameron Smith   }
31f262839cSCameron Smith }
32f262839cSCameron Smith 
3382f286aaSCameron Smith void phio_readheader(
3482f286aaSCameron Smith     int* fileDescriptor,
35d1293ce9SCameron Smith     const  char keyphrase[],
36d1293ce9SCameron Smith     void* valueArray,
37d1293ce9SCameron Smith     int*  nItems,
38d1293ce9SCameron Smith     const char  datatype[],
39d1293ce9SCameron Smith     const char  iotype[] ) {
40f262839cSCameron Smith   std::string syncPhrase = appendSync(keyphrase);
41f262839cSCameron Smith   readheader(fileDescriptor, syncPhrase.c_str(),
42d1293ce9SCameron Smith       valueArray, nItems, datatype, iotype);
43d1293ce9SCameron Smith }
44d1293ce9SCameron Smith 
45fa18c524SCameron Smith void phio_writeheader(
46fa18c524SCameron Smith       const int* fileDescriptor,
47fa18c524SCameron Smith       const char keyphrase[],
48fa18c524SCameron Smith       const void* valueArray,
49fa18c524SCameron Smith       const int* nItems,
50fa18c524SCameron Smith       const int* ndataItems,
51fa18c524SCameron Smith       const char datatype[],
52fa18c524SCameron Smith       const char iotype[] ) {
53fa18c524SCameron Smith   std::string syncPhrase = appendSyncWrite(keyphrase);
54fa18c524SCameron Smith   writeheader(fileDescriptor, syncPhrase.c_str(),
55fa18c524SCameron Smith       valueArray, nItems, ndataItems, datatype, iotype);
56fa18c524SCameron Smith }
57fa18c524SCameron Smith 
58fa18c524SCameron Smith 
59f262839cSCameron Smith void phio_readdatablock(
60f262839cSCameron Smith     int*  fileDescriptor,
61f262839cSCameron Smith     const char keyphrase[],
62f262839cSCameron Smith     void* valueArray,
63f262839cSCameron Smith     int*  nItems,
64f262839cSCameron Smith     const char  datatype[],
65f262839cSCameron Smith     const char  iotype[] ) {
66f262839cSCameron Smith   std::string syncPhrase = appendSync(keyphrase);
67f262839cSCameron Smith   readdatablock(fileDescriptor, syncPhrase.c_str(),
68f262839cSCameron Smith       valueArray, nItems, datatype, iotype);
69f262839cSCameron Smith }
70f262839cSCameron Smith 
71*66a3fa2cSCameron Smith void phio_writedatablock(
72*66a3fa2cSCameron Smith     const int* fileDescriptor,
73*66a3fa2cSCameron Smith     const char keyphrase[],
74*66a3fa2cSCameron Smith     const void* valueArray,
75*66a3fa2cSCameron Smith     const int* nItems,
76*66a3fa2cSCameron Smith     const char datatype[],
77*66a3fa2cSCameron Smith     const char iotype[]) {
78*66a3fa2cSCameron Smith   std::string syncPhrase = appendSyncWrite(keyphrase);
79*66a3fa2cSCameron Smith   writedatablock(fileDescriptor, syncPhrase.c_str(),
80*66a3fa2cSCameron Smith       valueArray, nItems, datatype, iotype);
81*66a3fa2cSCameron Smith }
82*66a3fa2cSCameron Smith 
8392bfab9aSCameron Smith void phio_openfile_read(
8482f286aaSCameron Smith     const char filename[],
8592bfab9aSCameron Smith     int* numFiles,
8692bfab9aSCameron Smith     int* fileDescriptor) {
8792bfab9aSCameron Smith   std::string syncName = appendColor(filename, *numFiles);
8892bfab9aSCameron Smith   int nfields=0;
8992bfab9aSCameron Smith   int nppf=0;
9092bfab9aSCameron Smith   queryphmpiio(syncName.c_str(), &nfields, &nppf);
9192bfab9aSCameron Smith   const char* mode = "read";
9292bfab9aSCameron Smith   initphmpiio(&nfields, &nppf, numFiles, fileDescriptor, mode);
9392bfab9aSCameron Smith   openfile(syncName.c_str(), mode, fileDescriptor);
9492bfab9aSCameron Smith }
9592bfab9aSCameron Smith 
9692bfab9aSCameron Smith void phio_openfile_write(
9792bfab9aSCameron Smith     const char filename[],
9882f286aaSCameron Smith     int* numFiles,
99ade0e30fSCameron Smith     int* numFields,
100ade0e30fSCameron Smith     int* numPPF,
10182f286aaSCameron Smith     int* fileDescriptor) {
10282f286aaSCameron Smith   std::string syncName = appendColor(filename, *numFiles);
103ade0e30fSCameron Smith   //TODO - define a good upper bound
10492bfab9aSCameron Smith   assert(*numFields > 0 && *numFields < 1024);
10592bfab9aSCameron Smith   assert(*numPPF > 0 && *numPPF < 1024);
10692bfab9aSCameron Smith   const char* mode = "write";
10792bfab9aSCameron Smith   initphmpiio(numFields, numPPF, numFiles, fileDescriptor, mode);
10882f286aaSCameron Smith   openfile(syncName.c_str(), mode, fileDescriptor);
10982f286aaSCameron Smith }
110f262839cSCameron Smith 
11182f286aaSCameron Smith void phio_restartname(int* step, char* filename) {
11282f286aaSCameron Smith   std::stringstream ss;
11382f286aaSCameron Smith   ss << "restart-dat." << *step << '.';
11482f286aaSCameron Smith   std::string s = ss.str();
11582f286aaSCameron Smith   strcpy(filename, s.c_str());
11682f286aaSCameron Smith }
117a7c8a483SCameron Smith 
118a7c8a483SCameron Smith void phio_closefile_read(int* fileDescriptor) {
119a7c8a483SCameron Smith   const char* mode = "read";
120a7c8a483SCameron Smith   closefile(fileDescriptor, mode);
121a7c8a483SCameron Smith   finalizephmpiio(fileDescriptor);
122a7c8a483SCameron Smith }
123a7c8a483SCameron Smith 
124a7c8a483SCameron Smith void phio_closefile_write(int* fileDescriptor) {
125a7c8a483SCameron Smith   const char* mode = "write";
126a7c8a483SCameron Smith   closefile(fileDescriptor, mode);
127a7c8a483SCameron Smith   finalizephmpiio(fileDescriptor);
128a7c8a483SCameron Smith }
129