From 12390afa2882e0ee8d099beb6ea2764ab6924606 Mon Sep 17 00:00:00 2001 From: Nils Vu Date: Mon, 26 Feb 2024 15:53:24 -0800 Subject: [PATCH] fixup --- .../Systems/Elasticity/Actions/CMakeLists.txt | 22 +++ .../Test_InitializeConstitutiveRelation.cpp | 134 ++++++++++++++++++ .../Systems/Elasticity/CMakeLists.txt | 1 + 3 files changed, 157 insertions(+) create mode 100644 tests/Unit/Elliptic/Systems/Elasticity/Actions/CMakeLists.txt create mode 100644 tests/Unit/Elliptic/Systems/Elasticity/Actions/Test_InitializeConstitutiveRelation.cpp diff --git a/tests/Unit/Elliptic/Systems/Elasticity/Actions/CMakeLists.txt b/tests/Unit/Elliptic/Systems/Elasticity/Actions/CMakeLists.txt new file mode 100644 index 0000000000000..f149e43b11a47 --- /dev/null +++ b/tests/Unit/Elliptic/Systems/Elasticity/Actions/CMakeLists.txt @@ -0,0 +1,22 @@ +# Distributed under the MIT License. +# See LICENSE.txt for details. + +set(LIBRARY "Test_ElasticityActions") + +set(LIBRARY_SOURCES + Test_InitializeConstitutiveRelation.cpp + ) + +add_test_library(${LIBRARY} "${LIBRARY_SOURCES}") + +target_link_libraries( + ${LIBRARY} + PRIVATE + ConstitutiveRelations + DataStructures + Domain + ElasticityActions + Elliptic + Elasticity + Utilities + ) diff --git a/tests/Unit/Elliptic/Systems/Elasticity/Actions/Test_InitializeConstitutiveRelation.cpp b/tests/Unit/Elliptic/Systems/Elasticity/Actions/Test_InitializeConstitutiveRelation.cpp new file mode 100644 index 0000000000000..559ce91542aa3 --- /dev/null +++ b/tests/Unit/Elliptic/Systems/Elasticity/Actions/Test_InitializeConstitutiveRelation.cpp @@ -0,0 +1,134 @@ +// Distributed under the MIT License. +// See LICENSE.txt for details. + +#include "Framework/TestingFramework.hpp" + +#include +#include +#include +#include +#include +#include + +#include "DataStructures/DataBox/DataBox.hpp" +#include "Domain/Creators/Cylinder.hpp" +#include "Domain/Creators/RegisterDerivedWithCharm.hpp" +#include "Domain/Structure/Element.hpp" +#include "Domain/Structure/ElementId.hpp" +#include "Domain/Tags.hpp" +#include "Elliptic/Systems/Elasticity/Actions/InitializeConstitutiveRelation.hpp" +#include "Framework/ActionTesting.hpp" +#include "Options/Protocols/FactoryCreation.hpp" +#include "Parallel/Phase.hpp" +#include "PointwiseFunctions/Elasticity/ConstitutiveRelations/Factory.hpp" +#include "PointwiseFunctions/Elasticity/ConstitutiveRelations/Tags.hpp" +#include "Utilities/ProtocolHelpers.hpp" +#include "Utilities/Serialization/RegisterDerivedClassesWithCharm.hpp" +#include "Utilities/TMPL.hpp" + +namespace Elasticity { +namespace { +constexpr size_t Dim = 3; + +template +struct ElementArray { + using metavariables = Metavariables; + using chare_type = ActionTesting::MockArrayChare; + using array_index = ElementId; + using const_global_cache_tags = tmpl::list<>; + using phase_dependent_action_list = tmpl::list< + Parallel::PhaseActions>>>>, + Parallel::PhaseActions< + Parallel::Phase::Testing, + tmpl::list>>>; +}; + +struct Metavariables { + using component_list = tmpl::list>; + using const_global_cache_tags = tmpl::list>; + struct factory_creation + : tt::ConformsTo { + using factory_classes = tmpl::map, + ConstitutiveRelations::standard_constitutive_relations>>; + }; +}; + +} // namespace + +SPECTRE_TEST_CASE("Unit.Elasticity.Actions.InitializeConstitutiveRelation", + "[Unit][Elliptic][Actions]") { + domain::creators::register_derived_with_charm(); + register_factory_classes_with_charm(); + // A cylinder with two layers in z-direction + const std::unique_ptr> domain_creator = + std::make_unique( + 1., 3., 0., 10., false, 1_st, 3_st, false, std::vector{}, + std::vector{2.}, + std::vector{ + domain::CoordinateMaps::Distribution::Linear}, + std::vector{ + domain::CoordinateMaps::Distribution::Linear, + domain::CoordinateMaps::Distribution::Linear}); + const ElementId element_id_layer1{0, {{{1, 0}, {1, 0}, {1, 0}}}}; + const ElementId element_id_layer2{5, {{{1, 0}, {1, 0}, {1, 0}}}}; + // A different material in each layer + using ConstRelPtr = + std::unique_ptr>; + std::unordered_map material_layers{}; + material_layers["Layer0"] = + std::make_unique>(1., + 2.); + material_layers["Layer1"] = + std::make_unique>(3., + 4.); + const typename OptionTags::ConstitutiveRelationPerBlock::type + material_layers_variant(std::move(material_layers)); + + auto material_per_block = + Tags::ConstitutiveRelationPerBlock::create_from_options( + domain_creator, material_layers_variant); + auto material_block_groups = + Tags::MaterialBlockGroups::create_from_options( + material_layers_variant); + REQUIRE(material_block_groups == + std::unordered_set{"Layer0", "Layer1"}); + + using element_array = ElementArray; + ActionTesting::MockRuntimeSystem runner{ + tuples::TaggedTuple, + Tags::ConstitutiveRelationPerBlock, + Tags::MaterialBlockGroups>{ + domain_creator->create_domain(), std::move(material_per_block), + std::move(material_block_groups)}}; + for (const auto& element_id : {element_id_layer1, element_id_layer2}) { + ActionTesting::emplace_component_and_initialize( + &runner, element_id, {Element{element_id, {}}}); + } + ActionTesting::set_phase(make_not_null(&runner), Parallel::Phase::Testing); + for (const auto& element_id : {element_id_layer1, element_id_layer2}) { + ActionTesting::next_action(make_not_null(&runner), + element_id); + } + + const auto get_tag = + [&runner](auto tag_v, const ElementId& element_id) -> const auto& { + using tag = std::decay_t; + return ActionTesting::get_databox_tag(runner, + element_id); + }; + + const auto check_material = [&get_tag](const ElementId& element_id, + const double expected_bulk_modulus) { + const auto& material = + dynamic_cast&>( + get_tag(Tags::ConstitutiveRelation{}, element_id)); + CHECK(material.bulk_modulus() == expected_bulk_modulus); + }; + + check_material(element_id_layer1, 1.); + check_material(element_id_layer2, 3.); +} +} // namespace Elasticity diff --git a/tests/Unit/Elliptic/Systems/Elasticity/CMakeLists.txt b/tests/Unit/Elliptic/Systems/Elasticity/CMakeLists.txt index 1ce9801a9b86c..8bbf7311186d9 100644 --- a/tests/Unit/Elliptic/Systems/Elasticity/CMakeLists.txt +++ b/tests/Unit/Elliptic/Systems/Elasticity/CMakeLists.txt @@ -22,4 +22,5 @@ target_link_libraries( Utilities ) +add_subdirectory(Actions) add_subdirectory(BoundaryConditions)