Actual source code: hdf4v.c

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

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

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

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

 19: PetscErrorCode PetscViewerDestroy_HDF4(PetscViewer v)
 20: {
 21:  PetscErrorCode   ierr;
 22:  PetscViewer_HDF4 *vhdf4 = (PetscViewer_HDF4 *)v->data;

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

 37: PetscErrorCode  PetscViewerFileSetMode_HDF4(PetscViewer viewer, PetscFileMode type)
 38: {
 39:  PetscViewer_HDF4 *vhdf4 = (PetscViewer_HDF4 *)viewer->data;
 40: 
 43:  vhdf4->btype = type;
 44:  return(0);
 45: }

 51: PetscErrorCode  PetscViewerFileSetName_HDF4(PetscViewer viewer,const char name[])
 52: {
 53:  PetscErrorCode        ierr;
 54:  int                   rank;
 55:  PetscViewer_HDF4      *vhdf4 = (PetscViewer_HDF4*)viewer->data;
 56:  int32                 acc;


 60:  switch (vhdf4->btype) {
 61:  case FILE_MODE_READ:
 62:    acc = DFACC_READ;
 63:    break;
 64:  case FILE_MODE_WRITE:
 65:    acc = DFACC_WRITE;
 66:  break;
 67:  default:
 68:    SETERRQ(PETSC_ERR_ORDER,"Must call PetscViewerFileSetMode() before PetscViewerFileSetName()");
 69:  }

 71:  MPI_Comm_rank(((PetscObject)viewer)->comm,&rank);CE;
 72:  PetscStrallocpy(name,&vhdf4->filename);CE;
 73:  if (!rank) {
 74:    vhdf4->sd_id = SDstart(name, acc);
 75:    if (vhdf4->sd_id < 0) {
 76:      SETERRQ1(PETSC_ERR_LIB, "SDstart failed for %s", name);
 77:    }
 78:  }
 79:  viewer->format = PETSC_VIEWER_NOFORMAT;
 80:  return(0);
 81: }

 87: PetscErrorCode  PetscViewerCreate_HDF4(PetscViewer v)
 88: {
 89:  PetscErrorCode   ierr;
 90:  PetscViewer_HDF4 *vhdf4;
 91: 
 93:  PetscNewLog(v,PetscViewer_HDF4,&vhdf4); CE;
 94:  v->data            = (void*)vhdf4;
 95:  v->ops->destroy    = PetscViewerDestroy_HDF4;
 96:  v->ops->flush      = 0;
 97:  v->iformat         = 0;
 98:  vhdf4->btype       = (PetscFileMode) -1;
 99:  vhdf4->filename    = 0;
100:  vhdf4->sd_id       = -1;
101: 
102:  PetscObjectComposeFunctionDynamic((PetscObject)v,"PetscViewerFileSetName_C","PetscViewerFileSetName_HDF4",
103:                                            PetscViewerFileSetName_HDF4);CE;
104:  PetscObjectComposeFunctionDynamic((PetscObject)v,"PetscViewerFileSetMode_C","PetscViewerFileSetMode_HDF4",
105:                                            PetscViewerFileSetMode_HDF4);CE;
106:  return(0);
107: }


113: PetscErrorCode  PetscViewerHDF4Open(MPI_Comm comm, const char *name, PetscFileMode type, PetscViewer *hdf4v)
114: {
116: 
118:  PetscViewerCreate(comm,hdf4v);CE;
119:  PetscViewerSetType(*hdf4v,PETSC_VIEWER_HDF4);CE;
120:  PetscViewerFileSetMode(*hdf4v, type);CE;
121:  PetscViewerFileSetName(*hdf4v, name);CE;
122:  return(0);
123: }


128: PetscErrorCode  PetscViewerHDF4WriteSDS(PetscViewer viewer, float *xf, int d, int *dims,int bs)
129: {
130:  int                   i;
131:  PetscViewer_HDF4      *vhdf4 = (PetscViewer_HDF4*)viewer->data;
132:  int32                 sds_id,zero32[3],dims32[3];


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