1616
1717#include " ugrid_writer.hpp"
1818
19+ #include < limits>
20+
1921ugrid_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
0 commit comments