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.size() > 0)?
true:
false;
118 bool Do_3 = (out_dxi3.size() > 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.size() >= 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);
701 eta[0] = 2.0*(1.0 + xi[0])/d2 - 1.0;
708 xi[0] = (1.0 + eta[0]) * (1.0 - eta[2]) * 0.5 - 1.0;
725 for (
int k = 0; k < Qz; ++k) {
726 for (
int j = 0; j < Qy; ++j) {
727 for (
int i = 0; i < Qx; ++i) {
728 int s = i + Qx*(j + Qy*k);
729 xi_x[s] = (1.0 - eta_z[k])*(1.0 + etaBar_x[i]) / 2.0 - 1.0;
751 const int nm1 =
m_base[1]->GetNumModes();
752 const int nm2 =
m_base[2]->GetNumModes();
753 const int b = 2 * nm2 + 1;
755 const int mode0 = floor(0.5 * (b -
sqrt(b * b - 8.0 * mode / nm1)));
757 mode - nm1*(mode0 * (nm2-1) + 1 - (mode0 - 2)*(mode0 - 1) / 2);
758 const int mode1 = tmp / (nm2 - mode0);
759 const int mode2 = tmp % (nm2 - mode0);
761 if (mode0 == 0 && mode2 == 1 &&
766 StdExpansion::BaryEvaluateBasis<1>(coll[1], mode1) *
767 StdExpansion::BaryEvaluateBasis<2>(coll[2], mode2);
772 StdExpansion::BaryEvaluateBasis<0>(coll[0], mode0) *
773 StdExpansion::BaryEvaluateBasis<1>(coll[1], mode1) *
774 StdExpansion::BaryEvaluateBasis<2>(coll[2], mode2);
784 int nummodes [3] = {
m_base[0]->GetNumModes(),
786 m_base[2]->GetNumModes()};
792 numModes0 = nummodes[0];
793 numModes1 = nummodes[1];
800 numModes0 = nummodes[1];
801 numModes1 = nummodes[2];
808 numModes0 = nummodes[0];
809 numModes1 = nummodes[2];
814 if ( faceOrient >= 9 )
816 std::swap(numModes0, numModes1);
822 ASSERTL2(i >= 0 && i <= 8,
"edge id is out of range");
824 if (i == 0 || i == 2)
828 else if (i == 1 || i == 3 || i == 8)
870 "BasisType is not a boundary interior form");
873 "BasisType is not a boundary interior form");
876 "BasisType is not a boundary interior form");
878 int P =
m_base[0]->GetNumModes();
879 int Q =
m_base[1]->GetNumModes();
880 int R =
m_base[2]->GetNumModes();
890 "BasisType is not a boundary interior form");
893 "BasisType is not a boundary interior form");
896 "BasisType is not a boundary interior form");
898 int P =
m_base[0]->GetNumModes()-1;
899 int Q =
m_base[1]->GetNumModes()-1;
900 int R =
m_base[2]->GetNumModes()-1;
904 + 2*(R+1) +
P*(1 + 2*R -
P);
910 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
915 else if (i == 1 || i == 3)
918 return Q+1 + (
P*(1 + 2*Q -
P))/2;
928 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
938 else if (i == 1 || i == 3)
940 return Pi * (2*Ri - Pi - 1) / 2;
955 Pi * (2*Ri - Pi - 1) +
961 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
965 return m_base[0]->GetNumPoints()*
966 m_base[1]->GetNumPoints();
968 else if (i == 1 || i == 3)
970 return m_base[0]->GetNumPoints()*
971 m_base[2]->GetNumPoints();
975 return m_base[1]->GetNumPoints()*
976 m_base[2]->GetNumPoints();
981 const int i,
const int j)
const
983 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
984 ASSERTL2(j == 0 || j == 1,
"face direction is out of range");
988 return m_base[j]->GetPointsKey();
990 else if (i == 1 || i == 3)
992 return m_base[2*j]->GetPointsKey();
996 return m_base[j+1]->GetPointsKey();
1001 const int i,
const int k)
const
1003 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
1004 ASSERTL2(k >= 0 && k <= 1,
"basis key id is out of range");
1013 m_base[k]->GetNumModes());
1021 m_base[k+1]->GetNumModes());
1029 m_base[2*k]->GetNumModes());
1043 nummodes[modes_offset],
1044 nummodes[modes_offset+1],
1045 nummodes[modes_offset+2]);
1067 "Mapping not defined for this type of basis");
1071 if(useCoeffPacking ==
true)
1094 ASSERTL0(
false,
"local vertex id must be between 0 and 5");
1120 ASSERTL0(
false,
"local vertex id must be between 0 and 5");
1131 "BasisType is not a boundary interior form");
1134 "BasisType is not a boundary interior form");
1137 "BasisType is not a boundary interior form");
1139 int P =
m_base[0]->GetNumModes() - 1,
p;
1140 int Q =
m_base[1]->GetNumModes() - 1, q;
1141 int R =
m_base[2]->GetNumModes() - 1, r;
1145 if(outarray.size()!=nIntCoeffs)
1153 for (
p = 2;
p <=
P; ++
p)
1155 for (q = 2; q <= Q; ++q)
1157 for (r = 1; r <= R-
p; ++r)
1169 "BasisType is not a boundary interior form");
1172 "BasisType is not a boundary interior form");
1175 "BasisType is not a boundary interior form");
1177 int P =
m_base[0]->GetNumModes() - 1,
p;
1178 int Q =
m_base[1]->GetNumModes() - 1, q;
1179 int R =
m_base[2]->GetNumModes() - 1, r;
1184 if (maparray.size() != nBnd)
1190 for (
p = 0;
p <=
P; ++
p)
1195 for (q = 0; q <= Q; ++q)
1197 for (r = 0; r <= R-
p; ++r)
1207 for (q = 0; q <= Q; ++q)
1211 for (r = 0; r <= R-
p; ++r)
1234 "Method only implemented if BasisType is identical"
1235 "in x and y directions");
1238 "Method only implemented for Modified_A BasisType"
1239 "(x and y direction) and Modified_B BasisType (z "
1242 int i, j, k,
p, q, r, nFaceCoeffs, idx = 0;
1243 int nummodesA=0, nummodesB=0;
1248 nummodesA =
m_base[0]->GetNumModes();
1249 nummodesB =
m_base[1]->GetNumModes();
1253 nummodesA =
m_base[0]->GetNumModes();
1254 nummodesB =
m_base[2]->GetNumModes();
1258 nummodesA =
m_base[1]->GetNumModes();
1259 nummodesB =
m_base[2]->GetNumModes();
1262 ASSERTL0(
false,
"fid must be between 0 and 4");
1265 bool CheckForZeroedModes =
false;
1273 else if (fid == 1 || fid == 3)
1275 nFaceCoeffs =
P*(2*Q-
P+1)/2;
1276 CheckForZeroedModes =
true;
1281 CheckForZeroedModes =
true;
1285 if (maparray.size() != nFaceCoeffs)
1290 if (signarray.size() != nFaceCoeffs)
1296 fill(signarray.get(), signarray.get() + nFaceCoeffs, 1);
1303 if (fid != 1 && fid != 3)
1305 for (i = 0; i < Q; i++)
1307 for (j = 0; j <
P; j++)
1311 arrayindx[i*
P+j] = i*
P+j;
1315 arrayindx[i*
P+j] = j*Q+i;
1326 for (q = 0; q < Q; ++q)
1328 for (
p = 0;
p <
P; ++
p)
1336 for (
p = 0;
p <
P; ++
p)
1338 for (r = 0; r < Q-
p; ++r)
1340 if ((
int)faceOrient == 7 &&
p > 1)
1342 signarray[idx] =
p % 2 ? -1 : 1;
1350 for (q = 0; q <
P; ++q)
1352 maparray[arrayindx[q]] =
GetMode(1,q,0);
1354 for (q = 0; q <
P; ++q)
1356 maparray[arrayindx[
P+q]] =
GetMode(0,q,1);
1358 for (r = 1; r < Q-1; ++r)
1360 for (q = 0; q <
P; ++q)
1362 maparray[arrayindx[(r+1)*
P+q]] =
GetMode(1,q,r);
1368 for (
p = 0;
p <
P; ++
p)
1370 for (r = 0; r < Q-
p; ++r)
1372 if ((
int)faceOrient == 7 &&
p > 1)
1374 signarray[idx] =
p % 2 ? -1 : 1;
1376 maparray[idx++] =
GetMode(
p, 1, r);
1382 for (r = 0; r < Q; ++r)
1384 for (q = 0; q <
P; ++q)
1386 maparray[arrayindx[r*
P+q]] =
GetMode(0, q, r);
1392 ASSERTL0(
false,
"Face to element map unavailable.");
1395 if (fid == 1 || fid == 3)
1397 if(CheckForZeroedModes)
1402 for (j = 0; j < nummodesA; ++j)
1405 for (k = nummodesB-j; k < Q-j; ++k)
1407 signarray[idx] = 0.0;
1408 maparray[idx++] = maparray[0];
1412 for (j = nummodesA; j <
P; ++j)
1414 for (k = 0; k < Q-j; ++k)
1416 signarray[idx] = 0.0;
1417 maparray[idx++] = maparray[0];
1425 if ((
int)faceOrient == 7)
1427 swap(maparray[0], maparray[Q]);
1428 for (i = 1; i < Q-1; ++i)
1430 swap(maparray[i+1], maparray[Q+i]);
1437 if(CheckForZeroedModes)
1441 for (j = 0; j < nummodesA; ++j)
1443 for (k = nummodesB; k < Q; ++k)
1445 signarray[arrayindx[j+k*
P]] = 0.0;
1446 maparray[arrayindx[j+k*
P]] = maparray[0];
1450 for (j = nummodesA; j <
P; ++j)
1452 for (k = 0; k < Q; ++k)
1454 signarray[arrayindx[j+k*
P]] = 0.0;
1455 maparray[arrayindx[j+k*
P]] = maparray[0];
1464 if (faceOrient == 6 || faceOrient == 8 ||
1465 faceOrient == 11 || faceOrient == 12)
1469 for (i = 3; i < Q; i += 2)
1471 for (j = 0; j <
P; j++)
1473 signarray[arrayindx[i*
P+j]] *= -1;
1477 for (i = 0; i <
P; i++)
1479 swap(maparray [i], maparray [i+
P]);
1480 swap(signarray[i], signarray[i+
P]);
1485 for (i = 0; i < Q; i++)
1487 for (j = 3; j <
P; j += 2)
1489 signarray[arrayindx[i*
P+j]] *= -1;
1493 for (i = 0; i < Q; i++)
1495 swap (maparray [i], maparray [i+Q]);
1496 swap (signarray[i], signarray[i+Q]);
1501 if (faceOrient == 7 || faceOrient == 8 ||
1502 faceOrient == 10 || faceOrient == 12)
1506 for (i = 0; i < Q; i++)
1508 for (j = 3; j <
P; j += 2)
1510 signarray[arrayindx[i*
P+j]] *= -1;
1514 for(i = 0; i < Q; i++)
1516 swap(maparray [i*
P], maparray [i*
P+1]);
1517 swap(signarray[i*
P], signarray[i*
P+1]);
1522 for (i = 3; i < Q; i += 2)
1524 for (j = 0; j <
P; j++)
1526 signarray[arrayindx[i*
P+j]] *= -1;
1530 for (i = 0; i <
P; i++)
1532 swap(maparray [i*Q], maparray [i*Q+1]);
1533 swap(signarray[i*Q], signarray[i*Q+1]);
1549 const int P =
m_base[0]->GetNumModes() - 1;
1550 const int Q =
m_base[1]->GetNumModes() - 1;
1551 const int R =
m_base[2]->GetNumModes() - 1;
1554 if (maparray.size() != nEdgeIntCoeffs)
1559 if(signarray.size() != nEdgeIntCoeffs)
1565 fill(signarray.get(), signarray.get()+nEdgeIntCoeffs, 1);
1575 for (i = 2; i <=
P; ++i)
1577 maparray[i-2] =
GetMode(i,0,0);
1582 for (i = 2; i <= Q; ++i)
1584 maparray[i-2] =
GetMode(1,i,0);
1591 for (i = 2; i <=
P; ++i)
1593 maparray[i-2] =
GetMode(i,1,0);
1600 for (i = 2; i <= Q; ++i)
1602 maparray[i-2] =
GetMode(0,i,0);
1607 for (i = 2; i <= R; ++i)
1609 maparray[i-2] =
GetMode(0,0,i);
1614 for (i = 1; i <= R-1; ++i)
1616 maparray[i-1] =
GetMode(1,0,i);
1621 for (i = 1; i <= R-1; ++i)
1623 maparray[i-1] =
GetMode(1,1,i);
1628 for (i = 2; i <= R; ++i)
1630 maparray[i-2] =
GetMode(0,1,i);
1635 for (i = 2; i <= Q; ++i)
1637 maparray[i-2] =
GetMode(0,i,1);
1642 ASSERTL0(
false,
"Edge not defined.");
1648 for (i = 1; i < nEdgeIntCoeffs; i += 2)
1661 const int P =
m_base[0]->GetNumModes() - 1;
1662 const int Q =
m_base[1]->GetNumModes() - 1;
1663 const int R =
m_base[2]->GetNumModes() - 1;
1665 int p, q, r, idx = 0;
1671 if (maparray.size() != nFaceIntCoeffs)
1676 if (signarray.size() != nFaceIntCoeffs)
1682 fill(signarray.get(), signarray.get()+nFaceIntCoeffs, 1);
1688 if (fid != 1 && fid != 3)
1701 for (i = 0; i < nummodesB; i++)
1703 for (j = 0; j < nummodesA; j++)
1707 arrayindx[i*nummodesA+j] = i*nummodesA+j;
1711 arrayindx[i*nummodesA+j] = j*nummodesB+i;
1720 for (q = 2; q <= Q; ++q)
1722 for (
p = 2;
p <=
P; ++
p)
1724 maparray[arrayindx[(q-2)*nummodesA+(
p-2)]] =
GetMode(
p,q,0);
1730 for (
p = 2;
p <=
P; ++
p)
1732 for (r = 1; r <= R-
p; ++r)
1734 if ((
int)faceOrient == 7)
1736 signarray[idx] =
p % 2 ? -1 : 1;
1744 for (r = 1; r <= R-1; ++r)
1746 for (q = 2; q <= Q; ++q)
1748 maparray[arrayindx[(r-1)*nummodesA+(q-2)]] =
GetMode(1, q, r);
1754 for (
p = 2;
p <=
P; ++
p)
1756 for (r = 1; r <= R-
p; ++r)
1758 if ((
int)faceOrient == 7)
1760 signarray[idx] =
p % 2 ? -1 : 1;
1762 maparray[idx++] =
GetMode(
p, 1, r);
1768 for (r = 2; r <= R; ++r)
1770 for (q = 2; q <= Q; ++q)
1772 maparray[arrayindx[(r-2)*nummodesA+(q-2)]] =
GetMode(0, q, r);
1778 ASSERTL0(
false,
"Face interior map not available.");
1783 if (fid == 1 || fid == 3)
1786 if (faceOrient == 6 || faceOrient == 8 ||
1787 faceOrient == 11 || faceOrient == 12)
1791 for (i = 1; i < nummodesB; i += 2)
1793 for (j = 0; j < nummodesA; j++)
1795 signarray[arrayindx[i*nummodesA+j]] *= -1;
1801 for (i = 0; i < nummodesB; i++)
1803 for (j = 1; j < nummodesA; j += 2)
1805 signarray[arrayindx[i*nummodesA+j]] *= -1;
1811 if (faceOrient == 7 || faceOrient == 8 ||
1812 faceOrient == 10 || faceOrient == 12)
1816 for (i = 0; i < nummodesB; i++)
1818 for (j = 1; j < nummodesA; j += 2)
1820 signarray[arrayindx[i*nummodesA+j]] *= -1;
1826 for (i = 1; i < nummodesB; i += 2)
1828 for (j = 0; j < nummodesA; j++)
1830 signarray[arrayindx[i*nummodesA+j]] *= -1;
1852 int nq0 =
m_base[0]->GetNumPoints();
1853 int nq1 =
m_base[1]->GetNumPoints();
1854 int nq2 =
m_base[2]->GetNumPoints();
1864 nq = max(nq0,max(nq1,nq2));
1877 for(
int i = 0; i < nq; ++i)
1879 for(
int j = 0; j < nq; ++j)
1881 for(
int k = 0; k < nq-i; ++k,++cnt)
1884 coords[cnt][0] = -1.0 + 2*k/(
NekDouble)(nq-1);
1885 coords[cnt][1] = -1.0 + 2*j/(
NekDouble)(nq-1);
1886 coords[cnt][2] = -1.0 + 2*i/(
NekDouble)(nq-1);
1891 for(
int i = 0; i < neq; ++i)
1895 I[0] =
m_base[0]->GetI(coll );
1896 I[1] =
m_base[1]->GetI(coll+1);
1897 I[2] =
m_base[2]->GetI(coll+2);
1901 for(
int k = 0; k < nq2; ++k)
1903 for (
int j = 0; j < nq1; ++j)
1906 fac = (I[1]->GetPtr())[j]*(I[2]->GetPtr())[k];
1911 k * nq0 * nq1 * neq +
1956 int Q =
m_base[1]->GetNumModes() - 1;
1957 int R =
m_base[2]->GetNumModes() - 1;
1961 (Q+1)*(
p*R + 1-(
p-2)*(
p-1)/2);
1969 int nquad0 =
m_base[0]->GetNumPoints();
1970 int nquad1 =
m_base[1]->GetNumPoints();
1971 int nquad2 =
m_base[2]->GetNumPoints();
1980 for(i = 0; i < nquad1*nquad2; ++i)
1983 w0.get(), 1, outarray.get()+i*nquad0,1);
1987 for(j = 0; j < nquad2; ++j)
1989 for(i = 0; i < nquad1; ++i)
2003 for(i = 0; i < nquad2; ++i)
2006 &outarray[0]+i*nquad0*nquad1, 1);
2011 for(i = 0; i < nquad2; ++i)
2014 &outarray[0]+i*nquad0*nquad1,1);
2025 int qa =
m_base[0]->GetNumPoints();
2026 int qb =
m_base[1]->GetNumPoints();
2027 int qc =
m_base[2]->GetNumPoints();
2028 int nmodes_a =
m_base[0]->GetNumModes();
2029 int nmodes_b =
m_base[1]->GetNumModes();
2030 int nmodes_c =
m_base[2]->GetNumModes();
2045 OrthoExp.
FwdTrans(array,orthocoeffs);
2055 for(
int i = 0; i < nmodes_a; ++i)
2057 for(
int j = 0; j < nmodes_b; ++j)
2060 pow((1.0*i)/(nmodes_a-1),cutoff*nmodes_a),
2061 pow((1.0*j)/(nmodes_b-1),cutoff*nmodes_b));
2063 for(
int k = 0; k < nmodes_c-i; ++k)
2066 pow((1.0*k)/(nmodes_c-1),cutoff*nmodes_c));
2068 orthocoeffs[cnt] *= SvvDiffCoeff * fac;
2084 max_abc = max(max_abc,0);
2087 for(
int i = 0; i < nmodes_a; ++i)
2089 for(
int j = 0; j < nmodes_b; ++j)
2091 int maxij = max(i,j);
2093 for(
int k = 0; k < nmodes_c-i; ++k)
2095 int maxijk = max(maxij,k);
2098 orthocoeffs[cnt] *= SvvDiffCoeff *
2115 int cutoff_a = (int) (SVVCutOff*nmodes_a);
2116 int cutoff_b = (int) (SVVCutOff*nmodes_b);
2117 int cutoff_c = (int) (SVVCutOff*nmodes_c);
2121 int nmodes = min(min(nmodes_a,nmodes_b),nmodes_c);
2122 NekDouble cutoff = min(min(cutoff_a,cutoff_b),cutoff_c);
2125 for(i = 0; i < nmodes_a; ++i)
2127 for(j = 0; j < nmodes_b; ++j)
2129 for(k = 0; k < nmodes_c-i; ++k)
2131 if(j >= cutoff || i + k >= cutoff)
2134 (SvvDiffCoeff*exp(-(i+k-nmodes)*(i+k-nmodes)/
2136 (i+k-cutoff+epsilon))))*
2137 exp(-(j-nmodes)*(j-nmodes)/
2139 (j-cutoff+epsilon)))));
2143 orthocoeffs[cnt] *= 0.0;
2152 OrthoExp.
BwdTrans(orthocoeffs,array);
2162 int nquad0 =
m_base[0]->GetNumPoints();
2163 int nquad1 =
m_base[1]->GetNumPoints();
2164 int nquad2 =
m_base[2]->GetNumPoints();
2165 int nqtot = nquad0*nquad1*nquad2;
2166 int nmodes0 =
m_base[0]->GetNumModes();
2167 int nmodes1 =
m_base[1]->GetNumModes();
2168 int nmodes2 =
m_base[2]->GetNumModes();
2169 int numMax = nmodes0;
2197 OrthoPrismExp->FwdTrans(phys_tmp, coeff);
2200 for (u = 0; u < numMin; ++u)
2202 for (i = 0; i < numMin; ++i)
2205 tmp2 = coeff_tmp1 + cnt, 1);
2209 for (i = numMin; i < numMax; ++i)
2215 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.
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.
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.
int GetTraceNcoeffs(const int i) const
This function returns the number of expansion coefficients belonging to the i-th trace.
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 void v_IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual const LibUtilities::BasisKey v_GetTraceBasisKey(const int i, const int k) const
virtual void v_GetTraceInteriorToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation traceOrient=eDir1FwdDir1_Dir2FwdDir2)
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 LibUtilities::PointsKey v_GetTracePointsKey(const int i, const int j) const
virtual int v_GetTraceNumPoints(const int i) const
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 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 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 int v_GetTraceIntNcoeffs(const int i) const
virtual void v_BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_GetTraceToElementMap(const int fid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation faceOrient, int P, int Q)
virtual int v_GetTotalTraceIntNcoeffs() const
virtual int v_GetVertexMap(int localVertexId, bool useCoeffPacking=false)
void v_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdMatrixKey &mkey)
virtual int v_GetTraceNcoeffs(const int i) const
virtual int v_GetNtraces() const
NekDouble v_PhysEvaluateBasis(const Array< OneD, const NekDouble > &coords, int mode) final
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 void v_GetTraceNumModes(const int fid, int &numModes0, int &numModes1, Orientation faceOrient=eDir1FwdDir1_Dir2FwdDir2)
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 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_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_GetEdgeInteriorToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation traceOrient=eDir1FwdDir1_Dir2FwdDir2)
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_LocCollapsedToLocCoord(const Array< OneD, const NekDouble > &eta, Array< OneD, NekDouble > &xi)
virtual LibUtilities::ShapeType v_DetShapeType() const
Return Shape of region, using ShapeType enum list; i.e. prism.
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)
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 op(A)[m x k], op(B)[k x n], C[m x n] DGEMM perfo...
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
The above copyright notice and this permission notice shall be included.
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*x.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
scalarT< T > sqrt(scalarT< T > in)