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.
89 lines
3.5 KiB
89 lines
3.5 KiB
1 year ago
|
#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 "";
|
||
|
}
|