11 #include "libmesh/utility.h"
25 seff = 1.0 +
std::pow(-alpha * p, n);
37 Real n = 1.0 / (1.0 - m);
38 Real inner = 1.0 +
std::pow(-alpha * p, n);
39 Real dinner_dp = -n * alpha *
std::pow(-alpha * p, n - 1.0);
40 Real dseff_dp = -m *
std::pow(inner, -m - 1) * dinner_dp;
52 Real n = 1.0 / (1.0 - m);
53 Real inner = 1.0 +
std::pow(-alpha * p, n);
54 Real dinner_dp = -n * alpha *
std::pow(-alpha * p, n - 1.0);
55 Real d2inner_dp2 = n * (n - 1.0) * alpha * alpha *
std::pow(-alpha * p, n - 2.0);
56 Real d2seff_dp2 = m * (m + 1.0) *
std::pow(inner, -m - 2.0) *
std::pow(dinner_dp, 2.0) -
57 m *
std::pow(inner, -m - 1.0) * d2inner_dp2;
71 Real a =
std::pow(seff, -1.0 / m) - 1.0;
72 return std::min(
std::pow(a, 1.0 - m) / alpha, pc_max);
79 if (seff <= 0.0 || seff >= 1.0)
83 Real a =
std::pow(seff, -1.0 / m) - 1.0;
85 if (
std::pow(a, 1.0 - m) / alpha > pc_max)
88 return (m - 1.0) *
std::pow(a, -m) *
std::pow(seff, -1.0 - 1.0 / m) / m / alpha;
95 if (seff <= 0.0 || seff >= 1.0)
99 Real a =
std::pow(seff, -1.0 / m) - 1.0;
101 if (
std::pow(a, 1.0 - m) / alpha > pc_max)
107 d2pc *= (1.0 - m) / m / alpha;
118 else if (seff >= 1.0)
121 const Real a = 1.0 -
std::pow(seff, 1.0 / m);
122 const Real b = 1.0 -
std::pow(a, m);
124 return std::sqrt(seff) * Utility::pow<2>(b);
131 if (seff <= 0.0 || seff >= 1.0)
134 const Real a = 1.0 -
std::pow(seff, 1.0 / m);
135 const Real da = -1.0 / m *
std::pow(seff, 1.0 / m - 1.0);
136 const Real b = 1.0 -
std::pow(a, m);
137 const Real db = -m *
std::pow(a, m - 1.0) * da;
139 return 0.5 *
std::pow(seff, -0.5) * Utility::pow<2>(b) + 2.0 * std::sqrt(seff) * b * db;
146 if (seff <= 0.0 || seff >= 1.0)
149 const Real a = 1.0 -
std::pow(seff, 1.0 / m);
150 const Real da = -1.0 / m *
std::pow(seff, 1.0 / m - 1.0);
151 const Real d2a = -(1.0 / m) * (1.0 / m - 1.0) *
std::pow(seff, 1.0 / m - 2.0);
152 const Real b = 1.0 -
std::pow(a, m);
153 const Real db = -m *
std::pow(a, m - 1.0) * da;
154 const Real d2b = -m * (m - 1.0) *
std::pow(a, m - 2.0) * da * da - m *
std::pow(a, m - 1.0) * d2a;
156 return -0.25 *
std::pow(seff, -1.5) * Utility::pow<2>(b) + 2.0 *
std::pow(seff, -0.5) * b * db +
157 2.0 * std::sqrt(seff) * db * db + 2.0 * std::sqrt(seff) * b * d2b;
165 else if (seff >= 1.0)
168 const Real a =
std::pow(1.0 - seff, 1.0 / m);
169 const Real b =
std::pow(1.0 - a, 2.0 * m);
171 return std::sqrt(seff) * b;
178 if (seff <= 0.0 || seff >= 1.0)
181 const Real a =
std::pow(1.0 - seff, 1.0 / m);
182 const Real da = -1.0 / m * a / (1.0 - seff);
183 const Real b =
std::pow(1.0 - a, 2.0 * m);
184 const Real db = -2.0 * m * b / (1.0 - a) * da;
186 return 0.5 *
std::pow(seff, -0.5) * b + std::sqrt(seff) * db;
193 if (seff <= 0.0 || seff >= 1.0)
196 const Real a =
std::pow(1.0 - seff, 1.0 / m);
197 const Real da = -1.0 / m * a / (1.0 - seff);
198 const Real d2a = 1.0 / m * (1.0 / m - 1) *
std::pow(1.0 - seff, 1.0 / m - 2.0);
199 const Real b =
std::pow(1.0 - a, 2.0 * m);
200 const Real db = -2.0 * m * b / (1.0 - a) * da;
202 -2.0 * m * (db / (1.0 - a) * da + b * Utility::pow<2>(da / (1.0 - a)) + b / (1.0 - a) * d2a);
204 return -0.25 *
std::pow(seff, -1.5) * b +
std::pow(seff, -0.5) * db + std::sqrt(seff) * d2b;