42 const Number dphi_p_1,
43 const Number dphi_p_2,
44 const Number sign = Number(1.0))
47 constexpr ScalarNumber eps = std::numeric_limits<ScalarNumber>::epsilon();
51 const auto scaling = ScalarNumber(1.) / (p_2 - p_1 + Number(eps));
53 const Number dd_11 = dphi_p_1;
54 const Number dd_12 = (phi_p_2 - phi_p_1) * scaling;
55 const Number dd_22 = dphi_p_2;
57 const Number dd_112 = (dd_12 - dd_11) * scaling;
58 const Number dd_122 = (dd_22 - dd_12) * scaling;
62 const auto discriminant_1 =
63 std::abs(dphi_p_1 * dphi_p_1 - ScalarNumber(4.) * phi_p_1 * dd_112);
64 const auto discriminant_2 =
65 std::abs(dphi_p_2 * dphi_p_2 - ScalarNumber(4.) * phi_p_2 * dd_122);
67 const auto denominator_1 = dphi_p_1 + sign * std::sqrt(discriminant_1);
68 const auto denominator_2 = dphi_p_2 + sign * std::sqrt(discriminant_2);
73 p_1 - ryujin::compare_and_apply_mask<dealii::SIMDComparison::less_than>(
74 std::abs(denominator_1),
77 ScalarNumber(2.) * phi_p_1 / denominator_1);
80 p_2 - ryujin::compare_and_apply_mask<dealii::SIMDComparison::less_than>(
81 std::abs(denominator_2),
84 ScalarNumber(2.) * phi_p_2 / denominator_2);
88 t_1 = std::max(p_1, t_1);
89 t_1 = std::min(p_2, t_1);
91 t_2 = std::max(p_1, t_2);
92 t_2 = std::min(p_2, t_2);
96 p_1 = std::min(t_1, t_2);
97 p_2 = std::max(t_1, t_2);
DEAL_II_HOST_DEVICE_ALWAYS_INLINE void quadratic_newton_step(Number &p_1, Number &p_2, const Number phi_p_1, const Number phi_p_2, const Number dphi_p_1, const Number dphi_p_2, const Number sign=Number(1.0))