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