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)
132 for (
int i = 0; i < nvariables; ++i)
134 Vmath::Vadd(ncoeffs, outarrayDiff[i], 1, outarray[i], 1,
144 for (
int i = 0; i < nvariables - 1; ++i)
153 m_varConv->GetPressure(inarray, inarrayDiff[0]);
156 m_varConv->GetTemperature(inarray, inarrayDiff[nvariables - 2]);
159 m_varConv->GetVelocityVector(inarray, inarrayDiff);
173 m_varConv->GetTemperature(pFwd, inFwd[nvariables - 2]);
174 m_varConv->GetTemperature(pBwd, inBwd[nvariables - 2]);
176 m_varConv->GetVelocityVector(pFwd, inFwd);
177 m_varConv->GetVelocityVector(pBwd, inBwd);
184 for (
int i = 0; i < nvariables; ++i)
186 Vmath::Vadd(npoints, outarrayDiff[i], 1, outarray[i], 1,
230 OneThird = 1.0 / 3.0;
231 TwoThird = 2.0 * OneThird;
232 FourThird = 4.0 * OneThird;
235 tmpArray = OutputMatrix->GetPtr();
236 int nrow = OutputMatrix->GetRows();
238 tmpArray[0 + 0 * nrow] = tmp * (-FourThird * u * nx - v * ny);
239 tmpArray[0 + 1 * nrow] = tmp * (FourThird * nx);
240 tmpArray[0 + 2 * nrow] = tmp * ny;
241 tmpArray[0 + 3 * nrow] = 0.0;
242 tmpArray[1 + 0 * nrow] = tmp * (-v * nx + TwoThird * u * ny);
243 tmpArray[1 + 1 * nrow] = tmp * (-TwoThird * ny);
244 tmpArray[1 + 2 * nrow] = tmp * nx;
245 tmpArray[1 + 3 * nrow] = 0.0;
246 tmpArray[2 + 0 * nrow] =
247 (FourThird * u * u + v * v + tmp2 * (E - q2)) * nx +
248 OneThird * u * v * ny;
249 tmpArray[2 + 0 * nrow] = -tmp * (*OutputMatrix)(2, 0);
250 tmpArray[2 + 1 * nrow] = (FourThird - tmp2) * u * nx - TwoThird * v * ny;
251 tmpArray[2 + 1 * nrow] = tmp * (*OutputMatrix)(2, 1);
252 tmpArray[2 + 2 * nrow] = (1 - tmp2) * v * nx + u * ny;
253 tmpArray[2 + 2 * nrow] = tmp * (*OutputMatrix)(2, 2);
254 tmpArray[2 + 3 * nrow] = tmp * tmp2 * nx;
288 OneThird = 1.0 / 3.0;
289 TwoThird = 2.0 * OneThird;
290 FourThird = 4.0 * OneThird;
293 tmpArray = OutputMatrix->GetPtr();
294 int nrow = OutputMatrix->GetRows();
296 tmpArray[0 + 0 * nrow] = tmp * (TwoThird * v * nx - u * ny);
297 tmpArray[0 + 1 * nrow] = tmp * ny;
298 tmpArray[0 + 2 * nrow] = tmp * (-TwoThird) * nx;
299 tmpArray[0 + 3 * nrow] = 0.0;
300 tmpArray[1 + 0 * nrow] = tmp * (-u * nx - FourThird * v * ny);
301 tmpArray[1 + 1 * nrow] = tmp * nx;
302 tmpArray[1 + 2 * nrow] = tmp * (FourThird * ny);
303 tmpArray[1 + 3 * nrow] = 0.0;
304 tmpArray[2 + 0 * nrow] = OneThird * u * v * nx +
305 (FourThird * v * v + u * u + tmp2 * (E - q2)) * ny;
306 tmpArray[2 + 0 * nrow] = -tmp * (*OutputMatrix)(2, 0);
307 tmpArray[2 + 1 * nrow] = (1 - tmp2) * u * ny + v * nx;
308 tmpArray[2 + 1 * nrow] = tmp * (*OutputMatrix)(2, 1);
309 tmpArray[2 + 2 * nrow] = (FourThird - tmp2) * v * ny - TwoThird * u * nx;
310 tmpArray[2 + 2 * nrow] = tmp * (*OutputMatrix)(2, 2);
311 tmpArray[2 + 3 * nrow] = tmp * tmp2 * ny;
353 OneThird = 1.0 / 3.0;
354 TwoThird = 2.0 * OneThird;
355 FourThird = 4.0 * OneThird;
358 tmpArray = OutputMatrix->GetPtr();
359 int nrow = OutputMatrix->GetRows();
361 tmpArray[0 + 0 * nrow] =
362 tmpx * (-FourThird * u) + tmpy * (-v) + tmpz * (-w);
363 tmpArray[0 + 1 * nrow] = tmpx * FourThird;
364 tmpArray[0 + 2 * nrow] = tmpy;
365 tmpArray[0 + 3 * nrow] = tmpz;
366 tmpArray[0 + 4 * nrow] = 0.0;
367 tmpArray[1 + 0 * nrow] = tmpx * (-v) + tmpy * (TwoThird * u);
368 tmpArray[1 + 1 * nrow] = tmpy * (-TwoThird);
369 tmpArray[1 + 2 * nrow] = tmpx;
370 tmpArray[1 + 3 * nrow] = 0.0;
371 tmpArray[1 + 4 * nrow] = 0.0;
372 tmpArray[2 + 0 * nrow] = tmpx * (-w) + tmpz * (TwoThird * u);
373 tmpArray[2 + 1 * nrow] = tmpz * (-TwoThird);
374 tmpArray[2 + 2 * nrow] = 0.0;
375 tmpArray[2 + 3 * nrow] = tmpx;
376 tmpArray[2 + 4 * nrow] = 0.0;
377 tmpArray[3 + 0 * nrow] =
378 -tmpx * (FourThird * u * u + v * v + w * w + tmp2 * (E - q2)) +
379 tmpy * (-OneThird * u * v) + tmpz * (-OneThird * u * w);
380 tmpArray[3 + 1 * nrow] = tmpx * (FourThird - tmp2) * u +
381 tmpy * (-TwoThird * v) + tmpz * (-TwoThird * w);
382 tmpArray[3 + 2 * nrow] = tmpx * (1.0 - tmp2) * v + tmpy * u;
383 tmpArray[3 + 3 * nrow] = tmpx * (1.0 - tmp2) * w + tmpz * u;
384 tmpArray[3 + 4 * nrow] = tmpx * tmp2;
426 OneThird = 1.0 / 3.0;
427 TwoThird = 2.0 * OneThird;
428 FourThird = 4.0 * OneThird;
431 tmpArray = OutputMatrix->GetPtr();
432 int nrow = OutputMatrix->GetRows();
434 tmpArray[0 + 0 * nrow] = tmpx * (TwoThird * v) + tmpy * (-u);
435 tmpArray[0 + 1 * nrow] = tmpy;
436 tmpArray[0 + 2 * nrow] = tmpx * (-TwoThird);
437 tmpArray[0 + 3 * nrow] = 0.0;
438 tmpArray[0 + 4 * nrow] = 0.0;
439 tmpArray[1 + 0 * nrow] =
440 tmpx * (-u) + tmpy * (-FourThird * v) + tmpz * (-w);
441 tmpArray[1 + 1 * nrow] = tmpx;
442 tmpArray[1 + 2 * nrow] = tmpy * FourThird;
443 tmpArray[1 + 3 * nrow] = tmpz;
444 tmpArray[1 + 4 * nrow] = 0.0;
445 tmpArray[2 + 0 * nrow] = tmpy * (-w) + tmpz * (TwoThird * v);
446 tmpArray[2 + 1 * nrow] = 0.0;
447 tmpArray[2 + 2 * nrow] = tmpz * (-TwoThird);
448 tmpArray[2 + 3 * nrow] = tmpy;
449 tmpArray[2 + 4 * nrow] = 0.0;
450 tmpArray[3 + 0 * nrow] =
451 tmpx * (-OneThird * u * v) -
452 tmpy * (u * u + FourThird * v * v + w * w + tmp2 * (E - q2)) +
453 tmpz * (-OneThird * v * w);
454 tmpArray[3 + 1 * nrow] = tmpx * v + tmpy * (1 - tmp2) * u;
455 tmpArray[3 + 2 * nrow] = tmpx * (-TwoThird * u) +
456 tmpy * (FourThird - tmp2) * v +
457 tmpz * (-TwoThird * w);
458 tmpArray[3 + 3 * nrow] = tmpy * (1 - tmp2) * w + tmpz * v;
459 tmpArray[3 + 4 * nrow] = tmpy * tmp2;
501 OneThird = 1.0 / 3.0;
502 TwoThird = 2.0 * OneThird;
503 FourThird = 4.0 * OneThird;
506 tmpArray = OutputMatrix->GetPtr();
507 int nrow = OutputMatrix->GetRows();
509 tmpArray[0 + 0 * nrow] = tmpx * (TwoThird * w) + tmpz * (-u);
510 tmpArray[0 + 1 * nrow] = tmpz;
511 tmpArray[0 + 2 * nrow] = 0.0;
512 tmpArray[0 + 3 * nrow] = tmpx * (-TwoThird);
513 tmpArray[0 + 4 * nrow] = 0.0;
514 tmpArray[1 + 0 * nrow] = tmpy * (TwoThird * w) + tmpz * (-v);
515 tmpArray[1 + 1 * nrow] = 0.0;
516 tmpArray[1 + 2 * nrow] = tmpz;
517 tmpArray[1 + 3 * nrow] = tmpy * (-TwoThird);
518 tmpArray[1 + 4 * nrow] = 0.0;
519 tmpArray[2 + 0 * nrow] =
520 tmpx * (-u) + tmpy * (-v) + tmpz * (-FourThird * w);
521 tmpArray[2 + 1 * nrow] = tmpx;
522 tmpArray[2 + 2 * nrow] = tmpy;
523 tmpArray[2 + 3 * nrow] = tmpz * FourThird;
524 tmpArray[2 + 4 * nrow] = 0.0;
525 tmpArray[3 + 0 * nrow] =
526 tmpx * (-OneThird * u * w) + tmpy * (-OneThird * v * w) -
527 tmpz * (u * u + v * v + FourThird * w * w + tmp2 * (E - q2));
528 tmpArray[3 + 1 * nrow] = tmpx * w + tmpz * (1 - tmp2) * u;
529 tmpArray[3 + 2 * nrow] = tmpy * w + tmpz * (1 - tmp2) * v;
530 tmpArray[3 + 3 * nrow] = tmpx * (-TwoThird * u) + tmpy * (-TwoThird * v) +
531 tmpz * (FourThird - tmp2) * w;
532 tmpArray[3 + 4 * nrow] = tmpz * tmp2;
552 tmpArray = OutputMatrix->GetPtr();
553 int nrow = OutputMatrix->GetRows();
577 orho2 = orho1 * orho1;
578 orho3 = orho1 * orho2;
579 orho4 = orho2 * orho2;
588 NekDouble du_dx = orho1 * (dU2_dx - u * dU1_dx);
589 NekDouble dv_dx = orho1 * (dU3_dx - v * dU1_dx);
590 NekDouble du_dy = orho1 * (dU2_dy - u * dU1_dy);
591 NekDouble dv_dy = orho1 * (dU3_dy - v * dU1_dy);
592 NekDouble s12 = FourThird * du_dx - TwoThrid * dv_dy;
595 NekDouble s23 = FourThird * dv_dy - TwoThrid * du_dx;
600 (orho1 * dU4_dx - U[3] * orho2 * dU1_dx -
601 u * (orho1 * dU2_dx - U[1] * orho2 * dU1_dx) -
602 v * (orho1 * dU3_dx - U[2] * orho2 * dU1_dx));
604 (orho1 * dU4_dy - U[3] * orho2 * dU1_dy -
605 u * (orho1 * dU2_dy - U[1] * orho2 * dU1_dy) -
606 v * (orho1 * dU3_dy - U[2] * orho2 * dU1_dy));
613 tmp[2] = snv - qn / mu;
615 dT_dU[0] = oCv * (-orho2 * U4 + orho3 * U2 * U2 + orho3 * U3 * U3);
616 dT_dU[1] = -oCv * orho2 * U2;
617 dT_dU[2] = -oCv * orho2 * U3;
618 dT_dU[3] = oCv * orho1;
619 for (
int i = 0; i < 3; i++)
621 for (
int j = 0; j < 4; j++)
623 tmpArray[i + j * nrow] = dmu_dT * dT_dU[j] * tmp[i];
640 du_dx_dU1 = -orho2 * dU2_dx + 2 * orho3 * U2 * dU1_dx;
641 du_dx_dU2 = -orho2 * dU1_dx;
642 du_dy_dU1 = -orho2 * dU2_dy + 2 * orho3 * U2 * dU1_dy;
643 du_dy_dU2 = -orho2 * dU1_dy;
644 dv_dx_dU1 = -orho2 * dU3_dx + 2 * orho3 * U3 * dU1_dx;
645 dv_dx_dU3 = du_dx_dU2;
646 dv_dy_dU1 = -orho2 * dU3_dy + 2 * orho3 * U3 * dU1_dy;
647 dv_dy_dU3 = du_dy_dU2;
648 ds12_dU1 = FourThird * du_dx_dU1 - TwoThrid * dv_dy_dU1;
649 ds12_dU2 = FourThird * du_dx_dU2;
650 ds12_dU3 = -TwoThrid * dv_dy_dU3;
651 ds13_dU1 = du_dy_dU1 + dv_dx_dU1;
652 ds13_dU2 = du_dy_dU2;
653 ds13_dU3 = dv_dx_dU3;
657 ds23_dU1 = FourThird * dv_dy_dU1 - TwoThrid * du_dx_dU1;
658 ds23_dU2 = -TwoThrid * du_dx_dU2;
659 ds23_dU3 = FourThird * dv_dy_dU3;
660 dsnx_dU1 = ds12_dU1 * nx + ds22_dU1 * ny;
661 dsnx_dU2 = ds12_dU2 * nx + ds22_dU2 * ny;
662 dsnx_dU3 = ds12_dU3 * nx + ds22_dU3 * ny;
663 dsny_dU1 = ds13_dU1 * nx + ds23_dU1 * ny;
664 dsny_dU2 = ds13_dU2 * nx + ds23_dU2 * ny;
665 dsny_dU3 = ds13_dU3 * nx + ds23_dU3 * ny;
667 u * dsnx_dU1 + v * dsny_dU1 - orho2 * U2 * snx - orho2 * U3 * sny;
668 dsnv_dU2 = u * dsnx_dU2 + v * dsny_dU2 + orho1 * snx;
669 dsnv_dU3 = u * dsnx_dU3 + v * dsny_dU3 + orho1 * sny;
670 tmpArray[0 + 0 * nrow] = tmpArray[0 + 0 * nrow] + mu * dsnx_dU1;
671 tmpArray[0 + 1 * nrow] = tmpArray[0 + 1 * nrow] + mu * dsnx_dU2;
672 tmpArray[0 + 2 * nrow] = tmpArray[0 + 2 * nrow] + mu * dsnx_dU3;
673 tmpArray[1 + 0 * nrow] = tmpArray[1 + 0 * nrow] + mu * dsny_dU1;
674 tmpArray[1 + 1 * nrow] = tmpArray[1 + 1 * nrow] + mu * dsny_dU2;
675 tmpArray[1 + 2 * nrow] = tmpArray[1 + 2 * nrow] + mu * dsny_dU3;
676 tmpArray[2 + 0 * nrow] = tmpArray[2 + 0 * nrow] + mu * dsnv_dU1;
677 tmpArray[2 + 1 * nrow] = tmpArray[2 + 1 * nrow] + mu * dsnv_dU2;
678 tmpArray[2 + 2 * nrow] = tmpArray[2 + 2 * nrow] + mu * dsnv_dU3;
681 NekDouble dqx_dU1, dqx_dU2, dqx_dU3, dqx_dU4;
682 NekDouble dqy_dU1, dqy_dU2, dqy_dU3, dqy_dU4;
684 dqx_dU1 = tmpx * (-orho2 * dU4_dx + 2 * orho3 * U4 * dU1_dx +
685 2 * orho3 * U2 * dU2_dx - 3 * orho4 * U2 * U2 * dU1_dx +
686 2 * orho3 * U3 * dU3_dx - 3 * orho4 * U3 * U3 * dU1_dx);
687 dqx_dU2 = tmpx * (-orho2 * dU2_dx + 2 * orho3 * U2 * dU1_dx);
688 dqx_dU3 = tmpx * (-orho2 * dU3_dx + 2 * orho3 * U3 * dU1_dx);
689 dqx_dU4 = -tmpx * orho2 * dU1_dx;
691 dqy_dU1 = tmpy * (-orho2 * dU4_dy + 2 * orho3 * U4 * dU1_dy +
692 2 * orho3 * U2 * dU2_dy - 3 * orho4 * U2 * U2 * dU1_dy +
693 2 * orho3 * U3 * dU3_dy - 3 * orho4 * U3 * U3 * dU1_dy);
694 dqy_dU2 = tmpy * (-orho2 * dU2_dy + 2 * orho3 * U2 * dU1_dy);
695 dqy_dU3 = tmpy * (-orho2 * dU3_dy + 2 * orho3 * U3 * dU1_dy);
696 dqy_dU4 = -tmpy * orho2 * dU1_dy;
697 tmpArray[2 + 0 * nrow] = tmpArray[2 + 0 * nrow] - dqx_dU1 - dqy_dU1;
698 tmpArray[2 + 1 * nrow] = tmpArray[2 + 1 * nrow] - dqx_dU2 - dqy_dU2;
699 tmpArray[2 + 2 * nrow] = tmpArray[2 + 2 * nrow] - dqx_dU3 - dqy_dU3;
700 tmpArray[2 + 3 * nrow] = tmpArray[2 + 3 * nrow] - dqx_dU4 - dqy_dU4;
720 tmpArray = OutputMatrix->GetPtr();
721 int nrow = OutputMatrix->GetRows();
754 orho2 = orho1 * orho1;
755 orho3 = orho1 * orho2;
756 orho4 = orho2 * orho2;
766 NekDouble du_dx = orho1 * (dU2_dx - u * dU1_dx);
767 NekDouble dv_dx = orho1 * (dU3_dx - v * dU1_dx);
768 NekDouble dw_dx = orho1 * (dU4_dx - w * dU1_dx);
769 NekDouble du_dy = orho1 * (dU2_dy - u * dU1_dy);
770 NekDouble dv_dy = orho1 * (dU3_dy - v * dU1_dy);
771 NekDouble dw_dy = orho1 * (dU4_dy - w * dU1_dy);
772 NekDouble du_dz = orho1 * (dU2_dz - u * dU1_dz);
773 NekDouble dv_dz = orho1 * (dU3_dz - v * dU1_dz);
774 NekDouble dw_dz = orho1 * (dU4_dz - w * dU1_dz);
775 NekDouble s12 = FourThird * du_dx - TwoThrid * dv_dy - TwoThrid * dw_dz;
779 NekDouble s23 = FourThird * dv_dy - TwoThrid * du_dx - TwoThrid * dw_dz;
783 NekDouble s34 = FourThird * dw_dz - TwoThrid * du_dx - TwoThrid * dv_dy;
784 NekDouble snx = s12 * nx + s22 * ny + s32 * nz;
785 NekDouble sny = s13 * nx + s23 * ny + s33 * nz;
786 NekDouble snz = s14 * nz + s24 * ny + s34 * nz;
787 NekDouble snv = snx * u + sny * v + snz * w;
788 NekDouble qx = -tmp2 * (orho1 * dU5_dx - U5 * orho2 * dU1_dx -
789 u * (orho1 * dU2_dx - U2 * orho2 * dU1_dx) -
790 v * (orho1 * dU3_dx - U3 * orho2 * dU1_dx) -
791 w * (orho1 * dU4_dx - U4 * orho2 * dU1_dx));
792 NekDouble qy = -tmp2 * (orho1 * dU5_dy - U5 * orho2 * dU1_dy -
793 u * (orho1 * dU2_dy - U2 * orho2 * dU1_dy) -
794 v * (orho1 * dU3_dy - U3 * orho2 * dU1_dy) -
795 w * (orho1 * dU4_dy - U4 * orho2 * dU1_dy));
796 NekDouble qz = -tmp2 * (orho1 * dU5_dz - U5 * orho2 * dU1_dz -
797 u * (orho1 * dU2_dz - U2 * orho2 * dU1_dz) -
798 v * (orho1 * dU3_dz - U3 * orho2 * dU1_dz) -
799 w * (orho1 * dU4_dz - U4 * orho2 * dU1_dz));
800 NekDouble qn = qx * nx + qy * ny + qz * nz;
807 tmp[3] = snv - qn / mu;
809 dT_dU[0] = oCv * (-orho2 * U5 + orho3 * U2 * U2 + orho3 * U3 * U3 +
811 dT_dU[1] = -oCv * orho2 * U2;
812 dT_dU[2] = -oCv * orho2 * U3;
813 dT_dU[3] = -oCv * orho2 * U4;
814 dT_dU[4] = oCv * orho1;
815 for (
int i = 0; i < 4; i++)
817 for (
int j = 0; j < 5; j++)
819 tmpArray[i + j * nrow] = dmu_dT * dT_dU[j] * tmp[i];
833 NekDouble ds12_dU1, ds12_dU2, ds12_dU3, ds12_dU4;
837 NekDouble ds23_dU1, ds23_dU2, ds23_dU3, ds23_dU4;
841 NekDouble ds34_dU1, ds34_dU2, ds34_dU3, ds34_dU4;
842 NekDouble dsnx_dU1, dsnx_dU2, dsnx_dU3, dsnx_dU4;
843 NekDouble dsny_dU1, dsny_dU2, dsny_dU3, dsny_dU4;
844 NekDouble dsnz_dU1, dsnz_dU2, dsnz_dU3, dsnz_dU4;
845 NekDouble dsnv_dU1, dsnv_dU2, dsnv_dU3, dsnv_dU4;
847 du_dx_dU1 = -orho2 * dU2_dx + 2 * orho3 * U2 * dU1_dx;
848 du_dx_dU2 = -orho2 * dU1_dx;
849 du_dy_dU1 = -orho2 * dU2_dy + 2 * orho3 * U2 * dU1_dy;
850 du_dy_dU2 = -orho2 * dU1_dy;
851 du_dz_dU1 = -orho2 * dU2_dz + 2 * orho3 * U2 * dU1_dz;
852 du_dz_dU2 = -orho2 * dU1_dz;
853 dv_dx_dU1 = -orho2 * dU3_dx + 2 * orho3 * U3 * dU1_dx;
854 dv_dx_dU3 = -orho2 * dU1_dx;
855 dv_dy_dU1 = -orho2 * dU3_dy + 2 * orho3 * U3 * dU1_dy;
856 dv_dy_dU3 = -orho2 * dU1_dy;
857 dv_dz_dU1 = -orho2 * dU3_dz + 2 * orho3 * U3 * dU1_dz;
858 dv_dz_dU3 = -orho2 * dU1_dz;
859 dw_dx_dU1 = -orho2 * dU4_dx + 2 * orho3 * U4 * dU1_dx;
860 dw_dx_dU4 = -orho2 * dU1_dx;
861 dw_dy_dU1 = -orho2 * dU4_dy + 2 * orho3 * U4 * dU1_dy;
862 dw_dy_dU4 = -orho2 * dU1_dy;
863 dw_dz_dU1 = -orho2 * dU4_dz + 2 * orho3 * U4 * dU1_dz;
864 dw_dz_dU4 = -orho2 * dU1_dz;
866 FourThird * du_dx_dU1 - TwoThrid * dv_dy_dU1 - TwoThrid * dw_dz_dU1;
867 ds12_dU2 = FourThird * du_dx_dU2;
868 ds12_dU3 = -TwoThrid * dv_dy_dU3;
869 ds12_dU4 = -TwoThrid * dw_dz_dU4;
870 ds13_dU1 = du_dy_dU1 + dv_dx_dU1;
871 ds13_dU2 = du_dy_dU2;
872 ds13_dU3 = dv_dx_dU3;
873 ds14_dU1 = dw_dx_dU1 + du_dz_dU1;
874 ds14_dU2 = du_dz_dU2;
875 ds14_dU4 = dw_dx_dU4;
876 ds22_dU1 = du_dy_dU1 + dv_dx_dU1;
877 ds22_dU2 = du_dy_dU2;
878 ds22_dU3 = dv_dx_dU3;
880 FourThird * dv_dy_dU1 - TwoThrid * du_dx_dU1 - TwoThrid * dw_dz_dU1;
881 ds23_dU2 = -TwoThrid * du_dx_dU2;
882 ds23_dU3 = FourThird * dv_dy_dU3;
883 ds23_dU4 = -TwoThrid * dw_dz_dU4;
884 ds24_dU1 = dv_dz_dU1 + dw_dy_dU1;
885 ds24_dU3 = dv_dz_dU3;
886 ds24_dU4 = dw_dy_dU4;
887 ds32_dU1 = dw_dx_dU1 + du_dz_dU1;
888 ds32_dU2 = du_dz_dU2;
889 ds32_dU4 = dw_dx_dU4;
890 ds33_dU1 = dv_dz_dU1 + dw_dy_dU1;
891 ds33_dU3 = dv_dz_dU3;
892 ds33_dU4 = dw_dy_dU4;
894 FourThird * dw_dz_dU1 - TwoThrid * du_dx_dU1 - TwoThrid * dv_dy_dU1;
895 ds34_dU2 = -TwoThrid * du_dx_dU2;
896 ds34_dU3 = -TwoThrid * dv_dy_dU3;
897 ds34_dU4 = FourThird * dw_dz_dU4;
898 dsnx_dU1 = ds12_dU1 * nx + ds22_dU1 * ny + ds32_dU1 * nz;
899 dsnx_dU2 = ds12_dU2 * nx + ds22_dU2 * ny + ds32_dU2 * nz;
900 dsnx_dU3 = ds12_dU3 * nx + ds22_dU3 * ny;
901 dsnx_dU4 = ds12_dU4 * nx + ds32_dU4 * nz;
902 dsny_dU1 = ds13_dU1 * nx + ds23_dU1 * ny + ds33_dU1 * nz;
903 dsny_dU2 = ds13_dU2 * nx + ds23_dU2 * ny;
904 dsny_dU3 = ds13_dU3 * nx + ds23_dU3 * ny + ds33_dU3 * nz;
905 dsny_dU4 = ds23_dU4 * ny + ds33_dU4 * nz;
906 dsnz_dU1 = ds14_dU1 * nx + ds24_dU1 * ny + ds34_dU1 * nz;
907 dsnz_dU2 = ds14_dU2 * nx + ds34_dU2 * nz;
908 dsnz_dU3 = ds24_dU3 * ny + ds34_dU3 * nz;
910 dsnz_dU4 = ds14_dU4 * nx + ds24_dU4 * ny + ds34_dU4 * nz;
911 dsnv_dU1 = u * dsnx_dU1 + v * dsny_dU1 + w * dsnz_dU1 - orho2 * U2 * snx -
912 orho2 * U3 * sny - orho2 * U4 * snz;
913 dsnv_dU2 = u * dsnx_dU2 + v * dsny_dU2 + w * dsnz_dU2 + orho1 * snx;
914 dsnv_dU3 = u * dsnx_dU3 + v * dsny_dU3 + w * dsnz_dU3 + orho1 * sny;
915 dsnv_dU4 = u * dsnx_dU4 + v * dsny_dU4 + w * dsnz_dU4 + orho1 * snz;
916 tmpArray[0 + 0 * nrow] = tmpArray[0 + 0 * nrow] + mu * dsnx_dU1;
917 tmpArray[0 + 1 * nrow] = tmpArray[0 + 1 * nrow] + mu * dsnx_dU2;
918 tmpArray[0 + 2 * nrow] = tmpArray[0 + 2 * nrow] + mu * dsnx_dU3;
919 tmpArray[0 + 3 * nrow] = tmpArray[0 + 3 * nrow] + mu * dsnx_dU4;
920 tmpArray[1 + 0 * nrow] = tmpArray[1 + 0 * nrow] + mu * dsny_dU1;
921 tmpArray[1 + 1 * nrow] = tmpArray[1 + 1 * nrow] + mu * dsny_dU2;
922 tmpArray[1 + 2 * nrow] = tmpArray[1 + 2 * nrow] + mu * dsny_dU3;
923 tmpArray[1 + 3 * nrow] = tmpArray[1 + 3 * nrow] + mu * dsny_dU4;
924 tmpArray[2 + 0 * nrow] = tmpArray[2 + 0 * nrow] + mu * dsnz_dU1;
925 tmpArray[2 + 1 * nrow] = tmpArray[2 + 1 * nrow] + mu * dsnz_dU2;
926 tmpArray[2 + 2 * nrow] = tmpArray[2 + 2 * nrow] + mu * dsnz_dU3;
927 tmpArray[2 + 3 * nrow] = tmpArray[2 + 3 * nrow] + mu * dsnz_dU4;
928 tmpArray[3 + 0 * nrow] = tmpArray[3 + 0 * nrow] + mu * dsnv_dU1;
929 tmpArray[3 + 1 * nrow] = tmpArray[3 + 1 * nrow] + mu * dsnv_dU2;
930 tmpArray[3 + 2 * nrow] = tmpArray[3 + 2 * nrow] + mu * dsnv_dU3;
931 tmpArray[3 + 3 * nrow] = tmpArray[3 + 3 * nrow] + mu * dsnv_dU4;
934 NekDouble dqx_dU1, dqx_dU2, dqx_dU3, dqx_dU4, dqx_dU5;
935 NekDouble dqy_dU1, dqy_dU2, dqy_dU3, dqy_dU4, dqy_dU5;
936 NekDouble dqz_dU1, dqz_dU2, dqz_dU3, dqz_dU4, dqz_dU5;
938 dqx_dU1 = tmpx * (-orho2 * dU5_dx + 2 * orho3 * U5 * dU1_dx +
939 2 * orho3 * U2 * dU2_dx - 3 * orho4 * U2 * U2 * dU1_dx +
940 2 * orho3 * U3 * dU3_dx - 3 * orho4 * U3 * U3 * dU1_dx +
941 2 * orho3 * U4 * dU4_dx - 3 * orho4 * U4 * U4 * dU1_dx);
942 dqx_dU2 = tmpx * (-orho2 * dU2_dx + 2 * orho3 * U2 * dU1_dx);
943 dqx_dU3 = tmpx * (-orho2 * dU3_dx + 2 * orho3 * U3 * dU1_dx);
944 dqx_dU4 = tmpx * (-orho2 * dU4_dx + 2 * orho3 * U4 * dU1_dx);
945 dqx_dU5 = -tmpx * orho2 * dU1_dx;
947 dqy_dU1 = tmpy * (-orho2 * dU5_dy + 2 * orho3 * U5 * dU1_dy +
948 2 * orho3 * U2 * dU2_dy - 3 * orho4 * U2 * U2 * dU1_dy +
949 2 * orho3 * U3 * dU3_dy - 3 * orho4 * U3 * U3 * dU1_dy +
950 2 * orho3 * U4 * dU4_dy - 3 * orho4 * U4 * U4 * dU1_dy);
951 dqy_dU2 = tmpy * (-orho2 * dU2_dy + 2 * orho3 * U2 * dU1_dy);
952 dqy_dU3 = tmpy * (-orho2 * dU3_dy + 2 * orho3 * U3 * dU1_dy);
953 dqy_dU4 = tmpy * (-orho2 * dU4_dy + 2 * orho3 * U4 * dU1_dy);
954 dqy_dU5 = -tmpy * orho2 * dU1_dy;
956 dqz_dU1 = tmpz * (-orho2 * dU5_dz + 2 * orho3 * U5 * dU1_dz +
957 2 * orho3 * U2 * dU2_dz - 3 * orho4 * U2 * U2 * dU1_dz +
958 2 * orho3 * U3 * dU3_dz - 3 * orho4 * U3 * U3 * dU1_dz +
959 2 * orho3 * U4 * dU4_dz - 3 * orho4 * U4 * U4 * dU1_dz);
960 dqz_dU2 = tmpz * (-orho2 * dU2_dz + 2 * orho3 * U2 * dU1_dz);
961 dqz_dU3 = tmpz * (-orho2 * dU3_dz + 2 * orho3 * U3 * dU1_dz);
962 dqz_dU4 = tmpz * (-orho2 * dU4_dz + 2 * orho3 * U4 * dU1_dz);
963 dqz_dU5 = -tmpz * orho2 * dU1_dz;
964 tmpArray[3 + 0 * nrow] =
965 tmpArray[3 + 0 * nrow] - dqx_dU1 - dqy_dU1 - dqz_dU1;
966 tmpArray[3 + 1 * nrow] =
967 tmpArray[3 + 1 * nrow] - dqx_dU2 - dqy_dU2 - dqz_dU2;
968 tmpArray[3 + 2 * nrow] =
969 tmpArray[3 + 2 * nrow] - dqx_dU3 - dqy_dU3 - dqz_dU3;
970 tmpArray[3 + 3 * nrow] =
971 tmpArray[3 + 3 * nrow] - dqx_dU4 - dqy_dU4 - dqz_dU4;
972 tmpArray[3 + 4 * nrow] =
973 tmpArray[3 + 4 * nrow] - dqx_dU5 - dqy_dU5 - dqz_dU5;
977 const int nConvectiveFields,
const int nElmtPnt,
984 int nSpaceDim =
m_graph->GetSpaceDimension();
990 for (
int j = 0; j < nSpaceDim; j++)
1000 for (
int npnt = 0; npnt < nElmtPnt; npnt++)
1002 for (
int j = 0; j < nConvectiveFields; j++)
1004 pointVar[j] = locVars[j][npnt];
1006 for (
int j = 0; j < nSpaceDim; j++)
1008 for (
int k = 0; k < nConvectiveFields; k++)
1010 pointDerv[j][k] = locDerv[j][k][npnt];
1014 pointmu = locmu[npnt];
1015 pointDmuDT = locDmuDT[npnt];
1019 for (
int j = 0; j < nConvectiveFields; j++)
1021 int noffset = j * nConvectiveFields;
1024 tmp1 = PntJacArray[npnt] + (noffset + 1), 1,
1025 tmp2 = wspMatData + (noffset - j), 1,
1026 tmp3 = PntJacArray[npnt] + (noffset + 1), 1);
1040 GetdFlux_dU_2D(normals, mu, DmuDT, conservVar, conseDeriv, fluxJac);
1044 GetdFlux_dU_3D(normals, mu, DmuDT, conservVar, conseDeriv, fluxJac);
1060 int nConvectiveFields = inarray.size();
1061 std::shared_ptr<LocalRegions::ExpansionVector> expvect = explist->GetExp();
1062 int nTotElmt = (*expvect).size();
1063 int nPts = explist->GetTotPoints();
1064 int nSpaceDim =
m_graph->GetSpaceDimension();
1070 m_varConv->GetTemperature(inarray, temperature);
1081 nConvectiveFields - 1, nConvectiveFields);
1084 for (
int nelmt = 0; nelmt < nTotElmt; nelmt++)
1086 int nElmtPnt = (*expvect)[nelmt]->GetTotPoints();
1087 int noffest = explist->GetPhys_Offset(nelmt);
1089 for (
int j = 0; j < nConvectiveFields; j++)
1091 locVars[j] = inarray[j] + noffest;
1094 for (
int j = 0; j < nSpaceDim; j++)
1096 locnormal[j] = normals[j] + noffest;
1099 locmu = mu + noffest;
1100 for (
int npnt = 0; npnt < nElmtPnt; npnt++)
1102 for (
int j = 0; j < nConvectiveFields; j++)
1104 pointVar[j] = locVars[j][npnt];
1106 for (
int j = 0; j < nSpaceDim; j++)
1108 pointnormals[j] = locnormal[j][npnt];
1111 pointmu = locmu[npnt];
1115 for (
int j = 0; j < nConvectiveFields; j++)
1117 ElmtJacArray[0][j][nFluxDir][nelmt][npnt] = 0.0;
1119 for (
int j = 0; j < nConvectiveFields; j++)
1121 int noffset = j * (nConvectiveFields - 1);
1122 for (
int i = 0; i < nConvectiveFields - 1; i++)
1124 ElmtJacArray[i + 1][j][nFluxDir][nelmt][npnt] =
1125 PointFJac_data[noffset + i];
1133 const int nConvectiveFields,
const int nElmtPnt,
const int nDervDir,
1139 int nSpaceDim =
m_graph->GetSpaceDimension();
1150 for (
int npnt = 0; npnt < nElmtPnt; npnt++)
1152 for (
int j = 0; j < nConvectiveFields; j++)
1154 pointVar[j] = locVars[j][npnt];
1156 for (
int j = 0; j < nSpaceDim; j++)
1158 pointnormals[j] = locnormal[j][npnt];
1161 pointmu = locmu[npnt];
1165 Vmath::Zero(nConvectiveFields, PntJacArray[npnt], nConvectiveFields);
1166 for (
int j = 0; j < nConvectiveFields; j++)
1168 int noffset = j * (nConvectiveFields - 1);
1169 Vmath::Vcopy((nConvectiveFields - 1), tmp1 = wspMatData + noffset,
1170 1, tmp2 = PntJacArray[npnt] + noffset + j + 1, 1);
1182 int nConvectiveFields = inarray.size();
1183 std::shared_ptr<LocalRegions::ExpansionVector> expvect = explist->GetExp();
1184 int nTotElmt = (*expvect).size();
1185 int nPts = explist->GetTotPoints();
1186 int nSpaceDim =
m_graph->GetSpaceDimension();
1189 if (!ElmtJac.size())
1192 for (
int nelmt = 0; nelmt < nTotElmt; nelmt++)
1194 int nElmtPnt = (*expvect)[nelmt]->GetTotPoints();
1196 for (
int npnt = 0; npnt < nElmtPnt; npnt++)
1198 ElmtJac[nelmt][npnt] =
1200 nConvectiveFields, nConvectiveFields);
1209 m_varConv->GetTemperature(inarray, temperature);
1222 nConvectiveFields - 1, nConvectiveFields);
1226 for (
int nelmt = 0; nelmt < nTotElmt; nelmt++)
1228 int nElmtPnt = (*expvect)[nelmt]->GetTotPoints();
1229 int noffest = explist->GetPhys_Offset(nelmt);
1231 for (
int j = 0; j < nConvectiveFields; j++)
1233 locVars[j] = inarray[j] + noffest;
1236 for (
int j = 0; j < nSpaceDim; j++)
1238 locnormal[j] = normals[j] + noffest;
1241 locmu = mu + noffest;
1242 for (
int npnt = 0; npnt < nElmtPnt; npnt++)
1244 for (
int j = 0; j < nConvectiveFields; j++)
1246 pointVar[j] = locVars[j][npnt];
1248 for (
int j = 0; j < nSpaceDim; j++)
1250 pointnormals[j] = locnormal[j][npnt];
1253 pointmu = locmu[npnt];
1257 tmpMatinnData = PointFJac->GetPtr();
1258 tmpMatoutData = ElmtJac[nelmt][npnt]->GetPtr();
1260 Vmath::Fill(nConvectiveFields, 0.0, tmpMatoutData,
1262 for (
int j = 0; j < nConvectiveFields; j++)
1265 nConvectiveFields - 1,
1266 tmp1 = tmpMatinnData + (j * (nConvectiveFields - 1)), 1,
1267 tmp2 = tmpMatoutData + (1 + j * nConvectiveFields), 1);
1277 int nConvectiveFields =
m_fields.size();
1287 for (
int j = 0; j < nConvectiveFields; j++)
1300 int nPts = mu.size();
1304 m_varConv->GetTemperature(inarray, temperature);
1309 if (DmuDT.size() > 0)
1311 m_varConv->GetDmuDT(temperature, mu, DmuDT);
1316 if (DmuDT.size() > 0)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
virtual void v_InitObject(bool DeclareFields=true)
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 InitObject_Explicit()
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:
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.