34 using std::istringstream ;
75 FONcAttributes::add_attributes(
int ncid,
int varid, BaseType *b )
78 BaseType *parent = b->get_parent() ;
81 FONcAttributes::add_attributes( ncid, varid, parent, emb_name ) ;
83 addattrs( ncid, varid, b,
"" ) ;
100 FONcAttributes::add_attributes(
int ncid,
int varid, BaseType *b,
103 BaseType *parent = b->get_parent() ;
106 FONcAttributes::add_attributes( ncid, varid, parent, emb_name ) ;
108 if( !emb_name.empty() )
112 emb_name += b->name() ;
113 addattrs( ncid, varid, b, emb_name ) ;
126 FONcAttributes::addattrs(
int ncid,
int varid, BaseType *b,
127 const string &var_name )
129 AttrTable &attrs = b->get_attr_table() ;
130 addattrs( ncid, varid, attrs, var_name,
"" ) ;
147 FONcAttributes::addattrs(
int ncid,
int varid, AttrTable &attrs,
148 const string &var_name,
const string &prepend_attr )
150 unsigned int num_attrs = attrs.get_size() ;
153 AttrTable::Attr_iter i = attrs.attr_begin() ;
154 AttrTable::Attr_iter e = attrs.attr_end() ;
157 unsigned int num_vals = attrs.get_attr_num( i ) ;
160 addattrs( ncid, varid, var_name, attrs, i, prepend_attr ) ;
179 FONcAttributes::addattrs(
int ncid,
int varid,
const string &var_name,
181 AttrTable::Attr_iter &attr,
182 const string &prepend_attr )
184 string attr_name = attrs.get_name( attr ) ;
185 string new_attr_name ;
186 if( !prepend_attr.empty() )
192 new_attr_name = attr_name ;
196 if( !var_name.empty() )
202 new_name = new_attr_name ;
205 if( varid == NC_GLOBAL )
206 BESDEBUG(
"fonc",
"Adding global attributes " << new_name << endl ) ;
208 BESDEBUG(
"fonc",
"Adding attributes " << new_name << endl ) ;
210 int stax = NC_NOERR ;
211 unsigned int attri = 0 ;
212 AttrType type = attrs.get_attr_type( attr ) ;
213 unsigned int num_vals = attrs.get_attr_num( attr ) ;
219 BESDEBUG(
"fonc",
"Attribute " << new_name
220 <<
" is an attribute container" << endl ) ;
221 AttrTable *container = attrs.get_attr_table( attr ) ;
224 addattrs( ncid, varid, *container, var_name, new_attr_name ) ;
231 unsigned char vals[num_vals] ;
232 for( attri = 0; attri < num_vals; attri++ )
234 string val = attrs.get_attr( attr, attri ) ;
235 istringstream is( val ) ;
236 unsigned int uival = 0 ;
238 vals[attri] = (
unsigned char)uival ;
240 stax = nc_put_att_uchar( ncid, varid, new_name.c_str(),
241 NC_BYTE, num_vals, vals ) ;
242 if( stax != NC_NOERR )
244 string err = (string)
"File out netcdf, "
245 +
"failed to write byte attribute "
254 short vals[num_vals] ;
255 for( attri = 0; attri < num_vals; attri++ )
257 string val = attrs.get_attr( attr, attri ) ;
258 istringstream is( val ) ;
263 stax = nc_put_att_short( ncid, varid, new_name.c_str(),
264 NC_SHORT, num_vals, vals ) ;
265 if( stax != NC_NOERR )
267 string err = (string)
"File out netcdf, "
268 +
"failed to write short attribute "
279 for( attri = 0; attri < num_vals; attri++ )
281 string val = attrs.get_attr( attr, attri ) ;
282 istringstream is( val ) ;
287 stax = nc_put_att_int( ncid, varid, new_name.c_str(),
288 NC_INT, num_vals, vals ) ;
289 if( stax != NC_NOERR )
291 string err = (string)
"File out netcdf, "
292 +
"failed to write unsinged short attribute "
302 for( attri = 0; attri < num_vals; attri++ )
304 string val = attrs.get_attr( attr, attri ) ;
305 istringstream is( val ) ;
310 stax = nc_put_att_int( ncid, varid, new_name.c_str(),
311 NC_INT, num_vals, vals ) ;
312 if( stax != NC_NOERR )
314 string err = (string)
"File out netcdf, "
315 +
"failed to write int attribute "
326 for( attri = 0; attri < num_vals; attri++ )
328 string val = attrs.get_attr( attr, attri ) ;
329 istringstream is( val ) ;
334 stax = nc_put_att_int( ncid, varid, new_name.c_str(),
335 NC_INT, num_vals, vals ) ;
336 if( stax != NC_NOERR )
338 string err = (string)
"File out netcdf, "
339 +
"failed to write byte attribute "
348 float vals[num_vals] ;
349 for( attri = 0; attri < num_vals; attri++ )
351 string val = attrs.get_attr( attr, attri ) ;
352 istringstream is( val ) ;
357 stax = nc_put_att_float( ncid, varid, new_name.c_str(),
358 NC_FLOAT, num_vals, vals ) ;
359 if( stax != NC_NOERR )
361 string err = (string)
"File out netcdf, "
362 +
"failed to write float attribute "
371 double vals[num_vals] ;
372 for( attri = 0; attri < num_vals; attri++ )
374 string val = attrs.get_attr( attr, attri ) ;
375 istringstream is( val ) ;
380 stax = nc_put_att_double( ncid, varid, new_name.c_str(),
381 NC_DOUBLE, num_vals, vals ) ;
382 if( stax != NC_NOERR )
384 string err = (string)
"File out netcdf, "
385 +
"failed to write double attribute "
396 string val = attrs.get_attr( attr, 0 ) ;
397 for( attri = 1; attri < num_vals; attri++ )
399 val +=
"\n" + attrs.get_attr( attr, attri ) ;
401 stax = nc_put_att_text( ncid, varid, new_name.c_str(),
402 val.length(), val.c_str());
403 if( stax != NC_NOERR )
405 string err = (string)
"File out netcdf, "
406 +
"failed to write string attribute "
414 string err = (string)
"File out netcdf, "
415 +
"failed to write unknown type of attribute "
438 const string &var_name,
441 if( var_name != orig )
444 int stax = nc_put_att_text( ncid, varid, attr_name.c_str(),
445 orig.length(), orig.c_str());
446 if( stax != NC_NOERR )
448 string err = (string)
"File out netcdf, "
449 +
"failed to write change of name attribute for "
#define FONC_EMBEDDED_SEPARATOR
static void add_original_name(int ncid, int varid, const string &var_name, const string &orig)
Adds an attribute for the variable if the variable name had to be modified in any way...
static void handle_error(int stax, string &err, const string &file, int line)
handle any netcdf errors
#define FONC_ATTRIBUTE_SEPARATOR
#define BESDEBUG(x, y)
macro used to send debug information to the debug stream
static string id2netcdf(string in)
convert the provided string to a netcdf allowed identifier.