40 #include <boost/math/special_functions/gamma.hpp>
94 m_session->LoadParameter (
"thermalConductivity",
103 int nConvectiveFields = pFields.num_elements();
104 int nScalars = nConvectiveFields - 1;
105 int nDim = pFields[0]->GetCoordim(0);
106 int nSolutionPts = pFields[0]->GetTotPoints();
107 int nTracePts = pFields[0]->GetTrace()->GetTotPoints();
110 if (pSession->DefinesSolverInfo(
"HOMOGENEOUS"))
151 for (i = 0; i < nScalars; ++i)
160 for (j = 0; j < nDim; ++j)
171 for (i = 0; i < nConvectiveFields; ++i)
179 for (j = 0; j < nDim; ++j)
190 for (j = 0; j < nScalars; ++j)
200 for (j = 0; j < nScalars+1; ++j)
230 int nLocalSolutionPts;
231 int nElements = pFields[0]->GetExpSize();
232 int nDimensions = pFields[0]->GetCoordim(0);
233 int nSolutionPts = pFields[0]->GetTotPoints();
234 int nTracePts = pFields[0]->GetTrace()->GetTotPoints();
237 for (i = 0; i < nDimensions; ++i)
256 for (n = 0; n < nElements; ++n)
258 ptsKeys = pFields[0]->GetExp(n)->GetPointsKeys();
259 nLocalSolutionPts = pFields[0]->GetExp(n)->GetTotPoints();
260 phys_offset = pFields[0]->GetPhys_Offset(n);
261 jac = pFields[0]->GetExp(n)
264 for (i = 0; i < nLocalSolutionPts; ++i)
266 m_jac[i+phys_offset] = jac[0];
284 for (n = 0; n < nElements; ++n)
286 base = pFields[0]->GetExp(n)->GetBase();
287 nquad0 = base[0]->GetNumPoints();
288 nquad1 = base[1]->GetNumPoints();
296 pFields[0]->GetExp(n)->GetEdgeQFactors(
297 0, auxArray1 = m_Q2D_e0[n]);
298 pFields[0]->GetExp(n)->GetEdgeQFactors(
299 1, auxArray1 = m_Q2D_e1[n]);
300 pFields[0]->GetExp(n)->GetEdgeQFactors(
301 2, auxArray1 = m_Q2D_e2[n]);
302 pFields[0]->GetExp(n)->GetEdgeQFactors(
303 3, auxArray1 = m_Q2D_e3[n]);
305 ptsKeys = pFields[0]->GetExp(n)->GetPointsKeys();
306 nLocalSolutionPts = pFields[0]->GetExp(n)->GetTotPoints();
307 phys_offset = pFields[0]->GetPhys_Offset(n);
309 jac = pFields[0]->GetExp(n)
312 gmat = pFields[0]->GetExp(n)
316 if (pFields[0]->GetExp(n)
317 ->as<LocalRegions::Expansion2D>()->GetGeom2D()
318 ->GetMetricInfo()->GetGtype()
321 for (i = 0; i < nLocalSolutionPts; ++i)
323 m_jac[i+phys_offset] = jac[i];
324 m_gmat[0][i+phys_offset] = gmat[0][i];
325 m_gmat[1][i+phys_offset] = gmat[1][i];
326 m_gmat[2][i+phys_offset] = gmat[2][i];
327 m_gmat[3][i+phys_offset] = gmat[3][i];
332 for (i = 0; i < nLocalSolutionPts; ++i)
334 m_jac[i+phys_offset] = jac[0];
335 m_gmat[0][i+phys_offset] = gmat[0][0];
336 m_gmat[1][i+phys_offset] = gmat[1][0];
337 m_gmat[2][i+phys_offset] = gmat[2][0];
338 m_gmat[3][i+phys_offset] = gmat[3][0];
346 ASSERTL0(
false,
"3DFR Metric terms not implemented yet");
351 ASSERTL0(
false,
"Expansion dimension not recognised");
381 int nquad0, nquad1, nquad2;
382 int nmodes0, nmodes1, nmodes2;
385 int nElements = pFields[0]->GetExpSize();
386 int nDim = pFields[0]->GetCoordim(0);
395 for (n = 0; n < nElements; ++n)
397 base = pFields[0]->GetExp(n)->GetBase();
398 nquad0 = base[0]->GetNumPoints();
399 nmodes0 = base[0]->GetNumModes();
403 base[0]->GetZW(z0, w0);
415 int p0 = nmodes0 - 1;
421 NekDouble ap0 = boost::math::tgamma(2 * p0 + 1)
423 * boost::math::tgamma(p0 + 1)
424 * boost::math::tgamma(p0 + 1));
433 c0 = 2.0 * p0 / ((2.0 * p0 + 1.0) * (p0 + 1.0)
434 * (ap0 * boost::math::tgamma(p0 + 1))
435 * (ap0 * boost::math::tgamma(p0 + 1)));
439 c0 = 2.0 * (p0 + 1.0) / ((2.0 * p0 + 1.0) * p0
440 * (ap0 * boost::math::tgamma(p0 + 1))
441 * (ap0 * boost::math::tgamma(p0 + 1)));
445 c0 = -2.0 / ((2.0 * p0 + 1.0)
446 * (ap0 * boost::math::tgamma(p0 + 1))
447 * (ap0 * boost::math::tgamma(p0 + 1)));
451 c0 = 10000000000000000.0;
454 NekDouble etap0 = 0.5 * c0 * (2.0 * p0 + 1.0)
455 * (ap0 * boost::math::tgamma(p0 + 1))
456 * (ap0 * boost::math::tgamma(p0 + 1));
458 NekDouble overeta0 = 1.0 / (1.0 + etap0);
469 for(i = 0; i < nquad0; ++i)
475 m_dGL_xi1[n][i] = 0.5 * sign0 * m_dGL_xi1[n][i];
479 for(i = 0; i < nquad0; ++i)
481 m_dGR_xi1[n][i] = etap0 * dLpm0[i];
482 m_dGR_xi1[n][i] += dLpp0[i];
483 m_dGR_xi1[n][i] *= overeta0;
484 m_dGR_xi1[n][i] += dLp0[i];
485 m_dGR_xi1[n][i] = 0.5 * m_dGR_xi1[n][i];
502 for (n = 0; n < nElements; ++n)
504 base = pFields[0]->GetExp(n)->GetBase();
505 nquad0 = base[0]->GetNumPoints();
506 nquad1 = base[1]->GetNumPoints();
507 nmodes0 = base[0]->GetNumModes();
508 nmodes1 = base[1]->GetNumModes();
515 base[0]->GetZW(z0, w0);
516 base[1]->GetZW(z1, w1);
533 int p0 = nmodes0 - 1;
534 int p1 = nmodes1 - 1;
541 NekDouble ap0 = boost::math::tgamma(2 * p0 + 1)
543 * boost::math::tgamma(p0 + 1)
544 * boost::math::tgamma(p0 + 1));
546 NekDouble ap1 = boost::math::tgamma(2 * p1 + 1)
548 * boost::math::tgamma(p1 + 1)
549 * boost::math::tgamma(p1 + 1));
559 c0 = 2.0 * p0 / ((2.0 * p0 + 1.0) * (p0 + 1.0)
560 * (ap0 * boost::math::tgamma(p0 + 1))
561 * (ap0 * boost::math::tgamma(p0 + 1)));
563 c1 = 2.0 * p1 / ((2.0 * p1 + 1.0) * (p1 + 1.0)
564 * (ap1 * boost::math::tgamma(p1 + 1))
565 * (ap1 * boost::math::tgamma(p1 + 1)));
569 c0 = 2.0 * (p0 + 1.0) / ((2.0 * p0 + 1.0) * p0
570 * (ap0 * boost::math::tgamma(p0 + 1))
571 * (ap0 * boost::math::tgamma(p0 + 1)));
573 c1 = 2.0 * (p1 + 1.0) / ((2.0 * p1 + 1.0) * p1
574 * (ap1 * boost::math::tgamma(p1 + 1))
575 * (ap1 * boost::math::tgamma(p1 + 1)));
579 c0 = -2.0 / ((2.0 * p0 + 1.0)
580 * (ap0 * boost::math::tgamma(p0 + 1))
581 * (ap0 * boost::math::tgamma(p0 + 1)));
583 c1 = -2.0 / ((2.0 * p1 + 1.0)
584 * (ap1 * boost::math::tgamma(p1 + 1))
585 * (ap1 * boost::math::tgamma(p1 + 1)));
589 c0 = 10000000000000000.0;
590 c1 = 10000000000000000.0;
593 NekDouble etap0 = 0.5 * c0 * (2.0 * p0 + 1.0)
594 * (ap0 * boost::math::tgamma(p0 + 1))
595 * (ap0 * boost::math::tgamma(p0 + 1));
597 NekDouble etap1 = 0.5 * c1 * (2.0 * p1 + 1.0)
598 * (ap1 * boost::math::tgamma(p1 + 1))
599 * (ap1 * boost::math::tgamma(p1 + 1));
601 NekDouble overeta0 = 1.0 / (1.0 + etap0);
602 NekDouble overeta1 = 1.0 / (1.0 + etap1);
617 for(i = 0; i < nquad0; ++i)
623 m_dGL_xi1[n][i] = 0.5 * sign0 * m_dGL_xi1[n][i];
627 for(i = 0; i < nquad1; ++i)
629 m_dGL_xi2[n][i] = etap1 * dLpm1[i];
630 m_dGL_xi2[n][i] += dLpp1[i];
631 m_dGL_xi2[n][i] *= overeta1;
632 m_dGL_xi2[n][i] = dLp1[i] - m_dGL_xi2[n][i];
633 m_dGL_xi2[n][i] = 0.5 * sign1 * m_dGL_xi2[n][i];
637 for(i = 0; i < nquad0; ++i)
639 m_dGR_xi1[n][i] = etap0 * dLpm0[i];
640 m_dGR_xi1[n][i] += dLpp0[i];
641 m_dGR_xi1[n][i] *= overeta0;
642 m_dGR_xi1[n][i] += dLp0[i];
643 m_dGR_xi1[n][i] = 0.5 * m_dGR_xi1[n][i];
647 for(i = 0; i < nquad1; ++i)
649 m_dGR_xi2[n][i] = etap1 * dLpm1[i];
650 m_dGR_xi2[n][i] += dLpp1[i];
651 m_dGR_xi2[n][i] *= overeta1;
652 m_dGR_xi2[n][i] += dLp1[i];
653 m_dGR_xi2[n][i] = 0.5 * m_dGR_xi2[n][i];
667 for (n = 0; n < nElements; ++n)
669 base = pFields[0]->GetExp(n)->GetBase();
670 nquad0 = base[0]->GetNumPoints();
671 nquad1 = base[1]->GetNumPoints();
672 nquad2 = base[2]->GetNumPoints();
673 nmodes0 = base[0]->GetNumModes();
674 nmodes1 = base[1]->GetNumModes();
675 nmodes2 = base[2]->GetNumModes();
684 base[0]->GetZW(z0, w0);
685 base[1]->GetZW(z1, w1);
686 base[1]->GetZW(z2, w2);
708 int p0 = nmodes0 - 1;
709 int p1 = nmodes1 - 1;
710 int p2 = nmodes2 - 1;
718 NekDouble ap0 = boost::math::tgamma(2 * p0 + 1)
720 * boost::math::tgamma(p0 + 1)
721 * boost::math::tgamma(p0 + 1));
724 NekDouble ap1 = boost::math::tgamma(2 * p1 + 1)
726 * boost::math::tgamma(p1 + 1)
727 * boost::math::tgamma(p1 + 1));
730 NekDouble ap2 = boost::math::tgamma(2 * p2 + 1)
732 * boost::math::tgamma(p2 + 1)
733 * boost::math::tgamma(p2 + 1));
744 c0 = 2.0 * p0 / ((2.0 * p0 + 1.0) * (p0 + 1.0)
745 * (ap0 * boost::math::tgamma(p0 + 1))
746 * (ap0 * boost::math::tgamma(p0 + 1)));
748 c1 = 2.0 * p1 / ((2.0 * p1 + 1.0) * (p1 + 1.0)
749 * (ap1 * boost::math::tgamma(p1 + 1))
750 * (ap1 * boost::math::tgamma(p1 + 1)));
752 c2 = 2.0 * p2 / ((2.0 * p2 + 1.0) * (p2 + 1.0)
753 * (ap2 * boost::math::tgamma(p2 + 1))
754 * (ap2 * boost::math::tgamma(p2 + 1)));
758 c0 = 2.0 * (p0 + 1.0) / ((2.0 * p0 + 1.0) * p0
759 * (ap0 * boost::math::tgamma(p0 + 1))
760 * (ap0 * boost::math::tgamma(p0 + 1)));
762 c1 = 2.0 * (p1 + 1.0) / ((2.0 * p1 + 1.0) * p1
763 * (ap1 * boost::math::tgamma(p1 + 1))
764 * (ap1 * boost::math::tgamma(p1 + 1)));
766 c2 = 2.0 * (p2 + 1.0) / ((2.0 * p2 + 1.0) * p2
767 * (ap2 * boost::math::tgamma(p2 + 1))
768 * (ap2 * boost::math::tgamma(p2 + 1)));
772 c0 = -2.0 / ((2.0 * p0 + 1.0)
773 * (ap0 * boost::math::tgamma(p0 + 1))
774 * (ap0 * boost::math::tgamma(p0 + 1)));
776 c1 = -2.0 / ((2.0 * p1 + 1.0)
777 * (ap1 * boost::math::tgamma(p1 + 1))
778 * (ap1 * boost::math::tgamma(p1 + 1)));
780 c2 = -2.0 / ((2.0 * p2 + 1.0)
781 * (ap2 * boost::math::tgamma(p2 + 1))
782 * (ap2 * boost::math::tgamma(p2 + 1)));
786 c0 = 10000000000000000.0;
787 c1 = 10000000000000000.0;
788 c2 = 10000000000000000.0;
791 NekDouble etap0 = 0.5 * c0 * (2.0 * p0 + 1.0)
792 * (ap0 * boost::math::tgamma(p0 + 1))
793 * (ap0 * boost::math::tgamma(p0 + 1));
795 NekDouble etap1 = 0.5 * c1 * (2.0 * p1 + 1.0)
796 * (ap1 * boost::math::tgamma(p1 + 1))
797 * (ap1 * boost::math::tgamma(p1 + 1));
799 NekDouble etap2 = 0.5 * c2 * (2.0 * p2 + 1.0)
800 * (ap2 * boost::math::tgamma(p2 + 1))
801 * (ap2 * boost::math::tgamma(p2 + 1));
803 NekDouble overeta0 = 1.0 / (1.0 + etap0);
804 NekDouble overeta1 = 1.0 / (1.0 + etap1);
805 NekDouble overeta2 = 1.0 / (1.0 + etap2);
824 for(i = 0; i < nquad0; ++i)
830 m_dGL_xi1[n][i] = 0.5 * sign0 * m_dGL_xi1[n][i];
834 for(i = 0; i < nquad1; ++i)
836 m_dGL_xi2[n][i] = etap1 * dLpm1[i];
837 m_dGL_xi2[n][i] += dLpp1[i];
838 m_dGL_xi2[n][i] *= overeta1;
839 m_dGL_xi2[n][i] = dLp1[i] - m_dGL_xi2[n][i];
840 m_dGL_xi2[n][i] = 0.5 * sign1 * m_dGL_xi2[n][i];
844 for(i = 0; i < nquad2; ++i)
846 m_dGL_xi3[n][i] = etap2 * dLpm2[i];
847 m_dGL_xi3[n][i] += dLpp2[i];
848 m_dGL_xi3[n][i] *= overeta2;
849 m_dGL_xi3[n][i] = dLp2[i] - m_dGL_xi3[n][i];
850 m_dGL_xi3[n][i] = 0.5 * sign2 * m_dGL_xi3[n][i];
854 for(i = 0; i < nquad0; ++i)
856 m_dGR_xi1[n][i] = etap0 * dLpm0[i];
857 m_dGR_xi1[n][i] += dLpp0[i];
858 m_dGR_xi1[n][i] *= overeta0;
859 m_dGR_xi1[n][i] += dLp0[i];
860 m_dGR_xi1[n][i] = 0.5 * m_dGR_xi1[n][i];
864 for(i = 0; i < nquad1; ++i)
866 m_dGR_xi2[n][i] = etap1 * dLpm1[i];
867 m_dGR_xi2[n][i] += dLpp1[i];
868 m_dGR_xi2[n][i] *= overeta1;
869 m_dGR_xi2[n][i] += dLp1[i];
870 m_dGR_xi2[n][i] = 0.5 * m_dGR_xi2[n][i];
874 for(i = 0; i < nquad2; ++i)
876 m_dGR_xi3[n][i] = etap2 * dLpm2[i];
877 m_dGR_xi3[n][i] += dLpp2[i];
878 m_dGR_xi3[n][i] *= overeta2;
879 m_dGR_xi3[n][i] += dLp2[i];
880 m_dGR_xi3[n][i] = 0.5 * m_dGR_xi3[n][i];
887 ASSERTL0(
false,
"Expansion dimension not recognised");
902 const int nConvectiveFields,
915 Basis = fields[0]->GetExp(0)->GetBase();
917 int nElements = fields[0]->GetExpSize();
918 int nDim = fields[0]->GetCoordim(0);
919 int nScalars = inarray.num_elements();
920 int nSolutionPts = fields[0]->GetTotPoints();
921 int nCoeffs = fields[0]->GetNcoeffs();
924 for (i = 0; i < nConvectiveFields; ++i)
937 for (i = 0; i < nScalars; ++i)
941 for (n = 0; n < nElements; n++)
943 phys_offset = fields[0]->GetPhys_Offset(n);
945 fields[i]->GetExp(n)->PhysDeriv(0,
946 auxArray1 = inarray[i] + phys_offset,
947 auxArray2 =
m_DU1[i][0] + phys_offset);
977 for (i = 0; i < nConvectiveFields; ++i)
981 for (n = 0; n < nElements; n++)
983 phys_offset = fields[0]->GetPhys_Offset(n);
985 fields[i]->GetExp(n)->PhysDeriv(0,
987 auxArray2 =
m_DD1[i][0] + phys_offset);
1004 &
m_DD1[i][0][0], 1, &outarray[i][0], 1);
1007 if(!(Basis[0]->Collocation()))
1009 fields[i]->FwdTrans(outarray[i], outarrayCoeff[i]);
1010 fields[i]->BwdTrans(outarrayCoeff[i], outarray[i]);
1018 for(i = 0; i < nScalars; ++i)
1020 for (j = 0; j < nDim; ++j)
1029 &
m_gmat[0][0], 1, &u1_hat[0], 1);
1032 &
m_jac[0], 1, &u1_hat[0], 1);
1035 &
m_gmat[1][0], 1, &u2_hat[0], 1);
1038 &
m_jac[0], 1, &u2_hat[0], 1);
1043 &
m_gmat[2][0], 1, &u1_hat[0], 1);
1046 &
m_jac[0], 1, &u1_hat[0], 1);
1049 &
m_gmat[3][0], 1, &u2_hat[0], 1);
1052 &
m_jac[0], 1, &u2_hat[0], 1);
1055 for (n = 0; n < nElements; n++)
1057 phys_offset = fields[0]->GetPhys_Offset(n);
1059 fields[i]->GetExp(n)->StdPhysDeriv(0,
1060 auxArray1 = u1_hat + phys_offset,
1061 auxArray2 =
m_tmp1[i][j] + phys_offset);
1063 fields[i]->GetExp(n)->StdPhysDeriv(1,
1064 auxArray1 = u2_hat + phys_offset,
1065 auxArray2 =
m_tmp2[i][j] + phys_offset);
1070 &
m_DU1[i][j][0], 1);
1079 inarray[i],
m_IF1[i][j],
1085 for (j = 0; j < nSolutionPts; ++j)
1108 for (j = 0; j < nSolutionPts; j++)
1117 m_gmat[0][j] * m_BD1[i][1][j] -
1118 m_gmat[1][j] * m_BD1[i][0][j];
1122 for (j = 0; j < nDim; ++j)
1133 for (i = 0; i < nScalars; ++i)
1150 for (i = 0; i < nConvectiveFields; ++i)
1156 for (j = 0; j < nSolutionPts; j++)
1165 for (n = 0; n < nElements; n++)
1167 phys_offset = fields[0]->GetPhys_Offset(n);
1169 fields[0]->GetExp(n)->StdPhysDeriv(0,
1170 auxArray1 = f_hat + phys_offset,
1171 auxArray2 =
m_DD1[i][0] + phys_offset);
1173 fields[0]->GetExp(n)->StdPhysDeriv(1,
1174 auxArray1 = g_hat + phys_offset,
1175 auxArray2 =
m_DD1[i][1] + phys_offset);
1183 if (Basis[0]->GetPointsType() ==
1185 Basis[1]->GetPointsType() ==
1203 &
m_divFC[i][0], 1, &outarray[i][0], 1);
1208 &
m_jac[0], 1, &outarray[i][0], 1);
1211 if(!(Basis[0]->Collocation()))
1213 fields[i]->FwdTrans(outarray[i], outarrayCoeff[i]);
1214 fields[i]->BwdTrans(outarrayCoeff[i], outarray[i]);
1222 ASSERTL0(
false,
"3D FRDG case not implemented yet");
1240 int nTracePts = fields[0]->GetTrace()->GetTotPoints();
1241 int nScalars = inarray.num_elements();
1242 int nDim = fields[0]->GetCoordim(0);
1248 for (i = 0; i < nDim; ++i)
1250 fields[0]->ExtractTracePhys(inarray[i],
m_traceVel[i]);
1260 for (i = 0; i < nScalars; ++i)
1265 fields[i]->GetFwdBwdTracePhys(inarray[i], Fwd[i], Bwd[i]);
1266 fields[0]->GetTrace()->Upwind(Vn, Fwd[i], Bwd[i], numflux[i]);
1270 if (fields[0]->GetBndCondExpansions().num_elements())
1276 for (j = 0; j < nDim; ++j)
1278 for (i = 0; i < nScalars; ++i)
1281 numericalFluxO1[i][j], 1);
1299 int nBndEdgePts, nBndEdges, nBndRegions;
1301 int nTracePts = fields[0]->GetTrace()->GetTotPoints();
1302 int nScalars = inarray.num_elements();
1312 for (i = 0; i < nScalars; ++i)
1317 fields[i]->ExtractTracePhys(inarray[i], uplus[i]);
1321 for (i = 0; i < nScalars-1; ++i)
1326 nBndRegions = fields[i+1]->
1327 GetBndCondExpansions().num_elements();
1328 for (j = 0; j < nBndRegions; ++j)
1330 nBndEdges = fields[i+1]->
1331 GetBndCondExpansions()[j]->GetExpSize();
1332 for (e = 0; e < nBndEdges; ++e)
1334 nBndEdgePts = fields[i+1]->
1335 GetBndCondExpansions()[j]->GetExp(e)->GetTotPoints();
1338 GetBndCondExpansions()[j]->GetPhys_Offset(e);
1340 id2 = fields[0]->GetTrace()->
1341 GetPhys_Offset(fields[0]->GetTraceMap()->
1342 GetBndCondTraceToGlobalTraceMap(cnt++));
1345 if (boost::iequals(fields[i]->GetBndConditions()[j]->
1346 GetUserDefined(),
"WallViscous") ||
1347 boost::iequals(fields[i]->GetBndConditions()[j]->
1348 GetUserDefined(),
"WallAdiabatic"))
1351 &scalarVariables[i][id2], 1);
1355 else if (fields[i]->GetBndConditions()[j]->
1356 GetBoundaryConditionType() ==
1361 GetBndCondExpansions()[j]->
1362 UpdatePhys())[id1], 1,
1364 GetBndCondExpansions()[j]->
1365 UpdatePhys())[id1], 1,
1366 &scalarVariables[i][id2], 1);
1370 if (fields[i]->GetBndConditions()[j]->
1371 GetBoundaryConditionType() ==
1375 &scalarVariables[i][id2], 1,
1376 &penaltyfluxO1[i][id2], 1);
1380 else if ((fields[i]->GetBndConditions()[j])->
1381 GetBoundaryConditionType() ==
1386 &penaltyfluxO1[i][id2], 1);
1391 &scalarVariables[i][id2], 1,
1392 &scalarVariables[i][id2], 1,
1409 nBndRegions = fields[nScalars]->
1410 GetBndCondExpansions().num_elements();
1411 for (j = 0; j < nBndRegions; ++j)
1413 nBndEdges = fields[nScalars]->
1414 GetBndCondExpansions()[j]->GetExpSize();
1415 for (e = 0; e < nBndEdges; ++e)
1417 nBndEdgePts = fields[nScalars]->
1418 GetBndCondExpansions()[j]->GetExp(e)->GetTotPoints();
1420 id1 = fields[nScalars]->
1421 GetBndCondExpansions()[j]->GetPhys_Offset(e);
1423 id2 = fields[0]->GetTrace()->
1424 GetPhys_Offset(fields[0]->GetTraceMap()->
1425 GetBndCondTraceToGlobalTraceMap(cnt++));
1428 if (boost::iequals(fields[i]->GetBndConditions()[j]->
1429 GetUserDefined(),
"WallViscous"))
1433 &scalarVariables[nScalars-1][id2], 1);
1437 else if (fields[i]->GetBndConditions()[j]->
1438 GetBoundaryConditionType() ==
1443 &(fields[nScalars]->
1444 GetBndCondExpansions()[j]->
1447 GetBndCondExpansions()[j]->
1449 &scalarVariables[nScalars-1][id2], 1);
1453 &scalarVariables[nScalars-1][id2], 1,
1455 &scalarVariables[nScalars-1][id2], 1);
1459 &scalarVariables[nScalars-1][id2], 1,
1460 &scalarVariables[nScalars-1][id2], 1);
1464 if (fields[nScalars]->GetBndConditions()[j]->
1465 GetBoundaryConditionType() ==
1468 fields[nScalars]->GetBndConditions()[j]
1469 ->GetUserDefined(),
"WallAdiabatic"))
1472 &scalarVariables[nScalars-1][id2], 1,
1473 &penaltyfluxO1[nScalars-1][id2], 1);
1478 else if (((fields[nScalars]->GetBndConditions()[j])->
1479 GetBoundaryConditionType() ==
1482 fields[nScalars]->GetBndConditions()[j]
1483 ->GetUserDefined(),
"WallAdiabatic"))
1486 &uplus[nScalars-1][id2], 1,
1487 &penaltyfluxO1[nScalars-1][id2], 1);
1505 int nTracePts = fields[0]->GetTrace()->GetTotPoints();
1506 int nVariables = fields.num_elements();
1507 int nDim = fields[0]->GetCoordim(0);
1518 for (i = 0; i < nDim; ++i)
1520 fields[0]->ExtractTracePhys(ufield[i],
m_traceVel[i]);
1528 for (i = 1; i < nVariables; ++i)
1531 for (j = 0; j < nDim; ++j)
1534 fields[i]->GetFwdBwdTracePhys(qfield[j][i], qFwd, qBwd);
1537 fields[i]->GetTrace()->Upwind(Vn, qBwd, qFwd, qfluxtemp);
1544 if (fields[0]->GetBndCondExpansions().num_elements())
1569 int nBndEdges, nBndEdgePts;
1573 int nTracePts = fields[0]->GetTrace()->GetTotPoints();
1574 int nBndRegions = fields[var]->GetBndCondExpansions().num_elements();
1580 fields[var]->ExtractTracePhys(qfield, qtemp);
1583 for (i = 0; i < nBndRegions; ++i)
1586 nBndEdges = fields[var]->
1587 GetBndCondExpansions()[i]->GetExpSize();
1590 for (e = 0; e < nBndEdges; ++e)
1592 nBndEdgePts = fields[var]->
1593 GetBndCondExpansions()[i]->GetExp(e)->GetTotPoints();
1595 id2 = fields[0]->GetTrace()->
1596 GetPhys_Offset(fields[0]->GetTraceMap()->
1597 GetBndCondTraceToGlobalTraceMap(cnt++));
1602 if(fields[var]->GetBndConditions()[i]->
1604 && !boost::iequals(fields[var]->GetBndConditions()[i]
1605 ->GetUserDefined(),
"WallAdiabatic"))
1610 &penaltyflux[id2], 1);
1614 else if((fields[var]->GetBndConditions()[i])->
1618 "Neumann bcs not implemented for LFRNS");
1620 else if(boost::iequals(fields[var]->GetBndConditions()[i]
1621 ->GetUserDefined(),
"WallAdiabatic"))
1633 &penaltyflux[id2], 1);
1652 const int nConvectiveFields,
1659 int nLocalSolutionPts, phys_offset;
1667 Basis = fields[0]->GetExp(0)->GetBasis(0);
1669 int nElements = fields[0]->GetExpSize();
1670 int nPts = fields[0]->GetTotPoints();
1680 for (n = 0; n < nElements; ++n)
1682 nLocalSolutionPts = fields[0]->GetExp(n)->GetTotPoints();
1683 phys_offset = fields[0]->GetPhys_Offset(n);
1688 &flux[phys_offset], 1,
1691 fields[0]->GetExp(n)->GetVertexPhysVals(0, tmparrayX1,
1693 JumpL[n] = iFlux[n] - tmpFluxVertex;
1695 fields[0]->GetExp(n)->GetVertexPhysVals(1, tmparrayX1,
1697 JumpR[n] = iFlux[n+1] - tmpFluxVertex;
1700 for (n = 0; n < nElements; ++n)
1702 ptsKeys = fields[0]->GetExp(n)->GetPointsKeys();
1703 nLocalSolutionPts = fields[0]->GetExp(n)->GetTotPoints();
1704 phys_offset = fields[0]->GetPhys_Offset(n);
1705 jac = fields[0]->GetExp(n)
1709 JumpL[n] = JumpL[n] * jac[0];
1710 JumpR[n] = JumpR[n] * jac[0];
1721 Vmath::Vadd(nLocalSolutionPts, &DCL[0], 1, &DCR[0], 1,
1722 &derCFlux[phys_offset], 1);
1742 const int nConvectiveFields,
1743 const int direction,
1749 int n, e, i, j, cnt;
1753 int nElements = fields[0]->GetExpSize();
1754 int trace_offset, phys_offset;
1755 int nLocalSolutionPts;
1763 &elmtToTrace = fields[0]->GetTraceMap()->GetElmtToTrace();
1766 for (n = 0; n < nElements; ++n)
1769 phys_offset = fields[0]->GetPhys_Offset(n);
1770 nLocalSolutionPts = fields[0]->GetExp(n)->GetTotPoints();
1771 ptsKeys = fields[0]->GetExp(n)->GetPointsKeys();
1776 base = fields[0]->GetExp(n)->GetBase();
1777 nquad0 = base[0]->GetNumPoints();
1778 nquad1 = base[1]->GetNumPoints();
1786 for (e = 0; e < fields[0]->GetExp(n)->GetNedges(); ++e)
1789 nEdgePts = fields[0]->GetExp(n)->GetEdgeNumPoints(e);
1795 trace_offset = fields[0]->GetTrace()->GetPhys_Offset(
1796 elmtToTrace[n][e]->GetElmtId());
1805 fields[0]->GetExp(n)->GetEdgePhysVals(
1806 e, elmtToTrace[n][e],
1808 auxArray1 = tmparray);
1819 &tmparray[0], 1, &fluxJumps[0], 1);
1823 if (fields[0]->GetExp(n)->GetEorient(e) ==
1832 if (fields[0]->GetExp(n)->as<LocalRegions::Expansion2D>()
1833 ->GetGeom2D()->GetMetricInfo()->GetGtype()
1838 fields[0]->GetExp(n)->GetEdgePhysVals(
1839 e, elmtToTrace[n][e],
1840 jac, auxArray1 = jacEdge);
1844 if (fields[0]->GetExp(n)->GetEorient(e) ==
1853 for (j = 0; j < nEdgePts; j++)
1855 fluxJumps[j] = fluxJumps[j] * jacEdge[j];
1873 for (i = 0; i < nquad0; ++i)
1878 for (j = 0; j < nquad1; ++j)
1881 divCFluxE0[cnt] = fluxJumps[i] *
m_dGL_xi2[n][j];
1886 for (i = 0; i < nquad1; ++i)
1891 for (j = 0; j < nquad0; ++j)
1893 cnt = (nquad0)*i + j;
1894 divCFluxE1[cnt] = fluxJumps[i] *
m_dGR_xi1[n][j];
1899 for (i = 0; i < nquad0; ++i)
1904 for (j = 0; j < nquad1; ++j)
1906 cnt = (nquad0 - 1) + j*nquad0 - i;
1907 divCFluxE2[cnt] = fluxJumps[i] *
m_dGR_xi2[n][j];
1912 for (i = 0; i < nquad1; ++i)
1916 for (j = 0; j < nquad0; ++j)
1918 cnt = (nquad0*nquad1 - nquad0) + j - i*nquad0;
1919 divCFluxE3[cnt] = fluxJumps[i] *
m_dGL_xi1[n][j];
1925 ASSERTL0(
false,
"edge value (< 3) is out of range");
1939 &divCFluxE3[0], 1, &derCFlux[phys_offset], 1);
1941 else if (direction == 1)
1944 &divCFluxE2[0], 1, &derCFlux[phys_offset], 1);
1963 const int nConvectiveFields,
1970 int n, e, i, j, cnt;
1972 int nElements = fields[0]->GetExpSize();
1973 int nLocalSolutionPts;
1984 &elmtToTrace = fields[0]->GetTraceMap()->GetElmtToTrace();
1987 for(n = 0; n < nElements; ++n)
1990 phys_offset = fields[0]->GetPhys_Offset(n);
1991 nLocalSolutionPts = fields[0]->GetExp(n)->GetTotPoints();
1993 base = fields[0]->GetExp(n)->GetBase();
1994 nquad0 = base[0]->GetNumPoints();
1995 nquad1 = base[1]->GetNumPoints();
2003 for(e = 0; e < fields[0]->GetExp(n)->GetNedges(); ++e)
2006 nEdgePts = fields[0]->GetExp(n)->GetEdgeNumPoints(e);
2015 trace_offset = fields[0]->GetTrace()->GetPhys_Offset(
2016 elmtToTrace[n][e]->GetElmtId());
2020 fields[0]->GetExp(n)->GetEdgeNormal(e);
2024 fields[0]->GetExp(n)->GetEdgePhysVals(
2025 e, elmtToTrace[n][e],
2026 fluxX1 + phys_offset,
2027 auxArray1 = tmparrayX1);
2031 fields[0]->GetExp(n)->GetEdgePhysVals(
2032 e, elmtToTrace[n][e],
2033 fluxX2 + phys_offset,
2034 auxArray1 = tmparrayX2);
2037 for (i = 0; i < nEdgePts; ++i)
2046 &numericalFlux[trace_offset], 1,
2047 &fluxN[0], 1, &fluxJumps[0], 1);
2050 if (fields[0]->GetExp(n)->GetEorient(e) ==
2054 auxArray1 = fluxJumps, 1,
2055 auxArray2 = fluxJumps, 1);
2058 NekDouble fac = fields[0]->GetExp(n)->EdgeNormalNegated(e) ?
2061 for (i = 0; i < nEdgePts; ++i)
2066 fluxJumps[i] = -fluxJumps[i];
2074 for (i = 0; i < nquad0; ++i)
2077 fluxJumps[i] = -(
m_Q2D_e0[n][i]) * fluxJumps[i];
2079 for (j = 0; j < nquad1; ++j)
2082 divCFluxE0[cnt] = fluxJumps[i] *
m_dGL_xi2[n][j];
2087 for (i = 0; i < nquad1; ++i)
2090 fluxJumps[i] = (
m_Q2D_e1[n][i]) * fluxJumps[i];
2092 for (j = 0; j < nquad0; ++j)
2094 cnt = (nquad0)*i + j;
2095 divCFluxE1[cnt] = fluxJumps[i] *
m_dGR_xi1[n][j];
2100 for (i = 0; i < nquad0; ++i)
2103 fluxJumps[i] = (
m_Q2D_e2[n][i]) * fluxJumps[i];
2105 for (j = 0; j < nquad1; ++j)
2107 cnt = (nquad0 - 1) + j*nquad0 - i;
2108 divCFluxE2[cnt] = fluxJumps[i] *
m_dGR_xi2[n][j];
2113 for (i = 0; i < nquad1; ++i)
2116 fluxJumps[i] = -(
m_Q2D_e3[n][i]) * fluxJumps[i];
2117 for (j = 0; j < nquad0; ++j)
2119 cnt = (nquad0*nquad1 - nquad0) + j - i*nquad0;
2120 divCFluxE3[cnt] = fluxJumps[i] *
m_dGL_xi1[n][j];
2127 ASSERTL0(
false,
"edge value (< 3) is out of range");
2134 &divCFluxE1[0], 1, &divCFlux[phys_offset], 1);
2136 Vmath::Vadd(nLocalSolutionPts, &divCFlux[phys_offset], 1,
2137 &divCFluxE2[0], 1, &divCFlux[phys_offset], 1);
2139 Vmath::Vadd(nLocalSolutionPts, &divCFlux[phys_offset], 1,
2140 &divCFluxE3[0], 1, &divCFlux[phys_offset], 1);
2159 const int nConvectiveFields,
2166 int n, e, i, j, cnt;
2168 int nElements = fields[0]->GetExpSize();
2169 int nLocalSolutionPts;
2180 &elmtToTrace = fields[0]->GetTraceMap()->GetElmtToTrace();
2183 for(n = 0; n < nElements; ++n)
2186 phys_offset = fields[0]->GetPhys_Offset(n);
2187 nLocalSolutionPts = fields[0]->GetExp(n)->GetTotPoints();
2189 base = fields[0]->GetExp(n)->GetBase();
2190 nquad0 = base[0]->GetNumPoints();
2191 nquad1 = base[1]->GetNumPoints();
2199 for(e = 0; e < fields[0]->GetExp(n)->GetNedges(); ++e)
2202 nEdgePts = fields[0]->GetExp(n)->GetEdgeNumPoints(e);
2211 trace_offset = fields[0]->GetTrace()->GetPhys_Offset(
2212 elmtToTrace[n][e]->GetElmtId());
2216 fields[0]->GetExp(n)->GetEdgeNormal(e);
2225 fields[0]->GetExp(n)->GetEdgePhysVals(
2226 e, elmtToTrace[n][e],
2227 fluxX2 + phys_offset,
2228 auxArray1 = fluxN_D);
2234 &numericalFlux[trace_offset], 1,
2238 if (fields[0]->GetExp(n)->GetEorient(e) ==
2242 auxArray1 = fluxN, 1,
2243 auxArray2 = fluxN, 1);
2246 auxArray1 = fluxN_D, 1,
2247 auxArray2 = fluxN_D, 1);
2251 for (i = 0; i < nquad0; ++i)
2254 fluxN_R[i] = (
m_Q2D_e0[n][i]) * fluxN[i];
2257 for (i = 0; i < nEdgePts; ++i)
2264 fluxN_R[i] = -fluxN_R[i];
2272 &fluxN_D[0], 1, &fluxJumps[0], 1);
2276 for (i = 0; i < nquad0; ++i)
2278 for (j = 0; j < nquad1; ++j)
2290 fields[0]->GetExp(n)->GetEdgePhysVals(
2291 e, elmtToTrace[n][e],
2292 fluxX1 + phys_offset,
2293 auxArray1 = fluxN_D);
2297 &numericalFlux[trace_offset], 1,
2301 if (fields[0]->GetExp(n)->GetEorient(e) ==
2305 auxArray1 = fluxN, 1,
2306 auxArray2 = fluxN, 1);
2309 auxArray1 = fluxN_D, 1,
2310 auxArray2 = fluxN_D, 1);
2314 for (i = 0; i < nquad1; ++i)
2317 fluxN_R[i] = (
m_Q2D_e1[n][i]) * fluxN[i];
2320 for (i = 0; i < nEdgePts; ++i)
2327 fluxN_R[i] = -fluxN_R[i];
2335 &fluxN_D[0], 1, &fluxJumps[0], 1);
2339 for (i = 0; i < nquad1; ++i)
2341 for (j = 0; j < nquad0; ++j)
2343 cnt = (nquad0)*i + j;
2355 fields[0]->GetExp(n)->GetEdgePhysVals(
2356 e, elmtToTrace[n][e],
2357 fluxX2 + phys_offset,
2358 auxArray1 = fluxN_D);
2362 &numericalFlux[trace_offset], 1,
2366 if (fields[0]->GetExp(n)->GetEorient(e) ==
2370 auxArray1 = fluxN, 1,
2371 auxArray2 = fluxN, 1);
2374 auxArray1 = fluxN_D, 1,
2375 auxArray2 = fluxN_D, 1);
2379 for (i = 0; i < nquad0; ++i)
2382 fluxN_R[i] = (
m_Q2D_e2[n][i]) * fluxN[i];
2385 for (i = 0; i < nEdgePts; ++i)
2392 fluxN_R[i] = -fluxN_R[i];
2401 &fluxN_D[0], 1, &fluxJumps[0], 1);
2405 for (i = 0; i < nquad0; ++i)
2407 for (j = 0; j < nquad1; ++j)
2409 cnt = (nquad0 - 1) + j*nquad0 - i;
2420 fields[0]->GetExp(n)->GetEdgePhysVals(
2421 e, elmtToTrace[n][e],
2422 fluxX1 + phys_offset,
2423 auxArray1 = fluxN_D);
2428 &numericalFlux[trace_offset], 1,
2432 if (fields[0]->GetExp(n)->GetEorient(e) ==
2436 auxArray1 = fluxN, 1,
2437 auxArray2 = fluxN, 1);
2440 auxArray1 = fluxN_D, 1,
2441 auxArray2 = fluxN_D, 1);
2445 for (i = 0; i < nquad1; ++i)
2448 fluxN_R[i] = (
m_Q2D_e3[n][i]) * fluxN[i];
2451 for (i = 0; i < nEdgePts; ++i)
2458 fluxN_R[i] = -fluxN_R[i];
2467 &fluxN_D[0], 1, &fluxJumps[0], 1);
2471 for (i = 0; i < nquad1; ++i)
2473 for (j = 0; j < nquad0; ++j)
2475 cnt = (nquad0*nquad1 - nquad0) + j
2483 ASSERTL0(
false,
"edge value (< 3) is out of range");
2491 &divCFluxE1[0], 1, &divCFlux[phys_offset], 1);
2493 Vmath::Vadd(nLocalSolutionPts, &divCFlux[phys_offset], 1,
2494 &divCFluxE2[0], 1, &divCFlux[phys_offset], 1);
2496 Vmath::Vadd(nLocalSolutionPts, &divCFlux[phys_offset], 1,
2497 &divCFluxE3[0], 1, &divCFlux[phys_offset], 1);
Array< OneD, Array< OneD, NekDouble > > m_dGR_xi1
virtual void v_DerCFlux_2D(const int nConvectiveFields, const int direction, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, const NekDouble > &flux, const Array< OneD, NekDouble > &iFlux, Array< OneD, NekDouble > &derCFlux)
Compute the derivative of the corrective flux wrt a given coordinate for 2D problems.
virtual void v_SetupMetrics(LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields)
Setup the metric terms to compute the contravariant fluxes. (i.e. this special metric terms transform...
virtual void v_SetupCFunctions(LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields)
Setup the derivatives of the correction functions. For more details see J Sci Comput (2011) 47: 50–7...
#define ASSERTL0(condition, msg)
Array< OneD, Array< OneD, Array< OneD, NekDouble > > > m_DU1
std::vector< PointsKey > PointsKeyVector
virtual void v_DivCFlux_2D(const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, const NekDouble > &fluxX1, const Array< OneD, const NekDouble > &fluxX2, const Array< OneD, const NekDouble > &numericalFlux, Array< OneD, NekDouble > &divCFlux)
Compute the divergence of the corrective flux for 2D problems.
Array< OneD, Array< OneD, NekDouble > > m_dGR_xi2
virtual void v_NumericalFluxO1(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &numericalFluxO1)
Builds the numerical flux for the 1st order derivatives.
Array< OneD, Array< OneD, Array< OneD, NekDouble > > > m_BD1
Array< OneD, Array< OneD, NekDouble > > m_traceNormals
std::string m_ViscosityType
virtual void v_WeakPenaltyO1(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &penaltyfluxO1)
Imposes appropriate bcs for the 1st order derivatives.
DiffusionFactory & GetDiffusionFactory()
void Vvtvp(int n, const T *w, const int incw, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
vvtvp (vector times vector plus vector): z = w*x + y
Array< OneD, Array< OneD, NekDouble > > m_Q2D_e0
LibUtilities::SessionReaderSharedPtr m_session
DiffusionLFRNS(std::string diffType)
DiffusionLFRNS uses the Flux Reconstruction (FR) approach to compute the diffusion term...
void Vdiv(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 void v_DivCFlux_2D_Gauss(const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, const NekDouble > &fluxX1, const Array< OneD, const NekDouble > &fluxX2, const Array< OneD, const NekDouble > &numericalFlux, Array< OneD, NekDouble > &divCFlux)
Compute the divergence of the corrective flux for 2D problems where POINTSTYPE="GaussGaussLegendre".
DiffusionFluxVecCBNS m_fluxVectorNS
Array< OneD, Array< OneD, NekDouble > > m_dGL_xi1
virtual void v_DerCFlux_1D(const int nConvectiveFields, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, const NekDouble > &flux, const Array< OneD, const NekDouble > &iFlux, Array< OneD, NekDouble > &derCFlux)
Compute the derivative of the corrective flux for 1D problems.
boost::shared_ptr< SessionReader > SessionReaderSharedPtr
Array< OneD, Array< OneD, NekDouble > > m_homoDerivs
Array< OneD, NekDouble > m_jac
1D Gauss-Gauss-Legendre quadrature points
virtual void v_Diffuse(const int nConvective, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray)
Calculate FR Diffusion for the Navier-Stokes (NS) equations using an LDG interface flux...
virtual void v_WeakPenaltyO2(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const int var, const int dir, const Array< OneD, const NekDouble > &qfield, Array< OneD, NekDouble > &penaltyflux)
Imposes appropriate bcs for the 2nd order derivatives.
static std::string type[]
Array< OneD, Array< OneD, NekDouble > > m_Q2D_e3
void Reverse(int n, const T *x, const int incx, T *y, const int incy)
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
void jacobd(const int np, const double *z, double *polyd, const int n, const double alpha, const double beta)
Calculate the derivative of Jacobi polynomials.
Array< OneD, Array< OneD, Array< OneD, NekDouble > > > m_tmp2
Array< OneD, Array< OneD, NekDouble > > m_dGL_xi3
static DiffusionSharedPtr create(std::string diffType)
Array< OneD, Array< OneD, Array< OneD, NekDouble > > > m_tmp1
Array< OneD, Array< OneD, NekDouble > > m_divFD
void Neg(int n, T *x, const int incx)
Negate x = -x.
Array< OneD, Array< OneD, NekDouble > > m_dGR_xi3
NekDouble m_thermalConductivity
Array< OneD, Array< OneD, NekDouble > > m_dGL_xi2
Array< OneD, Array< OneD, Array< OneD, NekDouble > > > m_IF1
Array< OneD, Array< OneD, Array< OneD, NekDouble > > > m_DD1
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.
Array< OneD, Array< OneD, NekDouble > > m_Q2D_e2
Array< OneD, Array< OneD, NekDouble > > m_gmat
Array< OneD, Array< OneD, Array< OneD, NekDouble > > > m_DFC1
const boost::shared_ptr< SpatialDomains::GeomFactors > & GetMetricInfo(void) const
virtual void v_InitObject(LibUtilities::SessionReaderSharedPtr pSession, Array< OneD, MultiRegions::ExpListSharedPtr > pFields)
Initiliase DiffusionLFRNS objects and store them before starting the time-stepping.
Array< OneD, Array< OneD, Array< OneD, NekDouble > > > m_viscTensor
Array< OneD, Array< OneD, Array< OneD, NekDouble > > > m_D1
Array< OneD, Array< OneD, Array< OneD, NekDouble > > > m_DFC2
boost::shared_ptr< Basis > BasisSharedPtr
Array< OneD, Array< OneD, NekDouble > > m_traceVel
void Zero(int n, T *x, const int incx)
Zero vector.
Array< OneD, Array< OneD, NekDouble > > m_viscFlux
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Geometry is curved or has non-constant factors.
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 void v_NumericalFluxO2(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &ufield, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &qfield, Array< OneD, Array< OneD, NekDouble > > &qflux)
Build the numerical flux for the 2nd order derivatives.
Array< OneD, Array< OneD, NekDouble > > m_divFC
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, tDescription pDesc="")
Register a class with the factory.
Array< OneD, Array< OneD, NekDouble > > m_Q2D_e1