normalization.cpp concepts string_view tuple type_traits utility serif/equations/angular_momentum.hpp serif/eos/models/polytropic.hpp serif/equations/barotropic_density.hpp serif/equations/surface_potential.hpp serif/equations/mass_normalization.hpp serif/equations/primal_gravity.hpp serif/geometry/surface/isobaric.hpp serif/model/configured_discretization.hpp serif/backend/mfem/model/computations/solver_layout.hpp serif/model/normalization/plan.hpp serif/solver/normalization/computations.hpp serif/solver/preconditioner/recipes/block.hpp serif/solver/preconditioner/strategies/inverse/diagonal.hpp #include<concepts> #include<string_view> #include<tuple> #include<type_traits> #include<utility> #include"serif/equations/angular_momentum.hpp" #include"serif/eos/models/polytropic.hpp" #include"serif/equations/barotropic_density.hpp" #include"serif/equations/surface_potential.hpp" #include"serif/equations/mass_normalization.hpp" #include"serif/equations/primal_gravity.hpp" #include"serif/geometry/surface/isobaric.hpp" #include"serif/model/configured_discretization.hpp" #include"serif/backend/mfem/model/computations/solver_layout.hpp" #include"serif/model/normalization/plan.hpp" #include"serif/solver/normalization/computations.hpp" #include"serif/solver/preconditioner/recipes/block.hpp" #include"serif/solver/preconditioner/strategies/inverse/diagonal.hpp" namespace{ namespacemodel=serif::model; namespacenormalization=serif::solver::normalization; namespacedimensions=serif::dimensions; namespacedependencies=serif::utils::dependencies; namespaceblocks=serif::discretization::blocks; namespaceequations=serif::equations; usingEOS=serif::eos::models::Polytrope; usingRegistry=equations::EquationRegistry<equations::BarotropicDensityBalance<EOS>,equations::PrimalPoissonBalance, equations::MassNormalization,equations::AngularMomentumConstraint>; usingDefinition=model::EquilibriumEquations<Registry,equations::SurfacePotentialBalance,serif::geometry::surface::Isobaric>; usingModel=model::StellarModel<EOS,Definition,serif::utils::types::TypeList<model::FixedTotalMass,model::FixedAngularMomentum>>; usingWithoutMass=model::StellarModel<EOS,Definition,serif::utils::types::TypeList<model::FixedAngularMomentum>>; usingExplicitScheme=normalization::LaneEmdenApproximation<dimensions::MassValue,dimensions::DensityValue>; usingExplicitOptions=normalization::NormalizationOptions<ExplicitScheme>; //Nomodelprescribescentraldensity,sothereferencealwaysnamesit;themassmaystillcomefromthemodel. usingModelMassScheme=normalization::LaneEmdenApproximation<normalization::FromModel,dimensions::DensityValue>; usingModelMassOptions=normalization::NormalizationOptions<ModelMassScheme>; static_assert(!model::normalization::ReferenceResolvable<normalization::NormalizationOptions<>,Model>); static_assert(model::normalization::ReferenceResolvable<ModelMassOptions,Model>); static_assert(!model::normalization::ReferenceResolvable<ModelMassOptions,WithoutMass>); static_assert(model::normalization::ReferenceResolvable<ExplicitOptions,Model>); static_assert(model::normalization::ReferenceResolvable<ExplicitOptions,WithoutMass>); static_assert(std::same_as<decltype(normalization::make_normalization()),normalization::NormalizationOptions<>>); static_assert(std::same_as<decltype(model::normalization::resolve_reference(std::declval<ModelMassScheme>(),std::declval<constModel&>())),ExplicitScheme>); template<typenameOptions> conceptCanConfigureDiscretization=requires(Optionsoptions){ model::make_discretization(std::move(options)); }; static_assert(CanConfigureDiscretization<model::DiscretizationOptions<Model, int, ModelMassOptions>>); static_assert(!CanConfigureDiscretization<model::DiscretizationOptions<Model, int>>); static_assert(!CanConfigureDiscretization<model::DiscretizationOptions<WithoutMass, int, ModelMassOptions>>); static_assert(CanConfigureDiscretization<model::DiscretizationOptions<WithoutMass, int, ExplicitOptions>>); usingResolvedConfiguration=decltype(model::make_discretization( std::declval<model::DiscretizationOptions<Model,int,ModelMassOptions>>())); static_assert(std::same_as<ResolvedConfiguration,model::DiscretizationOptions<Model,int,ExplicitOptions>>); usingSelectedInverse=decltype(serif::solver::preconditioner::make_preconditioner<blocks::density::mass>( serif::solver::preconditioner::strategies::inverse::Diagonal{})); usingPreconditionedConfiguration=model::DiscretizationOptions<Model,int,ModelMassOptions,SelectedInverse>; usingResolvedPreconditionedConfiguration=decltype(model::make_discretization(std::declval<PreconditionedConfiguration>())); static_assert(CanConfigureDiscretization<PreconditionedConfiguration>); static_assert(std::same_as<ResolvedPreconditionedConfiguration, model::DiscretizationOptions<Model,int,ExplicitOptions,SelectedInverse>>); static_assert(std::same_as<decltype(std::declval<ResolvedPreconditionedConfiguration>().preconditioner),SelectedInverse>); template<typenamePolicy> conceptCoordinatePolicy=requires{ typenamenormalization::NormalizationOptions<ExplicitScheme,Policy>; }; template<typenameMass,typenameDensity> conceptLaneEmdenInputs=requires{ typenamenormalization::LaneEmdenApproximation<Mass,Density>; }; static_assert(CoordinatePolicy<normalization::Dimensionless>); static_assert(!CoordinatePolicy<bool>); static_assert(!LaneEmdenInputs<double, double>); static_assert(!LaneEmdenInputs<dimensions::DensityValue, dimensions::MassValue>); structCustomReferencefinal{}; [[nodiscard]]std::expected<normalization::StellarReferenceScales,std::string>prepare_reference_scales( constCustomReference&,dimensions::QuantityValue<dimensions::GravitationalConstant>gravity){ returnnormalization::prepare_stellar_reference_scales(dimensions::MassValue{2.0},dimensions::LengthValue{3.0},gravity); } static_assert(normalization::ReferenceScheme<CustomReference>); static_assert(!normalization::ReferenceScheme<int>); usingCustomOptions=normalization::NormalizationOptions<CustomReference>; static_assert(model::normalization::ReferenceResolvable<CustomOptions,WithoutMass>); static_assert(CanConfigureDiscretization<model::DiscretizationOptions<WithoutMass,int,CustomOptions>>); static_assert(std::same_as<decltype(model::normalization::resolve_reference(CustomReference{},std::declval<constModel&>())),CustomReference>); structBoundDescription{ usingDescription=Definition; usingPlan=model::EquilibriumPlan<EOS,Definition,dependencies::KeyList<blocks::displacement::vector>>; }; usingPlan=model::normalization::PlanFor<normalization::AutomaticPlan,normalization::Dimensionless,BoundDescription>; usingLayout=BoundDescription::Plan::Layout; usingLayoutComputations=decltype(model::computations::make_solver_layout_computations(std::declval<constLayout&>())); static_assert(std::tuple_size_v<LayoutComputations>==1); static_assert(std::same_as<typenamestd::tuple_element_t<0,LayoutComputations>::Key,blocks::keys::Layout>); static_assert(normalization::NormalizationPreparable<Plan,Layout>); static_assert(normalization::CompleteNormalizationFor<Plan,BoundDescription::Plan::Values,BoundDescription::Plan::Residuals>); usingDensity=blocks::density::mass; usingPotential=blocks::gravity::potential; usingMassConstant=blocks::barotropic_constant::mass_normalization; usingShape=blocks::surface_deformation::coefficients; usingSurfaceMetric=serif::geometry::deformation::keys::SurfaceMetric; usingDensityMethod=normalization::DimensionlessRieszCoordinate<dimensions::BarotropicPressurePotential,normalization::ReferenceVolumeMetric<Density>>; static_assert(std::same_as<dependencies::bound_type_t<Plan::Residuals,Density>, normalization::WithPointRows<DensityMethod,dimensions::MassDensity,model::normalization::SurfaceRows>>); static_assert(std::same_as<dependencies::bound_type_t<Plan::Residuals,Potential>, normalization::WithPointRows<normalization::DimensionlessRieszCoordinate<dimensions::InverseTimeSquared, normalization::ReferenceVolumeMetric<Potential>>,dimensions::GravitationalPotential,model::normalization::InfinityRows>>); static_assert(std::same_as<dependencies::bound_type_t<Plan::Values,Potential>::Quantity,dimensions::GravitationalPotential>); static_assert(std::same_as<dependencies::bound_type_t<Plan::Residuals,MassConstant>::Quantity,dimensions::Mass>); static_assert(std::same_as<dependencies::bound_type_t<Plan::Values,Shape>,normalization::DimensionlessRieszCoordinate<dimensions::Length,SurfaceMetric>>); static_assert(dependencies::ContainsKey<SurfaceMetric,model::normalization::MetricsFor<Plan>>); static_assert(std::same_as<model::normalization::PlanFor<Plan,normalization::Dimensionless,BoundDescription>,Plan>); structForwardPressureEOS{ usingRelations=serif::eos::relations::RelationCatalog<serif::eos::relations::PressureFromDensity>; dimensions::PressureValueevaluate(serif::eos::relations::PressureFromDensity,dimensions::DensityValue)const; dimensions::PartialDerivative<dimensions::Pressure,dimensions::MassDensity>partial_derivative( serif::eos::relations::PressureFromDensity,dimensions::WithRespectTo<dimensions::MassDensity>,dimensions::DensityValue)const; }; structDirectPressureDescription{ usingDescription=Definition; usingPlan=model::EquilibriumPlan<ForwardPressureEOS,Definition,dependencies::KeyList<blocks::displacement::vector>>; }; usingDirectPressurePlan=model::normalization::PlanFor<normalization::AutomaticPlan,normalization::Dimensionless,DirectPressureDescription>; static_assert(normalization::NormalizationPreparable<DirectPressurePlan,DirectPressureDescription::Plan::Layout>); static_assert(std::same_as<dependencies::bound_type_t<DirectPressurePlan::Residuals,Density>, normalization::WithPointRows<DensityMethod,dimensions::Pressure,model::normalization::SurfaceRows>>); }