UFO
ObsComposite.cc
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2021 UK 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 
9 
10 #include <algorithm>
11 #include <ostream>
12 #include <utility>
13 #include <vector>
14 
15 #include "ioda/ObsVector.h"
16 
17 #include "oops/base/Variables.h"
18 #include "oops/util/Logger.h"
19 
21 #include "ufo/GeoVaLs.h"
22 #include "ufo/Locations.h"
23 #include "ufo/ObsDiagnostics.h"
24 
25 namespace ufo {
26 
27 // -----------------------------------------------------------------------------
29 // -----------------------------------------------------------------------------
30 
31 ObsComposite::ObsComposite(const ioda::ObsSpace & odb, const Parameters_ & parameters)
32  : ObsOperatorBase(odb), odb_(odb)
33 {
34  oops::Log::trace() << "ObsComposite constructor starting" << std::endl;
35 
36  for (const eckit::LocalConfiguration &operatorConfig : parameters.components.value()) {
37  ObsOperatorParametersWrapper operatorParams;
38  operatorParams.validateAndDeserialize(operatorConfig);
39  std::unique_ptr<ObsOperatorBase> op(
40  ObsOperatorFactory::create(odb, operatorParams.operatorParameters));
41  requiredVars_ += op->requiredVars();
42  components_.push_back(std::move(op));
43  }
44 
45  oops::Log::trace() << "ObsComposite constructor finished" << std::endl;
46 }
47 
48 // -----------------------------------------------------------------------------
49 
51  oops::Log::trace() << "ObsComposite destructed" << std::endl;
52 }
53 
54 // -----------------------------------------------------------------------------
55 
56 void ObsComposite::simulateObs(const GeoVaLs & gv, ioda::ObsVector & ovec,
57  ObsDiagnostics & ydiags) const {
58  oops::Log::trace() << "ObsComposite: simulateObs entered" << std::endl;
59 
60  for (const std::unique_ptr<ObsOperatorBase> &component : components_)
61  component->simulateObs(gv, ovec, ydiags);
62 
63  oops::Log::trace() << "ObsComposite: simulateObs exit " << std::endl;
64 }
65 
66 // -----------------------------------------------------------------------------
67 
68 oops::Variables ObsComposite::simulatedVars() const {
69  // Merge the lists of variables simulated by all components, ensuring that there are
70  // no overlaps.
71  oops::Variables vars;
72  for (const std::unique_ptr<ObsOperatorBase> &component : components_) {
73  oops::Variables componentVars;
74  // We use += rather than = to make sure componentVars contains no duplicate entries.
75  componentVars += component->simulatedVars();
76  const size_t oldSize = vars.size();
77  vars += componentVars;
78  if (vars.size() != oldSize + componentVars.size())
79  // We don't want multiple components to write to the same row in the H(x) array.
80  throw eckit::UserError("Multiple components simulate the same variables", Here());
81  }
82  return vars;
83 }
84 
85 // -----------------------------------------------------------------------------
86 
87 void ObsComposite::print(std::ostream & os) const {
88  os << "ObsComposite with the following components:\n";
89  for (size_t i = 0; i < components_.size(); ++i) {
90  os << " - " << *components_[i];
91  if (i != components_.size() - 1)
92  os << '\n';
93  }
94 }
95 
96 // -----------------------------------------------------------------------------
97 
98 } // namespace ufo
GeoVaLs: geophysical values at locations.
void simulateObs(const GeoVaLs &, ioda::ObsVector &, ObsDiagnostics &) const override
Obs Operator.
Definition: ObsComposite.cc:56
~ObsComposite() override
Definition: ObsComposite.cc:50
oops::Variables requiredVars_
Definition: ObsComposite.h:79
std::vector< std::unique_ptr< ObsOperatorBase > > components_
Definition: ObsComposite.h:78
ObsComposite(const ioda::ObsSpace &, const Parameters_ &)
Definition: ObsComposite.cc:31
oops::Variables simulatedVars() const override
List of variables simulated by this operator.
Definition: ObsComposite.cc:68
void print(std::ostream &) const override
Definition: ObsComposite.cc:87
Configuration options recognized by the Composite operator.
oops::RequiredParameter< std::vector< eckit::LocalConfiguration > > components
A list of configuration options for each operator used to simulate a subset of variables.
static ObsOperatorBase * create(const ioda::ObsSpace &, const ObsOperatorParametersBase &params)
Create and return a new observation operator.
Contains a polymorphic parameter holding an instance of a subclass of ObsOperatorParametersBase.
oops::RequiredPolymorphicParameter< ObsOperatorParametersBase, ObsOperatorFactory > operatorParameters
Definition: RunCRTM.h:27
static ObsOperatorMaker< ObsComposite > obsCompositeMaker_("Composite")