ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_NullMoist.H
Go to the documentation of this file.
1 #ifndef ERF_NULLMOIST_H
2 #define ERF_NULLMOIST_H
3 
4 #include <AMReX_MultiFabUtil.H>
5 #include <AMReX_iMultiFab.H>
6 #include <AMReX_Geometry.H>
7 #include <ERF_DataStruct.H>
9 
10 class NullMoist {
11 
12 public:
13  NullMoist () {}
14 
15  virtual ~NullMoist () = default;
16 
17  virtual
18  void
19  Define (SolverChoice& /*sc*/) { }
20 
21  virtual
22  void Init (const amrex::MultiFab& /*cons_in*/,
23  const amrex::BoxArray& /*grids*/,
24  const amrex::Geometry& /*geom*/,
25  const amrex::Real& /*dt_advance*/,
26  std::unique_ptr<amrex::MultiFab>& /*z_phys_nd*/,
27  std::unique_ptr<amrex::MultiFab>& /*detJ_cc*/) { }
28 
29  virtual
30  void
31  Advance (const amrex::Real& /*dt_advance*/,
32  const SolverChoice& /*solverChoce*/) { }
33 
34  virtual
35  void
36  Update_Micro_Vars (amrex::MultiFab& /*cons_in*/) { }
37 
38  // Optional explicit anelastic thermodynamic context. The default routes
39  // to the legacy model entry point so non-SatAdj models retain behavior.
40  virtual
41  void
42  Update_Micro_Vars (amrex::MultiFab& cons_in,
43  const amrex::MultiFab* /*base_state*/) {
44  Update_Micro_Vars(cons_in);
45  }
46 
47  virtual
48  void
49  Update_State_Vars (amrex::MultiFab& /*cons_in*/,
50  const amrex::MultiFab& /*z_phys_nd*/) { }
51 
52  virtual
53  void
54  Copy_State_to_Micro (const amrex::MultiFab& /*cons_in*/) { }
55 
56  virtual
57  void
58  Copy_Micro_to_State (amrex::MultiFab& /*cons_in*/) { }
59 
60  virtual
61  amrex::MultiFab*
62  Qmoist_Ptr (const int& /*varIdx*/ ) { return nullptr; }
63 
64  virtual
65  int
67 
68  virtual
69  int
71 
72  virtual
73  int
75 
76  virtual
77  int
79 
80  virtual
81  void
82  Qmoist_Restart_Vars ( const SolverChoice&, std::vector<int>& a_idx, std::vector<std::string>& a_names) const
83  {
84  a_idx.clear();
85  a_names.clear();
86  }
87 
88  virtual
89  void
90  GetPlotVarNames (amrex::Vector<std::string>& a_vec) const
91  {
92  a_vec.resize(0);
93  }
94 
95  virtual
96  void
97  GetPlotVar (const std::string& /* a_name */,
98  amrex::MultiFab& /* a_mf */ ) const
99  {
100  amrex::Abort("NullMoist::GetPlotVar() should never be called.");
101  }
102 
103  virtual
104  void
105  GetPlotVar (const std::string& a_name,
106  amrex::MultiFab& a_mf,
107  const int /*a_lev*/) const
108  {
109  GetPlotVar(a_name, a_mf);
110  }
111 
112  virtual
113  void
114  SetCurrentLevel (const int& lev)
115  {
116  AMREX_ALWAYS_ASSERT(lev >= 0);
117  m_level = lev;
118  }
119 
120  virtual
121  void
122  InitLevel (const int, const amrex::MultiFab&) {}
123 
124  virtual
125  int
126  getDiagnosticsInterval () const { return 0; }
127 
128  virtual
129  void
130  Set_dzmin (const amrex::Real /*dz_min*/) { }
131 
132  /*! \brief Import ERF's land/water mask. Only schemes whose physics branches
133  * on land vs water need to override this. */
134  virtual
135  void
136  Set_Lmask (amrex::iMultiFab* /*lmask*/) { }
137 
138  virtual
141  {
142  return {};
143  }
144 
145  virtual
146  void
147  // Current SatAdj/Kessler development paths do not trim by real width, but
148  // tests still exercise Set_RealWidth(0/1/2) as a future-proof contract.
149  // Keep the base hook as a no-op unless a concrete microphysics model
150  // chooses to implement width-sensitive behavior.
151  Set_RealWidth (const int /*real_width*/) { }
152 
153 protected:
154  void
156  {
157  if (sc.anelastic.empty()) {
159  } else {
161  m_level < static_cast<int>(sc.anelastic.size()));
163  }
164  }
165 
166  void
167  assert_base_state_available (const amrex::MultiFab* base_state) const
168  {
170  !m_use_anelastic_reference_pressure || base_state != nullptr,
171  "Anelastic microphysics requires the hydrostatic base state at copy-in");
172  }
173 
174  int m_level{0};
176 
177 private:
178  int m_qmoist_size = 0;
182 };
183 
184 #endif
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_cloud_chamber_config.active, "Cloud Chamber: initializer reached without a parsed configuration")
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_NullMoist.H:10
int m_qstate_moist_size
Definition: ERF_NullMoist.H:179
int m_level
Definition: ERF_NullMoist.H:174
virtual void Copy_Micro_to_State(amrex::MultiFab &)
Definition: ERF_NullMoist.H:58
virtual amrex::MultiFab * Qmoist_Ptr(const int &)
Definition: ERF_NullMoist.H:62
virtual void Update_Micro_Vars(amrex::MultiFab &cons_in, const amrex::MultiFab *)
Definition: ERF_NullMoist.H:42
virtual void GetPlotVar(const std::string &, amrex::MultiFab &) const
Definition: ERF_NullMoist.H:97
virtual void SetCurrentLevel(const int &lev)
Definition: ERF_NullMoist.H:114
virtual void Set_dzmin(const amrex::Real)
Definition: ERF_NullMoist.H:130
virtual void GetPlotVar(const std::string &a_name, amrex::MultiFab &a_mf, const int) const
Definition: ERF_NullMoist.H:105
int m_qmoist_size
Definition: ERF_NullMoist.H:178
virtual int getDiagnosticsInterval() const
Definition: ERF_NullMoist.H:126
virtual void Init(const amrex::MultiFab &, const amrex::BoxArray &, const amrex::Geometry &, const amrex::Real &, std::unique_ptr< amrex::MultiFab > &, std::unique_ptr< amrex::MultiFab > &)
Definition: ERF_NullMoist.H:22
virtual ~NullMoist()=default
virtual void Qmoist_Restart_Vars(const SolverChoice &, std::vector< int > &a_idx, std::vector< std::string > &a_names) const
Definition: ERF_NullMoist.H:82
virtual void InitLevel(const int, const amrex::MultiFab &)
Definition: ERF_NullMoist.H:122
virtual int Qstate_Moist_NumConc_Size()
Definition: ERF_NullMoist.H:74
virtual void Update_State_Vars(amrex::MultiFab &, const amrex::MultiFab &)
Definition: ERF_NullMoist.H:49
virtual void Set_RealWidth(const int)
Definition: ERF_NullMoist.H:151
virtual SurfacePrecipAccumulationSources Get_Surface_Precip_Accumulation_Ptrs(const int &) const
Definition: ERF_NullMoist.H:140
int m_qstate_moist_numconc_size
Definition: ERF_NullMoist.H:180
NullMoist()
Definition: ERF_NullMoist.H:13
virtual void Set_Lmask(amrex::iMultiFab *)
Import ERF's land/water mask. Only schemes whose physics branches on land vs water need to override t...
Definition: ERF_NullMoist.H:136
virtual int Qstate_NonMoist_Size()
Definition: ERF_NullMoist.H:78
virtual void Advance(const amrex::Real &, const SolverChoice &)
Definition: ERF_NullMoist.H:31
virtual void Define(SolverChoice &)
Definition: ERF_NullMoist.H:19
virtual void Copy_State_to_Micro(const amrex::MultiFab &)
Definition: ERF_NullMoist.H:54
virtual void GetPlotVarNames(amrex::Vector< std::string > &a_vec) const
Definition: ERF_NullMoist.H:90
int m_qstate_nonmoist_size
Definition: ERF_NullMoist.H:181
void assert_base_state_available(const amrex::MultiFab *base_state) const
Definition: ERF_NullMoist.H:167
virtual int Qmoist_Size()
Definition: ERF_NullMoist.H:66
void set_anelastic_reference_pressure_mode(const SolverChoice &sc)
Definition: ERF_NullMoist.H:155
virtual void Update_Micro_Vars(amrex::MultiFab &)
Definition: ERF_NullMoist.H:36
bool m_use_anelastic_reference_pressure
Definition: ERF_NullMoist.H:175
virtual int Qstate_Moist_Size()
Definition: ERF_NullMoist.H:70
Definition: ERF_DataStruct.H:662
amrex::Vector< int > anelastic
Per-level flag selecting anelastic dynamics.
Definition: ERF_DataStruct.H:1981
Definition: ERF_SurfacePrecipitation.H:34