OOPS
IncrementL95.h
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2009-2016 ECMWF.
3  * (C) Copyright 2017-2019 UCAR.
4  *
5  * This software is licensed under the terms of the Apache Licence Version 2.0
6  * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
7  * In applying this licence, ECMWF does not waive the privileges and immunities
8  * granted to it by virtue of its status as an intergovernmental organisation nor
9  * does it submit to any jurisdiction.
10  */
11 
12 #ifndef LORENZ95_INCREMENTL95_H_
13 #define LORENZ95_INCREMENTL95_H_
14 
15 #include <memory>
16 #include <ostream>
17 #include <string>
18 #include <vector>
19 
20 #include "atlas/field.h"
21 
22 #include "lorenz95/FieldL95.h"
23 #include "lorenz95/Iterator.h"
24 #include "lorenz95/Resolution.h"
25 
28 #include "oops/util/DateTime.h"
29 #include "oops/util/Duration.h"
30 #include "oops/util/ObjectCounter.h"
31 #include "oops/util/Printable.h"
32 #include "oops/util/Serializable.h"
33 
34 namespace eckit {
35  class Configuration;
36 }
37 
38 namespace oops {
39  class LocalIncrement;
40  class Variables;
41 }
42 
43 namespace lorenz95 {
44  class GomL95;
45  class LocsL95;
46  class ModelBiasCorrection;
47  class StateL95;
48 
49 /// Increment Class: Difference between two states
50 /*!
51  * Some fields that are present in a State may not be present in
52  * an Increment. The Increment contains everything that is needed by
53  * the tangent-linear and adjoint models.
54  */
55 
56 // -----------------------------------------------------------------------------
57 class IncrementL95 : public util::Printable,
58  public util::Serializable,
60  private util::ObjectCounter<IncrementL95> {
61  public:
62  static const std::string classname() {return "lorenz95::IncrementL95";}
63 
64 /// Constructor, destructor
65  IncrementL95(const Resolution &, const oops::Variables &, const util::DateTime &);
66  IncrementL95(const Resolution &, const IncrementL95 &);
67  IncrementL95(const IncrementL95 &, const bool);
68  virtual ~IncrementL95();
69 
70 /// Basic operators
71  void diff(const StateL95 &, const StateL95 &);
72  void zero();
73  void zero(const util::DateTime &);
74  void ones();
75  void dirac(const eckit::Configuration &);
79  IncrementL95 & operator*=(const double &);
80  void axpy(const double &, const IncrementL95 &, const bool check = true);
81  double dot_product_with(const IncrementL95 &) const;
82  void schur_product_with(const IncrementL95 &);
83  void random();
84 
85 /// ATLAS
86  void setAtlas(atlas::FieldSet *) const;
87  void toAtlas(atlas::FieldSet *) const;
88  void fromAtlas(atlas::FieldSet *);
89 
90 // Utilities
91  void read(const eckit::Configuration &);
92  void write(const eckit::Configuration &) const;
93  double norm () const {return fld_.rms();}
94  const util::DateTime & validTime() const {return time_;}
95  util::DateTime & validTime() {return time_;}
96  void updateTime(const util::Duration & dt) {time_ += dt;}
97 
98  oops::LocalIncrement getLocal(const Iterator &) const;
99  void setLocal(const oops::LocalIncrement &, const Iterator &);
100 
101 /// Access to data
102  const FieldL95 & getField() const {return fld_;}
103  FieldL95 & getField() {return fld_;}
104  std::shared_ptr<const Resolution> geometry() const {
105  std::shared_ptr<const Resolution> geom(new Resolution(fld_.resol()));
106  return geom;
107  }
108  std::vector<double> & asVector() {return fld_.asVector();}
109  const std::vector<double> & asVector() const {return fld_.asVector();}
110 
111  void accumul(const double &, const StateL95 &);
112 
113 /// Serialize and deserialize
114  size_t serialSize() const override;
115  void serialize(std::vector<double> &) const override;
116  void deserialize(const std::vector<double> &, size_t &) override;
117 
118  private:
119  void print(std::ostream &) const override;
121  util::DateTime time_;
122 };
123 
124 // -----------------------------------------------------------------------------
125 
126 } // namespace lorenz95
127 
128 #endif // LORENZ95_INCREMENTL95_H_
lorenz95::IncrementL95::zero
void zero()
Definition: IncrementL95.cc:101
lorenz95::IncrementL95::geometry
std::shared_ptr< const Resolution > geometry() const
Definition: IncrementL95.h:104
lorenz95::IncrementL95::dot_product_with
double dot_product_with(const IncrementL95 &) const
Definition: IncrementL95.cc:124
oops
The namespace for the main oops code.
Definition: ErrorCovarianceL95.cc:22
lorenz95::IncrementL95::classname
static const std::string classname()
Definition: IncrementL95.h:62
lorenz95::IncrementL95::validTime
util::DateTime & validTime()
Definition: IncrementL95.h:95
oops::GeneralizedDepartures
Abstract base class for quantities.
Definition: GeneralizedDepartures.h:22
lorenz95::IncrementL95::print
void print(std::ostream &) const override
Definition: IncrementL95.cc:194
lorenz95::IncrementL95::serialSize
size_t serialSize() const override
Serialize and deserialize.
Definition: IncrementL95.cc:231
lorenz95::IncrementL95::fromAtlas
void fromAtlas(atlas::FieldSet *)
Definition: IncrementL95.cc:225
FieldL95.h
lorenz95::IncrementL95::setAtlas
void setAtlas(atlas::FieldSet *) const
ATLAS.
Definition: IncrementL95.cc:217
lorenz95::IncrementL95::asVector
std::vector< double > & asVector()
Definition: IncrementL95.h:108
lorenz95::Resolution
Handles resolution.
Definition: Resolution.h:42
lorenz95::FieldL95::asVector
std::vector< double > & asVector()
Definition: FieldL95.h:68
lorenz95::FieldL95::rms
double rms() const
Definition: FieldL95.cc:162
lorenz95::IncrementL95::read
void read(const eckit::Configuration &)
Utilities.
Definition: IncrementL95.cc:143
lorenz95::IncrementL95::fld_
FieldL95 fld_
Definition: IncrementL95.h:120
lorenz95::IncrementL95::write
void write(const eckit::Configuration &) const
Definition: IncrementL95.cc:169
lorenz95::IncrementL95::random
void random()
Definition: IncrementL95.cc:133
lorenz95::StateL95
L95 model state.
Definition: StateL95.h:53
LocalIncrement.h
lorenz95::IncrementL95::deserialize
void deserialize(const std::vector< double > &, size_t &) override
Definition: IncrementL95.cc:246
lorenz95::IncrementL95::schur_product_with
void schur_product_with(const IncrementL95 &)
Definition: IncrementL95.cc:129
lorenz95::IncrementL95::operator*=
IncrementL95 & operator*=(const double &)
Definition: IncrementL95.cc:96
lorenz95::IncrementL95::dirac
void dirac(const eckit::Configuration &)
Definition: IncrementL95.cc:114
lorenz95::IncrementL95::norm
double norm() const
Definition: IncrementL95.h:93
lorenz95::IncrementL95::validTime
const util::DateTime & validTime() const
Definition: IncrementL95.h:94
lorenz95::IncrementL95
Increment Class: Difference between two states.
Definition: IncrementL95.h:60
eckit
Definition: FieldL95.h:22
lorenz95::IncrementL95::serialize
void serialize(std::vector< double > &) const override
Definition: IncrementL95.cc:238
lorenz95::IncrementL95::time_
util::DateTime time_
Definition: IncrementL95.h:121
lorenz95::IncrementL95::getLocal
oops::LocalIncrement getLocal(const Iterator &) const
Definition: IncrementL95.cc:199
lorenz95::IncrementL95::IncrementL95
IncrementL95(const Resolution &, const oops::Variables &, const util::DateTime &)
Constructor, destructor.
Definition: IncrementL95.cc:45
Iterator.h
lorenz95::IncrementL95::operator-=
IncrementL95 & operator-=(const IncrementL95 &)
Definition: IncrementL95.cc:90
lorenz95::IncrementL95::ones
void ones()
Definition: IncrementL95.cc:110
lorenz95::Iterator
Definition: Iterator.h:30
lorenz95::IncrementL95::updateTime
void updateTime(const util::Duration &dt)
Definition: IncrementL95.h:96
lorenz95::IncrementL95::axpy
void axpy(const double &, const IncrementL95 &, const bool check=true)
Definition: IncrementL95.cc:118
lorenz95::IncrementL95::setLocal
void setLocal(const oops::LocalIncrement &, const Iterator &)
Definition: IncrementL95.cc:209
oops::LocalIncrement
Definition: LocalIncrement.h:19
lorenz95::IncrementL95::accumul
void accumul(const double &, const StateL95 &)
Definition: IncrementL95.cc:137
lorenz95::IncrementL95::getField
FieldL95 & getField()
Definition: IncrementL95.h:103
lorenz95::IncrementL95::asVector
const std::vector< double > & asVector() const
Definition: IncrementL95.h:109
lorenz95::IncrementL95::operator=
IncrementL95 & operator=(const IncrementL95 &)
Definition: IncrementL95.cc:78
lorenz95::IncrementL95::getField
const FieldL95 & getField() const
Access to data.
Definition: IncrementL95.h:102
lorenz95::IncrementL95::~IncrementL95
virtual ~IncrementL95()
Definition: IncrementL95.cc:66
lorenz95::IncrementL95::diff
void diff(const StateL95 &, const StateL95 &)
Basic operators.
Definition: IncrementL95.cc:72
lorenz95::IncrementL95::toAtlas
void toAtlas(atlas::FieldSet *) const
Definition: IncrementL95.cc:221
GeneralizedDepartures.h
oops::Variables
Definition: oops/base/Variables.h:23
lorenz95::IncrementL95::operator+=
IncrementL95 & operator+=(const IncrementL95 &)
Definition: IncrementL95.cc:84
lorenz95::FieldL95
Class to represent fields for the L95 model.
Definition: FieldL95.h:34
lorenz95::FieldL95::resol
const int & resol() const
Set and get.
Definition: FieldL95.h:65
lorenz95
The namespace for the L95 model.
Definition: l95/src/lorenz95/AnalyticInit.cc:17
Resolution.h