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 Parameters_ & parameters,
29  std::shared_ptr<ioda::ObsDataVector<int> > flags,
30  std::shared_ptr<ioda::ObsDataVector<float> > obserr)
31  : FilterBase(obsdb, parameters, flags, obserr),
32  parameters_(parameters)
33 {
34  oops::Log::debug() << "ObsDomainErrCheck: config = " << parameters_ << std::endl;
35  ASSERT(obserr);
36 }
37 
38 // -----------------------------------------------------------------------------
39 
41 
42 // -----------------------------------------------------------------------------
43 
44 void ObsDomainErrCheck::applyFilter(const std::vector<bool> & inside,
45  const Variables & filtervars,
46  std::vector<std::vector<bool>> & flagged) const {
47  const oops::Variables observed = obsdb_.obsvariables();
48 
49  ioda::ObsDataVector<float> obs(obsdb_, filtervars.toOopsVariables(), "ObsValue");
50  size_t nlocs = obsdb_.nlocs();
51 
52 // compute function
53  std::vector<float> values(nlocs);
54  ioda::ObsDataVector<float> vals(obsdb_, "Scattering");
55  ObsFunctionScattering obsdiag;
56  obsdiag.compute(data_, vals);
57  for (size_t jj = 0; jj < nlocs; ++jj) {
58  values[jj] = vals["Scattering"][jj];
59  }
60 
61  size_t count = 0;
62  const float parameter = parameters_.infltparameter;
63  for (size_t jv = 0; jv < filtervars.nvars(); ++jv) {
64  size_t iv = observed.find(filtervars.variable(jv).variable());
65  for (size_t jobs = 0; jobs < obsdb_.nlocs(); ++jobs) {
66  if (!inside[jobs]) {
67  flagged[jv][jobs] = true;
68  } else {
69  ASSERT((*obserr_)[iv][jobs] != util::missingValue((*obserr_)[iv][jobs]));
70  ASSERT(obs[jv][jobs] != util::missingValue(obs[jv][jobs]));
71  float bound = 2.5 * (*obserr_)[iv][jobs];
72  float obserrinc = parameter * std::max((values[jobs]-9.0), 0.0) * (*obserr_)[iv][jobs];
73  obserrinc = std::max((*obserr_)[iv][jobs], bound);
74  (*obserr_)[iv][jobs] = sqrt(pow((*obserr_)[iv][jobs], 2) + pow(obserrinc, 2));
75  ++count;
76  }
77  }
78  }
79  oops::Log::info() << "count=" << count << std::endl;
80 }
81 
82 // -----------------------------------------------------------------------------
83 
84 void ObsDomainErrCheck::print(std::ostream & os) const {
85  os << "ObsDomainErrCheck: config = " << parameters_ << std::endl;
86 }
87 
88 // -----------------------------------------------------------------------------
89 
90 } // namespace ufo
Base class for UFO QC filters.
Definition: FilterBase.h:45
void applyFilter(const std::vector< bool > &, const Variables &, std::vector< std::vector< bool >> &) const override
void print(std::ostream &) const override
ObsDomainErrCheck(ioda::ObsSpace &, const Parameters_ &, std::shared_ptr< ioda::ObsDataVector< int > >, std::shared_ptr< ioda::ObsDataVector< float > >)
Parameters controlling the operation of the ObsDomainErrCheck filter.
oops::RequiredParameter< float > infltparameter
void compute(const ObsFilterData &, ioda::ObsDataVector< float > &) const
compute the result of the function
std::shared_ptr< ioda::ObsDataVector< float > > obserr_
ioda::ObsSpace & obsdb_
const std::string & variable() const
Definition: Variable.cc:99
size_t nvars() const
Return the number of constituent "primitive" (single-channel) variables.
Definition: Variables.cc:104
Variable variable(const size_t) const
Return a given constituent "primitive" (single-channel) variable.
Definition: Variables.cc:114
oops::Variables toOopsVariables() const
Definition: Variables.cc:156
integer function nlocs(this)
Return the number of observational locations in this Locations object.
Definition: RunCRTM.h:27