35#include <boost/core/ignore_unused.hpp>
66 Ba.GetNumModes(), Bb.GetNumModes(), Bc.GetNumModes()),
69 Ba.GetNumModes(), Bb.GetNumModes(), Bc.GetNumModes()),
73 std::bind(&
Expansion3D::CreateMatrix, this, std::placeholders::_1),
74 std::string(
"TetExpMatrix")),
75 m_staticCondMatrixManager(std::bind(&
Expansion::CreateStaticCondMatrix,
76 this, std::placeholders::_1),
77 std::string(
"TetExpStaticCondMatrix"))
85 : StdRegions::StdExpansion(T), StdRegions::StdExpansion3D(T),
87 m_matrixManager(T.m_matrixManager),
88 m_staticCondMatrixManager(T.m_staticCondMatrixManager)
108 int nquad0 =
m_base[0]->GetNumPoints();
109 int nquad1 =
m_base[1]->GetNumPoints();
110 int nquad2 =
m_base[2]->GetNumPoints();
119 (
NekDouble *)&inarray[0], 1, &tmp[0], 1);
124 (
NekDouble *)&inarray[0], 1, &tmp[0], 1);
128 retrunVal = StdTetExp::v_Integral(tmp);
150 int TotPts =
m_base[0]->GetNumPoints() *
m_base[1]->GetNumPoints() *
151 m_base[2]->GetNumPoints();
159 StdTetExp::v_PhysDeriv(inarray, Diff0, Diff1, Diff2);
165 Vmath::Vmul(TotPts, &df[0][0], 1, &Diff0[0], 1, &out_d0[0], 1);
166 Vmath::Vvtvp(TotPts, &df[1][0], 1, &Diff1[0], 1, &out_d0[0], 1,
168 Vmath::Vvtvp(TotPts, &df[2][0], 1, &Diff2[0], 1, &out_d0[0], 1,
174 Vmath::Vmul(TotPts, &df[3][0], 1, &Diff0[0], 1, &out_d1[0], 1);
175 Vmath::Vvtvp(TotPts, &df[4][0], 1, &Diff1[0], 1, &out_d1[0], 1,
177 Vmath::Vvtvp(TotPts, &df[5][0], 1, &Diff2[0], 1, &out_d1[0], 1,
183 Vmath::Vmul(TotPts, &df[6][0], 1, &Diff0[0], 1, &out_d2[0], 1);
184 Vmath::Vvtvp(TotPts, &df[7][0], 1, &Diff1[0], 1, &out_d2[0], 1,
186 Vmath::Vvtvp(TotPts, &df[8][0], 1, &Diff2[0], 1, &out_d2[0], 1,
194 Vmath::Smul(TotPts, df[0][0], &Diff0[0], 1, &out_d0[0], 1);
195 Blas::Daxpy(TotPts, df[1][0], &Diff1[0], 1, &out_d0[0], 1);
196 Blas::Daxpy(TotPts, df[2][0], &Diff2[0], 1, &out_d0[0], 1);
201 Vmath::Smul(TotPts, df[3][0], &Diff0[0], 1, &out_d1[0], 1);
202 Blas::Daxpy(TotPts, df[4][0], &Diff1[0], 1, &out_d1[0], 1);
203 Blas::Daxpy(TotPts, df[5][0], &Diff2[0], 1, &out_d1[0], 1);
208 Vmath::Smul(TotPts, df[6][0], &Diff0[0], 1, &out_d2[0], 1);
209 Blas::Daxpy(TotPts, df[7][0], &Diff1[0], 1, &out_d2[0], 1);
210 Blas::Daxpy(TotPts, df[8][0], &Diff2[0], 1, &out_d2[0], 1);
230 if ((
m_base[0]->Collocation()) && (
m_base[1]->Collocation()) &&
231 (
m_base[2]->Collocation()))
247 out = (*matsys) * in;
290 const int nquad0 =
m_base[0]->GetNumPoints();
291 const int nquad1 =
m_base[1]->GetNumPoints();
292 const int nquad2 =
m_base[2]->GetNumPoints();
293 const int order0 =
m_base[0]->GetNumModes();
294 const int order1 =
m_base[1]->GetNumModes();
296 nquad2 * order0 * (order1 + 1) / 2);
298 if (multiplybyweights)
305 tmp, outarray, wsp,
true,
true,
true);
311 inarray, outarray, wsp,
true,
true,
true);
349 const int nquad0 =
m_base[0]->GetNumPoints();
350 const int nquad1 =
m_base[1]->GetNumPoints();
351 const int nquad2 =
m_base[2]->GetNumPoints();
352 const int order0 =
m_base[0]->GetNumModes();
353 const int order1 =
m_base[1]->GetNumModes();
354 const int nqtot = nquad0 * nquad1 * nquad2;
362 nquad2 * order0 * (order1 + 1) / 2);
374 m_base[2]->GetBdata(), tmp2, outarray, wsp,
378 m_base[2]->GetBdata(), tmp3, tmp6, wsp,
true,
384 m_base[2]->GetDbdata(), tmp4, tmp6, wsp,
true,
396 const int nquad0 =
m_base[0]->GetNumPoints();
397 const int nquad1 =
m_base[1]->GetNumPoints();
398 const int nquad2 =
m_base[2]->GetNumPoints();
399 const int nqtot = nquad0 * nquad1 * nquad2;
413 Vmath::Vmul(nqtot, &df[3 * dir][0], 1, inarray.get(), 1, tmp2.get(), 1);
414 Vmath::Vmul(nqtot, &df[3 * dir + 1][0], 1, inarray.get(), 1, tmp3.get(),
416 Vmath::Vmul(nqtot, &df[3 * dir + 2][0], 1, inarray.get(), 1,
417 outarray[2].get(), 1);
421 Vmath::Smul(nqtot, df[3 * dir][0], inarray.get(), 1, tmp2.get(), 1);
422 Vmath::Smul(nqtot, df[3 * dir + 1][0], inarray.get(), 1, tmp3.get(), 1);
423 Vmath::Smul(nqtot, df[3 * dir + 2][0], inarray.get(), 1,
424 outarray[2].get(), 1);
430 for (cnt = 0, k = 0; k < nquad2; ++k)
432 for (j = 0; j < nquad1; ++j)
434 g2 = 2.0 / (1.0 - z2[k]);
435 g1 = g2 / (1.0 - z1[j]);
437 g3 = (1.0 + z1[j]) * g2 * 0.5;
439 for (i = 0; i < nquad0; ++i, ++cnt)
441 g1a = g1 * (1 + z0[i]);
444 g0 * tmp2[cnt] + g1a * (tmp3[cnt] + outarray[2][cnt]);
446 outarray[1][cnt] = g2 * tmp3[cnt] + g3 * outarray[2][cnt];
466 return StdExpansion3D::v_PhysEvaluate(Lcoord, physvals);
481 m_geom->GetLocCoords(coord, Lcoord);
484 return StdExpansion3D::v_PhysEvaluate(Lcoord, physvals);
489 std::array<NekDouble, 3> &firstOrderDerivs)
493 m_geom->GetLocCoords(coord, Lcoord);
494 return StdTetExp::v_PhysEvaluate(Lcoord, inarray, firstOrderDerivs);
505 ASSERTL1(Lcoords[0] <= -1.0 && Lcoords[0] >= 1.0 && Lcoords[1] <= -1.0 &&
506 Lcoords[1] >= 1.0 && Lcoords[2] <= -1.0 && Lcoords[2] >= 1.0,
507 "Local coordinates are not in region [-1,1]");
511 for (i = 0; i <
m_geom->GetCoordim(); ++i)
513 coords[i] =
m_geom->GetCoord(i, Lcoords);
540 m_base[2]->GetBasisKey());
546 m_base[0]->GetPointsKey());
548 m_base[1]->GetPointsKey());
550 m_base[2]->GetPointsKey());
557 const NekDouble *data,
const std::vector<unsigned int> &nummodes,
558 const int mode_offset,
NekDouble *coeffs,
559 std::vector<LibUtilities::BasisType> &fromType)
561 boost::ignore_unused(fromType);
563 int data_order0 = nummodes[mode_offset];
564 int fillorder0 = min(
m_base[0]->GetNumModes(), data_order0);
565 int data_order1 = nummodes[mode_offset + 1];
566 int order1 =
m_base[1]->GetNumModes();
567 int fillorder1 = min(order1, data_order1);
568 int data_order2 = nummodes[mode_offset + 2];
569 int order2 =
m_base[2]->GetNumModes();
570 int fillorder2 = min(order2, data_order2);
581 "Extraction routine not set up for this basis");
583 "Extraction routine not set up for this basis");
586 for (j = 0; j < fillorder0; ++j)
588 for (i = 0; i < fillorder1 - j; ++i)
592 cnt += data_order2 - j - i;
593 cnt1 += order2 - j - i;
597 for (i = fillorder1 - j; i < data_order1 - j; ++i)
599 cnt += data_order2 - j - i;
602 for (i = fillorder1 - j; i < order1 - j; ++i)
604 cnt1 += order2 - j - i;
610 ASSERTL0(
false,
"basis is either not set up or not "
620 int nquad0 =
m_base[0]->GetNumPoints();
621 int nquad1 =
m_base[1]->GetNumPoints();
622 int nquad2 =
m_base[2]->GetNumPoints();
634 if (outarray.size() != nq0 * nq1)
639 for (
int i = 0; i < nquad0 * nquad1; ++i)
650 if (outarray.size() != nq0 * nq1)
656 for (
int k = 0; k < nquad2; k++)
658 for (
int i = 0; i < nquad0; ++i)
660 outarray[k * nquad0 + i] = (nquad0 * nquad1 * k) + i;
669 if (outarray.size() != nq0 * nq1)
675 for (
int j = 0; j < nquad1 * nquad2; ++j)
677 outarray[j] = nquad0 - 1 + j * nquad0;
685 if (outarray.size() != nq0 * nq1)
691 for (
int j = 0; j < nquad1 * nquad2; ++j)
693 outarray[j] = j * nquad0;
698 ASSERTL0(
false,
"face value (> 3) is out of range");
713 for (
int i = 0; i < ptsKeys.size(); ++i)
725 geomFactors->GetDerivFactors(ptsKeys);
738 for (i = 0; i < vCoordDim; ++i)
743 size_t nqb = nq_face;
759 for (i = 0; i < vCoordDim; ++i)
761 normal[i][0] = -df[3 * i + 2][0];
768 for (i = 0; i < vCoordDim; ++i)
770 normal[i][0] = -df[3 * i + 1][0];
777 for (i = 0; i < vCoordDim; ++i)
780 df[3 * i][0] + df[3 * i + 1][0] + df[3 * i + 2][0];
787 for (i = 0; i < vCoordDim; ++i)
789 normal[i][0] = -df[3 * i][0];
794 ASSERTL0(
false,
"face is out of range (edge < 3)");
799 for (i = 0; i < vCoordDim; ++i)
801 fac += normal[i][0] * normal[i][0];
803 fac = 1.0 /
sqrt(fac);
806 for (i = 0; i < vCoordDim; ++i)
808 Vmath::Fill(nq_face, fac * normal[i][0], normal[i], 1);
816 int nq0 = ptsKeys[0].GetNumPoints();
817 int nq1 = ptsKeys[1].GetNumPoints();
818 int nq2 = ptsKeys[2].GetNumPoints();
820 int nq01 = nq0 * nq1;
849 for (j = 0; j < nq01; ++j)
851 normals[j] = -df[2][j] * jac[j];
852 normals[nqtot + j] = -df[5][j] * jac[j];
853 normals[2 * nqtot + j] = -df[8][j] * jac[j];
857 points0 = ptsKeys[0];
858 points1 = ptsKeys[1];
864 for (j = 0; j < nq0; ++j)
866 for (k = 0; k < nq2; ++k)
868 int tmp = j + nq01 * k;
869 normals[j + k * nq0] = -df[1][tmp] * jac[tmp];
870 normals[nqtot + j + k * nq0] = -df[4][tmp] * jac[tmp];
871 normals[2 * nqtot + j + k * nq0] =
872 -df[7][tmp] * jac[tmp];
873 faceJac[j + k * nq0] = jac[tmp];
877 points0 = ptsKeys[0];
878 points1 = ptsKeys[2];
884 for (j = 0; j < nq1; ++j)
886 for (k = 0; k < nq2; ++k)
888 int tmp = nq0 - 1 + nq0 * j + nq01 * k;
889 normals[j + k * nq1] =
890 (df[0][tmp] + df[1][tmp] + df[2][tmp]) * jac[tmp];
891 normals[nqtot + j + k * nq1] =
892 (df[3][tmp] + df[4][tmp] + df[5][tmp]) * jac[tmp];
893 normals[2 * nqtot + j + k * nq1] =
894 (df[6][tmp] + df[7][tmp] + df[8][tmp]) * jac[tmp];
895 faceJac[j + k * nq1] = jac[tmp];
899 points0 = ptsKeys[1];
900 points1 = ptsKeys[2];
906 for (j = 0; j < nq1; ++j)
908 for (k = 0; k < nq2; ++k)
910 int tmp = j * nq0 + nq01 * k;
911 normals[j + k * nq1] = -df[0][tmp] * jac[tmp];
912 normals[nqtot + j + k * nq1] = -df[3][tmp] * jac[tmp];
913 normals[2 * nqtot + j + k * nq1] =
914 -df[6][tmp] * jac[tmp];
915 faceJac[j + k * nq1] = jac[tmp];
919 points0 = ptsKeys[1];
920 points1 = ptsKeys[2];
925 ASSERTL0(
false,
"face is out of range (face < 3)");
933 Vmath::Sdiv(nq_face, 1.0, &work[0], 1, &work[0], 1);
936 for (i = 0; i < vCoordDim; ++i)
941 Vmath::Vmul(nq_face, work, 1, normal[i], 1, normal[i], 1);
948 Vmath::Vvtvp(nq_face, normal[i], 1, normal[i], 1, work, 1, work, 1);
958 Vmath::Vmul(nq_face, normal[i], 1, work, 1, normal[i], 1);
985 StdExpansion::LaplacianMatrixOp_MatFree(k1, k2, inarray, outarray, mkey);
1009 StdTetExp::v_SVVLaplacianFilter(array, mkey);
1034 returnval = StdTetExp::v_GenMatrix(mkey);
1048 return tmp->GetStdMatrix(mkey);
1077 if (inarray.get() == outarray.get())
1083 (mat->GetOwnedMatrix())->GetPtr().get(),
m_ncoeffs,
1084 tmp.get(), 1, 0.0, outarray.get(), 1);
1089 (mat->GetOwnedMatrix())->GetPtr().get(),
m_ncoeffs,
1090 inarray.get(), 1, 0.0, outarray.get(), 1);
1105 int nquad0 =
m_base[0]->GetNumPoints();
1106 int nquad1 =
m_base[1]->GetNumPoints();
1107 int nquad2 =
m_base[2]->GetNumPoints();
1108 int nqtot = nquad0 * nquad1 * nquad2;
1110 ASSERTL1(wsp.size() >= 6 * nqtot,
"Insufficient workspace size.");
1111 ASSERTL1(m_ncoeffs <= nqtot, "Workspace not set up for ncoeffs > nqtot
");
1113 const Array<OneD, const NekDouble> &base0 = m_base[0]->GetBdata();
1114 const Array<OneD, const NekDouble> &base1 = m_base[1]->GetBdata();
1115 const Array<OneD, const NekDouble> &base2 = m_base[2]->GetBdata();
1116 const Array<OneD, const NekDouble> &dbase0 = m_base[0]->GetDbdata();
1117 const Array<OneD, const NekDouble> &dbase1 = m_base[1]->GetDbdata();
1118 const Array<OneD, const NekDouble> &dbase2 = m_base[2]->GetDbdata();
1119 const Array<OneD, const NekDouble> &metric00 =
1120 m_metrics[eMetricLaplacian00];
1121 const Array<OneD, const NekDouble> &metric01 =
1122 m_metrics[eMetricLaplacian01];
1123 const Array<OneD, const NekDouble> &metric02 =
1124 m_metrics[eMetricLaplacian02];
1125 const Array<OneD, const NekDouble> &metric11 =
1126 m_metrics[eMetricLaplacian11];
1127 const Array<OneD, const NekDouble> &metric12 =
1128 m_metrics[eMetricLaplacian12];
1129 const Array<OneD, const NekDouble> &metric22 =
1130 m_metrics[eMetricLaplacian22];
1132 // Allocate temporary storage
1133 Array<OneD, NekDouble> wsp0(2 * nqtot, wsp);
1134 Array<OneD, NekDouble> wsp1(nqtot, wsp + 1 * nqtot);
1135 Array<OneD, NekDouble> wsp2(nqtot, wsp + 2 * nqtot);
1136 Array<OneD, NekDouble> wsp3(nqtot, wsp + 3 * nqtot);
1137 Array<OneD, NekDouble> wsp4(nqtot, wsp + 4 * nqtot);
1138 Array<OneD, NekDouble> wsp5(nqtot, wsp + 5 * nqtot);
1140 // LAPLACIAN MATRIX OPERATION
1141 // wsp1 = du_dxi1 = D_xi1 * inarray = D_xi1 * u
1142 // wsp2 = du_dxi2 = D_xi2 * inarray = D_xi2 * u
1143 // wsp2 = du_dxi3 = D_xi3 * inarray = D_xi3 * u
1144 StdExpansion3D::PhysTensorDeriv(inarray, wsp0, wsp1, wsp2);
1146 // wsp0 = k = g0 * wsp1 + g1 * wsp2 = g0 * du_dxi1 + g1 * du_dxi2
1147 // wsp2 = l = g1 * wsp1 + g2 * wsp2 = g0 * du_dxi1 + g1 * du_dxi2
1148 // where g0, g1 and g2 are the metric terms set up in the GeomFactors class
1149 // especially for this purpose
1150 Vmath::Vvtvvtp(nqtot, &metric00[0], 1, &wsp0[0], 1, &metric01[0], 1,
1151 &wsp1[0], 1, &wsp3[0], 1);
1152 Vmath::Vvtvp(nqtot, &metric02[0], 1, &wsp2[0], 1, &wsp3[0], 1, &wsp3[0], 1);
1153 Vmath::Vvtvvtp(nqtot, &metric01[0], 1, &wsp0[0], 1, &metric11[0], 1,
1154 &wsp1[0], 1, &wsp4[0], 1);
1155 Vmath::Vvtvp(nqtot, &metric12[0], 1, &wsp2[0], 1, &wsp4[0], 1, &wsp4[0], 1);
1156 Vmath::Vvtvvtp(nqtot, &metric02[0], 1, &wsp0[0], 1, &metric12[0], 1,
1157 &wsp1[0], 1, &wsp5[0], 1);
1158 Vmath::Vvtvp(nqtot, &metric22[0], 1, &wsp2[0], 1, &wsp5[0], 1, &wsp5[0], 1);
1160 // outarray = m = (D_xi1 * B)^T * k
1161 // wsp1 = n = (D_xi2 * B)^T * l
1162 IProductWRTBase_SumFacKernel(dbase0, base1, base2, wsp3, outarray, wsp0,
1164 IProductWRTBase_SumFacKernel(base0, dbase1, base2, wsp4, wsp2, wsp0, true,
1166 Vmath::Vadd(m_ncoeffs, wsp2.get(), 1, outarray.get(), 1, outarray.get(), 1);
1167 IProductWRTBase_SumFacKernel(base0, base1, dbase2, wsp5, wsp2, wsp0, true,
1169 Vmath::Vadd(m_ncoeffs, wsp2.get(), 1, outarray.get(), 1, outarray.get(), 1);
1172void TetExp::v_ComputeLaplacianMetric()
1174 if (m_metrics.count(eMetricQuadrature) == 0)
1176 ComputeQuadratureMetric();
1180 const unsigned int nqtot = GetTotPoints();
1181 const unsigned int dim = 3;
1182 const MetricType m[3][3] = {
1183 {eMetricLaplacian00, eMetricLaplacian01, eMetricLaplacian02},
1184 {eMetricLaplacian01, eMetricLaplacian11, eMetricLaplacian12},
1185 {eMetricLaplacian02, eMetricLaplacian12, eMetricLaplacian22}};
1187 for (unsigned int i = 0; i < dim; ++i)
1189 for (unsigned int j = i; j < dim; ++j)
1191 m_metrics[m[i][j]] = Array<OneD, NekDouble>(nqtot);
1195 // Define shorthand synonyms for m_metrics storage
1196 Array<OneD, NekDouble> g0(m_metrics[m[0][0]]);
1197 Array<OneD, NekDouble> g1(m_metrics[m[1][1]]);
1198 Array<OneD, NekDouble> g2(m_metrics[m[2][2]]);
1199 Array<OneD, NekDouble> g3(m_metrics[m[0][1]]);
1200 Array<OneD, NekDouble> g4(m_metrics[m[0][2]]);
1201 Array<OneD, NekDouble> g5(m_metrics[m[1][2]]);
1203 // Allocate temporary storage
1204 Array<OneD, NekDouble> alloc(7 * nqtot, 0.0);
1205 Array<OneD, NekDouble> h0(alloc); // h0
1206 Array<OneD, NekDouble> h1(alloc + 1 * nqtot); // h1
1207 Array<OneD, NekDouble> h2(alloc + 2 * nqtot); // h2
1208 Array<OneD, NekDouble> h3(alloc + 3 * nqtot); // h3
1209 Array<OneD, NekDouble> wsp4(alloc + 4 * nqtot); // wsp4
1210 Array<OneD, NekDouble> wsp5(alloc + 5 * nqtot); // wsp5
1211 Array<OneD, NekDouble> wsp6(alloc + 6 * nqtot); // wsp6
1212 // Reuse some of the storage as workspace
1213 Array<OneD, NekDouble> wsp7(alloc); // wsp7
1214 Array<OneD, NekDouble> wsp8(alloc + 1 * nqtot); // wsp8
1215 Array<OneD, NekDouble> wsp9(alloc + 2 * nqtot); // wsp9
1217 const Array<TwoD, const NekDouble> &df =
1218 m_metricinfo->GetDerivFactors(GetPointsKeys());
1219 const Array<OneD, const NekDouble> &z0 = m_base[0]->GetZ();
1220 const Array<OneD, const NekDouble> &z1 = m_base[1]->GetZ();
1221 const Array<OneD, const NekDouble> &z2 = m_base[2]->GetZ();
1222 const unsigned int nquad0 = m_base[0]->GetNumPoints();
1223 const unsigned int nquad1 = m_base[1]->GetNumPoints();
1224 const unsigned int nquad2 = m_base[2]->GetNumPoints();
1226 for (j = 0; j < nquad2; ++j)
1228 for (i = 0; i < nquad1; ++i)
1230 Vmath::Fill(nquad0, 4.0 / (1.0 - z1[i]) / (1.0 - z2[j]),
1231 &h0[0] + i * nquad0 + j * nquad0 * nquad1, 1);
1232 Vmath::Fill(nquad0, 2.0 / (1.0 - z1[i]) / (1.0 - z2[j]),
1233 &h1[0] + i * nquad0 + j * nquad0 * nquad1, 1);
1234 Vmath::Fill(nquad0, 2.0 / (1.0 - z2[j]),
1235 &h2[0] + i * nquad0 + j * nquad0 * nquad1, 1);
1236 Vmath::Fill(nquad0, (1.0 + z1[i]) / (1.0 - z2[j]),
1237 &h3[0] + i * nquad0 + j * nquad0 * nquad1, 1);
1240 for (i = 0; i < nquad0; i++)
1242 Blas::Dscal(nquad1 * nquad2, 1 + z0[i], &h1[0] + i, nquad0);
1245 // Step 3. Construct combined metric terms for physical space to
1246 // collapsed coordinate system.
1247 // Order of construction optimised to minimise temporary storage
1248 if (m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
1251 Vmath::Vadd(nqtot, &df[1][0], 1, &df[2][0], 1, &wsp4[0], 1);
1252 Vmath::Vvtvvtp(nqtot, &df[0][0], 1, &h0[0], 1, &wsp4[0], 1, &h1[0], 1,
1255 Vmath::Vadd(nqtot, &df[4][0], 1, &df[5][0], 1, &wsp5[0], 1);
1256 Vmath::Vvtvvtp(nqtot, &df[3][0], 1, &h0[0], 1, &wsp5[0], 1, &h1[0], 1,
1259 Vmath::Vadd(nqtot, &df[7][0], 1, &df[8][0], 1, &wsp6[0], 1);
1260 Vmath::Vvtvvtp(nqtot, &df[6][0], 1, &h0[0], 1, &wsp6[0], 1, &h1[0], 1,
1264 Vmath::Vvtvvtp(nqtot, &wsp4[0], 1, &wsp4[0], 1, &wsp5[0], 1, &wsp5[0],
1266 Vmath::Vvtvp(nqtot, &wsp6[0], 1, &wsp6[0], 1, &g0[0], 1, &g0[0], 1);
1269 Vmath::Vvtvvtp(nqtot, &df[2][0], 1, &wsp4[0], 1, &df[5][0], 1, &wsp5[0],
1271 Vmath::Vvtvp(nqtot, &df[8][0], 1, &wsp6[0], 1, &g4[0], 1, &g4[0], 1);
1273 // overwrite h0, h1, h2
1274 // wsp7 (h2f1 + h3f2)
1275 Vmath::Vvtvvtp(nqtot, &df[1][0], 1, &h2[0], 1, &df[2][0], 1, &h3[0], 1,
1277 // wsp8 (h2f4 + h3f5)
1278 Vmath::Vvtvvtp(nqtot, &df[4][0], 1, &h2[0], 1, &df[5][0], 1, &h3[0], 1,
1280 // wsp9 (h2f7 + h3f8)
1281 Vmath::Vvtvvtp(nqtot, &df[7][0], 1, &h2[0], 1, &df[8][0], 1, &h3[0], 1,
1285 Vmath::Vvtvvtp(nqtot, &wsp4[0], 1, &wsp7[0], 1, &wsp5[0], 1, &wsp8[0],
1287 Vmath::Vvtvp(nqtot, &wsp6[0], 1, &wsp9[0], 1, &g3[0], 1, &g3[0], 1);
1289 // overwrite wsp4, wsp5, wsp6
1291 Vmath::Vvtvvtp(nqtot, &wsp7[0], 1, &wsp7[0], 1, &wsp8[0], 1, &wsp8[0],
1293 Vmath::Vvtvp(nqtot, &wsp9[0], 1, &wsp9[0], 1, &g1[0], 1, &g1[0], 1);
1296 Vmath::Vvtvvtp(nqtot, &df[2][0], 1, &wsp7[0], 1, &df[5][0], 1, &wsp8[0],
1298 Vmath::Vvtvp(nqtot, &df[8][0], 1, &wsp9[0], 1, &g5[0], 1, &g5[0], 1);
1301 Vmath::Vvtvvtp(nqtot, &df[2][0], 1, &df[2][0], 1, &df[5][0], 1,
1302 &df[5][0], 1, &g2[0], 1);
1303 Vmath::Vvtvp(nqtot, &df[8][0], 1, &df[8][0], 1, &g2[0], 1, &g2[0], 1);
1308 Vmath::Svtsvtp(nqtot, df[0][0], &h0[0], 1, df[1][0] + df[2][0], &h1[0],
1311 Vmath::Svtsvtp(nqtot, df[3][0], &h0[0], 1, df[4][0] + df[5][0], &h1[0],
1314 Vmath::Svtsvtp(nqtot, df[6][0], &h0[0], 1, df[7][0] + df[8][0], &h1[0],
1318 Vmath::Vvtvvtp(nqtot, &wsp4[0], 1, &wsp4[0], 1, &wsp5[0], 1, &wsp5[0],
1320 Vmath::Vvtvp(nqtot, &wsp6[0], 1, &wsp6[0], 1, &g0[0], 1, &g0[0], 1);
1323 Vmath::Svtsvtp(nqtot, df[2][0], &wsp4[0], 1, df[5][0], &wsp5[0], 1,
1325 Vmath::Svtvp(nqtot, df[8][0], &wsp6[0], 1, &g4[0], 1, &g4[0], 1);
1327 // overwrite h0, h1, h2
1328 // wsp7 (h2f1 + h3f2)
1329 Vmath::Svtsvtp(nqtot, df[1][0], &h2[0], 1, df[2][0], &h3[0], 1,
1331 // wsp8 (h2f4 + h3f5)
1332 Vmath::Svtsvtp(nqtot, df[4][0], &h2[0], 1, df[5][0], &h3[0], 1,
1334 // wsp9 (h2f7 + h3f8)
1335 Vmath::Svtsvtp(nqtot, df[7][0], &h2[0], 1, df[8][0], &h3[0], 1,
1339 Vmath::Vvtvvtp(nqtot, &wsp4[0], 1, &wsp7[0], 1, &wsp5[0], 1, &wsp8[0],
1341 Vmath::Vvtvp(nqtot, &wsp6[0], 1, &wsp9[0], 1, &g3[0], 1, &g3[0], 1);
1343 // overwrite wsp4, wsp5, wsp6
1345 Vmath::Vvtvvtp(nqtot, &wsp7[0], 1, &wsp7[0], 1, &wsp8[0], 1, &wsp8[0],
1347 Vmath::Vvtvp(nqtot, &wsp9[0], 1, &wsp9[0], 1, &g1[0], 1, &g1[0], 1);
1350 Vmath::Svtsvtp(nqtot, df[2][0], &wsp7[0], 1, df[5][0], &wsp8[0], 1,
1352 Vmath::Svtvp(nqtot, df[8][0], &wsp9[0], 1, &g5[0], 1, &g5[0], 1);
1356 df[2][0] * df[2][0] + df[5][0] * df[5][0] +
1357 df[8][0] * df[8][0],
1361 for (unsigned int i = 0; i < dim; ++i)
1363 for (unsigned int j = i; j < dim; ++j)
1365 MultiplyByQuadratureMetric(m_metrics[m[i][j]], m_metrics[m[i][j]]);
1375void TetExp::v_NormalTraceDerivFactors(
1376 Array<OneD, Array<OneD, NekDouble>> &d0factors,
1377 Array<OneD, Array<OneD, NekDouble>> &d1factors,
1378 Array<OneD, Array<OneD, NekDouble>> &d2factors)
1380 int nquad0 = GetNumPoints(0);
1381 int nquad1 = GetNumPoints(1);
1382 int nquad2 = GetNumPoints(2);
1384 const Array<TwoD, const NekDouble> &df =
1385 m_metricinfo->GetDerivFactors(GetPointsKeys());
1387 if (d0factors.size() != 4)
1389 d0factors = Array<OneD, Array<OneD, NekDouble>>(4);
1390 d1factors = Array<OneD, Array<OneD, NekDouble>>(4);
1391 d2factors = Array<OneD, Array<OneD, NekDouble>>(4);
1394 if (d0factors[0].size() != nquad0 * nquad1)
1396 d0factors[0] = Array<OneD, NekDouble>(nquad0 * nquad1);
1397 d1factors[0] = Array<OneD, NekDouble>(nquad0 * nquad1);
1398 d2factors[0] = Array<OneD, NekDouble>(nquad0 * nquad1);
1401 if (d0factors[1].size() != nquad0 * nquad2)
1403 d0factors[1] = Array<OneD, NekDouble>(nquad0 * nquad2);
1404 d1factors[1] = Array<OneD, NekDouble>(nquad0 * nquad2);
1405 d2factors[1] = Array<OneD, NekDouble>(nquad0 * nquad2);
1408 if (d0factors[2].size() != nquad1 * nquad2)
1410 d0factors[2] = Array<OneD, NekDouble>(nquad1 * nquad2);
1411 d0factors[3] = Array<OneD, NekDouble>(nquad1 * nquad2);
1412 d1factors[2] = Array<OneD, NekDouble>(nquad1 * nquad2);
1413 d1factors[3] = Array<OneD, NekDouble>(nquad1 * nquad2);
1414 d2factors[2] = Array<OneD, NekDouble>(nquad1 * nquad2);
1415 d2factors[3] = Array<OneD, NekDouble>(nquad1 * nquad2);
1419 const Array<OneD, const Array<OneD, NekDouble>> &normal_0 =
1421 const Array<OneD, const Array<OneD, NekDouble>> &normal_1 =
1423 const Array<OneD, const Array<OneD, NekDouble>> &normal_2 =
1425 const Array<OneD, const Array<OneD, NekDouble>> &normal_3 =
1428 int ncoords = normal_0.size();
1430 // first gather together standard cartesian inner products
1431 if (m_metricinfo->GetGtype() == SpatialDomains::eDeformed)
1434 for (int i = 0; i < nquad0 * nquad1; ++i)
1436 d0factors[0][i] = df[0][i] * normal_0[0][i];
1437 d1factors[0][i] = df[1][i] * normal_0[0][i];
1438 d2factors[0][i] = df[2][i] * normal_0[0][i];
1441 for (int n = 1; n < ncoords; ++n)
1443 for (int i = 0; i < nquad0 * nquad1; ++i)
1445 d0factors[0][i] += df[3 * n][i] * normal_0[n][i];
1446 d1factors[0][i] += df[3 * n + 1][i] * normal_0[n][i];
1447 d2factors[0][i] += df[3 * n + 2][i] * normal_0[n][i];
1452 for (int j = 0; j < nquad2; ++j)
1454 for (int i = 0; i < nquad0; ++i)
1456 d0factors[1][j * nquad0 + i] = df[0][j * nquad0 * nquad1 + i] *
1457 normal_1[0][j * nquad0 + i];
1458 d1factors[1][j * nquad0 + i] = df[1][j * nquad0 * nquad1 + i] *
1459 normal_1[0][j * nquad0 + i];
1460 d2factors[1][j * nquad0 + i] = df[2][j * nquad0 * nquad1 + i] *
1461 normal_1[0][j * nquad0 + i];
1465 for (int n = 1; n < ncoords; ++n)
1467 for (int j = 0; j < nquad2; ++j)
1469 for (int i = 0; i < nquad0; ++i)
1471 d0factors[1][j * nquad0 + i] +=
1472 df[3 * n][j * nquad0 * nquad1 + i] *
1473 normal_1[0][j * nquad0 + i];
1474 d1factors[1][j * nquad0 + i] +=
1475 df[3 * n + 1][j * nquad0 * nquad1 + i] *
1476 normal_1[0][j * nquad0 + i];
1477 d2factors[1][j * nquad0 + i] +=
1478 df[3 * n + 2][j * nquad0 * nquad1 + i] *
1479 normal_1[0][j * nquad0 + i];
1485 for (int j = 0; j < nquad2; ++j)
1487 for (int i = 0; i < nquad1; ++i)
1489 d0factors[2][j * nquad1 + i] =
1490 df[0][(j * nquad1 + i + 1) * nquad0 - 1] *
1491 normal_2[0][j * nquad1 + i];
1492 d1factors[2][j * nquad1 + i] =
1493 df[1][(j * nquad1 + i + 1) * nquad0 - 1] *
1494 normal_2[0][j * nquad1 + i];
1495 d2factors[2][j * nquad1 + i] =
1496 df[2][(j * nquad1 + i + 1) * nquad0 - 1] *
1497 normal_2[0][j * nquad1 + i];
1499 d0factors[3][j * nquad1 + i] =
1500 df[0][(j * nquad1 + i) * nquad0] *
1501 normal_3[0][j * nquad1 + i];
1502 d1factors[3][j * nquad1 + i] =
1503 df[1][(j * nquad1 + i) * nquad0] *
1504 normal_3[0][j * nquad1 + i];
1505 d2factors[3][j * nquad1 + i] =
1506 df[2][(j * nquad1 + i) * nquad0] *
1507 normal_3[0][j * nquad1 + i];
1511 for (int n = 1; n < ncoords; ++n)
1513 for (int j = 0; j < nquad2; ++j)
1515 for (int i = 0; i < nquad1; ++i)
1517 d0factors[2][j * nquad1 + i] +=
1518 df[3 * n][(j * nquad1 + i + 1) * nquad0 - 1] *
1519 normal_2[n][j * nquad1 + i];
1520 d1factors[2][j * nquad1 + i] +=
1521 df[3 * n + 1][(j * nquad1 + i + 1) * nquad0 - 1] *
1522 normal_2[n][j * nquad1 + i];
1523 d2factors[2][j * nquad1 + i] +=
1524 df[3 * n + 2][(j * nquad1 + i + 1) * nquad0 - 1] *
1525 normal_2[n][j * nquad1 + i];
1527 d0factors[3][j * nquad1 + i] +=
1528 df[3 * n][(j * nquad1 + i) * nquad0] *
1529 normal_3[n][j * nquad1 + i];
1530 d1factors[3][j * nquad1 + i] +=
1531 df[3 * n + 1][(j * nquad1 + i) * nquad0] *
1532 normal_3[n][j * nquad1 + i];
1533 d2factors[3][j * nquad1 + i] +=
1534 df[3 * n + 2][(j * nquad1 + i) * nquad0] *
1535 normal_3[n][j * nquad1 + i];
1543 for (int i = 0; i < nquad0 * nquad1; ++i)
1545 d0factors[0][i] = df[0][0] * normal_0[0][i];
1546 d1factors[0][i] = df[1][0] * normal_0[0][i];
1547 d2factors[0][i] = df[2][0] * normal_0[0][i];
1550 for (int n = 1; n < ncoords; ++n)
1552 for (int i = 0; i < nquad0 * nquad1; ++i)
1554 d0factors[0][i] += df[3 * n][0] * normal_0[n][i];
1555 d1factors[0][i] += df[3 * n + 1][0] * normal_0[n][i];
1556 d2factors[0][i] += df[3 * n + 2][0] * normal_0[n][i];
1561 for (int i = 0; i < nquad0 * nquad2; ++i)
1563 d0factors[1][i] = df[0][0] * normal_1[0][i];
1564 d1factors[1][i] = df[1][0] * normal_1[0][i];
1565 d2factors[1][i] = df[2][0] * normal_1[0][i];
1568 for (int n = 1; n < ncoords; ++n)
1570 for (int i = 0; i < nquad0 * nquad2; ++i)
1572 d0factors[1][i] += df[3 * n][0] * normal_1[n][i];
1573 d1factors[1][i] += df[3 * n + 1][0] * normal_1[n][i];
1574 d2factors[1][i] += df[3 * n + 2][0] * normal_1[n][i];
1579 for (int i = 0; i < nquad1 * nquad2; ++i)
1581 d0factors[2][i] = df[0][0] * normal_2[0][i];
1582 d0factors[3][i] = df[0][0] * normal_3[0][i];
1584 d1factors[2][i] = df[1][0] * normal_2[0][i];
1585 d1factors[3][i] = df[1][0] * normal_3[0][i];
1587 d2factors[2][i] = df[2][0] * normal_2[0][i];
1588 d2factors[3][i] = df[2][0] * normal_3[0][i];
1591 for (int n = 1; n < ncoords; ++n)
1593 for (int i = 0; i < nquad1 * nquad2; ++i)
1595 d0factors[2][i] += df[3 * n][0] * normal_2[n][i];
1596 d0factors[3][i] += df[3 * n][0] * normal_3[n][i];
1598 d1factors[2][i] += df[3 * n + 1][0] * normal_2[n][i];
1599 d1factors[3][i] += df[3 * n + 1][0] * normal_3[n][i];
1601 d2factors[2][i] += df[3 * n + 2][0] * normal_2[n][i];
1602 d2factors[3][i] += df[3 * n + 2][0] * normal_3[n][i];
1607} // namespace LocalRegions
1608} // 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
SpatialDomains::GeomFactorsSharedPtr m_metricinfo
DNekScalMatSharedPtr GetLocMatrix(const LocalRegions::MatrixKey &mkey)
void v_ComputeTraceNormal(const int face) override
Compute the normal of a triangular face.
virtual NekDouble v_PhysEvaluate(const Array< OneD, const NekDouble > &coords, const Array< OneD, const NekDouble > &physvals) override
virtual NekDouble v_Integral(const Array< OneD, const NekDouble > &inarray) override
Integrate the physical point list inarray over region.
virtual DNekScalMatSharedPtr v_GetLocMatrix(const MatrixKey &mkey) override
virtual NekDouble v_StdPhysEvaluate(const Array< OneD, const NekDouble > &Lcoord, const Array< OneD, const NekDouble > &physvals) 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
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
virtual DNekMatSharedPtr v_GenMatrix(const StdRegions::StdMatrixKey &mkey) override
virtual void v_LaplacianMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
virtual void v_IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true) override
virtual DNekScalBlkMatSharedPtr v_GetLocStaticCondMatrix(const MatrixKey &mkey) override
virtual void v_GetCoord(const Array< OneD, const NekDouble > &Lcoords, Array< OneD, NekDouble > &coords) override
Get the coordinates "coords" at the local coordinates "Lcoords".
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=m_base0*m_base1*m_base2 and put in...
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 StdRegions::StdExpansionSharedPtr v_GetStdExp(void) const override
virtual LibUtilities::ShapeType v_DetShapeType() const override
Return Shape of region, using ShapeType enum list.
virtual DNekMatSharedPtr v_CreateStdMatrix(const StdRegions::StdMatrixKey &mkey) override
virtual 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_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.
virtual 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
virtual void v_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdRegions::StdMatrixKey &mkey) override
virtual void v_AlignVectorToCollapsedDir(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray) override
virtual void v_GetTracePhysMap(const int face, Array< OneD, int > &outarray) override
Returns the physical values at the quadrature points of a face.
virtual void v_HelmholtzMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) 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_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)
virtual void v_HelmholtzMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey) override
virtual 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
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 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)