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