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, typename B, typename C>
84 inline static auto action(A &&t_w_vee, B &&theta, C &&t_A) {
85 return actionImpl(std::forward<A>(t_w_vee), std::forward<B>(theta),
86 std::forward<C>(t_A));
87 }
88
89 template <typename A, typename B>
90 inline static auto diffJl(A &&t_w_vee, B &&theta) {
91 return diffJlImpl(std::forward<A>(t_w_vee), std::forward<B>(theta));
92 }
93
94 template <typename A, typename B>
95 inline static auto diffJr(A &&t_w_vee, B &&theta) {
96 return diffJrImpl(std::forward<A>(t_w_vee), std::forward<B>(theta));
97 }
98
99 template <typename A, typename B>
100 inline static auto diffExp(A &&t_w_vee, B &&theta) {
101 return diffExpImpl(std::forward<A>(t_w_vee), std::forward<B>(theta));
102 }
103
104 template <typename A, typename B>
105 inline static auto diffDiffExp(A &&t_w_vee, B &&theta) {
106 return diffDiffExpImpl(std::forward<A>(t_w_vee), std::forward<B>(theta));
107 }
108
109 // w = Jl(omega) * delta_omega (spatial infinitesimal rotation vector)
110 template <typename T1, typename T2, typename T3>
111 inline static auto spatialSpin(T1 &&t_w_vee, T2 theta, T3 &&t_delta_w_vee) {
112 return spatialSpinImpl(std::forward<T1>(t_w_vee), theta,
113 std::forward<T3>(t_delta_w_vee));
114 }
115
116 // W = hat( Jl(omega) * delta_omega ) = deltaR * R^T
117 template <typename T1, typename T2, typename T3>
118 inline static auto spatialSpinHat(T1 &&t_w_vee, T2 theta,
119 T3 &&t_delta_w_vee) {
120 return spatialSpinHatImpl(std::forward<T1>(t_w_vee), theta,
121 std::forward<T3>(t_delta_w_vee));
122 }
123
124 // a = Jr(omega) * delta_omega (material/body infinitesimal rotation vector)
125 template <typename T1, typename T2, typename T3>
126 inline static auto materialSpin(T1 &&t_w_vee, T2 theta, T3 &&t_delta_w_vee) {
127 return materialSpinImpl(std::forward<T1>(t_w_vee), theta,
128 std::forward<T3>(t_delta_w_vee));
129 }
130
131 // A = hat( Jr(omega) * delta_omega ) = R^T * deltaR
132 template <typename T1, typename T2, typename T3>
133 inline static auto materialSpinHat(T1 &&t_w_vee, T2 theta,
134 T3 &&t_delta_w_vee) {
135 return materialSpinHatImpl(std::forward<T1>(t_w_vee), theta,
136 std::forward<T3>(t_delta_w_vee));
137 }
138
139 // Intrinsic continuum variation: deltaR = R * A, with A in so(3)
140 template <typename T1, typename T2, typename T3>
141 inline static auto deltaR(T1 &&t_w_vee, T2 theta, T3 &&t_A_hat) {
142 return deltaRImpl(std::forward<T1>(t_w_vee), theta,
143 std::forward<T3>(t_A_hat));
144 }
145
146
147private:
148 inline static constexpr int dim = 3;
149 inline static FTENSOR_INDEX(dim, i);
150 inline static FTENSOR_INDEX(dim, j);
151 inline static FTENSOR_INDEX(dim, k);
152 inline static FTENSOR_INDEX(dim, l);
153 inline static FTENSOR_INDEX(dim, m);
154 inline static FTENSOR_INDEX(dim, n);
155
156 template <typename T>
157 inline static auto getVeeImpl(const FTensor::Tensor2<T, dim, dim> &t_w_hat) {
158 using D = typename TensorTypeExtractor<T>::Type;
160 t_w_vee(k) = (levi_civita(i, j, k) * t_w_hat(i, j)) / 2;
161 return t_w_vee;
162 }
163
164 template <typename T>
165 inline static auto getHatImpl(const FTensor::Tensor1<T, dim> &t_w_vee) {
166 using D = typename TensorTypeExtractor<T>::Type;
168 t_w_hat(i, j) = levi_civita(i, j, k) * t_w_vee(k);
169 return t_w_hat;
170 }
171
172 template <typename T1, typename T2, typename T3>
173 inline static auto genericFormImpl(const FTensor::Tensor1<T1, dim> &t_w_vee,
174 const T2 alpha, const T3 beta) {
175 using D = typename TensorTypeExtractor<T1>::Type;
177 auto t_hat = getHat(t_w_vee);
178 t_X(i, j) = FTensor::Kronecker_Delta<int>()(i, j) + alpha * t_hat(i, j) +
179 beta * (t_hat(i, k) * t_hat(k, j));
180 return t_X;
181 }
182
183 template <typename T1, typename T2>
184 inline static auto expImpl(const FTensor::Tensor1<T1, dim> &t_w_vee,
185 const T2 theta) {
186 if (fabs(theta) < std::numeric_limits<T2>::epsilon()) {
187 return genericFormImpl(t_w_vee, 1, 0.5);
188 }
189 const auto s = sin(theta);
190 const auto s_half = sin(theta / 2);
191 const auto a = s / theta;
192 const auto b = 2 * (s_half / theta) * (s_half / theta);
193 return genericFormImpl(t_w_vee, a, b);
194 }
195
196 template <typename T1, typename T2>
197 inline static auto diffExpImpl(const FTensor::Tensor1<T1, dim> &t_w_vee,
198 const T2 theta) {
199
200 auto get_tensor = [&t_w_vee](auto a, auto diff_a, auto b, auto diff_b) {
201 FTENSOR_INDEX(3, i);
202 FTENSOR_INDEX(3, j);
203 FTENSOR_INDEX(3, k);
204 FTENSOR_INDEX(3, l);
205
206 using D = typename TensorTypeExtractor<T1>::Type;
208 auto t_hat = getHat(t_w_vee);
209 t_diff_exp(i, j, k) =
210
211 a * FTensor::levi_civita<int>(i, j, k)
212
213 +
214
215 diff_a * t_hat(i, j) * t_w_vee(k)
216
217 +
218
219 b * (t_hat(i, l) * FTensor::levi_civita<int>(l, j, k) +
220 FTensor::levi_civita<int>(i, l, k) * t_hat(l, j))
221
222 +
223
224 diff_b * t_hat(i, l) * t_hat(l, j) * t_w_vee(k);
225
226 return t_diff_exp;
227 };
228
229 if (fabs(theta) < std::numeric_limits<T2>::epsilon()) {
230 return get_tensor(1., -1. / 3., 1. / 2., -1. / 12);
231 }
232
233 const auto ss = sin(theta);
234 const auto a = ss / theta;
235
236 const auto theta2 = theta * theta;
237 const auto cc = cos(theta);
238 const auto diff_a = (theta * cc - ss) / (theta2 * theta);
239
240 const auto ss_2 = sin(theta / 2.);
241 // const auto cc_2 = cos(theta / 2.);
242 const auto b = 2. * ss_2 * ss_2 / theta2;
243 const auto diff_b = (-2 + 2 * cc + theta * ss) / (theta2 * theta2);
244
245 return get_tensor(a, diff_a, b, diff_b);
246 }
247
248 template <typename T1, typename T2>
249 inline static auto diffDiffExpImpl(const FTensor::Tensor1<T1, dim> &t_w_vee,
250 const T2 theta) {
251
252 auto get_tensor = [&t_w_vee](auto a, auto diff_a, auto diff_diff_a, auto b,
253 auto diff_b, auto diff_diff_b) {
254 FTENSOR_INDEX(3, i);
255 FTENSOR_INDEX(3, j);
256 FTENSOR_INDEX(3, k);
257 FTENSOR_INDEX(3, l);
258 FTENSOR_INDEX(3, m);
259
260 constexpr auto t_kd = FTensor::Kronecker_Delta<double>();
261
262 using D = typename TensorTypeExtractor<T1>::Type;
263 FTensor::Tensor4<D, 3, 3, 3, 3> t_diff_diff_exp;
264
265 auto t_hat = getHat(t_w_vee);
266 t_diff_diff_exp(i, j, k, m) =
267
268 diff_a * FTensor::levi_civita<int>(i, j, k) * t_w_vee(m)
269
270 +
271
272 diff_a * (
273
274 t_hat(i, j) * t_kd(k, m) +
275 FTensor::levi_civita<int>(i, j, m) * t_w_vee(k)
276
277 )
278
279 +
280
281 diff_diff_a * t_hat(i, j) * t_w_vee(k) * t_w_vee(m)
282
283 +
284
285 b * (FTensor::levi_civita<int>(i, l, m) *
286 FTensor::levi_civita<int>(l, j, k) +
287 FTensor::levi_civita<int>(i, l, k) *
288 FTensor::levi_civita<int>(l, j, m))
289
290 +
291
292 diff_b * ((t_hat(i, l) * FTensor::levi_civita<int>(l, j, k) +
293 FTensor::levi_civita<int>(i, l, k) * t_hat(l, j)) *
294 t_w_vee(m))
295
296 +
297
298 diff_b *
299 (
300
301 t_hat(i, l) * t_hat(l, j) * t_kd(k, m)
302
303 +
304
305 FTensor::levi_civita<int>(i, l, m) * t_hat(l, j) * t_w_vee(k)
306
307 +
308
309 t_hat(i, l) * FTensor::levi_civita<int>(l, j, m) * t_w_vee(k)
310
311 )
312
313 +
314
315 diff_diff_b * t_hat(i, l) * t_hat(l, j) * t_w_vee(k) * t_w_vee(m);
316
317 return t_diff_diff_exp;
318 };
319
320 if (fabs(theta) < std::numeric_limits<T2>::epsilon()) {
321 return get_tensor(1., -1. / 3., 1. / 15, 1. / 2, -1. / 12, 1. / 90);
322 }
323
324 const auto ss = sin(theta);
325 const auto a = ss / theta;
326
327 const auto theta2 = theta * theta;
328 const auto cc = cos(theta);
329 const auto diff_a = (theta * cc - ss) / (theta2 * theta);
330 const auto diff_diff_a =
331 (3. * ss - 3. * theta * cc - theta2 * ss) / (theta2 * theta2 * theta);
332
333 const auto ss_2 = sin(theta / 2.);
334 const auto b = 2. * ss_2 * ss_2 / theta2;
335 const auto diff_b = (-2 + 2 * cc + theta * ss) / (theta2 * theta2);
336 const auto diff_diff_b = (theta2 * cc - 5. * theta * ss - 8. * cc + 8.) /
337 (theta2 * theta2 * theta2);
338
339 return get_tensor(a, diff_a, diff_diff_a, b, diff_b, diff_diff_b);
340 }
341
342 template <typename T1, typename T2>
343 inline static auto JlImpl(const FTensor::Tensor1<T1, dim> &t_w_vee,
344 const T2 &theta) {
345 if (fabs(theta) < std::numeric_limits<T2>::epsilon()) {
346 return genericFormImpl(t_w_vee, 0.5, 1. / 6.);
347 }
348 const auto s = sin(theta);
349 const auto s_half = sin(theta / 2);
350 const auto a = 2 * (s_half / theta) * (s_half / theta);
351 const auto b = ((theta - s) / theta) / theta / theta;
352 return genericFormImpl(t_w_vee, a, b);
353 }
354
355 template <typename T1, typename T2>
356 inline static auto JrImpl(const FTensor::Tensor1<T1, dim> &t_w_vee,
357 const T2 theta) {
358 if (fabs(theta) < std::numeric_limits<T2>::epsilon()) {
359 return genericFormImpl(t_w_vee, -0.5, 1. / 6.);
360 }
361 const auto s = sin(theta);
362 const auto s_half = sin(theta / 2);
363 const auto a = 2 * (s_half / theta) * (s_half / theta);
364 const auto b = ((theta - s) / theta) / theta / theta;
365 return genericFormImpl(t_w_vee, -a, b);
366 }
367
368 // private helper
369 template <typename T1, typename T2, typename T3, typename T4, typename T5>
370 inline static auto
371 genericDiffFormImpl(const FTensor::Tensor1<T1, dim> &t_w_vee, const T2 alpha,
372 const T3 diff_alpha, const T4 beta, const T5 diff_beta) {
373 FTENSOR_INDEX(3, i);
374 FTENSOR_INDEX(3, j);
375 FTENSOR_INDEX(3, k);
376 FTENSOR_INDEX(3, l);
377
378 using D = typename TensorTypeExtractor<T1>::Type;
380
381 auto t_hat = getHat(t_w_vee);
382
383 t_diff_X(i, j, k) =
384
385 alpha * FTensor::levi_civita<int>(i, j, k)
386
387 +
388
389 diff_alpha * t_hat(i, j) * t_w_vee(k)
390
391 +
392
393 beta * (t_hat(i, l) * FTensor::levi_civita<int>(l, j, k) +
394 FTensor::levi_civita<int>(i, l, k) * t_hat(l, j))
395
396 +
397
398 diff_beta * t_hat(i, l) * t_hat(l, j) * t_w_vee(k);
399
400 return t_diff_X;
401 }
402
403 template <typename T1, typename T2>
404 inline static auto diffJlImpl(const FTensor::Tensor1<T1, dim> &t_w_vee,
405 const T2 theta) {
406 if (fabs(theta) < std::numeric_limits<T2>::epsilon()) {
407 // Taylor:
408 // a = 1/2 - theta^2/24 + ...
409 // diff_a = -1/12 + theta^2/180 + ...
410 // b = 1/6 - theta^2/120 + ...
411 // diff_b = -1/60 + theta^2/1260 + ...
412 return genericDiffFormImpl(t_w_vee, 0.5, -1. / 12., 1. / 6., -1. / 60.);
413 }
414
415 const auto s = sin(theta);
416 const auto c = cos(theta);
417
418 const auto theta2 = theta * theta;
419 const auto theta4 = theta2 * theta2;
420 const auto theta5 = theta4 * theta;
421
422 // Jl = I + a * hat + b * hat^2
423 const auto a = (1. - c) / theta2;
424 const auto diff_a = (theta * s + 2. * c - 2.) / theta4;
425
426 const auto b = (theta - s) / (theta2 * theta);
427 const auto diff_b = (3. * s - theta * c - 2. * theta) / theta5;
428
429 return genericDiffFormImpl(t_w_vee, a, diff_a, b, diff_b);
430 }
431
432 template <typename T1, typename T2>
433 inline static auto diffJrImpl(const FTensor::Tensor1<T1, dim> &t_w_vee,
434 const T2 theta) {
435 if (fabs(theta) < std::numeric_limits<T2>::epsilon()) {
436 // Taylor:
437 // alpha = -1/2 + theta^2/24 + ...
438 // diff_alpha = 1/12 - theta^2/180 + ...
439 // beta = 1/6 - theta^2/120 + ...
440 // diff_beta = -1/60 + theta^2/1260 + ...
441 return genericDiffFormImpl(t_w_vee, -0.5, 1. / 12., 1. / 6., -1. / 60.);
442 }
443
444 const auto s = sin(theta);
445 const auto c = cos(theta);
446
447 const auto theta2 = theta * theta;
448 const auto theta4 = theta2 * theta2;
449 const auto theta5 = theta4 * theta;
450
451 // Jr = I + alpha * hat + beta * hat^2
452 // with alpha = -(1 - cos(theta)) / theta^2
453 const auto alpha = -(1. - c) / theta2;
454 const auto diff_alpha = (2. - 2. * c - theta * s) / theta4;
455 // equivalent:
456 // const auto diff_alpha = -(theta * s + 2. * c - 2.) / theta4;
457
458 const auto beta = (theta - s) / (theta2 * theta);
459 const auto diff_beta = (3. * s - theta * c - 2. * theta) / theta5;
460
461 return genericDiffFormImpl(t_w_vee, alpha, diff_alpha, beta, diff_beta);
462 }
463
464 template <typename T1, typename T2, typename T3>
465 inline static auto
466 actionImpl(const FTensor::Tensor1<T1, dim> &t_w_vee, const T2 theta,
468 using D = typename TensorTypeExtractor<T3>::Type;
470 t_B(i, j) = exp(t_w_vee, theta)(i, k) * t_A(k, j);
471 return t_B;
472 }
473
474 template <typename T1, typename T2, typename T3>
475 inline static auto
476 spatialSpinImpl(const FTensor::Tensor1<T1, dim> &t_w_vee, const T2 theta,
477 const FTensor::Tensor1<T3, dim> &t_delta_w_vee) {
478 using D = typename TensorTypeExtractor<T1>::Type;
480 auto t_Jl = Jl(t_w_vee, theta);
481 t_w(i) = t_Jl(i, j) * t_delta_w_vee(j);
482 return t_w;
483 }
484
485 template <typename T1, typename T2, typename T3>
486 inline static auto
487 spatialSpinHatImpl(const FTensor::Tensor1<T1, dim> &t_w_vee, const T2 theta,
488 const FTensor::Tensor1<T3, dim> &t_delta_w_vee) {
489 auto t_w = spatialSpinImpl(t_w_vee, theta, t_delta_w_vee);
490 return getHat(t_w);
491 }
492
493 template <typename T1, typename T2, typename T3>
494 inline static auto
495 materialSpinImpl(const FTensor::Tensor1<T1, dim> &t_w_vee, const T2 theta,
496 const FTensor::Tensor1<T3, dim> &t_delta_w_vee) {
497 using D = typename TensorTypeExtractor<T1>::Type;
499 auto t_Jr = Jr(t_w_vee, theta);
500 t_a(i) = t_Jr(i, j) * t_delta_w_vee(j);
501 return t_a;
502 }
503
504 template <typename T1, typename T2, typename T3>
505 inline static auto
506 materialSpinHatImpl(const FTensor::Tensor1<T1, dim> &t_w_vee, const T2 theta,
507 const FTensor::Tensor1<T3, dim> &t_delta_w_vee) {
508 auto t_a = materialSpinImpl(t_w_vee, theta, t_delta_w_vee);
509 return getHat(t_a);
510 }
511
512 // deltaR = R * A
513 template <typename T1, typename T2, typename T3>
514 inline static auto deltaRImpl(const FTensor::Tensor1<T1, dim> &t_w_vee,
515 const T2 theta,
516 const FTensor::Tensor2<T3, dim, dim> &t_A_hat) {
517 using D = typename TensorTypeExtractor<T1>::Type;
519 auto t_R = exp(t_w_vee, theta);
520 t_delta_R(i, j) = t_R(i, k) * t_A_hat(k, j);
521 return t_delta_R;
522 }
523
524 // deltaR = R * hat( Jr(omega) * delta_omega )
525 template <typename T1, typename T2, typename T3>
526 inline static auto
528 const T2 theta,
529 const FTensor::Tensor1<T3, dim> &t_delta_w_vee) {
530 auto t_A_hat = materialSpinHatImpl(t_w_vee, theta, t_delta_w_vee);
531 return deltaRImpl(t_w_vee, theta, t_A_hat);
532 }
533
534}; // namespace SO3
535
536}; // 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:105
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:487
static auto Jr(A &&t_w_vee, B &&theta)
Definition Lie.hpp:79
static constexpr int dim
Definition Lie.hpp:148
static auto diffJlImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 theta)
Definition Lie.hpp:404
static auto genericFormImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 alpha, const T3 beta)
Definition Lie.hpp:173
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:371
static auto deltaR(T1 &&t_w_vee, T2 theta, T3 &&t_A_hat)
Definition Lie.hpp:141
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:84
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:466
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:165
static auto JlImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 &theta)
Definition Lie.hpp:343
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:527
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:514
static auto JrImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 theta)
Definition Lie.hpp:356
static auto diffJr(A &&t_w_vee, B &&theta)
Definition Lie.hpp:95
static FTENSOR_INDEX(dim, j)
static auto expImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 theta)
Definition Lie.hpp:184
static auto diffJl(A &&t_w_vee, B &&theta)
Definition Lie.hpp:90
static auto getVeeImpl(const FTensor::Tensor2< T, dim, dim > &t_w_hat)
Definition Lie.hpp:157
static auto diffExp(A &&t_w_vee, B &&theta)
Definition Lie.hpp:100
static auto spatialSpin(T1 &&t_w_vee, T2 theta, T3 &&t_delta_w_vee)
Definition Lie.hpp:111
static auto materialSpin(T1 &&t_w_vee, T2 theta, T3 &&t_delta_w_vee)
Definition Lie.hpp:126
static auto spatialSpinHat(T1 &&t_w_vee, T2 theta, T3 &&t_delta_w_vee)
Definition Lie.hpp:118
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:506
static auto diffExpImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 theta)
Definition Lie.hpp:197
static auto diffJrImpl(const FTensor::Tensor1< T1, dim > &t_w_vee, const T2 theta)
Definition Lie.hpp:433
static auto materialSpinHat(T1 &&t_w_vee, T2 theta, T3 &&t_delta_w_vee)
Definition Lie.hpp:133
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:476
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:495
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:249
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