Go to the documentation of this file.
20 :
ProfileCheckBase(options, profileIndices, profileDataHandler, profileCheckValidator)
28 const std::vector <float> &pressures =
30 const std::vector <float> &tObs =
32 const std::vector <float> &tBkg =
34 const std::vector <float> &RHObs =
36 const std::vector <float> &RHBkg =
38 const std::vector <float> &tdObs =
40 const std::vector <int> &tFlags =
42 std::vector <int> &RHFlags =
44 const std::vector <float> &tObsCorrection =
47 std::vector <int> &TotCProfs =
49 std::vector <int> &TotHProfs =
51 std::vector <int> &TotCFlags =
53 std::vector <int> &TotHFlags =
55 std::vector <int> &TotLFlags =
58 if (!oops::allVectorsSameNonZeroSize(pressures, tObs, tBkg, RHObs, RHBkg,
59 tdObs, tFlags, RHFlags, tObsCorrection)) {
60 oops::Log::warning() <<
"At least one vector is the wrong size. "
61 <<
"Check will not be performed." << std::endl;
62 oops::Log::warning() <<
"Vector sizes: "
63 << oops::listOfVectorSizes(pressures, tObs, tBkg, RHObs, RHBkg,
64 tdObs, tFlags, RHFlags, tObsCorrection)
69 std::vector <float> tObsFinal;
78 Press_.assign(numLevelsToCheck, 0.0);
79 Temp_.assign(numLevelsToCheck, 0.0);
80 rh_.assign(numLevelsToCheck, 0.0);
81 td_.assign(numLevelsToCheck, 0.0);
82 tbk_.assign(numLevelsToCheck, 0.0);
83 rhbk_.assign(numLevelsToCheck, 0.0);
84 FlagH_.assign(numLevelsToCheck, 0);
85 Indx_.assign(numLevelsToCheck, -1);
88 for (
int jlev = 0; jlev < numLevelsToCheck; ++jlev) {
90 PTrop = pressures[jlev] * 0.01;
92 if (pressures[jlev] > 0.0 &&
94 Tmin = std::min(Tmin, tObsFinal[jlev]);
96 Press_[NumLev] = pressures[jlev] * 0.01;
97 Temp_[NumLev] = tObsFinal[jlev];
98 rh_[NumLev] = RHObs[jlev];
99 td_[NumLev] = tdObs[jlev];
100 tbk_[NumLev] = tBkg[jlev];
101 rhbk_[NumLev] = RHBkg[jlev];
104 RHDLowP = RHDLowP +
rh_[NumLev] -
rhbk_[NumLev];
109 if (NumLev <= 1)
return;
115 for (
int jlev = 1; jlev < NumLev; ++jlev) {
118 if (
FlagH_[jlev] == 1)
continue;
120 rh_[jlev - 1] >= RHThresh) ||
121 (
td_[jlev] >
td_[jlev - 1] &&
122 std::min(
rh_[jlev - 1],
rh_[jlev]) >= RHThresh)) {
123 float MinRHabove =
rh_[jlev];
124 for (
int klev = jlev + 1; klev < NumLev; ++klev) {
125 if (
Press_[jlev] -
Press_[klev] > PressDiffAdjThresh)
break;
126 MinRHabove = std::min(MinRHabove,
rh_[klev]);
131 oops::Log::debug() <<
" -> Error at top of cloud layer for level " << jlev << std::endl;
132 for (
int klev = jlev + 1; klev < NumLev; ++klev) {
133 if (
Press_[jlev] -
Press_[klev] > PressDiffAdjThresh)
break;
134 if (
td_[klev] <=
td_[jlev - 1])
break;
141 if (NLowP > 0) RHDLowP = RHDLowP /
static_cast <float> (NLowP);
151 if ((PTrop != 0.0 &&
Press_[NumLev - 1] <= PTrop) ||
153 for (
int ilev = NumLev - 1; ilev >= 0; ilev--) {
154 if (
rh_[ilev] >
rhbk_[ilev] + SondeRHHiTol ||
157 oops::Log::debug() <<
" -> Sonde ascent too moist for level " << ilev << std::endl;
168 for (
int i = 0; i < NumLev; ++i) {
169 if (
FlagH_[i] == 1) ++NumHFlags;
170 if (
FlagH_[i] == 2) ++NumCFlags;
173 if (NumHFlags > 0) TotHProfs[0]++;
175 for (
int n = 0; n < NumCFlags; ++n)
177 for (
int n = 0; n < NumHFlags; ++n)
179 for (
int n = 0; n < NumLFlags; ++n)
182 if (NumCFlags + NumHFlags > 0) {
183 for (
int jlev = 0; jlev < NumLev; ++jlev) {
185 int ilev =
Indx_[jlev];
@ TropopauseFlag
Tropopause Level.
std::vector< float > rhbk_
Model relative humidity for selected levels (%)
Retrieve and store data for individual profiles. To do this, first the vector of values in the entire...
const ProfileIndices & profileIndices_
Indices of profile's observations in the entire sample.
Determine indices of observations making up individual profiles. The indices are computed with respec...
static constexpr const char *const obs_dew_point_temperature
ProfileDataHandler & profileDataHandler_
Profile data handler.
static constexpr const char *const hofx_relative_humidity
void runCheck() override
Run check.
int getNumLevelsToCheck() const
Return number of levels to which QC checks should be applied.
std::vector< float > tbk_
Model temperature for selected levels (K)
oops::Parameter< float > RHCheck_SondeRHHiTol
Tolerance for high level check of relative humidity (%)
oops::Parameter< float > RHCheck_PressDiffAdjThresh
Threshold for pressure difference between adjacent levels (Pa)
oops::Parameter< float > RHCheck_TminInit
Initial value of minimum temperature (K)
static constexpr const char *const tbk
Profile QC check validator.
static constexpr const char *const Temp
static constexpr const char *const qcflags_relative_humidity
std::vector< int > FlagH_
Flags for RH checks.
static constexpr const char *const counter_TotCFlags
static ProfileCheckMaker< ProfileCheckRH > makerProfileCheckRH_("RH")
std::vector< float > Press_
Observed pressure for selected levels (hPa)
Profile QC checker base class.
oops::Parameter< float > RHCheck_MinRHThresh
Threshold for minimum relative humidity (%)
const ProfileConsistencyCheckParameters & options_
Configurable parameters.
static constexpr const char *const counter_TotLFlags
oops::Parameter< float > RHCheck_RHThresh
Threshold for relative humidity (%)
void fillValidator() override
Fill variables in validator.
static constexpr const char *const td
static constexpr const char *const obs_air_pressure
const float missingValueFloat
Missing value (float)
static constexpr const char *const Press
oops::Parameter< float > RHCheck_PressDiff0Thresh
Threshold for pressure difference relative to level 0 (Pa)
static constexpr const char *const hofx_air_temperature
oops::Parameter< float > RHCheck_tdDiffThresh
Threshold for dew point temperature difference (K)
Options controlling the operation of the ProfileConsistencyChecks filter.
static constexpr const char *const counter_TotHProfs
static constexpr const char *const counter_TotCProfs
static constexpr const char *const rhbk
std::vector< float > rh_
Observed relative humidity for selected levels (%)
void correctVector(const std::vector< T > &v1, const std::vector< T > &v2, std::vector< T > &vout)
Apply correction to vector of values.
static constexpr const char *const obscorrection_air_temperature
oops::Parameter< float > RHCheck_TempThresh
Lower threshold for temperature in moisture check.
std::vector< float > Temp_
Observed temperature for selected levels (K)
static constexpr const char *const obs_relative_humidity
oops::Parameter< float > RHCheck_PressThresh
Threshold for pressure (Pa)
static constexpr const char *const qcflags_air_temperature
oops::Parameter< float > RHCheck_PressInitThresh
Threshold for pressure when setting up arrays (Pa)
std::vector< float > td_
Observed dew point temperature for selected levels (K)
@ FinalRejectFlag
Final QC flag.
static constexpr const char *const counter_TotHFlags
std::vector< int > Indx_
Indices of selected levels.
static constexpr const char *const Indx
@ InterpolationFlag
Interpolation check flag.
static constexpr const char *const FlagH
oops::Parameter< float > RHCheck_TminThresh
Upper threshold for Tmin in moisture check.
std::vector< T > & get(const std::string &fullname)
static constexpr const char *const obs_air_temperature
void set(const std::string &fullname, std::vector< T > &&vec_in)
ProfileCheckRH(const ProfileConsistencyCheckParameters &options, const ProfileIndices &profileIndices, ProfileDataHandler &profileDataHandler, ProfileCheckValidator &profileCheckValidator)
static constexpr const char *const rh