Skip to content

Format Requirements for NetCDF Files

HankHerr-NOAA edited this page Jul 9, 2024 · 1 revision

WRES is able to ingest forecast data provided in NetCDF format so long as that data follows, approximately, the same format as NWM output. Specifically:

1. The file must be NetCDF CF-compliant.

2. Gridded NetCDF data must include a project in the metadata and associated with each variable.

To serve as guidance, two examples are provided below generated using ncdump -h: (1) a gridded NetCDF short-range precipitation forcing input file; (2) a gauge (or vector) NetCDF medium-range ensemble forecast output file. In each case, the metadata for a single file is provided, the first including the projection information expected by WRES, the second illustrating new metadata provided with the NWM v2.0 NetCDF output, such as ensemble_member_number.

Gridded NetCDF precipitation forcings used for short-range forecasting

netcdf nwm.t08z.short_range.forcing.f001.conus {
dimensions:
	time = UNLIMITED ; // (1 currently)
	y = 3840 ;
	x = 4608 ;
	reference_time = 1 ;
	nv = 2 ;
variables:
	int time(time) ;
		time:units = "minutes since 1970-01-01 00:00:00 UTC" ;
		time:standard_name = "time" ;
		time:bounds = "time_bounds" ;
		time:long_name = "valid output time" ;
	int reference_time(reference_time) ;
		reference_time:units = "minutes since 1970-01-01 00:00:00 UTC" ;
		reference_time:standard_name = "forecast_reference_time" ;
		reference_time:long_name = "model initialization time" ;
	int time_bounds(time, nv) ;
		time_bounds:units = "minutes since 1970-01-01 00:00:00 UTC" ;
	double x(x) ;
		x:standard_name = "projection_x_coordinate" ;
		x:long_name = "x coordinate of projection" ;
		x:_CoordinateAxisType = "GeoX" ;
		x:units = "m" ;
		x:resolution = 1000. ;
	double y(y) ;
		y:standard_name = "projection_y_coordinate" ;
		y:long_name = "y coordinate of projection" ;
		y:_CoordinateAxisType = "GeoY" ;
		y:units = "m" ;
		y:resolution = 1000. ;
	char ProjectionCoordinateSystem ;
		ProjectionCoordinateSystem:_CoordinateTransformType = "Projection" ;
		ProjectionCoordinateSystem:transform_name = "lambert_conformal_conic" ;
		ProjectionCoordinateSystem:grid_mapping_name = "lambert_conformal_conic" ;
		ProjectionCoordinateSystem:_CoordinateAxes = "y x" ;
		ProjectionCoordinateSystem:esri_pe_string = "PROJCS[\"Sphere_Lambert_Conformal_Conic\",GEOGCS[\"GCS_Sphere\",DATUM[\"D_Sphere\",SPHEROID[\"Sphere\",6370000.0,0.0]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Lambert_Conformal_Conic\"],PARAMETER[\"false_easting\",0.0],PARAMETER[\"false_northing\",0.0],PARAMETER[\"central_meridian\",-97.0],PARAMETER[\"standard_parallel_1\",30.0],PARAMETER[\"standard_parallel_2\",60.0],PARAMETER[\"latitude_of_origin\",40.0000076294],UNIT[\"Meter\",1.0]];-35691800 -29075200 126180232.640845;-100000 10000;-100000 10000;0.001;0.001;0.001;IsHighPrecision" ;
		ProjectionCoordinateSystem:standard_parallel = 30., 60. ;
		ProjectionCoordinateSystem:longitude_of_central_meridian = -97. ;
		ProjectionCoordinateSystem:latitude_of_projection_origin = 40.0000076294 ;
		ProjectionCoordinateSystem:false_easting = 0. ;
		ProjectionCoordinateSystem:false_northing = 0. ;
		ProjectionCoordinateSystem:earth_radius = 6370000. ;
		ProjectionCoordinateSystem:proj4 = "+proj=lcc +lat_1=30 +lat_2=60 +lat_0=40 +lon_0=-97 +x_0=0 +y_0=0 +a=6370000 +b=6370000 +units=m +no_defs" ;
	int T2D(time, y, x) ;
		T2D:cell_methods = "time: point" ;
		T2D:remap = "remapped via ESMF regrid_with_weights: Bilinear" ;
		T2D:esri_pe_string = "PROJCS[\"Sphere_Lambert_Conformal_Conic\",GEOGCS[\"GCS_Sphere\",DATUM[\"D_Sphere\",SPHEROID[\"Sphere\",6370000.0,0.0]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Lambert_Conformal_Conic\"],PARAMETER[\"false_easting\",0.0],PARAMETER[\"false_northing\",0.0],PARAMETER[\"central_meridian\",-97.0],PARAMETER[\"standard_parallel_1\",30.0],PARAMETER[\"standard_parallel_2\",60.0],PARAMETER[\"latitude_of_origin\",40.0000076294],UNIT[\"Meter\",1.0]];-35691800 -29075200 126180232.640845;-100000 10000;-100000 10000;0.001;0.001;0.001;IsHighPrecision" ;
		T2D:grid_mapping = "ProjectionCoordinateSystem" ;
		T2D:proj4 = "+proj=lcc +lat_1=30 +lat_2=60 +lat_0=40 +lon_0=-97 +x_0=0 +y_0=0 +a=6370000 +b=6370000 +units=m +no_defs" ;
		T2D:missing_value = -999900 ;
		T2D:valid_range = 0., 40000. ;
		T2D:add_offset = 100. ;
		T2D:scale_factor = 0.01 ;
		T2D:standard_name = "air_temperature" ;
		T2D:long_name = "2-m Air Temperature" ;
		T2D:units = "K" ;
		T2D:_FillValue = -999900 ;
	int LWDOWN(time, y, x) ;
		LWDOWN:cell_methods = "time: point" ;
		LWDOWN:remap = "remapped via ESMF regrid_with_weights: Bilinear" ;
		LWDOWN:esri_pe_string = "PROJCS[\"Sphere_Lambert_Conformal_Conic\",GEOGCS[\"GCS_Sphere\",DATUM[\"D_Sphere\",SPHEROID[\"Sphere\",6370000.0,0.0]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Lambert_Conformal_Conic\"],PARAMETER[\"false_easting\",0.0],PARAMETER[\"false_northing\",0.0],PARAMETER[\"central_meridian\",-97.0],PARAMETER[\"standard_parallel_1\",30.0],PARAMETER[\"standard_parallel_2\",60.0],PARAMETER[\"latitude_of_origin\",40.0000076294],UNIT[\"Meter\",1.0]];-35691800 -29075200 126180232.640845;-100000 10000;-100000 10000;0.001;0.001;0.001;IsHighPrecision" ;
		LWDOWN:grid_mapping = "ProjectionCoordinateSystem" ;
		LWDOWN:proj4 = "+proj=lcc +lat_1=30 +lat_2=60 +lat_0=40 +lon_0=-97 +x_0=0 +y_0=0 +a=6370000 +b=6370000 +units=m +no_defs" ;
		LWDOWN:missing_value = -9999000 ;
		LWDOWN:valid_range = 0., 5000000. ;
		LWDOWN:add_offset = 0. ;
		LWDOWN:scale_factor = 0.001 ;
		LWDOWN:standard_name = "surface_downward_longwave_flux" ;
		LWDOWN:long_name = "Surface downward long-wave radiation flux" ;
		LWDOWN:units = "W m-2" ;
		LWDOWN:_FillValue = -9999000 ;
	int Q2D(time, y, x) ;
		Q2D:cell_methods = "time: point" ;
		Q2D:remap = "remapped via ESMF regrid_with_weights: Bilinear" ;
		Q2D:esri_pe_string = "PROJCS[\"Sphere_Lambert_Conformal_Conic\",GEOGCS[\"GCS_Sphere\",DATUM[\"D_Sphere\",SPHEROID[\"Sphere\",6370000.0,0.0]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Lambert_Conformal_Conic\"],PARAMETER[\"false_easting\",0.0],PARAMETER[\"false_northing\",0.0],PARAMETER[\"central_meridian\",-97.0],PARAMETER[\"standard_parallel_1\",30.0],PARAMETER[\"standard_parallel_2\",60.0],PARAMETER[\"latitude_of_origin\",40.0000076294],UNIT[\"Meter\",1.0]];-35691800 -29075200 126180232.640845;-100000 10000;-100000 10000;0.001;0.001;0.001;IsHighPrecision" ;
		Q2D:grid_mapping = "ProjectionCoordinateSystem" ;
		Q2D:proj4 = "+proj=lcc +lat_1=30 +lat_2=60 +lat_0=40 +lon_0=-97 +x_0=0 +y_0=0 +a=6370000 +b=6370000 +units=m +no_defs" ;
		Q2D:missing_value = -9999000 ;
		Q2D:valid_range = 0., 1000000. ;
		Q2D:add_offset = 0. ;
		Q2D:scale_factor = 1.e-06 ;
		Q2D:standard_name = "surface_specific_humidity" ;
		Q2D:long_name = "2-m Specific humidity" ;
		Q2D:units = "kg kg-1" ;
		Q2D:_FillValue = -9999000 ;
	int U2D(time, y, x) ;
		U2D:cell_methods = "time: point" ;
		U2D:remap = "remapped via ESMF regrid_with_weights: Bilinear" ;
		U2D:esri_pe_string = "PROJCS[\"Sphere_Lambert_Conformal_Conic\",GEOGCS[\"GCS_Sphere\",DATUM[\"D_Sphere\",SPHEROID[\"Sphere\",6370000.0,0.0]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Lambert_Conformal_Conic\"],PARAMETER[\"false_easting\",0.0],PARAMETER[\"false_northing\",0.0],PARAMETER[\"central_meridian\",-97.0],PARAMETER[\"standard_parallel_1\",30.0],PARAMETER[\"standard_parallel_2\",60.0],PARAMETER[\"latitude_of_origin\",40.0000076294],UNIT[\"Meter\",1.0]];-35691800 -29075200 126180232.640845;-100000 10000;-100000 10000;0.001;0.001;0.001;IsHighPrecision" ;
		U2D:grid_mapping = "ProjectionCoordinateSystem" ;
		U2D:proj4 = "+proj=lcc +lat_1=30 +lat_2=60 +lat_0=40 +lon_0=-97 +x_0=0 +y_0=0 +a=6370000 +b=6370000 +units=m +no_defs" ;
		U2D:missing_value = -9999000 ;
		U2D:valid_range = -100000., 100000. ;
		U2D:add_offset = 0. ;
		U2D:scale_factor = 0.001 ;
		U2D:standard_name = "x_wind" ;
		U2D:long_name = "10-m U-component of wind" ;
		U2D:units = "m s-1" ;
		U2D:_FillValue = -9999000 ;
	int V2D(time, y, x) ;
		V2D:cell_methods = "time: point" ;
		V2D:remap = "remapped via ESMF regrid_with_weights: Bilinear" ;
		V2D:esri_pe_string = "PROJCS[\"Sphere_Lambert_Conformal_Conic\",GEOGCS[\"GCS_Sphere\",DATUM[\"D_Sphere\",SPHEROID[\"Sphere\",6370000.0,0.0]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Lambert_Conformal_Conic\"],PARAMETER[\"false_easting\",0.0],PARAMETER[\"false_northing\",0.0],PARAMETER[\"central_meridian\",-97.0],PARAMETER[\"standard_parallel_1\",30.0],PARAMETER[\"standard_parallel_2\",60.0],PARAMETER[\"latitude_of_origin\",40.0000076294],UNIT[\"Meter\",1.0]];-35691800 -29075200 126180232.640845;-100000 10000;-100000 10000;0.001;0.001;0.001;IsHighPrecision" ;
		V2D:grid_mapping = "ProjectionCoordinateSystem" ;
		V2D:proj4 = "+proj=lcc +lat_1=30 +lat_2=60 +lat_0=40 +lon_0=-97 +x_0=0 +y_0=0 +a=6370000 +b=6370000 +units=m +no_defs" ;
		V2D:missing_value = -9999000 ;
		V2D:valid_range = -100000., 100000. ;
		V2D:add_offset = 0. ;
		V2D:scale_factor = 0.001 ;
		V2D:standard_name = "y_wind" ;
		V2D:long_name = "10m V-component of wind" ;
		V2D:units = "m s-1" ;
		V2D:_FillValue = -9999000 ;
	int PSFC(time, y, x) ;
		PSFC:cell_methods = "time: point" ;
		PSFC:remap = "remapped via ESMF regrid_with_weights: Bilinear" ;
		PSFC:esri_pe_string = "PROJCS[\"Sphere_Lambert_Conformal_Conic\",GEOGCS[\"GCS_Sphere\",DATUM[\"D_Sphere\",SPHEROID[\"Sphere\",6370000.0,0.0]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Lambert_Conformal_Conic\"],PARAMETER[\"false_easting\",0.0],PARAMETER[\"false_northing\",0.0],PARAMETER[\"central_meridian\",-97.0],PARAMETER[\"standard_parallel_1\",30.0],PARAMETER[\"standard_parallel_2\",60.0],PARAMETER[\"latitude_of_origin\",40.0000076294],UNIT[\"Meter\",1.0]];-35691800 -29075200 126180232.640845;-100000 10000;-100000 10000;0.001;0.001;0.001;IsHighPrecision" ;
		PSFC:grid_mapping = "ProjectionCoordinateSystem" ;
		PSFC:proj4 = "+proj=lcc +lat_1=30 +lat_2=60 +lat_0=40 +lon_0=-97 +x_0=0 +y_0=0 +a=6370000 +b=6370000 +units=m +no_defs" ;
		PSFC:missing_value = -99990 ;
		PSFC:valid_range = 0., 10000000. ;
		PSFC:add_offset = 0. ;
		PSFC:scale_factor = 0.1 ;
		PSFC:standard_name = "air_pressure" ;
		PSFC:long_name = "Surface Pressure" ;
		PSFC:units = "Pa" ;
		PSFC:_FillValue = -99990 ;
	float RAINRATE(time, y, x) ;
		RAINRATE:cell_methods = "time: mean" ;
		RAINRATE:remap = "remapped via ESMF regrid_with_weights: Bilinear" ;
		RAINRATE:esri_pe_string = "PROJCS[\"Sphere_Lambert_Conformal_Conic\",GEOGCS[\"GCS_Sphere\",DATUM[\"D_Sphere\",SPHEROID[\"Sphere\",6370000.0,0.0]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Lambert_Conformal_Conic\"],PARAMETER[\"false_easting\",0.0],PARAMETER[\"false_northing\",0.0],PARAMETER[\"central_meridian\",-97.0],PARAMETER[\"standard_parallel_1\",30.0],PARAMETER[\"standard_parallel_2\",60.0],PARAMETER[\"latitude_of_origin\",40.0000076294],UNIT[\"Meter\",1.0]];-35691800 -29075200 126180232.640845;-100000 10000;-100000 10000;0.001;0.001;0.001;IsHighPrecision" ;
		RAINRATE:grid_mapping = "ProjectionCoordinateSystem" ;
		RAINRATE:proj4 = "+proj=lcc +lat_1=30 +lat_2=60 +lat_0=40 +lon_0=-97 +x_0=0 +y_0=0 +a=6370000 +b=6370000 +units=m +no_defs" ;
		RAINRATE:missing_value = -9999.f ;
		RAINRATE:valid_range = 0., 100. ;
		RAINRATE:standard_name = "precipitation_flux" ;
		RAINRATE:long_name = "Surface Precipitation Rate" ;
		RAINRATE:units = "mm s^-1" ;
		RAINRATE:_FillValue = -9999.f ;
	int SWDOWN(time, y, x) ;
		SWDOWN:cell_methods = "time: point" ;
		SWDOWN:remap = "remapped via ESMF regrid_with_weights: Bilinear" ;
		SWDOWN:esri_pe_string = "PROJCS[\"Sphere_Lambert_Conformal_Conic\",GEOGCS[\"GCS_Sphere\",DATUM[\"D_Sphere\",SPHEROID[\"Sphere\",6370000.0,0.0]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Lambert_Conformal_Conic\"],PARAMETER[\"false_easting\",0.0],PARAMETER[\"false_northing\",0.0],PARAMETER[\"central_meridian\",-97.0],PARAMETER[\"standard_parallel_1\",30.0],PARAMETER[\"standard_parallel_2\",60.0],PARAMETER[\"latitude_of_origin\",40.0000076294],UNIT[\"Meter\",1.0]];-35691800 -29075200 126180232.640845;-100000 10000;-100000 10000;0.001;0.001;0.001;IsHighPrecision" ;
		SWDOWN:grid_mapping = "ProjectionCoordinateSystem" ;
		SWDOWN:proj4 = "+proj=lcc +lat_1=30 +lat_2=60 +lat_0=40 +lon_0=-97 +x_0=0 +y_0=0 +a=6370000 +b=6370000 +units=m +no_defs" ;
		SWDOWN:missing_value = -9999000 ;
		SWDOWN:valid_range = 0., 5000000. ;
		SWDOWN:add_offset = 0. ;
		SWDOWN:scale_factor = 0.001 ;
		SWDOWN:standard_name = "surface_downward_shortwave_flux" ;
		SWDOWN:long_name = "Surface downward short-wave radiation flux" ;
		SWDOWN:units = "W m-2" ;
		SWDOWN:_FillValue = -9999000 ;

// global attributes:
		:model_initialization_time = "2018-05-26_08:00:00" ;
		:model_output_valid_time = "2018-05-26_09:00:00" ;
}

Gauge (vector) NetCDF medium-range forecast output

netcdf nwm.t06z.medium_range.channel_rt_3.f015.conus {
dimensions:
	feature_id = 2729077 ;
	time = UNLIMITED ; // (1 currently)
	reference_time = 1 ;
variables:
	int time(time) ;
		time:long_name = "valid output time" ;
		time:standard_name = "time" ;
		time:units = "minutes since 1970-01-01 00:00:00 UTC" ;
		time:valid_min = 25589340 ;
		time:valid_max = 25601400 ;
	int reference_time(reference_time) ;
		reference_time:long_name = "model initialization time" ;
		reference_time:standard_name = "forecast_reference_time" ;
		reference_time:units = "minutes since 1970-01-01 00:00:00 UTC" ;
	char crs ;
		crs:transform_name = "latitude longitude" ;
		crs:grid_mapping_name = "latitude longitude" ;
		crs:esri_pe_string = "GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]];-400 -400 1000000000;-100000 10000;-100000 10000;8.98315284119521E-09;0.001;0.001;IsHighPrecision" ;
		crs:spatial_ref = "GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]];-400 -400 1000000000;-100000 10000;-100000 10000;8.98315284119521E-09;0.001;0.001;IsHighPrecision" ;
		crs:long_name = "CRS definition" ;
		crs:longitude_of_prime_meridian = 0.f ;
		crs:_CoordinateAxes = "latitude longitude" ;
		crs:semi_major_axis = 6378137.f ;
		crs:semi_minor_axis = 6356752.f ;
		crs:inverse_flattening = 298.2572f ;
	int feature_id(feature_id) ;
		feature_id:long_name = "Reach ID" ;
		feature_id:comment = "Gage Points Specified by User in Routelink file" ;
		feature_id:cf_role = "timeseries_id" ;
	int order(feature_id) ;
		order:long_name = "Streamflow Order" ;
		order:standard_name = "order" ;
	float elevation(feature_id) ;
		elevation:long_name = "Feature Elevation" ;
		elevation:standard_name = "Elevation" ;
		elevation:units = "meters" ;
	int streamflow(feature_id) ;
		streamflow:long_name = "River Flow" ;
		streamflow:units = "m3 s-1" ;
		streamflow:coordinates = "latitude longitude" ;
		streamflow:grid_mapping = "crs" ;
		streamflow:_FillValue = -999900 ;
		streamflow:missing_value = -999900 ;
		streamflow:scale_factor = 0.01f ;
		streamflow:add_offset = 0.f ;
		streamflow:valid_range = 0, 50000000 ;
	int nudge(feature_id) ;
		nudge:long_name = "Amount of stream flow alteration" ;
		nudge:units = "m3 s-1" ;
		nudge:coordinates = "latitude longitude" ;
		nudge:grid_mapping = "crs" ;
		nudge:_FillValue = -999900 ;
		nudge:missing_value = -999900 ;
		nudge:scale_factor = 0.01f ;
		nudge:add_offset = 0.f ;
		nudge:valid_range = -50000000, 50000000 ;
	int velocity(feature_id) ;
		velocity:long_name = "River Velocity" ;
		velocity:units = "ms-1" ;
		velocity:coordinates = "latitude longitude" ;
		velocity:grid_mapping = "crs" ;
		velocity:_FillValue = -999900 ;
		velocity:missing_value = -999900 ;
		velocity:scale_factor = 0.01f ;
		velocity:add_offset = 0.f ;
		velocity:valid_range = 0, 50000000 ;

// global attributes:
		:featureType = "timeSeries" ;
		:proj4 = "+proj=lcc +units=m +a=6370000.0 +b=6370000.0 +lat_1=30.0 +lat_2=60.0 +lat_0=40.0 +lon_0=-97.0 +x_0=0 +y_0=0 +k_0=1.0 +nadgrids=@" ;
		:model_initialization_time = "2018-08-27_06:00:00" ;
		:station_dimension = "feature_id" ;
		:model_output_valid_time = "2018-08-27_21:00:00" ;
		:model_total_valid_times = 68 ;
		:stream_order_output = 1 ;
		:cdm_datatype = "Station" ;
		:Conventions = "CF-1.6" ;
		:code_version = "v5.1.0-alpha6" ;
		:NWM_version_number = "v2.0" ;
		:model_output_type = "channel_rt" ;
		:model_configuration = "medium_range" ;
		:dev_OVRTSWCRT = 1 ;
		:dev_NOAH_TIMESTEP = 3600 ;
		:dev_channel_only = 0 ;
		:dev_channelBucket_only = 0 ;
		:dev = "dev_ prefix indicates development/internal meta data" ;
		:ensemble_member_number = "3" ;
}
Clone this wiki locally