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