IODA
Layout.cpp
Go to the documentation of this file.
1 /*
2  * (C) Copyright 2020-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 /// \file Layout.cpp
8 /// \brief Contains implementations for how data are arranged in ioda internally.
9 
10 #include "ioda/Layout.h"
11 
12 #include <exception>
13 #include <vector>
14 
15 #include "ioda/defs.h"
16 #include "ioda/Exception.h"
18 
19 #include "ioda/config.h"
20 
21 #if (eckit_FOUND && oops_FOUND)
22 # define ENABLE_ODB_LAYOUT
24 #endif
25 
26 namespace ioda {
27 namespace detail {
28 std::shared_ptr<const DataLayoutPolicy> DataLayoutPolicy::generate(const std::string &polid) {
29  if (polid == "ObsGroup" || polid == "ObsGroupODB")
30  return std::make_shared<DataLayoutPolicy_ObsGroup>();
31  return std::make_shared<DataLayoutPolicy>();
32 }
33 
34 std::shared_ptr<const DataLayoutPolicy> DataLayoutPolicy::generate(Policies pol) {
35  if (pol == Policies::ObsGroup || pol == Policies::ObsGroupODB) return std::make_shared<DataLayoutPolicy_ObsGroup>();
36  return std::make_shared<DataLayoutPolicy>();
37 }
38 
39 std::shared_ptr<const DataLayoutPolicy> DataLayoutPolicy::generate(const std::string &polid, const std::string &mapPath) {
40  if (polid != "ObsGroupODB")
41  throw Exception("A mapping file is only relevant for the ODB Data Layout.", ioda_Here());
42 #ifdef ENABLE_ODB_LAYOUT
43  return std::make_shared<DataLayoutPolicy_ObsGroup_ODB>(mapPath);
44 #else
45  throw Exception("Cannot generate this policy, as either eckit or oops are disabled.",
46  ioda_Here());
47 #endif
48 }
49 
50 std::shared_ptr<const DataLayoutPolicy> DataLayoutPolicy::generate(Policies pol,
51  const std::string &mapPath) {
52  if (pol != Policies::ObsGroupODB)
53  throw Exception("A mapping file is only relevant for the ODB Data Layout.", ioda_Here());
54 #ifdef ENABLE_ODB_LAYOUT
55  return std::make_shared<DataLayoutPolicy_ObsGroup_ODB>(mapPath);
56 #else
57  throw Exception("Cannot generate this policy, as either eckit or oops are disabled.",
58  ioda_Here());
59 #endif
60 }
61 
65  // Do nothing in the default policy.
66 }
67 
68 std::string DataLayoutPolicy::name() const { return std::string{"None / no policy"}; }
69 
70 std::string DataLayoutPolicy::doMap(const std::string &str) const { return str; }
71 
72 bool DataLayoutPolicy::isComplementary(const std::string &str) const { return false; }
73 
74 bool DataLayoutPolicy::isMapped(const std::string &) const { return false; }
75 
76 size_t DataLayoutPolicy::getComplementaryPosition(const std::string &str) const {
77  throw Exception("Illogical operation for non-ODB data layout policies.", ioda_Here());
78 }
79 
80 std::string DataLayoutPolicy::getOutputNameFromComponent(const std::string &str) const {
81  throw Exception("Illogical operation for non-ODB data layout policies.", ioda_Here());
82 }
83 
84 std::type_index DataLayoutPolicy::getOutputVariableDataType(const std::string &str) const {
85  throw Exception("Illogical operation for non-ODB data layout policies.", ioda_Here());
86 }
87 
89  throw Exception("Illogical operation for non-ODB data layout policies.", ioda_Here());
90 }
91 
92 size_t DataLayoutPolicy::getInputsNeeded(const std::string &str) const {
93  throw Exception("Illogical operation for non-ODB data layout policies.", ioda_Here());
94 }
95 
96 std::pair<bool, std::string> DataLayoutPolicy::getUnit(const std::string &) const {
97  throw Exception("Illogical operation for non-ODB data layout policies.", ioda_Here());
98 }
99 
100 } // namespace detail
101 } // namespace ioda
IODA's error system.
Contains definitions for how data are arranged in ioda internally.
Contains definitions for how data are arranged in ioda internally.
Contains definitions for how ODB data are arranged in ioda internally.
The ioda exception class.
Definition: Exception.h:54
virtual size_t getComplementaryPosition(const std::string &) const
Definition: Layout.cpp:76
virtual std::type_index getOutputVariableDataType(const std::string &) const
Definition: Layout.cpp:84
virtual std::pair< bool, std::string > getUnit(const std::string &) const
Definition: Layout.cpp:96
static std::shared_ptr< const DataLayoutPolicy > generate(const std::string &polid="")
Factory generator.
Definition: Layout.cpp:28
virtual MergeMethod getMergeMethod(const std::string &) const
Definition: Layout.cpp:88
virtual bool isComplementary(const std::string &) const
Check if the named variable will be a part of a derived variable.
Definition: Layout.cpp:72
virtual bool isMapped(const std::string &) const
Check if the named variable is in the Variables section of the ODB mapping file.
Definition: Layout.cpp:74
virtual std::string getOutputNameFromComponent(const std::string &) const
Definition: Layout.cpp:80
virtual void initializeStructure(Group_Base &) const
Definition: Layout.cpp:64
virtual std::string name() const
A descriptive name for the policy.
Definition: Layout.cpp:68
virtual std::string doMap(const std::string &) const
Map a user-specified Variable path to the correct location.
Definition: Layout.cpp:70
virtual size_t getInputsNeeded(const std::string &) const
Definition: Layout.cpp:92
Hidden base class to prevent constructor confusion.
Definition: Group.h:42
Common preprocessor definitions used throughout IODA.
#define ioda_Here()