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 <ERF_Constants.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)
 
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_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 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 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 > &tau11_arr, const amrex::Array4< amrex::Real > &tau22_arr, const amrex::Array4< amrex::Real > &tau33_arr, const amrex::Array4< amrex::Real > &tau12_arr, const amrex::Array4< amrex::Real > &tau21_arr, 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

56  {
57  None, //!< caller has not prepared a fine mesh from the coarse level
58  Interpolate, //!< use the coordinates interpolated from the coarse level as-is
59  Transform //!< add the fine terrain as a correction that decays with height
60 };
@ 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.
232 {
233  amrex::Real dyInv = cellSizeInv[1];
234  amrex::Real met_h_eta = fourth * dyInv *
235  ( 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)
236  -z_nd(i,j ,k) - z_nd(i+1,j ,k) - z_nd(i,j ,k+1) - z_nd(i+1,j ,k+1) );
237  return met_h_eta;
238 }
constexpr amrex::Real fourth
Definition: ERF_Constants.H:14
amrex::Real Real
Definition: ERF_ShocInterface.H:19

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

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.
673 {
674  amrex::Real dyInv = cellSizeInv[1];
675  amrex::Real met_h_eta = fourth * dyInv *
676  ( z_nd(i+1,j+1,k) + z_nd(i,j+1,k)
677  -z_nd(i+1,j-1,k) - z_nd(i,j-1,k) );
678  return met_h_eta;
679 }

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.
601 {
602  amrex::Real dyInv = cellSizeInv[1];
603  amrex::Real met_h_eta = dyInv * ( z_nd(i,j+1,k) - z_nd(i,j,k) );
604  return met_h_eta;
605 }

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.
525 {
526  amrex::Real dyInv = cellSizeInv[1];
527  amrex::Real met_h_eta = fourth * dyInv *
528  ( z_nd(i,j+1,k) + z_nd(i,j+1,k+1)
529  -z_nd(i,j-1,k) - z_nd(i,j-1,k+1) );
530  return met_h_eta;
531 }

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.
308 {
309  amrex::Real met_h_eta = myhalf * cellSizeInv[1] * ( (z_nd(i,j+1,k ) - z_nd(i,j,k ))
310  + (z_nd(i,j+1,k+1) - z_nd(i,j,k+1)) );
311  return met_h_eta;
312 }
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13

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.
377 {
378  amrex::Real met_h_eta = amrex::Real(0.125) * cellSizeInv[1] *
379  ( (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)) +
380  (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)) );
381  return met_h_eta;
382 }

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.
448 {
449  amrex::Real met_h_eta = myhalf * cellSizeInv[1] * ( (z_nd(i ,j+1,k) - z_nd(i ,j,k))
450  + (z_nd(i+1,j+1,k) - z_nd(i+1,j,k)) );
451  return met_h_eta;
452 }

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.
207 {
208  amrex::Real dxInv = cellSizeInv[0];
209  amrex::Real met_h_xi = fourth * dxInv *
210  ( 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)
211  -z_nd(i ,j,k) - z_nd(i ,j+1,k) - z_nd(i ,j,k+1) - z_nd(i ,j+1,k+1) );
212  return met_h_xi;
213 }
amrex::GpuArray< Real, AMREX_SPACEDIM > dxInv
Definition: ERF_InitCustomPertVels_ParticleTests.H:17

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

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.
650 {
651  amrex::Real dxInv = cellSizeInv[0];
652  amrex::Real met_h_xi = dxInv * ( z_nd(i+1,j,k) - z_nd(i,j,k) );
653  return met_h_xi;
654 }

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.
576 {
577  amrex::Real dxInv = cellSizeInv[0];
578  amrex::Real met_h_xi = fourth * dxInv *
579  ( z_nd(i+1,j+1,k) + z_nd(i+1,j ,k)
580  -z_nd(i-1,j+1,k) - z_nd(i-1,j ,k) );
581  return met_h_xi;
582 }

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.
500 {
501  amrex::Real dxInv = cellSizeInv[0];
502  amrex::Real met_h_xi = fourth * dxInv *
503  ( z_nd(i+1,j,k) + z_nd(i+1,j,k+1)
504  -z_nd(i-1,j,k) - z_nd(i-1,j,k+1) );
505  return met_h_xi;
506 }

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.
284 {
285  amrex::Real met_h_xi = amrex::Real(0.125) * cellSizeInv[0] * (
286  (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)) +
287  (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)) );
288  return met_h_xi;
289 }

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.
354 {
355  amrex::Real met_h_xi = myhalf * cellSizeInv[0] * ( (z_nd(i+1,j,k ) - z_nd(i,j,k ))
356  + (z_nd(i+1,j,k+1) - z_nd(i,j,k+1)) );
357  return met_h_xi;
358 }

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.
425 {
426  amrex::Real met_h_xi = myhalf * cellSizeInv[0] * ( (z_nd(i+1,j ,k) - z_nd(i,j ,k))
427  + (z_nd(i+1,j+1,k) - z_nd(i,j+1,k)) );
428  return met_h_xi;
429 }

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.
182 {
183  amrex::Real dzInv = cellSizeInv[2];
184  amrex::Real met_h_zeta = fourth * dzInv *
185  ( 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)
186  -z_nd(i+1,j,k ) - z_nd(i+1,j+1,k ) - z_nd(i,j,k ) - z_nd(i,j+1,k ) );
187  return met_h_zeta;
188 }

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

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.
626 {
627  amrex::Real dzInv = cellSizeInv[2];
628  amrex::Real met_h_zeta = fourth * dzInv * ( z_nd(i,j,k+1) + z_nd(i+1,j,k+1)
629  -z_nd(i,j,k-1) - z_nd(i+1,j,k-1) );
630  return met_h_zeta;
631 }

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.
552 {
553  amrex::Real dzInv = cellSizeInv[2];
554  amrex::Real met_h_zeta = fourth * dzInv * ( z_nd(i,j,k+1) + z_nd(i,j+1,k+1)
555  -z_nd(i,j,k-1) - z_nd(i,j+1,k-1) );
556  return met_h_zeta;
557 }

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.
477 {
478  amrex::Real dzInv = cellSizeInv[2];
479  amrex::Real met_h_zeta = dzInv * (z_nd(i,j,k+1) - z_nd(i,j,k));
480  return met_h_zeta;
481 }

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.
261 {
262  amrex::Real met_h_zeta = myhalf * cellSizeInv[2] * ( (z_nd(i,j ,k+1) - z_nd(i,j ,k))
263  + (z_nd(i,j+1,k+1) - z_nd(i,j+1,k)) );
264  return met_h_zeta;
265 }

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.
331 {
332  amrex::Real met_h_zeta = myhalf * cellSizeInv[2] * ( (z_nd(i ,j,k+1) - z_nd(i ,j,k ))
333  + (z_nd(i+1,j,k+1) - z_nd(i+1,j,k )) );
334  return met_h_zeta;
335 }

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.
401 {
402  amrex::Real met_h_zeta = amrex::Real(0.125) * cellSizeInv[2] *
403  ( (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)) +
404  (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)) );
405  return met_h_zeta;
406 }

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.
696 {
697  const amrex::Real z_cc = amrex::Real(0.125)*( z_nd(i ,j ,k) + z_nd(i ,j ,k+1)
698  + z_nd(i+1,j ,k) + z_nd(i+1,j ,k+1)
699  + z_nd(i ,j+1,k) + z_nd(i ,j+1,k+1)
700  + z_nd(i+1,j+1,k) + z_nd(i+1,j+1,k+1));
701 
702  return z_cc;
703 }

Referenced by sea_level_pressure_diagnostics::fill_sea_level_pressure(), 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.
720 {
721  const amrex::Real z_wf = fourth*( z_nd(i ,j ,k) + z_nd(i+1,j ,k)
722  + z_nd(i ,j+1,k) + z_nd(i+1,j+1,k) );
723 
724  return z_wf;
725 }

Referenced by DiffusionSrcForState_T(), sea_level_pressure_diagnostics::fill_sea_level_pressure(), get_dzmin_terrain(), OmegaFromW(), WFromOmega(), and ERF::Write2DPlotFile().

Here is the caller graph for this function:

◆ Compute_Zrel_AtCellCenter()

AMREX_GPU_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.
742 {
743  const amrex::Real z_cc = amrex::Real(0.125)*( z_nd(i ,j ,k) + z_nd(i ,j ,k+1) +
744  + z_nd(i+1,j ,k) + z_nd(i+1,j ,k+1)
745  + z_nd(i ,j+1,k) + z_nd(i ,j+1,k+1)
746  + z_nd(i+1,j+1,k) + z_nd(i+1,j+1,k+1));
747 
748  // Note: we assume the z_nd array spans from the bottom to top of the domain
749  // i.e. no domain decomposition across processors in vertical direction
750  const amrex::Real z0_cc = fourth*( z_nd(i ,j ,0) + z_nd(i ,j+1,0)
751  +z_nd(i+1,j ,0) + z_nd(i+1,j+1,0));
752 
753  return (z_cc - z0_cc);
754 }

Referenced by ComputeDiffusivityMRF(), ComputeDiffusivityMYJ(), ComputeDiffusivityMYNN25(), ComputeDiffusivityMYNNEDMF(), ComputeDiffusivityYSU(), ComputeDiffusivityYSUNew(), near_surface_diagnostics::fill(), SurfaceLayer::fill_qsurf_with_qsat(), 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.

◆ 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.
787 {
788  // This is dh/dxi at hi and lo edges
789  amrex::Real z_x_p2 = Compute_Z_AtWFace(i+2,j,k,z_nd);
790  amrex::Real z_x_p1 = Compute_Z_AtWFace(i+1,j,k,z_nd);
791  amrex::Real z_x_m1 = Compute_Z_AtWFace(i-1,j,k,z_nd);
792  amrex::Real z_x_m2 = Compute_Z_AtWFace(i-2,j,k,z_nd);
793  amrex::Real met_xi = (amrex::Real(1.0/amrex::Real(12.0))*(z_x_m2 - z_x_p2)
794  + amrex::Real(8.0/amrex::Real(12.0))*(z_x_p1 - z_x_m1)) * dxInv[0];
795 
796  // This is dh/deta at hi and lo edges
797  amrex::Real z_y_p2 = Compute_Z_AtWFace(i,j+2,k,z_nd);
798  amrex::Real z_y_p1 = Compute_Z_AtWFace(i,j+1,k,z_nd);
799  amrex::Real z_y_m1 = Compute_Z_AtWFace(i,j-1,k,z_nd);
800  amrex::Real z_y_m2 = Compute_Z_AtWFace(i,j-2,k,z_nd);
801  amrex::Real met_eta = (amrex::Real(1.0/amrex::Real(12.0))*(z_y_m2 - z_y_p2)
802  + amrex::Real(8.0/amrex::Real(12.0))*(z_y_p1 - z_y_m1)) * dxInv[1];
803 
804  // Use extrapolation instead of interpolation if at the bottom boundary
805  amrex::Real u_hi = (k == 0) ? amrex::Real(1.5) * u_arr(i+1,j ,k ) - myhalf * u_arr(i+1,j ,k+1) :
806  myhalf * ( u_arr(i+1,j ,k-1) + u_arr(i+1,j ,k ) );
807  amrex::Real u_lo = (k == 0) ? amrex::Real(1.5) * u_arr(i ,j ,k ) - myhalf * u_arr(i ,j ,k+1) :
808  myhalf * ( u_arr(i ,j ,k-1) + u_arr(i ,j ,k ) );
809  amrex::Real mf_u_hi = mf_u(i+1,j,0);
810  amrex::Real mf_u_lo = mf_u(i ,j,0);
811 
812  amrex::Real v_hi = (k == 0) ? amrex::Real(1.5) * v_arr(i ,j+1,k ) - myhalf * v_arr(i ,j+1,k+1) :
813  myhalf * ( v_arr(i ,j+1,k-1) + v_arr(i ,j+1,k ) );
814  amrex::Real v_lo = (k == 0) ? amrex::Real(1.5) * v_arr(i ,j ,k ) - myhalf * v_arr(i ,j ,k+1) :
815  myhalf * ( v_arr(i ,j ,k-1) + v_arr(i ,j ,k ) );
816  amrex::Real mf_v_hi = mf_v(i,j+1,0);
817  amrex::Real mf_v_lo = mf_v(i,j ,0);
818 
819  amrex::Real u_met = met_xi * myhalf * ( u_hi*mf_u_hi + u_lo*mf_u_lo );
820  amrex::Real v_met = met_eta * myhalf * ( v_hi*mf_v_hi + v_lo*mf_v_lo );
821 
822  amrex::Real omega = w - u_met - v_met;
823  return omega;
824 }
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:718
@ omega
Definition: ERF_Morrison.H:54

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 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.
1044 {
1045  amrex::Real h_xi = Compute_h_xi_AtCellCenter(i, j, klo, dxInv, zphys_arr);
1046  amrex::Real h_eta = Compute_h_eta_AtCellCenter(i, j, klo, dxInv, zphys_arr);
1047  amrex::Real InvNorm = one / std::sqrt(one + h_xi*h_xi + h_eta*h_eta);
1048  phi1_arr(i,j,klo) = -h_xi * flux * InvNorm;
1049  phi2_arr(i,j,klo) = -h_eta * flux * InvNorm;
1050  phi3_arr(i,j,klo) = flux * InvNorm;
1051 }
constexpr amrex::Real one
Definition: ERF_Constants.H:9
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:204
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:229

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 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 > &  tau11_arr,
const amrex::Array4< amrex::Real > &  tau22_arr,
const amrex::Array4< amrex::Real > &  tau33_arr,
const amrex::Array4< amrex::Real > &  tau12_arr,
const amrex::Array4< amrex::Real > &  tau21_arr,
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.
1096 {
1097  // Unit-normal vector
1098  amrex::Array1D<amrex::Real,0,2> n_hat;
1099 
1100  // Unit-tangent vectors
1101  amrex::Array1D<amrex::Real,0,2> t_hat_1;
1102  amrex::Array1D<amrex::Real,0,2> t_hat_2;
1103  amrex::Array1D<amrex::Real,0,2> u_t_hat;
1104 
1105  // Final basis vector for right-hand coord sys
1106  amrex::Array1D<amrex::Real,0,2> a_hat;
1107 
1108  // Rotation matrix
1109  amrex::Array2D<amrex::Real,0,2,0,2> R_mat;
1110 
1111  // Metric data
1112  amrex::Real h_xi = Compute_h_xi_AtIface(i, j, klo, dxInv, zphys_arr);
1113  amrex::Real h_eta = Compute_h_eta_AtIface(i, j, klo, dxInv, zphys_arr);
1114  amrex::Real h_zeta = Compute_h_zeta_AtIface(i, j, klo, dxInv, zphys_arr);
1115 
1116  // Populate the normal vector
1117  amrex::Real Inormn = one/std::sqrt(one + h_xi*h_xi + h_eta*h_eta);
1118  n_hat(0) = Inormn*h_xi; n_hat(1) = Inormn*h_eta; n_hat(2) = -Inormn;
1119 
1120  // Populate the tangent vectors: t_1 ~ (1,0,h_xi) and t_2 ~ (0,1,h_eta).
1121  // NOTE: the out-of-plane component of each is identically zero and must be
1122  // set explicitly since Array1D is an aggregate with no default init.
1123  amrex::Real Inorm1 = one/std::sqrt(one + h_xi*h_xi);
1124  amrex::Real Inorm2 = one/std::sqrt(one + h_eta*h_eta);
1125  t_hat_1(0) = -Inorm1; t_hat_2(0) = zero;
1126  t_hat_1(1) = zero; t_hat_2(1) = -Inorm2;
1127  t_hat_1(2) = -Inorm1*h_xi; t_hat_2(2) = -Inorm2*h_eta;
1128 
1129  // Populate the u_t vector
1130  amrex::Real Norm_u_t = zero;
1131  amrex::Real mag1 = (u_arr(i,j,klo) + h_xi *w_arr(i,j,klo))*Inorm1;
1132  amrex::Real mag2 = (v_arr(i,j,klo) + h_eta*w_arr(i,j,klo))*Inorm2;
1133  for (int icol(0); icol<3; ++icol) {
1134  u_t_hat(icol) = mag1*t_hat_1(icol) + mag2*t_hat_2(icol);
1135  Norm_u_t += u_t_hat(icol)*u_t_hat(icol);
1136  }
1137  // NOTE: the direction of the tangential velocity is undefined when that
1138  // velocity vanishes (a quiescent surface cell, or flow normal to the
1139  // terrain), so we cannot normalize. Leaving u_t_hat as the zero vector
1140  // is the only rotation-invariant choice, and it is the right limit for
1141  // a quiescent cell since the flux vanishes with the surface wind too.
1142  amrex::Real Inorm_u_t = (Norm_u_t > zero) ? one/std::sqrt(Norm_u_t) : zero;
1143  for (int icol(0); icol<3; ++icol) {
1144  u_t_hat(icol) *= Inorm_u_t;
1145  }
1146 
1147  // Populate the a_hat vector
1148  a_hat(0) = n_hat(1)*u_t_hat(2) - n_hat(2)*u_t_hat(1);
1149  a_hat(1) = -(n_hat(0)*u_t_hat(2) - n_hat(2)*u_t_hat(0));
1150  a_hat(2) = n_hat(0)*u_t_hat(1) - n_hat(1)*u_t_hat(0);
1151 
1152  // Copy column vectors into R_mat
1153  int jrow;
1154  jrow = 0;
1155  for (int icol(0); icol<3; ++icol) {
1156  R_mat(icol,jrow) = u_t_hat(icol);
1157  }
1158  jrow = 1;
1159  for (int icol(0); icol<3; ++icol) {
1160  R_mat(icol,jrow) = a_hat(icol);
1161  }
1162  jrow = 2;
1163  for (int icol(0); icol<3; ++icol) {
1164  R_mat(icol,jrow) = n_hat(icol);
1165  }
1166 
1167  // Body-fixed tau
1168  amrex::Real T11 = two*R_mat(0,0)*R_mat(2,0)*flux;
1169  amrex::Real T22 = two*R_mat(0,1)*R_mat(2,1)*flux;
1170  amrex::Real T33 = two*R_mat(0,2)*R_mat(2,2)*flux;
1171  amrex::Real T12 = (R_mat(0,0)*R_mat(2,1) + R_mat(2,0)*R_mat(0,1))*flux;
1172  amrex::Real T13 = (R_mat(0,0)*R_mat(2,2) + R_mat(0,2)*R_mat(2,0))*flux;
1173  amrex::Real T23 = (R_mat(0,1)*R_mat(2,2) + R_mat(0,2)*R_mat(2,1))*flux;
1174 
1175  // Rotated stress fluxes
1176  tau11_arr(i,j,klo) = h_zeta*T11;
1177  tau22_arr(i,j,klo) = h_zeta*T22;
1178  tau33_arr(i,j,klo) = -h_xi*T13 - h_eta*T23 + T33;
1179 
1180  tau12_arr(i,j,klo) = h_zeta*T12;
1181  tau21_arr(i,j,klo) = h_zeta*T12; // the body-fixed tensor is symmetric: T21 == T12
1182 
1183  tau13_arr(i,j,klo) = -h_xi*T11 - h_eta*T12 + T13;
1184  tau31_arr(i,j,klo) = h_zeta*T13;
1185 
1186  tau23_arr(i,j,klo) = -h_xi*T12 - h_eta*T22 + T23;
1187  tau32_arr(i,j,klo) = h_zeta*T23;
1188 }
constexpr amrex::Real two
Definition: ERF_Constants.H:10
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
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:281
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:258
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:305

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

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.

173 {
174  ParmParse pp("erf");
175  std::string amr_terrain_refinement = "interpolate";
176  pp.query("amr_terrain_refinement", amr_terrain_refinement);
177 
178  if (amr_terrain_refinement == "interpolate") {
180  } else if (amr_terrain_refinement == "transform") {
181  return FineTerrain::Transform;
182  }
183 
184  Abort("erf.amr_terrain_refinement = " + amr_terrain_refinement +
185  " is not recognized; it must be \"interpolate\" or \"transform\"");
187 }
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: