1 #ifndef DEF_VARIATIONAL_GALERKINSTEPINTERNALS 2 #define DEF_VARIATIONAL_GALERKINSTEPINTERNALS 114 template <
typename T_M,
138 m_quad_deg = quad_deg;
139 m_v_cur_q = std::vector<T_Q>(T_N_STEPS+1);
140 m_v_prev_q = std::vector<T_Q>(T_N_STEPS+1);
144 setData (T_M h, T_Q q0, T_Q q1)
147 m_v_prev_q[T_N_STEPS] = q1;
155 T_Q q0 = m_v_prev_q[0];
156 T_Q q1 = m_v_prev_q[T_N_STEPS];
158 for (
int i=1; i<=T_N_STEPS; i++) {
159 ret.segment((i-1)*T_Q::DOF,T_Q::DOF) =
166 initGetInitialGuess ()
169 T_Q q0 = m_v_prev_q[0];
170 T_Q q1 = m_v_prev_q[T_N_STEPS];
172 for (
int i=1; i<T_N_STEPS; i++) {
173 ret.segment((i-1)*T_Q::DOF,T_Q::DOF) =
182 m_v_prev_q[0] = m_v_prev_q[T_N_STEPS];
184 for (
int i=1; i<=T_N_STEPS; i++) {
185 m_v_prev_q[i] = T_Q(q.segment((i-1)*T_Q::DOF,T_Q::DOF));
188 m_v_cur_q[0] = m_v_prev_q[T_N_STEPS];
192 updateInitialPosition (
const NOXVector<T_Q::DOF*(T_N_STEPS-1)>& q)
194 for (
int i=1; i<T_N_STEPS; i++) {
195 m_v_prev_q[i]= T_Q(q.segment((i-1)*T_Q::DOF,T_Q::DOF));
198 m_v_cur_q[0] = m_v_prev_q[T_N_STEPS];
210 m_v_cur_q[0] = m_v_prev_q[T_N_STEPS];
211 for (nu=0; nu<T_N_STEPS; nu++) {
212 m_v_cur_q[nu+1] = T_Q(q.segment(nu*T_Q::DOF,T_Q::DOF));
216 std::vector<double> w = GaussLegendre::weights(r);
217 std::vector<double> c = GaussLegendre::dates(r);
220 std::vector<std::vector<double>> vv_lag =
221 this->m_interp.polynomials(T_N_STEPS,c);
222 std::vector<std::vector<double>> vv_lag_der =
223 this->m_interp.polynomials_derivatives(T_N_STEPS,c);
226 std::vector<T_Q> v_pos_interp =
227 m_interp.pos_interp(T_N_STEPS,c,m_v_cur_q);
228 std::vector<T_Q> v_vel_interp =
229 m_interp.vel_interp(T_N_STEPS,c,m_v_cur_q,this->m_h);
230 std::vector<T_Q> v_prev_pos_interp =
231 m_interp.pos_interp(T_N_STEPS,c,m_v_prev_q);
232 std::vector<T_Q> v_prev_vel_interp =
233 m_interp.vel_interp(T_N_STEPS,c,m_v_prev_q,this->m_h);
235 std::vector<NOXVector<T_Q::DOF>> v_cur_dLdq;
236 std::vector<NOXVector<T_Q::DOF>> v_cur_dLdv;
237 std::vector<NOXVector<T_Q::DOF>> v_prev_dLdq;
238 std::vector<NOXVector<T_Q::DOF>> v_prev_dLdv;
240 for (k=0; k<r; k++) {
241 v_cur_dLdq.push_back(
242 this->m_problem.dLdq(v_pos_interp[k], v_vel_interp[k]));
243 v_cur_dLdv.push_back(
244 this->m_problem.dLdv(v_pos_interp[k], v_vel_interp[k]));
245 v_prev_dLdq.push_back(
246 this->m_problem.dLdq(v_prev_pos_interp[k],v_prev_vel_interp[k]));
247 v_prev_dLdv.push_back(
248 this->m_problem.dLdv(v_prev_pos_interp[k],v_prev_vel_interp[k]));
254 for (k=0; k<r; k++) {
256 w[k]*( this->m_h*vv_lag[k][0]*v_cur_dLdq[k]
257 +vv_lag_der[k][0]*v_cur_dLdv[k]
258 +this->m_h*vv_lag[k][T_N_STEPS]*v_prev_dLdq[k]
259 +vv_lag_der[k][T_N_STEPS]*v_prev_dLdv[k]);
261 f.head(T_Q::DOF) = somme;
264 for (nu=1;nu<T_N_STEPS;nu++) {
267 somme += w[k]*( this->m_h*vv_lag[k][nu]*v_cur_dLdq[k]
268 +vv_lag_der[k][nu]*v_cur_dLdv[k]);
270 f.segment(nu*T_Q::DOF,T_Q::DOF) = somme;
277 computeInitF (
NOXVector<T_Q::DOF*(T_N_STEPS-1)>& f,
278 const NOXVector<T_Q::DOF*(T_N_STEPS-1)>& q)
284 for (nu=0; nu<T_N_STEPS-1; nu++) {
285 m_v_prev_q[nu+1] = T_Q(q.segment(nu*T_Q::DOF,T_Q::DOF));
289 std::vector<double> w = GaussLegendre::weights(r);
290 std::vector<double> c = GaussLegendre::dates(r);
292 std::vector<std::vector<double>> vv_lag =
293 this->m_interp.polynomials(T_N_STEPS,c);
294 std::vector<std::vector<double>> vv_lag_der =
295 this->m_interp.polynomials_derivatives(T_N_STEPS,c);
298 std::vector<T_Q> v_pos_interp =
299 m_interp.pos_interp(T_N_STEPS,c,m_v_prev_q);
300 std::vector<T_Q> v_vel_interp =
301 m_interp.vel_interp(T_N_STEPS,c,m_v_prev_q,this->m_h);
304 std::vector<NOXVector<T_Q::DOF>> v_prev_dLdq;
305 std::vector<NOXVector<T_Q::DOF>> v_prev_dLdv;
308 for (k=0; k<r; k++) {
309 v_prev_dLdq.push_back(
310 this->m_problem.dLdq(v_pos_interp[k],v_vel_interp[k]));
311 v_prev_dLdv.push_back(
312 this->m_problem.dLdv(v_pos_interp[k],v_vel_interp[k]));
316 for (nu=1;nu<T_N_STEPS;nu++) {
319 somme += w[k]*( this->m_h*vv_lag[k][nu]*v_prev_dLdq[k]
320 +vv_lag_der[k][nu]*v_prev_dLdv[k]);
322 f.segment((nu-1)*T_Q::DOF,T_Q::DOF) = somme;
335 Eigen::Matrix<double,T_Q::DOF*T_N_STEPS,T_Q::DOF*T_N_STEPS>& J,
345 m_v_cur_q[0] = m_v_prev_q[T_N_STEPS];
346 for (nu=0; nu<T_N_STEPS; nu++) {
347 m_v_cur_q[nu+1] = T_Q(q.segment(nu*T_Q::DOF,T_Q::DOF));
352 std::vector<double> w = GaussLegendre::weights(r);
353 std::vector<double> c = GaussLegendre::dates(r);
356 std::vector<std::vector<double>> vv_lag =
357 this->m_interp.polynomials(T_N_STEPS,c);
358 std::vector<std::vector<double>> vv_lag_der =
359 this->m_interp.polynomials_derivatives(T_N_STEPS,c);
362 std::vector<T_Q> v_pos_interp =
363 m_interp.pos_interp(T_N_STEPS,c,m_v_cur_q);
364 std::vector<T_Q> v_vel_interp =
365 m_interp.vel_interp(T_N_STEPS,c,m_v_cur_q,this->m_h);
366 std::vector<T_Q> v_prev_pos_interp =
367 m_interp.pos_interp(T_N_STEPS,c,m_v_prev_q);
368 std::vector<T_Q> v_prev_vel_interp =
369 m_interp.vel_interp(T_N_STEPS,c,m_v_prev_q,this->m_h);
371 std::vector<Eigen::Matrix<double,T_Q::DOF,T_Q::DOF>> v_JqdLdq;
372 std::vector<Eigen::Matrix<double,T_Q::DOF,T_Q::DOF>> v_JqdLdv;
373 std::vector<Eigen::Matrix<double,T_Q::DOF,T_Q::DOF>> v_JvdLdq;
374 std::vector<Eigen::Matrix<double,T_Q::DOF,T_Q::DOF>> v_JvdLdv;
376 for (k=0; k<r; k++) {
378 this->m_problem.JqdLdq(v_pos_interp[k],v_vel_interp[k]));
380 this->m_problem.JqdLdv(v_pos_interp[k],v_vel_interp[k]));
382 this->m_problem.JvdLdq(v_pos_interp[k],v_vel_interp[k]));
384 this->m_problem.JvdLdv(v_pos_interp[k],v_vel_interp[k]));
387 Eigen::Matrix<double,T_Q::DOF,T_Q::DOF> somme =
388 Eigen::Matrix<double,T_Q::DOF,T_Q::DOF>::Zero();
390 for (j=1; j<=T_N_STEPS; j++) {
391 for (i=0; i<T_N_STEPS; i++) {
392 somme = Eigen::Matrix<double,T_Q::DOF,T_Q::DOF>::Zero();
393 for (k=0; k<r; k++) {
396 this->m_h*vv_lag[k][j]*v_JqdLdq[k]
397 +vv_lag_der[k][j]*v_JvdLdq[k])
399 vv_lag[k][j]*v_JqdLdv[k]
400 +(vv_lag_der[k][j]/this->m_h)*v_JvdLdv[k]));
402 J.block(i*T_Q::DOF,(j-1)*T_Q::DOF,T_Q::DOF,T_Q::DOF) = somme;
410 computeInitJacobian (
411 Eigen::Matrix<
double,T_Q::DOF*(T_N_STEPS-1),T_Q::DOF*(T_N_STEPS-1)>& J,
412 const NOXVector<T_Q::DOF*(T_N_STEPS-1)>& q)
421 for (nu=0; nu<T_N_STEPS-1; nu++) {
422 m_v_prev_q[nu+1] = T_Q(q.segment(nu*T_Q::DOF,T_Q::DOF));
427 std::vector<double> w = GaussLegendre::weights(r);
428 std::vector<double> c = GaussLegendre::dates(r);
431 std::vector<std::vector<double>> vv_lag =
432 this->m_interp.polynomials(T_N_STEPS,c);
433 std::vector<std::vector<double>> vv_lag_der =
434 this->m_interp.polynomials_derivatives(T_N_STEPS,c);
437 std::vector<T_Q> v_pos_interp =
438 m_interp.pos_interp(T_N_STEPS,c,m_v_prev_q);
439 std::vector<T_Q> v_vel_interp =
440 m_interp.vel_interp(T_N_STEPS,c,m_v_prev_q,this->m_h);
442 std::vector<Eigen::Matrix<double,T_Q::DOF,T_Q::DOF>> v_JqdLdq;
443 std::vector<Eigen::Matrix<double,T_Q::DOF,T_Q::DOF>> v_JqdLdv;
444 std::vector<Eigen::Matrix<double,T_Q::DOF,T_Q::DOF>> v_JvdLdq;
445 std::vector<Eigen::Matrix<double,T_Q::DOF,T_Q::DOF>> v_JvdLdv;
447 for (k=0; k<r; k++) {
449 this->m_problem.JqdLdq(v_pos_interp[k],v_vel_interp[k]));
451 this->m_problem.JqdLdv(v_pos_interp[k],v_vel_interp[k]));
453 this->m_problem.JvdLdq(v_pos_interp[k],v_vel_interp[k]));
455 this->m_problem.JvdLdv(v_pos_interp[k],v_vel_interp[k]));
458 Eigen::Matrix<double,T_Q::DOF,T_Q::DOF> somme =
459 Eigen::Matrix<double,T_Q::DOF,T_Q::DOF>::Zero();
461 for (j=1; j<T_N_STEPS; j++) {
462 for (i=1; i<T_N_STEPS; i++) {
463 somme = Eigen::Matrix<double,T_Q::DOF,T_Q::DOF>::Zero();
464 for (k=0; k<r; k++) {
465 somme += w[k]*(vv_lag[k][i]*(
466 this->m_h*vv_lag[k][j]*v_JqdLdq[k]
467 +vv_lag_der[k][j]*v_JvdLdq[k])
469 vv_lag[k][j]*v_JqdLdv[k]
470 +(vv_lag_der[k][j]/this->m_h)*v_JvdLdv[k]));
472 J.block((i-1)*T_Q::DOF,(j-1)*T_Q::DOF,T_Q::DOF,T_Q::DOF) = somme;
480 template <
typename T_M,
493 { m_internals = internals; }
497 {
return m_internals->initGetInitialGuess(); }
500 updateInitialPosition (
const NOXVector<T_Q::DOF*(T_N_STEPS-1)>& q)
501 { m_internals->updateInitialPosition(q); }
506 const NOXVector<T_Q::DOF*(T_N_STEPS-1)>& q)
507 {
return m_internals->computeInitF(f,q); }
511 Eigen::Matrix<
double,T_Q::DOF*(T_N_STEPS-1),T_Q::DOF*(T_N_STEPS-1)>& J,
512 const NOXVector<T_Q::DOF*(T_N_STEPS-1)>& q)
513 {
return m_internals->computeInitJacobian(J,q); }
Definition: GalerkinStepInternals.hpp:484
Definition: Abstract_Problem.hpp:10
std::vector< T_Q > m_v_cur_q
Definition: GalerkinStepInternals.hpp:125
Definition: Abstract_LieProblem.hpp:6
bool computeJacobian(Eigen::Matrix< double, T_Q::DOF *T_N_STEPS, T_Q::DOF *T_N_STEPS > &J, const NOXVector< T_Q::DOF *T_N_STEPS > &q)
Definition: GalerkinStepInternals.hpp:334
Definition: Abstract_StepInternals.hpp:13
Definition: GalerkinStepInternals.hpp:118
Definition: LagrangeInterpolation.hpp:152
std::vector< T_Q > m_v_prev_q
Definition: GalerkinStepInternals.hpp:128
Definition: NOXVector.hpp:14
Definition: Abstract_NOXStep.hpp:12