plan.cpp type_traits serif/eos/models/polytropic.hpp serif/operators/plan.hpp serif/equations/registry.hpp serif/equations/primal_gravity.hpp serif/equations/barotropic_density.hpp serif/backend/mfem/operators/operand_evaluation.hpp serif/backend/mfem/discretization/quadrature/order.hpp serif/discretization/domain/schema/schemas.hpp serif/equations/mass_normalization.hpp serif/equations/angular_momentum.hpp serif::operators::DiscontinuousScalar serif::operators::DiscontinuousScalar::residual serif::operators::NodalRequest serif::operators::GradientRequest serif::operators::BadContributionRow serif::operators::BadContributionCollection serif::operators::NestedBadCollection serif::operators::EquationRegistry serif::operators::OperandValues serif serif::operators #include<type_traits> #include"serif/eos/models/polytropic.hpp" #include"serif/operators/plan.hpp" #include"serif/equations/registry.hpp" #include"serif/equations/primal_gravity.hpp" #include"serif/equations/barotropic_density.hpp" #include"serif/backend/mfem/operators/operand_evaluation.hpp" #include"serif/backend/mfem/discretization/quadrature/order.hpp" #include"serif/discretization/domain/schema/schemas.hpp" namespaceserif::operators{ usingequations::EquationRegistry; usingequations::OperandValues; usingBalance=equations::BarotropicDensityBalance<eos::models::Polytrope>; usingDensity=discretization::blocks::density::mass; usingPotential=discretization::blocks::gravity::potential; usingDisplacement=discretization::blocks::displacement::vector; usingSchema=discretization::domain::schema::CoreEnvelopeVacuumDomainSchema; //Keepdiscontinuous-spacerejectionindependentoftheproductiondensityrepresentation. structDiscontinuousScalar:discretization::blocks::term<discretization::blocks::density>{ usingFunctionalSpace=discretization::functional_space::DiscreteFunctionalSpace<discretization::functional_space::L2, 2, 0>; usingSupport=discretization::domain::StellarDomains; structresidual:discretization::blocks::residual_block_base{}; }; 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{}; } }; usingBoundaryValue=NodalRequest<Potential>; static_assert(equations::Equation<BoundaryValue>&&equations::PointEquation<BoundaryValue>); static_assert(!VolumeEquation<BoundaryValue>&&!ScalarVolumeEquation<BoundaryValue>); static_assert(std::same_as<equations::SupportOf<BoundaryValue>,discretization::domain::StellarSurfaceBoundary>); static_assert(ScalarVolumeEquation<Balance>,"Barotropicdensitybalanceisascalarvolumeequation."); static_assert(!ScalarVolumeEquation<equations::PrimalPoissonBalance>,"PrimalPoissonbalancesamplesapotentialgradient."); static_assert(!ScalarVolumeEquation<eos::models::Polytrope>,"Polytropeisnotascalarvolumeequation."); static_assert(!ScalarValueTerm<Displacement>,"Avectorfieldisnotascalarvalueterm."); static_assert(!ScalarValueOperand<discretization::forms::Operand<Potential, discretization::forms::Operation::Gradient>>,"Gradientoperandisnotascalarvalueoperand."); static_assert(std::same_as<EquationPlan<Balance>::Test,Density>,"Barotropicdensitybalancetestisdensity."); static_assert(std::same_as<EquationPlan<Balance>::Support,discretization::domain::StellarDomains>,"Barotropicdensitybalancesupportisstellardomains."); static_assert(EquationPlan<Balance>::operand_count==4,"Barotropicdensitybalancehasfouroperands."); static_assert(OperandValues<Balance::Operands>::index<Density>()==0,"Barotropicdensitybalancedensityoperandisfirst."); static_assert(OperandValues<Balance::Operands>::index<Potential>()==1,"Barotropicdensitybalancepotentialoperandissecond."); static_assert(std::same_as< EquationPlan<Balance>::Form<discretization::forms::Operand<Density>>, discretization::forms::mass<Density, Density>>,"Barotropicdensitybalancedensityformismass."); static_assert(std::same_as< EquationPlan<Balance>::Form<discretization::forms::Operand<Potential>>, discretization::forms::source<Potential, Density>>,"Barotropicdensitybalancepotentialformissource."); static_assert(std::same_as< EquationRegistry<Balance, equations::PrimalPoissonBalance>::Equations, utils::types::TypeList<Balance, equations::PrimalPoissonBalance>>,"EquationregistrycontainsdensitybalanceandPoissonbalance."); usingDensityValue=discretization::forms::Operand<Density>; usingPotentialValue=discretization::forms::Operand<Potential>; usingPotentialGradient=discretization::forms::Operand<Potential, discretization::forms::Operation::Gradient>; static_assert(backend::mfem::EvaluableOperand<DensityValue>); static_assert(backend::mfem::EvaluableOperand<PotentialValue>); static_assert(backend::mfem::EvaluableOperand<PotentialGradient>); static_assert(backend::mfem::EvaluableOperand<discretization::forms::Operand<Density, discretization::forms::Operation::Gradient>>); static_assert(!backend::mfem::EvaluableOperand<discretization::forms::Operand<DiscontinuousScalar, discretization::forms::Operation::Gradient>>); static_assert(!backend::mfem::EvaluableOperand<int>); usingDisplacementDivergence=discretization::forms::Operand<discretization::blocks::displacement::vector, discretization::forms::Operation::Divergence>; static_assert(backend::mfem::EvaluableOperand<DisplacementDivergence>); static_assert(discretization::quadrature::backend::mfem::resolve_operand_order<DisplacementDivergence>()==2); static_assert(std::same_as<discretization::forms::OperandValue<DisplacementDivergence>,double>); //Describinganequationdoesnotimplyaparticularbackendcanexecuteit. structGradientRequest{ usingTest=Density; usingOperands=utils::types::TypeList<PotentialGradient>; staticconstexprstd::string_viewname="scalargradientrequest"; equations::PointLinearization<Operands>evaluate(constequations::EquationPoint<Operands>&)const{return{};} intadditional_order(PotentialGradient,int)const{return0;} }; static_assert(equations::Equation<GradientRequest>); static_assert(!ScalarVolumeEquation<GradientRequest>); static_assert(VolumeEquation<GradientRequest>); static_assert(VolumeEquation<equations::PrimalPoissonBalance>); static_assert(EquationPlan<equations::PrimalPoissonBalance>::column_count==2); static_assert(std::same_as<discretization::forms::OperandValue<PotentialGradient>,discretization::forms::VectorValue>); usingDisplacementValue=discretization::forms::Operand<Displacement>; static_assert(backend::mfem::EvaluableOperand<DisplacementValue>); static_assert(backend::mfem::EvaluableOperand<discretization::forms::Operand<Displacement, discretization::forms::Operation::Divergence>>); usingDisplacementGradient=discretization::forms::Operand<Displacement, discretization::forms::Operation::Gradient>; usingVectorTensor=discretization::forms::MatrixValue; usingCartesianVector=discretization::forms::VectorValue; static_assert(backend::mfem::EvaluableOperand<DisplacementGradient>); static_assert(std::same_as<discretization::forms::OperandValue<DisplacementGradient>,VectorTensor>); static_assert(discretization::forms::component_count<VectorTensor>==9); static_assert(discretization::forms::component_count<discretization::forms::PartialDerivative<VectorTensor, VectorTensor>>==81); static_assert(discretization::forms::component_count<discretization::forms::PartialDerivative<VectorTensor, CartesianVector>>==27); static_assert(discretization::forms::component_count<discretization::forms::PartialDerivative<CartesianVector, VectorTensor>>==27); static_assert(std::same_as<discretization::forms::PartialDerivative<VectorTensor,double>,VectorTensor>); static_assert(std::same_as<discretization::forms::PartialDerivative<double,VectorTensor>,VectorTensor>); static_assert(discretization::quadrature::backend::mfem::resolve_operand_order<DisplacementGradient>()==2); static_assert(std::same_as<discretization::forms::OperandValue<DisplacementValue>,discretization::forms::VectorValue>); static_assert(!backend::mfem::EvaluableOperand< discretization::forms::Operand<Displacement, discretization::forms::Operation::Curl>>); static_assert(!backend::mfem::EvaluableOperand<discretization::forms::Operand<Displacement, discretization::forms::Operation::NormalTrace>>); usingMixedSamples=utils::types::TypeList<DisplacementValue, DisplacementDivergence, DensityValue>; static_assert(OperandValues<MixedSamples>::index<DisplacementValue>()==0); static_assert(OperandValues<MixedSamples>::index<DisplacementDivergence>()==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>); 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::PrimalPoissonBalance{1.0}; } }; structNestedBadCollection{ usingTest=Displacement; staticconstexprstd::string_viewname="nestednon-tuplecontributions"; autocontributions()const{ returnstd::tuple{equations::PrimalPoissonBalance{1.0},BadContributionCollection{}}; } }; static_assert(!equations::Equation<BadContributionCollection>); static_assert(!equations::Equation<NestedBadCollection>); }//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::AngularMomentumConstraint; 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<Balance>::column_count==4); static_assert(backend::mfem::EvaluableOperand<discretization::forms::Operand<Constant>>); static_assert(backend::mfem::EvaluableOperand<discretization::forms::Operand<Omega>>); static_assert(!MappedOperand<discretization::forms::Operand<Omega,discretization::forms::Operation::Divergence>>); static_assert(!discretization::blocks::GlobalScalarTerm<discretization::blocks::surface_deformation::coefficients>); }