3 #ifndef ERF_TERRAIN_DIFFUSION_LIMITS_H_
4 #define ERF_TERRAIN_DIFFUSION_LIMITS_H_
6 #include <AMReX_Array4.H>
7 #include <AMReX_Extension.H>
8 #include <AMReX_GpuQualifiers.H>
9 #include <AMReX_Algorithm.H>
10 #include <AMReX_Array.H>
11 #include <AMReX_Math.H>
12 #include <AMReX_REAL.H>
45 const amrex::Array4<const amrex::Real>& z_nd) noexcept
47 using amrex::Math::abs;
50 + abs(z_nd(i+1,j+1,k ) - z_nd(i,j+1,k ))
51 + abs(z_nd(i+1,j ,k+1) - z_nd(i,j ,k+1))
52 + abs(z_nd(i+1,j+1,k+1) - z_nd(i,j+1,k+1)) );
54 + abs(z_nd(i+1,j+1,k ) - z_nd(i+1,j,k ))
55 + abs(z_nd(i ,j+1,k+1) - z_nd(i ,j,k+1))
56 + abs(z_nd(i+1,j+1,k+1) - z_nd(i+1,j,k+1)) );
57 d.
dz =
fourth * ( (z_nd(i ,j ,k+1) - z_nd(i ,j ,k))
58 + (z_nd(i+1,j ,k+1) - z_nd(i+1,j ,k))
59 + (z_nd(i ,j+1,k+1) - z_nd(i ,j+1,k))
60 + (z_nd(i+1,j+1,k+1) - z_nd(i+1,j+1,k)) );
80 const amrex::Real a = std::sqrt(d.dx_drop*d.dx_drop + d.dy_drop*d.dy_drop) / d.dz;
107 AMREX_GPU_HOST_DEVICE
115 nu = (nu < nu_max) ? nu : nu_max;
163 AMREX_GPU_HOST_DEVICE
172 const amrex::Real r_u = mu_h * (
two*a + b) + e_uv * mu_v * dzinv2 + mu_v * xa;
174 const amrex::Real r_w = mu_v * (a + b) +
two * e_w * mu_v * dzinv2 + mu_v * (xa + xb);
178 const amrex::Real mu_p = (mu_hm > mu_v) ? mu_hm : mu_v;
179 return ( row +
two * mu_p * h2 * dzinv2 ) /
rho;
194 AMREX_GPU_HOST_DEVICE
197 NeighbourhoodMax (
int i,
int j,
int k,
int n,
const amrex::Array4<const amrex::Real>& a) noexcept
200 for (
int kk = -1; kk <= 1; ++kk) {
201 for (
int jj = -1; jj <= 1; ++jj) {
202 for (
int ii = -1; ii <= 1; ++ii) {
213 AMREX_GPU_HOST_DEVICE
221 for (
int kk = -1; kk <= 1; ++kk) {
222 for (
int jj = -1; jj <= 1; ++jj) {
223 for (
int ii = -1; ii <= 1; ++ii) {
225 if (v >
zero && (!found || v < m)) { m = v; found =
true; }
231 AMREX_GPU_HOST_DEVICE
238 return ( K_h * (a + b) + w_metric * K_h * h2 * dzinv2 + e_vert * K_v * dzinv2 ) /
rho;
264 AMREX_GPU_HOST_DEVICE
268 const amrex::Array4<const amrex::Real>& s_arr,
269 const amrex::Array4<const amrex::Real>& k_arr,
270 const amrex::Array4<const amrex::Real>& z_nd,
272 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dxinv,
280 if (set.variable_dz) {
296 a2, b2, h2, dzinv2, set.e_uv, set.e_w, (set.implicit_metric ? set.e_uv :
one));
299 a2, b2, h2, dzinv2, set.e_th, (set.implicit_metric ? set.e_th :
one));
303 a2, b2, h2, dzinv2, set.e_q, (set.implicit_metric ? set.e_q :
one)));
308 a2, b2, h2, dzinv2, set.e_ke, (set.implicit_metric ? set.e_ke :
one)));
310 if (set.has_scalar) {
313 a2, b2, h2, dzinv2,
one));
325 return new_grids || moving_terrain;
336 return force || std::abs(alpha_max - alpha_last) >
amrex::Real(0.01) * alpha_last;
367 template <
typename V>
371 if (!implicit ||
static_cast<int>(fac.size()) < nstages) {
return one; }
374 for (
int k = 0; k < nstages; ++k) {
375 const double fk =
static_cast<double>(fac[k]);
376 if (!(fk >= 0.0 && fk <= 1.0)) {
return one; }
378 auto f = [&] (
int k) {
return static_cast<double>(fac[k]); };
380 return (f(0) >= 0.5 && f(1) >= 1.0) ?
zero :
one;
383 return (f(0) >= 1.0) ?
zero :
one;
#define Rho_comp
Definition: ERF_IndexDefines.H:42
Dimensionless numeric literals and pure mathematical constants.
constexpr amrex::Real two
Definition: ERF_NumericalConstants.H:38
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:37
constexpr amrex::Real fourth
Definition: ERF_NumericalConstants.H:42
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:36
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real NeighbourhoodMinPositive(int i, int j, int k, int n, const amrex::Array4< const amrex::Real > &a, amrex::Real fallback) noexcept
Definition: ERF_TerrainDiffusionLimits.H:216
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void CellDiffusiveRates(int i, int j, int k, const amrex::Array4< const amrex::Real > &s_arr, const amrex::Array4< const amrex::Real > &k_arr, const amrex::Array4< const amrex::Real > &z_nd, amrex::Real mf_mx, amrex::Real mf_my, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxinv, const DiffusiveRateSettings &set, amrex::Real &rate_mom, amrex::Real &rate_scal) noexcept
Definition: ERF_TerrainDiffusionLimits.H:267
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Smag2DLimitedViscosity(amrex::Real nu, amrex::Real strain, amrex::Real DeltaH, amrex::Real alpha, amrex::Real kh_cap, bool use_slope) noexcept
Definition: ERF_TerrainDiffusionLimits.H:110
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real ScalarDiffusiveRate(amrex::Real rho, amrex::Real K_h, amrex::Real K_v, amrex::Real a, amrex::Real b, amrex::Real h2, amrex::Real dzinv2, amrex::Real e_vert, amrex::Real w_metric=one) noexcept
Definition: ERF_TerrainDiffusionLimits.H:234
amrex::Real ExplicitVerticalFraction(int nstages, const V &fac, bool implicit)
Definition: ERF_TerrainDiffusionLimits.H:369
constexpr amrex::Real smag2d_def_limit_speed
Definition: ERF_TerrainDiffusionLimits.H:85
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real TerrainSlopeFactor(const TerrainCellDrops &d) noexcept
Definition: ERF_TerrainDiffusionLimits.H:78
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE TerrainCellDrops ComputeTerrainCellDrops(int i, int j, int k, const amrex::Array4< const amrex::Real > &z_nd) noexcept
Definition: ERF_TerrainDiffusionLimits.H:44
constexpr amrex::Real smag2d_def_limit_min
Definition: ERF_TerrainDiffusionLimits.H:87
bool SlopeReportEvaluate(bool new_grids, bool moving_terrain)
Definition: ERF_TerrainDiffusionLimits.H:323
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real NeighbourhoodMax(int i, int j, int k, int n, const amrex::Array4< const amrex::Real > &a) noexcept
Definition: ERF_TerrainDiffusionLimits.H:197
bool SlopeReportPrint(bool force, amrex::Real alpha_max, amrex::Real alpha_last)
Definition: ERF_TerrainDiffusionLimits.H:334
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real MomentumDiffusiveRate(amrex::Real rho, amrex::Real mu_h, amrex::Real mu_v, amrex::Real a, amrex::Real b, amrex::Real h2, amrex::Real dzinv2, amrex::Real e_uv, amrex::Real e_w, amrex::Real w_metric=one) noexcept
Definition: ERF_TerrainDiffusionLimits.H:166
@ Theta_v
Definition: ERF_IndexDefines.H:253
@ Scalar_v
Definition: ERF_IndexDefines.H:255
@ Mom_h
Definition: ERF_IndexDefines.H:247
@ Q_v
Definition: ERF_IndexDefines.H:256
@ Q_h
Definition: ERF_IndexDefines.H:251
@ Mom_v
Definition: ERF_IndexDefines.H:252
@ Scalar_h
Definition: ERF_IndexDefines.H:250
@ KE_v
Definition: ERF_IndexDefines.H:254
@ Theta_h
Definition: ERF_IndexDefines.H:248
@ KE_h
Definition: ERF_IndexDefines.H:249
@ rho
Definition: ERF_Kessler.H:25
@ V
Definition: ERF_IndexDefines.H:130
@ alpha
Definition: ERF_SLM.H:151
real(c_double), parameter a2
Definition: ERF_module_model_constants.F90:95
real(c_double), parameter r_v
Definition: ERF_module_model_constants.F90:24
Definition: ERF_TerrainDiffusionLimits.H:243
amrex::Real e_uv
Definition: ERF_TerrainDiffusionLimits.H:249
bool has_scalar
Definition: ERF_TerrainDiffusionLimits.H:247
bool implicit_metric
Definition: ERF_TerrainDiffusionLimits.H:248
amrex::Real e_ke
Definition: ERF_TerrainDiffusionLimits.H:249
bool variable_dz
Definition: ERF_TerrainDiffusionLimits.H:244
bool has_q
Definition: ERF_TerrainDiffusionLimits.H:245
amrex::Real e_w
Definition: ERF_TerrainDiffusionLimits.H:249
amrex::Real e_th
Definition: ERF_TerrainDiffusionLimits.H:249
bool has_ke
Definition: ERF_TerrainDiffusionLimits.H:246
amrex::Real e_q
Definition: ERF_TerrainDiffusionLimits.H:249
Definition: ERF_TerrainDiffusionLimits.H:29
amrex::Real dz
Definition: ERF_TerrainDiffusionLimits.H:32
amrex::Real dy_drop
Definition: ERF_TerrainDiffusionLimits.H:31
amrex::Real dx_drop
Definition: ERF_TerrainDiffusionLimits.H:30