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