The full rewrite of mean_field into something maintainable is progressing. dimensions is mostly done, discritization (domain, blocks, and fields) is done, and eos is progressing quickly
97 lines
4.0 KiB
C++
97 lines
4.0 KiB
C++
#include <vector>
|
|
|
|
#include <catch2/catch_test_macros.hpp>
|
|
#include <mfem.hpp>
|
|
|
|
#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<relation::Inscribed<domain::CoreDomain, domain::EnvelopeDomain>>::template validate<schema::CoreEnvelopeVacuumDomainSchema>(topology);
|
|
|
|
CHECK(coreResult);
|
|
|
|
const auto stellarResult = validation::RelationValidator<relation::Inscribed<domain::StellarDomains, domain::VacuumDomain>>::template validate<schema::CoreEnvelopeVacuumDomainSchema>(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<relation::Inscribed<domain::CoreDomain, domain::EnvelopeDomain>>::template validate<schema::CoreEnvelopeVacuumDomainSchema>(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<relation::Inscribed<domain::CoreDomain, domain::EnvelopeDomain>>::template validate<schema::CoreEnvelopeVacuumDomainSchema>(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<relation::Inscribed<domain::CoreDomain, domain::EnvelopeDomain>>::template validate<schema::CoreEnvelopeVacuumDomainSchema>(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<int> 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<domain::CoreDomain, domain::EnvelopeDomain>>::
|
|
template validate<schema::CoreEnvelopeVacuumDomainSchema>(MeshTopology{mesh});
|
|
|
|
CHECK_FALSE(result);
|
|
CHECK(result.failure == validation::RelationValidationFailure::InnerDomainTouchesUnexpectedDomain);
|
|
REQUIRE(result.inscribedDiagnostics.has_value());
|
|
CHECK(result.inscribedDiagnostics->adjacentDomainID == 3);
|
|
}
|