93 static const auto Seq123 = Eigen::seq(Eigen::fix<1>, Eigen::fix<dim>);
94 static const auto Seq012 = Eigen::seq(Eigen::fix<0>, Eigen::fix<dim - 1>);
95 static const auto I4 = dim + 1;
96 static const auto verySmallReal_3 = std::pow(
verySmallReal, 1. / 3);
97 static const auto verySmallReal_4 = std::pow(
verySmallReal, 1. / 4);
100 Eigen::Matrix<real, dim, 1>
velo = UMeanXy(Seq123) / UMeanXy(0);
101 Eigen::Matrix<real, dim, 1> diffRho = DiffUxy(Seq012, {0});
102 Eigen::Matrix<real, dim, dim> diffRhoU = DiffUxy(Seq012, Seq123);
103 Eigen::Matrix<real, dim, dim> diffU = (diffRhoU - diffRho *
velo.transpose()) / UMeanXy(0);
104 Eigen::Matrix<real, dim, dim> SS = diffU + diffU.transpose() - (2. / 3.) * diffU.trace() * Eigen::Matrix<real, dim, dim>::Identity();
105 real rho = UMeanXy(0);
106 real k = UMeanXy(I4 + 1) / rho + verySmallReal_4;
107 real epsilon = UMeanXy(I4 + 2) / rho + verySmallReal_4;
109 real S = std::sqrt(SS.squaredNorm() / 2) + verySmallReal_4;
110 real fmu = (1 - std::exp(-0.01 * Ret)) / (1 - exp(-std::sqrt(Ret))) * std::max(1., std::sqrt(2 / Ret));
111 real mut = cmu * fmu * rho *
sqr(k) / epsilon;
112 mut = std::min(mut, phi * rho * k /
S);
114 mut = std::min(mut, 1e5 * muf);
116 if (std::isnan(mut) || !std::isfinite(mut))
118 std::cerr << k <<
" " << epsilon <<
" " << Ret <<
" " <<
S <<
"\n";
119 std::cerr << fmu <<
"\n";
120 std::cerr << SS << std::endl;
194 static const auto Seq123 = Eigen::seq(Eigen::fix<1>, Eigen::fix<dim>);
195 static const auto Seq012 = Eigen::seq(Eigen::fix<0>, Eigen::fix<dim - 1>);
196 static const auto I4 = dim + 1;
197 static const auto verySmallReal_3 = std::pow(
verySmallReal, 1. / 3);
198 static const auto verySmallReal_4 = std::pow(
verySmallReal, 1. / 4);
206 Eigen::Matrix<real, dim, 1>
velo = UMeanXy(Seq123) / UMeanXy(0);
207 Eigen::Matrix<real, dim, 1> diffRho = DiffUxy(Seq012, {0});
208 Eigen::Matrix<real, dim, dim> diffRhoU = DiffUxy(Seq012, Seq123);
209 Eigen::Matrix<real, dim, dim> diffU = (diffRhoU - diffRho *
velo.transpose()) / UMeanXy(0);
210 Eigen::Matrix<real, dim, dim> SS = diffU + diffU.transpose() - (2. / 3.) * diffU.trace() * Eigen::Matrix<real, dim, dim>::Identity();
211 real rho = UMeanXy(0);
212 real k = std::max(UMeanXy(I4 + 1) / rho, verySmallReal_4);
213 real epsilon = std::max(UMeanXy(I4 + 1) / rho, verySmallReal_4);
214 real Ret = rho *
sqr(k) / (muf * epsilon) + verySmallReal_4;
215 real S = std::sqrt(SS.squaredNorm() / 2) + verySmallReal_4;
216 real fmu = (1 - std::exp(-0.01 * Ret)) / std::max(1 - exp(-std::sqrt(Ret)), verySmallReal_4) * std::max(1., std::sqrt(2 / Ret));
217 real mut = cmu * fmu * rho *
sqr(k) / epsilon;
218 mut = std::min(mut, phi * rho * k /
S);
220 Eigen::Matrix<real, dim, dim> rhoMuiuj = Eigen::Matrix<real, dim, dim>::Identity() * UMeanXy(I4 + 1) * (2. / 3.) - mut * SS;
221 real Pk = -(rhoMuiuj.array() * diffU.array()).sum();
222 Pk = std::min(Pk, pphi * cmu *
sqr(UMeanXy(I4 + 1)) / mut);
223 real zeta = std::sqrt(Ret / 2);
226 Eigen::Matrix<real, dim, 2> diffRhoKe = DiffUxy(Seq012, {I4 + 1, I4 + 2});
227 Eigen::Matrix<real, dim, 2> diffKe = (diffRhoKe - 1. / UMeanXy(0) * diffRho * UMeanXy({I4 + 1, I4 + 2}).transpose()) / UMeanXy(0);
228 Eigen::Matrix<real, dim, 1> diffTau = diffKe(Seq012, 0) / epsilon - k /
sqr(epsilon) * diffKe(Seq012, 1);
229 real Psi = std::max(0., diffKe(Seq012, 0).dot(diffTau));
230 real E = AE * rho * std::sqrt(epsilon * Tt) * Psi * std::max(std::sqrt(k), std::pow(muf * epsilon / rho, 0.25));
234 source(I4 + 1) = Pk - UMeanXy(I4 + 2);
235 source(I4 + 2) = (ce1 * Pk - ce2 * UMeanXy(I4 + 2) + E) / Tt;
240 source(I4 + 2) = (ce2) / Tt;
242 if (!source.allFinite() || source.hasNaN())
244 std::cerr << source.transpose() <<
"\n";
245 std::cerr << UMeanXy.transpose() <<
"\n";
246 std::cerr << DiffUxy <<
"\n";
247 std::cerr <<
S <<
"\n";
248 std::cerr << mut <<
"\n";
250 std::cout << std::endl;
277 static const auto Seq123 = Eigen::seq(Eigen::fix<1>, Eigen::fix<dim>);
278 static const auto Seq012 = Eigen::seq(Eigen::fix<0>, Eigen::fix<dim - 1>);
279 static const auto I4 = dim + 1;
280 Eigen::Matrix<real, dim, 7> diffU;
283 Eigen::Vector<real, Eigen::Dynamic> src = u;
284 Eigen::Vector<real, Eigen::Dynamic> uc = u;
288 real distV = 1 + distEps;
293 GetSource_RealizableKe<dim>(uc, diffU, muPhy, src);
296 std::cout <<
"Mu " << muPhy << std::endl;
299 real rhs0{0}, rhs{0};
300 for (
int i = 0; i < 1000; i++)
303 real dRhsDRe = (getDE(re * distV) - rhs) / (re * distEps);
306 std::cout << rhs << std::endl;
311 return std::make_tuple(rhs0, rhs);
337 static const auto Seq123 = Eigen::seq(Eigen::fix<1>, Eigen::fix<dim>);
338 static const auto Seq012 = Eigen::seq(Eigen::fix<0>, Eigen::fix<dim - 1>);
339 static const auto I4 = dim + 1;
347 Eigen::Matrix<real, dim, 1>
velo = UMeanXy(Seq123) / UMeanXy(0);
348 Eigen::Matrix<real, dim, 1> diffRho = DiffUxy(Seq012, {0});
349 Eigen::Matrix<real, dim, dim> diffRhoU = DiffUxy(Seq012, Seq123);
350 Eigen::Matrix<real, dim, dim> diffU = (diffRhoU - diffRho *
velo.transpose()) / UMeanXy(0);
351 Eigen::Matrix<real, dim, dim> SS = diffU + diffU.transpose() - (2. / 3.) * diffU.trace() * Eigen::Matrix<real, dim, dim>::Identity();
352 real rho = UMeanXy(0);
357 real fmu = (1 - std::exp(-0.01 * Ret)) / (1 - exp(-std::sqrt(Ret))) * std::max(1., std::sqrt(2 / Ret));
358 real mut = cmu * fmu * rho *
sqr(k) / epsilon;
359 mut = std::min(mut, phi * rho * k /
S);
361 Eigen::Matrix<real, dim, dim> rhoMuiuj = Eigen::Matrix<real, dim, dim>::Identity() * UMeanXy(I4 + 1) * (2. / 3.) - mut * SS;
362 real Pk = -(rhoMuiuj.array() * diffU.array()).sum();
363 Pk = std::min(Pk, pphi * cmu *
sqr(UMeanXy(I4 + 1)) / mut);
364 real zeta = std::sqrt(Ret / 2);
367 Eigen::Matrix<real, dim, 2> diffRhoKe = DiffUxy(Seq012, {I4 + 1, I4 + 2});
368 Eigen::Matrix<real, dim, 2> diffKe = (diffRhoKe - 1. / UMeanXy(0) * diffRho * UMeanXy({I4 + 1, I4 + 2}).transpose()) / UMeanXy(0);
369 Eigen::Matrix<real, dim, 1> diffTau = diffKe(Seq012, 0) / epsilon - k /
sqr(epsilon) * diffKe(Seq012, 1);
370 real Psi = std::max(0., diffKe(Seq012, 0).dot(diffTau));
371 real E = AE * rho * std::sqrt(epsilon * Tt) * Psi * std::max(std::sqrt(k), std::pow(muf * epsilon / rho, 0.25));
373 real dPk = -((Eigen::Matrix<real, dim, dim>::Identity() * (2. / 3.)).array() * diffU.array()).sum();
376 source(I4 + 2) = (ce2) / Tt;
402 static const auto Seq123 = Eigen::seq(Eigen::fix<1>, Eigen::fix<dim>);
403 static const auto Seq012 = Eigen::seq(Eigen::fix<0>, Eigen::fix<dim - 1>);
404 static const auto I4 = dim + 1;
405 Eigen::VectorXd u0 = UMeanXy;
406 Eigen::VectorXd u1 = UMeanXy;
407 Eigen::VectorXd sb = source;
408 Eigen::VectorXd s0 = source;
409 Eigen::VectorXd s1 = source;
414 GetSource_RealizableKe<dim>(UMeanXy, DiffUxy, muf, sb);
415 GetSource_RealizableKe<dim>(u0, DiffUxy, muf, s0);
416 GetSource_RealizableKe<dim>(u1, DiffUxy, muf, s1);
417 source(I4 + 1) = -(s0(I4 + 1) - sb(I4 + 1)) / epsRk;
418 source(I4 + 2) = -(s1(I4 + 2) - sb(I4 + 2)) / epsRe;
419 source(I4 + 1) = std::max(source(I4 + 1), 0.) * 10;
420 source(I4 + 2) = std::max(source(I4 + 2), 0.) * 10;
445 static const auto Seq123 = Eigen::seq(Eigen::fix<1>, Eigen::fix<dim>);
446 static const auto Seq012 = Eigen::seq(Eigen::fix<0>, Eigen::fix<dim - 1>);
447 static const auto I4 = dim + 1;
448 static const auto verySmallReal_3 = std::pow(
verySmallReal, 1. / 3);
449 static const auto verySmallReal_4 = std::pow(
verySmallReal, 1. / 4);
452 real betaStar = 0.09;
453 real sigOmega2 = 0.856;
456 Eigen::Matrix<real, dim, 1>
velo = UMeanXy(Seq123) / UMeanXy(0);
457 Eigen::Matrix<real, dim, 1> diffRho = DiffUxy(Seq012, {0});
458 Eigen::Matrix<real, dim, dim> diffRhoU = DiffUxy(Seq012, Seq123);
459 Eigen::Matrix<real, dim, dim> diffU = (diffRhoU - diffRho *
velo.transpose()) / UMeanXy(0);
460 Eigen::Matrix<real, dim, dim> SR2 = diffU + diffU.transpose();
461 Eigen::Matrix<real, dim, dim> SS = SR2 - (2. / 3.) * diffU.trace() * Eigen::Matrix<real, dim, dim>::Identity();
462 Eigen::Matrix<real, dim, dim> OmegaM = (diffU.transpose() - diffU) * 0.5;
463 real OmegaMag = OmegaM.norm() * std::sqrt(2);
464 real rho = UMeanXy(0);
465 real k = std::max(UMeanXy(I4 + 1) / rho, verySmallReal_4);
466 real omegaaa = std::max(UMeanXy(I4 + 2) / rho, verySmallReal_4);
467 real S = std::sqrt(SS.squaredNorm() / 2) + verySmallReal_4;
468 real nuPhy = muf / rho;
469 real F2 = std::tanh(
sqr(std::max(2 * std::sqrt(k) / (betaStar * omegaaa * d), 500 * nuPhy / (
sqr(d) * omegaaa))));
471 real mut = a1 * k / std::max(OmegaMag * F2, a1 * omegaaa) * rho;
472#if KW_SST_LIMIT_MUT == 1
473 mut = std::min(mut, 1e5 * muf);
476 if (std::isnan(mut) || !std::isfinite(mut))
478 std::cerr << k <<
" " << omegaaa <<
" " << mut <<
" " <<
S <<
"\n";
479 std::cerr << SS << std::endl;
513 static const auto Seq123 = Eigen::seq(Eigen::fix<1>, Eigen::fix<dim>);
514 static const auto Seq012 = Eigen::seq(Eigen::fix<0>, Eigen::fix<dim - 1>);
515 static const auto I4 = dim + 1;
516 static const auto verySmallReal_3 = std::pow(
verySmallReal, 1. / 3);
517 static const auto verySmallReal_4 = std::pow(
verySmallReal, 1. / 4);
520 real betaStar = 0.09;
528 real gamma1 = beta1 / betaStar - sigO1 *
sqr(kap) / std::sqrt(betaStar);
529 real gamma2 = beta2 / betaStar - sigO2 *
sqr(kap) / std::sqrt(betaStar);
530 Eigen::Matrix<real, dim, 1>
velo = UMeanXy(Seq123) / UMeanXy(0);
531 Eigen::Matrix<real, dim, 1> diffRho = DiffUxyPrim(Seq012, {0});
532 Eigen::Matrix<real, dim, dim> diffU = DiffUxyPrim(Seq012, Seq123);
533 Eigen::Matrix<real, dim, dim> SR2 = diffU + diffU.transpose();
534 Eigen::Matrix<real, dim, dim> SS = SR2 - (2. / 3.) * diffU.trace() * Eigen::Matrix<real, dim, dim>::Identity();
535 Eigen::Matrix<real, dim, 2> diffKO = DiffUxyPrim(Seq012, {I4 + 1, I4 + 2});
537 Eigen::Matrix<real, dim, dim> OmegaM = (diffU.transpose() - diffU) * 0.5;
538 real OmegaMag = OmegaM.norm() * std::sqrt(2);
539 real rho = UMeanXy(0);
540 real k = std::max(UMeanXy(I4 + 1) / rho, verySmallReal_4);
541 real omegaaa = std::max(UMeanXy(I4 + 2) / rho, verySmallReal_4);
542 real S = std::sqrt(SS.squaredNorm() / 2) + verySmallReal_4;
543 real nuPhy = muf / rho;
544 real CDKW = std::max(2 * rho * sigO2 / omegaaa * diffKO(EigenAll, 0).dot(diffKO(EigenAll, 1)), 1e-10);
545 real F1 = std::tanh(std::pow(
546 std::min(std::max(std::sqrt(k) / (betaStar * omegaaa * d), 500 * nuPhy / (
sqr(d) * omegaaa)),
547 4 * rho * sigO2 * k / (CDKW *
sqr(d))),
549 real F2 = std::tanh(
sqr(std::max(2 * std::sqrt(k) / (betaStar * omegaaa * d), 500 * nuPhy / (
sqr(d) * omegaaa))));
551 real mut = a1 * k / std::max(OmegaMag * F2, a1 * omegaaa) * rho;
552#if KW_SST_LIMIT_MUT == 1
553 mut = std::min(mut, 1e5 * muf);
556 real sigK = sigK1 * F1 + sigK2 * (1 - F1);
557 real sigO = sigO1 * F1 + sigO2 * (1 - F1);
559 vFlux(I4 + 1) = diffKO(Seq012, 0).dot(uNorm) * (muf + mutIn * sigK);
560 vFlux(I4 + 2) = diffKO(Seq012, 1).dot(uNorm) * (muf + mutIn * sigO);
562 if (!vFlux.allFinite() || vFlux.hasNaN())
564 std::cerr << vFlux <<
"\n";
565 std::cerr << sigK <<
" " << sigO <<
"\n";
566 std::cerr << F1 <<
" " << F2 <<
"\n";
567 std::cerr << CDKW <<
"\n";
568 std::cerr << k <<
" " << omegaaa <<
"\n";
569 std::cerr << muf <<
" " << mut <<
"\n";
570 std::cerr << std::endl;
611 static const auto Seq123 = Eigen::seq(Eigen::fix<1>, Eigen::fix<dim>);
612 static const auto Seq012 = Eigen::seq(Eigen::fix<0>, Eigen::fix<dim - 1>);
613 static const auto I4 = dim + 1;
614 static const auto verySmallReal_3 = std::pow(
verySmallReal, 1. / 3);
615 static const auto verySmallReal_4 = std::pow(
verySmallReal, 1. / 4);
618 real betaStar = 0.09;
626 real gamma1 = beta1 / betaStar - sigO1 *
sqr(kap) / std::sqrt(betaStar);
627 real gamma2 = beta2 / betaStar - sigO2 *
sqr(kap) / std::sqrt(betaStar);
628 Eigen::Matrix<real, dim, 1>
velo = UMeanXy(Seq123) / UMeanXy(0);
629 Eigen::Matrix<real, dim, 1> diffRho = DiffUxy(Seq012, {0});
630 Eigen::Matrix<real, dim, dim> diffRhoU = DiffUxy(Seq012, Seq123);
631 Eigen::Matrix<real, dim, dim> diffU = (diffRhoU - diffRho *
velo.transpose()) / UMeanXy(0);
632 Eigen::Matrix<real, dim, dim> SR2 = diffU + diffU.transpose();
633 Eigen::Matrix<real, dim, dim> SS = SR2 - (2. / 3.) * diffU.trace() * Eigen::Matrix<real, dim, dim>::Identity();
634 Eigen::Matrix<real, dim, 2> diffRhoKO = DiffUxy(Seq012, {I4 + 1, I4 + 2});
635 Eigen::Matrix<real, dim, 2> diffKO = (diffRhoKO - 1. / UMeanXy(0) * diffRho * UMeanXy({I4 + 1, I4 + 2}).transpose()) / UMeanXy(0);
636 Eigen::Matrix<real, dim, dim> OmegaM = (diffU.transpose() - diffU) * 0.5;
637 real OmegaMag = OmegaM.norm() * std::sqrt(2);
638 real rho = UMeanXy(0);
639 real k = std::max(UMeanXy(I4 + 1) / rho, verySmallReal_4);
640 real omegaaa = std::max(UMeanXy(I4 + 2) / rho, verySmallReal_4);
641 real S = std::sqrt(SS.squaredNorm() / 2) + verySmallReal_4;
642 real nuPhy = muf / rho;
643 real CDKW = std::max(2 * rho * sigO2 / omegaaa * diffKO(EigenAll, 0).dot(diffKO(EigenAll, 1)), 1e-10);
644 real F1 = std::tanh(std::pow(
645 std::min(std::max(std::sqrt(k) / (betaStar * omegaaa * d), 500 * nuPhy / (
sqr(d) * omegaaa)),
646 4 * rho * sigO2 * k / (CDKW *
sqr(d))),
648 real F2 = std::tanh(
sqr(std::max(2 * std::sqrt(k) / (betaStar * omegaaa * d), 500 * nuPhy / (
sqr(d) * omegaaa))));
649 real lRANS = std::sqrt(k) / (betaStar * omegaaa);
652 real mut = a1 * k / std::max(OmegaMag * F2, a1 * omegaaa) * rho;
653#if KW_SST_LIMIT_MUT == 1
654 mut = std::min(mut, 1e5 * muf);
656 real nutHat = std::max(mut / rho, 1e-8);
658 Eigen::Matrix<real, dim, dim> rhoMuiuj = Eigen::Matrix<real, dim, dim>::Identity() * UMeanXy(I4 + 1) * (2. / 3.) - mut * SS;
659 real Pk = -(rhoMuiuj.array() * diffU.array()).sum();
661#if KW_SST_PROD_LIMITS == 1
663 PkTilde = std::min(Pk, 20 * betaStar * rho * k * omegaaa);
666 real gammaC = gamma1 * F1 + gamma1 * (1 - F1);
667 real sigK = sigK1 * F1 + sigK2 * (1 - F1);
668 real sigO = sigO1 * F1 + sigO2 * (1 - F1);
669 real beta = beta1 * F1 + beta2 * (1 - F1);
670 real POmega = gammaC / nutHat * Pk;
671#if KW_SST_PROD_OMEGA_VERSION == 1
673 0.5 * gammaC * rho * ((SR2 - SR2.trace() / 3. * Eigen::Matrix<real, dim, dim>::Identity()).array() * SR2.array()).sum();
674#elif KW_SST_PROD_OMEGA_VERSION == 2
676 gammaC * rho *
sqr(OmegaMag);
680 source(I4 + 1) = PkTilde - betaStar * rho * k * omegaaa * FDES;
681 source(I4 + 2) = POmega - beta * rho *
sqr(omegaaa) +
682 2 * (1 - F1) * rho * sigO2 / omegaaa * diffKO(EigenAll, 0).dot(diffKO(EigenAll, 1));
688 source(I4 + 1) = betaStar * omegaaa * FDES;
689 source(I4 + 2) = 2 * beta * omegaaa;
717 static const auto Seq123 = Eigen::seq(Eigen::fix<1>, Eigen::fix<dim>);
718 static const auto Seq012 = Eigen::seq(Eigen::fix<0>, Eigen::fix<dim - 1>);
719 static const auto I4 = dim + 1;
720 static const auto verySmallReal_3 = std::pow(
verySmallReal, 1. / 3);
721 static const auto verySmallReal_4 = std::pow(
verySmallReal, 1. / 4);
725 Eigen::Matrix<real, dim, 1>
velo = UMeanXy(Seq123) / UMeanXy(0);
726 Eigen::Matrix<real, dim, 1> diffRho = DiffUxy(Seq012, {0});
727 Eigen::Matrix<real, dim, dim> diffRhoU = DiffUxy(Seq012, Seq123);
728 Eigen::Matrix<real, dim, dim> diffU = (diffRhoU - diffRho *
velo.transpose()) / UMeanXy(0);
729 Eigen::Matrix<real, dim, dim> SR2 = diffU + diffU.transpose();
730 real rho = UMeanXy(0);
731 real k = std::max(UMeanXy(I4 + 1) / rho,
sqr(verySmallReal_4));
732 real omegaaa = std::max(UMeanXy(I4 + 2) / rho, verySmallReal_4);
733#if KW_WILCOX_VER == 0
734 real omegaaaTut = omegaaa;
736 real omegaaaTut = std::max(omegaaa, CLim * std::sqrt(0.5 * SR2.squaredNorm() / betaS));
738 real mut = k / omegaaaTut * rho;
739#if KW_WILCOX_LIMIT_MUT == 1
740 mut = std::min(mut, 1e5 * muf);
743 if (std::isnan(mut) || !std::isfinite(mut))
745 std::cerr << k <<
" " << omegaaa <<
" " << mut <<
"\n";
778 static const auto Seq123 = Eigen::seq(Eigen::fix<1>, Eigen::fix<dim>);
779 static const auto Seq012 = Eigen::seq(Eigen::fix<0>, Eigen::fix<dim - 1>);
780 static const auto I4 = dim + 1;
781 static const auto verySmallReal_3 = std::pow(
verySmallReal, 1. / 3);
782 static const auto verySmallReal_4 = std::pow(
verySmallReal, 1. / 4);
790 Eigen::Matrix<real, dim, 1>
velo = UMeanXy(Seq123) / UMeanXy(0);
791 Eigen::Matrix<real, dim, 1> diffRho = DiffUxyPrim(Seq012, {0});
792 Eigen::Matrix<real, dim, dim> diffU = DiffUxyPrim(Seq012, Seq123);
793 Eigen::Matrix<real, dim, dim> SR2 = diffU + diffU.transpose();
794 Eigen::Matrix<real, dim, dim> SS = SR2 - (2. / 3.) * diffU.trace() * Eigen::Matrix<real, dim, dim>::Identity();
795 Eigen::Matrix<real, dim, 2> diffKO = DiffUxyPrim(Seq012, {I4 + 1, I4 + 2});
796 real rho = UMeanXy(0);
797 real k = std::max(UMeanXy(I4 + 1) / rho,
sqr(verySmallReal_4));
798 real omegaaa = std::max(UMeanXy(I4 + 2) / rho, verySmallReal_4);
799#if KW_WILCOX_VER == 0
800 real omegaaaTut = omegaaa;
802 real omegaaaTut = std::max(omegaaa, CLim * std::sqrt(0.5 * SR2.squaredNorm() / betaS));
804 real mut = k / omegaaaTut * rho;
805#if KW_WILCOX_LIMIT_MUT == 1
806 mut = std::min(mut, 1e5 * muf);
809 vFlux(I4 + 1) = diffKO(Seq012, 0).dot(uNorm) * (muf + mut * sigK);
810 vFlux(I4 + 2) = diffKO(Seq012, 1).dot(uNorm) * (muf + mut * sigO);
852 static const auto Seq123 = Eigen::seq(Eigen::fix<1>, Eigen::fix<dim>);
853 static const auto Seq012 = Eigen::seq(Eigen::fix<0>, Eigen::fix<dim - 1>);
854 static const auto I4 = dim + 1;
855 static const auto verySmallReal_3 = std::pow(
verySmallReal, 1. / 3);
856 static const auto verySmallReal_4 = std::pow(
verySmallReal, 1. / 4);
857#if KW_WILCOX_VER == 0
870 Eigen::Matrix<real, dim, 1>
velo = UMeanXy(Seq123) / UMeanXy(0);
871 Eigen::Matrix<real, dim, 1> diffRho = DiffUxy(Seq012, {0});
872 Eigen::Matrix<real, dim, dim> diffRhoU = DiffUxy(Seq012, Seq123);
873 Eigen::Matrix<real, dim, dim> diffU = (diffRhoU - diffRho *
velo.transpose()) / UMeanXy(0);
874 Eigen::Matrix<real, dim, dim> SR2 = diffU + diffU.transpose();
875 Eigen::Matrix<real, dim, dim> OmegaM2 = diffU.transpose() - diffU;
876 Eigen::Matrix<real, dim, dim> SS = SR2 - (2. / 3.) * diffU.trace() * Eigen::Matrix<real, dim, dim>::Identity();
877 Eigen::Matrix<real, dim, 2> diffRhoKO = DiffUxy(Seq012, {I4 + 1, I4 + 2});
878 Eigen::Matrix<real, dim, 2> diffKO = (diffRhoKO - 1. / UMeanXy(0) * diffRho * UMeanXy({I4 + 1, I4 + 2}).transpose()) / UMeanXy(0);
879 real rho = UMeanXy(0);
880 real k = std::max(UMeanXy(I4 + 1) / rho,
sqr(verySmallReal_4));
881 real omegaaa = std::max(UMeanXy(I4 + 2) / rho, verySmallReal_4);
882#if KW_WILCOX_VER == 0 || KW_WILCOX_VER == 2
883 real omegaaaTut = omegaaa;
885 real omegaaaTut = std::max(omegaaa, CLim * std::sqrt(0.5 * SR2.squaredNorm() / betaS));
887 real mut = k / omegaaaTut * rho;
888#if KW_WILCOX_LIMIT_MUT == 1
889 mut = std::min(mut, 1e5 * muf);
892 real ChiOmega = std::abs(((OmegaM2 * OmegaM2).array() * SR2.array()).sum() * 0.125 /
cube(betaS * omegaaa));
893 real fBeta = (1 + 85 * ChiOmega) / (1 + 100 * ChiOmega);
894#if KW_WILCOX_VER == 0
895 real beta = 3. / 40.;
896#elif KW_WILCOX_VER == 1
897 real beta = fBeta * betaO;
901 real crossDiff = diffKO(EigenAll, 0).dot(diffKO(EigenAll, 1));
902#if KW_WILCOX_VER == 0 || KW_WILCOX_VER == 2
905 real SigD = crossDiff > 0 ? 0.125 : 0;
908 Eigen::Matrix<real, dim, dim> rhoMuiuj = Eigen::Matrix<real, dim, dim>::Identity() * UMeanXy(I4 + 1) * (2. / 3.) - mut * SS;
909 real Pk = -(rhoMuiuj.array() * diffU.array()).sum();
912#if KW_WILCOX_VER == 2
913 Pk = OmegaM2.squaredNorm() * 0.5 * mut;
914 real gam = beta / betaS -
sqr(kappa) / (sigO * std::sqrt(betaS));
915 POmega = gam * rho * OmegaM2.squaredNorm() * 0.5;
918#if KW_WILCOX_PROD_LIMITS == 1
922 Pk = std::min(Pk, betaS * rho * k * omegaaa * 20);
929 source(I4 + 1) = Pk - betaS * rho * k * omegaaa;
930 source(I4 + 2) = POmega - beta * rho *
sqr(omegaaa) + SigD / omegaaa * crossDiff;
934 source(I4 + 1) = betaS * omegaaa;
935 source(I4 + 2) = 2 * beta * omegaaa;
991 TSource &source,
int rotCor,
int mode)
993 static const auto Seq123 = Eigen::seq(Eigen::fix<1>, Eigen::fix<dim>);
994 static const auto Seq012 = Eigen::seq(Eigen::fix<0>, Eigen::fix<dim - 1>);
995 static const auto I4 = dim + 1;
997 static const real cb1 = 0.1355;
998 static const real cb2 = 0.622;
999 static const real sigma = SA::sigma;
1000 static const real cnu1 = SA::cnu1;
1001 static const real cnu2 = 0.7;
1002 static const real cnu3 = 0.9;
1003 static const real cw2 = 0.3;
1004 static const real cw3 = 2;
1005 static const real kappa = 0.41;
1006 static const real rlim = 10;
1007 static const real cw1 = cb1 /
sqr(kappa) + (1 + cb2) / sigma;
1010 static const real ct3 = 1.2;
1011 static const real ct4 = 0.5;
1013 static const real ct3 = 0.0;
1014 static const real ct4 = 0.0;
1017 const real nuh = UMeanXy(I4 + 1) * muRef / UMeanXy(0);
1019 const real Chi = (UMeanXy(I4 + 1) * muRef / mufPhy);
1021 const real fnu1 = Chi3 / (Chi3 +
cube(cnu1));
1022 const real fnu2 = 1 - Chi / (1 + Chi * fnu1);
1024 const Eigen::Matrix<real, dim, 1>
velo = UMeanXy(Seq123) / UMeanXy(0);
1025 const Eigen::Matrix<real, dim, 1> diffRhoNu = DiffUxy(Seq012, {I4 + 1}) * muRef;
1026 const Eigen::Matrix<real, dim, 1> diffRho = DiffUxy(Seq012, {0});
1027 const Eigen::Matrix<real, dim, 1> diffNu = (diffRhoNu - nuh * diffRho) / UMeanXy(0);
1028 const Eigen::Matrix<real, dim, dim> diffRhoU = DiffUxy(Seq012, Seq123);
1029 const Eigen::Matrix<real, dim, dim> diffU = (diffRhoU - diffRho *
velo.transpose()) / UMeanXy(0);
1031 const Eigen::Matrix<real, dim, dim> Omega = 0.5 * (diffU.transpose() - diffU);
1032#ifndef USE_ABS_VELO_IN_ROTATION
1033 if (settings.frameConstRotation.enabled)
1036 const real S = Omega.norm() * std::sqrt(2.0);
1037 const real SS = (diffU + diffU.transpose()).norm() * (1. / std::sqrt(2.0));
1043 const real cRot = 2.0;
1044 SRotCor += cRot * std::min(0.0,
S - SS);
1046 real diffUNorm = diffU.norm();
1048 const real ft2 = ct3 * std::exp(-ct4 *
sqr(Chi));
1062 real nuTur = mufPhy / UMeanXy(0) * std::max((Chi * fnu1), 0.0);
1063 real nufPhy = mufPhy / UMeanXy(0);
1065 real fd = 1. - std::tanh(
cube(8 * rd));
1070 psiSqr = std::min(100.0, (1 - cb1 / (cw1 *
sqr(kappa) * fwStar) * (ft2 + (1 - ft2) * fnu2)) /
1076 real psi = std::sqrt(std::max(psiSqr, 1.0));
1079 lDES = lRANS - fd * std::max(0., lRANS - lLES * psi);
1082 if (DESMode == 1 || DESMode == 2)
1084 const real alphaIDDES = 0.25 - d / hMax;
1085 const real fB = std::min(2 * std::exp(-9. *
sqr(alphaIDDES)), 1.0);
1087 const real cl = 3.55;
1088 const real ct = 1.63;
1093 const real fl = std::tanh(
sqr(
sqr(fl_tmp)) * fl_tmp);
1095 const real fe1 = 2. * std::exp(-(alphaIDDES >= 0 ? 11.09 : 9.0) *
sqr(alphaIDDES));
1096 const real fe2 = 1. - std::max(ft, fl);
1097 const real fe = std::max((fe1 - 1.), 0.) * psi * fe2;
1100 const real lWMLES = fB * (1 + fe) * lRANS + (1 - fB) * lLES * psi;
1105 const real fdTilde = std::max(fB, std::tanh(
cube(8 * rdt)));
1106 real lIDDES = fdTilde * (1 + fe) * lRANS + (1 - fdTilde) * lLES * psi;
1107 lIDDES = std::max(lLES *
smallReal, lIDDES);
1114 const real Sbar = nuh / (
sqr(kappa) *
sqr(d)) * fnu2;
1136#ifdef USE_NS_SA_NEGATIVE_MODEL
1137 if (Sbar < -cnu2 *
S)
1138 Sh =
S +
S * (
sqr(cnu2) *
S + cnu3 * Sbar) / ((cnu3 - 2 * cnu2) *
S - Sbar);
1144 const real g =
r + cw2 * (std::pow(
r, 6) -
r);
1145 const real fw = g * std::pow((1 + std::pow(cw3, 6)) / (std::pow(g, 6) + std::pow(cw3, 6)), 1. / 6.);
1151#ifdef USE_NS_SA_NEGATIVE_MODEL
1152 real D = (cw1 * fw - cb1 /
sqr(kappa) * ft2) *
sqr(nuh / lDES);
1153 real P = cb1 * (1 - ft2) * (Sh + SRotCor) * nuh;
1155 real D = (cw1 * fw - cb1 /
sqr(kappa) * ft2) *
sqr(nuh / lDES);
1156 real P = cb1 * (1 - ft2) * (Sh + SRotCor) * nuh;
1159#ifdef USE_NS_SA_NEGATIVE_MODEL
1160 if (UMeanXy(I4 + 1) < 0)
1162 real Chi = UMeanXy(I4 + 1) * muRef / mufPhy;
1163 fn = (SA::cn1 + std::pow(Chi, 3)) / (SA::cn1 - std::pow(Chi, 3));
1164 D = -cw1 *
sqr(nuh / lDES);
1165 P = cb1 * (1 - ct3) * std::abs(
S + SRotCor) * nuh;
1170 source(I4 + 1) = UMeanXy(0) * (P - D + diffNu.squaredNorm() * cb2 / sigma) / muRef -
1171 (UMeanXy(I4 + 1) * fn * muRef + mufPhy) / (UMeanXy(0) * sigma) * diffRho.dot(diffNu) / muRef;
1173 source(I4 + 1) = -std::min(UMeanXy(0) * (std::min(P, 0.0) * 1 - D * 2) / muRef / (std::abs(UMeanXy(I4 + 1)) +
verySmallReal), -
verySmallReal);
1175 if (!source.allFinite())
1177 std::cout << P << std::endl;
1178 std::cout << D << std::endl;
1179 std::cout << UMeanXy(0) << std::endl;
1180 std::cout << Sh << std::endl;
1181 std::cout << nuh << std::endl;
1182 std::cout << g << std::endl;
1183 std::cout <<
r << std::endl;
1184 std::cout <<
S << std::endl;
1185 std::cout << d << std::endl;
1186 std::cout << fnu2 << std::endl;
1187 std::cout << mufPhy << std::endl;