39 #include <boost/core/ignore_unused.hpp> 40 #include <boost/math/special_functions/gamma.hpp> 41 #include <boost/algorithm/string/predicate.hpp> 95 m_session->LoadParameter (
"thermalConductivity",
104 int nConvectiveFields = pFields.num_elements();
105 int nScalars = nConvectiveFields - 1;
106 int nDim = pFields[0]->GetCoordim(0);
107 int nSolutionPts = pFields[0]->GetTotPoints();
108 int nTracePts = pFields[0]->GetTrace()->GetTotPoints();
111 if (pSession->DefinesSolverInfo(
"HOMOGENEOUS"))
152 for (i = 0; i < nScalars; ++i)
161 for (j = 0; j < nDim; ++j)
172 for (i = 0; i < nConvectiveFields; ++i)
180 for (j = 0; j < nDim; ++j)
191 for (j = 0; j < nScalars; ++j)
201 for (j = 0; j < nScalars+1; ++j)
228 boost::ignore_unused(pSession);
233 int nLocalSolutionPts;
234 int nElements = pFields[0]->GetExpSize();
235 int nDimensions = pFields[0]->GetCoordim(0);
236 int nSolutionPts = pFields[0]->GetTotPoints();
237 int nTracePts = pFields[0]->GetTrace()->GetTotPoints();
240 for (i = 0; i < nDimensions; ++i)
259 for (n = 0; n < nElements; ++n)
261 ptsKeys = pFields[0]->GetExp(n)->GetPointsKeys();
262 nLocalSolutionPts = pFields[0]->GetExp(n)->GetTotPoints();
263 phys_offset = pFields[0]->GetPhys_Offset(n);
264 jac = pFields[0]->GetExp(n)
267 for (i = 0; i < nLocalSolutionPts; ++i)
269 m_jac[i+phys_offset] = jac[0];
287 for (n = 0; n < nElements; ++n)
289 base = pFields[0]->GetExp(n)->GetBase();
290 nquad0 = base[0]->GetNumPoints();
291 nquad1 = base[1]->GetNumPoints();
299 pFields[0]->GetExp(n)->GetEdgeQFactors(
300 0, auxArray1 = m_Q2D_e0[n]);
301 pFields[0]->GetExp(n)->GetEdgeQFactors(
302 1, auxArray1 = m_Q2D_e1[n]);
303 pFields[0]->GetExp(n)->GetEdgeQFactors(
304 2, auxArray1 = m_Q2D_e2[n]);
305 pFields[0]->GetExp(n)->GetEdgeQFactors(
306 3, auxArray1 = m_Q2D_e3[n]);
308 ptsKeys = pFields[0]->GetExp(n)->GetPointsKeys();
309 nLocalSolutionPts = pFields[0]->GetExp(n)->GetTotPoints();
310 phys_offset = pFields[0]->GetPhys_Offset(n);
312 jac = pFields[0]->GetExp(n)
315 gmat = pFields[0]->GetExp(n)
319 if (pFields[0]->GetExp(n)
320 ->as<LocalRegions::Expansion2D>()->GetGeom2D()
321 ->GetMetricInfo()->GetGtype()
324 for (i = 0; i < nLocalSolutionPts; ++i)
326 m_jac[i+phys_offset] = jac[i];
327 m_gmat[0][i+phys_offset] = gmat[0][i];
328 m_gmat[1][i+phys_offset] = gmat[1][i];
329 m_gmat[2][i+phys_offset] = gmat[2][i];
330 m_gmat[3][i+phys_offset] = gmat[3][i];
335 for (i = 0; i < nLocalSolutionPts; ++i)
337 m_jac[i+phys_offset] = jac[0];
338 m_gmat[0][i+phys_offset] = gmat[0][0];
339 m_gmat[1][i+phys_offset] = gmat[1][0];
340 m_gmat[2][i+phys_offset] = gmat[2][0];
341 m_gmat[3][i+phys_offset] = gmat[3][0];
349 ASSERTL0(
false,
"3DFR Metric terms not implemented yet");
354 ASSERTL0(
false,
"Expansion dimension not recognised");
380 boost::ignore_unused(pSession);
386 int nquad0, nquad1, nquad2;
387 int nmodes0, nmodes1, nmodes2;
390 int nElements = pFields[0]->GetExpSize();
391 int nDim = pFields[0]->GetCoordim(0);
400 for (n = 0; n < nElements; ++n)
402 base = pFields[0]->GetExp(n)->GetBase();
403 nquad0 = base[0]->GetNumPoints();
404 nmodes0 = base[0]->GetNumModes();
408 base[0]->GetZW(z0, w0);
420 int p0 = nmodes0 - 1;
426 NekDouble ap0 = boost::math::tgamma(2 * p0 + 1)
428 * boost::math::tgamma(p0 + 1)
429 * boost::math::tgamma(p0 + 1));
438 c0 = 2.0 * p0 / ((2.0 * p0 + 1.0) * (p0 + 1.0)
439 * (ap0 * boost::math::tgamma(p0 + 1))
440 * (ap0 * boost::math::tgamma(p0 + 1)));
444 c0 = 2.0 * (p0 + 1.0) / ((2.0 * p0 + 1.0) * p0
445 * (ap0 * boost::math::tgamma(p0 + 1))
446 * (ap0 * boost::math::tgamma(p0 + 1)));
450 c0 = -2.0 / ((2.0 * p0 + 1.0)
451 * (ap0 * boost::math::tgamma(p0 + 1))
452 * (ap0 * boost::math::tgamma(p0 + 1)));
456 c0 = 10000000000000000.0;
459 NekDouble etap0 = 0.5 * c0 * (2.0 * p0 + 1.0)
460 * (ap0 * boost::math::tgamma(p0 + 1))
461 * (ap0 * boost::math::tgamma(p0 + 1));
463 NekDouble overeta0 = 1.0 / (1.0 + etap0);
474 for(i = 0; i < nquad0; ++i)
480 m_dGL_xi1[n][i] = 0.5 * sign0 * m_dGL_xi1[n][i];
484 for(i = 0; i < nquad0; ++i)
486 m_dGR_xi1[n][i] = etap0 * dLpm0[i];
487 m_dGR_xi1[n][i] += dLpp0[i];
488 m_dGR_xi1[n][i] *= overeta0;
489 m_dGR_xi1[n][i] += dLp0[i];
490 m_dGR_xi1[n][i] = 0.5 * m_dGR_xi1[n][i];
507 for (n = 0; n < nElements; ++n)
509 base = pFields[0]->GetExp(n)->GetBase();
510 nquad0 = base[0]->GetNumPoints();
511 nquad1 = base[1]->GetNumPoints();
512 nmodes0 = base[0]->GetNumModes();
513 nmodes1 = base[1]->GetNumModes();
520 base[0]->GetZW(z0, w0);
521 base[1]->GetZW(z1, w1);
538 int p0 = nmodes0 - 1;
539 int p1 = nmodes1 - 1;
546 NekDouble ap0 = boost::math::tgamma(2 * p0 + 1)
548 * boost::math::tgamma(p0 + 1)
549 * boost::math::tgamma(p0 + 1));
551 NekDouble ap1 = boost::math::tgamma(2 * p1 + 1)
553 * boost::math::tgamma(p1 + 1)
554 * boost::math::tgamma(p1 + 1));
564 c0 = 2.0 * p0 / ((2.0 * p0 + 1.0) * (p0 + 1.0)
565 * (ap0 * boost::math::tgamma(p0 + 1))
566 * (ap0 * boost::math::tgamma(p0 + 1)));
568 c1 = 2.0 * p1 / ((2.0 * p1 + 1.0) * (p1 + 1.0)
569 * (ap1 * boost::math::tgamma(p1 + 1))
570 * (ap1 * boost::math::tgamma(p1 + 1)));
574 c0 = 2.0 * (p0 + 1.0) / ((2.0 * p0 + 1.0) * p0
575 * (ap0 * boost::math::tgamma(p0 + 1))
576 * (ap0 * boost::math::tgamma(p0 + 1)));
578 c1 = 2.0 * (p1 + 1.0) / ((2.0 * p1 + 1.0) * p1
579 * (ap1 * boost::math::tgamma(p1 + 1))
580 * (ap1 * boost::math::tgamma(p1 + 1)));
584 c0 = -2.0 / ((2.0 * p0 + 1.0)
585 * (ap0 * boost::math::tgamma(p0 + 1))
586 * (ap0 * boost::math::tgamma(p0 + 1)));
588 c1 = -2.0 / ((2.0 * p1 + 1.0)
589 * (ap1 * boost::math::tgamma(p1 + 1))
590 * (ap1 * boost::math::tgamma(p1 + 1)));
594 c0 = 10000000000000000.0;
595 c1 = 10000000000000000.0;
598 NekDouble etap0 = 0.5 * c0 * (2.0 * p0 + 1.0)
599 * (ap0 * boost::math::tgamma(p0 + 1))
600 * (ap0 * boost::math::tgamma(p0 + 1));
602 NekDouble etap1 = 0.5 * c1 * (2.0 * p1 + 1.0)
603 * (ap1 * boost::math::tgamma(p1 + 1))
604 * (ap1 * boost::math::tgamma(p1 + 1));
606 NekDouble overeta0 = 1.0 / (1.0 + etap0);
607 NekDouble overeta1 = 1.0 / (1.0 + etap1);
622 for(i = 0; i < nquad0; ++i)
628 m_dGL_xi1[n][i] = 0.5 * sign0 * m_dGL_xi1[n][i];
632 for(i = 0; i < nquad1; ++i)
634 m_dGL_xi2[n][i] = etap1 * dLpm1[i];
635 m_dGL_xi2[n][i] += dLpp1[i];
636 m_dGL_xi2[n][i] *= overeta1;
637 m_dGL_xi2[n][i] = dLp1[i] - m_dGL_xi2[n][i];
638 m_dGL_xi2[n][i] = 0.5 * sign1 * m_dGL_xi2[n][i];
642 for(i = 0; i < nquad0; ++i)
644 m_dGR_xi1[n][i] = etap0 * dLpm0[i];
645 m_dGR_xi1[n][i] += dLpp0[i];
646 m_dGR_xi1[n][i] *= overeta0;
647 m_dGR_xi1[n][i] += dLp0[i];
648 m_dGR_xi1[n][i] = 0.5 * m_dGR_xi1[n][i];
652 for(i = 0; i < nquad1; ++i)
654 m_dGR_xi2[n][i] = etap1 * dLpm1[i];
655 m_dGR_xi2[n][i] += dLpp1[i];
656 m_dGR_xi2[n][i] *= overeta1;
657 m_dGR_xi2[n][i] += dLp1[i];
658 m_dGR_xi2[n][i] = 0.5 * m_dGR_xi2[n][i];
672 for (n = 0; n < nElements; ++n)
674 base = pFields[0]->GetExp(n)->GetBase();
675 nquad0 = base[0]->GetNumPoints();
676 nquad1 = base[1]->GetNumPoints();
677 nquad2 = base[2]->GetNumPoints();
678 nmodes0 = base[0]->GetNumModes();
679 nmodes1 = base[1]->GetNumModes();
680 nmodes2 = base[2]->GetNumModes();
689 base[0]->GetZW(z0, w0);
690 base[1]->GetZW(z1, w1);
691 base[1]->GetZW(z2, w2);
713 int p0 = nmodes0 - 1;
714 int p1 = nmodes1 - 1;
715 int p2 = nmodes2 - 1;
723 NekDouble ap0 = boost::math::tgamma(2 * p0 + 1)
725 * boost::math::tgamma(p0 + 1)
726 * boost::math::tgamma(p0 + 1));
729 NekDouble ap1 = boost::math::tgamma(2 * p1 + 1)
731 * boost::math::tgamma(p1 + 1)
732 * boost::math::tgamma(p1 + 1));
735 NekDouble ap2 = boost::math::tgamma(2 * p2 + 1)
737 * boost::math::tgamma(p2 + 1)
738 * boost::math::tgamma(p2 + 1));
749 c0 = 2.0 * p0 / ((2.0 * p0 + 1.0) * (p0 + 1.0)
750 * (ap0 * boost::math::tgamma(p0 + 1))
751 * (ap0 * boost::math::tgamma(p0 + 1)));
753 c1 = 2.0 * p1 / ((2.0 * p1 + 1.0) * (p1 + 1.0)
754 * (ap1 * boost::math::tgamma(p1 + 1))
755 * (ap1 * boost::math::tgamma(p1 + 1)));
757 c2 = 2.0 * p2 / ((2.0 * p2 + 1.0) * (p2 + 1.0)
758 * (ap2 * boost::math::tgamma(p2 + 1))
759 * (ap2 * boost::math::tgamma(p2 + 1)));
763 c0 = 2.0 * (p0 + 1.0) / ((2.0 * p0 + 1.0) * p0
764 * (ap0 * boost::math::tgamma(p0 + 1))
765 * (ap0 * boost::math::tgamma(p0 + 1)));
767 c1 = 2.0 * (p1 + 1.0) / ((2.0 * p1 + 1.0) * p1
768 * (ap1 * boost::math::tgamma(p1 + 1))
769 * (ap1 * boost::math::tgamma(p1 + 1)));
771 c2 = 2.0 * (p2 + 1.0) / ((2.0 * p2 + 1.0) * p2
772 * (ap2 * boost::math::tgamma(p2 + 1))
773 * (ap2 * boost::math::tgamma(p2 + 1)));
777 c0 = -2.0 / ((2.0 * p0 + 1.0)
778 * (ap0 * boost::math::tgamma(p0 + 1))
779 * (ap0 * boost::math::tgamma(p0 + 1)));
781 c1 = -2.0 / ((2.0 * p1 + 1.0)
782 * (ap1 * boost::math::tgamma(p1 + 1))
783 * (ap1 * boost::math::tgamma(p1 + 1)));
785 c2 = -2.0 / ((2.0 * p2 + 1.0)
786 * (ap2 * boost::math::tgamma(p2 + 1))
787 * (ap2 * boost::math::tgamma(p2 + 1)));
791 c0 = 10000000000000000.0;
792 c1 = 10000000000000000.0;
793 c2 = 10000000000000000.0;
796 NekDouble etap0 = 0.5 * c0 * (2.0 * p0 + 1.0)
797 * (ap0 * boost::math::tgamma(p0 + 1))
798 * (ap0 * boost::math::tgamma(p0 + 1));
800 NekDouble etap1 = 0.5 * c1 * (2.0 * p1 + 1.0)
801 * (ap1 * boost::math::tgamma(p1 + 1))
802 * (ap1 * boost::math::tgamma(p1 + 1));
804 NekDouble etap2 = 0.5 * c2 * (2.0 * p2 + 1.0)
805 * (ap2 * boost::math::tgamma(p2 + 1))
806 * (ap2 * boost::math::tgamma(p2 + 1));
808 NekDouble overeta0 = 1.0 / (1.0 + etap0);
809 NekDouble overeta1 = 1.0 / (1.0 + etap1);
810 NekDouble overeta2 = 1.0 / (1.0 + etap2);
829 for(i = 0; i < nquad0; ++i)
835 m_dGL_xi1[n][i] = 0.5 * sign0 * m_dGL_xi1[n][i];
839 for(i = 0; i < nquad1; ++i)
841 m_dGL_xi2[n][i] = etap1 * dLpm1[i];
842 m_dGL_xi2[n][i] += dLpp1[i];
843 m_dGL_xi2[n][i] *= overeta1;
844 m_dGL_xi2[n][i] = dLp1[i] - m_dGL_xi2[n][i];
845 m_dGL_xi2[n][i] = 0.5 * sign1 * m_dGL_xi2[n][i];
849 for(i = 0; i < nquad2; ++i)
851 m_dGL_xi3[n][i] = etap2 * dLpm2[i];
852 m_dGL_xi3[n][i] += dLpp2[i];
853 m_dGL_xi3[n][i] *= overeta2;
854 m_dGL_xi3[n][i] = dLp2[i] - m_dGL_xi3[n][i];
855 m_dGL_xi3[n][i] = 0.5 * sign2 * m_dGL_xi3[n][i];
859 for(i = 0; i < nquad0; ++i)
861 m_dGR_xi1[n][i] = etap0 * dLpm0[i];
862 m_dGR_xi1[n][i] += dLpp0[i];
863 m_dGR_xi1[n][i] *= overeta0;
864 m_dGR_xi1[n][i] += dLp0[i];
865 m_dGR_xi1[n][i] = 0.5 * m_dGR_xi1[n][i];
869 for(i = 0; i < nquad1; ++i)
871 m_dGR_xi2[n][i] = etap1 * dLpm1[i];
872 m_dGR_xi2[n][i] += dLpp1[i];
873 m_dGR_xi2[n][i] *= overeta1;
874 m_dGR_xi2[n][i] += dLp1[i];
875 m_dGR_xi2[n][i] = 0.5 * m_dGR_xi2[n][i];
879 for(i = 0; i < nquad2; ++i)
881 m_dGR_xi3[n][i] = etap2 * dLpm2[i];
882 m_dGR_xi3[n][i] += dLpp2[i];
883 m_dGR_xi3[n][i] *= overeta2;
884 m_dGR_xi3[n][i] += dLp2[i];
885 m_dGR_xi3[n][i] = 0.5 * m_dGR_xi3[n][i];
892 ASSERTL0(
false,
"Expansion dimension not recognised");
907 const std::size_t nConvectiveFields,
914 boost::ignore_unused(pFwd, pBwd);
924 Basis = fields[0]->GetExp(0)->GetBase();
926 int nElements = fields[0]->GetExpSize();
927 int nDim = fields[0]->GetCoordim(0);
928 int nScalars = inarray.num_elements();
929 int nSolutionPts = fields[0]->GetTotPoints();
930 int nCoeffs = fields[0]->GetNcoeffs();
933 for (i = 0; i < nConvectiveFields; ++i)
946 for (i = 0; i < nScalars; ++i)
950 for (n = 0; n < nElements; n++)
952 phys_offset = fields[0]->GetPhys_Offset(n);
954 fields[i]->GetExp(n)->PhysDeriv(0,
955 auxArray1 = inarray[i] + phys_offset,
956 auxArray2 =
m_DU1[i][0] + phys_offset);
986 for (i = 0; i < nConvectiveFields; ++i)
990 for (n = 0; n < nElements; n++)
992 phys_offset = fields[0]->GetPhys_Offset(n);
994 fields[i]->GetExp(n)->PhysDeriv(0,
996 auxArray2 =
m_DD1[i][0] + phys_offset);
1013 &
m_DD1[i][0][0], 1, &outarray[i][0], 1);
1016 if(!(Basis[0]->Collocation()))
1018 fields[i]->FwdTrans(outarray[i], outarrayCoeff[i]);
1019 fields[i]->BwdTrans(outarrayCoeff[i], outarray[i]);
1027 for(i = 0; i < nScalars; ++i)
1029 for (j = 0; j < nDim; ++j)
1038 &
m_gmat[0][0], 1, &u1_hat[0], 1);
1041 &
m_jac[0], 1, &u1_hat[0], 1);
1044 &
m_gmat[1][0], 1, &u2_hat[0], 1);
1047 &
m_jac[0], 1, &u2_hat[0], 1);
1052 &
m_gmat[2][0], 1, &u1_hat[0], 1);
1055 &
m_jac[0], 1, &u1_hat[0], 1);
1058 &
m_gmat[3][0], 1, &u2_hat[0], 1);
1061 &
m_jac[0], 1, &u2_hat[0], 1);
1064 for (n = 0; n < nElements; n++)
1066 phys_offset = fields[0]->GetPhys_Offset(n);
1068 fields[i]->GetExp(n)->StdPhysDeriv(0,
1069 auxArray1 = u1_hat + phys_offset,
1070 auxArray2 =
m_tmp1[i][j] + phys_offset);
1072 fields[i]->GetExp(n)->StdPhysDeriv(1,
1073 auxArray1 = u2_hat + phys_offset,
1074 auxArray2 =
m_tmp2[i][j] + phys_offset);
1079 &
m_DU1[i][j][0], 1);
1088 inarray[i],
m_IF1[i][j],
1094 for (j = 0; j < nSolutionPts; ++j)
1117 for (j = 0; j < nSolutionPts; j++)
1126 m_gmat[0][j] * m_BD1[i][1][j] -
1127 m_gmat[1][j] * m_BD1[i][0][j];
1131 for (j = 0; j < nDim; ++j)
1142 for (i = 0; i < nScalars; ++i)
1159 for (i = 0; i < nConvectiveFields; ++i)
1165 for (j = 0; j < nSolutionPts; j++)
1174 for (n = 0; n < nElements; n++)
1176 phys_offset = fields[0]->GetPhys_Offset(n);
1178 fields[0]->GetExp(n)->StdPhysDeriv(0,
1179 auxArray1 = f_hat + phys_offset,
1180 auxArray2 =
m_DD1[i][0] + phys_offset);
1182 fields[0]->GetExp(n)->StdPhysDeriv(1,
1183 auxArray1 = g_hat + phys_offset,
1184 auxArray2 =
m_DD1[i][1] + phys_offset);
1192 if (Basis[0]->GetPointsType() ==
1194 Basis[1]->GetPointsType() ==
1212 &
m_divFC[i][0], 1, &outarray[i][0], 1);
1217 &
m_jac[0], 1, &outarray[i][0], 1);
1220 if(!(Basis[0]->Collocation()))
1222 fields[i]->FwdTrans(outarray[i], outarrayCoeff[i]);
1223 fields[i]->BwdTrans(outarrayCoeff[i], outarray[i]);
1231 ASSERTL0(
false,
"3D FRDG case not implemented yet");
1249 int nTracePts = fields[0]->GetTrace()->GetTotPoints();
1250 int nScalars = inarray.num_elements();
1251 int nDim = fields[0]->GetCoordim(0);
1257 for (i = 0; i < nDim; ++i)
1259 fields[0]->ExtractTracePhys(inarray[i],
m_traceVel[i]);
1269 for (i = 0; i < nScalars; ++i)
1274 fields[i]->GetFwdBwdTracePhys(inarray[i], Fwd[i], Bwd[i]);
1275 fields[0]->GetTrace()->Upwind(Vn, Fwd[i], Bwd[i], numflux[i]);
1279 if (fields[0]->GetBndCondExpansions().num_elements())
1285 for (j = 0; j < nDim; ++j)
1287 for (i = 0; i < nScalars; ++i)
1290 numericalFluxO1[i][j], 1);
1308 int nBndEdgePts, nBndEdges, nBndRegions;
1310 int nTracePts = fields[0]->GetTrace()->GetTotPoints();
1311 int nScalars = inarray.num_elements();
1321 for (i = 0; i < nScalars; ++i)
1326 fields[i]->ExtractTracePhys(inarray[i], uplus[i]);
1330 for (i = 0; i < nScalars-1; ++i)
1335 nBndRegions = fields[i+1]->
1336 GetBndCondExpansions().num_elements();
1337 for (j = 0; j < nBndRegions; ++j)
1339 if (fields[i+1]->GetBndConditions()[j]->
1345 nBndEdges = fields[i+1]->
1346 GetBndCondExpansions()[j]->GetExpSize();
1347 for (e = 0; e < nBndEdges; ++e)
1349 nBndEdgePts = fields[i+1]->
1350 GetBndCondExpansions()[j]->GetExp(e)->GetTotPoints();
1353 GetBndCondExpansions()[j]->GetPhys_Offset(e);
1355 id2 = fields[0]->GetTrace()->
1356 GetPhys_Offset(fields[0]->GetTraceMap()->
1357 GetBndCondTraceToGlobalTraceMap(cnt++));
1360 if (boost::iequals(fields[i]->GetBndConditions()[j]->
1361 GetUserDefined(),
"WallViscous") ||
1362 boost::iequals(fields[i]->GetBndConditions()[j]->
1363 GetUserDefined(),
"WallAdiabatic"))
1366 &scalarVariables[i][id2], 1);
1370 else if (fields[i]->GetBndConditions()[j]->
1371 GetBoundaryConditionType() ==
1376 GetBndCondExpansions()[j]->
1377 UpdatePhys())[id1], 1,
1379 GetBndCondExpansions()[j]->
1380 UpdatePhys())[id1], 1,
1381 &scalarVariables[i][id2], 1);
1385 if (fields[i]->GetBndConditions()[j]->
1386 GetBoundaryConditionType() ==
1390 &scalarVariables[i][id2], 1,
1391 &penaltyfluxO1[i][id2], 1);
1395 else if ((fields[i]->GetBndConditions()[j])->
1396 GetBoundaryConditionType() ==
1401 &penaltyfluxO1[i][id2], 1);
1406 &scalarVariables[i][id2], 1,
1407 &scalarVariables[i][id2], 1,
1424 nBndRegions = fields[nScalars]->
1425 GetBndCondExpansions().num_elements();
1426 for (j = 0; j < nBndRegions; ++j)
1428 nBndEdges = fields[nScalars]->
1429 GetBndCondExpansions()[j]->GetExpSize();
1431 if (fields[nScalars]->GetBndConditions()[j]->
1437 for (e = 0; e < nBndEdges; ++e)
1439 nBndEdgePts = fields[nScalars]->
1440 GetBndCondExpansions()[j]->GetExp(e)->GetTotPoints();
1442 id1 = fields[nScalars]->
1443 GetBndCondExpansions()[j]->GetPhys_Offset(e);
1445 id2 = fields[0]->GetTrace()->
1446 GetPhys_Offset(fields[0]->GetTraceMap()->
1447 GetBndCondTraceToGlobalTraceMap(cnt++));
1450 if (boost::iequals(fields[i]->GetBndConditions()[j]->
1451 GetUserDefined(),
"WallViscous"))
1455 &scalarVariables[nScalars-1][id2], 1);
1459 else if (fields[i]->GetBndConditions()[j]->
1460 GetBoundaryConditionType() ==
1465 &(fields[nScalars]->
1466 GetBndCondExpansions()[j]->
1469 GetBndCondExpansions()[j]->
1471 &scalarVariables[nScalars-1][id2], 1);
1475 &scalarVariables[nScalars-1][id2], 1,
1477 &scalarVariables[nScalars-1][id2], 1);
1481 &scalarVariables[nScalars-1][id2], 1,
1482 &scalarVariables[nScalars-1][id2], 1);
1486 if (fields[nScalars]->GetBndConditions()[j]->
1487 GetBoundaryConditionType() ==
1490 fields[nScalars]->GetBndConditions()[j]
1491 ->GetUserDefined(),
"WallAdiabatic"))
1494 &scalarVariables[nScalars-1][id2], 1,
1495 &penaltyfluxO1[nScalars-1][id2], 1);
1500 else if (((fields[nScalars]->GetBndConditions()[j])->
1501 GetBoundaryConditionType() ==
1504 fields[nScalars]->GetBndConditions()[j]
1505 ->GetUserDefined(),
"WallAdiabatic"))
1508 &uplus[nScalars-1][id2], 1,
1509 &penaltyfluxO1[nScalars-1][id2], 1);
1527 int nTracePts = fields[0]->GetTrace()->GetTotPoints();
1528 int nVariables = fields.num_elements();
1529 int nDim = fields[0]->GetCoordim(0);
1540 for (i = 0; i < nDim; ++i)
1542 fields[0]->ExtractTracePhys(ufield[i],
m_traceVel[i]);
1550 for (i = 1; i < nVariables; ++i)
1553 for (j = 0; j < nDim; ++j)
1556 fields[i]->GetFwdBwdTracePhys(qfield[j][i], qFwd, qBwd);
1559 fields[i]->GetTrace()->Upwind(Vn, qBwd, qFwd, qfluxtemp);
1566 if (fields[0]->GetBndCondExpansions().num_elements())
1591 int nBndEdges, nBndEdgePts;
1595 int nTracePts = fields[0]->GetTrace()->GetTotPoints();
1596 int nBndRegions = fields[var]->GetBndCondExpansions().num_elements();
1602 fields[var]->ExtractTracePhys(qfield, qtemp);
1605 for (i = 0; i < nBndRegions; ++i)
1608 nBndEdges = fields[var]->
1609 GetBndCondExpansions()[i]->GetExpSize();
1611 if (fields[var]->GetBndConditions()[i]->
1618 for (e = 0; e < nBndEdges; ++e)
1620 nBndEdgePts = fields[var]->
1621 GetBndCondExpansions()[i]->GetExp(e)->GetTotPoints();
1623 id2 = fields[0]->GetTrace()->
1624 GetPhys_Offset(fields[0]->GetTraceMap()->
1625 GetBndCondTraceToGlobalTraceMap(cnt++));
1630 if(fields[var]->GetBndConditions()[i]->
1632 && !boost::iequals(fields[var]->GetBndConditions()[i]
1633 ->GetUserDefined(),
"WallAdiabatic"))
1638 &penaltyflux[id2], 1);
1642 else if((fields[var]->GetBndConditions()[i])->
1646 "Neumann bcs not implemented for LFRNS");
1648 else if(boost::iequals(fields[var]->GetBndConditions()[i]
1649 ->GetUserDefined(),
"WallAdiabatic"))
1661 &penaltyflux[id2], 1);
1680 const int nConvectiveFields,
1686 boost::ignore_unused(nConvectiveFields);
1689 int nLocalSolutionPts, phys_offset;
1697 Basis = fields[0]->GetExp(0)->GetBasis(0);
1699 int nElements = fields[0]->GetExpSize();
1700 int nPts = fields[0]->GetTotPoints();
1710 for (n = 0; n < nElements; ++n)
1712 nLocalSolutionPts = fields[0]->GetExp(n)->GetTotPoints();
1713 phys_offset = fields[0]->GetPhys_Offset(n);
1718 &flux[phys_offset], 1,
1721 fields[0]->GetExp(n)->GetVertexPhysVals(0, tmparrayX1,
1723 JumpL[n] = iFlux[n] - tmpFluxVertex;
1725 fields[0]->GetExp(n)->GetVertexPhysVals(1, tmparrayX1,
1727 JumpR[n] = iFlux[n+1] - tmpFluxVertex;
1730 for (n = 0; n < nElements; ++n)
1732 ptsKeys = fields[0]->GetExp(n)->GetPointsKeys();
1733 nLocalSolutionPts = fields[0]->GetExp(n)->GetTotPoints();
1734 phys_offset = fields[0]->GetPhys_Offset(n);
1735 jac = fields[0]->GetExp(n)
1739 JumpL[n] = JumpL[n] * jac[0];
1740 JumpR[n] = JumpR[n] * jac[0];
1751 Vmath::Vadd(nLocalSolutionPts, &DCL[0], 1, &DCR[0], 1,
1752 &derCFlux[phys_offset], 1);
1772 const int nConvectiveFields,
1773 const int direction,
1779 boost::ignore_unused(nConvectiveFields);
1781 int n, e, i, j, cnt;
1785 int nElements = fields[0]->GetExpSize();
1786 int trace_offset, phys_offset;
1787 int nLocalSolutionPts;
1795 &elmtToTrace = fields[0]->GetTraceMap()->GetElmtToTrace();
1798 for (n = 0; n < nElements; ++n)
1801 phys_offset = fields[0]->GetPhys_Offset(n);
1802 nLocalSolutionPts = fields[0]->GetExp(n)->GetTotPoints();
1803 ptsKeys = fields[0]->GetExp(n)->GetPointsKeys();
1808 base = fields[0]->GetExp(n)->GetBase();
1809 nquad0 = base[0]->GetNumPoints();
1810 nquad1 = base[1]->GetNumPoints();
1818 for (e = 0; e < fields[0]->GetExp(n)->GetNedges(); ++e)
1821 nEdgePts = fields[0]->GetExp(n)->GetEdgeNumPoints(e);
1827 trace_offset = fields[0]->GetTrace()->GetPhys_Offset(
1828 elmtToTrace[n][e]->GetElmtId());
1837 fields[0]->GetExp(n)->GetEdgePhysVals(
1838 e, elmtToTrace[n][e],
1840 auxArray1 = tmparray);
1851 &tmparray[0], 1, &fluxJumps[0], 1);
1855 if (fields[0]->GetExp(n)->GetEorient(e) ==
1864 if (fields[0]->GetExp(n)->as<LocalRegions::Expansion2D>()
1865 ->GetGeom2D()->GetMetricInfo()->GetGtype()
1870 fields[0]->GetExp(n)->GetEdgePhysVals(
1871 e, elmtToTrace[n][e],
1872 jac, auxArray1 = jacEdge);
1876 if (fields[0]->GetExp(n)->GetEorient(e) ==
1885 for (j = 0; j < nEdgePts; j++)
1887 fluxJumps[j] = fluxJumps[j] * jacEdge[j];
1905 for (i = 0; i < nquad0; ++i)
1910 for (j = 0; j < nquad1; ++j)
1913 divCFluxE0[cnt] = fluxJumps[i] *
m_dGL_xi2[n][j];
1918 for (i = 0; i < nquad1; ++i)
1923 for (j = 0; j < nquad0; ++j)
1925 cnt = (nquad0)*i + j;
1926 divCFluxE1[cnt] = fluxJumps[i] *
m_dGR_xi1[n][j];
1931 for (i = 0; i < nquad0; ++i)
1936 for (j = 0; j < nquad1; ++j)
1939 divCFluxE2[cnt] = fluxJumps[i] *
m_dGR_xi2[n][j];
1944 for (i = 0; i < nquad1; ++i)
1948 for (j = 0; j < nquad0; ++j)
1951 divCFluxE3[cnt] = fluxJumps[i] *
m_dGL_xi1[n][j];
1957 ASSERTL0(
false,
"edge value (< 3) is out of range");
1971 &divCFluxE3[0], 1, &derCFlux[phys_offset], 1);
1973 else if (direction == 1)
1976 &divCFluxE2[0], 1, &derCFlux[phys_offset], 1);
1995 const int nConvectiveFields,
2002 boost::ignore_unused(nConvectiveFields);
2004 int n, e, i, j, cnt;
2006 int nElements = fields[0]->GetExpSize();
2007 int nLocalSolutionPts;
2018 &elmtToTrace = fields[0]->GetTraceMap()->GetElmtToTrace();
2021 for(n = 0; n < nElements; ++n)
2024 phys_offset = fields[0]->GetPhys_Offset(n);
2025 nLocalSolutionPts = fields[0]->GetExp(n)->GetTotPoints();
2027 base = fields[0]->GetExp(n)->GetBase();
2028 nquad0 = base[0]->GetNumPoints();
2029 nquad1 = base[1]->GetNumPoints();
2037 for(e = 0; e < fields[0]->GetExp(n)->GetNedges(); ++e)
2040 nEdgePts = fields[0]->GetExp(n)->GetEdgeNumPoints(e);
2049 trace_offset = fields[0]->GetTrace()->GetPhys_Offset(
2050 elmtToTrace[n][e]->GetElmtId());
2054 fields[0]->GetExp(n)->GetEdgeNormal(e);
2058 fields[0]->GetExp(n)->GetEdgePhysVals(
2059 e, elmtToTrace[n][e],
2060 fluxX1 + phys_offset,
2061 auxArray1 = tmparrayX1);
2065 fields[0]->GetExp(n)->GetEdgePhysVals(
2066 e, elmtToTrace[n][e],
2067 fluxX2 + phys_offset,
2068 auxArray1 = tmparrayX2);
2071 for (i = 0; i < nEdgePts; ++i)
2080 &numericalFlux[trace_offset], 1,
2081 &fluxN[0], 1, &fluxJumps[0], 1);
2084 if (fields[0]->GetExp(n)->GetEorient(e) ==
2088 auxArray1 = fluxJumps, 1,
2089 auxArray2 = fluxJumps, 1);
2092 NekDouble fac = fields[0]->GetExp(n)->EdgeNormalNegated(e) ?
2095 for (i = 0; i < nEdgePts; ++i)
2100 fluxJumps[i] = -fluxJumps[i];
2108 for (i = 0; i < nquad0; ++i)
2111 fluxJumps[i] = -(
m_Q2D_e0[n][i]) * fluxJumps[i];
2113 for (j = 0; j < nquad1; ++j)
2116 divCFluxE0[cnt] = fluxJumps[i] *
m_dGL_xi2[n][j];
2121 for (i = 0; i < nquad1; ++i)
2124 fluxJumps[i] = (
m_Q2D_e1[n][i]) * fluxJumps[i];
2126 for (j = 0; j < nquad0; ++j)
2128 cnt = (nquad0)*i + j;
2129 divCFluxE1[cnt] = fluxJumps[i] *
m_dGR_xi1[n][j];
2134 for (i = 0; i < nquad0; ++i)
2137 fluxJumps[i] = (
m_Q2D_e2[n][i]) * fluxJumps[i];
2139 for (j = 0; j < nquad1; ++j)
2142 divCFluxE2[cnt] = fluxJumps[i] *
m_dGR_xi2[n][j];
2147 for (i = 0; i < nquad1; ++i)
2150 fluxJumps[i] = -(
m_Q2D_e3[n][i]) * fluxJumps[i];
2151 for (j = 0; j < nquad0; ++j)
2154 divCFluxE3[cnt] = fluxJumps[i] *
m_dGL_xi1[n][j];
2161 ASSERTL0(
false,
"edge value (< 3) is out of range");
2168 &divCFluxE1[0], 1, &divCFlux[phys_offset], 1);
2170 Vmath::Vadd(nLocalSolutionPts, &divCFlux[phys_offset], 1,
2171 &divCFluxE2[0], 1, &divCFlux[phys_offset], 1);
2173 Vmath::Vadd(nLocalSolutionPts, &divCFlux[phys_offset], 1,
2174 &divCFluxE3[0], 1, &divCFlux[phys_offset], 1);
2193 const int nConvectiveFields,
2200 boost::ignore_unused(nConvectiveFields);
2202 int n, e, i, j, cnt;
2204 int nElements = fields[0]->GetExpSize();
2205 int nLocalSolutionPts;
2216 &elmtToTrace = fields[0]->GetTraceMap()->GetElmtToTrace();
2219 for(n = 0; n < nElements; ++n)
2222 phys_offset = fields[0]->GetPhys_Offset(n);
2223 nLocalSolutionPts = fields[0]->GetExp(n)->GetTotPoints();
2225 base = fields[0]->GetExp(n)->GetBase();
2226 nquad0 = base[0]->GetNumPoints();
2227 nquad1 = base[1]->GetNumPoints();
2235 for(e = 0; e < fields[0]->GetExp(n)->GetNedges(); ++e)
2238 nEdgePts = fields[0]->GetExp(n)->GetEdgeNumPoints(e);
2247 trace_offset = fields[0]->GetTrace()->GetPhys_Offset(
2248 elmtToTrace[n][e]->GetElmtId());
2252 fields[0]->GetExp(n)->GetEdgeNormal(e);
2261 fields[0]->GetExp(n)->GetEdgePhysVals(
2262 e, elmtToTrace[n][e],
2263 fluxX2 + phys_offset,
2264 auxArray1 = fluxN_D);
2270 &numericalFlux[trace_offset], 1,
2274 if (fields[0]->GetExp(n)->GetEorient(e) ==
2278 auxArray1 = fluxN, 1,
2279 auxArray2 = fluxN, 1);
2282 auxArray1 = fluxN_D, 1,
2283 auxArray2 = fluxN_D, 1);
2287 for (i = 0; i < nquad0; ++i)
2290 fluxN_R[i] = (
m_Q2D_e0[n][i]) * fluxN[i];
2293 for (i = 0; i < nEdgePts; ++i)
2300 fluxN_R[i] = -fluxN_R[i];
2308 &fluxN_D[0], 1, &fluxJumps[0], 1);
2312 for (i = 0; i < nquad0; ++i)
2314 for (j = 0; j < nquad1; ++j)
2326 fields[0]->GetExp(n)->GetEdgePhysVals(
2327 e, elmtToTrace[n][e],
2328 fluxX1 + phys_offset,
2329 auxArray1 = fluxN_D);
2333 &numericalFlux[trace_offset], 1,
2337 if (fields[0]->GetExp(n)->GetEorient(e) ==
2341 auxArray1 = fluxN, 1,
2342 auxArray2 = fluxN, 1);
2345 auxArray1 = fluxN_D, 1,
2346 auxArray2 = fluxN_D, 1);
2350 for (i = 0; i < nquad1; ++i)
2353 fluxN_R[i] = (
m_Q2D_e1[n][i]) * fluxN[i];
2356 for (i = 0; i < nEdgePts; ++i)
2363 fluxN_R[i] = -fluxN_R[i];
2371 &fluxN_D[0], 1, &fluxJumps[0], 1);
2375 for (i = 0; i < nquad1; ++i)
2377 for (j = 0; j < nquad0; ++j)
2379 cnt = (nquad0)*i + j;
2391 fields[0]->GetExp(n)->GetEdgePhysVals(
2392 e, elmtToTrace[n][e],
2393 fluxX2 + phys_offset,
2394 auxArray1 = fluxN_D);
2398 &numericalFlux[trace_offset], 1,
2402 if (fields[0]->GetExp(n)->GetEorient(e) ==
2406 auxArray1 = fluxN, 1,
2407 auxArray2 = fluxN, 1);
2410 auxArray1 = fluxN_D, 1,
2411 auxArray2 = fluxN_D, 1);
2415 for (i = 0; i < nquad0; ++i)
2418 fluxN_R[i] = (
m_Q2D_e2[n][i]) * fluxN[i];
2421 for (i = 0; i < nEdgePts; ++i)
2428 fluxN_R[i] = -fluxN_R[i];
2437 &fluxN_D[0], 1, &fluxJumps[0], 1);
2441 for (i = 0; i < nquad0; ++i)
2443 for (j = 0; j < nquad1; ++j)
2456 fields[0]->GetExp(n)->GetEdgePhysVals(
2457 e, elmtToTrace[n][e],
2458 fluxX1 + phys_offset,
2459 auxArray1 = fluxN_D);
2464 &numericalFlux[trace_offset], 1,
2468 if (fields[0]->GetExp(n)->GetEorient(e) ==
2472 auxArray1 = fluxN, 1,
2473 auxArray2 = fluxN, 1);
2476 auxArray1 = fluxN_D, 1,
2477 auxArray2 = fluxN_D, 1);
2481 for (i = 0; i < nquad1; ++i)
2484 fluxN_R[i] = (
m_Q2D_e3[n][i]) * fluxN[i];
2487 for (i = 0; i < nEdgePts; ++i)
2494 fluxN_R[i] = -fluxN_R[i];
2503 &fluxN_D[0], 1, &fluxJumps[0], 1);
2507 for (i = 0; i < nquad1; ++i)
2509 for (j = 0; j < nquad0; ++j)
2518 ASSERTL0(
false,
"edge value (< 3) is out of range");
2526 &divCFluxE1[0], 1, &divCFlux[phys_offset], 1);
2528 Vmath::Vadd(nLocalSolutionPts, &divCFlux[phys_offset], 1,
2529 &divCFluxE2[0], 1, &divCFlux[phys_offset], 1);
2531 Vmath::Vadd(nLocalSolutionPts, &divCFlux[phys_offset], 1,
2532 &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
Represents a basis of a given type.
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
std::shared_ptr< Basis > BasisSharedPtr
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.
Array< OneD, Array< OneD, NekDouble > > m_homoDerivs
Array< OneD, NekDouble > m_jac
1D Gauss-Gauss-Legendre quadrature points
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
const SpatialDomains::GeomFactorsSharedPtr & GetMetricInfo() const
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
virtual void v_Diffuse(const std::size_t nConvective, const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const Array< OneD, Array< OneD, NekDouble > > &pFwd=NullNekDoubleArrayofArray, const Array< OneD, Array< OneD, NekDouble > > &pBwd=NullNekDoubleArrayofArray)
Calculate FR Diffusion for the Navier-Stokes (NS) equations using an LDG interface flux...
Array< OneD, Array< OneD, NekDouble > > m_gmat
Array< OneD, Array< OneD, Array< OneD, NekDouble > > > m_DFC1
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
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
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.
std::shared_ptr< SessionReader > SessionReaderSharedPtr
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
Array< OneD, Array< OneD, NekDouble > > m_Q2D_e1