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 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_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_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_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_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_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_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

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

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.
243 {
244  amrex::Real dyInv = cellSizeInv[1];
245  amrex::Real met_h_eta = fourth * dyInv *
246  ( 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)
247  - z_nd(i,j ,k) - z_nd(i+1,j ,k) - z_nd(i,j ,k+1) - z_nd(i+1,j ,k+1) );
248  return met_h_eta;
249 }
constexpr amrex::Real fourth
Definition: ERF_NumericalConstants.H:35
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.
684 {
685  amrex::Real dyInv = cellSizeInv[1];
686  amrex::Real met_h_eta = fourth * dyInv *
687  ( z_nd(i+1,j+1,k) + z_nd(i,j+1,k)
688  - z_nd(i+1,j-1,k) - z_nd(i,j-1,k) );
689  return met_h_eta;
690 }

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.
612 {
613  amrex::Real dyInv = cellSizeInv[1];
614  amrex::Real met_h_eta = dyInv * ( z_nd(i,j+1,k) - z_nd(i,j,k) );
615  return met_h_eta;
616 }

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.
536 {
537  amrex::Real dyInv = cellSizeInv[1];
538  amrex::Real met_h_eta = fourth * dyInv *
539  ( z_nd(i,j+1,k) + z_nd(i,j+1,k+1)
540  - z_nd(i,j-1,k) - z_nd(i,j-1,k+1) );
541  return met_h_eta;
542 }

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.
319 {
320  amrex::Real met_h_eta = myhalf * cellSizeInv[1] * ( (z_nd(i,j+1,k ) - z_nd(i,j,k ))
321  + (z_nd(i,j+1,k+1) - z_nd(i,j,k+1)) );
322  return met_h_eta;
323 }
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:34

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_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.
388 {
389  amrex::Real met_h_eta = amrex::Real(0.125) * cellSizeInv[1] *
390  ( (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)) +
391  (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)) );
392  return met_h_eta;
393 }

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

Here is the caller graph for this function:

◆ Compute_h_eta_AtKface()

AMREX_GPU_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.
459 {
460  amrex::Real met_h_eta = myhalf * cellSizeInv[1] * ( (z_nd(i ,j+1,k) - z_nd(i ,j,k))
461  + (z_nd(i+1,j+1,k) - z_nd(i+1,j,k)) );
462  return met_h_eta;
463 }

Referenced by DiffusionSrcForState_T(), and ERF::poisson_wall_dist().

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.
218 {
219  amrex::Real dxInv = cellSizeInv[0];
220  amrex::Real met_h_xi = fourth * dxInv *
221  ( 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)
222  - z_nd(i ,j,k) - z_nd(i ,j+1,k) - z_nd(i ,j,k+1) - z_nd(i ,j+1,k+1) );
223  return met_h_xi;
224 }
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.
661 {
662  amrex::Real dxInv = cellSizeInv[0];
663  amrex::Real met_h_xi = dxInv * ( z_nd(i+1,j,k) - z_nd(i,j,k) );
664  return met_h_xi;
665 }

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.
587 {
588  amrex::Real dxInv = cellSizeInv[0];
589  amrex::Real met_h_xi = fourth * dxInv *
590  ( z_nd(i+1,j+1,k) + z_nd(i+1,j ,k)
591  - z_nd(i-1,j+1,k) - z_nd(i-1,j ,k) );
592  return met_h_xi;
593 }

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.
511 {
512  amrex::Real dxInv = cellSizeInv[0];
513  amrex::Real met_h_xi = fourth * dxInv *
514  ( z_nd(i+1,j,k) + z_nd(i+1,j,k+1)
515  - z_nd(i-1,j,k) - z_nd(i-1,j,k+1) );
516  return met_h_xi;
517 }

Referenced by ComputeStrain_T().

Here is the caller graph for this function:

◆ Compute_h_xi_AtIface()

AMREX_GPU_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.
295 {
296  amrex::Real met_h_xi = amrex::Real(0.125) * cellSizeInv[0] * (
297  (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)) +
298  (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)) );
299  return met_h_xi;
300 }

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

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.
365 {
366  amrex::Real met_h_xi = myhalf * cellSizeInv[0] * ( (z_nd(i+1,j,k ) - z_nd(i,j,k ))
367  + (z_nd(i+1,j,k+1) - z_nd(i,j,k+1)) );
368  return met_h_xi;
369 }

Referenced by ERFPhysBCFunct_v::impose_vertical_yvel_bcs().

Here is the caller graph for this function:

◆ Compute_h_xi_AtKface()

AMREX_GPU_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.
436 {
437  amrex::Real met_h_xi = myhalf * cellSizeInv[0] * ( (z_nd(i+1,j ,k) - z_nd(i,j ,k))
438  + (z_nd(i+1,j+1,k) - z_nd(i,j+1,k)) );
439  return met_h_xi;
440 }

Referenced by DiffusionSrcForState_T(), and ERF::poisson_wall_dist().

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.
193 {
194  amrex::Real dzInv = cellSizeInv[2];
195  amrex::Real met_h_zeta = fourth * dzInv *
196  ( 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)
197  - z_nd(i+1,j,k ) - z_nd(i+1,j+1,k ) - z_nd(i,j,k ) - z_nd(i,j+1,k ) );
198  return met_h_zeta;
199 }

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.
637 {
638  amrex::Real dzInv = cellSizeInv[2];
639  amrex::Real met_h_zeta = fourth * dzInv * ( z_nd(i,j,k+1) + z_nd(i+1,j,k+1)
640  - z_nd(i,j,k-1) - z_nd(i+1,j,k-1) );
641  return met_h_zeta;
642 }

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.
563 {
564  amrex::Real dzInv = cellSizeInv[2];
565  amrex::Real met_h_zeta = fourth * dzInv * ( z_nd(i,j,k+1) + z_nd(i,j+1,k+1)
566  - z_nd(i,j,k-1) - z_nd(i,j+1,k-1) );
567  return met_h_zeta;
568 }

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.
488 {
489  amrex::Real dzInv = cellSizeInv[2];
490  amrex::Real met_h_zeta = dzInv * (z_nd(i,j,k+1) - z_nd(i,j,k));
491  return met_h_zeta;
492 }

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.
272 {
273  amrex::Real met_h_zeta = myhalf * cellSizeInv[2] * ( (z_nd(i,j ,k+1) - z_nd(i,j ,k))
274  + (z_nd(i,j+1,k+1) - z_nd(i,j+1,k)) );
275  return met_h_zeta;
276 }

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.
342 {
343  amrex::Real met_h_zeta = myhalf * cellSizeInv[2] * ( (z_nd(i ,j,k+1) - z_nd(i ,j,k ))
344  + (z_nd(i+1,j,k+1) - z_nd(i+1,j,k )) );
345  return met_h_zeta;
346 }

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_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.
412 {
413  amrex::Real met_h_zeta = amrex::Real(0.125) * cellSizeInv[2] *
414  ( (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)) +
415  (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)) );
416  return met_h_zeta;
417 }

Referenced by compute_gradp_interpz(), compute_gradp_z(), DiffusionSrcForState_T(), ImplicitDiffForMomLU_T(), ImplicitDiffForStateLU_T(), and ERF::poisson_wall_dist().

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.
707 {
708  const amrex::Real z_cc = amrex::Real(0.125)*( z_nd(i ,j ,k) + z_nd(i ,j ,k+1)
709  + z_nd(i+1,j ,k) + z_nd(i+1,j ,k+1)
710  + z_nd(i ,j+1,k) + z_nd(i ,j+1,k+1)
711  + z_nd(i+1,j+1,k) + z_nd(i+1,j+1,k+1));
712 
713  return z_cc;
714 }

Referenced by SurfaceLayer::fill_qsurf_with_qsat(), sea_level_pressure_diagnostics::fill_sea_level_pressure(), SurfaceLayer::fill_tsurf_with_coupled_sst(), SurfaceLayer::fill_tsurf_with_sfc_sst(), 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_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.
731 {
732  const amrex::Real z_wf = fourth*( z_nd(i ,j ,k) + z_nd(i+1,j ,k)
733  + z_nd(i ,j+1,k) + z_nd(i+1,j+1,k) );
734 
735  return z_wf;
736 }

Referenced by DiffusionSrcForState_T(), SurfaceLayer::fill_qsurf_with_qsat(), sea_level_pressure_diagnostics::fill_sea_level_pressure(), SurfaceLayer::fill_tsurf_with_coupled_sst(), SurfaceLayer::fill_tsurf_with_sfc_sst(), ERF::FillPlot2DVars(), get_dzmin_terrain(), OmegaFromW(), 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.
753 {
754  const amrex::Real z_cc = amrex::Real(0.125)*( z_nd(i ,j ,k) + z_nd(i ,j ,k+1) +
755  + z_nd(i+1,j ,k) + z_nd(i+1,j ,k+1)
756  + z_nd(i ,j+1,k) + z_nd(i ,j+1,k+1)
757  + z_nd(i+1,j+1,k) + z_nd(i+1,j+1,k+1));
758 
759  // Note: we assume the z_nd array spans from the bottom to top of the domain
760  // i.e. no domain decomposition across processors in vertical direction
761  const amrex::Real z0_cc = fourth*( z_nd(i ,j ,0) + z_nd(i ,j+1,0)
762  + z_nd(i+1,j ,0) + z_nd(i+1,j+1,0));
763 
764  return (z_cc - z0_cc);
765 }

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

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.
[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.
798 {
799  // This is dh/dxi at hi and lo edges
800  amrex::Real z_x_p2 = Compute_Z_AtWFace(i+2,j,k,z_nd);
801  amrex::Real z_x_p1 = Compute_Z_AtWFace(i+1,j,k,z_nd);
802  amrex::Real z_x_m1 = Compute_Z_AtWFace(i-1,j,k,z_nd);
803  amrex::Real z_x_m2 = Compute_Z_AtWFace(i-2,j,k,z_nd);
804  amrex::Real met_xi = (amrex::Real(1.0/amrex::Real(12.0))*(z_x_m2 - z_x_p2)
805  + amrex::Real(8.0/amrex::Real(12.0))*(z_x_p1 - z_x_m1)) * dxInv[0];
806 
807  // This is dh/deta at hi and lo edges
808  amrex::Real z_y_p2 = Compute_Z_AtWFace(i,j+2,k,z_nd);
809  amrex::Real z_y_p1 = Compute_Z_AtWFace(i,j+1,k,z_nd);
810  amrex::Real z_y_m1 = Compute_Z_AtWFace(i,j-1,k,z_nd);
811  amrex::Real z_y_m2 = Compute_Z_AtWFace(i,j-2,k,z_nd);
812  amrex::Real met_eta = (amrex::Real(1.0/amrex::Real(12.0))*(z_y_m2 - z_y_p2)
813  + amrex::Real(8.0/amrex::Real(12.0))*(z_y_p1 - z_y_m1)) * dxInv[1];
814 
815  // Use extrapolation instead of interpolation if at the bottom boundary
816  amrex::Real u_hi = (k == 0) ? amrex::Real(1.5) * u_arr(i+1,j ,k ) - myhalf * u_arr(i+1,j ,k+1) :
817  myhalf * ( u_arr(i+1,j ,k-1) + u_arr(i+1,j ,k ) );
818  amrex::Real u_lo = (k == 0) ? amrex::Real(1.5) * u_arr(i ,j ,k ) - myhalf * u_arr(i ,j ,k+1) :
819  myhalf * ( u_arr(i ,j ,k-1) + u_arr(i ,j ,k ) );
820  amrex::Real mf_u_hi = mf_u(i+1,j,0);
821  amrex::Real mf_u_lo = mf_u(i ,j,0);
822 
823  amrex::Real v_hi = (k == 0) ? amrex::Real(1.5) * v_arr(i ,j+1,k ) - myhalf * v_arr(i ,j+1,k+1) :
824  myhalf * ( v_arr(i ,j+1,k-1) + v_arr(i ,j+1,k ) );
825  amrex::Real v_lo = (k == 0) ? amrex::Real(1.5) * v_arr(i ,j ,k ) - myhalf * v_arr(i ,j ,k+1) :
826  myhalf * ( v_arr(i ,j ,k-1) + v_arr(i ,j ,k ) );
827  amrex::Real mf_v_hi = mf_v(i,j+1,0);
828  amrex::Real mf_v_lo = mf_v(i,j ,0);
829 
830  amrex::Real u_met = met_xi * myhalf * ( u_hi*mf_u_hi + u_lo*mf_u_lo );
831  amrex::Real v_met = met_eta * myhalf * ( v_hi*mf_v_hi + v_lo*mf_v_lo );
832 
833  amrex::Real omega = w - u_met - v_met;
834  return omega;
835 }
Real w
Definition: ERF_Plotfile2DInterpolator.cpp:22
AMREX_GPU_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:729
@ 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.
1056 {
1057  amrex::Real h_xi = Compute_h_xi_AtCellCenter(i, j, klo, dxInv, zphys_arr);
1058  amrex::Real h_eta = Compute_h_eta_AtCellCenter(i, j, klo, dxInv, zphys_arr);
1059  amrex::Real InvNorm = one / std::sqrt(one + h_xi*h_xi + h_eta*h_eta);
1060  phi1_arr(i,j,klo) = -h_xi * flux * InvNorm;
1061  phi2_arr(i,j,klo) = -h_eta * flux * InvNorm;
1062  phi3_arr(i,j,klo) = flux * InvNorm;
1063 }
const int klo
Definition: ERF_InitCustomPert_ABL.H:75
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:30
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:215
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:240

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.
1109 {
1110  // Unit-normal vector
1111  amrex::Array1D<amrex::Real,0,2> n_hat;
1112 
1113  // Unit-tangent vectors
1114  amrex::Array1D<amrex::Real,0,2> u_t_hat;
1115 
1116  // Final basis vector for right-hand coord sys
1117  amrex::Array1D<amrex::Real,0,2> a_hat;
1118 
1119  // Rotation matrix
1120  amrex::Array2D<amrex::Real,0,2,0,2> R_mat;
1121 
1122  // Metric data
1123  amrex::Real h_xi = Compute_h_xi_AtIface(i, j, klo, dxInv, zphys_arr);
1124  amrex::Real h_eta = Compute_h_eta_AtIface(i, j, klo, dxInv, zphys_arr);
1125  amrex::Real h_zeta = Compute_h_zeta_AtIface(i, j, klo, dxInv, zphys_arr);
1126 
1127  // Populate the inward normal vector
1128  amrex::Real Inormn = one/std::sqrt(one + h_xi*h_xi + h_eta*h_eta);
1129  n_hat(0) = -Inormn*h_xi; n_hat(1) = -Inormn*h_eta; n_hat(2) = Inormn;
1130 
1131  // Populate the u_t vector (u_t = u - (u \cdot n)n)
1132  amrex::Real u = u_arr(i,j,klo);
1133  amrex::Real v = fourth * ( v_arr(i ,j,klo) + v_arr(i ,j+1,klo)
1134  + v_arr(i-1,j,klo) + v_arr(i-1,j+1,klo) );
1135  amrex::Real w = myhalf * ( w_arr(i ,j,klo) + w_arr(i-1,j ,klo) );
1136  amrex::Real u_dot_n = n_hat(0)*u + n_hat(1)*v + n_hat(2)*w;
1137  u_t_hat(0) = u - u_dot_n*n_hat(0);
1138  u_t_hat(1) = v - u_dot_n*n_hat(1);
1139  u_t_hat(2) = w - u_dot_n*n_hat(2);
1140  amrex::Real Norm_u_t = u_t_hat(0)*u_t_hat(0)
1141  + u_t_hat(1)*u_t_hat(1)
1142  + u_t_hat(2)*u_t_hat(2);
1143 
1144  // NOTE: the direction of the tangential velocity is undefined when that
1145  // velocity vanishes (a quiescent surface cell, or flow normal to the
1146  // terrain), so we cannot normalize. Leaving u_t_hat as the zero vector
1147  // is the only rotation-invariant choice, and it is the right limit for
1148  // a quiescent cell since the flux vanishes with the surface wind too.
1149  amrex::Real Inorm_u_t = (Norm_u_t > zero) ? one/std::sqrt(Norm_u_t) : zero;
1150  for (int icol(0); icol<3; ++icol) {
1151  u_t_hat(icol) *= Inorm_u_t;
1152  }
1153 
1154  // Populate the a_hat = n_hat X u_t_hat vector
1155  a_hat(0) = n_hat(1)*u_t_hat(2) - n_hat(2)*u_t_hat(1);
1156  a_hat(1) = -(n_hat(0)*u_t_hat(2) - n_hat(2)*u_t_hat(0));
1157  a_hat(2) = n_hat(0)*u_t_hat(1) - n_hat(1)*u_t_hat(0);
1158 
1159  // Copy column vectors into R_mat
1160  // NOTE: basis vectors form rows of R_mat
1161  int icol = 0;
1162  for (int jrow(0); jrow<3; ++jrow) {
1163  R_mat(icol,jrow) = u_t_hat(jrow);
1164  }
1165  icol = 1;
1166  for (int jrow(0); jrow<3; ++jrow) {
1167  R_mat(icol,jrow) = a_hat(jrow);
1168  }
1169  icol = 2;
1170  for (int jrow(0); jrow<3; ++jrow) {
1171  R_mat(icol,jrow) = n_hat(jrow);
1172  }
1173 
1174  // Body-fixed stresses
1175  amrex::Real T11 = two*R_mat(0,0)*R_mat(2,0)*flux;
1176  amrex::Real T22 = two*R_mat(0,1)*R_mat(2,1)*flux;
1177  //amrex::Real T33 = two*R_mat(0,2)*R_mat(2,2)*flux;
1178  amrex::Real T12 = (R_mat(0,0)*R_mat(2,1) + R_mat(2,0)*R_mat(0,1))*flux;
1179  amrex::Real T13 = (R_mat(0,0)*R_mat(2,2) + R_mat(0,2)*R_mat(2,0))*flux;
1180  amrex::Real T23 = (R_mat(0,2)*R_mat(2,1) + R_mat(0,1)*R_mat(2,2))*flux;
1181 
1182  // Populate the stress tensor (apply JT)
1183  // NOTE: We cannot set the stresses that do not live at the
1184  // bottom face --- e.g., tau11/22/33/12/21.
1185  tau13_arr(i,j,klo) = -h_xi*T11 - h_eta*T12 + T13;
1186  tau31_arr(i,j,klo) = h_zeta*T13;
1187 
1188  tau23_arr(i,j,klo) = -h_xi*T12 - h_eta*T22 + T23;
1189  tau32_arr(i,j,klo) = h_zeta*T23;
1190 }
constexpr amrex::Real two
Definition: ERF_NumericalConstants.H:31
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:29
AMREX_GPU_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:292
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:269
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:316

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.

◆ 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.
863 {
864  // This is dh/dxi at hi and lo edges
865  amrex::Real z_x_p2 = Compute_Z_AtWFace(i+2,j,k,z_nd);
866  amrex::Real z_x_p1 = Compute_Z_AtWFace(i+1,j,k,z_nd);
867  amrex::Real z_x_m1 = Compute_Z_AtWFace(i-1,j,k,z_nd);
868  amrex::Real z_x_m2 = Compute_Z_AtWFace(i-2,j,k,z_nd);
869  amrex::Real met_xi = (amrex::Real(1.0/amrex::Real(12.0))*(z_x_m2 - z_x_p2)
870  + amrex::Real(8.0/amrex::Real(12.0))*(z_x_p1 - z_x_m1)) * dxInv[0];
871 
872  // This is dh/deta at hi and lo edges
873  amrex::Real z_y_p2 = Compute_Z_AtWFace(i,j+2,k,z_nd);
874  amrex::Real z_y_p1 = Compute_Z_AtWFace(i,j+1,k,z_nd);
875  amrex::Real z_y_m1 = Compute_Z_AtWFace(i,j-1,k,z_nd);
876  amrex::Real z_y_m2 = Compute_Z_AtWFace(i,j-2,k,z_nd);
877  amrex::Real met_eta = (amrex::Real(1.0/amrex::Real(12.0))*(z_y_m2 - z_y_p2)
878  + amrex::Real(8.0/amrex::Real(12.0))*(z_y_p1 - z_y_m1)) * dxInv[1];
879 
880  // Use extrapolation instead of interpolation if at the bottom boundary
881  amrex::Real u_hi = (k == 0) ? amrex::Real(1.5) * u_arr(i+1,j ,k ) - myhalf * u_arr(i+1,j ,k+1) :
882  myhalf * ( u_arr(i+1,j ,k-1) + u_arr(i+1,j ,k ) );
883  amrex::Real u_lo = (k == 0) ? amrex::Real(1.5) * u_arr(i ,j ,k ) - myhalf * u_arr(i ,j ,k+1) :
884  myhalf * ( u_arr(i ,j ,k-1) + u_arr(i ,j ,k ) );
885  amrex::Real mf_u_hi = mf_u(i+1,j,0);
886  amrex::Real mf_u_lo = mf_u(i ,j,0);
887 
888  amrex::Real v_hi = (k == 0) ? amrex::Real(1.5) * v_arr(i ,j+1,k ) - myhalf * v_arr(i ,j+1,k+1) :
889  myhalf * ( v_arr(i ,j+1,k-1) + v_arr(i ,j+1,k ) );
890  amrex::Real v_lo = (k == 0) ? amrex::Real(1.5) * v_arr(i ,j ,k ) - myhalf * v_arr(i ,j ,k+1) :
891  myhalf * ( v_arr(i ,j ,k-1) + v_arr(i ,j ,k ) );
892  amrex::Real mf_v_hi = mf_v(i,j+1,0);
893  amrex::Real mf_v_lo = mf_v(i,j ,0);
894 
895  amrex::Real u_met = met_xi * myhalf * ( u_hi*mf_u_hi + u_lo*mf_u_lo );
896  amrex::Real v_met = met_eta * myhalf * ( v_hi*mf_v_hi + v_lo*mf_v_lo );
897 
898  amrex::Real w = omega + u_met + v_met;
899  return w;
900 }

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.

413 {
414  ParmParse pp("erf");
415  std::string amr_terrain_refinement = "interpolate";
416  pp.query("amr_terrain_refinement", amr_terrain_refinement);
417 
418  if (amr_terrain_refinement == "interpolate") {
420  } else if (amr_terrain_refinement == "transform") {
421  return FineTerrain::Transform;
422  }
423 
424  Abort("erf.amr_terrain_refinement = " + amr_terrain_refinement +
425  " is not recognized; it must be \"interpolate\" or \"transform\"");
427 }
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: