diff --git a/src/language/modules/SchemeModule.cpp b/src/language/modules/SchemeModule.cpp index 7f7464879ba6c24ee855d47fe6792bef0a9bb8c8..71e36183f6af48288fa6ece099a63793d9c97d79 100644 --- a/src/language/modules/SchemeModule.cpp +++ b/src/language/modules/SchemeModule.cpp @@ -740,4 +740,17 @@ SchemeModule::registerCheckpointResume() const const HighFive::Group& symbol_table_group) -> EmbeddedData { return readIQuadratureDescriptor(symbol_name, symbol_table_group); })); + + CheckpointResumeRepository::instance() + .addCheckpointResume(ast_node_data_type_from<std::shared_ptr<const VariableBCDescriptor>>, + std::function([](const std::string& symbol_name, const EmbeddedData& embedded_data, + HighFive::File& file, HighFive::Group& checkpoint_group, + HighFive::Group& symbol_table_group) { + writeVariableBCDescriptor(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 readVariableBCDescriptor(symbol_name, symbol_table_group); + })); } diff --git a/src/utils/checkpointing/CheckpointUtils.cpp b/src/utils/checkpointing/CheckpointUtils.cpp index 3db38f27756af45305722043ad29c77f2a00d974..c72f70bfce487c82429da9a27c50f3dd5f853dd1 100644 --- a/src/utils/checkpointing/CheckpointUtils.cpp +++ b/src/utils/checkpointing/CheckpointUtils.cpp @@ -28,6 +28,7 @@ #include <scheme/DiscreteFunctionP0Vector.hpp> #include <scheme/DiscreteFunctionVariant.hpp> #include <scheme/IBoundaryConditionDescriptor.hpp> +#include <scheme/VariableBCDescriptor.hpp> #include <utils/checkpointing/DiscreteFunctionTypeHFType.hpp> #include <utils/checkpointing/IBoundaryConditionDescriptorHFType.hpp> #include <utils/checkpointing/IBoundaryDescriptorHFType.hpp> @@ -275,17 +276,9 @@ writeIBoundaryDescriptor(HighFive::Group& variable_group, const IBoundaryDescrip } void -writeIBoundaryConditionDescriptor(const std::string& symbol_name, - const EmbeddedData& embedded_data, - HighFive::File&, - HighFive::Group&, - HighFive::Group& symbol_table_group) +writeIBoundaryConditionDescriptor(HighFive::Group& variable_group, + std::shared_ptr<const IBoundaryConditionDescriptor> iboundary_condition_descriptor_p) { - HighFive::Group variable_group = symbol_table_group.createGroup("embedded/" + symbol_name); - - std::shared_ptr<const IBoundaryConditionDescriptor> iboundary_condition_descriptor_p = - dynamic_cast<const DataHandler<const IBoundaryConditionDescriptor>&>(embedded_data.get()).data_ptr(); - const IBoundaryConditionDescriptor& iboundary_condition_descriptor = *iboundary_condition_descriptor_p; variable_group.createAttribute("type", @@ -365,6 +358,21 @@ writeIBoundaryConditionDescriptor(const std::string& symbol_name, } } +void +writeIBoundaryConditionDescriptor(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 IBoundaryConditionDescriptor> iboundary_condition_descriptor_p = + dynamic_cast<const DataHandler<const IBoundaryConditionDescriptor>&>(embedded_data.get()).data_ptr(); + + writeIBoundaryConditionDescriptor(variable_group, iboundary_condition_descriptor_p); +} + void writeIBoundaryDescriptor(const std::string& symbol_name, const EmbeddedData& embedded_data, @@ -769,3 +777,28 @@ writeOStream(const std::string& symbol_name, } } } + +void +writeVariableBCDescriptor(const std::string& symbol_name, + const EmbeddedData& embedded_data, + HighFive::File& file, + HighFive::Group& checkpoint_group, + HighFive::Group& symbol_table_group) +{ + HighFive::Group variable_group = symbol_table_group.createGroup("embedded/" + symbol_name); + + std::shared_ptr<const VariableBCDescriptor> variable_bc_descriptor_p = + dynamic_cast<const DataHandler<const VariableBCDescriptor>&>(embedded_data.get()).data_ptr(); + + HighFive::Group discrete_function_group = variable_group.createGroup("discrete_function"); + writeDiscreteFunctionVariant(discrete_function_group, variable_bc_descriptor_p->discreteFunctionVariant(), file, + checkpoint_group); + + const auto bc_descriptor_list = variable_bc_descriptor_p->bcDescriptorList(); + HighFive::Group bc_descriptor_list_group = variable_group.createGroup("bc_descriptor_list"); + for (size_t i_bc_descriptor = 0; i_bc_descriptor < bc_descriptor_list.size(); ++i_bc_descriptor) { + HighFive::Group bc_descriptor_group = bc_descriptor_list_group.createGroup(std::to_string(i_bc_descriptor)); + + writeIBoundaryConditionDescriptor(bc_descriptor_group, bc_descriptor_list[i_bc_descriptor]); + } +} diff --git a/src/utils/checkpointing/CheckpointUtils.hpp b/src/utils/checkpointing/CheckpointUtils.hpp index 0019d85fddbc3a32d1521ae8d95c8f028ce143c6..50fa940dc51086f9b5ad7de73b1d19e4317c8a4d 100644 --- a/src/utils/checkpointing/CheckpointUtils.hpp +++ b/src/utils/checkpointing/CheckpointUtils.hpp @@ -197,4 +197,10 @@ void writeOStream(const std::string& symbol_name, HighFive::Group& checkpoint_group, HighFive::Group& symbol_table_group); +void writeVariableBCDescriptor(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/ResumeUtils.cpp b/src/utils/checkpointing/ResumeUtils.cpp index ca2c55eec67d04c3189ebf8b65df7af24c4cfc40..3b73a3b0310fa8521f25fd9274f39f47e1e3a959 100644 --- a/src/utils/checkpointing/ResumeUtils.cpp +++ b/src/utils/checkpointing/ResumeUtils.cpp @@ -35,6 +35,7 @@ #include <scheme/NeumannBoundaryConditionDescriptor.hpp> #include <scheme/OutflowBoundaryConditionDescriptor.hpp> #include <scheme/SymmetryBoundaryConditionDescriptor.hpp> +#include <scheme/VariableBCDescriptor.hpp> #include <utils/checkpointing/DiscreteFunctionTypeHFType.hpp> #include <utils/checkpointing/IBoundaryConditionDescriptorHFType.hpp> #include <utils/checkpointing/IBoundaryDescriptorHFType.hpp> @@ -89,10 +90,9 @@ readIBoundaryDescriptor(const HighFive::Group& iboundarydescriptor_group) return i_boundary_descriptor; } -EmbeddedData -readIBoundaryConditionDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group) +std::shared_ptr<const IBoundaryConditionDescriptor> +readIBoundaryConditionDescriptor(const HighFive::Group& iboundaryconditiondecriptor_group) { - const HighFive::Group iboundaryconditiondecriptor_group = symbol_table_group.getGroup("embedded/" + symbol_name); const IBoundaryConditionDescriptor::Type iboundary_condition_descriptor_type = iboundaryconditiondecriptor_group.getAttribute("iboundary_condition_descriptor_type") .read<IBoundaryConditionDescriptor::Type>(); @@ -168,6 +168,14 @@ readIBoundaryConditionDescriptor(const std::string& symbol_name, const HighFive: } } + return bc_descriptor; +} + +EmbeddedData +readIBoundaryConditionDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group) +{ + std::shared_ptr<const IBoundaryConditionDescriptor> bc_descriptor = + readIBoundaryConditionDescriptor(symbol_table_group.getGroup("embedded/" + symbol_name)); return {std::make_shared<DataHandler<const IBoundaryConditionDescriptor>>(bc_descriptor)}; } @@ -649,3 +657,26 @@ readOStream(const std::string& symbol_name, const HighFive::Group& symbol_table_ return {std::make_shared<DataHandler<const OStream>>(p_ostream)}; } + +EmbeddedData +readVariableBCDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group) +{ + const HighFive::Group variable_bc_descriptor_group = symbol_table_group.getGroup("embedded/" + symbol_name); + + HighFive::Group discrete_function_group = variable_bc_descriptor_group.getGroup("discrete_function"); + + std::shared_ptr<const DiscreteFunctionVariant> discrete_function = + readDiscreteFunctionVariant(discrete_function_group); + + HighFive::Group bc_descriptor_list_group = variable_bc_descriptor_group.getGroup("bc_descriptor_list"); + std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>> bc_descriptor_list; + for (size_t i = 0; i < bc_descriptor_list_group.getNumberObjects(); ++i) { + HighFive::Group bc_descriptor_group = bc_descriptor_list_group.getGroup(std::to_string(i)); + bc_descriptor_list.push_back(readIBoundaryConditionDescriptor(bc_descriptor_group)); + } + + std::shared_ptr<const VariableBCDescriptor> p_variable_bc_descriptor = + std::make_shared<const VariableBCDescriptor>(discrete_function, bc_descriptor_list); + + return {std::make_shared<DataHandler<const VariableBCDescriptor>>(p_variable_bc_descriptor)}; +} diff --git a/src/utils/checkpointing/ResumeUtils.hpp b/src/utils/checkpointing/ResumeUtils.hpp index 50e4a67a4d7aba453d8ff8355208c08361494dce..f4ec5325dee1d417baa18a36608a340e2916a299 100644 --- a/src/utils/checkpointing/ResumeUtils.hpp +++ b/src/utils/checkpointing/ResumeUtils.hpp @@ -96,5 +96,6 @@ EmbeddedData readIWriter(const std::string& symbol_name, const HighFive::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); EmbeddedData readOStream(const std::string& symbol_name, const HighFive::Group& symbol_table_group); +EmbeddedData readVariableBCDescriptor(const std::string& symbol_name, const HighFive::Group& symbol_table_group); #endif // RESUME_UTILS_HPP