ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_TI_fast_headers.H
Go to the documentation of this file.
1 #ifndef ERF_FAST_INTEGRATION_H_
2 #define ERF_FAST_INTEGRATION_H_
3 
4 #include <AMReX_MultiFab.H>
5 #include <AMReX_BCRec.H>
6 #include <AMReX_YAFluxRegister.H>
7 #include <AMReX_EBMultiFabUtil.H>
8 
9 #include "ERF_DataStruct.H"
10 #include "ERF_IndexDefines.H"
11 #include <ERF_TerrainMetrics.H>
12 #include <ERF_TileNoZ.H>
13 #include <ERF_ProbCommon.H>
14 
15 /**
16  * The coarse/fine face fluxes of the last RK stage, in the units the flux registers hold:
17  * (rho u)/m_uy, (rho v)/m_vx and the time-weighted (rho w)/(m_x m_y) without terrain;
18  * ax (rho u)/m_uy, ay (rho v)/m_vx and the time-weighted Omega/(m_x m_y) with it.
19  *
20  * A coarse level records in rec[dir] the flux each substep applied through every face, and in
21  * rec_w the vertical quantity its z-faces hold at the end of the substep -- (rho w) without
22  * terrain, Omega with it -- and in rec_w_old the same at the start of the substep. A fine level
23  * takes the fluxes in tgt[dir] (component 0) on the faces where component 1 is one -- its
24  * coarse/fine faces -- in place of its own, and tgt_w as that vertical quantity there at the
25  * end of the substep. The fine level's fluxes through its boundary then add up to the coarse
26  * ones.
27  */
28 struct CFFaceFluxes {
29  std::array<amrex::MultiFab*, AMREX_SPACEDIM> rec {{AMREX_D_DECL(nullptr, nullptr, nullptr)}};
30  amrex::MultiFab* rec_w = nullptr;
31  amrex::MultiFab* rec_w_old = nullptr;
32  std::array<const amrex::MultiFab*, AMREX_SPACEDIM> tgt {{AMREX_D_DECL(nullptr, nullptr, nullptr)}};
33  const amrex::MultiFab* tgt_w = nullptr;
34 };
35 
36 /**
37  * Function for computing the fast RHS with no terrain but constant or stretched vertical resolution
38  *
39  */
40 void erf_substep_NS (int step, int nrk, int level, int finest_level,
41  amrex::Vector<amrex::MultiFab >& S_slow_rhs,
42  const amrex::Vector<amrex::MultiFab >& S_prev,
43  amrex::Vector<amrex::MultiFab >& S_stage_data,
44  const amrex::MultiFab& S_stage_prim,
45  const amrex::MultiFab& qt,
46  const amrex::MultiFab& pi_stage,
47  const amrex::MultiFab& fast_coeffs,
48  amrex::Vector<amrex::MultiFab >& S_data,
49  amrex::MultiFab& lagged_delta_rt,
50  amrex::MultiFab& avg_xmom,
51  amrex::MultiFab& avg_ymom,
52  amrex::MultiFab& avg_zmom,
53  const amrex::MultiFab& cc_src,
54  const amrex::MultiFab& xmom_src,
55  const amrex::MultiFab& ymom_src,
56  const amrex::MultiFab& zmom_src,
57  const amrex::Geometry geom,
58  const amrex::Real gravity,
59  amrex::Gpu::DeviceVector<amrex::Real>& stretched_dz_d,
60  const double dtau,
61  const amrex::Real facinv,
62  amrex::Vector<std::unique_ptr<amrex::MultiFab>>& mapfac,
63  amrex::YAFluxRegister* fr_as_crse,
64  amrex::YAFluxRegister* fr_as_fine,
65  bool l_use_moisture, bool l_reflux, bool l_real_bc,
66  const amrex::Real* sinesq_at_lev_d,
67  const amrex::Real l_damp_coef,
68  const amrex::Real beta_d,
69  const CFFaceFluxes& cf_fluxes);
70 
71 /**
72  * Function for computing the fast RHS with fixed-in-time terrain
73  *
74  */
75 void erf_substep_T (int step, int nrk, int level, int finest_level,
76  amrex::Vector<amrex::MultiFab >& S_slow_rhs,
77  const amrex::Vector<amrex::MultiFab >& S_prev,
78  amrex::Vector<amrex::MultiFab >& S_stage_data,
79  const amrex::MultiFab& S_stage_prim,
80  const amrex::MultiFab& qt,
81  const amrex::MultiFab& pi_stage,
82  const amrex::MultiFab& fast_coeffs,
83  amrex::Vector<amrex::MultiFab >& S_data,
84  amrex::MultiFab& lagged_delta_rt,
85  amrex::MultiFab& avg_xmom,
86  amrex::MultiFab& avg_ymom,
87  amrex::MultiFab& avg_zmom,
88  const amrex::MultiFab& cc_src,
89  const amrex::MultiFab& xmom_src,
90  const amrex::MultiFab& ymom_src,
91  const amrex::MultiFab& zmom_src,
92  const amrex::Geometry geom,
93  const amrex::Real gravity,
94  std::unique_ptr<amrex::MultiFab>& z_phys_nd,
95  std::unique_ptr<amrex::MultiFab>& detJ_cc,
96  const double dtau,
97  const amrex::Real facinv,
98  amrex::Vector<std::unique_ptr<amrex::MultiFab>>& mapfac,
99  amrex::YAFluxRegister* fr_as_crse,
100  amrex::YAFluxRegister* fr_as_fine,
101  bool l_use_moisture, bool l_reflux, bool l_real_bc,
102  const amrex::Real* sinesq_at_lev_d,
103  const amrex::Real l_damp_coef,
104  const amrex::Real beta_d,
105  const CFFaceFluxes& cf_fluxes);
106 
107 /**
108  * Function for computing the fast RHS with moving terrain
109  *
110  */
111 void erf_substep_MT (int step, int nrk, int level, int finest_level,
112  amrex::Vector<amrex::MultiFab >& S_slow_rhs,
113  const amrex::Vector<amrex::MultiFab >& S_prev,
114  amrex::Vector<amrex::MultiFab >& S_stg_data,
115  const amrex::MultiFab& S_stg_prim,
116  const amrex::MultiFab& qt,
117  const amrex::MultiFab& pi_stage,
118  const amrex::MultiFab& fast_coeffs,
119  amrex::Vector<amrex::MultiFab >& S_data,
120  amrex::MultiFab& lagged_delta_rt,
121  amrex::MultiFab& avg_xmom,
122  amrex::MultiFab& avg_ymom,
123  amrex::MultiFab& avg_zmom,
124  const amrex::MultiFab& cc_src,
125  const amrex::MultiFab& xmom_src,
126  const amrex::MultiFab& ymom_src,
127  const amrex::MultiFab& zmom_src,
128  const amrex::Geometry geom,
129  const amrex::Real gravity,
130  const bool use_lagged_delta_rt,
131  std::unique_ptr<amrex::MultiFab>& z_t_rk,
132  const amrex::MultiFab* z_t_pert,
133  std::unique_ptr<amrex::MultiFab>& z_phys_nd_old,
134  std::unique_ptr<amrex::MultiFab>& z_phys_nd_new,
135  std::unique_ptr<amrex::MultiFab>& z_phys_nd_stg,
136  std::unique_ptr<amrex::MultiFab>& detJ_cc_old,
137  std::unique_ptr<amrex::MultiFab>& detJ_cc_new,
138  std::unique_ptr<amrex::MultiFab>& detJ_cc_stg,
139  const double dtau,
140  const amrex::Real facinv,
141  amrex::Vector<std::unique_ptr<amrex::MultiFab>>& mapfac,
142  amrex::YAFluxRegister* fr_as_crse,
143  amrex::YAFluxRegister* fr_as_fine,
144  bool l_use_moisture, bool l_reflux, bool l_real_bc,
145  const amrex::Real* sinesq_at_lev_d,
146  const amrex::Real l_damp_coef,
147  const amrex::Real beta_d);
148 
149 /**
150  * Function for computing the coefficients for the tridiagonal solver used in the fast
151  * integrator (the acoustic substepping).
152  */
153 void make_fast_coeffs (int level,
154  amrex::MultiFab& fast_coeffs,
155  amrex::Vector<amrex::MultiFab >& S_stage_data,
156  const amrex::MultiFab& S_stage_prim,
157  const amrex::MultiFab& pi_stage,
158  const amrex::Geometry geom,
159  const bool use_moisture,
160  const MeshType mesh_type,
161  const amrex::Real gravity,
162  const amrex::Real c_p,
163  std::unique_ptr<amrex::MultiFab>& detJ_cc,
164  const double dtau,
165  const amrex::Real beta_s,
166  const amrex::MultiFab* z_phys_nd,
167  const bool use_variable_beta_s,
168  const amrex::Real beta_s_min,
169  const amrex::Real beta_s_max,
170  amrex::GpuArray<ERF_BC, AMREX_SPACEDIM*2> &phys_bc_type);
171 
172 #endif
const bool use_moisture
Definition: ERF_InitCustomPert_ABL.H:71
amrex::Real Real
Definition: ERF_ShocInterface.H:19
void erf_substep_MT(int step, int nrk, int level, int finest_level, amrex::Vector< amrex::MultiFab > &S_slow_rhs, const amrex::Vector< amrex::MultiFab > &S_prev, amrex::Vector< amrex::MultiFab > &S_stg_data, const amrex::MultiFab &S_stg_prim, const amrex::MultiFab &qt, const amrex::MultiFab &pi_stage, const amrex::MultiFab &fast_coeffs, amrex::Vector< amrex::MultiFab > &S_data, amrex::MultiFab &lagged_delta_rt, amrex::MultiFab &avg_xmom, amrex::MultiFab &avg_ymom, amrex::MultiFab &avg_zmom, const amrex::MultiFab &cc_src, const amrex::MultiFab &xmom_src, const amrex::MultiFab &ymom_src, const amrex::MultiFab &zmom_src, const amrex::Geometry geom, const amrex::Real gravity, const bool use_lagged_delta_rt, std::unique_ptr< amrex::MultiFab > &z_t_rk, const amrex::MultiFab *z_t_pert, std::unique_ptr< amrex::MultiFab > &z_phys_nd_old, std::unique_ptr< amrex::MultiFab > &z_phys_nd_new, std::unique_ptr< amrex::MultiFab > &z_phys_nd_stg, std::unique_ptr< amrex::MultiFab > &detJ_cc_old, std::unique_ptr< amrex::MultiFab > &detJ_cc_new, std::unique_ptr< amrex::MultiFab > &detJ_cc_stg, const double dtau, const amrex::Real facinv, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &mapfac, amrex::YAFluxRegister *fr_as_crse, amrex::YAFluxRegister *fr_as_fine, bool l_use_moisture, bool l_reflux, bool l_real_bc, const amrex::Real *sinesq_at_lev_d, const amrex::Real l_damp_coef, const amrex::Real beta_d)
void make_fast_coeffs(int level, amrex::MultiFab &fast_coeffs, amrex::Vector< amrex::MultiFab > &S_stage_data, const amrex::MultiFab &S_stage_prim, const amrex::MultiFab &pi_stage, const amrex::Geometry geom, const bool use_moisture, const MeshType mesh_type, const amrex::Real gravity, const amrex::Real c_p, std::unique_ptr< amrex::MultiFab > &detJ_cc, const double dtau, const amrex::Real beta_s, const amrex::MultiFab *z_phys_nd, const bool use_variable_beta_s, const amrex::Real beta_s_min, const amrex::Real beta_s_max, amrex::GpuArray< ERF_BC, AMREX_SPACEDIM *2 > &phys_bc_type)
void erf_substep_NS(int step, int nrk, int level, int finest_level, amrex::Vector< amrex::MultiFab > &S_slow_rhs, const amrex::Vector< amrex::MultiFab > &S_prev, amrex::Vector< amrex::MultiFab > &S_stage_data, const amrex::MultiFab &S_stage_prim, const amrex::MultiFab &qt, const amrex::MultiFab &pi_stage, const amrex::MultiFab &fast_coeffs, amrex::Vector< amrex::MultiFab > &S_data, amrex::MultiFab &lagged_delta_rt, amrex::MultiFab &avg_xmom, amrex::MultiFab &avg_ymom, amrex::MultiFab &avg_zmom, const amrex::MultiFab &cc_src, const amrex::MultiFab &xmom_src, const amrex::MultiFab &ymom_src, const amrex::MultiFab &zmom_src, const amrex::Geometry geom, const amrex::Real gravity, amrex::Gpu::DeviceVector< amrex::Real > &stretched_dz_d, const double dtau, const amrex::Real facinv, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &mapfac, amrex::YAFluxRegister *fr_as_crse, amrex::YAFluxRegister *fr_as_fine, bool l_use_moisture, bool l_reflux, bool l_real_bc, const amrex::Real *sinesq_at_lev_d, const amrex::Real l_damp_coef, const amrex::Real beta_d, const CFFaceFluxes &cf_fluxes)
void erf_substep_T(int step, int nrk, int level, int finest_level, amrex::Vector< amrex::MultiFab > &S_slow_rhs, const amrex::Vector< amrex::MultiFab > &S_prev, amrex::Vector< amrex::MultiFab > &S_stage_data, const amrex::MultiFab &S_stage_prim, const amrex::MultiFab &qt, const amrex::MultiFab &pi_stage, const amrex::MultiFab &fast_coeffs, amrex::Vector< amrex::MultiFab > &S_data, amrex::MultiFab &lagged_delta_rt, amrex::MultiFab &avg_xmom, amrex::MultiFab &avg_ymom, amrex::MultiFab &avg_zmom, const amrex::MultiFab &cc_src, const amrex::MultiFab &xmom_src, const amrex::MultiFab &ymom_src, const amrex::MultiFab &zmom_src, const amrex::Geometry geom, const amrex::Real gravity, std::unique_ptr< amrex::MultiFab > &z_phys_nd, std::unique_ptr< amrex::MultiFab > &detJ_cc, const double dtau, const amrex::Real facinv, amrex::Vector< std::unique_ptr< amrex::MultiFab >> &mapfac, amrex::YAFluxRegister *fr_as_crse, amrex::YAFluxRegister *fr_as_fine, bool l_use_moisture, bool l_reflux, bool l_real_bc, const amrex::Real *sinesq_at_lev_d, const amrex::Real l_damp_coef, const amrex::Real beta_d, const CFFaceFluxes &cf_fluxes)
@ qt
Definition: ERF_Kessler.H:30
Definition: ERF_TI_fast_headers.H:28
std::array< amrex::MultiFab *, AMREX_SPACEDIM > rec
Definition: ERF_TI_fast_headers.H:29
amrex::MultiFab * rec_w
Definition: ERF_TI_fast_headers.H:30
const amrex::MultiFab * tgt_w
Definition: ERF_TI_fast_headers.H:33
std::array< const amrex::MultiFab *, AMREX_SPACEDIM > tgt
Definition: ERF_TI_fast_headers.H:32
amrex::MultiFab * rec_w_old
Definition: ERF_TI_fast_headers.H:31