iris-grib icon indicating copy to clipboard operation
iris-grib copied to clipboard

typeOfFirstFixedSurface decode issues

Open ColemanTom opened this issue 1 year ago • 3 comments

I am having issues with fields with typeOfFirstFixedSurface=101, they are not decoding correctly.

I have attached a file, a.zip, which contains a grib2 file to assist in debugging/testing.

With iris-grib v0.18.0, printing this cube out, I get

air_pressure_at_sea_level / (Pa)    (latitude: 42; longitude: 28)
    Dimension coordinates:
        latitude                             x              -
        longitude                            -              x
    Scalar coordinates:
        forecast_period             12 hours
        forecast_reference_time     2019-04-05 00:00:00
        time                        2019-04-05 12:00:00
    Attributes:
        GRIB_PARAM                  GRIB2:d000c003n001

Printing the same cube out with iris-grib v0.19.0, I get

air_pressure_at_sea_level / (Pa)    (latitude: 42; longitude: 28)
    Dimension coordinates:
        latitude                             x              -
        longitude                            -              x
    Scalar coordinates:
        forecast_period             12 hours
        forecast_reference_time     2019-04-05 00:00:00
        time                        2019-04-05 12:00:00
        unknown                     0.0
    Attributes:
        GRIB_PARAM                  GRIB2:d000c003n001

See the new "unknown" attribute.

I'm guessing this relates to changes in the _load_convert.py file, but I've not been able to quickly come up with a solution.

ColemanTom avatar Jan 10 '24 04:01 ColemanTom

Hi @ColemanTom, thanks for getting in touch, and thanks for including an example file which always help isolate things faster.

You're right that _load_convert.py was recently changed to load any fixed surface, even if not fully supported - #318. This has allowed iris-grib to load many more coordinates than previously, even if we have never seen them before, or have not coded for them due to difficulties representing them within CF.

The two fixed surfaces that iris-grib fully recognises are these:

https://github.com/SciTools/iris-grib/blob/831ea257d82c3f0d7ec6a840f57654de9979b0a6/iris_grib/_load_convert.py#L96-L100

Everything else will be loaded with no standard_name, long_name, or units, which leads to them being shown as unknown on a Cube printout.

We can potentially add to the above _FIXED_SURFACE dictionary with help from our users. A combination of limited test cases and under-specified GRIB documentation means we usually need someone downstream to tell us if a change is delivering the desired effect. If you think you can help, by all means make a suggestion or even a pull request ❤

trexfeathers avatar Jan 12 '24 15:01 trexfeathers

Could it be a bit smarter perhaps? For example, pseudocode

surface = _FIXED_SURFACE.get(typeOfFixedSurface, deriveFixedSurface(grib_message_gid))

...
def deriveFixedSurface(gid):
    long_name = codes_get_string(gid, 'nameOfFirstFixedSurface').replace(' ', '_').lower()
    short_name = codes_get_string(gid', 'typeOfFirstFixedSurface').replace(' ', '_').lower()
    unit = codes_get_string(gid, 'unitOfFirstFixedSurface')
    return FixedSurface(short_name, long_name, unit)

Obviously, I've hardcoded First in the example method, but is that sort of what is trying to be accomplished?

Default to the custom defined ones (else you would have isobaric_surface for pressure for example.

ColemanTom avatar Jan 15 '24 00:01 ColemanTom

With the long_name potentially. However Iris's data model is based on the CF Conventions, which define many aspects of what is valid, including standard_name, and units. It is likely that taking these directly from the GRIB file will mostly result in ValueErrors when trying to create Cubes or Coords with what are considered to be invalid inputs.

We so far don't have a sophisticated way to translate from GRIB to CF, other than rote-translation (as well as the table above, we have _grib_cf_map.py for many more examples). This is obviously more clunky, but the best way to fit GRIB to the CF data model.

trexfeathers avatar Jan 15 '24 09:01 trexfeathers