diff --git a/src/language/modules/SchemeModule.cpp b/src/language/modules/SchemeModule.cpp index 8481a1ed20958162866820c139983971e35f373b..f1a7d8d73606a6cd71e4aa6b4f7253f8773a804e 100644 --- a/src/language/modules/SchemeModule.cpp +++ b/src/language/modules/SchemeModule.cpp @@ -42,10 +42,12 @@ #include <scheme/IBoundaryConditionDescriptor.hpp> #include <scheme/IDiscreteFunctionDescriptor.hpp> #include <scheme/InflowBoundaryConditionDescriptor.hpp> +#include <scheme/InflowListBoundaryConditionDescriptor.hpp> #include <scheme/NeumannBoundaryConditionDescriptor.hpp> #include <scheme/OutflowBoundaryConditionDescriptor.hpp> #include <scheme/SymmetryBoundaryConditionDescriptor.hpp> #include <scheme/VariableBCDescriptor.hpp> +#include <scheme/WallBoundaryConditionDescriptor.hpp> #include <utils/Socket.hpp> #include <utils/checkpointing/ReadDiscreteFunctionVariant.hpp> @@ -348,6 +350,15 @@ SchemeModule::SchemeModule() )); + this->_addBuiltinFunction("wall", std::function( + + [](std::shared_ptr<const IBoundaryDescriptor> boundary) + -> std::shared_ptr<const IBoundaryConditionDescriptor> { + return std::make_shared<WallBoundaryConditionDescriptor>(boundary); + } + + )); + this->_addBuiltinFunction("pressure", std::function( [](std::shared_ptr<const IBoundaryDescriptor> boundary, @@ -407,6 +418,18 @@ SchemeModule::SchemeModule() )); + this->_addBuiltinFunction("inflow_list", + std::function( + + [](std::shared_ptr<const IBoundaryDescriptor> boundary, + const std::vector<FunctionSymbolId>& function_id_list) + -> std::shared_ptr<const IBoundaryConditionDescriptor> { + return std::make_shared<InflowListBoundaryConditionDescriptor>(boundary, + function_id_list); + } + + )); + this->_addBuiltinFunction("outflow", std::function( [](std::shared_ptr<const IBoundaryDescriptor> boundary) diff --git a/src/scheme/IBoundaryConditionDescriptor.hpp b/src/scheme/IBoundaryConditionDescriptor.hpp index 58e8b6076ff2c363049de6f107e6a949966d6c72..fc9ff381b97758e79642647a36680364093c193b 100644 --- a/src/scheme/IBoundaryConditionDescriptor.hpp +++ b/src/scheme/IBoundaryConditionDescriptor.hpp @@ -18,9 +18,11 @@ class IBoundaryConditionDescriptor fixed, free, inflow, + inflow_list, neumann, outflow, - symmetry + symmetry, + wall }; protected: diff --git a/src/scheme/InflowListBoundaryConditionDescriptor.hpp b/src/scheme/InflowListBoundaryConditionDescriptor.hpp new file mode 100644 index 0000000000000000000000000000000000000000..ad1427cf72532b770a378c5e86ecbc1cc39ac063 --- /dev/null +++ b/src/scheme/InflowListBoundaryConditionDescriptor.hpp @@ -0,0 +1,48 @@ +#ifndef INFLOW_LIST_BOUNDARY_CONDITION_DESCRIPTOR_HPP +#define INFLOW_LIST_BOUNDARY_CONDITION_DESCRIPTOR_HPP + +#include <language/utils/FunctionSymbolId.hpp> +#include <mesh/IBoundaryDescriptor.hpp> +#include <scheme/BoundaryConditionDescriptorBase.hpp> + +#include <memory> + +class InflowListBoundaryConditionDescriptor : public BoundaryConditionDescriptorBase +{ + private: + std::ostream& + _write(std::ostream& os) const final + { + os << "inflow_list(" << ',' << *m_boundary_descriptor << ")"; + return os; + } + + const std::vector<FunctionSymbolId> m_function_symbol_id_list; + + public: + const std::vector<FunctionSymbolId>& + functionSymbolIdList() const + { + return m_function_symbol_id_list; + } + + Type + type() const final + { + return Type::inflow_list; + } + + InflowListBoundaryConditionDescriptor(std::shared_ptr<const IBoundaryDescriptor> boundary_descriptor, + const std::vector<FunctionSymbolId>& function_symbol_id_list) + : BoundaryConditionDescriptorBase{boundary_descriptor}, m_function_symbol_id_list{function_symbol_id_list} + { + ; + } + + InflowListBoundaryConditionDescriptor(const InflowListBoundaryConditionDescriptor&) = delete; + InflowListBoundaryConditionDescriptor(InflowListBoundaryConditionDescriptor&&) = delete; + + ~InflowListBoundaryConditionDescriptor() = default; +}; + +#endif // INFLOW_LIST_BOUNDARY_CONDITION_DESCRIPTOR_HPP diff --git a/src/scheme/WallBoundaryConditionDescriptor.hpp b/src/scheme/WallBoundaryConditionDescriptor.hpp new file mode 100644 index 0000000000000000000000000000000000000000..cf16fba7d1186f0d3c200884ebc319c4b461e582 --- /dev/null +++ b/src/scheme/WallBoundaryConditionDescriptor.hpp @@ -0,0 +1,40 @@ +#ifndef WALL_BOUNDARY_CONDITION_DESCRIPTOR_HPP +#define WALL_BOUNDARY_CONDITION_DESCRIPTOR_HPP + +#include <language/utils/FunctionSymbolId.hpp> +#include <mesh/IBoundaryDescriptor.hpp> +#include <scheme/BoundaryConditionDescriptorBase.hpp> + +#include <memory> + +class WallBoundaryConditionDescriptor : public BoundaryConditionDescriptorBase +{ + private: + std::ostream& + _write(std::ostream& os) const final + { + os << "wall(" << *m_boundary_descriptor << ")"; + return os; + } + + public: + Type + type() const final + { + return Type::wall; + } + + WallBoundaryConditionDescriptor(const std::shared_ptr<const IBoundaryDescriptor>& boundary_descriptor) + + : BoundaryConditionDescriptorBase{boundary_descriptor} + { + ; + } + + WallBoundaryConditionDescriptor(const WallBoundaryConditionDescriptor&) = delete; + WallBoundaryConditionDescriptor(WallBoundaryConditionDescriptor&&) = delete; + + ~WallBoundaryConditionDescriptor() = default; +}; + +#endif // WALL_BOUNDARY_CONDITION_DESCRIPTOR_HPP diff --git a/src/utils/checkpointing/IBoundaryConditionDescriptorHFType.hpp b/src/utils/checkpointing/IBoundaryConditionDescriptorHFType.hpp index 4a7632af5b933710d6ddf1356c7b83aa3562442a..210b521164075f275829865397ea1771a460c207 100644 --- a/src/utils/checkpointing/IBoundaryConditionDescriptorHFType.hpp +++ b/src/utils/checkpointing/IBoundaryConditionDescriptorHFType.hpp @@ -15,9 +15,11 @@ create_enum_i_boundary_condition_descriptor_type() {"fourier", IBoundaryConditionDescriptor::Type::fourier}, {"free", IBoundaryConditionDescriptor::Type::free}, {"inflow", IBoundaryConditionDescriptor::Type::inflow}, + {"inflow_list", IBoundaryConditionDescriptor::Type::inflow_list}, {"neumann", IBoundaryConditionDescriptor::Type::neumann}, {"outflow", IBoundaryConditionDescriptor::Type::outflow}, - {"symmetry", IBoundaryConditionDescriptor::Type::symmetry}}; + {"symmetry", IBoundaryConditionDescriptor::Type::symmetry}, + {"wall", IBoundaryConditionDescriptor::Type::wall}}; } HIGHFIVE_REGISTER_TYPE(IBoundaryConditionDescriptor::Type, create_enum_i_boundary_condition_descriptor_type) diff --git a/src/utils/checkpointing/ReadIBoundaryConditionDescriptor.cpp b/src/utils/checkpointing/ReadIBoundaryConditionDescriptor.cpp index 671a9e7ece3198f766f5ceea45b27a4372e5dcc3..55b43c9f04bf1b3b585df208bd7a3ea86a3d2850 100644 --- a/src/utils/checkpointing/ReadIBoundaryConditionDescriptor.cpp +++ b/src/utils/checkpointing/ReadIBoundaryConditionDescriptor.cpp @@ -10,9 +10,11 @@ #include <scheme/FourierBoundaryConditionDescriptor.hpp> #include <scheme/FreeBoundaryConditionDescriptor.hpp> #include <scheme/InflowBoundaryConditionDescriptor.hpp> +#include <scheme/InflowListBoundaryConditionDescriptor.hpp> #include <scheme/NeumannBoundaryConditionDescriptor.hpp> #include <scheme/OutflowBoundaryConditionDescriptor.hpp> #include <scheme/SymmetryBoundaryConditionDescriptor.hpp> +#include <scheme/WallBoundaryConditionDescriptor.hpp> #include <utils/Exceptions.hpp> #include <utils/checkpointing/IBoundaryConditionDescriptorHFType.hpp> #include <utils/checkpointing/ReadIBoundaryDescriptor.hpp> @@ -82,6 +84,19 @@ readIBoundaryConditionDescriptor(const HighFive::Group& iboundaryconditiondecrip function_id)); break; } + case IBoundaryConditionDescriptor::Type::inflow_list: { + const std::vector function_id_list = + iboundaryconditiondecriptor_group.getAttribute("function_id_list").read<std::vector<size_t>>(); + + std::vector<FunctionSymbolId> function_symbol_id_list; + for (auto function_id : function_id_list) { + function_symbol_id_list.push_back(*ResumingData::instance().functionSymbolId(function_id)); + } + + bc_descriptor = + std::make_shared<const InflowListBoundaryConditionDescriptor>(i_boundary_descriptor, function_symbol_id_list); + break; + } case IBoundaryConditionDescriptor::Type::neumann: { const std::string name = iboundaryconditiondecriptor_group.getAttribute("name").read<std::string>(); const size_t rhs_id = iboundaryconditiondecriptor_group.getAttribute("rhs_function_id").read<size_t>(); @@ -99,6 +114,10 @@ readIBoundaryConditionDescriptor(const HighFive::Group& iboundaryconditiondecrip bc_descriptor = std::make_shared<const SymmetryBoundaryConditionDescriptor>(i_boundary_descriptor); break; } + case IBoundaryConditionDescriptor::Type::wall: { + bc_descriptor = std::make_shared<const WallBoundaryConditionDescriptor>(i_boundary_descriptor); + break; + } } return bc_descriptor; diff --git a/src/utils/checkpointing/WriteIBoundaryConditionDescriptor.cpp b/src/utils/checkpointing/WriteIBoundaryConditionDescriptor.cpp index ca26fdf359c51050b5edc0f82818a2522b8dfb1e..66a8670583ae63442313da42c847bbeee758a2d5 100644 --- a/src/utils/checkpointing/WriteIBoundaryConditionDescriptor.cpp +++ b/src/utils/checkpointing/WriteIBoundaryConditionDescriptor.cpp @@ -9,9 +9,11 @@ #include <scheme/FourierBoundaryConditionDescriptor.hpp> #include <scheme/FreeBoundaryConditionDescriptor.hpp> #include <scheme/InflowBoundaryConditionDescriptor.hpp> +#include <scheme/InflowListBoundaryConditionDescriptor.hpp> #include <scheme/NeumannBoundaryConditionDescriptor.hpp> #include <scheme/OutflowBoundaryConditionDescriptor.hpp> #include <scheme/SymmetryBoundaryConditionDescriptor.hpp> +#include <scheme/WallBoundaryConditionDescriptor.hpp> #include <utils/Exceptions.hpp> #include <utils/checkpointing/IBoundaryConditionDescriptorHFType.hpp> #include <utils/checkpointing/WriteIBoundaryDescriptor.hpp> @@ -81,6 +83,17 @@ writeIBoundaryConditionDescriptor(HighFive::Group& variable_group, variable_group.createAttribute("function_id", inflow_bc_descriptor.functionSymbolId().id()); break; } + case IBoundaryConditionDescriptor::Type::inflow_list: { + const InflowListBoundaryConditionDescriptor& inflow_list_bc_descriptor = + dynamic_cast<const InflowListBoundaryConditionDescriptor&>(iboundary_condition_descriptor); + writeIBoundaryDescriptor(boundary_group, inflow_list_bc_descriptor.boundaryDescriptor()); + std::vector<size_t> function_id_list; + for (auto&& function_symbol_id : inflow_list_bc_descriptor.functionSymbolIdList()) { + function_id_list.push_back(function_symbol_id.id()); + } + variable_group.createAttribute("function_id_list", function_id_list); + break; + } case IBoundaryConditionDescriptor::Type::neumann: { const NeumannBoundaryConditionDescriptor& neumann_bc_descriptor = dynamic_cast<const NeumannBoundaryConditionDescriptor&>(iboundary_condition_descriptor); @@ -101,6 +114,12 @@ writeIBoundaryConditionDescriptor(HighFive::Group& variable_group, writeIBoundaryDescriptor(boundary_group, symmetric_bc_descriptor.boundaryDescriptor()); break; } + case IBoundaryConditionDescriptor::Type::wall: { + const WallBoundaryConditionDescriptor& wall_bc_descriptor = + dynamic_cast<const WallBoundaryConditionDescriptor&>(iboundary_condition_descriptor); + writeIBoundaryDescriptor(boundary_group, wall_bc_descriptor.boundaryDescriptor()); + break; + } } } diff --git a/tests/test_checkpointing_IBoundaryConditionDescriptor.cpp b/tests/test_checkpointing_IBoundaryConditionDescriptor.cpp index f2924291796aa66e6b32866c188860d300b20ad3..34505db62eff529b480c912ce5ca36714c7bc17b 100644 --- a/tests/test_checkpointing_IBoundaryConditionDescriptor.cpp +++ b/tests/test_checkpointing_IBoundaryConditionDescriptor.cpp @@ -14,9 +14,11 @@ #include <scheme/FourierBoundaryConditionDescriptor.hpp> #include <scheme/FreeBoundaryConditionDescriptor.hpp> #include <scheme/InflowBoundaryConditionDescriptor.hpp> +#include <scheme/InflowListBoundaryConditionDescriptor.hpp> #include <scheme/NeumannBoundaryConditionDescriptor.hpp> #include <scheme/OutflowBoundaryConditionDescriptor.hpp> #include <scheme/SymmetryBoundaryConditionDescriptor.hpp> +#include <scheme/WallBoundaryConditionDescriptor.hpp> #include <utils/checkpointing/ReadIBoundaryConditionDescriptor.hpp> #include <utils/checkpointing/ResumingData.hpp> #include <utils/checkpointing/WriteIBoundaryConditionDescriptor.hpp> @@ -139,6 +141,13 @@ let i: R -> R, x -> x+3; p_sym_bc_descriptor)}, file, useless_group, symbol_table_group); + auto p_wall_bc_descriptor = std::make_shared<const WallBoundaryConditionDescriptor>(p_boundary_1); + checkpointing::writeIBoundaryConditionDescriptor("wall_bc_descriptor", + EmbeddedData{std::make_shared< + DataHandler<const IBoundaryConditionDescriptor>>( + p_wall_bc_descriptor)}, + file, useless_group, symbol_table_group); + auto p_outflow_bc_descriptor = std::make_shared<const OutflowBoundaryConditionDescriptor>(p_boundary_2); checkpointing::writeIBoundaryConditionDescriptor("outflow_bc_descriptor", EmbeddedData{std::make_shared< @@ -199,6 +208,16 @@ let i: R -> R, x -> x+3; p_inflow_bc_descriptor)}, file, useless_group, symbol_table_group); + const std::vector<FunctionSymbolId> inflow_list_function_id_list{FunctionSymbolId{2, symbol_table}, + FunctionSymbolId{3, symbol_table}}; + auto p_inflow_list_bc_descriptor = + std::make_shared<const InflowListBoundaryConditionDescriptor>(p_boundary_1, inflow_list_function_id_list); + checkpointing::writeIBoundaryConditionDescriptor("inflow_list_bc_descriptor", + EmbeddedData{std::make_shared< + DataHandler<const IBoundaryConditionDescriptor>>( + p_inflow_list_bc_descriptor)}, + file, useless_group, symbol_table_group); + file.flush(); checkpointing::ResumingData::create(); @@ -211,6 +230,9 @@ let i: R -> R, x -> x+3; EmbeddedData read_sym_bc_descriptor = checkpointing::readIBoundaryConditionDescriptor("sym_bc_descriptor", symbol_table_group); + EmbeddedData read_wall_bc_descriptor = + checkpointing::readIBoundaryConditionDescriptor("wall_bc_descriptor", symbol_table_group); + EmbeddedData read_outflow_bc_descriptor = checkpointing::readIBoundaryConditionDescriptor("outflow_bc_descriptor", symbol_table_group); @@ -232,12 +254,16 @@ let i: R -> R, x -> x+3; EmbeddedData read_inflow_bc_descriptor = checkpointing::readIBoundaryConditionDescriptor("inflow_bc_descriptor", symbol_table_group); + EmbeddedData read_inflow_list_bc_descriptor = + checkpointing::readIBoundaryConditionDescriptor("inflow_list_bc_descriptor", symbol_table_group); + auto get_value = [](const EmbeddedData& embedded_data) -> const IBoundaryConditionDescriptor& { return *dynamic_cast<const DataHandler<const IBoundaryConditionDescriptor>&>(embedded_data.get()).data_ptr(); }; REQUIRE_NOTHROW(get_value(read_axis_bc_descriptor)); REQUIRE_NOTHROW(get_value(read_sym_bc_descriptor)); + REQUIRE_NOTHROW(get_value(read_wall_bc_descriptor)); REQUIRE_NOTHROW(get_value(read_outflow_bc_descriptor)); REQUIRE_NOTHROW(get_value(read_free_bc_descriptor)); REQUIRE_NOTHROW(get_value(read_fixed_bc_descriptor)); @@ -245,9 +271,11 @@ let i: R -> R, x -> x+3; REQUIRE_NOTHROW(get_value(read_neumann_bc_descriptor)); REQUIRE_NOTHROW(get_value(read_fourier_bc_descriptor)); REQUIRE_NOTHROW(get_value(read_inflow_bc_descriptor)); + REQUIRE_NOTHROW(get_value(read_inflow_list_bc_descriptor)); REQUIRE(get_value(read_axis_bc_descriptor).type() == IBoundaryConditionDescriptor::Type::axis); REQUIRE(get_value(read_sym_bc_descriptor).type() == IBoundaryConditionDescriptor::Type::symmetry); + REQUIRE(get_value(read_wall_bc_descriptor).type() == IBoundaryConditionDescriptor::Type::wall); REQUIRE(get_value(read_outflow_bc_descriptor).type() == IBoundaryConditionDescriptor::Type::outflow); REQUIRE(get_value(read_free_bc_descriptor).type() == IBoundaryConditionDescriptor::Type::free); REQUIRE(get_value(read_fixed_bc_descriptor).type() == IBoundaryConditionDescriptor::Type::fixed); @@ -255,9 +283,11 @@ let i: R -> R, x -> x+3; REQUIRE(get_value(read_neumann_bc_descriptor).type() == IBoundaryConditionDescriptor::Type::neumann); REQUIRE(get_value(read_fourier_bc_descriptor).type() == IBoundaryConditionDescriptor::Type::fourier); REQUIRE(get_value(read_inflow_bc_descriptor).type() == IBoundaryConditionDescriptor::Type::inflow); + REQUIRE(get_value(read_inflow_list_bc_descriptor).type() == IBoundaryConditionDescriptor::Type::inflow_list); REQUIRE_NOTHROW(dynamic_cast<const AxisBoundaryConditionDescriptor&>(get_value(read_axis_bc_descriptor))); REQUIRE_NOTHROW(dynamic_cast<const SymmetryBoundaryConditionDescriptor&>(get_value(read_sym_bc_descriptor))); + REQUIRE_NOTHROW(dynamic_cast<const WallBoundaryConditionDescriptor&>(get_value(read_wall_bc_descriptor))); REQUIRE_NOTHROW(dynamic_cast<const OutflowBoundaryConditionDescriptor&>(get_value(read_outflow_bc_descriptor))); REQUIRE_NOTHROW(dynamic_cast<const FreeBoundaryConditionDescriptor&>(get_value(read_free_bc_descriptor))); REQUIRE_NOTHROW(dynamic_cast<const FixedBoundaryConditionDescriptor&>(get_value(read_fixed_bc_descriptor))); @@ -266,9 +296,12 @@ let i: R -> R, x -> x+3; REQUIRE_NOTHROW(dynamic_cast<const NeumannBoundaryConditionDescriptor&>(get_value(read_neumann_bc_descriptor))); REQUIRE_NOTHROW(dynamic_cast<const FourierBoundaryConditionDescriptor&>(get_value(read_fourier_bc_descriptor))); REQUIRE_NOTHROW(dynamic_cast<const InflowBoundaryConditionDescriptor&>(get_value(read_inflow_bc_descriptor))); + REQUIRE_NOTHROW( + dynamic_cast<const InflowListBoundaryConditionDescriptor&>(get_value(read_inflow_list_bc_descriptor))); auto& read_axis_bc = dynamic_cast<const AxisBoundaryConditionDescriptor&>(get_value(read_axis_bc_descriptor)); auto& read_sym_bc = dynamic_cast<const SymmetryBoundaryConditionDescriptor&>(get_value(read_sym_bc_descriptor)); + auto& read_wall_bc = dynamic_cast<const WallBoundaryConditionDescriptor&>(get_value(read_wall_bc_descriptor)); auto& read_outflow_bc = dynamic_cast<const OutflowBoundaryConditionDescriptor&>(get_value(read_outflow_bc_descriptor)); auto& read_free_bc = dynamic_cast<const FreeBoundaryConditionDescriptor&>(get_value(read_free_bc_descriptor)); @@ -281,9 +314,12 @@ let i: R -> R, x -> x+3; dynamic_cast<const FourierBoundaryConditionDescriptor&>(get_value(read_fourier_bc_descriptor)); auto& read_inflow_bc = dynamic_cast<const InflowBoundaryConditionDescriptor&>(get_value(read_inflow_bc_descriptor)); + auto& read_inflow_list_bc = + dynamic_cast<const InflowListBoundaryConditionDescriptor&>(get_value(read_inflow_list_bc_descriptor)); REQUIRE(read_axis_bc.boundaryDescriptor().type() == p_axis_bc_descriptor->boundaryDescriptor().type()); REQUIRE(read_sym_bc.boundaryDescriptor().type() == p_sym_bc_descriptor->boundaryDescriptor().type()); + REQUIRE(read_wall_bc.boundaryDescriptor().type() == p_wall_bc_descriptor->boundaryDescriptor().type()); REQUIRE(read_outflow_bc.boundaryDescriptor().type() == p_outflow_bc_descriptor->boundaryDescriptor().type()); REQUIRE(read_free_bc.boundaryDescriptor().type() == p_free_bc_descriptor->boundaryDescriptor().type()); REQUIRE(read_fixed_bc.boundaryDescriptor().type() == p_fixed_bc_descriptor->boundaryDescriptor().type()); @@ -299,6 +335,12 @@ let i: R -> R, x -> x+3; REQUIRE(read_fourier_bc.rhsSymbolId().id() == p_fourier_bc_descriptor->rhsSymbolId().id()); REQUIRE(read_inflow_bc.boundaryDescriptor().type() == p_inflow_bc_descriptor->boundaryDescriptor().type()); REQUIRE(read_inflow_bc.functionSymbolId().id() == p_inflow_bc_descriptor->functionSymbolId().id()); + REQUIRE(read_inflow_list_bc.boundaryDescriptor().type() == + p_inflow_list_bc_descriptor->boundaryDescriptor().type()); + for (size_t i = 0; i < read_inflow_list_bc.functionSymbolIdList().size(); ++i) { + REQUIRE(read_inflow_list_bc.functionSymbolIdList()[i].id() == + p_inflow_list_bc_descriptor->functionSymbolIdList()[i].id()); + } checkpointing::ResumingData::destroy(); ast->m_symbol_table->clearValues();