Skip to content

Commit eaa58ff

Browse files
committed
ensure nan values fill all variables
1 parent 40e6439 commit eaa58ff

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

src/mesh/ugrid_writer.cpp

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
#include "ugrid_writer.hpp"
1818

19+
#include <limits>
20+
1921
ugrid_writer::ugrid_writer(mesh m, std::shared_ptr<global> g, bool write_parameters, std::string fname, bool use_zarr):
2022
_fname(""),
2123
_store_path(std::move(fname)),
@@ -44,7 +46,7 @@ ugrid_writer::~ugrid_writer()
4446

4547
}
4648

47-
void ugrid_writer::nc_chk_ret(int status)
49+
void ugrid_writer::nc_chk_ret(int status) const
4850
{
4951
if (status != NC_NOERR)
5052
{
@@ -534,6 +536,7 @@ void ugrid_writer::init_ugrid(const std::vector<std::string>& output_variables)
534536
nc_chk_ret(nc_put_att_text(_ugrid_fid, time_varid, "standard_name", strlen("time"), "time"));
535537
nc_chk_ret( nc_put_att_text(_ugrid_fid, time_varid, "long_name", strlen("Time"), "Time"));
536538
nc_chk_ret(nc_put_att_text(_ugrid_fid, time_varid, "units", strlen("minutes since 1970-01-01 00:00:00"), "minutes since 1970-01-01 00:00:00"));
539+
nc_chk_ret(nc_put_att_double(_ugrid_fid, time_varid, "_FillValue", NC_DOUBLE, 1, & double nan_value = NAN; // IEEE NaN));
537540

538541
int var_Mesh2, var_Mesh2_face_nodes, var_Mesh2_node_x, var_Mesh2_node_y, var_Mesh2_node_z, var_Mesh2_node_z_PV;
539542
int dims_face_nodes[2] = {dim_Mesh2_face, dim_three};
@@ -559,14 +562,18 @@ void ugrid_writer::init_ugrid(const std::vector<std::string>& output_variables)
559562
nc_chk_ret(nc_put_att_text(_ugrid_fid, var_Mesh2_face_nodes, "cf_role", strlen("face_node_connectivity"), "face_node_connectivity"));
560563
nc_chk_ret(nc_put_att_text(_ugrid_fid, var_Mesh2_face_nodes, "long_name",
561564
strlen("Maps every triangular face to its three corner nodes."), "Maps every triangular face to its three corner nodes."));
565+
{
566+
unsigned int uint_fill = std::numeric_limits<unsigned int>::max();
567+
nc_chk_ret(nc_put_att_uint(_ugrid_fid, var_Mesh2_face_nodes, "_FillValue", NC_UINT, 1, &uint_fill));
568+
}
562569
// UGRID recommends start_index attribute; indices are 0-based here
563570
{
564571
int start_index = 0;
565572
nc_chk_ret(nc_put_att_int(_ugrid_fid, var_Mesh2_face_nodes, "start_index", NC_INT, 1, &start_index));
566573
}
567574

568575
// Mesh2_node_x
569-
double nan_value = NAN; // IEEE NaN
576+
570577
nc_chk_ret(nc_def_var(_ugrid_fid, "Mesh2_node_x", NC_DOUBLE, 1, dims_node, &var_Mesh2_node_x));
571578
nc_chk_ret(nc_put_att_text(_ugrid_fid, var_Mesh2_node_x, "standard_name", strlen("longitude"), "longitude"));
572579
nc_chk_ret(nc_put_att_text(_ugrid_fid, var_Mesh2_node_x, "long_name", strlen("Longitude of 2D mesh nodes."), "Longitude of 2D mesh nodes."));
@@ -608,32 +615,43 @@ void ugrid_writer::init_ugrid(const std::vector<std::string>& output_variables)
608615
nc_chk_ret(nc_put_att_text(_ugrid_fid, var_global_id, "mesh", strlen("Mesh2"), "Mesh2"));
609616
nc_chk_ret(nc_put_att_text(_ugrid_fid, var_global_id, "location", strlen("face"), "face"));
610617
nc_chk_ret(nc_put_att_text(_ugrid_fid, var_global_id, "coordinates", strlen("Mesh2_face_x Mesh2_face_y"), "Mesh2_face_x Mesh2_face_y"));
618+
{
619+
unsigned long long uint64_fill = std::numeric_limits<unsigned long long>::max();
620+
nc_chk_ret(nc_put_att_ulonglong(_ugrid_fid, var_global_id, "_FillValue", NC_UINT64, 1, &uint64_fill));
621+
}
611622

612623
nc_chk_ret(nc_def_var(_ugrid_fid, "local_id", NC_UINT64, 1, &dim_Mesh2_face, &var_local_id));
613624
nc_chk_ret(nc_put_att_text(_ugrid_fid, var_local_id, "mesh", strlen("Mesh2"), "Mesh2"));
614625
nc_chk_ret(nc_put_att_text(_ugrid_fid, var_local_id, "location", strlen("face"), "face"));
615626
nc_chk_ret(nc_put_att_text(_ugrid_fid, var_local_id, "coordinates", strlen("Mesh2_face_x Mesh2_face_y"), "Mesh2_face_x Mesh2_face_y"));
627+
{
628+
unsigned long long uint64_fill = std::numeric_limits<unsigned long long>::max();
629+
nc_chk_ret(nc_put_att_ulonglong(_ugrid_fid, var_local_id, "_FillValue", NC_UINT64, 1, &uint64_fill));
630+
}
616631

617632
nc_chk_ret(nc_def_var(_ugrid_fid, "Mesh2_face_x", NC_DOUBLE, 1, &dim_Mesh2_face, &var_Mesh2_face_x));
618633
nc_chk_ret(nc_put_att_text(_ugrid_fid, var_Mesh2_face_x, "standard_name", strlen("longitude"), "longitude"));
619634
nc_chk_ret(nc_put_att_text(_ugrid_fid, var_Mesh2_face_x, "long_name",
620635
strlen("Characteristics longitude of 2D mesh triangle (e.g. circumcenter coordinate)."),
621636
"Characteristics longitude of 2D mesh triangle (e.g. circumcenter coordinate)."));
622637
nc_chk_ret(nc_put_att_text(_ugrid_fid, var_Mesh2_face_x, "units", strlen("degrees_east"), "degrees_east"));
638+
nc_chk_ret(nc_put_att_double(_ugrid_fid, var_Mesh2_face_x, "_FillValue", NC_DOUBLE, 1, &nan_value));
623639

624640
nc_chk_ret(nc_def_var(_ugrid_fid, "Mesh2_face_y", NC_DOUBLE, 1, &dim_Mesh2_face, &var_Mesh2_face_y));
625641
nc_chk_ret(nc_put_att_text(_ugrid_fid, var_Mesh2_face_y, "standard_name", strlen("latitude"), "latitude"));
626642
nc_chk_ret(nc_put_att_text(_ugrid_fid, var_Mesh2_face_y, "long_name",
627643
strlen("Characteristics latitude of 2D mesh triangle (e.g. circumcenter coordinate)."),
628644
"Characteristics latitude of 2D mesh triangle (e.g. circumcenter coordinate)."));
629645
nc_chk_ret(nc_put_att_text(_ugrid_fid, var_Mesh2_face_y, "units", strlen("degrees_north"), "degrees_north"));
646+
nc_chk_ret(nc_put_att_double(_ugrid_fid, var_Mesh2_face_y, "_FillValue", NC_DOUBLE, 1, &nan_value));
630647

631648
nc_chk_ret(nc_def_var(_ugrid_fid, "Mesh2_face_z", NC_DOUBLE, 1, &dim_Mesh2_face, &var_Mesh2_face_z));
632649
nc_chk_ret(nc_put_att_text(_ugrid_fid, var_Mesh2_face_z, "standard_name", strlen("altitude"), "altitude"));
633650
nc_chk_ret(nc_put_att_text(_ugrid_fid, var_Mesh2_face_z, "long_name",
634651
strlen("Characteristics latitude of 2D mesh triangle (e.g. circumcenter coordinate)."),
635652
"Characteristics latitude of 2D mesh triangle (e.g. circumcenter coordinate)."));
636653
nc_chk_ret(nc_put_att_text(_ugrid_fid, var_Mesh2_face_z, "units", strlen("m"), "m"));
654+
nc_chk_ret(nc_put_att_double(_ugrid_fid, var_Mesh2_face_z, "_FillValue", NC_DOUBLE, 1, &nan_value));
637655

638656

639657
// bitgroom sigfigs
@@ -714,6 +732,10 @@ void ugrid_writer::init_ugrid(const std::vector<std::string>& output_variables)
714732
nc_chk_ret(nc_def_var_chunking(_ugrid_fid, param_id["owner"], NC_CHUNKED, owner_chunks));
715733
nc_chk_ret(nc_put_att_text(_ugrid_fid, param_id["owner"], "mesh", strlen("Mesh2"), "Mesh2"));
716734
nc_chk_ret(nc_put_att_text(_ugrid_fid, param_id["owner"], "location", strlen("face"), "face"));
735+
{
736+
int int_fill = std::numeric_limits<int>::max();
737+
nc_chk_ret(nc_put_att_int(_ugrid_fid, param_id["owner"], "_FillValue", NC_INT, 1, &int_fill));
738+
}
717739
nc_chk_ret(nc_var_par_access(_ugrid_fid, param_id["owner"], NC_COLLECTIVE));
718740
if (compress) nc_chk_ret(nc_def_var_deflate(_ugrid_fid, param_id["owner"], 1, 1, 5));
719741

src/mesh/ugrid_writer.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class ugrid_writer
4444
* Check a netcdf C call's return value and convert to exception if needed
4545
* @param status
4646
*/
47-
void nc_chk_ret(int status);
47+
void nc_chk_ret(int status) const;
4848

4949
void close_ugrid();
5050
void write_ugrid(const std::vector<std::string>& output_variables);

0 commit comments

Comments
 (0)