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