xref: /petsc/src/sys/classes/viewer/impls/adios/adios.c (revision 22580e64c5e00024240e4ba306cfbc634ae5bd68)
1 #include <petsc/private/viewerimpl.h>    /*I   "petscsys.h"   I*/
2 #include <adios.h>
3 #include <adios_read.h>
4 
5 int64_t Petsc_adios_group;
6 
7 #include <petsc/private/vieweradiosimpl.h>
8 
9 static PetscErrorCode PetscViewerSetFromOptions_ADIOS(PetscOptionItems *PetscOptionsObject,PetscViewer v)
10 {
11   PetscErrorCode ierr;
12 
13   PetscFunctionBegin;
14   ierr = PetscOptionsHead(PetscOptionsObject,"ADIOS PetscViewer Options");CHKERRQ(ierr);
15   ierr = PetscOptionsTail();CHKERRQ(ierr);
16   PetscFunctionReturn(0);
17 }
18 
19 static PetscErrorCode PetscViewerFileClose_ADIOS(PetscViewer viewer)
20 {
21   PetscViewer_ADIOS *adios = (PetscViewer_ADIOS*)viewer->data;
22   PetscErrorCode    ierr;
23 
24   PetscFunctionBegin;
25   switch (adios->btype) {
26   case FILE_MODE_READ:
27     ierr = adios_read_close(adios->adios_fp);CHKERRQ(ierr);
28     break;
29   case FILE_MODE_APPEND:
30     break;
31   case FILE_MODE_WRITE:
32      ierr = adios_close(adios->adios_handle);CHKERRQ(ierr);
33     break;
34   default:
35     break;
36   }
37   ierr = PetscFree(adios->filename);CHKERRQ(ierr);
38   PetscFunctionReturn(0);
39 }
40 
41 PetscErrorCode PetscViewerDestroy_ADIOS(PetscViewer viewer)
42 {
43   PetscViewer_ADIOS *adios = (PetscViewer_ADIOS*) viewer->data;
44   PetscErrorCode    ierr;
45 
46   PetscFunctionBegin;
47   ierr = PetscViewerFileClose_ADIOS(viewer);CHKERRQ(ierr);
48   ierr = PetscFree(adios);CHKERRQ(ierr);
49   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetName_C",NULL);CHKERRQ(ierr);
50   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileGetName_C",NULL);CHKERRQ(ierr);
51   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetMode_C",NULL);CHKERRQ(ierr);
52   PetscFunctionReturn(0);
53 }
54 
55 PetscErrorCode  PetscViewerFileSetMode_ADIOS(PetscViewer viewer, PetscFileMode type)
56 {
57   PetscViewer_ADIOS *adios = (PetscViewer_ADIOS*) viewer->data;
58 
59   PetscFunctionBegin;
60   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
61   adios->btype = type;
62   PetscFunctionReturn(0);
63 }
64 
65 PetscErrorCode  PetscViewerFileSetName_ADIOS(PetscViewer viewer, const char name[])
66 {
67   PetscViewer_ADIOS *adios = (PetscViewer_ADIOS*) viewer->data;
68   PetscErrorCode    ierr;
69 
70   PetscFunctionBegin;
71   if (adios->filename) {ierr = PetscFree(adios->filename);CHKERRQ(ierr);}
72   ierr = PetscStrallocpy(name, &adios->filename);CHKERRQ(ierr);
73   /* Create or open the file collectively */
74   switch (adios->btype) {
75   case FILE_MODE_READ:
76     adios->adios_fp = adios_read_open_file(adios->filename,ADIOS_READ_METHOD_BP,PetscObjectComm((PetscObject)viewer));
77     break;
78   case FILE_MODE_APPEND:
79     break;
80   case FILE_MODE_WRITE:
81     adios_open(&adios->adios_handle,"PETSc",adios->filename,"w",PetscObjectComm((PetscObject)viewer));
82     break;
83   default:
84     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER, "Must call PetscViewerFileSetMode() before PetscViewerFileSetName()");
85   }
86   PetscFunctionReturn(0);
87 }
88 
89 static PetscErrorCode PetscViewerFileGetName_ADIOS(PetscViewer viewer,const char **name)
90 {
91   PetscViewer_ADIOS *vadios = (PetscViewer_ADIOS*)viewer->data;
92 
93   PetscFunctionBegin;
94   *name = vadios->filename;
95   PetscFunctionReturn(0);
96 }
97 
98 /*MC
99    PETSCVIEWERADIOS - A viewer that writes to an ADIOS file
100 
101 
102 .seealso:  PetscViewerADIOSOpen(), PetscViewerStringSPrintf(), PetscViewerSocketOpen(), PetscViewerDrawOpen(), PETSCVIEWERSOCKET,
103            PetscViewerCreate(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PETSCVIEWERBINARY, PETSCVIEWERDRAW, PETSCVIEWERSTRING,
104            PetscViewerMatlabOpen(), VecView(), DMView(), PetscViewerMatlabPutArray(), PETSCVIEWERASCII, PETSCVIEWERMATLAB,
105            PetscViewerFileSetName(), PetscViewerFileSetMode(), PetscViewerFormat, PetscViewerType, PetscViewerSetType()
106 
107   Level: beginner
108 M*/
109 
110 PETSC_EXTERN PetscErrorCode PetscViewerCreate_ADIOS(PetscViewer v)
111 {
112   PetscViewer_ADIOS *adios;
113   PetscErrorCode    ierr;
114 
115   PetscFunctionBegin;
116   ierr = PetscNewLog(v,&adios);CHKERRQ(ierr);
117 
118   v->data                = (void*) adios;
119   v->ops->destroy        = PetscViewerDestroy_ADIOS;
120   v->ops->setfromoptions = PetscViewerSetFromOptions_ADIOS;
121   v->ops->flush          = 0;
122   adios->btype            = (PetscFileMode) -1;
123   adios->filename         = 0;
124   adios->timestep         = -1;
125 
126   ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileSetName_C",PetscViewerFileSetName_ADIOS);CHKERRQ(ierr);
127   ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileGetName_C",PetscViewerFileGetName_ADIOS);CHKERRQ(ierr);
128   ierr = PetscObjectComposeFunction((PetscObject)v,"PetscViewerFileSetMode_C",PetscViewerFileSetMode_ADIOS);CHKERRQ(ierr);
129   PetscFunctionReturn(0);
130 }
131 
132 /*@C
133    PetscViewerADIOSOpen - Opens a file for ADIOS input/output.
134 
135    Collective on MPI_Comm
136 
137    Input Parameters:
138 +  comm - MPI communicator
139 .  name - name of file
140 -  type - type of file
141 $    FILE_MODE_WRITE - create new file for binary output
142 $    FILE_MODE_READ - open existing file for binary input
143 $    FILE_MODE_APPEND - open existing file for binary output
144 
145    Output Parameter:
146 .  adiosv - PetscViewer for ADIOS input/output to use with the specified file
147 
148    Level: beginner
149 
150    Note:
151    This PetscViewer should be destroyed with PetscViewerDestroy().
152 
153    Concepts: ADIOS files
154    Concepts: PetscViewerADIOS^creating
155 
156 .seealso: PetscViewerASCIIOpen(), PetscViewerPushFormat(), PetscViewerDestroy(), PetscViewerHDF5Open(),
157           VecView(), MatView(), VecLoad(), PetscViewerSetType(), PetscViewerFileSetMode(), PetscViewerFileSetName()
158           MatLoad(), PetscFileMode, PetscViewer
159 @*/
160 PetscErrorCode  PetscViewerADIOSOpen(MPI_Comm comm, const char name[], PetscFileMode type, PetscViewer *adiosv)
161 {
162   PetscErrorCode ierr;
163 
164   PetscFunctionBegin;
165   ierr = PetscViewerCreate(comm, adiosv);CHKERRQ(ierr);
166   ierr = PetscViewerSetType(*adiosv, PETSCVIEWERADIOS);CHKERRQ(ierr);
167   ierr = PetscViewerFileSetMode(*adiosv, type);CHKERRQ(ierr);
168   ierr = PetscViewerFileSetName(*adiosv, name);CHKERRQ(ierr);
169   PetscFunctionReturn(0);
170 }
171 
172 /*@C
173   PetscDataTypeToADIOSDataType - Converts the PETSc name of a datatype to its ADIOS name.
174 
175   Not collective
176 
177   Input Parameter:
178 . ptype - the PETSc datatype name (for example PETSC_DOUBLE)
179 
180   Output Parameter:
181 . mtype - the MPI datatype (for example MPI_DOUBLE, ...)
182 
183   Level: advanced
184 
185   Developer Notes: These have not been verified
186 
187 .seealso: PetscDataType, PetscADIOSDataTypeToPetscDataType()
188 @*/
189 PetscErrorCode PetscDataTypeToADIOSDataType(PetscDataType ptype, enum ADIOS_DATATYPES *htype)
190 {
191   PetscFunctionBegin;
192   if (ptype == PETSC_INT)
193 #if defined(PETSC_USE_64BIT_INDICES)
194                                        *htype = adios_long;
195 #else
196                                        *htype = adios_integer;
197 #endif
198   else if (ptype == PETSC_ENUM)        *htype = adios_integer;
199   else if (ptype == PETSC_DOUBLE)      *htype = adios_double;
200   else if (ptype == PETSC_LONG)        *htype = adios_long;
201   else if (ptype == PETSC_SHORT)       *htype = adios_short;
202   else if (ptype == PETSC_FLOAT)       *htype = adios_real;
203   else if (ptype == PETSC_CHAR)        *htype = adios_string_array;
204   else if (ptype == PETSC_STRING)      *htype = adios_string;
205   else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Unsupported PETSc datatype");
206   PetscFunctionReturn(0);
207 }
208 
209 /*@C
210   PetscADIOSDataTypeToPetscDataType - Finds the PETSc name of a datatype from its ADIOS name
211 
212   Not collective
213 
214   Input Parameter:
215 . htype - the ADIOS datatype (for example H5T_NATIVE_DOUBLE, ...)
216 
217   Output Parameter:
218 . ptype - the PETSc datatype name (for example PETSC_DOUBLE)
219 
220   Level: advanced
221 
222   Developer Notes: These have not been verified
223 
224 .seealso: PetscDataType, PetscADIOSDataTypeToPetscDataType()
225 @*/
226 PetscErrorCode PetscADIOSDataTypeToPetscDataType(enum ADIOS_DATATYPES htype, PetscDataType *ptype)
227 {
228   PetscFunctionBegin;
229 #if defined(PETSC_USE_64BIT_INDICES)
230   if      (htype == adios_integer)     *ptype = PETSC_ENUM;
231   else if (htype == adios_long)        *ptype = PETSC_INT;
232 #else
233   if      (htype == adios_integer)     *ptype = PETSC_INT;
234 #endif
235   else if (htype == adios_double)      *ptype = PETSC_DOUBLE;
236   else if (htype == adios_long)        *ptype = PETSC_LONG;
237   else if (htype == adios_short)       *ptype = PETSC_SHORT;
238   else if (htype == adios_real)        *ptype = PETSC_FLOAT;
239   else if (htype == adios_string_array) *ptype = PETSC_CHAR;
240   else if (htype == adios_string)       *ptype = PETSC_STRING;
241   else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Unsupported ADIOS datatype");
242   PetscFunctionReturn(0);
243 }
244 
245