From 827511cd4856319c6bd319472b27c4a42a5973bc Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Mon, 15 Apr 2024 08:32:06 +0200 Subject: [PATCH] Add checkpoint/resume of IInterfaceDescriptor and IZoneDescriptor --- src/language/modules/MeshModule.cpp | 26 +++++++ src/mesh/NamedInterfaceDescriptor.hpp | 6 ++ src/mesh/NamedZoneDescriptor.hpp | 8 ++- src/mesh/NumberedInterfaceDescriptor.hpp | 6 ++ src/mesh/NumberedZoneDescriptor.hpp | 8 ++- src/utils/checkpointing/CheckpointUtils.cpp | 72 ++++++++++++++++++- src/utils/checkpointing/CheckpointUtils.hpp | 12 ++++ .../IInterfaceDescriptorHFType.hpp | 14 ++++ .../checkpointing/IZoneDescriptorHFType.hpp | 14 ++++ src/utils/checkpointing/ResumeUtils.cpp | 64 +++++++++++++++++ src/utils/checkpointing/ResumeUtils.hpp | 2 + 11 files changed, 229 insertions(+), 3 deletions(-) create mode 100644 src/utils/checkpointing/IInterfaceDescriptorHFType.hpp create mode 100644 src/utils/checkpointing/IZoneDescriptorHFType.hpp diff --git a/src/language/modules/MeshModule.cpp b/src/language/modules/MeshModule.cpp index 40d5d2304..94fe342c8 100644 --- a/src/language/modules/MeshModule.cpp +++ b/src/language/modules/MeshModule.cpp @@ -329,4 +329,30 @@ MeshModule::registerCheckpointResume() const const HighFive::Group& symbol_table_group) -> EmbeddedData { return readIBoundaryDescriptor(symbol_name, symbol_table_group); })); + + CheckpointResumeRepository::instance() + .addCheckpointResume(ast_node_data_type_from<std::shared_ptr<const IInterfaceDescriptor>>, + std::function([](const std::string& symbol_name, const EmbeddedData& embedded_data, + HighFive::File& file, HighFive::Group& checkpoint_group, + HighFive::Group& symbol_table_group) { + writeIInterfaceDescriptor(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 readIInterfaceDescriptor(symbol_name, symbol_table_group); + })); + + CheckpointResumeRepository::instance() + .addCheckpointResume(ast_node_data_type_from<std::shared_ptr<const IZoneDescriptor>>, + std::function([](const std::string& symbol_name, const EmbeddedData& embedded_data, + HighFive::File& file, HighFive::Group& checkpoint_group, + HighFive::Group& symbol_table_group) { + writeIZoneDescriptor(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 readIZoneDescriptor(symbol_name, symbol_table_group); + })); + } diff --git a/src/mesh/NamedInterfaceDescriptor.hpp b/src/mesh/NamedInterfaceDescriptor.hpp index 0b6a0e996..a7b94ae81 100644 --- a/src/mesh/NamedInterfaceDescriptor.hpp +++ b/src/mesh/NamedInterfaceDescriptor.hpp @@ -25,6 +25,12 @@ class NamedInterfaceDescriptor final : public IInterfaceDescriptor return m_name == ref_id.tagName(); } + [[nodiscard]] const std::string& + name() const + { + return m_name; + } + [[nodiscard]] Type type() const final { diff --git a/src/mesh/NamedZoneDescriptor.hpp b/src/mesh/NamedZoneDescriptor.hpp index 0fbe10142..f69e2b21c 100644 --- a/src/mesh/NamedZoneDescriptor.hpp +++ b/src/mesh/NamedZoneDescriptor.hpp @@ -25,7 +25,13 @@ class NamedZoneDescriptor final : public IZoneDescriptor return m_name == ref_id.tagName(); } - Type + [[nodiscard]] const std::string& + name() const + { + return m_name; + } + + [[nodiscard]] Type type() const final { return Type::named; diff --git a/src/mesh/NumberedInterfaceDescriptor.hpp b/src/mesh/NumberedInterfaceDescriptor.hpp index d72197221..95ce57974 100644 --- a/src/mesh/NumberedInterfaceDescriptor.hpp +++ b/src/mesh/NumberedInterfaceDescriptor.hpp @@ -24,6 +24,12 @@ class NumberedInterfaceDescriptor final : public IInterfaceDescriptor } public: + [[nodiscard]] unsigned int + number() const + { + return m_number; + } + [[nodiscard]] Type type() const final { diff --git a/src/mesh/NumberedZoneDescriptor.hpp b/src/mesh/NumberedZoneDescriptor.hpp index 7e72521d2..3d4ef7d2b 100644 --- a/src/mesh/NumberedZoneDescriptor.hpp +++ b/src/mesh/NumberedZoneDescriptor.hpp @@ -24,7 +24,13 @@ class NumberedZoneDescriptor final : public IZoneDescriptor } public: - Type + [[nodiscard]] unsigned int + number() const + { + return m_number; + } + + [[nodiscard]] Type type() const final { return Type::numbered; diff --git a/src/utils/checkpointing/CheckpointUtils.cpp b/src/utils/checkpointing/CheckpointUtils.cpp index 338ceee96..4335ee100 100644 --- a/src/utils/checkpointing/CheckpointUtils.cpp +++ b/src/utils/checkpointing/CheckpointUtils.cpp @@ -5,12 +5,17 @@ #include <language/utils/DataHandler.hpp> #include <mesh/MeshVariant.hpp> #include <utils/checkpointing/IBoundaryDescriptorHFType.hpp> +#include <utils/checkpointing/IInterfaceDescriptorHFType.hpp> +#include <utils/checkpointing/IZoneDescriptorHFType.hpp> #include <utils/checkpointing/RefItemListHFType.hpp> -#include <mesh/IBoundaryDescriptor.hpp> #include <mesh/Mesh.hpp> #include <mesh/NamedBoundaryDescriptor.hpp> +#include <mesh/NamedInterfaceDescriptor.hpp> +#include <mesh/NamedZoneDescriptor.hpp> #include <mesh/NumberedBoundaryDescriptor.hpp> +#include <mesh/NumberedInterfaceDescriptor.hpp> +#include <mesh/NumberedZoneDescriptor.hpp> template <ItemType item_type, size_t Dimension> void @@ -215,3 +220,68 @@ writeIBoundaryDescriptor(const std::string& symbol_name, } } } + +void +writeIInterfaceDescriptor(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 IInterfaceDescriptor> iinterface_descriptor_p = + dynamic_cast<const DataHandler<const IInterfaceDescriptor>&>(embedded_data.get()).data_ptr(); + + const IInterfaceDescriptor& iinterface_descriptor = *iinterface_descriptor_p; + + variable_group.createAttribute("type", dataTypeName(ast_node_data_type_from<decltype(iinterface_descriptor_p)>)); + variable_group.createAttribute("iinterface_descriptor_type", iinterface_descriptor.type()); + + switch (iinterface_descriptor.type()) { + case IInterfaceDescriptor::Type::named: { + const NamedInterfaceDescriptor& named_interface_descriptor = + dynamic_cast<const NamedInterfaceDescriptor&>(iinterface_descriptor); + variable_group.createAttribute("name", named_interface_descriptor.name()); + break; + } + case IInterfaceDescriptor::Type::numbered: { + const NumberedInterfaceDescriptor& numbered_boundary_descriptor = + dynamic_cast<const NumberedInterfaceDescriptor&>(iinterface_descriptor); + variable_group.createAttribute("number", numbered_boundary_descriptor.number()); + break; + } + } +} + +void +writeIZoneDescriptor(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 IZoneDescriptor> izone_descriptor_p = + dynamic_cast<const DataHandler<const IZoneDescriptor>&>(embedded_data.get()).data_ptr(); + + const IZoneDescriptor& izone_descriptor = *izone_descriptor_p; + + variable_group.createAttribute("type", dataTypeName(ast_node_data_type_from<decltype(izone_descriptor_p)>)); + variable_group.createAttribute("izone_descriptor_type", izone_descriptor.type()); + + switch (izone_descriptor.type()) { + case IZoneDescriptor::Type::named: { + const NamedZoneDescriptor& named_zone_descriptor = dynamic_cast<const NamedZoneDescriptor&>(izone_descriptor); + variable_group.createAttribute("name", named_zone_descriptor.name()); + break; + } + case IZoneDescriptor::Type::numbered: { + const NumberedZoneDescriptor& numbered_boundary_descriptor = + dynamic_cast<const NumberedZoneDescriptor&>(izone_descriptor); + variable_group.createAttribute("number", numbered_boundary_descriptor.number()); + break; + } + } +} diff --git a/src/utils/checkpointing/CheckpointUtils.hpp b/src/utils/checkpointing/CheckpointUtils.hpp index e9b716796..5cfeb0d47 100644 --- a/src/utils/checkpointing/CheckpointUtils.hpp +++ b/src/utils/checkpointing/CheckpointUtils.hpp @@ -54,4 +54,16 @@ void writeIBoundaryDescriptor(const std::string& symbol_name, HighFive::Group& checkpoint_group, HighFive::Group& symbol_table_group); +void writeIInterfaceDescriptor(const std::string& symbol_name, + const EmbeddedData& embedded_data, + HighFive::File& file, + HighFive::Group& checkpoint_group, + HighFive::Group& symbol_table_group); + +void writeIZoneDescriptor(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/IInterfaceDescriptorHFType.hpp b/src/utils/checkpointing/IInterfaceDescriptorHFType.hpp new file mode 100644 index 000000000..d099f2bb0 --- /dev/null +++ b/src/utils/checkpointing/IInterfaceDescriptorHFType.hpp @@ -0,0 +1,14 @@ +#ifndef I_INTERFACE_DESCRIPTOR_HF_TYPE_HPP +#define I_INTERFACE_DESCRIPTOR_HF_TYPE_HPP + +#include <mesh/IInterfaceDescriptor.hpp> +#include <utils/checkpointing/CheckpointUtils.hpp> + +HighFive::EnumType<IInterfaceDescriptor::Type> PUGS_INLINE +create_enum_i_interface_descriptor_type() +{ + return {{"named", IInterfaceDescriptor::Type::named}, {"numbered", IInterfaceDescriptor::Type::numbered}}; +} +HIGHFIVE_REGISTER_TYPE(IInterfaceDescriptor::Type, create_enum_i_interface_descriptor_type); + +#endif // I_INTERFACE_DESCRIPTOR_HF_TYPE_HPP diff --git a/src/utils/checkpointing/IZoneDescriptorHFType.hpp b/src/utils/checkpointing/IZoneDescriptorHFType.hpp new file mode 100644 index 000000000..0b491aa92 --- /dev/null +++ b/src/utils/checkpointing/IZoneDescriptorHFType.hpp @@ -0,0 +1,14 @@ +#ifndef I_ZONE_DESCRIPTOR_HF_TYPE_HPP +#define I_ZONE_DESCRIPTOR_HF_TYPE_HPP + +#include <mesh/IZoneDescriptor.hpp> +#include <utils/checkpointing/CheckpointUtils.hpp> + +HighFive::EnumType<IZoneDescriptor::Type> PUGS_INLINE +create_enum_i_zone_descriptor_type() +{ + return {{"named", IZoneDescriptor::Type::named}, {"numbered", IZoneDescriptor::Type::numbered}}; +} +HIGHFIVE_REGISTER_TYPE(IZoneDescriptor::Type, create_enum_i_zone_descriptor_type); + +#endif // I_ZONE_DESCRIPTOR_HF_TYPE_HPP diff --git a/src/utils/checkpointing/ResumeUtils.cpp b/src/utils/checkpointing/ResumeUtils.cpp index 32317896c..d320f9616 100644 --- a/src/utils/checkpointing/ResumeUtils.cpp +++ b/src/utils/checkpointing/ResumeUtils.cpp @@ -3,8 +3,14 @@ #include <language/utils/DataHandler.hpp> #include <language/utils/SymbolTable.hpp> #include <mesh/NamedBoundaryDescriptor.hpp> +#include <mesh/NamedInterfaceDescriptor.hpp> +#include <mesh/NamedZoneDescriptor.hpp> #include <mesh/NumberedBoundaryDescriptor.hpp> +#include <mesh/NumberedInterfaceDescriptor.hpp> +#include <mesh/NumberedZoneDescriptor.hpp> #include <utils/checkpointing/IBoundaryDescriptorHFType.hpp> +#include <utils/checkpointing/IInterfaceDescriptorHFType.hpp> +#include <utils/checkpointing/IZoneDescriptorHFType.hpp> #include <utils/checkpointing/ResumingData.hpp> EmbeddedData @@ -45,3 +51,61 @@ readIBoundaryDescriptor(const std::string& symbol_name, const HighFive::Group& s return embedded_data; } + +EmbeddedData +readIInterfaceDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group) +{ + const HighFive::Group iinterfacedecriptor_group = symbol_table_group.getGroup("embedded/" + symbol_name); + const IInterfaceDescriptor::Type iinterface_descriptor_type = + iinterfacedecriptor_group.getAttribute("iinterface_descriptor_type").read<IInterfaceDescriptor::Type>(); + + EmbeddedData embedded_data; + + switch (iinterface_descriptor_type) { + case IInterfaceDescriptor::Type::named: { + const std::string name = iinterfacedecriptor_group.getAttribute("name").read<std::string>(); + + embedded_data = {std::make_shared<DataHandler<const IInterfaceDescriptor>>( + std::make_shared<const NamedInterfaceDescriptor>(name))}; + break; + } + case IInterfaceDescriptor::Type::numbered: { + const unsigned int number = iinterfacedecriptor_group.getAttribute("number").read<unsigned int>(); + + embedded_data = {std::make_shared<DataHandler<const IInterfaceDescriptor>>( + std::make_shared<const NumberedInterfaceDescriptor>(number))}; + break; + } + } + + return embedded_data; +} + +EmbeddedData +readIZoneDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group) +{ + const HighFive::Group izonedecriptor_group = symbol_table_group.getGroup("embedded/" + symbol_name); + const IZoneDescriptor::Type izone_descriptor_type = + izonedecriptor_group.getAttribute("izone_descriptor_type").read<IZoneDescriptor::Type>(); + + EmbeddedData embedded_data; + + switch (izone_descriptor_type) { + case IZoneDescriptor::Type::named: { + const std::string name = izonedecriptor_group.getAttribute("name").read<std::string>(); + + embedded_data = { + std::make_shared<DataHandler<const IZoneDescriptor>>(std::make_shared<const NamedZoneDescriptor>(name))}; + break; + } + case IZoneDescriptor::Type::numbered: { + const unsigned int number = izonedecriptor_group.getAttribute("number").read<unsigned int>(); + + embedded_data = { + std::make_shared<DataHandler<const IZoneDescriptor>>(std::make_shared<const NumberedZoneDescriptor>(number))}; + break; + } + } + + return embedded_data; +} diff --git a/src/utils/checkpointing/ResumeUtils.hpp b/src/utils/checkpointing/ResumeUtils.hpp index ce2423256..8ac1ffcf2 100644 --- a/src/utils/checkpointing/ResumeUtils.hpp +++ b/src/utils/checkpointing/ResumeUtils.hpp @@ -30,5 +30,7 @@ read(const HighFive::Group& group, const std::string& name) EmbeddedData readMesh(const std::string& symbol_name, const HighFive::Group& symbol_table_group); 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); #endif // RESUME_UTILS_HPP -- GitLab