48 StdHexExp::StdHexExp()
55 StdExpansion(Ba.GetNumModes()*Bb.GetNumModes()*Bc.GetNumModes(), 3,
130 ASSERTL1(
false,
"input dir is out of range");
178 "Basis[1] is not a general tensor type");
182 "Basis[2] is not a general tensor type");
185 &&
m_base[2]->Collocation())
190 inarray, 1, outarray, 1);
212 inarray,outarray,wsp,
true,
true,
true);
235 bool doCheckCollDir0,
236 bool doCheckCollDir1,
237 bool doCheckCollDir2)
239 int nquad0 =
m_base[0]->GetNumPoints();
240 int nquad1 =
m_base[1]->GetNumPoints();
241 int nquad2 =
m_base[2]->GetNumPoints();
242 int nmodes0 =
m_base[0]->GetNumModes();
243 int nmodes1 =
m_base[1]->GetNumModes();
244 int nmodes2 =
m_base[2]->GetNumModes();
247 bool colldir0 = doCheckCollDir0?(
m_base[0]->Collocation()):
false;
248 bool colldir1 = doCheckCollDir1?(
m_base[1]->Collocation()):
false;
249 bool colldir2 = doCheckCollDir2?(
m_base[2]->Collocation()):
false;
253 if(colldir0 && colldir1 && colldir2)
260 ASSERTL1(wsp.size()>=nquad0*nmodes2*(nmodes1+nquad1),
261 "Workspace size is not sufficient");
267 Blas::Dgemm(
'T',
'T', nmodes1*nmodes2, nquad0, nmodes0,
268 1.0, &inarray[0], nmodes0,
270 0.0, &wsp[0], nmodes1*nmodes2);
271 Blas::Dgemm(
'T',
'T', nquad0*nmodes2, nquad1, nmodes1,
272 1.0, &wsp[0], nmodes1,
274 0.0, &wsp2[0], nquad0*nmodes2);
275 Blas::Dgemm(
'T',
'T', nquad0*nquad1, nquad2, nmodes2,
276 1.0, &wsp2[0], nmodes2,
278 0.0, &outarray[0], nquad0*nquad1);
297 if( (
m_base[0]->Collocation())
298 &&(
m_base[1]->Collocation())
299 &&(
m_base[2]->Collocation()) )
356 if(
m_base[0]->Collocation() &&
357 m_base[1]->Collocation() &&
380 m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
389 bool multiplybyweights)
391 int nquad0 =
m_base[0]->GetNumPoints();
392 int nquad1 =
m_base[1]->GetNumPoints();
393 int nquad2 =
m_base[2]->GetNumPoints();
394 int order0 =
m_base[0]->GetNumModes();
395 int order1 =
m_base[1]->GetNumModes();
398 order0*order1*nquad2);
400 if(multiplybyweights)
408 tmp,outarray,wsp,
true,
true,
true);
415 inarray,outarray,wsp,
true,
true,
true);
431 bool doCheckCollDir0,
432 bool doCheckCollDir1,
433 bool doCheckCollDir2)
435 int nquad0 =
m_base[0]->GetNumPoints();
436 int nquad1 =
m_base[1]->GetNumPoints();
437 int nquad2 =
m_base[2]->GetNumPoints();
438 int nmodes0 =
m_base[0]->GetNumModes();
439 int nmodes1 =
m_base[1]->GetNumModes();
440 int nmodes2 =
m_base[2]->GetNumModes();
442 bool colldir0 = doCheckCollDir0?(
m_base[0]->Collocation()):
false;
443 bool colldir1 = doCheckCollDir1?(
m_base[1]->Collocation()):
false;
444 bool colldir2 = doCheckCollDir2?(
m_base[2]->Collocation()):
false;
446 if(colldir0 && colldir1 && colldir2)
452 ASSERTL1(wsp.size() >= nmodes0*nquad2*(nquad1+nmodes1),
453 "Insufficient workspace size");
462 for(
int n = 0; n < nmodes0; ++n)
465 tmp0.get()+nquad1*nquad2*n,1);
470 Blas::Dgemm(
'T',
'N', nquad1*nquad2, nmodes0, nquad0,
471 1.0, inarray.get(), nquad0,
473 0.0, tmp0.get(), nquad1*nquad2);
479 for(
int n = 0; n < nmodes1; ++n)
482 tmp1.get()+nquad2*nmodes0*n,1);
487 Blas::Dgemm(
'T',
'N', nquad2*nmodes0, nmodes1, nquad1,
488 1.0, tmp0.get(), nquad1,
490 0.0, tmp1.get(), nquad2*nmodes0);
496 for(
int n = 0; n < nmodes2; ++n)
499 outarray.get()+nmodes0*nmodes1*n,1);
504 Blas::Dgemm(
'T',
'N', nmodes0*nmodes1, nmodes2, nquad2,
505 1.0, tmp1.get(), nquad2,
507 0.0, outarray.get(), nmodes0*nmodes1);
525 ASSERTL0((dir==0)||(dir==1)||(dir==2),
"input dir is out of range");
547 m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
556 ASSERTL0((dir==0)||(dir==1)||(dir==2),
"input dir is out of range");
558 int nquad1 =
m_base[1]->GetNumPoints();
559 int nquad2 =
m_base[2]->GetNumPoints();
560 int order0 =
m_base[0]->GetNumModes();
561 int order1 =
m_base[1]->GetNumModes();
565 if (outarray.size() < inarray.size())
627 int nquad0 =
m_base[0]->GetNumPoints();
628 int nquad1 =
m_base[1]->GetNumPoints();
629 int nquad2 =
m_base[2]->GetNumPoints();
635 int btmp0 =
m_base[0]->GetNumModes();
636 int btmp1 =
m_base[1]->GetNumModes();
637 int mode2 = mode/(btmp0*btmp1);
638 int mode1 = (mode-mode2*btmp0*btmp1)/btmp0;
639 int mode0 = (mode-mode2*btmp0*btmp1)%btmp0;
641 ASSERTL2(mode == mode2 * btmp0 * btmp1 + mode1 * btmp0 + mode0,
642 "Mode lookup failed.");
644 "Calling argument mode is larger than total expansion "
647 for(
int i = 0; i < nquad1*nquad2; ++i)
650 &outarray[0]+i*nquad0, 1);
653 for(
int j = 0; j < nquad2; ++j)
655 for(
int i = 0; i < nquad0; ++i)
658 &outarray[0]+i+j*nquad0*nquad1, nquad0,
659 &outarray[0]+i+j*nquad0*nquad1, nquad0);
663 for(
int i = 0; i < nquad2; i++)
666 &outarray[0]+i*nquad0*nquad1,1);
687 const int nm0 =
m_base[0]->GetNumModes();
688 const int nm1 =
m_base[1]->GetNumModes();
689 const int mode2 = mode / (nm0 * nm1);
690 const int mode1 = (mode - mode2 * nm0 * nm1) / nm0;
691 const int mode0 = (mode - mode2 * nm0 * nm1) % nm0;
694 StdExpansion::BaryEvaluateBasis<0>(coords[0], mode0) *
695 StdExpansion::BaryEvaluateBasis<1>(coords[1], mode1) *
696 StdExpansion::BaryEvaluateBasis<2>(coords[2], mode2);
724 "BasisType is not a boundary interior form");
727 "BasisType is not a boundary interior form");
730 "BasisType is not a boundary interior form");
732 int nmodes0 =
m_base[0]->GetNumModes();
733 int nmodes1 =
m_base[1]->GetNumModes();
734 int nmodes2 =
m_base[2]->GetNumModes();
736 return ( 2*( nmodes0*nmodes1 + nmodes0*nmodes2
738 - 4*( nmodes0 + nmodes1 + nmodes2 ) + 8 );
745 "BasisType is not a boundary interior form");
748 "BasisType is not a boundary interior form");
751 "BasisType is not a boundary interior form");
753 int nmodes0 =
m_base[0]->GetNumModes();
754 int nmodes1 =
m_base[1]->GetNumModes();
755 int nmodes2 =
m_base[2]->GetNumModes();
757 return 2*( nmodes0*nmodes1 + nmodes0*nmodes2
763 ASSERTL2((i >= 0) && (i <= 5),
"face id is out of range");
764 if((i == 0) || (i == 5))
768 else if((i == 1) || (i == 3))
780 ASSERTL2((i >= 0) && (i <= 5),
"face id is out of range");
781 if((i == 0) || (i == 5))
785 else if((i == 1) || (i == 3))
805 ASSERTL2(i >= 0 && i <= 5,
"face id is out of range");
807 if (i == 0 || i == 5)
809 return m_base[0]->GetNumPoints()*
810 m_base[1]->GetNumPoints();
812 else if (i == 1 || i == 3)
814 return m_base[0]->GetNumPoints()*
815 m_base[2]->GetNumPoints();
819 return m_base[1]->GetNumPoints()*
820 m_base[2]->GetNumPoints();
825 const int i,
const int j)
const
827 ASSERTL2(i >= 0 && i <= 5,
"face id is out of range");
828 ASSERTL2(j == 0 || j == 1,
"face direction is out of range");
830 if (i == 0 || i == 5)
832 return m_base[j]->GetPointsKey();
834 else if (i == 1 || i == 3)
836 return m_base[2*j]->GetPointsKey();
840 return m_base[j+1]->GetPointsKey();
846 int nmodes = nummodes[modes_offset]*nummodes[modes_offset+1]*nummodes[modes_offset+2];
853 const int i,
const int k)
const
855 ASSERTL2(i >= 0 && i <= 5,
"face id is out of range");
856 ASSERTL2(k >= 0 && k <= 1,
"basis key id is out of range");
878 m_base[dir]->GetNumModes());
894 for(
int k = 0; k < Qz; ++k ) {
895 for(
int j = 0; j < Qy; ++j ) {
896 for(
int i = 0; i < Qx; ++i ) {
897 int s = i + Qx*(j + Qy*k);
913 int nummodes [3] = {
m_base[0]->GetNumModes(),
915 m_base[2]->GetNumModes()};
921 numModes0 = nummodes[0];
922 numModes1 = nummodes[1];
928 numModes0 = nummodes[0];
929 numModes1 = nummodes[2];
935 numModes0 = nummodes[1];
936 numModes1 = nummodes[2];
948 std::swap(numModes0, numModes1);
964 "BasisType is not a boundary interior form");
967 "BasisType is not a boundary interior form");
970 "BasisType is not a boundary interior form");
972 ASSERTL1((localVertexId>=0)&&(localVertexId<8),
973 "local vertex id must be between 0 and 7");
980 int nummodes [3] = {
m_base[0]->GetNumModes(),
982 m_base[2]->GetNumModes()};
984 if(useCoeffPacking ==
true)
986 if(localVertexId > 3)
998 switch(localVertexId % 4)
1045 if( (localVertexId % 4) % 3 > 0 )
1057 if( localVertexId % 4 > 1 )
1070 if( localVertexId > 3)
1083 return r*nummodes[0]*nummodes[1] + q*nummodes[0] +
p;
1094 "BasisType is not a boundary interior form");
1097 "BasisType is not a boundary interior form");
1100 "BasisType is not a boundary interior form");
1103 int nummodes [3] = {
m_base[0]->GetNumModes(),
1104 m_base[1]->GetNumModes(),
1105 m_base[2]->GetNumModes()};
1109 if(outarray.size() != nIntCoeffs)
1123 for(i = 0; i < 3; i++)
1128 IntIdx[i][1] = nummodes[i];
1133 IntIdx[i][1] = nummodes[i]-1;
1137 for(r = IntIdx[2][0]; r < IntIdx[2][1]; r++)
1139 for( q = IntIdx[1][0]; q < IntIdx[1][1]; q++)
1141 for(
p = IntIdx[0][0];
p < IntIdx[0][1];
p++)
1143 outarray[cnt++] = r*nummodes[0]*nummodes[1] +
1158 "BasisType is not a boundary interior form");
1161 "BasisType is not a boundary interior form");
1164 "BasisType is not a boundary interior form");
1167 int nummodes [3] = {
m_base[0]->GetNumModes(),
1168 m_base[1]->GetNumModes(),
1169 m_base[2]->GetNumModes()};
1173 if(outarray.size()!=nBndCoeffs)
1188 for(i = 0; i < 3; i++)
1196 IntIdx[i][1] = nummodes[i];
1200 BndIdx[i][1] = nummodes[i]-1;
1202 IntIdx[i][1] = nummodes[i]-1;
1207 for(i = 0; i < 2; i++)
1210 for( q = 0; q < nummodes[1]; q++)
1212 for(
p = 0;
p < nummodes[0];
p++)
1214 outarray[cnt++] = r*nummodes[0]*nummodes[1]+q*nummodes[0] +
p;
1219 for(r = IntIdx[2][0]; r < IntIdx[2][1]; r++)
1221 for( i = 0; i < 2; i++)
1224 for(
p = 0;
p < nummodes[0];
p++)
1226 outarray[cnt++] = r*nummodes[0]*nummodes[1] +
1231 for( q = IntIdx[1][0]; q < IntIdx[1][1]; q++)
1233 for( i = 0; i < 2; i++)
1236 outarray[cnt++] = r*nummodes[0]*nummodes[1] +
1242 sort(outarray.get(), outarray.get() + nBndCoeffs);
1257 int nummodesA=0, nummodesB=0;
1261 "Method only implemented if BasisType is indentical in "
1265 "Method only implemented for Modified_A or "
1266 "GLL_Lagrange BasisType");
1268 const int nummodes0 =
m_base[0]->GetNumModes();
1269 const int nummodes1 =
m_base[1]->GetNumModes();
1270 const int nummodes2 =
m_base[2]->GetNumModes();
1276 nummodesA = nummodes0;
1277 nummodesB = nummodes1;
1281 nummodesA = nummodes0;
1282 nummodesB = nummodes2;
1286 nummodesA = nummodes1;
1287 nummodesB = nummodes2;
1290 ASSERTL0(
false,
"fid must be between 0 and 5");
1293 bool CheckForZeroedModes =
false;
1301 if((
P != nummodesA)||(Q != nummodesB))
1303 CheckForZeroedModes =
true;
1307 int nFaceCoeffs =
P*Q;
1309 if(maparray.size() != nFaceCoeffs)
1314 if(signarray.size() != nFaceCoeffs)
1320 fill( signarray.get() , signarray.get()+nFaceCoeffs, 1 );
1325 for(i = 0; i < Q; i++)
1327 for(j = 0; j <
P; j++)
1331 arrayindx[i*
P+j] = i*
P+j;
1335 arrayindx[i*
P+j] = j*Q+i;
1350 offset = nummodes0*nummodes1;
1354 offset = (nummodes2-1)*nummodes0*nummodes1;
1372 offset = nummodes0*(nummodes1-1);
1373 jump1 = nummodes0*nummodes1;
1379 jump1 = nummodes0*nummodes1;
1390 offset = nummodes0-1;
1391 jump1 = nummodes0*nummodes1;
1399 jump1 = nummodes0*nummodes1;
1404 ASSERTL0(
false,
"fid must be between 0 and 5");
1407 for(i = 0; i < Q; i++)
1409 for(j = 0; j <
P; j++)
1411 maparray[ arrayindx[i*
P+j] ]
1412 = i*jump1 + j*jump2 + offset;
1417 if(CheckForZeroedModes)
1423 for(
int i = 0; i < nummodesB; i++)
1425 for(
int j = nummodesA; j <
P; j++)
1427 signarray[arrayindx[i*
P+j]] = 0.0;
1428 maparray[arrayindx[i*
P+j]] = maparray[0];
1432 for(
int i = nummodesB; i < Q; i++)
1434 for(
int j = 0; j <
P; j++)
1436 signarray[arrayindx[i*
P+j]] = 0.0;
1437 maparray[arrayindx[i*
P+j]] = maparray[0];
1443 ASSERTL0(
false,
"Different trace space face dimention and element face dimention not possible for GLL-Lagrange bases");
1456 for(
int i = 3; i < Q; i+=2)
1458 for(
int j = 0; j <
P; j++)
1460 signarray[ arrayindx[i*
P+j] ] *= -1;
1464 for(
int i = 0; i <
P; i++)
1466 swap( maparray[i] , maparray[i+
P] );
1467 swap( signarray[i] , signarray[i+
P] );
1473 for(
int i = 0; i <
P; i++)
1475 for(
int j = 0; j < Q/2; j++)
1477 swap( maparray[i + j*
P],
1480 swap( signarray[i + j*
P],
1491 for(
int i = 0; i < Q; i++)
1493 for(
int j = 3; j <
P; j+=2)
1495 signarray[ arrayindx[i*
P+j] ] *= -1;
1499 for(
int i = 0; i < Q; i++)
1501 swap( maparray[i] , maparray[i+Q] );
1502 swap( signarray[i] , signarray[i+Q] );
1508 for(
int i = 0; i <
P; i++)
1510 for(
int j = 0; j < Q/2; j++)
1512 swap( maparray[i*Q + j],
1513 maparray[i*Q + Q -1 -j]);
1514 swap( signarray[i*Q + j],
1515 signarray[i*Q + Q -1 -j]);
1531 for(i = 0; i < Q; i++)
1533 for(j = 3; j <
P; j+=2)
1535 signarray[ arrayindx[i*
P+j] ] *= -1;
1539 for(i = 0; i < Q; i++)
1541 swap( maparray[i*
P],
1543 swap( signarray[i*
P],
1549 for(i = 0; i < Q; i++)
1551 for(j = 0; j <
P/2; j++)
1553 swap( maparray[i*
P + j],
1554 maparray[i*
P +
P -1 -j]);
1555 swap( signarray[i*
P + j],
1556 signarray[i*
P +
P -1 -j]);
1568 for(i = 3; i < Q; i+=2)
1570 for(j = 0; j <
P; j++)
1572 signarray[ arrayindx[i*
P+j] ] *= -1;
1576 for(i = 0; i <
P; i++)
1578 swap( maparray[i*Q],
1580 swap( signarray[i*Q],
1586 for(i = 0; i < Q; i++)
1588 for(j = 0; j <
P/2; j++)
1590 swap( maparray[i + j*Q] ,
1591 maparray[i+
P*Q - Q -j*Q] );
1592 swap( signarray[i + j*Q] ,
1593 signarray[i+
P*Q - Q -j*Q] );
1615 "BasisType is not a boundary interior form");
1618 "BasisType is not a boundary interior form");
1621 "BasisType is not a boundary interior form");
1624 "local edge id must be between 0 and 11");
1628 if(maparray.size()!=nEdgeIntCoeffs)
1633 if(signarray.size() != nEdgeIntCoeffs)
1639 fill( signarray.get() , signarray.get()+nEdgeIntCoeffs, 1 );
1642 int nummodes [3] = {
m_base[0]->GetNumModes(),
1643 m_base[1]->GetNumModes(),
1644 m_base[2]->GetNumModes()};
1650 bool reverseOrdering =
false;
1651 bool signChange =
false;
1653 int IdxRange [3][2] = {{0,0},{0,0},{0,0}};
1673 IdxRange[2][0] = nummodes[2] - 1;
1674 IdxRange[2][1] = nummodes[2];
1691 IdxRange[2][1] = nummodes[2] - 1;
1695 reverseOrdering =
true;
1701 IdxRange[2][1] = nummodes[2];
1730 IdxRange[1][0] = nummodes[1] - 1;
1731 IdxRange[1][1] = nummodes[1];
1746 IdxRange[1][1] = nummodes[1] - 1;
1750 reverseOrdering =
true;
1756 IdxRange[1][1] = nummodes[1];
1771 IdxRange[1][1] = nummodes[1] - 1;
1775 reverseOrdering =
true;
1781 IdxRange[1][1] = nummodes[1];
1810 IdxRange[0][0] = nummodes[0] - 1;
1811 IdxRange[0][1] = nummodes[0];
1826 IdxRange[0][1] = nummodes[0] - 1;
1830 reverseOrdering =
true;
1836 IdxRange[0][1] = nummodes[0];
1851 IdxRange[0][1] = nummodes[0] - 1;
1855 reverseOrdering =
true;
1861 IdxRange[0][1] = nummodes[0];
1874 for(
int r = IdxRange[2][0]; r < IdxRange[2][1]; r++)
1876 for(
int q = IdxRange[1][0]; q < IdxRange[1][1]; q++)
1878 for(
int p = IdxRange[0][0];
p < IdxRange[0][1];
p++)
1881 = r*nummodes[0]*nummodes[1] + q*nummodes[0] +
p;
1886 if( reverseOrdering )
1888 reverse( maparray.get() , maparray.get()+nEdgeIntCoeffs );
1893 for(
int p = 1;
p < nEdgeIntCoeffs;
p+=2)
1912 "BasisType is not a boundary interior form");
1915 "BasisType is not a boundary interior form");
1918 "BasisType is not a boundary interior form");
1921 "local face id must be between 0 and 5");
1925 if(maparray.size()!=nFaceIntCoeffs)
1930 if(signarray.size() != nFaceIntCoeffs)
1936 fill( signarray.get() , signarray.get()+nFaceIntCoeffs, 1 );
1939 int nummodes [3] = {
m_base[0]->GetNumModes(),
1940 m_base[1]->GetNumModes(),
1941 m_base[2]->GetNumModes()};
1957 nummodesA = nummodes[0];
1958 nummodesB = nummodes[1];
1964 nummodesA = nummodes[0];
1965 nummodesB = nummodes[2];
1971 nummodesA = nummodes[1];
1972 nummodesB = nummodes[2];
1980 for(
int i = 0; i < (nummodesB-2); i++)
1982 for(
int j = 0; j < (nummodesA-2); j++)
1986 arrayindx[i*(nummodesA-2)+j] = i*(nummodesA-2)+j;
1990 arrayindx[i*(nummodesA-2)+j] = j*(nummodesB-2)+i;
1995 int IdxRange [3][2];
2017 IdxRange[2][0] = nummodes[2] - 1;
2018 IdxRange[2][1] = nummodes[2];
2036 IdxRange[2][0] = nummodes[2] - 2;
2044 IdxRange[2][1] = nummodes[2] - 1;
2051 IdxRange[2][1] = nummodes[2];
2056 for(
int i = 3; i < nummodes[2]; i+=2)
2080 IdxRange[1][0] = nummodes[1] - 1;
2081 IdxRange[1][1] = nummodes[1];
2099 IdxRange[1][0] = nummodes[1] - 2;
2107 IdxRange[1][1] = nummodes[1] - 1;
2114 IdxRange[1][1] = nummodes[1];
2119 for(
int i = 3; i < nummodes[1]; i+=2)
2133 IdxRange[1][0] = nummodes[1] - 2;
2141 IdxRange[1][1] = nummodes[1] - 1;
2148 IdxRange[1][1] = nummodes[1];
2153 for(
int i = 3; i < nummodes[1]; i+=2)
2175 IdxRange[0][0] = nummodes[0] - 1;
2176 IdxRange[0][1] = nummodes[0];
2193 IdxRange[0][0] = nummodes[0] - 2;
2201 IdxRange[0][1] = nummodes[0] - 1;
2208 IdxRange[0][1] = nummodes[0];
2213 for(
int i = 3; i < nummodes[0]; i+=2)
2224 for(
int r = IdxRange[2][0]; r != IdxRange[2][1]; r+=Incr[2])
2226 for(
int q = IdxRange[1][0]; q != IdxRange[1][1]; q+=Incr[1])
2228 for(
int p = IdxRange[0][0];
p != IdxRange[0][1];
p+=Incr[0])
2230 maparray [ arrayindx[cnt ] ]
2231 = r*nummodes[0]*nummodes[1] + q*nummodes[0] +
p;
2232 signarray[ arrayindx[cnt++] ]
2233 = sign0[
p] * sign1[q] * sign2[r];
2241 ASSERTL2((i >= 0)&&(i <= 11),
"edge id is out of range");
2243 if((i == 0)||(i == 2)||(i == 8)||(i == 10))
2247 else if((i == 1)||(i == 3)||(i == 9)||(i == 11))
2322 if(inarray.get() == outarray.get())
2328 m_ncoeffs, tmp.get(), 1, 0.0, outarray.get(), 1);
2333 m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
2341 int nquad0 =
m_base[0]->GetNumPoints();
2342 int nquad1 =
m_base[1]->GetNumPoints();
2343 int nquad2 =
m_base[2]->GetNumPoints();
2344 int nq01 = nquad0*nquad1;
2345 int nq12 = nquad1*nquad2;
2351 for(
int i = 0; i < nq12; ++i)
2354 w0.get(), 1, outarray.get()+i*nquad0,1);
2357 for(
int i = 0; i < nq12; ++i)
2359 Vmath::Smul(nquad0, w1[i%nquad1], outarray.get()+i*nquad0, 1,
2360 outarray.get()+i*nquad0, 1);
2363 for(
int i = 0; i < nquad2; ++i)
2365 Vmath::Smul(nq01, w2[i], outarray.get()+i*nq01, 1,
2366 outarray.get()+i*nq01, 1);
2374 int qa =
m_base[0]->GetNumPoints();
2375 int qb =
m_base[1]->GetNumPoints();
2376 int qc =
m_base[2]->GetNumPoints();
2377 int nmodes_a =
m_base[0]->GetNumModes();
2378 int nmodes_b =
m_base[1]->GetNumModes();
2379 int nmodes_c =
m_base[2]->GetNumModes();
2394 OrthoExp.
FwdTrans(array,orthocoeffs);
2404 for(
int i = 0; i < nmodes_a; ++i)
2406 for(
int j = 0; j < nmodes_b; ++j)
2409 pow((1.0*i)/(nmodes_a-1),cutoff*nmodes_a),
2410 pow((1.0*j)/(nmodes_b-1),cutoff*nmodes_b));
2412 for(
int k = 0; k < nmodes_c; ++k)
2415 pow((1.0*k)/(nmodes_c-1),cutoff*nmodes_c));
2418 *= SvvDiffCoeff * fac;
2434 max_abc = max(max_abc,0);
2437 for(
int i = 0; i < nmodes_a; ++i)
2439 for(
int j = 0; j < nmodes_b; ++j)
2441 int maxij = max(i,j);
2443 for(
int k = 0; k < nmodes_c; ++k)
2445 int maxijk = max(maxij,k);
2448 orthocoeffs[cnt] *= SvvDiffCoeff *
2461 int nmodes = max(nmodes_a,nmodes_b);
2462 nmodes = max(nmodes,nmodes_c);
2465 for(
int j = cutoff; j < nmodes; ++j)
2467 fac[j] = fabs((j-nmodes)/((
NekDouble) (j-cutoff+1.0)));
2471 for(
int i = 0; i < nmodes_a; ++i)
2473 for(
int j = 0; j < nmodes_b; ++j)
2475 for(
int k = 0; k < nmodes_c; ++k)
2477 if((i >= cutoff)||(j >= cutoff)||(k >= cutoff))
2479 orthocoeffs[i*nmodes_a*nmodes_b +
2481 (SvvDiffCoeff*exp(-(fac[i]+fac[j]+fac[k])));
2485 orthocoeffs[i*nmodes_a*nmodes_b + j*nmodes_c + k] *= 0.0;
2493 OrthoExp.
BwdTrans(orthocoeffs,array);
2503 int qa =
m_base[0]->GetNumPoints();
2504 int qb =
m_base[1]->GetNumPoints();
2505 int qc =
m_base[2]->GetNumPoints();
2506 int nmodesA =
m_base[0]->GetNumModes();
2507 int nmodesB =
m_base[1]->GetNumModes();
2508 int nmodesC =
m_base[2]->GetNumModes();
2509 int P = nmodesA - 1;
2510 int Q = nmodesB - 1;
2511 int R = nmodesC - 1;
2524 int Pcut = cutoff*
P;
2525 int Qcut = cutoff*Q;
2526 int Rcut = cutoff*R;
2530 OrthoExp.
FwdTrans(array,orthocoeffs);
2535 for(
int i = 0; i < nmodesA; ++i)
2537 for(
int j = 0; j < nmodesB; ++j)
2539 for(
int k = 0; k < nmodesC; ++k, ++index)
2542 if(i > Pcut || j > Qcut || k > Rcut)
2547 fac = max( max(fac1, fac2), fac3);
2548 fac = pow(fac, exponent);
2549 orthocoeffs[index] *= exp(-alpha*fac);
2556 OrthoExp.
BwdTrans(orthocoeffs,array);
#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.
Defines a specification for a set of points.
virtual void v_LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
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)
int GetEdgeNcoeffs(const int i) const
This function returns the number of expansion coefficients belonging to the i-th edge.
virtual void v_HelmholtzMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
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.
void WeakDerivMatrixOp_MatFree(const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
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 BwdTrans_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
void IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
DNekMatSharedPtr CreateGeneralMatrix(const StdMatrixKey &mkey)
this function generates the mass matrix
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...
void LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
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)
LibUtilities::NekManager< StdMatrixKey, DNekMat, StdMatrixKey::opLess > m_stdMatrixManager
int GetBasisNumModes(const int dir) const
This function returns the number of expansion modes in the dir direction.
void PhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1=NullNekDouble1DArray, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray)
Array< OneD, LibUtilities::BasisSharedPtr > m_base
void MassMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
Class representing a hexehedral element in reference space.
virtual void v_IProductWRTBase_MatOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_ExponentialFilter(Array< OneD, NekDouble > &array, const NekDouble alpha, const NekDouble exponent, const NekDouble cutoff)
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)
Differentiation Methods.
virtual int v_NumBndryCoeffs() const
virtual void v_HelmholtzMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
virtual void v_GetTraceNumModes(const int fid, int &numModes0, int &numModes1, Orientation faceOrient=eDir1FwdDir1_Dir2FwdDir2)
virtual void v_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdMatrixKey &mkey)
NekDouble v_PhysEvaluateBasis(const Array< OneD, const NekDouble > &coords, int mode) final
virtual const LibUtilities::BasisKey v_GetTraceBasisKey(const int i, const int k) const
virtual int v_GetTraceNumPoints(const int i) const
virtual void v_LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
virtual void v_FillMode(const int mode, Array< OneD, NekDouble > &outarray)
virtual int v_GetTraceNcoeffs(const int i) const
virtual void v_GetTraceToElementMap(const int fid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation faceOrient, int P, int Q)
virtual void v_BwdTrans_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual int v_GetEdgeNcoeffs(const int i) const
virtual void v_GetBoundaryMap(Array< OneD, unsigned int > &outarray)
virtual void v_IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multbyweights=true)
virtual DNekMatSharedPtr v_GenMatrix(const StdMatrixKey &mkey)
virtual int v_GetTraceIntNcoeffs(const int i) const
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 void v_GeneralMatrixOp_MatOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
virtual void v_IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual int v_GetVertexMap(int localVertexId, bool useCoeffPacking=false)
virtual int v_GetNverts() 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_LocCollapsedToLocCoord(const Array< OneD, const NekDouble > &eta, Array< OneD, NekDouble > &xi)
virtual LibUtilities::PointsKey v_GetTracePointsKey(const int i, const int j) const
virtual void v_MassMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
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_GetTotalTraceIntNcoeffs() const
virtual int v_GetNedges() const
virtual void v_GetCoords(Array< OneD, NekDouble > &coords_x, Array< OneD, NekDouble > &coords_y, Array< OneD, NekDouble > &coords_z)
virtual void v_LaplacianMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
virtual bool v_IsBoundaryInteriorExpansion()
virtual void v_BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual DNekMatSharedPtr v_CreateStdMatrix(const StdMatrixKey &mkey)
virtual void v_MultiplyByStdQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_GetInteriorMap(Array< OneD, unsigned int > &outarray)
virtual int v_NumDGBndryCoeffs() const
virtual int v_CalcNumberOfCoefficients(const std::vector< unsigned int > &nummodes, int &modes_offset)
virtual int v_GetNtraces() const
virtual void v_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
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 LibUtilities::ShapeType v_DetShapeType() const
virtual void v_WeakDerivMatrixOp(const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
virtual void v_IProductWRTDerivBase_MatOp(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_GetEdgeInteriorToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation traceOrient=eDir1FwdDir1_Dir2FwdDir2)
virtual void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
NekDouble GetConstFactor(const ConstFactorType &factor) const
bool ConstFactorExists(const ConstFactorType &factor) 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 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...
@ 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
@ 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]
@ eDir1BwdDir2_Dir2BwdDir1
@ eDir1FwdDir1_Dir2FwdDir2
@ eDir1BwdDir1_Dir2BwdDir2
@ eDir1BwdDir2_Dir2FwdDir1
@ eDir1FwdDir1_Dir2BwdDir2
@ eDir1BwdDir1_Dir2FwdDir2
@ eDir1FwdDir2_Dir2FwdDir1
@ eDir1FwdDir2_Dir2BwdDir1
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 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)