diff --git a/src/language/modules/MeshModule.cpp b/src/language/modules/MeshModule.cpp index 40d5d2304596a988c91b1d139d0f6552eae0acc7..94fe342c8b25971e2fd03d78423df1b1e7682c23 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 0b6a0e996c4753ee2f33e69f482820520886ad19..a7b94ae81cc5bae9953fa7870f89ce4cbd430172 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 0fbe101421f7f5048019f945622ad4263e8d3e39..f69e2b21c08cf192fa21b2ccf720641f75811fa5 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 d72197221f5811a22836871e89f601479d480123..95ce579744ae4874463bfd034d66b1d4d4203320 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 7e72521d2c69346c4fc46edc82dd0bbedd99e20a..3d4ef7d2b28885a6db96871199f369bb41f85488 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 338ceee96dbda839e00f1e4b2bdd4f651bac43c3..4335ee10022911ee8122ec7eb05528de992c428a 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 e9b7167960ed8b0004c522388a28b03edc6363d8..5cfeb0d4729f0a300816890fcb898fe8faee7bb2 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 0000000000000000000000000000000000000000..d099f2bb0511f0ecb4f5a7eecfeb33e484570b8a --- /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 0000000000000000000000000000000000000000..0b491aa922df3bbeef555c4cafe1f8d02d28d120 --- /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 32317896c8d2a59778650e5e430a04c934fee8ee..d320f9616971941eec38189781b4a2055a1b98b9 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 ce2423256eaae440b6c0c044918a21bbf2cb2e09..8ac1ffcf22e00a3b5a87c516ae7f78d363cea02a 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