Model output
The OpenIFS model outputs files in GRIB format. These files are a mix of GRIB 1 & GRIB 2 format messages. They also contain multiple vertical coordinates: pressure levels, sub-surface levels etc as well as fields on reduced Gaussian grids which causes a problem with some 3rd party tools as the same GRIB variable code is used for each axis. The instructions below show how to work around this.
The ICMGG files contain all the gridpoint fields. The ICMSH files are the spherical harmonics of the wind fields, pressure and temperature.
Visualizing model output is under development. The instructions below are a temporary solution allowing users to convert to netCDF for their favourite plotting program.
Forthcoming OpenIFS releases will provide additional software to analyse and view model output more easily without the need to modify the GRIB output files.
CDO commands
These instructions assume the use of a recent version of Climate Data Operators (CDO) (available from Max-Planck-Institut, Germany).
CDO supports GRIB2 but needs the GRIB_API library from ECMWF in order to succeed. If you find the CDO command below do not work, you can either build CDO yourself, making sure grib_api is used, or you can use a workaround. In order to work around this, use the grib_set command (from the grib_api installation) to change the GRIB edition number for all messages. Note this will only work if you are using less than 128 model levels and it does not actually convert the message to GRIB1.
grib_set -s editionNumber=1 <input grib2 file> <output grib1 file>
CDO can be used to interpolate from the reduced Gaussian grid to a regular Gaussian grid (model resolutions T21 & T42 use a regular Gaussian grid)
cdo -R copy <input grib> <output grib>
Before converting to netCDF separate the different vertical axes:
cdo splitzaxis <input file> <output file>
Then finally convert the resulting output files to netcdf. The -t option tells CDO to use the predefined ECMWF parameter tables (see CDO documentation for more details). Without this option parameter names are not preserved. If the - t option doesn't work this is usually because CDO is using an old version of the ECMWF GRIB_API software.
cdo -t ecmwf -f nc copy <input grib> <output netcdf>
If you prefer wind components u & v instead of vorticity and divergence, use the cdo command:
cdo -t ecmwf dv2uvl <input file> <output file>
To interpolate to pressure levels instead of model levels, use this cdo command for example:
cdo -t ecmwf ml2pl,92500,85000,50000,20000 <input file> <output file>
There are various commands for inspecting the contents of a GRIB file. The GRIB_API installation as part of OpenIFS has useful commands like grib_ls
and grib_dump
. Here is another example using the cdo command:
$ cdo sinfo ICMSHfrq2+000000.grb File format: GRIB -1 : Institut Source Param Time Typ Grid Size Num Levels Num 1 : ECMWF unknown 11.3 var P16 65792 1 60 1 2 : ECMWF unknown 39.3 var P16 65792 1 60 1 3 : ECMWF unknown 43.3 var P16 65792 1 60 1 4 : ECMWF unknown 44.3 var P16 65792 1 60 1 5 : ECMWF unknown 152.128 var P16 65792 1 1 2 6 : ECMWF unknown 6.3 var P16 65792 1 1 2 Horizontal grids : 1 : spectral > size : dim = 65792 truncation = 255 spc = 32896 complexPacking = 1 Vertical grids : 1 : hybrid level : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 2 : hybrid level : 1 Time axis : 1 step RefTime = 1999-12-24 12:00:00 Units = hours Calendar = PROLEPTIC YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss 1999-12-24 12:00:00 cdo sinfo: Processed 6 variables over 1 timestep. ( 0.04s )
Example 1
The following script shows how to loop over several output files using the steps above to convert to netCDF:
for i in 000 024 048 072 do grib_set -s editionNumber=1 ICMGGfpp4+000${i} ICMGGfpp4+000${i}.grb cdo -R copy ICMGGfpp4+000${i}.grb ICMGGfpp4+000${i}_R.grb cdo splitzaxis ICMGGfpp4+000${i}_R.grb ICMGGfpp4+000${i} cdo -t ecmwf -f nc copy ICMGGfpp4+000${i}01.grb ICMGGfpp4+000${i}_PLGG.nc cdo -t ecmwf -f nc copy ICMGGfpp4+000${i}02.grb ICMGGfpp4+000${i}_MLGG.nc grib_set -s editionNumber=1 ICMSHfpp4+000${i} ICMSHfpp4+000${i}.grb cdo splitzaxis ICMSHfpp4+000${i}.grb ICMSHfpp4+000${i} cdo sp2gpl ICMSHfpp4+000${i}01.grb ICMSHfpp4+000${i}01_GP.grb cdo sp2gpl ICMSHfpp4+000${i}03.grb ICMSHfpp4+000${i}03_GP.grb cdo sp2gpl ICMSHfpp4+000${i}04.grb ICMSHfpp4+000${i}04_GP.grb cdo -t ecmwf -f nc copy ICMSHfpp4+000${i}03_GP.grb ICMSHfpp4+000${i}_ML.nc cdo -t ecmwf -f nc copy ICMSHfpp4+000${i}01_GP.grb ICMSHfpp4+000${i}_PL.nc cdo -t ecmwf -f nc copy ICMSHfpp4+000${i}04_GP.grb ICMSHfpp4+000${i}_surf.nc done
Note the spherical harmonic files are also converted but the extra command using the sp2gpl operator is first used to convert the variables from spherical harmonics to gridpoint.
Example 2
In this example a single GRIB file with model level data, on a regular Gaussian grid is converted to netCDF with vorticity & divergence replaced by u & v and model level data interpolated to pressure levels.
grib_set -s editionNumber=1 file file.grb cdo -t ecmwf -f nc copy file.grb file.nc cdo -t ecmwf dv2uvl file.nc file_uv.nc cdo -t ecmwf sp2gpl file_uv.nc file_uv_gg.nc cdo -t ecmwf ml2pl,92500,85000,50000,20000 file_uv_gg.nc file_uv_gg_pl.nc