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

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

◆ ApplyInvertedMask()

AMREX_GPU_HOST AMREX_FORCE_INLINE void ApplyInvertedMask ( amrex::MultiFab &  dst,
const amrex::iMultiFab &  imask,
const int  nghost = 0 
)
480 {
481  for (amrex::MFIter mfi(dst,amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
482  {
483  const amrex::Box& bx = mfi.growntilebox(nghost);
484  if (bx.ok())
485  {
486  auto dstFab = dst.array(mfi);
487  const auto maskFab = imask.const_array(mfi);
488  ParallelFor(bx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
489  {
490  dstFab(i,j,k) *= (1-maskFab(i,j,k));
491  });
492  }
493  }
494 }
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 
)
458 {
459  for (amrex::MFIter mfi(dst,amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
460  {
461  const amrex::Box& bx = mfi.growntilebox(nghost);
462  if (bx.ok())
463  {
464  auto dstFab = dst.array(mfi);
465  const auto maskFab = imask.const_array(mfi);
466  ParallelFor(bx, [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
467  {
468  dstFab(i,j,k) *= maskFab(i,j,k);
469  });
470  }
471  }
472 }

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 
)

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

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

◆ 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 
)
514 {
515  return p0 * ( (z - z1) * (z - z2) ) / ( (z0 - z1) * (z0 - z2) )
516  + p1 * ( (z - z0) * (z - z2) ) / ( (z1 - z0) * (z1 - z2) )
517  + p2 * ( (z - z0) * (z - z1) ) / ( (z2 - z0) * (z2 - z1) );
518 }
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_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
262 {
263  amrex::IntVect iv = bx_xlo.type();
264  amrex::Real ioff = (iv[0]==1) ? zero : myhalf;
265  amrex::Real joff = (iv[1]==1) ? zero : myhalf;
266 
267  // These are defined in ERF_Constants.H
268  amrex::Real l_rdOcp = rdOcp;
269  amrex::Real cond_fac = lcond / c_p; // condensation
270  amrex::Real sub_fac = lsub / c_p; // sublimation
271 
272  int nq = num_var;
273 
274  amrex::ParallelFor( bx_xlo, bx_xhi,
275  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
276  {
277  // Corners with x boxes
278  amrex::Real x = ProbLo[0] + (i + ioff) * dx[0];
279  amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
280  amrex::Real x_end = ProbLo[0] + width * dx[0];
281  amrex::Real y_end = ProbLo[1] + width * dx[1];
282  amrex::Real y_strt = ProbHi[1] - width * dx[1];
283  amrex::Real xi = (x_end - x) / (x_end - ProbLo[0]);
284  amrex::Real eta_lo = (y < y_end ) ? (y_end - y) / (y_end - ProbLo[1]) : zero;
285  amrex::Real eta_hi = (y > y_strt) ? (y - y_strt) / (ProbHi[1] - y_strt) : zero;
286  amrex::Real eta = std::max(eta_lo,eta_hi);
287  amrex::Real Factor = std::max(xi*xi,eta*eta) * F1;
288 
289  if (icomp == RhoQ1_comp)
290  {
291  amrex::Real exner_pi = getExnergivenRTh(data_arr(i,j,k,RhoTheta_comp),l_rdOcp,
292  data_arr(i,j,k,RhoQ1_comp)/data_arr(i,j,k,Rho_comp));
293 
294  // qv
295  amrex::Real delta = arr_xlo(i,j,k,0) - data_arr(i,j,k,icomp);
296  rhs_arr(i,j,k,icomp) += Factor*delta;
297 
298  if (bdy_moist_nudge_type==2) {
299  // NOTE: we only operate on qv (above), qc and qi here; the
300  // precipitating species (qr/qs/qg) are left untouched.
301 
302  // qc and heat source term due to evaporation
303  delta = -data_arr(i,j,k,RhoQ2_comp); // This effectively nudges to 0
304  rhs_arr(i,j,k,RhoQ2_comp ) += Factor * delta;
305  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * cond_fac / exner_pi;
306 
307  // qi and heat source term due to sublimation
308  if (nq > 3) { // nq > 3 guarantees that RhoQ3 is ice
309  delta = -data_arr(i,j,k,RhoQ3_comp); // This effectively nudges to 0
310  rhs_arr(i,j,k,RhoQ3_comp ) += Factor * delta;
311  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * sub_fac / exner_pi;
312  }
313  } // moist_nudge_type
314  } else {
315  for (int n = 0; n < nq; n++) {
316  amrex::Real delta = arr_xlo(i,j,k,n) - data_arr(i,j,k,n+icomp);
317  rhs_arr(i,j,k,n+icomp) += Factor*delta;
318  }
319  }
320  },
321  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
322  {
323  // Corners with x boxes
324  amrex::Real x = ProbLo[0] + (i + ioff) * dx[0];
325  amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
326  amrex::Real x_strt = ProbHi[0] - width * dx[0];
327  amrex::Real y_strt = ProbHi[1] - width * dx[1];
328  amrex::Real y_end = ProbLo[1] + width * dx[1];
329  amrex::Real xi = (x - x_strt) / (ProbHi[0] - x_strt);
330  amrex::Real eta_lo = (y < y_end ) ? (y_end - y) / (y_end - ProbLo[1]) : zero;
331  amrex::Real eta_hi = (y > y_strt) ? (y - y_strt) / (ProbHi[1] - y_strt) : zero;
332  amrex::Real eta = std::max(eta_lo,eta_hi);
333  amrex::Real Factor = std::max(xi*xi,eta*eta) * F1;
334 
335  if (icomp == RhoQ1_comp)
336  {
337  amrex::Real exner_pi = getExnergivenRTh(data_arr(i,j,k,RhoTheta_comp),l_rdOcp,
338  data_arr(i,j,k,RhoQ1_comp)/data_arr(i,j,k,Rho_comp));
339 
340  // qv
341  amrex::Real delta = arr_xhi(i,j,k,0) - data_arr(i,j,k,icomp);
342  rhs_arr(i,j,k,icomp) += Factor*delta;
343 
344  if (bdy_moist_nudge_type==2) {
345  // NOTE: we only operate on qv (above), qc and qi here; the
346  // precipitating species (qr/qs/qg) are left untouched.
347 
348  // qc and heat source term due to evaporation
349  delta = -data_arr(i,j,k,RhoQ2_comp); // This effectively nudges to 0
350  rhs_arr(i,j,k,RhoQ2_comp ) += Factor*delta;
351  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * cond_fac / exner_pi;
352 
353  // qi and heat source term due to sublimation
354  if (nq > 3) { // nq > 3 guarantees that RhoQ3 is ice
355  delta = -data_arr(i,j,k,RhoQ3_comp); // This effectively nudges to 0
356  rhs_arr(i,j,k,RhoQ3_comp ) += Factor * delta;
357  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * sub_fac / exner_pi;
358  }
359  } // moist_nudge_type
360  } else {
361  for (int n = 0; n < nq; n++) {
362  amrex::Real delta = arr_xhi(i,j,k,n) - data_arr(i,j,k,n+icomp);
363  rhs_arr(i,j,k,n+icomp) += Factor*delta;
364  }
365  }
366  });
367 
368  amrex::ParallelFor( bx_ylo, bx_yhi,
369  [=] AMREX_GPU_DEVICE (int i, int j, int k) noexcept
370  {
371  // No corners for y boxes
372  amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
373  amrex::Real y_end = ProbLo[1] + width * dx[1];
374  amrex::Real eta = (y_end - y) / (y_end - ProbLo[1]);
375  amrex::Real Factor = 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  // qv
382  amrex::Real delta = arr_ylo(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_ylo(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  // No corners for y boxes
411  amrex::Real y = ProbLo[1] + (j + joff) * dx[1];
412  amrex::Real y_strt = ProbHi[1] - width * dx[1];
413  amrex::Real eta = (y - y_strt) / (ProbHi[1] - y_strt);
414  amrex::Real Factor = eta*eta * F1;
415 
416  if (icomp == RhoQ1_comp)
417  {
418  amrex::Real exner_pi = getExnergivenRTh(data_arr(i,j,k,RhoTheta_comp),l_rdOcp,
419  data_arr(i,j,k,RhoQ1_comp)/data_arr(i,j,k,Rho_comp));
420  // qv
421  amrex::Real delta = arr_yhi(i,j,k,0) - data_arr(i,j,k,icomp);
422  rhs_arr(i,j,k,icomp) += Factor*delta;
423 
424  if (bdy_moist_nudge_type==2) {
425  // NOTE: we only operate on qv (above), qc and qi here; the
426  // precipitating species (qr/qs/qg) are left untouched.
427 
428  // qc and heat source term due to evaporation
429  delta = -data_arr(i,j,k,RhoQ2_comp); // This effectively nudges to 0
430  rhs_arr(i,j,k,RhoQ2_comp ) += Factor * delta;
431  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * cond_fac / exner_pi;
432 
433  // qi and heat source term due to sublimation
434  if (nq > 3) { // nq > 3 guarantees that RhoQ3 is ice
435  delta = -data_arr(i,j,k,RhoQ3_comp); // This effectively nudges to 0
436  rhs_arr(i,j,k,RhoQ3_comp ) += Factor * delta;
437  rhs_arr(i,j,k,RhoTheta_comp) += Factor * delta * sub_fac / exner_pi;
438  }
439  } // moist_nudge_type
440  } else {
441  for (int n = 0; n < nq; n++) {
442  amrex::Real delta = arr_yhi(i,j,k,n) - data_arr(i,j,k,n+icomp);
443  rhs_arr(i,j,k,n+icomp) += Factor*delta;
444  }
445  }
446  });
447 }
constexpr amrex::Real lsub
Definition: ERF_Constants.H:111
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
constexpr amrex::Real lcond
Definition: ERF_Constants.H:109
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
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:36
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:37
#define RhoQ2_comp
Definition: ERF_IndexDefines.H:43
#define RhoQ3_comp
Definition: ERF_IndexDefines.H:44
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:42
const Real dx
Definition: ERF_InitCustomPert_ABL.H:23
const Real rdOcp
Definition: ERF_InitCustomPert_Bomex.H:16
amrex::Real Real
Definition: ERF_ShocInterface.H:19

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 
)

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