11 #include "libmesh/utility.h" 22 "SUPG pressure. This parameter controls the strength of the " 23 "upwinding. This parameter must be positive. If you need to track " 24 "advancing fronts in a problem, then set to less than your expected " 25 "range of pressures in your unsaturated zone. Otherwise, set " 26 "larger, and then minimal upwinding will occur and convergence will " 27 "typically be good. If you need no SUPG, it is more efficient not " 28 "to use this UserObject.");
30 "Standard SUPG relationships for Richards flow based on Appendix A of TJR Hughes, M " 31 "Mallet and A Mizukami ``A new finite element formulation for computational fluid dynamics:: " 32 "II. Behond SUPG'' Computer Methods in Applied Mechanics and Engineering 54 (1986) 341--355");
47 return -perm * (gradp -
density * gravity);
61 return perm * density_prime * gravity;
68 return ((
alpha > 0.0) ? 1.0 : -1.0) - 1.0 /
alpha;
93 b(0) = xi_prime * vel;
95 b(1) = eta_prime * vel;
97 b(2) = zeta_prime * vel;
110 return 2.0 * ((xi_prime * vel) * (dvel_dgradp.transpose() * xi_prime) +
111 (eta_prime * vel) * (dvel_dgradp.transpose() * eta_prime) +
112 (zeta_prime * vel) * (dvel_dgradp.transpose() * zeta_prime));
124 ((xi_prime * vel) * (dvel_dp * xi_prime) + (eta_prime * vel) * (dvel_dp * eta_prime) +
125 (zeta_prime * vel) * (dvel_dp * zeta_prime));
133 Real norm_b =
b.norm();
140 Real h = 2.0 * norm_v / norm_b;
145 return xi_tilde / norm_b;
161 Real norm_b =
b.norm();
166 Real h = 2 * norm_vel / norm_b;
168 2.0 * norm_vel * norm_b_dgradp / norm_b / norm_b);
172 0.5 * (norm_vel_dgradp * h + norm_vel * h_dgradp) / traceperm /
_p_SUPG;
179 xi_tilde_dgradp / norm_b - xi_tilde * norm_b_dgradp / (norm_b * norm_b);
195 Real norm_vel_dp = dvel_dp * vel / norm_vel;
197 Real norm_b =
b.norm();
200 Real norm_b_dp = db2_dp / (2.0 * norm_b);
202 Real h = 2.0 * norm_vel / norm_b;
203 Real h_dp = 2.0 * norm_vel_dp / norm_b - 2.0 * norm_vel * norm_b_dp / (norm_b * norm_b);
206 Real alpha_dp = 0.5 * (norm_vel_dp * h + norm_vel * h_dp) / (traceperm *
_p_SUPG);
210 Real xi_tilde_dp = xi_tilde_prime * alpha_dp;
213 const Real tau_dp = xi_tilde_dp / norm_b - xi_tilde * norm_b_dp / (norm_b * norm_b);
static InputParameters validParams()
auto norm() const -> decltype(std::norm(Real()))
RichardsSUPGstandard(const InputParameters ¶meters)
static InputParameters validParams()
Real _p_SUPG
the SUPG pressure parameter This dictates how strong the SUPG is _p_SUPG large means only a little SU...
static const std::string density
Real tauSUPG(RealVectorValue vel, Real traceperm, RealVectorValue b) const
The SUPG tau parameter.
RealVectorValue velSUPG(RealTensorValue perm, RealVectorValue gradp, Real density, RealVectorValue gravity) const
SUPG velocity = -perm*(gradp - density*gravity) This points in direction of information propagation...
bool SUPG_trivial() const
returns false in this case since everything is trivial
TensorValue< Real > RealTensorValue
Real dtauSUPG_dp(RealVectorValue vel, RealVectorValue dvel_dp, Real traceperm, RealVectorValue b, Real db2_dp) const
derivative of tau wrt porepressure (keeping gradp fixed)
RealVectorValue bb(RealVectorValue vel, int dimen, RealVectorValue xi_prime, RealVectorValue eta_prime, RealVectorValue zeta_prime) const
|bb| ~ 2*velocity/element_length
base class for SUPG of the Richards equation You must override all the functions below with your spec...
Real cosh_relation_prime(Real alpha) const
derivative of cosh_relation wrt alpha
standard SUPG relationships valid for the Richards equation.
RealVectorValue dvelSUPG_dp(RealTensorValue perm, Real density_prime, RealVectorValue gravity) const
derivative of SUPG velocity wrt porepressure (keeping gradp fixed)
RealVectorValue dbb2_dgradp(RealVectorValue vel, RealTensorValue dvel_dgradp, RealVectorValue xi_prime, RealVectorValue eta_prime, RealVectorValue zeta_prime) const
derivative of bb*bb wrt gradient of porepressure
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static const std::string alpha
RealTensorValue dvelSUPG_dgradp(RealTensorValue perm) const
derivative of SUPG velocity wrt gradient of porepressure
Real dbb2_dp(RealVectorValue vel, RealVectorValue dvel_dp, RealVectorValue xi_prime, RealVectorValue eta_prime, RealVectorValue zeta_prime) const
derivative of bb*bb wrt porepressure
RealVectorValue dtauSUPG_dgradp(RealVectorValue vel, RealTensorValue dvel_dgradp, Real traceperm, RealVectorValue b, RealVectorValue db2_dgradp) const
derivative of tau wrt gradient of porepressure
Real cosh_relation(Real alpha) const
cosh(alpha)/sinh(alpha) - 1/alpha, modified at extreme values of alpha to prevent overflows ...
registerMooseObject("RichardsApp", RichardsSUPGstandard)