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.size() > 0)?
true:
false;
124 bool Do_1 = (out_dxi1.size() > 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.size() > 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");
901 eta[0] = 2.0*(1.0+xi[0])/d12 - 1.0;
902 eta[1] = 2.0*(1.0+xi[1])/d2 - 1.0;
910 xi[1] = (1.0 + eta[0]) * ( 1.0 - eta[2]) * 0.5 - 1.0;
911 xi[0] = (1.0 + eta[0]) * (-xi[1] - eta[2]) * 0.5 - 1.0;
931 const int nm1 =
m_base[1]->GetNumModes();
932 const int nm2 =
m_base[2]->GetNumModes();
934 const int b = 2 * nm2 + 1;
935 const int mode0 = floor(0.5 * (b -
sqrt(b * b - 8.0 * mode / nm1)));
937 mode - nm1*(mode0 * (nm2-1) + 1 - (mode0 - 2)*(mode0 - 1) / 2);
938 const int mode1 = tmp / (nm2 - mode0);
939 const int mode2 = tmp % (nm2 - mode0);
948 return StdExpansion::BaryEvaluateBasis<2>(coll[2], 1);
950 else if (mode0 == 0 && mode2 == 1)
953 StdExpansion::BaryEvaluateBasis<1>(coll[1], 0) *
954 StdExpansion::BaryEvaluateBasis<2>(coll[2], 1);
956 else if (mode0 == 1 && mode1 == 1 && mode2 == 0)
959 StdExpansion::BaryEvaluateBasis<0>(coll[0], 0) *
960 StdExpansion::BaryEvaluateBasis<1>(coll[1], 1);
965 StdExpansion::BaryEvaluateBasis<0>(coll[0], mode0) *
966 StdExpansion::BaryEvaluateBasis<1>(coll[1], mode1) *
967 StdExpansion::BaryEvaluateBasis<2>(coll[2], mode2);
977 boost::ignore_unused(faceOrient);
979 int nummodes [3] = {
m_base[0]->GetNumModes(),
981 m_base[2]->GetNumModes()};
986 numModes0 = nummodes[0];
987 numModes1 = nummodes[1];
992 numModes0 = nummodes[0];
993 numModes1 = nummodes[2];
999 numModes0 = nummodes[1];
1000 numModes1 = nummodes[2];
1034 "BasisType is not a boundary interior form");
1037 "BasisType is not a boundary interior form");
1040 "BasisType is not a boundary interior form");
1042 int P =
m_base[0]->GetNumModes();
1043 int Q =
m_base[1]->GetNumModes();
1044 int R =
m_base[2]->GetNumModes();
1054 "BasisType is not a boundary interior form");
1057 "BasisType is not a boundary interior form");
1060 "BasisType is not a boundary interior form");
1062 int P =
m_base[0]->GetNumModes()-1;
1063 int Q =
m_base[1]->GetNumModes()-1;
1064 int R =
m_base[2]->GetNumModes()-1;
1067 return (Q+1) +
P*(1 + 2*Q -
P)/2
1068 + (R+1) +
P*(1 + 2*R -
P)/2
1069 + 2*(R+1) + Q*(1 + 2*R - Q);
1074 ASSERTL2((i >= 0) && (i <= 3),
"face id is out of range");
1075 int nFaceCoeffs = 0;
1076 int nummodesA, nummodesB,
P, Q;
1082 else if ((i == 1) || (i == 2))
1094 nFaceCoeffs = Q+1 + (
P*(1 + 2*Q -
P))/2;
1100 ASSERTL2((i >= 0) && (i <= 3),
"face id is out of range");
1101 int Pi =
m_base[0]->GetNumModes() - 2;
1102 int Qi =
m_base[1]->GetNumModes() - 2;
1103 int Ri =
m_base[2]->GetNumModes() - 2;
1107 return Pi * (2*Qi - Pi - 1) / 2;
1111 return Pi * (2*Ri - Pi - 1) / 2;
1115 return Qi * (2*Ri - Qi - 1) / 2;
1121 int Pi =
m_base[0]->GetNumModes() - 2;
1122 int Qi =
m_base[1]->GetNumModes() - 2;
1123 int Ri =
m_base[2]->GetNumModes() - 2;
1125 return Pi * (2*Qi - Pi - 1) / 2 +
1126 Pi * (2*Ri - Pi - 1) / 2 +
1127 Qi * (2*Ri - Qi - 1);
1132 ASSERTL2(i >= 0 && i <= 3,
"face id is out of range");
1136 return m_base[0]->GetNumPoints()*
1137 m_base[1]->GetNumPoints();
1141 return m_base[0]->GetNumPoints()*
1142 m_base[2]->GetNumPoints();
1146 return m_base[1]->GetNumPoints()*
1147 m_base[2]->GetNumPoints();
1154 ASSERTL2((i >= 0) && (i <= 5),
"edge id is out of range");
1155 int P =
m_base[0]->GetNumModes();
1156 int Q =
m_base[1]->GetNumModes();
1157 int R =
m_base[2]->GetNumModes();
1163 else if (i == 1 || i == 2)
1174 const int i,
const int j)
const
1176 ASSERTL2(i >= 0 && i <= 3,
"face id is out of range");
1177 ASSERTL2(j == 0 || j == 1,
"face direction is out of range");
1181 return m_base[j]->GetPointsKey();
1185 return m_base[2*j]->GetPointsKey();
1189 return m_base[j+1]->GetPointsKey();
1194 const std::vector<unsigned int>& nummodes,
1198 nummodes[modes_offset],
1199 nummodes[modes_offset+1],
1200 nummodes[modes_offset+2]);
1207 const int i,
const int k)
const
1209 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
1210 ASSERTL2(k == 0 || k == 1,
"face direction out of range");
1230 m_base[dir]->GetNumModes());
1251 for(
int k = 0; k < Qz; ++k ) {
1252 for(
int j = 0; j < Qy; ++j ) {
1253 for(
int i = 0; i < Qx; ++i ) {
1254 int s = i + Qx*(j + Qy*k);
1255 xi_x[s] = (eta_x[i] + 1.0) * (1.0 - eta_y[j]) * (1.0 - eta_z[k]) / 4 - 1.0;
1256 xi_y[s] = (eta_y[j] + 1.0) * (1.0 - eta_z[k]) / 2 - 1.0;
1279 "Mapping not defined for this type of basis");
1282 if(useCoeffPacking ==
true)
1284 switch(localVertexId)
1308 ASSERTL0(
false,
"Vertex ID must be between 0 and 3");
1315 switch(localVertexId)
1339 ASSERTL0(
false,
"Vertex ID must be between 0 and 3");
1360 "BasisType is not a boundary interior form");
1363 "BasisType is not a boundary interior form");
1366 "BasisType is not a boundary interior form");
1368 int P =
m_base[0]->GetNumModes();
1369 int Q =
m_base[1]->GetNumModes();
1370 int R =
m_base[2]->GetNumModes();
1374 if(outarray.size() != nIntCoeffs)
1380 for (
int i = 2; i <
P-2; ++i)
1382 for (
int j = 1; j < Q-i-1; ++j)
1384 for (
int k = 1; k < R-i-j; ++k)
1386 outarray[idx++] =
GetMode(i,j,k);
1399 "BasisType is not a boundary interior form");
1402 "BasisType is not a boundary interior form");
1405 "BasisType is not a boundary interior form");
1407 int P =
m_base[0]->GetNumModes();
1408 int Q =
m_base[1]->GetNumModes();
1409 int R =
m_base[2]->GetNumModes();
1416 if (outarray.size() != nBnd)
1421 for (i = 0; i <
P; ++i)
1426 for (j = 0; j < Q-i; j++)
1428 for (k = 0; k < R-i-j; ++k)
1430 outarray[idx++] =
GetMode(i,j,k);
1438 for (k = 0; k < R-i; ++k)
1440 outarray[idx++] =
GetMode(i,0,k);
1442 for (j = 1; j < Q-i; ++j)
1444 outarray[idx++] =
GetMode(i,j,0);
1462 int nummodesA=0,nummodesB=0, i, j, k, idx;
1465 "Method only implemented for Modified_A BasisType (x "
1466 "direction), Modified_B BasisType (y direction), and "
1467 "Modified_C BasisType(z direction)");
1469 int nFaceCoeffs = 0;
1474 nummodesA =
m_base[0]->GetNumModes();
1475 nummodesB =
m_base[1]->GetNumModes();
1478 nummodesA =
m_base[0]->GetNumModes();
1479 nummodesB =
m_base[2]->GetNumModes();
1483 nummodesA =
m_base[1]->GetNumModes();
1484 nummodesB =
m_base[2]->GetNumModes();
1487 ASSERTL0(
false,
"fid must be between 0 and 3");
1490 bool CheckForZeroedModes =
false;
1498 CheckForZeroedModes =
true;
1501 nFaceCoeffs =
P*(2*Q-
P+1)/2;
1504 if(maparray.size() != nFaceCoeffs)
1509 if(signarray.size() != nFaceCoeffs)
1515 fill(signarray.get(),signarray.get()+nFaceCoeffs, 1 );
1522 for (i = 0; i <
P; ++i)
1524 for (j = 0; j < Q-i; ++j)
1526 if ((
int)faceOrient == 7 && i > 1)
1528 signarray[idx] = (i%2 ? -1 : 1);
1530 maparray[idx++] =
GetMode(i,j,0);
1536 for (i = 0; i <
P; ++i)
1538 for (k = 0; k < Q-i; ++k)
1540 if ((
int)faceOrient == 7 && i > 1)
1542 signarray[idx] = (i%2 ? -1: 1);
1544 maparray[idx++] =
GetMode(i,0,k);
1550 for (j = 0; j <
P-1; ++j)
1552 for (k = 0; k < Q-1-j; ++k)
1554 if ((
int)faceOrient == 7 && j > 1)
1556 signarray[idx] = ((j+1)%2 ? -1: 1);
1558 maparray[idx++] =
GetMode(1,j,k);
1560 if (j == 0 && k == 0)
1562 maparray[idx++] =
GetMode(0,0,1);
1564 if (j == 0 && k == Q-2)
1566 for (
int r = 0; r < Q-1; ++r)
1568 maparray[idx++] =
GetMode(0,1,r);
1576 for (j = 0; j <
P; ++j)
1578 for (k = 0; k < Q-j; ++k)
1580 if ((
int)faceOrient == 7 && j > 1)
1582 signarray[idx] = (j%2 ? -1: 1);
1584 maparray[idx++] =
GetMode(0,j,k);
1589 ASSERTL0(
false,
"Element map not available.");
1592 if ((
int)faceOrient == 7)
1594 swap(maparray[0], maparray[Q]);
1596 for (i = 1; i < Q-1; ++i)
1598 swap(maparray[i+1], maparray[Q+i]);
1602 if(CheckForZeroedModes)
1607 for (j = 0; j < nummodesA; ++j)
1610 for (k = nummodesB-j; k < Q-j; ++k)
1612 signarray[idx] = 0.0;
1613 maparray[idx++] = maparray[0];
1617 for (j = nummodesA; j <
P; ++j)
1619 for (k = 0; k < Q-j; ++k)
1621 signarray[idx] = 0.0;
1622 maparray[idx++] = maparray[0];
1638 const int P =
m_base[0]->GetNumModes();
1639 const int Q =
m_base[1]->GetNumModes();
1640 const int R =
m_base[2]->GetNumModes();
1644 if(maparray.size() != nEdgeIntCoeffs)
1650 fill( maparray.get(), maparray.get() + nEdgeIntCoeffs, 0);
1653 if(signarray.size() != nEdgeIntCoeffs)
1659 fill( signarray.get() , signarray.get()+nEdgeIntCoeffs, 1 );
1665 for (i = 0; i <
P-2; ++i)
1667 maparray[i] =
GetMode(i+2, 0, 0);
1671 for(i = 1; i < nEdgeIntCoeffs; i+=2)
1678 for (i = 0; i < Q-2; ++i)
1680 maparray[i] =
GetMode(1, i+1, 0);
1684 for(i = 1; i < nEdgeIntCoeffs; i+=2)
1691 for (i = 0; i < Q-2; ++i)
1693 maparray[i] =
GetMode(0, i+2, 0);
1697 for(i = 1; i < nEdgeIntCoeffs; i+=2)
1704 for (i = 0; i < R-2; ++i)
1706 maparray[i] =
GetMode(0, 0, i+2);
1710 for(i = 1; i < nEdgeIntCoeffs; i+=2)
1717 for (i = 0; i < R - 2; ++i)
1719 maparray[i] =
GetMode(1, 0, i+1);
1723 for(i = 1; i < nEdgeIntCoeffs; i+=2)
1730 for (i = 0; i < R-2; ++i)
1732 maparray[i] =
GetMode(0, 1, i+1);
1736 for(i = 1; i < nEdgeIntCoeffs; i+=2)
1743 ASSERTL0(
false,
"Edge not defined.");
1755 const int P =
m_base[0]->GetNumModes();
1756 const int Q =
m_base[1]->GetNumModes();
1757 const int R =
m_base[2]->GetNumModes();
1761 if(maparray.size() != nFaceIntCoeffs)
1766 if(signarray.size() != nFaceIntCoeffs)
1772 fill( signarray.get() , signarray.get()+nFaceIntCoeffs, 1 );
1779 for (i = 2; i <
P-1; ++i)
1781 for (j = 1; j < Q-i; ++j)
1783 if ((
int)faceOrient == 7)
1785 signarray[idx] = (i%2 ? -1 : 1);
1787 maparray[idx++] =
GetMode(i,j,0);
1793 for (i = 2; i <
P; ++i)
1795 for (k = 1; k < R-i; ++k)
1797 if ((
int)faceOrient == 7)
1799 signarray[idx] = (i%2 ? -1: 1);
1801 maparray[idx++] =
GetMode(i,0,k);
1807 for (j = 1; j < Q-2; ++j)
1809 for (k = 1; k < R-1-j; ++k)
1811 if ((
int)faceOrient == 7)
1813 signarray[idx] = ((j+1)%2 ? -1: 1);
1815 maparray[idx++] =
GetMode(1,j,k);
1821 for (j = 2; j < Q-1; ++j)
1823 for (k = 1; k < R-j; ++k)
1825 if ((
int)faceOrient == 7)
1827 signarray[idx] = (j%2 ? -1: 1);
1829 maparray[idx++] =
GetMode(0,j,k);
1834 ASSERTL0(
false,
"Face interior map not available.");
1852 int nq0 =
m_base[0]->GetNumPoints();
1853 int nq1 =
m_base[1]->GetNumPoints();
1854 int nq2 =
m_base[2]->GetNumPoints();
1864 nq = max(nq0,max(nq1,nq2));
1878 for(
int i = 0; i < nq; ++i)
1880 for(
int j = 0; j < nq-i; ++j)
1882 for(
int k = 0; k < nq-i-j; ++k,++cnt)
1885 coords[cnt][0] = -1.0 + 2*k/(
NekDouble)(nq-1);
1886 coords[cnt][1] = -1.0 + 2*j/(
NekDouble)(nq-1);
1887 coords[cnt][2] = -1.0 + 2*i/(
NekDouble)(nq-1);
1892 for(
int i = 0; i < neq; ++i)
1896 I[0] =
m_base[0]->GetI(coll);
1897 I[1] =
m_base[1]->GetI(coll+1);
1898 I[2] =
m_base[2]->GetI(coll+2);
1902 for(
int k = 0; k < nq2; ++k)
1904 for (
int j = 0; j < nq1; ++j)
1907 fac = (I[1]->GetPtr())[j]*(I[2]->GetPtr())[k];
1962 const int Q =
m_base[1]->GetNumModes();
1963 const int R =
m_base[2]->GetNumModes();
1965 int i,j,q_hat,k_hat;
1969 for (i = 0; i < I; ++i)
1974 k_hat = max(R-Q-i,0);
1975 cnt += q_hat*(q_hat+1)/2 + k_hat*Q;
1980 for (j = 0; j < J; ++j)
1998 int nquad0 =
m_base[0]->GetNumPoints();
1999 int nquad1 =
m_base[1]->GetNumPoints();
2000 int nquad2 =
m_base[2]->GetNumPoints();
2010 for(i = 0; i < nquad1*nquad2; ++i)
2013 w0.get(),1, &outarray[0]+i*nquad0,1);
2020 for(j = 0; j < nquad2; ++j)
2022 for(i = 0; i < nquad1; ++i)
2024 Blas::Dscal(nquad0,0.5*w1[i], &outarray[0]+i*nquad0+
2031 for(j = 0; j < nquad2; ++j)
2033 for(i = 0; i < nquad1; ++i)
2036 0.5*(1-z1[i])*w1[i],
2037 &outarray[0]+i*nquad0 + j*nquad0*nquad1,
2048 for(i = 0; i < nquad2; ++i)
2051 &outarray[0]+i*nquad0*nquad1, 1);
2056 for(i = 0; i < nquad2; ++i)
2059 &outarray[0]+i*nquad0*nquad1, 1);
2063 for(i = 0; i < nquad2; ++i)
2065 Blas::Dscal(nquad0*nquad1,0.25*(1-z2[i])*(1-z2[i])*w2[i],
2066 &outarray[0]+i*nquad0*nquad1,1);
2083 int qa =
m_base[0]->GetNumPoints();
2084 int qb =
m_base[1]->GetNumPoints();
2085 int qc =
m_base[2]->GetNumPoints();
2086 int nmodes_a =
m_base[0]->GetNumModes();
2087 int nmodes_b =
m_base[1]->GetNumModes();
2088 int nmodes_c =
m_base[2]->GetNumModes();
2106 OrthoExp.
FwdTrans(array,orthocoeffs);
2116 for(
int i = 0; i < nmodes_a; ++i)
2118 for(
int j = 0; j < nmodes_b-j; ++j)
2121 pow((1.0*i)/(nmodes_a-1),cutoff*nmodes_a),
2122 pow((1.0*j)/(nmodes_b-1),cutoff*nmodes_b));
2124 for(
int k = 0; k < nmodes_c-i-j; ++k)
2127 pow((1.0*k)/(nmodes_c-1),cutoff*nmodes_c));
2129 orthocoeffs[cnt] *= SvvDiffCoeff * fac;
2145 max_abc = max(max_abc,0);
2148 for(
int i = 0; i < nmodes_a; ++i)
2150 for(
int j = 0; j < nmodes_b-j; ++j)
2152 int maxij = max(i,j);
2154 for(
int k = 0; k < nmodes_c-i-j; ++k)
2156 int maxijk = max(maxij,k);
2159 orthocoeffs[cnt] *= SvvDiffCoeff *
2177 int cutoff_a = (int) (SVVCutOff*nmodes_a);
2178 int cutoff_b = (int) (SVVCutOff*nmodes_b);
2179 int cutoff_c = (int) (SVVCutOff*nmodes_c);
2180 int nmodes = min(min(nmodes_a,nmodes_b),nmodes_c);
2181 NekDouble cutoff = min(min(cutoff_a,cutoff_b),cutoff_c);
2186 for(i = 0; i < nmodes_a; ++i)
2188 for(j = 0; j < nmodes_b-i; ++j)
2190 for(k = 0; k < nmodes_c-i-j; ++k)
2192 if(i + j + k >= cutoff)
2194 orthocoeffs[cnt] *= ((SvvDiffCoeff)*exp(-(i+j+k-nmodes)*(i+j+k-nmodes)/((
NekDouble)((i+j+k-cutoff+epsilon)*(i+j+k-cutoff+epsilon)))));
2198 orthocoeffs[cnt] *= 0.0;
2207 OrthoExp.
BwdTrans(orthocoeffs,array);
2216 int nquad0 =
m_base[0]->GetNumPoints();
2217 int nquad1 =
m_base[1]->GetNumPoints();
2218 int nquad2 =
m_base[2]->GetNumPoints();
2219 int nqtot = nquad0 * nquad1 * nquad2;
2220 int nmodes0 =
m_base[0]->GetNumModes();
2221 int nmodes1 =
m_base[1]->GetNumModes();
2222 int nmodes2 =
m_base[2]->GetNumModes();
2223 int numMax = nmodes0;
2251 OrthoTetExp->FwdTrans(phys_tmp, coeff);
2257 for (
int u = 0; u < numMin; ++u)
2259 for (
int i = 0; i < numMin-u; ++i)
2262 tmp2 = coeff_tmp1 + cnt, 1);
2263 cnt += numMax - u - i;
2265 for (
int i = numMin; i < numMax-u; ++i)
2267 cnt += numMax - u - i;
2271 OrthoTetExp->BwdTrans(coeff_tmp1,phys_tmp);
2280 boost::ignore_unused(standard);
2282 int np0 =
m_base[0]->GetNumPoints();
2283 int np1 =
m_base[1]->GetNumPoints();
2284 int np2 =
m_base[2]->GetNumPoints();
2285 int np = max(np0,max(np1,np2));
2297 for(
int i = 0; i < np-1; ++i)
2299 planep1 += (np-i)*(np-i+1)/2;
2304 for(
int j = 0; j < np-i-1; ++j)
2308 for(
int k = 0; k < np-i-j-2; ++k)
2310 conn[cnt++] = plane + row +k+1;
2311 conn[cnt++] = plane + row +k;
2312 conn[cnt++] = plane + rowp1 +k;
2313 conn[cnt++] = planep1 + row1 +k;
2315 conn[cnt++] = plane + row +k+1;
2316 conn[cnt++] = plane + rowp1 +k+1;
2317 conn[cnt++] = planep1 + row1 +k+1;
2318 conn[cnt++] = planep1 + row1 +k;
2320 conn[cnt++] = plane + rowp1 +k+1;
2321 conn[cnt++] = plane + row +k+1;
2322 conn[cnt++] = plane + rowp1 +k;
2323 conn[cnt++] = planep1 + row1 +k;
2325 conn[cnt++] = planep1 + row1 +k;
2326 conn[cnt++] = planep1 + row1p1+k;
2327 conn[cnt++] = plane + rowp1 +k;
2328 conn[cnt++] = plane + rowp1 +k+1;
2330 conn[cnt++] = planep1 + row1 +k;
2331 conn[cnt++] = planep1 + row1p1+k;
2332 conn[cnt++] = planep1 + row1 +k+1;
2333 conn[cnt++] = plane + rowp1 +k+1;
2337 conn[cnt++] = plane + rowp1 +k+1;
2338 conn[cnt++] = planep1 + row1p1 +k+1;
2339 conn[cnt++] = planep1 + row1 +k+1;
2340 conn[cnt++] = planep1 + row1p1 +k;
2344 conn[cnt++] = plane + row + np-i-j-1;
2345 conn[cnt++] = plane + row + np-i-j-2;
2346 conn[cnt++] = plane + rowp1 + np-i-j-2;
2347 conn[cnt++] = planep1 + row1 + np-i-j-2;
2352 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.
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 void v_BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_BwdTrans_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual int v_NumBndryCoeffs() const
virtual int v_GetNedges() const
virtual void v_GetSimplexEquiSpacedConnectivity(Array< OneD, int > &conn, bool standard=true)
virtual void v_GetBoundaryMap(Array< OneD, unsigned int > &outarray)
virtual void v_GetTraceToElementMap(const int fid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation faceOrient, int P, int Q)
virtual void v_ReduceOrderCoeffs(int numMin, 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)
virtual void v_StdPhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2)
virtual void v_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 int v_GetNtraces() const
virtual void v_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
NekDouble v_PhysEvaluateBasis(const Array< OneD, const NekDouble > &coords, int mode) final
virtual int v_GetTraceNumPoints(const int i) const
virtual void v_MultiplyByStdQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual int v_GetEdgeNcoeffs(const int i) const
virtual int v_GetTotalTraceIntNcoeffs() const
virtual void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_GetTraceNumModes(const int fid, int &numModes0, int &numModes1, Orientation traceOrient=eDir1FwdDir1_Dir2FwdDir2)
virtual int v_GetTraceNcoeffs(const int i) 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_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 int v_GetTraceIntNcoeffs(const int i) const
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 void v_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdMatrixKey &mkey)
virtual int v_GetNverts() const
virtual LibUtilities::PointsKey v_GetTracePointsKey(const int i, const int j) const
virtual void v_GetEdgeInteriorToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation traceOrient=eDir1FwdDir1_Dir2FwdDir2)
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_GetTraceInteriorToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation traceOrient=eDir1FwdDir1_Dir2FwdDir2)
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_LocCollapsedToLocCoord(const Array< OneD, const NekDouble > &eta, Array< OneD, NekDouble > &xi)
virtual void v_IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
LibUtilities::ShapeType DetShapeType() const
virtual const LibUtilities::BasisKey v_GetTraceBasisKey(const int i, const int k) const
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 op(A)[m x k], op(B)[k x n], C[m x n] DGEMM perfo...
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
The above copyright notice and this permission notice shall be included.
static Array< OneD, NekDouble > NullNekDouble1DArray
std::shared_ptr< DNekMat > DNekMatSharedPtr
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
void 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*x.
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)
scalarT< T > sqrt(scalarT< T > in)