/home/runner/work/kynema/kynema/kynema/src/utilities/netcdf/netcdf_file.hpp Source File

Kynema API: /home/runner/work/kynema/kynema/kynema/src/utilities/netcdf/netcdf_file.hpp Source File
Kynema API
A flexible multibody structural dynamics code for wind turbines
Loading...
Searching...
No Matches
netcdf_file.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <span>
4#include <string>
5#include <vector>
6
7#include <netcdf.h>
8
9namespace kynema::util {
10
11/*
12 * @brief Class for managing NetCDF files for writing outputs
13 *
14 * This class provides a wrapper around the NetCDF library's functions for creating,
15 * writing, and reading NetCDF files. It is primarily used to write Kynema output data
16 * to a NetCDF file.
17 */
19public:
27 explicit NetCdfFile(const std::string& file_path, bool create = true);
28
36
38 NetCdfFile(const NetCdfFile&) = delete;
39 NetCdfFile& operator=(const NetCdfFile&) = delete;
42
44 void Sync() const;
45
51 void Close();
52
58 void Open();
59
60 //--------------------------------------------------------------------------
61 // Setter/Write methods
62 //--------------------------------------------------------------------------
63
70 [[nodiscard]] int AddDimension(const std::string& name, size_t length) const;
71
79 template <typename T>
80 [[nodiscard]] int AddVariable(const std::string& name, std::span<const int> dim_ids) const;
81
88 void AddAttribute(const std::string& var_name, const std::string& attr_name, float value) const;
89 void AddAttribute(const std::string& var_name, const std::string& attr_name, double value) const;
90 void AddAttribute(const std::string& var_name, const std::string& attr_name, int value) const;
91 void AddAttribute(
92 const std::string& var_name, const std::string& attr_name, const std::string& value
93 ) const;
94
106 void WriteVariable(const std::string& name, std::span<const float> data) const;
107 void WriteVariable(const std::string& name, std::span<const double> data) const;
108 void WriteVariable(const std::string& name, std::span<const int> data) const;
109 void WriteVariable(const std::string& name, std::span<const std::string> data) const;
110
128 void WriteVariableAt(
129 const std::string& name, std::span<const size_t> start, std::span<const size_t> count,
130 std::span<const float> data
131 ) const;
132 void WriteVariableAt(
133 const std::string& name, std::span<const size_t> start, std::span<const size_t> count,
134 std::span<const double> data
135 ) const;
136 void WriteVariableAt(
137 const std::string& name, std::span<const size_t> start, std::span<const size_t> count,
138 std::span<const int> data
139 ) const;
140 void WriteVariableAt(
141 const std::string& name, std::span<const size_t> start, std::span<const size_t> count,
142 std::span<const std::string> data
143 ) const;
144
158 void SetChunking(const std::string& var_name, std::span<const size_t> chunk_sizes) const;
159
160 //--------------------------------------------------------------------------
161 // Getter/Read methods
162 //--------------------------------------------------------------------------
163
165 [[nodiscard]] int GetNetCDFId() const;
166
168 [[nodiscard]] int GetDimensionId(const std::string& name) const;
169
171 [[nodiscard]] int GetVariableId(const std::string& name) const;
172
179 [[nodiscard]] size_t GetNumberOfDimensions(const std::string& var_name) const;
180
187 [[nodiscard]] size_t GetDimensionLength(int dim_id) const;
188
190 [[nodiscard]] size_t GetDimensionLength(const std::string& name) const;
191
198 [[nodiscard]] std::vector<size_t> GetShape(const std::string& var_name) const;
199
212 void ReadVariable(const std::string& name, float* data) const;
213 void ReadVariable(const std::string& name, double* data) const;
214 void ReadVariable(const std::string& name, int* data) const;
215
225 void ReadVariableAt(
226 const std::string& name, std::span<const size_t> start, std::span<const size_t> count,
227 float* data
228 ) const;
229 void ReadVariableAt(
230 const std::string& name, std::span<const size_t> start, std::span<const size_t> count,
231 double* data
232 ) const;
233 void ReadVariableAt(
234 const std::string& name, std::span<const size_t> start, std::span<const size_t> count,
235 int* data
236 ) const;
237
249 const std::string& name, std::span<const size_t> start, std::span<const size_t> count,
250 std::span<const ptrdiff_t> stride, float* data
251 ) const;
253 const std::string& name, std::span<const size_t> start, std::span<const size_t> count,
254 std::span<const ptrdiff_t> stride, double* data
255 ) const;
257 const std::string& name, std::span<const size_t> start, std::span<const size_t> count,
258 std::span<const ptrdiff_t> stride, int* data
259 ) const;
260
261private:
262 int netcdf_id_{-1};
263 std::string file_path_;
264};
265
266} // namespace kynema::util
Definition netcdf_file.hpp:18
NetCdfFile(NetCdfFile &&)=delete
void Close()
Manually flushes and closes the NetCDF file.
Definition netcdf_file.cpp:42
NetCdfFile & operator=(NetCdfFile &&)=delete
int AddVariable(const std::string &name, std::span< const int > dim_ids) const
Adds a variable to the NetCDF file.
NetCdfFile & operator=(const NetCdfFile &)=delete
void ReadVariableAt(const std::string &name, std::span< const size_t > start, std::span< const size_t > count, float *data) const
Reads data from a variable at specific indices in the NetCDF file.
Definition netcdf_file.cpp:326
int GetVariableId(const std::string &name) const
Returns the variable ID for a given variable name.
Definition netcdf_file.cpp:260
std::vector< size_t > GetShape(const std::string &var_name) const
Gets the shape (dimension lengths) of a variable in the NetCDF file.
Definition netcdf_file.cpp:288
int AddDimension(const std::string &name, size_t length) const
Adds a dimension to the NetCDF file.
Definition netcdf_file.cpp:59
void Open()
Manually (re)opens the NetCDF file in write mode.
Definition netcdf_file.cpp:50
void ReadVariableWithStride(const std::string &name, std::span< const size_t > start, std::span< const size_t > count, std::span< const ptrdiff_t > stride, float *data) const
Reads data from a variable with specified stride in the NetCDF file.
Definition netcdf_file.cpp:355
size_t GetDimensionLength(int dim_id) const
Gets the length of a dimension in the NetCDF file.
Definition netcdf_file.cpp:278
void SetChunking(const std::string &var_name, std::span< const size_t > chunk_sizes) const
Configures chunking for a NetCDF variable to optimize I/O and compression performance.
Definition netcdf_file.cpp:239
size_t GetNumberOfDimensions(const std::string &var_name) const
Gets the number of dimensions of a variable in the NetCDF file.
Definition netcdf_file.cpp:268
void ReadVariable(const std::string &name, float *data) const
Reads data from a variable in the NetCDF file.
Definition netcdf_file.cpp:305
void WriteVariable(const std::string &name, std::span< const float > data) const
Writes data to a variable in the NetCDF file.
Definition netcdf_file.cpp:161
int GetDimensionId(const std::string &name) const
Returns the dimension ID for a given dimension name.
Definition netcdf_file.cpp:252
~NetCdfFile()
Destructor to close the NetCDF file.
Definition netcdf_file.cpp:34
void AddAttribute(const std::string &var_name, const std::string &attr_name, float value) const
Adds an attribute to a variable in the NetCDF file.
Definition netcdf_file.cpp:120
int GetNetCDFId() const
Returns the NetCDF file ID.
Definition netcdf_file.cpp:248
void Sync() const
Synchronizes (flushes) the NetCDF file to disk.
Definition netcdf_file.cpp:38
void WriteVariableAt(const std::string &name, std::span< const size_t > start, std::span< const size_t > count, std::span< const float > data) const
Writes data to a variable at specific indices in the NetCDF file.
Definition netcdf_file.cpp:193
NetCdfFile(const NetCdfFile &)=delete
Explicitly prevent copying and moving – rule of 5.
Definition aerodyn_inflow.hpp:14