|
TECA
The Toolkit for Extreme Climate Analysis
|
Go to the documentation of this file. 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_thread_pool.h"
15 #if defined(TECA_HAS_NETCDF_MPI)
16 #include <netcdf_par.h>
20 #define NC_DISPATCH_FP(tc_, code_) \
23 NC_DISPATCH_CASE(NC_FLOAT, float, code_) \
24 NC_DISPATCH_CASE(NC_DOUBLE, double, code_) \
26 TECA_ERROR("netcdf type code_ " << tc_ \
27 << " is not a floating point type") \
31 #define NC_DISPATCH(tc_, code_) \
34 NC_DISPATCH_CASE(NC_BYTE, char, code_) \
35 NC_DISPATCH_CASE(NC_UBYTE, unsigned char, code_) \
36 NC_DISPATCH_CASE(NC_CHAR, char, code_) \
37 NC_DISPATCH_CASE(NC_SHORT, short int, code_) \
38 NC_DISPATCH_CASE(NC_USHORT, unsigned short int, code_) \
39 NC_DISPATCH_CASE(NC_INT, int, code_) \
40 NC_DISPATCH_CASE(NC_UINT, unsigned int, code_) \
41 NC_DISPATCH_CASE(NC_INT64, long long, code_) \
42 NC_DISPATCH_CASE(NC_UINT64, unsigned long long, code_) \
43 NC_DISPATCH_CASE(NC_FLOAT, float, code_) \
44 NC_DISPATCH_CASE(NC_DOUBLE, double, code_) \
46 TECA_ERROR("netcdf type code " << tc_ \
47 << " is not supported") \
51 #define NC_DISPATCH_CASE(cc_, tt_, code_) \
67 template<
int nc_enum>
class cpp_tt {};
69 #define DECLARE_NETCDF_TT(cpp_t_, nc_c_) \
71 template <> class netcdf_tt<cpp_t_> \
74 enum { type_code = nc_c_ }; \
75 static const char *name() { return #nc_c_; } \
77 DECLARE_NETCDF_TT(
char, NC_BYTE)
78 DECLARE_NETCDF_TT(
unsigned char, NC_UBYTE)
80 DECLARE_NETCDF_TT(
short int, NC_SHORT)
81 DECLARE_NETCDF_TT(
unsigned short int, NC_USHORT)
82 DECLARE_NETCDF_TT(
int, NC_INT)
83 DECLARE_NETCDF_TT(
long, NC_LONG)
84 DECLARE_NETCDF_TT(
unsigned long, NC_LONG)
85 DECLARE_NETCDF_TT(
unsigned int, NC_UINT)
86 DECLARE_NETCDF_TT(
long long, NC_INT64)
87 DECLARE_NETCDF_TT(
unsigned long long, NC_UINT64)
88 DECLARE_NETCDF_TT(
float, NC_FLOAT)
89 DECLARE_NETCDF_TT(
double, NC_DOUBLE)
91 #define DECLARE_CPP_TT(cpp_t_, nc_c_) \
93 template <> class cpp_tt<nc_c_> \
96 using type = cpp_t_; \
97 static const char *name() { return #cpp_t_; } \
99 DECLARE_CPP_TT(
char, NC_BYTE)
100 DECLARE_CPP_TT(
unsigned char, NC_UBYTE)
102 DECLARE_CPP_TT(
short int, NC_SHORT)
103 DECLARE_CPP_TT(
unsigned short int, NC_USHORT)
104 DECLARE_CPP_TT(
int, NC_INT)
107 DECLARE_CPP_TT(
unsigned int, NC_UINT)
108 DECLARE_CPP_TT(
long long, NC_INT64)
109 DECLARE_CPP_TT(
unsigned long long, NC_UINT64)
110 DECLARE_CPP_TT(
float, NC_FLOAT)
111 DECLARE_CPP_TT(
double, NC_DOUBLE)
116 void crtrim(
char *s,
long n);
150 m_handle = other.m_handle;
158 m_handle = other.m_handle;
167 int open(
const std::string &file_path,
int mode);
175 int open(MPI_Comm comm,
const std::string &file_path,
int mode);
182 int create(
const std::string &file_path,
int mode);
190 int create(MPI_Comm comm,
const std::string &file_path,
int mode);
203 operator bool()
const
204 {
return m_handle > 0; }
257 const std::string &x_variable,
const std::string &y_variable,
258 const std::string &z_variable,
const std::string &t_variable,
275 const std::string &name,
276 const std::string &x_variable,
const std::string &y_variable,
277 const std::string &z_variable,
const std::string &t_variable,
306 using data_elem_t = std::pair<p_teca_variant_array, teca_metadata>;
307 using data_t = std::pair<unsigned long, data_elem_t>;
308 using task_t = std::packaged_task<data_t()>;
310 using p_queue_t = std::shared_ptr<queue_t>;
313 unsigned long id,
const std::string &variable) : m_path(
path),
314 m_file(file), m_variable(variable), m_id(id)
318 data_t package(
unsigned long id,
322 return std::make_pair(
id, std::make_pair(var, md));
330 std::string m_variable;
352 using data_t = std::pair<unsigned long, p_teca_variant_array>;
353 using task_t = std::packaged_task<
data_t()>;
355 using p_queue_t = std::shared_ptr<queue_t>;
359 unsigned long id,
const std::string &variable) : m_path(
path),
360 m_file(file), m_variable(variable), m_id(id)
364 data_t package(
unsigned long id,
367 return std::make_pair(
id, var);
375 std::string m_variable;
std::mutex & get_netcdf_mutex()
netcdf_handle(netcdf_handle &&other)
Definition: teca_netcdf_util.h:148
void crtrim(char *s, long n)
int read_attribute(netcdf_handle &fh, int var_id, const std::string &att_name, teca_metadata &atts)
A RAII class for managing NETCDF files. The file is kept open while the object exists.
Definition: teca_netcdf_util.h:126
A class to manage a fixed size pool of threads that dispatch I/O work.
Definition: teca_thread_pool.h:24
void operator=(netcdf_handle &&other)
Definition: teca_netcdf_util.h:155
Codes dealing with NetCDF I/O calls.
Definition: teca_netcdf_util.h:60
std::pair< p_teca_variant_array, teca_metadata > data_elem_t
Definition: teca_netcdf_util.h:306
std::string path(const std::string &filename)
A traits class mapping to C++ from netcdf.
Definition: teca_netcdf_util.h:67
Functional that reads and returns a variable from the named file.
Definition: teca_netcdf_util.h:302
std::pair< unsigned long, p_teca_variant_array > data_t
Definition: teca_netcdf_util.h:352
int & get()
Definition: teca_netcdf_util.h:199
int clamp_dimensions_of_one(unsigned long nx_max, unsigned long ny_max, unsigned long nz_max, unsigned long *extent, bool verbose)
~netcdf_handle()
Definition: teca_netcdf_util.h:137
int write_variable_attributes(netcdf_handle &fh, int var_id, teca_metadata &array_atts)
Function that reads and returns a variable from the named file.
Definition: teca_netcdf_util.h:348
std::shared_ptr< teca_variant_array > p_teca_variant_array
Definition: teca_variant_array.h:22
netcdf_handle(int h)
Definition: teca_netcdf_util.h:133
A traits class mapping to netcdf from C++.
Definition: teca_netcdf_util.h:64
int read_variable_attributes(netcdf_handle &fh, int var_id, const std::string &x_variable, const std::string &y_variable, const std::string &z_variable, const std::string &t_variable, int clamp_dimensions_of_one, std::string &name, teca_metadata &atts)