From 67ef4ce62e3c64cb60115955eaf48683e6331c98 Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Tue, 16 Apr 2024 23:59:53 +0200 Subject: [PATCH] Add checkpoint/resume for IQuadratureDescriptor --- src/language/modules/SchemeModule.cpp | 13 +++++++ src/utils/checkpointing/CheckpointUtils.cpp | 21 +++++++++++ src/utils/checkpointing/CheckpointUtils.hpp | 18 ++++++---- .../checkpointing/QuadratureTypeHFType.hpp | 16 +++++++++ src/utils/checkpointing/ResumeUtils.cpp | 35 +++++++++++++++++++ src/utils/checkpointing/ResumeUtils.hpp | 1 + 6 files changed, 98 insertions(+), 6 deletions(-) create mode 100644 src/utils/checkpointing/QuadratureTypeHFType.hpp diff --git a/src/language/modules/SchemeModule.cpp b/src/language/modules/SchemeModule.cpp index f05fcafa6..b595e0d34 100644 --- a/src/language/modules/SchemeModule.cpp +++ b/src/language/modules/SchemeModule.cpp @@ -701,4 +701,17 @@ SchemeModule::registerCheckpointResume() const const HighFive::Group& symbol_table_group) -> EmbeddedData { return readIDiscreteFunctionDescriptor(symbol_name, symbol_table_group); })); + + CheckpointResumeRepository::instance() + .addCheckpointResume(ast_node_data_type_from<std::shared_ptr<const IQuadratureDescriptor>>, + std::function([](const std::string& symbol_name, const EmbeddedData& embedded_data, + HighFive::File& file, HighFive::Group& checkpoint_group, + HighFive::Group& symbol_table_group) { + writeIQuadratureDescriptor(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 readIQuadratureDescriptor(symbol_name, symbol_table_group); + })); } diff --git a/src/utils/checkpointing/CheckpointUtils.cpp b/src/utils/checkpointing/CheckpointUtils.cpp index e6e503d1a..6a45d332a 100644 --- a/src/utils/checkpointing/CheckpointUtils.cpp +++ b/src/utils/checkpointing/CheckpointUtils.cpp @@ -1,5 +1,6 @@ #include <utils/checkpointing/CheckpointUtils.hpp> +#include <analysis/IQuadratureDescriptor.hpp> #include <language/modules/MeshModuleTypes.hpp> #include <language/modules/SchemeModuleTypes.hpp> #include <language/utils/ASTNodeDataTypeTraits.hpp> @@ -20,6 +21,7 @@ #include <utils/checkpointing/IInterfaceDescriptorHFType.hpp> #include <utils/checkpointing/IZoneDescriptorHFType.hpp> #include <utils/checkpointing/ItemTypeHFType.hpp> +#include <utils/checkpointing/QuadratureTypeHFType.hpp> #include <utils/checkpointing/RefItemListHFType.hpp> template <ItemType item_type, size_t Dimension> @@ -223,6 +225,25 @@ writeIInterfaceDescriptor(const std::string& symbol_name, } } +void +writeIQuadratureDescriptor(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 IQuadratureDescriptor> iquadrature_descriptor_p = + dynamic_cast<const DataHandler<const IQuadratureDescriptor>&>(embedded_data.get()).data_ptr(); + + const IQuadratureDescriptor& iquadrature_descriptor = *iquadrature_descriptor_p; + + variable_group.createAttribute("type", dataTypeName(ast_node_data_type_from<decltype(iquadrature_descriptor_p)>)); + variable_group.createAttribute("quadrature_type", iquadrature_descriptor.type()); + variable_group.createAttribute("quadrature_degree", iquadrature_descriptor.degree()); +} + void writeItemType(const std::string& symbol_name, const EmbeddedData& embedded_data, diff --git a/src/utils/checkpointing/CheckpointUtils.hpp b/src/utils/checkpointing/CheckpointUtils.hpp index e5d91a20e..9c9a03a19 100644 --- a/src/utils/checkpointing/CheckpointUtils.hpp +++ b/src/utils/checkpointing/CheckpointUtils.hpp @@ -54,18 +54,24 @@ void writeIDiscreteFunctionDescriptor(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); - void writeIInterfaceDescriptor(const std::string& symbol_name, const EmbeddedData& embedded_data, HighFive::File& file, HighFive::Group& checkpoint_group, HighFive::Group& symbol_table_group); +void writeIQuadratureDescriptor(const std::string& symbol_name, + const EmbeddedData& embedded_data, + HighFive::File& file, + 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); + void writeIZoneDescriptor(const std::string& symbol_name, const EmbeddedData& embedded_data, HighFive::File& file, diff --git a/src/utils/checkpointing/QuadratureTypeHFType.hpp b/src/utils/checkpointing/QuadratureTypeHFType.hpp new file mode 100644 index 000000000..05fd325ca --- /dev/null +++ b/src/utils/checkpointing/QuadratureTypeHFType.hpp @@ -0,0 +1,16 @@ +#ifndef QUADRATURE_TYPE_HF_TYPE_HPP +#define QUADRATURE_TYPE_HF_TYPE_HPP + +#include <analysis/QuadratureType.hpp> +#include <utils/checkpointing/CheckpointUtils.hpp> + +HighFive::EnumType<QuadratureType> PUGS_INLINE +create_enum_quadrature_descriptor_type() +{ + return {{"gauss", QuadratureType::Gauss}, + {"gauss-legendre", QuadratureType::GaussLegendre}, + {"gauss-lobatto", QuadratureType::GaussLobatto}}; +} +HIGHFIVE_REGISTER_TYPE(QuadratureType, create_enum_quadrature_descriptor_type); + +#endif // QUADRATURE_TYPE_HF_TYPE_HPP diff --git a/src/utils/checkpointing/ResumeUtils.cpp b/src/utils/checkpointing/ResumeUtils.cpp index 7dc506aef..a4a47125f 100644 --- a/src/utils/checkpointing/ResumeUtils.cpp +++ b/src/utils/checkpointing/ResumeUtils.cpp @@ -1,5 +1,8 @@ #include <utils/checkpointing/ResumeUtils.hpp> +#include <analysis/GaussLegendreQuadratureDescriptor.hpp> +#include <analysis/GaussLobattoQuadratureDescriptor.hpp> +#include <analysis/GaussQuadratureDescriptor.hpp> #include <language/utils/DataHandler.hpp> #include <language/utils/SymbolTable.hpp> #include <mesh/NamedBoundaryDescriptor.hpp> @@ -15,6 +18,7 @@ #include <utils/checkpointing/IInterfaceDescriptorHFType.hpp> #include <utils/checkpointing/IZoneDescriptorHFType.hpp> #include <utils/checkpointing/ItemTypeHFType.hpp> +#include <utils/checkpointing/QuadratureTypeHFType.hpp> #include <utils/checkpointing/ResumingData.hpp> EmbeddedData @@ -100,6 +104,37 @@ readIInterfaceDescriptor(const std::string& symbol_name, const HighFive::Group& return embedded_data; } +EmbeddedData +readIQuadratureDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group) +{ + const HighFive::Group iquadraturedescriptor_group = symbol_table_group.getGroup("embedded/" + symbol_name); + const QuadratureType quadrature_type = + iquadraturedescriptor_group.getAttribute("quadrature_type").read<QuadratureType>(); + const size_t degree = iquadraturedescriptor_group.getAttribute("quadrature_degree").read<size_t>(); + + EmbeddedData embedded_data; + + switch (quadrature_type) { + case QuadratureType::Gauss: { + embedded_data = {std::make_shared<DataHandler<const IQuadratureDescriptor>>( + std::make_shared<const GaussQuadratureDescriptor>(degree))}; + break; + } + case QuadratureType::GaussLegendre: { + embedded_data = {std::make_shared<DataHandler<const IQuadratureDescriptor>>( + std::make_shared<const GaussLegendreQuadratureDescriptor>(degree))}; + break; + } + case QuadratureType::GaussLobatto: { + embedded_data = {std::make_shared<DataHandler<const IQuadratureDescriptor>>( + std::make_shared<const GaussLobattoQuadratureDescriptor>(degree))}; + break; + } + } + + return embedded_data; +} + EmbeddedData readItemType(const std::string& symbol_name, const HighFive::Group& symbol_table_group) { diff --git a/src/utils/checkpointing/ResumeUtils.hpp b/src/utils/checkpointing/ResumeUtils.hpp index c8797804e..777216896 100644 --- a/src/utils/checkpointing/ResumeUtils.hpp +++ b/src/utils/checkpointing/ResumeUtils.hpp @@ -31,6 +31,7 @@ read(const HighFive::Group& group, const std::string& name) EmbeddedData readIBoundaryDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group); EmbeddedData readIDiscreteFunctionDescriptor(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 readIQuadratureDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group); EmbeddedData readItemType(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 readMesh(const std::string& symbol_name, const HighFive::Group& symbol_table_group); -- GitLab