41 string NavierStokesImplicitCFE::className =
43 "NavierStokesImplicitCFE", NavierStokesImplicitCFE::create,
44 "NavierStokes equations in conservative variables.");
46 NavierStokesImplicitCFE::NavierStokesImplicitCFE(
75 std::placeholders::_1, std::placeholders::_2,
76 std::placeholders::_3, std::placeholders::_4);
80 std::placeholders::_1, std::placeholders::_2,
81 std::placeholders::_3, std::placeholders::_4);
87 std::placeholders::_1, std::placeholders::_2,
88 std::placeholders::_3, std::placeholders::_4);
92 std::placeholders::_1, std::placeholders::_2,
93 std::placeholders::_3, std::placeholders::_4);
96 std::placeholders::_1, std::placeholders::_2,
97 std::placeholders::_3, std::placeholders::_4);
113 size_t nvariables = inarray.size();
119 for (
int i = 0; i < nvariables; ++i)
151 for (
int i = 0; i < nvariables; ++i)
153 Vmath::Vadd(ncoeffs, outarrayDiff[i], 1, outarray[i], 1,
163 for (
int i = 0; i < nvariables - 1; ++i)
172 m_varConv->GetPressure(inarray, inarrayDiff[0]);
175 m_varConv->GetTemperature(inarray, inarrayDiff[nvariables - 2]);
178 m_varConv->GetVelocityVector(inarray, inarrayDiff);
192 m_varConv->GetTemperature(pFwd, inFwd[nvariables - 2]);
193 m_varConv->GetTemperature(pBwd, inBwd[nvariables - 2]);
195 m_varConv->GetVelocityVector(pFwd, inFwd);
196 m_varConv->GetVelocityVector(pBwd, inBwd);
203 for (
int i = 0; i < nvariables; ++i)
205 Vmath::Vadd(npoints, outarrayDiff[i], 1, outarray[i], 1,
249 OneThird = 1.0 / 3.0;
250 TwoThird = 2.0 * OneThird;
251 FourThird = 4.0 * OneThird;
254 tmpArray = OutputMatrix->GetPtr();
255 int nrow = OutputMatrix->GetRows();
257 tmpArray[0 + 0 * nrow] = tmp * (-FourThird * u * nx - v * ny);
258 tmpArray[0 + 1 * nrow] = tmp * (FourThird * nx);
259 tmpArray[0 + 2 * nrow] = tmp * ny;
260 tmpArray[0 + 3 * nrow] = 0.0;
261 tmpArray[1 + 0 * nrow] = tmp * (-v * nx + TwoThird * u * ny);
262 tmpArray[1 + 1 * nrow] = tmp * (-TwoThird * ny);
263 tmpArray[1 + 2 * nrow] = tmp * nx;
264 tmpArray[1 + 3 * nrow] = 0.0;
265 tmpArray[2 + 0 * nrow] =
266 (FourThird * u * u + v * v + tmp2 * (E - q2)) * nx +
267 OneThird * u * v * ny;
268 tmpArray[2 + 0 * nrow] = -tmp * (*OutputMatrix)(2, 0);
269 tmpArray[2 + 1 * nrow] = (FourThird - tmp2) * u * nx - TwoThird * v * ny;
270 tmpArray[2 + 1 * nrow] = tmp * (*OutputMatrix)(2, 1);
271 tmpArray[2 + 2 * nrow] = (1 - tmp2) * v * nx + u * ny;
272 tmpArray[2 + 2 * nrow] = tmp * (*OutputMatrix)(2, 2);
273 tmpArray[2 + 3 * nrow] = tmp * tmp2 * nx;
307 OneThird = 1.0 / 3.0;
308 TwoThird = 2.0 * OneThird;
309 FourThird = 4.0 * OneThird;
312 tmpArray = OutputMatrix->GetPtr();
313 int nrow = OutputMatrix->GetRows();
315 tmpArray[0 + 0 * nrow] = tmp * (TwoThird * v * nx - u * ny);
316 tmpArray[0 + 1 * nrow] = tmp * ny;
317 tmpArray[0 + 2 * nrow] = tmp * (-TwoThird) * nx;
318 tmpArray[0 + 3 * nrow] = 0.0;
319 tmpArray[1 + 0 * nrow] = tmp * (-u * nx - FourThird * v * ny);
320 tmpArray[1 + 1 * nrow] = tmp * nx;
321 tmpArray[1 + 2 * nrow] = tmp * (FourThird * ny);
322 tmpArray[1 + 3 * nrow] = 0.0;
323 tmpArray[2 + 0 * nrow] = OneThird * u * v * nx +
324 (FourThird * v * v + u * u + tmp2 * (E - q2)) * ny;
325 tmpArray[2 + 0 * nrow] = -tmp * (*OutputMatrix)(2, 0);
326 tmpArray[2 + 1 * nrow] = (1 - tmp2) * u * ny + v * nx;
327 tmpArray[2 + 1 * nrow] = tmp * (*OutputMatrix)(2, 1);
328 tmpArray[2 + 2 * nrow] = (FourThird - tmp2) * v * ny - TwoThird * u * nx;
329 tmpArray[2 + 2 * nrow] = tmp * (*OutputMatrix)(2, 2);
330 tmpArray[2 + 3 * nrow] = tmp * tmp2 * ny;
372 OneThird = 1.0 / 3.0;
373 TwoThird = 2.0 * OneThird;
374 FourThird = 4.0 * OneThird;
377 tmpArray = OutputMatrix->GetPtr();
378 int nrow = OutputMatrix->GetRows();
380 tmpArray[0 + 0 * nrow] =
381 tmpx * (-FourThird * u) + tmpy * (-v) + tmpz * (-w);
382 tmpArray[0 + 1 * nrow] = tmpx * FourThird;
383 tmpArray[0 + 2 * nrow] = tmpy;
384 tmpArray[0 + 3 * nrow] = tmpz;
385 tmpArray[0 + 4 * nrow] = 0.0;
386 tmpArray[1 + 0 * nrow] = tmpx * (-v) + tmpy * (TwoThird * u);
387 tmpArray[1 + 1 * nrow] = tmpy * (-TwoThird);
388 tmpArray[1 + 2 * nrow] = tmpx;
389 tmpArray[1 + 3 * nrow] = 0.0;
390 tmpArray[1 + 4 * nrow] = 0.0;
391 tmpArray[2 + 0 * nrow] = tmpx * (-w) + tmpz * (TwoThird * u);
392 tmpArray[2 + 1 * nrow] = tmpz * (-TwoThird);
393 tmpArray[2 + 2 * nrow] = 0.0;
394 tmpArray[2 + 3 * nrow] = tmpx;
395 tmpArray[2 + 4 * nrow] = 0.0;
396 tmpArray[3 + 0 * nrow] =
397 -tmpx * (FourThird * u * u + v * v + w * w + tmp2 * (E - q2)) +
398 tmpy * (-OneThird * u * v) + tmpz * (-OneThird * u * w);
399 tmpArray[3 + 1 * nrow] = tmpx * (FourThird - tmp2) * u +
400 tmpy * (-TwoThird * v) + tmpz * (-TwoThird * w);
401 tmpArray[3 + 2 * nrow] = tmpx * (1.0 - tmp2) * v + tmpy * u;
402 tmpArray[3 + 3 * nrow] = tmpx * (1.0 - tmp2) * w + tmpz * u;
403 tmpArray[3 + 4 * nrow] = tmpx * tmp2;
445 OneThird = 1.0 / 3.0;
446 TwoThird = 2.0 * OneThird;
447 FourThird = 4.0 * OneThird;
450 tmpArray = OutputMatrix->GetPtr();
451 int nrow = OutputMatrix->GetRows();
453 tmpArray[0 + 0 * nrow] = tmpx * (TwoThird * v) + tmpy * (-u);
454 tmpArray[0 + 1 * nrow] = tmpy;
455 tmpArray[0 + 2 * nrow] = tmpx * (-TwoThird);
456 tmpArray[0 + 3 * nrow] = 0.0;
457 tmpArray[0 + 4 * nrow] = 0.0;
458 tmpArray[1 + 0 * nrow] =
459 tmpx * (-u) + tmpy * (-FourThird * v) + tmpz * (-w);
460 tmpArray[1 + 1 * nrow] = tmpx;
461 tmpArray[1 + 2 * nrow] = tmpy * FourThird;
462 tmpArray[1 + 3 * nrow] = tmpz;
463 tmpArray[1 + 4 * nrow] = 0.0;
464 tmpArray[2 + 0 * nrow] = tmpy * (-w) + tmpz * (TwoThird * v);
465 tmpArray[2 + 1 * nrow] = 0.0;
466 tmpArray[2 + 2 * nrow] = tmpz * (-TwoThird);
467 tmpArray[2 + 3 * nrow] = tmpy;
468 tmpArray[2 + 4 * nrow] = 0.0;
469 tmpArray[3 + 0 * nrow] =
470 tmpx * (-OneThird * u * v) -
471 tmpy * (u * u + FourThird * v * v + w * w + tmp2 * (E - q2)) +
472 tmpz * (-OneThird * v * w);
473 tmpArray[3 + 1 * nrow] = tmpx * v + tmpy * (1 - tmp2) * u;
474 tmpArray[3 + 2 * nrow] = tmpx * (-TwoThird * u) +
475 tmpy * (FourThird - tmp2) * v +
476 tmpz * (-TwoThird * w);
477 tmpArray[3 + 3 * nrow] = tmpy * (1 - tmp2) * w + tmpz * v;
478 tmpArray[3 + 4 * nrow] = tmpy * tmp2;
520 OneThird = 1.0 / 3.0;
521 TwoThird = 2.0 * OneThird;
522 FourThird = 4.0 * OneThird;
525 tmpArray = OutputMatrix->GetPtr();
526 int nrow = OutputMatrix->GetRows();
528 tmpArray[0 + 0 * nrow] = tmpx * (TwoThird * w) + tmpz * (-u);
529 tmpArray[0 + 1 * nrow] = tmpz;
530 tmpArray[0 + 2 * nrow] = 0.0;
531 tmpArray[0 + 3 * nrow] = tmpx * (-TwoThird);
532 tmpArray[0 + 4 * nrow] = 0.0;
533 tmpArray[1 + 0 * nrow] = tmpy * (TwoThird * w) + tmpz * (-v);
534 tmpArray[1 + 1 * nrow] = 0.0;
535 tmpArray[1 + 2 * nrow] = tmpz;
536 tmpArray[1 + 3 * nrow] = tmpy * (-TwoThird);
537 tmpArray[1 + 4 * nrow] = 0.0;
538 tmpArray[2 + 0 * nrow] =
539 tmpx * (-u) + tmpy * (-v) + tmpz * (-FourThird * w);
540 tmpArray[2 + 1 * nrow] = tmpx;
541 tmpArray[2 + 2 * nrow] = tmpy;
542 tmpArray[2 + 3 * nrow] = tmpz * FourThird;
543 tmpArray[2 + 4 * nrow] = 0.0;
544 tmpArray[3 + 0 * nrow] =
545 tmpx * (-OneThird * u * w) + tmpy * (-OneThird * v * w) -
546 tmpz * (u * u + v * v + FourThird * w * w + tmp2 * (E - q2));
547 tmpArray[3 + 1 * nrow] = tmpx * w + tmpz * (1 - tmp2) * u;
548 tmpArray[3 + 2 * nrow] = tmpy * w + tmpz * (1 - tmp2) * v;
549 tmpArray[3 + 3 * nrow] = tmpx * (-TwoThird * u) + tmpy * (-TwoThird * v) +
550 tmpz * (FourThird - tmp2) * w;
551 tmpArray[3 + 4 * nrow] = tmpz * tmp2;
571 tmpArray = OutputMatrix->GetPtr();
572 int nrow = OutputMatrix->GetRows();
596 orho2 = orho1 * orho1;
597 orho3 = orho1 * orho2;
598 orho4 = orho2 * orho2;
607 NekDouble du_dx = orho1 * (dU2_dx - u * dU1_dx);
608 NekDouble dv_dx = orho1 * (dU3_dx - v * dU1_dx);
609 NekDouble du_dy = orho1 * (dU2_dy - u * dU1_dy);
610 NekDouble dv_dy = orho1 * (dU3_dy - v * dU1_dy);
611 NekDouble s12 = FourThird * du_dx - TwoThrid * dv_dy;
614 NekDouble s23 = FourThird * dv_dy - TwoThrid * du_dx;
619 (orho1 * dU4_dx - U[3] * orho2 * dU1_dx -
620 u * (orho1 * dU2_dx - U[1] * orho2 * dU1_dx) -
621 v * (orho1 * dU3_dx - U[2] * orho2 * dU1_dx));
623 (orho1 * dU4_dy - U[3] * orho2 * dU1_dy -
624 u * (orho1 * dU2_dy - U[1] * orho2 * dU1_dy) -
625 v * (orho1 * dU3_dy - U[2] * orho2 * dU1_dy));
632 tmp[2] = snv - qn / mu;
634 dT_dU[0] = oCv * (-orho2 * U4 + orho3 * U2 * U2 + orho3 * U3 * U3);
635 dT_dU[1] = -oCv * orho2 * U2;
636 dT_dU[2] = -oCv * orho2 * U3;
637 dT_dU[3] = oCv * orho1;
638 for (
int i = 0; i < 3; i++)
640 for (
int j = 0; j < 4; j++)
642 tmpArray[i + j * nrow] = dmu_dT * dT_dU[j] * tmp[i];
659 du_dx_dU1 = -orho2 * dU2_dx + 2 * orho3 * U2 * dU1_dx;
660 du_dx_dU2 = -orho2 * dU1_dx;
661 du_dy_dU1 = -orho2 * dU2_dy + 2 * orho3 * U2 * dU1_dy;
662 du_dy_dU2 = -orho2 * dU1_dy;
663 dv_dx_dU1 = -orho2 * dU3_dx + 2 * orho3 * U3 * dU1_dx;
664 dv_dx_dU3 = du_dx_dU2;
665 dv_dy_dU1 = -orho2 * dU3_dy + 2 * orho3 * U3 * dU1_dy;
666 dv_dy_dU3 = du_dy_dU2;
667 ds12_dU1 = FourThird * du_dx_dU1 - TwoThrid * dv_dy_dU1;
668 ds12_dU2 = FourThird * du_dx_dU2;
669 ds12_dU3 = -TwoThrid * dv_dy_dU3;
670 ds13_dU1 = du_dy_dU1 + dv_dx_dU1;
671 ds13_dU2 = du_dy_dU2;
672 ds13_dU3 = dv_dx_dU3;
676 ds23_dU1 = FourThird * dv_dy_dU1 - TwoThrid * du_dx_dU1;
677 ds23_dU2 = -TwoThrid * du_dx_dU2;
678 ds23_dU3 = FourThird * dv_dy_dU3;
679 dsnx_dU1 = ds12_dU1 * nx + ds22_dU1 * ny;
680 dsnx_dU2 = ds12_dU2 * nx + ds22_dU2 * ny;
681 dsnx_dU3 = ds12_dU3 * nx + ds22_dU3 * ny;
682 dsny_dU1 = ds13_dU1 * nx + ds23_dU1 * ny;
683 dsny_dU2 = ds13_dU2 * nx + ds23_dU2 * ny;
684 dsny_dU3 = ds13_dU3 * nx + ds23_dU3 * ny;
686 u * dsnx_dU1 + v * dsny_dU1 - orho2 * U2 * snx - orho2 * U3 * sny;
687 dsnv_dU2 = u * dsnx_dU2 + v * dsny_dU2 + orho1 * snx;
688 dsnv_dU3 = u * dsnx_dU3 + v * dsny_dU3 + orho1 * sny;
689 tmpArray[0 + 0 * nrow] = tmpArray[0 + 0 * nrow] + mu * dsnx_dU1;
690 tmpArray[0 + 1 * nrow] = tmpArray[0 + 1 * nrow] + mu * dsnx_dU2;
691 tmpArray[0 + 2 * nrow] = tmpArray[0 + 2 * nrow] + mu * dsnx_dU3;
692 tmpArray[1 + 0 * nrow] = tmpArray[1 + 0 * nrow] + mu * dsny_dU1;
693 tmpArray[1 + 1 * nrow] = tmpArray[1 + 1 * nrow] + mu * dsny_dU2;
694 tmpArray[1 + 2 * nrow] = tmpArray[1 + 2 * nrow] + mu * dsny_dU3;
695 tmpArray[2 + 0 * nrow] = tmpArray[2 + 0 * nrow] + mu * dsnv_dU1;
696 tmpArray[2 + 1 * nrow] = tmpArray[2 + 1 * nrow] + mu * dsnv_dU2;
697 tmpArray[2 + 2 * nrow] = tmpArray[2 + 2 * nrow] + mu * dsnv_dU3;
700 NekDouble dqx_dU1, dqx_dU2, dqx_dU3, dqx_dU4;
701 NekDouble dqy_dU1, dqy_dU2, dqy_dU3, dqy_dU4;
703 dqx_dU1 = tmpx * (-orho2 * dU4_dx + 2 * orho3 * U4 * dU1_dx +
704 2 * orho3 * U2 * dU2_dx - 3 * orho4 * U2 * U2 * dU1_dx +
705 2 * orho3 * U3 * dU3_dx - 3 * orho4 * U3 * U3 * dU1_dx);
706 dqx_dU2 = tmpx * (-orho2 * dU2_dx + 2 * orho3 * U2 * dU1_dx);
707 dqx_dU3 = tmpx * (-orho2 * dU3_dx + 2 * orho3 * U3 * dU1_dx);
708 dqx_dU4 = -tmpx * orho2 * dU1_dx;
710 dqy_dU1 = tmpy * (-orho2 * dU4_dy + 2 * orho3 * U4 * dU1_dy +
711 2 * orho3 * U2 * dU2_dy - 3 * orho4 * U2 * U2 * dU1_dy +
712 2 * orho3 * U3 * dU3_dy - 3 * orho4 * U3 * U3 * dU1_dy);
713 dqy_dU2 = tmpy * (-orho2 * dU2_dy + 2 * orho3 * U2 * dU1_dy);
714 dqy_dU3 = tmpy * (-orho2 * dU3_dy + 2 * orho3 * U3 * dU1_dy);
715 dqy_dU4 = -tmpy * orho2 * dU1_dy;
716 tmpArray[2 + 0 * nrow] = tmpArray[2 + 0 * nrow] - dqx_dU1 - dqy_dU1;
717 tmpArray[2 + 1 * nrow] = tmpArray[2 + 1 * nrow] - dqx_dU2 - dqy_dU2;
718 tmpArray[2 + 2 * nrow] = tmpArray[2 + 2 * nrow] - dqx_dU3 - dqy_dU3;
719 tmpArray[2 + 3 * nrow] = tmpArray[2 + 3 * nrow] - dqx_dU4 - dqy_dU4;
739 tmpArray = OutputMatrix->GetPtr();
740 int nrow = OutputMatrix->GetRows();
773 orho2 = orho1 * orho1;
774 orho3 = orho1 * orho2;
775 orho4 = orho2 * orho2;
785 NekDouble du_dx = orho1 * (dU2_dx - u * dU1_dx);
786 NekDouble dv_dx = orho1 * (dU3_dx - v * dU1_dx);
787 NekDouble dw_dx = orho1 * (dU4_dx - w * dU1_dx);
788 NekDouble du_dy = orho1 * (dU2_dy - u * dU1_dy);
789 NekDouble dv_dy = orho1 * (dU3_dy - v * dU1_dy);
790 NekDouble dw_dy = orho1 * (dU4_dy - w * dU1_dy);
791 NekDouble du_dz = orho1 * (dU2_dz - u * dU1_dz);
792 NekDouble dv_dz = orho1 * (dU3_dz - v * dU1_dz);
793 NekDouble dw_dz = orho1 * (dU4_dz - w * dU1_dz);
794 NekDouble s12 = FourThird * du_dx - TwoThrid * dv_dy - TwoThrid * dw_dz;
798 NekDouble s23 = FourThird * dv_dy - TwoThrid * du_dx - TwoThrid * dw_dz;
802 NekDouble s34 = FourThird * dw_dz - TwoThrid * du_dx - TwoThrid * dv_dy;
803 NekDouble snx = s12 * nx + s22 * ny + s32 * nz;
804 NekDouble sny = s13 * nx + s23 * ny + s33 * nz;
805 NekDouble snz = s14 * nz + s24 * ny + s34 * nz;
806 NekDouble snv = snx * u + sny * v + snz * w;
807 NekDouble qx = -tmp2 * (orho1 * dU5_dx - U5 * orho2 * dU1_dx -
808 u * (orho1 * dU2_dx - U2 * orho2 * dU1_dx) -
809 v * (orho1 * dU3_dx - U3 * orho2 * dU1_dx) -
810 w * (orho1 * dU4_dx - U4 * orho2 * dU1_dx));
811 NekDouble qy = -tmp2 * (orho1 * dU5_dy - U5 * orho2 * dU1_dy -
812 u * (orho1 * dU2_dy - U2 * orho2 * dU1_dy) -
813 v * (orho1 * dU3_dy - U3 * orho2 * dU1_dy) -
814 w * (orho1 * dU4_dy - U4 * orho2 * dU1_dy));
815 NekDouble qz = -tmp2 * (orho1 * dU5_dz - U5 * orho2 * dU1_dz -
816 u * (orho1 * dU2_dz - U2 * orho2 * dU1_dz) -
817 v * (orho1 * dU3_dz - U3 * orho2 * dU1_dz) -
818 w * (orho1 * dU4_dz - U4 * orho2 * dU1_dz));
819 NekDouble qn = qx * nx + qy * ny + qz * nz;
826 tmp[3] = snv - qn / mu;
828 dT_dU[0] = oCv * (-orho2 * U5 + orho3 * U2 * U2 + orho3 * U3 * U3 +
830 dT_dU[1] = -oCv * orho2 * U2;
831 dT_dU[2] = -oCv * orho2 * U3;
832 dT_dU[3] = -oCv * orho2 * U4;
833 dT_dU[4] = oCv * orho1;
834 for (
int i = 0; i < 4; i++)
836 for (
int j = 0; j < 5; j++)
838 tmpArray[i + j * nrow] = dmu_dT * dT_dU[j] * tmp[i];
852 NekDouble ds12_dU1, ds12_dU2, ds12_dU3, ds12_dU4;
856 NekDouble ds23_dU1, ds23_dU2, ds23_dU3, ds23_dU4;
860 NekDouble ds34_dU1, ds34_dU2, ds34_dU3, ds34_dU4;
861 NekDouble dsnx_dU1, dsnx_dU2, dsnx_dU3, dsnx_dU4;
862 NekDouble dsny_dU1, dsny_dU2, dsny_dU3, dsny_dU4;
863 NekDouble dsnz_dU1, dsnz_dU2, dsnz_dU3, dsnz_dU4;
864 NekDouble dsnv_dU1, dsnv_dU2, dsnv_dU3, dsnv_dU4;
866 du_dx_dU1 = -orho2 * dU2_dx + 2 * orho3 * U2 * dU1_dx;
867 du_dx_dU2 = -orho2 * dU1_dx;
868 du_dy_dU1 = -orho2 * dU2_dy + 2 * orho3 * U2 * dU1_dy;
869 du_dy_dU2 = -orho2 * dU1_dy;
870 du_dz_dU1 = -orho2 * dU2_dz + 2 * orho3 * U2 * dU1_dz;
871 du_dz_dU2 = -orho2 * dU1_dz;
872 dv_dx_dU1 = -orho2 * dU3_dx + 2 * orho3 * U3 * dU1_dx;
873 dv_dx_dU3 = -orho2 * dU1_dx;
874 dv_dy_dU1 = -orho2 * dU3_dy + 2 * orho3 * U3 * dU1_dy;
875 dv_dy_dU3 = -orho2 * dU1_dy;
876 dv_dz_dU1 = -orho2 * dU3_dz + 2 * orho3 * U3 * dU1_dz;
877 dv_dz_dU3 = -orho2 * dU1_dz;
878 dw_dx_dU1 = -orho2 * dU4_dx + 2 * orho3 * U4 * dU1_dx;
879 dw_dx_dU4 = -orho2 * dU1_dx;
880 dw_dy_dU1 = -orho2 * dU4_dy + 2 * orho3 * U4 * dU1_dy;
881 dw_dy_dU4 = -orho2 * dU1_dy;
882 dw_dz_dU1 = -orho2 * dU4_dz + 2 * orho3 * U4 * dU1_dz;
883 dw_dz_dU4 = -orho2 * dU1_dz;
885 FourThird * du_dx_dU1 - TwoThrid * dv_dy_dU1 - TwoThrid * dw_dz_dU1;
886 ds12_dU2 = FourThird * du_dx_dU2;
887 ds12_dU3 = -TwoThrid * dv_dy_dU3;
888 ds12_dU4 = -TwoThrid * dw_dz_dU4;
889 ds13_dU1 = du_dy_dU1 + dv_dx_dU1;
890 ds13_dU2 = du_dy_dU2;
891 ds13_dU3 = dv_dx_dU3;
892 ds14_dU1 = dw_dx_dU1 + du_dz_dU1;
893 ds14_dU2 = du_dz_dU2;
894 ds14_dU4 = dw_dx_dU4;
895 ds22_dU1 = du_dy_dU1 + dv_dx_dU1;
896 ds22_dU2 = du_dy_dU2;
897 ds22_dU3 = dv_dx_dU3;
899 FourThird * dv_dy_dU1 - TwoThrid * du_dx_dU1 - TwoThrid * dw_dz_dU1;
900 ds23_dU2 = -TwoThrid * du_dx_dU2;
901 ds23_dU3 = FourThird * dv_dy_dU3;
902 ds23_dU4 = -TwoThrid * dw_dz_dU4;
903 ds24_dU1 = dv_dz_dU1 + dw_dy_dU1;
904 ds24_dU3 = dv_dz_dU3;
905 ds24_dU4 = dw_dy_dU4;
906 ds32_dU1 = dw_dx_dU1 + du_dz_dU1;
907 ds32_dU2 = du_dz_dU2;
908 ds32_dU4 = dw_dx_dU4;
909 ds33_dU1 = dv_dz_dU1 + dw_dy_dU1;
910 ds33_dU3 = dv_dz_dU3;
911 ds33_dU4 = dw_dy_dU4;
913 FourThird * dw_dz_dU1 - TwoThrid * du_dx_dU1 - TwoThrid * dv_dy_dU1;
914 ds34_dU2 = -TwoThrid * du_dx_dU2;
915 ds34_dU3 = -TwoThrid * dv_dy_dU3;
916 ds34_dU4 = FourThird * dw_dz_dU4;
917 dsnx_dU1 = ds12_dU1 * nx + ds22_dU1 * ny + ds32_dU1 * nz;
918 dsnx_dU2 = ds12_dU2 * nx + ds22_dU2 * ny + ds32_dU2 * nz;
919 dsnx_dU3 = ds12_dU3 * nx + ds22_dU3 * ny;
920 dsnx_dU4 = ds12_dU4 * nx + ds32_dU4 * nz;
921 dsny_dU1 = ds13_dU1 * nx + ds23_dU1 * ny + ds33_dU1 * nz;
922 dsny_dU2 = ds13_dU2 * nx + ds23_dU2 * ny;
923 dsny_dU3 = ds13_dU3 * nx + ds23_dU3 * ny + ds33_dU3 * nz;
924 dsny_dU4 = ds23_dU4 * ny + ds33_dU4 * nz;
925 dsnz_dU1 = ds14_dU1 * nx + ds24_dU1 * ny + ds34_dU1 * nz;
926 dsnz_dU2 = ds14_dU2 * nx + ds34_dU2 * nz;
927 dsnz_dU3 = ds24_dU3 * ny + ds34_dU3 * nz;
929 dsnz_dU4 = ds14_dU4 * nx + ds24_dU4 * ny + ds34_dU4 * nz;
930 dsnv_dU1 = u * dsnx_dU1 + v * dsny_dU1 + w * dsnz_dU1 - orho2 * U2 * snx -
931 orho2 * U3 * sny - orho2 * U4 * snz;
932 dsnv_dU2 = u * dsnx_dU2 + v * dsny_dU2 + w * dsnz_dU2 + orho1 * snx;
933 dsnv_dU3 = u * dsnx_dU3 + v * dsny_dU3 + w * dsnz_dU3 + orho1 * sny;
934 dsnv_dU4 = u * dsnx_dU4 + v * dsny_dU4 + w * dsnz_dU4 + orho1 * snz;
935 tmpArray[0 + 0 * nrow] = tmpArray[0 + 0 * nrow] + mu * dsnx_dU1;
936 tmpArray[0 + 1 * nrow] = tmpArray[0 + 1 * nrow] + mu * dsnx_dU2;
937 tmpArray[0 + 2 * nrow] = tmpArray[0 + 2 * nrow] + mu * dsnx_dU3;
938 tmpArray[0 + 3 * nrow] = tmpArray[0 + 3 * nrow] + mu * dsnx_dU4;
939 tmpArray[1 + 0 * nrow] = tmpArray[1 + 0 * nrow] + mu * dsny_dU1;
940 tmpArray[1 + 1 * nrow] = tmpArray[1 + 1 * nrow] + mu * dsny_dU2;
941 tmpArray[1 + 2 * nrow] = tmpArray[1 + 2 * nrow] + mu * dsny_dU3;
942 tmpArray[1 + 3 * nrow] = tmpArray[1 + 3 * nrow] + mu * dsny_dU4;
943 tmpArray[2 + 0 * nrow] = tmpArray[2 + 0 * nrow] + mu * dsnz_dU1;
944 tmpArray[2 + 1 * nrow] = tmpArray[2 + 1 * nrow] + mu * dsnz_dU2;
945 tmpArray[2 + 2 * nrow] = tmpArray[2 + 2 * nrow] + mu * dsnz_dU3;
946 tmpArray[2 + 3 * nrow] = tmpArray[2 + 3 * nrow] + mu * dsnz_dU4;
947 tmpArray[3 + 0 * nrow] = tmpArray[3 + 0 * nrow] + mu * dsnv_dU1;
948 tmpArray[3 + 1 * nrow] = tmpArray[3 + 1 * nrow] + mu * dsnv_dU2;
949 tmpArray[3 + 2 * nrow] = tmpArray[3 + 2 * nrow] + mu * dsnv_dU3;
950 tmpArray[3 + 3 * nrow] = tmpArray[3 + 3 * nrow] + mu * dsnv_dU4;
953 NekDouble dqx_dU1, dqx_dU2, dqx_dU3, dqx_dU4, dqx_dU5;
954 NekDouble dqy_dU1, dqy_dU2, dqy_dU3, dqy_dU4, dqy_dU5;
955 NekDouble dqz_dU1, dqz_dU2, dqz_dU3, dqz_dU4, dqz_dU5;
957 dqx_dU1 = tmpx * (-orho2 * dU5_dx + 2 * orho3 * U5 * dU1_dx +
958 2 * orho3 * U2 * dU2_dx - 3 * orho4 * U2 * U2 * dU1_dx +
959 2 * orho3 * U3 * dU3_dx - 3 * orho4 * U3 * U3 * dU1_dx +
960 2 * orho3 * U4 * dU4_dx - 3 * orho4 * U4 * U4 * dU1_dx);
961 dqx_dU2 = tmpx * (-orho2 * dU2_dx + 2 * orho3 * U2 * dU1_dx);
962 dqx_dU3 = tmpx * (-orho2 * dU3_dx + 2 * orho3 * U3 * dU1_dx);
963 dqx_dU4 = tmpx * (-orho2 * dU4_dx + 2 * orho3 * U4 * dU1_dx);
964 dqx_dU5 = -tmpx * orho2 * dU1_dx;
966 dqy_dU1 = tmpy * (-orho2 * dU5_dy + 2 * orho3 * U5 * dU1_dy +
967 2 * orho3 * U2 * dU2_dy - 3 * orho4 * U2 * U2 * dU1_dy +
968 2 * orho3 * U3 * dU3_dy - 3 * orho4 * U3 * U3 * dU1_dy +
969 2 * orho3 * U4 * dU4_dy - 3 * orho4 * U4 * U4 * dU1_dy);
970 dqy_dU2 = tmpy * (-orho2 * dU2_dy + 2 * orho3 * U2 * dU1_dy);
971 dqy_dU3 = tmpy * (-orho2 * dU3_dy + 2 * orho3 * U3 * dU1_dy);
972 dqy_dU4 = tmpy * (-orho2 * dU4_dy + 2 * orho3 * U4 * dU1_dy);
973 dqy_dU5 = -tmpy * orho2 * dU1_dy;
975 dqz_dU1 = tmpz * (-orho2 * dU5_dz + 2 * orho3 * U5 * dU1_dz +
976 2 * orho3 * U2 * dU2_dz - 3 * orho4 * U2 * U2 * dU1_dz +
977 2 * orho3 * U3 * dU3_dz - 3 * orho4 * U3 * U3 * dU1_dz +
978 2 * orho3 * U4 * dU4_dz - 3 * orho4 * U4 * U4 * dU1_dz);
979 dqz_dU2 = tmpz * (-orho2 * dU2_dz + 2 * orho3 * U2 * dU1_dz);
980 dqz_dU3 = tmpz * (-orho2 * dU3_dz + 2 * orho3 * U3 * dU1_dz);
981 dqz_dU4 = tmpz * (-orho2 * dU4_dz + 2 * orho3 * U4 * dU1_dz);
982 dqz_dU5 = -tmpz * orho2 * dU1_dz;
983 tmpArray[3 + 0 * nrow] =
984 tmpArray[3 + 0 * nrow] - dqx_dU1 - dqy_dU1 - dqz_dU1;
985 tmpArray[3 + 1 * nrow] =
986 tmpArray[3 + 1 * nrow] - dqx_dU2 - dqy_dU2 - dqz_dU2;
987 tmpArray[3 + 2 * nrow] =
988 tmpArray[3 + 2 * nrow] - dqx_dU3 - dqy_dU3 - dqz_dU3;
989 tmpArray[3 + 3 * nrow] =
990 tmpArray[3 + 3 * nrow] - dqx_dU4 - dqy_dU4 - dqz_dU4;
991 tmpArray[3 + 4 * nrow] =
992 tmpArray[3 + 4 * nrow] - dqx_dU5 - dqy_dU5 - dqz_dU5;
996 const int nConvectiveFields,
const int nElmtPnt,
1003 int nSpaceDim =
m_graph->GetSpaceDimension();
1009 for (
int j = 0; j < nSpaceDim; j++)
1019 for (
int npnt = 0; npnt < nElmtPnt; npnt++)
1021 for (
int j = 0; j < nConvectiveFields; j++)
1023 pointVar[j] = locVars[j][npnt];
1025 for (
int j = 0; j < nSpaceDim; j++)
1027 for (
int k = 0; k < nConvectiveFields; k++)
1029 pointDerv[j][k] = locDerv[j][k][npnt];
1033 pointmu = locmu[npnt];
1034 pointDmuDT = locDmuDT[npnt];
1038 for (
int j = 0; j < nConvectiveFields; j++)
1040 int noffset = j * nConvectiveFields;
1043 tmp1 = PntJacArray[npnt] + (noffset + 1), 1,
1044 tmp2 = wspMatData + (noffset - j), 1,
1045 tmp3 = PntJacArray[npnt] + (noffset + 1), 1);
1059 GetdFlux_dU_2D(normals, mu, DmuDT, conservVar, conseDeriv, fluxJac);
1063 GetdFlux_dU_3D(normals, mu, DmuDT, conservVar, conseDeriv, fluxJac);
1079 int nConvectiveFields = inarray.size();
1080 std::shared_ptr<LocalRegions::ExpansionVector> expvect = explist->GetExp();
1081 int nTotElmt = (*expvect).size();
1082 int nPts = explist->GetTotPoints();
1083 int nSpaceDim =
m_graph->GetSpaceDimension();
1089 m_varConv->GetTemperature(inarray, temperature);
1100 nConvectiveFields - 1, nConvectiveFields);
1103 for (
int nelmt = 0; nelmt < nTotElmt; nelmt++)
1105 int nElmtPnt = (*expvect)[nelmt]->GetTotPoints();
1106 int noffest = explist->GetPhys_Offset(nelmt);
1108 for (
int j = 0; j < nConvectiveFields; j++)
1110 locVars[j] = inarray[j] + noffest;
1113 for (
int j = 0; j < nSpaceDim; j++)
1115 locnormal[j] = normals[j] + noffest;
1118 locmu = mu + noffest;
1119 for (
int npnt = 0; npnt < nElmtPnt; npnt++)
1121 for (
int j = 0; j < nConvectiveFields; j++)
1123 pointVar[j] = locVars[j][npnt];
1125 for (
int j = 0; j < nSpaceDim; j++)
1127 pointnormals[j] = locnormal[j][npnt];
1130 pointmu = locmu[npnt];
1134 for (
int j = 0; j < nConvectiveFields; j++)
1136 ElmtJacArray[0][j][nFluxDir][nelmt][npnt] = 0.0;
1138 for (
int j = 0; j < nConvectiveFields; j++)
1140 int noffset = j * (nConvectiveFields - 1);
1141 for (
int i = 0; i < nConvectiveFields - 1; i++)
1143 ElmtJacArray[i + 1][j][nFluxDir][nelmt][npnt] =
1144 PointFJac_data[noffset + i];
1152 const int nConvectiveFields,
const int nElmtPnt,
const int nDervDir,
1158 int nSpaceDim =
m_graph->GetSpaceDimension();
1169 for (
int npnt = 0; npnt < nElmtPnt; npnt++)
1171 for (
int j = 0; j < nConvectiveFields; j++)
1173 pointVar[j] = locVars[j][npnt];
1175 for (
int j = 0; j < nSpaceDim; j++)
1177 pointnormals[j] = locnormal[j][npnt];
1180 pointmu = locmu[npnt];
1184 Vmath::Zero(nConvectiveFields, PntJacArray[npnt], nConvectiveFields);
1185 for (
int j = 0; j < nConvectiveFields; j++)
1187 int noffset = j * (nConvectiveFields - 1);
1188 Vmath::Vcopy((nConvectiveFields - 1), tmp1 = wspMatData + noffset,
1189 1, tmp2 = PntJacArray[npnt] + noffset + j + 1, 1);
1201 int nConvectiveFields = inarray.size();
1202 std::shared_ptr<LocalRegions::ExpansionVector> expvect = explist->GetExp();
1203 int nTotElmt = (*expvect).size();
1204 int nPts = explist->GetTotPoints();
1205 int nSpaceDim =
m_graph->GetSpaceDimension();
1208 if (!ElmtJac.size())
1211 for (
int nelmt = 0; nelmt < nTotElmt; nelmt++)
1213 int nElmtPnt = (*expvect)[nelmt]->GetTotPoints();
1215 for (
int npnt = 0; npnt < nElmtPnt; npnt++)
1217 ElmtJac[nelmt][npnt] =
1219 nConvectiveFields, nConvectiveFields);
1228 m_varConv->GetTemperature(inarray, temperature);
1241 nConvectiveFields - 1, nConvectiveFields);
1245 for (
int nelmt = 0; nelmt < nTotElmt; nelmt++)
1247 int nElmtPnt = (*expvect)[nelmt]->GetTotPoints();
1248 int noffest = explist->GetPhys_Offset(nelmt);
1250 for (
int j = 0; j < nConvectiveFields; j++)
1252 locVars[j] = inarray[j] + noffest;
1255 for (
int j = 0; j < nSpaceDim; j++)
1257 locnormal[j] = normals[j] + noffest;
1260 locmu = mu + noffest;
1261 for (
int npnt = 0; npnt < nElmtPnt; npnt++)
1263 for (
int j = 0; j < nConvectiveFields; j++)
1265 pointVar[j] = locVars[j][npnt];
1267 for (
int j = 0; j < nSpaceDim; j++)
1269 pointnormals[j] = locnormal[j][npnt];
1272 pointmu = locmu[npnt];
1276 tmpMatinnData = PointFJac->GetPtr();
1277 tmpMatoutData = ElmtJac[nelmt][npnt]->GetPtr();
1279 Vmath::Fill(nConvectiveFields, 0.0, tmpMatoutData,
1281 for (
int j = 0; j < nConvectiveFields; j++)
1284 nConvectiveFields - 1,
1285 tmp1 = tmpMatinnData + (j * (nConvectiveFields - 1)), 1,
1286 tmp2 = tmpMatoutData + (1 + j * nConvectiveFields), 1);
1296 int nConvectiveFields =
m_fields.size();
1306 for (
int j = 0; j < nConvectiveFields; j++)
1319 int nPts = mu.size();
1323 m_varConv->GetTemperature(inarray, temperature);
1328 if (DmuDT.size() > 0)
1330 m_varConv->GetDmuDT(temperature, mu, DmuDT);
1335 if (DmuDT.size() > 0)
1343 const std::string type)
const
1345 if (type ==
"Physical" || type ==
"Off")
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
bool m_updateShockCaptPhys
virtual void v_InitObject(bool DeclareFields=true) override
Initialization object for CFSImplicit class.
NekDouble m_bndEvaluateTime
SolverUtils::DiffusionSharedPtr m_diffusion
VariableConverterSharedPtr m_varConv
ArtificialDiffusionSharedPtr m_artificialDiffusion
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.
void GetDivCurlSquared(const Array< OneD, MultiRegions::ExpListSharedPtr > &fields, const Array< OneD, Array< OneD, NekDouble >> &cnsVar, Array< OneD, NekDouble > &div, Array< OneD, NekDouble > &curlSquare, const Array< OneD, Array< OneD, NekDouble >> &cnsVarFwd, const Array< OneD, Array< OneD, NekDouble >> &cnsVarBwd)
Get divergence and curl squared.
void InitObject_Explicit()
bool m_is_shockCaptPhys
flag for shock capturing switch on/off an enum could be added for more options
void GetViscosityAndThermalCondFromTemp(const Array< OneD, NekDouble > &temperature, Array< OneD, NekDouble > &mu, Array< OneD, NekDouble > &thermalCond)
Update viscosity todo: add artificial viscosity here.
bool m_is_diffIP
flag to switch between IP and LDG an enum could be added for more options
std::string m_ViscosityType
virtual void v_GetDiffusionFluxJacPoint(const Array< OneD, NekDouble > &conservVar, const Array< OneD, const Array< OneD, NekDouble >> &conseDeriv, const NekDouble mu, const NekDouble DmuDT, const Array< OneD, NekDouble > &normals, DNekMatSharedPtr &fluxJac)
Array< OneD, GetdFlux_dDeriv > m_GetdFlux_dDeriv_Array
virtual void v_CalcMuDmuDT(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, NekDouble > &mu, Array< OneD, NekDouble > &DmuDT) override
void GetdFlux_dQx_3D(const Array< OneD, NekDouble > &normals, const NekDouble &mu, const Array< OneD, NekDouble > &U, DNekMatSharedPtr &OutputMatrix)
return part of viscous Jacobian derived with Qx=[drho_dx,drhou_dx,drhov_dx,drhow_dx,...
virtual void v_DoDiffusionCoeff(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const Array< OneD, const Array< OneD, NekDouble >> &pFwd, const Array< OneD, const Array< OneD, NekDouble >> &pBwd) override
void GetdFlux_dU_2D(const Array< OneD, NekDouble > &normals, const NekDouble mu, const NekDouble dmu_dT, const Array< OneD, NekDouble > &U, const Array< OneD, const Array< OneD, NekDouble >> &qfield, DNekMatSharedPtr &OutputMatrix)
return part of viscous Jacobian Input: normals:Point normals mu: dynamicviscosity dmu_dT: mu's deriva...
virtual void v_GetFluxDerivJacDirctnElmt(const int nConvectiveFields, const int nElmtPnt, const int nDervDir, const Array< OneD, const Array< OneD, NekDouble >> &locVars, const Array< OneD, NekDouble > &locmu, const Array< OneD, const Array< OneD, NekDouble >> &locnormal, DNekMatSharedPtr &wspMat, Array< OneD, Array< OneD, NekDouble >> &PntJacArray) override
void GetdFlux_dQx_2D(const Array< OneD, NekDouble > &normals, const NekDouble &mu, const Array< OneD, NekDouble > &U, DNekMatSharedPtr &OutputMatrix)
return part of viscous Jacobian:
virtual void v_GetFluxDerivJacDirctn(const MultiRegions::ExpListSharedPtr &explist, const Array< OneD, const Array< OneD, NekDouble >> &normals, const int nDervDir, const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray5D< NekDouble > &ElmtJacArray, const int nFluxDir) override
virtual void v_InitObject(bool DeclareFields=true) override
Initialization object for CompressibleFlowSystem class.
void GetdFlux_dQy_3D(const Array< OneD, NekDouble > &normals, const NekDouble &mu, const Array< OneD, NekDouble > &U, DNekMatSharedPtr &OutputMatrix)
return part of viscous Jacobian derived with Qy=[drho_dy,drhou_dy,drhov_dy,drhow_dy,...
virtual void v_MinusDiffusionFluxJacPoint(const int nConvectiveFields, const int nElmtPnt, const Array< OneD, const Array< OneD, NekDouble >> &locVars, const TensorOfArray3D< NekDouble > &locDerv, const Array< OneD, NekDouble > &locmu, const Array< OneD, NekDouble > &locDmuDT, const Array< OneD, NekDouble > &normals, DNekMatSharedPtr &wspMat, Array< OneD, Array< OneD, NekDouble >> &PntJacArray) override
virtual ~NavierStokesImplicitCFE()
virtual void v_CalcPhysDeriv(const Array< OneD, const Array< OneD, NekDouble >> &inarray, TensorOfArray3D< NekDouble > &qfield) override
void GetdFlux_dQz_3D(const Array< OneD, NekDouble > &normals, const NekDouble &mu, const Array< OneD, NekDouble > &U, DNekMatSharedPtr &OutputMatrix)
return part of viscous Jacobian derived with Qz=[drho_dz,drhou_dz,drhov_dz,drhow_dz,...
void GetdFlux_dQy_2D(const Array< OneD, NekDouble > &normals, const NekDouble &mu, const Array< OneD, NekDouble > &U, DNekMatSharedPtr &OutputMatrix)
return part of viscous Jacobian:
virtual bool v_SupportsShockCaptType(const std::string type) const override final
void GetdFlux_dU_3D(const Array< OneD, NekDouble > &normals, const NekDouble mu, const NekDouble dmu_dT, const Array< OneD, NekDouble > &U, const Array< OneD, const Array< OneD, NekDouble >> &qfield, DNekMatSharedPtr &OutputMatrix)
return part of viscous Jacobian Input: normals:Point normals mu: dynamicviscosity dmu_dT: mu's deriva...
int m_spacedim
Spatial dimension (>= expansion dim).
SpatialDomains::MeshGraphSharedPtr m_graph
Pointer to graph defining mesh.
SOLVER_UTILS_EXPORT int GetTraceTotPoints()
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
SOLVER_UTILS_EXPORT int GetNpoints()
SOLVER_UTILS_EXPORT int GetNcoeffs()
SOLVER_UTILS_EXPORT int GetTotPoints()
Base class for unsteady solvers.
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
EquationSystemFactory & GetEquationSystemFactory()
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
The above copyright notice and this permission notice shall be included.
static Array< OneD, Array< OneD, NekDouble > > NullNekDoubleArrayOfArray
std::shared_ptr< DNekMat > DNekMatSharedPtr
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 Zero(int n, T *x, const int incx)
Zero vector.
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
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.