From be470482cdf5d6b0998d30dbc212d281981035b3 Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Mon, 15 Apr 2024 08:58:26 +0200 Subject: [PATCH] Add checkpoint/resume for ItemType variables --- src/language/modules/MeshModule.cpp | 9 +++++++++ src/utils/checkpointing/CheckpointUtils.cpp | 20 ++++++++++++++++++++ src/utils/checkpointing/CheckpointUtils.hpp | 6 ++++++ src/utils/checkpointing/ItemTypeHFType.hpp | 14 ++++++++++++++ src/utils/checkpointing/ResumeUtils.cpp | 10 ++++++++++ src/utils/checkpointing/ResumeUtils.hpp | 1 + 6 files changed, 60 insertions(+) create mode 100644 src/utils/checkpointing/ItemTypeHFType.hpp diff --git a/src/language/modules/MeshModule.cpp b/src/language/modules/MeshModule.cpp index 94fe342c8..e3464e375 100644 --- a/src/language/modules/MeshModule.cpp +++ b/src/language/modules/MeshModule.cpp @@ -355,4 +355,13 @@ MeshModule::registerCheckpointResume() const return readIZoneDescriptor(symbol_name, symbol_table_group); })); + CheckpointResumeRepository::instance() + .addCheckpointResume(ast_node_data_type_from<std::shared_ptr<const ItemType>>, + std::function([](const std::string& symbol_name, const EmbeddedData& embedded_data, + HighFive::File& file, HighFive::Group& checkpoint_group, + HighFive::Group& symbol_table_group) { + writeItemType(symbol_name, embedded_data, file, checkpoint_group, symbol_table_group); + }), + std::function([](const std::string& symbol_name, const HighFive::Group& symbol_table_group) + -> EmbeddedData { return readItemType(symbol_name, symbol_table_group); })); } diff --git a/src/utils/checkpointing/CheckpointUtils.cpp b/src/utils/checkpointing/CheckpointUtils.cpp index 4335ee100..b686e89b0 100644 --- a/src/utils/checkpointing/CheckpointUtils.cpp +++ b/src/utils/checkpointing/CheckpointUtils.cpp @@ -7,8 +7,10 @@ #include <utils/checkpointing/IBoundaryDescriptorHFType.hpp> #include <utils/checkpointing/IInterfaceDescriptorHFType.hpp> #include <utils/checkpointing/IZoneDescriptorHFType.hpp> +#include <utils/checkpointing/ItemTypeHFType.hpp> #include <utils/checkpointing/RefItemListHFType.hpp> +#include <mesh/ItemType.hpp> #include <mesh/Mesh.hpp> #include <mesh/NamedBoundaryDescriptor.hpp> #include <mesh/NamedInterfaceDescriptor.hpp> @@ -285,3 +287,21 @@ writeIZoneDescriptor(const std::string& symbol_name, } } } + +void +writeItemType(const std::string& symbol_name, + const EmbeddedData& embedded_data, + HighFive::File&, + HighFive::Group&, + HighFive::Group& symbol_table_group) +{ + HighFive::Group variable_group = symbol_table_group.createGroup("embedded/" + symbol_name); + + std::shared_ptr<const ItemType> item_type_p = + dynamic_cast<const DataHandler<const ItemType>&>(embedded_data.get()).data_ptr(); + + const ItemType& item_type = *item_type_p; + + variable_group.createAttribute("type", dataTypeName(ast_node_data_type_from<decltype(item_type_p)>)); + variable_group.createAttribute("item_type", item_type); +} diff --git a/src/utils/checkpointing/CheckpointUtils.hpp b/src/utils/checkpointing/CheckpointUtils.hpp index 5cfeb0d47..dc4afe88f 100644 --- a/src/utils/checkpointing/CheckpointUtils.hpp +++ b/src/utils/checkpointing/CheckpointUtils.hpp @@ -66,4 +66,10 @@ void writeIZoneDescriptor(const std::string& symbol_name, HighFive::Group& checkpoint_group, HighFive::Group& symbol_table_group); +void writeItemType(const std::string& symbol_name, + const EmbeddedData& embedded_data, + HighFive::File& file, + HighFive::Group& checkpoint_group, + HighFive::Group& symbol_table_group); + #endif // CHECKPOINT_UTILS_HPP diff --git a/src/utils/checkpointing/ItemTypeHFType.hpp b/src/utils/checkpointing/ItemTypeHFType.hpp new file mode 100644 index 000000000..e20d18861 --- /dev/null +++ b/src/utils/checkpointing/ItemTypeHFType.hpp @@ -0,0 +1,14 @@ +#ifndef ITEM_TYPE_HF_TYPE_HPP +#define ITEM_TYPE_HF_TYPE_HPP + +#include <mesh/ItemType.hpp> +#include <utils/checkpointing/CheckpointUtils.hpp> + +HighFive::EnumType<ItemType> PUGS_INLINE +create_enum_item_type() +{ + return {{"node", ItemType::node}, {"edge", ItemType::edge}, {"face", ItemType::face}, {"cell", ItemType::cell}}; +} +HIGHFIVE_REGISTER_TYPE(ItemType, create_enum_item_type); + +#endif // ITEM_TYPE_HF_TYPE_HPP diff --git a/src/utils/checkpointing/ResumeUtils.cpp b/src/utils/checkpointing/ResumeUtils.cpp index d320f9616..e5483347b 100644 --- a/src/utils/checkpointing/ResumeUtils.cpp +++ b/src/utils/checkpointing/ResumeUtils.cpp @@ -11,6 +11,7 @@ #include <utils/checkpointing/IBoundaryDescriptorHFType.hpp> #include <utils/checkpointing/IInterfaceDescriptorHFType.hpp> #include <utils/checkpointing/IZoneDescriptorHFType.hpp> +#include <utils/checkpointing/ItemTypeHFType.hpp> #include <utils/checkpointing/ResumingData.hpp> EmbeddedData @@ -109,3 +110,12 @@ readIZoneDescriptor(const std::string& symbol_name, const HighFive::Group& symbo return embedded_data; } + +EmbeddedData +readItemType(const std::string& symbol_name, const HighFive::Group& symbol_table_group) +{ + const HighFive::Group item_type_group = symbol_table_group.getGroup("embedded/" + symbol_name); + const ItemType item_type = item_type_group.getAttribute("item_type").read<ItemType>(); + + return {std::make_shared<DataHandler<const ItemType>>(std::make_shared<const ItemType>(item_type))}; +} diff --git a/src/utils/checkpointing/ResumeUtils.hpp b/src/utils/checkpointing/ResumeUtils.hpp index 8ac1ffcf2..2c0b0d486 100644 --- a/src/utils/checkpointing/ResumeUtils.hpp +++ b/src/utils/checkpointing/ResumeUtils.hpp @@ -32,5 +32,6 @@ EmbeddedData readMesh(const std::string& symbol_name, const HighFive::Group& sym EmbeddedData readIBoundaryDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group); EmbeddedData readIInterfaceDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group); EmbeddedData readIZoneDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group); +EmbeddedData readItemType(const std::string& symbol_name, const HighFive::Group& symbol_table_group); #endif // RESUME_UTILS_HPP -- GitLab