1 #ifndef teca_netcdf_util_h
2 #define teca_netcdf_util_h
6 #include "teca_config.h"
8 #include "teca_metadata.h"
9 #include "teca_cpu_thread_pool.h"
15 #if defined(TECA_HAS_NETCDF_MPI)
16 #include <netcdf_par.h>
20 #define NC_DISPATCH_FP(tc_, ...) \
23 NC_DISPATCH_CASE(NC_FLOAT, float, __VA_ARGS__) \
24 NC_DISPATCH_CASE(NC_DOUBLE, double, __VA_ARGS__) \
26 TECA_ERROR("netcdf type __VA_ARGS__ " << tc_ \
27 << " is not a floating point type") \
31 #define NC_DISPATCH(tc_, ...) \
34 NC_DISPATCH_CASE(NC_BYTE, char, __VA_ARGS__) \
35 NC_DISPATCH_CASE(NC_UBYTE, unsigned char, __VA_ARGS__) \
36 NC_DISPATCH_CASE(NC_CHAR, char, __VA_ARGS__) \
37 NC_DISPATCH_CASE(NC_SHORT, short int, __VA_ARGS__) \
38 NC_DISPATCH_CASE(NC_USHORT, unsigned short int, __VA_ARGS__) \
39 NC_DISPATCH_CASE(NC_INT, int, __VA_ARGS__) \
40 NC_DISPATCH_CASE(NC_UINT, unsigned int, __VA_ARGS__) \
41 NC_DISPATCH_CASE(NC_INT64, long long, __VA_ARGS__) \
42 NC_DISPATCH_CASE(NC_UINT64, unsigned long long, __VA_ARGS__) \
43 NC_DISPATCH_CASE(NC_FLOAT, float, __VA_ARGS__) \
44 NC_DISPATCH_CASE(NC_DOUBLE, double, __VA_ARGS__) \
46 TECA_ERROR("netcdf type code " << tc_ \
47 << " is not supported") \
51 #define NC_DISPATCH_CASE(cc_, tt_, ...) \
55 using NC_TT = teca_variant_array_impl<tt_>; \
56 using NC_CTT = const teca_variant_array_impl<tt_>; \
57 using NC_PT = std::shared_ptr<teca_variant_array_impl<tt_>>; \
58 using NC_CPT = std::shared_ptr<const teca_variant_array_impl<tt_>>; \
59 using NC_SP = std::shared_ptr<tt_>; \
60 using NC_CSP = std::shared_ptr<const tt_>; \
75 #define DECLARE_NETCDF_TT(cpp_t_, nc_c_) \
77 template <> class netcdf_tt<cpp_t_> \
80 enum { type_code = nc_c_ }; \
81 static const char *name() { return #nc_c_; } \
83 DECLARE_NETCDF_TT(
char, NC_BYTE)
84 DECLARE_NETCDF_TT(
unsigned char, NC_UBYTE)
86 DECLARE_NETCDF_TT(
short int, NC_SHORT)
87 DECLARE_NETCDF_TT(
unsigned short int, NC_USHORT)
88 DECLARE_NETCDF_TT(
int, NC_INT)
89 DECLARE_NETCDF_TT(
long, NC_LONG)
90 DECLARE_NETCDF_TT(
unsigned long, NC_LONG)
91 DECLARE_NETCDF_TT(
unsigned int, NC_UINT)
92 DECLARE_NETCDF_TT(
long long, NC_INT64)
93 DECLARE_NETCDF_TT(
unsigned long long, NC_UINT64)
94 DECLARE_NETCDF_TT(
float, NC_FLOAT)
95 DECLARE_NETCDF_TT(
double, NC_DOUBLE)
97 #define DECLARE_CPP_TT(cpp_t_, nc_c_) \
99 template <> class cpp_tt<nc_c_> \
102 using type = cpp_t_; \
103 static const char *name() { return #cpp_t_; } \
105 DECLARE_CPP_TT(
char, NC_BYTE)
106 DECLARE_CPP_TT(
unsigned char, NC_UBYTE)
108 DECLARE_CPP_TT(
short int, NC_SHORT)
109 DECLARE_CPP_TT(
unsigned short int, NC_USHORT)
110 DECLARE_CPP_TT(
int, NC_INT)
113 DECLARE_CPP_TT(
unsigned int, NC_UINT)
114 DECLARE_CPP_TT(
long long, NC_INT64)
115 DECLARE_CPP_TT(
unsigned long long, NC_UINT64)
116 DECLARE_CPP_TT(
float, NC_FLOAT)
117 DECLARE_CPP_TT(
double, NC_DOUBLE)
156 m_handle = other.m_handle;
164 m_handle = other.m_handle;
173 int open(
const std::string &file_path,
int mode);
181 int open(MPI_Comm comm,
const std::string &file_path,
int mode);
188 int create(
const std::string &file_path,
int mode);
196 int create(MPI_Comm comm,
const std::string &file_path,
int mode);
209 operator bool()
const
210 {
return m_handle > 0; }
270 int var_id,
const std::string &x_variable,
const std::string &y_variable,
271 const std::string &z_variable,
const std::string &t_variable,
290 int *parent_id,
int *var_id);
299 const std::string &name,
300 const std::string &x_variable,
const std::string &y_variable,
301 const std::string &z_variable,
const std::string &t_variable,
332 using data_elem_t = std::pair<p_teca_variant_array, teca_metadata>;
333 using data_t = std::pair<unsigned long, data_elem_t>;
334 using task_t = std::packaged_task<data_t()>;
336 using p_queue_t = std::shared_ptr<queue_t>;
339 unsigned long id,
const std::string &variable) : m_path(
path),
340 m_file(file), m_variable(variable), m_id(id)
344 data_t package(
unsigned long id,
348 return std::make_pair(
id, std::make_pair(var, md));
351 data_t operator()(
int device_id = -1);
356 std::string m_variable;
378 using data_t = std::pair<unsigned long, p_teca_variant_array>;
379 using task_t = std::packaged_task<
data_t(
int)>;
381 using p_queue_t = std::shared_ptr<queue_t>;
385 unsigned long id,
const std::string &variable) : m_path(
path),
386 m_file(file), m_variable(variable), m_id(id)
390 data_t package(
unsigned long id,
393 return std::make_pair(
id, var);
396 data_t operator()(
int device_id = -1);
401 std::string m_variable;
A class to manage a fixed size pool of threads that dispatch work.
Definition: teca_cpu_thread_pool.h:34
A traits class mapping to C++ from netcdf.
Definition: teca_netcdf_util.h:73
A RAII class for managing NETCDF files. The file is kept open while the object exists.
Definition: teca_netcdf_util.h:133
netcdf_handle(const netcdf_handle &)=delete
netcdf_handle(netcdf_handle &&other)
Definition: teca_netcdf_util.h:154
int create(MPI_Comm comm, const std::string &file_path, int mode)
netcdf_handle(int h)
Definition: teca_netcdf_util.h:139
void operator=(netcdf_handle &&other)
Definition: teca_netcdf_util.h:161
int open(MPI_Comm comm, const std::string &file_path, int mode)
int open(const std::string &file_path, int mode)
int create(const std::string &file_path, int mode)
int & get()
Definition: teca_netcdf_util.h:205
~netcdf_handle()
Definition: teca_netcdf_util.h:143
A traits class mapping to netcdf from C++.
Definition: teca_netcdf_util.h:70
Functional that reads and returns a variable from the named file.
Definition: teca_netcdf_util.h:329
std::pair< p_teca_variant_array, teca_metadata > data_elem_t
Definition: teca_netcdf_util.h:332
Function that reads and returns a variable from the named file.
Definition: teca_netcdf_util.h:375
std::pair< unsigned long, p_teca_variant_array > data_t
Definition: teca_netcdf_util.h:378
TECA_EXPORT int clamp_dimensions_of_one(unsigned long nx_max, unsigned long ny_max, unsigned long nz_max, unsigned long *extent, bool verbose)
p_teca_error_handler error_handler TECA_EXPORT
The global error handler instance.
TECA_EXPORT std::string path(const std::string &filename)
Codes dealing with NetCDF I/O calls.
Definition: teca_netcdf_util.h:67
void crtrim(char *s, long n)
TECA_EXPORT int write_variable_attributes(int parent_id, int var_id, teca_metadata &array_atts)
TECA_EXPORT int read_attribute(int parent_id, int var_id, const std::string &att_name, teca_metadata &atts)
std::mutex & get_netcdf_mutex()
TECA_EXPORT int get_varid(netcdf_handle &fh, const std::string &var_name, int *parent_id, int *var_id)
TECA_EXPORT int read_variable_attributes(netcdf_handle &fh, const std::string &parent_group, int var_id, const std::string &x_variable, const std::string &y_variable, const std::string &z_variable, const std::string &t_variable, const std::string &ensemble_dimension_name, int clamp_dimensions_of_one, std::string &name, teca_metadata &atts)
std::shared_ptr< teca_variant_array > p_teca_variant_array
Definition: teca_variant_array.h:27