23 return Vector({
CheckZ(z) ? - (1.0 - y - z) / (1.0 - z) : -0.5,
24 CheckZ(z) ? - (1.0 - x - z) / (1.0 - z) : -0.5,
25 CheckZ(z) ? x * y / ((1.0 - z) * (1.0 - z)) - 1.0 : -0.75});
30 return Vector({
CheckZ(z) ? (1.0 - y - z) / (1.0 - z) : 0.5,
31 CheckZ(z) ? - x / (1.0 - z) : -0.5,
32 CheckZ(z) ? - x * y / ((1.0 - z) * (1.0 - z)) : -0.25});
38 CheckZ(z) ? x / (1.0 - z) : 0.5,
39 CheckZ(z) ? x * y / ((1.0 - z) * (1.0 - z)) : 0.25});
45 CheckZ(z) ? (1.0 - x - z) / (1.0 - z) : 0.5,
46 CheckZ(z) ? - x * y / ((1.0 - z) * (1.0 - z)) : -0.25});
51 return Vector({0.0, 0.0, 1.0});
121 lgl *= (
one - y - z) / (
one - z);
128 lgl *= x / (
one - z);
135 lgl *= y / (
one - z);
142 lgl *= y / (
one - z);
149 lgl *= (
one - x - z) / (
one - z);
156 lgl *= (
one - x - z) / (
one - z);
161{
return (1.0 - z - y) / (1.0 - z); }
164{
return x / (1.0 - z); }
167{
return y / (1.0 - z); }
170{
return -y / (1.0 - z); }
173{
return (1.0 - z - x) / (1.0 - z); }
176{
return -(1.0 - z - x) / (1.0 - z); }
188 Vector dmu({0.0, 0.0, - xy[ab-1] / pow(1.0 - z, 2)});
189 dmu[ab-1] = -1.0 / (1.0 - z);
195 Vector dmu({0.0, 0.0, xy[ab-1] / pow(1.0 - z, 2)});
196 dmu[ab-1] = 1.0 / (1.0 - z);
218 Vector dnu({0.0, 0.0, -1.0}); dnu[ab-1] = -1.0;
224 Vector dnu({0.0, 0.0, 0.0}); dnu[ab-1] = 1.0;
230 return Vector({0.0, 0.0, 1.0});
282 Vector v01(3), v12(3), v20(3);
288 add(nu(0), v12, nu(1), v20, nudnu);
289 nudnu.
Add(nu(2), v01);
296 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
300 for (
int i = 1; i <=
p; i++)
309 for (
int i = 1; i <=
p; i++) {
u[i] = 0.0; }
317 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
322 dudt[0] = - dudx[0] * x / t;
323 for (
int i = 1; i <=
p; i++)
326 dudx[i] *= pow(t, i - 1);
327 dudt[i] = (
u[i] * i - dudx[i] * x) / t;
342 for (
int i = 2; i <=
p; i++)
354 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
355 MFEM_ASSERT(
u.Size() >=
p+1,
"Size of u is too small");
362 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
363 MFEM_ASSERT(
u.Size() >=
p+1,
"Size of u is too small");
364 MFEM_ASSERT(dudx.
Size() >=
p+1,
"Size of dudx is too small");
365 MFEM_ASSERT(dudt.
Size() >=
p+1,
"Size of dudt is too small");
372 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
376 for (
int i =
p; i >= 2; i--)
378 u[i] = (
u[i] - t * t *
u[i-2]) / (4.0 * i - 2.0);
388 for (
int i = 0; i <=
p; i++)
399 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
403 for (
int i =
p; i >= 2; i--)
405 u[i] = (
u[i] - t * t *
u[i-2]) / (4.0 * i - 2.0);
406 dudx[i] = (dudx[i] - t * t * dudx[i-2]) / (4.0 * i - 2.0);
407 dudt[i] = (dudt[i] - t * t * dudt[i-2] - 2.0 * t *
u[i-2]) /
412 u[1] = x; dudx[1] = 1.0; dudt[1] = 0.0;
414 u[0] = 0.0; dudx[0] = 0.0; dudt[0] = 0.0;
418 for (
int i = 0; i <=
p; i++)
430 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
431 MFEM_ASSERT(
u.Size() >=
p+1,
"Size of u is too small");
439 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
440 MFEM_ASSERT(
u.Size() >=
p+1,
"Size of u is too small");
441 MFEM_ASSERT(dudx.
Size() >=
p+1,
"Size of dudx is too small");
442 MFEM_ASSERT(dudt.
Size() >=
p+1,
"Size of dudt is too small");
450 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
459 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
461 for (
int i = 0; i <=
p; i++) { duds1[i] += duds0[i]; }
467 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
468 MFEM_ASSERT(
u.Size() >=
p+1,
"Size of u is too small");
477 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
478 MFEM_ASSERT(
u.Size() >=
p+1,
"Size of u is too small");
479 MFEM_ASSERT(duds0.
Size() >=
p+1,
"Size of duds0 is too small");
480 MFEM_ASSERT(duds1.
Size() >=
p+1,
"Size of duds1 is too small");
489 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
498 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
500 for (
int i = 0; i <=
p; i++) { dudt1[i] += dudt0[i]; }
507 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
508 MFEM_ASSERT(
u.Size() >=
p+1,
"Size of u is too small");
517 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
518 MFEM_ASSERT(
u.Size() >=
p+1,
"Size of u is too small");
519 MFEM_ASSERT(dudt0.
Size() >=
p+1,
"Size of dudt0 is too small");
520 MFEM_ASSERT(dudt1.
Size() >=
p+1,
"Size of dudt1 is too small");
529 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
533 for (
int i =
p; i >= 2; i--)
541 u[i] =
a *
u[i] +
b * t *
u[i - 1] - c * t * t *
u[i - 2];
552 for (
int i = 1; i <=
p; i++)
565 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
567 for (
int i =
p; i >= 2; i--)
575 u[i] =
a *
u[i] +
b * t *
u[i - 1] - c * t * t *
u[i - 2];
576 dudx[i] =
a * dudx[i] +
b * t * dudx[i - 1] - c * t * t * dudx[i - 2];
577 dudt[i] =
a * dudt[i] +
b * t * dudt[i - 1] +
b *
u[i - 1]
578 - c * t * t * dudt[i - 2] - 2.0 * c * t *
u[i - 2];
595 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
600 u[1] = (2.0 +
alpha) * x - t;
602 for (
int i = 2; i <=
p; i++)
608 u[i] = (
b * (c * (2.0 * x - t) +
alpha *
alpha * t) *
u[i - 1]
609 - d * t * t *
u[i - 2]) /
a;
617 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
624 u[1] = (2.0 +
alpha) * x - t;
625 dudx[1] = 2.0 +
alpha;
628 for (
int i = 2; i <=
p; i++)
634 u[i] = (
b * (c * (2.0 * x - t) +
alpha *
alpha * t) *
u[i - 1]
635 - d * t * t *
u[i - 2]) /
a;
636 dudx[i] = (
b * ((c * (2.0 * x - t) +
alpha *
alpha * t) * dudx[i - 1] +
638 - d * t * t * dudx[i - 2]) /
a;
639 dudt[i] = (
b * ((c * (2.0 * x - t) +
alpha *
alpha * t) * dudt[i - 1] +
641 - d * t * t * dudt[i - 2] - 2.0 * d * t *
u[i - 2]) /
a;
649 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
650 MFEM_ASSERT(
u.Size() >=
p+1,
"Size of u is too small");
658 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
659 MFEM_ASSERT(
u.Size() >=
p+1,
"Size of u is too small");
660 MFEM_ASSERT(dudx.
Size() >=
p+1,
"Size of dudx is too small");
661 MFEM_ASSERT(dudt.
Size() >=
p+1,
"Size of dudt is too small");
671 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
673 for (
int i = 0; i <=
p; i++) { dudt1[i] += dudt0[i]; }
680 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
681 MFEM_ASSERT(
u.Size() >=
p+1,
"Size of u is too small");
690 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
691 MFEM_ASSERT(
u.Size() >=
p+1,
"Size of u is too small");
692 MFEM_ASSERT(dudt0.
Size() >=
p+1,
"Size of dudt0 is too small");
693 MFEM_ASSERT(dudt1.
Size() >=
p+1,
"Size of dudt1 is too small");
703 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
705 for (
int i = 0; i <=
p; i++) { dudt1[i] += dudt0[i]; }
712 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
713 MFEM_ASSERT(
u.Size() >=
p+1,
"Size of u is too small");
722 MFEM_ASSERT(
p >= 0,
"Polynomial order must be zero or larger");
723 MFEM_ASSERT(
u.Size() >=
p+1,
"Size of u is too small");
724 MFEM_ASSERT(dudt0.
Size() >=
p+1,
"Size of dudt0 is too small");
725 MFEM_ASSERT(dudt1.
Size() >=
p+1,
"Size of dudt1 is too small");
733 MFEM_ASSERT(
p >= 2,
"Polynomial order must be two or larger");
740 MFEM_ASSERT(
p >= 2,
"Polynomial order must be two or larger");
746 MFEM_ASSERT(
p >= 2,
"Polynomial order must be two or larger");
747 MFEM_ASSERT(
u.Size() >=
p+1,
"Size of u is too small");
753 MFEM_ASSERT(
p >= 2,
"Polynomial order must be two or larger");
754 MFEM_ASSERT(s.
Size() >= 2,
"Size of s must be 2 or larger");
755 MFEM_ASSERT(
u.Size() >=
p+1,
"Size of u is too small");
756 MFEM_ASSERT(duds.
Height() >=
p+1,
"First dimension of duds is too small");
757 MFEM_ASSERT(duds.
Width() >= 2,
758 "Second dimension of duds must be 2 or larger");
765 MFEM_ASSERT(
p >= 2,
"Polynomial order must be two or larger");
766 MFEM_ASSERT(s.
Size() >= 2,
"Size of s must be 2 or larger");
767 MFEM_ASSERT(grad_s.
Height() >= 2,
768 "First dimension of grad_s must be 2");
769 MFEM_ASSERT(grad_s.
Width() >= 3,
770 "Second dimension of grad_s must be 3");
771 MFEM_ASSERT(
u.Size() >=
p+1,
"Size of u is too small");
772 MFEM_ASSERT(grad_u.
Height() >=
p+1,
773 "First dimension of grad_u is too small");
775 "Second dimension of grad_u must match that of grad_s");
776#ifdef MFEM_THREAD_SAFE
783 Mult(duds, grad_s, grad_u);
788 MFEM_ASSERT(
p >= 2,
"Polynomial order must be two or larger");
789 MFEM_ASSERT(s.
Size() >= 2,
"Size of s must be 2 or larger");
790 MFEM_ASSERT(t.
Size() >= 2,
"Size of t must be 2 or larger");
791 MFEM_ASSERT(
u.Height() >=
p+1,
"First dimension of u is too small");
792 MFEM_ASSERT(
u.Width() >=
p+1,
"Second dimension of u is too small");
794#ifdef MFEM_THREAD_SAFE
798 Vector &phi_E_i = phi_Q_vtmp1;
799 Vector &phi_E_j = phi_Q_vtmp2;
807 for (
int j=0; j<=
p; j++)
808 for (
int i=0; i<=
p; i++)
810 u(i,j) = phi_E_i[i] * phi_E_j[j];
818 MFEM_ASSERT(
p >= 2,
"Polynomial order must be two or larger");
819 MFEM_ASSERT(s.
Size() >= 2,
"Size of s must be 2 or larger");
820 MFEM_ASSERT(grad_s.
Height() >= 2,
821 "First dimension of grad_s must be 2 or larger");
822 MFEM_ASSERT(grad_s.
Width() >= 3,
823 "Second dimension of grad_s must be 3 or larger");
824 MFEM_ASSERT(t.
Size() >= 2,
"Size of t must be 2 or larger");
825 MFEM_ASSERT(grad_t.
Height() >= 2,
826 "First dimension of grad_t must be 2 or larger");
827 MFEM_ASSERT(grad_t.
Width() >= 3,
828 "Second dimension of grad_t must be 3 or larger");
829 MFEM_ASSERT(
u.Height() >=
p+1,
"First dimension of u is too small");
830 MFEM_ASSERT(
u.Width() >=
p+1,
"First dimension of u is too small");
831 MFEM_ASSERT(grad_u.
SizeI() >=
p+1,
832 "First dimension of grad_u is too small");
833 MFEM_ASSERT(grad_u.
SizeJ() >=
p+1,
834 "Second dimension of grad_u is too small");
835 MFEM_ASSERT(grad_u.
SizeK() >= 3,
836 "Third dimension of grad_u must be 3 or larger");
838#ifdef MFEM_THREAD_SAFE
844 Vector &phi_E_i = phi_Q_vtmp1;
845 Vector &phi_E_j = phi_Q_vtmp2;
851 phi_E(
p, s, grad_s, phi_E_i, dphi_E_i);
855 phi_E(
p, t, grad_t, phi_E_j, dphi_E_j);
857 for (
int j=0; j<=
p; j++)
858 for (
int i=0; i<=
p; i++)
860 u(i,j) = phi_E_i[i] * phi_E_j[j];
862 for (
int k=0; k<3; k++)
864 phi_E_i(i) * dphi_E_j(j,k) + dphi_E_i(i,k) * phi_E_j(j);
870 MFEM_ASSERT(
p >= 3,
"Polynomial order must be three or larger");
871 MFEM_ASSERT(s.
Size() >= 3,
"Size of s must be 3 or larger");
872 MFEM_ASSERT(
u.Height() >=
p,
"First dimension of u is too small");
873 MFEM_ASSERT(
u.Width() >=
p-1,
"Second dimension of u is too small");
875#ifdef MFEM_THREAD_SAFE
879 Vector &phi_E_i = phi_T_vtmp1;
880 Vector &L_j = phi_T_vtmp2;
888 for (
int i = 2; i <
p; i++)
893 for (
int j = 1; i + j <=
p; j++)
895 u(i,j) = phi_E_i[i] * L_j[j];
903 MFEM_ASSERT(
p >= 3,
"Polynomial order must be three or larger");
904 MFEM_ASSERT(s.
Size() >= 3,
"Size of s must be 3 or larger");
905 MFEM_ASSERT(grad_s.
Height() >= 3,
906 "First dimension of grad_s must be 2 or larger");
907 MFEM_ASSERT(grad_s.
Width() >= 3,
908 "Second dimension of grad_s must be 3 or larger");
909 MFEM_ASSERT(
u.Height() >=
p,
"First dimension of u is too small");
910 MFEM_ASSERT(
u.Width() >=
p-1,
"Second dimension of u is too small");
911 MFEM_ASSERT(grad_u.
SizeI() >=
p,
912 "First dimension of grad_u is too small");
913 MFEM_ASSERT(grad_u.
SizeJ() >=
p-1,
914 "Second dimension of grad_u is too small");
915 MFEM_ASSERT(grad_u.
SizeK() >= 3,
916 "Third dimension of grad_u must be 3 or larger");
918#ifdef MFEM_THREAD_SAFE
925 Vector &phi_E_i = phi_T_vtmp1;
927 Vector &L_j = phi_T_vtmp2;
928 Vector &dL_j_dx = phi_T_vtmp3;
929 Vector &dL_j_dt = phi_T_vtmp4;
933 phi_E(
p-1, s, grad_s, phi_E_i, dphi_E_i);
941 for (
int i = 2; i <
p; i++)
947 for (
int j = 1; i + j <=
p; j++)
949 u(i,j) = phi_E_i[i] * L_j[j];
951 for (
int d=0; d<3; d++)
952 grad_u(i, j, d) = dphi_E_i(i, d) * L_j[j] +
953 phi_E_i[i] * (dL_j_dx[j] * (grad_s(0, d) +
955 dL_j_dt[j] * grad_s(2, d));
962 MFEM_ASSERT(
p >= 1,
"Polynomial order must be one or larger");
963 MFEM_ASSERT(s.
Size() >= 2,
"Size of s must be 2 or larger");
964 MFEM_ASSERT(sds.
Size() >= 3,
"Size of sds must be 3 or larger");
965 MFEM_ASSERT(
u.Height() >=
p,
"First dimension of u is too small");
966 MFEM_ASSERT(
u.Width() >= 3,
"Second dimension of u must be 3 or larger");
968#ifdef MFEM_THREAD_SAFE
975 for (
int i=0; i<
p; i++)
977 u(i,0) = P_i(i) * sds(0);
978 u(i,1) = P_i(i) * sds(1);
979 u(i,2) = P_i(i) * sds(2);
986 MFEM_ASSERT(
p >= 1,
"Polynomial order must be one or larger");
987 MFEM_ASSERT(s.
Size() >= 2,
"Size of s must be 2 or larger");
988 MFEM_ASSERT(grad_s.
Height() >= 2,
989 "First dimension of grad_s must be 2 or larger");
990 MFEM_ASSERT(grad_s.
Width() >= 3,
991 "Second dimension of grad_s must be 3 or larger");
992 MFEM_ASSERT(
u.Height() >=
p,
"First dimension of u is too small");
993 MFEM_ASSERT(
u.Width() >= 3,
"Second dimension of u must be 3 or larger");
994 MFEM_ASSERT(curl_u.
Height() >=
p,
995 "First dimension of curl_u is too small");
996 MFEM_ASSERT(curl_u.
Width() >= 3,
997 "Second dimension of curl_u must be 3 or larger");
999#ifdef MFEM_THREAD_SAFE
1007 Vector grad_s0({grad_s(0,0), grad_s(0,1), grad_s(0,2)});
1008 Vector grad_s1({grad_s(1,0), grad_s(1,1), grad_s(1,2)});
1010 add(s(0), grad_s1, -s(1), grad_s0, sds);
1013 grad_s0.cross3D(grad_s1, dsxds);
1015 for (
int i=0; i<
p; i++)
1017 u(i,0) = P_i(i) * sds(0);
1018 u(i,1) = P_i(i) * sds(1);
1019 u(i,2) = P_i(i) * sds(2);
1021 curl_u(i, 0) = (i + 2) * P_i(i) * dsxds(0);
1022 curl_u(i, 1) = (i + 2) * P_i(i) * dsxds(1);
1023 curl_u(i, 2) = (i + 2) * P_i(i) * dsxds(2);
1030 MFEM_ASSERT(
p >= 2,
"Polynomial order must be two or larger");
1031 MFEM_ASSERT(s.
Size() >= 2,
"Size of s must be 2 or larger");
1032 MFEM_ASSERT(sds.
Size() >= 3,
"Size of sds must be 3 or larger");
1033 MFEM_ASSERT(t.
Size() >= 2,
"Size of t must be 2 or larger");
1034 MFEM_ASSERT(
u.SizeI() >=
p,
"First dimension of u is too small");
1035 MFEM_ASSERT(
u.SizeJ() >=
p+1,
"Second dimension of u is too small");
1036 MFEM_ASSERT(
u.SizeK() >= 3,
"Third dimension of u must be 3 or larger");
1038#ifdef MFEM_THREAD_SAFE
1044 Vector &phi_E_j = E_Q_vtmp;
1047 E_E(
p, s, sds, E_E_i);
1052 for (
int k=0; k<3; k++)
1054 u(k).SetCol(0, 0.0);
1055 u(k).SetCol(1, 0.0);
1058 for (
int j=2; j<=
p; j++)
1059 for (
int i=0; i<
p; i++)
1060 for (
int k=0; k<3; k++)
1062 u(i, j, k) = phi_E_j(j) * E_E_i(i, k);
1070 MFEM_ASSERT(
p >= 2,
"Polynomial order must be two or larger");
1071 MFEM_ASSERT(s.
Size() >= 2,
"Size of s must be 2 or larger");
1072 MFEM_ASSERT(grad_s.
Height() >= 2,
1073 "First dimension of grad_s must be 2");
1074 MFEM_ASSERT(grad_s.
Width() >= 3,
1075 "Second dimension of grad_s must be 3");
1076 MFEM_ASSERT(t.
Size() >= 2,
"Size of t must be 2 or larger");
1077 MFEM_ASSERT(grad_t.
Height() >= 2,
1078 "First dimension of grad_t must be 2");
1079 MFEM_ASSERT(grad_t.
Width() >= 3,
1080 "Second dimension of grad_t must be 3");
1081 MFEM_ASSERT(
u.SizeI() >=
p,
"First dimension of u is too small");
1082 MFEM_ASSERT(
u.SizeJ() >=
p+1,
"Second dimension of u is too small");
1083 MFEM_ASSERT(
u.SizeK() >= 3,
"Third dimension of u must be 3 or larger");
1084 MFEM_ASSERT(curl_u.
SizeI() >=
p,
"First dimension of curl_u is too small");
1085 MFEM_ASSERT(curl_u.
SizeJ() >=
p+1,
1086 "Second dimension of curl_u is too small");
1087 MFEM_ASSERT(curl_u.
SizeK() >= 3,
1088 "Third dimension of curl_u must be 3 or larger");
1090#ifdef MFEM_THREAD_SAFE
1096 Vector &phi_E_j = E_Q_vtmp;
1103 phi_E(
p, t, grad_t, phi_E_j, dphi_E_j);
1107 E_E(
p, s, grad_s, E_E_i, dE_E_i);
1109 for (
int k=0; k<3; k++)
1111 u(k).SetCol(0, 0.0);
1112 u(k).SetCol(1, 0.0);
1113 curl_u(k).SetCol(0, 0.0);
1114 curl_u(k).SetCol(1, 0.0);
1117 for (
int j=2; j<=
p; j++)
1118 for (
int i=0; i<
p; i++)
1120 for (
int k=0; k<3; k++)
1122 u(i, j, k) = phi_E_j(j) * E_E_i(i, k);
1125 curl_u(i, j, 0) = phi_E_j(j) * dE_E_i(i, 0)
1126 + dphi_E_j(j, 1) * E_E_i(i, 2)
1127 - dphi_E_j(j, 2) * E_E_i(i, 1);
1128 curl_u(i, j, 1) = phi_E_j(j) * dE_E_i(i, 1)
1129 + dphi_E_j(j, 2) * E_E_i(i, 0)
1130 - dphi_E_j(j, 0) * E_E_i(i, 2);
1131 curl_u(i, j, 2) = phi_E_j(j) * dE_E_i(i, 2)
1132 + dphi_E_j(j, 0) * E_E_i(i, 1)
1133 - dphi_E_j(j, 1) * E_E_i(i, 0);
1139 MFEM_ASSERT(
p >= 2,
"Polynomial order must be two or larger");
1140 MFEM_ASSERT(s.
Size() >= 3,
"Size of s must be 3 or larger");
1141 MFEM_ASSERT(sds.
Size() >= 3,
"Size of sds must be 3 or larger");
1142 MFEM_ASSERT(
u.SizeI() >=
p - 1,
"First dimension of u is too small");
1143 MFEM_ASSERT(
u.SizeJ() >=
p,
"Second dimension of u is too small");
1144 MFEM_ASSERT(
u.SizeK() >= 3,
"Third dimension of u must be 3 or larger");
1146#ifdef MFEM_THREAD_SAFE
1154 E_E(
p - 1, s, sds, E_E_i);
1157 for (
int i=0; i<
p-1; i++)
1162 u(i, 0, 0) = 0.0;
u(i, 0, 1) = 0.0;
u(i, 0, 2) = 0.0;
1163 for (
int j=1; i+j<
p; j++)
1164 for (
int k=0; k<3; k++)
1166 u(i, j, k) = L_j(j) * E_E_i(i, k);
1174 MFEM_ASSERT(
p >= 2,
"Polynomial order must be two or larger");
1175 MFEM_ASSERT(s.
Size() >= 3,
"Size of s must be 3 or larger");
1176 MFEM_ASSERT(grad_s.
Height() >= 3,
1177 "First dimension of grad_s must be 3");
1178 MFEM_ASSERT(grad_s.
Width() >= 3,
1179 "Second dimension of grad_s must be 3");
1180 MFEM_ASSERT(
u.SizeI() >=
p - 1,
"First dimension of u is too small");
1181 MFEM_ASSERT(
u.SizeJ() >=
p,
"Second dimension of u is too small");
1182 MFEM_ASSERT(
u.SizeK() >= 3,
"Third dimension of u must be 3 or larger");
1183 MFEM_ASSERT(curl_u.
SizeI() >=
p - 1,
1184 "First dimension of curl_u is too small");
1185 MFEM_ASSERT(curl_u.
SizeJ() >=
p,
1186 "Second dimension of curl_u is too small");
1187 MFEM_ASSERT(curl_u.
SizeK() >= 3,
1188 "Third dimension of curl_u must be 3 or larger");
1190#ifdef MFEM_THREAD_SAFE
1198 Vector &dL_j_dx = E_T_vtmp2;
1199 Vector &dL_j_dt = E_T_vtmp3;
1207 E_E(
p - 1, s, grad_s, E_E_i, dE_E_i);
1212 for (
int i=0; i<
p-1; i++)
1218 u(i, 0, 0) = 0.0;
u(i, 0, 1) = 0.0;
u(i, 0, 2) = 0.0;
1219 curl_u(i, 0, 0) = 0.0; curl_u(i, 0, 1) = 0.0; curl_u(i, 0, 2) = 0.0;
1220 for (
int j=1; i+j<
p; j++)
1222 dL(0) = dL_j_dx(j); dL(1) = dL_j_dx(j); dL(2) = dL_j_dt(j);
1226 for (
int k=0; k<3; k++)
1228 u(i, j, k) = L_j(j) * E_E_i(i, k);
1229 curl_u(i, j, k) = L_j(j) * dE_E_i(i, k);
1231 curl_u(i, j, 0) += grad_L(1) * E_E_i(i, 2) - grad_L(2) * E_E_i(i, 1);
1232 curl_u(i, j, 1) += grad_L(2) * E_E_i(i, 0) - grad_L(0) * E_E_i(i, 2);
1233 curl_u(i, j, 2) += grad_L(0) * E_E_i(i, 1) - grad_L(1) * E_E_i(i, 0);
1241 MFEM_ASSERT(
p >= 1,
"Polynomial order must be one or larger");
1242 MFEM_ASSERT(s.
Size() >= 2,
"Size of s must be 2 or larger");
1243 MFEM_ASSERT(sds.
Size() >= 3,
"Size of sds must be 3 or larger");
1244 MFEM_ASSERT(t.
Size() >= 2,
"Size of t must be 2 or larger");
1245 MFEM_ASSERT(tdt.
Size() >= 3,
"Size of tdt must be 3 or larger");
1246 MFEM_ASSERT(
u.SizeI() >=
p,
"First dimension of u is too small");
1247 MFEM_ASSERT(
u.SizeJ() >=
p,
"Second dimension of u is too small");
1248 MFEM_ASSERT(
u.SizeK() >= 3,
"Third dimension of u must be 3 or larger");
1250#ifdef MFEM_THREAD_SAFE
1258 E_E(
p, s, sds, E_E_i);
1261 E_E(
p, t, tdt, E_E_j);
1263 for (
int j=0; j<
p; j++)
1264 for (
int i=0; i<
p; i++)
1266 u(i, j, 0) = E_E_i(i, 1) * E_E_j(j, 2) - E_E_i(i, 2) * E_E_j(j, 1);
1267 u(i, j, 1) = E_E_i(i, 2) * E_E_j(j, 0) - E_E_i(i, 0) * E_E_j(j, 2);
1268 u(i, j, 2) = E_E_i(i, 0) * E_E_j(j, 1) - E_E_i(i, 1) * E_E_j(j, 0);
1274 MFEM_ASSERT(
p >= 1,
"Polynomial order must be one or larger");
1275 MFEM_ASSERT(s.
Size() >= 2,
"Size of s must be 2 or larger");
1276 MFEM_ASSERT(sdsxds.
Size() >= 3,
"Size of sdsxds must be 3 or larger");
1277 MFEM_ASSERT(
u.SizeI() >=
p,
"First dimension of u is too small");
1278 MFEM_ASSERT(
u.SizeJ() >=
p,
"Second dimension of u is too small");
1279 MFEM_ASSERT(
u.SizeK() >= 3,
"Third dimension of u must be 3 or larger");
1281#ifdef MFEM_THREAD_SAFE
1292 for (
int i=0; i<
p; i++)
1296 for (
int j=0; i + j <
p; j++)
1298 const real_t vij = P_i(i) * P_j(j);
1299 u(i,j,0) = vij * sdsxds(0);
1300 u(i,j,1) = vij * sdsxds(1);
1301 u(i,j,2) = vij * sdsxds(2);
1309 MFEM_ASSERT(
p >= 1,
"Polynomial order must be one or larger");
1310 MFEM_ASSERT(s.
Size() >= 2,
"Size of s must be 2 or larger");
1311 MFEM_ASSERT(sdsxds.
Size() >= 3,
"Size of sdsxds must be 3 or larger");
1312 MFEM_ASSERT(
u.SizeI() >=
p,
"First dimension of u is too small");
1313 MFEM_ASSERT(
u.SizeJ() >=
p,
"Second dimension of u is too small");
1314 MFEM_ASSERT(
u.SizeK() >= 3,
"Third dimension of u must be 3 or larger");
1315 MFEM_ASSERT(du.
Height() >=
p,
"First dimension of du is too small");
1316 MFEM_ASSERT(du.
Width() >=
p,
"Second dimension of du is too small");
1318#ifdef MFEM_THREAD_SAFE
1329 for (
int i=0; i<
p; i++)
1333 for (
int j=0; i + j <
p; j++)
1335 const real_t vij = P_i(i) * P_j(j);
1336 u(i,j,0) = vij * sdsxds(0);
1337 u(i,j,1) = vij * sdsxds(1);
1338 u(i,j,2) = vij * sdsxds(2);
1340 du(i,j) = (i+j+3) * vij * dsdsxds;
1348 MFEM_ASSERT(
p >= 1,
"Polynomial order must be one or larger");
1349 MFEM_ASSERT(s.
Size() >= 2,
"Size of s must be 2 or larger");
1350 MFEM_ASSERT(sds.
Size() >= 3,
"Size of sds must be 3 or larger");
1351 MFEM_ASSERT(sdsxds.
Size() >= 3,
"Size of sdsxds must be 3 or larger");
1352 MFEM_ASSERT(grad_mu.
Size() >= 3,
"Size of grad_mu must be 3 or larger");
1353 MFEM_ASSERT(
u.SizeI() >=
p,
"First dimension of u is too small");
1354 MFEM_ASSERT(
u.SizeJ() >=
p,
"Second dimension of u is too small");
1355 MFEM_ASSERT(
u.SizeK() >= 3,
"Third dimension of u must be 3 or larger");
1357#ifdef MFEM_THREAD_SAFE
1367 Vector &P_i = VT_T_vtmp1;
1374 E_E(1, s2, sds, EE0);
1381 V_T(1, s, sdsxds, VT00);
1383 Vector &J_j = VT_T_vtmp2;
1388 for (
int i=0; i<
p; i++)
1391 for (
int j=0; i+j<
p; j++)
1392 for (
int k=0; k<3; k++)
1393 u(i, j, k) = P_i(i) * J_j(j) *
1394 (
mu * VT00(0,0,k) + s(2) * dmuxEE(k));
1402 MFEM_ASSERT(
p >= 1,
"Polynomial order must be one or larger");
1403 MFEM_ASSERT(s.
Size() >= 2,
"Size of s must be 2 or larger");
1404 MFEM_ASSERT(sds.
Size() >= 3,
"Size of sds must be 3 or larger");
1405 MFEM_ASSERT(sdsxds.
Size() >= 3,
"Size of sdsxds must be 3 or larger");
1406 MFEM_ASSERT(grad_s2.
Size() >= 3,
"Size of grad_s2 must be 3 or larger");
1407 MFEM_ASSERT(grad_mu.
Size() >= 3,
"Size of grad_mu must be 3 or larger");
1408 MFEM_ASSERT(
u.SizeI() >=
p,
"First dimension of u is too small");
1409 MFEM_ASSERT(
u.SizeJ() >=
p,
"Second dimension of u is too small");
1410 MFEM_ASSERT(
u.SizeK() >= 3,
"Third dimension of u must be 3 or larger");
1411 MFEM_ASSERT(du.
Height() >=
p,
"First dimension of du is too small");
1412 MFEM_ASSERT(du.
Width() >=
p,
"Second dimension of du is too small");
1414#ifdef MFEM_THREAD_SAFE
1424 Vector &P_i = VT_T_vtmp1;
1431 E_E(1, s2, sds, EE0);
1441 V_T(1, s, sdsxds, VT00);
1443 Vector &J_j = VT_T_vtmp2;
1451 for (
int i=0; i<
p; i++)
1454 for (
int j=0; i+j<
p; j++)
1456 for (
int k=0; k<3; k++)
1458 u(i, j, k) = P_i(i) * J_j(j) *
1459 (
mu * VT00(0, 0, k) + s(2) * dmuxEE(k));
1461 EV(k) = (i+j+3) * EExds2(k) - VT00(0, 0, k);
1464 du(i, j) = P_i(i) * J_j(j) * (grad_mu * EV);
1474 MFEM_ASSERT(
p >= 2,
"Polynomial order must be two or larger");
1475 MFEM_ASSERT(sx.
Size() >= 2,
"Size of sx must be 2 or larger");
1476 MFEM_ASSERT(grad_sx.
Height() >= 2,
1477 "First dimension of grad_sx must be 2 or larger");
1478 MFEM_ASSERT(grad_sx.
Width() >= 3,
1479 "Second dimension of grad_sx must be 3 or larger");
1480 MFEM_ASSERT(sy.
Size() >= 2,
"Size of sy must be 2 or larger");
1481 MFEM_ASSERT(grad_sy.
Height() >= 2,
1482 "First dimension of grad_sy must be 2 or larger");
1483 MFEM_ASSERT(grad_sy.
Width() >= 3,
1484 "Second dimension of grad_sy must be 3 or larger");
1485 MFEM_ASSERT(grad_t.
Size() >= 3,
"Size of grad_t must be 3 or larger");
1486 MFEM_ASSERT(
u.SizeI() >=
p+1,
"First dimension of u is too small");
1487 MFEM_ASSERT(
u.SizeJ() >=
p+1,
"Second dimension of u is too small");
1488 MFEM_ASSERT(
u.SizeK() >= 3,
"Third dimension of u must be 3 or larger");
1490#ifdef MFEM_THREAD_SAFE
1496 Vector &phi_E_i = V_L_vtmp1;
1497 Vector &phi_E_j = V_L_vtmp2;
1505 phi_E(
p, sx, grad_sx, phi_E_i, dphi_E_i);
1509 phi_E(
p, sy, grad_sy, phi_E_j, dphi_E_j);
1517 for (
int j=2; j<=
p; j++)
1519 for (
int l=0; l<3; l++) { dphij[l] = dphi_E_j(j, l); }
1520 for (
int i=2; i<=
p; i++)
1522 for (
int l=0; l<3; l++) { dphii[l] = dphi_E_i(i, l); }
1524 dphii.
cross3D(dphij, dphidphi);
1526 add(phi_E_i(i), dphij, -phi_E_j(j), dphii, phidphi);
1528 grad_t3.
cross3D(phidphi, dtphidphi);
1530 for (
int l=0; l<3; l++)
1532 u(i, j, l) = t * (t * dphidphi(l) + dtphidphi(l));
1542 MFEM_ASSERT(
p >= 2,
"Polynomial order must be two or larger");
1543 MFEM_ASSERT(s.
Size() >= 2,
"Size of s must be 2 or larger");
1544 MFEM_ASSERT(grad_s.
Height() >= 2,
1545 "First dimension of grad_s must be 2");
1546 MFEM_ASSERT(grad_s.
Width() >= 3,
1547 "Second dimension of grad_s must be 3");
1548 MFEM_ASSERT(dmu.
Size() >= 3,
"Size of dmu must be 3 or larger");
1549 MFEM_ASSERT(dt.
Size() >= 3,
"Size of dt must be 3 or larger");
1550 MFEM_ASSERT(
u.Height() >=
p+1,
"First dimension of u is too small");
1551 MFEM_ASSERT(
u.Width() >= 3,
"Second dimension of u is too small");
1553#ifdef MFEM_THREAD_SAFE
1557 Vector &phi_E_i = V_R_vtmp;
1562 phi_E(
p, s, grad_s, phi_E_i, dphi_E_i);
1573 for (
int i=2; i<=
p; i++)
1576 for (
int l=0; l<3; l++) { dphi[l] = dphi_E_i(i, l); }
1577 add(t * t, dphi, 2.0 * t * phi_E_i(i), dt3, dphit2);
1578 dphit2.
cross3D(dmu3, dphixdmu);
1580 for (
int l=0; l<3; l++) {
u(i, l) = dphixdmu(l); }
Data type dense matrix using column-major storage.
void MultTranspose(const real_t *x, real_t *y) const
Multiply a vector with the transpose matrix.
void SetRow(int r, const real_t *row)
real_t * GetData() const
Returns the matrix data array.
void SetSize(int s)
Change the size of the DenseMatrix to s x s.
void GetColumn(int c, Vector &col) const
Rank 3 tensor (array of matrices)
void SetSize(int i, int j, int k, MemoryType mt_=MemoryType::PRESERVE)
static DenseMatrix grad_mu01(real_t z)
static Vector lam45_grad_lam45(real_t x, real_t y, real_t z)
void phi_Q(int p, Vector s, Vector t, DenseMatrix &u) const
static void CalcHomogenizedIntJacobi(int p, real_t alpha, real_t t0, real_t t1, real_t *u)
static Vector nu12(real_t z, Vector xy, unsigned int ab)
void V_R(int p, Vector s, const DenseMatrix &grad_s, real_t mu, Vector grad_mu, real_t t, Vector grad_t, DenseMatrix &u) const
static Vector lam125_grad_lam125(real_t x, real_t y, real_t z)
static Vector lam145_grad_lam145(real_t x, real_t y, real_t z)
static Vector lam45(real_t x, real_t y, real_t z)
static void phi_E(int p, real_t s0, real_t s1, real_t *u)
static Vector nu012(real_t z, Vector xy, unsigned int ab)
static DenseMatrix grad_nu120(real_t z, Vector xy, unsigned int ab)
static DenseMatrix grad_lam25(real_t x, real_t y, real_t z)
void E_E(int p, Vector s, Vector sds, DenseMatrix &u) const
static void CalcIntegratedLegendre(int p, real_t x, real_t t, real_t *u)
Integrated Legendre Polynomials.
static Vector nu01_grad_nu01(real_t z, Vector xy, unsigned int ab)
static Vector lam35(real_t x, real_t y, real_t z)
static Vector grad_lam5(real_t x, real_t y, real_t z)
static real_t div_lam345_grad_lam345(real_t x, real_t y, real_t z)
static Vector lam25(real_t x, real_t y, real_t z)
static Vector nu01(real_t z, Vector xy, unsigned int ab)
void VT_T(int p, Vector s, Vector sds, Vector sdsxds, real_t mu, Vector grad_mu, DenseTensor &u) const
static Vector lam25_grad_lam25(real_t x, real_t y, real_t z)
static Vector lam415_grad_lam415(real_t x, real_t y, real_t z)
static Vector lam235_grad_lam235(real_t x, real_t y, real_t z)
static Vector mu01(real_t z)
static DenseMatrix grad_nu012(real_t z, Vector xy, unsigned int ab)
static void CalcIntegratedJacobi(int p, real_t alpha, real_t x, real_t t, real_t *u)
Integrated Jacobi Polynomials.
static real_t div_lam145_grad_lam145(real_t x, real_t y, real_t z)
void V_L(int p, Vector sx, const DenseMatrix &grad_sx, Vector sy, const DenseMatrix &grad_sy, real_t t, Vector grad_t, DenseTensor &u) const
static Vector grad_lam4(real_t x, real_t y, real_t z)
static Vector grad_nu2(real_t z, const Vector xy, unsigned int ab)
static Vector grad_mu1(real_t z)
void V_Q(int p, Vector s, Vector ds, Vector t, Vector dt, DenseTensor &u) const
static void CalcScaledLegendre(int p, real_t x, real_t t, real_t *u)
Shifted and Scaled Legendre Polynomials.
void E_T(int p, Vector s, Vector sds, DenseTensor &u) const
static void CalcHomogenizedScaJacobi(int p, real_t alpha, real_t t0, real_t t1, real_t *u)
static Vector lam15_grad_lam15(real_t x, real_t y, real_t z)
Computes .
static Vector lam35_grad_lam35(real_t x, real_t y, real_t z)
static real_t div_lam415_grad_lam415(real_t x, real_t y, real_t z)
void V_T(int p, Vector s, Vector sdsxds, DenseTensor &u) const
static Vector lam435_grad_lam435(real_t x, real_t y, real_t z)
static real_t div_lam235_grad_lam235(real_t x, real_t y, real_t z)
static Vector grad_mu0(real_t z)
static constexpr real_t one
static DenseMatrix grad_lam35(real_t x, real_t y, real_t z)
static DenseMatrix grad_lam15(real_t x, real_t y, real_t z)
Gradients of the above two component vectors.
static Vector grad_nu1(real_t z, const Vector xy, unsigned int ab)
void E_Q(int p, Vector s, Vector ds, Vector t, DenseTensor &u) const
static Vector grad_lam1(real_t x, real_t y, real_t z)
Gradients of the "Affine" Coordinates.
static Vector lam15(real_t x, real_t y, real_t z)
Two component vectors associated with edges touching the apex.
static Vector mu01_grad_mu01(real_t z, Vector xy, unsigned int ab)
static Vector nu012_grad_nu012(real_t z, Vector xy, unsigned int ab)
static Vector grad_lam2(real_t x, real_t y, real_t z)
static Vector lam345_grad_lam345(real_t x, real_t y, real_t z)
static void CalcHomogenizedIntLegendre(int p, real_t t0, real_t t1, real_t *u)
static real_t div_lam125_grad_lam125(real_t x, real_t y, real_t z)
Divergences of the above "normal" vector functions divided by 3.
static DenseMatrix grad_lam45(real_t x, real_t y, real_t z)
static DenseMatrix grad_nu01(real_t z, Vector xy, unsigned int ab)
static bool CheckZ(real_t z)
static void CalcScaledJacobi(int p, real_t alpha, real_t x, real_t t, real_t *u)
Shifted and Scaled Jacobi Polynomials.
static void CalcHomogenizedScaLegendre(int p, real_t s0, real_t s1, real_t *u)
static Vector grad_nu0(real_t z, const Vector xy, unsigned int ab)
void phi_T(int p, Vector nu, DenseMatrix &u) const
static Vector nu12_grad_nu12(real_t z, Vector xy, unsigned int ab)
static real_t div_lam435_grad_lam435(real_t x, real_t y, real_t z)
static Vector grad_lam3(real_t x, real_t y, real_t z)
int Height() const
Get the height (size of output) of the Operator. Synonym with NumRows().
int Width() const
Get the width (size of input) of the Operator. Synonym with NumCols().
static void CalcLegendre(const int p, const real_t x, real_t *u)
int Size() const
Returns the size of the vector.
void SetSize(int s)
Resize the vector to size s.
real_t * GetData() const
Return a pointer to the beginning of the Vector data.
Vector & Add(const real_t a, const Vector &Va)
(*this) += a * Va
void cross3D(const Vector &vin, Vector &vout) const
real_t u(const Vector &xvec)
void Mult(const Table &A, const Table &B, Table &C)
C = A * B (as boolean matrices)
void add(const Vector &v1, const Vector &v2, Vector &v)
real_t p(const Vector &x, real_t t)