ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_Utils.H File Reference
#include "AMReX.H"
#include "AMReX_MultiFab.H"
#include "AMReX_BCRec.H"
#include "ERF_NumericalConstants.H"
#include "ERF_MicrophysicsConstants.H"
#include "ERF_DataStruct.H"
#include "ERF_IndexDefines.H"
#include "ERF_SurfaceLayer.H"
#include "ERF_FillPatcher.H"
#include "ERF_ReadBndryPlanes.H"
Include dependency graph for ERF_Utils.H:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real wrf_moisture_target (const amrex::Real rho, const amrex::Real q_n, const amrex::Real q_np1, const amrex::Real alpha) noexcept
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool wrf_bdy_has_separate_hydrometeors (const MoistureComponentIndices &moisture_indices) noexcept
 
int wrf_bdy_var_for_moisture_component (const int comp, const MoistureComponentIndices &moisture_indices, const bool use_wrf_bdy_qc_qi, const bool separate_hydrometeors=false)
 
void rebalance_columns (amrex::MultiFab &rho, amrex::MultiFab &theta, const amrex::MultiFab &qt, const amrex::MultiFab &qv, const amrex::MultiFab *z_phys, const amrex::Geometry &geom, const bool &maintain_Th, bool use_sfc=false)
 
void ChopGrids2D (amrex::BoxArray &ba, const amrex::Box &domain, int target_size)
 
amrex::BoxArray ERFPostProcessBaseGrids (const amrex::Box &domain, bool decompose_in_z)
 
void cons_to_prim (const amrex::MultiFab &cons_state, amrex::MultiFab &S_prim, int ng)
 
void fill_wall_dist_ghost_cells (amrex::MultiFab &wdist, const amrex::Geometry &geom)
 
void make_qt (const amrex::MultiFab &cons_state, amrex::MultiFab &qt, int n_qstate_into_total)
 
void make_J (const amrex::Geometry &geom, amrex::MultiFab &z_phys_nd, amrex::MultiFab &detJ_cc)
 
void make_areas (const amrex::Geometry &geom, amrex::MultiFab &z_phys_nd, amrex::MultiFab &ax, amrex::MultiFab &ay, amrex::MultiFab &az)
 
void make_zcc (const amrex::Geometry &geom, amrex::MultiFab &z_phys_nd, amrex::MultiFab &z_phys_cc)
 
void MomentumToVelocity (amrex::MultiFab &xvel_out, amrex::MultiFab &yvel_out, amrex::MultiFab &zvel_out, const amrex::MultiFab &cons_in, const amrex::MultiFab &xmom_in, const amrex::MultiFab &ymom_in, const amrex::MultiFab &zmom_in, const amrex::Box &domain, const amrex::Vector< amrex::BCRec > &domain_bcs_type_h, const amrex::MultiFab *c_vfrac=nullptr)
 
void VelocityToMomentum (const amrex::MultiFab &xvel_in, const amrex::IntVect &xvel_ngrow, const amrex::MultiFab &yvel_in, const amrex::IntVect &yvel_ngrow, const amrex::MultiFab &zvel_in, const amrex::IntVect &zvel_ngrow, const amrex::MultiFab &cons_in, amrex::MultiFab &xmom_out, amrex::MultiFab &ymom_out, amrex::MultiFab &zmom_out, const amrex::Box &domain, const amrex::Vector< amrex::BCRec > &domain_bcs_type_h, const amrex::MultiFab *c_vfrac=nullptr)
 
void ConvertForProjection (const amrex::MultiFab &den_div, const amrex::MultiFab &den_mlt, amrex::MultiFab &xmom, amrex::MultiFab &ymom, amrex::MultiFab &zmom, const amrex::Box &domain, const amrex::Vector< amrex::BCRec > &domain_bcs_type_h)
 
void compute_influx_outflux_bdy (amrex::FArrayBox &bdy_data_xlo, amrex::FArrayBox &bdy_data_xhi, amrex::FArrayBox &bdy_data_ylo, amrex::FArrayBox &bdy_data_yhi, amrex::Array< amrex::MultiFab *, AMREX_SPACEDIM > &area_vec, const amrex::Geometry &geom, amrex::Real &influx, amrex::Real &outflux, const int n)
 
void enforceInOutSolvability_bdy (const amrex::MultiFab &rho0, amrex::FArrayBox &bdy_data_xlo, amrex::FArrayBox &bdy_data_xhi, amrex::FArrayBox &bdy_data_ylo, amrex::FArrayBox &bdy_data_yhi, amrex::Array< amrex::MultiFab *, AMREX_SPACEDIM > &area_vec, const amrex::Geometry &geom, const amrex::Vector< amrex::BCRec > &domain_bcs_type_h)
 
void enforceInOutSolvability (int lev, amrex::Array< amrex::MultiFab *, AMREX_SPACEDIM > &vels_vec, amrex::Array< amrex::MultiFab *, AMREX_SPACEDIM > &area_vec, const amrex::Geometry &geom)
 
void realbdy_interior_bxs_xy (const amrex::Box &bx, const amrex::Box &domain, const int &width, amrex::Box &bx_xlo, amrex::Box &bx_xhi, amrex::Box &bx_ylo, amrex::Box &bx_yhi, const amrex::IntVect &ng_vect=amrex::IntVect(0, 0, 0), const bool get_int_ng=false)
 
void realbdy_bc_bxs_xy (const amrex::Box &bx, const amrex::Box &domain, const int &set_width, amrex::Box &bx_xlo, amrex::Box &bx_xhi, amrex::Box &bx_ylo, amrex::Box &bx_yhi, const amrex::IntVect &ng_vect=amrex::IntVect(0, 0, 0))
 
void realbdy_compute_interior_ghost_rhs (const double &total_time, const double &delta_t, const double &start_bdy_time, const double &final_bdy_time, const double &bdy_time_interval, const amrex::Real &nudge_factor, int width, const amrex::Geometry &geom, amrex::Vector< amrex::MultiFab > &S_rhs, amrex::Vector< amrex::MultiFab > &S_cur_data, amrex::Vector< amrex::Vector< amrex::FArrayBox >> &bdy_data_xlo, amrex::Vector< amrex::Vector< amrex::FArrayBox >> &bdy_data_xhi, amrex::Vector< amrex::Vector< amrex::FArrayBox >> &bdy_data_ylo, amrex::Vector< amrex::Vector< amrex::FArrayBox >> &bdy_data_yhi, std::unique_ptr< ReadBndryPlanes > &m_r2d, const amrex::Real &c_p, const amrex::Real &rdOcp, const bool use_wrf_bdy_density, const amrex::Real &bdy_rho_nudge_factor)
 
void fine_compute_interior_ghost_rhs (const double &time, const double &delta_t, const int &width, const int &set_width, const amrex::Geometry &geom, ERFFillPatcher *FPr_c, ERFFillPatcher *FPr_u, ERFFillPatcher *FPr_v, ERFFillPatcher *FPr_w, amrex::Vector< amrex::BCRec > &domain_bcs_type, amrex::Vector< amrex::MultiFab > &S_rhs_f, amrex::Vector< amrex::MultiFab > &S_data_f)
 
void Time_Avg_Vel_atCC (double dt, double &t_avg_cnt, amrex::MultiFab *vel_t_avg, amrex::MultiFab &xvel, amrex::MultiFab &yvel, amrex::MultiFab &zvel)
 
void Accumulate_Interval_Means (double dt, double &t_mean_cnt, amrex::MultiFab *interval_means, amrex::MultiFab &xvel, amrex::MultiFab &yvel, amrex::MultiFab &zvel, amrex::MultiFab &cons)
 
AMREX_GPU_HOST AMREX_FORCE_INLINE void realbdy_compute_relaxation (const int &icomp, const int &num_var, const int &width, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dx, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &ProbLo, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &ProbHi, const amrex::Real &F1, const amrex::Box &bx_xlo, const amrex::Box &bx_xhi, const amrex::Box &bx_ylo, const amrex::Box &bx_yhi, const amrex::Array4< const amrex::Real > &arr_xlo, const amrex::Array4< const amrex::Real > &arr_xhi, const amrex::Array4< const amrex::Real > &arr_ylo, const amrex::Array4< const amrex::Real > &arr_yhi, const amrex::Array4< const amrex::Real > &data_arr, const amrex::Array4< amrex::Real > &rhs_arr, const amrex::Real &c_p, const amrex::Real &rdOcp, const int bdy_moist_nudge_type=0)
 
AMREX_GPU_HOST AMREX_FORCE_INLINE void realbdy_compute_moisture_relaxation (const amrex::GpuArray< int, 6 > &moisture_comps, const int n_targets, const int &width, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dx, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &ProbLo, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &ProbHi, const amrex::Real &F1, const amrex::Box &bx_xlo, const amrex::Box &bx_xhi, const amrex::Box &bx_ylo, const amrex::Box &bx_yhi, const amrex::Array4< const amrex::Real > &arr_xlo, const amrex::Array4< const amrex::Real > &arr_xhi, const amrex::Array4< const amrex::Real > &arr_ylo, const amrex::Array4< const amrex::Real > &arr_yhi, const amrex::Array4< const amrex::Real > &data_arr, const amrex::Array4< amrex::Real > &rhs_arr)
 
AMREX_GPU_HOST AMREX_FORCE_INLINE void realbdy_compute_moisture_relaxation (const amrex::GpuArray< int, 3 > &moisture_comps, const int &width, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dx, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &ProbLo, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &ProbHi, const amrex::Real &F1, const amrex::Box &bx_xlo, const amrex::Box &bx_xhi, const amrex::Box &bx_ylo, const amrex::Box &bx_yhi, const amrex::Array4< const amrex::Real > &arr_xlo, const amrex::Array4< const amrex::Real > &arr_xhi, const amrex::Array4< const amrex::Real > &arr_ylo, const amrex::Array4< const amrex::Real > &arr_yhi, const amrex::Array4< const amrex::Real > &data_arr, const amrex::Array4< amrex::Real > &rhs_arr)
 
AMREX_GPU_HOST AMREX_FORCE_INLINE void ApplyMask (amrex::MultiFab &dst, const amrex::iMultiFab &imask, const int nghost=0)
 
AMREX_GPU_HOST AMREX_FORCE_INLINE void ApplyInvertedMask (amrex::MultiFab &dst, const amrex::iMultiFab &imask, const int nghost=0)
 
void thinbody_wall_dist (std::unique_ptr< amrex::MultiFab > &wdist, amrex::Vector< amrex::IntVect > &xfaces, amrex::Vector< amrex::IntVect > &yfaces, amrex::Vector< amrex::IntVect > &zfaces, const amrex::Geometry &geomdata, std::unique_ptr< amrex::MultiFab > &z_phys_cc)
 
void WeatherDataInterpolation (const double time)
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real quad_interp_1d (amrex::Real z, amrex::Real z0, amrex::Real p0, amrex::Real z1, amrex::Real p1, amrex::Real z2, amrex::Real p2)
 

Function Documentation

◆ Accumulate_Interval_Means()

void Accumulate_Interval_Means ( double  dt,
double &  t_mean_cnt,
amrex::MultiFab *  interval_means,
amrex::MultiFab &  xvel,
amrex::MultiFab &  yvel,
amrex::MultiFab &  zvel,
amrex::MultiFab &  cons 
)

Accumulate time-weighted cell-centered velocity/theta first and second moments.

Parameters
[in]dtaccumulation interval
[in,out]t_mean_cntaccumulated time
[in,out]interval_meansten-component moment storage
[in]xvelx-face velocity
[in]yvely-face velocity
[in]zvelz-face velocity
[in]consconserved cell-centered state

◆ ApplyInvertedMask()

AMREX_GPU_HOST AMREX_FORCE_INLINE void ApplyInvertedMask ( amrex::MultiFab &  dst,
const amrex::iMultiFab &  imask,
const int  nghost = 0 
)

Multiply a MultiFab by the inverse of an integer mask.

Parameters
[in,out]dstMultiFab to be masked.
[in]imaskInteger mask MultiFab.
[in]nghostNumber of ghost cells to include.
703 {
704  for (amrex::MFIter mfi(dst,amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
705  {
706  const amrex::Box& bx = mfi.growntilebox(nghost);
707  if (bx.ok())
708  {
709  auto dstFab = dst.array(mfi);
710  const auto maskFab = imask.const_array(mfi);
711  ParallelFor(bx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
712  {
713  dstFab(i,j,k) *= (1-maskFab(i,j,k));
714  });
715  }
716  }
717 }
ParallelFor(fab_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})

Referenced by add_thin_body_sources(), and ERF::project_velocity_tb().

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

◆ ApplyMask()

AMREX_GPU_HOST AMREX_FORCE_INLINE void ApplyMask ( amrex::MultiFab &  dst,
const amrex::iMultiFab &  imask,
const int  nghost = 0 
)
675 {
676  for (amrex::MFIter mfi(dst,amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
677  {
678  const amrex::Box& bx = mfi.growntilebox(nghost);
679  if (bx.ok())
680  {
681  auto dstFab = dst.array(mfi);
682  const auto maskFab = imask.const_array(mfi);
683  ParallelFor(bx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
684  {
685  dstFab(i,j,k) *= maskFab(i,j,k);
686  });
687  }
688  }
689 }

Referenced by ERF::FillIntermediatePatch(), and ERF::project_velocity_tb().

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

◆ ChopGrids2D()

void ChopGrids2D ( amrex::BoxArray &  ba,
const amrex::Box &  domain,
int  target_size 
)

◆ compute_influx_outflux_bdy()

void compute_influx_outflux_bdy ( amrex::FArrayBox &  bdy_data_xlo,
amrex::FArrayBox &  bdy_data_xhi,
amrex::FArrayBox &  bdy_data_ylo,
amrex::FArrayBox &  bdy_data_yhi,
amrex::Array< amrex::MultiFab *, AMREX_SPACEDIM > &  area_vec,
const amrex::Geometry &  geom,
amrex::Real influx,
amrex::Real outflux,
const int  n 
)

◆ cons_to_prim()

void cons_to_prim ( const amrex::MultiFab &  cons_state,
amrex::MultiFab &  S_prim,
int  ng 
)

Convert conservative state to primitive variables.

Parameters
[in]cons_stateConservative state MultiFab.
[out]S_primPrimitive state MultiFab.
[in]ngNumber of ghost cells.

◆ ConvertForProjection()

void ConvertForProjection ( const amrex::MultiFab &  den_div,
const amrex::MultiFab &  den_mlt,
amrex::MultiFab &  xmom,
amrex::MultiFab &  ymom,
amrex::MultiFab &  zmom,
const amrex::Box &  domain,
const amrex::Vector< amrex::BCRec > &  domain_bcs_type_h 
)

◆ enforceInOutSolvability()

void enforceInOutSolvability ( int  lev,
amrex::Array< amrex::MultiFab *, AMREX_SPACEDIM > &  vels_vec,
amrex::Array< amrex::MultiFab *, AMREX_SPACEDIM > &  area_vec,
const amrex::Geometry &  geom 
)

◆ enforceInOutSolvability_bdy()

void enforceInOutSolvability_bdy ( const amrex::MultiFab &  rho0,
amrex::FArrayBox &  bdy_data_xlo,
amrex::FArrayBox &  bdy_data_xhi,
amrex::FArrayBox &  bdy_data_ylo,
amrex::FArrayBox &  bdy_data_yhi,
amrex::Array< amrex::MultiFab *, AMREX_SPACEDIM > &  area_vec,
const amrex::Geometry &  geom,
const amrex::Vector< amrex::BCRec > &  domain_bcs_type_h 
)

◆ ERFPostProcessBaseGrids()

amrex::BoxArray ERFPostProcessBaseGrids ( const amrex::Box &  domain,
bool  decompose_in_z 
)

◆ fill_wall_dist_ghost_cells()

void fill_wall_dist_ghost_cells ( amrex::MultiFab &  wdist,
const amrex::Geometry &  geom 
)

Fill the ghost cells of the wall distance field, which is only computed on the valid region, so that operators reading from grown boxes do not see the sentinel value used to initialize it.

Parameters
[in,out]wdistMultiFab holding the wall distance.
[in]geomGeometry at this level.

◆ fine_compute_interior_ghost_rhs()

void fine_compute_interior_ghost_rhs ( const double &  time,
const double &  delta_t,
const int &  width,
const int &  set_width,
const amrex::Geometry &  geom,
ERFFillPatcher FPr_c,
ERFFillPatcher FPr_u,
ERFFillPatcher FPr_v,
ERFFillPatcher FPr_w,
amrex::Vector< amrex::BCRec > &  domain_bcs_type,
amrex::Vector< amrex::MultiFab > &  S_rhs_f,
amrex::Vector< amrex::MultiFab > &  S_data_f 
)

◆ make_areas()

void make_areas ( const amrex::Geometry &  geom,
amrex::MultiFab &  z_phys_nd,
amrex::MultiFab &  ax,
amrex::MultiFab &  ay,
amrex::MultiFab &  az 
)

◆ make_J()

void make_J ( const amrex::Geometry &  geom,
amrex::MultiFab &  z_phys_nd,
amrex::MultiFab &  detJ_cc 
)

◆ make_qt()

void make_qt ( const amrex::MultiFab &  cons_state,
amrex::MultiFab &  qt,
int  n_qstate_into_total 
)

Compute total water mixing ratio from conservative state.

Parameters
[in]cons_stateConservative state MultiFab.
[out]qtMultiFab to store total water.
[in]n_qstate_into_totalNumber of components to include in total water.

◆ make_zcc()

void make_zcc ( const amrex::Geometry &  geom,
amrex::MultiFab &  z_phys_nd,
amrex::MultiFab &  z_phys_cc 
)

◆ MomentumToVelocity()

void MomentumToVelocity ( amrex::MultiFab &  xvel_out,
amrex::MultiFab &  yvel_out,
amrex::MultiFab &  zvel_out,
const amrex::MultiFab &  cons_in,
const amrex::MultiFab &  xmom_in,
const amrex::MultiFab &  ymom_in,
const amrex::MultiFab &  zmom_in,
const amrex::Box &  domain,
const amrex::Vector< amrex::BCRec > &  domain_bcs_type_h,
const amrex::MultiFab *  c_vfrac = nullptr 
)

◆ quad_interp_1d()

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real quad_interp_1d ( amrex::Real  z,
amrex::Real  z0,
amrex::Real  p0,
amrex::Real  z1,
amrex::Real  p1,
amrex::Real  z2,
amrex::Real  p2 
)

Perform quadratic interpolation in one dimension.

Parameters
[in]zInterpolation coordinate.
[in]z0Coordinate of first point.
[in]p0Value at first point.
[in]z1Coordinate of second point.
[in]p1Value at second point.
[in]z2Coordinate of third point.
[in]p2Value at third point.
Returns
Interpolated value.
757 {
758  return p0 * ( (z - z1) * (z - z2) ) / ( (z0 - z1) * (z0 - z2) )
759  + p1 * ( (z - z0) * (z - z2) ) / ( (z1 - z0) * (z1 - z2) )
760  + p2 * ( (z - z0) * (z - z1) ) / ( (z2 - z0) * (z2 - z1) );
761 }
Real z0
Definition: ERF_InitCustomPertVels_ScalarAdvDiff.H:8
real(c_double), parameter p0
Definition: ERF_module_model_constants.F90:40

Referenced by compute_gradp_interpz().

Here is the caller graph for this function:

◆ realbdy_bc_bxs_xy()

void realbdy_bc_bxs_xy ( const amrex::Box &  bx,
const amrex::Box &  domain,
const int &  set_width,
amrex::Box &  bx_xlo,
amrex::Box &  bx_xhi,
amrex::Box &  bx_ylo,
amrex::Box &  bx_yhi,
const amrex::IntVect &  ng_vect = amrex::IntVect(0, 0, 0) 
)

◆ realbdy_compute_interior_ghost_rhs()

void realbdy_compute_interior_ghost_rhs ( const double &  total_time,
const double &  delta_t,
const double &  start_bdy_time,
const double &  final_bdy_time,
const double &  bdy_time_interval,
const amrex::Real nudge_factor,
int  width,
const amrex::Geometry &  geom,
amrex::Vector< amrex::MultiFab > &  S_rhs,
amrex::Vector< amrex::MultiFab > &  S_cur_data,
amrex::Vector< amrex::Vector< amrex::FArrayBox >> &  bdy_data_xlo,
amrex::Vector< amrex::Vector< amrex::FArrayBox >> &  bdy_data_xhi,
amrex::Vector< amrex::Vector< amrex::FArrayBox >> &  bdy_data_ylo,
amrex::Vector< amrex::Vector< amrex::FArrayBox >> &  bdy_data_yhi,
std::unique_ptr< ReadBndryPlanes > &  m_r2d,
const amrex::Real c_p,
const amrex::Real rdOcp,
const bool  use_wrf_bdy_density,
const amrex::Real bdy_rho_nudge_factor 
)

◆ realbdy_compute_moisture_relaxation() [1/2]

AMREX_GPU_HOST AMREX_FORCE_INLINE void realbdy_compute_moisture_relaxation ( const amrex::GpuArray< int, 3 > &  moisture_comps,
const int &  width,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  dx,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  ProbLo,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  ProbHi,
const amrex::Real F1,
const amrex::Box &  bx_xlo,
const amrex::Box &  bx_xhi,
const amrex::Box &  bx_ylo,
const amrex::Box &  bx_yhi,
const amrex::Array4< const amrex::Real > &  arr_xlo,
const amrex::Array4< const amrex::Real > &  arr_xhi,
const amrex::Array4< const amrex::Real > &  arr_ylo,
const amrex::Array4< const amrex::Real > &  arr_yhi,
const amrex::Array4< const amrex::Real > &  data_arr,
const amrex::Array4< amrex::Real > &  rhs_arr 
)
657 {
658  const amrex::GpuArray<int,6> extended_comps = {
659  moisture_comps[0], moisture_comps[1], moisture_comps[2], -1, -1, -1};
661  extended_comps, 3, width, dx, ProbLo, ProbHi, F1,
662  bx_xlo, bx_xhi, bx_ylo, bx_yhi,
663  arr_xlo, arr_xhi, arr_ylo, arr_yhi, data_arr, rhs_arr);
664 }
const Real dx
Definition: ERF_InitCustomPert_ABL.H:44
AMREX_GPU_HOST AMREX_FORCE_INLINE void realbdy_compute_moisture_relaxation(const amrex::GpuArray< int, 6 > &moisture_comps, const int n_targets, const int &width, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dx, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &ProbLo, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &ProbHi, const amrex::Real &F1, const amrex::Box &bx_xlo, const amrex::Box &bx_xhi, const amrex::Box &bx_ylo, const amrex::Box &bx_yhi, const amrex::Array4< const amrex::Real > &arr_xlo, const amrex::Array4< const amrex::Real > &arr_xhi, const amrex::Array4< const amrex::Real > &arr_ylo, const amrex::Array4< const amrex::Real > &arr_yhi, const amrex::Array4< const amrex::Real > &data_arr, const amrex::Array4< amrex::Real > &rhs_arr)
Definition: ERF_Utils.H:544
Here is the call graph for this function:

◆ realbdy_compute_moisture_relaxation() [2/2]

AMREX_GPU_HOST AMREX_FORCE_INLINE void realbdy_compute_moisture_relaxation ( const amrex::GpuArray< int, 6 > &  moisture_comps,
const int  n_targets,
const int &  width,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  dx,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  ProbLo,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  ProbHi,
const amrex::Real F1,
const amrex::Box &  bx_xlo,
const amrex::Box &  bx_xhi,
const amrex::Box &  bx_ylo,
const amrex::Box &  bx_yhi,
const amrex::Array4< const amrex::Real > &  arr_xlo,
const amrex::Array4< const amrex::Real > &  arr_xhi,
const amrex::Array4< const amrex::Real > &  arr_ylo,
const amrex::Array4< const amrex::Real > &  arr_yhi,
const amrex::Array4< const amrex::Real > &  data_arr,
const amrex::Array4< amrex::Real > &  rhs_arr 
)

Apply Davies relaxation to explicitly mapped moisture components. Target component n corresponds to state component moisture_comps[n].

562 {
563  const amrex::IntVect iv = bx_xlo.type();
564  const amrex::Real ioff = (iv[0] == 1) ? zero : myhalf;
565  const amrex::Real joff = (iv[1] == 1) ? zero : myhalf;
566 
567  amrex::ParallelFor(bx_xlo, bx_xhi,
568  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
569  {
570  const amrex::Real x = ProbLo[0] + (i + ioff) * dx[0];
571  const amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
572  const amrex::Real x_end = ProbLo[0] + width * dx[0];
573  const amrex::Real y_end = ProbLo[1] + width * dx[1];
574  const amrex::Real y_strt = ProbHi[1] - width * dx[1];
575  const amrex::Real xi = (x_end - x) / (x_end - ProbLo[0]);
576  const amrex::Real eta_lo = (y < y_end) ? (y_end - y) / (y_end - ProbLo[1]) : amrex::Real(0.0);
577  const amrex::Real eta_hi = (y > y_strt) ? (y - y_strt) / (ProbHi[1] - y_strt) : amrex::Real(0.0);
578  const amrex::Real factor = amrex::max(xi*xi, amrex::max(eta_lo,eta_hi)*amrex::max(eta_lo,eta_hi)) * F1;
579  for (int n = 0; n < n_targets; ++n) {
580  const int comp = moisture_comps[n];
581  if (comp >= 0) {
582  rhs_arr(i,j,k,comp) += factor * (arr_xlo(i,j,k,n) - data_arr(i,j,k,comp));
583  }
584  }
585  },
586  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
587  {
588  const amrex::Real x = ProbLo[0] + (i + ioff) * dx[0];
589  const amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
590  const amrex::Real x_strt = ProbHi[0] - width * dx[0];
591  const amrex::Real y_end = ProbLo[1] + width * dx[1];
592  const amrex::Real y_strt = ProbHi[1] - width * dx[1];
593  const amrex::Real xi = (x - x_strt) / (ProbHi[0] - x_strt);
594  const amrex::Real eta_lo = (y < y_end) ? (y_end - y) / (y_end - ProbLo[1]) : amrex::Real(0.0);
595  const amrex::Real eta_hi = (y > y_strt) ? (y - y_strt) / (ProbHi[1] - y_strt) : amrex::Real(0.0);
596  const amrex::Real eta = amrex::max(eta_lo,eta_hi);
597  const amrex::Real factor = amrex::max(xi*xi, eta*eta) * F1;
598  for (int n = 0; n < n_targets; ++n) {
599  const int comp = moisture_comps[n];
600  if (comp >= 0) {
601  rhs_arr(i,j,k,comp) += factor * (arr_xhi(i,j,k,n) - data_arr(i,j,k,comp));
602  }
603  }
604  });
605 
606  amrex::ParallelFor(bx_ylo, bx_yhi,
607  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
608  {
609  const amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
610  const amrex::Real y_end = ProbLo[1] + width * dx[1];
611  const amrex::Real eta = (y_end - y) / (y_end - ProbLo[1]);
612  const amrex::Real factor = eta*eta * F1;
613  for (int n = 0; n < n_targets; ++n) {
614  const int comp = moisture_comps[n];
615  if (comp >= 0) {
616  rhs_arr(i,j,k,comp) += factor * (arr_ylo(i,j,k,n) - data_arr(i,j,k,comp));
617  }
618  }
619  },
620  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
621  {
622  const amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
623  const amrex::Real y_strt = ProbHi[1] - width * dx[1];
624  const amrex::Real eta = (y - y_strt) / (ProbHi[1] - y_strt);
625  const amrex::Real factor = eta*eta * F1;
626  for (int n = 0; n < n_targets; ++n) {
627  const int comp = moisture_comps[n];
628  if (comp >= 0) {
629  rhs_arr(i,j,k,comp) += factor * (arr_yhi(i,j,k,n) - data_arr(i,j,k,comp));
630  }
631  }
632  });
633 }
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:29
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:34
amrex::Real Real
Definition: ERF_ShocInterface.H:19

Referenced by realbdy_compute_moisture_relaxation().

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

◆ realbdy_compute_relaxation()

AMREX_GPU_HOST AMREX_FORCE_INLINE void realbdy_compute_relaxation ( const int &  icomp,
const int &  num_var,
const int &  width,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  dx,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  ProbLo,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  ProbHi,
const amrex::Real F1,
const amrex::Box &  bx_xlo,
const amrex::Box &  bx_xhi,
const amrex::Box &  bx_ylo,
const amrex::Box &  bx_yhi,
const amrex::Array4< const amrex::Real > &  arr_xlo,
const amrex::Array4< const amrex::Real > &  arr_xhi,
const amrex::Array4< const amrex::Real > &  arr_ylo,
const amrex::Array4< const amrex::Real > &  arr_yhi,
const amrex::Array4< const amrex::Real > &  data_arr,
const amrex::Array4< amrex::Real > &  rhs_arr,
const amrex::Real c_p,
const amrex::Real rdOcp,
const int  bdy_moist_nudge_type = 0 
)

Compute the nudging relaxation

Parameters
[in]delta_ttime step
[in]icompcomponent offset
[in]num_varnumber of variables to loop
[in]widthwidth of wrf bdy file
[in]dom_lolow bound of domain
[in]dom_hihigh bound of domain
[in]F1drift relaxation parameter
[in]bx_xlobox for low x relaxation
[in]bx_xhibox for high x relaxation
[in]bx_ylobox for low y relaxation
[in]bx_yhibox for high y relaxation
[in]arr_xloarray for low x relaxation
[in]arr_xhiarray for high x relaxation
[in]arr_yloarray for low y relaxation
[in]arr_yhiarray for high y relaxation
[in]data_arrdata array
[out]rhs_arrRHS array
350 {
351  amrex::IntVect iv = bx_xlo.type();
352  amrex::Real ioff = (iv[0]==1) ? zero : myhalf;
353  amrex::Real joff = (iv[1]==1) ? zero : myhalf;
354 
355  // These are defined in ERF_Constants.H
356  amrex::Real l_rdOcp = rdOcp;
357  amrex::Real cond_fac = lcond / c_p; // condensation
358  amrex::Real sub_fac = lsub / c_p; // sublimation
359 
360  int nq = num_var;
361 
362  amrex::ParallelFor( bx_xlo, bx_xhi,
363  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
364  {
365  // Corners with x boxes
366  amrex::Real x = ProbLo[0] + (i + ioff) * dx[0];
367  amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
368  amrex::Real x_end = ProbLo[0] + width * dx[0];
369  amrex::Real y_end = ProbLo[1] + width * dx[1];
370  amrex::Real y_strt = ProbHi[1] - width * dx[1];
371  amrex::Real xi = (x_end - x) / (x_end - ProbLo[0]);
372  amrex::Real eta_lo = (y < y_end ) ? (y_end - y) / (y_end - ProbLo[1]) : zero;
373  amrex::Real eta_hi = (y > y_strt) ? (y - y_strt) / (ProbHi[1] - y_strt) : zero;
374  amrex::Real eta = std::max(eta_lo,eta_hi);
375  amrex::Real Factor = std::max(xi*xi,eta*eta) * F1;
376 
377  if (icomp == RhoQ1_comp)
378  {
379  amrex::Real exner_pi = getExnergivenRTh(data_arr(i,j,k,RhoTheta_comp),l_rdOcp,
380  data_arr(i,j,k,RhoQ1_comp)/data_arr(i,j,k,Rho_comp));
381 
382  // qv
383  amrex::Real delta = arr_xlo(i,j,k,0) - data_arr(i,j,k,icomp);
384  rhs_arr(i,j,k,icomp) += Factor*delta;
385 
386  if (bdy_moist_nudge_type==2) {
387  // NOTE: we only operate on qv (above), qc and qi here; the
388  // precipitating species (qr/qs/qg) are left untouched.
389 
390  // qc and heat source term due to evaporation
391  delta = -data_arr(i,j,k,RhoQ2_comp); // This effectively nudges to 0
392  rhs_arr(i,j,k,RhoQ2_comp ) += Factor * delta;
393  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * cond_fac / exner_pi;
394 
395  // qi and heat source term due to sublimation
396  if (nq > 3) { // nq > 3 guarantees that RhoQ3 is ice
397  delta = -data_arr(i,j,k,RhoQ3_comp); // This effectively nudges to 0
398  rhs_arr(i,j,k,RhoQ3_comp ) += Factor * delta;
399  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * sub_fac / exner_pi;
400  }
401  } // moist_nudge_type
402  } else {
403  for (int n = 0; n < nq; n++) {
404  amrex::Real delta = arr_xlo(i,j,k,n) - data_arr(i,j,k,n+icomp);
405  rhs_arr(i,j,k,n+icomp) += Factor*delta;
406  }
407  }
408  },
409  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
410  {
411  // Corners with x boxes
412  amrex::Real x = ProbLo[0] + (i + ioff) * dx[0];
413  amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
414  amrex::Real x_strt = ProbHi[0] - width * dx[0];
415  amrex::Real y_strt = ProbHi[1] - width * dx[1];
416  amrex::Real y_end = ProbLo[1] + width * dx[1];
417  amrex::Real xi = (x - x_strt) / (ProbHi[0] - x_strt);
418  amrex::Real eta_lo = (y < y_end ) ? (y_end - y) / (y_end - ProbLo[1]) : zero;
419  amrex::Real eta_hi = (y > y_strt) ? (y - y_strt) / (ProbHi[1] - y_strt) : zero;
420  amrex::Real eta = std::max(eta_lo,eta_hi);
421  amrex::Real Factor = std::max(xi*xi,eta*eta) * F1;
422 
423  if (icomp == RhoQ1_comp)
424  {
425  amrex::Real exner_pi = getExnergivenRTh(data_arr(i,j,k,RhoTheta_comp),l_rdOcp,
426  data_arr(i,j,k,RhoQ1_comp)/data_arr(i,j,k,Rho_comp));
427 
428  // qv
429  amrex::Real delta = arr_xhi(i,j,k,0) - data_arr(i,j,k,icomp);
430  rhs_arr(i,j,k,icomp) += Factor*delta;
431 
432  if (bdy_moist_nudge_type==2) {
433  // NOTE: we only operate on qv (above), qc and qi here; the
434  // precipitating species (qr/qs/qg) are left untouched.
435 
436  // qc and heat source term due to evaporation
437  delta = -data_arr(i,j,k,RhoQ2_comp); // This effectively nudges to 0
438  rhs_arr(i,j,k,RhoQ2_comp ) += Factor*delta;
439  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * cond_fac / exner_pi;
440 
441  // qi and heat source term due to sublimation
442  if (nq > 3) { // nq > 3 guarantees that RhoQ3 is ice
443  delta = -data_arr(i,j,k,RhoQ3_comp); // This effectively nudges to 0
444  rhs_arr(i,j,k,RhoQ3_comp ) += Factor * delta;
445  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * sub_fac / exner_pi;
446  }
447  } // moist_nudge_type
448  } else {
449  for (int n = 0; n < nq; n++) {
450  amrex::Real delta = arr_xhi(i,j,k,n) - data_arr(i,j,k,n+icomp);
451  rhs_arr(i,j,k,n+icomp) += Factor*delta;
452  }
453  }
454  });
455 
456  amrex::ParallelFor( bx_ylo, bx_yhi,
457  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
458  {
459  // No corners for y boxes
460  amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
461  amrex::Real y_end = ProbLo[1] + width * dx[1];
462  amrex::Real eta = (y_end - y) / (y_end - ProbLo[1]);
463  amrex::Real Factor = eta*eta * F1;
464 
465  if (icomp == RhoQ1_comp)
466  {
467  amrex::Real exner_pi = getExnergivenRTh(data_arr(i,j,k,RhoTheta_comp),l_rdOcp,
468  data_arr(i,j,k,RhoQ1_comp)/data_arr(i,j,k,Rho_comp));
469  // qv
470  amrex::Real delta = arr_ylo(i,j,k,0) - data_arr(i,j,k,icomp);
471  rhs_arr(i,j,k,icomp) += Factor*delta;
472 
473  if (bdy_moist_nudge_type==2) {
474  // NOTE: we only operate on qv (above), qc and qi here; the
475  // precipitating species (qr/qs/qg) are left untouched.
476 
477  // qc and heat source term due to evaporation
478  delta = -data_arr(i,j,k,RhoQ2_comp); // This effectively nudges to 0
479  rhs_arr(i,j,k,RhoQ2_comp ) += Factor*delta;
480  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * cond_fac / exner_pi;
481 
482  // qi and heat source term due to sublimation
483  if (nq > 3) { // nq > 3 guarantees that RhoQ3 is ice
484  delta = -data_arr(i,j,k,RhoQ3_comp); // This effectively nudges to 0
485  rhs_arr(i,j,k,RhoQ3_comp ) += Factor * delta;
486  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * sub_fac / exner_pi;
487  }
488  } // moist_nudge_type
489  } else {
490  for (int n = 0; n < nq; n++) {
491  amrex::Real delta = arr_ylo(i,j,k,n) - data_arr(i,j,k,n+icomp);
492  rhs_arr(i,j,k,n+icomp) += Factor*delta;
493  }
494  }
495  },
496  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
497  {
498  // No corners for y boxes
499  amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
500  amrex::Real y_strt = ProbHi[1] - width * dx[1];
501  amrex::Real eta = (y - y_strt) / (ProbHi[1] - y_strt);
502  amrex::Real Factor = eta*eta * F1;
503 
504  if (icomp == RhoQ1_comp)
505  {
506  amrex::Real exner_pi = getExnergivenRTh(data_arr(i,j,k,RhoTheta_comp),l_rdOcp,
507  data_arr(i,j,k,RhoQ1_comp)/data_arr(i,j,k,Rho_comp));
508  // qv
509  amrex::Real delta = arr_yhi(i,j,k,0) - data_arr(i,j,k,icomp);
510  rhs_arr(i,j,k,icomp) += Factor*delta;
511 
512  if (bdy_moist_nudge_type==2) {
513  // NOTE: we only operate on qv (above), qc and qi here; the
514  // precipitating species (qr/qs/qg) are left untouched.
515 
516  // qc and heat source term due to evaporation
517  delta = -data_arr(i,j,k,RhoQ2_comp); // This effectively nudges to 0
518  rhs_arr(i,j,k,RhoQ2_comp ) += Factor * delta;
519  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * cond_fac / exner_pi;
520 
521  // qi and heat source term due to sublimation
522  if (nq > 3) { // nq > 3 guarantees that RhoQ3 is ice
523  delta = -data_arr(i,j,k,RhoQ3_comp); // This effectively nudges to 0
524  rhs_arr(i,j,k,RhoQ3_comp ) += Factor * delta;
525  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * sub_fac / exner_pi;
526  }
527  } // moist_nudge_type
528  } else {
529  for (int n = 0; n < nq; n++) {
530  amrex::Real delta = arr_yhi(i,j,k,n) - data_arr(i,j,k,n+icomp);
531  rhs_arr(i,j,k,n+icomp) += Factor*delta;
532  }
533  }
534  });
535 }
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real getExnergivenRTh(const amrex::Real rhotheta, const amrex::Real rdOcp, const amrex::Real qv=amrex::Real(0))
Definition: ERF_EOS.H:156
#define Rho_comp
Definition: ERF_IndexDefines.H:39
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:40
#define RhoQ2_comp
Definition: ERF_IndexDefines.H:46
#define RhoQ3_comp
Definition: ERF_IndexDefines.H:47
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:45
const Real rdOcp
Definition: ERF_InitCustomPert_ABL.H:72
constexpr amrex::Real lsub
Definition: ERF_MicrophysicsConstants.H:111
constexpr amrex::Real lcond
Definition: ERF_MicrophysicsConstants.H:109

Referenced by realbdy_compute_interior_ghost_rhs().

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

◆ realbdy_interior_bxs_xy()

void realbdy_interior_bxs_xy ( const amrex::Box &  bx,
const amrex::Box &  domain,
const int &  width,
amrex::Box &  bx_xlo,
amrex::Box &  bx_xhi,
amrex::Box &  bx_ylo,
amrex::Box &  bx_yhi,
const amrex::IntVect &  ng_vect = amrex::IntVect(0, 0, 0),
const bool  get_int_ng = false 
)

◆ rebalance_columns()

void rebalance_columns ( amrex::MultiFab &  rho,
amrex::MultiFab &  theta,
const amrex::MultiFab &  qt,
const amrex::MultiFab &  qv,
const amrex::MultiFab *  z_phys,
const amrex::Geometry &  geom,
const bool &  maintain_Th,
bool  use_sfc = false 
)

◆ thinbody_wall_dist()

void thinbody_wall_dist ( std::unique_ptr< amrex::MultiFab > &  wdist,
amrex::Vector< amrex::IntVect > &  xfaces,
amrex::Vector< amrex::IntVect > &  yfaces,
amrex::Vector< amrex::IntVect > &  zfaces,
const amrex::Geometry &  geomdata,
std::unique_ptr< amrex::MultiFab > &  z_phys_cc 
)

Compute the distance to thin-body walls.

Parameters
[out]wdistMultiFab to store wall distances.
[in]xfacesIndices of x-faces forming walls.
[in]yfacesIndices of y-faces forming walls.
[in]zfacesIndices of z-faces forming walls.
[in]geomdataGeometry used for physical distance.
[in]z_phys_ccCell-centered physical height.

◆ Time_Avg_Vel_atCC()

void Time_Avg_Vel_atCC ( double  dt,
double &  t_avg_cnt,
amrex::MultiFab *  vel_t_avg,
amrex::MultiFab &  xvel,
amrex::MultiFab &  yvel,
amrex::MultiFab &  zvel 
)

◆ VelocityToMomentum()

void VelocityToMomentum ( const amrex::MultiFab &  xvel_in,
const amrex::IntVect &  xvel_ngrow,
const amrex::MultiFab &  yvel_in,
const amrex::IntVect &  yvel_ngrow,
const amrex::MultiFab &  zvel_in,
const amrex::IntVect &  zvel_ngrow,
const amrex::MultiFab &  cons_in,
amrex::MultiFab &  xmom_out,
amrex::MultiFab &  ymom_out,
amrex::MultiFab &  zmom_out,
const amrex::Box &  domain,
const amrex::Vector< amrex::BCRec > &  domain_bcs_type_h,
const amrex::MultiFab *  c_vfrac = nullptr 
)

◆ WeatherDataInterpolation()

void WeatherDataInterpolation ( const double  time)

Referenced by ERF::Evolve(), and ERF::init_stuff().

Here is the caller graph for this function:

◆ wrf_bdy_has_separate_hydrometeors()

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool wrf_bdy_has_separate_hydrometeors ( const MoistureComponentIndices moisture_indices)
noexcept

True when ERF carries all five hydrometeor mass species separately.

33 {
34  return moisture_indices.qc >= 0 && moisture_indices.qi >= 0 &&
35  moisture_indices.qr >= 0 && moisture_indices.qs >= 0 &&
36  moisture_indices.qg >= 0;
37 }
int qs
snow
Definition: ERF_DataStruct.H:238
int qr
rain
Definition: ERF_DataStruct.H:237
int qi
cloud ice
Definition: ERF_DataStruct.H:236
int qc
cloud liquid water
Definition: ERF_DataStruct.H:235
int qg
graupel
Definition: ERF_DataStruct.H:239

Referenced by ERF::InitData_post(), and ERF::timeStep().

Here is the caller graph for this function:

◆ wrf_bdy_var_for_moisture_component()

int wrf_bdy_var_for_moisture_component ( const int  comp,
const MoistureComponentIndices moisture_indices,
const bool  use_wrf_bdy_qc_qi,
const bool  separate_hydrometeors = false 
)
inline

Map an active conserved moisture component to its real-boundary field.

45 {
46  if (comp == moisture_indices.qv) { return RealBdyVars::QV; }
47  if (use_wrf_bdy_qc_qi) {
48  if (comp == moisture_indices.qc) { return RealBdyVars::QC; }
49  if (moisture_indices.qi >= 0 && comp == moisture_indices.qi) {
50  return RealBdyVars::QI;
51  }
52  if (separate_hydrometeors) {
53  if (comp == moisture_indices.qr) { return RealBdyHydrometeorVars::QR; }
54  if (comp == moisture_indices.qs) { return RealBdyHydrometeorVars::QS; }
55  if (comp == moisture_indices.qg) { return RealBdyHydrometeorVars::QG; }
56  }
57  }
58  return -1;
59 }
@ QG
Definition: ERF_IndexDefines.H:144
@ QR
Definition: ERF_IndexDefines.H:142
@ QS
Definition: ERF_IndexDefines.H:143
@ QV
Definition: ERF_IndexDefines.H:129
@ QC
Definition: ERF_IndexDefines.H:131
@ QI
Definition: ERF_IndexDefines.H:132
int qv
water vapor
Definition: ERF_DataStruct.H:234

◆ wrf_moisture_target()

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real wrf_moisture_target ( const amrex::Real  rho,
const amrex::Real  q_n,
const amrex::Real  q_np1,
const amrex::Real  alpha 
)
noexcept

Build one density-weighted, nonnegative WRF moisture target.

23 {
24  const amrex::Real q = (one - alpha) * q_n + alpha * q_np1;
25  return rho * amrex::max(q, amrex::Real(0.0));
26 }
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:30
@ rho
Definition: ERF_Kessler.H:25
@ q
Definition: ERF_WSM6.H:273
real(kind=kind_phys), parameter, private alpha
Definition: ERF_module_mp_wdm6.F90:62