SOCA
HorizFilt.cc
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2017-2021 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 
8 #include <ostream>
9 #include <string>
10 
11 #include "eckit/config/Configuration.h"
12 
13 #include "oops/interface/LinearVariableChange.h"
14 #include "oops/util/abor1_cpp.h"
15 #include "oops/util/Logger.h"
16 
17 #include "soca/Geometry/Geometry.h"
19 #include "soca/State/State.h"
20 #include "soca/Traits.h"
23 
24 
25 namespace soca {
26 
27  // -----------------------------------------------------------------------------
28  static oops::LinearVariableChangeMaker<Traits,
29  oops::LinearVariableChange<Traits, HorizFilt> >
31 
32  // -----------------------------------------------------------------------------
34  const State & traj,
35  const Geometry & geom,
36  const eckit::Configuration & conf):
37  geom_(new Geometry(geom)),
38  vars_(conf, "filter variables") {
39  const eckit::Configuration * configc = &conf;
40 
41  // Interpolate trajectory to the geom resolution
42  State traj_at_geomres(geom, traj);
43 
44  // Compute averaging weights
46  &configc,
47  geom_->toFortran(),
48  traj_at_geomres.toFortran(),
49  vars_);
50 
51  // Get number of iterations
52  niter_ = configc->getInt("niter");
53  }
54  // -----------------------------------------------------------------------------
57  }
58  // -----------------------------------------------------------------------------
59  void HorizFilt::multiply(const Increment & dxin, Increment & dxout) const {
60  dxout = dxin;
61  Increment dx_tmp(dxin);
62  for (unsigned int iter = 0; iter < niter_; ++iter) {
63  dx_tmp = dxout;
65  dx_tmp.toFortran(),
66  dxout.toFortran(),
67  geom_->toFortran());
68  }
69  }
70  // -----------------------------------------------------------------------------
71  void HorizFilt::multiplyInverse(const Increment & dxin, Increment & dxout)
72  const {
73  dxout = dxin;
74  }
75  // -----------------------------------------------------------------------------
76  void HorizFilt::multiplyAD(const Increment & dxin, Increment & dxout) const {
77  dxout = dxin;
78  Increment dx_tmp(dxin);
79  for (unsigned int iter = 0; iter < niter_; ++iter) {
80  dx_tmp = dxout;
82  dx_tmp.toFortran(),
83  dxout.toFortran(),
84  geom_->toFortran());
85  }
86  }
87  // -----------------------------------------------------------------------------
88  void HorizFilt::multiplyInverseAD(const Increment & dxin, Increment & dxout)
89  const {
90  dxout = dxin;
91  }
92  // -----------------------------------------------------------------------------
93  void HorizFilt::print(std::ostream & os) const {
94  os << "SOCA HorizFilt";
95  }
96  // -----------------------------------------------------------------------------
97 } // namespace soca
Geometry handles geometry for SOCA model.
Definition: Geometry.h:48
void print(std::ostream &) const override
Definition: HorizFilt.cc:93
unsigned int niter_
Definition: HorizFilt.h:54
HorizFilt(const State &, const State &, const Geometry &, const eckit::Configuration &)
Definition: HorizFilt.cc:33
void multiply(const Increment &, Increment &) const
Perform linear transforms.
Definition: HorizFilt.cc:59
void multiplyInverseAD(const Increment &, Increment &) const
Definition: HorizFilt.cc:88
void multiplyInverse(const Increment &, Increment &) const
Definition: HorizFilt.cc:71
oops::Variables vars_
Definition: HorizFilt.h:53
void multiplyAD(const Increment &, Increment &) const
Definition: HorizFilt.cc:76
std::unique_ptr< const Geometry > geom_
Definition: HorizFilt.h:52
Increment Class: Difference between two states.
Definition: Increment.h:61
int & toFortran()
Definition: Increment.h:112
SOCA model state.
Definition: State.h:48
int & toFortran()
Definition: State.h:88
void soca_horizfilt_multad_f90(const F90balopmat &, const F90flds &, F90flds &, const F90geom &)
void soca_horizfilt_delete_f90(F90balopmat &)
void soca_horizfilt_setup_f90(F90balopmat &, const eckit::Configuration *const *, const F90geom &, const F90flds &, const oops::Variables &)
void soca_horizfilt_mult_f90(const F90balopmat &, const F90flds &, F90flds &, const F90geom &)
static oops::LinearVariableChangeMaker< Traits, oops::LinearVariableChange< Traits, HorizFilt > > makerLinearVariableChangeHorizFilt_("HorizFiltSOCA")