surface_potential.hpp optional string_view serif/discretization/blocks/fields.hpp serif/equations/companion.hpp serif/equations/point.hpp serif/equations/rigid_rotation.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/normalization.cpp src/include/serif/backend/mfem/model/surface_potential.hpp src/include/serif/equations/equations.hpp src/include/serif/model/equilibrium_plan.hpp serif::equations::SurfacePotentialBalance serif serif::equations #pragmaonce #include<optional> #include<string_view> #include"serif/discretization/blocks/fields.hpp" #include"serif/equations/companion.hpp" #include"serif/equations/point.hpp" #include"serif/equations/rigid_rotation.hpp" namespaceserif::equations{ classSurfacePotentialBalancefinal{ public: usingPotential=discretization::blocks::gravity::potential; usingSurfaceLevel=discretization::blocks::barotropic_constant::mass_normalization; usingAngularVelocity=discretization::blocks::rotation::angular_velocity; usingOperands=utils::types::TypeList<discretization::forms::Operand<Potential>, discretization::forms::Operand<SurfaceLevel>,discretization::forms::Operand<AngularVelocity>>; usingResidualQuantity=dimensions::GravitationalPotential; staticconstexprstd::string_viewname="surfaceeffectivepotentialbalance"; explicitSurfacePotentialBalance(constRigidRotation::Vector&axis={0.0,0.0,1.0}, constRigidRotation::Vector&center={},std::optional<PointMassCompanion>companion=std::nullopt): m_rotation(RigidRotation::unit_rotation(axis,center)),m_companion(companion){} [[nodiscard]]PointLinearization<Operands>evaluate(constEquationPoint<Operands>&point)const{ constdoubleomega=point.fields.get<AngularVelocity>(); constdoublecentrifugal=m_rotation.centrifugal_potential(point.position); PointLinearization<Operands>result; result.residual=point.fields.get<Potential>()-omega*omega*centrifugal-point.fields.get<SurfaceLevel>(); result.field_derivatives.get<Potential>()=1.0; result.field_derivatives.get<SurfaceLevel>()=-1.0; result.field_derivatives.get<AngularVelocity>()=-2.0*omega*centrifugal; result.position_derivative=m_rotation.centrifugal_potential_gradient(point.position); for(double&component:result.position_derivative){ component*=-omega*omega; } if(m_companion){ result.residual+=m_companion->potential(point.position); constautogradient=m_companion->potential_gradient(point.position); for(intaxis=0;axis<3;++axis){result.position_derivative[axis]+=gradient[axis];} } returnresult; } [[nodiscard]]constRigidRotation&rotation()constnoexcept{returnm_rotation;} [[nodiscard]]conststd::optional<PointMassCompanion>&companion()constnoexcept{returnm_companion;} private: RigidRotationm_rotation; std::optional<PointMassCompanion>m_companion; }; }