23 #include "openPMD/auxiliary/StringManip.hpp" 24 #include "openPMD/backend/Attribute.hpp" 25 #include "openPMD/backend/Writable.hpp" 26 #include "openPMD/IO/HDF5/HDF5FilePosition.hpp" 34 #include <unordered_map> 42 std::unordered_map< std::string, hid_t > m_userTypes;
44 GetH5DataType( std::unordered_map< std::string, hid_t > userTypes )
45 : m_userTypes{ std::move(userTypes) }
56 return H5Tcopy(H5T_NATIVE_CHAR);
59 return H5Tcopy(H5T_NATIVE_UCHAR);
62 return H5Tcopy(H5T_NATIVE_SHORT);
65 return H5Tcopy(H5T_NATIVE_INT);
68 return H5Tcopy(H5T_NATIVE_LONG);
70 case DT::VEC_LONGLONG:
71 return H5Tcopy(H5T_NATIVE_LLONG);
74 return H5Tcopy(H5T_NATIVE_USHORT);
77 return H5Tcopy(H5T_NATIVE_UINT);
80 return H5Tcopy(H5T_NATIVE_ULONG);
82 case DT::VEC_ULONGLONG:
83 return H5Tcopy(H5T_NATIVE_ULLONG);
86 return H5Tcopy(H5T_NATIVE_FLOAT);
90 return H5Tcopy(H5T_NATIVE_DOUBLE);
92 case DT::VEC_LONG_DOUBLE:
93 return H5Tcopy(H5T_NATIVE_LDOUBLE);
96 return H5Tcopy( m_userTypes.at(
typeid(std::complex< float >).name() ) );
99 return H5Tcopy( m_userTypes.at(
typeid(std::complex< double >).name() ) );
100 case DT::CLONG_DOUBLE:
101 case DT::VEC_CLONG_DOUBLE:
102 return H5Tcopy( m_userTypes.at(
typeid(std::complex< long double >).name() ) );
104 hid_t string_t_id = H5Tcopy(H5T_C_S1);
105 H5Tset_size(string_t_id, att.
get<std::string>().size());
108 case DT::VEC_STRING: {
109 hid_t string_t_id = H5Tcopy(H5T_C_S1);
111 for (std::string
const &s : att.
get<std::vector<std::string> >())
112 max_len = std::max(max_len, s.size());
113 H5Tset_size(string_t_id, max_len);
117 return H5Tcopy( m_userTypes.at(
typeid(
bool).name() ) );
119 throw std::runtime_error(
"[HDF5] Meta-Datatype leaked into IO");
121 throw std::runtime_error(
"[HDF5] Unknown Attribute datatype (HDF5 datatype)");
123 throw std::runtime_error(
"[HDF5] Datatype not implemented");
146 case DT::LONG_DOUBLE:
149 case DT::CLONG_DOUBLE:
152 return H5Screate(H5S_SCALAR);
155 hid_t vec_t_id = H5Screate(H5S_SIMPLE);
156 hsize_t dims[1] = {att.
get< std::vector< char > >().size()};
157 H5Sset_extent_simple(vec_t_id, 1, dims,
nullptr);
162 hid_t vec_t_id = H5Screate(H5S_SIMPLE);
163 hsize_t dims[1] = {att.
get< std::vector< short > >().size()};
164 H5Sset_extent_simple(vec_t_id, 1, dims,
nullptr);
169 hid_t vec_t_id = H5Screate(H5S_SIMPLE);
170 hsize_t dims[1] = {att.
get< std::vector< int > >().size()};
171 H5Sset_extent_simple(vec_t_id, 1, dims,
nullptr);
176 hid_t vec_t_id = H5Screate(H5S_SIMPLE);
177 hsize_t dims[1] = {att.
get< std::vector< long > >().size()};
178 H5Sset_extent_simple(vec_t_id, 1, dims,
nullptr);
181 case DT::VEC_LONGLONG:
183 hid_t vec_t_id = H5Screate(H5S_SIMPLE);
184 hsize_t dims[1] = {att.
get< std::vector< long long > >().size()};
185 H5Sset_extent_simple(vec_t_id, 1, dims,
nullptr);
190 hid_t vec_t_id = H5Screate(H5S_SIMPLE);
191 hsize_t dims[1] = {att.
get< std::vector< unsigned char > >().size()};
192 H5Sset_extent_simple(vec_t_id, 1, dims,
nullptr);
197 hid_t vec_t_id = H5Screate(H5S_SIMPLE);
198 hsize_t dims[1] = {att.
get< std::vector< unsigned short > >().size()};
199 H5Sset_extent_simple(vec_t_id, 1, dims,
nullptr);
204 hid_t vec_t_id = H5Screate(H5S_SIMPLE);
205 hsize_t dims[1] = {att.
get< std::vector< unsigned int > >().size()};
206 H5Sset_extent_simple(vec_t_id, 1, dims,
nullptr);
211 hid_t vec_t_id = H5Screate(H5S_SIMPLE);
212 hsize_t dims[1] = {att.
get< std::vector< unsigned long > >().size()};
213 H5Sset_extent_simple(vec_t_id, 1, dims,
nullptr);
216 case DT::VEC_ULONGLONG:
218 hid_t vec_t_id = H5Screate(H5S_SIMPLE);
219 hsize_t dims[1] = {att.
get< std::vector< unsigned long long > >().size()};
220 H5Sset_extent_simple(vec_t_id, 1, dims,
nullptr);
225 hid_t vec_t_id = H5Screate(H5S_SIMPLE);
226 hsize_t dims[1] = {att.
get< std::vector< float > >().size()};
227 H5Sset_extent_simple(vec_t_id, 1, dims,
nullptr);
232 hid_t vec_t_id = H5Screate(H5S_SIMPLE);
233 hsize_t dims[1] = {att.
get< std::vector< double > >().size()};
234 H5Sset_extent_simple(vec_t_id, 1, dims,
nullptr);
237 case DT::VEC_LONG_DOUBLE:
239 hid_t vec_t_id = H5Screate(H5S_SIMPLE);
240 hsize_t dims[1] = {att.
get< std::vector< long double > >().size()};
241 H5Sset_extent_simple(vec_t_id, 1, dims,
nullptr);
246 hid_t vec_t_id = H5Screate(H5S_SIMPLE);
247 hsize_t dims[1] = {att.
get< std::vector< std::complex< float > > >().size()};
248 H5Sset_extent_simple(vec_t_id, 1, dims,
nullptr);
251 case DT::VEC_CDOUBLE:
253 hid_t vec_t_id = H5Screate(H5S_SIMPLE);
254 hsize_t dims[1] = {att.
get< std::vector< std::complex< double > > >().size()};
255 H5Sset_extent_simple(vec_t_id, 1, dims,
nullptr);
258 case DT::VEC_CLONG_DOUBLE:
260 hid_t vec_t_id = H5Screate(H5S_SIMPLE);
261 hsize_t dims[1] = {att.
get< std::vector< std::complex< long double > > >().size()};
262 H5Sset_extent_simple(vec_t_id, 1, dims,
nullptr);
267 hid_t vec_t_id = H5Screate(H5S_SIMPLE);
268 hsize_t dims[1] = {att.
get< std::vector< std::string > >().size()};
269 H5Sset_extent_simple(vec_t_id, 1, dims,
nullptr);
274 hid_t array_t_id = H5Screate(H5S_SIMPLE);
275 hsize_t dims[1] = {7};
276 H5Sset_extent_simple(array_t_id, 1, dims,
nullptr);
280 throw std::runtime_error(
"Unknown Attribute datatype (HDF5 dataspace)");
282 throw std::runtime_error(
"Datatype not implemented in HDF5 IO");
287 concrete_h5_file_position(
Writable* w)
289 std::stack< Writable* > hierarchy;
290 if( !w->abstractFilePosition )
299 while( !hierarchy.empty() )
301 pos += std::dynamic_pointer_cast<
HDF5FilePosition >(hierarchy.top()->abstractFilePosition)->location;
305 return auxiliary::replace_all(pos,
"//",
"/");
U get() const
Retrieve a stored specific Attribute and cast if convertible.
Definition: Attribute.hpp:232
Datatype
Concrete datatype of an object available at runtime.
Definition: Datatype.hpp:42
Varidic datatype supporting at least all formats for attributes specified in the openPMD standard...
Definition: Attribute.hpp:50
Definition: HDF5Auxiliary.hpp:40
Public definitions of openPMD-api.
Definition: Date.cpp:29
Layer to mirror structure of logical data and persistent data in file.
Definition: Writable.hpp:55
Definition: HDF5FilePosition.hpp:28