primal_gravity.hpp cmath stdexcept string_view tuple serif/discretization/blocks/fields.hpp serif/equations/contributions.hpp serif/equations/point.hpp serif/utils/error/errors.hpp src/compile_time_checks/serif/model/barotropic_density.cpp src/compile_time_checks/serif/model/density_primal.cpp src/compile_time_checks/serif/model/execution_validation.cpp src/compile_time_checks/serif/model/finite_elements.cpp src/compile_time_checks/serif/model/normalization.cpp src/compile_time_checks/serif/model/validation.cpp src/compile_time_checks/serif/operators/coordinate_identity_meanfield.cpp src/compile_time_checks/serif/operators/plan.cpp src/compile_time_checks/serif/solver/normalization/plan.cpp src/include/serif/backend/mfem/serialize/top.hpp src/include/serif/equations/equations.hpp src/include/serif/model/equilibrium_plan.hpp serif::equations::PrimalPoissonBalance serif::equations::PrimalPoissonBalance::PotentialFlux serif::equations::PrimalPoissonBalance::DensitySource serif serif::equations #pragmaonce #include<cmath> #include<stdexcept> #include<string_view> #include<tuple> #include"serif/discretization/blocks/fields.hpp" #include"serif/equations/contributions.hpp" #include"serif/equations/point.hpp" #include"serif/utils/error/errors.hpp" namespaceserif::equations{ classPrimalPoissonBalancefinal{ public: usingTest=discretization::blocks::gravity::potential; usingDensity=discretization::blocks::density::mass; usingPotentialGradient=discretization::forms::Operand<Test, discretization::forms::Operation::Gradient>; usingResidualQuantity=dimensions::InverseTimeSquared; staticconstexprstd::string_viewname="primalPoissonbalance"; structPotentialFlux:Contribution<PotentialGradient>{ usingOperands=utils::types::TypeList<PotentialGradient>; [[nodiscard]]staticPointLinearization<Operands, discretization::forms::VectorValue> evaluate(constEquationPoint<Operands>&point){ PointLinearization<Operands, discretization::forms::VectorValue>result; result.residual=point.fields.templateget<PotentialGradient>(); for(intaxis=0;axis<3;++axis){ result.field_derivatives.templateget<PotentialGradient>()[axis][axis]=1.0; } returnresult; } [[nodiscard]]staticintadditional_order(PotentialGradient,int){return0;} }; structDensitySource:Contribution<discretization::forms::Operand<Test>,discretization::domain::StellarDomains>{ usingOperands=utils::types::TypeList<discretization::forms::Operand<Density>>; doublefour_pi_G; explicitDensitySource(constdoublecoefficient):four_pi_G(coefficient){} [[nodiscard]]PointLinearization<Operands>evaluate(constEquationPoint<Operands>&point)const{ PointLinearization<Operands>result; result.residual=four_pi_G*point.fields.templateget<Density>(); result.field_derivatives.templateget<Density>()=four_pi_G; returnresult; } [[nodiscard]]staticintadditional_order(discretization::forms::Operand<Density>,int){return0;} }; explicitPrimalPoissonBalance(constdoublefour_pi_G):m_four_pi_G(four_pi_G){ usingnamespaceutils::errors; serif_ensure<SERiFErrorCode::INVALID_ARGUMENT,std::invalid_argument>(std::isfinite(four_pi_G)&&four_pi_G>0.0,"PrimalPoissonbalancerequirespositivefinite4piG."); } [[nodiscard]]autocontributions()const{ returnstd::tuple{PotentialFlux{},DensitySource{m_four_pi_G}}; } [[nodiscard]]doublefour_pi_G()constnoexcept{returnm_four_pi_G;} private: doublem_four_pi_G; }; }