#include "serif/equations/angular_momentum.hpp" #include "serif/equations/barotropic_density.hpp" #include "serif/equations/mass_normalization.hpp" #include "serif/equations/primal_gravity.hpp" #include "serif/equations/surface_potential.hpp" #include "serif/eos/models/polytropic.hpp" #include "serif/model/eos_reference.hpp" #include "serif/model/execution_validation.hpp" #include "serif/model/normalization/plan.hpp" #include "serif/solver/normalization/computations.hpp" namespace serif::compile_time_checks::barotropic_density { namespace blocks = discretization::blocks; namespace dependencies = utils::dependencies; namespace normalization = solver::normalization; /** @brief Declare only the mechanical EOS capabilities; no enthalpy, polytropic parameters, or curvature is available. */ struct MechanicalBarotrope final { using Relations = eos::relations::RelationCatalog; /** @brief Declare pressure evaluation for capability checking without a runtime implementation. */ dimensions::PressureValue evaluate(eos::relations::PressureFromDensity, dimensions::DensityValue) const; /** @brief Declare the prescribed-pressure surface density. */ dimensions::DensityValue evaluate(eos::relations::DensityFromPressure, dimensions::PressureValue) const; /** @brief Declare the mechanical primitive independently of thermodynamic enthalpy. */ dimensions::BarotropicPressurePotentialValue evaluate(eos::relations::PressurePotentialFromDensity, dimensions::DensityValue) const; /** @brief Declare the sole pressure derivative required by the local balance. */ dimensions::PartialDerivative partial_derivative( eos::relations::PressureFromDensity, dimensions::WithRespectTo, dimensions::DensityValue) const; }; using Balance = equations::BarotropicDensityBalance; using BorrowedBalance = equations::BarotropicDensityBalance>; using Registry = equations::EquationRegistry; using Description = model::EquilibriumEquations; struct BoundDescription { using Description = barotropic_density::Description; using Plan = model::EquilibriumPlan; }; using Plan = BoundDescription::Plan; using Rules = model::normalization::PlanFor; static_assert(dimensions::ThermodynamicQuantityType); static_assert(!std::same_as); static_assert(eos::models::EOSSupportingRelation); static_assert(eos::models::EOSModel); static_assert(!eos::models::EOSSupportingRelation); static_assert(!eos::models::EOSSupportingSecondPartialDerivative); static_assert(operators::VolumeEquation); static_assert(operators::VolumeEquation); static_assert(std::same_as>); static_assert(std::same_as); static_assert(model::ExecutableEquilibriumDescription); static_assert(Plan::has_shape && Plan::has_primal_gravity); static_assert(dependencies::key_count_v == 5); static_assert(dependencies::key_count_v == 5); static_assert(std::same_as); static_assert(normalization::NormalizationPreparable); static_assert(normalization::CompleteNormalizationFor); static_assert(std::same_as, normalization::WithPointRows>, dimensions::MassDensity, model::normalization::SurfaceRows>>); static_assert(std::same_as, normalization::DimensionlessRieszCoordinate>>); }