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;
#define ASSERTL0(condition, msg)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode....
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed to...
Describes the specification for a Basis.
int GetNumModes() const
Returns the order of the basis.
Defines a specification for a set of points.
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
void BwdTrans_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)
void IProductWRTBase_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)
void PhysTensorDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray_d1, Array< OneD, NekDouble > &outarray_d2, Array< OneD, NekDouble > &outarray_d3)
Calculate the 3D derivative in the local tensor/collapsed coordinate at the physical points.
The base class for all shapes.
int GetNcoeffs(void) const
This function returns the total number of coefficients used in the expansion.
int GetTotPoints() const
This function returns the total number of quadrature points used in the element.
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
int NumBndryCoeffs(void) const
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
void LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
Convert local cartesian coordinate xi into local collapsed coordinates eta.
LibUtilities::BasisType GetEdgeBasisType(const int i) const
This function returns the type of expansion basis on the i-th edge.
DNekMatSharedPtr CreateGeneralMatrix(const StdMatrixKey &mkey)
this function generates the mass matrix
void BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Backward transformation from coefficient space to physical space.
LibUtilities::PointsType GetPointsType(const int dir) const
This function returns the type of quadrature points used in the dir direction.
void FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Forward transformation from physical space to coefficient space.
int GetNumPoints(const int dir) const
This function returns the number of quadrature points in the dir direction.
void MultiplyByQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
int GetBasisNumModes(const int dir) const
This function returns the number of expansion modes in the dir direction.
Array< OneD, LibUtilities::BasisSharedPtr > m_base
MatrixType GetMatrixType() const
NekDouble GetConstFactor(const ConstFactorType &factor) const
bool ConstFactorExists(const ConstFactorType &factor) const
virtual int v_GetFaceNcoeffs(const int i) const
virtual void v_BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual const LibUtilities::BasisKey v_DetFaceBasisKey(const int i, const int k) const
virtual int v_GetTotalFaceIntNcoeffs() const
virtual void v_BwdTrans_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_GetFaceNumModes(const int fid, const Orientation faceOrient, int &numModes0, int &numModes1)
virtual int v_NumBndryCoeffs() const
virtual int v_GetTotalEdgeIntNcoeffs() const
virtual int v_GetNedges() const
virtual LibUtilities::BasisType v_GetEdgeBasisType(const int i) const
virtual void v_GetSimplexEquiSpacedConnectivity(Array< OneD, int > &conn, bool standard=true)
virtual void v_GetBoundaryMap(Array< OneD, unsigned int > &outarray)
virtual void v_ReduceOrderCoeffs(int numMin, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual int v_GetFaceNumPoints(const int i) const
virtual void v_IProductWRTBase_MatOp(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_StdPhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2)
virtual int v_GetFaceIntNcoeffs(const int i) 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)
int GetMode(const int i, const int j, const int k)
Compute the mode number in the expansion for a particular tensorial combination.
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_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_MultiplyByStdQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual int v_GetEdgeNcoeffs(const int i) const
virtual void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual LibUtilities::PointsKey v_GetFacePointsKey(const int i, const int j) const
virtual void v_IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)
virtual void v_FillMode(const int mode, Array< OneD, NekDouble > &outarray)
virtual int v_GetVertexMap(int localVertexId, bool useCoeffPacking=false)
virtual void v_GetEdgeToElementMap(const int eid, const Orientation edgeOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, int P)
virtual void v_GetCoords(Array< OneD, NekDouble > &coords_x, Array< OneD, NekDouble > &coords_y, Array< OneD, NekDouble > &coords_z)
virtual bool v_IsBoundaryInteriorExpansion()
virtual void v_GetInteriorMap(Array< OneD, unsigned int > &outarray)
virtual void v_LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
virtual void v_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_IProductWRTDerivBase_MatOp(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual DNekMatSharedPtr v_GenMatrix(const StdMatrixKey &mkey)
virtual int v_GetNfaces() const
virtual void v_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdMatrixKey &mkey)
virtual void v_GetEdgeInteriorMap(const int eid, const Orientation edgeOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
virtual int v_GetNverts() 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.
virtual void v_BwdTrans_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)
virtual void v_IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
LibUtilities::ShapeType DetShapeType() const
virtual void v_GetFaceInteriorMap(const int fid, const Orientation faceOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
virtual int v_NumDGBndryCoeffs() const
virtual DNekMatSharedPtr v_CreateStdMatrix(const StdMatrixKey &mkey)
virtual LibUtilities::ShapeType v_DetShapeType() 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 double Ddot(const int &n, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: output = .
static void Dgemm(const char &transa, const char &transb, const int &m, const int &n, const int &k, const double &alpha, const double *a, const int &lda, const double *b, const int &ldb, const double &beta, double *c, const int &ldc)
BLAS level 3: Matrix-matrix multiply C = A x B where A[m x n], B[n x k], C[m x k].
static void Daxpy(const int &n, const double &alpha, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: y = alpha x plus y.
int getNumberOfCoefficients(int Na)
int getNumberOfBndCoefficients(int Na, int Nb, int Nc)
int getNumberOfCoefficients(int Na, int Nb, int Nc)
static const BasisKey NullBasisKey(eNoBasisType, 0, NullPointsKey)
Defines a null basis with no type or points.
@ eGaussRadauMAlpha2Beta0
Gauss Radau pinned at x=-1, .
@ eGaussRadauMAlpha1Beta0
Gauss Radau pinned at x=-1, .
@ eModified_B
Principle Modified Functions .
@ eOrtho_A
Principle Orthogonal Functions .
@ eModified_C
Principle Modified Functions .
@ eGLL_Lagrange
Lagrange for SEM basis .
@ eOrtho_C
Principle Orthogonal Functions .
@ eOrtho_B
Principle Orthogonal Functions .
@ eModified_A
Principle Modified Functions .
static const NekDouble kNekZeroTol
LibUtilities::BasisKey EvaluateTriFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
@ eFactorSVVDGKerDiffCoeff
@ eFactorSVVPowerKerDiffCoeff
std::shared_ptr< StdTetExp > StdTetExpSharedPtr
const int kSVVDGFiltermodesmin
const int kSVVDGFiltermodesmax
const NekDouble kSVVDGFilter[9][11]
@ ePhysInterpToEquiSpaced
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 Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
void Zero(int n, T *x, const int incx)
Zero vector.
void Sadd(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Add vector y = alpha + x.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)