36 #include <boost/core/ignore_unused.hpp> 46 StdTetExp::StdTetExp()
66 "order in 'a' direction is higher than order " 69 "order in 'a' direction is higher than order " 72 "order in 'b' direction is higher than order " 113 int Q0 =
m_base[0]->GetNumPoints();
114 int Q1 =
m_base[1]->GetNumPoints();
115 int Q2 =
m_base[2]->GetNumPoints();
123 bool Do_2 = (out_dxi2.num_elements() > 0)?
true:
false;
124 bool Do_1 = (out_dxi1.num_elements() > 0)?
true:
false;
141 eta_0 =
m_base[0]->GetZ();
142 eta_1 =
m_base[1]->GetZ();
143 eta_2 =
m_base[2]->GetZ();
149 for(
int k=0; k< Q2; ++k)
151 for(
int j=0; j<Q1; ++j,dEta0+=Q0)
153 Vmath::Smul(Q0,2.0/(1.0-eta_1[j]),dEta0,1,dEta0,1);
155 fac = 1.0/(1.0-eta_2[k]);
156 Vmath::Smul(Q0*Q1,fac,&out_dEta0[0]+k*Q0*Q1,1,&out_dEta0[0]+k*Q0*Q1,1);
159 if (out_dxi0.num_elements() > 0)
172 for(
int k = 0; k < Q1*Q2; ++k)
174 Vmath::Vmul(Q0,&Fac0[0],1,&out_dEta0[0]+k*Q0,1,&out_dEta0[0]+k*Q0,1);
177 for(
int k = 0; k < Q2; ++k)
179 Vmath::Smul(Q0*Q1,2.0/(1.0-eta_2[k]),&out_dEta1[0]+k*Q0*Q1,1,
180 &out_dEta1[0]+k*Q0*Q1,1);
187 Vmath::Vadd(Qtot,out_dEta0,1,out_dEta1,1,out_dxi1,1);
195 for(
int k=0; k< Q2; ++k)
197 for(
int j=0; j<Q1; ++j,dEta1+=Q0)
199 Vmath::Smul(Q0,(1.0+eta_1[j])/2.0,dEta1,1,dEta1,1);
206 Vmath::Vadd(Qtot,out_dEta0,1,out_dEta1,1,out_dxi2,1);
207 Vmath::Vadd(Qtot,out_dEta2,1,out_dxi2 ,1,out_dxi2,1);
246 ASSERTL1(
false,
"input dir is out of range");
300 "Basis[1] is not a general tensor type");
304 "Basis[2] is not a general tensor type");
307 &&
m_base[2]->Collocation())
312 inarray, 1, outarray, 1);
328 int nquad1 =
m_base[1]->GetNumPoints();
329 int nquad2 =
m_base[2]->GetNumPoints();
330 int order0 =
m_base[0]->GetNumModes();
331 int order1 =
m_base[1]->GetNumModes();
334 nquad2*nquad1*order0);
339 inarray,outarray,wsp,
364 bool doCheckCollDir0,
365 bool doCheckCollDir1,
366 bool doCheckCollDir2)
368 boost::ignore_unused(doCheckCollDir0, doCheckCollDir1,
371 int nquad0 =
m_base[0]->GetNumPoints();
372 int nquad1 =
m_base[1]->GetNumPoints();
373 int nquad2 =
m_base[2]->GetNumPoints();
375 int order0 =
m_base[0]->GetNumModes();
376 int order1 =
m_base[1]->GetNumModes();
377 int order2 =
m_base[2]->GetNumModes();
382 int i, j, mode, mode1, cnt;
385 mode = mode1 = cnt = 0;
386 for(i = 0; i < order0; ++i)
388 for(j = 0; j < order1-i; ++j, ++cnt)
391 1.0, base2.get()+mode*nquad2, nquad2,
392 inarray.get()+mode1, 1,
393 0.0, tmp.get()+cnt*nquad2, 1);
398 for(j = order1-i; j < order2-i; ++j)
410 Blas::Daxpy(nquad2,inarray[1],base2.get()+nquad2,1,
414 Blas::Daxpy(nquad2,inarray[1],base2.get()+nquad2,1,
415 &tmp[0]+order1*nquad2,1);
420 for(i = 0; i < order0; ++i)
423 1.0, base1.get()+mode*nquad1, nquad1,
424 tmp.get()+mode*nquad2, nquad2,
425 0.0, tmp1.get()+i*nquad1*nquad2, nquad1);
436 for(i = 0; i < nquad2; ++i)
438 Blas::Daxpy(nquad1,tmp[nquad2+i], base1.get()+nquad1,1,
439 &tmp1[nquad1*nquad2]+i*nquad1,1);
444 Blas::Dgemm(
'N',
'T', nquad0, nquad1*nquad2, order0,
445 1.0, base0.get(), nquad0,
446 tmp1.get(), nquad1*nquad2,
447 0.0, outarray.get(), nquad0);
513 "Basis[1] is not a general tensor type");
517 "Basis[2] is not a general tensor type");
519 if(
m_base[0]->Collocation() &&
m_base[1]->Collocation())
539 m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
552 bool multiplybyweights)
554 int nquad0 =
m_base[0]->GetNumPoints();
555 int nquad1 =
m_base[1]->GetNumPoints();
556 int nquad2 =
m_base[2]->GetNumPoints();
557 int order0 =
m_base[0]->GetNumModes();
558 int order1 =
m_base[1]->GetNumModes();
561 nquad2*order0*(2*order1-order0+1)/2);
563 if(multiplybyweights)
572 tmp, outarray, wsp,
true,
true,
true);
580 inarray, outarray, wsp,
true,
true,
true);
592 bool doCheckCollDir0,
593 bool doCheckCollDir1,
594 bool doCheckCollDir2)
596 boost::ignore_unused(doCheckCollDir0, doCheckCollDir1,
599 int nquad0 =
m_base[0]->GetNumPoints();
600 int nquad1 =
m_base[1]->GetNumPoints();
601 int nquad2 =
m_base[2]->GetNumPoints();
603 int order0 =
m_base[0]->GetNumModes();
604 int order1 =
m_base[1]->GetNumModes();
605 int order2 =
m_base[2]->GetNumModes();
610 int i,j, mode,mode1, cnt;
613 Blas::Dgemm(
'T',
'N', nquad1*nquad2, order0, nquad0,
614 1.0, inarray.get(), nquad0,
616 0.0, tmp1.get(), nquad1*nquad2);
619 for(mode=i=0; i < order0; ++i)
622 1.0, tmp1.get()+i*nquad1*nquad2, nquad1,
623 base1.get()+mode*nquad1, nquad1,
624 0.0, tmp2.get()+mode*nquad2, nquad2);
634 1.0, tmp1.get()+nquad1*nquad2, nquad1,
635 base1.get()+nquad1, 1,
636 1.0, tmp2.get()+nquad2, 1);
640 mode = mode1 = cnt = 0;
641 for(i = 0; i < order0; ++i)
643 for(j = 0; j < order1-i; ++j, ++cnt)
646 1.0, base2.get()+mode*nquad2, nquad2,
647 tmp2.get()+cnt*nquad2, 1,
648 0.0, outarray.get()+mode1, 1);
653 for(j = order1-i; j < order2-i; ++j)
664 outarray[1] +=
Blas::Ddot(nquad2,base2.get()+nquad2,1,
668 outarray[1] +=
Blas::Ddot(nquad2,base2.get()+nquad2,1,
669 &tmp2[nquad2*order1],1);
688 ASSERTL0((dir==0)||(dir==1)||(dir==2),
"input dir is out of range");
710 m_ncoeffs, inarray.get(), 1, 0.0, outarray.get(), 1);
726 int nquad0 =
m_base[0]->GetNumPoints();
727 int nquad1 =
m_base[1]->GetNumPoints();
728 int nquad2 =
m_base[2]->GetNumPoints();
729 int nqtot = nquad0*nquad1*nquad2;
730 int nmodes0 =
m_base[0]->GetNumModes();
731 int nmodes1 =
m_base[1]->GetNumModes();
732 int wspsize = nquad0 + nquad1 + nquad2 + max(nqtot,
m_ncoeffs)
733 + nquad1*nquad2*nmodes0 + nquad2*nmodes0*(2*nmodes1-nmodes0+1)/2;
746 for(i = 0; i < nquad0; ++i)
748 gfac0[i] = 0.5*(1+z0[i]);
752 for(i = 0; i < nquad1; ++i)
754 gfac1[i] = 2.0/(1-z1[i]);
758 for(i = 0; i < nquad2; ++i)
760 gfac2[i] = 2.0/(1-z2[i]);
764 for(i = 0; i < nquad1*nquad2; ++i)
766 Vmath::Smul(nquad0,gfac1[i%nquad1],&inarray[0]+i*nquad0,1,&tmp0[0]+i*nquad0,1);
768 for(i = 0; i < nquad2; ++i)
770 Vmath::Smul(nquad0*nquad1,gfac2[i],&tmp0[0]+i*nquad0*nquad1,1,&tmp0[0]+i*nquad0*nquad1,1);
790 for(i = 0; i < nquad1*nquad2; ++i)
792 Vmath::Vmul(nquad0,&gfac0[0],1,&tmp0[0]+i*nquad0,1,&tmp0[0]+i*nquad0,1);
801 for(i = 0; i < nquad2; ++i)
803 Vmath::Smul(nquad0*nquad1,gfac2[i],&inarray[0]+i*nquad0*nquad1,1,&tmp0[0]+i*nquad0*nquad1,1);
818 for(i = 0; i < nquad1; ++i)
820 gfac1[i] = (1+z1[i])/2;
823 for(i = 0; i < nquad1*nquad2; ++i)
825 Vmath::Vmul(nquad0,&gfac0[0],1,&tmp0[0]+i*nquad0,1,&tmp0[0]+i*nquad0,1);
833 for(i = 0; i < nquad2; ++i)
835 Vmath::Smul(nquad0*nquad1,gfac2[i],&inarray[0]+i*nquad0*nquad1,1,&tmp0[0]+i*nquad0*nquad1,1);
837 for(i = 0; i < nquad1*nquad2; ++i)
839 Vmath::Smul(nquad0,gfac1[i%nquad1],&tmp0[0]+i*nquad0,1,&tmp0[0]+i*nquad0,1);
861 ASSERTL1(
false,
"input dir is out of range");
898 eta[0] = 2.0*(1.0+xi[0])/(-xi[1]-xi[2]) - 1.0;
900 eta[1] = 2.0*(1.0+xi[1])/(1.0-xi[2]) - 1.0;
920 boost::ignore_unused(faceOrient);
922 int nummodes [3] = {
m_base[0]->GetNumModes(),
924 m_base[2]->GetNumModes()};
929 numModes0 = nummodes[0];
930 numModes1 = nummodes[1];
935 numModes0 = nummodes[0];
936 numModes1 = nummodes[2];
942 numModes0 = nummodes[1];
943 numModes1 = nummodes[2];
977 "BasisType is not a boundary interior form");
980 "BasisType is not a boundary interior form");
983 "BasisType is not a boundary interior form");
985 int P =
m_base[0]->GetNumModes();
986 int Q =
m_base[1]->GetNumModes();
987 int R =
m_base[2]->GetNumModes();
997 "BasisType is not a boundary interior form");
1000 "BasisType is not a boundary interior form");
1003 "BasisType is not a boundary interior form");
1005 int P =
m_base[0]->GetNumModes()-1;
1006 int Q =
m_base[1]->GetNumModes()-1;
1007 int R =
m_base[2]->GetNumModes()-1;
1010 return (Q+1) + P*(1 + 2*Q -
P)/2
1011 + (R+1) + P*(1 + 2*R -
P)/2
1012 + 2*(R+1) + Q*(1 + 2*R - Q);
1017 ASSERTL2((i >= 0) && (i <= 5),
"edge id is out of range");
1018 int P =
m_base[0]->GetNumModes();
1019 int Q =
m_base[1]->GetNumModes();
1020 int R =
m_base[2]->GetNumModes();
1026 else if (i == 1 || i == 2)
1038 int P =
m_base[0]->GetNumModes()-2;
1039 int Q =
m_base[1]->GetNumModes()-2;
1040 int R =
m_base[2]->GetNumModes()-2;
1047 ASSERTL2((i >= 0) && (i <= 3),
"face id is out of range");
1048 int nFaceCoeffs = 0;
1049 int nummodesA, nummodesB,
P, Q;
1055 else if ((i == 1) || (i == 2))
1067 nFaceCoeffs = Q+1 + (P*(1 + 2*Q -
P))/2;
1073 ASSERTL2((i >= 0) && (i <= 3),
"face id is out of range");
1074 int Pi =
m_base[0]->GetNumModes() - 2;
1075 int Qi =
m_base[1]->GetNumModes() - 2;
1076 int Ri =
m_base[2]->GetNumModes() - 2;
1080 return Pi * (2*Qi - Pi - 1) / 2;
1084 return Pi * (2*Ri - Pi - 1) / 2;
1088 return Qi * (2*Ri - Qi - 1) / 2;
1094 int Pi =
m_base[0]->GetNumModes() - 2;
1095 int Qi =
m_base[1]->GetNumModes() - 2;
1096 int Ri =
m_base[2]->GetNumModes() - 2;
1098 return Pi * (2*Qi - Pi - 1) / 2 +
1099 Pi * (2*Ri - Pi - 1) / 2 +
1100 Qi * (2*Ri - Qi - 1);
1105 ASSERTL2(i >= 0 && i <= 3,
"face id is out of range");
1109 return m_base[0]->GetNumPoints()*
1110 m_base[1]->GetNumPoints();
1114 return m_base[0]->GetNumPoints()*
1115 m_base[2]->GetNumPoints();
1119 return m_base[1]->GetNumPoints()*
1120 m_base[2]->GetNumPoints();
1125 const int i,
const int j)
const 1127 ASSERTL2(i >= 0 && i <= 3,
"face id is out of range");
1128 ASSERTL2(j == 0 || j == 1,
"face direction is out of range");
1132 return m_base[j]->GetPointsKey();
1136 return m_base[2*j]->GetPointsKey();
1140 return m_base[j+1]->GetPointsKey();
1145 const std::vector<unsigned int>& nummodes,
1149 nummodes[modes_offset],
1150 nummodes[modes_offset+1],
1151 nummodes[modes_offset+2]);
1158 const int i,
const int k)
const 1160 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
1161 ASSERTL2(k == 0 || k == 1,
"face direction out of range");
1181 m_base[dir]->GetNumModes());
1189 ASSERTL2(i >= 0 && i <= 5,
"edge id is out of range");
1195 else if (i == 1 || i == 2)
1219 for(
int k = 0; k < Qz; ++k ) {
1220 for(
int j = 0; j < Qy; ++j ) {
1221 for(
int i = 0; i < Qx; ++i ) {
1222 int s = i + Qx*(j + Qy*k);
1223 xi_x[s] = (eta_x[i] + 1.0) * (1.0 - eta_y[j]) * (1.0 - eta_z[k]) / 4 - 1.0;
1224 xi_y[s] = (eta_y[j] + 1.0) * (1.0 - eta_z[k]) / 2 - 1.0;
1250 boost::ignore_unused(P);
1252 ASSERTL2(eid >= 0 && eid < 6,
"Invalid edge");
1254 "Method only implemented for Modified_A BasisType (x " 1255 "direction), Modified_B BasisType (y direction), and " 1256 "Modified_C BasisType(z direction)");
1258 int edgeVerts[6][2] = {{0,1},{1,2},{0,2},{0,3},{1,3},{2,3}};
1261 if (maparray.num_elements() != nEdgeModes)
1266 if (signarray.num_elements() != nEdgeModes)
1283 ASSERTL2(
false,
"Unsupported edge orientation");
1290 for (
int i = 0; i < nEdgeModes-2; ++i)
1292 maparray[i+2] = tmp1[i];
1293 signarray[i+2] = tmp2[i];
1309 int nummodesA=0,nummodesB=0, i, j, k, idx;
1312 "Method only implemented for Modified_A BasisType (x " 1313 "direction), Modified_B BasisType (y direction), and " 1314 "Modified_C BasisType(z direction)");
1316 int nFaceCoeffs = 0;
1321 nummodesA =
m_base[0]->GetNumModes();
1322 nummodesB =
m_base[1]->GetNumModes();
1325 nummodesA =
m_base[0]->GetNumModes();
1326 nummodesB =
m_base[2]->GetNumModes();
1330 nummodesA =
m_base[1]->GetNumModes();
1331 nummodesB =
m_base[2]->GetNumModes();
1334 ASSERTL0(
false,
"fid must be between 0 and 3");
1337 bool CheckForZeroedModes =
false;
1345 CheckForZeroedModes =
true;
1348 nFaceCoeffs = P*(2*Q-P+1)/2;
1351 if(maparray.num_elements() != nFaceCoeffs)
1356 if(signarray.num_elements() != nFaceCoeffs)
1362 fill(signarray.get(),signarray.get()+nFaceCoeffs, 1 );
1369 for (i = 0; i <
P; ++i)
1371 for (j = 0; j < Q-i; ++j)
1373 if ((
int)faceOrient == 7 && i > 1)
1375 signarray[idx] = (i%2 ? -1 : 1);
1377 maparray[idx++] =
GetMode(i,j,0);
1383 for (i = 0; i <
P; ++i)
1385 for (k = 0; k < Q-i; ++k)
1387 if ((
int)faceOrient == 7 && i > 1)
1389 signarray[idx] = (i%2 ? -1: 1);
1391 maparray[idx++] =
GetMode(i,0,k);
1397 for (j = 0; j < P-1; ++j)
1399 for (k = 0; k < Q-1-j; ++k)
1401 if ((
int)faceOrient == 7 && j > 1)
1403 signarray[idx] = ((j+1)%2 ? -1: 1);
1405 maparray[idx++] =
GetMode(1,j,k);
1407 if (j == 0 && k == 0)
1409 maparray[idx++] =
GetMode(0,0,1);
1411 if (j == 0 && k == Q-2)
1413 for (
int r = 0; r < Q-1; ++r)
1415 maparray[idx++] =
GetMode(0,1,r);
1423 for (j = 0; j <
P; ++j)
1425 for (k = 0; k < Q-j; ++k)
1427 if ((
int)faceOrient == 7 && j > 1)
1429 signarray[idx] = (j%2 ? -1: 1);
1431 maparray[idx++] =
GetMode(0,j,k);
1436 ASSERTL0(
false,
"Element map not available.");
1439 if ((
int)faceOrient == 7)
1441 swap(maparray[0], maparray[Q]);
1443 for (i = 1; i < Q-1; ++i)
1445 swap(maparray[i+1], maparray[Q+i]);
1449 if(CheckForZeroedModes)
1454 for (j = 0; j < nummodesA; ++j)
1457 for (k = nummodesB-j; k < Q-j; ++k)
1459 signarray[idx] = 0.0;
1460 maparray[idx++] = maparray[0];
1464 for (j = nummodesA; j <
P; ++j)
1466 for (k = 0; k < Q-j; ++k)
1468 signarray[idx] = 0.0;
1469 maparray[idx++] = maparray[0];
1480 "Mapping not defined for this type of basis");
1483 if(useCoeffPacking ==
true)
1485 switch(localVertexId)
1509 ASSERTL0(
false,
"Vertex ID must be between 0 and 3");
1516 switch(localVertexId)
1540 ASSERTL0(
false,
"Vertex ID must be between 0 and 3");
1560 const int P =
m_base[0]->GetNumModes();
1561 const int Q =
m_base[1]->GetNumModes();
1562 const int R =
m_base[2]->GetNumModes();
1566 if(maparray.num_elements() != nEdgeIntCoeffs)
1572 fill( maparray.get(), maparray.get() + nEdgeIntCoeffs, 0);
1575 if(signarray.num_elements() != nEdgeIntCoeffs)
1581 fill( signarray.get() , signarray.get()+nEdgeIntCoeffs, 1 );
1587 for (i = 0; i < P-2; ++i)
1589 maparray[i] =
GetMode(i+2, 0, 0);
1593 for(i = 1; i < nEdgeIntCoeffs; i+=2)
1600 for (i = 0; i < Q-2; ++i)
1602 maparray[i] =
GetMode(1, i+1, 0);
1606 for(i = 1; i < nEdgeIntCoeffs; i+=2)
1613 for (i = 0; i < Q-2; ++i)
1615 maparray[i] =
GetMode(0, i+2, 0);
1619 for(i = 1; i < nEdgeIntCoeffs; i+=2)
1626 for (i = 0; i < R-2; ++i)
1628 maparray[i] =
GetMode(0, 0, i+2);
1632 for(i = 1; i < nEdgeIntCoeffs; i+=2)
1639 for (i = 0; i < R - 2; ++i)
1641 maparray[i] =
GetMode(1, 0, i+1);
1645 for(i = 1; i < nEdgeIntCoeffs; i+=2)
1652 for (i = 0; i < R-2; ++i)
1654 maparray[i] =
GetMode(0, 1, i+1);
1658 for(i = 1; i < nEdgeIntCoeffs; i+=2)
1665 ASSERTL0(
false,
"Edge not defined.");
1677 const int P =
m_base[0]->GetNumModes();
1678 const int Q =
m_base[1]->GetNumModes();
1679 const int R =
m_base[2]->GetNumModes();
1683 if(maparray.num_elements() != nFaceIntCoeffs)
1688 if(signarray.num_elements() != nFaceIntCoeffs)
1694 fill( signarray.get() , signarray.get()+nFaceIntCoeffs, 1 );
1701 for (i = 2; i < P-1; ++i)
1703 for (j = 1; j < Q-i; ++j)
1705 if ((
int)faceOrient == 7)
1707 signarray[idx] = (i%2 ? -1 : 1);
1709 maparray[idx++] =
GetMode(i,j,0);
1715 for (i = 2; i <
P; ++i)
1717 for (k = 1; k < R-i; ++k)
1719 if ((
int)faceOrient == 7)
1721 signarray[idx] = (i%2 ? -1: 1);
1723 maparray[idx++] =
GetMode(i,0,k);
1729 for (j = 1; j < Q-2; ++j)
1731 for (k = 1; k < R-1-j; ++k)
1733 if ((
int)faceOrient == 7)
1735 signarray[idx] = ((j+1)%2 ? -1: 1);
1737 maparray[idx++] =
GetMode(1,j,k);
1743 for (j = 2; j < Q-1; ++j)
1745 for (k = 1; k < R-j; ++k)
1747 if ((
int)faceOrient == 7)
1749 signarray[idx] = (j%2 ? -1: 1);
1751 maparray[idx++] =
GetMode(0,j,k);
1756 ASSERTL0(
false,
"Face interior map not available.");
1768 "BasisType is not a boundary interior form");
1771 "BasisType is not a boundary interior form");
1774 "BasisType is not a boundary interior form");
1776 int P =
m_base[0]->GetNumModes();
1777 int Q =
m_base[1]->GetNumModes();
1778 int R =
m_base[2]->GetNumModes();
1782 if(outarray.num_elements() != nIntCoeffs)
1788 for (
int i = 2; i < P-2; ++i)
1790 for (
int j = 1; j < Q-i-1; ++j)
1792 for (
int k = 1; k < R-i-j; ++k)
1794 outarray[idx++] =
GetMode(i,j,k);
1807 "BasisType is not a boundary interior form");
1810 "BasisType is not a boundary interior form");
1813 "BasisType is not a boundary interior form");
1815 int P =
m_base[0]->GetNumModes();
1816 int Q =
m_base[1]->GetNumModes();
1817 int R =
m_base[2]->GetNumModes();
1824 if (outarray.num_elements() != nBnd)
1829 for (i = 0; i <
P; ++i)
1834 for (j = 0; j < Q-i; j++)
1836 for (k = 0; k < R-i-j; ++k)
1838 outarray[idx++] =
GetMode(i,j,k);
1846 for (k = 0; k < R-i; ++k)
1848 outarray[idx++] =
GetMode(i,0,k);
1850 for (j = 1; j < Q-i; ++j)
1852 outarray[idx++] =
GetMode(i,j,0);
1873 int nq0 =
m_base[0]->GetNumPoints();
1874 int nq1 =
m_base[1]->GetNumPoints();
1875 int nq2 =
m_base[2]->GetNumPoints();
1885 nq = max(nq0,max(nq1,nq2));
1899 for(
int i = 0; i < nq; ++i)
1901 for(
int j = 0; j < nq-i; ++j)
1903 for(
int k = 0; k < nq-i-j; ++k,++cnt)
1906 coords[cnt][0] = -1.0 + 2*k/(
NekDouble)(nq-1);
1907 coords[cnt][1] = -1.0 + 2*j/(
NekDouble)(nq-1);
1908 coords[cnt][2] = -1.0 + 2*i/(
NekDouble)(nq-1);
1913 for(
int i = 0; i < neq; ++i)
1917 I[0] =
m_base[0]->GetI(coll);
1918 I[1] =
m_base[1]->GetI(coll+1);
1919 I[2] =
m_base[2]->GetI(coll+2);
1923 for(
int k = 0; k < nq2; ++k)
1925 for (
int j = 0; j < nq1; ++j)
1928 fac = (I[1]->GetPtr())[j]*(I[2]->GetPtr())[k];
1983 const int Q =
m_base[1]->GetNumModes();
1984 const int R =
m_base[2]->GetNumModes();
1986 int i,j,q_hat,k_hat;
1990 for (i = 0; i < I; ++i)
1995 k_hat = max(R-Q-i,0);
1996 cnt += q_hat*(q_hat+1)/2 + k_hat*Q;
2001 for (j = 0; j < J; ++j)
2019 int nquad0 =
m_base[0]->GetNumPoints();
2020 int nquad1 =
m_base[1]->GetNumPoints();
2021 int nquad2 =
m_base[2]->GetNumPoints();
2031 for(i = 0; i < nquad1*nquad2; ++i)
2034 w0.get(),1, &outarray[0]+i*nquad0,1);
2041 for(j = 0; j < nquad2; ++j)
2043 for(i = 0; i < nquad1; ++i)
2045 Blas::Dscal(nquad0,0.5*w1[i], &outarray[0]+i*nquad0+
2052 for(j = 0; j < nquad2; ++j)
2054 for(i = 0; i < nquad1; ++i)
2057 0.5*(1-z1[i])*w1[i],
2058 &outarray[0]+i*nquad0 + j*nquad0*nquad1,
2069 for(i = 0; i < nquad2; ++i)
2072 &outarray[0]+i*nquad0*nquad1, 1);
2077 for(i = 0; i < nquad2; ++i)
2080 &outarray[0]+i*nquad0*nquad1, 1);
2084 for(i = 0; i < nquad2; ++i)
2086 Blas::Dscal(nquad0*nquad1,0.25*(1-z2[i])*(1-z2[i])*w2[i],
2087 &outarray[0]+i*nquad0*nquad1,1);
2104 int qa =
m_base[0]->GetNumPoints();
2105 int qb =
m_base[1]->GetNumPoints();
2106 int qc =
m_base[2]->GetNumPoints();
2107 int nmodes_a =
m_base[0]->GetNumModes();
2108 int nmodes_b =
m_base[1]->GetNumModes();
2109 int nmodes_c =
m_base[2]->GetNumModes();
2127 OrthoExp.
FwdTrans(array,orthocoeffs);
2137 for(
int i = 0; i < nmodes_a; ++i)
2139 for(
int j = 0; j < nmodes_b-j; ++j)
2142 pow((1.0*i)/(nmodes_a-1),cutoff*nmodes_a),
2143 pow((1.0*j)/(nmodes_b-1),cutoff*nmodes_b));
2145 for(
int k = 0; k < nmodes_c-i-j; ++k)
2148 pow((1.0*k)/(nmodes_c-1),cutoff*nmodes_c));
2150 orthocoeffs[cnt] *= SvvDiffCoeff * fac;
2166 max_abc = max(max_abc,0);
2169 for(
int i = 0; i < nmodes_a; ++i)
2171 for(
int j = 0; j < nmodes_b-j; ++j)
2173 int maxij = max(i,j);
2175 for(
int k = 0; k < nmodes_c-i-j; ++k)
2177 int maxijk = max(maxij,k);
2180 orthocoeffs[cnt] *= SvvDiffCoeff *
2198 int cutoff_a = (int) (SVVCutOff*nmodes_a);
2199 int cutoff_b = (int) (SVVCutOff*nmodes_b);
2200 int cutoff_c = (int) (SVVCutOff*nmodes_c);
2201 int nmodes = min(min(nmodes_a,nmodes_b),nmodes_c);
2202 NekDouble cutoff = min(min(cutoff_a,cutoff_b),cutoff_c);
2207 for(i = 0; i < nmodes_a; ++i)
2209 for(j = 0; j < nmodes_b-i; ++j)
2211 for(k = 0; k < nmodes_c-i-j; ++k)
2213 if(i + j + k >= cutoff)
2215 orthocoeffs[cnt] *= ((SvvDiffCoeff)*exp(-(i+j+k-nmodes)*(i+j+k-nmodes)/((
NekDouble)((i+j+k-cutoff+epsilon)*(i+j+k-cutoff+epsilon)))));
2219 orthocoeffs[cnt] *= 0.0;
2228 OrthoExp.
BwdTrans(orthocoeffs,array);
2237 int nquad0 =
m_base[0]->GetNumPoints();
2238 int nquad1 =
m_base[1]->GetNumPoints();
2239 int nquad2 =
m_base[2]->GetNumPoints();
2240 int nqtot = nquad0 * nquad1 * nquad2;
2241 int nmodes0 =
m_base[0]->GetNumModes();
2242 int nmodes1 =
m_base[1]->GetNumModes();
2243 int nmodes2 =
m_base[2]->GetNumModes();
2244 int numMax = nmodes0;
2272 OrthoTetExp->FwdTrans(phys_tmp, coeff);
2278 for (
int u = 0; u < numMin; ++u)
2280 for (
int i = 0; i < numMin-u; ++i)
2283 tmp2 = coeff_tmp1 + cnt, 1);
2284 cnt += numMax - u - i;
2286 for (
int i = numMin; i < numMax-u; ++i)
2288 cnt += numMax - u - i;
2292 OrthoTetExp->BwdTrans(coeff_tmp1,phys_tmp);
2301 boost::ignore_unused(standard);
2303 int np0 =
m_base[0]->GetNumPoints();
2304 int np1 =
m_base[1]->GetNumPoints();
2305 int np2 =
m_base[2]->GetNumPoints();
2306 int np = max(np0,max(np1,np2));
2318 for(
int i = 0; i < np-1; ++i)
2320 planep1 += (np-i)*(np-i+1)/2;
2325 for(
int j = 0; j < np-i-1; ++j)
2329 for(
int k = 0; k < np-i-j-2; ++k)
2331 conn[cnt++] = plane + row +k+1;
2332 conn[cnt++] = plane + row +k;
2333 conn[cnt++] = plane + rowp1 +k;
2334 conn[cnt++] = planep1 + row1 +k;
2336 conn[cnt++] = plane + row +k+1;
2337 conn[cnt++] = plane + rowp1 +k+1;
2338 conn[cnt++] = planep1 + row1 +k+1;
2339 conn[cnt++] = planep1 + row1 +k;
2341 conn[cnt++] = plane + rowp1 +k+1;
2342 conn[cnt++] = plane + row +k+1;
2343 conn[cnt++] = plane + rowp1 +k;
2344 conn[cnt++] = planep1 + row1 +k;
2346 conn[cnt++] = planep1 + row1 +k;
2347 conn[cnt++] = planep1 + row1p1+k;
2348 conn[cnt++] = plane + rowp1 +k;
2349 conn[cnt++] = plane + rowp1 +k+1;
2351 conn[cnt++] = planep1 + row1 +k;
2352 conn[cnt++] = planep1 + row1p1+k;
2353 conn[cnt++] = planep1 + row1 +k+1;
2354 conn[cnt++] = plane + rowp1 +k+1;
2358 conn[cnt++] = plane + rowp1 +k+1;
2359 conn[cnt++] = planep1 + row1p1 +k+1;
2360 conn[cnt++] = planep1 + row1 +k+1;
2361 conn[cnt++] = planep1 + row1p1 +k;
2365 conn[cnt++] = plane + row + np-i-j-1;
2366 conn[cnt++] = plane + row + np-i-j-2;
2367 conn[cnt++] = plane + rowp1 + np-i-j-2;
2368 conn[cnt++] = planep1 + row1 + np-i-j-2;
2373 plane += (np-i)*(np-i+1)/2;
int GetMode(const int i, const int j, const int k)
Compute the mode number in the expansion for a particular tensorial combination.
#define ASSERTL0(condition, msg)
virtual DNekMatSharedPtr v_GenMatrix(const StdMatrixKey &mkey)
virtual LibUtilities::PointsKey v_GetFacePointsKey(const int i, const int j) const
virtual int v_GetEdgeNcoeffs(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)
Principle Modified Functions .
const int kSVVDGFiltermodesmax
virtual void v_GetSimplexEquiSpacedConnectivity(Array< OneD, int > &conn, bool standard=true)
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
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
virtual int v_GetNedges() const
int GetBasisNumModes(const int dir) const
This function returns the number of expansion modes in the dir direction.
virtual int v_GetNverts() const
virtual int v_GetTotalEdgeIntNcoeffs() const
virtual int v_GetNfaces() const
virtual LibUtilities::ShapeType v_DetShapeType() const
LibUtilities::BasisKey EvaluateTriFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
Principle Modified Functions .
virtual void v_LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
virtual void v_GetCoords(Array< OneD, NekDouble > &coords_x, Array< OneD, NekDouble > &coords_y, Array< OneD, NekDouble > &coords_z)
virtual void v_IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)
void LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
Convert local cartesian coordinate xi into local collapsed coordinates eta.
virtual const LibUtilities::BasisKey v_DetFaceBasisKey(const int i, const int k) const
LibUtilities::ShapeType DetShapeType() const
virtual void v_PhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_dx, Array< OneD, NekDouble > &out_dy, Array< OneD, NekDouble > &out_dz)
Calculate the derivative of the physical points.
const int kSVVDGFiltermodesmin
std::shared_ptr< DNekMat > DNekMatSharedPtr
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)
MatrixType GetMatrixType() const
int getNumberOfCoefficients(int Na, int Nb, int Nc)
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 int v_CalcNumberOfCoefficients(const std::vector< unsigned int > &nummodes, int &modes_offset)
virtual void v_GetEdgeInteriorMap(const int eid, const Orientation edgeOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
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_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
std::shared_ptr< StdTetExp > StdTetExpSharedPtr
Gauss Radau pinned at x=-1, .
Principle Orthogonal Functions .
virtual void v_FillMode(const int mode, Array< OneD, NekDouble > &outarray)
virtual int v_NumBndryCoeffs() const
virtual int v_GetFaceNumPoints(const int i) const
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.
void IProductWRTBase_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)
static const NekDouble kNekZeroTol
int GetNumModes() const
Returns the order of the basis.
virtual int v_GetTotalFaceIntNcoeffs() const
virtual void v_GetEdgeToElementMap(const int eid, const Orientation edgeOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, int P)
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
int getNumberOfCoefficients(int Na)
virtual void v_BwdTrans_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual int v_NumDGBndryCoeffs() const
virtual void v_GetBoundaryMap(Array< OneD, unsigned int > &outarray)
Principle Modified Functions .
virtual void v_GetFaceNumModes(const int fid, const Orientation faceOrient, int &numModes0, int &numModes1)
virtual void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual DNekMatSharedPtr v_CreateStdMatrix(const StdMatrixKey &mkey)
virtual void v_GetInteriorMap(Array< OneD, unsigned int > &outarray)
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
Principle Orthogonal Functions .
virtual void v_MultiplyByStdQuadratureMetric(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.
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].
void Sadd(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Add vector y = alpha + x.
virtual void v_GetFaceToElementMap(const int fid, const Orientation faceOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, int P=-1, int Q=-1)
virtual void v_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdMatrixKey &mkey)
virtual void v_GetFaceInteriorMap(const int fid, const Orientation faceOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
NekDouble GetConstFactor(const ConstFactorType &factor) const
int GetNcoeffs(void) const
This function returns the total number of coefficients used in the expansion.
const NekDouble kSVVDGFilter[9][11]
virtual bool v_IsBoundaryInteriorExpansion()
virtual LibUtilities::BasisType v_GetEdgeBasisType(const int i) const
virtual void v_IProductWRTDerivBase_MatOp(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_IProductWRTBase_MatOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
static void Dscal(const int &n, const double &alpha, double *x, const int &incx)
BLAS level 1: x = alpha x.
static double Ddot(const int &n, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: output = .
LibUtilities::PointsType GetPointsType(const int dir) const
This function returns the type of quadrature points used in the dir direction.
bool ConstFactorExists(const ConstFactorType &factor) const
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed t...
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
Gauss Radau pinned at x=-1, .
virtual int v_GetVertexMap(int localVertexId, bool useCoeffPacking=false)
virtual void v_BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
void BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Backward transformation from coefficient space to physical space...
virtual int v_GetFaceIntNcoeffs(const int i) const
static const BasisKey NullBasisKey(eNoBasisType, 0, NullPointsKey)
Defines a null basis with no type or points.
int GetTotPoints() const
This function returns the total number of quadrature points used in the element.
void Zero(int n, T *x, const int incx)
Zero vector.
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Array< OneD, LibUtilities::BasisSharedPtr > m_base
static void Daxpy(const int &n, const double &alpha, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: y = alpha x plus y.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
virtual void v_ReduceOrderCoeffs(int numMin, 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.
Describes the specification for a Basis.
virtual void v_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual int v_GetFaceNcoeffs(const int i) const
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
int getNumberOfBndCoefficients(int Na, int Nb, int Nc)
void FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Forward transformation from physical space to coefficient space...