12#ifndef MFEM_INVARIANTS_HPP
13#define MFEM_INVARIANTS_HPP
25template <
typename scalar_t>
28 static scalar_t
sign(
const scalar_t &
a)
29 {
return (
a >= scalar_t(0)) ? scalar_t(1) : scalar_t(-1); }
31 static scalar_t
pow(
const scalar_t &x,
int m,
int n)
32 {
return std::pow(x, scalar_t(m)/n); }
47template <
typename scalar_t,
typename scalar_ops = ScalarOps<scalar_t> >
85 I1 =
J[0]*
J[0] +
J[1]*
J[1] +
J[2]*
J[2] +
J[3]*
J[3];
95 const scalar_t det =
J[0]*
J[3] -
J[1]*
J[2];
109 const scalar_t c1 = 2/
Get_I2b();
110 const scalar_t c2 =
Get_I1b()/2;
122 const scalar_t c1 = 2*
Get_I2b();
151 void Eval_DZt(
const scalar_t *Z, scalar_t **DZt_ptr)
153 MFEM_ASSERT(
D != NULL,
"");
155 scalar_t *DZt = *DZt_ptr;
156 if (DZt == NULL) { *DZt_ptr = DZt =
new scalar_t[2*
alloc_height]; }
157 for (
int i = 0; i < nd; i++)
159 const int i0 = i+nd*0, i1 = i+nd*1;
160 DZt[i0] =
D[i0]*Z[0] +
D[i1]*Z[2];
161 DZt[i1] =
D[i0]*Z[1] +
D[i1]*Z[3];
188 delete []
DYt;
DYt = NULL;
189 delete []
DXt;
DXt = NULL;
190 delete []
DJt;
DJt = NULL;
191 delete []
DaJ;
DaJ = NULL;
235 const scalar_t
a = 2*w;
236 for (
int i = 0; i < nd; i++)
238 const int i0 = i+nd*0, i1 = i+nd*1;
239 const scalar_t aDi[2] = {
a*
D[i0],
a*
D[i1] };
241 const scalar_t aDDt_ii = aDi[0]*
D[i0] + aDi[1]*
D[i1];
242 A[i0+ah*i0] += aDDt_ii;
243 A[i1+ah*i1] += aDDt_ii;
245 for (
int k = 0; k < i; k++)
247 const int k0 = k+nd*0, k1 = k+nd*1;
248 const scalar_t aDDt_ik = aDi[0]*
D[k0] + aDi[1]*
D[k1];
249 A[i0+ah*k0] += aDDt_ik;
250 A[k0+ah*i0] += aDDt_ik;
251 A[i1+ah*k1] += aDDt_ik;
252 A[k1+ah*i1] += aDDt_ik;
279 const scalar_t c = -2*w/
Get_I2();
280 for (
int i = 0; i < nd; i++)
282 const int i0 = i+nd*0, i1 = i+nd*1;
283 const scalar_t aDaJ_i[2] = {
a*
DaJ[i0],
a*
DaJ[i1] };
284 const scalar_t bD_i[2] = {
b*
D[i0],
b*
D[i1] };
285 const scalar_t cDJt_i[2] = { c*
DJt[i0], c*
DJt[i1] };
286 const scalar_t cDaJ_i[2] = { c*
DaJ[i0], c*
DaJ[i1] };
290 const scalar_t A2_ii = bD_i[0]*
D[i0] + bD_i[1]*
D[i1];
292 A[i0+ah*i0] += 2*(aDaJ_i[0] + cDJt_i[0])*
DaJ[i0] + A2_ii;
295 const scalar_t A_ii_01 =
296 (2*aDaJ_i[0] + cDJt_i[0])*
DaJ[i1] + cDaJ_i[0]*
DJt[i1];
297 A[i0+ah*i1] += A_ii_01;
298 A[i1+ah*i0] += A_ii_01;
300 A[i1+ah*i1] += 2*(aDaJ_i[1] + cDJt_i[1])*
DaJ[i1] + A2_ii;
303 for (
int k = 0; k < i; k++)
305 const int k0 = k+nd*0, k1 = k+nd*1;
307 const scalar_t A1_ik_01 = aDaJ_i[0]*
DaJ[k1] + aDaJ_i[1]*
DaJ[k0];
310 const scalar_t A2_ik = bD_i[0]*
D[k0] + bD_i[1]*
D[k1];
312 const scalar_t A_ik_00 =
313 (2*aDaJ_i[0] + cDJt_i[0])*
DaJ[k0] + A2_ik + cDaJ_i[0]*
DJt[k0];
314 A[i0+ah*k0] += A_ik_00;
315 A[k0+ah*i0] += A_ik_00;
317 const scalar_t A_ik_01 =
318 A1_ik_01 + cDJt_i[0]*
DaJ[k1] + cDaJ_i[0]*
DJt[k1];
319 A[i0+ah*k1] += A_ik_01;
320 A[k1+ah*i0] += A_ik_01;
322 const scalar_t A_ik_10 =
323 A1_ik_01 + cDJt_i[1]*
DaJ[k0] + cDaJ_i[1]*
DJt[k0];
324 A[i1+ah*k0] += A_ik_10;
325 A[k0+ah*i1] += A_ik_10;
327 const scalar_t A_ik_11 =
328 (2*aDaJ_i[1] + cDJt_i[1])*
DaJ[k1] + A2_ik + cDaJ_i[1]*
DJt[k1];
329 A[i1+ah*k1] += A_ik_11;
330 A[k1+ah*i1] += A_ik_11;
355 const scalar_t
a = 2*w;
356 for (
int i = 0; i < ah; i++)
358 const scalar_t avi =
a*
DaJ[i];
359 A[i+ah*i] += avi*
DaJ[i];
360 for (
int j = 0; j < i; j++)
362 const scalar_t aVVt_ij = avi*
DaJ[j];
363 A[i+ah*j] += aVVt_ij;
364 A[j+ah*i] += aVVt_ij;
367 const int j = 1, l = 0;
368 for (
int i = 0; i < nd; i++)
370 const int ij = i+nd*j, il = i+nd*l;
371 const scalar_t aDaJ_ij =
a*
DaJ[ij], aDaJ_il =
a*
DaJ[il];
372 for (
int k = 0; k < i; k++)
374 const int kj = k+nd*j, kl = k+nd*l;
375 const scalar_t A_ijkl = aDaJ_ij*
DaJ[kl] - aDaJ_il*
DaJ[kj];
376 A[ij+ah*kl] += A_ijkl;
377 A[kl+ah*ij] += A_ijkl;
378 A[kj+ah*il] -= A_ijkl;
379 A[il+ah*kj] -= A_ijkl;
404 const int j = 1, l = 0;
406 for (
int i = 0; i < nd; i++)
408 const int ij = i+nd*j, il = i+nd*l;
409 const scalar_t aDaJ_ij =
a*
DaJ[ij], aDaJ_il =
a*
DaJ[il];
410 for (
int k = 0; k < i; k++)
412 const int kj = k+nd*j, kl = k+nd*l;
413 const scalar_t A_ijkl = aDaJ_ij*
DaJ[kl] - aDaJ_il*
DaJ[kj];
414 A[ij+ah*kl] += A_ijkl;
415 A[kl+ah*ij] += A_ijkl;
416 A[kj+ah*il] -= A_ijkl;
417 A[il+ah*kj] -= A_ijkl;
439 for (
int i = 0; i < ah; i++)
441 const scalar_t axi = w*
DXt[i], ayi = w*
DYt[i];
442 A[i+ah*i] += 2*axi*
DYt[i];
443 for (
int j = 0; j < i; j++)
445 const scalar_t A_ij = axi*
DYt[j] + ayi*
DXt[j];
465 for (
int i = 0; i < ah; i++)
467 const scalar_t axi = w*
DXt[i];
468 A[i+ah*i] += axi*
DXt[i];
469 for (
int j = 0; j < i; j++)
471 const scalar_t A_ij = axi*
DXt[j];
492template <
typename scalar_t,
typename scalar_ops = ScalarOps<scalar_t> >
546 B[0] =
J[0]*
J[0] +
J[3]*
J[3] +
J[6]*
J[6];
547 B[1] =
J[1]*
J[1] +
J[4]*
J[4] +
J[7]*
J[7];
548 B[2] =
J[2]*
J[2] +
J[5]*
J[5] +
J[8]*
J[8];
549 I1 =
B[0] +
B[1] +
B[2];
561 B[3] =
J[0]*
J[1] +
J[3]*
J[4] +
J[6]*
J[7];
562 B[4] =
J[0]*
J[2] +
J[3]*
J[5] +
J[6]*
J[8];
563 B[5] =
J[1]*
J[2] +
J[4]*
J[5] +
J[7]*
J[8];
570 const scalar_t BF2 =
B[0]*
B[0] +
B[1]*
B[1] +
B[2]*
B[2] +
571 2*(
B[3]*
B[3] +
B[4]*
B[4] +
B[5]*
B[5]);
583 I3b =
J[0]*(
J[4]*
J[8] -
J[7]*
J[5]) -
J[1]*(
J[3]*
J[8] -
J[5]*
J[6]) +
584 J[2]*(
J[3]*
J[7] -
J[4]*
J[6]);
591 const scalar_t i3b =
Get_I3b();
592 I3b_p = scalar_ops::pow(i3b, -2, 3);
599 for (
int i = 0; i < 9; i++)
612 for (
int i = 0; i < 9; i++)
625 const scalar_t C[6] =
627 2*(
I1 -
B[0]), 2*(
I1 -
B[1]), 2*(
I1 -
B[2]),
628 -2*
B[3], -2*
B[4], -2*
B[5]
633 dI2[0] = C[0]*
J[0] + C[3]*
J[1] + C[4]*
J[2];
634 dI2[1] = C[3]*
J[0] + C[1]*
J[1] + C[5]*
J[2];
635 dI2[2] = C[4]*
J[0] + C[5]*
J[1] + C[2]*
J[2];
637 dI2[3] = C[0]*
J[3] + C[3]*
J[4] + C[4]*
J[5];
638 dI2[4] = C[3]*
J[3] + C[1]*
J[4] + C[5]*
J[5];
639 dI2[5] = C[4]*
J[3] + C[5]*
J[4] + C[2]*
J[5];
641 dI2[6] = C[0]*
J[6] + C[3]*
J[7] + C[4]*
J[8];
642 dI2[7] = C[3]*
J[6] + C[1]*
J[7] + C[5]*
J[8];
643 dI2[8] = C[4]*
J[6] + C[5]*
J[7] + C[2]*
J[8];
656 for (
int i = 0; i < 9; i++)
666 const scalar_t c1 = 2*
Get_I3b();
668 for (
int i = 0; i < 9; i++)
688 void Eval_DZt(
const scalar_t *Z, scalar_t **DZt_ptr)
690 MFEM_ASSERT(
D != NULL,
"");
692 scalar_t *DZt = *DZt_ptr;
693 if (DZt == NULL) { *DZt_ptr = DZt =
new scalar_t[3*
alloc_height]; }
694 for (
int i = 0; i < nd; i++)
696 const int i0 = i+nd*0, i1 = i+nd*1, i2 = i+nd*2;
697 DZt[i0] =
D[i0]*Z[0] +
D[i1]*Z[3] +
D[i2]*Z[6];
698 DZt[i1] =
D[i0]*Z[1] +
D[i1]*Z[4] +
D[i2]*Z[7];
699 DZt[i2] =
D[i0]*Z[2] +
D[i1]*Z[5] +
D[i2]*Z[8];
744 delete []
DYt;
DYt = NULL;
745 delete []
DXt;
DXt = NULL;
747 delete []
DJt;
DJt = NULL;
748 delete []
DaJ;
DaJ = NULL;
802 const scalar_t
a = 2*w;
803 for (
int i = 0; i < nd; i++)
805 const int i0 = i+nd*0, i1 = i+nd*1, i2 = i+nd*2;
806 const scalar_t aDi[3] = {
a*
D[i0],
a*
D[i1],
a*
D[i2] };
808 const scalar_t aDDt_ii = aDi[0]*
D[i0] + aDi[1]*
D[i1] + aDi[2]*
D[i2];
809 A[i0+ah*i0] += aDDt_ii;
810 A[i1+ah*i1] += aDDt_ii;
811 A[i2+ah*i2] += aDDt_ii;
813 for (
int k = 0; k < i; k++)
815 const int k0 = k+nd*0, k1 = k+nd*1, k2 = k+nd*2;
816 const scalar_t aDDt_ik = aDi[0]*
D[k0] + aDi[1]*
D[k1] + aDi[2]*
D[k2];
817 A[i0+ah*k0] += aDDt_ik;
818 A[k0+ah*i0] += aDDt_ik;
819 A[i1+ah*k1] += aDDt_ik;
820 A[k1+ah*i1] += aDDt_ik;
821 A[i2+ah*k2] += aDDt_ik;
822 A[k2+ah*i2] += aDDt_ik;
848 const scalar_t r23 = scalar_t(2)/3;
849 const scalar_t r53 = scalar_t(5)/3;
852 const scalar_t c = -r23*
b/
I3b;
853 for (
int i = 0; i < nd; i++)
880 const int i0 = i+nd*0, i1 = i+nd*1, i2 = i+nd*2;
881 const scalar_t aDaJ_i[3] = {
a*
DaJ[i0],
a*
DaJ[i1],
a*
DaJ[i2] };
882 const scalar_t bD_i[3] = {
b*
D[i0],
b*
D[i1],
b*
D[i2] };
883 const scalar_t cDJt_i[3] = { c*
DJt[i0], c*
DJt[i1], c*
DJt[i2] };
884 const scalar_t cDaJ_i[3] = { c*
DaJ[i0], c*
DaJ[i1], c*
DaJ[i2] };
888 const scalar_t A2_ii = bD_i[0]*
D[i0]+bD_i[1]*
D[i1]+bD_i[2]*
D[i2];
889 A[i0+ah*i0] += (r53*aDaJ_i[0] + 2*cDJt_i[0])*
DaJ[i0] + A2_ii;
890 A[i1+ah*i1] += (r53*aDaJ_i[1] + 2*cDJt_i[1])*
DaJ[i1] + A2_ii;
891 A[i2+ah*i2] += (r53*aDaJ_i[2] + 2*cDJt_i[2])*
DaJ[i2] + A2_ii;
894 for (
int j = 1; j < 3; j++)
896 const int ij = i+nd*j;
897 for (
int l = 0; l < j; l++)
899 const int il = i+nd*l;
900 const scalar_t A_ii_jl =
901 (r53*aDaJ_i[j] + cDJt_i[j])*
DaJ[il] + cDaJ_i[j]*
DJt[il];
902 A[ij+ah*il] += A_ii_jl;
903 A[il+ah*ij] += A_ii_jl;
908 for (
int k = 0; k < i; k++)
910 const int k0 = k+nd*0, k1 = k+nd*1, k2 = k+nd*2;
912 const scalar_t A2_ik = bD_i[0]*
D[k0]+bD_i[1]*
D[k1]+bD_i[2]*
D[k2];
915 for (
int j = 0; j < 3; j++)
917 const int ij = i+nd*j, kj = k+nd*j;
918 const scalar_t A_ik_jj = (r53*aDaJ_i[j] + cDJt_i[j])*
DaJ[kj] +
919 cDaJ_i[j]*
DJt[kj] + A2_ik;
920 A[ij+ah*kj] += A_ik_jj;
921 A[kj+ah*ij] += A_ik_jj;
925 for (
int j = 1; j < 3; j++)
927 const int ij = i+nd*j, kj = k+nd*j;
928 for (
int l = 0; l < j; l++)
930 const int il = i+nd*l, kl = k+nd*l;
932 const scalar_t A1b_ik_jl = aDaJ_i[l]*
DaJ[kj];
933 const scalar_t A1b_ik_lj = aDaJ_i[j]*
DaJ[kl];
937 const scalar_t A_ik_jl = A1b_ik_jl + r23*A1b_ik_lj +
938 cDJt_i[j]*
DaJ[kl]+cDaJ_i[j]*
DJt[kl];
939 A[ij+ah*kl] += A_ik_jl;
940 A[kl+ah*ij] += A_ik_jl;
941 const scalar_t A_ik_lj = r23*A1b_ik_jl + A1b_ik_lj +
942 cDJt_i[l]*
DaJ[kj]+cDaJ_i[l]*
DJt[kj];
943 A[il+ah*kj] += A_ik_lj;
944 A[kj+ah*il] += A_ik_lj;
994 const scalar_t
a = 2*w;
995 for (
int i = 0; i < ah; i++)
997 const scalar_t avi =
a*
DJt[i];
998 A[i+ah*i] += avi*
DJt[i];
999 for (
int j = 0; j < i; j++)
1001 const scalar_t aVVt_ij = avi*
DJt[j];
1002 A[i+ah*j] += aVVt_ij;
1003 A[j+ah*i] += aVVt_ij;
1007 for (
int i = 0; i < nd; i++)
1009 const int i0 = i+nd*0, i1 = i+nd*1, i2 = i+nd*2;
1010 const scalar_t aD_i[3] = {
a*
D[i0],
a*
D[i1],
a*
D[i2] };
1011 const scalar_t aDJt_i[3] = {
a*
DJt[i0],
a*
DJt[i1],
a*
DJt[i2] };
1014 const scalar_t aDDt_ii =
1015 aD_i[0]*
D[i0] + aD_i[1]*
D[i1] + aD_i[2]*
D[i2];
1016 const scalar_t Z1_ii =
1017 I1*aDDt_ii - (aDJt_i[0]*
DJt[i0] + aDJt_i[1]*
DJt[i1] +
1020 for (
int j = 0; j < 3; j++)
1022 const int ij = i+nd*j;
1023 A[ij+ah*ij] += Z1_ii - aDDt_ii*
B[j];
1026 const scalar_t Z2_ii_01 = aDDt_ii*
B[3];
1027 const scalar_t Z2_ii_02 = aDDt_ii*
B[4];
1028 const scalar_t Z2_ii_12 = aDDt_ii*
B[5];
1029 A[i0+ah*i1] -= Z2_ii_01;
1030 A[i1+ah*i0] -= Z2_ii_01;
1031 A[i0+ah*i2] -= Z2_ii_02;
1032 A[i2+ah*i0] -= Z2_ii_02;
1033 A[i1+ah*i2] -= Z2_ii_12;
1034 A[i2+ah*i1] -= Z2_ii_12;
1037 for (
int k = 0; k < i; k++)
1039 const int k0 = k+nd*0, k1 = k+nd*1, k2 = k+nd*2;
1040 const scalar_t aDDt_ik =
1041 aD_i[0]*
D[k0] + aD_i[1]*
D[k1] + aD_i[2]*
D[k2];
1042 const scalar_t Z1_ik =
1043 I1*aDDt_ik - (aDJt_i[0]*
DJt[k0] + aDJt_i[1]*
DJt[k1] +
1046 for (
int j = 0; j < 3; j++)
1048 const int ij = i+nd*j, kj = k+nd*j;
1049 const scalar_t Z2_ik_jj = Z1_ik - aDDt_ik*
B[j];
1050 A[ij+ah*kj] += Z2_ik_jj;
1051 A[kj+ah*ij] += Z2_ik_jj;
1055 const scalar_t Z2_ik_01 = aDDt_ik*
B[3];
1056 A[i0+ah*k1] -= Z2_ik_01;
1057 A[i1+ah*k0] -= Z2_ik_01;
1058 A[k0+ah*i1] -= Z2_ik_01;
1059 A[k1+ah*i0] -= Z2_ik_01;
1060 const scalar_t Z2_ik_02 = aDDt_ik*
B[4];
1061 A[i0+ah*k2] -= Z2_ik_02;
1062 A[i2+ah*k0] -= Z2_ik_02;
1063 A[k0+ah*i2] -= Z2_ik_02;
1064 A[k2+ah*i0] -= Z2_ik_02;
1065 const scalar_t Z2_ik_12 = aDDt_ik*
B[5];
1066 A[i1+ah*k2] -= Z2_ik_12;
1067 A[i2+ah*k1] -= Z2_ik_12;
1068 A[k1+ah*i2] -= Z2_ik_12;
1069 A[k2+ah*i1] -= Z2_ik_12;
1072 for (
int j = 1; j < 3; j++)
1074 const int ij = i+nd*j, kj = k+nd*j;
1075 for (
int l = 0; l < j; l++)
1077 const int il = i+nd*l, kl = k+nd*l;
1078 const scalar_t Z3_ik_jl =
1079 aDJt_i[j]*
DJt[kl] - aDJt_i[l]*
DJt[kj];
1080 A[ij+ah*kl] += Z3_ik_jl;
1081 A[kl+ah*ij] += Z3_ik_jl;
1082 A[il+ah*kj] -= Z3_ik_jl;
1083 A[kj+ah*il] -= Z3_ik_jl;
1125 const int ah = 3*nd;
1127 const scalar_t
b = (-4*
a)/(3*
I3b);
1129 const scalar_t d = (4*c)/3;
1131 for (
int i = 0; i < ah; i++)
1133 const scalar_t dvi = d*
DaJ[i];
1134 A[i+ah*i] += dvi*
DaJ[i];
1135 for (
int j = 0; j < i; j++)
1137 const scalar_t dVVt_ij = dvi*
DaJ[j];
1138 A[i+ah*j] += dVVt_ij;
1139 A[j+ah*i] += dVVt_ij;
1143 for (
int i = 0; i < nd; i++)
1145 const int i0 = i+nd*0, i1 = i+nd*1, i2 = i+nd*2;
1146 const scalar_t cDaJ_i[3] = { c*
DaJ[i0], c*
DaJ[i1], c*
DaJ[i2] };
1147 const scalar_t bDaJ_i[3] = {
b*
DaJ[i0],
b*
DaJ[i1],
b*
DaJ[i2] };
1152 for (
int j = 0; j < 3; j++)
1154 const int ij = i+nd*j;
1155 A[ij+ah*ij] += (cDaJ_i[j] + 2*bDdI2t_i[j])*
DaJ[ij];
1158 for (
int j = 1; j < 3; j++)
1160 const int ij = i+nd*j;
1161 for (
int l = 0; l < j; l++)
1163 const int il = i+nd*l;
1164 const scalar_t Z_ii_jl =
1165 (cDaJ_i[l] + bDdI2t_i[l])*
DaJ[ij] + bDdI2t_i[j]*
DaJ[il];
1166 A[ij+ah*il] += Z_ii_jl;
1167 A[il+ah*ij] += Z_ii_jl;
1172 for (
int k = 0; k < i; k++)
1175 for (
int j = 0; j < 3; j++)
1177 const int ij = i+nd*j, kj = k+nd*j;
1178 const scalar_t Z_ik_jj =
1179 (cDaJ_i[j] + bDdI2t_i[j])*
DaJ[kj] + bDaJ_i[j]*
DdI2t[kj];
1180 A[ij+ah*kj] += Z_ik_jj;
1181 A[kj+ah*ij] += Z_ik_jj;
1184 for (
int j = 1; j < 3; j++)
1186 const int ij = i+nd*j, kj = k+nd*j;
1187 for (
int l = 0; l < j; l++)
1189 const int il = i+nd*l, kl = k+nd*l;
1190 const scalar_t Z_ik_jl = cDaJ_i[l]*
DaJ[kj] +
1191 bDdI2t_i[j]*
DaJ[kl] +
1192 bDaJ_i[j]*
DdI2t[kl];
1193 A[ij+ah*kl] += Z_ik_jl;
1194 A[kl+ah*ij] += Z_ik_jl;
1195 const scalar_t Z_ik_lj = cDaJ_i[j]*
DaJ[kl] +
1196 bDdI2t_i[l]*
DaJ[kj] +
1197 bDaJ_i[l]*
DdI2t[kj];
1198 A[il+ah*kj] += Z_ik_lj;
1199 A[kj+ah*il] += Z_ik_lj;
1217 const int ah = 3*nd;
1218 const scalar_t
a = 2*w;
1220 for (
int i = 0; i < ah; i++)
1222 const scalar_t avi =
a*
DaJ[i];
1223 A[i+ah*i] += avi*
DaJ[i];
1224 for (
int j = 0; j < i; j++)
1226 const scalar_t aVVt_ij = avi*
DaJ[j];
1227 A[i+ah*j] += aVVt_ij;
1228 A[j+ah*i] += aVVt_ij;
1231 for (
int j = 1; j < 3; j++)
1233 for (
int l = 0; l < j; l++)
1235 for (
int i = 0; i < nd; i++)
1237 const int ij = i+nd*j, il = i+nd*l;
1238 const scalar_t aDaJ_ij =
a*
DaJ[ij], aDaJ_il =
a*
DaJ[il];
1239 for (
int k = 0; k < i; k++)
1241 const int kj = k+nd*j, kl = k+nd*l;
1242 const scalar_t A_ijkl = aDaJ_ij*
DaJ[kl] - aDaJ_il*
DaJ[kj];
1243 A[ij+ah*kl] += A_ijkl;
1244 A[kl+ah*ij] += A_ijkl;
1245 A[kj+ah*il] -= A_ijkl;
1246 A[il+ah*kj] -= A_ijkl;
1263 const int ah = 3*nd;
1265 for (
int j = 1; j < 3; j++)
1267 for (
int l = 0; l < j; l++)
1269 for (
int i = 0; i < nd; i++)
1271 const int ij = i+nd*j, il = i+nd*l;
1272 const scalar_t aDaJ_ij =
a*
DaJ[ij], aDaJ_il =
a*
DaJ[il];
1273 for (
int k = 0; k < i; k++)
1275 const int kj = k+nd*j, kl = k+nd*l;
1276 const scalar_t A_ijkl = aDaJ_ij*
DaJ[kl] - aDaJ_il*
DaJ[kj];
1277 A[ij+ah*kl] += A_ijkl;
1278 A[kl+ah*ij] += A_ijkl;
1279 A[kj+ah*il] -= A_ijkl;
1280 A[il+ah*kj] -= A_ijkl;
1302 const int ah = 3*nd;
1304 for (
int i = 0; i < ah; i++)
1306 const scalar_t axi = w*
DXt[i], ayi = w*
DYt[i];
1307 A[i+ah*i] += 2*axi*
DYt[i];
1308 for (
int j = 0; j < i; j++)
1310 const scalar_t A_ij = axi*
DYt[j] + ayi*
DXt[j];
1327 const int ah = 3*nd;
1329 for (
int i = 0; i < ah; i++)
1331 const scalar_t axi = w*
DXt[i];
1332 A[i+ah*i] += axi*
DXt[i];
1333 for (
int j = 0; j < i; j++)
1335 const scalar_t A_ij = axi*
DXt[j];
Auxiliary class for evaluating the 2x2 matrix invariants and their first and second derivatives.
const scalar_t * Get_dI1b()
void Assemble_ddI1(scalar_t w, scalar_t *A)
bool dont(int have_mask) const
void SetJacobian(const scalar_t *Jac)
The Jacobian should use column-major storage.
void Assemble_ddI1b(scalar_t w, scalar_t *A)
const scalar_t * Get_dI2()
void SetDerivativeMatrix(int height, const scalar_t *Deriv)
The Deriv matrix is dof x 2, using column-major storage.
void Assemble_ddI2b(scalar_t w, scalar_t *A)
void Eval_DZt(const scalar_t *Z, scalar_t **DZt_ptr)
const scalar_t * Get_dI2b()
void Assemble_TProd(scalar_t w, const scalar_t *X, const scalar_t *Y, scalar_t *A)
void Assemble_ddI2(scalar_t w, scalar_t *A)
InvariantsEvaluator2D(const scalar_t *Jac=NULL)
The Jacobian should use column-major storage.
void Assemble_TProd(scalar_t w, const scalar_t *X, scalar_t *A)
const scalar_t * Get_dI1()
Auxiliary class for evaluating the 3x3 matrix invariants and their first and second derivatives.
void SetJacobian(const scalar_t *Jac)
The Jacobian should use column-major storage.
const scalar_t * Get_dI2()
const scalar_t * Get_dI2b()
const scalar_t * Get_dI3()
bool dont(int have_mask) const
void Assemble_TProd(scalar_t w, const scalar_t *X, const scalar_t *Y, scalar_t *A)
const scalar_t * Get_dI1()
void SetDerivativeMatrix(int height, const scalar_t *Deriv)
The Deriv matrix is dof x 3, using column-major storage.
const scalar_t * Get_dI3b()
void Eval_DZt(const scalar_t *Z, scalar_t **DZt_ptr)
InvariantsEvaluator3D(const scalar_t *Jac=NULL)
The Jacobian should use column-major storage.
void Assemble_ddI1(scalar_t w, scalar_t *A)
void Assemble_TProd(scalar_t w, const scalar_t *X, scalar_t *A)
void Assemble_ddI2(scalar_t w, scalar_t *A)
const scalar_t * Get_dI1b()
void Assemble_ddI3(scalar_t w, scalar_t *A)
void Assemble_ddI2b(scalar_t w, scalar_t *A)
void Assemble_ddI3b(scalar_t w, scalar_t *A)
void Assemble_ddI1b(scalar_t w, scalar_t *A)
Auxiliary class used as the default for the second template parameter in the classes InvariantsEvalua...
static scalar_t pow(const scalar_t &x, int m, int n)
static scalar_t sign(const scalar_t &a)