MDAL
mdal_cf.hpp
1 /*
2  MDAL - Mesh Data Abstraction Library (MIT License)
3  Copyright (C) 2018 Peter Petrik (zilolv at gmail dot com)
4 */
5 
6 #ifndef MDAL_CF_HPP
7 #define MDAL_CF_HPP
8 
9 #include <string>
10 #include <vector>
11 #include <map>
12 #include <stddef.h>
13 #include <set>
14 
15 #include "mdal_data_model.hpp"
16 #include "mdal.h"
17 #include "mdal_utils.hpp"
18 #include "mdal_netcdf.hpp"
19 #include "mdal_driver.hpp"
20 
21 namespace MDAL
22 {
24  {
25  public:
26  enum Type
27  {
30  Edge,
32  Face,
34  StackedFace3D,
35  Time,
37  };
38 
40  Type type( int ncid ) const;
42  size_t size( Type type ) const;
44  void setDimension( Type type, size_t count, int ncid = -1 );
46  bool isDatasetType( Type type ) const;
47 
48  private:
49  std::map<Type, size_t> mCount;
50  std::map<int, Type> mNcId;
51  };
52 
54  {
56  {
60  };
61  std::string name;
62  CFDimensions::Type outputType;
63  bool isVector;
64  bool isPolar;
65  bool isInvertedDirection;
66  TimeLocation timeLocation;
67  size_t nTimesteps;
68  size_t nValues;
69  int ncid_x;
70  int ncid_y;
71  Metadata metadata;
72  Classification classification_x;
73  Classification classification_y;
74  };
75  typedef std::map<std::string, CFDatasetGroupInfo> cfdataset_info_map; // name -> DatasetInfo
76 
77  class CFDataset2D: public Dataset2D
78  {
79  public:
80  CFDataset2D( DatasetGroup *parent,
81  double fill_val_x,
82  double fill_val_y,
83  int ncid_x,
84  int ncid_y,
85  Classification classification_x,
86  Classification classification_y,
88  size_t timesteps,
89  size_t values,
90  size_t ts,
91  std::shared_ptr<NetCDFFile> ncFile
92  );
93  virtual ~CFDataset2D() override;
94 
95  virtual size_t scalarData( size_t indexStart, size_t count, double *buffer ) override;
96  virtual size_t vectorData( size_t indexStart, size_t count, double *buffer ) override;
97 
98  protected:
99  double mFillValX;
100  double mFillValY;
101  int mNcidX;
102  int mNcidY;
103  Classification mClassificationX;
104  Classification mClassificationY;
105  CFDatasetGroupInfo::TimeLocation mTimeLocation;
106  size_t mTimesteps;
107  size_t mValues;
108  size_t mTs;
109  std::shared_ptr<NetCDFFile> mNcFile;
110  };
111 
115  class DriverCF: public Driver
116  {
117  public:
118  DriverCF( const std::string &name,
119  const std::string &longName,
120  const std::string &filters,
121  const int capabilities );
122  virtual ~DriverCF() override;
123  bool canReadMesh( const std::string &uri ) override;
124  std::unique_ptr< Mesh > load( const std::string &fileName, const std::string &meshName = "" ) override;
125 
126  protected:
127  virtual CFDimensions populateDimensions( ) = 0;
128  virtual void populateElements( Vertices &vertices, Edges &edges, Faces &faces ) = 0;
129  virtual void addBedElevation( MDAL::MemoryMesh *mesh ) = 0;
130  virtual std::string getCoordinateSystemVariableName() = 0;
131  virtual std::set<std::string> ignoreNetCDFVariables() = 0;
132  virtual void parseNetCDFVariableMetadata( int varid,
133  std::string &variableName,
134  std::string &name,
135  bool *is_vector,
136  bool *isPolar,
137  bool *invertedDirection,
138  bool *is_x ) = 0;
139  virtual std::vector<std::pair<double, double> > parseClassification( int varid ) const = 0;
140  virtual std::string getTimeVariableName() const = 0;
141  virtual std::shared_ptr<MDAL::Dataset> create2DDataset(
142  std::shared_ptr<MDAL::DatasetGroup> group,
143  size_t ts,
144  const MDAL::CFDatasetGroupInfo &dsi,
145  double fill_val_x, double fill_val_y );
146 
147  virtual std::shared_ptr<MDAL::Dataset> create3DDataset(
148  std::shared_ptr<MDAL::DatasetGroup> group,
149  size_t ts,
150  const MDAL::CFDatasetGroupInfo &dsi,
151  double fill_val_x, double fill_val_y );
152 
154  virtual DateTime defaultReferenceTime() const;
155 
156  void setProjection( MDAL::Mesh *m );
157  cfdataset_info_map parseDatasetGroupInfo();
158 
160  DateTime parseTime( std::vector<RelativeTimestamp> &times );
161  void addDatasetGroups( Mesh *mesh,
162  const std::vector<RelativeTimestamp> &times,
163  const cfdataset_info_map &dsinfo_map, const DateTime &referenceTime );
164 
165  std::string mFileName;
166  std::string mRequestedMeshName;
167  std::shared_ptr<NetCDFFile> mNcFile;
168  CFDimensions mDimensions;
169  };
170 
171 } // namespace MDAL
172 
173 #endif // MDAL_CF_HPP
Definition: mdal_cf.hpp:78
Classification mClassificationX
Classification, void if not classified.
Definition: mdal_cf.hpp:103
int mNcidY
NetCDF variable id.
Definition: mdal_cf.hpp:102
virtual size_t vectorData(size_t indexStart, size_t count, double *buffer) override
For DataOnVertices or DataOnFaces.
Definition: mdal_cf.cpp:722
Classification mClassificationY
Classification, void if not classified.
Definition: mdal_cf.hpp:104
int mNcidX
NetCDF variable id.
Definition: mdal_cf.hpp:101
virtual size_t scalarData(size_t indexStart, size_t count, double *buffer) override
For DataOnVertices or DataOnFaces.
Definition: mdal_cf.cpp:675
Definition: mdal_cf.hpp:24
Type
Definition: mdal_cf.hpp:27
@ UnknownType
Unknown.
Definition: mdal_cf.hpp:28
@ Face2DEdge
Edge of 2D Face.
Definition: mdal_cf.hpp:31
@ Face
2D (Polygon) Face
Definition: mdal_cf.hpp:32
@ Volume3D
3D (stacked) volumes
Definition: mdal_cf.hpp:33
@ MaxVerticesInFace
Maximum number of vertices in a face.
Definition: mdal_cf.hpp:36
@ Edge
Line joining 2 vertices ( edge )
Definition: mdal_cf.hpp:30
@ Vertex
Mesh vertex ( node )
Definition: mdal_cf.hpp:29
@ Time
3D (stacked) Faces
Definition: mdal_cf.hpp:35
bool isDatasetType(Type type) const
Returns whether the type is one that case be used for datasets definition.
Definition: mdal_cf.cpp:634
Type type(int ncid) const
Returns type of dimensions based on NetCDF array id.
Definition: mdal_cf.cpp:609
size_t size(Type type) const
Returns number of items for the type.
Definition: mdal_cf.cpp:618
void setDimension(Type type, size_t count, int ncid=-1)
Sets a dimension.
Definition: mdal_cf.cpp:627
Definition: mdal_data_model.hpp:97
Definition: mdal_data_model.hpp:137
Definition: mdal_datetime.hpp:48
NetCDF Climate and Forecast (CF) Metadata Conventions http://cfconventions.org and http://ugrid-conve...
Definition: mdal_cf.hpp:116
DateTime parseTime(std::vector< RelativeTimestamp > &times)
Populates the times array and returns the reference time.
Definition: mdal_cf.cpp:394
virtual DateTime defaultReferenceTime() const
Returns the default reference time.
Definition: mdal_cf.cpp:483
Definition: mdal_driver.hpp:28
Definition: mdal_memory_data_model.hpp:291
Definition: mdal_data_model.hpp:238
Definition: mdal_cf.hpp:54
int ncid_x
NetCDF variable id.
Definition: mdal_cf.hpp:69
TimeLocation
Definition: mdal_cf.hpp:56
@ NoTimeDimension
Dataset does not have time dimension at all, e.g. float TEMP(Cell)
Definition: mdal_cf.hpp:57
@ TimeDimensionFirst
Time dimension is first, e.g. float TEMP(Time, Cells)
Definition: mdal_cf.hpp:58
@ TimeDimensionLast
Time dimension is last, e.g. float TEMP(Cells, Time)
Definition: mdal_cf.hpp:59
int ncid_y
NetCDF variable id.
Definition: mdal_cf.hpp:70
std::string name
Dataset group name.
Definition: mdal_cf.hpp:61