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