Actual source code: hdf4v.c

  1: #define HERE do { int ierr, rank; MPI_Comm_rank(PETSC_COMM_WORLD, &rank); PetscPrintf(PETSC_COMM_SELF,"[%d] LINE %d (%s)\n", rank, __LINE__, __FUNCTION__); } while (0)

  3: #define CE do {  } while (0)

  5: #include "src/sys/src/viewer/viewerimpl.h"    /*I   "petsc.h"   I*/
  6: #if defined(PETSC_HAVE_HDF4) && !defined(PETSC_USE_COMPLEX)
  7: #include <mfhdf.h>
  8: #endif

 10: typedef struct {
 11:  int                 sd_id;
 12:  char                *filename;
 13:  PetscViewerFileType btype;
 14: } PetscViewer_HDF4;

 18: int PetscViewerDestroy_HDF4(PetscViewer v)
 19: {
 21:  PetscViewer_HDF4 *vhdf4 = (PetscViewer_HDF4 *)v->data;

 24:  if (vhdf4->sd_id >= 0) {
 25:  SDend(vhdf4->sd_id);
 26:  vhdf4->sd_id = -1;
 27:  }
 28:  if (vhdf4->filename) {
 29:    PetscFree(vhdf4->filename);CE;
 30:  }
 31:  PetscFree(vhdf4); CE;
 32:  return(0);
 33: }

 35: EXTERN_C_BEGIN 
 36: EXTERN int PetscViewerSetFilename_HDF4(PetscViewer,const char[]);

 40: int PetscViewerCreate_HDF4(PetscViewer v)
 41: {
 43:  PetscViewer_HDF4 *vhdf4;
 44: 
 46:  PetscNew(PetscViewer_HDF4,&vhdf4); CE;
 47:  v->data            = (void*)vhdf4;
 48:  v->ops->destroy    = PetscViewerDestroy_HDF4;
 49:  v->ops->flush      = 0;
 50:  v->iformat         = 0;
 51:  vhdf4->btype       = (PetscViewerFileType) -1;
 52:  vhdf4->filename    = 0;
 53:  vhdf4->sd_id       = -1;
 54: 
 55:  PetscObjectComposeFunctionDynamic((PetscObject)v,"PetscViewerSetFilename_C","PetscViewerSetFilename_HDF4",
 56:                                            PetscViewerSetFilename_HDF4);CE;
 57:  PetscObjectComposeFunctionDynamic((PetscObject)v,"PetscViewerSetFileType_C","PetscViewerSetFileType_HDF4",
 58:                                            PetscViewerSetFileType_HDF4);CE;
 59:  return(0);
 60: }
 61: EXTERN_C_END

 65: int PetscViewerSetFileType_HDF4(PetscViewer viewer, PetscViewerFileType type)
 66: {
 67:  PetscViewer_HDF4 *vhdf4 = (PetscViewer_HDF4 *)viewer->data;
 68: 
 71:  vhdf4->btype = type;
 72:  return(0);
 73: }

 77: int PetscViewerHDF4Open(MPI_Comm comm, const char *name, PetscViewerFileType type, PetscViewer *hdf4v)
 78: {
 80: 
 82:  PetscViewerCreate(comm,hdf4v);CE;
 83:  PetscViewerSetType(*hdf4v,PETSC_VIEWER_HDF4);CE;
 84:  PetscViewerSetFileType(*hdf4v, type);CE;
 85:  PetscViewerSetFilename(*hdf4v, name);CE;
 86:  return(0);
 87: }

 89: EXTERN_C_BEGIN
 92: int PetscViewerSetFilename_HDF4(PetscViewer viewer,const char name[])
 93: {
 94:  int                   ierr, rank;
 95:  PetscViewer_HDF4      *vhdf4 = (PetscViewer_HDF4*)viewer->data;
 96:  int32                 acc;


100:  switch (vhdf4->btype) {
101:  case PETSC_FILE_RDONLY:
102:    acc = DFACC_READ;
103:    break;
104:  case PETSC_FILE_WRONLY:
105:    acc = DFACC_WRITE;
106:  break;
107:  case PETSC_FILE_CREATE:
108:    acc = DFACC_CREATE;
109:    break;
110:  default:
111:    SETERRQ(1,"Must call PetscViewerSetFileType() before PetscViewerSetFilename()");
112:  }

114:  MPI_Comm_rank(viewer->comm,&rank);CE;

116:  PetscStrallocpy(name,&vhdf4->filename);CE;

118:  if (rank == 0) {
119:    vhdf4->sd_id = SDstart(name, acc);
120:    if (vhdf4->sd_id < 0) {
121:      SETERRQ1(1, "SDstart failed for %s", name);
122:    }
123:  }

125:  viewer->format = PETSC_VIEWER_NOFORMAT;
126:  return(0);
127: }
128: EXTERN_C_END

132: int PetscViewerHDF4WriteSDS(PetscViewer viewer, float *xf, int d, int *dims,int bs)
133: {
134:  int                   i;
135:  PetscViewer_HDF4      *vhdf4 = (PetscViewer_HDF4*)viewer->data;
136:  int32                 sds_id,zero32[3],dims32[3];


140:  for (i = 0; i < d; i++) {
141:    zero32[i] = 0;
142:    dims32[i] = dims[i];
143:  }
144:  sds_id = SDcreate(vhdf4->sd_id, "Vec", DFNT_FLOAT32, d, dims32);
145:  if (sds_id < 0) {
146:    SETERRQ(1, "SDcreate failed");
147:  }
148:  SDwritedata(sds_id, zero32, 0, dims32, xf);
149:  SDendaccess(sds_id);
150:  return(0);
151: }