127 int nquad0 =
m_base[0]->GetNumPoints();
128 int nquad1 =
m_base[1]->GetNumPoints();
129 int nquad2 =
m_base[2]->GetNumPoints();
136 StdPyrExp::v_PhysDeriv(inarray, diff0, diff1, diff2);
142 Vmath::Vmul(nquad0 * nquad1 * nquad2, &gmat[0][0], 1, &diff0[0], 1,
144 Vmath::Vvtvp(nquad0 * nquad1 * nquad2, &gmat[1][0], 1, &diff1[0], 1,
145 &out_d0[0], 1, &out_d0[0], 1);
146 Vmath::Vvtvp(nquad0 * nquad1 * nquad2, &gmat[2][0], 1, &diff2[0], 1,
147 &out_d0[0], 1, &out_d0[0], 1);
152 Vmath::Vmul(nquad0 * nquad1 * nquad2, &gmat[3][0], 1, &diff0[0], 1,
154 Vmath::Vvtvp(nquad0 * nquad1 * nquad2, &gmat[4][0], 1, &diff1[0], 1,
155 &out_d1[0], 1, &out_d1[0], 1);
156 Vmath::Vvtvp(nquad0 * nquad1 * nquad2, &gmat[5][0], 1, &diff2[0], 1,
157 &out_d1[0], 1, &out_d1[0], 1);
162 Vmath::Vmul(nquad0 * nquad1 * nquad2, &gmat[6][0], 1, &diff0[0], 1,
164 Vmath::Vvtvp(nquad0 * nquad1 * nquad2, &gmat[7][0], 1, &diff1[0], 1,
165 &out_d2[0], 1, &out_d2[0], 1);
166 Vmath::Vvtvp(nquad0 * nquad1 * nquad2, &gmat[8][0], 1, &diff2[0], 1,
167 &out_d2[0], 1, &out_d2[0], 1);
174 Vmath::Smul(nquad0 * nquad1 * nquad2, gmat[0][0], &diff0[0], 1,
176 Blas::Daxpy(nquad0 * nquad1 * nquad2, gmat[1][0], &diff1[0], 1,
178 Blas::Daxpy(nquad0 * nquad1 * nquad2, gmat[2][0], &diff2[0], 1,
184 Vmath::Smul(nquad0 * nquad1 * nquad2, gmat[3][0], &diff0[0], 1,
186 Blas::Daxpy(nquad0 * nquad1 * nquad2, gmat[4][0], &diff1[0], 1,
188 Blas::Daxpy(nquad0 * nquad1 * nquad2, gmat[5][0], &diff2[0], 1,
194 Vmath::Smul(nquad0 * nquad1 * nquad2, gmat[6][0], &diff0[0], 1,
196 Blas::Daxpy(nquad0 * nquad1 * nquad2, gmat[7][0], &diff1[0], 1,
198 Blas::Daxpy(nquad0 * nquad1 * nquad2, gmat[8][0], &diff2[0], 1,
702 for (
int i = 0; i < ptsKeys.size(); ++i)
714 geomFactors->GetDerivFactors(ptsKeys);
728 for (i = 0; i < vCoordDim; ++i)
733 size_t nqb = nq_face;
748 for (i = 0; i < vCoordDim; ++i)
750 normal[i][0] = -df[3 * i + 2][0];
756 for (i = 0; i < vCoordDim; ++i)
758 normal[i][0] = -df[3 * i + 1][0];
764 for (i = 0; i < vCoordDim; ++i)
766 normal[i][0] = df[3 * i][0] + df[3 * i + 2][0];
772 for (i = 0; i < vCoordDim; ++i)
774 normal[i][0] = df[3 * i + 1][0] + df[3 * i + 2][0];
780 for (i = 0; i < vCoordDim; ++i)
782 normal[i][0] = -df[3 * i][0];
787 ASSERTL0(
false,
"face is out of range (face < 4)");
792 for (i = 0; i < vCoordDim; ++i)
794 fac += normal[i][0] * normal[i][0];
796 fac = 1.0 /
sqrt(fac);
800 for (i = 0; i < vCoordDim; ++i)
802 Vmath::Fill(nq_face, fac * normal[i][0], normal[i], 1);
810 int nq0 = ptsKeys[0].GetNumPoints();
811 int nq1 = ptsKeys[1].GetNumPoints();
812 int nq2 = ptsKeys[2].GetNumPoints();
813 int nq01 = nq0 * nq1;
821 else if (face == 1 || face == 3)
843 for (j = 0; j < nq01; ++j)
845 normals[j] = -df[2][j] * jac[j];
846 normals[nqtot + j] = -df[5][j] * jac[j];
847 normals[2 * nqtot + j] = -df[8][j] * jac[j];
851 points0 = ptsKeys[0];
852 points1 = ptsKeys[1];
858 for (j = 0; j < nq0; ++j)
860 for (k = 0; k < nq2; ++k)
862 int tmp = j + nq01 * k;
863 normals[j + k * nq0] = -df[1][tmp] * jac[tmp];
864 normals[nqtot + j + k * nq0] = -df[4][tmp] * jac[tmp];
865 normals[2 * nqtot + j + k * nq0] =
866 -df[7][tmp] * jac[tmp];
867 faceJac[j + k * nq0] = jac[tmp];
871 points0 = ptsKeys[0];
872 points1 = ptsKeys[2];
878 for (j = 0; j < nq1; ++j)
880 for (k = 0; k < nq2; ++k)
882 int tmp = nq0 - 1 + nq0 * j + nq01 * k;
883 normals[j + k * nq1] =
884 (df[0][tmp] + df[2][tmp]) * jac[tmp];
885 normals[nqtot + j + k * nq1] =
886 (df[3][tmp] + df[5][tmp]) * jac[tmp];
887 normals[2 * nqtot + j + k * nq1] =
888 (df[6][tmp] + df[8][tmp]) * jac[tmp];
889 faceJac[j + k * nq1] = jac[tmp];
893 points0 = ptsKeys[1];
894 points1 = ptsKeys[2];
900 for (j = 0; j < nq0; ++j)
902 for (k = 0; k < nq2; ++k)
904 int tmp = nq0 * (nq1 - 1) + j + nq01 * k;
905 normals[j + k * nq0] =
906 (df[1][tmp] + df[2][tmp]) * jac[tmp];
907 normals[nqtot + j + k * nq0] =
908 (df[4][tmp] + df[5][tmp]) * jac[tmp];
909 normals[2 * nqtot + j + k * nq0] =
910 (df[7][tmp] + df[8][tmp]) * jac[tmp];
911 faceJac[j + k * nq0] = jac[tmp];
915 points0 = ptsKeys[0];
916 points1 = ptsKeys[2];
922 for (j = 0; j < nq1; ++j)
924 for (k = 0; k < nq2; ++k)
926 int tmp = j * nq0 + nq01 * k;
927 normals[j + k * nq1] = -df[0][tmp] * jac[tmp];
928 normals[nqtot + j + k * nq1] = -df[3][tmp] * jac[tmp];
929 normals[2 * nqtot + j + k * nq1] =
930 -df[6][tmp] * jac[tmp];
931 faceJac[j + k * nq1] = jac[tmp];
935 points0 = ptsKeys[1];
936 points1 = ptsKeys[2];
941 ASSERTL0(
false,
"face is out of range (face < 4)");
949 Vmath::Sdiv(nq_face, 1.0, &work[0], 1, &work[0], 1);
952 for (i = 0; i < vCoordDim; ++i)
957 Vmath::Vmul(nq_face, work, 1, normal[i], 1, normal[i], 1);
964 Vmath::Vvtvp(nq_face, normal[i], 1, normal[i], 1, work, 1, work, 1);
974 Vmath::Vmul(nq_face, normal[i], 1, work, 1, normal[i], 1);
1071 const unsigned int dim = 3;
1077 for (
unsigned int i = 0; i < dim; ++i)
1079 for (
unsigned int j = i; j < dim; ++j)
1110 const unsigned int nquad0 =
m_base[0]->GetNumPoints();
1111 const unsigned int nquad1 =
m_base[1]->GetNumPoints();
1112 const unsigned int nquad2 =
m_base[2]->GetNumPoints();
1115 for (j = 0; j < nquad2; ++j)
1117 for (i = 0; i < nquad1; ++i)
1120 &h0[0] + i * nquad0 + j * nquad0 * nquad1, 1);
1122 &h1[0] + i * nquad0 + j * nquad0 * nquad1, 1);
1123 Vmath::Fill(nquad0, (1.0 + z1[i]) / (1.0 - z2[j]),
1124 &h2[0] + i * nquad0 + j * nquad0 * nquad1, 1);
1127 for (i = 0; i < nquad0; i++)
1129 Blas::Dscal(nquad1 * nquad2, 1 + z0[i], &h1[0] + i, nquad0);
1138 Vmath::Vvtvvtp(nqtot, &df[0][0], 1, &h0[0], 1, &df[2][0], 1, &h1[0], 1,
1140 Vmath::Vvtvvtp(nqtot, &df[3][0], 1, &h0[0], 1, &df[5][0], 1, &h1[0], 1,
1142 Vmath::Vvtvvtp(nqtot, &df[6][0], 1, &h0[0], 1, &df[8][0], 1, &h1[0], 1,
1146 Vmath::Vvtvvtp(nqtot, &wsp1[0], 1, &wsp1[0], 1, &wsp2[0], 1, &wsp2[0],
1148 Vmath::Vvtvp(nqtot, &wsp3[0], 1, &wsp3[0], 1, &g0[0], 1, &g0[0], 1);
1151 Vmath::Vvtvvtp(nqtot, &df[2][0], 1, &wsp1[0], 1, &df[5][0], 1, &wsp2[0],
1153 Vmath::Vvtvp(nqtot, &df[8][0], 1, &wsp3[0], 1, &g4[0], 1, &g4[0], 1);
1156 Vmath::Vvtvvtp(nqtot, &df[1][0], 1, &h0[0], 1, &df[2][0], 1, &h2[0], 1,
1158 Vmath::Vvtvvtp(nqtot, &df[4][0], 1, &h0[0], 1, &df[5][0], 1, &h2[0], 1,
1160 Vmath::Vvtvvtp(nqtot, &df[7][0], 1, &h0[0], 1, &df[8][0], 1, &h2[0], 1,
1164 Vmath::Vvtvvtp(nqtot, &wsp4[0], 1, &wsp4[0], 1, &wsp5[0], 1, &wsp5[0],
1166 Vmath::Vvtvp(nqtot, &wsp6[0], 1, &wsp6[0], 1, &g1[0], 1, &g1[0], 1);
1169 Vmath::Vvtvvtp(nqtot, &wsp1[0], 1, &wsp4[0], 1, &wsp2[0], 1, &wsp5[0],
1171 Vmath::Vvtvp(nqtot, &wsp3[0], 1, &wsp6[0], 1, &g3[0], 1, &g3[0], 1);
1174 Vmath::Vvtvvtp(nqtot, &df[2][0], 1, &wsp4[0], 1, &df[5][0], 1, &wsp5[0],
1176 Vmath::Vvtvp(nqtot, &df[8][0], 1, &wsp6[0], 1, &g5[0], 1, &g5[0], 1);
1180 &df[5][0], 1, &g2[0], 1);
1181 Vmath::Vvtvp(nqtot, &df[8][0], 1, &df[8][0], 1, &g2[0], 1, &g2[0], 1);
1194 Vmath::Vvtvvtp(nqtot, &wsp1[0], 1, &wsp1[0], 1, &wsp2[0], 1, &wsp2[0],
1196 Vmath::Vvtvp(nqtot, &wsp3[0], 1, &wsp3[0], 1, &g0[0], 1, &g0[0], 1);
1199 Vmath::Svtsvtp(nqtot, df[2][0], &wsp1[0], 1, df[5][0], &wsp2[0], 1,
1201 Vmath::Svtvp(nqtot, df[8][0], &wsp3[0], 1, &g4[0], 1, &g4[0], 1);
1212 Vmath::Vvtvvtp(nqtot, &wsp4[0], 1, &wsp4[0], 1, &wsp5[0], 1, &wsp5[0],
1214 Vmath::Vvtvp(nqtot, &wsp6[0], 1, &wsp6[0], 1, &g1[0], 1, &g1[0], 1);
1217 Vmath::Vvtvvtp(nqtot, &wsp1[0], 1, &wsp4[0], 1, &wsp2[0], 1, &wsp5[0],
1219 Vmath::Vvtvp(nqtot, &wsp3[0], 1, &wsp6[0], 1, &g3[0], 1, &g3[0], 1);
1222 Vmath::Svtsvtp(nqtot, df[2][0], &wsp4[0], 1, df[5][0], &wsp5[0], 1,
1224 Vmath::Svtvp(nqtot, df[8][0], &wsp6[0], 1, &g5[0], 1, &g5[0], 1);
1228 df[2][0] * df[2][0] + df[5][0] * df[5][0] +
1229 df[8][0] * df[8][0],
1233 for (
unsigned int i = 0; i < dim; ++i)
1235 for (
unsigned int j = i; j < dim; ++j)
1327void PyrExp::v_NormalTraceDerivFactors(
1328 Array<OneD, Array<OneD, NekDouble>> &d0factors,
1329 Array<OneD, Array<OneD, NekDouble>> &d1factors,
1330 Array<OneD, Array<OneD, NekDouble>> &d2factors)
1332 int nquad0 = GetNumPoints(0);
1333 int nquad1 = GetNumPoints(1);
1334 int nquad2 = GetNumPoints(2);
1336 const Array<TwoD, const NekDouble> &df =
1337 m_metricinfo->GetDerivFactors(GetPointsKeys());
1339 if (d0factors.size() != 5)
1341 d0factors = Array<OneD, Array<OneD, NekDouble>>(5);
1342 d1factors = Array<OneD, Array<OneD, NekDouble>>(5);
1343 d2factors = Array<OneD, Array<OneD, NekDouble>>(5);
1346 if (d0factors[0].size() != nquad0 * nquad1)
1348 d0factors[0] = Array<OneD, NekDouble>(nquad0 * nquad1);
1349 d1factors[0] = Array<OneD, NekDouble>(nquad0 * nquad1);
1350 d2factors[0] = Array<OneD, NekDouble>(nquad0 * nquad1);
1353 if (d0factors[1].size() != nquad0 * nquad2)
1355 d0factors[1] = Array<OneD, NekDouble>(nquad0 * nquad2);
1356 d0factors[3] = Array<OneD, NekDouble>(nquad0 * nquad2);
1357 d1factors[1] = Array<OneD, NekDouble>(nquad0 * nquad2);
1358 d1factors[3] = Array<OneD, NekDouble>(nquad0 * nquad2);
1359 d2factors[1] = Array<OneD, NekDouble>(nquad0 * nquad2);
1360 d2factors[3] = Array<OneD, NekDouble>(nquad0 * nquad2);
1363 if (d0factors[2].size() != nquad1 * nquad2)
1365 d0factors[2] = Array<OneD, NekDouble>(nquad1 * nquad2);
1366 d0factors[4] = Array<OneD, NekDouble>(nquad1 * nquad2);
1367 d1factors[2] = Array<OneD, NekDouble>(nquad1 * nquad2);
1368 d1factors[4] = Array<OneD, NekDouble>(nquad1 * nquad2);
1369 d2factors[2] = Array<OneD, NekDouble>(nquad1 * nquad2);
1370 d2factors[4] = Array<OneD, NekDouble>(nquad1 * nquad2);
1374 const Array<OneD, const Array<OneD, NekDouble>> &normal_0 =
1376 const Array<OneD, const Array<OneD, NekDouble>> &normal_1 =
1378 const Array<OneD, const Array<OneD, NekDouble>> &normal_2 =
1380 const Array<OneD, const Array<OneD, NekDouble>> &normal_3 =
1382 const Array<OneD, const Array<OneD, NekDouble>> &normal_4 =
1385 int ncoords = normal_0.size();
1387 // first gather together standard cartesian inner products
1388 if (m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
1391 for (int i = 0; i < nquad0 * nquad1; ++i)
1393 d0factors[0][i] = df[0][i] * normal_0[0][i];
1394 d1factors[0][i] = df[1][i] * normal_0[0][i];
1395 d2factors[0][i] = df[2][i] * normal_0[0][i];
1398 for (int n = 1; n < ncoords; ++n)
1400 for (int i = 0; i < nquad0 * nquad1; ++i)
1402 d0factors[0][i] += df[3 * n][i] * normal_0[n][i];
1403 d1factors[0][i] += df[3 * n + 1][i] * normal_0[n][i];
1404 d2factors[0][i] += df[3 * n + 2][i] * normal_0[n][i];
1409 for (int j = 0; j < nquad2; ++j)
1411 for (int i = 0; i < nquad0; ++i)
1413 d0factors[1][j * nquad0 + i] = df[0][j * nquad0 * nquad1 + i] *
1414 normal_1[0][j * nquad0 + i];
1415 d1factors[1][j * nquad0 + i] = df[1][j * nquad0 * nquad1 + i] *
1416 normal_1[0][j * nquad0 + i];
1417 d2factors[1][j * nquad0 + i] = df[2][j * nquad0 * nquad1 + i] *
1418 normal_1[0][j * nquad0 + i];
1420 d0factors[3][j * nquad0 + i] =
1421 df[0][(j + 1) * nquad0 * nquad1 - nquad0 + i] *
1422 normal_3[0][j * nquad0 + i];
1423 d1factors[3][j * nquad0 + i] =
1424 df[1][(j + 1) * nquad0 * nquad1 - nquad0 + i] *
1425 normal_3[0][j * nquad0 + i];
1426 d2factors[3][j * nquad0 + i] =
1427 df[2][(j + 1) * nquad0 * nquad1 - nquad0 + i] *
1428 normal_3[0][j * nquad0 + i];
1432 for (int n = 1; n < ncoords; ++n)
1434 for (int j = 0; j < nquad2; ++j)
1436 for (int i = 0; i < nquad0; ++i)
1438 d0factors[1][j * nquad0 + i] +=
1439 df[3 * n][j * nquad0 * nquad1 + i] *
1440 normal_1[0][j * nquad0 + i];
1441 d1factors[1][j * nquad0 + i] +=
1442 df[3 * n + 1][j * nquad0 * nquad1 + i] *
1443 normal_1[0][j * nquad0 + i];
1444 d2factors[1][j * nquad0 + i] +=
1445 df[3 * n + 2][j * nquad0 * nquad1 + i] *
1446 normal_1[0][j * nquad0 + i];
1448 d0factors[3][j * nquad0 + i] +=
1449 df[3 * n][(j + 1) * nquad0 * nquad1 - nquad0 + i] *
1450 normal_3[0][j * nquad0 + i];
1451 d1factors[3][j * nquad0 + i] +=
1452 df[3 * n + 1][(j + 1) * nquad0 * nquad1 - nquad0 + i] *
1453 normal_3[0][j * nquad0 + i];
1454 d2factors[3][j * nquad0 + i] +=
1455 df[3 * n + 2][(j + 1) * nquad0 * nquad1 - nquad0 + i] *
1456 normal_3[0][j * nquad0 + i];
1462 for (int j = 0; j < nquad2; ++j)
1464 for (int i = 0; i < nquad1; ++i)
1466 d0factors[2][j * nquad1 + i] =
1467 df[0][j * nquad0 * nquad1 + (i + 1) * nquad0 - 1] *
1468 normal_2[0][j * nquad1 + i];
1469 d1factors[2][j * nquad1 + i] =
1470 df[1][j * nquad0 * nquad1 + (i + 1) * nquad0 - 1] *
1471 normal_2[0][j * nquad1 + i];
1472 d2factors[2][j * nquad1 + i] =
1473 df[2][j * nquad0 * nquad1 + (i + 1) * nquad0 - 1] *
1474 normal_2[0][j * nquad1 + i];
1476 d0factors[4][j * nquad1 + i] =
1477 df[0][j * nquad0 * nquad1 + i * nquad0] *
1478 normal_4[0][j * nquad1 + i];
1479 d1factors[4][j * nquad1 + i] =
1480 df[1][j * nquad0 * nquad1 + i * nquad0] *
1481 normal_4[0][j * nquad1 + i];
1482 d2factors[4][j * nquad1 + i] =
1483 df[2][j * nquad0 * nquad1 + i * nquad0] *
1484 normal_4[0][j * nquad1 + i];
1488 for (int n = 1; n < ncoords; ++n)
1490 for (int j = 0; j < nquad2; ++j)
1492 for (int i = 0; i < nquad1; ++i)
1494 d0factors[2][j * nquad1 + i] +=
1495 df[3 * n][j * nquad0 * nquad1 + (i + 1) * nquad0 - 1] *
1496 normal_2[n][j * nquad1 + i];
1497 d1factors[2][j * nquad1 + i] +=
1499 [j * nquad0 * nquad1 + (i + 1) * nquad0 - 1] *
1500 normal_2[n][j * nquad1 + i];
1501 d2factors[2][j * nquad1 + i] +=
1503 [j * nquad0 * nquad1 + (i + 1) * nquad0 - 1] *
1504 normal_2[n][j * nquad1 + i];
1506 d0factors[4][j * nquad1 + i] +=
1507 df[3 * n][i * nquad0 + j * nquad0 * nquad1] *
1508 normal_4[n][j * nquad1 + i];
1509 d1factors[4][j * nquad1 + i] +=
1510 df[3 * n + 1][i * nquad0 + j * nquad0 * nquad1] *
1511 normal_4[n][j * nquad1 + i];
1512 d2factors[4][j * nquad1 + i] +=
1513 df[3 * n + 2][i * nquad0 + j * nquad0 * nquad1] *
1514 normal_4[n][j * nquad1 + i];
1522 for (int i = 0; i < nquad0 * nquad1; ++i)
1524 d0factors[0][i] = df[0][0] * normal_0[0][i];
1525 d1factors[0][i] = df[1][0] * normal_0[0][i];
1526 d2factors[0][i] = df[2][0] * normal_0[0][i];
1529 for (int n = 1; n < ncoords; ++n)
1531 for (int i = 0; i < nquad0 * nquad1; ++i)
1533 d0factors[0][i] += df[3 * n][0] * normal_0[n][i];
1534 d1factors[0][i] += df[3 * n + 1][0] * normal_0[n][i];
1535 d2factors[0][i] += df[3 * n + 2][0] * normal_0[n][i];
1540 for (int i = 0; i < nquad0 * nquad2; ++i)
1542 d0factors[1][i] = df[0][0] * normal_1[0][i];
1543 d0factors[3][i] = df[0][0] * normal_3[0][i];
1545 d1factors[1][i] = df[1][0] * normal_1[0][i];
1546 d1factors[3][i] = df[1][0] * normal_3[0][i];
1548 d2factors[1][i] = df[2][0] * normal_1[0][i];
1549 d2factors[3][i] = df[2][0] * normal_3[0][i];
1552 for (int n = 1; n < ncoords; ++n)
1554 for (int i = 0; i < nquad0 * nquad2; ++i)
1556 d0factors[1][i] += df[3 * n][0] * normal_1[n][i];
1557 d0factors[3][i] += df[3 * n][0] * normal_3[n][i];
1559 d1factors[1][i] += df[3 * n + 1][0] * normal_1[n][i];
1560 d1factors[3][i] += df[3 * n + 1][0] * normal_3[n][i];
1562 d2factors[1][i] += df[3 * n + 2][0] * normal_1[n][i];
1563 d2factors[3][i] += df[3 * n + 2][0] * normal_3[n][i];
1568 for (int i = 0; i < nquad1 * nquad2; ++i)
1570 d0factors[2][i] = df[0][0] * normal_2[0][i];
1571 d0factors[4][i] = df[0][0] * normal_4[0][i];
1573 d1factors[2][i] = df[1][0] * normal_2[0][i];
1574 d1factors[4][i] = df[1][0] * normal_4[0][i];
1576 d2factors[2][i] = df[2][0] * normal_2[0][i];
1577 d2factors[4][i] = df[2][0] * normal_4[0][i];
1580 for (int n = 1; n < ncoords; ++n)
1582 for (int i = 0; i < nquad1 * nquad2; ++i)
1584 d0factors[2][i] += df[3 * n][0] * normal_2[n][i];
1585 d0factors[4][i] += df[3 * n][0] * normal_4[n][i];
1587 d1factors[2][i] += df[3 * n + 1][0] * normal_2[n][i];
1588 d1factors[4][i] += df[3 * n + 1][0] * normal_4[n][i];
1590 d2factors[2][i] += df[3 * n + 2][0] * normal_2[n][i];
1591 d2factors[4][i] += df[3 * n + 2][0] * normal_4[n][i];