1 #ifndef VTESTBED_CORE_SHIP_MOTION_SOLVER_HH 2 #define VTESTBED_CORE_SHIP_MOTION_SOLVER_HH 4 #include <vtestbed/core/euler.hh> 5 #include <vtestbed/core/math.hh> 6 #include <vtestbed/core/rkf45.hh> 7 #include <vtestbed/core/ship.hh> 8 #include <vtestbed/core/ship_hull_panel.hh> 9 #include <vtestbed/geometry/polyline.hh> 63 using vec2 = blitz::TinyVector<T,2>;
64 using vec3 = blitz::TinyVector<T,3>;
69 using variables_type =
typename ship_type::variables_type;
76 rotation_matrix_type _inertia_matrix;
77 vec3 _gravity_force{T{}}, _forces{T{}}, _torques{T{}};
79 vec3 _damping{T{0.50},T{0.90},T{0.50}};
80 vec3 _centre_of_gravity{T{}};
81 vec3 _centre_of_buoyancy{T{}};
82 vec3 _centre_of_floatation{T{}};
83 vec3 _centre_of_wind{T{}};
91 _inertia_matrix(inertia_matrix) {}
94 solve(T t,
const state_vector_type& v, state_vector_type& dv) {
95 quaternion_type q = unit(v.quaternion);
96 const auto& R = rotation_matrix(q);
97 const auto& R_inv = inverse(R);
98 const auto& I_body = inertia_matrix();
99 const auto& I_body_inv = inverse(I_body);
100 auto angvelocity = R*(I_body_inv*(R_inv*v.angmomentum));
101 dv.position = v.velocity;
102 dv.velocity = total_force() - damping()*v.velocity;
103 dv.quaternion = T{0.5}*(quaternion_type(0,angvelocity)*q);
104 dv.angmomentum = total_torque() - damping()*v.angmomentum;
107 inline variables_type
108 operator()(T t,
const variables_type& vars) {
109 state_vector_type result;
110 this->solve(t, reinterpret_cast<const state_vector_type&>(vars), result);
111 return static_cast<const variables_type&>(result);
114 inline state_vector_type
115 operator()(T t,
const state_vector_type& vars) {
116 state_vector_type result;
117 solve(t, vars, result);
121 inline const rotation_matrix_type&
122 inertia_matrix()
const {
return this->_inertia_matrix; }
124 inertia_matrix(
const rotation_matrix_type& rhs) { this->_inertia_matrix = rhs; }
125 inline void gravity_force(
const vec3& rhs) { this->_gravity_force = rhs; }
126 inline void total_force(
const vec3& rhs) { this->_forces = rhs; }
127 inline void total_torque(
const vec3& rhs) { this->_torques = rhs; }
128 inline void damping(
const vec3& rhs) { this->_damping = rhs; }
129 inline const vec3& damping()
const {
return this->_damping; }
130 inline T displacement()
const {
return this->_displacement; }
131 inline const vec3& total_force()
const {
return this->_forces; }
132 inline const vec3& total_torque()
const {
return this->_torques; }
133 inline const vec3& centre_of_gravity()
const {
return this->_centre_of_gravity; }
134 inline const vec3& centre_of_buoyancy()
const {
return this->_centre_of_buoyancy; }
135 inline const vec3& centre_of_floatation()
const {
return this->_centre_of_floatation; }
136 inline const vec3& centre_of_wind()
const {
return this->_centre_of_wind; }
138 void calc_forces_and_torques(
147 void calc_froude_krylov_and_wind(
154 void calc_flooding(
const ship_type& ship, T mass);
155 void calc_propulsor(
const ship_type& ship, T mass);
157 static vec3 centre_of_floatation(
const waterline_type& waterline);
185 inline const equation_type& equation()
const {
return this->_eq; }
190 const panel_array& wetted_panels,
191 const panel_array& dry_panels,
192 const waterline_type& waterline,
202 #endif // vim:filetype=cpp
Rigid ship with a mass and translational and angular velocity.
Runge—Khutta—Fehlberg initial value problem solver.
System of ordinary differential equations of translational and angular ship motion.
Triangular ship hull panel (face).