diff --git a/src/language/modules/SchemeModule.cpp b/src/language/modules/SchemeModule.cpp index f05fcafa67e4de0459b4543f599e9fce70beadd2..b595e0d34ec1f45734d927aa7cf89a1ff493764d 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 e6e503d1aecff38d050c09d17ca714db41b33c7b..6a45d332a1a23ee150d2082ea3118a7f333cd61d 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 e5d91a20e533f934c7f47889954e99806d36f2f4..9c9a03a193dff12f26002fbc6d3fa1d1f4d8904a 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 0000000000000000000000000000000000000000..05fd325ca15e395c6233c237e8f927fb12409d78 --- /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 7dc506aef95c6e77f1f795def8c8344db58d8234..a4a47125ff26cbe9d44d5064833291c8e3472854 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 c8797804e990385b628f5607452c7a30432e3f4f..777216896d1abeaee39713d261b147f5bc68bdb0 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);