companion.hpp cmath serif/equations/rigid_rotation.hpp serif/utils/error/errors.hpp src/include/serif/equations/barotropic_density.hpp src/include/serif/equations/equations.hpp src/include/serif/equations/surface_potential.hpp serif::equations::PointMassCompanion serif serif::equations #pragmaonce #include<cmath> #include"serif/equations/rigid_rotation.hpp" #include"serif/utils/error/errors.hpp" namespaceserif::equations{ classPointMassCompanionfinal{ public: usingVector=RigidRotation::Vector; PointMassCompanion( constdoublegravitational_mass, constVector&position, constbooltidal_only=false ): m_gravitational_mass(gravitational_mass), m_position(position), m_tidal_only(tidal_only){ usingnamespaceutils::errors; serif_ensure<SERiFErrorCode::INVALID_ARGUMENT,std::invalid_argument>(std::isfinite(gravitational_mass)&&gravitational_mass>0.0&& std::isfinite(position[0])&&std::isfinite(position[1])&&std::isfinite(position[2]), "Acompanionrequiresafinitepositivemassandafiniteposition."); } [[nodiscard]]doublepotential(constVector&x)const{ doubleresult=-m_gravitational_mass/std::hypot(x[0]-m_position[0],x[1]-m_position[1],x[2]-m_position[2]); if(m_tidal_only){ result+=uniform_scale()*(x[0]*m_position[0]+x[1]*m_position[1]+x[2]*m_position[2]); } returnresult; } [[nodiscard]]Vectorpotential_gradient(constVector&x)const{ constdoubledistance=std::hypot(x[0]-m_position[0],x[1]-m_position[1],x[2]-m_position[2]); constdoublescale=m_gravitational_mass/(distance*distance*distance); Vectorresult{scale*(x[0]-m_position[0]),scale*(x[1]-m_position[1]),scale*(x[2]-m_position[2])}; if(m_tidal_only){ for(intaxis=0;axis<3;++axis){result[axis]+=uniform_scale()*m_position[axis];} } returnresult; } [[nodiscard]]doublegravitational_mass()constnoexcept{returnm_gravitational_mass;} [[nodiscard]]constVector&position()constnoexcept{returnm_position;} [[nodiscard]]booltidal_only()constnoexcept{returnm_tidal_only;} private: [[nodiscard]]doubleuniform_scale()const{ constdoubledistance=std::hypot(m_position[0],m_position[1],m_position[2]); returnm_gravitational_mass/(distance*distance*distance); } doublem_gravitational_mass; Vectorm_position; boolm_tidal_only; }; }