gravity_force.hpp concepts string_view serif/discretization/blocks/fields.hpp serif/equations/contributions.hpp serif/equations/point.hpp src/compile_time_checks/serif/operators/plan.cpp src/include/serif/equations/displacement_force.hpp src/include/serif/equations/equations.hpp serif::equations::GravityForce serif serif::equations File containing the gravitational force contribution to the mechanical balance equation (displacement_force.hpp). Emily M. Boudreaux #pragmaonce #include<concepts> #include<string_view> #include"serif/discretization/blocks/fields.hpp" #include"serif/equations/contributions.hpp" #include"serif/equations/point.hpp" namespaceserif::equations{ structGravityForce:Contribution<discretization::forms::Operand<discretization::blocks::displacement::vector>,discretization::domain::StellarDomains>{ usingDensity=discretization::blocks::density::mass; usingGradient=discretization::blocks::gravity::gradient; usingDensityValue=discretization::forms::Operand<Density>; usingGradientValue=discretization::forms::Operand<Gradient>; usingOperands=utils::types::TypeList<DensityValue, GradientValue>; usingResult=discretization::forms::VectorValue; staticconstexprstd::string_viewname="gravitationalforce"; [[nodiscard]]staticPointLinearization<Operands, Result>evaluate( constEquationPoint<Operands>&point ){ constdoubledensity=point.fields.get<Density>(); constauto&gradient=point.fields.get<Gradient>(); PointLinearization<Operands, Result>result; for(intaxis=0;axis<3;++axis){ result.residual[axis]=density*gradient[axis]; result.field_derivatives.get<Density>()[axis]=gradient[axis]; result.field_derivatives.get<Gradient>()[axis][axis]=density; } returnresult; } template<typenameOperandT> [[nodiscard]]staticintadditional_order(OperandT/*operand_type*/,int/*position_order*/){ ifconstexpr(std::same_as<OperandT,DensityValue>){ //TheregisteredRTfamilyoforderphasvectorcomponentsofdegreeuptop+1. returnGradient::FunctionalSpace::order+1; }else{ returnDensity::FunctionalSpace::order; } } }; }//namespaceserif::equations