48 StdHexExp::StdHexExp()
56 StdExpansion(Ba.GetNumModes()*Bb.GetNumModes()*Bc.GetNumModes(), 3,
135 ASSERTL1(
false,
"input dir is out of range");
184 "Basis[1] is not a general tensor type");
188 "Basis[2] is not a general tensor type");
191 &&
m_base[2]->Collocation())
196 inarray, 1, outarray, 1);
218 inarray,outarray,wsp,
true,
true,
true);
242 bool doCheckCollDir0,
243 bool doCheckCollDir1,
244 bool doCheckCollDir2)
246 int nquad0 =
m_base[0]->GetNumPoints();
247 int nquad1 =
m_base[1]->GetNumPoints();
248 int nquad2 =
m_base[2]->GetNumPoints();
249 int nmodes0 =
m_base[0]->GetNumModes();
250 int nmodes1 =
m_base[1]->GetNumModes();
251 int nmodes2 =
m_base[2]->GetNumModes();
254 bool colldir0 = doCheckCollDir0?(
m_base[0]->Collocation()):
false;
255 bool colldir1 = doCheckCollDir1?(
m_base[1]->Collocation()):
false;
256 bool colldir2 = doCheckCollDir2?(
m_base[2]->Collocation()):
false;
260 if(colldir0 && colldir1 && colldir2)
267 ASSERTL1(wsp.num_elements()>=nquad0*nmodes2*(nmodes1+nquad1),
268 "Workspace size is not sufficient");
274 Blas::Dgemm(
'T',
'T', nmodes1*nmodes2, nquad0, nmodes0,
275 1.0, &inarray[0], nmodes0,
277 0.0, &wsp[0], nmodes1*nmodes2);
278 Blas::Dgemm(
'T',
'T', nquad0*nmodes2, nquad1, nmodes1,
279 1.0, &wsp[0], nmodes1,
281 0.0, &wsp2[0], nquad0*nmodes2);
282 Blas::Dgemm(
'T',
'T', nquad0*nquad1, nquad2, nmodes2,
283 1.0, &wsp2[0], nmodes2,
285 0.0, &outarray[0], nquad0*nquad1);
305 if( (
m_base[0]->Collocation())
306 &&(
m_base[1]->Collocation())
307 &&(
m_base[2]->Collocation()) )
364 if(
m_base[0]->Collocation() &&
365 m_base[1]->Collocation() &&
387 m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
396 bool multiplybyweights)
398 int nquad0 =
m_base[0]->GetNumPoints();
399 int nquad1 =
m_base[1]->GetNumPoints();
400 int nquad2 =
m_base[2]->GetNumPoints();
401 int order0 =
m_base[0]->GetNumModes();
402 int order1 =
m_base[1]->GetNumModes();
405 order0*order1*nquad2);
407 if(multiplybyweights)
415 tmp,outarray,wsp,
true,
true,
true);
422 inarray,outarray,wsp,
true,
true,
true);
437 bool doCheckCollDir0,
438 bool doCheckCollDir1,
439 bool doCheckCollDir2)
441 int nquad0 =
m_base[0]->GetNumPoints();
442 int nquad1 =
m_base[1]->GetNumPoints();
443 int nquad2 =
m_base[2]->GetNumPoints();
444 int nmodes0 =
m_base[0]->GetNumModes();
445 int nmodes1 =
m_base[1]->GetNumModes();
446 int nmodes2 =
m_base[2]->GetNumModes();
448 bool colldir0 = doCheckCollDir0?(
m_base[0]->Collocation()):
false;
449 bool colldir1 = doCheckCollDir1?(
m_base[1]->Collocation()):
false;
450 bool colldir2 = doCheckCollDir2?(
m_base[2]->Collocation()):
false;
452 if(colldir0 && colldir1 && colldir2)
458 ASSERTL1(wsp.num_elements() >= nmodes0*nquad2*(nquad1+nmodes1),
459 "Insufficient workspace size");
468 for(
int n = 0; n < nmodes0; ++n)
471 tmp0.get()+nquad1*nquad2*n,1);
476 Blas::Dgemm(
'T',
'N', nquad1*nquad2, nmodes0, nquad0,
477 1.0, inarray.get(), nquad0,
479 0.0, tmp0.get(), nquad1*nquad2);
485 for(
int n = 0; n < nmodes1; ++n)
488 tmp1.get()+nquad2*nmodes0*n,1);
493 Blas::Dgemm(
'T',
'N', nquad2*nmodes0, nmodes1, nquad1,
494 1.0, tmp0.get(), nquad1,
496 0.0, tmp1.get(), nquad2*nmodes0);
502 for(
int n = 0; n < nmodes2; ++n)
505 outarray.get()+nmodes0*nmodes1*n,1);
510 Blas::Dgemm(
'T',
'N', nmodes0*nmodes1, nmodes2, nquad2,
511 1.0, tmp1.get(), nquad2,
513 0.0, outarray.get(), nmodes0*nmodes1);
530 ASSERTL0((dir==0)||(dir==1)||(dir==2),
"input dir is out of range");
552 m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
560 ASSERTL0((dir==0)||(dir==1)||(dir==2),
"input dir is out of range");
562 int nquad1 =
m_base[1]->GetNumPoints();
563 int nquad2 =
m_base[2]->GetNumPoints();
564 int order0 =
m_base[0]->GetNumModes();
565 int order1 =
m_base[1]->GetNumModes();
569 if (outarray.num_elements() < inarray.num_elements())
622 int nquad0 =
m_base[0]->GetNumPoints();
623 int nquad1 =
m_base[1]->GetNumPoints();
624 int nquad2 =
m_base[2]->GetNumPoints();
630 int btmp0 =
m_base[0]->GetNumModes();
631 int btmp1 =
m_base[1]->GetNumModes();
632 int mode2 = mode/(btmp0*btmp1);
633 int mode1 = (mode-mode2*btmp0*btmp1)/btmp0;
634 int mode0 = (mode-mode2*btmp0*btmp1)%btmp0;
636 ASSERTL2(mode == mode2 * btmp0 * btmp1 + mode1 * btmp0 + mode0,
637 "Mode lookup failed.");
639 "Calling argument mode is larger than total expansion "
642 for(i = 0; i < nquad1*nquad2; ++i)
645 &outarray[0]+i*nquad0, 1);
648 for(j = 0; j < nquad2; ++j)
650 for(i = 0; i < nquad0; ++i)
653 &outarray[0]+i+j*nquad0*nquad1, nquad0,
654 &outarray[0]+i+j*nquad0*nquad1, nquad0);
658 for(i = 0; i < nquad2; i++)
661 &outarray[0]+i*nquad0*nquad1,1);
694 "BasisType is not a boundary interior form");
697 "BasisType is not a boundary interior form");
700 "BasisType is not a boundary interior form");
702 int nmodes0 =
m_base[0]->GetNumModes();
703 int nmodes1 =
m_base[1]->GetNumModes();
704 int nmodes2 =
m_base[2]->GetNumModes();
706 return ( 2*( nmodes0*nmodes1 + nmodes0*nmodes2
708 - 4*( nmodes0 + nmodes1 + nmodes2 ) + 8 );
715 "BasisType is not a boundary interior form");
718 "BasisType is not a boundary interior form");
721 "BasisType is not a boundary interior form");
723 int nmodes0 =
m_base[0]->GetNumModes();
724 int nmodes1 =
m_base[1]->GetNumModes();
725 int nmodes2 =
m_base[2]->GetNumModes();
727 return 2*( nmodes0*nmodes1 + nmodes0*nmodes2
733 ASSERTL2((i >= 0)&&(i <= 11),
"edge id is out of range");
735 if((i == 0)||(i == 2)||(i == 8)||(i == 10))
739 else if((i == 1)||(i == 3)||(i == 9)||(i == 11))
757 ASSERTL2((i >= 0) && (i <= 5),
"face id is out of range");
758 if((i == 0) || (i == 5))
762 else if((i == 1) || (i == 3))
775 ASSERTL2((i >= 0) && (i <= 5),
"face id is out of range");
776 if((i == 0) || (i == 5))
780 else if((i == 1) || (i == 3))
800 ASSERTL2(i >= 0 && i <= 5,
"face id is out of range");
802 if (i == 0 || i == 5)
804 return m_base[0]->GetNumPoints()*
805 m_base[1]->GetNumPoints();
807 else if (i == 1 || i == 3)
809 return m_base[0]->GetNumPoints()*
810 m_base[2]->GetNumPoints();
814 return m_base[1]->GetNumPoints()*
815 m_base[2]->GetNumPoints();
820 const int i,
const int j)
const
822 ASSERTL2(i >= 0 && i <= 5,
"face id is out of range");
823 ASSERTL2(j == 0 || j == 1,
"face direction is out of range");
825 if (i == 0 || i == 5)
827 return m_base[j]->GetPointsKey();
829 else if (i == 1 || i == 3)
831 return m_base[2*j]->GetPointsKey();
835 return m_base[j+1]->GetPointsKey();
841 int nmodes = nummodes[modes_offset]*nummodes[modes_offset+1]*nummodes[modes_offset+2];
849 const int i,
const int k)
const
851 ASSERTL2(i >= 0 && i <= 5,
"face id is out of range");
852 ASSERTL2(k >= 0 && k <= 1,
"basis key id is out of range");
874 m_base[dir]->GetNumModes());
879 ASSERTL2((i >= 0)&&(i <= 11),
"edge id is out of range");
881 if((i == 0)||(i == 2)||(i==8)||(i==10))
885 else if((i == 1)||(i == 3)||(i == 9)||(i == 11))
908 for(
int k = 0; k < Qz; ++k ) {
909 for(
int j = 0; j < Qy; ++j ) {
910 for(
int i = 0; i < Qx; ++i ) {
911 int s = i + Qx*(j + Qy*k);
927 int nummodes [3] = {
m_base[0]->GetNumModes(),
929 m_base[2]->GetNumModes()};
935 numModes0 = nummodes[0];
936 numModes1 = nummodes[1];
942 numModes0 = nummodes[0];
943 numModes1 = nummodes[2];
949 numModes0 = nummodes[1];
950 numModes1 = nummodes[2];
962 std::swap(numModes0, numModes1);
978 int nummodesA=0, nummodesB=0;
982 "Method only implemented if BasisType is indentical in "
986 "Method only implemented for Modified_A or GLL_Lagrange BasisType");
988 const int nummodes0 =
m_base[0]->GetNumModes();
989 const int nummodes1 =
m_base[1]->GetNumModes();
990 const int nummodes2 =
m_base[2]->GetNumModes();
996 nummodesA = nummodes0;
997 nummodesB = nummodes1;
1001 nummodesA = nummodes0;
1002 nummodesB = nummodes2;
1006 nummodesA = nummodes1;
1007 nummodesB = nummodes2;
1010 ASSERTL0(
false,
"fid must be between 0 and 5");
1013 bool CheckForZeroedModes =
false;
1021 if((
P != nummodesA)||(Q != nummodesB))
1023 CheckForZeroedModes =
true;
1027 int nFaceCoeffs =
P*Q;
1029 if(maparray.num_elements() != nFaceCoeffs)
1034 if(signarray.num_elements() != nFaceCoeffs)
1040 fill( signarray.get() , signarray.get()+nFaceCoeffs, 1 );
1045 for(i = 0; i < Q; i++)
1047 for(j = 0; j <
P; j++)
1051 arrayindx[i*
P+j] = i*
P+j;
1055 arrayindx[i*
P+j] = j*Q+i;
1070 offset = nummodes0*nummodes1;
1074 offset = (nummodes2-1)*nummodes0*nummodes1;
1092 offset = nummodes0*(nummodes1-1);
1093 jump1 = nummodes0*nummodes1;
1099 jump1 = nummodes0*nummodes1;
1110 offset = nummodes0-1;
1111 jump1 = nummodes0*nummodes1;
1119 jump1 = nummodes0*nummodes1;
1124 ASSERTL0(
false,
"fid must be between 0 and 5");
1127 for(i = 0; i < Q; i++)
1129 for(j = 0; j <
P; j++)
1131 maparray[ arrayindx[i*
P+j] ]
1132 = i*jump1 + j*jump2 + offset;
1137 if(CheckForZeroedModes)
1143 for(i = 0; i < nummodesB; i++)
1145 for(j = nummodesA; j <
P; j++)
1147 signarray[arrayindx[i*
P+j]] = 0.0;
1148 maparray[arrayindx[i*
P+j]] = maparray[0];
1152 for(i = nummodesB; i < Q; i++)
1154 for(j = 0; j <
P; j++)
1156 signarray[arrayindx[i*
P+j]] = 0.0;
1157 maparray[arrayindx[i*
P+j]] = maparray[0];
1163 ASSERTL0(
false,
"Different trace space face dimention and element face dimention not possible for GLL-Lagrange bases");
1176 for(i = 3; i < Q; i+=2)
1178 for(j = 0; j <
P; j++)
1180 signarray[ arrayindx[i*
P+j] ] *= -1;
1184 for(i = 0; i <
P; i++)
1186 swap( maparray[i] , maparray[i+
P] );
1187 swap( signarray[i] , signarray[i+
P] );
1193 for(i = 0; i <
P; i++)
1195 for(j = 0; j < Q/2; j++)
1197 swap( maparray[i + j*
P],
1200 swap( signarray[i + j*
P],
1211 for(i = 0; i < Q; i++)
1213 for(j = 3; j <
P; j+=2)
1215 signarray[ arrayindx[i*
P+j] ] *= -1;
1219 for(i = 0; i < Q; i++)
1221 swap( maparray[i] , maparray[i+Q] );
1222 swap( signarray[i] , signarray[i+Q] );
1228 for(i = 0; i <
P; i++)
1230 for(j = 0; j < Q/2; j++)
1232 swap( maparray[i*Q + j],
1233 maparray[i*Q + Q -1 -j]);
1234 swap( signarray[i*Q + j],
1235 signarray[i*Q + Q -1 -j]);
1251 for(i = 0; i < Q; i++)
1253 for(j = 3; j <
P; j+=2)
1255 signarray[ arrayindx[i*
P+j] ] *= -1;
1259 for(i = 0; i < Q; i++)
1261 swap( maparray[i*
P],
1263 swap( signarray[i*
P],
1269 for(i = 0; i < Q; i++)
1271 for(j = 0; j <
P/2; j++)
1273 swap( maparray[i*
P + j],
1274 maparray[i*
P +
P -1 -j]);
1275 swap( signarray[i*
P + j],
1276 signarray[i*
P +
P -1 -j]);
1288 for(i = 3; i < Q; i+=2)
1290 for(j = 0; j <
P; j++)
1292 signarray[ arrayindx[i*
P+j] ] *= -1;
1296 for(i = 0; i <
P; i++)
1298 swap( maparray[i*Q],
1300 swap( signarray[i*Q],
1306 for(i = 0; i < Q; i++)
1308 for(j = 0; j <
P/2; j++)
1310 swap( maparray[i + j*Q] ,
1311 maparray[i+
P*Q - Q -j*Q] );
1312 swap( signarray[i + j*Q] ,
1313 signarray[i+
P*Q - Q -j*Q] );
1334 "BasisType is not a boundary interior form");
1337 "BasisType is not a boundary interior form");
1340 "BasisType is not a boundary interior form");
1342 ASSERTL1((localVertexId>=0)&&(localVertexId<8),
1343 "local vertex id must be between 0 and 7");
1350 int nummodes [3] = {
m_base[0]->GetNumModes(),
1351 m_base[1]->GetNumModes(),
1352 m_base[2]->GetNumModes()};
1354 if(useCoeffPacking ==
true)
1356 if(localVertexId > 3)
1368 switch(localVertexId % 4)
1415 if( (localVertexId % 4) % 3 > 0 )
1428 if( localVertexId % 4 > 1 )
1441 if( localVertexId > 3)
1454 return r*nummodes[0]*nummodes[1] + q*nummodes[0] +
p;
1471 "BasisType is not a boundary interior form");
1474 "BasisType is not a boundary interior form");
1477 "BasisType is not a boundary interior form");
1480 "local edge id must be between 0 and 11");
1484 if(maparray.num_elements()!=nEdgeIntCoeffs)
1489 if(signarray.num_elements() != nEdgeIntCoeffs)
1495 fill( signarray.get() , signarray.get()+nEdgeIntCoeffs, 1 );
1498 int nummodes [3] = {
m_base[0]->GetNumModes(),
1499 m_base[1]->GetNumModes(),
1500 m_base[2]->GetNumModes()};
1506 bool reverseOrdering =
false;
1507 bool signChange =
false;
1509 int IdxRange [3][2] = {{0,0},{0,0},{0,0}};
1529 IdxRange[2][0] = nummodes[2] - 1;
1530 IdxRange[2][1] = nummodes[2];
1547 IdxRange[2][1] = nummodes[2] - 1;
1551 reverseOrdering =
true;
1557 IdxRange[2][1] = nummodes[2];
1586 IdxRange[1][0] = nummodes[1] - 1;
1587 IdxRange[1][1] = nummodes[1];
1602 IdxRange[1][1] = nummodes[1] - 1;
1606 reverseOrdering =
true;
1612 IdxRange[1][1] = nummodes[1];
1627 IdxRange[1][1] = nummodes[1] - 1;
1631 reverseOrdering =
true;
1637 IdxRange[1][1] = nummodes[1];
1666 IdxRange[0][0] = nummodes[0] - 1;
1667 IdxRange[0][1] = nummodes[0];
1682 IdxRange[0][1] = nummodes[0] - 1;
1686 reverseOrdering =
true;
1692 IdxRange[0][1] = nummodes[0];
1707 IdxRange[0][1] = nummodes[0] - 1;
1711 reverseOrdering =
true;
1717 IdxRange[0][1] = nummodes[0];
1731 for(r = IdxRange[2][0]; r < IdxRange[2][1]; r++)
1733 for(q = IdxRange[1][0]; q < IdxRange[1][1]; q++)
1735 for(
p = IdxRange[0][0];
p < IdxRange[0][1];
p++)
1738 = r*nummodes[0]*nummodes[1] + q*nummodes[0] +
p;
1743 if( reverseOrdering )
1745 reverse( maparray.get() , maparray.get()+nEdgeIntCoeffs );
1750 for(
p = 1;
p < nEdgeIntCoeffs;
p+=2)
1769 "BasisType is not a boundary interior form");
1772 "BasisType is not a boundary interior form");
1775 "BasisType is not a boundary interior form");
1778 "local face id must be between 0 and 5");
1782 if(maparray.num_elements()!=nFaceIntCoeffs)
1787 if(signarray.num_elements() != nFaceIntCoeffs)
1793 fill( signarray.get() , signarray.get()+nFaceIntCoeffs, 1 );
1796 int nummodes [3] = {
m_base[0]->GetNumModes(),
1797 m_base[1]->GetNumModes(),
1798 m_base[2]->GetNumModes()};
1814 nummodesA = nummodes[0];
1815 nummodesB = nummodes[1];
1821 nummodesA = nummodes[0];
1822 nummodesB = nummodes[2];
1828 nummodesA = nummodes[1];
1829 nummodesB = nummodes[2];
1838 for(i = 0; i < (nummodesB-2); i++)
1840 for(j = 0; j < (nummodesA-2); j++)
1844 arrayindx[i*(nummodesA-2)+j] = i*(nummodesA-2)+j;
1848 arrayindx[i*(nummodesA-2)+j] = j*(nummodesB-2)+i;
1853 int IdxRange [3][2];
1875 IdxRange[2][0] = nummodes[2] - 1;
1876 IdxRange[2][1] = nummodes[2];
1894 IdxRange[2][0] = nummodes[2] - 2;
1902 IdxRange[2][1] = nummodes[2] - 1;
1909 IdxRange[2][1] = nummodes[2];
1914 for(i = 3; i < nummodes[2]; i+=2)
1938 IdxRange[1][0] = nummodes[1] - 1;
1939 IdxRange[1][1] = nummodes[1];
1957 IdxRange[1][0] = nummodes[1] - 2;
1965 IdxRange[1][1] = nummodes[1] - 1;
1972 IdxRange[1][1] = nummodes[1];
1977 for(i = 3; i < nummodes[1]; i+=2)
1991 IdxRange[1][0] = nummodes[1] - 2;
1999 IdxRange[1][1] = nummodes[1] - 1;
2006 IdxRange[1][1] = nummodes[1];
2011 for(i = 3; i < nummodes[1]; i+=2)
2033 IdxRange[0][0] = nummodes[0] - 1;
2034 IdxRange[0][1] = nummodes[0];
2051 IdxRange[0][0] = nummodes[0] - 2;
2059 IdxRange[0][1] = nummodes[0] - 1;
2066 IdxRange[0][1] = nummodes[0];
2071 for(i = 3; i < nummodes[0]; i+=2)
2083 for(r = IdxRange[2][0]; r != IdxRange[2][1]; r+=Incr[2])
2085 for(q = IdxRange[1][0]; q != IdxRange[1][1]; q+=Incr[1])
2087 for(
p = IdxRange[0][0];
p != IdxRange[0][1];
p+=Incr[0])
2089 maparray [ arrayindx[cnt ] ]
2090 = r*nummodes[0]*nummodes[1] + q*nummodes[0] +
p;
2091 signarray[ arrayindx[cnt++] ]
2092 = sign0[
p] * sign1[q] * sign2[r];
2106 "BasisType is not a boundary interior form");
2109 "BasisType is not a boundary interior form");
2112 "BasisType is not a boundary interior form");
2115 int nummodes [3] = {
m_base[0]->GetNumModes(),
2116 m_base[1]->GetNumModes(),
2117 m_base[2]->GetNumModes()};
2121 if(outarray.num_elements() != nIntCoeffs)
2135 for(i = 0; i < 3; i++)
2140 IntIdx[i][1] = nummodes[i];
2145 IntIdx[i][1] = nummodes[i]-1;
2149 for(r = IntIdx[2][0]; r < IntIdx[2][1]; r++)
2151 for( q = IntIdx[1][0]; q < IntIdx[1][1]; q++)
2153 for(
p = IntIdx[0][0];
p < IntIdx[0][1];
p++)
2155 outarray[cnt++] = r*nummodes[0]*nummodes[1] +
2170 "BasisType is not a boundary interior form");
2173 "BasisType is not a boundary interior form");
2176 "BasisType is not a boundary interior form");
2179 int nummodes [3] = {
m_base[0]->GetNumModes(),
2180 m_base[1]->GetNumModes(),
2181 m_base[2]->GetNumModes()};
2185 if(outarray.num_elements()!=nBndCoeffs)
2200 for(i = 0; i < 3; i++)
2208 IntIdx[i][1] = nummodes[i];
2212 BndIdx[i][1] = nummodes[i]-1;
2214 IntIdx[i][1] = nummodes[i]-1;
2219 for(i = 0; i < 2; i++)
2222 for( q = 0; q < nummodes[1]; q++)
2224 for(
p = 0;
p < nummodes[0];
p++)
2226 outarray[cnt++] = r*nummodes[0]*nummodes[1]+q*nummodes[0] +
p;
2231 for(r = IntIdx[2][0]; r < IntIdx[2][1]; r++)
2233 for( i = 0; i < 2; i++)
2236 for(
p = 0;
p < nummodes[0];
p++)
2238 outarray[cnt++] = r*nummodes[0]*nummodes[1] +
2243 for( q = IntIdx[1][0]; q < IntIdx[1][1]; q++)
2245 for( i = 0; i < 2; i++)
2248 outarray[cnt++] = r*nummodes[0]*nummodes[1] +
2254 sort(outarray.get(), outarray.get() + nBndCoeffs);
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);
2342 int nquad0 =
m_base[0]->GetNumPoints();
2343 int nquad1 =
m_base[1]->GetNumPoints();
2344 int nquad2 =
m_base[2]->GetNumPoints();
2345 int nq01 = nquad0*nquad1;
2346 int nq12 = nquad1*nquad2;
2352 for(i = 0; i < nq12; ++i)
2355 w0.get(), 1, outarray.get()+i*nquad0,1);
2358 for(i = 0; i < nq12; ++i)
2360 Vmath::Smul(nquad0, w1[i%nquad1], outarray.get()+i*nquad0, 1,
2361 outarray.get()+i*nquad0, 1);
2364 for(i = 0; i < nquad2; ++i)
2366 Vmath::Smul(nq01, w2[i], outarray.get()+i*nq01, 1,
2367 outarray.get()+i*nq01, 1);
2375 int qa =
m_base[0]->GetNumPoints();
2376 int qb =
m_base[1]->GetNumPoints();
2377 int qc =
m_base[2]->GetNumPoints();
2378 int nmodes_a =
m_base[0]->GetNumModes();
2379 int nmodes_b =
m_base[1]->GetNumModes();
2380 int nmodes_c =
m_base[2]->GetNumModes();
2395 OrthoExp.
FwdTrans(array,orthocoeffs);
2405 for(
int i = 0; i < nmodes_a; ++i)
2407 for(
int j = 0; j < nmodes_b; ++j)
2410 pow((1.0*i)/(nmodes_a-1),cutoff*nmodes_a),
2411 pow((1.0*j)/(nmodes_b-1),cutoff*nmodes_b));
2413 for(
int k = 0; k < nmodes_c; ++k)
2416 pow((1.0*k)/(nmodes_c-1),cutoff*nmodes_c));
2419 *= SvvDiffCoeff * fac;
2435 max_abc = max(max_abc,0);
2438 for(
int i = 0; i < nmodes_a; ++i)
2440 for(
int j = 0; j < nmodes_b; ++j)
2442 int maxij = max(i,j);
2444 for(
int k = 0; k < nmodes_c; ++k)
2446 int maxijk = max(maxij,k);
2449 orthocoeffs[cnt] *= SvvDiffCoeff *
2462 int nmodes = max(nmodes_a,nmodes_b);
2463 nmodes = max(nmodes,nmodes_c);
2466 for(j = cutoff; j < nmodes; ++j)
2468 fac[j] = fabs((j-nmodes)/((
NekDouble) (j-cutoff+1.0)));
2472 for(i = 0; i < nmodes_a; ++i)
2474 for(j = 0; j < nmodes_b; ++j)
2476 for(k = 0; k < nmodes_c; ++k)
2478 if((i >= cutoff)||(j >= cutoff)||(k >= cutoff))
2480 orthocoeffs[i*nmodes_a*nmodes_b +
2482 (SvvDiffCoeff*exp(-(fac[i]+fac[j]+fac[k])));
2486 orthocoeffs[i*nmodes_a*nmodes_b + j*nmodes_c + k] *= 0.0;
2494 OrthoExp.
BwdTrans(orthocoeffs,array);
2504 int qa =
m_base[0]->GetNumPoints();
2505 int qb =
m_base[1]->GetNumPoints();
2506 int qc =
m_base[2]->GetNumPoints();
2507 int nmodesA =
m_base[0]->GetNumModes();
2508 int nmodesB =
m_base[1]->GetNumModes();
2509 int nmodesC =
m_base[2]->GetNumModes();
2510 int P = nmodesA - 1;
2511 int Q = nmodesB - 1;
2512 int R = nmodesC - 1;
2525 int Pcut = cutoff*
P;
2526 int Qcut = cutoff*Q;
2527 int Rcut = cutoff*R;
2531 OrthoExp.
FwdTrans(array,orthocoeffs);
2536 for(
int i = 0; i < nmodesA; ++i)
2538 for(
int j = 0; j < nmodesB; ++j)
2540 for(
int k = 0; k < nmodesC; ++k, ++index)
2543 if(i > Pcut || j > Qcut || k > Rcut)
2548 fac = max( max(fac1, fac2), fac3);
2549 fac = pow(fac, exponent);
2550 orthocoeffs[index] *= exp(-alpha*fac);
2557 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)
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)
LibUtilities::BasisType GetEdgeBasisType(const int i) const
This function returns the type of expansion basis on the i-th edge.
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
int GetFaceIntNcoeffs(const int i) const
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.
int GetEdgeNcoeffs(const int i) const
This function returns the number of expansion coefficients belonging to the i-th edge.
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 int v_GetNfaces() const
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_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdMatrixKey &mkey)
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_GetTotalEdgeIntNcoeffs() const
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 void v_GetEdgeInteriorMap(const int eid, const Orientation edgeOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
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_GetFaceInteriorMap(const int fid, const Orientation faceOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
virtual void v_IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual int v_GetTotalFaceIntNcoeffs() const
virtual int v_GetVertexMap(int localVertexId, bool useCoeffPacking=false)
virtual int v_GetNverts() const
virtual int v_GetFaceIntNcoeffs(const int i) const
virtual void v_MassMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
virtual const LibUtilities::BasisKey v_DetFaceBasisKey(const int i, const int k) const
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_GetNedges() const
virtual void v_GetCoords(Array< OneD, NekDouble > &coords_x, Array< OneD, NekDouble > &coords_y, Array< OneD, NekDouble > &coords_z)
virtual void v_GetFaceNumModes(const int fid, const Orientation faceOrient, int &numModes0, int &numModes1)
virtual void v_LaplacianMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
virtual bool v_IsBoundaryInteriorExpansion()
virtual void v_GetFaceToElementMap(const int fid, const Orientation faceOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, int nummodesA=-1, int nummodesB=-1)
virtual LibUtilities::PointsKey v_GetFacePointsKey(const int i, const int j) const
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 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 int v_GetFaceNcoeffs(const int i) const
virtual LibUtilities::BasisType v_GetEdgeBasisType(const int i) const
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)
virtual int v_GetFaceNumPoints(const int i) const
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 A[m x n], B[n x k], C[m x k].
@ 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 .
@ 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
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*y.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)