42 namespace LocalRegions
50 Ba.GetNumModes(), Bb.GetNumModes(), Bc.GetNumModes()),
53 Ba.GetNumModes(), Bb.GetNumModes(), Bc.GetNumModes()),
57 std::bind(&
Expansion3D::CreateMatrix, this, std::placeholders::_1),
58 std::string(
"PyrExpMatrix")),
59 m_staticCondMatrixManager(std::bind(&
Expansion::CreateStaticCondMatrix,
60 this, std::placeholders::_1),
61 std::string(
"PyrExpStaticCondMatrix"))
66 : StdExpansion(T), StdExpansion3D(T), StdPyrExp(T),
Expansion(T),
68 m_staticCondMatrixManager(T.m_staticCondMatrixManager)
98 int nquad0 =
m_base[0]->GetNumPoints();
99 int nquad1 =
m_base[1]->GetNumPoints();
100 int nquad2 =
m_base[2]->GetNumPoints();
108 (
NekDouble *)&inarray[0], 1, &tmp[0], 1);
113 (
NekDouble *)&inarray[0], 1, &tmp[0], 1);
117 return StdPyrExp::v_Integral(tmp);
129 int nquad0 =
m_base[0]->GetNumPoints();
130 int nquad1 =
m_base[1]->GetNumPoints();
131 int nquad2 =
m_base[2]->GetNumPoints();
138 StdPyrExp::v_PhysDeriv(inarray, diff0, diff1, diff2);
144 Vmath::Vmul(nquad0 * nquad1 * nquad2, &gmat[0][0], 1, &diff0[0], 1,
146 Vmath::Vvtvp(nquad0 * nquad1 * nquad2, &gmat[1][0], 1, &diff1[0], 1,
147 &out_d0[0], 1, &out_d0[0], 1);
148 Vmath::Vvtvp(nquad0 * nquad1 * nquad2, &gmat[2][0], 1, &diff2[0], 1,
149 &out_d0[0], 1, &out_d0[0], 1);
154 Vmath::Vmul(nquad0 * nquad1 * nquad2, &gmat[3][0], 1, &diff0[0], 1,
156 Vmath::Vvtvp(nquad0 * nquad1 * nquad2, &gmat[4][0], 1, &diff1[0], 1,
157 &out_d1[0], 1, &out_d1[0], 1);
158 Vmath::Vvtvp(nquad0 * nquad1 * nquad2, &gmat[5][0], 1, &diff2[0], 1,
159 &out_d1[0], 1, &out_d1[0], 1);
164 Vmath::Vmul(nquad0 * nquad1 * nquad2, &gmat[6][0], 1, &diff0[0], 1,
166 Vmath::Vvtvp(nquad0 * nquad1 * nquad2, &gmat[7][0], 1, &diff1[0], 1,
167 &out_d2[0], 1, &out_d2[0], 1);
168 Vmath::Vvtvp(nquad0 * nquad1 * nquad2, &gmat[8][0], 1, &diff2[0], 1,
169 &out_d2[0], 1, &out_d2[0], 1);
176 Vmath::Smul(nquad0 * nquad1 * nquad2, gmat[0][0], &diff0[0], 1,
178 Blas::Daxpy(nquad0 * nquad1 * nquad2, gmat[1][0], &diff1[0], 1,
180 Blas::Daxpy(nquad0 * nquad1 * nquad2, gmat[2][0], &diff2[0], 1,
186 Vmath::Smul(nquad0 * nquad1 * nquad2, gmat[3][0], &diff0[0], 1,
188 Blas::Daxpy(nquad0 * nquad1 * nquad2, gmat[4][0], &diff1[0], 1,
190 Blas::Daxpy(nquad0 * nquad1 * nquad2, gmat[5][0], &diff2[0], 1,
196 Vmath::Smul(nquad0 * nquad1 * nquad2, gmat[6][0], &diff0[0], 1,
198 Blas::Daxpy(nquad0 * nquad1 * nquad2, gmat[7][0], &diff1[0], 1,
200 Blas::Daxpy(nquad0 * nquad1 * nquad2, gmat[8][0], &diff2[0], 1,
226 if (
m_base[0]->Collocation() &&
m_base[1]->Collocation() &&
243 out = (*matsys) * in;
288 const int nquad0 =
m_base[0]->GetNumPoints();
289 const int nquad1 =
m_base[1]->GetNumPoints();
290 const int nquad2 =
m_base[2]->GetNumPoints();
291 const int order0 =
m_base[0]->GetNumModes();
292 const int order1 =
m_base[1]->GetNumModes();
296 if (multiplybyweights)
304 tmp, outarray, wsp,
true,
true,
true);
310 inarray, outarray, wsp,
true,
true,
true);
355 const int nquad0 =
m_base[0]->GetNumPoints();
356 const int nquad1 =
m_base[1]->GetNumPoints();
357 const int nquad2 =
m_base[2]->GetNumPoints();
358 const int order0 =
m_base[0]->GetNumModes();
359 const int order1 =
m_base[1]->GetNumModes();
360 const int nqtot = nquad0 * nquad1 * nquad2;
368 std::max(nqtot, order0 * nquad2 * (nquad1 + order1)));
380 m_base[2]->GetBdata(), tmp2, outarray, wsp,
384 m_base[2]->GetBdata(), tmp3, tmp6, wsp,
true,
390 m_base[2]->GetDbdata(), tmp4, tmp6, wsp,
true,
400 const int nquad0 =
m_base[0]->GetNumPoints();
401 const int nquad1 =
m_base[1]->GetNumPoints();
402 const int nquad2 =
m_base[2]->GetNumPoints();
403 const int order0 =
m_base[0]->GetNumModes();
404 const int order1 =
m_base[1]->GetNumModes();
405 const int nqtot = nquad0 * nquad1 * nquad2;
416 std::max(nqtot, order0 * nquad2 * (nquad1 + order1)));
430 Vmath::Vmul(nqtot, &df[3 * dir][0], 1, tmp1.get(), 1, tmp2.get(), 1);
431 Vmath::Vmul(nqtot, &df[3 * dir + 1][0], 1, tmp1.get(), 1, tmp3.get(),
433 Vmath::Vmul(nqtot, &df[3 * dir + 2][0], 1, tmp1.get(), 1, tmp4.get(),
438 Vmath::Smul(nqtot, df[3 * dir][0], tmp1.get(), 1, tmp2.get(), 1);
439 Vmath::Smul(nqtot, df[3 * dir + 1][0], tmp1.get(), 1, tmp3.get(), 1);
440 Vmath::Smul(nqtot, df[3 * dir + 2][0], tmp1.get(), 1, tmp4.get(), 1);
444 for (
int i = 0; i < nquad0; ++i)
446 gfac0[i] = 0.5 * (1 + z0[i]);
450 for (
int i = 0; i < nquad1; ++i)
452 gfac1[i] = 0.5 * (1 + z1[i]);
456 for (
int i = 0; i < nquad2; ++i)
458 gfac2[i] = 2.0 / (1 - z2[i]);
461 const int nq01 = nquad0 * nquad1;
463 for (
int i = 0; i < nquad2; ++i)
465 Vmath::Smul(nq01, gfac2[i], &tmp2[0] + i * nq01, 1, &tmp2[0] + i * nq01,
467 Vmath::Smul(nq01, gfac2[i], &tmp3[0] + i * nq01, 1, &tmp3[0] + i * nq01,
469 Vmath::Smul(nq01, gfac2[i], &tmp4[0] + i * nq01, 1, &tmp5[0] + i * nq01,
474 for (
int i = 0; i < nquad1 * nquad2; ++i)
476 Vmath::Vmul(nquad0, &gfac0[0], 1, &tmp5[0] + i * nquad0, 1,
477 &wsp[0] + i * nquad0, 1);
480 Vmath::Vadd(nqtot, &tmp2[0], 1, &wsp[0], 1, &tmp2[0], 1);
483 for (
int i = 0; i < nquad1 * nquad2; ++i)
485 Vmath::Smul(nquad0, gfac1[i % nquad1], &tmp5[0] + i * nquad0, 1,
486 &tmp5[0] + i * nquad0, 1);
488 Vmath::Vadd(nqtot, &tmp3[0], 1, &tmp5[0], 1, &tmp3[0], 1);
499 m_base[2]->GetBasisKey());
505 m_base[0]->GetPointsKey());
507 m_base[1]->GetPointsKey());
509 m_base[2]->GetPointsKey());
524 ASSERTL1(Lcoords[0] <= -1.0 && Lcoords[0] >= 1.0 && Lcoords[1] <= -1.0 &&
525 Lcoords[1] >= 1.0 && Lcoords[2] <= -1.0 && Lcoords[2] >= 1.0,
526 "Local coordinates are not in region [-1,1]");
530 for (i = 0; i <
m_geom->GetCoordim(); ++i)
532 coords[i] =
m_geom->GetCoord(i, Lcoords);
544 const NekDouble *data,
const std::vector<unsigned int> &nummodes,
545 const int mode_offset,
NekDouble *coeffs,
546 std::vector<LibUtilities::BasisType> &fromType)
548 int data_order0 = nummodes[mode_offset];
549 int fillorder0 = min(
m_base[0]->GetNumModes(), data_order0);
550 int data_order1 = nummodes[mode_offset + 1];
551 int order1 =
m_base[1]->GetNumModes();
552 int fillorder1 = min(order1, data_order1);
553 int data_order2 = nummodes[mode_offset + 2];
554 int order2 =
m_base[2]->GetNumModes();
555 int fillorder2 = min(order2, data_order2);
562 data_order1 != fillorder1 || data_order2 != fillorder2)
569 m_base[0]->GetPointsKey()),
571 m_base[1]->GetPointsKey()),
573 m_base[2]->GetPointsKey()));
577 m_base[2]->GetBasisKey());
603 return StdExpansion3D::v_PhysEvaluate(Lcoord, physvals);
614 m_geom->GetLocCoords(coord, Lcoord);
616 return StdExpansion3D::v_PhysEvaluate(Lcoord, physvals);
621 std::array<NekDouble, 3> &firstOrderDerivs)
625 m_geom->GetLocCoords(coord, Lcoord);
626 return StdPyrExp::v_PhysEvaluate(Lcoord, inarray, firstOrderDerivs);
635 int nquad0 =
m_base[0]->GetNumPoints();
636 int nquad1 =
m_base[1]->GetNumPoints();
637 int nquad2 =
m_base[2]->GetNumPoints();
647 if (outarray.size() != nq0 * nq1)
653 for (
int i = 0; i < nquad0 * nquad1; ++i)
662 if (outarray.size() != nq0 * nq1)
668 for (
int k = 0; k < nquad2; k++)
670 for (
int i = 0; i < nquad0; ++i)
672 outarray[k * nquad0 + i] = (nquad0 * nquad1 * k) + i;
680 if (outarray.size() != nq0 * nq1)
686 for (
int j = 0; j < nquad1 * nquad2; ++j)
688 outarray[j] = nquad0 - 1 + j * nquad0;
695 if (outarray.size() != nq0 * nq1)
701 for (
int k = 0; k < nquad2; k++)
703 for (
int i = 0; i < nquad0; ++i)
705 outarray[k * nquad0 + i] =
706 nquad0 * (nquad1 - 1) + (nquad0 * nquad1 * k) + i;
714 if (outarray.size() != nq0 * nq1)
720 for (
int j = 0; j < nquad1 * nquad2; ++j)
722 outarray[j] = j * nquad0;
726 ASSERTL0(
false,
"face value (> 4) is out of range");
737 for (
int i = 0; i < ptsKeys.size(); ++i)
749 geomFactors->GetDerivFactors(ptsKeys);
763 for (i = 0; i < vCoordDim; ++i)
768 size_t nqb = nq_face;
783 for (i = 0; i < vCoordDim; ++i)
785 normal[i][0] = -df[3 * i + 2][0];
791 for (i = 0; i < vCoordDim; ++i)
793 normal[i][0] = -df[3 * i + 1][0];
799 for (i = 0; i < vCoordDim; ++i)
801 normal[i][0] = df[3 * i][0] + df[3 * i + 2][0];
807 for (i = 0; i < vCoordDim; ++i)
809 normal[i][0] = df[3 * i + 1][0] + df[3 * i + 2][0];
815 for (i = 0; i < vCoordDim; ++i)
817 normal[i][0] = -df[3 * i][0];
822 ASSERTL0(
false,
"face is out of range (face < 4)");
827 for (i = 0; i < vCoordDim; ++i)
829 fac += normal[i][0] * normal[i][0];
831 fac = 1.0 /
sqrt(fac);
835 for (i = 0; i < vCoordDim; ++i)
837 Vmath::Fill(nq_face, fac * normal[i][0], normal[i], 1);
845 int nq0 = ptsKeys[0].GetNumPoints();
846 int nq1 = ptsKeys[1].GetNumPoints();
847 int nq2 = ptsKeys[2].GetNumPoints();
848 int nq01 = nq0 * nq1;
856 else if (face == 1 || face == 3)
878 for (j = 0; j < nq01; ++j)
880 normals[j] = -df[2][j] * jac[j];
881 normals[nqtot + j] = -df[5][j] * jac[j];
882 normals[2 * nqtot + j] = -df[8][j] * jac[j];
886 points0 = ptsKeys[0];
887 points1 = ptsKeys[1];
893 for (j = 0; j < nq0; ++j)
895 for (k = 0; k < nq2; ++k)
897 int tmp = j + nq01 * k;
898 normals[j + k * nq0] = -df[1][tmp] * jac[tmp];
899 normals[nqtot + j + k * nq0] = -df[4][tmp] * jac[tmp];
900 normals[2 * nqtot + j + k * nq0] =
901 -df[7][tmp] * jac[tmp];
902 faceJac[j + k * nq0] = jac[tmp];
906 points0 = ptsKeys[0];
907 points1 = ptsKeys[2];
913 for (j = 0; j < nq1; ++j)
915 for (k = 0; k < nq2; ++k)
917 int tmp = nq0 - 1 + nq0 * j + nq01 * k;
918 normals[j + k * nq1] =
919 (df[0][tmp] + df[2][tmp]) * jac[tmp];
920 normals[nqtot + j + k * nq1] =
921 (df[3][tmp] + df[5][tmp]) * jac[tmp];
922 normals[2 * nqtot + j + k * nq1] =
923 (df[6][tmp] + df[8][tmp]) * jac[tmp];
924 faceJac[j + k * nq1] = jac[tmp];
928 points0 = ptsKeys[1];
929 points1 = ptsKeys[2];
935 for (j = 0; j < nq0; ++j)
937 for (k = 0; k < nq2; ++k)
939 int tmp = nq0 * (nq1 - 1) + j + nq01 * k;
940 normals[j + k * nq0] =
941 (df[1][tmp] + df[2][tmp]) * jac[tmp];
942 normals[nqtot + j + k * nq0] =
943 (df[4][tmp] + df[5][tmp]) * jac[tmp];
944 normals[2 * nqtot + j + k * nq0] =
945 (df[7][tmp] + df[8][tmp]) * jac[tmp];
946 faceJac[j + k * nq0] = jac[tmp];
950 points0 = ptsKeys[0];
951 points1 = ptsKeys[2];
957 for (j = 0; j < nq1; ++j)
959 for (k = 0; k < nq2; ++k)
961 int tmp = j * nq0 + nq01 * k;
962 normals[j + k * nq1] = -df[0][tmp] * jac[tmp];
963 normals[nqtot + j + k * nq1] = -df[3][tmp] * jac[tmp];
964 normals[2 * nqtot + j + k * nq1] =
965 -df[6][tmp] * jac[tmp];
966 faceJac[j + k * nq1] = jac[tmp];
970 points0 = ptsKeys[1];
971 points1 = ptsKeys[2];
976 ASSERTL0(
false,
"face is out of range (face < 4)");
984 Vmath::Sdiv(nq_face, 1.0, &work[0], 1, &work[0], 1);
987 for (i = 0; i < vCoordDim; ++i)
992 Vmath::Vmul(nq_face, work, 1, normal[i], 1, normal[i], 1);
999 Vmath::Vvtvp(nq_face, normal[i], 1, normal[i], 1, work, 1, work, 1);
1009 Vmath::Vmul(nq_face, normal[i], 1, work, 1, normal[i], 1);
1035 StdPyrExp::v_SVVLaplacianFilter(array, mkey);
1060 returnval = StdPyrExp::v_GenMatrix(mkey);
1074 return tmp->GetStdMatrix(mkey);
1106 const unsigned int dim = 3;
1112 for (
unsigned int i = 0; i < dim; ++i)
1114 for (
unsigned int j = i; j < dim; ++j)
1145 const unsigned int nquad0 =
m_base[0]->GetNumPoints();
1146 const unsigned int nquad1 =
m_base[1]->GetNumPoints();
1147 const unsigned int nquad2 =
m_base[2]->GetNumPoints();
1150 for (j = 0; j < nquad2; ++j)
1152 for (i = 0; i < nquad1; ++i)
1155 &h0[0] + i * nquad0 + j * nquad0 * nquad1, 1);
1157 &h1[0] + i * nquad0 + j * nquad0 * nquad1, 1);
1158 Vmath::Fill(nquad0, (1.0 + z1[i]) / (1.0 - z2[j]),
1159 &h2[0] + i * nquad0 + j * nquad0 * nquad1, 1);
1162 for (i = 0; i < nquad0; i++)
1164 Blas::Dscal(nquad1 * nquad2, 1 + z0[i], &h1[0] + i, nquad0);
1173 Vmath::Vvtvvtp(nqtot, &df[0][0], 1, &h0[0], 1, &df[2][0], 1, &h1[0], 1,
1175 Vmath::Vvtvvtp(nqtot, &df[3][0], 1, &h0[0], 1, &df[5][0], 1, &h1[0], 1,
1177 Vmath::Vvtvvtp(nqtot, &df[6][0], 1, &h0[0], 1, &df[8][0], 1, &h1[0], 1,
1181 Vmath::Vvtvvtp(nqtot, &wsp1[0], 1, &wsp1[0], 1, &wsp2[0], 1, &wsp2[0],
1183 Vmath::Vvtvp(nqtot, &wsp3[0], 1, &wsp3[0], 1, &g0[0], 1, &g0[0], 1);
1186 Vmath::Vvtvvtp(nqtot, &df[2][0], 1, &wsp1[0], 1, &df[5][0], 1, &wsp2[0],
1188 Vmath::Vvtvp(nqtot, &df[8][0], 1, &wsp3[0], 1, &g4[0], 1, &g4[0], 1);
1191 Vmath::Vvtvvtp(nqtot, &df[1][0], 1, &h0[0], 1, &df[2][0], 1, &h2[0], 1,
1193 Vmath::Vvtvvtp(nqtot, &df[4][0], 1, &h0[0], 1, &df[5][0], 1, &h2[0], 1,
1195 Vmath::Vvtvvtp(nqtot, &df[7][0], 1, &h0[0], 1, &df[8][0], 1, &h2[0], 1,
1199 Vmath::Vvtvvtp(nqtot, &wsp4[0], 1, &wsp4[0], 1, &wsp5[0], 1, &wsp5[0],
1201 Vmath::Vvtvp(nqtot, &wsp6[0], 1, &wsp6[0], 1, &g1[0], 1, &g1[0], 1);
1204 Vmath::Vvtvvtp(nqtot, &wsp1[0], 1, &wsp4[0], 1, &wsp2[0], 1, &wsp5[0],
1206 Vmath::Vvtvp(nqtot, &wsp3[0], 1, &wsp6[0], 1, &g3[0], 1, &g3[0], 1);
1209 Vmath::Vvtvvtp(nqtot, &df[2][0], 1, &wsp4[0], 1, &df[5][0], 1, &wsp5[0],
1211 Vmath::Vvtvp(nqtot, &df[8][0], 1, &wsp6[0], 1, &g5[0], 1, &g5[0], 1);
1215 &df[5][0], 1, &g2[0], 1);
1216 Vmath::Vvtvp(nqtot, &df[8][0], 1, &df[8][0], 1, &g2[0], 1, &g2[0], 1);
1229 Vmath::Vvtvvtp(nqtot, &wsp1[0], 1, &wsp1[0], 1, &wsp2[0], 1, &wsp2[0],
1231 Vmath::Vvtvp(nqtot, &wsp3[0], 1, &wsp3[0], 1, &g0[0], 1, &g0[0], 1);
1234 Vmath::Svtsvtp(nqtot, df[2][0], &wsp1[0], 1, df[5][0], &wsp2[0], 1,
1236 Vmath::Svtvp(nqtot, df[8][0], &wsp3[0], 1, &g4[0], 1, &g4[0], 1);
1247 Vmath::Vvtvvtp(nqtot, &wsp4[0], 1, &wsp4[0], 1, &wsp5[0], 1, &wsp5[0],
1249 Vmath::Vvtvp(nqtot, &wsp6[0], 1, &wsp6[0], 1, &g1[0], 1, &g1[0], 1);
1252 Vmath::Vvtvvtp(nqtot, &wsp1[0], 1, &wsp4[0], 1, &wsp2[0], 1, &wsp5[0],
1254 Vmath::Vvtvp(nqtot, &wsp3[0], 1, &wsp6[0], 1, &g3[0], 1, &g3[0], 1);
1257 Vmath::Svtsvtp(nqtot, df[2][0], &wsp4[0], 1, df[5][0], &wsp5[0], 1,
1259 Vmath::Svtvp(nqtot, df[8][0], &wsp6[0], 1, &g5[0], 1, &g5[0], 1);
1263 df[2][0] * df[2][0] + df[5][0] * df[5][0] +
1264 df[8][0] * df[8][0],
1268 for (
unsigned int i = 0; i < dim; ++i)
1270 for (
unsigned int j = i; j < dim; ++j)
1288 int nquad0 =
m_base[0]->GetNumPoints();
1289 int nquad1 =
m_base[1]->GetNumPoints();
1290 int nq2 =
m_base[2]->GetNumPoints();
1291 int nqtot = nquad0 * nquad1 * nq2;
1293 ASSERTL1(wsp.size() >= 6 * nqtot,
"Insufficient workspace size.");
1294 ASSERTL1(m_ncoeffs <= nqtot, "Workspace not set up for ncoeffs > nqtot
");
1296 const Array<OneD, const NekDouble> &base0 = m_base[0]->GetBdata();
1297 const Array<OneD, const NekDouble> &base1 = m_base[1]->GetBdata();
1298 const Array<OneD, const NekDouble> &base2 = m_base[2]->GetBdata();
1299 const Array<OneD, const NekDouble> &dbase0 = m_base[0]->GetDbdata();
1300 const Array<OneD, const NekDouble> &dbase1 = m_base[1]->GetDbdata();
1301 const Array<OneD, const NekDouble> &dbase2 = m_base[2]->GetDbdata();
1302 const Array<OneD, const NekDouble> &metric00 =
1303 m_metrics[eMetricLaplacian00];
1304 const Array<OneD, const NekDouble> &metric01 =
1305 m_metrics[eMetricLaplacian01];
1306 const Array<OneD, const NekDouble> &metric02 =
1307 m_metrics[eMetricLaplacian02];
1308 const Array<OneD, const NekDouble> &metric11 =
1309 m_metrics[eMetricLaplacian11];
1310 const Array<OneD, const NekDouble> &metric12 =
1311 m_metrics[eMetricLaplacian12];
1312 const Array<OneD, const NekDouble> &metric22 =
1313 m_metrics[eMetricLaplacian22];
1315 // Allocate temporary storage
1316 Array<OneD, NekDouble> wsp0(2 * nqtot, wsp);
1317 Array<OneD, NekDouble> wsp1(nqtot, wsp + 1 * nqtot);
1318 Array<OneD, NekDouble> wsp2(nqtot, wsp + 2 * nqtot);
1319 Array<OneD, NekDouble> wsp3(nqtot, wsp + 3 * nqtot);
1320 Array<OneD, NekDouble> wsp4(nqtot, wsp + 4 * nqtot);
1321 Array<OneD, NekDouble> wsp5(nqtot, wsp + 5 * nqtot);
1323 // LAPLACIAN MATRIX OPERATION
1324 // wsp1 = du_dxi1 = D_xi1 * inarray = D_xi1 * u
1325 // wsp2 = du_dxi2 = D_xi2 * inarray = D_xi2 * u
1326 // wsp2 = du_dxi3 = D_xi3 * inarray = D_xi3 * u
1327 StdExpansion3D::PhysTensorDeriv(inarray, wsp0, wsp1, wsp2);
1329 // wsp0 = k = g0 * wsp1 + g1 * wsp2 = g0 * du_dxi1 + g1 * du_dxi2
1330 // wsp2 = l = g1 * wsp1 + g2 * wsp2 = g0 * du_dxi1 + g1 * du_dxi2
1331 // where g0, g1 and g2 are the metric terms set up in the GeomFactors class
1332 // especially for this purpose
1333 Vmath::Vvtvvtp(nqtot, &metric00[0], 1, &wsp0[0], 1, &metric01[0], 1,
1334 &wsp1[0], 1, &wsp3[0], 1);
1335 Vmath::Vvtvp(nqtot, &metric02[0], 1, &wsp2[0], 1, &wsp3[0], 1, &wsp3[0], 1);
1336 Vmath::Vvtvvtp(nqtot, &metric01[0], 1, &wsp0[0], 1, &metric11[0], 1,
1337 &wsp1[0], 1, &wsp4[0], 1);
1338 Vmath::Vvtvp(nqtot, &metric12[0], 1, &wsp2[0], 1, &wsp4[0], 1, &wsp4[0], 1);
1339 Vmath::Vvtvvtp(nqtot, &metric02[0], 1, &wsp0[0], 1, &metric12[0], 1,
1340 &wsp1[0], 1, &wsp5[0], 1);
1341 Vmath::Vvtvp(nqtot, &metric22[0], 1, &wsp2[0], 1, &wsp5[0], 1, &wsp5[0], 1);
1343 // outarray = m = (D_xi1 * B)^T * k
1344 // wsp1 = n = (D_xi2 * B)^T * l
1345 IProductWRTBase_SumFacKernel(dbase0, base1, base2, wsp3, outarray, wsp0,
1347 IProductWRTBase_SumFacKernel(base0, dbase1, base2, wsp4, wsp2, wsp0, true,
1349 Vmath::Vadd(m_ncoeffs, wsp2.get(), 1, outarray.get(), 1, outarray.get(), 1);
1350 IProductWRTBase_SumFacKernel(base0, base1, dbase2, wsp5, wsp2, wsp0, true,
1352 Vmath::Vadd(m_ncoeffs, wsp2.get(), 1, outarray.get(), 1, outarray.get(), 1);
1360 void PyrExp::v_NormalTraceDerivFactors(
1361 Array<OneD, Array<OneD, NekDouble>> &d0factors,
1362 Array<OneD, Array<OneD, NekDouble>> &d1factors,
1363 Array<OneD, Array<OneD, NekDouble>> &d2factors)
1365 int nquad0 = GetNumPoints(0);
1366 int nquad1 = GetNumPoints(1);
1367 int nquad2 = GetNumPoints(2);
1369 const Array<TwoD, const NekDouble> &df =
1370 m_metricinfo->GetDerivFactors(GetPointsKeys());
1372 if (d0factors.size() != 5)
1374 d0factors = Array<OneD, Array<OneD, NekDouble>>(5);
1375 d1factors = Array<OneD, Array<OneD, NekDouble>>(5);
1376 d2factors = Array<OneD, Array<OneD, NekDouble>>(5);
1379 if (d0factors[0].size() != nquad0 * nquad1)
1381 d0factors[0] = Array<OneD, NekDouble>(nquad0 * nquad1);
1382 d1factors[0] = Array<OneD, NekDouble>(nquad0 * nquad1);
1383 d2factors[0] = Array<OneD, NekDouble>(nquad0 * nquad1);
1386 if (d0factors[1].size() != nquad0 * nquad2)
1388 d0factors[1] = Array<OneD, NekDouble>(nquad0 * nquad2);
1389 d0factors[3] = Array<OneD, NekDouble>(nquad0 * nquad2);
1390 d1factors[1] = Array<OneD, NekDouble>(nquad0 * nquad2);
1391 d1factors[3] = Array<OneD, NekDouble>(nquad0 * nquad2);
1392 d2factors[1] = Array<OneD, NekDouble>(nquad0 * nquad2);
1393 d2factors[3] = Array<OneD, NekDouble>(nquad0 * nquad2);
1396 if (d0factors[2].size() != nquad1 * nquad2)
1398 d0factors[2] = Array<OneD, NekDouble>(nquad1 * nquad2);
1399 d0factors[4] = Array<OneD, NekDouble>(nquad1 * nquad2);
1400 d1factors[2] = Array<OneD, NekDouble>(nquad1 * nquad2);
1401 d1factors[4] = Array<OneD, NekDouble>(nquad1 * nquad2);
1402 d2factors[2] = Array<OneD, NekDouble>(nquad1 * nquad2);
1403 d2factors[4] = Array<OneD, NekDouble>(nquad1 * nquad2);
1407 const Array<OneD, const Array<OneD, NekDouble>> &normal_0 =
1409 const Array<OneD, const Array<OneD, NekDouble>> &normal_1 =
1411 const Array<OneD, const Array<OneD, NekDouble>> &normal_2 =
1413 const Array<OneD, const Array<OneD, NekDouble>> &normal_3 =
1415 const Array<OneD, const Array<OneD, NekDouble>> &normal_4 =
1418 int ncoords = normal_0.size();
1420 // first gather together standard cartesian inner products
1421 if (m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
1424 for (int i = 0; i < nquad0 * nquad1; ++i)
1426 d0factors[0][i] = df[0][i] * normal_0[0][i];
1427 d1factors[0][i] = df[1][i] * normal_0[0][i];
1428 d2factors[0][i] = df[2][i] * normal_0[0][i];
1431 for (int n = 1; n < ncoords; ++n)
1433 for (int i = 0; i < nquad0 * nquad1; ++i)
1435 d0factors[0][i] += df[3 * n][i] * normal_0[n][i];
1436 d1factors[0][i] += df[3 * n + 1][i] * normal_0[n][i];
1437 d2factors[0][i] += df[3 * n + 2][i] * normal_0[n][i];
1442 for (int j = 0; j < nquad2; ++j)
1444 for (int i = 0; i < nquad0; ++i)
1446 d0factors[1][i] = df[0][j * nquad0 * nquad1 + i] *
1447 normal_1[0][j * nquad0 + i];
1449 df[0][(j + 1) * nquad0 * nquad1 - nquad0 + i] *
1450 normal_3[0][j * nquad0 + i];
1451 d1factors[1][i] = df[1][j * nquad0 * nquad1 + i] *
1452 normal_1[0][j * nquad0 + i];
1454 df[1][(j + 1) * nquad0 * nquad1 - nquad0 + i] *
1455 normal_3[0][j * nquad0 + i];
1456 d2factors[1][i] = df[2][j * nquad0 * nquad1 + i] *
1457 normal_1[0][j * nquad0 + i];
1459 df[2][(j + 1) * nquad0 * nquad1 - nquad0 + i] *
1460 normal_3[0][j * nquad0 + i];
1464 for (int n = 1; n < ncoords; ++n)
1466 for (int j = 0; j < nquad2; ++j)
1468 for (int i = 0; i < nquad0; ++i)
1470 d0factors[1][i] = df[3 * n][j * nquad0 * nquad1 + i] *
1471 normal_1[0][j * nquad0 + i];
1473 df[3 * n][(j + 1) * nquad0 * nquad1 - nquad0 + i] *
1474 normal_3[0][j * nquad0 + i];
1475 d1factors[1][i] = df[3 * n + 1][j * nquad0 * nquad1 + i] *
1476 normal_1[0][j * nquad0 + i];
1478 df[3 * n + 1][(j + 1) * nquad0 * nquad1 - nquad0 + i] *
1479 normal_3[0][j * nquad0 + i];
1480 d2factors[1][i] = df[3 * n + 2][j * nquad0 * nquad1 + i] *
1481 normal_1[0][j * nquad0 + i];
1483 df[3 * n + 2][(j + 1) * nquad0 * nquad1 - nquad0 + i] *
1484 normal_3[0][j * nquad0 + i];
1490 for (int j = 0; j < nquad2; ++j)
1492 for (int i = 0; i < nquad1; ++i)
1494 d0factors[2][j * nquad1 + i] =
1495 df[0][j * nquad0 * nquad1 + (i + 1) * nquad0 - 1] *
1496 normal_2[0][j * nquad1 + i];
1497 d0factors[4][j * nquad1 + i] =
1498 df[0][j * nquad0 * nquad1 + i * nquad0] *
1499 normal_4[0][j * nquad1 + i];
1500 d1factors[2][j * nquad1 + i] =
1501 df[1][j * nquad0 * nquad1 + (i + 1) * nquad0 - 1] *
1502 normal_2[0][j * nquad1 + i];
1503 d1factors[4][j * nquad1 + i] =
1504 df[1][j * nquad0 * nquad1 + i * nquad0] *
1505 normal_4[0][j * nquad1 + i];
1506 d2factors[2][j * nquad1 + i] =
1507 df[2][j * nquad0 * nquad1 + (i + 1) * nquad0 - 1] *
1508 normal_2[0][j * nquad1 + i];
1509 d2factors[4][j * nquad1 + i] =
1510 df[2][j * nquad0 * nquad1 + i * nquad0] *
1511 normal_4[0][j * nquad1 + i];
1515 for (int n = 1; n < ncoords; ++n)
1517 for (int j = 0; j < nquad2; ++j)
1519 for (int i = 0; i < nquad1; ++i)
1521 d0factors[2][j * nquad1 + i] +=
1522 df[3 * n][j * nquad0 * nquad1 + (i + 1) * nquad0 - 1] *
1523 normal_2[n][j * nquad0 + i];
1524 d0factors[4][j * nquad0 + i] +=
1525 df[3 * n][i * nquad0 + j * nquad0 * nquad1] *
1526 normal_4[n][j * nquad0 + i];
1527 d1factors[2][j * nquad1 + i] +=
1529 [j * nquad0 * nquad1 + (i + 1) * nquad0 - 1] *
1530 normal_2[n][j * nquad0 + i];
1531 d1factors[4][j * nquad0 + i] +=
1532 df[3 * n + 1][i * nquad0 + j * nquad0 * nquad1] *
1533 normal_4[n][j * nquad0 + i];
1534 d2factors[2][j * nquad1 + i] +=
1536 [j * nquad0 * nquad1 + (i + 1) * nquad0 - 1] *
1537 normal_2[n][j * nquad0 + i];
1538 d2factors[4][j * nquad0 + i] +=
1539 df[3 * n + 2][i * nquad0 + j * nquad0 * nquad1] *
1540 normal_4[n][j * nquad0 + i];
1548 for (int i = 0; i < nquad0 * nquad1; ++i)
1550 d0factors[0][i] = df[0][0] * normal_0[0][i];
1551 d1factors[0][i] = df[1][0] * normal_0[0][i];
1552 d2factors[0][i] = df[2][0] * normal_0[0][i];
1555 for (int n = 1; n < ncoords; ++n)
1557 for (int i = 0; i < nquad0 * nquad1; ++i)
1559 d0factors[0][i] += df[3 * n][0] * normal_0[n][i];
1560 d1factors[0][i] += df[3 * n + 1][0] * normal_0[n][i];
1561 d2factors[0][i] += df[3 * n + 2][0] * normal_0[n][i];
1566 for (int i = 0; i < nquad0 * nquad2; ++i)
1568 d0factors[1][i] = df[0][0] * normal_1[0][i];
1569 d0factors[3][i] = df[0][0] * normal_3[0][i];
1571 d1factors[1][i] = df[1][0] * normal_1[0][i];
1572 d1factors[3][i] = df[1][0] * normal_3[0][i];
1574 d2factors[1][i] = df[2][0] * normal_1[0][i];
1575 d2factors[3][i] = df[2][0] * normal_3[0][i];
1578 for (int n = 1; n < ncoords; ++n)
1580 for (int i = 0; i < nquad0 * nquad2; ++i)
1582 d0factors[1][i] += df[3 * n][0] * normal_1[n][i];
1583 d0factors[3][i] += df[3 * n][0] * normal_3[n][i];
1585 d1factors[1][i] += df[3 * n + 1][0] * normal_1[n][i];
1586 d1factors[3][i] += df[3 * n + 1][0] * normal_3[n][i];
1588 d2factors[1][i] += df[3 * n + 2][0] * normal_1[n][i];
1589 d2factors[3][i] += df[3 * n + 2][0] * normal_3[n][i];
1594 for (int i = 0; i < nquad1 * nquad2; ++i)
1596 d0factors[2][i] = df[0][0] * normal_2[0][i];
1597 d0factors[4][i] = df[0][0] * normal_4[0][i];
1599 d1factors[2][i] = df[1][0] * normal_2[0][i];
1600 d1factors[4][i] = df[1][0] * normal_4[0][i];
1602 d2factors[2][i] = df[2][0] * normal_2[0][i];
1603 d2factors[4][i] = df[2][0] * normal_4[0][i];
1606 for (int n = 1; n < ncoords; ++n)
1608 for (int i = 0; i < nquad1 * nquad2; ++i)
1610 d0factors[2][i] += df[3 * n][0] * normal_2[n][i];
1611 d0factors[4][i] += df[3 * n][0] * normal_4[n][i];
1613 d1factors[2][i] += df[3 * n + 1][0] * normal_2[n][i];
1614 d1factors[4][i] += df[3 * n + 1][0] * normal_4[n][i];
1616 d2factors[2][i] += df[3 * n + 2][0] * normal_2[n][i];
1617 d2factors[4][i] += df[3 * n + 2][0] * normal_4[n][i];
1623 } // namespace LocalRegions
1624 } // namespace Nektar
#define ASSERTL0(condition, msg)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
Describes the specification for a Basis.
int GetNumPoints() const
Return points order at which basis is defined.
PointsKey GetPointsKey() const
Return distribution of points.
Defines a specification for a set of points.
virtual DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey) override
std::map< int, NormalVector > m_traceNormals
std::map< int, Array< OneD, NekDouble > > m_elmtBndNormDirElmtLen
the element length in each element boundary(Vertex, edge or face) normal direction calculated based o...
SpatialDomains::GeometrySharedPtr GetGeom() const
SpatialDomains::GeometrySharedPtr m_geom
void ComputeLaplacianMetric()
virtual void v_GetCoords(Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3) override
void ComputeQuadratureMetric()
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
virtual void v_ExtractDataToCoeffs(const NekDouble *data, const std::vector< unsigned int > &nummodes, const int mode_offset, NekDouble *coeffs, std::vector< LibUtilities::BasisType > &fromType) override
virtual NekDouble v_Integral(const Array< OneD, const NekDouble > &inarray) override
Integrate the physical point list inarray over pyramidic region and return the value.
virtual void v_ComputeLaplacianMetric() override
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
virtual void v_GetCoords(Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3) override
virtual DNekMatSharedPtr v_CreateStdMatrix(const StdRegions::StdMatrixKey &mkey) override
virtual void v_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Forward transform from physical quadrature space stored in inarray and evaluate the expansion coeffic...
virtual void v_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdRegions::StdMatrixKey &mkey) override
void v_ComputeTraceNormal(const int face) override
virtual void v_GetCoord(const Array< OneD, const NekDouble > &Lcoords, Array< OneD, NekDouble > &coords) override
LibUtilities::NekManager< MatrixKey, DNekScalBlkMat, MatrixKey::opLess > m_staticCondMatrixManager
void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Calculates the inner product .
virtual StdRegions::StdExpansionSharedPtr v_GetStdExp(void) const override
void v_DropLocMatrix(const MatrixKey &mkey) override
virtual void v_LaplacianMatrixOp_MatFree_Kernel(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp) override
void v_IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
PyrExp(const LibUtilities::BasisKey &Ba, const LibUtilities::BasisKey &Bb, const LibUtilities::BasisKey &Bc, const SpatialDomains::PyrGeomSharedPtr &geom)
Constructor using BasisKey class for quadrature points and order definition.
virtual DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey) override
virtual StdRegions::StdExpansionSharedPtr v_GetLinStdExp(void) const override
virtual DNekScalBlkMatSharedPtr v_GetLocStaticCondMatrix(const MatrixKey &mkey) override
virtual void v_GetTracePhysMap(const int face, Array< OneD, int > &outarray) override
virtual void v_PhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2) override
Calculate the derivative of the physical points.
virtual NekDouble v_PhysEvaluate(const Array< OneD, const NekDouble > &coord, const Array< OneD, const NekDouble > &physvals) override
This function evaluates the expansion at a single (arbitrary) point of the domain.
void v_DropLocStaticCondMatrix(const MatrixKey &mkey) override
virtual void v_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Calculate the inner product of inarray with respect to the basis B=base0*base1*base2 and put into out...
virtual DNekScalMatSharedPtr v_GetLocMatrix(const MatrixKey &mkey) override
NekDouble v_StdPhysEvaluate(const Array< OneD, const NekDouble > &Lcoord, const Array< OneD, const NekDouble > &physvals) override
virtual void v_AlignVectorToCollapsedDir(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray) override
virtual void v_IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true) override
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
void IProductWRTBase_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)
int GetNcoeffs(void) const
This function returns the total number of coefficients used in the expansion.
int GetTotPoints() const
This function returns the total number of quadrature points used in the element.
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
const LibUtilities::PointsKeyVector GetPointsKeys() const
const LibUtilities::BasisKey GetTraceBasisKey(const int i, int k=-1) const
This function returns the basis key belonging to the i-th trace.
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
void BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Backward transformation from coefficient space to physical space.
LibUtilities::PointsType GetPointsType(const int dir) const
This function returns the type of quadrature points used in the dir direction.
void FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Forward transformation from physical space to coefficient space.
int GetNumPoints(const int dir) const
This function returns the number of quadrature points in the dir direction.
void MultiplyByQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Array< OneD, LibUtilities::BasisSharedPtr > m_base
MatrixType GetMatrixType() const
static void Dscal(const int &n, const double &alpha, double *x, const int &incx)
BLAS level 1: x = alpha x.
static void Daxpy(const int &n, const double &alpha, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: y = alpha x plus y.
int getNumberOfCoefficients(int Na)
void Interp2D(const BasisKey &fbasis0, const BasisKey &fbasis1, const Array< OneD, const NekDouble > &from, const BasisKey &tbasis0, const BasisKey &tbasis1, Array< OneD, NekDouble > &to)
this function interpolates a 2D function evaluated at the quadrature points of the 2D basis,...
std::vector< PointsKey > PointsKeyVector
std::shared_ptr< GeomFactors > GeomFactorsSharedPtr
Pointer to a GeomFactors object.
GeomType
Indicates the type of element geometry.
@ eRegular
Geometry is straight-sided with constant geometric factors.
@ eMovingRegular
Currently unused.
@ eDeformed
Geometry is curved or has non-constant factors.
std::shared_ptr< PyrGeom > PyrGeomSharedPtr
std::shared_ptr< StdExpansion > StdExpansionSharedPtr
std::shared_ptr< StdPyrExp > StdPyrExpSharedPtr
The above copyright notice and this permission notice shall be included.
std::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
std::shared_ptr< DNekScalBlkMat > DNekScalBlkMatSharedPtr
std::shared_ptr< DNekMat > DNekMatSharedPtr
void Vsqrt(int n, const T *x, const int incx, T *y, const int incy)
sqrt y = sqrt(x)
void Svtsvtp(int n, const T alpha, const T *x, int incx, const T beta, const T *y, int incy, T *z, int incz)
svtvvtp (scalar times vector plus scalar times vector):
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
void Svtvp(int n, const T alpha, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
svtvp (scalar times vector plus vector): z = alpha*x + y
void Vvtvp(int n, const T *w, const int incw, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
vvtvp (vector times vector plus vector): z = w*x + y
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
void Sdiv(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha/y.
void Vdiv(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x/y.
void Zero(int n, T *x, const int incx)
Zero vector.
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
void Vvtvvtp(int n, const T *v, int incv, const T *w, int incw, const T *x, int incx, const T *y, int incy, T *z, int incz)
vvtvvtp (vector times vector plus vector times vector):
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
scalarT< T > sqrt(scalarT< T > in)