ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_TerrainMetrics.H File Reference
#include <AMReX.H>
#include <AMReX_Geometry.H>
#include <AMReX_MultiFab.H>
#include <ERF_IndexDefines.H>
#include <cmath>
#include <ERF_NumericalConstants.H>
Include dependency graph for ERF_TerrainMetrics.H:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Enumerations

enum class  FineTerrain { None , Interpolate , Transform }
 

Functions

void init_default_zphys (int lev, const amrex::Geometry &geom, amrex::MultiFab &z_phys_nd, amrex::MultiFab &z_phys_cc, amrex::Real z_offset=zero)
 
amrex::BoxArray join_boxes_stacked_in_z (const amrex::BoxArray &ba)
 
void init_zlevels (amrex::Vector< amrex::Vector< amrex::Real >> &zlevels_stag, amrex::Vector< amrex::Vector< amrex::Real >> &stretched_dz_h, amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real >> &stretched_dz_d, amrex::Vector< amrex::Geometry > const &geom, amrex::Vector< amrex::IntVect > const &ref_ratio, const amrex::Real grid_stretching_ratio, const amrex::Real zsurf, const amrex::Real dz0)
 
FineTerrain which_fine_terrain ()
 
void make_terrain_fitted_coords (int lev, const amrex::Geometry &geom, amrex::MultiFab &z_phys_nd, amrex::Vector< amrex::Real > const &z_levels_h, amrex::GpuArray< ERF_BC, AMREX_SPACEDIM *2 > &phys_bc_type, FineTerrain fine_terrain=FineTerrain::None, amrex::MultiFab const *z_phys_interp=nullptr)
 
void validate_flat_terrain (int lev, const amrex::MultiFab &z_phys_nd, const amrex::Vector< amrex::Real > &z_levels_h)
 
void init_which_terrain_grid (int lev, const amrex::Geometry &geom, amrex::MultiFab &z_phys_nd, amrex::Vector< amrex::Real > const &z_levels_h, FineTerrain fine_terrain=FineTerrain::None, amrex::MultiFab const *z_phys_interp=nullptr)
 
void init_fine_terrain_grid (int lev, const amrex::Geometry &geom, amrex::MultiFab &z_phys_nd, amrex::Vector< amrex::Real > const &z_levels_h, FineTerrain fine_terrain, amrex::MultiFab const *z_phys_interp)
 
amrex::Real get_dzmin_terrain (amrex::MultiFab &z_phys_nd)
 
void update_stretched_dz (int lev, amrex::Vector< amrex::Vector< amrex::Real >> const &zlevels_stag, amrex::Vector< amrex::Vector< amrex::Real >> &stretched_dz_h, amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real >> &stretched_dz_d)
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtCellCenter (const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtCellCenter (const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtCellCenter (const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtIface (const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtIface (const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtIface (const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtJface (const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtJface (const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtJface (const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtKface (const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtKface (const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtKface (const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtEdgeCenterK (const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtEdgeCenterK (const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtEdgeCenterK (const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtEdgeCenterJ (const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtEdgeCenterJ (const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtEdgeCenterJ (const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtEdgeCenterI (const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtEdgeCenterI (const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtEdgeCenterI (const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_Z_AtCellCenter (const int &i, const int &j, const int &k, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_Z_AtWFace (const int &i, const int &j, const int &k, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_Zrel_AtCellCenter (const int &i, const int &j, const int &k, const amrex::Array4< const amrex::Real > &z_nd)
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real OmegaFromW (int &i, int &j, int &k, amrex::Real w, const amrex::Array4< const amrex::Real > &u_arr, const amrex::Array4< const amrex::Real > &v_arr, const amrex::Array4< const amrex::Real > &mf_u, const amrex::Array4< const amrex::Real > &mf_v, const amrex::Array4< const amrex::Real > &z_nd, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv)
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real WFromOmega (int &i, int &j, int &k, amrex::Real omega, const amrex::Array4< const amrex::Real > &u_arr, const amrex::Array4< const amrex::Real > &v_arr, const amrex::Array4< const amrex::Real > &mf_u, const amrex::Array4< const amrex::Real > &mf_v, const amrex::Array4< const amrex::Real > &z_nd, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv)
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void rotate_scalar_flux (const int &i, const int &j, const int &klo, const int &, const amrex::Real &flux, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv, const amrex::Array4< const amrex::Real > &zphys_arr, const amrex::Array4< amrex::Real > &phi1_arr, const amrex::Array4< amrex::Real > &phi2_arr, const amrex::Array4< amrex::Real > &phi3_arr)
 
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void rotate_stress_tensor (const int &i, const int &j, const int &klo, const int &, const amrex::Real &flux, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dxInv, const amrex::Array4< const amrex::Real > &zphys_arr, const amrex::Array4< const amrex::Real > &u_arr, const amrex::Array4< const amrex::Real > &v_arr, const amrex::Array4< const amrex::Real > &w_arr, const amrex::Array4< amrex::Real > &, const amrex::Array4< amrex::Real > &, const amrex::Array4< amrex::Real > &, const amrex::Array4< amrex::Real > &, const amrex::Array4< amrex::Real > &, const amrex::Array4< amrex::Real > &tau13_arr, const amrex::Array4< amrex::Real > &tau31_arr, const amrex::Array4< amrex::Real > &tau23_arr, const amrex::Array4< amrex::Real > &tau32_arr)
 

Enumeration Type Documentation

◆ FineTerrain

enum FineTerrain
strong

How the terrain-fitted mesh on a fine level is built when erf.terrain_smoothing != 0.

The STF and Sullivan TF transformations are not defined on a level that does not reach the top of the domain, so on a fine level we instead start from the mesh interpolated from the coarse level. A caller that has done that interpolation – and, for Transform, has also written the fine-resolution terrain into the k=0 slab and saved the pre-overwrite field – says so by passing anything other than None. Every other caller keeps the historical behavior of aborting, because it has not prepared z_phys_nd in a way this path can use.

Enumerator
None 

caller has not prepared a fine mesh from the coarse level

Interpolate 

use the coordinates interpolated from the coarse level as-is

Transform 

add the fine terrain as a correction that decays with height

68  {
69  None, //!< caller has not prepared a fine mesh from the coarse level
70  Interpolate, //!< use the coordinates interpolated from the coarse level as-is
71  Transform //!< add the fine terrain as a correction that decays with height
72 };
@ Transform
add the fine terrain as a correction that decays with height
@ Interpolate
use the coordinates interpolated from the coarse level as-is
@ None
Definition: ERF_LSM_Types.H:6

Function Documentation

◆ Compute_h_eta_AtCellCenter()

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtCellCenter ( const int &  i,
const int &  j,
const int &  k,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  cellSizeInv,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the eta metric term at the cell center.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]cellSizeInvInverse cell spacing.
[in]z_ndNodal physical height field.
Returns
Eta metric term.
250 {
251  amrex::Real dyInv = cellSizeInv[1];
252  amrex::Real met_h_eta = fourth * dyInv *
253  ( z_nd(i,j+1,k) + z_nd(i+1,j+1,k) + z_nd(i,j+1,k+1) + z_nd(i+1,j+1,k+1)
254  - z_nd(i,j ,k) - z_nd(i+1,j ,k) - z_nd(i,j ,k+1) - z_nd(i+1,j ,k+1) );
255  return met_h_eta;
256 }
constexpr amrex::Real fourth
Definition: ERF_NumericalConstants.H:42
amrex::Real Real
Definition: ERF_ShocInterface.H:19

Referenced by Compute_InvDt_Compressible(), ComputeStrain_T(), ComputeStressConsVisc_T(), ComputeStressVarVisc_T(), ERF::FillPlot3DVars(), ERFPhysBCFunct_cons::impose_vertical_cons_bcs(), ERF::poisson_wall_dist(), rotate_scalar_flux(), MOSTAverage::set_norm_indices_T(), and MOSTAverage::set_norm_positions_T().

Here is the caller graph for this function:

◆ Compute_h_eta_AtEdgeCenterI()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtEdgeCenterI ( const int &  i,
const int &  j,
const int &  k,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  cellSizeInv,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the eta metric term at the i-edge center.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]cellSizeInvInverse cell spacing.
[in]z_ndNodal physical height field.
Returns
Eta metric term.
691 {
692  amrex::Real dyInv = cellSizeInv[1];
693  amrex::Real met_h_eta = fourth * dyInv *
694  ( z_nd(i+1,j+1,k) + z_nd(i,j+1,k)
695  - z_nd(i+1,j-1,k) - z_nd(i,j-1,k) );
696  return met_h_eta;
697 }

Referenced by ComputeStrain_T(), ComputeStressConsVisc_T(), and ComputeStressVarVisc_T().

Here is the caller graph for this function:

◆ Compute_h_eta_AtEdgeCenterJ()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtEdgeCenterJ ( const int &  i,
const int &  j,
const int &  k,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  cellSizeInv,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the eta metric term at the j-edge center.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]cellSizeInvInverse cell spacing.
[in]z_ndNodal physical height field.
Returns
Eta metric term.
619 {
620  amrex::Real dyInv = cellSizeInv[1];
621  amrex::Real met_h_eta = dyInv * ( z_nd(i,j+1,k) - z_nd(i,j,k) );
622  return met_h_eta;
623 }

Referenced by ComputeStressConsVisc_T(), and ComputeStressVarVisc_T().

Here is the caller graph for this function:

◆ Compute_h_eta_AtEdgeCenterK()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtEdgeCenterK ( const int &  i,
const int &  j,
const int &  k,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  cellSizeInv,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the eta metric term at the k-edge center.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]cellSizeInvInverse cell spacing.
[in]z_ndNodal physical height field.
Returns
Eta metric term.
543 {
544  amrex::Real dyInv = cellSizeInv[1];
545  amrex::Real met_h_eta = fourth * dyInv *
546  ( z_nd(i,j+1,k) + z_nd(i,j+1,k+1)
547  - z_nd(i,j-1,k) - z_nd(i,j-1,k+1) );
548  return met_h_eta;
549 }

Referenced by ComputeStrain_T().

Here is the caller graph for this function:

◆ Compute_h_eta_AtIface()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtIface ( const int &  i,
const int &  j,
const int &  k,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  cellSizeInv,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the eta metric term at the i-face.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]cellSizeInvInverse cell spacing.
[in]z_ndNodal physical height field.
Returns
Eta metric term.
326 {
327  amrex::Real met_h_eta = myhalf * cellSizeInv[1] * ( (z_nd(i,j+1,k ) - z_nd(i,j,k ))
328  + (z_nd(i,j+1,k+1) - z_nd(i,j,k+1)) );
329  return met_h_eta;
330 }
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:41

Referenced by ERFPhysBCFunct_u::impose_vertical_xvel_bcs(), and rotate_stress_tensor().

Here is the caller graph for this function:

◆ Compute_h_eta_AtJface()

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtJface ( const int &  i,
const int &  j,
const int &  k,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  cellSizeInv,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the eta metric term at the j-face.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]cellSizeInvInverse cell spacing.
[in]z_ndNodal physical height field.
Returns
Eta metric term.
395 {
396  amrex::Real met_h_eta = amrex::Real(0.125) * cellSizeInv[1] *
397  ( (z_nd(i ,j+1,k ) - z_nd(i ,j-1,k )) + (z_nd(i ,j+1,k+1) - z_nd(i ,j-1,k+1)) +
398  (z_nd(i+1,j+1,k ) - z_nd(i+1,j-1,k )) + (z_nd(i+1,j+1,k+1) - z_nd(i+1,j-1,k+1)) );
399  return met_h_eta;
400 }

Referenced by erf_substep_MT(), erf_substep_T(), ERFPhysBCFunct_v::impose_vertical_yvel_bcs(), ERF::poisson_wall_dist(), MOSTAverage::set_rotated_fields(), and TerrainScalarDiffusionFluxAtJFace().

Here is the caller graph for this function:

◆ Compute_h_eta_AtKface()

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtKface ( const int &  i,
const int &  j,
const int &  k,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  cellSizeInv,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the eta metric term at the k-face.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]cellSizeInvInverse cell spacing.
[in]z_ndNodal physical height field.
Returns
Eta metric term.
466 {
467  amrex::Real met_h_eta = myhalf * cellSizeInv[1] * ( (z_nd(i ,j+1,k) - z_nd(i ,j,k))
468  + (z_nd(i+1,j+1,k) - z_nd(i+1,j,k)) );
469  return met_h_eta;
470 }

Referenced by ERF::poisson_wall_dist(), SubtractTerrainMetricImplicitPart_T_Impl(), and TerrainScalarDiffusionGzAtKFace().

Here is the caller graph for this function:

◆ Compute_h_xi_AtCellCenter()

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtCellCenter ( const int &  i,
const int &  j,
const int &  k,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  cellSizeInv,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the xi metric term at the cell center.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]cellSizeInvInverse cell spacing.
[in]z_ndNodal physical height field.
Returns
Xi metric term.
225 {
226  amrex::Real dxInv = cellSizeInv[0];
227  amrex::Real met_h_xi = fourth * dxInv *
228  ( z_nd(i+1,j,k) + z_nd(i+1,j+1,k) + z_nd(i+1,j,k+1) + z_nd(i+1,j+1,k+1)
229  - z_nd(i ,j,k) - z_nd(i ,j+1,k) - z_nd(i ,j,k+1) - z_nd(i ,j+1,k+1) );
230  return met_h_xi;
231 }
amrex::GpuArray< Real, AMREX_SPACEDIM > dxInv
Definition: ERF_InitCustomPertVels_ParticleTests.H:17

Referenced by Compute_InvDt_Compressible(), ComputeStrain_T(), ComputeStressConsVisc_T(), ComputeStressVarVisc_T(), ERF::FillPlot3DVars(), ERFPhysBCFunct_cons::impose_vertical_cons_bcs(), ERF::poisson_wall_dist(), rotate_scalar_flux(), MOSTAverage::set_norm_indices_T(), and MOSTAverage::set_norm_positions_T().

Here is the caller graph for this function:

◆ Compute_h_xi_AtEdgeCenterI()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtEdgeCenterI ( const int &  i,
const int &  j,
const int &  k,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  cellSizeInv,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the xi metric term at the i-edge center.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]cellSizeInvInverse cell spacing.
[in]z_ndNodal physical height field.
Returns
Xi metric term.
668 {
669  amrex::Real dxInv = cellSizeInv[0];
670  amrex::Real met_h_xi = dxInv * ( z_nd(i+1,j,k) - z_nd(i,j,k) );
671  return met_h_xi;
672 }

Referenced by ComputeStressConsVisc_T(), and ComputeStressVarVisc_T().

Here is the caller graph for this function:

◆ Compute_h_xi_AtEdgeCenterJ()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtEdgeCenterJ ( const int &  i,
const int &  j,
const int &  k,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  cellSizeInv,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the xi metric term at the j-edge center.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]cellSizeInvInverse cell spacing.
[in]z_ndNodal physical height field.
Returns
Xi metric term.
594 {
595  amrex::Real dxInv = cellSizeInv[0];
596  amrex::Real met_h_xi = fourth * dxInv *
597  ( z_nd(i+1,j+1,k) + z_nd(i+1,j ,k)
598  - z_nd(i-1,j+1,k) - z_nd(i-1,j ,k) );
599  return met_h_xi;
600 }

Referenced by ComputeStrain_T(), ComputeStressConsVisc_T(), and ComputeStressVarVisc_T().

Here is the caller graph for this function:

◆ Compute_h_xi_AtEdgeCenterK()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtEdgeCenterK ( const int &  i,
const int &  j,
const int &  k,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  cellSizeInv,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the xi metric term at the k-edge center.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]cellSizeInvInverse cell spacing.
[in]z_ndNodal physical height field.
Returns
Xi metric term.
518 {
519  amrex::Real dxInv = cellSizeInv[0];
520  amrex::Real met_h_xi = fourth * dxInv *
521  ( z_nd(i+1,j,k) + z_nd(i+1,j,k+1)
522  - z_nd(i-1,j,k) - z_nd(i-1,j,k+1) );
523  return met_h_xi;
524 }

Referenced by ComputeStrain_T().

Here is the caller graph for this function:

◆ Compute_h_xi_AtIface()

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtIface ( const int &  i,
const int &  j,
const int &  k,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  cellSizeInv,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the xi metric term at the i-face.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]cellSizeInvInverse cell spacing.
[in]z_ndNodal physical height field.
Returns
Xi metric term.
302 {
303  amrex::Real met_h_xi = amrex::Real(0.125) * cellSizeInv[0] * (
304  (z_nd(i+1,j ,k ) - z_nd(i-1,j ,k )) + (z_nd(i+1,j ,k+1) - z_nd(i-1,j ,k+1)) +
305  (z_nd(i+1,j+1,k ) - z_nd(i-1,j+1,k )) + (z_nd(i+1,j+1,k+1) - z_nd(i-1,j+1,k+1)) );
306  return met_h_xi;
307 }

Referenced by erf_substep_MT(), erf_substep_T(), ERFPhysBCFunct_u::impose_vertical_xvel_bcs(), ERF::poisson_wall_dist(), rotate_stress_tensor(), MOSTAverage::set_rotated_fields(), and TerrainScalarDiffusionFluxAtIFace().

Here is the caller graph for this function:

◆ Compute_h_xi_AtJface()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtJface ( const int &  i,
const int &  j,
const int &  k,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  cellSizeInv,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the xi metric term at the j-face.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]cellSizeInvInverse cell spacing.
[in]z_ndNodal physical height field.
Returns
Xi metric term.
372 {
373  amrex::Real met_h_xi = myhalf * cellSizeInv[0] * ( (z_nd(i+1,j,k ) - z_nd(i,j,k ))
374  + (z_nd(i+1,j,k+1) - z_nd(i,j,k+1)) );
375  return met_h_xi;
376 }

Referenced by ERFPhysBCFunct_v::impose_vertical_yvel_bcs().

Here is the caller graph for this function:

◆ Compute_h_xi_AtKface()

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtKface ( const int &  i,
const int &  j,
const int &  k,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  cellSizeInv,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the xi metric term at the k-face.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]cellSizeInvInverse cell spacing.
[in]z_ndNodal physical height field.
Returns
Xi metric term.
443 {
444  amrex::Real met_h_xi = myhalf * cellSizeInv[0] * ( (z_nd(i+1,j ,k) - z_nd(i,j ,k))
445  + (z_nd(i+1,j+1,k) - z_nd(i,j+1,k)) );
446  return met_h_xi;
447 }

Referenced by ERF::poisson_wall_dist(), SubtractTerrainMetricImplicitPart_T_Impl(), and TerrainScalarDiffusionGzAtKFace().

Here is the caller graph for this function:

◆ Compute_h_zeta_AtCellCenter()

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtCellCenter ( const int &  i,
const int &  j,
const int &  k,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  cellSizeInv,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the zeta metric term at the cell center.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]cellSizeInvInverse cell spacing.
[in]z_ndNodal physical height field.
Returns
Zeta metric term.
200 {
201  amrex::Real dzInv = cellSizeInv[2];
202  amrex::Real met_h_zeta = fourth * dzInv *
203  ( z_nd(i+1,j,k+1) + z_nd(i+1,j+1,k+1) + z_nd(i,j,k+1) + z_nd(i,j+1,k+1)
204  - z_nd(i+1,j,k ) - z_nd(i+1,j+1,k ) - z_nd(i,j,k ) - z_nd(i,j+1,k ) );
205  return met_h_zeta;
206 }

Referenced by Compute_InvDt_Anelastic(), Compute_InvDt_Compressible(), MOSTAverage::compute_region_averages(), ComputeDiffusivityMRF(), ComputeDiffusivityMYJ(), ComputeDiffusivityMYNN25(), ComputeDiffusivityMYNNEDMF(), ComputeDiffusivityYSU(), ComputeDiffusivityYSUNew(), ComputeTurbulentViscosityLES(), ComputeTurbulentViscosityRANS(), ERF::estTimeStep(), ERF::FillPlot3DVars(), ERFPhysBCFunct_cons::impose_vertical_cons_bcs(), and ERF::poisson_wall_dist().

Here is the caller graph for this function:

◆ Compute_h_zeta_AtEdgeCenterI()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtEdgeCenterI ( const int &  i,
const int &  j,
const int &  k,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  cellSizeInv,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the zeta metric term at the i-edge center.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]cellSizeInvInverse cell spacing.
[in]z_ndNodal physical height field.
Returns
Zeta metric term.
644 {
645  amrex::Real dzInv = cellSizeInv[2];
646  amrex::Real met_h_zeta = fourth * dzInv * ( z_nd(i,j,k+1) + z_nd(i+1,j,k+1)
647  - z_nd(i,j,k-1) - z_nd(i+1,j,k-1) );
648  return met_h_zeta;
649 }

Referenced by AdvectionSrcForMom_TF(), AdvectionSrcForZMom(), ComputeStrain_T(), ComputeStressConsVisc_T(), and ComputeStressVarVisc_T().

Here is the caller graph for this function:

◆ Compute_h_zeta_AtEdgeCenterJ()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtEdgeCenterJ ( const int &  i,
const int &  j,
const int &  k,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  cellSizeInv,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the zeta metric term at the j-edge center.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]cellSizeInvInverse cell spacing.
[in]z_ndNodal physical height field.
Returns
Zeta metric term.
570 {
571  amrex::Real dzInv = cellSizeInv[2];
572  amrex::Real met_h_zeta = fourth * dzInv * ( z_nd(i,j,k+1) + z_nd(i,j+1,k+1)
573  - z_nd(i,j,k-1) - z_nd(i,j+1,k-1) );
574  return met_h_zeta;
575 }

Referenced by AdvectionSrcForMom_TF(), AdvectionSrcForZMom(), ComputeStrain_T(), ComputeStressConsVisc_T(), and ComputeStressVarVisc_T().

Here is the caller graph for this function:

◆ Compute_h_zeta_AtEdgeCenterK()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtEdgeCenterK ( const int &  i,
const int &  j,
const int &  k,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  cellSizeInv,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the zeta metric term at the k-edge center.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]cellSizeInvInverse cell spacing.
[in]z_ndNodal physical height field.
Returns
Zeta metric term.
495 {
496  amrex::Real dzInv = cellSizeInv[2];
497  amrex::Real met_h_zeta = dzInv * (z_nd(i,j,k+1) - z_nd(i,j,k));
498  return met_h_zeta;
499 }

Referenced by AdvectionSrcForMom_TF(), AdvectionSrcForXMom(), AdvectionSrcForYMom(), ComputeStressConsVisc_T(), and ComputeStressVarVisc_T().

Here is the caller graph for this function:

◆ Compute_h_zeta_AtIface()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtIface ( const int &  i,
const int &  j,
const int &  k,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  cellSizeInv,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the zeta metric term at the i-face.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]cellSizeInvInverse cell spacing.
[in]z_ndNodal physical height field.
Returns
Zeta metric term.
279 {
280  amrex::Real met_h_zeta = myhalf * cellSizeInv[2] * ( (z_nd(i,j ,k+1) - z_nd(i,j ,k))
281  + (z_nd(i,j+1,k+1) - z_nd(i,j+1,k)) );
282  return met_h_zeta;
283 }

Referenced by erf_make_tau_terms(), erf_slow_rhs_pre(), erf_substep_MT(), erf_substep_T(), ERFPhysBCFunct_u::impose_vertical_xvel_bcs(), ERF::poisson_wall_dist(), and rotate_stress_tensor().

Here is the caller graph for this function:

◆ Compute_h_zeta_AtJface()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtJface ( const int &  i,
const int &  j,
const int &  k,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  cellSizeInv,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the zeta metric term at the j-face.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]cellSizeInvInverse cell spacing.
[in]z_ndNodal physical height field.
Returns
Zeta metric term.
349 {
350  amrex::Real met_h_zeta = myhalf * cellSizeInv[2] * ( (z_nd(i ,j,k+1) - z_nd(i ,j,k ))
351  + (z_nd(i+1,j,k+1) - z_nd(i+1,j,k )) );
352  return met_h_zeta;
353 }

Referenced by erf_make_tau_terms(), erf_slow_rhs_pre(), erf_substep_MT(), erf_substep_T(), ERFPhysBCFunct_v::impose_vertical_yvel_bcs(), and ERF::poisson_wall_dist().

Here is the caller graph for this function:

◆ Compute_h_zeta_AtKface()

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtKface ( const int &  i,
const int &  j,
const int &  k,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  cellSizeInv,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the zeta metric term at the k-face.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]cellSizeInvInverse cell spacing.
[in]z_ndNodal physical height field.
Returns
Zeta metric term.
419 {
420  amrex::Real met_h_zeta = amrex::Real(0.125) * cellSizeInv[2] *
421  ( (z_nd(i ,j ,k+1) - z_nd(i ,j ,k-1)) + (z_nd(i+1,j ,k+1) - z_nd(i+1,j ,k-1)) +
422  (z_nd(i ,j+1,k+1) - z_nd(i ,j+1,k-1)) + (z_nd(i+1,j+1,k+1) - z_nd(i+1,j+1,k-1)) );
423  return met_h_zeta;
424 }

Referenced by compute_gradp_interpz(), compute_gradp_z(), ImplicitDiffForStateLU_T(), ERF::poisson_wall_dist(), SubtractTerrainMetricImplicitPart_T_Impl(), and TerrainScalarDiffusionFluxAtKFace().

Here is the caller graph for this function:

◆ Compute_Z_AtCellCenter()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_Z_AtCellCenter ( const int &  i,
const int &  j,
const int &  k,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the physical height at the cell center.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]z_ndNodal physical height field.
Returns
Physical height at cell center.
714 {
715  const amrex::Real z_cc = amrex::Real(0.125)*( z_nd(i ,j ,k) + z_nd(i ,j ,k+1)
716  + z_nd(i+1,j ,k) + z_nd(i+1,j ,k+1)
717  + z_nd(i ,j+1,k) + z_nd(i ,j+1,k+1)
718  + z_nd(i+1,j+1,k) + z_nd(i+1,j+1,k+1));
719 
720  return z_cc;
721 }

Referenced by SurfaceLayer::fill_qsurf_with_qsat(), SurfaceLayer::fill_qsurf_with_skin_moisture(), sea_level_pressure_diagnostics::fill_sea_level_pressure(), SurfaceLayer::fill_tsurf_with_coupled_sst(), SurfaceLayer::fill_tsurf_with_sfc_sst(), SurfaceLayer::fill_tsurf_with_skin_temperature(), ERFPhysBCFunct_cons::impose_vertical_cons_bcs(), SurfaceLayer::init_tke_from_ustar(), and plotfile2d::sampled_field_value().

Here is the caller graph for this function:

◆ Compute_Z_AtWFace()

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_Z_AtWFace ( const int &  i,
const int &  j,
const int &  k,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the physical height at the W-face.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]z_ndNodal physical height field.
Returns
Physical height at W-face.
738 {
739  const amrex::Real z_wf = fourth*( z_nd(i ,j ,k) + z_nd(i+1,j ,k)
740  + z_nd(i ,j+1,k) + z_nd(i+1,j+1,k) );
741 
742  return z_wf;
743 }

Referenced by SurfaceLayer::fill_qsurf_with_qsat(), SurfaceLayer::fill_qsurf_with_skin_moisture(), sea_level_pressure_diagnostics::fill_sea_level_pressure(), SurfaceLayer::fill_tsurf_with_coupled_sst(), SurfaceLayer::fill_tsurf_with_sfc_sst(), SurfaceLayer::fill_tsurf_with_skin_temperature(), ERF::FillPlot2DVars(), get_dzmin_terrain(), OmegaFromW(), TerrainScalarDiffusionFluxAtKFace(), and WFromOmega().

Here is the caller graph for this function:

◆ Compute_Zrel_AtCellCenter()

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_Zrel_AtCellCenter ( const int &  i,
const int &  j,
const int &  k,
const amrex::Array4< const amrex::Real > &  z_nd 
)

Compute the relative height above the terrain surface at the cell center.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]z_ndNodal physical height field.
Returns
Relative height at cell center.
760 {
761  const amrex::Real z_cc = amrex::Real(0.125)*( z_nd(i ,j ,k) + z_nd(i ,j ,k+1) +
762  + z_nd(i+1,j ,k) + z_nd(i+1,j ,k+1)
763  + z_nd(i ,j+1,k) + z_nd(i ,j+1,k+1)
764  + z_nd(i+1,j+1,k) + z_nd(i+1,j+1,k+1));
765 
766  // Note: we assume the z_nd array spans from the bottom to top of the domain
767  // i.e. no domain decomposition across processors in vertical direction
768  const amrex::Real z0_cc = fourth*( z_nd(i ,j ,0) + z_nd(i ,j+1,0)
769  + z_nd(i+1,j ,0) + z_nd(i+1,j+1,0));
770 
771  return (z_cc - z0_cc);
772 }

Referenced by ComputeDiffusivityMRF(), ComputeDiffusivityMYJ(), ComputeDiffusivityMYNN25(), ComputeDiffusivityMYNNEDMF(), ComputeDiffusivityYSU(), ComputeDiffusivityYSUNew(), near_surface_diagnostics::fill(), SLM::Init(), SLM::initialize_zrefxy(), Radiation::mf_to_kokkos_buffers(), plotfile2d::sampled_field_value(), and NOAHMP::stage_forcing().

Here is the caller graph for this function:

◆ get_dzmin_terrain()

amrex::Real get_dzmin_terrain ( amrex::MultiFab &  z_phys_nd)

Compute the minimum vertical spacing with terrain.

Parameters
[in]z_phys_ndNodal physical height field.
Returns
Minimum vertical grid spacing.

◆ init_default_zphys()

void init_default_zphys ( int  lev,
const amrex::Geometry &  geom,
amrex::MultiFab &  z_phys_nd,
amrex::MultiFab &  z_phys_cc,
amrex::Real  z_offset = zero 
)

Routine to define default z_phys_nd and z_phys_cc

◆ init_fine_terrain_grid()

void init_fine_terrain_grid ( int  lev,
const amrex::Geometry &  geom,
amrex::MultiFab &  z_phys_nd,
amrex::Vector< amrex::Real > const &  z_levels_h,
FineTerrain  fine_terrain,
amrex::MultiFab const *  z_phys_interp 
)

Finish the terrain-fitted mesh on a fine level whose interior was set by interpolation from the coarse level (erf.terrain_smoothing != 0).

For FineTerrain::Transform this adds the fine-resolution terrain as a correction that decays linearly to zero at the top of the fine grids. For both modes it then fills the nodes outside the lateral domain boundary and the layer below the surface, which init_which_terrain_grid()'s BTF branch would otherwise have filled.

Parameters
[in]levLevel index.
[in]geomGeometry information.
[in,out]z_phys_ndNodal physical height field.
[in]z_levels_hHost z-levels.
[in]fine_terrainInterpolate or Transform.
[in]z_phys_interpMesh interpolated from the coarse level; see above.

◆ init_which_terrain_grid()

void init_which_terrain_grid ( int  lev,
const amrex::Geometry &  geom,
amrex::MultiFab &  z_phys_nd,
amrex::Vector< amrex::Real > const &  z_levels_h,
FineTerrain  fine_terrain = FineTerrain::None,
amrex::MultiFab const *  z_phys_interp = nullptr 
)

Initialize the terrain grid mapping.

Parameters
[in]levLevel index.
[in]geomGeometry information.
[out]z_phys_ndNodal physical height field.
[in]z_levels_hHost z-levels.
[in]fine_terrainHow a fine level with terrain_smoothing != 0 is to be built.
[in]z_phys_interpMesh interpolated from the coarse level; see above.

◆ init_zlevels()

void init_zlevels ( amrex::Vector< amrex::Vector< amrex::Real >> &  zlevels_stag,
amrex::Vector< amrex::Vector< amrex::Real >> &  stretched_dz_h,
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real >> &  stretched_dz_d,
amrex::Vector< amrex::Geometry > const &  geom,
amrex::Vector< amrex::IntVect > const &  ref_ratio,
const amrex::Real  grid_stretching_ratio,
const amrex::Real  zsurf,
const amrex::Real  dz0 
)

Utility routines for constructing terrain metric terms Initialize staggered z-levels and stretched vertical spacing.

Parameters
[out]zlevels_stagStaggered z-levels.
[out]stretched_dz_hHost stretched vertical spacing.
[out]stretched_dz_dDevice stretched vertical spacing.
[in]geomGeometry information.
[in]ref_ratioRefinement ratios.
[in]grid_stretching_ratioRatio for grid stretching; zero with a positive dz0 solves for the ratio that closes on the domain top.
[in]zsurfSurface height.
[in]dz0Initial vertical spacing.

◆ join_boxes_stacked_in_z()

amrex::BoxArray join_boxes_stacked_in_z ( const amrex::BoxArray &  ba)

The cells of a (cell-centered) BoxArray as boxes that are never stacked on each other: wherever a box sits on the top face of another, the run of cells in z that the two belong to becomes a single box. Returns ba itself when no two boxes of ba are stacked.

Parameters
[in]bacell-centered BoxArray

◆ make_terrain_fitted_coords()

void make_terrain_fitted_coords ( int  lev,
const amrex::Geometry &  geom,
amrex::MultiFab &  z_phys_nd,
amrex::Vector< amrex::Real > const &  z_levels_h,
amrex::GpuArray< ERF_BC, AMREX_SPACEDIM *2 > &  phys_bc_type,
FineTerrain  fine_terrain = FineTerrain::None,
amrex::MultiFab const *  z_phys_interp = nullptr 
)

Construct terrain-fitted coordinates.

Parameters
[in]levLevel index.
[in]geomGeometry information.
[out]z_phys_ndNodal physical height field.
[in]z_levels_hHost z-levels.
[in]phys_bc_typePhysical boundary condition types.
[in]fine_terrainHow a fine level with terrain_smoothing != 0 is to be built.
[in]z_phys_interpMesh interpolated from the coarse level before the fine terrain was written into the k=0 slab; required by, and only used for, FineTerrain::Transform.

◆ OmegaFromW()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real OmegaFromW ( int &  i,
int &  j,
int &  k,
amrex::Real  w,
const amrex::Array4< const amrex::Real > &  u_arr,
const amrex::Array4< const amrex::Real > &  v_arr,
const amrex::Array4< const amrex::Real > &  mf_u,
const amrex::Array4< const amrex::Real > &  mf_v,
const amrex::Array4< const amrex::Real > &  z_nd,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  dxInv 
)

Compute the contravariant vertical velocity omega from w.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]wVertical velocity.
[in]u_arrX-velocity array.
[in]v_arrY-velocity array.
[in]mf_uX-velocity map factor.
[in]mf_vY-velocity map factor.
[in]z_ndNodal physical height field.
[in]dxInvInverse cell spacing.
Returns
Contravariant vertical velocity.
805 {
806  // This is dh/dxi at hi and lo edges
807  amrex::Real z_x_p2 = Compute_Z_AtWFace(i+2,j,k,z_nd);
808  amrex::Real z_x_p1 = Compute_Z_AtWFace(i+1,j,k,z_nd);
809  amrex::Real z_x_m1 = Compute_Z_AtWFace(i-1,j,k,z_nd);
810  amrex::Real z_x_m2 = Compute_Z_AtWFace(i-2,j,k,z_nd);
811  amrex::Real met_xi = (amrex::Real(1.0/amrex::Real(12.0))*(z_x_m2 - z_x_p2)
812  + amrex::Real(8.0/amrex::Real(12.0))*(z_x_p1 - z_x_m1)) * dxInv[0];
813 
814  // This is dh/deta at hi and lo edges
815  amrex::Real z_y_p2 = Compute_Z_AtWFace(i,j+2,k,z_nd);
816  amrex::Real z_y_p1 = Compute_Z_AtWFace(i,j+1,k,z_nd);
817  amrex::Real z_y_m1 = Compute_Z_AtWFace(i,j-1,k,z_nd);
818  amrex::Real z_y_m2 = Compute_Z_AtWFace(i,j-2,k,z_nd);
819  amrex::Real met_eta = (amrex::Real(1.0/amrex::Real(12.0))*(z_y_m2 - z_y_p2)
820  + amrex::Real(8.0/amrex::Real(12.0))*(z_y_p1 - z_y_m1)) * dxInv[1];
821 
822  // Use extrapolation instead of interpolation if at the bottom boundary
823  amrex::Real u_hi = (k == 0) ? amrex::Real(1.5) * u_arr(i+1,j ,k ) - myhalf * u_arr(i+1,j ,k+1) :
824  myhalf * ( u_arr(i+1,j ,k-1) + u_arr(i+1,j ,k ) );
825  amrex::Real u_lo = (k == 0) ? amrex::Real(1.5) * u_arr(i ,j ,k ) - myhalf * u_arr(i ,j ,k+1) :
826  myhalf * ( u_arr(i ,j ,k-1) + u_arr(i ,j ,k ) );
827  amrex::Real mf_u_hi = mf_u(i+1,j,0);
828  amrex::Real mf_u_lo = mf_u(i ,j,0);
829 
830  amrex::Real v_hi = (k == 0) ? amrex::Real(1.5) * v_arr(i ,j+1,k ) - myhalf * v_arr(i ,j+1,k+1) :
831  myhalf * ( v_arr(i ,j+1,k-1) + v_arr(i ,j+1,k ) );
832  amrex::Real v_lo = (k == 0) ? amrex::Real(1.5) * v_arr(i ,j ,k ) - myhalf * v_arr(i ,j ,k+1) :
833  myhalf * ( v_arr(i ,j ,k-1) + v_arr(i ,j ,k ) );
834  amrex::Real mf_v_hi = mf_v(i,j+1,0);
835  amrex::Real mf_v_lo = mf_v(i,j ,0);
836 
837  amrex::Real u_met = met_xi * myhalf * ( u_hi*mf_u_hi + u_lo*mf_u_lo );
838  amrex::Real v_met = met_eta * myhalf * ( v_hi*mf_v_hi + v_lo*mf_v_lo );
839 
840  amrex::Real omega = w - u_met - v_met;
841  return omega;
842 }
Real w
Definition: ERF_Plotfile2DInterpolator.cpp:22
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_Z_AtWFace(const int &i, const int &j, const int &k, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:736
@ omega
Definition: ERF_Morrison.H:55

Referenced by erf_make_tau_terms(), erf_slow_rhs_pre(), erf_substep_MT(), erf_substep_T(), ERF::estTimeStep(), and ERF::project_momenta().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ rotate_scalar_flux()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE void rotate_scalar_flux ( const int &  i,
const int &  j,
const int &  klo,
const int &  ,
const amrex::Real &  flux,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  dxInv,
const amrex::Array4< const amrex::Real > &  zphys_arr,
const amrex::Array4< amrex::Real > &  phi1_arr,
const amrex::Array4< amrex::Real > &  phi2_arr,
const amrex::Array4< amrex::Real > &  phi3_arr 
)

Rotate a scalar flux vector into terrain-following coordinates.

Parameters
[in]ix-index
[in]jy-index
[in]kloz-index
[in]fluxScalar flux value.
[in]dxInvInverse cell spacing.
[in]zphys_arrPhysical height field.
[out]phi1_arrRotated flux component 1.
[out]phi2_arrRotated flux component 2.
[out]phi3_arrRotated flux component 3.
1063 {
1064  amrex::Real h_xi = Compute_h_xi_AtCellCenter(i, j, klo, dxInv, zphys_arr);
1065  amrex::Real h_eta = Compute_h_eta_AtCellCenter(i, j, klo, dxInv, zphys_arr);
1066  amrex::Real InvNorm = one / std::sqrt(one + h_xi*h_xi + h_eta*h_eta);
1067  phi1_arr(i,j,klo) = -h_xi * flux * InvNorm;
1068  phi2_arr(i,j,klo) = -h_eta * flux * InvNorm;
1069  phi3_arr(i,j,klo) = flux * InvNorm;
1070 }
const int klo
Definition: ERF_InitCustomPert_ABL.H:75
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:37
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtCellCenter(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:222
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtCellCenter(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:247

Referenced by SurfaceLayer::compute_SurfaceLayer_bcs().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ rotate_stress_tensor()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE void rotate_stress_tensor ( const int &  i,
const int &  j,
const int &  klo,
const int &  ,
const amrex::Real &  flux,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  dxInv,
const amrex::Array4< const amrex::Real > &  zphys_arr,
const amrex::Array4< const amrex::Real > &  u_arr,
const amrex::Array4< const amrex::Real > &  v_arr,
const amrex::Array4< const amrex::Real > &  w_arr,
const amrex::Array4< amrex::Real > &  ,
const amrex::Array4< amrex::Real > &  ,
const amrex::Array4< amrex::Real > &  ,
const amrex::Array4< amrex::Real > &  ,
const amrex::Array4< amrex::Real > &  ,
const amrex::Array4< amrex::Real > &  tau13_arr,
const amrex::Array4< amrex::Real > &  tau31_arr,
const amrex::Array4< amrex::Real > &  tau23_arr,
const amrex::Array4< amrex::Real > &  tau32_arr 
)

Rotate the stress tensor for the MOST model.

Parameters
[in]ix-index
[in]jy-index
[in]kloz-index
[in]fluxFlux value used for rotation.
[in]dxInvInverse cell spacing.
[in]zphys_arrPhysical height field.
[in]u_arrX-velocity array.
[in]v_arrY-velocity array.
[in]w_arrZ-velocity array.
[out]tau11_arrStress component tau11.
[out]tau22_arrStress component tau22.
[out]tau33_arrStress component tau33.
[out]tau12_arrStress component tau12.
[out]tau21_arrStress component tau21.
[out]tau13_arrStress component tau13.
[out]tau31_arrStress component tau31.
[out]tau23_arrStress component tau23.
[out]tau32_arrStress component tau32.
1116 {
1117  // Unit-normal vector
1118  amrex::Array1D<amrex::Real,0,2> n_hat;
1119 
1120  // Unit-tangent vectors
1121  amrex::Array1D<amrex::Real,0,2> u_t_hat;
1122 
1123  // Final basis vector for right-hand coord sys
1124  amrex::Array1D<amrex::Real,0,2> a_hat;
1125 
1126  // Rotation matrix
1127  amrex::Array2D<amrex::Real,0,2,0,2> R_mat;
1128 
1129  // Metric data
1130  amrex::Real h_xi = Compute_h_xi_AtIface(i, j, klo, dxInv, zphys_arr);
1131  amrex::Real h_eta = Compute_h_eta_AtIface(i, j, klo, dxInv, zphys_arr);
1132  amrex::Real h_zeta = Compute_h_zeta_AtIface(i, j, klo, dxInv, zphys_arr);
1133 
1134  // Populate the inward normal vector
1135  amrex::Real Inormn = one/std::sqrt(one + h_xi*h_xi + h_eta*h_eta);
1136  n_hat(0) = -Inormn*h_xi; n_hat(1) = -Inormn*h_eta; n_hat(2) = Inormn;
1137 
1138  // Populate the u_t vector (u_t = u - (u \cdot n)n)
1139  amrex::Real u = u_arr(i,j,klo);
1140  amrex::Real v = fourth * ( v_arr(i ,j,klo) + v_arr(i ,j+1,klo)
1141  + v_arr(i-1,j,klo) + v_arr(i-1,j+1,klo) );
1142  amrex::Real w = myhalf * ( w_arr(i ,j,klo) + w_arr(i-1,j ,klo) );
1143  amrex::Real u_dot_n = n_hat(0)*u + n_hat(1)*v + n_hat(2)*w;
1144  u_t_hat(0) = u - u_dot_n*n_hat(0);
1145  u_t_hat(1) = v - u_dot_n*n_hat(1);
1146  u_t_hat(2) = w - u_dot_n*n_hat(2);
1147  amrex::Real Norm_u_t = u_t_hat(0)*u_t_hat(0)
1148  + u_t_hat(1)*u_t_hat(1)
1149  + u_t_hat(2)*u_t_hat(2);
1150 
1151  // NOTE: the direction of the tangential velocity is undefined when that
1152  // velocity vanishes (a quiescent surface cell, or flow normal to the
1153  // terrain), so we cannot normalize. Leaving u_t_hat as the zero vector
1154  // is the only rotation-invariant choice, and it is the right limit for
1155  // a quiescent cell since the flux vanishes with the surface wind too.
1156  amrex::Real Inorm_u_t = (Norm_u_t > zero) ? one/std::sqrt(Norm_u_t) : zero;
1157  for (int icol(0); icol<3; ++icol) {
1158  u_t_hat(icol) *= Inorm_u_t;
1159  }
1160 
1161  // Populate the a_hat = n_hat X u_t_hat vector
1162  a_hat(0) = n_hat(1)*u_t_hat(2) - n_hat(2)*u_t_hat(1);
1163  a_hat(1) = -(n_hat(0)*u_t_hat(2) - n_hat(2)*u_t_hat(0));
1164  a_hat(2) = n_hat(0)*u_t_hat(1) - n_hat(1)*u_t_hat(0);
1165 
1166  // Copy column vectors into R_mat
1167  // NOTE: basis vectors form rows of R_mat
1168  int icol = 0;
1169  for (int jrow(0); jrow<3; ++jrow) {
1170  R_mat(icol,jrow) = u_t_hat(jrow);
1171  }
1172  icol = 1;
1173  for (int jrow(0); jrow<3; ++jrow) {
1174  R_mat(icol,jrow) = a_hat(jrow);
1175  }
1176  icol = 2;
1177  for (int jrow(0); jrow<3; ++jrow) {
1178  R_mat(icol,jrow) = n_hat(jrow);
1179  }
1180 
1181  // Body-fixed stresses
1182  amrex::Real T11 = two*R_mat(0,0)*R_mat(2,0)*flux;
1183  amrex::Real T22 = two*R_mat(0,1)*R_mat(2,1)*flux;
1184  //amrex::Real T33 = two*R_mat(0,2)*R_mat(2,2)*flux;
1185  amrex::Real T12 = (R_mat(0,0)*R_mat(2,1) + R_mat(2,0)*R_mat(0,1))*flux;
1186  amrex::Real T13 = (R_mat(0,0)*R_mat(2,2) + R_mat(0,2)*R_mat(2,0))*flux;
1187  amrex::Real T23 = (R_mat(0,2)*R_mat(2,1) + R_mat(0,1)*R_mat(2,2))*flux;
1188 
1189  // Populate the stress tensor (apply JT)
1190  // NOTE: We cannot set the stresses that do not live at the
1191  // bottom face --- e.g., tau11/22/33/12/21.
1192  tau13_arr(i,j,klo) = -h_xi*T11 - h_eta*T12 + T13;
1193  tau31_arr(i,j,klo) = h_zeta*T13;
1194 
1195  tau23_arr(i,j,klo) = -h_xi*T12 - h_eta*T22 + T23;
1196  tau32_arr(i,j,klo) = h_zeta*T23;
1197 }
constexpr amrex::Real two
Definition: ERF_NumericalConstants.H:38
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:36
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_zeta_AtIface(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:276
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_eta_AtIface(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:323
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real Compute_h_xi_AtIface(const int &i, const int &j, const int &k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &cellSizeInv, const amrex::Array4< const amrex::Real > &z_nd)
Definition: ERF_TerrainMetrics.H:299

Referenced by SurfaceLayer::compute_SurfaceLayer_bcs().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ update_stretched_dz()

void update_stretched_dz ( int  lev,
amrex::Vector< amrex::Vector< amrex::Real >> const &  zlevels_stag,
amrex::Vector< amrex::Vector< amrex::Real >> &  stretched_dz_h,
amrex::Vector< amrex::Gpu::DeviceVector< amrex::Real >> &  stretched_dz_d 
)

Re-derive the stretched vertical spacing at one level from the nominal z-levels.

init_zlevels() fills both zlevels_stag and stretched_dz_* together, but zlevels_stag can be replaced after construction (init_from_wrfinput() does this when erf.avg_grid_faces_to_nodes = false, and restart reads it back from the checkpoint). Call this whenever zlevels_stag[lev] changes so that the cell heights never drift out of sync with the levels they are supposed to describe.

Parameters
[in]levLevel index.
[in]zlevels_stagStaggered z-levels (the source of truth).
[out]stretched_dz_hHost stretched vertical spacing.
[out]stretched_dz_dDevice stretched vertical spacing.

◆ validate_flat_terrain()

void validate_flat_terrain ( int  lev,
const amrex::MultiFab &  z_phys_nd,
const amrex::Vector< amrex::Real > &  z_levels_h 
)

Verify that a fitted mesh is horizontally flat and follows z_levels_h.

◆ WFromOmega()

AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real WFromOmega ( int &  i,
int &  j,
int &  k,
amrex::Real  omega,
const amrex::Array4< const amrex::Real > &  u_arr,
const amrex::Array4< const amrex::Real > &  v_arr,
const amrex::Array4< const amrex::Real > &  mf_u,
const amrex::Array4< const amrex::Real > &  mf_v,
const amrex::Array4< const amrex::Real > &  z_nd,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  dxInv 
)

Compute the vertical velocity w from the contravariant omega.

Parameters
[in]ix-index
[in]jy-index
[in]kz-index
[in]omegaContravariant vertical velocity.
[in]u_arrX-velocity array.
[in]v_arrY-velocity array.
[in]mf_uX-velocity map factor.
[in]mf_vY-velocity map factor.
[in]z_ndNodal physical height field.
[in]dxInvInverse cell spacing.
Returns
Vertical velocity w.
870 {
871  // This is dh/dxi at hi and lo edges
872  amrex::Real z_x_p2 = Compute_Z_AtWFace(i+2,j,k,z_nd);
873  amrex::Real z_x_p1 = Compute_Z_AtWFace(i+1,j,k,z_nd);
874  amrex::Real z_x_m1 = Compute_Z_AtWFace(i-1,j,k,z_nd);
875  amrex::Real z_x_m2 = Compute_Z_AtWFace(i-2,j,k,z_nd);
876  amrex::Real met_xi = (amrex::Real(1.0/amrex::Real(12.0))*(z_x_m2 - z_x_p2)
877  + amrex::Real(8.0/amrex::Real(12.0))*(z_x_p1 - z_x_m1)) * dxInv[0];
878 
879  // This is dh/deta at hi and lo edges
880  amrex::Real z_y_p2 = Compute_Z_AtWFace(i,j+2,k,z_nd);
881  amrex::Real z_y_p1 = Compute_Z_AtWFace(i,j+1,k,z_nd);
882  amrex::Real z_y_m1 = Compute_Z_AtWFace(i,j-1,k,z_nd);
883  amrex::Real z_y_m2 = Compute_Z_AtWFace(i,j-2,k,z_nd);
884  amrex::Real met_eta = (amrex::Real(1.0/amrex::Real(12.0))*(z_y_m2 - z_y_p2)
885  + amrex::Real(8.0/amrex::Real(12.0))*(z_y_p1 - z_y_m1)) * dxInv[1];
886 
887  // Use extrapolation instead of interpolation if at the bottom boundary
888  amrex::Real u_hi = (k == 0) ? amrex::Real(1.5) * u_arr(i+1,j ,k ) - myhalf * u_arr(i+1,j ,k+1) :
889  myhalf * ( u_arr(i+1,j ,k-1) + u_arr(i+1,j ,k ) );
890  amrex::Real u_lo = (k == 0) ? amrex::Real(1.5) * u_arr(i ,j ,k ) - myhalf * u_arr(i ,j ,k+1) :
891  myhalf * ( u_arr(i ,j ,k-1) + u_arr(i ,j ,k ) );
892  amrex::Real mf_u_hi = mf_u(i+1,j,0);
893  amrex::Real mf_u_lo = mf_u(i ,j,0);
894 
895  amrex::Real v_hi = (k == 0) ? amrex::Real(1.5) * v_arr(i ,j+1,k ) - myhalf * v_arr(i ,j+1,k+1) :
896  myhalf * ( v_arr(i ,j+1,k-1) + v_arr(i ,j+1,k ) );
897  amrex::Real v_lo = (k == 0) ? amrex::Real(1.5) * v_arr(i ,j ,k ) - myhalf * v_arr(i ,j ,k+1) :
898  myhalf * ( v_arr(i ,j ,k-1) + v_arr(i ,j ,k ) );
899  amrex::Real mf_v_hi = mf_v(i,j+1,0);
900  amrex::Real mf_v_lo = mf_v(i,j ,0);
901 
902  amrex::Real u_met = met_xi * myhalf * ( u_hi*mf_u_hi + u_lo*mf_u_lo );
903  amrex::Real v_met = met_eta * myhalf * ( v_hi*mf_v_hi + v_lo*mf_v_lo );
904 
905  amrex::Real w = omega + u_met + v_met;
906  return w;
907 }

Referenced by erf_substep_MT(), erf_substep_T(), if(), ERFPhysBCFunct_w::impose_lateral_zvel_bcs(), ERFPhysBCFunct_w::impose_vertical_zvel_bcs(), ParallelFor(), and ERF::project_momenta().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ which_fine_terrain()

FineTerrain which_fine_terrain ( )

Read erf.amr_terrain_refinement and translate it into a FineTerrain.

Aborts on any value other than "interpolate" or "transform" so that a typo cannot silently select a path that leaves the fine mesh untransformed.

Translate erf.amr_terrain_refinement into a FineTerrain.

452 {
453  ParmParse pp("erf");
454  std::string amr_terrain_refinement = "interpolate";
455  pp.query("amr_terrain_refinement", amr_terrain_refinement);
456 
457  if (amr_terrain_refinement == "interpolate") {
459  } else if (amr_terrain_refinement == "transform") {
460  return FineTerrain::Transform;
461  }
462 
463  Abort("erf.amr_terrain_refinement = " + amr_terrain_refinement +
464  " is not recognized; it must be \"interpolate\" or \"transform\"");
466 }
ParmParse pp("prob")

Referenced by ERF::init_zphys(), and ERF::remake_zphys().

Here is the call graph for this function:
Here is the caller graph for this function: