25 const std::vector <float> &pressures =
27 const std::vector <float> &tObs =
29 const std::vector <float> &tBkg =
31 const std::vector <float> &RHObs =
33 const std::vector <float> &RHBkg =
35 const std::vector <float> &tdObs =
37 const std::vector <int> &tFlags =
39 std::vector <int> &RHFlags =
41 const std::vector <float> &tObsCorrection =
44 std::vector <int> &TotCProfs =
46 std::vector <int> &TotHProfs =
48 std::vector <int> &TotCFlags =
50 std::vector <int> &TotHFlags =
52 std::vector <int> &TotLFlags =
55 if (!oops::allVectorsSameNonZeroSize(pressures, tObs, tBkg, RHObs, RHBkg,
56 tdObs, tFlags, RHFlags, tObsCorrection)) {
57 oops::Log::warning() <<
"At least one vector is the wrong size. "
58 <<
"Check will not be performed." << std::endl;
59 oops::Log::warning() <<
"Vector sizes: "
60 << oops::listOfVectorSizes(pressures, tObs, tBkg, RHObs, RHBkg,
61 tdObs, tFlags, RHFlags, tObsCorrection)
66 std::vector <float> tObsFinal;
75 Press_.assign(numProfileLevels, 0.0);
76 Temp_.assign(numProfileLevels, 0.0);
77 rh_.assign(numProfileLevels, 0.0);
78 td_.assign(numProfileLevels, 0.0);
79 tbk_.assign(numProfileLevels, 0.0);
80 rhbk_.assign(numProfileLevels, 0.0);
81 FlagH_.assign(numProfileLevels, 0);
82 Indx_.assign(numProfileLevels, -1);
85 for (
int jlev = 0; jlev < numProfileLevels; ++jlev) {
87 PTrop = pressures[jlev] * 0.01;
89 if (pressures[jlev] > 0.0 &&
91 Tmin = std::min(Tmin, tObsFinal[jlev]);
93 Press_[NumLev] = pressures[jlev] * 0.01;
94 Temp_[NumLev] = tObsFinal[jlev];
95 rh_[NumLev] = RHObs[jlev];
96 td_[NumLev] = tdObs[jlev];
97 tbk_[NumLev] = tBkg[jlev];
98 rhbk_[NumLev] = RHBkg[jlev];
101 RHDLowP = RHDLowP +
rh_[NumLev] -
rhbk_[NumLev];
106 if (NumLev <= 1)
return;
112 for (
int jlev = 1; jlev < NumLev; ++jlev) {
115 if (
FlagH_[jlev] == 1)
continue;
117 rh_[jlev - 1] >= RHThresh) ||
118 (
td_[jlev] >
td_[jlev - 1] &&
119 std::min(
rh_[jlev - 1],
rh_[jlev]) >= RHThresh)) {
120 float MinRHabove =
rh_[jlev];
121 for (
int klev = jlev + 1; klev < NumLev; ++klev) {
122 if (
Press_[jlev] -
Press_[klev] > PressDiffAdjThresh)
break;
123 MinRHabove = std::min(MinRHabove,
rh_[klev]);
128 oops::Log::debug() <<
" -> Error at top of cloud layer for level " << jlev << std::endl;
129 for (
int klev = jlev + 1; klev < NumLev; ++klev) {
130 if (
Press_[jlev] -
Press_[klev] > PressDiffAdjThresh)
break;
131 if (
td_[klev] <=
td_[jlev - 1])
break;
138 if (NLowP > 0) RHDLowP = RHDLowP /
static_cast <float> (NLowP);
148 if ((PTrop != 0.0 &&
Press_[NumLev - 1] <= PTrop) ||
150 for (
int ilev = NumLev - 1; ilev >= 0; ilev--) {
151 if (
rh_[ilev] >
rhbk_[ilev] + SondeRHHiTol ||
154 oops::Log::debug() <<
" -> Sonde ascent too moist for level " << ilev << std::endl;
165 for (
int i = 0; i < NumLev; ++i) {
166 if (
FlagH_[i] == 1) ++NumHFlags;
167 if (
FlagH_[i] == 2) ++NumCFlags;
170 if (NumHFlags > 0) TotHProfs[0]++;
172 for (
int n = 0; n < NumCFlags; ++n)
174 for (
int n = 0; n < NumHFlags; ++n)
176 for (
int n = 0; n < NumLFlags; ++n)
179 if (NumCFlags + NumHFlags > 0) {
180 for (
int jlev = 0; jlev < NumLev; ++jlev) {
182 int ilev =
Indx_[jlev];
Options controlling the operation of the ConventionalProfileProcessing filter.
oops::Parameter< float > RHCheck_PressDiffAdjThresh
Threshold for pressure difference between adjacent levels (Pa)
oops::Parameter< float > RHCheck_PressInitThresh
Threshold for pressure when setting up arrays (Pa)
oops::Parameter< float > RHCheck_TminInit
Initial value of minimum temperature (K)
oops::Parameter< float > RHCheck_PressThresh
Threshold for pressure (Pa)
oops::Parameter< float > RHCheck_tdDiffThresh
Threshold for dew point temperature difference (K)
oops::Parameter< float > RHCheck_PressDiff0Thresh
Threshold for pressure difference relative to level 0 (Pa)
oops::Parameter< float > RHCheck_TempThresh
Lower threshold for temperature in moisture check.
oops::Parameter< float > RHCheck_TminThresh
Upper threshold for Tmin in moisture check.
oops::Parameter< float > RHCheck_MinRHThresh
Threshold for minimum relative humidity (%)
oops::Parameter< float > RHCheck_SondeRHHiTol
Tolerance for high level check of relative humidity (%)
oops::Parameter< float > RHCheck_RHThresh
Threshold for relative humidity (%)
Profile QC checker base class.
const float missingValueFloat
Missing value (float)
const ConventionalProfileProcessingParameters & options_
Configurable parameters.
void correctVector(const std::vector< T > &v1, const std::vector< T > &v2, std::vector< T > &vout)
Apply correction to vector of values.
std::vector< float > rh_
Observed relative humidity for selected levels (%)
std::vector< float > td_
Observed dew point temperature for selected levels (K)
void runCheck(ProfileDataHandler &profileDataHandler) override
Run check.
std::vector< float > Temp_
Observed temperature for selected levels (K)
ProfileCheckRH(const ConventionalProfileProcessingParameters &options)
std::vector< int > Indx_
Indices of selected levels.
std::vector< int > FlagH_
Flags for RH checks.
std::vector< float > rhbk_
Model relative humidity for selected levels (%)
std::vector< float > Press_
Observed pressure for selected levels (hPa)
void fillValidationData(ProfileDataHandler &profileDataHandler) override
Fill variables in validator.
std::vector< float > tbk_
Model temperature for selected levels (K)
Retrieve and store data for individual profiles. To do this, first the vector of values in the entire...
std::vector< T > & get(const std::string &fullname)
void set(const std::string &fullname, std::vector< T > &&vec_in)
int getNumProfileLevels() const
Return number of levels to which QC checks should be applied.
@ InterpolationFlag
Interpolation check flag.
@ TropopauseFlag
Tropopause Level.
@ FinalRejectFlag
Final QC flag.
static ProfileCheckMaker< ProfileCheckRH > makerProfileCheckRH_("RH")
static constexpr const char *const rhbk
static constexpr const char *const counter_TotHFlags
static constexpr const char *const counter_TotLFlags
static constexpr const char *const obs_relative_humidity
static constexpr const char *const hofx_air_temperature
static constexpr const char *const obs_air_temperature
static constexpr const char *const FlagH
static constexpr const char *const Temp
static constexpr const char *const qcflags_relative_humidity
static constexpr const char *const rh
static constexpr const char *const counter_TotCFlags
static constexpr const char *const td
static constexpr const char *const Indx
static constexpr const char *const Press
static constexpr const char *const obs_air_pressure
static constexpr const char *const qcflags_air_temperature
static constexpr const char *const obscorrection_air_temperature
static constexpr const char *const obs_dew_point_temperature
static constexpr const char *const counter_TotHProfs
static constexpr const char *const tbk
static constexpr const char *const counter_TotCProfs
static constexpr const char *const hofx_relative_humidity