execution_validation.cpp string_view serif/equations/barycenter.hpp serif/equations/angular_momentum.hpp serif/eos/models/polytropic.hpp serif/equations/barotropic_density.hpp serif/equations/mass_normalization.hpp serif/equations/primal_gravity.hpp serif/equations/surface_potential.hpp serif/model/execution_validation.hpp #include<string_view> #include"serif/equations/barycenter.hpp" #include"serif/equations/angular_momentum.hpp" #include"serif/eos/models/polytropic.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/model/execution_validation.hpp" namespace { namespacemodel=serif::model; namespaceblocks=serif::discretization::blocks; namespacedependencies=serif::utils::dependencies; namespaceequations=serif::equations; usingEOS=serif::eos::models::Polytrope; usingRegistry=equations::EquationRegistry<equations::BarotropicDensityBalance<EOS>,equations::PrimalPoissonBalance, equations::MassNormalization,equations::AngularMomentumConstraint>; usingDescription=model::EquilibriumEquations<Registry,equations::SurfacePotentialBalance>; usingPlan=model::EquilibriumPlan<EOS,Description>; usingModel=model::StellarModel<EOS,Description,serif::utils::types::TypeList<model::FixedTotalMass,model::FixedAngularMomentum>>; static_assert(model::ExecutableEquilibriumDescription<Description>); static_assert(model::executable_model_topology<Model,Description,Plan>()); static_assert(!model::ExecutableEquilibriumDescription<int>); static_assert(!model::ExecutableEquilibriumDescription<model::EquilibriumEquations<int>>); static_assert(!model::ExecutableEquilibriumDescription<model::EquilibriumEquations<Registry,int>>); static_assert(!model::ExecutableEquilibriumDescription<model::EquilibriumEquations<Registry,equations::PrimalPoissonBalance>>); static_assert(!model::ExecutableEquilibriumDescription<model::EquilibriumEquations<Registry,model::NoShapeForce,int>>); static_assert(!model::executable_model_topology<int,Description,Plan>()); static_assert(!model::executable_model_topology<Model,int,Plan>()); static_assert(!model::executable_model_topology<Model,Description,int>()); usingIsobaricDescription=model::EquilibriumEquations<Registry,equations::SurfacePotentialBalance,serif::geometry::surface::Isobaric>; usingIsobaricPlan=model::EquilibriumPlan<EOS,IsobaricDescription>; static_assert(model::ExecutableEquilibriumDescription<IsobaricDescription>); static_assert(model::executable_model_topology<Model,IsobaricDescription,IsobaricPlan>()); static_assert(IsobaricPlan::Surface::Formulation::resolves_carrier); static_assert(std::same_as<typenameIsobaricPlan::Surface::Formulation::CarrierTerm,blocks::density::mass>); usingPrescribedCarrier=model::EquilibriumPlan<EOS,IsobaricDescription,dependencies::KeyList<blocks::density::mass>>; static_assert(!PrescribedCarrier::Surface::supported); static_assert(!model::executable_model_topology<Model,IsobaricDescription,PrescribedCarrier>()); structFirstSurfaceHint { usingIsobaricSurfaceField=blocks::gravity::potential; }; structSecondSurfaceHint { usingIsobaricSurfaceField=blocks::density::mass; }; //Surfacehintsareirrelevantwhenthephysicalmodelhasnosurfacecondition. usingUnusedSurfaceHints=model::detail::SurfacePlan<model::NoSurfaceCondition,EOS,dependencies::KeyList<>,dependencies::KeyList<>, dependencies::KeyList<>,serif::utils::types::TypeList<FirstSurfaceHint, SecondSurfaceHint>>; static_assert(UnusedSurfaceHints::supported); usingMissingMassClosure=model::EquilibriumEquations<Registry>; static_assert(!model::executable_model_topology<Model,MissingMassClosure,model::EquilibriumPlan<EOS,MissingMassClosure>>()); //Fixedgeometryhasitsownmassoutcome;theremainingrotationprescriptionstillrequiresamechanicalrow. usingFixedRegistry=equations::EquationRegistry<equations::BarotropicDensityBalance<EOS>,equations::PrimalPoissonBalance, equations::AngularMomentumConstraint>; usingWithoutShape=model::EquilibriumEquations<FixedRegistry>; usingFixedModel=model::StellarModel<EOS,WithoutShape,serif::utils::types::TypeList<model::FixedAngularMomentum>>; usingFixedGeometry=model::EquilibriumPlan<EOS,WithoutShape>; static_assert(model::executable_model_topology<FixedModel,WithoutShape,FixedGeometry>()); static_assert(dependencies::ContainsKey<blocks::surface_deformation::coefficients,FixedGeometry::PhysicalInputs>); static_assert(!dependencies::ContainsKey<blocks::surface_deformation::coefficients,FixedGeometry::Values>); static_assert(!dependencies::ContainsKey<blocks::surface_deformation::shape_equilibrium,FixedGeometry::Residuals>); usingPrescribedShape=model::EquilibriumPlan<EOS,WithoutShape,dependencies::KeyList<blocks::surface_deformation::coefficients>>; static_assert(model::executable_model_topology<FixedModel,WithoutShape,PrescribedShape>()); usingPrescribedDensity=model::EquilibriumPlan<EOS,WithoutShape,dependencies::KeyList<blocks::density::mass>>; static_assert(model::executable_model_topology<FixedModel,WithoutShape,PrescribedDensity>()); static_assert(!dependencies::ContainsKey<blocks::density::mass,PrescribedDensity::Values>); usingPrescribedOmega=model::EquilibriumPlan<EOS,WithoutShape,dependencies::KeyList<blocks::rotation::angular_velocity>>; static_assert(!model::executable_model_topology<FixedModel,WithoutShape,PrescribedOmega>()); //Fixedgeometryremovesonlyitsownequation;everyremainingphysicalforcemuststillbeauthored. usingWithoutHydrostatic=model::EquilibriumEquations<equations::EquationRegistry<equations::PrimalPoissonBalance, equations::MassNormalization,equations::AngularMomentumConstraint>,equations::SurfacePotentialBalance>; usingGlobalConstraints=serif::utils::types::TypeList<model::FixedTotalMass, model::FixedAngularMomentum>; usingGlobalModel=model::StellarModel<EOS,WithoutHydrostatic,GlobalConstraints>; static_assert(!model::executable_model_topology<GlobalModel,WithoutHydrostatic,model::EquilibriumPlan<EOS,WithoutHydrostatic>>()); usingWithoutAngularMomentum=model::EquilibriumEquations<equations::EquationRegistry<equations::BarotropicDensityBalance<EOS>, equations::PrimalPoissonBalance,equations::MassNormalization>,equations::SurfacePotentialBalance>; usingRotationModel=model::StellarModel<EOS,WithoutAngularMomentum,GlobalConstraints>; static_assert(!model::executable_model_topology<RotationModel,WithoutAngularMomentum,model::EquilibriumPlan<EOS,WithoutAngularMomentum>>()); structNonrotatingHydrostatic { staticconstexprstd::string_viewname="nonrotatinghydrostaticequilibrium"; usingTest=blocks::density::mass; usingOperands=serif::utils::types::TypeList<serif::discretization::forms::Operand<Test>,serif::discretization::forms::Operand<blocks::gravity::potential>>; equations::PointLinearization<Operands>evaluate(constequations::EquationPoint<Operands>&)const; template<typenameOperand> intadditional_order(Operand,int)const; }; usingWithoutRotationForce=model::EquilibriumEquations<equations::EquationRegistry<NonrotatingHydrostatic,equations::PrimalPoissonBalance, equations::MassNormalization,equations::AngularMomentumConstraint>,equations::SurfacePotentialBalance>; usingNoRotationForcePlan=model::EquilibriumPlan<EOS,WithoutRotationForce>; static_assert(!model::executable_model_topology<GlobalModel,WithoutRotationForce,NoRotationForcePlan>()); usingExplicitRotationZero=dependencies::KeyList<model::Derivative<blocks::density::mass,blocks::rotation::angular_velocity>>; static_assert(model::executable_model_topology<GlobalModel,WithoutRotationForce,NoRotationForcePlan,model::DefaultSpecificationBindings,ExplicitRotationZero>()); usingActual=model::ActualEquilibriumCouplings<Description,Plan>; static_assert(dependencies::ContainsKey<model::Derivative<blocks::surface_deformation::shape_equilibrium,blocks::rotation::angular_velocity>,Actual>); static_assert(dependencies::ContainsKey<model::Derivative<blocks::barotropic_constant::mass_normalization,blocks::surface_deformation::coefficients>,Actual>); static_assert(dependencies::ContainsKey<model::Derivative<blocks::density::mass,blocks::gravity::potential>,Actual>); structCustomConstraint { usingScalarDescription=model::FixedTotalMass::ScalarDescription; usingModelDefinition=model::SpecificationDefinition<CustomConstraint,"custommissingforce",model::SpecificationRole::invariant, model::GeneratedStateKind::multiplier,ScalarDescription,model::Reads<model::state::Density>,model::Changes<model::equation::HydrostaticBalance>>; serif::dimensions::MassValuetarget()const; }; usingCustomModel=model::StellarModel<EOS,Description,serif::utils::types::TypeList<CustomConstraint>>; usingCoordinate=blocks::frame_acceleration::component<1>; usingBindings=model::SpecificationBindings<dependencies::Binding<model::GeneratedCoordinateOf<CustomConstraint>,Coordinate>, dependencies::Binding<model::ConstraintOf<CustomConstraint>,blocks::barotropic_constant::mass_normalization>>; //Thecompletefieldlayoutcannamelambdawhiletheequationlistsuppliesnolambdaforce. usingCustomPlan=model::ModelPlan<Registry,dependencies::KeyList<>,dependencies::KeyList<Coordinate>>; usingInteriorOnly=model::EquilibriumEquations<Registry>; static_assert(!model::executable_model_topology<CustomModel,InteriorOnly,CustomPlan,Bindings>()); usingExplicitForceZero=dependencies::KeyList<model::Derivative<blocks::density::mass,Coordinate>>; static_assert(model::executable_model_topology<CustomModel,InteriorOnly,CustomPlan,Bindings,ExplicitForceZero>()); usingAliasedModel=model::StellarModel<EOS,Description,serif::utils::types::TypeList<model::FixedTotalMass,CustomConstraint>>; usingAliasedBindings=model::SpecificationBindings<dependencies::Binding<model::GeneratedCoordinateOf<CustomConstraint>,blocks::barotropic_constant::mass_normalization>, dependencies::Binding<model::ConstraintOf<CustomConstraint>,blocks::barotropic_constant::mass_normalization>>; static_assert(!model::executable_model_topology<AliasedModel,Description,Plan,AliasedBindings>()); structInvalidScalarTarget { usingModelDefinition=model::SpecificationDefinition<InvalidScalarTarget,"invalidscalarunits",model::SpecificationRole::invariant, model::GeneratedStateKind::multiplier,model::FixedTotalMass::ScalarDescription,model::Reads<model::state::Density>,model::Changes<model::equation::HydrostaticBalance>>; serif::dimensions::DensityValuetarget()const; }; usingInvalidScalarModel=model::StellarModel<EOS,Description,serif::utils::types::TypeList<InvalidScalarTarget>>; static_assert(model::StellarModelType<InvalidScalarModel>); static_assert(!model::SpecificationTopologyValid<InvalidScalarModel,Plan::Values,Plan::Residuals,Actual>); static_assert(!model::executable_model_topology<InvalidScalarModel,Description,Plan>()); structInvalidUngeneratedReads { usingModelDefinition=model::SpecificationDefinition<InvalidUngeneratedReads,"ungenerateddependencies",model::SpecificationRole::boundary_condition, model::GeneratedStateKind::none,void,model::Reads<model::state::Density>>; }; usingInvalidUngeneratedModel=model::StellarModel<EOS,Description,serif::utils::types::TypeList<InvalidUngeneratedReads>>; static_assert(model::StellarModelType<InvalidUngeneratedModel>); static_assert(!model::SpecificationTopologyValid<InvalidUngeneratedModel,Plan::Values,Plan::Residuals,Actual>); static_assert(!model::executable_model_topology<InvalidUngeneratedModel,Description,Plan>()); } namespace{ usingIncompatibleEndpoint=dependencies::Bindings<dependencies::Binding<model::GeneratedCoordinateOf<model::FixedTotalMass>,blocks::frame_acceleration::component<1>>>; static_assert(!model::executable_model_topology<Model,Description,Plan,IncompatibleEndpoint>()); template<intAxis> constexprboolbarycenter_admitted=serif::operators::VolumeEquation<equations::BarycenterConstraint<Axis>>; static_assert(barycenter_admitted<0>&&barycenter_admitted<1>&&barycenter_admitted<2>); }