35 #include <boost/core/ignore_unused.hpp>
47 StdPyrExp::StdPyrExp()
67 "than order in 'c' direction");
69 "than order in 'c' direction");
72 "Expected basis type in 'c' direction to be ModifiedPyr_C or OrthoPyr_C");
113 int Qx =
m_base[0]->GetNumPoints();
114 int Qy =
m_base[1]->GetNumPoints();
115 int Qz =
m_base[2]->GetNumPoints();
123 eta_x =
m_base[0]->GetZ();
124 eta_y =
m_base[1]->GetZ();
125 eta_z =
m_base[2]->GetZ();
129 if (out_dxi1.size() > 0)
131 for (k = 0, n = 0; k < Qz; ++k)
134 for (j = 0; j < Qy; ++j)
136 for (i = 0; i < Qx; ++i, ++n)
138 out_dxi1[n] = fac * dEta_bar1[n];
144 if (out_dxi2.size() > 0)
146 for (k = 0, n = 0; k < Qz; ++k)
149 for (j = 0; j < Qy; ++j)
151 for (i = 0; i < Qx; ++i, ++n)
153 out_dxi2[n] = fac * dXi2[n];
159 if (out_dxi3.size() > 0)
161 for (k = 0, n = 0; k < Qz; ++k)
164 for (j = 0; j < Qy; ++j)
167 for (i = 0; i < Qx; ++i, ++n)
169 out_dxi3[n] = (1.0+eta_x[i])*fac*dEta_bar1[n] +
170 fac1*fac*dXi2[n] + dEta3[n];
206 ASSERTL1(
false,
"input dir is out of range");
255 if (
m_base[0]->Collocation() &&
256 m_base[1]->Collocation() &&
262 inarray, 1, outarray, 1);
277 int nquad0 =
m_base[0]->GetNumPoints();
278 int nquad1 =
m_base[1]->GetNumPoints();
279 int nquad2 =
m_base[2]->GetNumPoints();
280 int order0 =
m_base[0]->GetNumModes();
281 int order1 =
m_base[1]->GetNumModes();
284 nquad2*nquad1*nquad0);
289 inarray,outarray,wsp,
300 bool doCheckCollDir0,
301 bool doCheckCollDir1,
302 bool doCheckCollDir2)
304 boost::ignore_unused(doCheckCollDir0, doCheckCollDir1,
307 int nquad0 =
m_base[0]->GetNumPoints();
308 int nquad1 =
m_base[1]->GetNumPoints();
309 int nquad2 =
m_base[2]->GetNumPoints();
311 int order0 =
m_base[0]->GetNumModes();
312 int order1 =
m_base[1]->GetNumModes();
313 int order2 =
m_base[2]->GetNumModes();
318 int i, j, mode, mode1, cnt;
321 mode = mode1 = cnt = 0;
322 for(i = 0; i < order0; ++i)
324 for(j = 0; j < order1; ++j, ++cnt)
326 int ijmax = max(i,j);
328 1.0, base2.get()+mode*nquad2, nquad2,
329 inarray.get()+mode1, 1,
330 0.0, tmp.get()+cnt*nquad2, 1);
331 mode += order2-ijmax;
332 mode1 += order2-ijmax;
335 for(j = order1; j < order2-i; ++j)
337 int ijmax = max(i,j);
338 mode += order2-ijmax;
350 Blas::Daxpy(nquad2,inarray[1],base2.get()+nquad2,1,
354 Blas::Daxpy(nquad2,inarray[1],base2.get()+nquad2,1,
355 &tmp[0]+order1*nquad2,1);
358 Blas::Daxpy(nquad2,inarray[1],base2.get()+nquad2,1,
359 &tmp[0]+order1*nquad2+nquad2,1);
364 for(i = 0; i < order0; ++i)
367 1.0, base1.get(), nquad1,
368 tmp.get()+mode*nquad2, nquad2,
369 0.0, tmp1.get()+i*nquad1*nquad2, nquad1);
374 Blas::Dgemm(
'N',
'T', nquad0, nquad1*nquad2, order0,
375 1.0, base0.get(), nquad0,
376 tmp1.get(), nquad1*nquad2,
377 0.0, outarray.get(), nquad0);
433 if (
m_base[0]->Collocation() &&
434 m_base[1]->Collocation() &&
448 bool multiplybyweights)
451 int nquad1 =
m_base[1]->GetNumPoints();
452 int nquad2 =
m_base[2]->GetNumPoints();
453 int order0 =
m_base[0]->GetNumModes();
454 int order1 =
m_base[1]->GetNumModes();
458 if(multiplybyweights)
475 inarray,outarray,wsp,
487 bool doCheckCollDir0,
488 bool doCheckCollDir1,
489 bool doCheckCollDir2)
491 boost::ignore_unused(doCheckCollDir0, doCheckCollDir1,
494 int nquad0 =
m_base[0]->GetNumPoints();
495 int nquad1 =
m_base[1]->GetNumPoints();
496 int nquad2 =
m_base[2]->GetNumPoints();
498 int order0 =
m_base[0]->GetNumModes();
499 int order1 =
m_base[1]->GetNumModes();
500 int order2 =
m_base[2]->GetNumModes();
502 ASSERTL1(wsp.size() >= nquad1*nquad2*order0 +
503 nquad2*order0*order1,
504 "Insufficient workspace size");
509 int i,j, mode,mode1, cnt;
512 Blas::Dgemm(
'T',
'N', nquad1*nquad2, order0, nquad0,
513 1.0, inarray.get(), nquad0,
515 0.0, tmp1.get(), nquad1*nquad2);
518 for(mode=i=0; i < order0; ++i)
521 1.0, tmp1.get()+i*nquad1*nquad2, nquad1,
523 0.0, tmp2.get()+mode*nquad2, nquad2);
529 mode = mode1 = cnt = 0;
530 for(i = 0; i < order0; ++i)
532 for(j = 0; j < order1; ++j, ++cnt)
534 int ijmax = max(i,j);
537 1.0, base2.get()+mode*nquad2, nquad2,
538 tmp2.get()+cnt*nquad2, 1,
539 0.0, outarray.get()+mode1, 1);
540 mode += order2-ijmax;
541 mode1 += order2-ijmax;
545 for(j = order1; j < order2; ++j)
547 int ijmax = max(i,j);
548 mode += order2-ijmax;
557 outarray[1] +=
Blas::Ddot(nquad2,base2.get()+nquad2,1,
561 outarray[1] +=
Blas::Ddot(nquad2,base2.get()+nquad2,1,
562 &tmp2[nquad2*order1],1);
565 outarray[1] +=
Blas::Ddot(nquad2,base2.get()+nquad2,1,
566 &tmp2[nquad2*order1+nquad2],1);
590 int nquad0 =
m_base[0]->GetNumPoints();
591 int nquad1 =
m_base[1]->GetNumPoints();
592 int nquad2 =
m_base[2]->GetNumPoints();
593 int nqtot = nquad0*nquad1*nquad2;
601 int order0 =
m_base[0]->GetNumModes();
602 int order1 =
m_base[1]->GetNumModes();
605 nquad2*order0*order1);
612 for(i = 0; i < nquad0; ++i)
614 gfac0[i] = 0.5*(1+z0[i]);
618 for(i = 0; i < nquad1; ++i)
620 gfac1[i] = 0.5*(1+z1[i]);
624 for(i = 0; i < nquad2; ++i)
626 gfac2[i] = 2.0/(1-z2[i]);
630 const int nq01 = nquad0*nquad1;
631 for(i = 0; i < nquad2; ++i)
634 &inarray[0] + i*nq01, 1,
635 &tmp0 [0] + i*nq01, 1);
666 for(i = 0; i < nquad1*nquad2; ++i)
670 tmp0 .get() + i*nquad0, 1);
679 for(i = 0; i < nquad2; ++i)
682 &inarray[0] + i*nq01, 1,
683 &tmp0 [0] + i*nq01, 1);
685 for(i = 0; i < nquad1*nquad2; ++i)
688 &tmp0[0] + i*nquad0, 1,
689 &tmp0[0] + i*nquad0, 1);
712 ASSERTL1(
false,
"input dir is out of range");
739 eta[1] = 2.0*(1.0 + xi[1])/d2 - 1.0;
740 eta[0] = 2.0*(1.0 + xi[0])/d2 - 1.0;
747 xi[0] = (1.0 + eta[0]) * (1.0 - eta[2]) * 0.5 - 1.0;
748 xi[1] = (1.0 + eta[1]) * (1.0 - eta[2]) * 0.5 - 1.0;
764 for (
int k = 0; k < Qz; ++k )
766 for (
int j = 0; j < Qy; ++j)
768 for (
int i = 0; i < Qx; ++i)
770 int s = i + Qx*(j + Qy*k);
773 xi_y[s] = (1.0 + eta_y[j]) * (1.0 - eta_z[k]) / 2.0 - 1.0;
774 xi_x[s] = (1.0 + etaBar_x[i]) * (1.0 - eta_z[k]) / 2.0 - 1.0;
793 int nummodes [3] = {
m_base[0]->GetNumModes(),
795 m_base[2]->GetNumModes()};
801 numModes0 = nummodes[0];
802 numModes1 = nummodes[1];
808 numModes0 = nummodes[0];
809 numModes1 = nummodes[2];
815 numModes0 = nummodes[1];
816 numModes1 = nummodes[2];
821 if ( faceOrient >= 9 )
823 std::swap(numModes0, numModes1);
834 const int nm0 =
m_base[0]->GetNumModes();
835 const int nm1 =
m_base[1]->GetNumModes();
836 const int nm2 =
m_base[2]->GetNumModes();
838 int mode0 = 0, mode1 = 0, mode2 = 0, cnt = 0;
841 for (mode0 = 0; mode0 < nm0; ++mode0)
843 for (mode1 = 0; mode1 < nm1; ++mode1)
845 int maxpq = max(mode0, mode1);
846 for (mode2 = 0; mode2 < nm2 - maxpq; ++mode2, ++cnt)
866 for (
int j = nm1; j < nm2; ++j)
868 int ijmax = max(mode0, j);
869 mode2 += nm2 - ijmax;
876 return StdExpansion::BaryEvaluateBasis<2>(coll[2], 1);
881 StdExpansion::BaryEvaluateBasis<0>(coll[0], mode0) *
882 StdExpansion::BaryEvaluateBasis<1>(coll[1], mode1) *
883 StdExpansion::BaryEvaluateBasis<2>(coll[2], mode2);
915 "BasisType is not a boundary interior form");
918 "BasisType is not a boundary interior form");
921 "BasisType is not a boundary interior form");
923 int P =
m_base[0]->GetNumModes();
924 int Q =
m_base[1]->GetNumModes();
925 int R =
m_base[2]->GetNumModes();
935 "BasisType is not a boundary interior form");
938 "BasisType is not a boundary interior form");
941 "BasisType is not a boundary interior form");
943 int P =
m_base[0]->GetNumModes()-1;
944 int Q =
m_base[1]->GetNumModes()-1;
945 int R =
m_base[2]->GetNumModes()-1;
948 + 2*(R+1) +
P*(1 + 2*R -
P)
949 + 2*(R+1) + Q*(1 + 2*R - Q);
955 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
961 else if (i == 1 || i == 3)
964 return Q+1 + (
P*(1 + 2*Q -
P))/2;
969 return Q+1 + (
P*(1 + 2*Q -
P))/2;
975 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
977 int P =
m_base[0]->GetNumModes()-1;
978 int Q =
m_base[1]->GetNumModes()-1;
979 int R =
m_base[2]->GetNumModes()-1;
985 else if (i == 1 || i == 3)
987 return (
P-1) * (2*(R-1) - (
P-1) - 1) / 2;
991 return (Q-1) * (2*(R-1) - (Q-1) - 1) / 2;
997 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
1001 return m_base[0]->GetNumPoints()*
1002 m_base[1]->GetNumPoints();
1004 else if (i == 1 || i == 3)
1006 return m_base[0]->GetNumPoints()*
1007 m_base[2]->GetNumPoints();
1011 return m_base[1]->GetNumPoints()*
1012 m_base[2]->GetNumPoints();
1018 ASSERTL2(i >= 0 && i <= 7,
"edge id is out of range");
1020 if (i == 0 || i == 2)
1024 else if (i == 1 || i == 3)
1035 const int i,
const int k)
const
1037 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
1038 ASSERTL2(k >= 0 && k <= 1,
"basis key id is out of range");
1047 m_base[k]->GetNumModes());
1056 m_base[2*k]->GetNumModes());
1064 m_base[k+1]->GetNumModes());
1073 const std::vector<unsigned int> &nummodes,
1077 nummodes[modes_offset],
1078 nummodes[modes_offset+1],
1079 nummodes[modes_offset+2]);
1090 "Mapping not defined for this type of basis");
1094 if(useCoeffPacking ==
true)
1114 ASSERTL0(
false,
"local vertex id must be between 0 and 4");
1137 ASSERTL0(
false,
"local vertex id must be between 0 and 4");
1148 "BasisType is not a boundary interior form");
1151 "BasisType is not a boundary interior form");
1154 "BasisType is not a boundary interior form");
1157 int P =
m_base[0]->GetNumModes() - 1,
p;
1158 int Q =
m_base[1]->GetNumModes() - 1, q;
1159 int R =
m_base[2]->GetNumModes() - 1, r;
1163 if(outarray.size()!=nIntCoeffs)
1171 for (
p = 2;
p <=
P; ++
p)
1173 for (q = 2; q <= Q; ++q)
1175 int maxpq = max(
p,q);
1176 for (r = 1; r <= R-maxpq; ++r)
1188 "BasisType is not a boundary interior form");
1191 "BasisType is not a boundary interior form");
1194 "BasisType is not a boundary interior form");
1196 int P =
m_base[0]->GetNumModes() - 1,
p;
1197 int Q =
m_base[1]->GetNumModes() - 1, q;
1198 int R =
m_base[2]->GetNumModes() - 1, r;
1203 if (maparray.size() != nBnd)
1209 for (
p = 0;
p <=
P; ++
p)
1214 for (q = 0; q <= Q; ++q)
1216 int maxpq = max(
p,q);
1217 for (r = 0; r <= R-maxpq; ++r)
1227 for (q = 0; q <= Q; ++q)
1231 for (r = 0; r <= R-
p; ++r)
1254 "Method only implemented if BasisType is identical"
1255 "in x and y directions");
1258 "Method only implemented for Modified_A BasisType"
1259 "(x and y direction) and ModifiedPyr_C BasisType (z "
1262 int i, j, k,
p, q, r, nFaceCoeffs, idx = 0;
1263 int nummodesA=0, nummodesB=0;
1265 int order0 =
m_base[0]->GetNumModes();
1266 int order1 =
m_base[1]->GetNumModes();
1267 int order2 =
m_base[2]->GetNumModes();
1286 ASSERTL0(
false,
"fid must be between 0 and 4");
1289 bool CheckForZeroedModes =
false;
1299 nFaceCoeffs =
P*(2*Q-
P+1)/2;
1300 CheckForZeroedModes =
true;
1305 CheckForZeroedModes =
true;
1309 if (maparray.size() != nFaceCoeffs)
1314 if (signarray.size() != nFaceCoeffs)
1320 fill(signarray.get(), signarray.get() + nFaceCoeffs, 1);
1329 for (i = 0; i < Q; i++)
1331 for (j = 0; j <
P; j++)
1335 arrayindx[i*
P+j] = i*
P+j;
1339 arrayindx[i*
P+j] = j*Q+i;
1351 for (q = 0; q < Q; ++q)
1353 for (
p = 0;
p <
P; ++
p)
1361 for (
p = 0;
p <
P; ++
p)
1363 for (r = 0; r < Q-
p; ++r)
1365 if ((
int)faceOrient == 7 &&
p > 1)
1367 signarray[idx] =
p % 2 ? -1 : 1;
1375 maparray[idx++] =
GetMode(1,0,0);
1376 maparray[idx++] =
GetMode(0,0,1);
1377 for (r = 1; r < Q-1; ++r)
1379 maparray[idx++] =
GetMode(1,0,r);
1382 for (q = 1; q <
P; ++q)
1384 for (r = 0; r < Q-q; ++r)
1386 if ((
int)faceOrient == 7 && q > 1)
1388 signarray[idx] = q % 2 ? -1 : 1;
1390 maparray[idx++] =
GetMode(1,q,r);
1396 maparray[idx++] =
GetMode(0,1,0);
1397 maparray[idx++] =
GetMode(0,0,1);
1398 for (r = 1; r < Q-1; ++r)
1400 maparray[idx++] =
GetMode(0,1,r);
1403 for (
p = 1;
p <
P; ++
p)
1405 for (r = 0; r < Q-
p; ++r)
1407 if ((
int)faceOrient == 7 &&
p > 1)
1409 signarray[idx] =
p % 2 ? -1 : 1;
1411 maparray[idx++] =
GetMode(
p, 1, r);
1417 for (q = 0; q <
P; ++q)
1419 for (r = 0; r < Q-q; ++r)
1421 if ((
int)faceOrient == 7 && q > 1)
1423 signarray[idx] = q % 2 ? -1 : 1;
1425 maparray[idx++] =
GetMode(0,q,r);
1431 ASSERTL0(
false,
"Face to element map unavailable.");
1436 if(CheckForZeroedModes)
1441 for (j = 0; j <
P; ++j)
1444 for (k = Q-j; k < Q-j; ++k)
1446 signarray[idx] = 0.0;
1447 maparray[idx++] = maparray[0];
1451 for (j =
P; j <
P; ++j)
1453 for (k = 0; k < Q-j; ++k)
1455 signarray[idx] = 0.0;
1456 maparray[idx++] = maparray[0];
1463 if ((
int)faceOrient == 7)
1465 swap(maparray[0], maparray[Q]);
1466 for (i = 1; i < Q-1; ++i)
1468 swap(maparray[i+1], maparray[Q+i]);
1474 if(CheckForZeroedModes)
1478 for (j = 0; j <
P; ++j)
1480 for (k = Q; k < Q; ++k)
1482 signarray[arrayindx[j+k*
P]] = 0.0;
1483 maparray[arrayindx[j+k*
P]] = maparray[0];
1487 for (j =
P; j <
P; ++j)
1489 for (k = 0; k < Q; ++k)
1491 signarray[arrayindx[j+k*
P]] = 0.0;
1492 maparray[arrayindx[j+k*
P]] = maparray[0];
1501 if (faceOrient == 6 || faceOrient == 8 ||
1502 faceOrient == 11 || faceOrient == 12)
1506 for (i = 3; i < Q; i += 2)
1508 for (j = 0; j <
P; j++)
1510 signarray[arrayindx[i*
P+j]] *= -1;
1514 for (i = 0; i <
P; i++)
1516 swap(maparray [i], maparray [i+
P]);
1517 swap(signarray[i], signarray[i+
P]);
1522 for (i = 0; i < Q; i++)
1524 for (j = 3; j <
P; j += 2)
1526 signarray[arrayindx[i*
P+j]] *= -1;
1530 for (i = 0; i < Q; i++)
1532 swap (maparray [i], maparray [i+Q]);
1533 swap (signarray[i], signarray[i+Q]);
1538 if (faceOrient == 7 || faceOrient == 8 ||
1539 faceOrient == 10 || faceOrient == 12)
1543 for (i = 0; i < Q; i++)
1545 for (j = 3; j <
P; j += 2)
1547 signarray[arrayindx[i*
P+j]] *= -1;
1551 for(i = 0; i < Q; i++)
1553 swap(maparray [i*
P], maparray [i*
P+1]);
1554 swap(signarray[i*
P], signarray[i*
P+1]);
1559 for (i = 3; i < Q; i += 2)
1561 for (j = 0; j <
P; j++)
1563 signarray[arrayindx[i*
P+j]] *= -1;
1567 for (i = 0; i <
P; i++)
1569 swap(maparray [i*Q], maparray [i*Q+1]);
1570 swap(signarray[i*Q], signarray[i*Q+1]);
1585 const int P =
m_base[0]->GetNumModes() - 1;
1586 const int Q =
m_base[1]->GetNumModes() - 1;
1587 const int R =
m_base[2]->GetNumModes() - 1;
1590 if (maparray.size() != nEdgeIntCoeffs)
1595 if(signarray.size() != nEdgeIntCoeffs)
1601 fill(signarray.get(), signarray.get()+nEdgeIntCoeffs, 1);
1611 for (i = 2; i <=
P; ++i)
1613 maparray[i-2] =
GetMode(i,0,0);
1618 for (i = 2; i <= Q; ++i)
1620 maparray[i-2] =
GetMode(1,i,0);
1624 for (i = 2; i <=
P; ++i)
1626 maparray[i-2] =
GetMode(i,1,0);
1631 for (i = 2; i <= Q; ++i)
1633 maparray[i-2] =
GetMode(0,i,0);
1637 for (i = 2; i <= R; ++i)
1639 maparray[i-2] =
GetMode(0,0,i);
1644 for (i = 1; i <= R-1; ++i)
1646 maparray[i-1] =
GetMode(1,0,i);
1650 for (i = 1; i <= R-1; ++i)
1652 maparray[i-1] =
GetMode(1,1,i);
1657 for (i = 1; i <= R-1; ++i)
1659 maparray[i-1] =
GetMode(0,1,i);
1663 ASSERTL0(
false,
"Edge not defined.");
1669 for (i = 1; i < nEdgeIntCoeffs; i += 2)
1682 const int P =
m_base[0]->GetNumModes() - 1;
1683 const int Q =
m_base[1]->GetNumModes() - 1;
1684 const int R =
m_base[2]->GetNumModes() - 1;
1686 int p, q, r, idx = 0;
1691 if (maparray.size() != nFaceIntCoeffs)
1696 if (signarray.size() != nFaceIntCoeffs)
1702 fill(signarray.get(), signarray.get()+nFaceIntCoeffs, 1);
1713 for (i = 0; i < nummodesB; i++)
1715 for (j = 0; j < nummodesA; j++)
1719 arrayindx[i*nummodesA+j] = i*nummodesA+j;
1723 arrayindx[i*nummodesA+j] = j*nummodesB+i;
1732 for (q = 2; q <= Q; ++q)
1734 for (
p = 2;
p <=
P; ++
p)
1736 maparray[arrayindx[(q-2)*nummodesA+(
p-2)]] =
GetMode(
p,q,0);
1741 for (
p = 2;
p <=
P; ++
p)
1743 for (r = 1; r <= R-
p; ++r)
1745 if ((
int)faceOrient == 7)
1747 signarray[idx] =
p % 2 ? -1 : 1;
1754 for (q = 2; q <= Q; ++q)
1756 for (r = 1; r <= R-q; ++r)
1758 if ((
int)faceOrient == 7)
1760 signarray[idx] = q % 2 ? -1 : 1;
1762 maparray[idx++] =
GetMode(1, q, r);
1768 for (
p = 2;
p <=
P; ++
p)
1770 for (r = 1; r <= R-
p; ++r)
1772 if ((
int)faceOrient == 7)
1774 signarray[idx] =
p % 2 ? -1 : 1;
1776 maparray[idx++] =
GetMode(
p, 1, r);
1782 for (q = 2; q <= Q; ++q)
1784 for (r = 1; r <= R-q; ++r)
1786 if ((
int)faceOrient == 7)
1788 signarray[idx] = q % 2 ? -1 : 1;
1790 maparray[idx++] =
GetMode(0, q, r);
1795 ASSERTL0(
false,
"Face interior map not available.");
1805 if (faceOrient == 6 || faceOrient == 8 ||
1806 faceOrient == 11 || faceOrient == 12)
1810 for (i = 1; i < nummodesB; i += 2)
1812 for (j = 0; j < nummodesA; j++)
1814 signarray[arrayindx[i*nummodesA+j]] *= -1;
1820 for (i = 0; i < nummodesB; i++)
1822 for (j = 1; j < nummodesA; j += 2)
1824 signarray[arrayindx[i*nummodesA+j]] *= -1;
1830 if (faceOrient == 7 || faceOrient == 8 ||
1831 faceOrient == 10 || faceOrient == 12)
1835 for (i = 0; i < nummodesB; i++)
1837 for (j = 1; j < nummodesA; j += 2)
1839 signarray[arrayindx[i*nummodesA+j]] *= -1;
1845 for (i = 1; i < nummodesB; i += 2)
1847 for (j = 0; j < nummodesA; j++)
1849 signarray[arrayindx[i*nummodesA+j]] *= -1;
1897 const int Q =
m_base[1]->GetNumModes()-1;
1898 const int R =
m_base[2]->GetNumModes()-1;
1904 for (i = 0; i < I; ++i)
1910 cnt += (R+1-i)*(Q+1) - l*(l+1)/2;
1915 cnt += (R+1-I)*J - l*(l+1)/2;
1930 int nquad0 =
m_base[0]->GetNumPoints();
1931 int nquad1 =
m_base[1]->GetNumPoints();
1932 int nquad2 =
m_base[2]->GetNumPoints();
1941 for(i = 0; i < nquad1*nquad2; ++i)
1944 w0.get(), 1, outarray.get()+i*nquad0,1);
1948 for(j = 0; j < nquad2; ++j)
1950 for(i = 0; i < nquad1; ++i)
1964 for(i = 0; i < nquad2; ++i)
1967 &outarray[0]+i*nquad0*nquad1, 1);
1972 for(i = 0; i < nquad2; ++i)
1974 Blas::Dscal(nquad0*nquad1,0.25*(1-z2[i])*(1-z2[i])*w2[i],
1975 &outarray[0]+i*nquad0*nquad1,1);
1986 int qa =
m_base[0]->GetNumPoints();
1987 int qb =
m_base[1]->GetNumPoints();
1988 int qc =
m_base[2]->GetNumPoints();
1989 int nmodes_a =
m_base[0]->GetNumModes();
1990 int nmodes_b =
m_base[1]->GetNumModes();
1991 int nmodes_c =
m_base[2]->GetNumModes();
2006 OrthoExp.
FwdTrans(array,orthocoeffs);
2016 for(
int i = 0; i < nmodes_a; ++i)
2018 for(
int j = 0; j < nmodes_b; ++j)
2020 int maxij = max(i,j);
2022 pow((1.0*i)/(nmodes_a-1),cutoff*nmodes_a),
2023 pow((1.0*j)/(nmodes_b-1),cutoff*nmodes_b));
2025 for(
int k = 0; k < nmodes_c-maxij; ++k)
2028 pow((1.0*k)/(nmodes_c-1),cutoff*nmodes_c));
2030 orthocoeffs[cnt] *= SvvDiffCoeff * fac;
2046 max_abc = max(max_abc,0);
2049 for(
int i = 0; i < nmodes_a; ++i)
2051 for(
int j = 0; j < nmodes_b; ++j)
2053 int maxij = max(i,j);
2055 for(
int k = 0; k < nmodes_c-maxij; ++k)
2057 int maxijk = max(maxij,k);
2060 orthocoeffs[cnt] *= SvvDiffCoeff *
2077 int cutoff_a = (int) (SVVCutOff*nmodes_a);
2078 int cutoff_b = (int) (SVVCutOff*nmodes_b);
2079 int cutoff_c = (int) (SVVCutOff*nmodes_c);
2083 int nmodes = min(min(nmodes_a,nmodes_b),nmodes_c);
2084 NekDouble cutoff = min(min(cutoff_a,cutoff_b),cutoff_c);
2086 for(i = 0; i < nmodes_a; ++i)
2088 for(j = 0; j < nmodes_b; ++j)
2090 int maxij = max(i,j);
2091 for(k = 0; k < nmodes_c-maxij; ++k)
2093 if(j + k >= cutoff || i + k >= cutoff)
2096 (SvvDiffCoeff*exp(-(i+k-nmodes)*(i+k-nmodes)/
2098 (i+k-cutoff+epsilon))))*
2099 exp(-(j-nmodes)*(j-nmodes)/
2101 (j-cutoff+epsilon)))));
2105 orthocoeffs[cnt] *= 0.0;
2114 OrthoExp.
BwdTrans(orthocoeffs,array);
2122 int nquad0 =
m_base[0]->GetNumPoints();
2123 int nquad1 =
m_base[1]->GetNumPoints();
2124 int nquad2 =
m_base[2]->GetNumPoints();
2125 int nqtot = nquad0*nquad1*nquad2;
2126 int nmodes0 =
m_base[0]->GetNumModes();
2127 int nmodes1 =
m_base[1]->GetNumModes();
2128 int nmodes2 =
m_base[2]->GetNumModes();
2129 int numMax = nmodes0;
2157 OrthoPyrExp->FwdTrans(phys_tmp, coeff);
2160 for (u = 0; u < numMin; ++u)
2162 for (i = 0; i < numMin; ++i)
2165 int maxui = max(u,i);
2167 tmp2 = coeff_tmp1 + cnt, 1);
2168 cnt += nmodes2 - maxui;
2171 for (i = numMin; i < nmodes1; ++i)
2173 int maxui = max(u,i);
2174 cnt += numMax - maxui;
2178 OrthoPyrExp->BwdTrans(coeff_tmp1, phys_tmp);
#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.
BasisType GetBasisType() const
Return type of expansion 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 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.
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
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
void BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Backward transformation from coefficient space to physical space.
int GetTraceNcoeffs(const int i) const
This function returns the number of expansion coefficients belonging to the i-th trace.
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.
int GetBasisNumModes(const int dir) const
This function returns the number of expansion modes in the dir direction.
Array< OneD, LibUtilities::BasisSharedPtr > m_base
NekDouble GetConstFactor(const ConstFactorType &factor) const
bool ConstFactorExists(const ConstFactorType &factor) const
virtual void v_GetInteriorMap(Array< OneD, unsigned int > &outarray)
void v_MultiplyByStdQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_GetCoords(Array< OneD, NekDouble > &xi_x, Array< OneD, NekDouble > &xi_y, Array< OneD, NekDouble > &xi_z)
virtual void v_GetTraceNumModes(const int fid, int &numModes0, int &numModes1, Orientation faceOrient=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 int v_GetTraceNumPoints(const int i) const
virtual void v_IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
NekDouble v_PhysEvaluateBasis(const Array< OneD, const NekDouble > &coords, int mode) final
virtual const LibUtilities::BasisKey v_GetTraceBasisKey(const int i, const int k) const
virtual void v_LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
virtual DNekMatSharedPtr v_GenMatrix(const StdMatrixKey &mkey)
virtual void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual int v_GetEdgeNcoeffs(const int i) const
virtual void v_BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Backward transformation is evaluated at the quadrature points.
virtual void v_IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)
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_CalcNumberOfCoefficients(const std::vector< unsigned int > &nummodes, int &modes_offset)
virtual int v_GetNverts() const
virtual void v_PhysDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2)
Calculate the derivative of the physical points.
virtual void v_GetTraceToElementMap(const int fid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, Orientation faceOrient, int P, int Q)
virtual int v_GetTraceNcoeffs(const int i) const
virtual void v_GetBoundaryMap(Array< OneD, unsigned int > &outarray)
virtual int v_NumDGBndryCoeffs() const
virtual LibUtilities::ShapeType v_DetShapeType() const
int GetMode(int I, int J, int K)
Compute the mode number in the expansion for a particular tensorial combination.
virtual void v_IProductWRTBase_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)
virtual int v_NumBndryCoeffs() const
virtual void v_FillMode(const int mode, Array< OneD, NekDouble > &outarray)
virtual int v_GetTraceIntNcoeffs(const int i) const
virtual DNekMatSharedPtr v_CreateStdMatrix(const StdMatrixKey &mkey)
virtual void v_IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Inner product of inarray over region with respect to the expansion basis m_base[0]->GetBdata(),...
virtual void v_ReduceOrderCoeffs(int numMin, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Forward transform from physical quadrature space stored in inarray and evaluate the expansion coeffic...
virtual void v_BwdTrans_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual int v_GetNedges() const
virtual void v_GetTraceInteriorToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation traceOrient=eDir1FwdDir1_Dir2FwdDir2)
virtual int v_GetVertexMap(int localVertexId, bool useCoeffPacking=false)
virtual void v_GetEdgeInteriorToElementMap(const int tid, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, const Orientation traceOrient=eDir1FwdDir1_Dir2FwdDir2)
virtual void v_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdMatrixKey &mkey)
virtual int v_GetNtraces() const
virtual void v_LocCollapsedToLocCoord(const Array< OneD, const NekDouble > &eta, Array< OneD, NekDouble > &xi)
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 Nb, int Nc)
int getNumberOfBndCoefficients(int Na, int Nb, int Nc)
int getNumberOfCoefficients(int Na)
static const BasisKey NullBasisKey(eNoBasisType, 0, NullPointsKey)
Defines a null basis with no type or points.
@ eGaussRadauMAlpha2Beta0
Gauss Radau pinned at x=-1, .
@ eOrtho_A
Principle Orthogonal Functions .
@ eGLL_Lagrange
Lagrange for SEM basis .
@ eModifiedPyr_C
Principle Modified Functions .
@ eModified_A
Principle Modified Functions .
@ eOrthoPyr_C
Principle Orthogonal Functions .
static const NekDouble kNekZeroTol
LibUtilities::BasisKey EvaluateTriFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
@ eFactorSVVDGKerDiffCoeff
@ eFactorSVVPowerKerDiffCoeff
const int kSVVDGFiltermodesmin
std::shared_ptr< StdPyrExp > StdPyrExpSharedPtr
const int kSVVDGFiltermodesmax
LibUtilities::BasisKey EvaluateQuadFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
const NekDouble kSVVDGFilter[9][11]
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 Vcopy(int n, const T *x, const int incx, T *y, const int incy)