35 #include <boost/core/ignore_unused.hpp>
49 namespace LocalRegions
54 : StdExpansion(Ba.GetNumModes() * Bb.GetNumModes(), 2, Ba, Bb),
55 StdExpansion2D(Ba.GetNumModes() * Bb.GetNumModes(), Ba, Bb),
58 std::bind(&
Expansion2D::CreateMatrix, this, std::placeholders::_1),
59 std::string(
"QuadExpMatrix")),
60 m_staticCondMatrixManager(std::bind(&
Expansion::CreateStaticCondMatrix,
61 this, std::placeholders::_1),
62 std::string(
"QuadExpStaticCondMatrix"))
67 : StdExpansion(T), StdExpansion2D(T), StdQuadExp(T),
Expansion(T),
69 m_staticCondMatrixManager(T.m_staticCondMatrixManager)
75 int nquad0 =
m_base[0]->GetNumPoints();
76 int nquad1 =
m_base[1]->GetNumPoints();
84 Vmath::Vmul(nquad0 * nquad1, jac, 1, inarray, 1, tmp, 1);
88 Vmath::Smul(nquad0 * nquad1, jac[0], inarray, 1, tmp, 1);
92 ival = StdQuadExp::v_Integral(tmp);
101 int nquad0 =
m_base[0]->GetNumPoints();
102 int nquad1 =
m_base[1]->GetNumPoints();
103 int nqtot = nquad0 * nquad1;
109 StdQuadExp::v_PhysDeriv(inarray, diff0, diff1);
116 Vmath::Vvtvp(nqtot, df[1], 1, diff1, 1, out_d0, 1, out_d0, 1);
122 Vmath::Vvtvp(nqtot, df[3], 1, diff1, 1, out_d1, 1, out_d1, 1);
128 Vmath::Vvtvp(nqtot, df[5], 1, diff1, 1, out_d2, 1, out_d2, 1);
179 ASSERTL1(
false,
"input dir is out of range");
189 int nquad0 =
m_base[0]->GetNumPoints();
190 int nquad1 =
m_base[1]->GetNumPoints();
191 int nqtot = nquad0 * nquad1;
199 StdQuadExp::v_PhysDeriv(inarray, diff0, diff1);
206 for (
int i = 0; i < 2; ++i)
209 for (
int k = 0; k < (
m_geom->GetCoordim()); ++k)
211 Vmath::Vvtvp(nqtot, &df[2 * k + i][0], 1, &direction[k * nqtot],
212 1, &tangmat[i][0], 1, &tangmat[i][0], 1);
219 Vmath::Vmul(nqtot, &tangmat[0][0], 1, &diff0[0], 1, &out[0], 1);
220 Vmath::Vvtvp(nqtot, &tangmat[1][0], 1, &diff1[0], 1, &out[0], 1,
234 if ((
m_base[0]->Collocation()) && (
m_base[1]->Collocation()))
250 out = (*matsys) * in;
258 if ((
m_base[0]->Collocation()) && (
m_base[1]->Collocation()))
265 int npoints[2] = {
m_base[0]->GetNumPoints(),
m_base[1]->GetNumPoints()};
266 int nmodes[2] = {
m_base[0]->GetNumModes(),
m_base[1]->GetNumModes()};
268 fill(outarray.get(), outarray.get() +
m_ncoeffs, 0.0);
270 if (nmodes[0] == 1 && nmodes[1] == 1)
272 outarray[0] = inarray[0];
279 for (i = 0; i < 4; i++)
286 for (i = 0; i < npoints[0]; i++)
288 physEdge[0][i] = inarray[i];
289 physEdge[2][i] = inarray[npoints[0] * (npoints[1] - 1) + i];
292 for (i = 0; i < npoints[1]; i++)
294 physEdge[1][i] = inarray[npoints[0] - 1 + i * npoints[0]];
295 physEdge[3][i] = inarray[i * npoints[0]];
298 for (i = 0; i < 4; i++)
302 reverse((physEdge[i]).get(),
303 (physEdge[i]).get() + npoints[i % 2]);
308 for (i = 0; i < 4; i++)
318 for (i = 0; i < 4; i++)
320 segexp[i % 2]->FwdTransBndConstrained(physEdge[i], coeffEdge[i]);
323 for (j = 0; j < nmodes[i % 2]; j++)
326 outarray[mapArray[j]] =
sign * coeffEdge[i][j];
331 int nInteriorDofs =
m_ncoeffs - nBoundaryDofs;
333 if (nInteriorDofs > 0)
357 for (i = 0; i < nInteriorDofs; i++)
359 rhs[i] = tmp1[mapArray[i]];
362 Blas::Dgemv(
'N', nInteriorDofs, nInteriorDofs, matsys->Scale(),
363 &((matsys->GetOwnedMatrix())->GetPtr())[0],
364 nInteriorDofs, rhs.get(), 1, 0.0, result.get(), 1);
366 for (i = 0; i < nInteriorDofs; i++)
368 outarray[mapArray[i]] = result[i];
377 if (
m_base[0]->Collocation() &&
m_base[1]->Collocation())
398 int nquad0 =
m_base[0]->GetNumPoints();
399 int nquad1 =
m_base[1]->GetNumPoints();
400 int order0 =
m_base[0]->GetNumModes();
402 if (multiplybyweights)
408 StdQuadExp::IProductWRTBase_SumFacKernel(
m_base[0]->GetBdata(),
409 m_base[1]->GetBdata(), tmp,
410 outarray, wsp,
true,
true);
416 StdQuadExp::IProductWRTBase_SumFacKernel(
m_base[0]->GetBdata(),
417 m_base[1]->GetBdata(), inarray,
418 outarray, wsp,
true,
true);
426 ASSERTL1((dir == 0) || (dir == 1) || (dir == 2),
"Invalid direction.");
428 "Invalid direction.");
430 int nquad0 =
m_base[0]->GetNumPoints();
431 int nquad1 =
m_base[1]->GetNumPoints();
432 int nqtot = nquad0 * nquad1;
433 int nmodes0 =
m_base[0]->GetNumModes();
450 tmp1, tmp3, tmp4,
false,
true);
452 tmp2, outarray, tmp4,
true,
false);
460 ASSERTL1((dir == 0) || (dir == 1) || (dir == 2),
"Invalid direction.");
462 "Invalid direction.");
464 int nquad0 =
m_base[0]->GetNumPoints();
465 int nquad1 =
m_base[1]->GetNumPoints();
466 int nqtot = nquad0 * nquad1;
467 int nmodes0 =
m_base[0]->GetNumModes();
479 Vmath::Vmul(nqtot, &df[2 * dir][0], 1, inarray.get(), 1, tmp1.get(), 1);
480 Vmath::Vmul(nqtot, &df[2 * dir + 1][0], 1, inarray.get(), 1, tmp2.get(),
485 Vmath::Smul(nqtot, df[2 * dir][0], inarray.get(), 1, tmp1.get(), 1);
486 Vmath::Smul(nqtot, df[2 * dir + 1][0], inarray.get(), 1, tmp2.get(), 1);
495 int nq =
m_base[0]->GetNumPoints() *
m_base[1]->GetNumPoints();
504 Vmath::Vvtvvtp(nq, &normals[0][0], 1, &Fx[0], 1, &normals[1][0], 1,
505 &Fy[0], 1, &Fn[0], 1);
506 Vmath::Vvtvp(nq, &normals[2][0], 1, &Fz[0], 1, &Fn[0], 1, &Fn[0], 1);
510 Vmath::Svtsvtp(nq, normals[0][0], &Fx[0], 1, normals[1][0], &Fy[0], 1,
512 Vmath::Svtvp(nq, normals[2][0], &Fz[0], 1, &Fn[0], 1, &Fn[0], 1);
534 m_base[0]->GetPointsKey());
536 m_base[1]->GetPointsKey());
554 ASSERTL1(Lcoords[0] >= -1.0 && Lcoords[1] <= 1.0 && Lcoords[1] >= -1.0 &&
556 "Local coordinates are not in region [-1,1]");
559 for (i = 0; i <
m_geom->GetCoordim(); ++i)
561 coords[i] =
m_geom->GetCoord(i, Lcoords);
575 return StdExpansion2D::v_PhysEvaluate(Lcoord, physvals);
584 m_geom->GetLocCoords(coord, Lcoord);
586 return StdExpansion2D::v_PhysEvaluate(Lcoord, physvals);
591 std::array<NekDouble, 3> &firstOrderDerivs)
595 m_geom->GetLocCoords(coord, Lcoord);
596 return StdQuadExp::v_PhysEvaluate(Lcoord, inarray, firstOrderDerivs);
604 int nquad0 =
m_base[0]->GetNumPoints();
605 int nquad1 =
m_base[1]->GetNumPoints();
614 Vmath::Vcopy(nquad0, &(inarray[0]), 1, &(outarray[0]), 1);
617 Vmath::Vcopy(nquad1, &(inarray[0]) + (nquad0 - 1), nquad0,
621 Vmath::Vcopy(nquad0, &(inarray[0]) + nquad0 * (nquad1 - 1), 1,
625 Vmath::Vcopy(nquad1, &(inarray[0]), nquad0, &(outarray[0]), 1);
628 ASSERTL0(
false,
"edge value (< 3) is out of range");
638 if (
m_base[edge % 2]->GetPointsKey() !=
639 EdgeExp->GetBasis(0)->GetPointsKey())
646 EdgeExp->GetBasis(0)->GetPointsKey(), outarray);
656 Vmath::Reverse(EdgeExp->GetNumPoints(0), &outarray[0], 1, &outarray[0],
666 int nq0 =
m_base[0]->GetNumPoints();
667 int nq1 =
m_base[1]->GetNumPoints();
681 for (i = 0; i < nq0; i++)
684 Blas::Ddot(nq1, mat_gauss->GetOwnedMatrix()->GetPtr().get(),
685 1, &inarray[i], nq0);
691 for (i = 0; i < nq1; i++)
694 Blas::Ddot(nq0, mat_gauss->GetOwnedMatrix()->GetPtr().get(),
695 1, &inarray[i * nq0], 1);
701 for (i = 0; i < nq0; i++)
704 Blas::Ddot(nq1, mat_gauss->GetOwnedMatrix()->GetPtr().get(),
705 1, &inarray[i], nq0);
711 for (i = 0; i < nq1; i++)
714 Blas::Ddot(nq0, mat_gauss->GetOwnedMatrix()->GetPtr().get(),
715 1, &inarray[i * nq0], 1);
720 ASSERTL0(
false,
"edge value (< 3) is out of range");
727 int nquad0 =
m_base[0]->GetNumPoints();
728 int nquad1 =
m_base[1]->GetNumPoints();
735 for (
int i = 0; i < nquad0; ++i)
742 for (
int i = 0; i < nquad1; ++i)
744 outarray[i] = (nquad0 - 1) + i * nquad0;
749 for (
int i = 0; i < nquad0; ++i)
751 outarray[i] = i + nquad0 * (nquad1 - 1);
756 for (
int i = 0; i < nquad1; ++i)
758 outarray[i] = i * nquad0;
762 ASSERTL0(
false,
"edge value (< 3) is out of range");
771 int nquad0 =
m_base[0]->GetNumPoints();
772 int nquad1 =
m_base[1]->GetNumPoints();
798 for (i = 0; i < nquad0; ++i)
801 j[i] *
sqrt(g1[i] * g1[i] + g3[i] * g3[i]);
805 Vmath::Vcopy(nquad1, &(df[0][0]) + (nquad0 - 1), nquad0,
808 Vmath::Vcopy(nquad1, &(df[2][0]) + (nquad0 - 1), nquad0,
814 for (i = 0; i < nquad1; ++i)
817 j[i] *
sqrt(g0[i] * g0[i] + g2[i] * g2[i]);
822 Vmath::Vcopy(nquad0, &(df[1][0]) + (nquad0 * (nquad1 - 1)),
825 Vmath::Vcopy(nquad0, &(df[3][0]) + (nquad0 * (nquad1 - 1)),
828 Vmath::Vcopy(nquad0, &(jac[0]) + (nquad0 * (nquad1 - 1)), 1,
831 for (i = 0; i < nquad0; ++i)
834 j[i] *
sqrt(g1[i] * g1[i] + g3[i] * g3[i]);
843 for (i = 0; i < nquad1; ++i)
846 j[i] *
sqrt(g0[i] * g0[i] + g2[i] * g2[i]);
850 ASSERTL0(
false,
"edge value (< 3) is out of range");
856 int nqtot = nquad0 * nquad1;
877 for (i = 0; i < nquad0; ++i)
879 outarray[i] =
sqrt(g1_edge[i] * g1_edge[i] +
880 g3_edge[i] * g3_edge[i]);
892 for (i = 0; i < nquad1; ++i)
894 outarray[i] =
sqrt(g0_edge[i] * g0_edge[i] +
895 g2_edge[i] * g2_edge[i]);
908 for (i = 0; i < nquad0; ++i)
910 outarray[i] =
sqrt(g1_edge[i] * g1_edge[i] +
911 g3_edge[i] * g3_edge[i]);
925 for (i = 0; i < nquad1; ++i)
927 outarray[i] =
sqrt(g0_edge[i] * g0_edge[i] +
928 g2_edge[i] * g2_edge[i]);
935 ASSERTL0(
false,
"edge value (< 3) is out of range");
947 for (i = 0; i < nquad0; ++i)
949 outarray[i] = jac[0] *
sqrt(df[1][0] * df[1][0] +
950 df[3][0] * df[3][0]);
954 for (i = 0; i < nquad1; ++i)
956 outarray[i] = jac[0] *
sqrt(df[0][0] * df[0][0] +
957 df[2][0] * df[2][0]);
961 for (i = 0; i < nquad0; ++i)
963 outarray[i] = jac[0] *
sqrt(df[1][0] * df[1][0] +
964 df[3][0] * df[3][0]);
968 for (i = 0; i < nquad1; ++i)
970 outarray[i] = jac[0] *
sqrt(df[0][0] * df[0][0] +
971 df[2][0] * df[2][0]);
975 ASSERTL0(
false,
"edge value (< 3) is out of range");
989 for (i = 0; i < ptsKeys.size(); ++i)
1000 geomFactors->GetDerivFactors(ptsKeys);
1003 if (edge == 0 || edge == 2)
1005 nqe =
m_base[0]->GetNumPoints();
1009 nqe =
m_base[1]->GetNumPoints();
1015 for (i = 0; i < vCoordDim; ++i)
1034 for (i = 0; i < vCoordDim; ++i)
1036 Vmath::Fill(nqe, -df[2 * i + 1][0], normal[i], 1);
1040 for (i = 0; i < vCoordDim; ++i)
1046 for (i = 0; i < vCoordDim; ++i)
1052 for (i = 0; i < vCoordDim; ++i)
1058 ASSERTL0(
false,
"edge is out of range (edge < 4)");
1063 for (i = 0; i < vCoordDim; ++i)
1065 fac += normal[i][0] * normal[i][0];
1067 fac = 1.0 /
sqrt(fac);
1071 for (i = 0; i < vCoordDim; ++i)
1073 Vmath::Smul(nqe, fac, normal[i], 1, normal[i], 1);
1080 int nquad0 = ptsKeys[0].GetNumPoints();
1081 int nquad1 = ptsKeys[1].GetNumPoints();
1099 for (j = 0; j < nquad0; ++j)
1101 edgejac[j] = jac[j];
1102 for (i = 0; i < vCoordDim; ++i)
1104 normals[i * nquad0 + j] =
1105 -df[2 * i + 1][j] * edgejac[j];
1108 from_key = ptsKeys[0];
1111 for (j = 0; j < nquad1; ++j)
1113 edgejac[j] = jac[nquad0 * j + nquad0 - 1];
1114 for (i = 0; i < vCoordDim; ++i)
1116 normals[i * nquad1 + j] =
1117 df[2 * i][nquad0 * j + nquad0 - 1] * edgejac[j];
1120 from_key = ptsKeys[1];
1123 for (j = 0; j < nquad0; ++j)
1125 edgejac[j] = jac[nquad0 * (nquad1 - 1) + j];
1126 for (i = 0; i < vCoordDim; ++i)
1128 normals[i * nquad0 + j] =
1129 (df[2 * i + 1][nquad0 * (nquad1 - 1) + j]) *
1133 from_key = ptsKeys[0];
1136 for (j = 0; j < nquad1; ++j)
1138 edgejac[j] = jac[nquad0 * j];
1139 for (i = 0; i < vCoordDim; ++i)
1141 normals[i * nquad1 + j] =
1142 -df[2 * i][nquad0 * j] * edgejac[j];
1145 from_key = ptsKeys[1];
1148 ASSERTL0(
false,
"edge is out of range (edge < 3)");
1153 int nqtot = nquad0 * nquad1;
1160 for (j = 0; j < nquad0; ++j)
1162 for (i = 0; i < vCoordDim; ++i)
1164 Vmath::Vmul(nqtot, &(df[2 * i + 1][0]), 1, &jac[0],
1165 1, &(tmp_gmat[0]), 1);
1168 normals[i * nquad0 + j] = -tmp_gmat_edge[j];
1171 from_key = ptsKeys[0];
1174 for (j = 0; j < nquad1; ++j)
1176 for (i = 0; i < vCoordDim; ++i)
1178 Vmath::Vmul(nqtot, &(df[2 * i][0]), 1, &jac[0], 1,
1182 normals[i * nquad1 + j] = tmp_gmat_edge[j];
1185 from_key = ptsKeys[1];
1188 for (j = 0; j < nquad0; ++j)
1190 for (i = 0; i < vCoordDim; ++i)
1192 Vmath::Vmul(nqtot, &(df[2 * i + 1][0]), 1, &jac[0],
1193 1, &(tmp_gmat[0]), 1);
1196 normals[i * nquad0 + j] = tmp_gmat_edge[j];
1199 from_key = ptsKeys[0];
1202 for (j = 0; j < nquad1; ++j)
1204 for (i = 0; i < vCoordDim; ++i)
1206 Vmath::Vmul(nqtot, &(df[2 * i][0]), 1, &jac[0], 1,
1210 normals[i * nquad1 + j] = -tmp_gmat_edge[j];
1213 from_key = ptsKeys[1];
1216 ASSERTL0(
false,
"edge is out of range (edge < 3)");
1231 m_base[0]->GetPointsKey(), &normal[i][0]);
1232 Vmath::Vmul(nqe, work, 1, normal[i], 1, normal[i], 1);
1239 Vmath::Vvtvp(nqe, normal[i], 1, normal[i], 1, work, 1, work, 1);
1249 Vmath::Vmul(nqe, normal[i], 1, work, 1, normal[i], 1);
1254 for (i = 0; i < vCoordDim; ++i)
1265 const NekDouble *data,
const std::vector<unsigned int> &nummodes,
1267 std::vector<LibUtilities::BasisType> &fromType)
1269 int data_order0 = nummodes[mode_offset];
1270 int fillorder0 = std::min(
m_base[0]->GetNumModes(), data_order0);
1272 int data_order1 = nummodes[mode_offset + 1];
1273 int order1 =
m_base[1]->GetNumModes();
1274 int fillorder1 = min(order1, data_order1);
1285 m_base[0]->GetPointsKey()),
1287 m_base[1]->GetPointsKey()));
1289 m_base[1]->GetBasisKey());
1311 "Extraction routine not set up for this basis");
1314 for (i = 0; i < fillorder0; ++i)
1316 Vmath::Vcopy(fillorder1, data + cnt, 1, coeffs + cnt1, 1);
1350 ASSERTL0(
false,
"basis is either not set up or not hierarchicial");
1356 return m_geom->GetEorient(edge);
1374 returnval = StdQuadExp::v_GenMatrix(mkey);
1386 return tmp->GetStdMatrix(mkey);
1413 StdExpansion::MassMatrixOp_MatFree(inarray, outarray, mkey);
1428 StdExpansion::LaplacianMatrixOp_MatFree(k1, k2, inarray, outarray, mkey);
1436 StdExpansion::WeakDerivMatrixOp_MatFree(i, inarray, outarray, mkey);
1443 StdExpansion::WeakDirectionalDerivMatrixOp_MatFree(inarray, outarray, mkey);
1450 StdExpansion::MassLevelCurvatureMatrixOp_MatFree(inarray, outarray, mkey);
1464 int n_coeffs = inarray.size();
1470 int nmodes0 =
m_base[0]->GetNumModes();
1471 int nmodes1 =
m_base[1]->GetNumModes();
1472 int numMax = nmodes0;
1490 for (
int i = 0; i < numMin + 1; ++i)
1492 Vmath::Vcopy(numMin, tmp = coeff + cnt, 1, tmp2 = coeff_tmp + cnt, 1);
1509 int nquad0 =
m_base[0]->GetNumPoints();
1510 int nquad1 =
m_base[1]->GetNumPoints();
1511 int nqtot = nquad0 * nquad1;
1512 int nmodes0 =
m_base[0]->GetNumModes();
1513 int nmodes1 =
m_base[1]->GetNumModes();
1515 max(max(max(nqtot,
m_ncoeffs), nquad1 * nmodes0), nquad0 * nmodes1);
1517 ASSERTL1(wsp.size() >= 3 * wspsize,
"Workspace is of insufficient size.");
1535 StdExpansion2D::PhysTensorDeriv(inarray, wsp1, wsp2);
1541 Vmath::Vvtvvtp(nqtot, &metric00[0], 1, &wsp1[0], 1, &metric01[0], 1,
1542 &wsp2[0], 1, &wsp0[0], 1);
1543 Vmath::Vvtvvtp(nqtot, &metric01[0], 1, &wsp1[0], 1, &metric11[0], 1,
1544 &wsp2[0], 1, &wsp2[0], 1);
1566 const unsigned int dim = 2;
1574 for (
unsigned int i = 0; i < dim; ++i)
1576 for (
unsigned int j = i; j < dim; ++j)
1615 StdQuadExp::v_SVVLaplacianFilter(array, mkey);
1631 boost::ignore_unused(d2factors);
1638 if (d0factors.size() != 4)
1644 if (d0factors[0].size() != nquad0)
1652 if (d0factors[1].size() != nquad1)
1670 int ncoords = normal_0.size();
1677 for (
int i = 0; i < nquad0; ++i)
1679 d0factors[0][i] = df[0][i] * normal_0[0][i];
1680 d0factors[2][i] = df[0][nquad0 * (nquad1 - 1) + i] * normal_2[0][i];
1682 d1factors[0][i] = df[1][i] * normal_0[0][i];
1683 d1factors[2][i] = df[1][nquad0 * (nquad1 - 1) + i] * normal_2[0][i];
1686 for (
int n = 1; n < ncoords; ++n)
1690 for (
int i = 0; i < nquad0; ++i)
1692 d0factors[0][i] += df[2 * n][i] * normal_0[n][i];
1694 df[2 * n][nquad0 * (nquad1 - 1) + i] * normal_2[n][i];
1696 d1factors[0][i] += df[2 * n + 1][i] * normal_0[n][i];
1698 df[2 * n + 1][nquad0 * (nquad1 - 1) + i] * normal_2[n][i];
1703 for (
int i = 0; i < nquad1; ++i)
1705 d0factors[1][i] = df[0][(i + 1) * nquad0 - 1] * normal_1[0][i];
1706 d0factors[3][i] = df[0][i * nquad0] * normal_3[0][i];
1708 d1factors[1][i] = df[1][(i + 1) * nquad0 - 1] * normal_1[0][i];
1709 d1factors[3][i] = df[1][i * nquad0] * normal_3[0][i];
1712 for (
int n = 1; n < ncoords; ++n)
1714 for (
int i = 0; i < nquad1; ++i)
1717 df[2 * n][(i + 1) * nquad0 - 1] * normal_1[n][i];
1718 d0factors[3][i] += df[2 * n][i * nquad0] * normal_3[n][i];
1721 df[2 * n + 1][(i + 1) * nquad0 - 1] * normal_1[n][i];
1722 d1factors[3][i] += df[2 * n + 1][i * nquad0] * normal_3[n][i];
1729 for (
int i = 0; i < nquad0; ++i)
1731 d1factors[0][i] = df[1][0] * normal_0[0][i];
1732 d1factors[2][i] = df[1][0] * normal_2[0][i];
1736 for (
int i = 0; i < nquad1; ++i)
1738 d0factors[1][i] = df[0][0] * normal_1[0][i];
1739 d0factors[3][i] = df[0][0] * normal_3[0][i];
1742 for (
int n = 1; n < ncoords; ++n)
1746 for (
int i = 0; i < nquad0; ++i)
1748 d1factors[0][i] += df[2 * n + 1][0] * normal_0[n][i];
1749 d1factors[2][i] += df[2 * n + 1][0] * normal_2[n][i];
1754 for (
int i = 0; i < nquad1; ++i)
1756 d0factors[1][i] += df[2 * n][0] * normal_1[n][i];
1757 d0factors[3][i] += df[2 * n][0] * normal_3[n][i];
1763 for (
int i = 0; i < nquad0; ++i)
1765 d0factors[0][i] = df[0][0] * normal_0[0][i];
1766 d0factors[2][i] = df[0][0] * normal_2[0][i];
1770 for (
int i = 0; i < nquad1; ++i)
1772 d1factors[1][i] = df[1][0] * normal_1[0][i];
1773 d1factors[3][i] = df[1][0] * normal_3[0][i];
1776 for (
int n = 1; n < ncoords; ++n)
1780 for (
int i = 0; i < nquad0; ++i)
1782 d0factors[0][i] += df[2 * n][0] * normal_0[n][i];
1783 d0factors[2][i] += df[2 * n][0] * normal_2[n][i];
1788 for (
int i = 0; i < nquad1; ++i)
1790 d1factors[1][i] += df[2 * n + 1][0] * normal_1[n][i];
1791 d1factors[3][i] += df[2 * n + 1][0] * normal_3[n][i];
#define ASSERTL0(condition, msg)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
#define sign(a, b)
return the sign(b)*a
Describes the specification for a Basis.
Defines a specification for a set of points.
unsigned int GetNumPoints() const
virtual DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey) override
SpatialDomains::Geometry2DSharedPtr GetGeom2D() const
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
ExpansionSharedPtr GetLeftAdjacentElementExp() const
void ComputeLaplacianMetric()
virtual void v_GetCoords(Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3) override
int GetLeftAdjacentElementTrace() const
void ComputeQuadratureMetric()
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
StdRegions::Orientation GetTraceOrient(int trace)
const NormalVector & GetTraceNormal(const int id)
virtual void v_MassMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
virtual StdRegions::Orientation v_GetTraceOrient(int edge) override
virtual DNekScalBlkMatSharedPtr v_GetLocStaticCondMatrix(const MatrixKey &mkey) override
virtual void v_NormalTraceDerivFactors(Array< OneD, Array< OneD, NekDouble >> &factors, Array< OneD, Array< OneD, NekDouble >> &d0factors, Array< OneD, Array< OneD, NekDouble >> &d1factors) override
: This method gets all of the factors which are required as part of the Gradient Jump Penalty (GJP) s...
virtual void v_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Transform a given function from physical quadrature space to coefficient space.
virtual DNekScalMatSharedPtr v_GetLocMatrix(const MatrixKey &mkey) override
virtual StdRegions::StdExpansionSharedPtr v_GetLinStdExp(void) const override
virtual void v_HelmholtzMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
virtual void v_GetCoord(const Array< OneD, const NekDouble > &Lcoords, Array< OneD, NekDouble > &coords) 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 and put into outarray.
virtual void v_ComputeLaplacianMetric() override
virtual void v_LaplacianMatrixOp_MatFree_Kernel(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp) override
virtual void v_IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true) override
void GetEdgeInterpVals(const int edge, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
virtual void v_NormVectorIProductWRTBase(const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, const Array< OneD, const NekDouble > &Fz, Array< OneD, NekDouble > &outarray) override
virtual void v_LaplacianMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
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.
virtual void v_GetTracePhysVals(const int edge, const StdRegions::StdExpansionSharedPtr &EdgeExp, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, StdRegions::Orientation orient) override
virtual void v_WeakDirectionalDerivMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) 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=NullNekDouble1DArray) override
Calculate the derivative of the physical points.
virtual void v_AlignVectorToCollapsedDir(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray) override
virtual NekDouble v_Integral(const Array< OneD, const NekDouble > &inarray) override
Integrates the specified function over the domain.
void v_DropLocMatrix(const MatrixKey &mkey) override
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
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 void v_GetCoords(Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3) override
virtual void v_ComputeTraceNormal(const int edge) override
virtual void v_PhysDirectionalDeriv(const Array< OneD, const NekDouble > &inarray, const Array< OneD, const NekDouble > &direction, Array< OneD, NekDouble > &out) override
Physical derivative along a direction vector.
LibUtilities::NekManager< MatrixKey, DNekScalBlkMat, MatrixKey::opLess > m_staticCondMatrixManager
virtual StdRegions::StdExpansionSharedPtr v_GetStdExp(void) const override
virtual DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey) override
void v_DropLocStaticCondMatrix(const MatrixKey &mkey) override
virtual void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
virtual void v_MassLevelCurvatureMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
virtual DNekMatSharedPtr v_CreateStdMatrix(const StdRegions::StdMatrixKey &mkey) override
virtual void v_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdRegions::StdMatrixKey &mkey) override
virtual NekDouble v_StdPhysEvaluate(const Array< OneD, const NekDouble > &Lcoord, const Array< OneD, const NekDouble > &physvals) override
virtual void v_FwdTransBndConstrained(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
virtual void v_ReduceOrderCoeffs(int numMin, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
virtual void v_GetTracePhysMap(const int edge, Array< OneD, int > &outarray) override
virtual void v_GetTraceQFactors(const int edge, Array< OneD, NekDouble > &outarray) override
virtual void v_WeakDerivMatrixOp(const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) 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 > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0=true, bool doCheckCollDir1=true)
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.
void HelmholtzMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
int NumBndryCoeffs(void) const
const LibUtilities::PointsKeyVector GetPointsKeys() const
void MassMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
void IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
void NormVectorIProductWRTBase(const Array< OneD, const NekDouble > &Fx, Array< OneD, NekDouble > &outarray)
void IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
this function calculates the inner product of a given function f with the different modes of the expa...
void LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
void GetTraceToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation traceOrient=eForwards, int P=-1, int Q=-1)
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
void GetInteriorMap(Array< OneD, unsigned int > &outarray)
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 IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)
void MultiplyByQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Array< OneD, LibUtilities::BasisSharedPtr > m_base
MatrixType GetMatrixType() const
static void Dgemv(const char &trans, const int &m, const int &n, const double &alpha, const double *a, const int &lda, const double *x, const int &incx, const double &beta, double *y, const int &incy)
BLAS level 2: Matrix vector multiply y = A x where A[m x n].
static double Ddot(const int &n, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: output = .
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.
void Interp1D(const BasisKey &fbasis0, const Array< OneD, const NekDouble > &from, const BasisKey &tbasis0, Array< OneD, NekDouble > &to)
this function interpolates a 1D function evaluated at the quadrature points of the basis fbasis0 to ...
void InterpCoeff2D(const BasisKey &fbasis0, const BasisKey &fbasis1, const Array< OneD, const NekDouble > &from, const BasisKey &tbasis0, const BasisKey &tbasis1, Array< OneD, NekDouble > &to)
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
@ eGaussLobattoLegendre
1D Gauss-Lobatto-Legendre quadrature points
@ eGaussGaussLegendre
1D Gauss-Gauss-Legendre quadrature points
@ eGauss_Lagrange
Lagrange Polynomials using the Gauss points.
@ eOrtho_A
Principle Orthogonal Functions .
@ eGLL_Lagrange
Lagrange for SEM basis .
@ eModified_A
Principle Modified Functions .
std::shared_ptr< SegExp > SegExpSharedPtr
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< Geometry2D > Geometry2DSharedPtr
std::shared_ptr< StdQuadExp > StdQuadExpSharedPtr
std::shared_ptr< StdExpansion > StdExpansionSharedPtr
@ eInvLaplacianWithUnityMean
std::map< ConstFactorType, NekDouble > ConstFactorMap
The above copyright notice and this permission notice shall be included.
std::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
std::shared_ptr< DNekScalBlkMat > DNekScalBlkMatSharedPtr
static Array< OneD, NekDouble > NullNekDouble1DArray
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 Reverse(int n, const T *x, const int incx, T *y, const int incy)
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)
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.
scalarT< T > sqrt(scalarT< T > in)