rotational_force.hpp string_view serif/discretization/blocks/fields.hpp serif/equations/contributions.hpp serif/equations/point.hpp serif/equations/rigid_rotation.hpp src/compile_time_checks/serif/operators/plan.cpp src/include/serif/equations/displacement_force.hpp src/include/serif/equations/equations.hpp serif::equations::RotationalForce serif serif::equations #pragmaonce #include<string_view> #include"serif/discretization/blocks/fields.hpp" #include"serif/equations/contributions.hpp" #include"serif/equations/point.hpp" #include"serif/equations/rigid_rotation.hpp" namespaceserif::equations{ classRotationalForcefinal:publicContribution<discretization::forms::Operand<discretization::blocks::displacement::vector>,discretization::domain::StellarDomains>{ public: usingDensity=discretization::blocks::density::mass; usingAngularVelocity=discretization::blocks::rotation::angular_velocity; usingAngularVelocityValue=discretization::forms::Operand<AngularVelocity>; usingDensityValue=discretization::forms::Operand<Density>; usingOperands=utils::types::TypeList<DensityValue, AngularVelocityValue>; usingResult=discretization::forms::VectorValue; staticconstexprstd::string_viewname="rotationalforce"; explicitRotationalForce(Resultaxis={0.0,0.0,1.0},Resultcenter={}): m_rotation(RigidRotation::unit_rotation(axis,center)){} [[nodiscard]]PointLinearization<Operands, Result>evaluate( constEquationPoint<Operands>&point )const{ constdoubledensity=point.fields.get<Density>(); constdoubleomega=point.fields.get<AngularVelocity>(); constdoubleomega_squared=omega*omega; constautogradient=m_rotation.centrifugal_potential_gradient(point.position); PointLinearization<Operands, Result>result; for(introw=0;row<3;++row){ result.residual[row]=density*(-omega_squared*gradient[row]); result.field_derivatives.get<Density>()[row]=-omega_squared*gradient[row]; result.field_derivatives.get<AngularVelocity>()[row]=-2.0*omega*density*gradient[row]; for(intcolumn=0;column<3;++column){ result.position_derivative[row][column]=-density*(omega_squared*m_rotation.centrifugal_potential_hessian()[row][column]); } } returnresult; } [[nodiscard]]intadditional_order(DensityValue,intposition_order)const{returnposition_order;} [[nodiscard]]intadditional_order(AngularVelocityValue,intposition_order)const{ returnDensity::FunctionalSpace::order+position_order; } private: RigidRotationm_rotation; }; }//namespaceserif::equations