#include #include #include #include "serif/discretization/domain/mesh/topology.hpp" #include "serif/discretization/domain/physical_domains.hpp" #include "serif/discretization/domain/relation/relations.hpp" #include "serif/discretization/domain/relation/validation/runtime.hpp" #include "serif/discretization/domain/schema/schemas.hpp" #include "serif/discretization/domain/schema/validation/inscribed.hpp" #include "serif/discretization/domain/types.hpp" #include "serif/tests/test_tags.hpp" #include "serif/tests/discritization/domain/domain_test_utils.hpp" namespace domain = serif::discretization::domain; namespace relation = domain::relation; namespace schema = domain::schema; namespace validation = schema::validation; using domain::mesh::MeshTopology; TEST_CASE( "Inscribed Accepts Nested Atomic And Composite Domains", tags::unit &tags::mesh &tags::utils &tags::domain ) { const mfem::Mesh mesh = domain_test_utils::make_layered_mesh(); const MeshTopology topology{mesh}; const auto coreResult = validation::RelationValidator>::template validate(topology); CHECK(coreResult); const auto stellarResult = validation::RelationValidator>::template validate(topology); CHECK(stellarResult); } TEST_CASE( "Inscribed Rejects An Absent Inner Domain", tags::unit &tags::mesh &tags::utils &tags::domain ) { const mfem::Mesh mesh = domain_test_utils::make_grid_mesh(2, 2, {2, 2, 2, 2}, {}); const auto result = validation::RelationValidator>::template validate(MeshTopology{mesh}); CHECK_FALSE(result); CHECK(result.failure == validation::RelationValidationFailure::InnerDomainAbsent); } TEST_CASE( "Inscribed Rejects An Absent Outer Domain", tags::unit &tags::mesh &tags::utils &tags::domain ) { const mfem::Mesh mesh = domain_test_utils::make_grid_mesh(1, 1, {1}, {}); const auto result = validation::RelationValidator>::template validate(MeshTopology{mesh}); CHECK_FALSE(result); CHECK(result.failure == validation::RelationValidationFailure::OuterDomainAbsent); } TEST_CASE( "Inscribed Rejects An Inner Domain Touching The Computational Boundary", tags::unit &tags::mesh &tags::utils &tags::domain ) { const mfem::Mesh mesh = domain_test_utils::make_grid_mesh(2, 2, {1, 2, 2, 2}, {}); const auto result = validation::RelationValidator>::template validate(MeshTopology{mesh}); CHECK_FALSE(result); CHECK(result.failure == validation::RelationValidationFailure::InnerDomainTouchesMeshBoundary); REQUIRE(result.inscribedDiagnostics.has_value()); CHECK(result.inscribedDiagnostics->faceID >= 0); CHECK(result.inscribedDiagnostics->innerElementID >= 0); CHECK(result.inscribedDiagnostics->adjacentElementID == -1); } TEST_CASE( "Inscribed Rejects An Inner Domain Touching An Unexpected Material", tags::unit &tags::mesh &tags::utils &tags::domain ) { std::vector attributes{2, 2, 2, 2, 1, 3, 2, 2, 2}; const mfem::Mesh mesh = domain_test_utils::make_grid_mesh(3, 3, attributes, {}); const auto result = validation::RelationValidator< relation::Inscribed>:: template validate(MeshTopology{mesh}); CHECK_FALSE(result); CHECK(result.failure == validation::RelationValidationFailure::InnerDomainTouchesUnexpectedDomain); REQUIRE(result.inscribedDiagnostics.has_value()); CHECK(result.inscribedDiagnostics->adjacentDomainID == 3); }