#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(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 ""; }