1 #ifndef ERF_NOAHMP_VEGETATION_TABLE_H_
2 #define ERF_NOAHMP_VEGETATION_TABLE_H_
16 #include <AMReX_REAL.H>
46 {
amrex::Real(4.0),
amrex::Real(4.0),
amrex::Real(4.0),
amrex::Real(4.0),
amrex::Real(4.0),
amrex::Real(4.0),
amrex::Real(4.0),
amrex::Real(4.0),
amrex::Real(4.0),
amrex::Real(4.0),
amrex::Real(4.0),
amrex::Real(4.0)}},
48 {
amrex::Real(4.5),
amrex::Real(4.5),
amrex::Real(4.5),
amrex::Real(4.5),
amrex::Real(4.5),
amrex::Real(4.5),
amrex::Real(4.5),
amrex::Real(4.5),
amrex::Real(4.5),
amrex::Real(4.5),
amrex::Real(4.5),
amrex::Real(4.5)}},
50 {
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.6),
amrex::Real(1.2),
amrex::Real(2.0),
amrex::Real(2.6),
amrex::Real(1.7),
amrex::Real(1.0),
amrex::Real(0.5),
amrex::Real(0.2),
amrex::Real(0.0)}},
52 {
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.3),
amrex::Real(1.2),
amrex::Real(3.0),
amrex::Real(4.7),
amrex::Real(4.5),
amrex::Real(3.4),
amrex::Real(1.2),
amrex::Real(0.3),
amrex::Real(0.0),
amrex::Real(0.0)}},
54 {
amrex::Real(2.0),
amrex::Real(2.0),
amrex::Real(2.2),
amrex::Real(2.6),
amrex::Real(3.5),
amrex::Real(4.3),
amrex::Real(4.3),
amrex::Real(3.7),
amrex::Real(2.6),
amrex::Real(2.2),
amrex::Real(2.0),
amrex::Real(2.0)}},
56 {
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.3),
amrex::Real(0.9),
amrex::Real(2.2),
amrex::Real(3.5),
amrex::Real(3.5),
amrex::Real(2.5),
amrex::Real(0.9),
amrex::Real(0.3),
amrex::Real(0.0),
amrex::Real(0.0)}},
58 {
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.2),
amrex::Real(0.6),
amrex::Real(1.5),
amrex::Real(2.3),
amrex::Real(2.3),
amrex::Real(1.7),
amrex::Real(0.6),
amrex::Real(0.2),
amrex::Real(0.0),
amrex::Real(0.0)}},
60 {
amrex::Real(0.2),
amrex::Real(0.2),
amrex::Real(0.4),
amrex::Real(1.0),
amrex::Real(2.4),
amrex::Real(4.1),
amrex::Real(4.1),
amrex::Real(2.7),
amrex::Real(1.0),
amrex::Real(0.4),
amrex::Real(0.2),
amrex::Real(0.2)}},
62 {
amrex::Real(0.3),
amrex::Real(0.3),
amrex::Real(0.5),
amrex::Real(0.8),
amrex::Real(1.8),
amrex::Real(3.6),
amrex::Real(3.8),
amrex::Real(2.1),
amrex::Real(0.9),
amrex::Real(0.5),
amrex::Real(0.3),
amrex::Real(0.3)}},
64 {
amrex::Real(0.4),
amrex::Real(0.5),
amrex::Real(0.6),
amrex::Real(0.7),
amrex::Real(1.2),
amrex::Real(3.0),
amrex::Real(3.5),
amrex::Real(1.5),
amrex::Real(0.7),
amrex::Real(0.6),
amrex::Real(0.5),
amrex::Real(0.4)}},
66 {
amrex::Real(0.2),
amrex::Real(0.3),
amrex::Real(0.3),
amrex::Real(0.5),
amrex::Real(1.5),
amrex::Real(2.9),
amrex::Real(3.5),
amrex::Real(2.7),
amrex::Real(1.2),
amrex::Real(0.3),
amrex::Real(0.3),
amrex::Real(0.2)}},
68 {
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(1.0),
amrex::Real(2.0),
amrex::Real(3.0),
amrex::Real(3.0),
amrex::Real(1.5),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0)}},
70 {
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0)}},
72 {
amrex::Real(0.2),
amrex::Real(0.3),
amrex::Real(0.3),
amrex::Real(0.4),
amrex::Real(1.1),
amrex::Real(2.5),
amrex::Real(3.2),
amrex::Real(2.2),
amrex::Real(1.1),
amrex::Real(0.3),
amrex::Real(0.3),
amrex::Real(0.2)}},
74 {
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0)}},
76 {
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0)}},
78 {
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0)}},
80 {
amrex::Real(1.0),
amrex::Real(1.0),
amrex::Real(1.1),
amrex::Real(1.3),
amrex::Real(1.7),
amrex::Real(2.1),
amrex::Real(2.1),
amrex::Real(1.8),
amrex::Real(1.3),
amrex::Real(1.1),
amrex::Real(1.0),
amrex::Real(1.0)}},
82 {
amrex::Real(0.6),
amrex::Real(0.6),
amrex::Real(0.7),
amrex::Real(0.8),
amrex::Real(1.2),
amrex::Real(1.8),
amrex::Real(1.8),
amrex::Real(1.3),
amrex::Real(0.8),
amrex::Real(0.7),
amrex::Real(0.6),
amrex::Real(0.6)}},
84 {
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0),
amrex::Real(0.0)}},
87 return &table[category - 1];
104 while (d >= days_in_year) { d -= days_in_year; }
109 int m1 =
static_cast<int>(month +
amrex::Real(0.5));
113 if (m1 < 1) { m1 = 12; }
114 if (m2 > 12) { m2 = 1; }
115 return w1 * params.lai[m1 - 1] + w2 * params.lai[m2 - 1];
129 [[nodiscard]]
inline bool
133 int year = 0, month = 0, mday = 0, hour = 0, minute = 0;
135 const int n = std::sscanf(datetime.c_str(),
"%d-%d-%d %d:%d:%lf",
136 &year, &month, &mday, &hour, &minute, &second);
137 if (n < 3 || month < 1 || month > 12) {
return false; }
138 if (n < 4) { hour = 0; }
139 if (n < 5) { minute = 0; }
140 if (n < 6) { second = 0.0; }
141 const bool leap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
142 const int month_days[12] = {31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
143 if (mday < 1 || mday > month_days[month - 1] || hour < 0 || hour > 23 ||
144 minute < 0 || minute > 59 || second < 0.0 || second > 60.0) {
147 int whole = mday - 1;
148 for (
int m = 0; m < month - 1; ++m) { whole += month_days[m]; }
150 static_cast<amrex::Real>((hour * 3600.0 + minute * 60.0 + second) / 86400.0);
amrex::Real noahmp_leaf_area_index(const NoahMPVegetationParams ¶ms, amrex::Real day, amrex::Real days_in_year, bool southern) noexcept
Leaf area index of params on day of year day, interpolated between the monthly values as Noah-MP does...
Definition: ERF_NoahMPVegetationTable.H:98
constexpr int noahmp_num_vegetation_categories
Definition: ERF_NoahMPVegetationTable.H:34
const NoahMPVegetationParams * noahmp_vegetation_params(int category) noexcept
The parameters of MODIS land-use category category (1-20), as Noah-MP reads them.
Definition: ERF_NoahMPVegetationTable.H:41
bool noahmp_day_of_year(const std::string &datetime, amrex::Real &day, amrex::Real &days_in_year)
The day of the year, as Noah-MP counts it, of a date "YYYY-MM-DD[ HH:MM[:SS]]" (ERF's start_datetime)...
Definition: ERF_NoahMPVegetationTable.H:130
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_NoahMPVegetationTable.H:23
amrex::Real lai[12]
LAI_JAN ... LAI_DEC monthly leaf area index [m^2/m^2].
Definition: ERF_NoahMPVegetationTable.H:30
amrex::Real t_opt
TOPT optimum transpiration air temperature [K].
Definition: ERF_NoahMPVegetationTable.H:27
amrex::Real rs_min
RS minimum stomatal resistance [s/m].
Definition: ERF_NoahMPVegetationTable.H:24
amrex::Real z0
Z0MVT momentum roughness length of the vegetation [m].
Definition: ERF_NoahMPVegetationTable.H:29
amrex::Real hs
HS vapour pressure deficit parameter [1/(kg/kg)].
Definition: ERF_NoahMPVegetationTable.H:26
amrex::Real rgl
RGL radiation stress parameter [W/m^2].
Definition: ERF_NoahMPVegetationTable.H:25
amrex::Real rs_max
RSMAX maximum stomatal resistance [s/m].
Definition: ERF_NoahMPVegetationTable.H:28