ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_RadiationInterface.H
Go to the documentation of this file.
1 #ifndef ERF_RADIATION_INTERFACE_H
2 #define ERF_RADIATION_INTERFACE_H
3 
4 #include <memory>
5 #include <iostream>
6 
7 #include <AMReX_BoxArray.H>
8 #include <AMReX_Geometry.H>
9 #include <AMReX_MultiFab.H>
10 #include <AMReX_ParmParse.H>
11 
12 // Basic interface class for wrapping different radiation models
14 {
15 public:
16  virtual ~IRadiation () = default;
17 
18  virtual
19  void
20  Init (const amrex::Geometry& geom,
21  const amrex::BoxArray& ba,
22  amrex::MultiFab* cons_in) = 0;
23 
24  virtual
25  void
26  Run (int& level,
27  int& step,
28  double& time,
29  const double& dt,
30  const amrex::BoxArray& ba,
31  amrex::Geometry& geom,
32  amrex::MultiFab* cons_in,
33  amrex::iMultiFab* lmask,
34  amrex::MultiFab* t_surf,
35  const amrex::Vector<const amrex::MultiFab*>& lsm_input_ptrs,
36  const amrex::Vector<amrex::MultiFab*>& lsm_output_ptrs,
37  amrex::MultiFab* qheating_rates,
38  amrex::MultiFab* rad_fluxes,
39  amrex::MultiFab* z_phys,
40  amrex::MultiFab* lat,
41  amrex::MultiFab* lon,
42  const bool updated_lsm,
43  amrex::Real& declin,
44  amrex::Real& calday) = 0;
45 
46  /**
47  * @brief Reports whether the last radiation call updated its outputs.
48  * @return True when the radiation kernel wrote output fields.
49  */
50  virtual bool radiation_updated () const { return true; }
51 
52  virtual
53  void
54  WriteDataLog (const double& time) = 0;
55 
56  // Get names input varnames for lsm
57  virtual
58  amrex::Vector<std::string>
60  {
61  amrex::Vector<std::string> empty = {" "};
62  return empty;
63  }
64 
65  // Get names output varnames for lsm
66  virtual
67  amrex::Vector<std::string>
69  {
70  amrex::Vector<std::string> empty = {" "};
71  return empty;
72  }
73 
74  // Check if this is a nested patch (doesn't reach model top)
75  virtual
76  bool
77  is_nested_patch () const
78  {
79  return false; // Default: not a nested patch
80  }
81 
82  void
84  {
85  amrex::ParmParse pp("erf.rad");
86  if (pp.contains("datalog")) {
87  pp.queryAdd("datalog", datalogname);
88 
90  }
91  }
92 
93  void
94  setDataLogFrequency (const int nstep) {
95  datalog_int = nstep;
96  }
97 
98  bool
99  hasDatalog () { return (datalog != nullptr && datalog->good()); }
100 
101 protected:
102  std::unique_ptr<std::fstream> datalog = nullptr;
103  std::string datalogname;
104 
105  int datalog_int = -1; // datalog frequency in steps
106 
107 private:
108  void
109  setRecordDataInfo (const std::string& filename)
110  {
111  datalog = std::make_unique<std::fstream>();
112  if (amrex::ParallelDescriptor::IOProcessor())
113  {
114  datalog->open(filename.c_str(),std::ios::out|std::ios::app);
115  if (!datalog->good()) {
116  amrex::FileOpenFailed(filename);
117  }
118  datalogname = filename;
119  }
120  amrex::ParallelDescriptor::Barrier("ERF::Radiation::setRecordDataInfo");
121  }
122 };
123 
124 #endif
ParmParse pp("prob")
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_RadiationInterface.H:14
bool hasDatalog()
Definition: ERF_RadiationInterface.H:99
std::string datalogname
Definition: ERF_RadiationInterface.H:103
virtual void Run(int &level, int &step, double &time, const double &dt, const amrex::BoxArray &ba, amrex::Geometry &geom, amrex::MultiFab *cons_in, amrex::iMultiFab *lmask, amrex::MultiFab *t_surf, const amrex::Vector< const amrex::MultiFab * > &lsm_input_ptrs, const amrex::Vector< amrex::MultiFab * > &lsm_output_ptrs, amrex::MultiFab *qheating_rates, amrex::MultiFab *rad_fluxes, amrex::MultiFab *z_phys, amrex::MultiFab *lat, amrex::MultiFab *lon, const bool updated_lsm, amrex::Real &declin, amrex::Real &calday)=0
std::unique_ptr< std::fstream > datalog
Definition: ERF_RadiationInterface.H:102
void setupDataLog()
Definition: ERF_RadiationInterface.H:83
void setDataLogFrequency(const int nstep)
Definition: ERF_RadiationInterface.H:94
virtual void Init(const amrex::Geometry &geom, const amrex::BoxArray &ba, amrex::MultiFab *cons_in)=0
virtual bool is_nested_patch() const
Definition: ERF_RadiationInterface.H:77
int datalog_int
Definition: ERF_RadiationInterface.H:105
virtual ~IRadiation()=default
void setRecordDataInfo(const std::string &filename)
Definition: ERF_RadiationInterface.H:109
virtual void WriteDataLog(const double &time)=0
virtual bool radiation_updated() const
Reports whether the last radiation call updated its outputs.
Definition: ERF_RadiationInterface.H:50
virtual amrex::Vector< std::string > get_lsm_input_varnames()
Definition: ERF_RadiationInterface.H:59
virtual amrex::Vector< std::string > get_lsm_output_varnames()
Definition: ERF_RadiationInterface.H:68