11 if constexpr (dim == 3)
13 if constexpr (powV == 1)
15 if constexpr (rank == 0)
17 ret += Le(0, 0) * Ri(0, 0) * diffNCombs[0];
19 else if constexpr (rank == 1)
21 ret += Le(0, 0) * Ri(0, 0) * diffNCombs[0 + 1];
22 ret += Le(1, 0) * Ri(1, 0) * diffNCombs[1 + 1];
23 ret += Le(2, 0) * Ri(2, 0) * diffNCombs[2 + 1];
25 else if constexpr (rank == 2)
27 ret += Le(0, 0) * Ri(0, 0) * diffNCombs[0 + 4];
28 ret += Le(1, 0) * Ri(1, 0) * diffNCombs[1 + 4];
29 ret += Le(2, 0) * Ri(2, 0) * diffNCombs[2 + 4];
30 ret += Le(3, 0) * Ri(3, 0) * diffNCombs[3 + 4];
31 ret += Le(4, 0) * Ri(4, 0) * diffNCombs[4 + 4];
32 ret += Le(5, 0) * Ri(5, 0) * diffNCombs[5 + 4];
34 else if constexpr (rank == 3)
36 ret += Le(0, 0) * Ri(0, 0) * diffNCombs[0 + 10];
37 ret += Le(1, 0) * Ri(1, 0) * diffNCombs[1 + 10];
38 ret += Le(2, 0) * Ri(2, 0) * diffNCombs[2 + 10];
39 ret += Le(3, 0) * Ri(3, 0) * diffNCombs[3 + 10];
40 ret += Le(4, 0) * Ri(4, 0) * diffNCombs[4 + 10];
41 ret += Le(5, 0) * Ri(5, 0) * diffNCombs[5 + 10];
42 ret += Le(6, 0) * Ri(6, 0) * diffNCombs[6 + 10];
43 ret += Le(7, 0) * Ri(7, 0) * diffNCombs[7 + 10];
44 ret += Le(8, 0) * Ri(8, 0) * diffNCombs[8 + 10];
45 ret += Le(9, 0) * Ri(9, 0) * diffNCombs[9 + 10];
54 if constexpr (rank == 0)
56 ret += Le(0, 0) * Ri(0, 0) * std::pow(diffNCombs[0], powV);
58 else if constexpr (rank == 1)
60 ret += Le(0, 0) * Ri(0, 0) * std::pow(diffNCombs[0 + 1], powV);
61 ret += Le(1, 0) * Ri(1, 0) * std::pow(diffNCombs[1 + 1], powV);
62 ret += Le(2, 0) * Ri(2, 0) * std::pow(diffNCombs[2 + 1], powV);
64 else if constexpr (rank == 2)
66 ret += Le(0, 0) * Ri(0, 0) * std::pow(diffNCombs[0 + 4], powV);
67 ret += Le(1, 0) * Ri(1, 0) * std::pow(diffNCombs[1 + 4], powV);
68 ret += Le(2, 0) * Ri(2, 0) * std::pow(diffNCombs[2 + 4], powV);
69 ret += Le(3, 0) * Ri(3, 0) * std::pow(diffNCombs[3 + 4], powV);
70 ret += Le(4, 0) * Ri(4, 0) * std::pow(diffNCombs[4 + 4], powV);
71 ret += Le(5, 0) * Ri(5, 0) * std::pow(diffNCombs[5 + 4], powV);
73 else if constexpr (rank == 3)
75 ret += Le(0, 0) * Ri(0, 0) * std::pow(diffNCombs[0 + 10], powV);
76 ret += Le(1, 0) * Ri(1, 0) * std::pow(diffNCombs[1 + 10], powV);
77 ret += Le(2, 0) * Ri(2, 0) * std::pow(diffNCombs[2 + 10], powV);
78 ret += Le(3, 0) * Ri(3, 0) * std::pow(diffNCombs[3 + 10], powV);
79 ret += Le(4, 0) * Ri(4, 0) * std::pow(diffNCombs[4 + 10], powV);
80 ret += Le(5, 0) * Ri(5, 0) * std::pow(diffNCombs[5 + 10], powV);
81 ret += Le(6, 0) * Ri(6, 0) * std::pow(diffNCombs[6 + 10], powV);
82 ret += Le(7, 0) * Ri(7, 0) * std::pow(diffNCombs[7 + 10], powV);
83 ret += Le(8, 0) * Ri(8, 0) * std::pow(diffNCombs[8 + 10], powV);
84 ret += Le(9, 0) * Ri(9, 0) * std::pow(diffNCombs[9 + 10], powV);
94 if constexpr (powV == 1)
96 if constexpr (rank == 0)
98 ret += Le(0) * Ri(0) * diffNCombs2D[0];
100 else if constexpr (rank == 1)
102 ret += Le(0) * Ri(0) * diffNCombs2D[0 + 1];
103 ret += Le(1) * Ri(1) * diffNCombs2D[1 + 1];
105 else if constexpr (rank == 2)
107 ret += Le(0) * Ri(0) * diffNCombs2D[0 + 3];
108 ret += Le(1) * Ri(1) * diffNCombs2D[1 + 3];
109 ret += Le(2) * Ri(2) * diffNCombs2D[2 + 3];
111 else if constexpr (rank == 3)
113 ret += Le(0) * Ri(0) * diffNCombs2D[0 + 6];
114 ret += Le(1) * Ri(1) * diffNCombs2D[1 + 6];
115 ret += Le(2) * Ri(2) * diffNCombs2D[2 + 6];
116 ret += Le(3) * Ri(3) * diffNCombs2D[3 + 6];
125 if constexpr (rank == 0)
127 ret += Le(0) * Ri(0) * std::pow(diffNCombs2D[0], powV);
129 else if constexpr (rank == 1)
131 ret += Le(0) * Ri(0) * std::pow(diffNCombs2D[0 + 1], powV);
132 ret += Le(1) * Ri(1) * std::pow(diffNCombs2D[1 + 1], powV);
134 else if constexpr (rank == 2)
136 ret += Le(0) * Ri(0) * std::pow(diffNCombs2D[0 + 3], powV);
137 ret += Le(1) * Ri(1) * std::pow(diffNCombs2D[1 + 3], powV);
138 ret += Le(2) * Ri(2) * std::pow(diffNCombs2D[2 + 3], powV);
140 else if constexpr (rank == 3)
142 ret += Le(0) * Ri(0) * std::pow(diffNCombs2D[0 + 6], powV);
143 ret += Le(1) * Ri(1) * std::pow(diffNCombs2D[1 + 6], powV);
144 ret += Le(2) * Ri(2) * std::pow(diffNCombs2D[2 + 6], powV);
145 ret += Le(3) * Ri(3) * std::pow(diffNCombs2D[3 + 6], powV);
159 if constexpr (dim == 3)
161 if constexpr (rank == 0)
164 else if constexpr (rank == 1)
168 else if constexpr (rank == 2)
177 Eigen::Matrix3d symTensorR2{
178 {Le(0), Le(3), Le(5)},
179 {Le(3), Le(1), Le(4)},
180 {Le(5), Le(4), Le(2)}};
181 symTensorR2 =
trans * symTensorR2 *
trans.transpose();
182 Le(0) = symTensorR2(0, 0), Le(1) = symTensorR2(1, 1), Le(2) = symTensorR2(2, 2);
183 Le(3) = symTensorR2(0, 1), Le(4) = symTensorR2(1, 2), Le(5) = symTensorR2(0, 2);
185 else if constexpr (rank == 3)
200 symTensorR3(0, 0, 0) = Le(0);
201 symTensorR3(1, 1, 1) = Le(1);
202 symTensorR3(2, 2, 2) = Le(2);
204 symTensorR3(0, 0, 1) = symTensorR3(0, 1, 0) = symTensorR3(1, 0, 0) = Le(3);
205 symTensorR3(0, 1, 1) = symTensorR3(1, 1, 0) = symTensorR3(1, 0, 1) = Le(4);
206 symTensorR3(1, 1, 2) = symTensorR3(1, 2, 1) = symTensorR3(2, 1, 1) = Le(5);
207 symTensorR3(1, 2, 2) = symTensorR3(2, 2, 1) = symTensorR3(2, 1, 2) = Le(6);
208 symTensorR3(0, 2, 2) = symTensorR3(2, 2, 0) = symTensorR3(2, 0, 2) = Le(7);
209 symTensorR3(0, 0, 2) = symTensorR3(0, 2, 0) = symTensorR3(2, 0, 0) = Le(8);
211 symTensorR3(0, 1, 2) = symTensorR3(1, 2, 0) = symTensorR3(2, 0, 1) =
212 symTensorR3(0, 2, 1) = symTensorR3(2, 1, 0) = symTensorR3(1, 0, 2) = Le(9);
217 Le(0) = symTensorR3(0, 0, 0);
218 Le(1) = symTensorR3(1, 1, 1);
219 Le(2) = symTensorR3(2, 2, 2);
220 Le(3) = symTensorR3(0, 0, 1);
221 Le(4) = symTensorR3(0, 1, 1);
222 Le(5) = symTensorR3(1, 1, 2);
223 Le(6) = symTensorR3(1, 2, 2);
224 Le(7) = symTensorR3(0, 2, 2);
225 Le(8) = symTensorR3(0, 0, 2);
226 Le(9) = symTensorR3(0, 1, 2);
235 if constexpr (rank == 0)
238 else if constexpr (rank == 1)
242 else if constexpr (rank == 2)
244 Eigen::Matrix2d symTensorR2{{Le(0), Le(1)},
246 symTensorR2 =
trans * symTensorR2 *
trans.transpose();
247 Le(0) = symTensorR2(0, 0), Le(1) = symTensorR2(0, 1), Le(2) = symTensorR2(1, 1);
249 else if constexpr (rank == 3)
253 symTensorR3(0, 0, 0) = Le(0);
254 symTensorR3(0, 0, 1) = symTensorR3(0, 1, 0) = symTensorR3(1, 0, 0) = Le(1);
255 symTensorR3(0, 1, 1) = symTensorR3(1, 0, 1) = symTensorR3(1, 1, 0) = Le(2);
256 symTensorR3(1, 1, 1) = Le(3);
260 Le(0) = symTensorR3(0, 0, 0);
261 Le(1) = symTensorR3(0, 0, 1);
262 Le(2) = symTensorR3(0, 1, 1);
263 Le(3) = symTensorR3(1, 1, 1);
283 int rows = mat.rows();
284 if constexpr (dim == 2)
288 for (
int iB = 0; iB < mat.cols(); iB++)
290 TransSymDiffOrderTensorV<2, 3>(
291 mat(Eigen::seq(Eigen::fix<6>, Eigen::fix<9>), iB),
292 dXijdXi({0, 1}, {0, 1}));
295 for (
int iB = 0; iB < mat.cols(); iB++)
296 TransSymDiffOrderTensorV<2, 2>(
297 mat(Eigen::seq(Eigen::fix<3>, Eigen::fix<5>), iB),
298 dXijdXi({0, 1}, {0, 1}));
301 mat({1, 2}, EigenAll) = dXijdXi({0, 1}, {0, 1}) * mat({1, 2}, EigenAll);
306 std::cerr << mat.rows() << std::endl;
314 for (
int iB = 0; iB < mat.cols(); iB++)
316 TransSymDiffOrderTensorV<3, 3>(
317 mat(Eigen::seq(Eigen::fix<10>, Eigen::fix<19>), iB),
321 for (
int iB = 0; iB < mat.cols(); iB++)
322 TransSymDiffOrderTensorV<3, 2>(
323 mat(Eigen::seq(Eigen::fix<4>, Eigen::fix<9>), iB),
327 mat({1, 2, 3}, EigenAll) = dXijdXi * mat({1, 2, 3}, EigenAll);
332 std::cerr << mat.rows() << std::endl;
341 int rows = mat.rows();
342 int nBase = mat.cols();
344 int cmaxDiffOrder = ndiff2order<dim>(rows);
345 if (cmaxDiffOrder < 0)
347 std::cerr << mat.rows() << std::endl;
351 if (cmaxDiffOrder == 0)
353 static const auto &diffOperatorIJK2IcDim = getDiffOperatorIJK2I<dim>();
355 out.resize(rows, nBase);
357 static const int nDiffSizC1 = ndiffSizS<dim>(1);
358 static const auto seq0t1 = Eigen::seq(Eigen::fix<1>, Eigen::fix<nDiffSizC1 - 1>);
359 for (
int iB = 0; iB < nBase; iB++)
360 for (
int ii = 1; ii < nDiffSizC1; ii++)
362 int i = dim == 2 ? diffOperatorDimList2D[ii][0] : diffOperatorDimList[ii][0];
363 real &ccv = out(ii, iB);
365 for (
int m = 0; m < dim; m++)
366 ccv += DxiDx(std::get<1>(diffOperatorIJK2IcDim)[i], m) *
367 mat(std::get<1>(diffOperatorIJK2IcDim)[m], iB);
369 mat(seq0t1, EigenAll) = out(seq0t1, EigenAll);
370 if (cmaxDiffOrder == 1)
373 static const int nDiffSizC2 = ndiffSizS<dim>(2);
374 static const auto seq1t2 = Eigen::seq(Eigen::fix<nDiffSizC1>, Eigen::fix<nDiffSizC2 - 1>);
375 for (
int iB = 0; iB < nBase; iB++)
376 for (
int ii = nDiffSizC1; ii < nDiffSizC2; ii++)
378 int i = dim == 2 ? diffOperatorDimList2D[ii][0] : diffOperatorDimList[ii][0];
379 int j = dim == 2 ? diffOperatorDimList2D[ii][1] : diffOperatorDimList[ii][1];
380 real &ccv = out(ii, iB);
382 for (
int m = 0; m < dim; m++)
383 ccv += DxiDx(std::get<2>(diffOperatorIJK2IcDim)[i][j], m) *
384 mat(std::get<1>(diffOperatorIJK2IcDim)[m], iB);
385 for (
int m = 0; m < dim; m++)
386 for (
int n = 0;
n < dim;
n++)
387 ccv += DxiDx(std::get<1>(diffOperatorIJK2IcDim)[i], m) *
388 DxiDx(std::get<1>(diffOperatorIJK2IcDim)[j],
n) *
389 mat(std::get<2>(diffOperatorIJK2IcDim)[m][
n], iB);
391 mat(seq1t2, EigenAll) = out(seq1t2, EigenAll);
392 if (cmaxDiffOrder == 2)
395 static const int nDiffSizC3 = ndiffSizS<dim>(3);
396 static const auto seq2t3 = Eigen::seq(Eigen::fix<nDiffSizC2>, Eigen::fix<nDiffSizC3 - 1>);
397 for (
int iB = 0; iB < nBase; iB++)
398 for (
int ii = nDiffSizC2; ii < nDiffSizC3; ii++)
400 int i = dim == 2 ? diffOperatorDimList2D[ii][0] : diffOperatorDimList[ii][0];
401 int j = dim == 2 ? diffOperatorDimList2D[ii][1] : diffOperatorDimList[ii][1];
402 int k = dim == 2 ? diffOperatorDimList2D[ii][2] : diffOperatorDimList[ii][2];
403 real &ccv = out(ii, iB);
405 for (
int m = 0; m < dim; m++)
406 ccv += DxiDx(std::get<3>(diffOperatorIJK2IcDim)[i][j][k], m) *
407 mat(std::get<1>(diffOperatorIJK2IcDim)[m], iB);
408 for (
int m = 0; m < dim; m++)
409 for (
int n = 0;
n < dim;
n++)
411 DxiDx(std::get<2>(diffOperatorIJK2IcDim)[i][j], m) *
412 DxiDx(std::get<1>(diffOperatorIJK2IcDim)[k],
n) *
413 mat(std::get<2>(diffOperatorIJK2IcDim)[m][
n], iB) +
414 DxiDx(std::get<2>(diffOperatorIJK2IcDim)[i][k], m) *
415 DxiDx(std::get<1>(diffOperatorIJK2IcDim)[j],
n) *
416 mat(std::get<2>(diffOperatorIJK2IcDim)[m][
n], iB) +
417 DxiDx(std::get<2>(diffOperatorIJK2IcDim)[j][k], m) *
418 DxiDx(std::get<1>(diffOperatorIJK2IcDim)[i],
n) *
419 mat(std::get<2>(diffOperatorIJK2IcDim)[m][
n], iB);
420 for (
int m = 0; m < dim; m++)
421 for (
int n = 0;
n < dim;
n++)
422 for (
int p = 0; p < dim; p++)
424 DxiDx(std::get<1>(diffOperatorIJK2IcDim)[i], m) *
425 DxiDx(std::get<1>(diffOperatorIJK2IcDim)[j],
n) *
426 DxiDx(std::get<1>(diffOperatorIJK2IcDim)[k], p) *
427 mat(std::get<3>(diffOperatorIJK2IcDim)[m][
n][p], iB);
429 mat(seq2t3, EigenAll) = out(seq2t3, EigenAll);
430 if (cmaxDiffOrder == 3)
478 static const int nDiffSizCC = ndiffSizS<dim>(maxDiff);
481 static const int nDiffSizC1 = ndiffSizS<dim>(1);
482 Eigen::Matrix<real, 3, 3> Dx_j_Dxi_i;
483 if constexpr (dim == 2)
485 Dx_j_Dxi_i.setZero();
486 Dx_j_Dxi_i(2, 2) = 1;
487 Dx_j_Dxi_i({0, 1}, {0, 1}) = DxDxi({1, 2}, {0, 1});
490 Dx_j_Dxi_i = DxDxi({1, 2, 3}, {0, 1, 2});
491 auto lu_cur = Dx_j_Dxi_i.fullPivLu();
492 Eigen::Matrix<real, 3, 3> Dxi_j_Dx_i = lu_cur.inverse();
494 if constexpr (dim == 2)
495 DxiDx({1, 2}, {0, 1, 2}) = Dxi_j_Dx_i({0, 1}, {0, 1, 2});
497 DxiDx({1, 2, 3}, {0, 1, 2}) = Dxi_j_Dx_i;
501 static const auto &diffOperatorIJK2IcDim = getDiffOperatorIJK2I<dim>();
503 static const int nDiffSizC2 = ndiffSizS<dim>(2);
504 static const auto seq1t2 = Eigen::seq(Eigen::fix<nDiffSizC1>, Eigen::fix<nDiffSizC2 - 1>);
505 Eigen::Matrix<real, nDiffSizCC, 3> M_RHS;
506 M_RHS(seq1t2, EigenAll).setZero();
507 for (
int j = 0; j < dim; j++)
510 for (
int ii = nDiffSizC1; ii < nDiffSizC2; ii++)
512 int i = dim == 2 ? diffOperatorDimList2D[ii][0] : diffOperatorDimList[ii][0];
513 int k = dim == 2 ? diffOperatorDimList2D[ii][1] : diffOperatorDimList[ii][1];
514 real &ccv = M_RHS(ii, j);
516 for (
int m = 0; m < dim; m++)
517 for (
int n = 0;
n < dim;
n++)
518 ccv -= DxDxi(std::get<2>(diffOperatorIJK2IcDim)[m][
n], j) *
519 DxiDx(std::get<1>(diffOperatorIJK2IcDim)[i], m) *
520 DxiDx(std::get<1>(diffOperatorIJK2IcDim)[k],
n);
522 DxiDx(seq1t2, EigenAll) = M_RHS(seq1t2, EigenAll) * Dxi_j_Dx_i;
526 static const int nDiffSizC3 = ndiffSizS<dim>(3);
527 static const auto seq2t3 = Eigen::seq(Eigen::fix<nDiffSizC2>, Eigen::fix<nDiffSizC3 - 1>);
528 M_RHS(seq2t3, EigenAll).setZero();
529 for (
int j = 0; j < dim; j++)
533 for (
int ii = nDiffSizC2; ii < nDiffSizC3; ii++)
535 int i = dim == 2 ? diffOperatorDimList2D[ii][0] : diffOperatorDimList[ii][0];
536 int k = dim == 2 ? diffOperatorDimList2D[ii][1] : diffOperatorDimList[ii][1];
537 int l = dim == 2 ? diffOperatorDimList2D[ii][2] : diffOperatorDimList[ii][2];
538 real &ccv = M_RHS(ii, j);
540 for (
int m = 0; m < dim; m++)
541 for (
int n = 0;
n < dim;
n++)
542 ccv -= DxDxi(std::get<2>(diffOperatorIJK2IcDim)[m][
n], j) *
543 DxiDx(std::get<2>(diffOperatorIJK2IcDim)[i][k], m) *
544 DxiDx(std::get<1>(diffOperatorIJK2IcDim)[l],
n) +
545 DxDxi(std::get<2>(diffOperatorIJK2IcDim)[m][
n], j) *
546 DxiDx(std::get<2>(diffOperatorIJK2IcDim)[k][l], m) *
547 DxiDx(std::get<1>(diffOperatorIJK2IcDim)[i],
n) +
548 DxDxi(std::get<2>(diffOperatorIJK2IcDim)[m][
n], j) *
549 DxiDx(std::get<2>(diffOperatorIJK2IcDim)[i][l], m) *
550 DxiDx(std::get<1>(diffOperatorIJK2IcDim)[k],
n);
551 for (
int m = 0; m < dim; m++)
552 for (
int n = 0;
n < dim;
n++)
553 for (
int p = 0; p < dim; p++)
554 ccv -= DxDxi(std::get<3>(diffOperatorIJK2IcDim)[m][
n][p], j) *
555 DxiDx(std::get<1>(diffOperatorIJK2IcDim)[i], m) *
556 DxiDx(std::get<1>(diffOperatorIJK2IcDim)[k],
n) *
557 DxiDx(std::get<1>(diffOperatorIJK2IcDim)[l], p);
559 DxiDx(seq2t3, EigenAll) = M_RHS(seq2t3, EigenAll) * Dxi_j_Dx_i;