Geomi
CovariantStepInternals.hpp
1 #ifndef DEF_VARIATIONAL_COVARIANTSTEPINTERNALS
2 #define DEF_VARIATIONAL_COVARIANTSTEPINTERNALS
3 
4 #include <vector>
5 
6 namespace Variational {
7 
8 template <typename T_M,
9  typename T_Q,
10  typename T_ALGEBRA>
12  : public Abstract::StepInternals<T_M,T_Q,Abstract::LieProblem<T_M,T_Q,T_ALGEBRA>,T_ALGEBRA>,
13  public ::Abstract::NOXStep<T_ALGEBRA,1>
14 {
16 
17 protected:
22 
23 public:
26  { }
27 
29  getInitialGuess ()
30  { return ((1.0/m_h)*T_ALGEBRA::cay_inv(m_q0.inverse()*m_q1)).toNOXVector(); }
31 
32  T_Q
33  posFromVel (T_M h, T_Q q0, T_ALGEBRA v0) const
34  { return q0*((h*v0).cay()); }
35 
36  bool
38  {
39  T_ALGEBRA xi_prev = (1.0/m_h)*T_ALGEBRA::cay_inv(m_q0.inverse()*m_q1);
40  T_ALGEBRA xi_next = T_ALGEBRA(xi);
41  T_Q tau_prev = (m_h*xi_prev).cay();
42 
43  f = (-1.0)*T_ALGEBRA::static_Ad_star(tau_prev,T_ALGEBRA((m_h*xi_prev).dCayRInv().transpose()*m_problem.dLdv(xi_prev))).toVector()
44  + (m_h*xi_next).dCayRInv().transpose()*m_problem.dLdv(xi_next);
45  return true;
46  }
47 
48  bool
49  computeJacobian (Eigen::Matrix<double,T_ALGEBRA::DOF,T_ALGEBRA::DOF>& J, const NOXVector<T_ALGEBRA::DOF>& xi_vec)
50  {
51  T_ALGEBRA xi = T_ALGEBRA(xi_vec);
52 
53  for (int i=0; i<T_ALGEBRA::DOF; i++) {
54  // TODO vĂ©rifier les indices
55  J.block(0,i,T_ALGEBRA::DOF,1) =
56  (0.5*m_h*T_ALGEBRA::GeneratorMatrix(i)
57  +m_h*m_h*0.25*(T_ALGEBRA::GeneratorVector(i)*xi.toVector().transpose()+xi.toVector()*T_ALGEBRA::GeneratorVector(i).transpose()))
58  *m_problem.dLdv(xi);
59  }
60  J += (m_h*xi).dCayRInv().transpose()*m_problem.JvdLdv(xi);
61 
62  return true;
63  }
64 };
65 } // namespace Variational
66 
67 #endif
Definition: Abstract_LieProblem.hpp:6
Definition: Abstract_LieProblem.hpp:10
Definition: CovariantStepInternals.hpp:11
Definition: Abstract_StepInternals.hpp:13
Definition: NOXVector.hpp:14
Definition: Abstract_NOXStep.hpp:12