#include #include #include #include import mean_field; namespace { namespace blocks = mean_field::utils::blocks; namespace normalization = mean_field::normalization; using PhysicalForm = blocks::surface_deformed_stellar_equilibrium_form; using PhaseForm = blocks::central_density_bordered_stellar_equilibrium_form; using PhysicalPlan = normalization::PhysicalRieszNormalizationPlanFor; using PhasePlan = normalization::PhysicalRieszNormalizationPlanFor; struct ValueA final : blocks::value_block_base { }; struct ValueB final : blocks::value_block_base { }; struct ResidualA final : blocks::residual_block_base { }; struct ResidualB final : blocks::residual_block_base { }; struct ForeignValue final : blocks::value_block_base { }; struct ForeignResidual final : blocks::residual_block_base { }; using SmallForm = blocks::block_form< blocks::type_list, blocks::type_list>; using ValueAIdentity = normalization::CoordinateComponent< normalization::CoordinateKind::value, blocks::type_list, normalization::IdentityCoordinate>; using ValueBIdentity = normalization::CoordinateComponent< normalization::CoordinateKind::value, blocks::type_list, normalization::IdentityCoordinate>; using ResidualAIdentity = normalization::CoordinateComponent< normalization::CoordinateKind::residual, blocks::type_list, normalization::IdentityCoordinate>; using ResidualBIdentity = normalization::CoordinateComponent< normalization::CoordinateKind::residual, blocks::type_list, normalization::IdentityCoordinate>; using ForeignIdentity = normalization::CoordinateComponent< normalization::CoordinateKind::value, blocks::type_list, normalization::IdentityCoordinate>; using ForeignResidualIdentity = normalization::CoordinateComponent< normalization::CoordinateKind::residual, blocks::type_list, normalization::IdentityCoordinate>; using CompleteSmallPlan = normalization::NormalizationPlan< ValueAIdentity, ValueBIdentity, ResidualAIdentity, ResidualBIdentity>; using MissingSmallPlan = normalization::NormalizationPlan< ValueAIdentity, ResidualAIdentity, ResidualBIdentity>; using DuplicateSmallPlan = normalization::NormalizationPlan< ValueAIdentity, ValueAIdentity, ValueBIdentity, ResidualAIdentity, ResidualBIdentity>; using ForeignSmallPlan = normalization::NormalizationPlan< ValueAIdentity, ValueBIdentity, ForeignIdentity, ResidualAIdentity, ResidualBIdentity, ForeignResidualIdentity>; struct MalformedComponent final { using Blocks = blocks::type_list; using Method = normalization::IdentityCoordinate; }; struct IncoherentComponent final { using Blocks = blocks::type_list; using Method = normalization::IdentityCoordinate; using ValueBlocks = blocks::type_list; using ResidualBlocks = blocks::type_list<>; static constexpr auto kind = normalization::CoordinateKind::value; }; using WrongDensityTopology = normalization::CoordinateComponent< normalization::CoordinateKind::value, blocks::type_list, normalization::PhysicalRieszCoordinate< normalization::RieszTopology::vector_volume_l2, normalization::PhysicalScaleKind::density>>; struct FutureInvariantValue final : blocks::value_block_base { }; struct FutureInvariantResidual final : blocks::residual_block_base { }; using UnregisteredFutureForm = blocks::block_form< blocks::type_list, blocks::type_list>; using BaseModel = mean_field::model::StellarModel>; using RieszPolicy = normalization::PhysicalRieszDiagonal<>; using RieszDiscretization = mean_field::equilibrium::StellarDiscretizationFor; using BaselineProblem = mean_field::equilibrium::StellarEquilibriumProblem; using RieszProblem = mean_field::equilibrium::StellarEquilibriumProblem; using AngularModel = mean_field::model::StellarModel>; using AngularForm = mean_field::operators::CompiledStellarEquilibriumForm; template concept CanMakeRieszDiscretization = requires( mean_field::fem::FEM &finiteElements, Mapper &&mapper, RieszPolicy policy ) { mean_field::equilibrium::makeStellarDiscretization( finiteElements, std::forward(mapper), policy ); }; } // namespace TEST_CASE("Normalization Plans Prove Exact Ownership Of Every Compiled Coordinate", "[normalization][type]") { STATIC_CHECK(normalization::NormalizationPlanType); STATIC_CHECK(normalization::CompleteNormalizationFor); STATIC_CHECK(normalization::CompleteNormalizationFor); STATIC_CHECK(normalization::CompilableNormalizationFor); STATIC_CHECK(normalization::CompilableNormalizationFor); STATIC_CHECK(normalization::CompilableNormalizationFor); STATIC_CHECK(normalization::CompilableNormalizationFor); STATIC_CHECK(normalization::StellarSpecificationNormalizationContribution< mean_field::integral::FixedAngularMomentum>::registered); STATIC_CHECK(normalization::CompleteNormalizationFor); STATIC_CHECK_FALSE(normalization::CompleteNormalizationFor); STATIC_CHECK_FALSE(normalization::CompleteNormalizationFor); STATIC_CHECK_FALSE(normalization::CompleteNormalizationFor); using Missing = normalization::NormalizationCoverage; using Duplicate = normalization::NormalizationCoverage; using Foreign = normalization::NormalizationCoverage; STATIC_CHECK(Missing::MissingValueBlocks::size == 1); STATIC_CHECK(blocks::contains_type_v); STATIC_CHECK(Duplicate::RepeatedValueBlocks::size == 1); STATIC_CHECK(blocks::contains_type_v); STATIC_CHECK(Foreign::UnexpectedValueBlocks::size == 1); STATIC_CHECK(Foreign::UnexpectedResidualBlocks::size == 1); } TEST_CASE("Physical Riesz Methods Reject Incompatible Or Unregistered Field Topologies", "[normalization][type]") { STATIC_CHECK_FALSE(normalization::NormalizationComponent); STATIC_CHECK_FALSE(normalization::NormalizationComponent); STATIC_CHECK_FALSE(normalization::NormalizationComponent); STATIC_CHECK_FALSE(normalization::CompilableNormalizationFor); STATIC_CHECK(normalization::CompilableNormalizationFor); using Density = normalization::PhysicalRieszBlockTraits; using Gravity = normalization::PhysicalRieszBlockTraits; using Surface = normalization::PhysicalRieszBlockTraits; using EnthalpyResidual = normalization::PhysicalRieszBlockTraits; using MassResidual = normalization::PhysicalRieszBlockTraits< blocks::fixed_total_mass::mass_normalization::residual>; STATIC_CHECK(Density::Method::topology == normalization::RieszTopology::scalar_volume_l2); STATIC_CHECK(Gravity::Method::topology == normalization::RieszTopology::vector_volume_l2); STATIC_CHECK(Surface::Method::topology == normalization::RieszTopology::scalar_boundary_l2); STATIC_CHECK( EnthalpyResidual::Method::topology == normalization::RieszTopology::hybrid_scalar_volume_point_rows ); STATIC_CHECK(MassResidual::Method::topology == normalization::RieszTopology::global_scalar); STATIC_CHECK(MassResidual::Method::scale == normalization::PhysicalScaleKind::mass); } TEST_CASE("Normalization Is Part Of The Compile-Time Discretization And Problem Type", "[normalization][type]") { STATIC_CHECK(mean_field::equilibrium::StellarDiscretizationType); STATIC_CHECK_FALSE(std::same_as); STATIC_CHECK_FALSE(std::same_as); STATIC_CHECK(std::same_as); STATIC_CHECK(std::same_as); STATIC_CHECK(mean_field::equilibrium::DiscretizedStellarEquilibriumProblem); STATIC_CHECK(std::constructible_from< RieszDiscretization, mean_field::fem::FEM &, const mean_field::mapping::DomainMapper &, RieszPolicy>); STATIC_CHECK_FALSE(std::constructible_from< RieszDiscretization, mean_field::fem::FEM &, mean_field::mapping::DomainMapper &&, RieszPolicy>); STATIC_CHECK_FALSE(std::constructible_from< RieszDiscretization, mean_field::fem::FEM &, const mean_field::mapping::DomainMapper &&, RieszPolicy>); STATIC_CHECK(std::constructible_from< mean_field::equilibrium::StellarDiscretization, mean_field::fem::FEM &, const mean_field::mapping::DomainMapper &>); STATIC_CHECK_FALSE(std::constructible_from< mean_field::equilibrium::StellarDiscretization, mean_field::fem::FEM &, mean_field::mapping::DomainMapper &&>); STATIC_CHECK_FALSE(std::constructible_from< mean_field::equilibrium::StellarDiscretization, mean_field::fem::FEM &, const mean_field::mapping::DomainMapper &&>); STATIC_CHECK(CanMakeRieszDiscretization< mean_field::mapping::DomainMapper &>); STATIC_CHECK_FALSE(CanMakeRieszDiscretization< mean_field::mapping::DomainMapper>); STATIC_CHECK_FALSE(CanMakeRieszDiscretization< const mean_field::mapping::DomainMapper>); using SmallLayout = blocks::form_layout; using SmallBuilder = normalization::DiagonalNormalizationBuilder; STATIC_CHECK(std::constructible_from); STATIC_CHECK_FALSE(std::constructible_from); STATIC_CHECK_FALSE(std::constructible_from); }