16 #include "eckit/exception/Exceptions.h"
18 #include "oops/util/DateTime.h"
19 #include "oops/util/missingValues.h"
29 TropopauseEstimate::TropopauseEstimate(
const eckit::LocalConfiguration & conf)
33 options_.deserialize(conf);
36 invars_ +=
Variable(
"datetime@MetaData");
38 invars_ +=
Variable(
"latitude@MetaData");
40 if (options_.convert_p2z.value())
41 oops::Log::debug() <<
" TropopauseEstimate: will convert pres to height" << std::endl;
46 TropopauseEstimate::~TropopauseEstimate() {}
50 void TropopauseEstimate::compute(
const ObsFilterData & in,
52 const size_t nlocs = in.nlocs();
56 ASSERT(out.nvars() == 1);
59 const float tropo_equator = options_.tropo_equator.value();
60 const float tropo_pole = options_.tropo_pole.value();
61 bool convert_p2z = options_.convert_p2z.value();
64 std::vector<float> latitude;
65 in.get(Variable(
"latitude@MetaData"), latitude);
66 std::vector<util::DateTime> datetimes;
67 in.get(Variable(
"datetime@MetaData"), datetimes);
70 if (datetimes.empty()) {
74 int year, month, day, hour, minute, second, day_peak;
75 float slope, tropo_start, season_factor;
76 std::vector<float> answer(
nlocs);
80 datetimes[0].toYYYYMMDDhhmmss(year, month, day, hour, minute, second);
81 const util::DateTime firstDayOfYear(year, 1, 1, 0, 0, 0);
82 const int day_of_year = (datetimes[0] - firstDayOfYear).toSeconds() / (24*3600);
85 for (
size_t jj = 0; jj <
nlocs; ++jj) {
86 if (latitude[jj] > 0.0) {
91 slope = std::max(0.0, (
std::abs(latitude[jj])-15.0)/(90.0-15.0));
92 tropo_start = (tropo_pole-tropo_equator)*slope + tropo_equator;
93 season_factor = std::cos((day_of_year - day_peak)*0.5f*0.0174533f);
94 answer[jj] = tropo_start + season_factor*5000.0;
97 if (convert_p2z) answer[jj] = 44307.692*(1.0 - pow(answer[jj]/101325.0f, 0.19f));
99 out[0][jj] = answer[jj];
105 out.save(
"DerivedValue");
111 const ufo::Variables & TropopauseEstimate::requiredVariables()
const {
integer function nlocs(this)
Return the number of observational locations in this Locations object.
static ObsFunctionMaker< TropopauseEstimate > makerObsFuncTropopauseEstimate_("TropopauseEstimate")
util::Duration abs(const util::Duration &duration)