15 #include "ioda/ObsVector.h"
17 #include "oops/base/Variables.h"
18 #include "oops/util/Logger.h"
21 #include "ufo/GeoVaLs.h"
22 #include "ufo/Locations.h"
23 #include "ufo/ObsDiagnostics.h"
34 oops::Log::trace() <<
"ObsComposite constructor starting" << std::endl;
36 for (
const eckit::LocalConfiguration &operatorConfig : parameters.
components.value()) {
38 operatorParams.validateAndDeserialize(operatorConfig);
39 std::unique_ptr<ObsOperatorBase> op(
45 oops::Log::trace() <<
"ObsComposite constructor finished" << std::endl;
51 oops::Log::trace() <<
"ObsComposite destructed" << std::endl;
58 oops::Log::trace() <<
"ObsComposite: simulateObs entered" << std::endl;
60 for (
const std::unique_ptr<ObsOperatorBase> &component :
components_)
61 component->simulateObs(gv, ovec, ydiags);
63 oops::Log::trace() <<
"ObsComposite: simulateObs exit " << std::endl;
72 for (
const std::unique_ptr<ObsOperatorBase> &component :
components_) {
73 oops::Variables componentVars;
75 componentVars += component->simulatedVars();
76 const size_t oldSize = vars.size();
77 vars += componentVars;
78 if (vars.size() != oldSize + componentVars.size())
80 throw eckit::UserError(
"Multiple components simulate the same variables", Here());
88 os <<
"ObsComposite with the following components:\n";
GeoVaLs: geophysical values at locations.
void simulateObs(const GeoVaLs &, ioda::ObsVector &, ObsDiagnostics &) const override
Obs Operator.
oops::Variables requiredVars_
std::vector< std::unique_ptr< ObsOperatorBase > > components_
ObsComposite(const ioda::ObsSpace &, const Parameters_ &)
oops::Variables simulatedVars() const override
List of variables simulated by this operator.
void print(std::ostream &) const override
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 ¶ms)
Create and return a new observation operator.
Contains a polymorphic parameter holding an instance of a subclass of ObsOperatorParametersBase.
oops::RequiredPolymorphicParameter< ObsOperatorParametersBase, ObsOperatorFactory > operatorParameters
static ObsOperatorMaker< ObsComposite > obsCompositeMaker_("Composite")