1#ifdef TATOOINE_NETCDF_AVAILABLE
2#ifndef TATOOINE_NETCDF_H
3#define TATOOINE_NETCDF_H
25 static auto value() {
return netCDF::ncInt; }
30 static auto value() {
return netCDF::ncFloat; }
35 static auto value() {
return netCDF::ncDouble; }
38template <
typename T, std::
size_t M, std::
size_t N>
43template <
typename T, std::
size_t N>
48template <
typename T, std::size_t... Dims>
64 mutable std::shared_ptr<netCDF::NcFile>
m_file;
65 mutable std::shared_ptr<std::mutex>
m_mutex;
70 std::shared_ptr<std::mutex>& mutex, netCDF::NcVar
const& var)
79 auto
write(std::vector<std::
size_t> const& is, T const& t) {
82 return m_var.putVar(is, t);
84 auto write(std::vector<std::size_t>
const& is, std::vector<std::size_t>
const& count,
89 return m_var.putVar(is, count, arr);
91 auto write(T
const*
const arr) {
93 return m_var.putVar(arr);
96 auto write(std::vector<T>
const& arr) {
98 return m_var.putVar(arr.data());
121 for (std::size_t i = 0; i < n; ++i) {
133 std::lock_guard lock{*
m_mutex};
170 auto const plain_chunk_index =
181 if constexpr (std::is_arithmetic_v<T>) {
182 bool all_zero =
true;
183 for (
auto const& v : arr.
chunk_at(plain_chunk_index)->internal_container()) {
196 template <
typename MemLoc, std::size_t... Resolution>
200 assert(std::vector{Resolution...} ==
size());
201 std::lock_guard lock{*
m_mutex};
205 auto read(std::vector<T>& arr)
const {
209 std::lock_guard lock{*
m_mutex};
210 m_var.getVar(arr.data());
213 auto read(T*
const ptr)
const {
214 std::lock_guard lock{*
m_mutex};
220 std::lock_guard lock{*
m_mutex};
221 m_var.getVar(arr.data());
225 auto read_single(std::vector<std::size_t>
const& start_indices)
const {
228 std::lock_guard lock{*
m_mutex};
236 std::lock_guard lock{*
m_mutex};
237 m_var.getVar({
static_cast<std::size_t
>(is)...}, {((void)is, std::size_t(1))...}, &t);
242 std::vector<std::size_t> counts)
const {
243 assert(start_indices.size() == counts.size());
249 std::lock_guard lock{*
m_mutex};
250 m_var.getVar(start_indices, counts, arr.data());
254 auto read_chunk(std::vector<std::size_t> start_indices, std::vector<std::size_t> counts,
256 assert(start_indices.size() == counts.size());
261 std::lock_guard lock{*
m_mutex};
262 m_var.getVar(start_indices, counts, ptr);
265 auto read_chunk(std::vector<std::size_t>
const& start_indices,
266 std::vector<std::size_t>
const& counts,
278 std::lock_guard lock{*
m_mutex};
279 m_var.getVar(start_indices, counts, arr.
data());
282 template <
typename MemLoc, std::size_t... Resolution>
285 integral auto const... start_indices)
const {
286 static_assert(
sizeof...(start_indices) ==
sizeof...(Resolution));
288 std::lock_guard lock{*
m_mutex};
289 m_var.getVar(std::vector{
static_cast<std::size_t
>(start_indices)...},
290 std::vector{Resolution...}, arr.
data());
293 template <
typename MemLoc, std::size_t... Resolution>
295 std::vector<std::size_t>
const& start_indices,
297 std::lock_guard lock{*
m_mutex};
298 m_var.getVar(start_indices, std::vector{Resolution...}, arr.
data());
301 auto read_chunk(std::vector<std::size_t>
const& start_indices,
302 std::vector<std::size_t>
const& counts,
303 std::vector<T>& arr)
const {
304 auto const n = std::accumulate(
begin(counts),
end(counts), std::size_t(1),
305 std::multiplies<std::size_t>{});
306 if (
size(arr) != n) {
309 std::lock_guard lock{*
m_mutex};
310 m_var.getVar(start_indices, counts, arr.data());
314 std::lock_guard lock{*
m_mutex};
315 return m_var.isNull();
319 std::lock_guard lock{*
m_mutex};
320 return static_cast<std::size_t
>(
m_var.getDimCount());
323 auto size(std::size_t i)
const {
324 auto lock = std::lock_guard{*
m_mutex};
325 return m_var.getDim(
static_cast<int>(i)).getSize();
329 std::lock_guard lock{*
m_mutex};
330 return m_var.getDim(
static_cast<int>(i)).getName();
334 std::vector<std::size_t> res;
337 res.push_back(
size(i));
343 std::lock_guard lock{*
m_mutex};
344 return m_var.getName();
351 mutable std::shared_ptr<netCDF::NcFile>
m_file;
355 template <
typename... Ts>
356 file(filesystem::path
const& path, Ts&&... ts)
357 :
m_file{new netCDF::NcFile{path.string(), std::
forward<Ts>(ts)...}},
358 m_mutex{std::make_shared<std::mutex>()} {}
360 template <
typename T>
362 netCDF::NcDim
const& dim) {
368 template <
typename T>
370 std::vector<netCDF::NcDim>
const& dims) {
376 template <
typename T>
377 auto variable(std::string
const& variable_name)
const {
382 return m_file->addDim(dimension_name);
394 return static_cast<std::size_t
>(
m_file->getDimCount());
401 template <
typename T>
403 std::vector<netcdf::variable<T>> vars;
404 for (
auto& [name, var] :
m_file->getVars()) {
T value
Definition: cache_alignment.h:22
Definition: dynamic_multidim_array.h:18
constexpr auto data(std::size_t const i) -> auto &
Definition: dynamic_multidim_array.h:311
auto size() const -> auto const &
Definition: dynamic_multidim_size.h:107
auto resize(integral auto const ... size) -> void
Definition: dynamic_multidim_array.h:273
auto num_dimensions() const
Definition: dynamic_multidim_size.h:105
auto add_dimension(std::string const &dimension_name, std::size_t const size)
Definition: netcdf.h:385
auto variables() const
Definition: netcdf.h:402
std::shared_ptr< std::mutex > m_mutex
Definition: netcdf.h:352
auto dimensions() const
Definition: netcdf.h:389
auto variable(std::string const &variable_name) const
Definition: netcdf.h:377
auto add_variable(std::string const &variable_name, std::vector< netCDF::NcDim > const &dims)
Definition: netcdf.h:369
auto add_variable(std::string const &variable_name, netCDF::NcDim const &dim)
Definition: netcdf.h:361
auto size() const
Definition: netcdf.h:397
auto add_dimension(std::string const &dimension_name)
Definition: netcdf.h:381
auto attributes() const
Definition: netcdf.h:391
file(filesystem::path const &path, Ts &&... ts)
Definition: netcdf.h:356
std::shared_ptr< netCDF::NcFile > m_file
Definition: netcdf.h:351
auto num_dimensions() const -> std::size_t
Definition: netcdf.h:393
auto groups() const
Definition: netcdf.h:399
auto read(std::vector< T > &arr) const
Definition: netcdf.h:205
auto num_components() const
Definition: netcdf.h:103
auto read_as_vector() const
Definition: netcdf.h:218
auto write(std::vector< std::size_t > const &is, std::vector< std::size_t > const &count, T const *const arr)
Definition: netcdf.h:84
variable(std::shared_ptr< netCDF::NcFile > &file, std::shared_ptr< std::mutex > &mutex, netCDF::NcVar const &var)
Definition: netcdf.h:69
auto read(dynamic_multidim_array< T, x_fastest > &arr) const
Definition: netcdf.h:117
auto read_chunk(std::vector< std::size_t > start_indices, std::vector< std::size_t > counts) const
Definition: netcdf.h:241
auto read(static_multidim_array< T, x_fastest, MemLoc, Resolution... > &arr) const
Definition: netcdf.h:197
std::shared_ptr< std::mutex > m_mutex
Definition: netcdf.h:65
auto write(std::vector< T > const &arr)
Definition: netcdf.h:96
auto read_chunk(std::vector< std::size_t > const &start_indices, static_multidim_array< T, x_fastest, MemLoc, Resolution... > &arr) const
Definition: netcdf.h:294
auto name() const
Definition: netcdf.h:342
auto read_chunk(std::vector< std::size_t > const &start_indices, std::vector< std::size_t > const &counts, dynamic_multidim_array< T, x_fastest > &arr) const
Definition: netcdf.h:265
auto size(std::size_t i) const
Definition: netcdf.h:323
variable(variable const &)=default
std::shared_ptr< netCDF::NcFile > m_file
Definition: netcdf.h:64
auto read_chunked(std::size_t const chunk_size=10) const
Definition: netcdf.h:137
auto read() const
Definition: netcdf.h:111
auto read_chunk(std::vector< std::size_t > start_indices, std::vector< std::size_t > counts, T *ptr) const
Definition: netcdf.h:254
auto read_single(integral auto const ... is) const
Definition: netcdf.h:233
variable(variable &&) noexcept=default
auto num_dimensions() const
Definition: netcdf.h:318
auto write(std::vector< std::size_t > const &is, T const &t)
Definition: netcdf.h:79
auto read_chunked(std::vector< std::size_t > const &chunk_size) const
Definition: netcdf.h:145
auto read_chunk(std::vector< std::size_t > const &start_indices, std::vector< std::size_t > const &counts, std::vector< T > &arr) const
Definition: netcdf.h:301
auto write(range auto const r)
Definition: netcdf.h:101
auto read(chunked_multidim_array< T, x_fastest > &arr) const
Definition: netcdf.h:152
auto is_null() const
Definition: netcdf.h:313
auto write(T const *const arr)
Definition: netcdf.h:91
auto dimension_name(std::size_t i) const
Definition: netcdf.h:328
auto read(T *const ptr) const
Definition: netcdf.h:213
auto read_single(std::vector< std::size_t > const &start_indices) const
Definition: netcdf.h:225
auto read_chunk(static_multidim_array< T, x_fastest, MemLoc, Resolution... > &arr, integral auto const ... start_indices) const
Definition: netcdf.h:283
netCDF::NcVar m_var
Definition: netcdf.h:66
T value_type
Definition: netcdf.h:61
auto size() const
Definition: netcdf.h:333
Definition: static_multidim_array.h:19
constexpr auto data() -> ValueType *
Definition: static_multidim_array.h:260
Definition: concepts.h:21
Definition: concepts.h:84
auto begin(Range &&range)
Definition: iterator_facade.h:318
auto end(Range &&range)
Definition: iterator_facade.h:322
static constexpr forward_tag forward
Definition: tags.h:9
Definition: chunked_multidim_array.h:27
auto global_indices_from_chunk_indices(std::vector< Int > is) const
Definition: chunked_multidim_array.h:220
auto internal_chunk_size() const
Definition: chunked_multidim_array.h:335
auto plain_chunk_index_from_chunk_indices(integral auto const ... chunk_indices) const
Definition: chunked_multidim_array.h:228
auto chunk_at(integral auto const chunk_index0, integral auto const ... chunk_indices) const -> auto const &
Definition: chunked_multidim_array.h:241
auto chunk_size() const
Definition: chunked_multidim_array.h:332
auto create_chunk_at(std::size_t const plain_chunk_index, std::vector< std::size_t > const &multi_indices) const -> auto const &
Definition: chunked_multidim_array.h:269
auto chunk_at_is_null(integral auto const chunk_index0, integral auto const ... chunk_indices) const
Definition: chunked_multidim_array.h:252
auto size() const -> auto const &
Definition: dynamic_multidim_size.h:107
auto num_dimensions() const
Definition: dynamic_multidim_size.h:105
auto destroy_chunk_at(integral auto const chunk_index0, integral auto const ... chunk_indices) const
Definition: chunked_multidim_array.h:303
auto resize(SizeRange &&size) -> void requires(is_integral< typename std::decay_t< SizeRange >::value_type >)
Definition: chunked_multidim_array.h:87
Definition: multidim.h:11
static auto value()
Definition: netcdf.h:35
static auto value()
Definition: netcdf.h:30
static auto value()
Definition: netcdf.h:25
static auto value()
Definition: netcdf.h:40
static auto value()
Definition: netcdf.h:50
static auto value()
Definition: netcdf.h:45