13 #include "ioda/ObsSpace.h"
14 #include "ioda/ObsVector.h"
16 #include "oops/base/Variables.h"
17 #include "oops/util/Logger.h"
20 #include "ufo/GeoVaLs.h"
31 oops::Log::trace() <<
"ObsCompositeTLAD constructor starting" << std::endl;
33 for (
const eckit::LocalConfiguration &operatorConfig : parameters.
components.value()) {
35 operatorParams.validateAndDeserialize(operatorConfig);
36 std::unique_ptr<LinearObsOperatorBase> op(
42 oops::Log::trace() <<
"ObsCompositeTLAD created." << std::endl;
48 oops::Log::trace() <<
"ObsCompositeTLAD destructed" << std::endl;
54 oops::Log::trace() <<
"ObsCompositeTLAD: setTrajectory entered" << std::endl;
56 for (
const std::unique_ptr<LinearObsOperatorBase> &component :
components_)
57 component->setTrajectory(geovals, ydiags);
59 oops::Log::trace() <<
"ObsCompositeTLAD: setTrajectory exit " << std::endl;
65 oops::Log::trace() <<
"ObsCompositeTLAD: simulateObsTL entered" << std::endl;
67 for (
const std::unique_ptr<LinearObsOperatorBase> &component :
components_)
68 component->simulateObsTL(geovals, ovec);
70 oops::Log::trace() <<
"ObsCompositeTLAD: simulateObsTL exit " << std::endl;
76 oops::Log::trace() <<
"ObsCompositeTLAD: simulateObsAD entered" << std::endl;
78 for (
const std::unique_ptr<LinearObsOperatorBase> &component :
components_)
79 component->simulateObsAD(geovals, ovec);
81 oops::Log::trace() <<
"ObsCompositeTLAD: simulateObsAD exit " << std::endl;
90 for (
const std::unique_ptr<LinearObsOperatorBase> &component :
components_) {
91 oops::Variables componentVars;
93 componentVars += component->simulatedVars();
94 const size_t oldSize = vars.size();
95 vars += componentVars;
96 if (vars.size() != oldSize + componentVars.size())
98 throw eckit::UserError(
"Multiple components simulate the same variables", Here());
106 os <<
"ObsComposite with the following components:\n";
GeoVaLs: geophysical values at locations.
static LinearObsOperatorBase * create(const ioda::ObsSpace &, const ObsOperatorParametersBase &)
Create and return a new linear observation operator.
Contains a polymorphic parameter holding an instance of a subclass of ObsOperatorParametersBase.
oops::RequiredPolymorphicParameter< ObsOperatorParametersBase, LinearObsOperatorFactory > operatorParameters
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.
oops::Variables requiredVars_
ObsCompositeTLAD(const ioda::ObsSpace &, const Parameters_ &)
oops::Variables simulatedVars() const override
List of variables simulated by this operator.
void simulateObsTL(const GeoVaLs &, ioda::ObsVector &) const override
~ObsCompositeTLAD() override
std::vector< std::unique_ptr< LinearObsOperatorBase > > components_
void simulateObsAD(GeoVaLs &, const ioda::ObsVector &) const override
void setTrajectory(const GeoVaLs &, ObsDiagnostics &) override
Obs Operator.
void print(std::ostream &) const override
static LinearObsOperatorMaker< ObsCompositeTLAD > makerCompositeTL_("Composite")