plan.cpp type_traits serif/equations/displacement_force.hpp serif/equations/barotropic_closure.hpp serif/equations/hydrostatic_equilibrium.hpp serif/operators/plan.hpp serif/equations/registry.hpp serif/equations/mixed_gravity.hpp serif/equations/gravity_force.hpp serif/equations/rotational_force.hpp serif/equations/pressure_force.hpp serif/equations/pressure_surface.hpp serif/operators/backend/mfem/operand_evaluation.hpp serif/discretization/quadrature/backend/order.hpp serif/discretization/domain/schema/schemas.hpp serif/equations/mass_normalization.hpp serif/equations/angular_momentum.hpp serif::operators::NodalRequest serif::operators::GradientRequest serif::operators::BadContributionRow serif::operators::BadContributionCollection serif::operators::NestedBadCollection serif::operators::BarotropicHydrostaticEquilibrium serif::operators::EquationRegistry serif::operators::OperandValues serif serif::operators #include<type_traits> #include"serif/equations/displacement_force.hpp" #include"serif/equations/barotropic_closure.hpp" #include"serif/equations/hydrostatic_equilibrium.hpp" #include"serif/operators/plan.hpp" #include"serif/equations/registry.hpp" #include"serif/equations/mixed_gravity.hpp" #include"serif/equations/gravity_force.hpp" #include"serif/equations/rotational_force.hpp" #include"serif/equations/pressure_force.hpp" #include"serif/equations/pressure_surface.hpp" #include"serif/operators/backend/mfem/operand_evaluation.hpp" #include"serif/discretization/quadrature/backend/order.hpp" #include"serif/discretization/domain/schema/schemas.hpp" namespaceserif::operators{ usingequations::BarotropicHydrostaticEquilibrium; usingequations::EquationRegistry; usingequations::OperandValues; usingClosure=equations::BarotropicClosure<eos::models::Polytrope>; usingDensity=discretization::blocks::density::mass; usingEnthalpy=discretization::blocks::enthalpy::specific; usingSchema=discretization::domain::schema::CoreEnvelopeVacuumDomainSchema; usingSurfacePressure=equations::PressureSurfaceConstraint<eos::models::Polytrope>; static_assert(equations::Equation<SurfacePressure>&&equations::PointEquation<SurfacePressure>); static_assert(NodalValueEquation<SurfacePressure>); static_assert(!VolumeEquation<SurfacePressure>&&!ScalarVolumeEquation<SurfacePressure>); static_assert(!NodalValueEquation<Closure>&&!NodalValueEquation<BarotropicHydrostaticEquilibrium>); static_assert(!NodalValueEquation<int>); static_assert(std::same_as<equations::SupportOf<SurfacePressure>,discretization::domain::StellarSurfaceBoundary>); template<typenameTermT,typenameOperationT=discretization::forms::Operation::Value,boolPositionIndependent=true> structNodalRequest:equations::Contribution<discretization::forms::Operand<TermT,OperationT>,discretization::domain::StellarSurfaceBoundary>{ usingOperands=utils::types::TypeList<discretization::forms::Operand<TermT>>; usingResult=discretization::forms::OperandValue<discretization::forms::Operand<TermT, OperationT>>; staticconstexprstd::string_viewname="nodalcapabilitytest"; staticconstexprboolposition_independent=PositionIndependent; equations::PointLinearization<Operands, Result>evaluate(constequations::EquationPoint<Operands>&)const{return{};} }; static_assert(NodalValueEquation<NodalRequest<Enthalpy>>); static_assert(equations::Equation<NodalRequest<Density>>&&!NodalValueEquation<NodalRequest<Density>>); static_assert(!NodalValueEquation<NodalRequest<discretization::blocks::gravity::gradient>>); static_assert(!NodalValueEquation<NodalRequest<Enthalpy, discretization::forms::Operation::Gradient>>); static_assert(!NodalValueEquation<NodalRequest<Enthalpy, discretization::forms::Operation::Value, false>>); static_assert(ScalarVolumeEquation<Closure>,"Barotropicclosureisascalarvolumeequation."); static_assert(ScalarVolumeEquation<BarotropicHydrostaticEquilibrium>,"Barotropichydrostaticequilibriumisascalarvolumeequation."); static_assert(!ScalarVolumeEquation<eos::models::Polytrope>,"Polytropeisnotascalarvolumeequation."); static_assert(!ScalarValueTerm<discretization::blocks::gravity::gradient>,"Gradientisnotascalarvalueterm."); static_assert(!ScalarValueOperand<discretization::forms::Operand<Enthalpy, discretization::forms::Operation::Gradient>>,"Gradientoperandisnotascalarvalueoperand."); static_assert(std::same_as<EquationPlan<Closure>::Test,Density>,"Barotropicclosuretestisdensity."); static_assert(std::same_as<EquationPlan<Closure>::Support,discretization::domain::StellarDomains>,"Barotropicclosuresupportisstellardomains."); static_assert(EquationPlan<Closure>::operand_count==2,"Barotropicclosurehastwooperands."); static_assert(OperandValues<Closure::Operands>::index<Density>()==0,"Barotropicclosuredensityoperandisfirst."); static_assert(OperandValues<Closure::Operands>::index<Enthalpy>()==1,"Barotropicclosureenthalpyoperandissecond."); static_assert(std::same_as< EquationPlan<Closure>::Form<discretization::forms::Operand<Density>>, discretization::forms::mass<Density, Density>>,"Barotropicclosuredensityformismass."); static_assert(std::same_as< EquationPlan<Closure>::Form<discretization::forms::Operand<Enthalpy>>, discretization::forms::source<Enthalpy, Density>>,"Barotropicclosureenthalpyformissource."); static_assert(std::same_as< EquationRegistry<Closure, BarotropicHydrostaticEquilibrium>::Equations, utils::types::TypeList<Closure, BarotropicHydrostaticEquilibrium>>,"Equationregistrycontainsclosureandhydrostaticequilibrium."); usingDensityValue=discretization::forms::Operand<Density>; usingEnthalpyValue=discretization::forms::Operand<Enthalpy>; usingEnthalpyGradient=discretization::forms::Operand<Enthalpy, discretization::forms::Operation::Gradient>; usingGravityValue=discretization::forms::Operand<discretization::blocks::gravity::gradient>; usingGravityDivergence=discretization::forms::Operand<discretization::blocks::gravity::gradient, discretization::forms::Operation::Divergence>; static_assert(backend::mfem::EvaluableOperand<DensityValue>); static_assert(backend::mfem::EvaluableOperand<EnthalpyValue>); static_assert(!backend::mfem::EvaluableOperand<EnthalpyGradient>); static_assert(backend::mfem::EvaluableOperand<GravityValue>); static_assert(backend::mfem::EvaluableOperand<GravityDivergence>); static_assert(!backend::mfem::EvaluableOperand<int>); usingPressure=equations::PressureForce<eos::models::Polytrope>; usingDisplacementDivergence=discretization::forms::Operand<discretization::blocks::displacement::vector, discretization::forms::Operation::Divergence>; static_assert(backend::mfem::EvaluableOperand<DisplacementDivergence>); static_assert(VolumeEquation<Pressure>); static_assert(discretization::quadrature::backend::mfem::resolve_operand_order<DisplacementDivergence>()==2); static_assert(!ScalarVolumeEquation<Pressure>); static_assert(std::same_as<equations::TestOperandOf<Pressure>,DisplacementDivergence>); static_assert(std::same_as<discretization::forms::OperandValue<DisplacementDivergence>,double>); static_assert(EquationPlan<Pressure>::column_count==1); static_assert(std::same_as<EquationPlan<Pressure>::Columns,utils::types::TypeList<EnthalpyValue>>); static_assert(std::same_as<EquationPlan<Pressure>::Form<EnthalpyValue>,discretization::forms::divergence<Pressure::Test, Enthalpy>>); //Describinganequationdoesnotimplyaparticularbackendcanexecuteit. structGradientRequest{ usingTest=Density; usingOperands=utils::types::TypeList<EnthalpyGradient>; staticconstexprstd::string_viewname="unsupportedgradientrequest"; equations::PointLinearization<Operands>evaluate(constequations::EquationPoint<Operands>&)const{return{};} intadditional_order(EnthalpyGradient,int)const{return0;} }; static_assert(equations::Equation<GradientRequest>); static_assert(!ScalarVolumeEquation<GradientRequest>); static_assert(!VolumeEquation<GradientRequest>); static_assert(VolumeEquation<equations::GravityGradientRelation>); static_assert(VolumeEquation<equations::PoissonBalance>); static_assert(EquationPlan<equations::GravityGradientRelation>::column_count==2); static_assert(EquationPlan<equations::PoissonBalance>::column_count==2); static_assert(std::same_as<discretization::forms::OperandValue<GravityValue>,discretization::forms::VectorValue>); static_assert(std::same_as<discretization::forms::OperandValue<GravityDivergence>,double>); usingDisplacement=discretization::blocks::displacement::vector; usingDisplacementValue=discretization::forms::Operand<Displacement>; static_assert(backend::mfem::EvaluableOperand<DisplacementValue>); static_assert(backend::mfem::EvaluableOperand<discretization::forms::Operand<Displacement, discretization::forms::Operation::Divergence>>); static_assert(!backend::mfem::EvaluableOperand<discretization::forms::Operand<Displacement, discretization::forms::Operation::Gradient>>); static_assert(VolumeEquation<equations::GravityForce>); static_assert(VolumeEquation<equations::RotationalForce>); static_assert(!ScalarVolumeEquation<equations::RotationalForce>); static_assert(std::same_as<EquationPlan<equations::RotationalForce>::Test,Displacement>); static_assert(std::same_as<equations::SupportOf<equations::RotationalForce>,discretization::domain::StellarDomains>); static_assert(std::same_as<EquationPlan<equations::RotationalForce>::Columns,utils::types::TypeList<DensityValue, discretization::forms::Operand<discretization::blocks::rotation::angular_velocity>>>); static_assert(!ScalarVolumeEquation<equations::GravityForce>); static_assert(std::same_as<EquationPlan<equations::GravityForce>::Test,Displacement>); static_assert(std::same_as<equations::SupportOf<equations::GravityForce>,discretization::domain::StellarDomains>); static_assert(std::same_as<EquationPlan<equations::GravityForce>::Columns,utils::types::TypeList<DensityValue, GravityValue>>); static_assert(std::same_as<discretization::forms::OperandValue<DisplacementValue>,discretization::forms::VectorValue>); static_assert(!backend::mfem::EvaluableOperand< discretization::forms::Operand<discretization::blocks::gravity::gradient, discretization::forms::Operation::Curl>>); static_assert(!backend::mfem::EvaluableOperand<discretization::forms::Operand<discretization::blocks::gravity::gradient, discretization::forms::Operation::NormalTrace>>); usingPotential=discretization::blocks::gravity::potential; usingMixedSamples=utils::types::TypeList<GravityValue, GravityDivergence, DensityValue>; static_assert(OperandValues<MixedSamples>::index<GravityValue>()==0); static_assert(OperandValues<MixedSamples>::index<GravityDivergence>()==1); static_assert(std::same_as<discretization::forms::PartialDerivative<discretization::forms::VectorValue,double>, discretization::forms::VectorValue>); static_assert( std::same_as<discretization::forms::PartialDerivative<discretization::forms::VectorValue,discretization::forms::VectorValue>, discretization::forms::MatrixValue>); //Bothoff-diagonalgravitycontributionsmusthonorthesamequadratureoverride. static_assert(std::same_as< EquationPlan<equations::GravityGradientRelation>::Form<discretization::forms::Operand<Potential>, equations::gravity_contributions::PotentialValue>, EquationPlan<equations::PoissonBalance>::Form<GravityDivergence,equations::gravity_contributions::GradientDivergence>>); structBadContributionRow{ usingTest=Density; staticconstexprstd::string_viewname="malformedcontribution"; autocontributions()const{ returnstd::tuple{1}; } }; static_assert(!equations::Equation<BadContributionRow>); structBadContributionCollection{ usingTest=Displacement; staticconstexprstd::string_viewname="non-tuplecontributions"; autocontributions()const{ returnequations::GravityForce{}; } }; structNestedBadCollection{ usingTest=Displacement; staticconstexprstd::string_viewname="nestednon-tuplecontributions"; autocontributions()const{ returnstd::tuple{equations::GravityForce{},BadContributionCollection{}}; } }; static_assert(!equations::Equation<BadContributionCollection>); static_assert(!equations::Equation<NestedBadCollection>); usingMechanical=equations::DisplacementForce<eos::models::Polytrope>; usingMechanicalDifference=equations::EquationDifference<Pressure, equations::EquationSum<equations::GravityForce, equations::RotationalForce>>; usingScaledMechanical=equations::EquationScale<MechanicalDifference>; static_assert(VolumeEquation<Mechanical>); static_assert(VolumeEquation<ScaledMechanical>); static_assert(!equations::PointEquation<Mechanical>); static_assert(!equations::PointEquation<ScaledMechanical>); static_assert(std::same_as<equations::ContributionsOf<Mechanical>,std::tuple<Pressure,equations::GravityForce,equations::RotationalForce>>); static_assert(std::same_as<equations::ContributionsOf<Mechanical>,equations::ContributionsOf<ScaledMechanical>>); static_assert(std::same_as<EquationPlan<Mechanical>::Columns,utils::types::TypeList<EnthalpyValue, DensityValue, GravityValue, discretization::forms::Operand<discretization::blocks::rotation::angular_velocity>>>); static_assert(EquationPlan<ScaledMechanical>::column_count==4); usingScaledPoisson=equations::EquationScale<equations::PoissonBalance>; static_assert(VolumeEquation<ScaledPoisson>); static_assert(std::same_as<equations::ContributionsOf<ScaledPoisson>,equations::ContributionsOf<equations::PoissonBalance>>); template<typenameLeftT,typenameRightT> conceptCanSum=requires{typenameequations::EquationSum<LeftT, RightT>;}; template<typenameLeftT,typenameRightT> conceptCanSubtract=requires{typenameequations::EquationDifference<LeftT, RightT>;}; static_assert(CanSum<Pressure, equations::GravityForce>); static_assert(CanSubtract<Mechanical, Pressure>); static_assert(!CanSum<Pressure, equations::PoissonBalance>); static_assert(!CanSubtract<Pressure, equations::PoissonBalance>); static_assert(!CanSum<Pressure, int>); static_assert(!VolumeEquation<equations::EquationScale<GradientRequest>>); }//namespaceserif::operators #include"serif/equations/mass_normalization.hpp" #include"serif/equations/angular_momentum.hpp" namespaceserif::operators{ usingMass=equations::MassNormalization; usingConstant=discretization::blocks::barotropic_constant::mass_normalization; usingOmega=discretization::blocks::rotation::angular_velocity; usingMomentum=equations::AngularMomentum; static_assert(ScalarVolumeEquation<Momentum>&&VolumeEquation<Momentum>); static_assert(std::same_as<EquationPlan<Momentum>::Test,Omega>); static_assert(std::same_as<EquationPlan<Momentum>::Columns,utils::types::TypeList<DensityValue, discretization::forms::Operand<Omega>>>); static_assert(ScalarVolumeEquation<Mass>&&VolumeEquation<Mass>); static_assert(EquationPlan<Mass>::column_count==1); static_assert(EquationPlan<equations::BarotropicHydrostaticEquilibrium>::column_count==4); static_assert(backend::mfem::EvaluableOperand<discretization::forms::Operand<Constant>>); static_assert(backend::mfem::EvaluableOperand<discretization::forms::Operand<Omega>>); static_assert(!VolumeOperand<discretization::forms::Operand<Omega,discretization::forms::Operation::Divergence>>); static_assert(!discretization::blocks::GlobalScalarTerm<discretization::blocks::surface_deformation::coefficients>); }