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: }