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(mode2 == (
int)floor((1.0*mode)/(btmp0*btmp1)),
637 "Integer Truncation not Equiv to Floor");
638 ASSERTL2(mode1 == (
int)floor((1.0*mode-mode2*btmp0*btmp1)
640 "Integer Truncation not Equiv to Floor");
642 "calling argument mode is larger than total expansion " 645 for(i = 0; i < nquad1*nquad2; ++i)
648 &outarray[0]+i*nquad0, 1);
651 for(j = 0; j < nquad2; ++j)
653 for(i = 0; i < nquad0; ++i)
656 &outarray[0]+i+j*nquad0*nquad1, nquad0,
657 &outarray[0]+i+j*nquad0*nquad1, nquad0);
661 for(i = 0; i < nquad2; i++)
664 &outarray[0]+i*nquad0*nquad1,1);
697 "BasisType is not a boundary interior form");
700 "BasisType is not a boundary interior form");
703 "BasisType is not a boundary interior form");
705 int nmodes0 =
m_base[0]->GetNumModes();
706 int nmodes1 =
m_base[1]->GetNumModes();
707 int nmodes2 =
m_base[2]->GetNumModes();
709 return ( 2*( nmodes0*nmodes1 + nmodes0*nmodes2
711 - 4*( nmodes0 + nmodes1 + nmodes2 ) + 8 );
718 "BasisType is not a boundary interior form");
721 "BasisType is not a boundary interior form");
724 "BasisType is not a boundary interior form");
726 int nmodes0 =
m_base[0]->GetNumModes();
727 int nmodes1 =
m_base[1]->GetNumModes();
728 int nmodes2 =
m_base[2]->GetNumModes();
730 return 2*( nmodes0*nmodes1 + nmodes0*nmodes2
736 ASSERTL2((i >= 0)&&(i <= 11),
"edge id is out of range");
738 if((i == 0)||(i == 2)||(i == 8)||(i == 10))
742 else if((i == 1)||(i == 3)||(i == 9)||(i == 11))
760 ASSERTL2((i >= 0) && (i <= 5),
"face id is out of range");
761 if((i == 0) || (i == 5))
765 else if((i == 1) || (i == 3))
778 ASSERTL2((i >= 0) && (i <= 5),
"face id is out of range");
779 if((i == 0) || (i == 5))
783 else if((i == 1) || (i == 3))
803 ASSERTL2(i >= 0 && i <= 5,
"face id is out of range");
805 if (i == 0 || i == 5)
807 return m_base[0]->GetNumPoints()*
808 m_base[1]->GetNumPoints();
810 else if (i == 1 || i == 3)
812 return m_base[0]->GetNumPoints()*
813 m_base[2]->GetNumPoints();
817 return m_base[1]->GetNumPoints()*
818 m_base[2]->GetNumPoints();
823 const int i,
const int j)
const 825 ASSERTL2(i >= 0 && i <= 5,
"face id is out of range");
826 ASSERTL2(j == 0 || j == 1,
"face direction is out of range");
828 if (i == 0 || i == 5)
830 return m_base[j]->GetPointsKey();
832 else if (i == 1 || i == 3)
834 return m_base[2*j]->GetPointsKey();
838 return m_base[j+1]->GetPointsKey();
844 int nmodes = nummodes[modes_offset]*nummodes[modes_offset+1]*nummodes[modes_offset+2];
852 const int i,
const int k)
const 854 ASSERTL2(i >= 0 && i <= 5,
"face id is out of range");
855 ASSERTL2(k >= 0 && k <= 1,
"basis key id is out of range");
877 m_base[dir]->GetNumModes());
882 ASSERTL2((i >= 0)&&(i <= 11),
"edge id is out of range");
884 if((i == 0)||(i == 2)||(i==8)||(i==10))
888 else if((i == 1)||(i == 3)||(i == 9)||(i == 11))
911 for(
int k = 0; k < Qz; ++k ) {
912 for(
int j = 0; j < Qy; ++j ) {
913 for(
int i = 0; i < Qx; ++i ) {
914 int s = i + Qx*(j + Qy*k);
930 int nummodes [3] = {
m_base[0]->GetNumModes(),
932 m_base[2]->GetNumModes()};
938 numModes0 = nummodes[0];
939 numModes1 = nummodes[1];
945 numModes0 = nummodes[0];
946 numModes1 = nummodes[2];
952 numModes0 = nummodes[1];
953 numModes1 = nummodes[2];
965 std::swap(numModes0, numModes1);
981 int nummodesA=0, nummodesB=0;
985 "Method only implemented if BasisType is indentical in " 989 "Method only implemented for Modified_A or GLL_Lagrange BasisType");
991 const int nummodes0 =
m_base[0]->GetNumModes();
992 const int nummodes1 =
m_base[1]->GetNumModes();
993 const int nummodes2 =
m_base[2]->GetNumModes();
999 nummodesA = nummodes0;
1000 nummodesB = nummodes1;
1004 nummodesA = nummodes0;
1005 nummodesB = nummodes2;
1009 nummodesA = nummodes1;
1010 nummodesB = nummodes2;
1013 ASSERTL0(
false,
"fid must be between 0 and 5");
1016 bool CheckForZeroedModes =
false;
1024 if((P != nummodesA)||(Q != nummodesB))
1026 CheckForZeroedModes =
true;
1030 int nFaceCoeffs = P*Q;
1032 if(maparray.num_elements() != nFaceCoeffs)
1037 if(signarray.num_elements() != nFaceCoeffs)
1043 fill( signarray.get() , signarray.get()+nFaceCoeffs, 1 );
1048 for(i = 0; i < Q; i++)
1050 for(j = 0; j <
P; j++)
1054 arrayindx[i*P+j] = i*P+j;
1058 arrayindx[i*P+j] = j*Q+i;
1073 offset = nummodes0*nummodes1;
1077 offset = (nummodes2-1)*nummodes0*nummodes1;
1095 offset = nummodes0*(nummodes1-1);
1096 jump1 = nummodes0*nummodes1;
1102 jump1 = nummodes0*nummodes1;
1113 offset = nummodes0-1;
1114 jump1 = nummodes0*nummodes1;
1122 jump1 = nummodes0*nummodes1;
1127 ASSERTL0(
false,
"fid must be between 0 and 5");
1130 for(i = 0; i < Q; i++)
1132 for(j = 0; j <
P; j++)
1134 maparray[ arrayindx[i*P+j] ]
1135 = i*jump1 + j*jump2 + offset;
1140 if(CheckForZeroedModes)
1146 for(i = 0; i < nummodesB; i++)
1148 for(j = nummodesA; j <
P; j++)
1150 signarray[arrayindx[i*P+j]] = 0.0;
1151 maparray[arrayindx[i*P+j]] = maparray[0];
1155 for(i = nummodesB; i < Q; i++)
1157 for(j = 0; j <
P; j++)
1159 signarray[arrayindx[i*P+j]] = 0.0;
1160 maparray[arrayindx[i*P+j]] = maparray[0];
1166 ASSERTL0(
false,
"Different trace space face dimention and element face dimention not possible for GLL-Lagrange bases");
1179 for(i = 3; i < Q; i+=2)
1181 for(j = 0; j <
P; j++)
1183 signarray[ arrayindx[i*P+j] ] *= -1;
1187 for(i = 0; i <
P; i++)
1189 swap( maparray[i] , maparray[i+P] );
1190 swap( signarray[i] , signarray[i+P] );
1196 for(i = 0; i <
P; i++)
1198 for(j = 0; j < Q/2; j++)
1200 swap( maparray[i + j*P],
1203 swap( signarray[i + j*P],
1214 for(i = 0; i < Q; i++)
1216 for(j = 3; j <
P; j+=2)
1218 signarray[ arrayindx[i*P+j] ] *= -1;
1222 for(i = 0; i < Q; i++)
1224 swap( maparray[i] , maparray[i+Q] );
1225 swap( signarray[i] , signarray[i+Q] );
1231 for(i = 0; i <
P; i++)
1233 for(j = 0; j < Q/2; j++)
1235 swap( maparray[i*Q + j],
1236 maparray[i*Q + Q -1 -j]);
1237 swap( signarray[i*Q + j],
1238 signarray[i*Q + Q -1 -j]);
1254 for(i = 0; i < Q; i++)
1256 for(j = 3; j <
P; j+=2)
1258 signarray[ arrayindx[i*P+j] ] *= -1;
1262 for(i = 0; i < Q; i++)
1264 swap( maparray[i*P],
1266 swap( signarray[i*P],
1272 for(i = 0; i < Q; i++)
1274 for(j = 0; j < P/2; j++)
1276 swap( maparray[i*P + j],
1277 maparray[i*P + P -1 -j]);
1278 swap( signarray[i*P + j],
1279 signarray[i*P + P -1 -j]);
1291 for(i = 3; i < Q; i+=2)
1293 for(j = 0; j <
P; j++)
1295 signarray[ arrayindx[i*P+j] ] *= -1;
1299 for(i = 0; i <
P; i++)
1301 swap( maparray[i*Q],
1303 swap( signarray[i*Q],
1309 for(i = 0; i < Q; i++)
1311 for(j = 0; j < P/2; j++)
1313 swap( maparray[i + j*Q] ,
1314 maparray[i+P*Q - Q -j*Q] );
1315 swap( signarray[i + j*Q] ,
1316 signarray[i+P*Q - Q -j*Q] );
1337 "BasisType is not a boundary interior form");
1340 "BasisType is not a boundary interior form");
1343 "BasisType is not a boundary interior form");
1345 ASSERTL1((localVertexId>=0)&&(localVertexId<8),
1346 "local vertex id must be between 0 and 7");
1353 int nummodes [3] = {
m_base[0]->GetNumModes(),
1354 m_base[1]->GetNumModes(),
1355 m_base[2]->GetNumModes()};
1357 if(useCoeffPacking ==
true)
1359 if(localVertexId > 3)
1371 switch(localVertexId % 4)
1418 if( (localVertexId % 4) % 3 > 0 )
1431 if( localVertexId % 4 > 1 )
1444 if( localVertexId > 3)
1457 return r*nummodes[0]*nummodes[1] + q*nummodes[0] +
p;
1474 "BasisType is not a boundary interior form");
1477 "BasisType is not a boundary interior form");
1480 "BasisType is not a boundary interior form");
1483 "local edge id must be between 0 and 11");
1487 if(maparray.num_elements()!=nEdgeIntCoeffs)
1492 if(signarray.num_elements() != nEdgeIntCoeffs)
1498 fill( signarray.get() , signarray.get()+nEdgeIntCoeffs, 1 );
1501 int nummodes [3] = {
m_base[0]->GetNumModes(),
1502 m_base[1]->GetNumModes(),
1503 m_base[2]->GetNumModes()};
1509 bool reverseOrdering =
false;
1510 bool signChange =
false;
1512 int IdxRange [3][2] = {{0,0},{0,0},{0,0}};
1532 IdxRange[2][0] = nummodes[2] - 1;
1533 IdxRange[2][1] = nummodes[2];
1550 IdxRange[2][1] = nummodes[2] - 1;
1554 reverseOrdering =
true;
1560 IdxRange[2][1] = nummodes[2];
1589 IdxRange[1][0] = nummodes[1] - 1;
1590 IdxRange[1][1] = nummodes[1];
1605 IdxRange[1][1] = nummodes[1] - 1;
1609 reverseOrdering =
true;
1615 IdxRange[1][1] = nummodes[1];
1630 IdxRange[1][1] = nummodes[1] - 1;
1634 reverseOrdering =
true;
1640 IdxRange[1][1] = nummodes[1];
1669 IdxRange[0][0] = nummodes[0] - 1;
1670 IdxRange[0][1] = nummodes[0];
1685 IdxRange[0][1] = nummodes[0] - 1;
1689 reverseOrdering =
true;
1695 IdxRange[0][1] = nummodes[0];
1710 IdxRange[0][1] = nummodes[0] - 1;
1714 reverseOrdering =
true;
1720 IdxRange[0][1] = nummodes[0];
1734 for(r = IdxRange[2][0]; r < IdxRange[2][1]; r++)
1736 for(q = IdxRange[1][0]; q < IdxRange[1][1]; q++)
1738 for(p = IdxRange[0][0]; p < IdxRange[0][1]; p++)
1741 = r*nummodes[0]*nummodes[1] + q*nummodes[0] +
p;
1746 if( reverseOrdering )
1748 reverse( maparray.get() , maparray.get()+nEdgeIntCoeffs );
1753 for(p = 1; p < nEdgeIntCoeffs; p+=2)
1772 "BasisType is not a boundary interior form");
1775 "BasisType is not a boundary interior form");
1778 "BasisType is not a boundary interior form");
1781 "local face id must be between 0 and 5");
1785 if(maparray.num_elements()!=nFaceIntCoeffs)
1790 if(signarray.num_elements() != nFaceIntCoeffs)
1796 fill( signarray.get() , signarray.get()+nFaceIntCoeffs, 1 );
1799 int nummodes [3] = {
m_base[0]->GetNumModes(),
1800 m_base[1]->GetNumModes(),
1801 m_base[2]->GetNumModes()};
1817 nummodesA = nummodes[0];
1818 nummodesB = nummodes[1];
1824 nummodesA = nummodes[0];
1825 nummodesB = nummodes[2];
1831 nummodesA = nummodes[1];
1832 nummodesB = nummodes[2];
1841 for(i = 0; i < (nummodesB-2); i++)
1843 for(j = 0; j < (nummodesA-2); j++)
1847 arrayindx[i*(nummodesA-2)+j] = i*(nummodesA-2)+j;
1851 arrayindx[i*(nummodesA-2)+j] = j*(nummodesB-2)+i;
1856 int IdxRange [3][2];
1878 IdxRange[2][0] = nummodes[2] - 1;
1879 IdxRange[2][1] = nummodes[2];
1897 IdxRange[2][0] = nummodes[2] - 2;
1905 IdxRange[2][1] = nummodes[2] - 1;
1912 IdxRange[2][1] = nummodes[2];
1917 for(i = 3; i < nummodes[2]; i+=2)
1941 IdxRange[1][0] = nummodes[1] - 1;
1942 IdxRange[1][1] = nummodes[1];
1960 IdxRange[1][0] = nummodes[1] - 2;
1968 IdxRange[1][1] = nummodes[1] - 1;
1975 IdxRange[1][1] = nummodes[1];
1980 for(i = 3; i < nummodes[1]; i+=2)
1994 IdxRange[1][0] = nummodes[1] - 2;
2002 IdxRange[1][1] = nummodes[1] - 1;
2009 IdxRange[1][1] = nummodes[1];
2014 for(i = 3; i < nummodes[1]; i+=2)
2036 IdxRange[0][0] = nummodes[0] - 1;
2037 IdxRange[0][1] = nummodes[0];
2054 IdxRange[0][0] = nummodes[0] - 2;
2062 IdxRange[0][1] = nummodes[0] - 1;
2069 IdxRange[0][1] = nummodes[0];
2074 for(i = 3; i < nummodes[0]; i+=2)
2086 for(r = IdxRange[2][0]; r != IdxRange[2][1]; r+=Incr[2])
2088 for(q = IdxRange[1][0]; q != IdxRange[1][1]; q+=Incr[1])
2090 for(p = IdxRange[0][0]; p != IdxRange[0][1]; p+=Incr[0])
2092 maparray [ arrayindx[cnt ] ]
2093 = r*nummodes[0]*nummodes[1] + q*nummodes[0] +
p;
2094 signarray[ arrayindx[cnt++] ]
2095 = sign0[
p] * sign1[q] * sign2[r];
2109 "BasisType is not a boundary interior form");
2112 "BasisType is not a boundary interior form");
2115 "BasisType is not a boundary interior form");
2118 int nummodes [3] = {
m_base[0]->GetNumModes(),
2119 m_base[1]->GetNumModes(),
2120 m_base[2]->GetNumModes()};
2124 if(outarray.num_elements() != nIntCoeffs)
2138 for(i = 0; i < 3; i++)
2143 IntIdx[i][1] = nummodes[i];
2148 IntIdx[i][1] = nummodes[i]-1;
2152 for(r = IntIdx[2][0]; r < IntIdx[2][1]; r++)
2154 for( q = IntIdx[1][0]; q < IntIdx[1][1]; q++)
2156 for( p = IntIdx[0][0]; p < IntIdx[0][1]; p++)
2158 outarray[cnt++] = r*nummodes[0]*nummodes[1] +
2173 "BasisType is not a boundary interior form");
2176 "BasisType is not a boundary interior form");
2179 "BasisType is not a boundary interior form");
2182 int nummodes [3] = {
m_base[0]->GetNumModes(),
2183 m_base[1]->GetNumModes(),
2184 m_base[2]->GetNumModes()};
2188 if(outarray.num_elements()!=nBndCoeffs)
2203 for(i = 0; i < 3; i++)
2211 IntIdx[i][1] = nummodes[i];
2215 BndIdx[i][1] = nummodes[i]-1;
2217 IntIdx[i][1] = nummodes[i]-1;
2222 for(i = 0; i < 2; i++)
2225 for( q = 0; q < nummodes[1]; q++)
2227 for( p = 0; p < nummodes[0]; p++)
2229 outarray[cnt++] = r*nummodes[0]*nummodes[1]+q*nummodes[0] +
p;
2234 for(r = IntIdx[2][0]; r < IntIdx[2][1]; r++)
2236 for( i = 0; i < 2; i++)
2239 for( p = 0; p < nummodes[0]; p++)
2241 outarray[cnt++] = r*nummodes[0]*nummodes[1] +
2246 for( q = IntIdx[1][0]; q < IntIdx[1][1]; q++)
2248 for( i = 0; i < 2; i++)
2251 outarray[cnt++] = r*nummodes[0]*nummodes[1] +
2257 sort(outarray.get(), outarray.get() + nBndCoeffs);
2325 if(inarray.get() == outarray.get())
2331 m_ncoeffs, tmp.get(), 1, 0.0, outarray.get(), 1);
2336 m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
2345 int nquad0 =
m_base[0]->GetNumPoints();
2346 int nquad1 =
m_base[1]->GetNumPoints();
2347 int nquad2 =
m_base[2]->GetNumPoints();
2348 int nq01 = nquad0*nquad1;
2349 int nq12 = nquad1*nquad2;
2355 for(i = 0; i < nq12; ++i)
2358 w0.get(), 1, outarray.get()+i*nquad0,1);
2361 for(i = 0; i < nq12; ++i)
2363 Vmath::Smul(nquad0, w1[i%nquad1], outarray.get()+i*nquad0, 1,
2364 outarray.get()+i*nquad0, 1);
2367 for(i = 0; i < nquad2; ++i)
2369 Vmath::Smul(nq01, w2[i], outarray.get()+i*nq01, 1,
2370 outarray.get()+i*nq01, 1);
2378 int qa =
m_base[0]->GetNumPoints();
2379 int qb =
m_base[1]->GetNumPoints();
2380 int qc =
m_base[2]->GetNumPoints();
2381 int nmodes_a =
m_base[0]->GetNumModes();
2382 int nmodes_b =
m_base[1]->GetNumModes();
2383 int nmodes_c =
m_base[2]->GetNumModes();
2398 OrthoExp.
FwdTrans(array,orthocoeffs);
2408 for(
int i = 0; i < nmodes_a; ++i)
2410 for(
int j = 0; j < nmodes_b; ++j)
2413 pow((1.0*i)/(nmodes_a-1),cutoff*nmodes_a),
2414 pow((1.0*j)/(nmodes_b-1),cutoff*nmodes_b));
2416 for(
int k = 0; k < nmodes_c; ++k)
2419 pow((1.0*k)/(nmodes_c-1),cutoff*nmodes_c));
2422 *= SvvDiffCoeff * fac;
2438 max_abc = max(max_abc,0);
2441 for(
int i = 0; i < nmodes_a; ++i)
2443 for(
int j = 0; j < nmodes_b; ++j)
2445 int maxij = max(i,j);
2447 for(
int k = 0; k < nmodes_c; ++k)
2449 int maxijk = max(maxij,k);
2452 orthocoeffs[cnt] *= SvvDiffCoeff *
2465 int nmodes = max(nmodes_a,nmodes_b);
2466 nmodes = max(nmodes,nmodes_c);
2469 for(j = cutoff; j < nmodes; ++j)
2471 fac[j] = fabs((j-nmodes)/((
NekDouble) (j-cutoff+1.0)));
2475 for(i = 0; i < nmodes_a; ++i)
2477 for(j = 0; j < nmodes_b; ++j)
2479 for(k = 0; k < nmodes_c; ++k)
2481 if((i >= cutoff)||(j >= cutoff)||(k >= cutoff))
2483 orthocoeffs[i*nmodes_a*nmodes_b +
2485 (SvvDiffCoeff*exp(-(fac[i]+fac[j]+fac[k])));
2489 orthocoeffs[i*nmodes_a*nmodes_b + j*nmodes_c + k] *= 0.0;
2497 OrthoExp.
BwdTrans(orthocoeffs,array);
2507 int qa =
m_base[0]->GetNumPoints();
2508 int qb =
m_base[1]->GetNumPoints();
2509 int qc =
m_base[2]->GetNumPoints();
2510 int nmodesA =
m_base[0]->GetNumModes();
2511 int nmodesB =
m_base[1]->GetNumModes();
2512 int nmodesC =
m_base[2]->GetNumModes();
2513 int P = nmodesA - 1;
2514 int Q = nmodesB - 1;
2515 int R = nmodesC - 1;
2528 int Pcut = cutoff*
P;
2529 int Qcut = cutoff*Q;
2530 int Rcut = cutoff*R;
2534 OrthoExp.
FwdTrans(array,orthocoeffs);
2539 for(
int i = 0; i < nmodesA; ++i)
2541 for(
int j = 0; j < nmodesB; ++j)
2543 for(
int k = 0; k < nmodesC; ++k, ++index)
2546 if(i > Pcut || j > Qcut || k > Rcut)
2551 fac = max( max(fac1, fac2), fac3);
2552 fac = pow(fac, exponent);
2553 orthocoeffs[index] *= exp(-alpha*fac);
2560 OrthoExp.
BwdTrans(orthocoeffs,array);
virtual void v_GetInteriorMap(Array< OneD, unsigned int > &outarray)
virtual void v_LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
virtual DNekMatSharedPtr v_GenMatrix(const StdMatrixKey &mkey)
virtual void v_GetCoords(Array< OneD, NekDouble > &coords_x, Array< OneD, NekDouble > &coords_y, Array< OneD, NekDouble > &coords_z)
#define ASSERTL0(condition, msg)
virtual void v_HelmholtzMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
virtual int v_GetFaceNumPoints(const int i) const
virtual void v_IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Principle Modified Functions .
const int kSVVDGFiltermodesmax
void BwdTrans_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)
static Array< OneD, NekDouble > NullNekDouble1DArray
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
virtual void v_LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
void IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
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 NumBndryCoeffs(void) const
int GetBasisNumModes(const int dir) const
This function returns the number of expansion modes in the dir direction.
virtual int v_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...
virtual void v_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
void LaplacianMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
virtual void v_FillMode(const int mode, Array< OneD, NekDouble > &outarray)
virtual void v_GetBoundaryMap(Array< OneD, unsigned int > &outarray)
Principle Modified Functions .
virtual int v_CalcNumberOfCoefficients(const std::vector< unsigned int > &nummodes, int &modes_offset)
virtual const LibUtilities::BasisKey v_DetFaceBasisKey(const int i, const int k) const
virtual void v_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_GetFaceNumModes(const int fid, const Orientation faceOrient, int &numModes0, int &numModes1)
const int kSVVDGFiltermodesmin
virtual void v_MassMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
virtual void v_WeakDerivMatrixOp(const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
std::shared_ptr< DNekMat > DNekMatSharedPtr
static void Dgemm(const char &transa, const char &transb, const int &m, const int &n, const int &k, const double &alpha, const double *a, const int &lda, const double *b, const int &ldb, const double &beta, double *c, const int &ldc)
BLAS level 3: Matrix-matrix multiply C = A x B where A[m x n], B[n x k], C[m x k].
virtual bool v_IsBoundaryInteriorExpansion()
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 void v_GeneralMatrixOp_MatOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
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)
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
Principle Orthogonal Functions .
virtual LibUtilities::PointsKey v_GetFacePointsKey(const int i, const int j) const
virtual void v_IProductWRTDerivBase_MatOp(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
void PhysTensorDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray_d1, Array< OneD, NekDouble > &outarray_d2, Array< OneD, NekDouble > &outarray_d3)
Calculate the 3D derivative in the local tensor/collapsed coordinate at the physical points...
virtual void v_MultiplyByStdQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_GetEdgeInteriorMap(const int eid, const Orientation edgeOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
The base class for all shapes.
void IProductWRTBase_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)
int GetEdgeNcoeffs(const int i) const
This function returns the number of expansion coefficients belonging to the i-th edge.
virtual int v_NumBndryCoeffs() const
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
virtual int v_GetEdgeNcoeffs(const int i) const
LibUtilities::BasisKey EvaluateQuadFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
int GetFaceIntNcoeffs(const int i) const
virtual void v_LaplacianMatrixOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
Principle Modified Functions .
Class representing a hexehedral element in reference space.
virtual LibUtilities::BasisType v_GetEdgeBasisType(const int i) const
virtual void v_ExponentialFilter(Array< OneD, NekDouble > &array, const NekDouble alpha, const NekDouble exponent, const NekDouble cutoff)
virtual int v_GetFaceNcoeffs(const int i) const
virtual LibUtilities::ShapeType v_DetShapeType() const
void WeakDerivMatrixOp_MatFree(const int i, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
Principle Orthogonal Functions .
virtual void v_IProductWRTBase_MatOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
DNekMatSharedPtr CreateGeneralMatrix(const StdMatrixKey &mkey)
this function generates the mass matrix
Principle Orthogonal Functions .
Defines a specification for a set of points.
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 int v_GetTotalFaceIntNcoeffs() const
virtual void v_BwdTrans_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
static void Dgemv(const char &trans, const int &m, const int &n, const double &alpha, const double *a, const int &lda, const double *x, const int &incx, const double &beta, double *y, const int &incy)
BLAS level 2: Matrix vector multiply y = A x where A[m x n].
virtual int v_GetVertexMap(int localVertexId, bool useCoeffPacking=false)
NekDouble GetConstFactor(const ConstFactorType &factor) const
virtual void v_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdMatrixKey &mkey)
int GetNcoeffs(void) const
This function returns the total number of coefficients used in the expansion.
const NekDouble kSVVDGFilter[9][11]
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)
static void Dscal(const int &n, const double &alpha, double *x, const int &incx)
BLAS level 1: x = alpha x.
LibUtilities::PointsType GetPointsType(const int dir) const
This function returns the type of quadrature points used in the dir direction.
virtual void v_BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
bool ConstFactorExists(const ConstFactorType &factor) const
virtual void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed t...
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
void MassMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdMatrixKey &mkey)
virtual int v_GetNedges() const
virtual int v_GetTotalEdgeIntNcoeffs() const
void BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Backward transformation from coefficient space to physical space...
virtual int v_NumDGBndryCoeffs() const
virtual int v_GetNfaces() const
LibUtilities::NekManager< StdMatrixKey, DNekMat, StdMatrixKey::opLess > m_stdMatrixManager
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.
int GetTotPoints() const
This function returns the total number of quadrature points used in the element.
virtual void v_GetFaceInteriorMap(const int fid, const Orientation faceOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
virtual void v_HelmholtzMatrixOp_MatFree(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const StdRegions::StdMatrixKey &mkey)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
virtual int v_GetNverts() const
Array< OneD, LibUtilities::BasisSharedPtr > m_base
virtual DNekMatSharedPtr v_CreateStdMatrix(const StdMatrixKey &mkey)
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
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)
LibUtilities::BasisType GetEdgeBasisType(const int i) const
This function returns the type of expansion basis on the i-th edge.
virtual void v_IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multbyweights=true)
Describes the specification for a Basis.
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 BwdTrans_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
void FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Forward transformation from physical space to coefficient space...