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)
1153 maparray[arrayindx[q*P+
p]] =
GetMode(p,q,0);
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;
1167 maparray[idx++] =
GetMode(p,0,r);
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;
1625 maparray[idx++] =
GetMode(p,0,r);
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)
1756 outarray[idx++] =
GetMode(p,q,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)
1796 maparray[idx++] =
GetMode(p,q,r);
1804 for (q = 0; q <= Q; ++q)
1808 for (r = 0; r <= R-
p; ++r)
1810 maparray[idx++] =
GetMode(p,q,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);
virtual void v_GetEdgeInteriorMap(const int eid, const Orientation edgeOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
void v_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdMatrixKey &mkey)
#define ASSERTL0(condition, msg)
virtual int v_GetEdgeNcoeffs(const int i) const
int getNumberOfCoefficients(int Na, int Nb, int Nc)
Principle Modified Functions .
const int kSVVDGFiltermodesmax
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...
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)
static Array< OneD, NekDouble > NullNekDouble1DArray
virtual void v_FillMode(const int mode, Array< OneD, NekDouble > &outarray)
virtual void v_BwdTrans_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
virtual int v_NumBndryCoeffs() const
int GetNumPoints(const int dir) const
This function returns the number of quadrature points in the dir direction.
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)
void MultiplyByQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
int NumBndryCoeffs(void) const
int GetBasisNumModes(const int dir) const
This function returns the number of expansion modes in the dir direction.
virtual void v_GetCoords(Array< OneD, NekDouble > &xi_x, Array< OneD, NekDouble > &xi_y, Array< OneD, NekDouble > &xi_z)
virtual int v_GetFaceIntNcoeffs(const int i) const
virtual void v_ReduceOrderCoeffs(int numMin, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
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 ...
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
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...
LibUtilities::BasisKey EvaluateTriFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
Principle Modified Functions .
virtual int v_GetNfaces() const
void LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
Convert local cartesian coordinate xi into local collapsed coordinates eta.
const int kSVVDGFiltermodesmin
std::shared_ptr< DNekMat > DNekMatSharedPtr
virtual void v_GetInteriorMap(Array< OneD, unsigned int > &outarray)
MatrixType GetMatrixType() const
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)
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].
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_LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
Gauss Radau pinned at x=-1, .
int GetFaceNcoeffs(const int i) const
This function returns the number of expansion coefficients belonging to the i-th face.
Principle Orthogonal Functions .
virtual void v_GetFaceNumModes(const int fid, const Orientation faceOrient, int &numModes0, int &numModes1)
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)
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...
virtual DNekMatSharedPtr v_GenMatrix(const StdMatrixKey &mkey)
The base class for all shapes.
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)
static const NekDouble kNekZeroTol
int GetNumModes() const
Returns the order of the basis.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
virtual int v_GetFaceNumPoints(const int i) const
int getNumberOfCoefficients(int Na)
LibUtilities::BasisKey EvaluateQuadFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
virtual int v_GetTotalEdgeIntNcoeffs() const
Principle Modified Functions .
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)
Class representing a prismatic element in reference space.
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
Principle Orthogonal Functions .
std::shared_ptr< StdPrismExp > StdPrismExpSharedPtr
DNekMatSharedPtr CreateGeneralMatrix(const StdMatrixKey &mkey)
this function generates the mass matrix
Principle Orthogonal Functions .
virtual void v_GetFaceInteriorMap(const int fid, const Orientation faceOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
Defines a specification for a set of points.
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].
virtual int v_GetTotalFaceIntNcoeffs() const
virtual void v_GetBoundaryMap(Array< OneD, unsigned int > &outarray)
NekDouble GetConstFactor(const ConstFactorType &factor) const
int GetNcoeffs(void) const
This function returns the total number of coefficients used in the expansion.
virtual const LibUtilities::BasisKey v_DetFaceBasisKey(const int i, const int k) const
const NekDouble kSVVDGFilter[9][11]
virtual int v_GetNverts() const
virtual void v_BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
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 = .
LibUtilities::PointsType GetPointsType(const int dir) const
This function returns the type of quadrature points used in the dir direction.
int getNumberOfBndCoefficients(int Na, int Nb, int Nc)
virtual int v_NumDGBndryCoeffs() const
virtual int v_GetFaceNcoeffs(const int i) const
bool ConstFactorExists(const ConstFactorType &factor) const
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed t...
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
virtual void v_IProductWRTBase_MatOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual LibUtilities::PointsKey v_GetFacePointsKey(const int i, const int j) const
virtual int v_GetNedges() const
virtual void v_MultiplyByStdQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_IProductWRTDerivBase_MatOp(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
void BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Backward transformation from coefficient space to physical space...
static const BasisKey NullBasisKey(eNoBasisType, 0, NullPointsKey)
Defines a null basis with no type or points.
virtual DNekMatSharedPtr v_CreateStdMatrix(const StdMatrixKey &mkey)
int GetMode(int I, int J, int K)
Compute the local mode number in the expansion for a particular tensorial combination.
int GetTotPoints() const
This function returns the total number of quadrature points used in the element.
virtual LibUtilities::BasisType v_GetEdgeBasisType(const int i) const
virtual LibUtilities::ShapeType v_DetShapeType() const
Return Shape of region, using ShapeType enum list; i.e. prism.
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
virtual void v_IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)
Array< OneD, LibUtilities::BasisSharedPtr > m_base
static void Daxpy(const int &n, const double &alpha, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: y = alpha x plus y.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
LibUtilities::BasisType GetEdgeBasisType(const int i) const
This function returns the type of expansion basis on the i-th edge.
Describes the specification for a Basis.
virtual int v_GetVertexMap(int localVertexId, bool useCoeffPacking=false)
virtual int v_CalcNumberOfCoefficients(const std::vector< unsigned int > &nummodes, int &modes_offset)
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 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.
virtual bool v_IsBoundaryInteriorExpansion()
void FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Forward transformation from physical space to coefficient space...