12#ifndef MFEM_DINVARIANTS_HPP
13#define MFEM_DINVARIANTS_HPP
32 const real_t * J_ =
nullptr;
56 real_t *
const dI1, *
const dI1b, *
const ddI1, *
const ddI1b;
57 real_t *
const dI2, *
const dI2b, *
const ddI2, *
const ddI2b;
63 dI1(
b.dI1_), dI1b(
b.dI1b_), ddI1(
b.ddI1_), ddI1b(
b.ddI1b_),
64 dI2(
b.dI2_), dI2b(
b.dI2b_), ddI2(
b.ddI2_), ddI2b(
b.ddI2b_) { }
68 const real_t I2b = J[0]*J[3] - J[1]*J[2];
69 sign_detJ = I2b >= 0.0 ? 1.0 : -1.0;
70 return sign_detJ * I2b;
87 return J[0]*J[0] + J[1]*J[1] + J[2]*J[2] + J[3]*J[3];
97 dI1[0] = 2*J[0]; dI1[2] = 2*J[2];
98 dI1[1] = 2*J[1]; dI1[3] = 2*J[3];
110 dI1b[0] = c1*(J[0] - c2*dI2b[0]);
111 dI1b[1] = c1*(J[1] - c2*dI2b[1]);
112 dI1b[2] = c1*(J[2] - c2*dI2b[2]);
113 dI1b[3] = c1*(J[3] - c2*dI2b[3]);
137 dI2b[0] = sign_detJ*J[3];
138 dI2b[1] = -sign_detJ*J[2];
139 dI2b[2] = -sign_detJ*J[1];
140 dI2b[3] = sign_detJ*J[0];
149 for (
int k=0; k<2; k++)
151 for (
int l=0; l<2; l++)
153 ddi1(k,l) = (i==k && j==l) ? 2.0 : 0.0;
166 real_t X1_p[4], X2_p[4], X3_p[4];
174 for (
int k=0; k<2; k++)
176 for (
int l=0; l<2; l++)
178 X1(k,l) =
alpha * (di2b(i,j)*di2b(k,l) + di2b(k,j)*di2b(i,l));
185 for (
int k=0; k<2; k++)
187 for (
int l=0; l<2; l++)
189 X2(k,l) = beta * ddi1(k,l);
196 for (
int k=0; k<2; k++)
198 for (
int l=0; l<2; l++)
200 X3(k,l) = gamma * (Jpt(i,j)*di2b(k,l) + di2b(i,j)*Jpt(k,l));
204 for (
int k=0; k<2; k++)
206 for (
int l=0; l<2; l++)
208 ddi1b(k,l) = X1(k,l) + X2(k,l) + X3(k,l);
220 for (
int k=0; k<2; k++)
222 for (
int l=0; l<2; l++)
224 ddi2(k,l) = 2*di2b(i,j)*di2b(k,l)
225 + 2*(di2b(i,j)*di2b(k,l) - di2b(k,j)*di2b(i,l));
238 for (
int k=0; k<2; k++)
240 for (
int l=0; l<2; l++)
243 for (
int s=0; s<2; s++)
245 for (
int t=0; t<2; t++)
247 const real_t ks_it = k==s && i==t ? 1.0 : 0.0;
248 const real_t kt_si = k==t && s==i ? 1.0 : 0.0;
249 ddi2b(k,l) +=
alpha * (ks_it - kt_si) * di2b(t,j) * di2b(s,l);
266 const real_t * J_ =
nullptr;
271 real_t * ddI1b_ =
nullptr;
275 real_t * ddI2b_ =
nullptr;
277 real_t * ddI3b_ =
nullptr;
297 real_t *
const dI1, *
const dI1b, *
const ddI1, *
const ddI1b;
298 real_t *
const dI2, *
const dI2b, *
const ddI2, *
const ddI2b;
299 real_t *
const dI3b, *
const ddI3b;
305 dI1(
b.dI1_), dI1b(
b.dI1b_), ddI1(
b.ddI1_), ddI1b(
b.ddI1b_),
306 dI2(
b.dI2_), dI2b(
b.dI2b_), ddI2(
b.ddI2_), ddI2b(
b.ddI2b_),
307 dI3b(
b.dI3b_), ddI3b(
b.ddI3b_) { }
311 const real_t I3b = + J[0]*(J[4]*J[8] - J[7]*J[5])
312 - J[1]*(J[3]*J[8] - J[5]*J[6])
313 + J[2]*(J[3]*J[7] - J[4]*J[6]);
314 sign_detJ = I3b >= 0.0 ? 1.0 : -1.0;
315 return sign_detJ * I3b;
320 const real_t I3b = + J[0]*(J[4]*J[8] - J[7]*J[5])
321 - J[1]*(J[3]*J[8] - J[5]*J[6])
322 + J[2]*(J[3]*J[7] - J[4]*J[6]);
336 return sign_detJ * std::pow(i3b, -2./3.);
342 return sign_detJ * std::pow(i3b, -2./3.);
347 B[0] = J[0]*J[0] + J[3]*J[3] + J[6]*J[6];
348 B[1] = J[1]*J[1] + J[4]*J[4] + J[7]*J[7];
349 B[2] = J[2]*J[2] + J[5]*J[5] + J[8]*J[8];
350 const real_t I1 = B[0] + B[1] + B[2];
354 MFEM_HOST_DEVICE
inline
365 B[3] = J[0]*J[1] + J[3]*J[4] + J[6]*J[7];
366 B[4] = J[0]*J[2] + J[3]*J[5] + J[6]*J[8];
367 B[5] = J[1]*J[2] + J[4]*J[5] + J[7]*J[8];
374 const real_t BF2 = B[0]*B[0] + B[1]*B[1] + B[2]*B[2] +
375 2*(B[3]*B[3] + B[4]*B[4] + B[5]*B[5]);
376 const real_t I2 = (I1*I1 - BF2)/2;
383 return Get_I2() * I3b_p * I3b_p;
388 for (
int i = 0; i < 9; i++) { dI1[i] = 2*J[i]; }
399 const real_t c1 = 2.0 * I3b_p;
402 for (
int i = 0; i < 9; i++) { dI1b[i] = c1*(J[i] - c2*dI3b[i]); }
415 2*(I1 - B[0]), 2*(I1 - B[1]), 2*(I1 - B[2]),
416 -2*B[3], -2*B[4], -2*B[5]
421 dI2[0] = C[0]*J[0] + C[3]*J[1] + C[4]*J[2];
422 dI2[1] = C[3]*J[0] + C[1]*J[1] + C[5]*J[2];
423 dI2[2] = C[4]*J[0] + C[5]*J[1] + C[2]*J[2];
425 dI2[3] = C[0]*J[3] + C[3]*J[4] + C[4]*J[5];
426 dI2[4] = C[3]*J[3] + C[1]*J[4] + C[5]*J[5];
427 dI2[5] = C[4]*J[3] + C[5]*J[4] + C[2]*J[5];
429 dI2[6] = C[0]*J[6] + C[3]*J[7] + C[4]*J[8];
430 dI2[7] = C[3]*J[6] + C[1]*J[7] + C[5]*J[8];
431 dI2[8] = C[4]*J[6] + C[5]*J[7] + C[2]*J[8];
444 const real_t c1 = I3b_p*I3b_p;
445 const real_t c2 = (4*I2/I3b)/3;
448 for (
int i = 0; i < 9; i++) { dI2b[i] = c1*(dI2[i] - c2*dI3b[i]); }
456 dI3b[0] = sign_detJ*(J[4]*J[8] - J[5]*J[7]);
457 dI3b[1] = sign_detJ*(J[5]*J[6] - J[3]*J[8]);
458 dI3b[2] = sign_detJ*(J[3]*J[7] - J[4]*J[6]);
459 dI3b[3] = sign_detJ*(J[2]*J[7] - J[1]*J[8]);
460 dI3b[4] = sign_detJ*(J[0]*J[8] - J[2]*J[6]);
461 dI3b[5] = sign_detJ*(J[1]*J[6] - J[0]*J[7]);
462 dI3b[6] = sign_detJ*(J[1]*J[5] - J[2]*J[4]);
463 dI3b[7] = sign_detJ*(J[2]*J[3] - J[0]*J[5]);
464 dI3b[8] = sign_detJ*(J[0]*J[4] - J[1]*J[3]);
472 for (
int k=0; k<3; k++)
474 for (
int l=0; l<3; l++)
476 const real_t I_ijkl = (i==k && j==l) ? 1.0 : 0.0;
477 ddi1(k,l) = 2.0 * I_ijkl;
492 real_t X1_p[9], X2_p[9], X3_p[9];
498 for (
int k=0; k<3; k++)
500 for (
int l=0; l<3; l++)
502 X1(k,l) =
alpha * ((2./3.)*di3b(i,j) * di3b(k,l) +
503 di3b(k,j)*di3b(i,l));
510 for (
int k=0; k<3; k++)
512 for (
int l=0; l<3; l++)
514 const real_t ddI1_ijkl = (i==k && j==l) ? 2.0 : 0.0;
515 X2(k,l) = beta * ddI1_ijkl;
523 for (
int k=0; k<3; k++)
525 for (
int l=0; l<3; l++)
527 X3(k,l) = gamma * (Jpt(i,j) * di3b(k,l) + di3b(i,j) * Jpt(k,l));
531 for (
int k=0; k<3; k++)
533 for (
int l=0; l<3; l++)
535 ddi1b(k,l) = X1(k,l) + X2(k,l) + X3(k,l);
547 real_t x1_p[9], x2_p[9], x3_p[9];
551 for (
int k=0; k<3; k++)
553 for (
int l=0; l<3; l++)
555 const real_t ik_jl = (i==k && j==l) ? 1.0 : 0.0;
556 x1(k,l) = 2.0 * I1 * ik_jl;
561 for (
int k=0; k<3; k++)
563 for (
int l=0; l<3; l++)
566 for (
int u=0;
u<3;
u++)
568 for (
int v=0; v<3; v++)
570 const real_t ku_iv = k==
u && i==v ? 1.0 : 0.0;
571 const real_t ik_uv = i==k &&
u==v ? 1.0 : 0.0;
572 const real_t kv_iu = k==v && i==
u ? 1.0 : 0.0;
573 x2(k,l) += 2.0*(2.*ku_iv-ik_uv-kv_iu)*Jpt(v,j)*Jpt(
u,l);
579 B[0] = J[0]*J[0] + J[3]*J[3] + J[6]*J[6];
580 B[1] = J[1]*J[1] + J[4]*J[4] + J[7]*J[7];
581 B[2] = J[2]*J[2] + J[5]*J[5] + J[8]*J[8];
582 B[3] = J[0]*J[1] + J[3]*J[4] + J[6]*J[7];
583 B[4] = J[0]*J[2] + J[3]*J[5] + J[6]*J[8];
584 B[5] = J[1]*J[2] + J[4]*J[5] + J[7]*J[8];
592 for (
int k=0; k<3; k++)
594 for (
int l=0; l<3; l++)
596 const real_t jl = j==l ? 1.0 : 0.0;
597 x3(k,l) = -2.0 *
b(i,k) * jl;
602 for (
int k=0; k<3; k++)
604 for (
int l=0; l<3; l++)
606 ddi2(k,l) = x1(k,l) + x2(k,l) + x3(k,l);
619 real_t X1_p[9], X2_p[9], X3_p[9];
627 const real_t I3b_p43 = I3b_p*I3b_p;
628 const real_t I3b_p73 = I3b_p*I3b_p/I3b;
629 const real_t I3b_p103 = I3b_p*I3b_p/(I3b*I3b);
631 for (
int k=0; k<3; k++)
633 for (
int l=0; l<3; l++)
635 const real_t up = (16./9.)*I3b_p103*I2*di3b(i,j)*di3b(k,l);
636 const real_t down = (4./3.)*I3b_p103*I2*di3b(i,l)*di3b(k,j);
643 for (
int k=0; k<3; k++)
645 for (
int l=0; l<3; l++)
647 X2(k,l) = -(4./3.)*I3b_p73*(di2(i,j)*di3b(k,l)+di2(k,l)*di3b(i,j));
653 for (
int k=0; k<3; k++)
655 for (
int l=0; l<3; l++)
657 X3(k,l) = I3b_p43 * ddi2(k,l);
662 for (
int k=0; k<3; k++)
664 for (
int l=0; l<3; l++)
666 ddi2b(k,l) = X1(k,l) + X2(k,l) + X3(k,l);
679 for (
int k=0; k<3; k++)
681 for (
int l=0; l<3; l++)
684 for (
int s=0; s<3; s++)
686 for (
int t=0; t<3; t++)
688 const real_t ks_it = k==s && i==t ? 1.0 : 0.0;
689 const real_t kt_si = k==t && s==i ? 1.0 : 0.0;
690 ddi3b(k,l) += c1*(ks_it-kt_si)*di3b(t,j)*di3b(s,l);
A basic generic Tensor class, appropriate for use on the GPU.
MFEM_HOST_DEVICE Buffers()
MFEM_HOST_DEVICE Buffers & dI2(real_t *b)
MFEM_HOST_DEVICE Buffers & dI2b(real_t *b)
MFEM_HOST_DEVICE Buffers & ddI2b(real_t *b)
MFEM_HOST_DEVICE Buffers & J(const real_t *b)
MFEM_HOST_DEVICE Buffers & ddI2(real_t *b)
MFEM_HOST_DEVICE Buffers & dI1(real_t *b)
MFEM_HOST_DEVICE Buffers & ddI1b(real_t *b)
MFEM_HOST_DEVICE Buffers & ddI1(real_t *b)
MFEM_HOST_DEVICE Buffers & dI1b(real_t *b)
MFEM_HOST_DEVICE real_t * Get_ddI2b(int i, int j)
MFEM_HOST_DEVICE real_t * Get_dI2()
MFEM_HOST_DEVICE real_t Get_I2()
MFEM_HOST_DEVICE InvariantsEvaluator2D(Buffers &b)
MFEM_HOST_DEVICE real_t * Get_ddI1b(int i, int j)
MFEM_HOST_DEVICE real_t * Get_dI2b()
MFEM_HOST_DEVICE real_t * Get_ddI2(int i, int j)
MFEM_HOST_DEVICE real_t Get_I2b()
MFEM_HOST_DEVICE real_t Get_I1()
MFEM_HOST_DEVICE real_t Get_I2b(real_t &sign_detJ)
MFEM_HOST_DEVICE real_t * Get_ddI1(int i, int j)
MFEM_HOST_DEVICE real_t * Get_dI1()
MFEM_HOST_DEVICE real_t * Get_dI1b()
MFEM_HOST_DEVICE real_t Get_I1b()
MFEM_HOST_DEVICE Buffers & dI2(real_t *b)
MFEM_HOST_DEVICE Buffers & ddI1(real_t *b)
MFEM_HOST_DEVICE Buffers & J(const real_t *b)
MFEM_HOST_DEVICE Buffers()
MFEM_HOST_DEVICE Buffers & B(real_t *b)
MFEM_HOST_DEVICE Buffers & ddI2(real_t *b)
MFEM_HOST_DEVICE Buffers & dI1(real_t *b)
MFEM_HOST_DEVICE Buffers & dI3b(real_t *b)
MFEM_HOST_DEVICE Buffers & dI2b(real_t *b)
MFEM_HOST_DEVICE Buffers & dI1b(real_t *b)
MFEM_HOST_DEVICE Buffers & ddI2b(real_t *b)
MFEM_HOST_DEVICE Buffers & ddI1b(real_t *b)
MFEM_HOST_DEVICE Buffers & ddI3b(real_t *b)
MFEM_HOST_DEVICE real_t Get_I3()
MFEM_HOST_DEVICE real_t Get_I3b(real_t &sign_detJ)
MFEM_HOST_DEVICE real_t Get_I3b_p()
MFEM_HOST_DEVICE real_t * Get_dI2()
MFEM_HOST_DEVICE real_t * Get_dI1b()
MFEM_HOST_DEVICE real_t * Get_dI3b(const real_t sign_detJ)
MFEM_HOST_DEVICE void Get_B_offd()
MFEM_HOST_DEVICE real_t * Get_ddI2b(int i, int j)
MFEM_HOST_DEVICE real_t Get_I3b()
MFEM_HOST_DEVICE real_t Get_I1b()
MFEM_HOST_DEVICE real_t * Get_ddI2(int i, int j)
MFEM_HOST_DEVICE real_t * Get_ddI1(int i, int j)
MFEM_HOST_DEVICE real_t Get_I1()
MFEM_HOST_DEVICE real_t * Get_dI1()
MFEM_HOST_DEVICE real_t * Get_dI2b()
MFEM_HOST_DEVICE InvariantsEvaluator3D(Buffers &b)
MFEM_HOST_DEVICE real_t * Get_ddI1b(int i, int j)
MFEM_HOST_DEVICE real_t Get_I3b_p(real_t &sign_detJ)
MFEM_HOST_DEVICE real_t Get_I2b()
MFEM_HOST_DEVICE real_t Get_I2()
MFEM_HOST_DEVICE real_t * Get_ddI3b(int i, int j)
real_t u(const Vector &xvec)