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)
  7: #include <mfhdf.h>
  8: #endif

 10: typedef struct {
 11:  int sd_id;
 12:  char *filename;
 13:  PetscViewerBinaryType 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);
 30:  }
 31:  PetscFree(vhdf4); CE;
 32:  return(0);
 33: }

 35: EXTERN_C_BEGIN
 38: int PetscViewerCreate_HDF4(PetscViewer v)
 39: {
 41:  PetscViewer_HDF4 *vhdf4;
 42: 
 44:  PetscNew(PetscViewer_HDF4,&vhdf4); CE;
 45:  v->data            = (void*)vhdf4;
 46:  v->ops->destroy    = PetscViewerDestroy_HDF4;
 47:  v->ops->flush      = 0;
 48:  v->iformat         = 0;
 49:  vhdf4->btype       = (PetscViewerBinaryType) -1;
 50:  vhdf4->filename    = 0;
 51:  vhdf4->sd_id       = -1;
 52: #if 0
 53:  v->ops->getsingleton     = PetscViewerGetSingleton_Binary;
 54:  v->ops->restoresingleton = PetscViewerRestoreSingleton_Binary;
 55: #endif 
 56: 
 57:  PetscObjectComposeFunctionDynamic(
 58:  (PetscObject)v,
 59:  "PetscViewerSetFilename_C",
 60:  "PetscViewerSetFilename_HDF4",
 61:  PetscViewerSetFilename_HDF4);CE;
 62:  return(0);
 63: }
 64: EXTERN_C_END

 68: int PetscViewerHDF4SetType(PetscViewer viewer, PetscViewerBinaryType type)
 69: {
 70:  PetscViewer_HDF4 *vhdf4 = (PetscViewer_HDF4 *)viewer->data;
 71: 
 74:  vhdf4->btype = type;
 75:  return(0);
 76: }

 80: int PetscViewerHDF4Open(MPI_Comm comm, const char *name,
 81:  PetscViewerBinaryType type, PetscViewer *hdf4v)
 82: {
 84: 
 86:  PetscViewerCreate(comm,hdf4v);CE;
 87:  PetscViewerSetType(*hdf4v,PETSC_VIEWER_HDF4);CE;
 88:  PetscViewerHDF4SetType(*hdf4v, type);CE;
 89:  PetscViewerSetFilename(*hdf4v, name);CE;
 90:  return(0);
 91: }

 93: EXTERN_C_BEGIN
 96: int PetscViewerSetFilename_HDF4(PetscViewer viewer,const char name[])
 97: {
 98:  int                   ierr, rank;
 99:  PetscViewer_HDF4      *vhdf4 = (PetscViewer_HDF4*)viewer->data;
100:  int32                 acc;


104:  switch (vhdf4->btype) {
105:  case PETSC_BINARY_RDONLY:
106:    acc = DFACC_READ;
107:    break;
108:  case PETSC_BINARY_WRONLY:
109:    acc = DFACC_WRITE;
110:  break;
111:  case PETSC_BINARY_CREATE:
112:    acc = DFACC_CREATE;
113:    break;
114:  default:
115:    SETERRQ(1,"Must call PetscViewerHDF4SetType() before "
116:            "PetscViewerSetFilename()");
117:  }

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

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

123:  if (rank == 0) {
124:    vhdf4->sd_id = SDstart(name, acc);
125:    if (vhdf4->sd_id < 0) {
126:      SETERRQ1(1, "SDstart failed for %s", name);
127:    }
128:  }

130:  viewer->format = PETSC_VIEWER_NOFORMAT;
131:  return(0);
132: }
133: EXTERN_C_END

137: int PetscViewerHDF4WriteSDS(PetscViewer viewer, float *xf, int d, int *dims,int bs)
138: {
139:  int                   i;
140:  PetscViewer_HDF4      *vhdf4 = (PetscViewer_HDF4*)viewer->data;
141:  int32                 sds_id,zero32[3],dims32[3];


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