UFO
ObsDomainErrCheck.cc
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2018-2019 UCAR
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 
9 
10 #include <algorithm>
11 #include <string>
12 #include <vector>
13 
14 #include "eckit/config/Configuration.h"
15 #include "eckit/config/LocalConfiguration.h"
16 
17 #include "ioda/ObsDataVector.h"
18 #include "ioda/ObsSpace.h"
19 #include "oops/util/abor1_cpp.h"
20 #include "oops/util/Logger.h"
21 #include "oops/util/missingValues.h"
23 
24 namespace ufo {
25 
26 // -----------------------------------------------------------------------------
27 
28 ObsDomainErrCheck::ObsDomainErrCheck(ioda::ObsSpace & obsdb, const eckit::Configuration & config,
29  std::shared_ptr<ioda::ObsDataVector<int> > flags,
30  std::shared_ptr<ioda::ObsDataVector<float> > obserr)
31  : FilterBase(obsdb, config, flags, obserr),
32  parameter_(0.0)
33 {
34  oops::Log::debug() << "ObsDomainErrCheck: config = " << config_ << std::endl;
35  ASSERT(obserr);
36 
37  const float missing = util::missingValue(missing);
38  float parameter_ = config.getFloat("infltparameter", missing);
39  ASSERT(parameter_ != missing);
40 }
41 
42 // -----------------------------------------------------------------------------
43 
45 
46 // -----------------------------------------------------------------------------
47 
48 void ObsDomainErrCheck::applyFilter(const std::vector<bool> & inside,
49  const Variables & filtervars,
50  std::vector<std::vector<bool>> & flagged) const {
51  const oops::Variables observed = obsdb_.obsvariables();
52 
53  ioda::ObsDataVector<float> obs(obsdb_, filtervars.toOopsVariables(), "ObsValue");
54  size_t nlocs = obsdb_.nlocs();
55 
56 // compute function
57  std::vector<float> values(nlocs);
58  ioda::ObsDataVector<float> vals(obsdb_, "Scattering");
59  ObsFunctionScattering obsdiag;
60  obsdiag.compute(data_, vals);
61  for (size_t jj = 0; jj < nlocs; ++jj) {
62  values[jj] = vals["Scattering"][jj];
63  }
64 
65  size_t count = 0;
66  for (size_t jv = 0; jv < filtervars.nvars(); ++jv) {
67  size_t iv = observed.find(filtervars.variable(jv).variable());
68  for (size_t jobs = 0; jobs < obsdb_.nlocs(); ++jobs) {
69  if (!inside[jobs]) {
70  flagged[jv][jobs] = true;
71  } else {
72  ASSERT((*obserr_)[iv][jobs] != util::missingValue((*obserr_)[iv][jobs]));
73  ASSERT(obs[jv][jobs] != util::missingValue(obs[jv][jobs]));
74  float bound = 2.5 * (*obserr_)[iv][jobs];
75  float obserrinc = parameter_ * std::max((values[jobs]-9.0), 0.0) * (*obserr_)[iv][jobs];
76  obserrinc = std::max((*obserr_)[iv][jobs], bound);
77  (*obserr_)[iv][jobs] = sqrt(pow((*obserr_)[iv][jobs], 2) + pow(obserrinc, 2));
78  ++count;
79  }
80  }
81  }
82  oops::Log::info() << "count=" << count << std::endl;
83 }
84 
85 // -----------------------------------------------------------------------------
86 
87 void ObsDomainErrCheck::print(std::ostream & os) const {
88  os << "ObsDomainErrCheck: config = " << config_ << std::endl;
89 }
90 
91 // -----------------------------------------------------------------------------
92 
93 } // namespace ufo
ufo::ObsFunctionScattering::compute
void compute(const ObsFilterData &, ioda::ObsDataVector< float > &) const
compute the result of the function
Definition: ObsFunctionScattering.cc:35
ufo::Variables::nvars
size_t nvars() const
Definition: Variables.cc:104
ufo::ObsDomainErrCheck::print
void print(std::ostream &) const override
Definition: ObsDomainErrCheck.cc:87
ufo::Variables
Definition: src/ufo/filters/Variables.h:24
ufo::ObsDomainErrCheck::parameter_
float parameter_
Definition: ObsDomainErrCheck.h:56
ufo_radiancerttov_utils_mod::debug
logical, public debug
Definition: ufo_radiancerttov_utils_mod.F90:100
ufo::FilterBase::obsdb_
ioda::ObsSpace & obsdb_
Definition: FilterBase.h:59
ufo::FilterBase
FilterBase: Base class for UFO QC filters.
Definition: FilterBase.h:42
ObsFunctionScattering.h
ufo
Definition: RunCRTM.h:27
ufo::FilterBase::obserr_
std::shared_ptr< ioda::ObsDataVector< float > > obserr_
Definition: FilterBase.h:62
ufo::FilterBase::data_
ObsFilterData data_
Definition: FilterBase.h:65
ufo::ObsDomainErrCheck::applyFilter
void applyFilter(const std::vector< bool > &, const Variables &, std::vector< std::vector< bool >> &) const override
Definition: ObsDomainErrCheck.cc:48
ufo::ObsDomainErrCheck::~ObsDomainErrCheck
~ObsDomainErrCheck()
Definition: ObsDomainErrCheck.cc:44
ufo::QCflags::missing
constexpr int missing
Definition: QCflags.h:15
ufo::ObsFunctionScattering
Definition: ObsFunctionScattering.h:19
ufo::Variables::toOopsVariables
oops::Variables toOopsVariables() const
Definition: Variables.cc:144
ufo::Variable::variable
const std::string & variable() const
Definition: Variable.cc:100
ioda::ObsDataVector< int >
ufo::Variables::variable
Variable variable(const size_t) const
Definition: Variables.cc:114
ufo::FilterBase::config_
const eckit::LocalConfiguration config_
Definition: FilterBase.h:60
ufo::ObsDomainErrCheck::ObsDomainErrCheck
ObsDomainErrCheck(ioda::ObsSpace &, const eckit::Configuration &, std::shared_ptr< ioda::ObsDataVector< int > >, std::shared_ptr< ioda::ObsDataVector< float > >)
Definition: ObsDomainErrCheck.cc:28
ObsDomainErrCheck.h