35 #include <boost/core/ignore_unused.hpp>
47 StdPrismExp::StdPrismExp()
66 "order in 'a' direction is higher than order in 'c' direction");
104 int Qx =
m_base[0]->GetNumPoints();
105 int Qy =
m_base[1]->GetNumPoints();
106 int Qz =
m_base[2]->GetNumPoints();
112 eta_x =
m_base[0]->GetZ();
113 eta_z =
m_base[2]->GetZ();
117 bool Do_1 = (out_dxi1.num_elements() > 0)?
true:
false;
118 bool Do_3 = (out_dxi3.num_elements() > 0)?
true:
false;
137 for (k = 0; k < Qz; ++k)
139 Vmath::Smul(Qx*Qy,2.0/(1.0-eta_z[k]),&dEta_bar1[0] + k*Qx*Qy,1,
140 &out_dxi1[0] + k*Qx*Qy,1);
147 for (k = 0; k < Qz; ++k)
149 Vmath::Smul(Qx*Qy, 1.0/(1.0-eta_z[k]),&dEta_bar1[0]+k*Qx*Qy,1,
150 &dEta_bar1[0]+k*Qx*Qy,1);
154 for (i = 0; i < Qx; ++i)
157 &out_dxi3[0]+i,Qx,&out_dxi3[0]+i,Qx);
192 ASSERTL1(
false,
"input dir is out of range");
248 "Basis[1] is not a general tensor type");
252 "Basis[2] is not a general tensor type");
254 if(
m_base[0]->Collocation() &&
255 m_base[1]->Collocation() &&
261 inarray, 1, outarray, 1);
272 int nquad1 =
m_base[1]->GetNumPoints();
273 int nquad2 =
m_base[2]->GetNumPoints();
274 int order0 =
m_base[0]->GetNumModes();
275 int order1 =
m_base[1]->GetNumModes();
278 nquad1*nquad2*order0);
283 inarray,outarray,wsp,
true,
true,
true);
294 bool doCheckCollDir0,
295 bool doCheckCollDir1,
296 bool doCheckCollDir2)
298 boost::ignore_unused(doCheckCollDir0, doCheckCollDir1,
302 int nquad0 =
m_base[0]->GetNumPoints();
303 int nquad1 =
m_base[1]->GetNumPoints();
304 int nquad2 =
m_base[2]->GetNumPoints();
305 int nummodes0 =
m_base[0]->GetNumModes();
306 int nummodes1 =
m_base[1]->GetNumModes();
307 int nummodes2 =
m_base[2]->GetNumModes();
311 for (i = mode = 0; i < nummodes0; ++i)
313 Blas::Dgemm(
'N',
'N', nquad2, nummodes1, nummodes2-i,
314 1.0, base2.get() + mode*nquad2, nquad2,
315 inarray.get() + mode*nummodes1, nummodes2-i,
316 0.0, tmp0.get() + i*nquad2*nummodes1, nquad2);
322 for(i = 0; i < nummodes1; i++)
324 Blas::Daxpy(nquad2,inarray[1+i*nummodes2],base2.get()+nquad2,1,
325 tmp0.get()+nquad2*(nummodes1+i),1);
329 for (i = 0; i < nummodes0; i++)
332 1.0, base1.get(), nquad1,
333 tmp0.get() + i*nquad2*nummodes1, nquad2,
334 0.0, tmp1.get() + i*nquad2*nquad1, nquad1);
337 Blas::Dgemm(
'N',
'T', nquad0, nquad2*nquad1, nummodes0,
338 1.0, base0.get(), nquad0,
339 tmp1.get(), nquad2*nquad1,
340 0.0, outarray.get(), nquad0);
407 "Basis[1] is not a general tensor type");
411 "Basis[2] is not a general tensor type");
413 if(
m_base[0]->Collocation() &&
m_base[1]->Collocation())
435 m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
441 bool multiplybyweights)
443 int nquad1 =
m_base[1]->GetNumPoints();
444 int nquad2 =
m_base[2]->GetNumPoints();
445 int order0 =
m_base[0]->GetNumModes();
446 int order1 =
m_base[1]->GetNumModes();
450 if(multiplybyweights)
466 inarray,outarray,wsp,
478 bool doCheckCollDir0,
479 bool doCheckCollDir1,
480 bool doCheckCollDir2)
482 boost::ignore_unused(doCheckCollDir0, doCheckCollDir1,
487 const int nquad0 =
m_base[0]->GetNumPoints();
488 const int nquad1 =
m_base[1]->GetNumPoints();
489 const int nquad2 =
m_base[2]->GetNumPoints();
490 const int order0 =
m_base[0]->GetNumModes ();
491 const int order1 =
m_base[1]->GetNumModes ();
492 const int order2 =
m_base[2]->GetNumModes ();
496 ASSERTL1(wsp.num_elements() >= nquad1*nquad2*order0 +
497 nquad2*order0*order1,
498 "Insufficient workspace size");
504 Blas::Dgemm(
'T',
'N', nquad1*nquad2, order0, nquad0,
505 1.0, inarray.get(), nquad0,
507 0.0, tmp0.get(), nquad1*nquad2);
510 Blas::Dgemm(
'T',
'N', nquad2*order0, order1, nquad1,
511 1.0, tmp0.get(), nquad1,
513 0.0, tmp1.get(), nquad2*order0);
516 for (mode=i=0; i < order0; ++i)
519 1.0, base2.get() + mode*nquad2, nquad2,
520 tmp1.get() + i*nquad2, nquad2*order0,
521 0.0, outarray.get()+mode*order1, order2-i);
529 for (i = 0; i < order1; ++i)
533 nquad2, base2.get()+nquad2, 1,
534 tmp1.get()+i*order0*nquad2+nquad2, 1);
556 ASSERTL0(dir >= 0 && dir <= 2,
"input dir is out of range");
578 m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
586 ASSERTL0(dir >= 0 && dir <= 2,
"input dir is out of range");
589 int order0 =
m_base[0]->GetNumModes ();
590 int order1 =
m_base[1]->GetNumModes ();
591 int nquad0 =
m_base[0]->GetNumPoints();
592 int nquad1 =
m_base[1]->GetNumPoints();
593 int nquad2 =
m_base[2]->GetNumPoints();
603 for (i = 0; i < nquad0; ++i)
605 gfac0[i] = 0.5*(1+z0[i]);
609 for (i = 0; i < nquad2; ++i)
611 gfac2[i] = 2.0/(1-z2[i]);
617 for (i = 0; i < nquad2; ++i)
620 &inarray[0]+i*nquad0*nquad1,1,
621 &tmp0 [0]+i*nquad0*nquad1,1);
654 for(i = 0; i < nquad1*nquad2; ++i)
656 Vmath::Vmul(nquad0,&gfac0[0],1,&tmp0[0]+i*nquad0,1,&tmp0[0]+i*nquad0,1);
703 eta[0] = 2.0*(1.0 + xi[0])/(1.0 - xi[2]) - 1.0;
719 for (
int k = 0; k < Qz; ++k) {
720 for (
int j = 0; j < Qy; ++j) {
721 for (
int i = 0; i < Qx; ++i) {
722 int s = i + Qx*(j + Qy*k);
723 xi_x[s] = (1.0 - eta_z[k])*(1.0 + etaBar_x[i]) / 2.0 - 1.0;
744 int nummodes [3] = {
m_base[0]->GetNumModes(),
746 m_base[2]->GetNumModes()};
752 numModes0 = nummodes[0];
753 numModes1 = nummodes[1];
760 numModes0 = nummodes[1];
761 numModes1 = nummodes[2];
768 numModes0 = nummodes[0];
769 numModes1 = nummodes[2];
774 if ( faceOrient >= 9 )
776 std::swap(numModes0, numModes1);
812 "BasisType is not a boundary interior form");
815 "BasisType is not a boundary interior form");
818 "BasisType is not a boundary interior form");
820 int P =
m_base[0]->GetNumModes();
821 int Q =
m_base[1]->GetNumModes();
822 int R =
m_base[2]->GetNumModes();
832 "BasisType is not a boundary interior form");
835 "BasisType is not a boundary interior form");
838 "BasisType is not a boundary interior form");
840 int P =
m_base[0]->GetNumModes()-1;
841 int Q =
m_base[1]->GetNumModes()-1;
842 int R =
m_base[2]->GetNumModes()-1;
846 + 2*(R+1) +
P*(1 + 2*R -
P);
851 ASSERTL2(i >= 0 && i <= 8,
"edge id is out of range");
853 if (i == 0 || i == 2)
857 else if (i == 1 || i == 3 || i == 8)
878 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
883 else if (i == 1 || i == 3)
886 return Q+1 + (
P*(1 + 2*Q -
P))/2;
896 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
906 else if (i == 1 || i == 3)
908 return Pi * (2*Ri - Pi - 1) / 2;
923 Pi * (2*Ri - Pi - 1) +
929 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
933 return m_base[0]->GetNumPoints()*
934 m_base[1]->GetNumPoints();
936 else if (i == 1 || i == 3)
938 return m_base[0]->GetNumPoints()*
939 m_base[2]->GetNumPoints();
943 return m_base[1]->GetNumPoints()*
944 m_base[2]->GetNumPoints();
949 const int i,
const int j)
const
951 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
952 ASSERTL2(j == 0 || j == 1,
"face direction is out of range");
956 return m_base[j]->GetPointsKey();
958 else if (i == 1 || i == 3)
960 return m_base[2*j]->GetPointsKey();
964 return m_base[j+1]->GetPointsKey();
969 const int i,
const int k)
const
971 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
972 ASSERTL2(k >= 0 && k <= 1,
"basis key id is out of range");
981 m_base[k]->GetNumModes());
989 m_base[k+1]->GetNumModes());
997 m_base[2*k]->GetNumModes());
1011 nummodes[modes_offset],
1012 nummodes[modes_offset+1],
1013 nummodes[modes_offset+2]);
1021 ASSERTL2(i >= 0 && i <= 8,
"edge id is out of range");
1022 if (i == 0 || i == 2)
1026 else if (i == 1 || i == 3 || i == 8)
1057 "Method only implemented if BasisType is identical"
1058 "in x and y directions");
1061 "Method only implemented for Modified_A BasisType"
1062 "(x and y direction) and Modified_B BasisType (z "
1065 int i, j, k,
p, q, r, nFaceCoeffs, idx = 0;
1066 int nummodesA=0, nummodesB=0;
1071 nummodesA =
m_base[0]->GetNumModes();
1072 nummodesB =
m_base[1]->GetNumModes();
1076 nummodesA =
m_base[0]->GetNumModes();
1077 nummodesB =
m_base[2]->GetNumModes();
1081 nummodesA =
m_base[1]->GetNumModes();
1082 nummodesB =
m_base[2]->GetNumModes();
1085 ASSERTL0(
false,
"fid must be between 0 and 4");
1088 bool CheckForZeroedModes =
false;
1096 else if (fid == 1 || fid == 3)
1098 nFaceCoeffs =
P*(2*Q-
P+1)/2;
1099 CheckForZeroedModes =
true;
1104 CheckForZeroedModes =
true;
1108 if (maparray.num_elements() != nFaceCoeffs)
1113 if (signarray.num_elements() != nFaceCoeffs)
1119 fill(signarray.get(), signarray.get() + nFaceCoeffs, 1);
1126 if (fid != 1 && fid != 3)
1128 for (i = 0; i < Q; i++)
1130 for (j = 0; j <
P; j++)
1134 arrayindx[i*
P+j] = i*
P+j;
1138 arrayindx[i*
P+j] = j*Q+i;
1149 for (q = 0; q < Q; ++q)
1151 for (
p = 0;
p <
P; ++
p)
1159 for (
p = 0;
p <
P; ++
p)
1161 for (r = 0; r < Q-
p; ++r)
1163 if ((
int)faceOrient == 7 &&
p > 1)
1165 signarray[idx] =
p % 2 ? -1 : 1;
1173 for (q = 0; q <
P; ++q)
1175 maparray[arrayindx[q]] =
GetMode(1,q,0);
1177 for (q = 0; q <
P; ++q)
1179 maparray[arrayindx[
P+q]] =
GetMode(0,q,1);
1181 for (r = 1; r < Q-1; ++r)
1183 for (q = 0; q <
P; ++q)
1185 maparray[arrayindx[(r+1)*
P+q]] =
GetMode(1,q,r);
1191 for (
p = 0;
p <
P; ++
p)
1193 for (r = 0; r < Q-
p; ++r)
1195 if ((
int)faceOrient == 7 &&
p > 1)
1197 signarray[idx] =
p % 2 ? -1 : 1;
1199 maparray[idx++] =
GetMode(
p, 1, r);
1205 for (r = 0; r < Q; ++r)
1207 for (q = 0; q <
P; ++q)
1209 maparray[arrayindx[r*
P+q]] =
GetMode(0, q, r);
1215 ASSERTL0(
false,
"Face to element map unavailable.");
1218 if (fid == 1 || fid == 3)
1220 if(CheckForZeroedModes)
1225 for (j = 0; j < nummodesA; ++j)
1228 for (k = nummodesB-j; k < Q-j; ++k)
1230 signarray[idx] = 0.0;
1231 maparray[idx++] = maparray[0];
1235 for (j = nummodesA; j <
P; ++j)
1237 for (k = 0; k < Q-j; ++k)
1239 signarray[idx] = 0.0;
1240 maparray[idx++] = maparray[0];
1248 if ((
int)faceOrient == 7)
1250 swap(maparray[0], maparray[Q]);
1251 for (i = 1; i < Q-1; ++i)
1253 swap(maparray[i+1], maparray[Q+i]);
1260 if(CheckForZeroedModes)
1264 for (j = 0; j < nummodesA; ++j)
1266 for (k = nummodesB; k < Q; ++k)
1268 signarray[arrayindx[j+k*
P]] = 0.0;
1269 maparray[arrayindx[j+k*
P]] = maparray[0];
1273 for (j = nummodesA; j <
P; ++j)
1275 for (k = 0; k < Q; ++k)
1277 signarray[arrayindx[j+k*
P]] = 0.0;
1278 maparray[arrayindx[j+k*
P]] = maparray[0];
1287 if (faceOrient == 6 || faceOrient == 8 ||
1288 faceOrient == 11 || faceOrient == 12)
1292 for (i = 3; i < Q; i += 2)
1294 for (j = 0; j <
P; j++)
1296 signarray[arrayindx[i*
P+j]] *= -1;
1300 for (i = 0; i <
P; i++)
1302 swap(maparray [i], maparray [i+
P]);
1303 swap(signarray[i], signarray[i+
P]);
1308 for (i = 0; i < Q; i++)
1310 for (j = 3; j <
P; j += 2)
1312 signarray[arrayindx[i*
P+j]] *= -1;
1316 for (i = 0; i < Q; i++)
1318 swap (maparray [i], maparray [i+Q]);
1319 swap (signarray[i], signarray[i+Q]);
1324 if (faceOrient == 7 || faceOrient == 8 ||
1325 faceOrient == 10 || faceOrient == 12)
1329 for (i = 0; i < Q; i++)
1331 for (j = 3; j <
P; j += 2)
1333 signarray[arrayindx[i*
P+j]] *= -1;
1337 for(i = 0; i < Q; i++)
1339 swap(maparray [i*
P], maparray [i*
P+1]);
1340 swap(signarray[i*
P], signarray[i*
P+1]);
1345 for (i = 3; i < Q; i += 2)
1347 for (j = 0; j <
P; j++)
1349 signarray[arrayindx[i*
P+j]] *= -1;
1353 for (i = 0; i <
P; i++)
1355 swap(maparray [i*Q], maparray [i*Q+1]);
1356 swap(signarray[i*Q], signarray[i*Q+1]);
1368 "Mapping not defined for this type of basis");
1372 if(useCoeffPacking ==
true)
1395 ASSERTL0(
false,
"local vertex id must be between 0 and 5");
1421 ASSERTL0(
false,
"local vertex id must be between 0 and 5");
1436 const int P =
m_base[0]->GetNumModes() - 1;
1437 const int Q =
m_base[1]->GetNumModes() - 1;
1438 const int R =
m_base[2]->GetNumModes() - 1;
1441 if (maparray.num_elements() != nEdgeIntCoeffs)
1446 if(signarray.num_elements() != nEdgeIntCoeffs)
1452 fill(signarray.get(), signarray.get()+nEdgeIntCoeffs, 1);
1462 for (i = 2; i <=
P; ++i)
1464 maparray[i-2] =
GetMode(i,0,0);
1469 for (i = 2; i <= Q; ++i)
1471 maparray[i-2] =
GetMode(1,i,0);
1478 for (i = 2; i <=
P; ++i)
1480 maparray[i-2] =
GetMode(i,1,0);
1487 for (i = 2; i <= Q; ++i)
1489 maparray[i-2] =
GetMode(0,i,0);
1494 for (i = 2; i <= R; ++i)
1496 maparray[i-2] =
GetMode(0,0,i);
1501 for (i = 1; i <= R-1; ++i)
1503 maparray[i-1] =
GetMode(1,0,i);
1508 for (i = 1; i <= R-1; ++i)
1510 maparray[i-1] =
GetMode(1,1,i);
1515 for (i = 2; i <= R; ++i)
1517 maparray[i-2] =
GetMode(0,1,i);
1522 for (i = 2; i <= Q; ++i)
1524 maparray[i-2] =
GetMode(0,i,1);
1529 ASSERTL0(
false,
"Edge not defined.");
1535 for (i = 1; i < nEdgeIntCoeffs; i += 2)
1548 const int P =
m_base[0]->GetNumModes() - 1;
1549 const int Q =
m_base[1]->GetNumModes() - 1;
1550 const int R =
m_base[2]->GetNumModes() - 1;
1552 int p, q, r, idx = 0;
1558 if (maparray.num_elements() != nFaceIntCoeffs)
1563 if (signarray.num_elements() != nFaceIntCoeffs)
1569 fill(signarray.get(), signarray.get()+nFaceIntCoeffs, 1);
1575 if (fid != 1 && fid != 3)
1588 for (i = 0; i < nummodesB; i++)
1590 for (j = 0; j < nummodesA; j++)
1594 arrayindx[i*nummodesA+j] = i*nummodesA+j;
1598 arrayindx[i*nummodesA+j] = j*nummodesB+i;
1607 for (q = 2; q <= Q; ++q)
1609 for (
p = 2;
p <=
P; ++
p)
1611 maparray[arrayindx[(q-2)*nummodesA+(
p-2)]] =
GetMode(
p,q,0);
1617 for (
p = 2;
p <=
P; ++
p)
1619 for (r = 1; r <= R-
p; ++r)
1621 if ((
int)faceOrient == 7)
1623 signarray[idx] =
p % 2 ? -1 : 1;
1631 for (r = 1; r <= R-1; ++r)
1633 for (q = 2; q <= Q; ++q)
1635 maparray[arrayindx[(r-1)*nummodesA+(q-2)]] =
GetMode(1, q, r);
1641 for (
p = 2;
p <=
P; ++
p)
1643 for (r = 1; r <= R-
p; ++r)
1645 if ((
int)faceOrient == 7)
1647 signarray[idx] =
p % 2 ? -1 : 1;
1649 maparray[idx++] =
GetMode(
p, 1, r);
1655 for (r = 2; r <= R; ++r)
1657 for (q = 2; q <= Q; ++q)
1659 maparray[arrayindx[(r-2)*nummodesA+(q-2)]] =
GetMode(0, q, r);
1665 ASSERTL0(
false,
"Face interior map not available.");
1670 if (fid == 1 || fid == 3)
1673 if (faceOrient == 6 || faceOrient == 8 ||
1674 faceOrient == 11 || faceOrient == 12)
1678 for (i = 1; i < nummodesB; i += 2)
1680 for (j = 0; j < nummodesA; j++)
1682 signarray[arrayindx[i*nummodesA+j]] *= -1;
1688 for (i = 0; i < nummodesB; i++)
1690 for (j = 1; j < nummodesA; j += 2)
1692 signarray[arrayindx[i*nummodesA+j]] *= -1;
1698 if (faceOrient == 7 || faceOrient == 8 ||
1699 faceOrient == 10 || faceOrient == 12)
1703 for (i = 0; i < nummodesB; i++)
1705 for (j = 1; j < nummodesA; j += 2)
1707 signarray[arrayindx[i*nummodesA+j]] *= -1;
1713 for (i = 1; i < nummodesB; i += 2)
1715 for (j = 0; j < nummodesA; j++)
1717 signarray[arrayindx[i*nummodesA+j]] *= -1;
1728 "BasisType is not a boundary interior form");
1731 "BasisType is not a boundary interior form");
1734 "BasisType is not a boundary interior form");
1736 int P =
m_base[0]->GetNumModes() - 1,
p;
1737 int Q =
m_base[1]->GetNumModes() - 1, q;
1738 int R =
m_base[2]->GetNumModes() - 1, r;
1742 if(outarray.num_elements()!=nIntCoeffs)
1750 for (
p = 2;
p <=
P; ++
p)
1752 for (q = 2; q <= Q; ++q)
1754 for (r = 1; r <= R-
p; ++r)
1766 "BasisType is not a boundary interior form");
1769 "BasisType is not a boundary interior form");
1772 "BasisType is not a boundary interior form");
1774 int P =
m_base[0]->GetNumModes() - 1,
p;
1775 int Q =
m_base[1]->GetNumModes() - 1, q;
1776 int R =
m_base[2]->GetNumModes() - 1, r;
1781 if (maparray.num_elements() != nBnd)
1787 for (
p = 0;
p <=
P; ++
p)
1792 for (q = 0; q <= Q; ++q)
1794 for (r = 0; r <= R-
p; ++r)
1804 for (q = 0; q <= Q; ++q)
1808 for (r = 0; r <= R-
p; ++r)
1839 int nq0 =
m_base[0]->GetNumPoints();
1840 int nq1 =
m_base[1]->GetNumPoints();
1841 int nq2 =
m_base[2]->GetNumPoints();
1851 nq = max(nq0,max(nq1,nq2));
1864 for(
int i = 0; i < nq; ++i)
1866 for(
int j = 0; j < nq; ++j)
1868 for(
int k = 0; k < nq-i; ++k,++cnt)
1871 coords[cnt][0] = -1.0 + 2*k/(
NekDouble)(nq-1);
1872 coords[cnt][1] = -1.0 + 2*j/(
NekDouble)(nq-1);
1873 coords[cnt][2] = -1.0 + 2*i/(
NekDouble)(nq-1);
1878 for(
int i = 0; i < neq; ++i)
1882 I[0] =
m_base[0]->GetI(coll );
1883 I[1] =
m_base[1]->GetI(coll+1);
1884 I[2] =
m_base[2]->GetI(coll+2);
1888 for(
int k = 0; k < nq2; ++k)
1890 for (
int j = 0; j < nq1; ++j)
1893 fac = (I[1]->GetPtr())[j]*(I[2]->GetPtr())[k];
1898 k * nq0 * nq1 * neq +
1943 int Q =
m_base[1]->GetNumModes() - 1;
1944 int R =
m_base[2]->GetNumModes() - 1;
1948 (Q+1)*(
p*R + 1-(
p-2)*(
p-1)/2);
1956 int nquad0 =
m_base[0]->GetNumPoints();
1957 int nquad1 =
m_base[1]->GetNumPoints();
1958 int nquad2 =
m_base[2]->GetNumPoints();
1967 for(i = 0; i < nquad1*nquad2; ++i)
1970 w0.get(), 1, outarray.get()+i*nquad0,1);
1974 for(j = 0; j < nquad2; ++j)
1976 for(i = 0; i < nquad1; ++i)
1990 for(i = 0; i < nquad2; ++i)
1993 &outarray[0]+i*nquad0*nquad1, 1);
1998 for(i = 0; i < nquad2; ++i)
2001 &outarray[0]+i*nquad0*nquad1,1);
2012 int qa =
m_base[0]->GetNumPoints();
2013 int qb =
m_base[1]->GetNumPoints();
2014 int qc =
m_base[2]->GetNumPoints();
2015 int nmodes_a =
m_base[0]->GetNumModes();
2016 int nmodes_b =
m_base[1]->GetNumModes();
2017 int nmodes_c =
m_base[2]->GetNumModes();
2032 OrthoExp.
FwdTrans(array,orthocoeffs);
2042 for(
int i = 0; i < nmodes_a; ++i)
2044 for(
int j = 0; j < nmodes_b; ++j)
2047 pow((1.0*i)/(nmodes_a-1),cutoff*nmodes_a),
2048 pow((1.0*j)/(nmodes_b-1),cutoff*nmodes_b));
2050 for(
int k = 0; k < nmodes_c-i; ++k)
2053 pow((1.0*k)/(nmodes_c-1),cutoff*nmodes_c));
2055 orthocoeffs[cnt] *= SvvDiffCoeff * fac;
2071 max_abc = max(max_abc,0);
2074 for(
int i = 0; i < nmodes_a; ++i)
2076 for(
int j = 0; j < nmodes_b; ++j)
2078 int maxij = max(i,j);
2080 for(
int k = 0; k < nmodes_c-i; ++k)
2082 int maxijk = max(maxij,k);
2085 orthocoeffs[cnt] *= SvvDiffCoeff *
2102 int cutoff_a = (int) (SVVCutOff*nmodes_a);
2103 int cutoff_b = (int) (SVVCutOff*nmodes_b);
2104 int cutoff_c = (int) (SVVCutOff*nmodes_c);
2108 int nmodes = min(min(nmodes_a,nmodes_b),nmodes_c);
2109 NekDouble cutoff = min(min(cutoff_a,cutoff_b),cutoff_c);
2112 for(i = 0; i < nmodes_a; ++i)
2114 for(j = 0; j < nmodes_b; ++j)
2116 for(k = 0; k < nmodes_c-i; ++k)
2118 if(j >= cutoff || i + k >= cutoff)
2121 (SvvDiffCoeff*exp(-(i+k-nmodes)*(i+k-nmodes)/
2123 (i+k-cutoff+epsilon))))*
2124 exp(-(j-nmodes)*(j-nmodes)/
2126 (j-cutoff+epsilon)))));
2130 orthocoeffs[cnt] *= 0.0;
2139 OrthoExp.
BwdTrans(orthocoeffs,array);
2149 int nquad0 =
m_base[0]->GetNumPoints();
2150 int nquad1 =
m_base[1]->GetNumPoints();
2151 int nquad2 =
m_base[2]->GetNumPoints();
2152 int nqtot = nquad0*nquad1*nquad2;
2153 int nmodes0 =
m_base[0]->GetNumModes();
2154 int nmodes1 =
m_base[1]->GetNumModes();
2155 int nmodes2 =
m_base[2]->GetNumModes();
2156 int numMax = nmodes0;
2184 OrthoPrismExp->FwdTrans(phys_tmp, coeff);
2187 for (u = 0; u < numMin; ++u)
2189 for (i = 0; i < numMin; ++i)
2192 tmp2 = coeff_tmp1 + cnt, 1);
2196 for (i = numMin; i < numMax; ++i)
2202 OrthoPrismExp->BwdTrans(coeff_tmp1, phys_tmp);
#define ASSERTL0(condition, msg)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed to...
Describes the specification for a Basis.
int GetNumModes() const
Returns the order of the basis.
Defines a specification for a set of points.
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
void BwdTrans_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 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 PhysTensorDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray_d1, Array< OneD, NekDouble > &outarray_d2, Array< OneD, NekDouble > &outarray_d3)
Calculate the 3D derivative in the local tensor/collapsed coordinate at the physical points.
The base class for all shapes.
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.
int GetFaceNcoeffs(const int i) const
This function returns the number of expansion coefficients belonging to the i-th face.
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
int NumBndryCoeffs(void) const
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
void LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
Convert local cartesian coordinate xi into local collapsed coordinates eta.
LibUtilities::BasisType GetEdgeBasisType(const int i) const
This function returns the type of expansion basis on the i-th edge.
DNekMatSharedPtr CreateGeneralMatrix(const StdMatrixKey &mkey)
this function generates the mass matrix
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
void BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Backward transformation from coefficient space to physical space.
LibUtilities::PointsType GetPointsType(const int dir) const
This function returns the type of quadrature points used in the dir direction.
void FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Forward transformation from physical space to coefficient space.
int GetNumPoints(const int dir) const
This function returns the number of quadrature points in the dir direction.
void MultiplyByQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
int GetBasisNumModes(const int dir) const
This function returns the number of expansion modes in the dir direction.
Array< OneD, LibUtilities::BasisSharedPtr > m_base
MatrixType GetMatrixType() const
NekDouble GetConstFactor(const ConstFactorType &factor) const
bool ConstFactorExists(const ConstFactorType &factor) const
Class representing a prismatic element in reference space.
virtual LibUtilities::PointsKey v_GetFacePointsKey(const int i, const int j) const
virtual int v_GetTotalEdgeIntNcoeffs() const
virtual void v_IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual int v_GetTotalFaceIntNcoeffs() const
virtual void v_ReduceOrderCoeffs(int numMin, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual DNekMatSharedPtr v_GenMatrix(const StdMatrixKey &mkey)
virtual DNekMatSharedPtr v_CreateStdMatrix(const StdMatrixKey &mkey)
virtual void v_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Forward transform from physical quadrature space stored in inarray and evaluate the expansion coeffic...
virtual void v_GetFaceInteriorMap(const int fid, const Orientation faceOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
virtual int v_GetNedges() const
virtual void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Inner product of inarray over region with respect to the object's default expansion basis; output in ...
virtual LibUtilities::BasisType v_GetEdgeBasisType(const int i) const
virtual void v_IProductWRTBase_MatOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_GetCoords(Array< OneD, NekDouble > &xi_x, Array< OneD, NekDouble > &xi_y, Array< OneD, NekDouble > &xi_z)
virtual void v_BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual int v_GetVertexMap(int localVertexId, bool useCoeffPacking=false)
void v_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdMatrixKey &mkey)
virtual void v_BwdTrans_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_GetBoundaryMap(Array< OneD, unsigned int > &outarray)
virtual void v_GetInteriorMap(Array< OneD, unsigned int > &outarray)
virtual int v_GetFaceNcoeffs(const int i) const
virtual void v_GetFaceNumModes(const int fid, const Orientation faceOrient, int &numModes0, int &numModes1)
virtual int v_GetNverts() const
int GetMode(int I, int J, int K)
Compute the local mode number in the expansion for a particular tensorial combination.
virtual const LibUtilities::BasisKey v_DetFaceBasisKey(const int i, const int k) const
virtual void v_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Calculate the inner product of inarray with respect to the basis B=base0*base1*base2 and put into out...
virtual void v_FillMode(const int mode, Array< OneD, NekDouble > &outarray)
virtual int v_GetEdgeNcoeffs(const int i) const
virtual void v_BwdTrans_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_StdPhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2)
virtual int v_NumDGBndryCoeffs() const
virtual int v_GetFaceIntNcoeffs(const int i) const
virtual int v_CalcNumberOfCoefficients(const std::vector< unsigned int > &nummodes, int &modes_offset)
virtual void v_MultiplyByStdQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
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)
Calculate the derivative of the physical points.
virtual void v_GetFaceToElementMap(const int fid, const Orientation faceOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, int P=-1, int Q=-1)
virtual bool v_IsBoundaryInteriorExpansion()
virtual void v_IProductWRTDerivBase_MatOp(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_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 int v_NumBndryCoeffs() const
virtual void v_GetEdgeInteriorMap(const int eid, const Orientation edgeOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
virtual LibUtilities::ShapeType v_DetShapeType() const
Return Shape of region, using ShapeType enum list; i.e. prism.
virtual int v_GetNfaces() const
virtual void v_IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)
virtual void v_LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
virtual int v_GetFaceNumPoints(const int i) 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 void Dscal(const int &n, const double &alpha, double *x, const int &incx)
BLAS level 1: x = alpha x.
static double Ddot(const int &n, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: output = .
static void Dgemm(const char &transa, const char &transb, const int &m, const int &n, const int &k, const double &alpha, const double *a, const int &lda, const double *b, const int &ldb, const double &beta, double *c, const int &ldc)
BLAS level 3: Matrix-matrix multiply C = A x B where A[m x n], B[n x k], C[m x k].
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, int Nb, int Nc)
int getNumberOfBndCoefficients(int Na, int Nb, int Nc)
int getNumberOfCoefficients(int Na)
static const BasisKey NullBasisKey(eNoBasisType, 0, NullPointsKey)
Defines a null basis with no type or points.
@ eGaussRadauMAlpha1Beta0
Gauss Radau pinned at x=-1, .
@ eModified_B
Principle Modified Functions .
@ eOrtho_A
Principle Orthogonal Functions .
@ eModified_C
Principle Modified Functions .
@ eGLL_Lagrange
Lagrange for SEM basis .
@ eOrtho_C
Principle Orthogonal Functions .
@ eOrtho_B
Principle Orthogonal Functions .
@ eModified_A
Principle Modified Functions .
static const NekDouble kNekZeroTol
std::shared_ptr< StdPrismExp > StdPrismExpSharedPtr
LibUtilities::BasisKey EvaluateTriFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
@ eFactorSVVDGKerDiffCoeff
@ eFactorSVVPowerKerDiffCoeff
const int kSVVDGFiltermodesmin
const int kSVVDGFiltermodesmax
LibUtilities::BasisKey EvaluateQuadFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
const NekDouble kSVVDGFilter[9][11]
@ ePhysInterpToEquiSpaced
static Array< OneD, NekDouble > NullNekDouble1DArray
std::shared_ptr< DNekMat > DNekMatSharedPtr
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 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*y.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)