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

Kynema API: /home/runner/work/kynema-fmb/kynema-fmb/kynema-fmb/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_fmb::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
63 [[nodiscard]] bool IsOpen() const { return netcdf_id_ != -1; }
64
65 //--------------------------------------------------------------------------
66 // Setter/Write methods
67 //--------------------------------------------------------------------------
68
75 [[nodiscard]] int AddDimension(const std::string& name, size_t length) const;
76
84 template <typename T>
85 [[nodiscard]] int AddVariable(const std::string& name, std::span<const int> dim_ids) const;
86
93 void AddAttribute(const std::string& var_name, const std::string& attr_name, float value) const;
94 void AddAttribute(const std::string& var_name, const std::string& attr_name, double value) const;
95 void AddAttribute(const std::string& var_name, const std::string& attr_name, int value) const;
96 void AddAttribute(
97 const std::string& var_name, const std::string& attr_name, const std::string& value
98 ) const;
99
111 void WriteVariable(const std::string& name, std::span<const float> data) const;
112 void WriteVariable(const std::string& name, std::span<const double> data) const;
113 void WriteVariable(const std::string& name, std::span<const int> data) const;
114 void WriteVariable(const std::string& name, std::span<const std::string> data) const;
115
133 void WriteVariableAt(
134 const std::string& name, std::span<const size_t> start, std::span<const size_t> count,
135 std::span<const float> data
136 ) const;
137 void WriteVariableAt(
138 const std::string& name, std::span<const size_t> start, std::span<const size_t> count,
139 std::span<const double> data
140 ) const;
141 void WriteVariableAt(
142 const std::string& name, std::span<const size_t> start, std::span<const size_t> count,
143 std::span<const int> data
144 ) const;
145 void WriteVariableAt(
146 const std::string& name, std::span<const size_t> start, std::span<const size_t> count,
147 std::span<const std::string> data
148 ) const;
149
163 void SetChunking(const std::string& var_name, std::span<const size_t> chunk_sizes) const;
164
165 //--------------------------------------------------------------------------
166 // Getter/Read methods
167 //--------------------------------------------------------------------------
168
170 [[nodiscard]] int GetNetCDFId() const;
171
173 [[nodiscard]] int GetDimensionId(const std::string& name) const;
174
176 [[nodiscard]] int GetVariableId(const std::string& name) const;
177
184 [[nodiscard]] size_t GetNumberOfDimensions(const std::string& var_name) const;
185
192 [[nodiscard]] size_t GetDimensionLength(int dim_id) const;
193
195 [[nodiscard]] size_t GetDimensionLength(const std::string& name) const;
196
203 [[nodiscard]] std::vector<size_t> GetShape(const std::string& var_name) const;
204
217 void ReadVariable(const std::string& name, float* data) const;
218 void ReadVariable(const std::string& name, double* data) const;
219 void ReadVariable(const std::string& name, int* data) const;
220
230 void ReadVariableAt(
231 const std::string& name, std::span<const size_t> start, std::span<const size_t> count,
232 float* data
233 ) const;
234 void ReadVariableAt(
235 const std::string& name, std::span<const size_t> start, std::span<const size_t> count,
236 double* data
237 ) const;
238 void ReadVariableAt(
239 const std::string& name, std::span<const size_t> start, std::span<const size_t> count,
240 int* data
241 ) const;
242
254 const std::string& name, std::span<const size_t> start, std::span<const size_t> count,
255 std::span<const ptrdiff_t> stride, float* data
256 ) const;
258 const std::string& name, std::span<const size_t> start, std::span<const size_t> count,
259 std::span<const ptrdiff_t> stride, double* data
260 ) const;
262 const std::string& name, std::span<const size_t> start, std::span<const size_t> count,
263 std::span<const ptrdiff_t> stride, int* data
264 ) const;
265
266private:
267 int netcdf_id_{-1};
268 std::string file_path_;
269};
270
271} // namespace kynema_fmb::util
Definition netcdf_file.hpp:18
int AddDimension(const std::string &name, size_t length) const
Adds a dimension to the NetCDF file.
Definition netcdf_file.cpp:59
NetCdfFile(const NetCdfFile &)=delete
Explicitly prevent copying and moving – rule of 5.
void ReadVariable(const std::string &name, float *data) const
Reads data from a variable in the NetCDF file.
Definition netcdf_file.cpp:309
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:121
~NetCdfFile()
Destructor to close the NetCDF file.
Definition netcdf_file.cpp:34
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:292
size_t GetDimensionLength(int dim_id) const
Gets the length of a dimension in the NetCDF file.
Definition netcdf_file.cpp:282
int AddVariable(const std::string &name, std::span< const int > dim_ids) const
Adds a variable to the NetCDF file.
int GetVariableId(const std::string &name) const
Returns the variable ID for a given variable name.
Definition netcdf_file.cpp:264
int GetNetCDFId() const
Returns the NetCDF file ID.
Definition netcdf_file.cpp:252
NetCdfFile & operator=(NetCdfFile &&)=delete
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:359
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:272
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:196
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:242
NetCdfFile(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:330
int GetDimensionId(const std::string &name) const
Returns the dimension ID for a given dimension name.
Definition netcdf_file.cpp:256
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:164
NetCdfFile & operator=(const NetCdfFile &)=delete
void Close()
Manually flushes and closes the NetCDF file.
Definition netcdf_file.cpp:42
void Open()
Manually (re)opens the NetCDF file in write mode.
Definition netcdf_file.cpp:50
bool IsOpen() const
Checks if the NetCDF file is open.
Definition netcdf_file.hpp:63
Definition aerodyn_inflow.hpp:14