Hdf5Util.h
Go to the documentation of this file.
//----------------------------------------------------------------------------//
/*
* Copyright (c) 2009 Sony Pictures Imageworks Inc
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution. Neither the name of Sony Pictures Imageworks nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
#ifndef _INCLUDED_Field3D_Hdf5Util_H_
#define _INCLUDED_Field3D_Hdf5Util_H_
//----------------------------------------------------------------------------//
#include <string>
#include <exception>
#include <vector>
#include <boost/lexical_cast.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/recursive_mutex.hpp>
#include <hdf5.h>
#include "Exception.h"
#include "Traits.h"
#include "Field.h"
//----------------------------------------------------------------------------//
#include "ns.h"
FIELD3D_NAMESPACE_OPEN
//----------------------------------------------------------------------------//
// Global HDF5 Mutex
//----------------------------------------------------------------------------//
FIELD3D_API extern boost::recursive_mutex g_hdf5Mutex;
typedef boost::recursive_mutex::scoped_lock GlobalLock;
//----------------------------------------------------------------------------//
// Hdf5Util classes
//----------------------------------------------------------------------------//
namespace Hdf5Util {
//----------------------------------------------------------------------------//
class H5Base
{
public:
// Constructor
H5Base()
: m_id(-1)
{ /* Empty */ }
hid_t id() const
{ return m_id; }
operator hid_t ()
{ return m_id; }
protected:
hid_t m_id;
};
//----------------------------------------------------------------------------//
class H5ScopedAopen : public H5Base
{
public:
H5ScopedAopen(hid_t location, const std::string &name)
{
GlobalLock lock(g_hdf5Mutex);
m_id = H5Aopen(location, name.c_str(), H5P_DEFAULT);
if (m_id < 0)
throw Exc::MissingAttributeException("Couldn't open attribute " + name);
}
H5ScopedAopen(hid_t location, const std::string &name, hid_t aapl_id)
{
GlobalLock lock(g_hdf5Mutex);
m_id = H5Aopen(location, name.c_str(), aapl_id);
if (m_id < 0)
throw Exc::MissingAttributeException("Couldn't open attribute " + name);
}
~H5ScopedAopen()
{
GlobalLock lock(g_hdf5Mutex);
if (m_id >= 0)
H5Aclose(m_id);
}
};
//----------------------------------------------------------------------------//
class H5ScopedAopenIdx : public H5Base
{
public:
H5ScopedAopenIdx(hid_t location, unsigned idx)
{
GlobalLock lock(g_hdf5Mutex);
m_id = H5Aopen_idx(location, idx);
if (m_id < 0)
throw Exc::MissingAttributeException("Couldn't open attribute at index: " +
boost::lexical_cast<std::string>(idx));
}
~H5ScopedAopenIdx()
{
GlobalLock lock(g_hdf5Mutex);
if (m_id >= 0)
H5Aclose(m_id);
}
};
//----------------------------------------------------------------------------//
class H5ScopedGcreate : public H5Base
{
public:
H5ScopedGcreate(hid_t parentLocation, const std::string &name)
{
GlobalLock lock(g_hdf5Mutex);
m_id = H5Gcreate(parentLocation, name.c_str(),
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
}
H5ScopedGcreate(hid_t parentLocation, const std::string &name,
hid_t lcpl_id, hid_t gcpl_id, hid_t gapl_id)
{
GlobalLock lock(g_hdf5Mutex);
m_id = H5Gcreate(parentLocation, name.c_str(),
lcpl_id, gcpl_id, gapl_id);
}
~H5ScopedGcreate()
{
GlobalLock lock(g_hdf5Mutex);
if (m_id >= 0)
H5Gclose(m_id);
}
};
//----------------------------------------------------------------------------//
class H5ScopedGopen : public H5Base
{
public:
H5ScopedGopen()
: H5Base()
{
// Empty
}
H5ScopedGopen(hid_t parentLocation, const std::string &name)
{
open(parentLocation, name);
}
H5ScopedGopen(hid_t parentLocation, const std::string &name, hid_t gapl_id)
{
open(parentLocation, name, gapl_id);
}
void open(hid_t parentLocation, const std::string &name)
{
GlobalLock lock(g_hdf5Mutex);
m_id = H5Gopen(parentLocation, name.c_str(), H5P_DEFAULT);
}
void open(hid_t parentLocation, const std::string &name, hid_t gapl_id)
{
GlobalLock lock(g_hdf5Mutex);
m_id = H5Gopen(parentLocation, name.c_str(), gapl_id);
}
~H5ScopedGopen()
{
GlobalLock lock(g_hdf5Mutex);
if (m_id >= 0)
H5Gclose(m_id);
}
};
//----------------------------------------------------------------------------//
class H5ScopedScreate : public H5Base
{
public:
H5ScopedScreate()
: H5Base()
{
// Empty
}
H5ScopedScreate(H5S_class_t type)
{
create(type);
}
void create(H5S_class_t type)
{
GlobalLock lock(g_hdf5Mutex);
m_id = H5Screate(type);
}
~H5ScopedScreate()
{
GlobalLock lock(g_hdf5Mutex);
if (m_id >= 0)
H5Sclose(m_id);
}
};
//----------------------------------------------------------------------------//
class H5ScopedDcreate : public H5Base
{
public:
H5ScopedDcreate(hid_t parentLocation, const std::string &name,
hid_t dtype_id, hid_t space_id, hid_t lcpl_id,
hid_t dcpl_id, hid_t dapl_id)
{
GlobalLock lock(g_hdf5Mutex);
m_id = H5Dcreate(parentLocation, name.c_str(), dtype_id, space_id,
lcpl_id, dcpl_id, dapl_id);
}
~H5ScopedDcreate()
{
GlobalLock lock(g_hdf5Mutex);
if (m_id >= 0)
H5Dclose(m_id);
}
};
//----------------------------------------------------------------------------//
class H5ScopedAget_space : public H5Base
{
public:
H5ScopedAget_space(hid_t dataset_id)
{
GlobalLock lock(g_hdf5Mutex);
m_id = H5Aget_space(dataset_id);
if (m_id < 0)
throw Exc::AttrGetSpaceException("Couldn't get attribute space");
}
~H5ScopedAget_space()
{
GlobalLock lock(g_hdf5Mutex);
if (m_id >= 0)
H5Sclose(m_id);
}
};
//----------------------------------------------------------------------------//
class H5ScopedAget_type : public H5Base
{
public:
H5ScopedAget_type(hid_t dataset_id)
{
GlobalLock lock(g_hdf5Mutex);
m_id = H5Aget_type(dataset_id);
if (m_id < 0)
throw Exc::AttrGetTypeException("Couldn't get attribute type");
}
~H5ScopedAget_type()
{
GlobalLock lock(g_hdf5Mutex);
if (m_id >= 0)
H5Tclose(m_id);
}
};
//----------------------------------------------------------------------------//
class H5ScopedTget_native_type : public H5Base
{
public:
H5ScopedTget_native_type(hid_t dataset_id, H5T_direction_t direction)
{
GlobalLock lock(g_hdf5Mutex);
m_id = H5Tget_native_type(dataset_id, direction);
if (m_id < 0)
throw Exc::AttrGetNativeTypeException("Couldn't get native attribute type");
}
~H5ScopedTget_native_type()
{
GlobalLock lock(g_hdf5Mutex);
if (m_id >= 0)
H5Tclose(m_id);
}
};
//----------------------------------------------------------------------------//
class H5ScopedDopen : public H5Base
{
public:
H5ScopedDopen()
: H5Base()
{
// Empty
}
H5ScopedDopen(hid_t parentLocation, const std::string &name, hid_t dapl_id)
{
open(parentLocation, name, dapl_id);
}
void open(hid_t parentLocation, const std::string &name, hid_t dapl_id)
{
GlobalLock lock(g_hdf5Mutex);
m_id = H5Dopen(parentLocation, name.c_str(), dapl_id);
}
~H5ScopedDopen()
{
GlobalLock lock(g_hdf5Mutex);
if (m_id >= 0) {
H5Dclose(m_id);
}
}
};
//----------------------------------------------------------------------------//
class H5ScopedDget_space : public H5Base
{
public:
H5ScopedDget_space()
: H5Base()
{
// Empty
}
H5ScopedDget_space(hid_t dataset_id)
{
open(dataset_id);
}
void open(hid_t dataset_id)
{
GlobalLock lock(g_hdf5Mutex);
m_id = H5Dget_space(dataset_id);
}
~H5ScopedDget_space()
{
GlobalLock lock(g_hdf5Mutex);
if (m_id >= 0)
H5Sclose(m_id);
}
};
//----------------------------------------------------------------------------//
class H5ScopedDget_type : public H5Base
{
public:
H5ScopedDget_type()
: H5Base()
{
// Empty
}
H5ScopedDget_type(hid_t dataset_id)
{
open(dataset_id);
}
void open(hid_t dataset_id)
{
GlobalLock lock(g_hdf5Mutex);
m_id = H5Dget_type(dataset_id);
}
~H5ScopedDget_type()
{
GlobalLock lock(g_hdf5Mutex);
if (m_id >= 0)
H5Tclose(m_id);
}
};
//----------------------------------------------------------------------------//
// Hdf5Util functions
//----------------------------------------------------------------------------//
template <typename T>
void writeSimpleData(hid_t location, const std::string &name,
const std::vector<T> &data);
template <typename T>
void readSimpleData(hid_t location, const std::string &name,
std::vector<T> &data);
//----------------------------------------------------------------------------//
FIELD3D_API bool readAttribute(hid_t location, const std::string& attrName,
std::string& value);
FIELD3D_API bool readAttribute(hid_t location, const std::string& attrName,
unsigned int attrSize, int &value);
FIELD3D_API bool readAttribute(hid_t location, const std::string& attrName,
unsigned int attrSize, float &value);
FIELD3D_API bool readAttribute(hid_t location, const std::string& attrName,
unsigned int attrSize, double &value);
FIELD3D_API bool readAttribute(hid_t location, const std::string& attrName,
std::vector<unsigned int> &attrSize,
int &value);
FIELD3D_API bool readAttribute(hid_t location, const std::string& attrName,
std::vector<unsigned int> &attrSize,
float &value);
FIELD3D_API bool readAttribute(hid_t location, const std::string& attrName,
std::vector<unsigned int> &attrSize,
double &value);
//----------------------------------------------------------------------------//
FIELD3D_API bool writeAttribute(hid_t location, const std::string& attrName,
const std::string& value);
FIELD3D_API bool writeAttribute(hid_t location, const std::string& attrName,
unsigned int attrSize, const int &value);
FIELD3D_API bool writeAttribute(hid_t location, const std::string& attrName,
unsigned int attrSize, const float &value);
FIELD3D_API bool writeAttribute(hid_t location, const std::string& attrName,
unsigned int attrSize, const double &value);
FIELD3D_API bool writeAttribute(hid_t location, const std::string& attrName,
std::vector<unsigned int> &attrSize,
const int &value);
FIELD3D_API bool writeAttribute(hid_t location, const std::string& attrName,
std::vector<unsigned int> &attrSize,
const int &value);
FIELD3D_API bool writeAttribute(hid_t location, const std::string& attrName,
std::vector<unsigned int> &attrSize,
const float &value);
FIELD3D_API bool writeAttribute(hid_t location, const std::string& attrName,
std::vector<unsigned int> &attrSize,
const double &value);
//----------------------------------------------------------------------------//
FIELD3D_API bool checkHdf5Gzip();
//----------------------------------------------------------------------------//
// Templated functions and classes
//----------------------------------------------------------------------------//
template <typename T>
void writeSimpleData(hid_t location, const std::string &name,
const std::vector<T> &data)
{
using namespace Exc;
GlobalLock lock(g_hdf5Mutex);
// Calculate the total number of entries. This factors in that
// V3f uses 3 components per value, etc.
hsize_t totalSize[1];
int components = FieldTraits<T>::dataDims();
totalSize[0] = data.size() * components;
// Get the internal data type
hid_t type = DataTypeTraits<T>::h5type();
H5ScopedScreate dataSpace(H5S_SIMPLE);
if (dataSpace.id() < 0)
throw WriteSimpleDataException("Couldn't create data space");
H5Sset_extent_simple(dataSpace.id(), 1, totalSize, NULL);
H5ScopedDcreate dataSet(location, name.c_str(), type, dataSpace.id(),
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if (dataSet.id() < 0)
throw WriteSimpleDataException("Couldn't create data set");
hid_t err = H5Dwrite(dataSet.id(), type, H5S_ALL, H5S_ALL,
H5P_DEFAULT, &data[0]);
if (err < 0)
throw WriteSimpleDataException("Couldn't write data");
}
//----------------------------------------------------------------------------//
template <typename T>
void readSimpleData(hid_t location, const std::string &name,
std::vector<T> &data)
{
using namespace Exc;
GlobalLock lock(g_hdf5Mutex);
int components = FieldTraits<T>::dataDims();
hsize_t dims[1];
H5ScopedDopen dataSet(location, name.c_str(), H5P_DEFAULT);
if (dataSet.id() < 0)
throw OpenDataSetException("Couldn't open data set: " + name);
H5ScopedDget_space dataSpace(dataSet.id());
H5ScopedDget_type dataType(dataSet.id());
H5Sget_simple_extent_dims(dataSpace.id(), dims, NULL);
if (dataSpace.id() < 0)
throw GetDataSpaceException("Couldn't get data space");
if (dataType.id() < 0)
throw GetDataTypeException("Couldn't get data type");
int reportedSize = dims[0] / components;
// Resize target
data.clear();
data.resize(reportedSize);
// Get the internal data type
hid_t type = DataTypeTraits<T>::h5type();
if (H5Dread(dataSet.id(), type, H5S_ALL, H5S_ALL,
H5P_DEFAULT, &data[0]) < 0) {
throw Hdf5DataReadException("Couldn't read simple data");
}
}
//----------------------------------------------------------------------------//
} // namespace Hdf5Util
//----------------------------------------------------------------------------//
FIELD3D_NAMESPACE_HEADER_CLOSE
//----------------------------------------------------------------------------//
#endif
Exception.h
Contains Exception base class.
Field.h
Contains Field, WritableField and ResizableField classes.
g_hdf5Mutex
FIELD3D_NAMESPACE_OPEN FIELD3D_API boost::recursive_mutex g_hdf5Mutex
Definition Hdf5Util.cpp:67
GlobalLock
boost::recursive_mutex::scoped_lock GlobalLock
Definition Hdf5Util.h:78
Traits.h
FieldTraits::dataDims
static int dataDims()
Definition Traits.h:178
Hdf5Util::H5Base::id
hid_t id() const
Query the hid_t value.
Definition Hdf5Util.h:100
Hdf5Util::H5Base::H5Base
H5Base()
Definition Hdf5Util.h:96
Hdf5Util::H5Base::m_id
hid_t m_id
Definition Hdf5Util.h:106
Hdf5Util::H5ScopedAget_space::H5ScopedAget_space
H5ScopedAget_space(hid_t dataset_id)
Definition Hdf5Util.h:290
Hdf5Util::H5ScopedAget_space::~H5ScopedAget_space
~H5ScopedAget_space()
Definition Hdf5Util.h:297
Hdf5Util::H5ScopedAget_type::H5ScopedAget_type
H5ScopedAget_type(hid_t dataset_id)
Definition Hdf5Util.h:313
Hdf5Util::H5ScopedAget_type::~H5ScopedAget_type
~H5ScopedAget_type()
Definition Hdf5Util.h:320
Hdf5Util::H5ScopedAopenIdx::~H5ScopedAopenIdx
~H5ScopedAopenIdx()
Definition Hdf5Util.h:153
Hdf5Util::H5ScopedAopenIdx::H5ScopedAopenIdx
H5ScopedAopenIdx(hid_t location, unsigned idx)
Definition Hdf5Util.h:145
Hdf5Util::H5ScopedAopen::~H5ScopedAopen
~H5ScopedAopen()
Definition Hdf5Util.h:130
Hdf5Util::H5ScopedAopen::H5ScopedAopen
H5ScopedAopen(hid_t location, const std::string &name)
Definition Hdf5Util.h:116
Hdf5Util::H5ScopedAopen::H5ScopedAopen
H5ScopedAopen(hid_t location, const std::string &name, hid_t aapl_id)
Definition Hdf5Util.h:123
Hdf5Util::H5ScopedDcreate
Scoped object - creates a dataset on creation and closes it on destruction.
Definition Hdf5Util.h:264
Hdf5Util::H5ScopedDcreate::~H5ScopedDcreate
~H5ScopedDcreate()
Definition Hdf5Util.h:274
Hdf5Util::H5ScopedDcreate::H5ScopedDcreate
H5ScopedDcreate(hid_t parentLocation, const std::string &name, hid_t dtype_id, hid_t space_id, hid_t lcpl_id, hid_t dcpl_id, hid_t dapl_id)
Definition Hdf5Util.h:266
Hdf5Util::H5ScopedDget_space
Scoped object - opens a dataset on creation and closes it on destruction.
Definition Hdf5Util.h:387
Hdf5Util::H5ScopedDget_space::~H5ScopedDget_space
~H5ScopedDget_space()
Definition Hdf5Util.h:403
Hdf5Util::H5ScopedDget_space::H5ScopedDget_space
H5ScopedDget_space()
Definition Hdf5Util.h:389
Hdf5Util::H5ScopedDget_space::open
void open(hid_t dataset_id)
Definition Hdf5Util.h:398
Hdf5Util::H5ScopedDget_space::H5ScopedDget_space
H5ScopedDget_space(hid_t dataset_id)
Definition Hdf5Util.h:394
Hdf5Util::H5ScopedDget_type
Scoped object - opens a dataset on creation and closes it on destruction.
Definition Hdf5Util.h:417
Hdf5Util::H5ScopedDget_type::open
void open(hid_t dataset_id)
Definition Hdf5Util.h:428
Hdf5Util::H5ScopedDget_type::~H5ScopedDget_type
~H5ScopedDget_type()
Definition Hdf5Util.h:433
Hdf5Util::H5ScopedDget_type::H5ScopedDget_type
H5ScopedDget_type(hid_t dataset_id)
Definition Hdf5Util.h:424
Hdf5Util::H5ScopedDget_type::H5ScopedDget_type
H5ScopedDget_type()
Definition Hdf5Util.h:419
Hdf5Util::H5ScopedDopen
Scoped object - opens a dataset on creation and closes it on destruction.
Definition Hdf5Util.h:357
Hdf5Util::H5ScopedDopen::open
void open(hid_t parentLocation, const std::string &name, hid_t dapl_id)
Definition Hdf5Util.h:368
Hdf5Util::H5ScopedDopen::~H5ScopedDopen
~H5ScopedDopen()
Definition Hdf5Util.h:373
Hdf5Util::H5ScopedDopen::H5ScopedDopen
H5ScopedDopen()
Definition Hdf5Util.h:359
Hdf5Util::H5ScopedDopen::H5ScopedDopen
H5ScopedDopen(hid_t parentLocation, const std::string &name, hid_t dapl_id)
Definition Hdf5Util.h:364
Hdf5Util::H5ScopedGcreate::H5ScopedGcreate
H5ScopedGcreate(hid_t parentLocation, const std::string &name)
Definition Hdf5Util.h:168
Hdf5Util::H5ScopedGcreate::H5ScopedGcreate
H5ScopedGcreate(hid_t parentLocation, const std::string &name, hid_t lcpl_id, hid_t gcpl_id, hid_t gapl_id)
Definition Hdf5Util.h:174
Hdf5Util::H5ScopedGcreate::~H5ScopedGcreate
~H5ScopedGcreate()
Definition Hdf5Util.h:182
Hdf5Util::H5ScopedGopen::H5ScopedGopen
H5ScopedGopen()
Definition Hdf5Util.h:197
Hdf5Util::H5ScopedGopen::H5ScopedGopen
H5ScopedGopen(hid_t parentLocation, const std::string &name, hid_t gapl_id)
Definition Hdf5Util.h:206
Hdf5Util::H5ScopedGopen::H5ScopedGopen
H5ScopedGopen(hid_t parentLocation, const std::string &name)
Definition Hdf5Util.h:202
Hdf5Util::H5ScopedGopen::open
void open(hid_t parentLocation, const std::string &name)
Definition Hdf5Util.h:210
Hdf5Util::H5ScopedGopen::open
void open(hid_t parentLocation, const std::string &name, hid_t gapl_id)
Definition Hdf5Util.h:215
Hdf5Util::H5ScopedGopen::~H5ScopedGopen
~H5ScopedGopen()
Definition Hdf5Util.h:221
Hdf5Util::H5ScopedScreate
Scoped object - creates a dataspace on creation and closes it on destruction.
Definition Hdf5Util.h:235
Hdf5Util::H5ScopedScreate::create
void create(H5S_class_t type)
Definition Hdf5Util.h:246
Hdf5Util::H5ScopedScreate::H5ScopedScreate
H5ScopedScreate(H5S_class_t type)
Definition Hdf5Util.h:242
Hdf5Util::H5ScopedScreate::~H5ScopedScreate
~H5ScopedScreate()
Definition Hdf5Util.h:251
Hdf5Util::H5ScopedScreate::H5ScopedScreate
H5ScopedScreate()
Definition Hdf5Util.h:237
Hdf5Util::H5ScopedTget_native_type::H5ScopedTget_native_type
H5ScopedTget_native_type(hid_t dataset_id, H5T_direction_t direction)
Definition Hdf5Util.h:336
Hdf5Util::H5ScopedTget_native_type::~H5ScopedTget_native_type
~H5ScopedTget_native_type()
Definition Hdf5Util.h:343
Hdf5Util::readAttribute
FIELD3D_API bool readAttribute(hid_t location, const std::string &attrName, std::string &value)
Reads a string attribute.
Hdf5Util::writeAttribute
FIELD3D_API bool writeAttribute(hid_t location, const std::string &attrName, const std::string &value)
Writes a string attribute.
Hdf5Util::readSimpleData
void readSimpleData(hid_t location, const std::string &name, std::vector< T > &data)
Reads a simple linear data set from the given location.
Definition Hdf5Util.h:611
Hdf5Util::checkHdf5Gzip
FIELD3D_API bool checkHdf5Gzip()
Checks whether gzip is available in the current hdf5 library.
Definition Hdf5Util.cpp:722
Hdf5Util::writeSimpleData
void writeSimpleData(hid_t location, const std::string &name, const std::vector< T > &data)
Writes a simple linear data set to the given location.
Definition Hdf5Util.h:572
Exc
Namespace for Exception objects.
Definition Exception.h:57
FIELD3D_NAMESPACE_OPEN
Definition FieldMapping.cpp:74
Hdf5Util
Contains utility functions and classes for Hdf5 files.
Definition Hdf5Util.h:86
ns.h
FIELD3D_API
#define FIELD3D_API
Definition ns.h:77
FIELD3D_NAMESPACE_HEADER_CLOSE
#define FIELD3D_NAMESPACE_HEADER_CLOSE
Definition ns.h:58
DataTypeTraits::h5type
static hid_t h5type()