From ccc17bbb4ee24554ec497d0b809b6227b821f091 Mon Sep 17 00:00:00 2001 From: Olivier Parcollet Date: Tue, 20 May 2014 21:10:19 +0200 Subject: [PATCH] h5 serialization - add an h5 serialization using hdf5 >= 1.8.9 and a file in memory. - following doc. --- test/triqs/utility/h5_seria.cpp | 57 +++++++++++++++++++ triqs/h5/serialization.hpp | 97 +++++++++++++++++++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 test/triqs/utility/h5_seria.cpp create mode 100644 triqs/h5/serialization.hpp diff --git a/test/triqs/utility/h5_seria.cpp b/test/triqs/utility/h5_seria.cpp new file mode 100644 index 00000000..f7436d76 --- /dev/null +++ b/test/triqs/utility/h5_seria.cpp @@ -0,0 +1,57 @@ +/******************************************************************************* + * + * TRIQS: a Toolbox for Research in Interacting Quantum Systems + * + * Copyright (C) 2014 by O. Parcollet + * + * TRIQS is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * TRIQS. If not, see . + * + ******************************************************************************/ +#include +#include +#include + +#if H5_VERSION_GE(1, 8, 9) + +using triqs::h5::serialize; +using triqs::h5::deserialize; + +int main() { + + using triqs::arrays::array; + + auto a = array{1, 2, 3, 4, 5}; + + { + auto a2 = array(10000); + a2() = 8.3; + auto s2 = serialize(a2); + std::cout << "len " << s2.size() << std::endl; + } + + { + auto a2 = array(20000); + a2() = 8.3; + auto s2 = serialize(a2); + std::cout << "len " << s2.size() << std::endl; + } + + auto s1 = serialize(a); + auto b = deserialize>(s1); + + std::cout << "a = " << a << " == " << b << std::endl; + +#endif +} + diff --git a/triqs/h5/serialization.hpp b/triqs/h5/serialization.hpp new file mode 100644 index 00000000..5d366a56 --- /dev/null +++ b/triqs/h5/serialization.hpp @@ -0,0 +1,97 @@ +/******************************************************************************* + * + * TRIQS: a Toolbox for Research in Interacting Quantum Systems + * + * Copyright (C) 2012 by M. Ferrero, O. Parcollet + * + * TRIQS is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * TRIQS. If not, see . + * + ******************************************************************************/ +#pragma once +//#include +#include +#include + +//#define CHECK_OR_THROW(Cond, Mess) +#define CHECK_OR_THROW(Cond, Mess) \ + if (!Cond) TRIQS_RUNTIME_ERROR << "Error in h5 (de)serialization " << Mess; + +namespace triqs { +namespace h5 { + + template std::string serialize(T const &x) { + + hid_t fapl_id = H5Pcreate(H5P_FILE_ACCESS); + CHECK_OR_THROW((fapl_id >= 0), "creating fapl"); + + auto err = H5Pset_fapl_core(fapl_id, (size_t)(64 * 1024), false); + CHECK_OR_THROW((err >= 0), "setting core file driver in fapl."); + + hid_t file_id = H5Fcreate("serialization", 0, H5P_DEFAULT, fapl_id); + CHECK_OR_THROW((file_id >= 0), "created core file"); + + auto gr = triqs::h5::group(file_id, false); + h5_write(gr, "object", x); + + err = H5Fflush(file_id, H5F_SCOPE_GLOBAL); + CHECK_OR_THROW((err >= 0), "flushed core file."); + + ssize_t image_len = H5Fget_file_image(file_id, NULL, (size_t)0); + CHECK_OR_THROW((image_len > 0), "got image file size"); + + std::string buf(image_len, 0); + + ssize_t bytes_read = H5Fget_file_image(file_id, (void *)&buf[0], (size_t)image_len); + CHECK_OR_THROW(bytes_read == image_len, "wrote file into image buffer"); + + err = H5Fclose(file_id); + CHECK_OR_THROW((err >= 0), "closed core file(1)."); + + err = H5Pclose(fapl_id); + CHECK_OR_THROW((err >= 0), "closed fapl(1)."); + + return buf; + } + + template T deserialize(std::string const &buf) { + T res; + + hid_t fapl_id = H5Pcreate(H5P_FILE_ACCESS); + CHECK_OR_THROW((fapl_id >= 0), "creating fapl"); + + auto err = H5Pset_fapl_core(fapl_id, (size_t)(64 * 1024), false); + CHECK_OR_THROW((err >= 0), "setting core file driver in fapl."); + + err = H5Pset_file_image(fapl_id, (void *)&buf[0], buf.size()); + CHECK_OR_THROW((err >= 0), "set file image in fapl."); + + hid_t file_id = H5Fopen("serialization", H5F_ACC_RDONLY, fapl_id); + CHECK_OR_THROW((file_id >= 0), "opened received file image file"); + + auto gr = triqs::h5::group(file_id, false); + h5_read(gr, "object", res); + + err = H5Fclose(file_id); + CHECK_OR_THROW((err >= 0), "closed core file(1)."); + + err = H5Pclose(fapl_id); + CHECK_OR_THROW((err >= 0), "closed fapl(1)."); + + return res; + } +} + +#undef CHECK_OR_THROW +} +