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