FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
CableSegmentStructuralJacobian.h
1#ifndef CABLE_SEGMENT_STRUCTURAL_JACOBIAN_H
2#define CABLE_SEGMENT_STRUCTURAL_JACOBIAN_H
3
4#include <Eigen/Core>
5#include <cmath>
6
9{
10 Eigen::Vector3d spring;
11 Eigen::Vector3d damper;
12};
13
28inline CableSegmentStructuralForces CableSegmentStructuralForce(const Eigen::Vector3d& pk, const Eigen::Vector3d& pl,
29 const Eigen::Vector3d& vk, const Eigen::Vector3d& vl, double restLength, double springCoef, double damperCoef)
30{
31 Eigen::Vector3d pklbar = pl - pk;
32 pklbar.normalize();
33
35 if ((pl - pk).norm() < restLength)
36 force.spring = Eigen::Vector3d::Zero();
37 else
38 force.spring = springCoef * ((pl - pk).norm() - restLength) * pklbar;
39 force.damper = damperCoef * ((vl - vk).dot(pklbar)) * pklbar;
40 return force;
41}
42
66inline void SetCableSegmentStructuralJacobian(const double* pk, const double* pl, const double* vk, const double* vl,
67 double restLength, double springCoef, double damperCoef, double* dF_dpk, double* dF_dpl, double* dF_dvk,
68 double* dF_dvl)
69{
70 const double d[3] = {pk[0] - pl[0], pk[1] - pl[1], pk[2] - pl[2]};
71 const double L2 = d[0] * d[0] + d[1] * d[1] + d[2] * d[2];
72
73 for (int i = 0; i < 9; ++i)
74 dF_dpk[i] = dF_dpl[i] = dF_dvk[i] = dF_dvl[i] = 0.0;
75 if (L2 < 1e-20)
76 return;
77
78 const double L = std::sqrt(L2);
79 const double Linv = 1.0 / L;
80 const double Q[3] = {d[0] * Linv, d[1] * Linv, d[2] * Linv};
81
82 const double dV[3] = {vk[0] - vl[0], vk[1] - vl[1], vk[2] - vl[2]};
83 const double QdotdV = Q[0] * dV[0] + Q[1] * dV[1] + Q[2] * dV[2];
84
85 const bool inTension = (L > restLength);
86 const double tension = inTension ? springCoef * (L - restLength) : 0.0;
87 const double TD = tension + damperCoef * QdotdV;
88
89 const double extension = inTension ? (L - restLength) / restLength : 0.0;
90 const double dT_dL = (extension > 1e-8) ? springCoef : 0.0;
91
92 // F[j] = -TD * Q[j]: dF[j]/dpk[k] = -dTD/dpk[k] * Q[j] - TD * dQ[j]/dpk[k]
93 for (int j = 0; j < 3; ++j) {
94 for (int k = 0; k < 3; ++k) {
95 const double dTD_dpk = dT_dL * Q[k] + damperCoef * (dV[k] - QdotdV * Q[k]) * Linv;
96 const double dQj_dpk = ((j == k ? 1.0 : 0.0) - Q[j] * Q[k]) * Linv;
97
98 dF_dpk[j * 3 + k] = -dTD_dpk * Q[j] - TD * dQj_dpk;
99 dF_dpl[j * 3 + k] = -dF_dpk[j * 3 + k]; // d = pk - pl
100 dF_dvk[j * 3 + k] = -damperCoef * Q[k] * Q[j];
101 dF_dvl[j * 3 + k] = damperCoef * Q[k] * Q[j];
102 }
103 }
104}
105
106#endif
The spring force and the damper force on node k of a segment k-l, each along the segment (towards l w...
Definition CableSegmentStructuralJacobian.h:9