20 const Number t_max )
const
25 constexpr ScalarNumber eps = std::numeric_limits<ScalarNumber>::epsilon();
28 const auto &u_U = view_.state(U);
29 const auto &u_P = view_.state(P);
31 const auto &u_min = std::get<0>(bounds);
32 const auto &u_max = std::get<1>(bounds);
40 const auto test_max = std::max(
41 Number(0.), std::min(u_U - relax * u_max, relax * u_U - u_max));
42 const auto test_min = std::max(
43 Number(0.), std::min(u_min - relax * u_U, relax * u_min - u_U));
44 if (!(test_max == Number(0.) && test_min == Number(0.))) {
46 std::cout << std::fixed << std::setprecision(16);
47 std::cout <<
"Bounds violation: low-order state (critical)!"
48 <<
"\n\t\tu min: " << u_min
52 <<
"\n\t\tu max: " << u_max <<
"\n"
58 const auto regularization =
59 Number(100. * std::numeric_limits<ScalarNumber>::min());
61 const Number denominator =
63 std::max(regularization, std::abs(u_P) + eps * u_max);
65 t_r = dealii::compare_and_apply_mask<dealii::SIMDComparison::less_than>(
74 (u_max - u_U) * denominator,
77 t_r = dealii::compare_and_apply_mask<dealii::SIMDComparison::less_than>(
86 (u_U - u_min) * denominator,
96 t_r = std::min(t_r, t_max);
97 t_r = std::max(t_r, t_min);
99#ifdef DEBUG_EXPENSIVE_BOUNDS_CHECK
105 const auto u_new = view_.state(U + t_r * P);
106 const auto test_new_max = std::max(
107 Number(0.), std::min(u_new - relax * u_max, relax * u_new - u_max));
108 const auto test_new_min = std::max(
109 Number(0.), std::min(u_min - relax * u_new, relax * u_min - u_new));
110 if (!(test_new_max == Number(0.) && test_new_min == Number(0.))) {
112 std::cout << std::fixed << std::setprecision(16);
113 std::cout <<
"Bounds violation: high-order state!"
114 <<
"\n\t\tu min: " << u_min
116 <<
"\n\t\tu: " << u_new
118 <<
"\n\t\tu max: " << u_max <<
"\n"
125 return {t_r, success};