62 Ba.GetNumModes(), Bb.GetNumModes(), Bc.GetNumModes()),
65 Ba.GetNumModes(), Bb.GetNumModes(), Bc.GetNumModes()),
70 std::string(
"TetExpMatrix")),
71 m_staticCondMatrixManager(
std::bind(&
Expansion::CreateStaticCondMatrix,
72 this,
std::placeholders::_1),
73 std::string(
"TetExpStaticCondMatrix"))
81 : StdRegions::StdExpansion(T), StdRegions::StdExpansion3D(T),
83 m_matrixManager(T.m_matrixManager),
84 m_staticCondMatrixManager(T.m_staticCondMatrixManager)
104 int nquad0 =
m_base[0]->GetNumPoints();
105 int nquad1 =
m_base[1]->GetNumPoints();
106 int nquad2 =
m_base[2]->GetNumPoints();
115 (
NekDouble *)&inarray[0], 1, &tmp[0], 1);
120 (
NekDouble *)&inarray[0], 1, &tmp[0], 1);
124 retrunVal = StdTetExp::v_Integral(tmp);
146 int TotPts =
m_base[0]->GetNumPoints() *
m_base[1]->GetNumPoints() *
147 m_base[2]->GetNumPoints();
155 StdTetExp::v_PhysDeriv(inarray, Diff0, Diff1, Diff2);
161 Vmath::Vmul(TotPts, &df[0][0], 1, &Diff0[0], 1, &out_d0[0], 1);
162 Vmath::Vvtvp(TotPts, &df[1][0], 1, &Diff1[0], 1, &out_d0[0], 1,
164 Vmath::Vvtvp(TotPts, &df[2][0], 1, &Diff2[0], 1, &out_d0[0], 1,
170 Vmath::Vmul(TotPts, &df[3][0], 1, &Diff0[0], 1, &out_d1[0], 1);
171 Vmath::Vvtvp(TotPts, &df[4][0], 1, &Diff1[0], 1, &out_d1[0], 1,
173 Vmath::Vvtvp(TotPts, &df[5][0], 1, &Diff2[0], 1, &out_d1[0], 1,
179 Vmath::Vmul(TotPts, &df[6][0], 1, &Diff0[0], 1, &out_d2[0], 1);
180 Vmath::Vvtvp(TotPts, &df[7][0], 1, &Diff1[0], 1, &out_d2[0], 1,
182 Vmath::Vvtvp(TotPts, &df[8][0], 1, &Diff2[0], 1, &out_d2[0], 1,
190 Vmath::Smul(TotPts, df[0][0], &Diff0[0], 1, &out_d0[0], 1);
191 Blas::Daxpy(TotPts, df[1][0], &Diff1[0], 1, &out_d0[0], 1);
192 Blas::Daxpy(TotPts, df[2][0], &Diff2[0], 1, &out_d0[0], 1);
197 Vmath::Smul(TotPts, df[3][0], &Diff0[0], 1, &out_d1[0], 1);
198 Blas::Daxpy(TotPts, df[4][0], &Diff1[0], 1, &out_d1[0], 1);
199 Blas::Daxpy(TotPts, df[5][0], &Diff2[0], 1, &out_d1[0], 1);
204 Vmath::Smul(TotPts, df[6][0], &Diff0[0], 1, &out_d2[0], 1);
205 Blas::Daxpy(TotPts, df[7][0], &Diff1[0], 1, &out_d2[0], 1);
206 Blas::Daxpy(TotPts, df[8][0], &Diff2[0], 1, &out_d2[0], 1);
226 if ((
m_base[0]->Collocation()) && (
m_base[1]->Collocation()) &&
227 (
m_base[2]->Collocation()))
243 out = (*matsys) * in;
286 const int nquad0 =
m_base[0]->GetNumPoints();
287 const int nquad1 =
m_base[1]->GetNumPoints();
288 const int nquad2 =
m_base[2]->GetNumPoints();
289 const int order0 =
m_base[0]->GetNumModes();
290 const int order1 =
m_base[1]->GetNumModes();
292 nquad2 * order0 * (order1 + 1) / 2);
294 if (multiplybyweights)
301 tmp, outarray, wsp,
true,
true,
true);
307 inarray, outarray, wsp,
true,
true,
true);
345 const int nquad0 =
m_base[0]->GetNumPoints();
346 const int nquad1 =
m_base[1]->GetNumPoints();
347 const int nquad2 =
m_base[2]->GetNumPoints();
348 const int order0 =
m_base[0]->GetNumModes();
349 const int order1 =
m_base[1]->GetNumModes();
350 const int nqtot = nquad0 * nquad1 * nquad2;
358 nquad2 * order0 * (order1 + 1) / 2);
370 m_base[2]->GetBdata(), tmp2, outarray, wsp,
374 m_base[2]->GetBdata(), tmp3, tmp6, wsp,
true,
380 m_base[2]->GetDbdata(), tmp4, tmp6, wsp,
true,
392 const int nquad0 =
m_base[0]->GetNumPoints();
393 const int nquad1 =
m_base[1]->GetNumPoints();
394 const int nquad2 =
m_base[2]->GetNumPoints();
395 const int nqtot = nquad0 * nquad1 * nquad2;
409 Vmath::Vmul(nqtot, &df[3 * dir][0], 1, inarray.get(), 1, tmp2.get(), 1);
410 Vmath::Vmul(nqtot, &df[3 * dir + 1][0], 1, inarray.get(), 1, tmp3.get(),
412 Vmath::Vmul(nqtot, &df[3 * dir + 2][0], 1, inarray.get(), 1,
413 outarray[2].get(), 1);
417 Vmath::Smul(nqtot, df[3 * dir][0], inarray.get(), 1, tmp2.get(), 1);
418 Vmath::Smul(nqtot, df[3 * dir + 1][0], inarray.get(), 1, tmp3.get(), 1);
419 Vmath::Smul(nqtot, df[3 * dir + 2][0], inarray.get(), 1,
420 outarray[2].get(), 1);
426 for (cnt = 0, k = 0; k < nquad2; ++k)
428 for (j = 0; j < nquad1; ++j)
430 g2 = 2.0 / (1.0 - z2[k]);
431 g1 = g2 / (1.0 - z1[j]);
433 g3 = (1.0 + z1[j]) * g2 * 0.5;
435 for (i = 0; i < nquad0; ++i, ++cnt)
437 g1a = g1 * (1 + z0[i]);
440 g0 * tmp2[cnt] + g1a * (tmp3[cnt] + outarray[2][cnt]);
442 outarray[1][cnt] = g2 * tmp3[cnt] + g3 * outarray[2][cnt];
462 return StdExpansion3D::v_PhysEvaluate(Lcoord, physvals);
477 m_geom->GetLocCoords(coord, Lcoord);
480 return StdExpansion3D::v_PhysEvaluate(Lcoord, physvals);
485 std::array<NekDouble, 3> &firstOrderDerivs)
489 m_geom->GetLocCoords(coord, Lcoord);
490 return StdTetExp::v_PhysEvaluate(Lcoord, inarray, firstOrderDerivs);
501 ASSERTL1(Lcoords[0] <= -1.0 && Lcoords[0] >= 1.0 && Lcoords[1] <= -1.0 &&
502 Lcoords[1] >= 1.0 && Lcoords[2] <= -1.0 && Lcoords[2] >= 1.0,
503 "Local coordinates are not in region [-1,1]");
507 for (i = 0; i <
m_geom->GetCoordim(); ++i)
509 coords[i] =
m_geom->GetCoord(i, Lcoords);
536 m_base[2]->GetBasisKey());
542 m_base[0]->GetPointsKey());
544 m_base[1]->GetPointsKey());
546 m_base[2]->GetPointsKey());
553 const NekDouble *data,
const std::vector<unsigned int> &nummodes,
554 const int mode_offset,
NekDouble *coeffs,
555 [[maybe_unused]] std::vector<LibUtilities::BasisType> &fromType)
557 int data_order0 = nummodes[mode_offset];
558 int fillorder0 = min(
m_base[0]->GetNumModes(), data_order0);
559 int data_order1 = nummodes[mode_offset + 1];
560 int order1 =
m_base[1]->GetNumModes();
561 int fillorder1 = min(order1, data_order1);
562 int data_order2 = nummodes[mode_offset + 2];
563 int order2 =
m_base[2]->GetNumModes();
564 int fillorder2 = min(order2, data_order2);
575 "Extraction routine not set up for this basis");
577 "Extraction routine not set up for this basis");
580 for (j = 0; j < fillorder0; ++j)
582 for (i = 0; i < fillorder1 - j; ++i)
586 cnt += data_order2 - j - i;
587 cnt1 += order2 - j - i;
591 for (i = fillorder1 - j; i < data_order1 - j; ++i)
593 cnt += data_order2 - j - i;
596 for (i = fillorder1 - j; i < order1 - j; ++i)
598 cnt1 += order2 - j - i;
604 ASSERTL0(
false,
"basis is either not set up or not "
614 int nquad0 =
m_base[0]->GetNumPoints();
615 int nquad1 =
m_base[1]->GetNumPoints();
616 int nquad2 =
m_base[2]->GetNumPoints();
628 if (outarray.size() != nq0 * nq1)
633 for (
int i = 0; i < nquad0 * nquad1; ++i)
644 if (outarray.size() != nq0 * nq1)
650 for (
int k = 0; k < nquad2; k++)
652 for (
int i = 0; i < nquad0; ++i)
654 outarray[k * nquad0 + i] = (nquad0 * nquad1 * k) + i;
663 if (outarray.size() != nq0 * nq1)
669 for (
int j = 0; j < nquad1 * nquad2; ++j)
671 outarray[j] = nquad0 - 1 + j * nquad0;
679 if (outarray.size() != nq0 * nq1)
685 for (
int j = 0; j < nquad1 * nquad2; ++j)
687 outarray[j] = j * nquad0;
692 ASSERTL0(
false,
"face value (> 3) is out of range");
707 for (
int i = 0; i < ptsKeys.size(); ++i)
719 geomFactors->GetDerivFactors(ptsKeys);
732 for (i = 0; i < vCoordDim; ++i)
737 size_t nqb = nq_face;
753 for (i = 0; i < vCoordDim; ++i)
755 normal[i][0] = -df[3 * i + 2][0];
762 for (i = 0; i < vCoordDim; ++i)
764 normal[i][0] = -df[3 * i + 1][0];
771 for (i = 0; i < vCoordDim; ++i)
774 df[3 * i][0] + df[3 * i + 1][0] + df[3 * i + 2][0];
781 for (i = 0; i < vCoordDim; ++i)
783 normal[i][0] = -df[3 * i][0];
788 ASSERTL0(
false,
"face is out of range (edge < 3)");
793 for (i = 0; i < vCoordDim; ++i)
795 fac += normal[i][0] * normal[i][0];
797 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();
814 int nq01 = nq0 * nq1;
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[1][tmp] + df[2][tmp]) * jac[tmp];
885 normals[nqtot + j + k * nq1] =
886 (df[3][tmp] + df[4][tmp] + df[5][tmp]) * jac[tmp];
887 normals[2 * nqtot + j + k * nq1] =
888 (df[6][tmp] + df[7][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 < nq1; ++j)
902 for (k = 0; k < nq2; ++k)
904 int tmp = j * nq0 + nq01 * k;
905 normals[j + k * nq1] = -df[0][tmp] * jac[tmp];
906 normals[nqtot + j + k * nq1] = -df[3][tmp] * jac[tmp];
907 normals[2 * nqtot + j + k * nq1] =
908 -df[6][tmp] * jac[tmp];
909 faceJac[j + k * nq1] = jac[tmp];
913 points0 = ptsKeys[1];
914 points1 = ptsKeys[2];
919 ASSERTL0(
false,
"face is out of range (face < 3)");
927 Vmath::Sdiv(nq_face, 1.0, &work[0], 1, &work[0], 1);
930 for (i = 0; i < vCoordDim; ++i)
935 Vmath::Vmul(nq_face, work, 1, normal[i], 1, normal[i], 1);
942 Vmath::Vvtvp(nq_face, normal[i], 1, normal[i], 1, work, 1, work, 1);
952 Vmath::Vmul(nq_face, normal[i], 1, work, 1, normal[i], 1);
979 StdExpansion::LaplacianMatrixOp_MatFree(k1, k2, inarray, outarray, mkey);
1003 StdTetExp::v_SVVLaplacianFilter(array, mkey);
1028 returnval = StdTetExp::v_GenMatrix(mkey);
1042 return tmp->GetStdMatrix(mkey);
1071 if (inarray.get() == outarray.get())
1077 (mat->GetOwnedMatrix())->GetPtr().get(),
m_ncoeffs,
1078 tmp.get(), 1, 0.0, outarray.get(), 1);
1083 (mat->GetOwnedMatrix())->GetPtr().get(),
m_ncoeffs,
1084 inarray.get(), 1, 0.0, outarray.get(), 1);
1099 int nquad0 =
m_base[0]->GetNumPoints();
1100 int nquad1 =
m_base[1]->GetNumPoints();
1101 int nquad2 =
m_base[2]->GetNumPoints();
1102 int nqtot = nquad0 * nquad1 * nquad2;
1104 ASSERTL1(wsp.size() >= 6 * nqtot,
"Insufficient workspace size.");
1105 ASSERTL1(m_ncoeffs <= nqtot, "Workspace not set up for ncoeffs > nqtot
");
1107 const Array<OneD, const NekDouble> &base0 = m_base[0]->GetBdata();
1108 const Array<OneD, const NekDouble> &base1 = m_base[1]->GetBdata();
1109 const Array<OneD, const NekDouble> &base2 = m_base[2]->GetBdata();
1110 const Array<OneD, const NekDouble> &dbase0 = m_base[0]->GetDbdata();
1111 const Array<OneD, const NekDouble> &dbase1 = m_base[1]->GetDbdata();
1112 const Array<OneD, const NekDouble> &dbase2 = m_base[2]->GetDbdata();
1113 const Array<OneD, const NekDouble> &metric00 =
1114 m_metrics[eMetricLaplacian00];
1115 const Array<OneD, const NekDouble> &metric01 =
1116 m_metrics[eMetricLaplacian01];
1117 const Array<OneD, const NekDouble> &metric02 =
1118 m_metrics[eMetricLaplacian02];
1119 const Array<OneD, const NekDouble> &metric11 =
1120 m_metrics[eMetricLaplacian11];
1121 const Array<OneD, const NekDouble> &metric12 =
1122 m_metrics[eMetricLaplacian12];
1123 const Array<OneD, const NekDouble> &metric22 =
1124 m_metrics[eMetricLaplacian22];
1126 // Allocate temporary storage
1127 Array<OneD, NekDouble> wsp0(2 * nqtot, wsp);
1128 Array<OneD, NekDouble> wsp1(nqtot, wsp + 1 * nqtot);
1129 Array<OneD, NekDouble> wsp2(nqtot, wsp + 2 * nqtot);
1130 Array<OneD, NekDouble> wsp3(nqtot, wsp + 3 * nqtot);
1131 Array<OneD, NekDouble> wsp4(nqtot, wsp + 4 * nqtot);
1132 Array<OneD, NekDouble> wsp5(nqtot, wsp + 5 * nqtot);
1134 // LAPLACIAN MATRIX OPERATION
1135 // wsp1 = du_dxi1 = D_xi1 * inarray = D_xi1 * u
1136 // wsp2 = du_dxi2 = D_xi2 * inarray = D_xi2 * u
1137 // wsp2 = du_dxi3 = D_xi3 * inarray = D_xi3 * u
1138 StdExpansion3D::PhysTensorDeriv(inarray, wsp0, wsp1, wsp2);
1140 // wsp0 = k = g0 * wsp1 + g1 * wsp2 = g0 * du_dxi1 + g1 * du_dxi2
1141 // wsp2 = l = g1 * wsp1 + g2 * wsp2 = g0 * du_dxi1 + g1 * du_dxi2
1142 // where g0, g1 and g2 are the metric terms set up in the GeomFactors class
1143 // especially for this purpose
1144 Vmath::Vvtvvtp(nqtot, &metric00[0], 1, &wsp0[0], 1, &metric01[0], 1,
1145 &wsp1[0], 1, &wsp3[0], 1);
1146 Vmath::Vvtvp(nqtot, &metric02[0], 1, &wsp2[0], 1, &wsp3[0], 1, &wsp3[0], 1);
1147 Vmath::Vvtvvtp(nqtot, &metric01[0], 1, &wsp0[0], 1, &metric11[0], 1,
1148 &wsp1[0], 1, &wsp4[0], 1);
1149 Vmath::Vvtvp(nqtot, &metric12[0], 1, &wsp2[0], 1, &wsp4[0], 1, &wsp4[0], 1);
1150 Vmath::Vvtvvtp(nqtot, &metric02[0], 1, &wsp0[0], 1, &metric12[0], 1,
1151 &wsp1[0], 1, &wsp5[0], 1);
1152 Vmath::Vvtvp(nqtot, &metric22[0], 1, &wsp2[0], 1, &wsp5[0], 1, &wsp5[0], 1);
1154 // outarray = m = (D_xi1 * B)^T * k
1155 // wsp1 = n = (D_xi2 * B)^T * l
1156 IProductWRTBase_SumFacKernel(dbase0, base1, base2, wsp3, outarray, wsp0,
1158 IProductWRTBase_SumFacKernel(base0, dbase1, base2, wsp4, wsp2, wsp0, true,
1160 Vmath::Vadd(m_ncoeffs, wsp2.get(), 1, outarray.get(), 1, outarray.get(), 1);
1161 IProductWRTBase_SumFacKernel(base0, base1, dbase2, wsp5, wsp2, wsp0, true,
1163 Vmath::Vadd(m_ncoeffs, wsp2.get(), 1, outarray.get(), 1, outarray.get(), 1);
1166void TetExp::v_ComputeLaplacianMetric()
1168 if (m_metrics.count(eMetricQuadrature) == 0)
1170 ComputeQuadratureMetric();
1174 const unsigned int nqtot = GetTotPoints();
1175 const unsigned int dim = 3;
1176 const MetricType m[3][3] = {
1177 {eMetricLaplacian00, eMetricLaplacian01, eMetricLaplacian02},
1178 {eMetricLaplacian01, eMetricLaplacian11, eMetricLaplacian12},
1179 {eMetricLaplacian02, eMetricLaplacian12, eMetricLaplacian22}};
1181 for (unsigned int i = 0; i < dim; ++i)
1183 for (unsigned int j = i; j < dim; ++j)
1185 m_metrics[m[i][j]] = Array<OneD, NekDouble>(nqtot);
1189 // Define shorthand synonyms for m_metrics storage
1190 Array<OneD, NekDouble> g0(m_metrics[m[0][0]]);
1191 Array<OneD, NekDouble> g1(m_metrics[m[1][1]]);
1192 Array<OneD, NekDouble> g2(m_metrics[m[2][2]]);
1193 Array<OneD, NekDouble> g3(m_metrics[m[0][1]]);
1194 Array<OneD, NekDouble> g4(m_metrics[m[0][2]]);
1195 Array<OneD, NekDouble> g5(m_metrics[m[1][2]]);
1197 // Allocate temporary storage
1198 Array<OneD, NekDouble> alloc(7 * nqtot, 0.0);
1199 Array<OneD, NekDouble> h0(alloc); // h0
1200 Array<OneD, NekDouble> h1(alloc + 1 * nqtot); // h1
1201 Array<OneD, NekDouble> h2(alloc + 2 * nqtot); // h2
1202 Array<OneD, NekDouble> h3(alloc + 3 * nqtot); // h3
1203 Array<OneD, NekDouble> wsp4(alloc + 4 * nqtot); // wsp4
1204 Array<OneD, NekDouble> wsp5(alloc + 5 * nqtot); // wsp5
1205 Array<OneD, NekDouble> wsp6(alloc + 6 * nqtot); // wsp6
1206 // Reuse some of the storage as workspace
1207 Array<OneD, NekDouble> wsp7(alloc); // wsp7
1208 Array<OneD, NekDouble> wsp8(alloc + 1 * nqtot); // wsp8
1209 Array<OneD, NekDouble> wsp9(alloc + 2 * nqtot); // wsp9
1211 const Array<TwoD, const NekDouble> &df =
1212 m_metricinfo->GetDerivFactors(GetPointsKeys());
1213 const Array<OneD, const NekDouble> &z0 = m_base[0]->GetZ();
1214 const Array<OneD, const NekDouble> &z1 = m_base[1]->GetZ();
1215 const Array<OneD, const NekDouble> &z2 = m_base[2]->GetZ();
1216 const unsigned int nquad0 = m_base[0]->GetNumPoints();
1217 const unsigned int nquad1 = m_base[1]->GetNumPoints();
1218 const unsigned int nquad2 = m_base[2]->GetNumPoints();
1220 for (j = 0; j < nquad2; ++j)
1222 for (i = 0; i < nquad1; ++i)
1224 Vmath::Fill(nquad0, 4.0 / (1.0 - z1[i]) / (1.0 - z2[j]),
1225 &h0[0] + i * nquad0 + j * nquad0 * nquad1, 1);
1226 Vmath::Fill(nquad0, 2.0 / (1.0 - z1[i]) / (1.0 - z2[j]),
1227 &h1[0] + i * nquad0 + j * nquad0 * nquad1, 1);
1228 Vmath::Fill(nquad0, 2.0 / (1.0 - z2[j]),
1229 &h2[0] + i * nquad0 + j * nquad0 * nquad1, 1);
1230 Vmath::Fill(nquad0, (1.0 + z1[i]) / (1.0 - z2[j]),
1231 &h3[0] + i * nquad0 + j * nquad0 * nquad1, 1);
1234 for (i = 0; i < nquad0; i++)
1236 Blas::Dscal(nquad1 * nquad2, 1 + z0[i], &h1[0] + i, nquad0);
1239 // Step 3. Construct combined metric terms for physical space to
1240 // collapsed coordinate system.
1241 // Order of construction optimised to minimise temporary storage
1242 if (m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
1245 Vmath::Vadd(nqtot, &df[1][0], 1, &df[2][0], 1, &wsp4[0], 1);
1246 Vmath::Vvtvvtp(nqtot, &df[0][0], 1, &h0[0], 1, &wsp4[0], 1, &h1[0], 1,
1249 Vmath::Vadd(nqtot, &df[4][0], 1, &df[5][0], 1, &wsp5[0], 1);
1250 Vmath::Vvtvvtp(nqtot, &df[3][0], 1, &h0[0], 1, &wsp5[0], 1, &h1[0], 1,
1253 Vmath::Vadd(nqtot, &df[7][0], 1, &df[8][0], 1, &wsp6[0], 1);
1254 Vmath::Vvtvvtp(nqtot, &df[6][0], 1, &h0[0], 1, &wsp6[0], 1, &h1[0], 1,
1258 Vmath::Vvtvvtp(nqtot, &wsp4[0], 1, &wsp4[0], 1, &wsp5[0], 1, &wsp5[0],
1260 Vmath::Vvtvp(nqtot, &wsp6[0], 1, &wsp6[0], 1, &g0[0], 1, &g0[0], 1);
1263 Vmath::Vvtvvtp(nqtot, &df[2][0], 1, &wsp4[0], 1, &df[5][0], 1, &wsp5[0],
1265 Vmath::Vvtvp(nqtot, &df[8][0], 1, &wsp6[0], 1, &g4[0], 1, &g4[0], 1);
1267 // overwrite h0, h1, h2
1268 // wsp7 (h2f1 + h3f2)
1269 Vmath::Vvtvvtp(nqtot, &df[1][0], 1, &h2[0], 1, &df[2][0], 1, &h3[0], 1,
1271 // wsp8 (h2f4 + h3f5)
1272 Vmath::Vvtvvtp(nqtot, &df[4][0], 1, &h2[0], 1, &df[5][0], 1, &h3[0], 1,
1274 // wsp9 (h2f7 + h3f8)
1275 Vmath::Vvtvvtp(nqtot, &df[7][0], 1, &h2[0], 1, &df[8][0], 1, &h3[0], 1,
1279 Vmath::Vvtvvtp(nqtot, &wsp4[0], 1, &wsp7[0], 1, &wsp5[0], 1, &wsp8[0],
1281 Vmath::Vvtvp(nqtot, &wsp6[0], 1, &wsp9[0], 1, &g3[0], 1, &g3[0], 1);
1283 // overwrite wsp4, wsp5, wsp6
1285 Vmath::Vvtvvtp(nqtot, &wsp7[0], 1, &wsp7[0], 1, &wsp8[0], 1, &wsp8[0],
1287 Vmath::Vvtvp(nqtot, &wsp9[0], 1, &wsp9[0], 1, &g1[0], 1, &g1[0], 1);
1290 Vmath::Vvtvvtp(nqtot, &df[2][0], 1, &wsp7[0], 1, &df[5][0], 1, &wsp8[0],
1292 Vmath::Vvtvp(nqtot, &df[8][0], 1, &wsp9[0], 1, &g5[0], 1, &g5[0], 1);
1295 Vmath::Vvtvvtp(nqtot, &df[2][0], 1, &df[2][0], 1, &df[5][0], 1,
1296 &df[5][0], 1, &g2[0], 1);
1297 Vmath::Vvtvp(nqtot, &df[8][0], 1, &df[8][0], 1, &g2[0], 1, &g2[0], 1);
1302 Vmath::Svtsvtp(nqtot, df[0][0], &h0[0], 1, df[1][0] + df[2][0], &h1[0],
1305 Vmath::Svtsvtp(nqtot, df[3][0], &h0[0], 1, df[4][0] + df[5][0], &h1[0],
1308 Vmath::Svtsvtp(nqtot, df[6][0], &h0[0], 1, df[7][0] + df[8][0], &h1[0],
1312 Vmath::Vvtvvtp(nqtot, &wsp4[0], 1, &wsp4[0], 1, &wsp5[0], 1, &wsp5[0],
1314 Vmath::Vvtvp(nqtot, &wsp6[0], 1, &wsp6[0], 1, &g0[0], 1, &g0[0], 1);
1317 Vmath::Svtsvtp(nqtot, df[2][0], &wsp4[0], 1, df[5][0], &wsp5[0], 1,
1319 Vmath::Svtvp(nqtot, df[8][0], &wsp6[0], 1, &g4[0], 1, &g4[0], 1);
1321 // overwrite h0, h1, h2
1322 // wsp7 (h2f1 + h3f2)
1323 Vmath::Svtsvtp(nqtot, df[1][0], &h2[0], 1, df[2][0], &h3[0], 1,
1325 // wsp8 (h2f4 + h3f5)
1326 Vmath::Svtsvtp(nqtot, df[4][0], &h2[0], 1, df[5][0], &h3[0], 1,
1328 // wsp9 (h2f7 + h3f8)
1329 Vmath::Svtsvtp(nqtot, df[7][0], &h2[0], 1, df[8][0], &h3[0], 1,
1333 Vmath::Vvtvvtp(nqtot, &wsp4[0], 1, &wsp7[0], 1, &wsp5[0], 1, &wsp8[0],
1335 Vmath::Vvtvp(nqtot, &wsp6[0], 1, &wsp9[0], 1, &g3[0], 1, &g3[0], 1);
1337 // overwrite wsp4, wsp5, wsp6
1339 Vmath::Vvtvvtp(nqtot, &wsp7[0], 1, &wsp7[0], 1, &wsp8[0], 1, &wsp8[0],
1341 Vmath::Vvtvp(nqtot, &wsp9[0], 1, &wsp9[0], 1, &g1[0], 1, &g1[0], 1);
1344 Vmath::Svtsvtp(nqtot, df[2][0], &wsp7[0], 1, df[5][0], &wsp8[0], 1,
1346 Vmath::Svtvp(nqtot, df[8][0], &wsp9[0], 1, &g5[0], 1, &g5[0], 1);
1350 df[2][0] * df[2][0] + df[5][0] * df[5][0] +
1351 df[8][0] * df[8][0],
1355 for (unsigned int i = 0; i < dim; ++i)
1357 for (unsigned int j = i; j < dim; ++j)
1359 MultiplyByQuadratureMetric(m_metrics[m[i][j]], m_metrics[m[i][j]]);
1369void TetExp::v_NormalTraceDerivFactors(
1370 Array<OneD, Array<OneD, NekDouble>> &d0factors,
1371 Array<OneD, Array<OneD, NekDouble>> &d1factors,
1372 Array<OneD, Array<OneD, NekDouble>> &d2factors)
1374 int nquad0 = GetNumPoints(0);
1375 int nquad1 = GetNumPoints(1);
1376 int nquad2 = GetNumPoints(2);
1378 const Array<TwoD, const NekDouble> &df =
1379 m_metricinfo->GetDerivFactors(GetPointsKeys());
1381 if (d0factors.size() != 4)
1383 d0factors = Array<OneD, Array<OneD, NekDouble>>(4);
1384 d1factors = Array<OneD, Array<OneD, NekDouble>>(4);
1385 d2factors = Array<OneD, Array<OneD, NekDouble>>(4);
1388 if (d0factors[0].size() != nquad0 * nquad1)
1390 d0factors[0] = Array<OneD, NekDouble>(nquad0 * nquad1);
1391 d1factors[0] = Array<OneD, NekDouble>(nquad0 * nquad1);
1392 d2factors[0] = Array<OneD, NekDouble>(nquad0 * nquad1);
1395 if (d0factors[1].size() != nquad0 * nquad2)
1397 d0factors[1] = Array<OneD, NekDouble>(nquad0 * nquad2);
1398 d1factors[1] = Array<OneD, NekDouble>(nquad0 * nquad2);
1399 d2factors[1] = Array<OneD, NekDouble>(nquad0 * nquad2);
1402 if (d0factors[2].size() != nquad1 * nquad2)
1404 d0factors[2] = Array<OneD, NekDouble>(nquad1 * nquad2);
1405 d0factors[3] = Array<OneD, NekDouble>(nquad1 * nquad2);
1406 d1factors[2] = Array<OneD, NekDouble>(nquad1 * nquad2);
1407 d1factors[3] = Array<OneD, NekDouble>(nquad1 * nquad2);
1408 d2factors[2] = Array<OneD, NekDouble>(nquad1 * nquad2);
1409 d2factors[3] = Array<OneD, NekDouble>(nquad1 * nquad2);
1413 const Array<OneD, const Array<OneD, NekDouble>> &normal_0 =
1415 const Array<OneD, const Array<OneD, NekDouble>> &normal_1 =
1417 const Array<OneD, const Array<OneD, NekDouble>> &normal_2 =
1419 const Array<OneD, const Array<OneD, NekDouble>> &normal_3 =
1422 int ncoords = normal_0.size();
1424 // first gather together standard cartesian inner products
1425 if (m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
1428 for (int i = 0; i < nquad0 * nquad1; ++i)
1430 d0factors[0][i] = df[0][i] * normal_0[0][i];
1431 d1factors[0][i] = df[1][i] * normal_0[0][i];
1432 d2factors[0][i] = df[2][i] * normal_0[0][i];
1435 for (int n = 1; n < ncoords; ++n)
1437 for (int i = 0; i < nquad0 * nquad1; ++i)
1439 d0factors[0][i] += df[3 * n][i] * normal_0[n][i];
1440 d1factors[0][i] += df[3 * n + 1][i] * normal_0[n][i];
1441 d2factors[0][i] += df[3 * n + 2][i] * normal_0[n][i];
1446 for (int j = 0; j < nquad2; ++j)
1448 for (int i = 0; i < nquad0; ++i)
1450 d0factors[1][j * nquad0 + i] = df[0][j * nquad0 * nquad1 + i] *
1451 normal_1[0][j * nquad0 + i];
1452 d1factors[1][j * nquad0 + i] = df[1][j * nquad0 * nquad1 + i] *
1453 normal_1[0][j * nquad0 + i];
1454 d2factors[1][j * nquad0 + i] = df[2][j * nquad0 * nquad1 + i] *
1455 normal_1[0][j * nquad0 + i];
1459 for (int n = 1; n < ncoords; ++n)
1461 for (int j = 0; j < nquad2; ++j)
1463 for (int i = 0; i < nquad0; ++i)
1465 d0factors[1][j * nquad0 + i] +=
1466 df[3 * n][j * nquad0 * nquad1 + i] *
1467 normal_1[0][j * nquad0 + i];
1468 d1factors[1][j * nquad0 + i] +=
1469 df[3 * n + 1][j * nquad0 * nquad1 + i] *
1470 normal_1[0][j * nquad0 + i];
1471 d2factors[1][j * nquad0 + i] +=
1472 df[3 * n + 2][j * nquad0 * nquad1 + i] *
1473 normal_1[0][j * nquad0 + i];
1479 for (int j = 0; j < nquad2; ++j)
1481 for (int i = 0; i < nquad1; ++i)
1483 d0factors[2][j * nquad1 + i] =
1484 df[0][(j * nquad1 + i + 1) * nquad0 - 1] *
1485 normal_2[0][j * nquad1 + i];
1486 d1factors[2][j * nquad1 + i] =
1487 df[1][(j * nquad1 + i + 1) * nquad0 - 1] *
1488 normal_2[0][j * nquad1 + i];
1489 d2factors[2][j * nquad1 + i] =
1490 df[2][(j * nquad1 + i + 1) * nquad0 - 1] *
1491 normal_2[0][j * nquad1 + i];
1493 d0factors[3][j * nquad1 + i] =
1494 df[0][(j * nquad1 + i) * nquad0] *
1495 normal_3[0][j * nquad1 + i];
1496 d1factors[3][j * nquad1 + i] =
1497 df[1][(j * nquad1 + i) * nquad0] *
1498 normal_3[0][j * nquad1 + i];
1499 d2factors[3][j * nquad1 + i] =
1500 df[2][(j * nquad1 + i) * nquad0] *
1501 normal_3[0][j * nquad1 + i];
1505 for (int n = 1; n < ncoords; ++n)
1507 for (int j = 0; j < nquad2; ++j)
1509 for (int i = 0; i < nquad1; ++i)
1511 d0factors[2][j * nquad1 + i] +=
1512 df[3 * n][(j * nquad1 + i + 1) * nquad0 - 1] *
1513 normal_2[n][j * nquad1 + i];
1514 d1factors[2][j * nquad1 + i] +=
1515 df[3 * n + 1][(j * nquad1 + i + 1) * nquad0 - 1] *
1516 normal_2[n][j * nquad1 + i];
1517 d2factors[2][j * nquad1 + i] +=
1518 df[3 * n + 2][(j * nquad1 + i + 1) * nquad0 - 1] *
1519 normal_2[n][j * nquad1 + i];
1521 d0factors[3][j * nquad1 + i] +=
1522 df[3 * n][(j * nquad1 + i) * nquad0] *
1523 normal_3[n][j * nquad1 + i];
1524 d1factors[3][j * nquad1 + i] +=
1525 df[3 * n + 1][(j * nquad1 + i) * nquad0] *
1526 normal_3[n][j * nquad1 + i];
1527 d2factors[3][j * nquad1 + i] +=
1528 df[3 * n + 2][(j * nquad1 + i) * nquad0] *
1529 normal_3[n][j * nquad1 + i];
1537 for (int i = 0; i < nquad0 * nquad1; ++i)
1539 d0factors[0][i] = df[0][0] * normal_0[0][i];
1540 d1factors[0][i] = df[1][0] * normal_0[0][i];
1541 d2factors[0][i] = df[2][0] * normal_0[0][i];
1544 for (int n = 1; n < ncoords; ++n)
1546 for (int i = 0; i < nquad0 * nquad1; ++i)
1548 d0factors[0][i] += df[3 * n][0] * normal_0[n][i];
1549 d1factors[0][i] += df[3 * n + 1][0] * normal_0[n][i];
1550 d2factors[0][i] += df[3 * n + 2][0] * normal_0[n][i];
1555 for (int i = 0; i < nquad0 * nquad2; ++i)
1557 d0factors[1][i] = df[0][0] * normal_1[0][i];
1558 d1factors[1][i] = df[1][0] * normal_1[0][i];
1559 d2factors[1][i] = df[2][0] * normal_1[0][i];
1562 for (int n = 1; n < ncoords; ++n)
1564 for (int i = 0; i < nquad0 * nquad2; ++i)
1566 d0factors[1][i] += df[3 * n][0] * normal_1[n][i];
1567 d1factors[1][i] += df[3 * n + 1][0] * normal_1[n][i];
1568 d2factors[1][i] += df[3 * n + 2][0] * normal_1[n][i];
1573 for (int i = 0; i < nquad1 * nquad2; ++i)
1575 d0factors[2][i] = df[0][0] * normal_2[0][i];
1576 d0factors[3][i] = df[0][0] * normal_3[0][i];
1578 d1factors[2][i] = df[1][0] * normal_2[0][i];
1579 d1factors[3][i] = df[1][0] * normal_3[0][i];
1581 d2factors[2][i] = df[2][0] * normal_2[0][i];
1582 d2factors[3][i] = df[2][0] * normal_3[0][i];
1585 for (int n = 1; n < ncoords; ++n)
1587 for (int i = 0; i < nquad1 * nquad2; ++i)
1589 d0factors[2][i] += df[3 * n][0] * normal_2[n][i];
1590 d0factors[3][i] += df[3 * n][0] * normal_3[n][i];
1592 d1factors[2][i] += df[3 * n + 1][0] * normal_2[n][i];
1593 d1factors[3][i] += df[3 * n + 1][0] * normal_3[n][i];
1595 d2factors[2][i] += df[3 * n + 2][0] * normal_2[n][i];
1596 d2factors[3][i] += df[3 * n + 2][0] * normal_3[n][i];
1601} // namespace Nektar::LocalRegions
#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.
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()
void v_GetCoords(Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3) override
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
DNekScalMatSharedPtr GetLocMatrix(const LocalRegions::MatrixKey &mkey)
void v_ComputeTraceNormal(const int face) override
Compute the normal of a triangular face.
NekDouble v_PhysEvaluate(const Array< OneD, const NekDouble > &coords, const Array< OneD, const NekDouble > &physvals) override
NekDouble v_Integral(const Array< OneD, const NekDouble > &inarray) override
Integrate the physical point list inarray over region.
DNekScalMatSharedPtr v_GetLocMatrix(const MatrixKey &mkey) override
NekDouble v_StdPhysEvaluate(const Array< OneD, const NekDouble > &Lcoord, const Array< OneD, const NekDouble > &physvals) override
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
Differentiate inarray in the three coordinate directions.
void v_DropLocMatrix(const MatrixKey &mkey) override
LibUtilities::NekManager< MatrixKey, DNekScalBlkMat, MatrixKey::opLess > m_staticCondMatrixManager
LibUtilities::NekManager< MatrixKey, DNekScalMat, MatrixKey::opLess > m_matrixManager
DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey) override
void v_LaplacianMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
void v_IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true) override
DNekScalBlkMatSharedPtr v_GetLocStaticCondMatrix(const MatrixKey &mkey) override
void v_GetCoord(const Array< OneD, const NekDouble > &Lcoords, Array< OneD, NekDouble > &coords) override
Get the coordinates "coords" at the local coordinates "Lcoords".
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=m_base0*m_base1*m_base2 and put in...
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...
StdRegions::StdExpansionSharedPtr v_GetStdExp(void) const override
LibUtilities::ShapeType v_DetShapeType() const override
Return Shape of region, using ShapeType enum list.
DNekMatSharedPtr v_CreateStdMatrix(const StdRegions::StdMatrixKey &mkey) override
void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray) override
Calculates the inner product .
StdRegions::StdExpansionSharedPtr v_GetLinStdExp(void) const override
TetExp(const LibUtilities::BasisKey &Ba, const LibUtilities::BasisKey &Bb, const LibUtilities::BasisKey &Bc, const SpatialDomains::TetGeomSharedPtr &geom)
Constructor using BasisKey class for quadrature points and order definition.
void v_GetCoords(Array< OneD, NekDouble > &coords_1, Array< OneD, NekDouble > &coords_2, Array< OneD, NekDouble > &coords_3) override
void GeneralMatrixOp_MatOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
void v_DropLocStaticCondMatrix(const MatrixKey &mkey) override
void v_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdRegions::StdMatrixKey &mkey) override
void v_AlignVectorToCollapsedDir(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray) override
void v_GetTracePhysMap(const int face, Array< OneD, int > &outarray) override
Returns the physical values at the quadrature points of a face.
void v_HelmholtzMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
void v_LaplacianMatrixOp_MatFree_Kernel(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp) override
void v_ExtractDataToCoeffs(const NekDouble *data, const std::vector< unsigned int > &nummodes, const int mode_offset, NekDouble *coeffs, std::vector< LibUtilities::BasisType > &fromType) 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)
void v_HelmholtzMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
void v_LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
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.
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...
LibUtilities::PointsType GetPointsType(const int dir) const
This function returns the type of quadrature points used in the dir direction.
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
LibUtilities::ShapeType DetShapeType() 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 = alpha A x plus beta y where A[m x n].
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
@ eModified_B
Principle Modified Functions .
@ eModified_C
Principle Modified Functions .
@ eModified_A
Principle Modified Functions .
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< TetGeom > TetGeomSharedPtr
std::shared_ptr< StdTetExp > StdTetExpSharedPtr
std::shared_ptr< StdExpansion > StdExpansionSharedPtr
@ eInvLaplacianWithUnityMean
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 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 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/x.
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 Vcopy(int n, const T *x, const int incx, T *y, const int incy)
scalarT< T > sqrt(scalarT< T > in)