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_Constants.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.
702 {
703  for (amrex::MFIter mfi(dst,amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
704  {
705  const amrex::Box& bx = mfi.growntilebox(nghost);
706  if (bx.ok())
707  {
708  auto dstFab = dst.array(mfi);
709  const auto maskFab = imask.const_array(mfi);
710  ParallelFor(bx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
711  {
712  dstFab(i,j,k) *= (1-maskFab(i,j,k));
713  });
714  }
715  }
716 }
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 
)
674 {
675  for (amrex::MFIter mfi(dst,amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
676  {
677  const amrex::Box& bx = mfi.growntilebox(nghost);
678  if (bx.ok())
679  {
680  auto dstFab = dst.array(mfi);
681  const auto maskFab = imask.const_array(mfi);
682  ParallelFor(bx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
683  {
684  dstFab(i,j,k) *= maskFab(i,j,k);
685  });
686  }
687  }
688 }

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.
756 {
757  return p0 * ( (z - z1) * (z - z2) ) / ( (z0 - z1) * (z0 - z2) )
758  + p1 * ( (z - z0) * (z - z2) ) / ( (z1 - z0) * (z1 - z2) )
759  + p2 * ( (z - z0) * (z - z1) ) / ( (z2 - z0) * (z2 - z1) );
760 }
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 
)
656 {
657  const amrex::GpuArray<int,6> extended_comps = {
658  moisture_comps[0], moisture_comps[1], moisture_comps[2], -1, -1, -1};
660  extended_comps, 3, width, dx, ProbLo, ProbHi, F1,
661  bx_xlo, bx_xhi, bx_ylo, bx_yhi,
662  arr_xlo, arr_xhi, arr_ylo, arr_yhi, data_arr, rhs_arr);
663 }
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:543
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].

561 {
562  const amrex::IntVect iv = bx_xlo.type();
563  const amrex::Real ioff = (iv[0] == 1) ? zero : myhalf;
564  const amrex::Real joff = (iv[1] == 1) ? zero : myhalf;
565 
566  amrex::ParallelFor(bx_xlo, bx_xhi,
567  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
568  {
569  const amrex::Real x = ProbLo[0] + (i + ioff) * dx[0];
570  const amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
571  const amrex::Real x_end = ProbLo[0] + width * dx[0];
572  const amrex::Real y_end = ProbLo[1] + width * dx[1];
573  const amrex::Real y_strt = ProbHi[1] - width * dx[1];
574  const amrex::Real xi = (x_end - x) / (x_end - ProbLo[0]);
575  const amrex::Real eta_lo = (y < y_end) ? (y_end - y) / (y_end - ProbLo[1]) : amrex::Real(0.0);
576  const amrex::Real eta_hi = (y > y_strt) ? (y - y_strt) / (ProbHi[1] - y_strt) : amrex::Real(0.0);
577  const amrex::Real factor = amrex::max(xi*xi, amrex::max(eta_lo,eta_hi)*amrex::max(eta_lo,eta_hi)) * F1;
578  for (int n = 0; n < n_targets; ++n) {
579  const int comp = moisture_comps[n];
580  if (comp >= 0) {
581  rhs_arr(i,j,k,comp) += factor * (arr_xlo(i,j,k,n) - data_arr(i,j,k,comp));
582  }
583  }
584  },
585  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
586  {
587  const amrex::Real x = ProbLo[0] + (i + ioff) * dx[0];
588  const amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
589  const amrex::Real x_strt = ProbHi[0] - width * dx[0];
590  const amrex::Real y_end = ProbLo[1] + width * dx[1];
591  const amrex::Real y_strt = ProbHi[1] - width * dx[1];
592  const amrex::Real xi = (x - x_strt) / (ProbHi[0] - x_strt);
593  const amrex::Real eta_lo = (y < y_end) ? (y_end - y) / (y_end - ProbLo[1]) : amrex::Real(0.0);
594  const amrex::Real eta_hi = (y > y_strt) ? (y - y_strt) / (ProbHi[1] - y_strt) : amrex::Real(0.0);
595  const amrex::Real eta = amrex::max(eta_lo,eta_hi);
596  const amrex::Real factor = amrex::max(xi*xi, eta*eta) * F1;
597  for (int n = 0; n < n_targets; ++n) {
598  const int comp = moisture_comps[n];
599  if (comp >= 0) {
600  rhs_arr(i,j,k,comp) += factor * (arr_xhi(i,j,k,n) - data_arr(i,j,k,comp));
601  }
602  }
603  });
604 
605  amrex::ParallelFor(bx_ylo, bx_yhi,
606  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
607  {
608  const amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
609  const amrex::Real y_end = ProbLo[1] + width * dx[1];
610  const amrex::Real eta = (y_end - y) / (y_end - ProbLo[1]);
611  const amrex::Real factor = eta*eta * F1;
612  for (int n = 0; n < n_targets; ++n) {
613  const int comp = moisture_comps[n];
614  if (comp >= 0) {
615  rhs_arr(i,j,k,comp) += factor * (arr_ylo(i,j,k,n) - data_arr(i,j,k,comp));
616  }
617  }
618  },
619  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
620  {
621  const amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
622  const amrex::Real y_strt = ProbHi[1] - width * dx[1];
623  const amrex::Real eta = (y - y_strt) / (ProbHi[1] - y_strt);
624  const amrex::Real factor = eta*eta * F1;
625  for (int n = 0; n < n_targets; ++n) {
626  const int comp = moisture_comps[n];
627  if (comp >= 0) {
628  rhs_arr(i,j,k,comp) += factor * (arr_yhi(i,j,k,n) - data_arr(i,j,k,comp));
629  }
630  }
631  });
632 }
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
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
349 {
350  amrex::IntVect iv = bx_xlo.type();
351  amrex::Real ioff = (iv[0]==1) ? zero : myhalf;
352  amrex::Real joff = (iv[1]==1) ? zero : myhalf;
353 
354  // These are defined in ERF_Constants.H
355  amrex::Real l_rdOcp = rdOcp;
356  amrex::Real cond_fac = lcond / c_p; // condensation
357  amrex::Real sub_fac = lsub / c_p; // sublimation
358 
359  int nq = num_var;
360 
361  amrex::ParallelFor( bx_xlo, bx_xhi,
362  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
363  {
364  // Corners with x boxes
365  amrex::Real x = ProbLo[0] + (i + ioff) * dx[0];
366  amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
367  amrex::Real x_end = ProbLo[0] + width * dx[0];
368  amrex::Real y_end = ProbLo[1] + width * dx[1];
369  amrex::Real y_strt = ProbHi[1] - width * dx[1];
370  amrex::Real xi = (x_end - x) / (x_end - ProbLo[0]);
371  amrex::Real eta_lo = (y < y_end ) ? (y_end - y) / (y_end - ProbLo[1]) : zero;
372  amrex::Real eta_hi = (y > y_strt) ? (y - y_strt) / (ProbHi[1] - y_strt) : zero;
373  amrex::Real eta = std::max(eta_lo,eta_hi);
374  amrex::Real Factor = std::max(xi*xi,eta*eta) * F1;
375 
376  if (icomp == RhoQ1_comp)
377  {
378  amrex::Real exner_pi = getExnergivenRTh(data_arr(i,j,k,RhoTheta_comp),l_rdOcp,
379  data_arr(i,j,k,RhoQ1_comp)/data_arr(i,j,k,Rho_comp));
380 
381  // qv
382  amrex::Real delta = arr_xlo(i,j,k,0) - data_arr(i,j,k,icomp);
383  rhs_arr(i,j,k,icomp) += Factor*delta;
384 
385  if (bdy_moist_nudge_type==2) {
386  // NOTE: we only operate on qv (above), qc and qi here; the
387  // precipitating species (qr/qs/qg) are left untouched.
388 
389  // qc and heat source term due to evaporation
390  delta = -data_arr(i,j,k,RhoQ2_comp); // This effectively nudges to 0
391  rhs_arr(i,j,k,RhoQ2_comp ) += Factor * delta;
392  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * cond_fac / exner_pi;
393 
394  // qi and heat source term due to sublimation
395  if (nq > 3) { // nq > 3 guarantees that RhoQ3 is ice
396  delta = -data_arr(i,j,k,RhoQ3_comp); // This effectively nudges to 0
397  rhs_arr(i,j,k,RhoQ3_comp ) += Factor * delta;
398  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * sub_fac / exner_pi;
399  }
400  } // moist_nudge_type
401  } else {
402  for (int n = 0; n < nq; n++) {
403  amrex::Real delta = arr_xlo(i,j,k,n) - data_arr(i,j,k,n+icomp);
404  rhs_arr(i,j,k,n+icomp) += Factor*delta;
405  }
406  }
407  },
408  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
409  {
410  // Corners with x boxes
411  amrex::Real x = ProbLo[0] + (i + ioff) * dx[0];
412  amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
413  amrex::Real x_strt = ProbHi[0] - width * dx[0];
414  amrex::Real y_strt = ProbHi[1] - width * dx[1];
415  amrex::Real y_end = ProbLo[1] + width * dx[1];
416  amrex::Real xi = (x - x_strt) / (ProbHi[0] - x_strt);
417  amrex::Real eta_lo = (y < y_end ) ? (y_end - y) / (y_end - ProbLo[1]) : zero;
418  amrex::Real eta_hi = (y > y_strt) ? (y - y_strt) / (ProbHi[1] - y_strt) : zero;
419  amrex::Real eta = std::max(eta_lo,eta_hi);
420  amrex::Real Factor = std::max(xi*xi,eta*eta) * F1;
421 
422  if (icomp == RhoQ1_comp)
423  {
424  amrex::Real exner_pi = getExnergivenRTh(data_arr(i,j,k,RhoTheta_comp),l_rdOcp,
425  data_arr(i,j,k,RhoQ1_comp)/data_arr(i,j,k,Rho_comp));
426 
427  // qv
428  amrex::Real delta = arr_xhi(i,j,k,0) - data_arr(i,j,k,icomp);
429  rhs_arr(i,j,k,icomp) += Factor*delta;
430 
431  if (bdy_moist_nudge_type==2) {
432  // NOTE: we only operate on qv (above), qc and qi here; the
433  // precipitating species (qr/qs/qg) are left untouched.
434 
435  // qc and heat source term due to evaporation
436  delta = -data_arr(i,j,k,RhoQ2_comp); // This effectively nudges to 0
437  rhs_arr(i,j,k,RhoQ2_comp ) += Factor*delta;
438  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * cond_fac / exner_pi;
439 
440  // qi and heat source term due to sublimation
441  if (nq > 3) { // nq > 3 guarantees that RhoQ3 is ice
442  delta = -data_arr(i,j,k,RhoQ3_comp); // This effectively nudges to 0
443  rhs_arr(i,j,k,RhoQ3_comp ) += Factor * delta;
444  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * sub_fac / exner_pi;
445  }
446  } // moist_nudge_type
447  } else {
448  for (int n = 0; n < nq; n++) {
449  amrex::Real delta = arr_xhi(i,j,k,n) - data_arr(i,j,k,n+icomp);
450  rhs_arr(i,j,k,n+icomp) += Factor*delta;
451  }
452  }
453  });
454 
455  amrex::ParallelFor( bx_ylo, bx_yhi,
456  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
457  {
458  // No corners for y boxes
459  amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
460  amrex::Real y_end = ProbLo[1] + width * dx[1];
461  amrex::Real eta = (y_end - y) / (y_end - ProbLo[1]);
462  amrex::Real Factor = eta*eta * F1;
463 
464  if (icomp == RhoQ1_comp)
465  {
466  amrex::Real exner_pi = getExnergivenRTh(data_arr(i,j,k,RhoTheta_comp),l_rdOcp,
467  data_arr(i,j,k,RhoQ1_comp)/data_arr(i,j,k,Rho_comp));
468  // qv
469  amrex::Real delta = arr_ylo(i,j,k,0) - data_arr(i,j,k,icomp);
470  rhs_arr(i,j,k,icomp) += Factor*delta;
471 
472  if (bdy_moist_nudge_type==2) {
473  // NOTE: we only operate on qv (above), qc and qi here; the
474  // precipitating species (qr/qs/qg) are left untouched.
475 
476  // qc and heat source term due to evaporation
477  delta = -data_arr(i,j,k,RhoQ2_comp); // This effectively nudges to 0
478  rhs_arr(i,j,k,RhoQ2_comp ) += Factor*delta;
479  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * cond_fac / exner_pi;
480 
481  // qi and heat source term due to sublimation
482  if (nq > 3) { // nq > 3 guarantees that RhoQ3 is ice
483  delta = -data_arr(i,j,k,RhoQ3_comp); // This effectively nudges to 0
484  rhs_arr(i,j,k,RhoQ3_comp ) += Factor * delta;
485  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * sub_fac / exner_pi;
486  }
487  } // moist_nudge_type
488  } else {
489  for (int n = 0; n < nq; n++) {
490  amrex::Real delta = arr_ylo(i,j,k,n) - data_arr(i,j,k,n+icomp);
491  rhs_arr(i,j,k,n+icomp) += Factor*delta;
492  }
493  }
494  },
495  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
496  {
497  // No corners for y boxes
498  amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
499  amrex::Real y_strt = ProbHi[1] - width * dx[1];
500  amrex::Real eta = (y - y_strt) / (ProbHi[1] - y_strt);
501  amrex::Real Factor = eta*eta * F1;
502 
503  if (icomp == RhoQ1_comp)
504  {
505  amrex::Real exner_pi = getExnergivenRTh(data_arr(i,j,k,RhoTheta_comp),l_rdOcp,
506  data_arr(i,j,k,RhoQ1_comp)/data_arr(i,j,k,Rho_comp));
507  // qv
508  amrex::Real delta = arr_yhi(i,j,k,0) - data_arr(i,j,k,icomp);
509  rhs_arr(i,j,k,icomp) += Factor*delta;
510 
511  if (bdy_moist_nudge_type==2) {
512  // NOTE: we only operate on qv (above), qc and qi here; the
513  // precipitating species (qr/qs/qg) are left untouched.
514 
515  // qc and heat source term due to evaporation
516  delta = -data_arr(i,j,k,RhoQ2_comp); // This effectively nudges to 0
517  rhs_arr(i,j,k,RhoQ2_comp ) += Factor * delta;
518  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * cond_fac / exner_pi;
519 
520  // qi and heat source term due to sublimation
521  if (nq > 3) { // nq > 3 guarantees that RhoQ3 is ice
522  delta = -data_arr(i,j,k,RhoQ3_comp); // This effectively nudges to 0
523  rhs_arr(i,j,k,RhoQ3_comp ) += Factor * delta;
524  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * sub_fac / exner_pi;
525  }
526  } // moist_nudge_type
527  } else {
528  for (int n = 0; n < nq; n++) {
529  amrex::Real delta = arr_yhi(i,j,k,n) - data_arr(i,j,k,n+icomp);
530  rhs_arr(i,j,k,n+icomp) += Factor*delta;
531  }
532  }
533  });
534 }
constexpr amrex::Real lsub
Definition: ERF_Constants.H:111
constexpr amrex::Real lcond
Definition: ERF_Constants.H:109
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

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.

32 {
33  return moisture_indices.qc >= 0 && moisture_indices.qi >= 0 &&
34  moisture_indices.qr >= 0 && moisture_indices.qs >= 0 &&
35  moisture_indices.qg >= 0;
36 }
int qs
snow
Definition: ERF_DataStruct.H:210
int qr
rain
Definition: ERF_DataStruct.H:209
int qi
cloud ice
Definition: ERF_DataStruct.H:208
int qc
cloud liquid water
Definition: ERF_DataStruct.H:207
int qg
graupel
Definition: ERF_DataStruct.H:211

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.

44 {
45  if (comp == moisture_indices.qv) { return RealBdyVars::QV; }
46  if (use_wrf_bdy_qc_qi) {
47  if (comp == moisture_indices.qc) { return RealBdyVars::QC; }
48  if (moisture_indices.qi >= 0 && comp == moisture_indices.qi) {
49  return RealBdyVars::QI;
50  }
51  if (separate_hydrometeors) {
52  if (comp == moisture_indices.qr) { return RealBdyHydrometeorVars::QR; }
53  if (comp == moisture_indices.qs) { return RealBdyHydrometeorVars::QS; }
54  if (comp == moisture_indices.qg) { return RealBdyHydrometeorVars::QG; }
55  }
56  }
57  return -1;
58 }
@ 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:206

◆ 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.

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