xref: /phasta/phSolver/common/phio_sync.cc (revision 7acde132a6def0fe2daaec0d1a712dff0e5c6636)
1 #include "phIO.h"
2 #include "phio_sync.h"
3 #include "phComm.h"
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <string.h>
7 #include <assert.h>
8 #include <phastaIO.h>
9 #include <sstream>
10 #include <string>
11 
12 namespace {
appendRank(std::stringstream & ss,const char * phrase)13   void appendRank(std::stringstream& ss, const char* phrase) {
14     ss << phrase << "@" << phcomm_rank()+1;
15   }
appendSync(const char * phrase)16   std::string appendSync(const char* phrase) {
17     std::stringstream ss;
18     appendRank(ss,phrase);
19     ss << "?";
20     return ss.str();
21   }
appendSyncWrite(const char * phrase)22   std::string appendSyncWrite(const char* phrase) {
23     std::stringstream ss;
24     appendRank(ss,phrase);
25     return ss.str();
26   }
appendColor(const char * phrase,int numFiles)27   std::string appendColor(const char* phrase, int numFiles) {
28     const int color = computeColor(phcomm_rank(), phcomm_size(), numFiles);
29     std::stringstream ss;
30     ss << phrase << color+1;
31     return ss.str();
32   }
close(sync_fp f,const char * mode)33   void close(sync_fp f, const char* mode) {
34     int* file = f->file;
35     closefile(file, mode);
36     finalizephmpiio(file);
37     free(file);
38     free(f);
39   }
40 }
41 
sync_openfile_read(const char filename[],phio_fp f)42 void sync_openfile_read(
43     const char filename[],
44     phio_fp f) {
45   sync_fp sf = (sync_fp) f;
46   std::string syncName = appendColor(filename, sf->nfiles);
47   int nfields=0;
48   int nppf=0;
49   queryphmpiio(syncName.c_str(), &nfields, &nppf);
50   const char* mode = "read";
51   int* file = sf->file;
52   initphmpiio(&nfields, &nppf, &(sf->nfiles), file, mode);
53   openfile(syncName.c_str(), mode, file);
54 }
55 
sync_openfile_write(const char filename[],phio_fp f)56 void sync_openfile_write(
57     const char filename[],
58     phio_fp f) {
59   sync_fp sf = (sync_fp) f;
60   std::string syncName = appendColor(filename, sf->nfiles);
61   const char* mode = "write";
62   int* file = sf->file;
63   initphmpiio(&(sf->nfields), &(sf->nppf),
64       &(sf->nfiles), file, mode);
65   openfile(syncName.c_str(), mode, file);
66 }
67 
sync_closefile(phio_fp f)68 void sync_closefile(phio_fp f) {
69   sync_fp sf = (sync_fp) f;
70   const char m = sf->mode;
71   if(m == 'r')
72     close(sf, "read");
73   else if(m == 'w')
74     close(sf, "write");
75   else {
76     fprintf(stderr, "ERROR unsupported file mode in %s on line %d"
77         "... exiting", __FILE__, __LINE__);
78     exit(EXIT_FAILURE);
79   }
80 }
81 
sync_readheader(int * fileDescriptor,const char keyphrase[],void * valueArray,int * nItems,const char datatype[],const char iotype[])82 void sync_readheader(
83     int* fileDescriptor,
84     const  char keyphrase[],
85     void* valueArray,
86     int*  nItems,
87     const char  datatype[],
88     const char  iotype[] ) {
89   std::string syncPhrase = appendSync(keyphrase);
90   readheader(fileDescriptor, syncPhrase.c_str(),
91       valueArray, nItems, datatype, iotype);
92 }
93 
sync_writeheader(const int * fileDescriptor,const char keyphrase[],const void * valueArray,const int * nItems,const int * ndataItems,const char datatype[],const char iotype[])94 void sync_writeheader(
95       const int* fileDescriptor,
96       const char keyphrase[],
97       const void* valueArray,
98       const int* nItems,
99       const int* ndataItems,
100       const char datatype[],
101       const char iotype[] ) {
102   std::string syncPhrase = appendSyncWrite(keyphrase);
103   writeheader(fileDescriptor, syncPhrase.c_str(),
104       valueArray, nItems, ndataItems, datatype, iotype);
105 }
106 
sync_readdatablock(int * fileDescriptor,const char keyphrase[],void * valueArray,int * nItems,const char datatype[],const char iotype[])107 void sync_readdatablock(
108     int* fileDescriptor,
109     const char keyphrase[],
110     void* valueArray,
111     int*  nItems,
112     const char  datatype[],
113     const char  iotype[] ) {
114   std::string syncPhrase = appendSync(keyphrase);
115   readdatablock(fileDescriptor, syncPhrase.c_str(),
116       valueArray, nItems, datatype, iotype);
117 }
118 
sync_writedatablock(const int * fileDescriptor,const char keyphrase[],const void * valueArray,const int * nItems,const char datatype[],const char iotype[])119 void sync_writedatablock(
120     const int* fileDescriptor,
121     const char keyphrase[],
122     const void* valueArray,
123     const int* nItems,
124     const char datatype[],
125     const char iotype[]) {
126   std::string syncPhrase = appendSyncWrite(keyphrase);
127   writedatablock(fileDescriptor, syncPhrase.c_str(),
128       valueArray, nItems, datatype, iotype);
129 }
130 
sync_constructname(const char * in,char * out)131 void sync_constructname(
132     const char* in,
133     char* out) {
134   std::string fullname(in);
135   fullname.append("-dat.");
136   sprintf(out, "%s", fullname.c_str());
137 }
138