NMD
nmd5.c
Go to the documentation of this file.
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