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