#include #include #include #include #include import mean_field; import test_helpers; namespace field_base_test_utils { namespace field = mean_field::field; namespace domain = mean_field::utils::domain; using IndependentL2Scalar = field::ScalarQ>; using IndependentH1Scalar = field::ScalarQ>; using IndependentH1Vector = field::VectorQ>; using IndependentL2Vector = field::VectorQ>; using Potential = field::ScalarQ>; using Flux = field::VectorQ, field::Disc>; using CurlSource = field::VectorQ>; using CurlQuantity = field::VectorQ, field::Disc>; using SampleOperand = field::Operand; using SampleGradientOperand = field::Operand; using SampleForm = field::FormSpec<17, 2, SampleOperand, SampleGradientOperand>; struct StellarSupportedObject { using Support = field::DomainSupport; }; struct AllSupportedObject { using Support = field::DomainSupport; }; struct NonSpatialObject { using Support = field::NonSpatialSupport; }; } // namespace field_base_test_utils TEST_CASE( "Field Base Type Lists Track Compile Time Membership", tags::unit &tags::field ) { namespace field = mean_field::field; using List = field::TypeList; STATIC_REQUIRE(field::typeListContains); STATIC_REQUIRE(field::typeListContains); STATIC_REQUIRE(field::typeListContains); STATIC_REQUIRE_FALSE(field::typeListContains); STATIC_REQUIRE_FALSE(field::typeListContains>); CHECK(true); } TEST_CASE( "Field Base Function Space Tags Encode Supported Tensor Ranks", tags::unit &tags::field ) { namespace field = mean_field::field; STATIC_REQUIRE(field::SpaceTag); STATIC_REQUIRE(field::SpaceTag); STATIC_REQUIRE(field::SpaceTag); STATIC_REQUIRE(field::SpaceTag); STATIC_REQUIRE_FALSE(field::SpaceTag); STATIC_REQUIRE(field::spaceSupportsRank); STATIC_REQUIRE(field::spaceSupportsRank); STATIC_REQUIRE(field::spaceSupportsRank); STATIC_REQUIRE(field::spaceSupportsRank); STATIC_REQUIRE_FALSE(field::spaceSupportsRank); STATIC_REQUIRE(field::spaceSupportsRank); STATIC_REQUIRE_FALSE(field::spaceSupportsRank); STATIC_REQUIRE(field::spaceSupportsRank); CHECK(field::L2::name == std::string_view{"L2"}); CHECK(field::H1::name == std::string_view{"H1"}); CHECK(field::RT::name == std::string_view{"RT"}); CHECK(field::ND::name == std::string_view{"ND"}); } TEST_CASE( "Field Base Discretization Descriptors Preserve Space And Family Order", tags::unit &tags::field ) { namespace field = mean_field::field; using L2Disc = field::Disc; using H1Disc = field::Disc; using RTDisc = field::Disc; using NDDisc = field::Disc; STATIC_REQUIRE(field::DiscretizationTag); STATIC_REQUIRE(field::DiscretizationTag); STATIC_REQUIRE(field::DiscretizationTag); STATIC_REQUIRE(field::DiscretizationTag); STATIC_REQUIRE(std::same_as); STATIC_REQUIRE(std::same_as); STATIC_REQUIRE(L2Disc::familyOrder == 2); STATIC_REQUIRE(H1Disc::familyOrder == 4); STATIC_REQUIRE(RTDisc::familyOrder == 1); STATIC_REQUIRE(NDDisc::familyOrder == 3); CHECK(true); } TEST_CASE( "Field Base Relations Preserve Their Source Quantities", tags::unit &tags::field ) { namespace field = mean_field::field; using Source = field_base_test_utils::IndependentL2Scalar; using Gradient = field::FieldRelation::Gradient; using Divergence = field::FieldRelation::Divergence; using Curl = field::FieldRelation::Curl; STATIC_REQUIRE(field::ValidRelation); STATIC_REQUIRE(field::ValidRelation); STATIC_REQUIRE(field::ValidRelation); STATIC_REQUIRE(field::ValidRelation); STATIC_REQUIRE_FALSE(field::ValidRelation); STATIC_REQUIRE(field::IsGradient::value); STATIC_REQUIRE(field::IsDivergence::value); STATIC_REQUIRE(field::IsCurl::value); STATIC_REQUIRE(std::same_as::Type, Source>); STATIC_REQUIRE(std::same_as::Type, Source>); STATIC_REQUIRE(std::same_as::Type, Source>); STATIC_REQUIRE(std::same_as::Type, void>); CHECK(true); } TEST_CASE( "Field Base Finite Element Quantities Preserve Rank Storage Space And Order", tags::unit &tags::field ) { namespace field = mean_field::field; using Scalar = field_base_test_utils::IndependentL2Scalar; using Vector = field_base_test_utils::IndependentH1Vector; STATIC_REQUIRE(field::FieldQuantity); STATIC_REQUIRE(field::FieldQuantity); STATIC_REQUIRE(field::RegisteredQuantity); STATIC_REQUIRE(field::RegisteredQuantity); STATIC_REQUIRE(Scalar::rankValue == 0); STATIC_REQUIRE(Vector::rankValue == 1); STATIC_REQUIRE(Scalar::familyOrder == 2); STATIC_REQUIRE(Vector::familyOrder == 3); STATIC_REQUIRE(std::same_as); STATIC_REQUIRE(std::same_as); STATIC_REQUIRE(Scalar::storageKind == field::StorageKind::finite_element); STATIC_REQUIRE(Vector::storageKind == field::StorageKind::finite_element); STATIC_REQUIRE(Scalar::staticBlockSize == field::dynamicBlockSize); STATIC_REQUIRE(Vector::staticBlockSize == field::dynamicBlockSize); CHECK(true); } TEST_CASE( "Field Base Global Scalars Are Registered But Are Not Finite Element Quantities", tags::unit &tags::field ) { namespace field = mean_field::field; STATIC_REQUIRE(field::GlobalScalarQuantity); STATIC_REQUIRE(field::RegisteredQuantity); STATIC_REQUIRE_FALSE(field::FieldQuantity); STATIC_REQUIRE(field::GlobalScalarQ::rankValue == 0); STATIC_REQUIRE(field::GlobalScalarQ::storageKind == field::StorageKind::global_scalar); STATIC_REQUIRE(field::GlobalScalarQ::staticBlockSize == 1); STATIC_REQUIRE(std::same_as); CHECK(true); } TEST_CASE( "Field Base Derived Quantity Detection Follows Physical Relations", tags::unit &tags::field ) { namespace field = mean_field::field; using Independent = field_base_test_utils::IndependentL2Scalar; using Flux = field_base_test_utils::Flux; using CurlQuantity = field_base_test_utils::CurlQuantity; STATIC_REQUIRE_FALSE(field::DerivedQuantity); STATIC_REQUIRE(field::DerivedQuantity); STATIC_REQUIRE(field::DerivedQuantity); STATIC_REQUIRE(std::same_as, field_base_test_utils::Potential>); STATIC_REQUIRE(std::same_as, field_base_test_utils::CurlSource>); CHECK(true); } TEST_CASE( "Field Base RT L2 Constraint Accepts The Registered Stable Pair Contract", tags::unit &tags::field ) { namespace field = mean_field::field; using Potential = field_base_test_utils::Potential; using Flux = field_base_test_utils::Flux; using Constraint = field::RtL2StablePair; STATIC_REQUIRE(field::validate_constraints(field::TypeList{})); STATIC_REQUIRE(field::validate_constraints(field::TypeList<>{})); CHECK(true); } TEST_CASE( "Field Base Operations And Operands Preserve Mathematical Intent", tags::unit &tags::field ) { namespace field = mean_field::field; using Quantity = field_base_test_utils::IndependentH1Scalar; using ValueOperand = field::Operand; using GradientOperand = field::Operand; STATIC_REQUIRE(field::FieldOperationTag); STATIC_REQUIRE(field::FieldOperationTag); STATIC_REQUIRE(field::FieldOperationTag); STATIC_REQUIRE(field::FieldOperationTag); STATIC_REQUIRE(field::FieldOperationTag); STATIC_REQUIRE_FALSE(field::FieldOperationTag); STATIC_REQUIRE(field::FieldOperand); STATIC_REQUIRE(field::FieldOperand); STATIC_REQUIRE(std::same_as); STATIC_REQUIRE(std::same_as); STATIC_REQUIRE(std::same_as); CHECK(true); } TEST_CASE( "Field Base Form Specifications Preserve Policy Dynamic Orders And Operands", tags::unit &tags::field ) { namespace field = mean_field::field; using Form = field_base_test_utils::SampleForm; STATIC_REQUIRE(field::FieldForm
); STATIC_REQUIRE(Form::policyKey == 17); STATIC_REQUIRE(Form::dynamicOrderCount == 2); STATIC_REQUIRE( std::same_as< typename Form::Operands, field::TypeList> ); STATIC_REQUIRE( field::isRegisteredQuantityList> ); STATIC_REQUIRE_FALSE(field::isRegisteredQuantityList>); STATIC_REQUIRE(field::isFieldFormList>); STATIC_REQUIRE(field::isFieldFormList>); STATIC_REQUIRE_FALSE(field::isFieldFormList>); CHECK(true); } TEST_CASE( "Field Base Support Types Distinguish Domain And Non Spatial Fields", tags::unit &tags::field ) { namespace field = mean_field::field; namespace domain = mean_field::utils::domain; using StellarSupport = field::DomainSupport; using AllSupport = field::DomainSupport; STATIC_REQUIRE(field::IsFieldSupport); STATIC_REQUIRE(field::IsFieldSupport); STATIC_REQUIRE(field::IsFieldSupport); STATIC_REQUIRE(field::IsDomainSupport); STATIC_REQUIRE(field::IsDomainSupport); STATIC_REQUIRE_FALSE(field::IsDomainSupport); STATIC_REQUIRE(std::same_as); STATIC_REQUIRE(std::same_as); STATIC_REQUIRE(field::DomainSupportedField); STATIC_REQUIRE(field::DomainSupportedField); STATIC_REQUIRE_FALSE(field::DomainSupportedField); STATIC_REQUIRE(field::NonSpatialField); STATIC_REQUIRE_FALSE(field::NonSpatialField); STATIC_REQUIRE(std::same_as, StellarSupport>); STATIC_REQUIRE(std::same_as, domain::Stellar>); CHECK(true); }