ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
moeng_flux Struct Reference

#include <ERF_MOSTStress.H>

Collaboration diagram for moeng_flux:

Public Member Functions

 moeng_flux ()
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real compute_q_flux (const int &i, const int &j, const int &k, const amrex::Array4< const amrex::Real > &cons_arr, const amrex::Array4< const amrex::Real > &velx_arr, const amrex::Array4< const amrex::Real > &vely_arr, const amrex::Array4< const amrex::Real > &umm_arr, const amrex::Array4< const amrex::Real > &qvm_arr, const amrex::Array4< const amrex::Real > &u_star_arr, const amrex::Array4< const amrex::Real > &q_star_arr, const amrex::Array4< const amrex::Real > &q_surf_arr) const
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real compute_t_flux (const int &i, const int &j, const int &k, const amrex::Array4< const amrex::Real > &cons_arr, const amrex::Array4< const amrex::Real > &velx_arr, const amrex::Array4< const amrex::Real > &vely_arr, const amrex::Array4< const amrex::Real > &umm_arr, const amrex::Array4< const amrex::Real > &tm_arr, const amrex::Array4< const amrex::Real > &u_star_arr, const amrex::Array4< const amrex::Real > &t_star_arr, const amrex::Array4< const amrex::Real > &t_surf_arr) const
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real compute_u_flux (const int &i, const int &j, const int &k, const amrex::Array4< const amrex::Real > &cons_arr, const amrex::Array4< const amrex::Real > &velx_arr, const amrex::Array4< const amrex::Real > &vely_arr, const amrex::Array4< const amrex::Real > &umm_arr, const amrex::Array4< const amrex::Real > &um_arr, const amrex::Array4< const amrex::Real > &u_star_arr) const
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real compute_v_flux (const int &i, const int &j, const int &k, const amrex::Array4< const amrex::Real > &cons_arr, const amrex::Array4< const amrex::Real > &velx_arr, const amrex::Array4< const amrex::Real > &vely_arr, const amrex::Array4< const amrex::Real > &umm_arr, const amrex::Array4< const amrex::Real > &vm_arr, const amrex::Array4< const amrex::Real > &u_star_arr) const
 

Private Attributes

const amrex::Real eps = amrex::Real(1e-15)
 
const amrex::Real WSMIN = amrex::Real(0.1)
 

Detailed Description

Moeng flux formulation

Constructor & Destructor Documentation

◆ moeng_flux()

moeng_flux::moeng_flux ( )
inline

Construct the Moeng flux calculator.

2070 {}

Member Function Documentation

◆ compute_q_flux()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real moeng_flux::compute_q_flux ( const int &  i,
const int &  j,
const int &  k,
const amrex::Array4< const amrex::Real > &  cons_arr,
const amrex::Array4< const amrex::Real > &  velx_arr,
const amrex::Array4< const amrex::Real > &  vely_arr,
const amrex::Array4< const amrex::Real > &  umm_arr,
const amrex::Array4< const amrex::Real > &  qvm_arr,
const amrex::Array4< const amrex::Real > &  u_star_arr,
const amrex::Array4< const amrex::Real > &  q_star_arr,
const amrex::Array4< const amrex::Real > &  q_surf_arr 
) const
inline

Compute moisture flux for one surface point.

Calling sequence
i, j, k, cons_arr, velx_arr, vely_arr, umm_arr, qvm_arr, u_star_arr, q_star_arr, q_surf_arr.
2093  {
2094  amrex::Real rho = cons_arr(i,j,k,Rho_comp);
2095  amrex::Real qv = cons_arr(i,j,k,RhoQ1_comp) / rho;
2096  amrex::Real velx = myhalf * ( velx_arr(i,j,k) + velx_arr(i+1,j ,k) );
2097  amrex::Real vely = myhalf * ( vely_arr(i,j,k) + vely_arr(i ,j+1,k) );
2098 
2099  amrex::Real qv_mean = qvm_arr(i,j,0);
2100  amrex::Real ustar = u_star_arr(i,j,0);
2101  amrex::Real qstar = q_star_arr(i,j,0);
2102  amrex::Real qv_surf = q_surf_arr(i,j,0);
2103  amrex::Real wsp_mean = umm_arr(i,j,0);
2104  wsp_mean = std::max(wsp_mean, WSMIN);
2105 
2106  amrex::Real wsp = std::sqrt(velx*velx+vely*vely);
2107  amrex::Real num1 = wsp * (qv_mean-qv_surf);
2108  amrex::Real num2 = wsp_mean * (qv-qv_mean);
2109 
2110  // NOTE: this is rho*<Qv'w'> = -K dQvdz
2111  amrex::Real moflux = (std::abs(qstar) > eps) ?
2112  -rho*qstar*ustar*(num1+num2)/((qv_mean-qv_surf)*wsp_mean) : zero;
2113 
2114  return moflux;
2115  }
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
#define Rho_comp
Definition: ERF_IndexDefines.H:36
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:42
rho
Definition: ERF_InitCustomPert_Bubble.H:107
amrex::Real Real
Definition: ERF_ShocInterface.H:19
@ qv
Definition: ERF_Kessler.H:30
const amrex::Real eps
Definition: ERF_MOSTStress.H:2254
const amrex::Real WSMIN
Definition: ERF_MOSTStress.H:2256

◆ compute_t_flux()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real moeng_flux::compute_t_flux ( const int &  i,
const int &  j,
const int &  k,
const amrex::Array4< const amrex::Real > &  cons_arr,
const amrex::Array4< const amrex::Real > &  velx_arr,
const amrex::Array4< const amrex::Real > &  vely_arr,
const amrex::Array4< const amrex::Real > &  umm_arr,
const amrex::Array4< const amrex::Real > &  tm_arr,
const amrex::Array4< const amrex::Real > &  u_star_arr,
const amrex::Array4< const amrex::Real > &  t_star_arr,
const amrex::Array4< const amrex::Real > &  t_surf_arr 
) const
inline

Compute heat flux for one surface point.

Calling sequence
i, j, k, cons_arr, velx_arr, vely_arr, umm_arr, tm_arr, u_star_arr, t_star_arr, t_surf_arr.
2138  {
2139  amrex::Real rho = cons_arr(i,j,k,Rho_comp);
2140  amrex::Real theta = cons_arr(i,j,k,RhoTheta_comp) / rho;
2141  amrex::Real velx = myhalf * ( velx_arr(i,j,k) + velx_arr(i+1,j ,k) );
2142  amrex::Real vely = myhalf * ( vely_arr(i,j,k) + vely_arr(i ,j+1,k) );
2143 
2144  amrex::Real theta_mean = tm_arr(i,j,0);
2145  amrex::Real ustar = u_star_arr(i,j,0);
2146  amrex::Real tstar = t_star_arr(i,j,0);
2147  amrex::Real theta_surf = t_surf_arr(i,j,0);
2148  amrex::Real wsp_mean = umm_arr(i,j,0);
2149  wsp_mean = std::max(wsp_mean, WSMIN);
2150 
2151  amrex::Real wsp = std::sqrt(velx*velx+vely*vely);
2152  amrex::Real num1 = wsp * (theta_mean-theta_surf);
2153  amrex::Real num2 = wsp_mean * (theta-theta_mean);
2154 
2155  // NOTE: this is rho*<T'w'> = -K dTdz
2156  amrex::Real moflux = (std::abs(tstar) > eps) ?
2157  -rho*tstar*ustar*(num1+num2)/((theta_mean-theta_surf)*wsp_mean) : zero;
2158 
2159  return moflux;
2160  }
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:37
@ theta
Definition: ERF_SLM.H:20

◆ compute_u_flux()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real moeng_flux::compute_u_flux ( const int &  i,
const int &  j,
const int &  k,
const amrex::Array4< const amrex::Real > &  cons_arr,
const amrex::Array4< const amrex::Real > &  velx_arr,
const amrex::Array4< const amrex::Real > &  vely_arr,
const amrex::Array4< const amrex::Real > &  umm_arr,
const amrex::Array4< const amrex::Real > &  um_arr,
const amrex::Array4< const amrex::Real > &  u_star_arr 
) const
inline

Compute x-momentum flux for one surface face.

Calling sequence
i, j, k, cons_arr, velx_arr, vely_arr, umm_arr, um_arr, u_star_arr.
2181  {
2182  amrex::Real velx = velx_arr(i,j,k);
2183  amrex::Real vely = fourth * ( vely_arr(i ,j,k) + vely_arr(i ,j+1,k)
2184  + vely_arr(i-1,j,k) + vely_arr(i-1,j+1,k) );
2185  amrex::Real rho = myhalf * ( cons_arr(i-1,j,k,Rho_comp) + cons_arr(i,j,k,Rho_comp) );
2186 
2187  amrex::Real umean = um_arr(i,j,0);
2188  amrex::Real ustar = myhalf * ( u_star_arr(i-1,j,0) + u_star_arr(i,j,0) );
2189  amrex::Real wsp_mean = myhalf * ( umm_arr(i-1,j,0) + umm_arr(i,j,0) );
2190  wsp_mean = std::max(wsp_mean, WSMIN);
2191 
2192  // Note: The surface mean shear stress is decomposed into tau_xz by
2193  // multiplying the modeled shear stress (rho*ustar^2) with
2194  // a factor of umean/wsp_mean for directionality; this factor
2195  // modifies the denominator from what is in Moeng amrex::Real(1984.)
2196  amrex::Real wsp = std::sqrt(velx*velx+vely*vely);
2197  amrex::Real num1 = wsp * umean;
2198  amrex::Real num2 = wsp_mean * (velx-umean);
2199 
2200  // NOTE: this is rho*<u'w'> = -K dudz
2201  amrex::Real stressx = -rho*ustar*ustar * (num1+num2)/(wsp_mean*wsp_mean);
2202 
2203  return stressx;
2204  }
constexpr amrex::Real fourth
Definition: ERF_Constants.H:14

◆ compute_v_flux()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real moeng_flux::compute_v_flux ( const int &  i,
const int &  j,
const int &  k,
const amrex::Array4< const amrex::Real > &  cons_arr,
const amrex::Array4< const amrex::Real > &  velx_arr,
const amrex::Array4< const amrex::Real > &  vely_arr,
const amrex::Array4< const amrex::Real > &  umm_arr,
const amrex::Array4< const amrex::Real > &  vm_arr,
const amrex::Array4< const amrex::Real > &  u_star_arr 
) const
inline

Compute y-momentum flux for one surface face.

Calling sequence
i, j, k, cons_arr, velx_arr, vely_arr, umm_arr, vm_arr, u_star_arr.
2225  {
2226  amrex::Real velx = fourth * ( velx_arr(i,j ,k) + velx_arr(i+1,j ,k)
2227  + velx_arr(i,j-1,k) + velx_arr(i+1,j-1,k) );
2228  amrex::Real vely = vely_arr(i,j,k);
2229  amrex::Real rho = myhalf * ( cons_arr(i,j-1,k,Rho_comp) + cons_arr(i,j,k,Rho_comp) );
2230 
2231  amrex::Real vmean = vm_arr(i,j,0);
2232  amrex::Real ustar = myhalf * ( u_star_arr(i,j-1,0) + u_star_arr(i,j,0) );
2233  amrex::Real wsp_mean = myhalf * ( umm_arr(i,j-1,0) + umm_arr(i,j,0) );
2234  wsp_mean = std::max(wsp_mean, WSMIN);
2235 
2236  // Note: The surface mean shear stress is decomposed into tau_yz by
2237  // multiplying the modeled shear stress (rho*ustar^2) with
2238  // a factor of vmean/wsp_mean for directionality; this factor
2239  // modifies the denominator from what is in Moeng amrex::Real(1984.)
2240  amrex::Real wsp = std::sqrt(velx*velx+vely*vely);
2241  amrex::Real num1 = wsp * vmean;
2242  amrex::Real num2 = wsp_mean * (vely-vmean);
2243 
2244  // NOTE: this is rho*<v'w'> = -K dvdz
2245  amrex::Real stressy = -rho*ustar*ustar * (num1+num2)/(wsp_mean*wsp_mean);
2246 
2247  return stressy;
2248  }

Member Data Documentation

◆ eps

const amrex::Real moeng_flux::eps = amrex::Real(1e-15)
private

Referenced by compute_q_flux(), and compute_t_flux().

◆ WSMIN

const amrex::Real moeng_flux::WSMIN = amrex::Real(0.1)
private

The documentation for this struct was generated from the following file: