|
|
|
@ -23,26 +23,31 @@ class NCFileWBase
|
|
|
|
|
{ |
|
|
|
|
static constexpr nc_type nc = NC_UBYTE; |
|
|
|
|
static int put_var(int nc, int vid, const michlib::uint1* data) { return nc_put_var_ubyte(nc, vid, data); } |
|
|
|
|
static int put_vara(int nc, int vid, const size_t* startp, const size_t* countp, const michlib::uint1* data) { return nc_put_vara_ubyte(nc, vid, startp, countp, data); } |
|
|
|
|
}; |
|
|
|
|
template<class Dummy> struct NCTypeD<michlib::int2, Dummy> |
|
|
|
|
{ |
|
|
|
|
static constexpr nc_type nc = NC_SHORT; |
|
|
|
|
static int put_var(int nc, int vid, const michlib::int2* data) { return nc_put_var_short(nc, vid, data); } |
|
|
|
|
static int put_vara(int nc, int vid, const size_t* startp, const size_t* countp, const michlib::int2* data) { return nc_put_vara_short(nc, vid, startp, countp, data); } |
|
|
|
|
}; |
|
|
|
|
template<class Dummy> struct NCTypeD<michlib::uint2, Dummy> |
|
|
|
|
{ |
|
|
|
|
static constexpr nc_type nc = NC_USHORT; |
|
|
|
|
static int put_var(int nc, int vid, const michlib::uint2* data) { return nc_put_var_ushort(nc, vid, data); } |
|
|
|
|
static int put_vara(int nc, int vid, const size_t* startp, const size_t* countp, const michlib::uint2* data) { return nc_put_vara_ushort(nc, vid, startp, countp, data); } |
|
|
|
|
}; |
|
|
|
|
template<class Dummy> struct NCTypeD<michlib::int4, Dummy> |
|
|
|
|
{ |
|
|
|
|
static constexpr nc_type nc = NC_INT; |
|
|
|
|
static int put_var(int nc, int vid, const michlib::int4* data) { return nc_put_var_int(nc, vid, data); } |
|
|
|
|
static int put_vara(int nc, int vid, const size_t* startp, const size_t* countp, const michlib::int4* data) { return nc_put_vara_int(nc, vid, startp, countp, data); } |
|
|
|
|
}; |
|
|
|
|
template<class Dummy> struct NCTypeD<michlib::uint4, Dummy> |
|
|
|
|
{ |
|
|
|
|
static constexpr nc_type nc = NC_UINT; |
|
|
|
|
static int put_var(int nc, int vid, const michlib::uint4* data) { return nc_put_var_uint(nc, vid, data); } |
|
|
|
|
static int put_vara(int nc, int vid, const size_t* startp, const size_t* countp, const michlib::uint4* data) { return nc_put_vara_uint(nc, vid, startp, countp, data); } |
|
|
|
|
}; |
|
|
|
|
template<class Dummy> struct NCTypeD<michlib::int8, Dummy> |
|
|
|
|
{ |
|
|
|
@ -56,11 +61,13 @@ class NCFileWBase
|
|
|
|
|
{ |
|
|
|
|
static constexpr nc_type nc = NC_FLOAT; |
|
|
|
|
static int put_var(int nc, int vid, const float* data) { return nc_put_var_float(nc, vid, data); } |
|
|
|
|
static int put_vara(int nc, int vid, const size_t* startp, const size_t* countp, const float* data) { return nc_put_vara_float(nc, vid, startp, countp, data); } |
|
|
|
|
}; |
|
|
|
|
template<class Dummy> struct NCTypeD<double, Dummy> |
|
|
|
|
{ |
|
|
|
|
static constexpr nc_type nc = NC_DOUBLE; |
|
|
|
|
static int put_var(int nc, int vid, const double* data) { return nc_put_var_double(nc, vid, data); } |
|
|
|
|
static int put_vara(int nc, int vid, const size_t* startp, const size_t* countp, const double* data) { return nc_put_vara_double(nc, vid, startp, countp, data); } |
|
|
|
|
}; |
|
|
|
|
template<class Dummy> struct NCTypeD<MString, Dummy> |
|
|
|
|
{ |
|
|
|
@ -287,6 +294,40 @@ class NCFileWBase
|
|
|
|
|
err.Reset(NCTypeD<T, void>::put_var(ncid, varid, data)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template<class T> |
|
|
|
|
requires requires(int nc, int vid, const size_t* start, const size_t* count, const T* d) { |
|
|
|
|
{ |
|
|
|
|
NCTypeD<T, void>::put_vara(nc, vid, start, count, d) |
|
|
|
|
} -> std::same_as<int>; |
|
|
|
|
} |
|
|
|
|
void WriteVar(const MString& vname, size_t ind, const T* data) |
|
|
|
|
{ |
|
|
|
|
if(err.IsErr()) return; |
|
|
|
|
|
|
|
|
|
int varid; |
|
|
|
|
err.Reset(nc_inq_varid(ncid, vname.Buf(), &varid)); |
|
|
|
|
if(err.IsErr()) return; |
|
|
|
|
|
|
|
|
|
int ndim; |
|
|
|
|
err.Reset(nc_inq_var(ncid, varid, nullptr, nullptr, &ndim, nullptr, nullptr)); |
|
|
|
|
if(err.IsErr()) return; |
|
|
|
|
std::vector<int> dimids(ndim); |
|
|
|
|
err.Reset(nc_inq_var(ncid, varid, nullptr, nullptr, nullptr, dimids.data(), nullptr)); |
|
|
|
|
if(err.IsErr()) return; |
|
|
|
|
|
|
|
|
|
std::vector<size_t> start(ndim), count(ndim); |
|
|
|
|
start[0] = ind; |
|
|
|
|
count[0] = 1; |
|
|
|
|
for(size_t i = 1; i < dimids.size(); i++) |
|
|
|
|
{ |
|
|
|
|
start[i] = 0; |
|
|
|
|
err.Reset(nc_inq_dim(ncid, dimids[i], nullptr, &count[i])); |
|
|
|
|
if(err.IsErr()) return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
err.Reset(NCTypeD<T, void>::put_vara(ncid, varid, start.data(), count.data(), data)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
// Members
|
|
|
|
|
int ncid; |
|
|
|
|