NMD
|
00001 #include <stdlib.h> 00002 #include <stdio.h> 00003 #include <string.h> 00004 #include "nmd_impl.h" 00005 #include "nmd.h" 00006 00007 #if defined(NMD_HAVE_HDF5) 00008 #include "hdf5.h" 00009 #define H5ERR(i) if (i<0) {NMD_ERR_RETURN(i);} 00010 00011 /*! Generate an HDF5 dump of an object 00012 */ 00013 #undef __FUNCT__ 00014 #define __FUNCT__ "NMDObjectDumpToHDF5" 00015 NMDErrorCode NMDObjectDumpToHDF5(NMD_metadata obj,const char *fname) 00016 { 00017 hid_t f,element,ds; hsize_t dim[1]; herr_t status; 00018 int icat,icmp; 00019 NMDErrorCode ierr; 00020 CHECKHASNMDCOOKIE(obj); 00021 00022 f = H5Fcreate 00023 (fname,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT); H5ERR(f); 00024 dim[0] = 1; 00025 element = H5Screate_simple(1,dim,NULL); H5ERR(element); 00026 00027 for (icat=0; icat<obj->ncat; icat++) { 00028 NMD_metadata_category cat = obj->cats[icat]; 00029 NMD_string catstring,grpstring; const char *c; 00030 CHECKHASNMDCOOKIE(cat); 00031 ierr = NMDStringCreate(cat->name,&catstring); NMD_ERR_RETURN(ierr); 00032 ierr = NMDStringConcat 00033 ('/',catstring,0,0,0,&grpstring); NMD_ERR_RETURN(ierr); 00034 ierr = NMDStringGetString(grpstring,&c); NMD_ERR_RETURN(ierr); 00035 ds = H5Gcreate(f,c,0,H5P_DEFAULT,H5P_DEFAULT); H5ERR(ds); 00036 00037 for (icmp=0; icmp<cat->ncmp; icmp++) { 00038 NMD_metadata_item cmp = cat->cmps[icmp]; 00039 NMD_string cmpstring,cmpcatstring; 00040 CHECKHASNMDCOOKIE(cmp); 00041 ierr = NMDStringCreate(cmp->name,&cmpstring); NMD_ERR_RETURN(ierr); 00042 ierr = NMDStringConcat 00043 ('/',catstring,'/',cmpstring,0,&cmpcatstring); NMD_ERR_RETURN(ierr); 00044 ierr = NMDStringGetString(cmpcatstring,&c); NMD_ERR_RETURN(ierr); 00045 #define HDF5DOUBLE H5T_NATIVE_DOUBLE 00046 #define HDF5INT H5T_NATIVE_INT 00047 //#define HDF5INT H5T_STD_I32LE 00048 switch (cmp->t) { 00049 case NMDInt : 00050 ds = H5Dcreate (f,c,HDF5INT,element,H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT); H5ERR(ds); 00051 status = H5Dwrite 00052 (ds, HDF5INT,H5S_ALL,H5S_ALL,H5P_DEFAULT, 00053 &(cmp->i)); H5ERR(status); 00054 break ; 00055 case NMDReal : 00056 ds = H5Dcreate (f,c,HDF5DOUBLE,element,H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT); H5ERR(ds); 00057 status = H5Dwrite 00058 (ds, HDF5DOUBLE,H5S_ALL,H5S_ALL,H5P_DEFAULT, 00059 &(cmp->r)); H5ERR(status); 00060 break; 00061 case NMDIntarray : 00062 { 00063 hid_t dataspace,memspace; 00064 dim[0] = cmp->ii->length; 00065 dataspace = H5Screate_simple(1,dim,NULL); H5ERR(dataspace); 00066 memspace = H5Screate_simple(1,dim,NULL); H5ERR(dataspace); 00067 ds = H5Dcreate (f,c,HDF5INT,dataspace,H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT); H5ERR(ds); 00068 status = H5Dwrite /* memspace,dataspace */ 00069 (ds, HDF5INT,memspace,dataspace,H5P_DEFAULT, 00070 cmp->ii->data); H5ERR(status); 00071 H5Sclose(memspace); H5Sclose(dataspace); 00072 break ; 00073 } 00074 case NMDRealarray : 00075 { 00076 hid_t dataspace,memspace; 00077 dim[0] = cmp->rr->length; 00078 dataspace = H5Screate_simple(1,dim,NULL); H5ERR(dataspace); 00079 memspace = H5Screate_simple(1,dim,NULL); H5ERR(dataspace); 00080 ds = H5Dcreate (f,c,HDF5DOUBLE,dataspace,H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT); H5ERR(ds); 00081 status = H5Dwrite /* */ 00082 (ds, HDF5DOUBLE,memspace,dataspace,H5P_DEFAULT, 00083 cmp->rr->data); H5ERR(status); 00084 H5Sclose(memspace); H5Sclose(dataspace); 00085 break ; 00086 } 00087 default : 00088 break ; 00089 } 00090 ierr = NMDStringDestroy(cmpstring); NMD_ERR_RETURN(ierr); 00091 ierr = NMDStringDestroy(cmpcatstring); NMD_ERR_RETURN(ierr); 00092 } 00093 ierr = NMDStringDestroy(catstring); NMD_ERR_RETURN(ierr); 00094 ierr = NMDStringDestroy(grpstring); NMD_ERR_RETURN(ierr); 00095 } 00096 00097 status = H5Fclose(f); 00098 00099 return 0; 00100 } 00101 #endif 00102