ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_ShocInterface.H
Go to the documentation of this file.
1 #ifndef ERF_SHOCINTERFACE_H
2 #define ERF_SHOCINTERFACE_H
3 
4 /*
5  * SHOC model interface to ERF -- we use this interface to link to the SHOC code
6  * as cloned from the E3SM git repository: https://github.com/E3SM-Project/E3SM/components/eamxx/src/physics/shoc
7  */
8 
9 #include "physics/shoc/shoc_constants.hpp"
10 #include "physics/shoc/shoc_functions.hpp"
11 #include "share/util/eamxx_common_physics_functions.hpp"
12 
13 #include "ekat_subview_utils.hpp"
14 #include "ekat_parameter_list.hpp"
15 #include "ekat_assert.hpp"
16 #include "ekat_team_policy_utils.hpp"
17 #include "ekat_reduction_utils.hpp"
18 
20 using Int=int;
21 
22 #include <string>
23 #include <type_traits>
24 
25 #include <Kokkos_Core.hpp>
26 #include <AMReX_ParmParse.H>
27 #include <AMReX_MultiFabUtil.H>
28 #include <ERF_DataStruct.H>
29 #include <ERF_Kokkos.H>
30 #include <ERF_IndexDefines.H>
31 #include <ERF_EOS.H>
32 
33 //
34 // NOTE: the checked-in eamxx_config.h defines SCREAM_DOUBLE_PRECISION, so scream::Real is
35 // double and the EAMxx ETI files we compile only instantiate the SHOC templates for
36 // double. We instantiate them below with amrex::Real, so in a single-precision build
37 // we would ask for Functions<float,...> and the link would fail with undefined
38 // references to shoc_main and friends. ERF's CMake refuses that combination up front;
39 // this catches it at compile time for any other build path.
40 //
41 static_assert(std::is_same<Real,double>::value,
42  "EAMxx SHOC requires a double-precision build of ERF: the vendored "
43  "eamxx_config.h builds EAMxx with scream::Real = double, so configure with "
44  "ERF_PRECISION=DOUBLE or disable ERF_ENABLE_EAMXX_SHOC.");
45 
46 //#include "share/atm_process/atmosphere_process.hpp"
47 //#include "share/atm_process/ATMBufferManager.hpp"
48 
50 {
51  using SHF = scream::shoc::Functions<Real, KokkosDefaultDevice>;
52  using PF = scream::PhysicsFunctions<KokkosDefaultDevice>;
53  using C = scream::physics::Constants<Real>;
54  using KT = ekat::KokkosTypes<KokkosDefaultDevice>;
55  using SC = scream::shoc::Constants<Real>;
56 
57  using Spack = typename SHF::Spack;
58  using IntSmallPack = typename SHF::IntSmallPack;
59  using Smask = typename SHF::Smask;
60  using view_1d_int = typename KT::template view_1d<Int>;
61  using view_1d = typename SHF::view_1d<Real>;
62  using view_1d_const = typename SHF::view_1d<const Real>;
63  using view_2d = typename SHF::view_2d<SHF::Spack>;
64  using view_2d_const = typename SHF::view_2d<const Spack>;
65  using sview_2d = typename KT::template view_2d<Real>;
66  using sview_2d_const = typename KT::template view_2d<const Real>;
67  using view_3d = typename SHF::view_3d<Spack>;
68  using view_3d_const = typename SHF::view_3d<const Spack>;
69  using view_3d_strided = typename SHF::view_3d_strided<Spack>;
70 
71  using WSM = ekat::WorkspaceManager<Spack, KT::Device>;
72 
73  template<typename ScalarT>
74  using uview_1d = ekat::Unmanaged<typename KT::template view_1d<ScalarT>>;
75  template<typename ScalarT>
76  using uview_2d = ekat::Unmanaged<typename KT::template view_2d<ScalarT>>;
77 
78 public:
79 
80  // Constructor
81  SHOCInterface (const int& lev,
82  SolverChoice& sc);
83 
84  // Set the grid
85  void
86  set_grids (int& level,
87  const amrex::BoxArray& ba,
88  amrex::Geometry& geom,
89  amrex::MultiFab* cons,
90  amrex::MultiFab* xvel,
91  amrex::MultiFab* yvel,
92  amrex::MultiFab* zvel,
93  amrex::Real* w_subsid,
94  amrex::MultiFab* tau13,
95  amrex::MultiFab* tau23,
96  amrex::MultiFab* hfx3,
97  amrex::MultiFab* qfx3,
98  amrex::MultiFab* eddyDiffs,
99  amrex::MultiFab* z_phys);
100 
101  // Initialize the implementation
102  void
103  initialize_impl ();
104 
105  // Run the implementation
106  void
107  run_impl (const double dt);
108 
109  // Finalize the implementation
110  void
111  finalize_impl (const double dt);
112 
113  // Allocate buffer space
114  void
115  alloc_buffers ();
116 
117  // De-allocate buffer space
118  void
119  dealloc_buffers ();
120 
121  // Fill KOKKOS Views from AMReX MultiFabs
122  void
124 
125  // Fill AMReX MultiFabs from KOKKOS Views
126  void
127  kokkos_buffers_to_mf (const double dt);
128 
129  // The name of the subcomponent
130  std::string
131  name () const { return "shoc"; }
132 
133  // Fill the vert comps of ERF eddyDiffs
134  void
135  set_eddy_diffs ();
136 
137  // Fill the surface stresses
138  void
140 
141  // Add SHOC tendencies to the RHS of the fast vars
142  void
143  add_fast_tend (amrex::Vector<amrex::MultiFab>& S_rhs);
144 
145  // Add SHOC tendencies to the RHS of the slow vars
146  void
147  add_slow_tend (const amrex::MFIter& mfi,
148  const amrex::Box& tbx,
149  const amrex::Array4<amrex::Real>& cc_rhs_arr);
150 
151 #ifndef KOKKOS_ENABLE_CUDA
152  // Cuda requires methods enclosing __device__ lambda's to be public
153 protected:
154 #endif
155 
156  /*--------------------------------------------------------------------------------------------*/
157  // Most individual processes have a pre-processing step that constructs needed variables from
158  // the set of fields stored in the field manager. A structure like this defines those operations,
159  // which can then be called during run_impl in the main .cpp code.
160  // Structure to handle the local generation of data needed by shoc_main in run_impl
161  struct SHOCPreprocess {
162  SHOCPreprocess () = default;
163 
164  KOKKOS_INLINE_FUNCTION
165  void operator()(const Kokkos::TeamPolicy<KT::ExeSpace>::member_type& team) const
166  {
167  const int i = team.league_rank();
168 
169  const Real zvir = C::ZVIR;
170  //const Real cpair = C::Cpair;
171  const Real ggr = C::gravit;
172  const Real inv_ggr = 1/ggr;
173  const Real mintke = SC::mintke;
174 
175  const int nlev_packs = ekat::npack<Spack>(nlev);
176 
177  Kokkos::parallel_for(Kokkos::TeamVectorRange(team, nlev_packs), [&] (const Int& k)
178  {
179  cldfrac_liq_prev(i,k)=cldfrac_liq(i,k);
180 
181  // Inverse of Exner. In non-rel builds, assert that exner != 0 when in range before computing.
182  const Spack exner = PF::exner_function(p_mid(i,k));
183  const Smask nonzero = (exner != 0);
184  EKAT_KERNEL_ASSERT((nonzero || !(ekat::range<IntSmallPack>(k*Spack::n) < nlev)).all());
185  inv_exner(i,k).set(nonzero, 1/exner);
186 
187  tke(i,k) = ekat::max(mintke, tke(i,k));
188 
189  // Tracers are updated as a group. The tracers tke and qc act as separate inputs to shoc_main()
190  // and are therefore updated differently to the tracers group's monolithic field. Here, we make
191  // a copy if each of these tracers and pass to shoc_main() so that changes to the tracer group
192  // does not alter tke or qc values. Then during post processing, we copy back correct values of
193  // tke and qc to tracer group in postprocessing.
194  // TODO: remove *_copy views once SHOC can request a subset of tracers.
195  tke_copy(i,k) = tke(i,k);
196  qc_copy(i,k) = qc(i,k);
197 
198  qw(i,k) = qv(i,k) + qc(i,k);
199 
200  // Temperature
201  // NOTE: theta_v (thv) is intentionally different from one in HOMME
202  const auto theta_zt = PF::calculate_theta_from_T(T_mid(i,k),p_mid(i,k));
203  thlm(i,k) = PF::calculate_thetal_from_theta(theta_zt,T_mid(i,k),qc(i,k));
204  thv(i,k) = theta_zt*(1 + zvir*qv(i,k) - qc(i,k));
205 
206  // Vertical layer thickness
207  //dz(i,k) = PF::calculate_dz(pseudo_density(i,k), p_mid(i,k), T_mid(i,k), qv(i,k));
208 
209  rrho(i,k) = inv_ggr*(pseudo_density(i,k)/dz(i,k));
210 
211  wm_zt(i,k) = -1*omega(i,k)/(rrho(i,k)*ggr);
212  });
213  team.team_barrier();
214 
215  // Compute vertical layer heights
216  const auto dz_s = ekat::subview(dz, i);
217  const auto z_int_s = ekat::subview(z_int, i);
218  const auto z_mid_s = ekat::subview(z_mid, i);
219  PF::calculate_z_int(team,nlev,dz_s,z_surf,z_int_s);
220  team.team_barrier();
221  PF::calculate_z_mid(team,nlev,z_int_s,z_mid_s);
222  team.team_barrier();
223 
224  const int nlevi_v = nlev/Spack::n;
225  const int nlevi_p = nlev%Spack::n;
226  Kokkos::parallel_for(Kokkos::TeamVectorRange(team, nlev_packs), [&] (const Int& k)
227  {
228  zt_grid(i,k) = z_mid(i,k) - z_int(i, nlevi_v)[nlevi_p];
229  zi_grid(i,k) = z_int(i,k) - z_int(i, nlevi_v)[nlevi_p];
230 
231  // Dry static energy
232  shoc_s(i,k) = PF::calculate_dse(T_mid(i,k),z_mid(i,k),phis(i));
233 
234  if (k+1 == nlev_packs) zi_grid(i,nlevi_v)[nlevi_p] = 0;
235  });
236  team.team_barrier();
237 
238  const auto zt_grid_s = ekat::subview(zt_grid, i);
239  const auto zi_grid_s = ekat::subview(zi_grid, i);
240  const auto rrho_s = ekat::subview(rrho, i);
241  const auto rrho_i_s = ekat::subview(rrho_i, i);
242  SHF::linear_interp(team,zt_grid_s,zi_grid_s,rrho_s,rrho_i_s,nlev,nlev+1,0);
243  team.team_barrier();
244 
245  //const auto exner_int = PF::exner_function(p_int(i,nlevi_v)[nlevi_p]);
246  //const auto inv_exner_int_surf = 1/exner_int;
247 
248  wpthlp_sfc(i) = surf_sens_flux(i)/rrho_i(i,nlevi_v)[nlevi_p]; //(surf_sens_flux(i)/(cpair*rrho_i(i,nlevi_v)[nlevi_p]))*inv_exner_int_surf;
249  wprtp_sfc(i) = surf_evap(i)/rrho_i(i,nlevi_v)[nlevi_p];
250  upwp_sfc(i) = surf_mom_flux(i,0)/rrho_i(i,nlevi_v)[nlevi_p];
251  vpwp_sfc(i) = surf_mom_flux(i,1)/rrho_i(i,nlevi_v)[nlevi_p];
252  } // operator
253 
254  // Local variables
255  int ncol, nlev;
293 
294  // Assigning local variables
295  void set_variables(const int ncol_, const int nlev_,
296  const Real z_surf_,
297  const view_2d_const& T_mid_, const view_2d_const& p_mid_, const view_2d_const& p_int_, const view_2d_const& pseudo_density_,
298  const view_2d_const& omega_,
299  const view_1d_const& phis_, const view_1d_const& surf_sens_flux_, const view_1d_const& surf_evap_,
300  const sview_2d_const& surf_mom_flux_,
301  const view_3d_strided& qtracers_,
302  const view_2d& qv_, const view_2d_const& qc_, const view_2d& qc_copy_,
303  const view_2d& tke_, const view_2d& tke_copy_,
304  const view_2d& z_mid_, const view_2d& z_int_,
305  const view_2d& dse_, const view_2d& rrho_, const view_2d& rrho_i_,
306  const view_2d& thv_, const view_2d& dz_,const view_2d& zt_grid_,const view_2d& zi_grid_, const view_1d& wpthlp_sfc_,
307  const view_1d& wprtp_sfc_,const view_1d& upwp_sfc_,const view_1d& vpwp_sfc_, const view_2d& wtracer_sfc_,
308  const view_2d& wm_zt_,const view_2d& inv_exner_,const view_2d& thlm_,const view_2d& qw_,
309  const view_2d& cldfrac_liq_, const view_2d& cldfrac_liq_prev_)
310  {
311  ncol = ncol_;
312  nlev = nlev_;
313  z_surf = z_surf_;
314  // IN
315  T_mid = T_mid_;
316  p_mid = p_mid_;
317  p_int = p_int_;
318  pseudo_density = pseudo_density_;
319  omega = omega_;
320  phis = phis_;
321  surf_sens_flux = surf_sens_flux_;
322  surf_evap = surf_evap_;
323  surf_mom_flux = surf_mom_flux_;
324  qv = qv_;
325  // OUT
326  qtracers = qtracers_;
327  qc = qc_;
328  qc_copy = qc_copy_;
329  shoc_s = dse_;
330  tke = tke_;
331  tke_copy = tke_copy_;
332  z_mid = z_mid_;
333  z_int = z_int_;
334  rrho = rrho_;
335  rrho_i = rrho_i_;
336  thv = thv_;
337  dz = dz_;
338  zt_grid = zt_grid_;
339  zi_grid = zi_grid_;
340  wpthlp_sfc = wpthlp_sfc_;
341  wprtp_sfc = wprtp_sfc_;
342  upwp_sfc = upwp_sfc_;
343  vpwp_sfc = vpwp_sfc_;
344  wtracer_sfc = wtracer_sfc_;
345  wm_zt = wm_zt_;
346  inv_exner = inv_exner_;
347  thlm = thlm_;
348  qw = qw_;
349  cldfrac_liq=cldfrac_liq_;
350  cldfrac_liq_prev=cldfrac_liq_prev_;
351  } // set_variables
352  }; // SHOCPreprocess
353  /* --------------------------------------------------------------------------------------------*/
354 
355  /*--------------------------------------------------------------------------------------------*/
356  // Structure to handle the generation of data needed by the rest of the model based on output from
357  // shoc_main.
359  SHOCPostprocess () = default;
360 
361  KOKKOS_INLINE_FUNCTION
362  void operator()(const Kokkos::TeamPolicy<KT::ExeSpace>::member_type& team) const
363  {
364  const int i = team.league_rank();
365 
366  const Real inv_qc_relvar_max = 10;
367  const Real inv_qc_relvar_min = amrex::Real(0.001);
368 
369  const int nlev_packs = ekat::npack<Spack>(nlev);
370  Kokkos::parallel_for(Kokkos::TeamVectorRange(team, nlev_packs), [&] (const Int& k)
371  {
372  // See comment in SHOCPreprocess::operator() about the necessity of *_copy views
373  tke(i,k) = tke_copy(i,k);
374  qc(i,k) = qc_copy(i,k);
375 
376  qv(i,k) = qw(i,k) - qc(i,k);
377 
378  cldfrac_liq(i,k) = ekat::min(cldfrac_liq(i,k), 1);
379 
380  //P3 uses inv_qc_relvar, P3 is using dry mmrs, but
381  //wet<->dry conversion is a constant factor that cancels out in mean(qc)^2/mean(qc'*qc').
382  inv_qc_relvar(i,k) = 1;
383  const auto condition = (qc(i,k) != 0 && qc2(i,k) != 0);
384  if (condition.any()) {
385  inv_qc_relvar(i,k).set(condition,
386  ekat::min(inv_qc_relvar_max,
387  ekat::max(inv_qc_relvar_min,
388  ekat::square(qc(i,k))/qc2(i,k))));
389  }
390 
391  // Temperature
392  const Spack dse_ik(dse(i,k));
393  const Spack z_mid_ik(z_mid(i,k));
394  const Real phis_i(phis(i));
395  T_mid(i,k) = PF::calculate_temperature_from_dse(dse_ik,z_mid_ik,phis_i);
396 
397  });
398 
399  // If necessary, set appropriate boundary fluxes for energy and mass conservation checks.
400  // Any boundary fluxes not included in SHOC interface are set to zero
402  vapor_flux(i) = surf_evap(i);
403  water_flux(i) = zero;
404  ice_flux(i) = zero;
405  heat_flux(i) = surf_sens_flux(i);
406  }
407  } // operator
408 
409  // Local variables
410  int ncol, nlev;
428 
429  // Assigning local variables
430  void set_variables (const int ncol_, const int nlev_,
431  const view_2d_const& rrho_,
432  const view_2d& qv_, const view_2d_const& qw_, const view_2d& qc_, const view_2d_const& qc_copy_,
433  const view_2d& tke_, const view_2d_const& tke_copy_, const view_3d_strided& qtracers_, const view_2d_const& qc2_,
434  const view_2d& cldfrac_liq_, const view_2d& inv_qc_relvar_,
435  const view_2d& T_mid_, const view_2d_const& dse_, const view_2d_const& z_mid_, const view_1d_const phis_)
436  {
437  ncol = ncol_;
438  nlev = nlev_;
439  rrho = rrho_;
440  qv = qv_;
441  qw = qw_;
442  qc = qc_;
443  qc_copy = qc_copy_;
444  tke = tke_;
445  tke_copy = tke_copy_;
446  qtracers = qtracers_;
447  qc2 = qc2_;
448  cldfrac_liq = cldfrac_liq_;
449  inv_qc_relvar = inv_qc_relvar_;
450  T_mid = T_mid_;
451  dse = dse_;
452  z_mid = z_mid_;
453  phis = phis_;
454  } // set_variables
455 
456  void set_mass_and_energy_fluxes (const view_1d_const& surf_evap_, const view_1d_const& surf_sens_flux_,
457  const view_1d& vapor_flux_, const view_1d& water_flux_,
458  const view_1d& ice_flux_, const view_1d& heat_flux_)
459  {
461  surf_evap = surf_evap_;
462  surf_sens_flux = surf_sens_flux_;
463  vapor_flux = vapor_flux_;
464  water_flux = water_flux_;
465  ice_flux = ice_flux_;
466  heat_flux = heat_flux_;
467  }
468  }; // SHOCPostprocess
469  /* --------------------------------------------------------------------------------------------*/
470 
471  // Structure for storing local variables initialized using the ATMBufferManager
472  struct Buffer {
473 #ifndef SCREAM_SHOC_SMALL_KERNELS
474  static constexpr int num_1d_scalar_ncol = 4;
475 #else
476  static constexpr int num_1d_scalar_ncol = 15;
477 #endif
478  static constexpr int num_1d_scalar_nlev = 1;
479 #ifndef SCREAM_SHOC_SMALL_KERNELS
480  static constexpr int num_2d_vector_mid = 19;
481  static constexpr int num_2d_vector_int = 12;
482 #else
483  static constexpr int num_2d_vector_mid = 23;
484  static constexpr int num_2d_vector_int = 13;
485 #endif
486  static constexpr int num_2d_vector_tr = 1;
487 
492 #ifdef SCREAM_SHOC_SMALL_KERNELS
493  uview_1d<Real> se_b;
494  uview_1d<Real> ke_b;
495  uview_1d<Real> wv_b;
496  uview_1d<Real> wl_b;
497  uview_1d<Real> se_a;
498  uview_1d<Real> ke_a;
499  uview_1d<Real> wv_a;
500  uview_1d<Real> wl_a;
501  uview_1d<Real> kbfs;
502  uview_1d<Real> ustar2;
503  uview_1d<Real> wstar;
504 #endif
506 
507  uview_2d<Spack> unused; // Placeholder for unused views
539 #ifdef SCREAM_SHOC_SMALL_KERNELS
540  uview_2d<Spack> rho_zt;
541  uview_2d<Spack> shoc_qv;
543  uview_2d<Spack> dz_zt;
544  uview_2d<Spack> dz_zi;
546 #endif
547 
549  }; // BUFFER
550  /* --------------------------------------------------------------------------------------------*/
551 
552 #ifndef KOKKOS_ENABLE_CUDA
553  // Cuda requires methods enclosing __device__ lambda's to be public
554 protected:
555 #endif
556 
557  // Update flux (if necessary)
558  void
559  check_flux_state_consistency (const double dt);
560 
561  // Apply TMS drag coeff to shoc_main inputs (if necessary)
562  void
564 
565 protected:
566 
567  // SHOC updates the 'tracers' group.
568  void
570 
571  // Computes total number of bytes needed for local variables
572  size_t
574 
575  // Set local variables
576  void
577  init_buffers ();
578 
579  // Number of fields SHOC appends to the tracer array before the implicit
580  // solve. shoc_update_prognostics_implicit() transposes (num_qtracers + 3)
581  // fields -- the tracers plus thetal, qw and tke -- so the macro block it
582  // takes from the workspace is wider than the tracer count alone.
583  // See E3SM/components/eamxx/src/physics/shoc/impl/
584  // shoc_update_prognostics_implicit_impl.hpp
585  static constexpr Int shoc_extra_trac_slots = 3;
586 
587  // Number of workspace slots the WSM must reserve for shoc_main. Both the
588  // buffer sizing and the WSM setup must ask for the same count, so it is
589  // computed here to keep the two from drifting apart.
590  Int
591  wsm_num_slots () const
592  {
593  const Int n_wind_slots = ekat::npack<Spack>(m_num_vel_comp)*Spack::n;
594  const Int n_trac_slots = ekat::npack<Spack>(m_num_tracers +
595  shoc_extra_trac_slots)*Spack::n;
596  return ( 14 + (n_wind_slots + n_trac_slots) );
597  }
598 
599  // Offsets for MultiFab <-> KOKKOS transfer
600  amrex::Vector<int> m_col_offsets;
601 
602  // Keep track of field dimensions and other scalar values
603  // needed in shoc_main
611 
612  // Grid level
613  int m_lev;
614 
615  // Step number
616  int m_step;
617 
618  // Geometry at given level
619  amrex::Geometry m_geom;
620 
621  // BoxArray at given level
622  amrex::BoxArray m_ba;
623 
624  // Pointer to the CC conserved vars
625  amrex::MultiFab* m_cons = nullptr;
626 
627  // Pointer to the FC velocity vars
628  amrex::MultiFab* m_xvel = nullptr;
629  amrex::MultiFab* m_yvel = nullptr;
630  amrex::MultiFab* m_zvel = nullptr;
631 
632  // Pointer to the w-subsidence velocity
634 
635  // Pointer to the surface stresses
636  amrex::MultiFab* m_tau13 = nullptr;
637  amrex::MultiFab* m_tau23 = nullptr;
638  amrex::MultiFab* m_hfx3 = nullptr;
639  amrex::MultiFab* m_qfx3 = nullptr;
640 
641  // Pointer to the diffusion coeffs
642  amrex::MultiFab* m_mu = nullptr;
643 
644  // Pointer to the terrain heights
645  amrex::MultiFab* m_z_phys = nullptr;
646 
647  // MultiFabs for tendencies
648  amrex::MultiFab c_tend;
649  amrex::MultiFab u_tend;
650  amrex::MultiFab v_tend;
651 
652  // Flag for first step
653  bool m_first_step = true;
654 
655  // Struct which contains local variables
657 
658  // Store the structures for each argument to shoc_main;
659  SHF::SHOCInput input;
660  SHF::SHOCInputOutput input_output;
661  SHF::SHOCOutput output;
662  SHF::SHOCHistoryOutput history_output;
663  SHF::SHOCRuntime runtime_options;
664 #ifdef SCREAM_SHOC_SMALL_KERNELS
665  SHF::SHOCTemporaries temporaries;
666 #endif
667 
668  // Structures which compute pre/post process
671 
672  // WSM for internal local variables
673  ekat::WorkspaceManager<Spack, KT::Device> workspace_mgr;
674 
675  // Contiguous memory buffer view
676  //=======================================================
678 
679  // Runtime options
680  //=======================================================
681  bool apply_tms = false;
682  bool check_flux_state = false;
683  bool extra_shoc_diags = false;
685 
686  // Interface data structures
687  //=======================================================
695 
696  // Input data structures
697  //=======================================================
702 
703  // Input/Output data structures
704  //=======================================================
711 
712  // Output data structures
713  //=======================================================
721 
722  // Extra diagnostic data structures
723  //=======================================================
729 
737 
738  // Tracer data structures
739  //=======================================================
741 
742  // Boundary flux data structures
743  //=======================================================
748 }; // SHOCInterface
749 #endif
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
@ tau23
Definition: ERF_DataStruct.H:39
@ tau13
Definition: ERF_DataStruct.H:39
int Int
Definition: ERF_ShocInterface.H:20
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_ShocInterface.H:50
view_2d p_int
Definition: ERF_ShocInterface.H:699
typename SHF::view_1d< const Real > view_1d_const
Definition: ERF_ShocInterface.H:62
bool check_flux_state
Definition: ERF_ShocInterface.H:682
SHOCPreprocess shoc_preprocess
Definition: ERF_ShocInterface.H:669
view_2d wqw_sec
Definition: ERF_ShocInterface.H:732
scream::shoc::Constants< Real > SC
Definition: ERF_ShocInterface.H:55
view_1d surf_drag_coeff_tms
Definition: ERF_ShocInterface.H:694
amrex::Geometry m_geom
Definition: ERF_ShocInterface.H:619
void set_computed_group_impl()
void alloc_buffers()
Definition: ERF_ShocInterface.cpp:199
view_2d thl_sec
Definition: ERF_ShocInterface.H:731
view_2d tkh
Definition: ERF_ShocInterface.H:716
view_2d cldfrac_liq
Definition: ERF_ShocInterface.H:708
typename KT::template view_2d< Real > sview_2d
Definition: ERF_ShocInterface.H:65
amrex::MultiFab * m_z_phys
Definition: ERF_ShocInterface.H:645
amrex::MultiFab * m_qfx3
Definition: ERF_ShocInterface.H:639
void init_buffers()
Definition: ERF_ShocInterface.cpp:801
Int m_num_layers
Definition: ERF_ShocInterface.H:605
view_2d vw_sec
Definition: ERF_ShocInterface.H:735
amrex::MultiFab * m_yvel
Definition: ERF_ShocInterface.H:629
view_1d ice_flux
Definition: ERF_ShocInterface.H:746
void set_diff_stresses()
Definition: ERF_ShocInterface.cpp:684
static constexpr Int shoc_extra_trac_slots
Definition: ERF_ShocInterface.H:585
size_t requested_buffer_size_in_bytes() const
Definition: ERF_ShocInterface.cpp:777
view_2d shoc_cond
Definition: ERF_ShocInterface.H:727
view_2d brunt
Definition: ERF_ShocInterface.H:724
bool extra_shoc_diags
Definition: ERF_ShocInterface.H:683
view_1d heat_flux
Definition: ERF_ShocInterface.H:747
Int m_num_vel_comp
Definition: ERF_ShocInterface.H:609
bool apply_tms
Definition: ERF_ShocInterface.H:681
void kokkos_buffers_to_mf(const double dt)
Definition: ERF_ShocInterface.cpp:519
view_1d surf_sens_flux
Definition: ERF_ShocInterface.H:689
view_1d pblh
Definition: ERF_ShocInterface.H:714
amrex::MultiFab * m_zvel
Definition: ERF_ShocInterface.H:630
void set_grids(int &level, const amrex::BoxArray &ba, amrex::Geometry &geom, amrex::MultiFab *cons, amrex::MultiFab *xvel, amrex::MultiFab *yvel, amrex::MultiFab *zvel, amrex::Real *w_subsid, amrex::MultiFab *tau13, amrex::MultiFab *tau23, amrex::MultiFab *hfx3, amrex::MultiFab *qfx3, amrex::MultiFab *eddyDiffs, amrex::MultiFab *z_phys)
Definition: ERF_ShocInterface.cpp:121
Int m_num_cols
Definition: ERF_ShocInterface.H:604
view_2d sgs_buoy_flux
Definition: ERF_ShocInterface.H:706
SHF::SHOCOutput output
Definition: ERF_ShocInterface.H:661
typename KT::template view_1d< Int > view_1d_int
Definition: ERF_ShocInterface.H:60
ekat::WorkspaceManager< Spack, KT::Device > workspace_mgr
Definition: ERF_ShocInterface.H:673
view_2d p_mid
Definition: ERF_ShocInterface.H:698
view_2d uw_sec
Definition: ERF_ShocInterface.H:734
Int m_nadv
Definition: ERF_ShocInterface.H:607
view_2d qc
Definition: ERF_ShocInterface.H:710
amrex::MultiFab c_tend
Definition: ERF_ShocInterface.H:648
amrex::MultiFab * m_mu
Definition: ERF_ShocInterface.H:642
Int m_npbl
Definition: ERF_ShocInterface.H:606
amrex::MultiFab * m_tau23
Definition: ERF_ShocInterface.H:637
view_2d shoc_mix
Definition: ERF_ShocInterface.H:725
view_2d qw_sec
Definition: ERF_ShocInterface.H:733
view_2d cldfrac_liq_prev
Definition: ERF_ShocInterface.H:718
void finalize_impl(const double dt)
Definition: ERF_ShocInterface.cpp:1116
scream::physics::Constants< Real > C
Definition: ERF_ShocInterface.H:53
SHF::SHOCInput input
Definition: ERF_ShocInterface.H:659
SHOCInterface(const int &lev, SolverChoice &sc)
Definition: ERF_ShocInterface.cpp:6
view_2d omega
Definition: ERF_ShocInterface.H:688
typename SHF::view_2d< const Spack > view_2d_const
Definition: ERF_ShocInterface.H:64
ekat::Unmanaged< typename KT::template view_1d< ScalarT > > uview_1d
Definition: ERF_ShocInterface.H:74
typename SHF::Smask Smask
Definition: ERF_ShocInterface.H:59
typename SHF::view_3d_strided< Spack > view_3d_strided
Definition: ERF_ShocInterface.H:69
view_1d vapor_flux
Definition: ERF_ShocInterface.H:744
view_1d obklen
Definition: ERF_ShocInterface.H:720
scream::shoc::Functions< Real, KokkosDefaultDevice > SHF
Definition: ERF_ShocInterface.H:51
view_2d pseudo_dens
Definition: ERF_ShocInterface.H:700
SHF::SHOCRuntime runtime_options
Definition: ERF_ShocInterface.H:663
view_2d inv_qc_relvar
Definition: ERF_ShocInterface.H:715
view_1d surf_evap
Definition: ERF_ShocInterface.H:691
view_2d w_sec
Definition: ERF_ShocInterface.H:717
view_1d phis
Definition: ERF_ShocInterface.H:701
view_2d shoc_evap
Definition: ERF_ShocInterface.H:728
view_3d horiz_wind
Definition: ERF_ShocInterface.H:705
void check_flux_state_consistency(const double dt)
Definition: ERF_ShocInterface.cpp:1151
typename SHF::view_1d< Real > view_1d
Definition: ERF_ShocInterface.H:61
amrex::MultiFab * m_tau13
Definition: ERF_ShocInterface.H:636
amrex::MultiFab * m_cons
Definition: ERF_ShocInterface.H:625
view_3d_strided qtracers
Definition: ERF_ShocInterface.H:740
ekat::KokkosTypes< KokkosDefaultDevice > KT
Definition: ERF_ShocInterface.H:54
view_1d ustar
Definition: ERF_ShocInterface.H:719
scream::PhysicsFunctions< KokkosDefaultDevice > PF
Definition: ERF_ShocInterface.H:52
view_2d w3
Definition: ERF_ShocInterface.H:736
void run_impl(const double dt)
Definition: ERF_ShocInterface.cpp:1046
void initialize_impl()
Definition: ERF_ShocInterface.cpp:871
ekat::Unmanaged< typename KT::template view_2d< ScalarT > > uview_2d
Definition: ERF_ShocInterface.H:76
amrex::MultiFab * m_hfx3
Definition: ERF_ShocInterface.H:638
ekat::WorkspaceManager< Spack, KT::Device > WSM
Definition: ERF_ShocInterface.H:71
typename SHF::view_3d< const Spack > view_3d_const
Definition: ERF_ShocInterface.H:68
bool m_first_step
Definition: ERF_ShocInterface.H:653
void set_eddy_diffs()
Definition: ERF_ShocInterface.cpp:621
Int m_num_tracers
Definition: ERF_ShocInterface.H:608
std::string name() const
Definition: ERF_ShocInterface.H:131
int m_step
Definition: ERF_ShocInterface.H:616
sview_2d surf_mom_flux
Definition: ERF_ShocInterface.H:690
typename SHF::view_2d< SHF::Spack > view_2d
Definition: ERF_ShocInterface.H:63
int m_lev
Definition: ERF_ShocInterface.H:613
SHOCPostprocess shoc_postprocess
Definition: ERF_ShocInterface.H:670
typename SHF::Spack Spack
Definition: ERF_ShocInterface.H:57
SHF::SHOCInputOutput input_output
Definition: ERF_ShocInterface.H:660
Buffer m_buffer
Definition: ERF_ShocInterface.H:656
void mf_to_kokkos_buffers()
Definition: ERF_ShocInterface.cpp:348
view_2d tk
Definition: ERF_ShocInterface.H:707
view_2d qv
Definition: ERF_ShocInterface.H:693
view_2d wthl_sec
Definition: ERF_ShocInterface.H:730
amrex::BoxArray m_ba
Definition: ERF_ShocInterface.H:622
view_2d tke
Definition: ERF_ShocInterface.H:709
view_1d tot_buff_view
Definition: ERF_ShocInterface.H:677
amrex::MultiFab u_tend
Definition: ERF_ShocInterface.H:649
amrex::MultiFab v_tend
Definition: ERF_ShocInterface.H:650
view_1d water_flux
Definition: ERF_ShocInterface.H:745
view_2d T_mid
Definition: ERF_ShocInterface.H:692
bool column_conservation_check
Definition: ERF_ShocInterface.H:684
void dealloc_buffers()
Definition: ERF_ShocInterface.cpp:274
void add_slow_tend(const amrex::MFIter &mfi, const amrex::Box &tbx, const amrex::Array4< amrex::Real > &cc_rhs_arr)
Definition: ERF_ShocInterface.cpp:755
Int hdtime
Definition: ERF_ShocInterface.H:610
void apply_turbulent_mountain_stress()
Definition: ERF_ShocInterface.cpp:1129
typename SHF::view_3d< Spack > view_3d
Definition: ERF_ShocInterface.H:67
view_2d isotropy
Definition: ERF_ShocInterface.H:726
typename SHF::IntSmallPack IntSmallPack
Definition: ERF_ShocInterface.H:58
amrex::Real * m_w_subsid
Definition: ERF_ShocInterface.H:633
amrex::MultiFab * m_xvel
Definition: ERF_ShocInterface.H:628
void add_fast_tend(amrex::Vector< amrex::MultiFab > &S_rhs)
Definition: ERF_ShocInterface.cpp:716
amrex::Vector< int > m_col_offsets
Definition: ERF_ShocInterface.H:600
SHF::SHOCHistoryOutput history_output
Definition: ERF_ShocInterface.H:662
Int wsm_num_slots() const
Definition: ERF_ShocInterface.H:591
typename KT::template view_2d< const Real > sview_2d_const
Definition: ERF_ShocInterface.H:66
@ tabs
Definition: ERF_Kessler.H:26
@ xvel
Definition: ERF_IndexDefines.H:215
@ cons
Definition: ERF_IndexDefines.H:214
@ zvel
Definition: ERF_IndexDefines.H:217
@ yvel
Definition: ERF_IndexDefines.H:216
Definition: ERF_ShocInterface.H:472
uview_2d< Spack > w3
Definition: ERF_ShocInterface.H:536
uview_2d< Spack > qc_copy
Definition: ERF_ShocInterface.H:523
uview_2d< Spack > dse
Definition: ERF_ShocInterface.H:521
uview_1d< Real > upwp_sfc
Definition: ERF_ShocInterface.H:490
uview_2d< Spack > vw_sec
Definition: ERF_ShocInterface.H:535
uview_1d< Real > wpthlp_sfc
Definition: ERF_ShocInterface.H:488
uview_2d< Spack > thv
Definition: ERF_ShocInterface.H:512
uview_2d< Spack > wqls_sec
Definition: ERF_ShocInterface.H:537
uview_2d< Spack > wthl_sec
Definition: ERF_ShocInterface.H:531
uview_2d< Spack > thlm
Definition: ERF_ShocInterface.H:519
uview_2d< Spack > uw_sec
Definition: ERF_ShocInterface.H:534
uview_2d< Spack > z_mid
Definition: ERF_ShocInterface.H:508
uview_1d< Real > vpwp_sfc
Definition: ERF_ShocInterface.H:491
uview_2d< Spack > rrho
Definition: ERF_ShocInterface.H:510
uview_2d< Spack > wtke_sec
Definition: ERF_ShocInterface.H:533
uview_2d< Spack > rrho_i
Definition: ERF_ShocInterface.H:511
uview_2d< Spack > unused
Definition: ERF_ShocInterface.H:507
Spack * wsm_data
Definition: ERF_ShocInterface.H:548
static constexpr int num_2d_vector_int
Definition: ERF_ShocInterface.H:481
uview_2d< Spack > wtracer_sfc
Definition: ERF_ShocInterface.H:516
static constexpr int num_2d_vector_tr
Definition: ERF_ShocInterface.H:486
static constexpr int num_1d_scalar_nlev
Definition: ERF_ShocInterface.H:478
uview_2d< Spack > inv_exner
Definition: ERF_ShocInterface.H:518
uview_2d< Spack > qwthl_sec
Definition: ERF_ShocInterface.H:530
uview_2d< Spack > qw
Definition: ERF_ShocInterface.H:520
uview_2d< Spack > brunt
Definition: ERF_ShocInterface.H:538
uview_2d< Spack > shoc_mix
Definition: ERF_ShocInterface.H:525
uview_2d< Spack > tke_copy
Definition: ERF_ShocInterface.H:522
static constexpr int num_1d_scalar_ncol
Definition: ERF_ShocInterface.H:474
uview_2d< Spack > isotropy
Definition: ERF_ShocInterface.H:526
uview_2d< Spack > zt_grid
Definition: ERF_ShocInterface.H:514
uview_2d< Spack > w_sec
Definition: ERF_ShocInterface.H:527
uview_2d< Spack > thl_sec
Definition: ERF_ShocInterface.H:528
uview_2d< Spack > wm_zt
Definition: ERF_ShocInterface.H:517
uview_2d< Spack > qw_sec
Definition: ERF_ShocInterface.H:529
uview_2d< Spack > wqw_sec
Definition: ERF_ShocInterface.H:532
uview_2d< Spack > z_int
Definition: ERF_ShocInterface.H:509
uview_2d< Spack > shoc_ql2
Definition: ERF_ShocInterface.H:524
uview_1d< Real > wprtp_sfc
Definition: ERF_ShocInterface.H:489
uview_2d< Spack > zi_grid
Definition: ERF_ShocInterface.H:515
static constexpr int num_2d_vector_mid
Definition: ERF_ShocInterface.H:480
uview_1d< Spack > pref_mid
Definition: ERF_ShocInterface.H:505
uview_2d< Spack > dz
Definition: ERF_ShocInterface.H:513
Definition: ERF_ShocInterface.H:358
view_1d_const surf_sens_flux
Definition: ERF_ShocInterface.H:423
view_1d ice_flux
Definition: ERF_ShocInterface.H:426
view_1d vapor_flux
Definition: ERF_ShocInterface.H:424
view_1d_const phis
Definition: ERF_ShocInterface.H:420
int nlev
Definition: ERF_ShocInterface.H:410
view_1d heat_flux
Definition: ERF_ShocInterface.H:427
view_2d cldfrac_liq
Definition: ERF_ShocInterface.H:416
view_2d_const rrho
Definition: ERF_ShocInterface.H:411
KOKKOS_INLINE_FUNCTION void operator()(const Kokkos::TeamPolicy< KT::ExeSpace >::member_type &team) const
Definition: ERF_ShocInterface.H:362
view_3d_strided qtracers
Definition: ERF_ShocInterface.H:414
void set_variables(const int ncol_, const int nlev_, const view_2d_const &rrho_, const view_2d &qv_, const view_2d_const &qw_, const view_2d &qc_, const view_2d_const &qc_copy_, const view_2d &tke_, const view_2d_const &tke_copy_, const view_3d_strided &qtracers_, const view_2d_const &qc2_, const view_2d &cldfrac_liq_, const view_2d &inv_qc_relvar_, const view_2d &T_mid_, const view_2d_const &dse_, const view_2d_const &z_mid_, const view_1d_const phis_)
Definition: ERF_ShocInterface.H:430
view_2d_const qw
Definition: ERF_ShocInterface.H:413
bool compute_mass_and_energy_fluxes
Definition: ERF_ShocInterface.H:421
view_1d water_flux
Definition: ERF_ShocInterface.H:425
view_1d_const surf_evap
Definition: ERF_ShocInterface.H:422
view_2d_const qc_copy
Definition: ERF_ShocInterface.H:413
view_2d_const z_mid
Definition: ERF_ShocInterface.H:419
view_2d_const dse
Definition: ERF_ShocInterface.H:419
view_2d tke
Definition: ERF_ShocInterface.H:412
view_2d T_mid
Definition: ERF_ShocInterface.H:418
view_2d inv_qc_relvar
Definition: ERF_ShocInterface.H:417
view_2d qc
Definition: ERF_ShocInterface.H:412
void set_mass_and_energy_fluxes(const view_1d_const &surf_evap_, const view_1d_const &surf_sens_flux_, const view_1d &vapor_flux_, const view_1d &water_flux_, const view_1d &ice_flux_, const view_1d &heat_flux_)
Definition: ERF_ShocInterface.H:456
view_2d qv
Definition: ERF_ShocInterface.H:412
int ncol
Definition: ERF_ShocInterface.H:410
view_2d_const qc2
Definition: ERF_ShocInterface.H:415
view_2d_const tke_copy
Definition: ERF_ShocInterface.H:413
Definition: ERF_ShocInterface.H:161
int ncol
Definition: ERF_ShocInterface.H:255
view_3d_strided qtracers
Definition: ERF_ShocInterface.H:266
int nlev
Definition: ERF_ShocInterface.H:255
view_2d cldfrac_liq_prev
Definition: ERF_ShocInterface.H:292
view_2d rrho
Definition: ERF_ShocInterface.H:275
view_2d_const pseudo_density
Definition: ERF_ShocInterface.H:260
sview_2d_const surf_mom_flux
Definition: ERF_ShocInterface.H:265
view_2d_const qc
Definition: ERF_ShocInterface.H:268
view_2d thlm
Definition: ERF_ShocInterface.H:288
view_1d_const phis
Definition: ERF_ShocInterface.H:262
view_1d_const surf_evap
Definition: ERF_ShocInterface.H:264
view_2d zt_grid
Definition: ERF_ShocInterface.H:279
view_2d cldfrac_liq
Definition: ERF_ShocInterface.H:291
view_2d inv_exner
Definition: ERF_ShocInterface.H:287
view_1d_const surf_sens_flux
Definition: ERF_ShocInterface.H:263
view_2d wm_zt
Definition: ERF_ShocInterface.H:286
KOKKOS_INLINE_FUNCTION void operator()(const Kokkos::TeamPolicy< KT::ExeSpace >::member_type &team) const
Definition: ERF_ShocInterface.H:165
view_2d qc_copy
Definition: ERF_ShocInterface.H:269
view_2d wtracer_sfc
Definition: ERF_ShocInterface.H:285
view_2d z_mid
Definition: ERF_ShocInterface.H:270
view_2d rrho_i
Definition: ERF_ShocInterface.H:276
view_2d_const omega
Definition: ERF_ShocInterface.H:261
view_2d_const T_mid
Definition: ERF_ShocInterface.H:257
view_2d cloud_frac
Definition: ERF_ShocInterface.H:290
Real z_surf
Definition: ERF_ShocInterface.H:256
view_2d_const p_int
Definition: ERF_ShocInterface.H:259
view_2d tke
Definition: ERF_ShocInterface.H:273
view_1d wprtp_sfc
Definition: ERF_ShocInterface.H:282
view_2d qw
Definition: ERF_ShocInterface.H:289
view_1d upwp_sfc
Definition: ERF_ShocInterface.H:283
view_1d wpthlp_sfc
Definition: ERF_ShocInterface.H:281
view_2d z_int
Definition: ERF_ShocInterface.H:271
view_2d_const p_mid
Definition: ERF_ShocInterface.H:258
view_1d vpwp_sfc
Definition: ERF_ShocInterface.H:284
view_2d dz
Definition: ERF_ShocInterface.H:278
view_2d shoc_s
Definition: ERF_ShocInterface.H:272
view_2d tke_copy
Definition: ERF_ShocInterface.H:274
view_2d zi_grid
Definition: ERF_ShocInterface.H:280
view_2d qv
Definition: ERF_ShocInterface.H:267
view_2d thv
Definition: ERF_ShocInterface.H:277
void set_variables(const int ncol_, const int nlev_, const Real z_surf_, const view_2d_const &T_mid_, const view_2d_const &p_mid_, const view_2d_const &p_int_, const view_2d_const &pseudo_density_, const view_2d_const &omega_, const view_1d_const &phis_, const view_1d_const &surf_sens_flux_, const view_1d_const &surf_evap_, const sview_2d_const &surf_mom_flux_, const view_3d_strided &qtracers_, const view_2d &qv_, const view_2d_const &qc_, const view_2d &qc_copy_, const view_2d &tke_, const view_2d &tke_copy_, const view_2d &z_mid_, const view_2d &z_int_, const view_2d &dse_, const view_2d &rrho_, const view_2d &rrho_i_, const view_2d &thv_, const view_2d &dz_, const view_2d &zt_grid_, const view_2d &zi_grid_, const view_1d &wpthlp_sfc_, const view_1d &wprtp_sfc_, const view_1d &upwp_sfc_, const view_1d &vpwp_sfc_, const view_2d &wtracer_sfc_, const view_2d &wm_zt_, const view_2d &inv_exner_, const view_2d &thlm_, const view_2d &qw_, const view_2d &cldfrac_liq_, const view_2d &cldfrac_liq_prev_)
Definition: ERF_ShocInterface.H:295
Definition: ERF_DataStruct.H:634