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.num_elements() > 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.num_elements() > 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.num_elements() > 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);
434 if (
m_base[0]->Collocation() &&
435 m_base[1]->Collocation() &&
449 bool multiplybyweights)
452 int nquad1 =
m_base[1]->GetNumPoints();
453 int nquad2 =
m_base[2]->GetNumPoints();
454 int order0 =
m_base[0]->GetNumModes();
455 int order1 =
m_base[1]->GetNumModes();
459 if(multiplybyweights)
476 inarray,outarray,wsp,
488 bool doCheckCollDir0,
489 bool doCheckCollDir1,
490 bool doCheckCollDir2)
492 boost::ignore_unused(doCheckCollDir0, doCheckCollDir1,
495 int nquad0 =
m_base[0]->GetNumPoints();
496 int nquad1 =
m_base[1]->GetNumPoints();
497 int nquad2 =
m_base[2]->GetNumPoints();
499 int order0 =
m_base[0]->GetNumModes();
500 int order1 =
m_base[1]->GetNumModes();
501 int order2 =
m_base[2]->GetNumModes();
503 ASSERTL1(wsp.num_elements() >= nquad1*nquad2*order0 +
504 nquad2*order0*order1,
505 "Insufficient workspace size");
510 int i,j, mode,mode1, cnt;
513 Blas::Dgemm(
'T',
'N', nquad1*nquad2, order0, nquad0,
514 1.0, inarray.get(), nquad0,
516 0.0, tmp1.get(), nquad1*nquad2);
519 for(mode=i=0; i < order0; ++i)
522 1.0, tmp1.get()+i*nquad1*nquad2, nquad1,
524 0.0, tmp2.get()+mode*nquad2, nquad2);
530 mode = mode1 = cnt = 0;
531 for(i = 0; i < order0; ++i)
533 for(j = 0; j < order1; ++j, ++cnt)
535 int ijmax = max(i,j);
538 1.0, base2.get()+mode*nquad2, nquad2,
539 tmp2.get()+cnt*nquad2, 1,
540 0.0, outarray.get()+mode1, 1);
541 mode += order2-ijmax;
542 mode1 += order2-ijmax;
546 for(j = order1; j < order2; ++j)
548 int ijmax = max(i,j);
549 mode += order2-ijmax;
558 outarray[1] +=
Blas::Ddot(nquad2,base2.get()+nquad2,1,
562 outarray[1] +=
Blas::Ddot(nquad2,base2.get()+nquad2,1,
563 &tmp2[nquad2*order1],1);
566 outarray[1] +=
Blas::Ddot(nquad2,base2.get()+nquad2,1,
567 &tmp2[nquad2*order1+nquad2],1);
591 int nquad0 =
m_base[0]->GetNumPoints();
592 int nquad1 =
m_base[1]->GetNumPoints();
593 int nquad2 =
m_base[2]->GetNumPoints();
594 int nqtot = nquad0*nquad1*nquad2;
602 int order0 =
m_base[0]->GetNumModes();
603 int order1 =
m_base[1]->GetNumModes();
606 nquad2*order0*order1);
613 for(i = 0; i < nquad0; ++i)
615 gfac0[i] = 0.5*(1+z0[i]);
619 for(i = 0; i < nquad1; ++i)
621 gfac1[i] = 0.5*(1+z1[i]);
625 for(i = 0; i < nquad2; ++i)
627 gfac2[i] = 2.0/(1-z2[i]);
631 const int nq01 = nquad0*nquad1;
632 for(i = 0; i < nquad2; ++i)
635 &inarray[0] + i*nq01, 1,
636 &tmp0 [0] + i*nq01, 1);
667 for(i = 0; i < nquad1*nquad2; ++i)
671 tmp0 .get() + i*nquad0, 1);
680 for(i = 0; i < nquad2; ++i)
683 &inarray[0] + i*nq01, 1,
684 &tmp0 [0] + i*nq01, 1);
686 for(i = 0; i < nquad1*nquad2; ++i)
689 &tmp0[0] + i*nquad0, 1,
690 &tmp0[0] + i*nquad0, 1);
713 ASSERTL1(
false,
"input dir is out of range");
738 eta[1] = 2.0*(1.0 + xi[1])/(1.0 - xi[2]) - 1.0;
739 eta[0] = 2.0*(1.0 + xi[0])/(1.0 - xi[2]) - 1.0;
755 for (
int k = 0; k < Qz; ++k )
757 for (
int j = 0; j < Qy; ++j)
759 for (
int i = 0; i < Qx; ++i)
761 int s = i + Qx*(j + Qy*k);
764 xi_y[s] = (1.0 + eta_y[j]) * (1.0 - eta_z[k]) / 2.0 - 1.0;
765 xi_x[s] = (1.0 + etaBar_x[i]) * (1.0 - eta_z[k]) / 2.0 - 1.0;
784 int nummodes [3] = {
m_base[0]->GetNumModes(),
786 m_base[2]->GetNumModes()};
792 numModes0 = nummodes[0];
793 numModes1 = nummodes[1];
799 numModes0 = nummodes[0];
800 numModes1 = nummodes[2];
806 numModes0 = nummodes[1];
807 numModes1 = nummodes[2];
812 if ( faceOrient >= 9 )
814 std::swap(numModes0, numModes1);
846 "BasisType is not a boundary interior form");
849 "BasisType is not a boundary interior form");
852 "BasisType is not a boundary interior form");
854 int P =
m_base[0]->GetNumModes();
855 int Q =
m_base[1]->GetNumModes();
856 int R =
m_base[2]->GetNumModes();
866 "BasisType is not a boundary interior form");
869 "BasisType is not a boundary interior form");
872 "BasisType is not a boundary interior form");
874 int P =
m_base[0]->GetNumModes()-1;
875 int Q =
m_base[1]->GetNumModes()-1;
876 int R =
m_base[2]->GetNumModes()-1;
879 + 2*(R+1) + P*(1 + 2*R -
P)
880 + 2*(R+1) + Q*(1 + 2*R - Q);
885 ASSERTL2(i >= 0 && i <= 7,
"edge id is out of range");
887 if (i == 0 || i == 2)
891 else if (i == 1 || i == 3)
903 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
909 else if (i == 1 || i == 3)
912 return Q+1 + (P*(1 + 2*Q -
P))/2;
917 return Q+1 + (P*(1 + 2*Q -
P))/2;
923 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
925 int P =
m_base[0]->GetNumModes()-1;
926 int Q =
m_base[1]->GetNumModes()-1;
927 int R =
m_base[2]->GetNumModes()-1;
933 else if (i == 1 || i == 3)
935 return (P-1) * (2*(R-1) - (P-1) - 1) / 2;
939 return (Q-1) * (2*(R-1) - (Q-1) - 1) / 2;
945 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
949 return m_base[0]->GetNumPoints()*
950 m_base[1]->GetNumPoints();
952 else if (i == 1 || i == 3)
954 return m_base[0]->GetNumPoints()*
955 m_base[2]->GetNumPoints();
959 return m_base[1]->GetNumPoints()*
960 m_base[2]->GetNumPoints();
966 const int i,
const int k)
const 968 ASSERTL2(i >= 0 && i <= 4,
"face id is out of range");
969 ASSERTL2(k >= 0 && k <= 1,
"basis key id is out of range");
978 m_base[k]->GetNumModes());
987 m_base[2*k]->GetNumModes());
995 m_base[k+1]->GetNumModes());
1004 const std::vector<unsigned int> &nummodes,
1008 nummodes[modes_offset],
1009 nummodes[modes_offset+1],
1010 nummodes[modes_offset+2]);
1018 ASSERTL2(i >= 0 && i <= 7,
"edge id is out of range");
1019 if (i == 0 || i == 2)
1023 else if (i == 1 || i == 3)
1047 "Method only implemented if BasisType is identical" 1048 "in x and y directions");
1051 "Method only implemented for Modified_A BasisType" 1052 "(x and y direction) and ModifiedPyr_C BasisType (z " 1055 int i, j, k,
p, q, r, nFaceCoeffs, idx = 0;
1056 int nummodesA=0, nummodesB=0;
1058 int order0 =
m_base[0]->GetNumModes();
1059 int order1 =
m_base[1]->GetNumModes();
1060 int order2 =
m_base[2]->GetNumModes();
1079 ASSERTL0(
false,
"fid must be between 0 and 4");
1082 bool CheckForZeroedModes =
false;
1092 nFaceCoeffs = P*(2*Q-P+1)/2;
1093 CheckForZeroedModes =
true;
1098 CheckForZeroedModes =
true;
1102 if (maparray.num_elements() != nFaceCoeffs)
1107 if (signarray.num_elements() != nFaceCoeffs)
1113 fill(signarray.get(), signarray.get() + nFaceCoeffs, 1);
1122 for (i = 0; i < Q; i++)
1124 for (j = 0; j <
P; j++)
1128 arrayindx[i*P+j] = i*P+j;
1132 arrayindx[i*P+j] = j*Q+i;
1144 for (q = 0; q < Q; ++q)
1146 for (p = 0; p <
P; ++
p)
1148 maparray[arrayindx[q*P+
p]] =
GetMode(p,q,0);
1154 for (p = 0; p <
P; ++
p)
1156 for (r = 0; r < Q-
p; ++r)
1158 if ((
int)faceOrient == 7 && p > 1)
1160 signarray[idx] = p % 2 ? -1 : 1;
1162 maparray[idx++] =
GetMode(p,0,r);
1168 maparray[idx++] =
GetMode(1,0,0);
1169 maparray[idx++] =
GetMode(0,0,1);
1170 for (r = 1; r < Q-1; ++r)
1172 maparray[idx++] =
GetMode(1,0,r);
1175 for (q = 1; q <
P; ++q)
1177 for (r = 0; r < Q-q; ++r)
1179 if ((
int)faceOrient == 7 && q > 1)
1181 signarray[idx] = q % 2 ? -1 : 1;
1183 maparray[idx++] =
GetMode(1,q,r);
1189 maparray[idx++] =
GetMode(0,1,0);
1190 maparray[idx++] =
GetMode(0,0,1);
1191 for (r = 1; r < Q-1; ++r)
1193 maparray[idx++] =
GetMode(0,1,r);
1196 for (p = 1; p <
P; ++
p)
1198 for (r = 0; r < Q-
p; ++r)
1200 if ((
int)faceOrient == 7 && p > 1)
1202 signarray[idx] = p % 2 ? -1 : 1;
1204 maparray[idx++] =
GetMode(p, 1, r);
1210 for (q = 0; q <
P; ++q)
1212 for (r = 0; r < Q-q; ++r)
1214 if ((
int)faceOrient == 7 && q > 1)
1216 signarray[idx] = q % 2 ? -1 : 1;
1218 maparray[idx++] =
GetMode(0,q,r);
1224 ASSERTL0(
false,
"Face to element map unavailable.");
1229 if(CheckForZeroedModes)
1234 for (j = 0; j <
P; ++j)
1237 for (k = Q-j; k < Q-j; ++k)
1239 signarray[idx] = 0.0;
1240 maparray[idx++] = maparray[0];
1244 for (j = P; j <
P; ++j)
1246 for (k = 0; k < Q-j; ++k)
1248 signarray[idx] = 0.0;
1249 maparray[idx++] = maparray[0];
1256 if ((
int)faceOrient == 7)
1258 swap(maparray[0], maparray[Q]);
1259 for (i = 1; i < Q-1; ++i)
1261 swap(maparray[i+1], maparray[Q+i]);
1267 if(CheckForZeroedModes)
1271 for (j = 0; j <
P; ++j)
1273 for (k = Q; k < Q; ++k)
1275 signarray[arrayindx[j+k*
P]] = 0.0;
1276 maparray[arrayindx[j+k*
P]] = maparray[0];
1280 for (j = P; j <
P; ++j)
1282 for (k = 0; k < Q; ++k)
1284 signarray[arrayindx[j+k*
P]] = 0.0;
1285 maparray[arrayindx[j+k*
P]] = maparray[0];
1294 if (faceOrient == 6 || faceOrient == 8 ||
1295 faceOrient == 11 || faceOrient == 12)
1299 for (i = 3; i < Q; i += 2)
1301 for (j = 0; j <
P; j++)
1303 signarray[arrayindx[i*P+j]] *= -1;
1307 for (i = 0; i <
P; i++)
1309 swap(maparray [i], maparray [i+P]);
1310 swap(signarray[i], signarray[i+P]);
1315 for (i = 0; i < Q; i++)
1317 for (j = 3; j <
P; j += 2)
1319 signarray[arrayindx[i*P+j]] *= -1;
1323 for (i = 0; i < Q; i++)
1325 swap (maparray [i], maparray [i+Q]);
1326 swap (signarray[i], signarray[i+Q]);
1331 if (faceOrient == 7 || faceOrient == 8 ||
1332 faceOrient == 10 || faceOrient == 12)
1336 for (i = 0; i < Q; i++)
1338 for (j = 3; j <
P; j += 2)
1340 signarray[arrayindx[i*P+j]] *= -1;
1344 for(i = 0; i < Q; i++)
1346 swap(maparray [i*P], maparray [i*P+1]);
1347 swap(signarray[i*P], signarray[i*P+1]);
1352 for (i = 3; i < Q; i += 2)
1354 for (j = 0; j <
P; j++)
1356 signarray[arrayindx[i*P+j]] *= -1;
1360 for (i = 0; i <
P; i++)
1362 swap(maparray [i*Q], maparray [i*Q+1]);
1363 swap(signarray[i*Q], signarray[i*Q+1]);
1375 "Mapping not defined for this type of basis");
1381 if(useCoeffPacking ==
true)
1401 ASSERTL0(
false,
"local vertex id must be between 0 and 4");
1424 ASSERTL0(
false,
"local vertex id must be between 0 and 4");
1439 const int P =
m_base[0]->GetNumModes() - 1;
1440 const int Q =
m_base[1]->GetNumModes() - 1;
1441 const int R =
m_base[2]->GetNumModes() - 1;
1444 if (maparray.num_elements() != nEdgeIntCoeffs)
1449 if(signarray.num_elements() != nEdgeIntCoeffs)
1455 fill(signarray.get(), signarray.get()+nEdgeIntCoeffs, 1);
1465 for (i = 2; i <=
P; ++i)
1467 maparray[i-2] =
GetMode(i,0,0);
1472 for (i = 2; i <= Q; ++i)
1474 maparray[i-2] =
GetMode(1,i,0);
1478 for (i = 2; i <=
P; ++i)
1480 maparray[i-2] =
GetMode(i,1,0);
1485 for (i = 2; i <= Q; ++i)
1487 maparray[i-2] =
GetMode(0,i,0);
1491 for (i = 2; i <= R; ++i)
1493 maparray[i-2] =
GetMode(0,0,i);
1498 for (i = 1; i <= R-1; ++i)
1500 maparray[i-1] =
GetMode(1,0,i);
1504 for (i = 1; i <= R-1; ++i)
1506 maparray[i-1] =
GetMode(1,1,i);
1511 for (i = 1; i <= R-1; ++i)
1513 maparray[i-1] =
GetMode(0,1,i);
1517 ASSERTL0(
false,
"Edge not defined.");
1523 for (i = 1; i < nEdgeIntCoeffs; i += 2)
1536 const int P =
m_base[0]->GetNumModes() - 1;
1537 const int Q =
m_base[1]->GetNumModes() - 1;
1538 const int R =
m_base[2]->GetNumModes() - 1;
1540 int p, q, r, idx = 0;
1545 if (maparray.num_elements() != nFaceIntCoeffs)
1550 if (signarray.num_elements() != nFaceIntCoeffs)
1556 fill(signarray.get(), signarray.get()+nFaceIntCoeffs, 1);
1567 for (i = 0; i < nummodesB; i++)
1569 for (j = 0; j < nummodesA; j++)
1573 arrayindx[i*nummodesA+j] = i*nummodesA+j;
1577 arrayindx[i*nummodesA+j] = j*nummodesB+i;
1586 for (q = 2; q <= Q; ++q)
1588 for (p = 2; p <=
P; ++
p)
1590 maparray[arrayindx[(q-2)*nummodesA+(p-2)]] =
GetMode(p,q,0);
1595 for (p = 2; p <=
P; ++
p)
1597 for (r = 1; r <= R-
p; ++r)
1599 if ((
int)faceOrient == 7)
1601 signarray[idx] = p % 2 ? -1 : 1;
1603 maparray[idx++] =
GetMode(p,0,r);
1608 for (q = 2; q <= Q; ++q)
1610 for (r = 1; r <= R-q; ++r)
1612 if ((
int)faceOrient == 7)
1614 signarray[idx] = q % 2 ? -1 : 1;
1616 maparray[idx++] =
GetMode(1, q, r);
1622 for (p = 2; p <=
P; ++
p)
1624 for (r = 1; r <= R-
p; ++r)
1626 if ((
int)faceOrient == 7)
1628 signarray[idx] = p % 2 ? -1 : 1;
1630 maparray[idx++] =
GetMode(p, 1, r);
1636 for (q = 2; q <= Q; ++q)
1638 for (r = 1; r <= R-q; ++r)
1640 if ((
int)faceOrient == 7)
1642 signarray[idx] = q % 2 ? -1 : 1;
1644 maparray[idx++] =
GetMode(0, q, r);
1649 ASSERTL0(
false,
"Face interior map not available.");
1659 if (faceOrient == 6 || faceOrient == 8 ||
1660 faceOrient == 11 || faceOrient == 12)
1664 for (i = 1; i < nummodesB; i += 2)
1666 for (j = 0; j < nummodesA; j++)
1668 signarray[arrayindx[i*nummodesA+j]] *= -1;
1674 for (i = 0; i < nummodesB; i++)
1676 for (j = 1; j < nummodesA; j += 2)
1678 signarray[arrayindx[i*nummodesA+j]] *= -1;
1684 if (faceOrient == 7 || faceOrient == 8 ||
1685 faceOrient == 10 || faceOrient == 12)
1689 for (i = 0; i < nummodesB; i++)
1691 for (j = 1; j < nummodesA; j += 2)
1693 signarray[arrayindx[i*nummodesA+j]] *= -1;
1699 for (i = 1; i < nummodesB; i += 2)
1701 for (j = 0; j < nummodesA; j++)
1703 signarray[arrayindx[i*nummodesA+j]] *= -1;
1714 "BasisType is not a boundary interior form");
1717 "BasisType is not a boundary interior form");
1720 "BasisType is not a boundary interior form");
1723 int P =
m_base[0]->GetNumModes() - 1,
p;
1724 int Q =
m_base[1]->GetNumModes() - 1, q;
1725 int R =
m_base[2]->GetNumModes() - 1, r;
1729 if(outarray.num_elements()!=nIntCoeffs)
1737 for (
p = 2;
p <=
P; ++
p)
1739 for (q = 2; q <= Q; ++q)
1741 int maxpq = max(
p,q);
1742 for (r = 1; r <= R-maxpq; ++r)
1754 "BasisType is not a boundary interior form");
1757 "BasisType is not a boundary interior form");
1760 "BasisType is not a boundary interior form");
1762 int P =
m_base[0]->GetNumModes() - 1,
p;
1763 int Q =
m_base[1]->GetNumModes() - 1, q;
1764 int R =
m_base[2]->GetNumModes() - 1, r;
1769 if (maparray.num_elements() != nBnd)
1775 for (
p = 0;
p <=
P; ++
p)
1780 for (q = 0; q <= Q; ++q)
1782 int maxpq = max(
p,q);
1783 for (r = 0; r <= R-maxpq; ++r)
1793 for (q = 0; q <= Q; ++q)
1797 for (r = 0; r <= R-
p; ++r)
1799 maparray[idx++] =
GetMode(p,q,r);
1852 const int Q =
m_base[1]->GetNumModes()-1;
1853 const int R =
m_base[2]->GetNumModes()-1;
1859 for (i = 0; i < I; ++i)
1865 cnt += (R+1-i)*(Q+1) - l*(l+1)/2;
1870 cnt += (R+1-I)*J - l*(l+1)/2;
1885 int nquad0 =
m_base[0]->GetNumPoints();
1886 int nquad1 =
m_base[1]->GetNumPoints();
1887 int nquad2 =
m_base[2]->GetNumPoints();
1896 for(i = 0; i < nquad1*nquad2; ++i)
1899 w0.get(), 1, outarray.get()+i*nquad0,1);
1903 for(j = 0; j < nquad2; ++j)
1905 for(i = 0; i < nquad1; ++i)
1919 for(i = 0; i < nquad2; ++i)
1922 &outarray[0]+i*nquad0*nquad1, 1);
1927 for(i = 0; i < nquad2; ++i)
1929 Blas::Dscal(nquad0*nquad1,0.25*(1-z2[i])*(1-z2[i])*w2[i],
1930 &outarray[0]+i*nquad0*nquad1,1);
1941 int qa =
m_base[0]->GetNumPoints();
1942 int qb =
m_base[1]->GetNumPoints();
1943 int qc =
m_base[2]->GetNumPoints();
1944 int nmodes_a =
m_base[0]->GetNumModes();
1945 int nmodes_b =
m_base[1]->GetNumModes();
1946 int nmodes_c =
m_base[2]->GetNumModes();
1961 OrthoExp.
FwdTrans(array,orthocoeffs);
1971 for(
int i = 0; i < nmodes_a; ++i)
1973 for(
int j = 0; j < nmodes_b; ++j)
1975 int maxij = max(i,j);
1977 pow((1.0*i)/(nmodes_a-1),cutoff*nmodes_a),
1978 pow((1.0*j)/(nmodes_b-1),cutoff*nmodes_b));
1980 for(
int k = 0; k < nmodes_c-maxij; ++k)
1983 pow((1.0*k)/(nmodes_c-1),cutoff*nmodes_c));
1985 orthocoeffs[cnt] *= SvvDiffCoeff * fac;
2001 max_abc = max(max_abc,0);
2004 for(
int i = 0; i < nmodes_a; ++i)
2006 for(
int j = 0; j < nmodes_b; ++j)
2008 int maxij = max(i,j);
2010 for(
int k = 0; k < nmodes_c-maxij; ++k)
2012 int maxijk = max(maxij,k);
2015 orthocoeffs[cnt] *= SvvDiffCoeff *
2032 int cutoff_a = (int) (SVVCutOff*nmodes_a);
2033 int cutoff_b = (int) (SVVCutOff*nmodes_b);
2034 int cutoff_c = (int) (SVVCutOff*nmodes_c);
2038 int nmodes = min(min(nmodes_a,nmodes_b),nmodes_c);
2039 NekDouble cutoff = min(min(cutoff_a,cutoff_b),cutoff_c);
2041 for(i = 0; i < nmodes_a; ++i)
2043 for(j = 0; j < nmodes_b; ++j)
2045 int maxij = max(i,j);
2046 for(k = 0; k < nmodes_c-maxij; ++k)
2048 if(j + k >= cutoff || i + k >= cutoff)
2051 (SvvDiffCoeff*exp(-(i+k-nmodes)*(i+k-nmodes)/
2053 (i+k-cutoff+epsilon))))*
2054 exp(-(j-nmodes)*(j-nmodes)/
2056 (j-cutoff+epsilon)))));
2060 orthocoeffs[cnt] *= 0.0;
2069 OrthoExp.
BwdTrans(orthocoeffs,array);
2077 int nquad0 =
m_base[0]->GetNumPoints();
2078 int nquad1 =
m_base[1]->GetNumPoints();
2079 int nquad2 =
m_base[2]->GetNumPoints();
2080 int nqtot = nquad0*nquad1*nquad2;
2081 int nmodes0 =
m_base[0]->GetNumModes();
2082 int nmodes1 =
m_base[1]->GetNumModes();
2083 int nmodes2 =
m_base[2]->GetNumModes();
2084 int numMax = nmodes0;
2112 OrthoPyrExp->FwdTrans(phys_tmp, coeff);
2115 for (u = 0; u < numMin; ++u)
2117 for (i = 0; i < numMin; ++i)
2120 int maxui = max(u,i);
2122 tmp2 = coeff_tmp1 + cnt, 1);
2123 cnt += nmodes2 - maxui;
2126 for (i = numMin; i < nmodes1; ++i)
2128 int maxui = max(u,i);
2129 cnt += numMax - maxui;
2133 OrthoPyrExp->BwdTrans(coeff_tmp1, phys_tmp);
virtual int v_GetFaceNcoeffs(const int i) const
virtual void v_GetFaceInteriorMap(const int fid, const Orientation faceOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
#define ASSERTL0(condition, msg)
const int kSVVDGFiltermodesmax
virtual void v_GetCoords(Array< OneD, NekDouble > &xi_x, Array< OneD, NekDouble > &xi_y, Array< OneD, NekDouble > &xi_z)
void v_MultiplyByStdQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
static Array< OneD, NekDouble > NullNekDouble1DArray
LibUtilities::ShapeType DetShapeType() const
This function returns the shape of the expansion domain.
Principle Modified Functions .
int GetNumPoints(const int dir) const
This function returns the number of quadrature points in the dir direction.
int NumBndryCoeffs(void) const
int GetBasisNumModes(const int dir) const
This function returns the number of expansion modes in the dir direction.
void MultiplyByStdQuadratureMetric(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
virtual void v_FillMode(const int mode, Array< OneD, NekDouble > &outarray)
int GetMode(int I, int J, int K)
Compute the mode number in the expansion for a particular tensorial combination.
virtual LibUtilities::BasisType v_GetEdgeBasisType(const int i) const
LibUtilities::BasisKey EvaluateTriFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
BasisType GetBasisType() const
Return type of expansion basis.
virtual DNekMatSharedPtr v_GenMatrix(const StdMatrixKey &mkey)
Principle Modified Functions .
virtual void v_GetEdgeInteriorMap(const int eid, const Orientation edgeOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray)
virtual int v_GetFaceIntNcoeffs(const int i) const
int getNumberOfBndCoefficients(int Na, int Nb, int Nc)
virtual int v_GetFaceNumPoints(const int i) const
virtual int v_GetEdgeNcoeffs(const int i) const
const int kSVVDGFiltermodesmin
std::shared_ptr< DNekMat > DNekMatSharedPtr
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 int v_GetNfaces() const
static void Dgemm(const char &transa, const char &transb, const int &m, const int &n, const int &k, const double &alpha, const double *a, const int &lda, const double *b, const int &ldb, const double &beta, double *c, const int &ldc)
BLAS level 3: Matrix-matrix multiply C = A x B where A[m x n], B[n x k], C[m x k].
virtual void v_IProductWRTDerivBase(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
DNekMatSharedPtr GetStdMatrix(const StdMatrixKey &mkey)
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_SVVLaplacianFilter(Array< OneD, NekDouble > &array, const StdMatrixKey &mkey)
int GetFaceNcoeffs(const int i) const
This function returns the number of expansion coefficients belonging to the i-th face.
virtual int v_CalcNumberOfCoefficients(const std::vector< unsigned int > &nummodes, int &modes_offset)
virtual void v_IProductWRTBase_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool multiplybyweights=true)
void PhysTensorDeriv(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray_d1, Array< OneD, NekDouble > &outarray_d2, Array< OneD, NekDouble > &outarray_d3)
Calculate the 3D derivative in the local tensor/collapsed coordinate at the physical points...
The base class for all shapes.
void IProductWRTBase_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)
virtual void v_GetBoundaryMap(Array< OneD, unsigned int > &outarray)
static const NekDouble kNekZeroTol
int GetNumModes() const
Returns the order of the basis.
virtual int v_GetNedges() const
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
int getNumberOfCoefficients(int Na)
LibUtilities::BasisKey EvaluateQuadFaceBasisKey(const int facedir, const LibUtilities::BasisType faceDirBasisType, const int numpoints, const int nummodes)
virtual void v_LocCoordToLocCollapsed(const Array< OneD, const NekDouble > &xi, Array< OneD, NekDouble > &eta)
virtual void v_BwdTrans_SumFac(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
virtual int v_NumBndryCoeffs() const
virtual int v_GetVertexMap(int localVertexId, bool useCoeffPacking=false)
virtual int v_NumDGBndryCoeffs() const
DNekMatSharedPtr CreateGeneralMatrix(const StdMatrixKey &mkey)
this function generates the mass matrix
Principle Orthogonal Functions .
Defines a specification for a set of points.
static void Dgemv(const char &trans, const int &m, const int &n, const double &alpha, const double *a, const int &lda, const double *x, const int &incx, const double &beta, double *y, const int &incy)
BLAS level 2: Matrix vector multiply y = A x where A[m x n].
virtual const LibUtilities::BasisKey v_DetFaceBasisKey(const int i, const int k) const
virtual void v_GetInteriorMap(Array< OneD, unsigned int > &outarray)
virtual void v_IProductWRTBase_SumFacKernel(const Array< OneD, const NekDouble > &base0, const Array< OneD, const NekDouble > &base1, const Array< OneD, const NekDouble > &base2, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, Array< OneD, NekDouble > &wsp, bool doCheckCollDir0, bool doCheckCollDir1, bool doCheckCollDir2)
virtual void v_ReduceOrderCoeffs(int numMin, 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 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)
NekDouble GetConstFactor(const ConstFactorType &factor) const
int GetNcoeffs(void) const
This function returns the total number of coefficients used in the expansion.
virtual void v_GetFaceToElementMap(const int fid, const Orientation faceOrient, Array< OneD, unsigned int > &maparray, Array< OneD, int > &signarray, int nummodesA=-1, int nummodesB=-1)
const NekDouble kSVVDGFilter[9][11]
virtual DNekMatSharedPtr v_CreateStdMatrix(const StdMatrixKey &mkey)
Principle Orthogonal Functions .
int getNumberOfCoefficients(int Na, int Nb, int Nc)
static void Dscal(const int &n, const double &alpha, double *x, const int &incx)
BLAS level 1: x = alpha x.
static double Ddot(const int &n, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: output = .
LibUtilities::PointsType GetPointsType(const int dir) const
This function returns the type of quadrature points used in the dir direction.
virtual LibUtilities::ShapeType v_DetShapeType() const
bool ConstFactorExists(const ConstFactorType &factor) const
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed t...
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
Gauss Radau pinned at x=-1, .
void BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Backward transformation from coefficient space to physical space...
virtual 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(),m_base[1]->GetBdata(), m_base[2]->GetBdata() and return in outarray.
static const BasisKey NullBasisKey(eNoBasisType, 0, NullPointsKey)
Defines a null basis with no type or points.
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_IProductWRTDerivBase_SumFac(const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Array< OneD, LibUtilities::BasisSharedPtr > m_base
static void Daxpy(const int &n, const double &alpha, const double *x, const int &incx, const double *y, const int &incy)
BLAS level 1: y = alpha x plus y.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
virtual void v_BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
Backward transformation is evaluated at the quadrature points.
LibUtilities::BasisType GetEdgeBasisType(const int i) const
This function returns the type of expansion basis on the i-th edge.
Describes the specification for a Basis.
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
void Vmul(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Multiply vector z = x*y.
virtual int v_GetNverts() const
std::shared_ptr< StdPyrExp > StdPyrExpSharedPtr
void FwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This function performs the Forward transformation from physical space to coefficient space...