You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
3.5 KiB
88 lines
3.5 KiB
#define MICHLIB_NOSOURCE |
|
#include "actionuv.h" |
|
|
|
void UVMethods::StPoints::WriteBinBile(const MString& name) const |
|
{ |
|
BFileW stp; |
|
stp.Create(name, 3); |
|
stp.SetColumnName(1, lonlat ? "Longitude" : "x"); |
|
stp.SetColumnName(2, lonlat ? "Latitude" : "x"); |
|
stp.SetColumnName(3, "Stability (0 - saddle, 1 - st. anticicl. focus, 2 - st. knot, 3 - unst. anticicl. focus, 4 - unst. knot, 5 - st. cicl. focus, 6 - unst. cicl. focus)"); |
|
|
|
for(size_t i = 0; i < N(); i++) |
|
{ |
|
stp.Write(x[i]); |
|
stp.Write(y[i]); |
|
stp.Write(michlib::int_cast<size_t>(t[i])); |
|
} |
|
stp.Finalize(); |
|
stp.Close(); |
|
} |
|
|
|
MString UVMethods::StPoints::WriteNcFile(const MString& name, const MString& history, int comp) const |
|
{ |
|
int ret; |
|
int ncid; |
|
int dimid; |
|
int xid, yid, tid; |
|
MString text; |
|
|
|
ret = nc_create(name.Buf(), NC_CLOBBER | NC_NETCDF4, &ncid); |
|
if(ret != NC_NOERR) return "Can't create netcdf file: " + name; |
|
|
|
ret = nc_put_att_text(ncid, NC_GLOBAL, "history", history.Len() + 1, history.Buf()); |
|
if(ret != NC_NOERR) return "Can't write history attribute in the netcdf file"; |
|
|
|
ret = nc_def_dim(ncid, "i", N(), &dimid); |
|
if(ret != NC_NOERR) return "Can't create dimension in the netcdf file"; |
|
|
|
ret = nc_def_var(ncid, lonlat ? "longitude" : "x", NC_FLOAT, 1, &dimid, &xid); |
|
if(ret != NC_NOERR) return "Can't create x variable in the netcdf file"; |
|
ret = nc_def_var(ncid, lonlat ? "latitude" : "y", NC_FLOAT, 1, &dimid, &yid); |
|
if(ret != NC_NOERR) return "Can't create y variable in the netcdf file"; |
|
|
|
if(lonlat) |
|
{ |
|
text = "longitude"; |
|
ret = nc_put_att_text(ncid, xid, "standard_name", text.Len() + 1, text.Buf()); |
|
if(ret != NC_NOERR) return "Can't write standard_name attribute of longitude variable in the netcdf file"; |
|
text = "latitude"; |
|
ret = nc_put_att_text(ncid, yid, "standard_name", text.Len() + 1, text.Buf()); |
|
if(ret != NC_NOERR) return "Can't write standard_name attribute of latitude variable in the netcdf file"; |
|
} |
|
|
|
ret = nc_def_var_deflate(ncid, xid, 1, 1, comp); |
|
if(ret != NC_NOERR) return "Can't set deflate parameters for x variable in the netcdf file"; |
|
ret = nc_def_var_deflate(ncid, yid, 1, 1, comp); |
|
if(ret != NC_NOERR) return "Can't set deflate parameters for y variable in the netcdf file"; |
|
|
|
ret = nc_def_var(ncid, "type", NC_UBYTE, 1, &dimid, &tid); |
|
if(ret != NC_NOERR) return "Can't create type variable in the netcdf file"; |
|
ret = nc_def_var_deflate(ncid, tid, 1, 1, comp); |
|
if(ret != NC_NOERR) return "Can't set deflate parameters for type variable in the netcdf file"; |
|
text = "Stationary point type, 0 - saddle, 1 - st. anticicl. focus, 2 - st. knot, 3 - unst. anticicl. focus, 4 - unst. knot, 5 - st. cicl. focus, 6 - unst. cicl. focus"; |
|
ret = nc_put_att_text(ncid, tid, "long_name", text.Len() + 1, text.Buf()); |
|
if(ret != NC_NOERR) return "Can't write long_name attribute of type variable in the netcdf file"; |
|
|
|
ret = nc_enddef(ncid); |
|
if(ret != NC_NOERR) return "Can't finish definition of the netcdf file"; |
|
|
|
const size_t i = 0, c = N(); |
|
float buf[c]; |
|
|
|
for(size_t ix = 0; ix < c; ix++) buf[ix] = x[ix]; |
|
ret = nc_put_vara_float(ncid, xid, &i, &c, buf); |
|
if(ret != NC_NOERR) return "Can't write x variable in the netcdf file"; |
|
|
|
for(size_t ix = 0; ix < c; ix++) buf[ix] = y[ix]; |
|
ret = nc_put_vara_float(ncid, yid, &i, &c, buf); |
|
if(ret != NC_NOERR) return "Can't write y variable in the netcdf file"; |
|
|
|
ret = nc_put_vara_ubyte(ncid, tid, &i, &c, t.data()); |
|
if(ret != NC_NOERR) return "Can't write type variable in the netcdf file"; |
|
|
|
ret = nc_close(ncid); |
|
if(ret != NC_NOERR) return "Can't close netcdf file"; |
|
|
|
return ""; |
|
}
|
|
|