UFO
ProfileCheckHydrostatic.cc
Go to the documentation of this file.
1 /*
2  * (C) Crown copyright 2020, Met Office
3  *
4  * This software is licensed under the terms of the Apache Licence Version 2.0
5  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6  */
7 
10 
11 namespace ufo {
12 
14 
16  const ProfileIndices &profileIndices,
17  ProfileDataHandler &profileDataHandler,
18  ProfileCheckValidator &profileCheckValidator)
19  : ProfileCheckBase(options, profileIndices, profileDataHandler, profileCheckValidator),
20  ProfileStandardLevels(options)
21  {}
22 
24  {
25  oops::Log::debug() << " Hydrostatic check" << std::endl;
26 
27  const int numLevelsToCheck = profileIndices_.getNumLevelsToCheck();
28 
29  const std::vector <float> &pressures =
31  const std::vector <float> &tObs =
33  const std::vector <float> &tBkg =
35  const std::vector <float> &zObs =
37  const std::vector <float> &zBkg =
39  std::vector <int> &tFlags =
41  std::vector <int> &zFlags =
43  std::vector <int> &NumAnyErrors =
45  std::vector <int> &Num925Miss =
47  std::vector <int> &Num100Miss =
49  std::vector <int> &NumStdMiss =
51  std::vector <int> &NumHydErrObs =
53  std::vector <int> &NumIntHydErrors =
55  const std::vector <float> &tObsCorrection =
57  std::vector <float> &zObsCorrection =
59 
60  if (!oops::allVectorsSameNonZeroSize(pressures, tObs, tBkg, zObs, zBkg, tFlags, zFlags,
61  tObsCorrection, zObsCorrection)) {
62  oops::Log::warning() << "At least one vector is the wrong size. "
63  << "Check will not be performed." << std::endl;
64  oops::Log::warning() << "Vector sizes: "
65  << oops::listOfVectorSizes(pressures, tObs, tBkg, zObs, zBkg, tFlags,
66  zFlags, tObsCorrection, zObsCorrection)
67  << std::endl;
68  return;
69  }
70 
71  std::vector <float> tObsFinal;
72  correctVector(tObs, tObsCorrection, tObsFinal);
73 
74  calcStdLevels(numLevelsToCheck, pressures, tObsFinal, tFlags);
76 
77  HydDesc_ = options_.HydDesc.value();
78  DC_.assign(numLevelsToCheck, missingValueFloat);
79  ETol_.assign(numLevelsToCheck, missingValueFloat);
80  D_.assign(numLevelsToCheck, missingValueFloat);
81  E_.assign(numLevelsToCheck + 1, missingValueFloat);
82  HydError_.assign(numLevelsToCheck, 0);
83 
84  int NumErrors = 0;
85  // Find large thickness residuals
86  for (int jlevstd = 1; jlevstd < NumStd_; ++jlevstd) {
87  int jlev = StdLev_[jlevstd]; // Standard level
88  int jlevB = StdLev_[jlevstd - 1]; // Standard level below this one
89  if (zObs[jlev] == missingValueFloat ||
90  zObs[jlevB] == missingValueFloat) continue;
91  if (IndStd_[jlevstd - 1] == -1) { // Surface
92  if (std::fabs(pressures[jlevB] - pressures[jlev]) >
93  options_.HCheck_SurfacePThresh.value()) continue;
94  } else if (IndStd_[jlevstd] == Ind925_ + 1 &&
95  IndStd_[jlevstd - 1] == Ind925_ - 1) { // Missed 925 hPa
96  Num925Miss[0]++;
97  } else if (IndStd_[jlevstd] - IndStd_[jlevstd - 1] != 1) {
98  if (IndStd_[jlevstd - 1] < Ind925_ &&
99  IndStd_[jlevstd] > Ind925_) { // Allow for bigger gaps than two standard levels
100  Num925Miss[0]++;
101  } else if (IndStd_[jlevstd - 1] < Ind100_ &&
102  IndStd_[jlevstd] > Ind100_) { // Missed 100 hPa
103  Num100Miss[0]++;
104  } else { // Missed any other standard level
105  NumStdMiss[0]++;
106  }
107 
108  oops::Log::debug() << " Gap in standard levels" << std::endl;
109  oops::Log::debug() << " -> Level " << jlev << ": "
110  << "P = " << pressures[jlev] * 0.01 << "hPa, tObs = "
111  << tObsFinal[jlev] - ufo::Constants::t0c << "C, "
112  << "tBkg = " << tBkg[jlev] - ufo::Constants::t0c << "C" << std::endl;
113  oops::Log::debug() << " -> Level " << jlevB << ": "
114  << "P = " << pressures[jlevB] * 0.01 << "hPa, tObs = "
115  << tObsFinal[jlevB] - ufo::Constants::t0c << "C, "
116  << "tBkg = " << tBkg[jlevB] - ufo::Constants::t0c
117  << "C" << std::endl;
118  oops::Log::debug() << " -> IndStd[" << jlevstd << "] = "
119  << IndStd_[jlevstd] << ", "
120  << "IndStd[" << jlevstd - 1 << "] = "
121  << IndStd_[jlevstd - 1] << std::endl;
122  continue;
123  }
124 
125  DC_[jlevstd] = 0.5 * ufo::Constants::rd_over_g * (LogP_[jlevB] - LogP_[jlev]);
126  D_[jlevstd] = DC_[jlevstd] *
127  (tObsFinal[jlevB] + tObsFinal[jlev]); // Thickness calculated from temperature
128 
129  // For neutral stability T(jlev) = T(jlevB) * TRatio
130  float TRatio = std::pow(pressures[jlev] / pressures[jlevB], ufo::Constants::rd_over_cp);
131  float DB = DC_[jlevstd] * (1.0 + TRatio) *
132  tObsFinal[jlevB]; // Min thickness given T(jlevB)
133  float DA = DC_[jlevstd] * (1.0 / TRatio + 1.0) *
134  tObsFinal[jlev]; // Max thickness given T(jlev)
135  ETol_[jlevstd] = options_.HCheck_ETolMult.value() * (DA - DB);
136  float ETolMax = options_.HCheck_ETolMax.value();
137  if (pressures[jlevB] <= options_.HCheck_ETolMaxPThresh.value())
138  ETolMax = options_.HCheck_ETolMaxLarger.value();
139  float ETolMin = options_.HCheck_ETolMin.value(); // ETolMin = 20.0 m in GGDPS
140  ETol_[jlevstd] = std::max(std::min(ETol_[jlevstd], ETolMax), ETolMin);
141  E_[jlevstd] = zObs[jlev] - zObs[jlevB] - D_[jlevstd];
142  if (std::fabs(E_[jlevstd]) > ETol_[jlevstd]) {
143  NumErrors++;
144  NumAnyErrors[0]++;
145  HydError_[jlevstd] = 3; // T or Z error
146  } else {
147  HydError_[jlevstd] = 0; // Probably OK
148  if (std::fabs(E_[jlevstd]) <= options_.HCheck_EThresh.value() &&
149  std::fabs(E_[jlevstd - 1]) <= options_.HCheck_EThreshB.value() &&
152  oops::Log::debug() << " -> removed interpolation flag on level " << jlevB << std::endl;
153  }
154  }
155  }
156 
157  // Hydrostatic decision making algorithm
158  if (NumErrors > 0) {
159  NumHydErrObs[0]++;
160 
161  for (int jlevstd = 2; jlevstd < NumStd_; ++jlevstd) {
162  // Check for duplicate std levels
163  if (eckit::types::is_approximately_equal(DC_[jlevstd - 1], 0.0f) ||
164  eckit::types::is_approximately_equal(DC_[jlevstd], 0.0f)) continue;
165  int jlev = StdLev_[jlevstd]; // Standard level
166  int jlevB = StdLev_[jlevstd - 1]; // Standard level below
167  if (HydError_[jlevstd] == 3 || HydError_[jlevstd - 1] == 3) {
168  if (E_[jlevstd] == missingValueFloat) {
169  // Checked previous time as top level
170  continue;
171  }
172  if (E_[jlevstd - 1] == missingValueFloat) {
173  if (E_[jlevstd + 1] == missingValueFloat) {
178  oops::Log::debug() << " -> Isolated large residual on levels "
179  << jlev << " and " << jlevB << std::endl;
180  }
181  continue;
182  }
183  // Possible temperature corrections
184 
185  // These equations are expressed differently to their equivalents in the OPS code.
186  // This avoids a vectorisation problem in the clang compiler:
187  // previously, when E_ was divided by DC_, some (extraneous) machine registers
188  // were filled with zeros prior to the division occurring.
189  // A floating point exception was then thrown due to division by zero even though
190  // the registers in question played no further part in the calculation.
191  float EDC1 = E_[jlevstd - 1] * DC_[jlevstd];
192  float EDC2 = E_[jlevstd] * DC_[jlevstd - 1];
193  float MinAbsEDC = std::min(std::fabs(EDC1), std::fabs(EDC2));
194  float CorrMinThreshDC = options_.HCheck_CorrMinThresh.value()
195  * DC_[jlevstd] * DC_[jlevstd - 1];
196  float AbsEDCDiff = std::fabs(EDC1 - EDC2);
197  float CorrDiffThreshDC = options_.HCheck_CorrDiffThresh.value()
198  * DC_[jlevstd] * DC_[jlevstd - 1];
199 
200  float MinAbsE = std::min(std::fabs(E_[jlevstd - 1]), std::fabs(E_[jlevstd]));
201 
202  float ENext = missingValueFloat;
203  if (jlevstd < NumStd_ - 1) ENext = E_[jlevstd + 1];
204 
205  // Height error
206  if ((std::fabs(E_[jlevstd - 1] + E_[jlevstd]) <=
207  options_.HCheck_ESumThresh.value() &&
208  MinAbsE >= options_.HCheck_MinAbsEThresh.value()) ||
209  (std::fabs(E_[jlevstd - 1] + E_[jlevstd]) <=
211  MinAbsE >= options_.HCheck_MinAbsEThreshLarger.value())) {
213  oops::Log::debug() << " -> Failed hydrostatic check (height error) on level "
214  << jlevB << std::endl;
215  HydError_[jlevstd - 1] = 1;
216  HydError_[jlevstd] = 0;
217  float Corr = 0.5 * (E_[jlevstd] - E_[jlevstd - 1]); // Average of adjacent levels
218  float CorrApp = 100.0 * std::round(Corr / 100.0); // Round to nearest 100 m
219  if (std::fabs(Corr - CorrApp) > options_.HCheck_CorrThresh.value()) CorrApp = 0.0;
220  oops::Log::debug() << " -> P = " << pressures[jlevB] * 0.01
221  << "hPa, zObs = " << zObs[jlevB] << "m, "
222  << "Z Correction? " << Corr << "m"
223  << ", rounded = " << CorrApp << "m" << std::endl;
224  if (CorrApp != 0.0) {
226  if (options_.HCheck_CorrectZ.value()) {
227  zObsCorrection[jlevB] = CorrApp;
228  oops::Log::debug() << " -> Uncorrected zObs: " << zObs[jlevB] << "m" << std::endl;
229  oops::Log::debug() << " zObs correction: " << CorrApp << "m" << std::endl;
230  oops::Log::debug() << " Corrected zObs: "
231  << zObs[jlevB] + zObsCorrection[jlevB] << "m" << std::endl;
232  } else {
233  // Observation is rejected
235  }
236  }
237  // Height errors in two adjacent levels
238  } else if (ENext != missingValueFloat &&
239  std::fabs(E_[jlevstd - 1] + E_[jlevstd] + ENext) <=
241  MinAbsE >= options_.HCheck_MinAbsEThresh.value()) {
244  HydError_[jlevstd - 1] = 1;
245  HydError_[jlevstd] = 1;
246 
247  oops::Log::debug() << " -> Failed hydrostatic check (height error) on levels "
248  << jlevB << " and " << jlev << std::endl;
249 
250  float Corr = -E_[jlevstd - 1];
251  oops::Log::debug() << " -> P = " << pressures[jlevB] * 0.01 << "hPa, zObs = "
252  << zObs[jlevB] << "m, "
253  << "Z Correction? " << Corr << "m" << std::endl;
254  Corr = ENext;
255  oops::Log::debug() << " -> P = " << pressures[jlev] * 0.01 << "hPa, zObs = "
256  << zObs[jlev] << "m, "
257  << "Z Correction? " << Corr << "m" << std::endl;
258 
259  // Temperature error
260  } else if (MinAbsE >= options_.HCheck_MinAbsEThreshT.value() &&
261  AbsEDCDiff <= CorrDiffThreshDC &&
262  MinAbsEDC >= CorrMinThreshDC) {
264  HydError_[jlevstd - 1] = 2;
265  HydError_[jlevstd] = 0;
266 
267  oops::Log::debug() << " -> Failed hydrostatic check (temperature error) on level "
268  << jlevB << std::endl;
269 
270  // Potential T correction
271  float Corr1 = E_.at(jlevstd - 1) / DC_.at(jlevstd - 1);
272  float Corr2 = E_.at(jlevstd) / DC_.at(jlevstd);
273  float Corr = 0.5 * (Corr1 + Corr2);
274  oops::Log::debug() << " -> P = " << pressures[jlevB] * 0.01 << "hPa, tObs = "
275  << tObsFinal[jlevB] - ufo::Constants::t0c << "C, "
276  << "T Correction? " << Corr << "C, "
277  << " Corr1, Corr2 = "
278  << Corr1 << "C, " << Corr2 << "C , DC[" << jlevstd - 1
279  << "], DC[" << jlevstd << "] = "
280  << DC_[jlevstd - 1] << ", " << DC_[jlevstd]
281  << std::endl;
282 
284  int SigB = SigBelow_[jlevstd - 1];
285  int SigA = SigAbove_[jlevstd - 1];
286 
289 
290  NumIntHydErrors[0]++;
291  oops::Log::debug() << " -> Hyd: remove interpolation flags on levels "
292  << SigB << " " << SigA << std::endl;
293  }
294 
295  // Bottom level error in T or Z, usually jlevstd = 3
296  } else if (HydError_[jlevstd - 1] == 3 && HydError_[jlevstd] == 0) {
297  if (E_[jlevstd - 2] == missingValueFloat) {
298  int L1 = StdLev_[jlevstd - 2];
299 
302 
303  oops::Log::debug() << " -> Failed hydrostatic check "
304  << "(bottom level error in T or Z) on level " << L1 << std::endl;
305 
306  HydError_[jlevstd - 2] = 4;
307  HydError_[jlevstd - 1] = 0;
308 
310  oops::Log::debug() << " -> Baseline error for level " << L1
311  << "? P = " << pressures[L1] * 0.01 << "hPa, zObs = "
312  << zObs[L1] << "m, zBkg = " << zBkg[L1]
313  << ", zObs + E = "
314  << zObs[L1] + E_[jlevstd - 1] << "m" << std::endl;
315  }
316  } else {
317  // Error in all subsequent heights?
318  HydError_[jlevstd - 1] = 6;
320 
321  oops::Log::debug() << " -> Failed hydrostatic check "
322  << "(error in all subsequent heights) on level "
323  << jlevB << std::endl;
324  }
325  } else if (HydError_[jlevstd - 1] == 3) { // T and/or Z error
328 
329  oops::Log::debug() << " -> Failed hydrostatic check "
330  << "(T and/or Z error) on level " << jlevB << std::endl;
331  }
332 
333  // Top level error in T or Z
334  if (HydError_[jlevstd] == 3 && E_[jlevstd + 1] == missingValueFloat) {
337  HydError_[jlevstd] = 5;
338 
339  oops::Log::debug() << " -> Failed hydrostatic check "
340  << "(top level error in T or Z) on level " << jlev << std::endl;
341  }
342  }
343  }
344 
345  for (int jlevstd = 0; jlevstd < NumStd_; ++jlevstd) {
346  int HydType = HydError_[jlevstd];
347  int jlev = StdLev_[jlevstd]; // Standard level
348 
349  oops::Log::debug() << " -> Level " << jlev << ": "
350  << "P = " << pressures[jlev] * 0.01 << "hPa, tObs = "
351  << tObsFinal[jlev] - ufo::Constants::t0c << "C, "
352  << "tBkg = " << tBkg[jlev] - ufo::Constants::t0c << "C, "
353  << "zObs = " << zObs[jlev] << "m, zBkg = " << zBkg[jlev] << "m, "
354  << "D = " << D_[jlevstd] << ", E = " << E_[jlevstd]
355  << ", ETol = " << ETol_[jlevstd] << ", DC = " << DC_[jlevstd]
356  << ", HydDesc = " << HydDesc_[HydType] << " " << std::endl;
357  }
358  }
359  }
360 
362  {
368  }
369 } // namespace ufo
370 
ufo::VariableNames::counter_NumAnyErrors
static constexpr const char *const counter_NumAnyErrors
Definition: VariableNames.h:101
ufo::ProfileConsistencyCheckParameters::HCheck_ESumNextThresh
oops::Parameter< float > HCheck_ESumNextThresh
Definition: ProfileConsistencyCheckParameters.h:174
ufo::ProfileStandardLevels::LogP_
std::vector< float > LogP_
Log(Pressure) - used for vertical interpolation.
Definition: ProfileStandardLevels.h:79
ufo::ProfileConsistencyCheckParameters::HCheck_CorrThresh
oops::Parameter< float > HCheck_CorrThresh
Definition: ProfileConsistencyCheckParameters.h:173
ufo::ProfileDataHandler
Retrieve and store data for individual profiles. To do this, first the vector of values in the entire...
Definition: ProfileDataHandler.h:40
ufo::ProfileCheckBase::profileIndices_
const ProfileIndices & profileIndices_
Indices of profile's observations in the entire sample.
Definition: ProfileCheckBase.h:74
ufo::ProfileConsistencyCheckParameters::HCheck_EThresh
oops::Parameter< float > HCheck_EThresh
Definition: ProfileConsistencyCheckParameters.h:167
ufo::ProfileStandardLevels::StdLev_
std::vector< int > StdLev_
Index of standard levels.
Definition: ProfileStandardLevels.h:70
ufo::ProfileIndices
Determine indices of observations making up individual profiles. The indices are computed with respec...
Definition: ProfileIndices.h:39
ufo::ProfileCheckBase::profileDataHandler_
ProfileDataHandler & profileDataHandler_
Profile data handler.
Definition: ProfileCheckBase.h:77
ufo::VariableNames::HydError
static constexpr const char *const HydError
Definition: VariableNames.h:130
ufo::ProfileIndices::getNumLevelsToCheck
int getNumLevelsToCheck() const
Return number of levels to which QC checks should be applied.
Definition: ProfileIndices.h:52
ufo::ProfileConsistencyCheckParameters::HCheck_SurfacePThresh
oops::Parameter< float > HCheck_SurfacePThresh
Surface P threshold for hydrostatic check (Pa)
Definition: ProfileConsistencyCheckParameters.h:159
ufo::VariableNames::hofx_geopotential_height
static constexpr const char *const hofx_geopotential_height
Definition: VariableNames.h:39
ufo::Constants::t0c
static constexpr double t0c
Definition: Constants.h:24
ufo::ProfileConsistencyCheckParameters::HCheck_MinAbsEThreshT
oops::Parameter< float > HCheck_MinAbsEThreshT
Definition: ProfileConsistencyCheckParameters.h:175
ufo::ProfileCheckHydrostatic::ETol_
std::vector< float > ETol_
Thickness tolerance.
Definition: ProfileCheckHydrostatic.h:51
ufo::ProfileCheckValidator
Profile QC check validator.
Definition: ProfileCheckValidator.h:27
ufo_radiancerttov_utils_mod::debug
logical, public debug
Definition: ufo_radiancerttov_utils_mod.F90:100
ufo::ProfileStandardLevels
Calculate standard levels.
Definition: ProfileStandardLevels.h:31
ufo::VariableNames::counter_NumHydErrObs
static constexpr const char *const counter_NumHydErrObs
Definition: VariableNames.h:107
ufo::ProfileConsistencyCheckParameters::HCheck_EThreshB
oops::Parameter< float > HCheck_EThreshB
Definition: ProfileConsistencyCheckParameters.h:168
ufo::VariableNames::ETol
static constexpr const char *const ETol
Definition: VariableNames.h:127
ufo::ProfileConsistencyCheckParameters::HCheck_MinAbsEThreshLarger
oops::Parameter< float > HCheck_MinAbsEThreshLarger
Definition: ProfileConsistencyCheckParameters.h:172
ufo::ProfileStandardLevels::Ind925_
int Ind925_
Standard level index closest to 925 hPa.
Definition: ProfileStandardLevels.h:85
ufo::ProfileStandardLevels::IndStd_
std::vector< int > IndStd_
Indices of standard levels.
Definition: ProfileStandardLevels.h:82
ufo::ProfileStandardLevels::calcStdLevels
void calcStdLevels(const int numLevelsToCheck, const std::vector< float > &pressures, const std::vector< float > &tObs, const std::vector< int > &tFlags)
Calculate standard levels.
Definition: ProfileStandardLevels.cc:18
ufo::ProfileCheckMaker
Definition: ProfileCheckBase.h:113
ufo::VariableNames::qcflags_geopotential_height
static constexpr const char *const qcflags_geopotential_height
Definition: VariableNames.h:94
ufo
Definition: RunCRTM.h:27
ufo::ProfileCheckBase
Profile QC checker base class.
Definition: ProfileCheckBase.h:40
ufo::ProfileCheckBase::options_
const ProfileConsistencyCheckParameters & options_
Configurable parameters.
Definition: ProfileCheckBase.h:71
ufo::ProfileStandardLevels::NumStd_
int NumStd_
Number of standard levels.
Definition: ProfileStandardLevels.h:67
ufo::Constants::rd_over_g
static constexpr double rd_over_g
Definition: Constants.h:38
ufo::VariableNames::counter_Num925Miss
static constexpr const char *const counter_Num925Miss
Definition: VariableNames.h:104
ufo::ProfileConsistencyCheckParameters::HCheck_CorrDiffThresh
oops::Parameter< float > HCheck_CorrDiffThresh
Definition: ProfileConsistencyCheckParameters.h:176
ufo::ProfileCheckHydrostatic::ProfileCheckHydrostatic
ProfileCheckHydrostatic(const ProfileConsistencyCheckParameters &options, const ProfileIndices &profileIndices, ProfileDataHandler &profileDataHandler, ProfileCheckValidator &profileCheckValidator)
Definition: ProfileCheckHydrostatic.cc:15
ufo::ProfileConsistencyCheckParameters::HCheck_MinAbsEThresh
oops::Parameter< float > HCheck_MinAbsEThresh
Definition: ProfileConsistencyCheckParameters.h:170
ufo::VariableNames::obs_air_pressure
static constexpr const char *const obs_air_pressure
Definition: VariableNames.h:18
ufo::ProfileCheckHydrostatic::HydDesc_
std::vector< std::string > HydDesc_
Hydrostatic error descriptions.
Definition: ProfileCheckHydrostatic.h:45
ufo::ProfileCheckBase::missingValueFloat
const float missingValueFloat
Missing value (float)
Definition: ProfileCheckBase.h:83
ufo::ProfileConsistencyCheckParameters::HCheck_CorrectZ
oops::Parameter< bool > HCheck_CorrectZ
Correct zObs in the hydrostatic check?
Definition: ProfileConsistencyCheckParameters.h:180
ufo::VariableNames::E
static constexpr const char *const E
Definition: VariableNames.h:129
ufo::VariableNames::D
static constexpr const char *const D
Definition: VariableNames.h:128
ufo::ProfileCheckHydrostatic::D_
std::vector< float > D_
Thickness calculated from temepature.
Definition: ProfileCheckHydrostatic.h:54
ufo::ProfileConsistencyCheckParameters::HCheck_ESumThreshLarger
oops::Parameter< float > HCheck_ESumThreshLarger
Definition: ProfileConsistencyCheckParameters.h:171
ufo::VariableNames::hofx_air_temperature
static constexpr const char *const hofx_air_temperature
Definition: VariableNames.h:38
ufo::ProfileConsistencyCheckParameters::HCheck_ETolMaxPThresh
oops::Parameter< float > HCheck_ETolMaxPThresh
Definition: ProfileConsistencyCheckParameters.h:164
ufo::ProfileCheckHydrostatic::HydError_
std::vector< int > HydError_
Hydrostatic flag by level.
Definition: ProfileCheckHydrostatic.h:60
ufo::VariableNames::DC
static constexpr const char *const DC
Definition: VariableNames.h:126
ufo::VariableNames::counter_NumStdMiss
static constexpr const char *const counter_NumStdMiss
Definition: VariableNames.h:106
ufo::ProfileConsistencyCheckParameters
Options controlling the operation of the ProfileConsistencyChecks filter.
Definition: ProfileConsistencyCheckParameters.h:33
ufo::VariableNames::obscorrection_geopotential_height
static constexpr const char *const obscorrection_geopotential_height
Definition: VariableNames.h:121
ufo::ProfileCheckHydrostatic::DC_
std::vector< float > DC_
Constant in thickness calculation.
Definition: ProfileCheckHydrostatic.h:48
ufo::ProfileStandardLevels::Ind100_
int Ind100_
Standard level index closest to 100 hPa.
Definition: ProfileStandardLevels.h:88
ufo::Constants::rd_over_cp
static constexpr double rd_over_cp
Definition: Constants.h:35
ufo::ProfileConsistencyCheckParameters::HCheck_ETolMax
oops::Parameter< float > HCheck_ETolMax
Definition: ProfileConsistencyCheckParameters.h:163
ufo::ProfileStandardLevels::SigBelow_
std::vector< int > SigBelow_
Significant level below standard level.
Definition: ProfileStandardLevels.h:73
ufo::ProfileCheckBase::correctVector
void correctVector(const std::vector< T > &v1, const std::vector< T > &v2, std::vector< T > &vout)
Apply correction to vector of values.
Definition: ProfileCheckBase.h:60
ufo::ProfileCheckHydrostatic::E_
std::vector< float > E_
Thickness 'error'.
Definition: ProfileCheckHydrostatic.h:57
ufo::VariableNames::obscorrection_air_temperature
static constexpr const char *const obscorrection_air_temperature
Definition: VariableNames.h:120
ufo::MetOfficeQCFlags::HydrostaticFlag
@ HydrostaticFlag
Hydrostatic check flag.
Definition: MetOfficeQCFlags.h:86
ufo::VariableNames::obs_geopotential_height
static constexpr const char *const obs_geopotential_height
Definition: VariableNames.h:23
ufo::ProfileConsistencyCheckParameters::HCheck_CorrMinThresh
oops::Parameter< float > HCheck_CorrMinThresh
Definition: ProfileConsistencyCheckParameters.h:177
ufo::VariableNames::qcflags_air_temperature
static constexpr const char *const qcflags_air_temperature
Definition: VariableNames.h:92
ufo::ProfileCheckHydrostatic::fillValidator
void fillValidator() override
Fill variables in validator.
Definition: ProfileCheckHydrostatic.cc:361
ufo::MetOfficeQCFlags::FinalRejectFlag
@ FinalRejectFlag
Final QC flag.
Definition: MetOfficeQCFlags.h:54
ufo::ProfileConsistencyCheckParameters::HCheck_ETolMaxLarger
oops::Parameter< float > HCheck_ETolMaxLarger
Definition: ProfileConsistencyCheckParameters.h:165
ufo::MetOfficeQCFlags::InterpolationFlag
@ InterpolationFlag
Interpolation check flag.
Definition: MetOfficeQCFlags.h:87
VariableNames.h
ufo::ProfileStandardLevels::findHCheckStdLevs
void findHCheckStdLevs()
Compute indices of particular standard levels for the hydrostatic check.
Definition: ProfileStandardLevels.cc:78
ufo::ProfileStandardLevels::SigAbove_
std::vector< int > SigAbove_
Significant level above standard level.
Definition: ProfileStandardLevels.h:76
ufo::ProfileDataHandler::get
std::vector< T > & get(const std::string &fullname)
Definition: ProfileDataHandler.h:53
ufo::VariableNames::counter_Num100Miss
static constexpr const char *const counter_Num100Miss
Definition: VariableNames.h:105
ufo::VariableNames::obs_air_temperature
static constexpr const char *const obs_air_temperature
Definition: VariableNames.h:19
ufo::ProfileDataHandler::set
void set(const std::string &fullname, std::vector< T > &&vec_in)
Definition: ProfileDataHandler.h:92
ufo::ProfileConsistencyCheckParameters::HCheck_ESumThresh
oops::Parameter< float > HCheck_ESumThresh
Definition: ProfileConsistencyCheckParameters.h:169
ufo::ProfileConsistencyCheckParameters::HCheck_ETolMin
oops::Parameter< float > HCheck_ETolMin
Definition: ProfileConsistencyCheckParameters.h:166
ufo::ProfileCheckHydrostatic::runCheck
void runCheck() override
Run check.
Definition: ProfileCheckHydrostatic.cc:23
ufo::MetOfficeQCFlags::DataCorrectFlag
@ DataCorrectFlag
Eg sign correction.
Definition: MetOfficeQCFlags.h:63
ufo::ProfileConsistencyCheckParameters::HydDesc
oops::Parameter< std::vector< std::string > > HydDesc
Hydrostatic error descriptions.
Definition: ProfileConsistencyCheckParameters.h:183
ufo::ProfileConsistencyCheckParameters::HCheck_ETolMult
oops::Parameter< float > HCheck_ETolMult
Definition: ProfileConsistencyCheckParameters.h:162
ufo::VariableNames::counter_NumIntHydErrors
static constexpr const char *const counter_NumIntHydErrors
Definition: VariableNames.h:108
ufo::MetOfficeQCFlags::SurfaceLevelFlag
@ SurfaceLevelFlag
Surface Level.
Definition: MetOfficeQCFlags.h:89
ProfileCheckHydrostatic.h
ufo::makerProfileCheckHydrostatic_
static ProfileCheckMaker< ProfileCheckHydrostatic > makerProfileCheckHydrostatic_("Hydrostatic")