v0.16.0
Loading...
Searching...
No Matches
Lie.hpp
Go to the documentation of this file.
1/**
2 * @file Lie.hpp
3 * @brief Lie algebra implementation
4 * @version 0.1
5 * @date 2024-12-22
6 *
7 * @copyright Copyright (c) 2024
8 *
9 */
10
11#pragma once
12
13namespace LieGroups {
14
15template <class T> struct TensorTypeExtractorBase {
16 using Type =
17 std::remove_cv_t<std::remove_reference_t<std::remove_pointer_t<T>>>;
18};
19
20template <class T, int I>
21struct TensorTypeExtractorBase<FTensor::PackPtr<T, I>> {
22 using Type =
23 std::remove_cv_t<std::remove_reference_t<std::remove_pointer_t<T>>>;
24};
25
26template <class T, int G>
27struct TensorTypeExtractorBase<FTensor::CursorPtr<T, G>> {
28 using Type =
29 std::remove_cv_t<std::remove_reference_t<std::remove_pointer_t<T>>>;
30};
31
32template <class T>
34 : TensorTypeExtractorBase<std::remove_cv_t<std::remove_reference_t<T>>> {};
35
36/**
37 * @brief SO3
38 *
39 * Note that: theta == norm(t_w_vee), and t_w_hat is the skew-symmetric matrix corresponding to t_w_vee.
40 */
41struct SO3 {
42
43 SO3() = delete;
44 ~SO3() = delete;
45
46 template <typename T> inline static auto getVee(T &&w1, T &&w2, T &&w3) {
48
49 std::forward<T>(w1), std::forward<T>(w2), std::forward<T>(w3)
50
51 );
52 }
53
54 template <typename T> inline static auto getHat(T &&w1, T &&w2, T &&w3) {
55 auto t_w_vee =
56 getVee(std::forward<T>(w1), std::forward<T>(w2), std::forward<T>(w3));
57 return getHatImpl(t_w_vee);
58 }
59
60 template <typename A> inline static auto getVee(A &&t_w_hat) {
61 return getVeeImpl(std::forward<A>(t_w_hat));
62 }
63
64 template <typename A> inline static auto getHat(A &&t_w_vee) {
65 return getHatImpl(std::forward<A>(t_w_vee));
66 }
67
68 template <typename A, typename B>
69 inline static auto exp(A &&t_w_vee, B &&theta) {
70 return expImpl(std::forward<A>(t_w_vee), std::forward<B>(theta));
71 }
72
73 template <typename A, typename B>
74 inline static auto Jl(A &&t_w_vee, B &&theta) {
75 return JlImpl(std::forward<A>(t_w_vee), std::forward<B>(theta));
76 }
77
78 template <typename A, typename B>
79 inline static auto Jr(A &&t_w_vee, B &&theta) {
80 return JrImpl(std::forward<A>(t_w_vee), std::forward<B>(theta));
81 }
82
83 template <typename A> inline static auto right_jacobian(A &&t_w_vee) {
84 const auto theta = t_w_vee.l2();
85 return Jr(std::forward<A>(t_w_vee), theta);
86 }
87
88 template <typename A, typename B, typename C>
89 inline static auto action(A &&t_w_vee, B &&theta, C &&t_A) {
90 return actionImpl(std::forward<A>(t_w_vee), std::forward<B>(theta),
91 std::forward<C>(t_A));
92 }
93
94 template <typename A, typename B>
95 inline static auto diffJl(A &&t_w_vee, B &&theta) {
96 return diffJlImpl(std::forward<A>(t_w_vee), std::forward<B>(theta));
97 }
98
99 template <typename A, typename B>
100 inline static auto diffJr(A &&t_w_vee, B &&theta) {
101 return diffJrImpl(std::forward<A>(t_w_vee), std::forward<B>(theta));
102 }
103
104 template <typename A, typename B>
105 inline static auto diffExp(A &&t_w_vee, B &&theta) {
106 return diffExpImpl(std::forward<A>(t_w_vee), std::forward<B>(theta));
107 }
108
109 template <typename A, typename B>
110 inline static auto diffDiffExp(A &&t_w_vee, B &&theta) {
111 return diffDiffExpImpl(std::forward<A>(t_w_vee), std::forward<B>(theta));
112 }
113
114 // w = Jl(omega) * delta_omega (spatial infinitesimal rotation vector)
115 template <typename T1, typename T2, typename T3>
116 inline static auto spatialSpin(T1 &&t_w_vee, T2 theta, T3 &&t_delta_w_vee) {
117 return spatialSpinImpl(std::forward<T1>(t_w_vee), theta,
118 std::forward<T3>(t_delta_w_vee));
119 }
120
121 // W = hat( Jl(omega) * delta_omega ) = deltaR * R^T
122 template <typename T1, typename T2, typename T3>
123 inline static auto spatialSpinHat(T1 &&t_w_vee, T2 theta,
124 T3 &&t_delta_w_vee) {
125 return spatialSpinHatImpl(std::forward<T1>(t_w_vee), theta,
126 std::forward<T3>(t_delta_w_vee));
127 }
128
129 // a = Jr(omega) * delta_omega (material/body infinitesimal rotation vector)
130 template <typename T1, typename T2, typename T3>
131 inline static auto materialSpin(T1 &&t_w_vee, T2 theta, T3 &&t_delta_w_vee) {
132 return materialSpinImpl(std::forward<T1>(t_w_vee), theta,
133 std::forward<T3>(t_delta_w_vee));
134 }
135
136 // A = hat( Jr(omega) * delta_omega ) = R^T * deltaR
137 template <typename T1, typename T2, typename T3>
138 inline static auto materialSpinHat(T1 &&t_w_vee, T2 theta,
139 T3 &&t_delta_w_vee) {
140 return materialSpinHatImpl(std::forward<T1>(t_w_vee), theta,
141 std::forward<T3>(t_delta_w_vee));
142 }
143
144 // Intrinsic continuum variation: deltaR = R * A, with A in so(3)
145 template <typename T1, typename T2, typename T3>
146 inline static auto deltaR(T1 &&t_w_vee, T2 theta, T3 &&t_A_hat) {
147 return deltaRImpl(std::forward<T1>(t_w_vee), theta,
148 std::forward<T3>(t_A_hat));
149 }
150
151
152private:
153 inline static constexpr int dim = 3;
154 inline static FTENSOR_INDEX(dim, i);
155 inline static FTENSOR_INDEX(dim, j);
156 inline static FTENSOR_INDEX(dim, k);
157 inline static FTENSOR_INDEX(dim, l);
158 inline static FTENSOR_INDEX(dim, m);
159 inline static FTENSOR_INDEX(dim, n);
160
161 template <typename T>
162 inline static auto getVeeImpl(const FTensor::Tensor2<T, dim, dim> &t_w_hat) {
163 using D = typename TensorTypeExtractor<T>::Type;
165 t_w_vee(k) = (levi_civita(i, j, k) * t_w_hat(i, j)) / 2;
166 return t_w_vee;
167 }
168
169 template <typename T>
170 inline static auto getHatImpl(const FTensor::Tensor1<T, dim> &t_w_vee) {
171 using D = typename TensorTypeExtractor<T>::Type;
173 t_w_hat(i, j) = levi_civita(i, j, k) * t_w_vee(k);
174 return t_w_hat;
175 }
176
177 template <typename T1, typename T2, typename T3>
178 inline static auto genericFormImpl(const FTensor::Tensor1<T1, dim> &t_w_vee,
179 const T2 alpha, const T3 beta) {
180 using D = typename TensorTypeExtractor<T1>::Type;
182 auto t_hat = getHat(t_w_vee);
183 t_X(i, j) = FTensor::Kronecker_Delta<int>()(i, j) + alpha * t_hat(i, j) +
184 beta * (t_hat(i, k) * t_hat(k, j));
185 return t_X;
186 }
187
188 template <typename T1, typename T2>
189 inline static auto expImpl(const FTensor::Tensor1<T1, dim> &t_w_vee,
190 const T2 theta) {
191 if (fabs(theta) < std::numeric_limits<T2>::epsilon()) {
192 return genericFormImpl(t_w_vee, 1, 0.5);
193 }
194 const auto s = sin(theta);
195 const auto s_half = sin(theta / 2);
196 const auto a = s / theta;
197 const auto b = 2 * (s_half / theta) * (s_half / theta);
198 return genericFormImpl(t_w_vee, a, b);
199 }
200
201 template <typename T1, typename T2>
202 inline static auto diffExpImpl(const FTensor::Tensor1<T1, dim> &t_w_vee,
203 const T2 theta) {
204
205 auto get_tensor = [&t_w_vee](auto a, auto diff_a, auto b, auto diff_b) {
206 FTENSOR_INDEX(3, i);
207 FTENSOR_INDEX(3, j);
208 FTENSOR_INDEX(3, k);
209 FTENSOR_INDEX(3, l);
210
211 using D = typename TensorTypeExtractor<T1>::Type;
213 auto t_hat = getHat(t_w_vee);
214 t_diff_exp(i, j, k) =
215
216 a * FTensor::levi_civita<int>(i, j, k)
217
218 +
219
220 diff_a * t_hat(i, j) * t_w_vee(k)
221
222 +
223
224 b * (t_hat(i, l) * FTensor::levi_civita<int>(l, j, k) +
225 FTensor::levi_civita<int>(i, l, k) * t_hat(l, j))
226
227 +
228
229 diff_b * t_hat(i, l) * t_hat(l, j) * t_w_vee(k);
230
231 return t_diff_exp;
232 };
233
234 if (fabs(theta) < std::numeric_limits<T2>::epsilon()) {
235 return get_tensor(1., -1. / 3., 1. / 2., -1. / 12);
236 }
237
238 const auto ss = sin(theta);
239 const auto a = ss / theta;
240
241 const auto theta2 = theta * theta;
242 const auto cc = cos(theta);
243 const auto diff_a = (theta * cc - ss) / (theta2 * theta);
244
245 const auto ss_2 = sin(theta / 2.);
246 // const auto cc_2 = cos(theta / 2.);
247 const auto b = 2. * ss_2 * ss_2 / theta2;
248 const auto diff_b = (-2 + 2 * cc + theta * ss) / (theta2 * theta2);
249
250 return get_tensor(a, diff_a, b, diff_b);
251 }
252
253 template <typename T1, typename T2>
254 inline static auto diffDiffExpImpl(const FTensor::Tensor1<T1, dim> &t_w_vee,
255 const T2 theta) {
256
257 auto get_tensor = [&t_w_vee](auto a, auto diff_a, auto diff_diff_a, auto b,
258 auto diff_b, auto diff_diff_b) {
259 FTENSOR_INDEX(3, i);
260 FTENSOR_INDEX(3, j);
261 FTENSOR_INDEX(3, k);
262 FTENSOR_INDEX(3, l);
263 FTENSOR_INDEX(3, m);
264
265 constexpr auto t_kd = FTensor::Kronecker_Delta<double>();
266
267 using D = typename TensorTypeExtractor<T1>::Type;
268 FTensor::Tensor4<D, 3, 3, 3, 3> t_diff_diff_exp;
269
270 auto t_hat = getHat(t_w_vee);
271 t_diff_diff_exp(i, j, k, m) =
272
273 diff_a * FTensor::levi_civita<int>(i, j, k) * t_w_vee(m)
274
275 +
276
277 diff_a * (
278
279 t_hat(i, j) * t_kd(k, m) +
280 FTensor::levi_civita<int>(i, j, m) * t_w_vee(k)
281
282 )
283
284 +
285
286 diff_diff_a * t_hat(i, j) * t_w_vee(k) * t_w_vee(m)
287
288 +
289
290 b * (FTensor::levi_civita<int>(i, l, m) *
291 FTensor::levi_civita<int>(l, j, k) +
292 FTensor::levi_civita<int>(i, l, k) *
293 FTensor::levi_civita<int>(l, j, m))
294
295 +
296
297 diff_b * ((t_hat(i, l) * FTensor::levi_civita<int>(l, j, k) +
298 FTensor::levi_civita<int>(i, l, k) * t_hat(l, j)) *
299 t_w_vee(m))
300
301 +
302
303 diff_b *
304 (
305
306 t_hat(i, l) * t_hat(l, j) * t_kd(k, m)
307
308 +
309
310 FTensor::levi_civita<int>(i, l, m) * t_hat(l, j) * t_w_vee(k)
311
312 +
313
314 t_hat(i, l) * FTensor::levi_civita<int>(l, j, m) * t_w_vee(k)
315
316 )
317
318 +
319
320 diff_diff_b * t_hat(i, l) * t_hat(l, j) * t_w_vee(k) * t_w_vee(m);
321
322 return t_diff_diff_exp;
323 };
324
325 if (fabs(theta) < std::numeric_limits<T2>::epsilon()) {
326 return get_tensor(1., -1. / 3., 1. / 15, 1. / 2, -1. / 12, 1. / 90);
327 }
328
329 const auto ss = sin(theta);
330 const auto a = ss / theta;
331
332 const auto theta2 = theta * theta;
333 const auto cc = cos(theta);
334 const auto diff_a = (theta * cc - ss) / (theta2 * theta);
335 const auto diff_diff_a =
336 (3. * ss - 3. * theta * cc - theta2 * ss) / (theta2 * theta2 * theta);
337
338 const auto ss_2 = sin(theta / 2.);
339 const auto b = 2. * ss_2 * ss_2 / theta2;
340 const auto diff_b = (-2 + 2 * cc + theta * ss) / (theta2 * theta2);
341 const auto diff_diff_b = (theta2 * cc - 5. * theta * ss - 8. * cc + 8.) /
342 (theta2 * theta2 * theta2);
343
344 return get_tensor(a, diff_a, diff_diff_a, b, diff_b, diff_diff_b);
345 }
346
347 template <typename T1, typename T2>
348 inline static auto JlImpl(const FTensor::Tensor1<T1, dim> &t_w_vee,
349 const T2 &theta) {
350 if (fabs(theta) < std::numeric_limits<T2>::epsilon()) {
351 return genericFormImpl(t_w_vee, 0.5, 1. / 6.);
352 }
353 const auto s = sin(theta);
354 const auto s_half = sin(theta / 2);
355 const auto a = 2 * (s_half / theta) * (s_half / theta);
356 const auto b = ((theta - s) / theta) / theta / theta;
357 return genericFormImpl(t_w_vee, a, b);
358 }
359
360 template <typename T1, typename T2>
361 inline static auto JrImpl(const FTensor::Tensor1<T1, dim> &t_w_vee,
362 const T2 theta) {
363 if (fabs(theta) < std::numeric_limits<T2>::epsilon()) {
364 return genericFormImpl(t_w_vee, -0.5, 1. / 6.);
365 }
366 const auto s = sin(theta);
367 const auto s_half = sin(theta / 2);
368 const auto a = 2 * (s_half / theta) * (s_half / theta);
369 const auto b = ((theta - s) / theta) / theta / theta;
370 return genericFormImpl(t_w_vee, -a, b);
371 }
372
373 // private helper
374 template <typename T1, typename T2, typename T3, typename T4, typename T5>
375 inline static auto
376 genericDiffFormImpl(const FTensor::Tensor1<T1, dim> &t_w_vee, const T2 alpha,
377 const T3 diff_alpha, const T4 beta, const T5 diff_beta) {
378 FTENSOR_INDEX(3, i);
379 FTENSOR_INDEX(3, j);
380 FTENSOR_INDEX(3, k);
381 FTENSOR_INDEX(3, l);
382
383 using D = typename TensorTypeExtractor<T1>::Type;
385
386 auto t_hat = getHat(t_w_vee);
387
388 t_diff_X(i, j, k) =
389
390 alpha * FTensor::levi_civita<int>(i, j, k)
391
392 +
393
394 diff_alpha * t_hat(i, j) * t_w_vee(k)
395
396 +
397
398 beta * (t_hat(i, l) * FTensor::levi_civita<int>(l, j, k) +
399 FTensor::levi_civita<int>(i, l, k) * t_hat(l, j))
400
401 +
402
403 diff_beta * t_hat(i, l) * t_hat(l, j) * t_w_vee(k);
404
405 return t_diff_X;
406 }
407
408 template <typename T1, typename T2>
409 inline static auto diffJlImpl(const FTensor::Tensor1<T1, dim> &t_w_vee,
410 const T2 theta) {
411 if (fabs(theta) < std::numeric_limits<T2>::epsilon()) {
412 // Taylor:
413 // a = 1/2 - theta^2/24 + ...
414 // diff_a = -1/12 + theta^2/180 + ...
415 // b = 1/6 - theta^2/120 + ...
416 // diff_b = -1/60 + theta^2/1260 + ...
417 return genericDiffFormImpl(t_w_vee, 0.5, -1. / 12., 1. / 6., -1. / 60.);
418 }
419
420 const auto s = sin(theta);
421 const auto c = cos(theta);
422
423 const auto theta2 = theta * theta;
424 const auto theta4 = theta2 * theta2;
425 const auto theta5 = theta4 * theta;
426
427 // Jl = I + a * hat + b * hat^2
428 const auto a = (1. - c) / theta2;
429 const auto diff_a = (theta * s + 2. * c - 2.) / theta4;
430
431 const auto b = (theta - s) / (theta2 * theta);
432 const auto diff_b = (3. * s - theta * c - 2. * theta) / theta5;
433
434 return genericDiffFormImpl(t_w_vee, a, diff_a, b, diff_b);
435 }
436
437 template <typename T1, typename T2>
438 inline static auto diffJrImpl(const FTensor::Tensor1<T1, dim> &t_w_vee,
439 const T2 theta) {
440 if (fabs(theta) < std::numeric_limits<T2>::epsilon()) {
441 // Taylor:
442 // alpha = -1/2 + theta^2/24 + ...
443 // diff_alpha = 1/12 - theta^2/180 + ...
444 // beta = 1/6 - theta^2/120 + ...
445 // diff_beta = -1/60 + theta^2/1260 + ...
446 return genericDiffFormImpl(t_w_vee, -0.5, 1. / 12., 1. / 6., -1. / 60.);
447 }
448
449 const auto s = sin(theta);
450 const auto c = cos(theta);
451
452 const auto theta2 = theta * theta;
453 const auto theta4 = theta2 * theta2;
454 const auto theta5 = theta4 * theta;
455
456 // Jr = I + alpha * hat + beta * hat^2
457 // with alpha = -(1 - cos(theta)) / theta^2
458 const auto alpha = -(1. - c) / theta2;
459 const auto diff_alpha = (2. - 2. * c - theta * s) / theta4;
460 // equivalent:
461 // const auto diff_alpha = -(theta * s + 2. * c - 2.) / theta4;
462
463 const auto beta = (theta - s) / (theta2 * theta);
464 const auto diff_beta = (3. * s - theta * c - 2. * theta) / theta5;
465
466 return genericDiffFormImpl(t_w_vee, alpha, diff_alpha, beta, diff_beta);
467 }
468
469 template <typename T1, typename T2, typename T3>
470 inline static auto
471 actionImpl(const FTensor::Tensor1<T1, dim> &t_w_vee, const T2 theta,
473 using D = typename TensorTypeExtractor<T3>::Type;
475 t_B(i, j) = exp(t_w_vee, theta)(i, k) * t_A(k, j);
476 return t_B;
477 }
478
479 template <typename T1, typename T2, typename T3>
480 inline static auto
481 spatialSpinImpl(const FTensor::Tensor1<T1, dim> &t_w_vee, const T2 theta,
482 const FTensor::Tensor1<T3, dim> &t_delta_w_vee) {
483 using D = typename TensorTypeExtractor<T1>::Type;
485 auto t_Jl = Jl(t_w_vee, theta);
486 t_w(i) = t_Jl(i, j) * t_delta_w_vee(j);
487 return t_w;
488 }
489
490 template <typename T1, typename T2, typename T3>
491 inline static auto
492 spatialSpinHatImpl(const FTensor::Tensor1<T1, dim> &t_w_vee, const T2 theta,
493 const FTensor::Tensor1<T3, dim> &t_delta_w_vee) {
494 auto t_w = spatialSpinImpl(t_w_vee, theta, t_delta_w_vee);
495 return getHat(t_w);
496 }
497
498 template <typename T1, typename T2, typename T3>
499 inline static auto
500 materialSpinImpl(const FTensor::Tensor1<T1, dim> &t_w_vee, const T2 theta,
501 const FTensor::Tensor1<T3, dim> &t_delta_w_vee) {
502 using D = typename TensorTypeExtractor<T1>::Type;
504 auto t_Jr = Jr(t_w_vee, theta);
505 t_a(i) = t_Jr(i, j) * t_delta_w_vee(j);
506 return t_a;
507 }
508
509 template <typename T1, typename T2, typename T3>
510 inline static auto
511 materialSpinHatImpl(const FTensor::Tensor1<T1, dim> &t_w_vee, const T2 theta,
512 const FTensor::Tensor1<T3, dim> &t_delta_w_vee) {
513 auto t_a = materialSpinImpl(t_w_vee, theta, t_delta_w_vee);
514 return getHat(t_a);
515 }
516
517 // deltaR = R * A
518 template <typename T1, typename T2, typename T3>
519 inline static auto deltaRImpl(const FTensor::Tensor1<T1, dim> &t_w_vee,
520 const T2 theta,
521 const FTensor::Tensor2<T3, dim, dim> &t_A_hat) {
522 using D = typename TensorTypeExtractor<T1>::Type;
524 auto t_R = exp(t_w_vee, theta);
525 t_delta_R(i, j) = t_R(i, k) * t_A_hat(k, j);
526 return t_delta_R;
527 }
528
529 // deltaR = R * hat( Jr(omega) * delta_omega )
530 template <typename T1, typename T2, typename T3>
531 inline static auto
533 const T2 theta,
534 const FTensor::Tensor1<T3, dim> &t_delta_w_vee) {
535 auto t_A_hat = materialSpinHatImpl(t_w_vee, theta, t_delta_w_vee);
536 return deltaRImpl(t_w_vee, theta, t_A_hat);
537 }
538
539}; // namespace SO3
540
541}; // namespace LieGroups
#define FTENSOR_INDEX(DIM, I)
constexpr double a
Kronecker Delta class.
constexpr auto t_kd
FTensor::Index< 'i', SPACE_DIM > i
const double c
speed of light (cm/ns)
double D
const double n
refractive index of diffusive medium
FTensor::Index< 'l', 3 > l
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
Tensors class implemented by Walter Landry.
Definition FTensor.hpp:51
constexpr AssemblyType A
FTensor::Index< 'm', 3 > m
static auto diffDiffExp(A &&t_w_vee, B &&theta)
Definition Lie.hpp:110
static auto spatialSpinHatImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 theta, const FTensor::Tensor1< T3, dim > &t_delta_w_vee)
Definition Lie.hpp:492
static auto Jr(A &&t_w_vee, B &&theta)
Definition Lie.hpp:79
static constexpr int dim
Definition Lie.hpp:153
static auto diffJlImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 theta)
Definition Lie.hpp:409
static auto genericFormImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 alpha, const T3 beta)
Definition Lie.hpp:178
static auto genericDiffFormImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 alpha, const T3 diff_alpha, const T4 beta, const T5 diff_beta)
Definition Lie.hpp:376
static auto deltaR(T1 &&t_w_vee, T2 theta, T3 &&t_A_hat)
Definition Lie.hpp:146
static auto Jl(A &&t_w_vee, B &&theta)
Definition Lie.hpp:74
static auto action(A &&t_w_vee, B &&theta, C &&t_A)
Definition Lie.hpp:89
static auto actionImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 theta, const FTensor::Tensor2_symmetric< T3, dim > &t_A)
Definition Lie.hpp:471
static FTENSOR_INDEX(dim, l)
static FTENSOR_INDEX(dim, k)
static auto getVee(A &&t_w_hat)
Definition Lie.hpp:60
static auto getHatImpl(const FTensor::Tensor1< T, dim > &t_w_vee)
Definition Lie.hpp:170
static auto JlImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 &theta)
Definition Lie.hpp:348
static auto getHat(T &&w1, T &&w2, T &&w3)
Definition Lie.hpp:54
static auto deltaRImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 theta, const FTensor::Tensor1< T3, dim > &t_delta_w_vee)
Definition Lie.hpp:532
static auto deltaRImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 theta, const FTensor::Tensor2< T3, dim, dim > &t_A_hat)
Definition Lie.hpp:519
static auto JrImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 theta)
Definition Lie.hpp:361
static auto diffJr(A &&t_w_vee, B &&theta)
Definition Lie.hpp:100
static auto right_jacobian(A &&t_w_vee)
Definition Lie.hpp:83
static FTENSOR_INDEX(dim, j)
static auto expImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 theta)
Definition Lie.hpp:189
static auto diffJl(A &&t_w_vee, B &&theta)
Definition Lie.hpp:95
static auto getVeeImpl(const FTensor::Tensor2< T, dim, dim > &t_w_hat)
Definition Lie.hpp:162
static auto diffExp(A &&t_w_vee, B &&theta)
Definition Lie.hpp:105
static auto spatialSpin(T1 &&t_w_vee, T2 theta, T3 &&t_delta_w_vee)
Definition Lie.hpp:116
static auto materialSpin(T1 &&t_w_vee, T2 theta, T3 &&t_delta_w_vee)
Definition Lie.hpp:131
static auto spatialSpinHat(T1 &&t_w_vee, T2 theta, T3 &&t_delta_w_vee)
Definition Lie.hpp:123
static auto materialSpinHatImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 theta, const FTensor::Tensor1< T3, dim > &t_delta_w_vee)
Definition Lie.hpp:511
static auto diffExpImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 theta)
Definition Lie.hpp:202
static auto diffJrImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 theta)
Definition Lie.hpp:438
static auto materialSpinHat(T1 &&t_w_vee, T2 theta, T3 &&t_delta_w_vee)
Definition Lie.hpp:138
static auto spatialSpinImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 theta, const FTensor::Tensor1< T3, dim > &t_delta_w_vee)
Definition Lie.hpp:481
static auto getHat(A &&t_w_vee)
Definition Lie.hpp:64
static FTENSOR_INDEX(dim, n)
static FTENSOR_INDEX(dim, m)
static FTENSOR_INDEX(dim, i)
static auto materialSpinImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 theta, const FTensor::Tensor1< T3, dim > &t_delta_w_vee)
Definition Lie.hpp:500
static auto getVee(T &&w1, T &&w2, T &&w3)
Definition Lie.hpp:46
static auto exp(A &&t_w_vee, B &&theta)
Definition Lie.hpp:69
static auto diffDiffExpImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 theta)
Definition Lie.hpp:254
std::remove_cv_t< std::remove_reference_t< std::remove_pointer_t< T > > > Type
Definition Lie.hpp:29
std::remove_cv_t< std::remove_reference_t< std::remove_pointer_t< T > > > Type
Definition Lie.hpp:23
std::remove_cv_t< std::remove_reference_t< std::remove_pointer_t< T > > > Type
Definition Lie.hpp:17