ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_OceanSurf.H
Go to the documentation of this file.
1 #ifndef ERF_OCEANSURF_H
2 #define ERF_OCEANSURF_H
3 
4 #include <memory>
5 
6 #include <AMReX_Geometry.H>
7 #include <AMReX_MultiFabUtil.H>
8 #include <AMReX_ParmParse.H>
9 
10 #include <ERF_NullSurf.H>
11 
12 namespace LsmVar_OceanSurf {
13  enum {
14  t_surf = 0,
15  NumVars
16  };
17 }
18 
19 class OceanSurf : public NullSurf {
20 public:
21  OceanSurf () = default;
22  ~OceanSurf () override = default;
23 
24  void
25  Define (SolverChoice& /*sc*/) override
26  {
27  amrex::ParmParse pp("erf");
29  pp.query("most.surf_temp", m_default_tsurf);
30  }
31 
32  void
33  Init (const int& /*lev*/,
34  const amrex::MultiFab& cons_in,
35  const amrex::Geometry& geom,
36  const amrex::Real& dt) override
37  {
38  m_dt = dt;
39  m_lsm_geom = geom;
40 
41  amrex::Box domain = geom.Domain();
42  khi_lsm = domain.smallEnd(2);
43 
44  LsmVarMap.resize(m_lsm_size);
46 
47  LsmVarName.resize(m_lsm_size);
48  LsmVarName = {"t_surf"};
49 
50  amrex::IntVect ng(1,1,0);
51  amrex::BoxArray ba = cons_in.boxArray();
52  amrex::DistributionMapping dm = cons_in.DistributionMap();
53  amrex::BoxList bl_lsm = ba.boxList();
54  for (auto& b : bl_lsm) {
55  b.setRange(2,0);
56  }
57  amrex::BoxArray ba_lsm(std::move(bl_lsm));
58 
59  const amrex::RealBox& dom_rb = geom.ProbDomain();
60  amrex::RealBox lsm_rb = dom_rb;
61  lsm_rb.setHi(2, dom_rb.hi(2));
62  lsm_rb.setLo(2, dom_rb.lo(2));
63  m_lsm_geom.define(ba_lsm.minimalBox(), lsm_rb, geom.Coord(), geom.isPeriodic());
64 
65  lsm_fab_data.resize(m_lsm_size);
66  lsm_fab_data[0] = std::make_shared<amrex::MultiFab>(ba_lsm, dm, 1, ng);
67  lsm_fab_data[0]->setVal(m_default_tsurf);
68  }
69 
70  void
71  Advance (const amrex::Real& dt) override
72  {
73  // OceanSurf currently does not evolve internal state here; keep the
74  // latest timestep for bookkeeping so this stays aligned with other LSMs.
75  m_dt = dt;
76  }
77 
78  amrex::MultiFab*
79  Lsm_Data_Ptr (const int& varIdx) override
80  {
81  int lsmIdx = LsmVarMap[varIdx];
82  AMREX_ALWAYS_ASSERT(lsmIdx < OceanSurf::m_lsm_size && lsmIdx>=0);
83  return lsm_fab_data[lsmIdx].get();
84  }
85 
86  amrex::MultiFab*
87  Lsm_Flux_Ptr (const int& /*varIdx*/) override
88  {
89  return nullptr;
90  }
91 
92  amrex::Geometry
93  Lsm_Geom () override { return m_lsm_geom; }
94 
95  int
96  Lsm_Data_Size () override { return OceanSurf::m_lsm_size; }
97 
98  int
99  Lsm_Flux_Size () override { return 0; }
100 
101  std::string
102  Lsm_DataName (const int& varIdx) override
103  {
104  int lsmIdx = LsmVarMap[varIdx];
105  AMREX_ALWAYS_ASSERT(lsmIdx < OceanSurf::m_lsm_size && lsmIdx>=0);
106  return LsmVarName[lsmIdx];
107  }
108 
109  std::string
110  Lsm_FluxName (const int& /*varIdx*/) override
111  {
112  return "";
113  }
114 
115  int
116  Lsm_DataIndex (std::string varname) override
117  {
118  std::string lc_varname = amrex::toLower(varname);
119  if (lc_varname == "t_surf" || lc_varname == "theta") {
120  return 0;
121  }
122  return -1;
123  }
124 
125  int
126  Lsm_FluxIndex (std::string /*varname*/) override
127  {
128  return -1;
129  }
130 
131  void
132  SetOceanState (const amrex::Vector<amrex::MultiFab*>* ocean_state)
133  {
134  // This pointer is currently packed and filled by ERF_Coupling.cpp.
135  m_ocean_state = ocean_state;
136  }
137 
138  [[nodiscard]]
139  const amrex::Vector<amrex::MultiFab*>* OceanState () const
140  {
141  return m_ocean_state;
142  }
143 
144 private:
145  using FabPtr = std::shared_ptr<amrex::MultiFab>;
146 
147  int m_lsm_size = 1;
148  amrex::Vector<int> LsmVarMap;
149  amrex::Vector<std::string> LsmVarName;
150  amrex::Vector<FabPtr> lsm_fab_data;
151  amrex::Geometry m_lsm_geom;
153  int khi_lsm{0};
155  const amrex::Vector<amrex::MultiFab*>* m_ocean_state = nullptr;
156 };
157 #endif
ParmParse pp("prob")
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_NullSurf.H:8
Definition: ERF_OceanSurf.H:19
const amrex::Vector< amrex::MultiFab * > * m_ocean_state
Definition: ERF_OceanSurf.H:155
std::string Lsm_FluxName(const int &) override
Definition: ERF_OceanSurf.H:110
int Lsm_Data_Size() override
Definition: ERF_OceanSurf.H:96
amrex::MultiFab * Lsm_Data_Ptr(const int &varIdx) override
Definition: ERF_OceanSurf.H:79
amrex::Real m_default_tsurf
Definition: ERF_OceanSurf.H:154
void Advance(const amrex::Real &dt) override
Definition: ERF_OceanSurf.H:71
void SetOceanState(const amrex::Vector< amrex::MultiFab * > *ocean_state)
Definition: ERF_OceanSurf.H:132
void Init(const int &, const amrex::MultiFab &cons_in, const amrex::Geometry &geom, const amrex::Real &dt) override
Definition: ERF_OceanSurf.H:33
std::string Lsm_DataName(const int &varIdx) override
Definition: ERF_OceanSurf.H:102
amrex::Vector< FabPtr > lsm_fab_data
Definition: ERF_OceanSurf.H:150
const amrex::Vector< amrex::MultiFab * > * OceanState() const
Definition: ERF_OceanSurf.H:139
amrex::MultiFab * Lsm_Flux_Ptr(const int &) override
Definition: ERF_OceanSurf.H:87
OceanSurf()=default
int Lsm_Flux_Size() override
Definition: ERF_OceanSurf.H:99
amrex::Vector< std::string > LsmVarName
Definition: ERF_OceanSurf.H:149
int Lsm_DataIndex(std::string varname) override
Definition: ERF_OceanSurf.H:116
~OceanSurf() override=default
int m_lsm_size
Definition: ERF_OceanSurf.H:147
void Define(SolverChoice &) override
Definition: ERF_OceanSurf.H:25
amrex::Geometry m_lsm_geom
Definition: ERF_OceanSurf.H:151
int khi_lsm
Definition: ERF_OceanSurf.H:153
amrex::Real m_dt
Definition: ERF_OceanSurf.H:152
std::shared_ptr< amrex::MultiFab > FabPtr
Definition: ERF_OceanSurf.H:145
int Lsm_FluxIndex(std::string) override
Definition: ERF_OceanSurf.H:126
amrex::Geometry Lsm_Geom() override
Definition: ERF_OceanSurf.H:93
amrex::Vector< int > LsmVarMap
Definition: ERF_OceanSurf.H:148
Definition: ERF_OceanSurf.H:12
@ NumVars
Definition: ERF_OceanSurf.H:15
@ t_surf
Definition: ERF_OceanSurf.H:14
@ ng
Definition: ERF_Morrison.H:48
Definition: ERF_DataStruct.H:141