Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 16 additions & 16 deletions .cirrus.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,22 +33,22 @@ env:

#
# Linting
# [2021-03-01] jamesp: Currently not black or flake compliant.
# GitHub issues open #251 and #252
# lint_task:
# auto_cancellation: true
# name: "${CIRRUS_OS}: flake8 and black"
# pip_cache:
# folder: ~/.cache/pip
# fingerprint_script:
# - echo "${CIRRUS_TASK_NAME}"
# - echo "$(date +%Y).$(expr $(date +%U) / ${CACHE_PERIOD}):${PIP_CACHE_BUILD} ${PIP_CACHE_PACKAGES}"
# lint_script:
# - pip list
# - python -m pip install --retries 3 --upgrade ${PIP_CACHE_PACKAGES}
# - pip list
# - nox --session flake8
# - nox --session black
# [2021-03-01] jamesp: Currently not black compliant.
# GitHub issue open #251
lint_task:
auto_cancellation: true
name: "${CIRRUS_OS}: flake8" # and black
pip_cache:
folder: ~/.cache/pip
fingerprint_script:
- echo "${CIRRUS_TASK_NAME}"
- echo "$(date +%Y).$(expr $(date +%U) / ${CACHE_PERIOD}):${PIP_CACHE_BUILD} ${PIP_CACHE_PACKAGES}"
lint_script:
- pip list
- python -m pip install --retries 3 --upgrade ${PIP_CACHE_PACKAGES}
- pip list
- nox --session flake8
# - nox --session black


#
Expand Down
4 changes: 4 additions & 0 deletions .flake8
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[flake8]
exclude =
# Auto-generated file
iris_grib/_grib_cf_map.py
3 changes: 1 addition & 2 deletions iris_grib/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@

import datetime
import math # for fmod
import warnings

import cartopy.crs as ccrs
import cf_units
Expand All @@ -21,7 +20,7 @@
import numpy.ma as ma

# NOTE: careful here, to avoid circular imports (as iris imports grib)
import iris
import iris # noqa: F401
from iris._lazy_data import as_lazy_data
import iris.coord_systems as coord_systems
from iris.exceptions import TranslationError, NotYetImplementedError
Expand Down
263 changes: 188 additions & 75 deletions iris_grib/_grib1_load_rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,13 @@
# Historically this was auto-generated from
# SciTools/iris-code-generators:tools/gen_rules.py

import warnings

from cf_units import CALENDAR_GREGORIAN, Unit
import numpy as np

from iris.aux_factory import HybridPressureFactory
from iris.coords import AuxCoord, CellMethod, DimCoord
from iris.exceptions import TranslationError
from iris.fileformats.rules import (ConversionMetadata, Factory, Reference,
ReferenceTarget)
from iris.fileformats.rules import (ConversionMetadata, Factory, Reference)


def grib1_convert(grib):
Expand Down Expand Up @@ -47,50 +44,82 @@ def grib1_convert(grib):
dim_coords_and_dims = []
aux_coords_and_dims = []

if \
(grib.gridType=="reduced_gg"):
aux_coords_and_dims.append((AuxCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 0))
aux_coords_and_dims.append((AuxCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system), 0))

if \
(grib.gridType=="regular_ll") and \
(grib.jPointsAreConsecutive == 0):
dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 0))
dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 1))

if \
(grib.gridType=="regular_ll") and \
(grib.jPointsAreConsecutive == 1):
dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 1))
dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 0))

if \
(grib.gridType=="regular_gg") and \
(grib.jPointsAreConsecutive == 0):
dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 0))
dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 1))

if \
(grib.gridType=="regular_gg") and \
(grib.jPointsAreConsecutive == 1):
dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 1))
dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 0))

if \
(grib.gridType=="rotated_ll") and \
(grib.jPointsAreConsecutive == 0):
dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 0))
dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 1))

if \
(grib.gridType=="rotated_ll") and \
(grib.jPointsAreConsecutive == 1):
dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units='degrees', coord_system=grib._coord_system), 1))
dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units='degrees', coord_system=grib._coord_system, circular=grib._x_circular), 0))

if grib.gridType in ["polar_stereographic", "lambert"]:
dim_coords_and_dims.append((DimCoord(grib._y_points, grib._y_coord_name, units="m", coord_system=grib._coord_system), 0))
dim_coords_and_dims.append((DimCoord(grib._x_points, grib._x_coord_name, units="m", coord_system=grib._coord_system), 1))
if grib.gridType == "reduced_gg":
aux_coords_and_dims.append(
(
AuxCoord(
grib._y_points,
grib._y_coord_name,
units='degrees',
coord_system=grib._coord_system,
),
0
)
)
aux_coords_and_dims.append(
(
AuxCoord(
grib._x_points,
grib._x_coord_name,
units='degrees',
coord_system=grib._coord_system,
),
0
)
)
elif grib.gridType in ("regular_ll", "rotated_ll", "regular_gg"):
j_points_are_consecutive = grib.jPointsAreConsecutive

if j_points_are_consecutive not in (0, 1):
raise ValueError

dim_coords_and_dims.append(
(
DimCoord(
grib._y_points,
grib._y_coord_name,
units='degrees',
coord_system=grib._coord_system,
),
j_points_are_consecutive
)
)
dim_coords_and_dims.append(
(
DimCoord(
grib._x_points,
grib._x_coord_name,
units='degrees',
coord_system=grib._coord_system,
circular=grib._x_circular,
),
int(not(j_points_are_consecutive))
)
)

elif grib.gridType in ["polar_stereographic", "lambert"]:
dim_coords_and_dims.append(
(
DimCoord(
grib._y_points,
grib._y_coord_name,
units="m",
coord_system=grib._coord_system,
),
0
)
)
dim_coords_and_dims.append(
(
DimCoord(
grib._x_points,
grib._x_coord_name,
units="m",
coord_system=grib._coord_system,
),
1
)
)

if \
(grib.table2Version < 128) and \
Expand Down Expand Up @@ -122,19 +151,38 @@ def grib1_convert(grib):
if \
(grib.table2Version >= 128) and \
(grib._cf_data is None):
long_name = "UNKNOWN LOCAL PARAM " + str(grib.indicatorOfParameter) + "." + str(grib.table2Version)
long_name = f"UNKNOWN LOCAL PARAM {grib.indicatorOfParameter}"\
f".{grib.table2Version}"
units = "???"

if \
(grib.table2Version == 1) and \
(grib.indicatorOfParameter >= 128):
long_name = "UNKNOWN LOCAL PARAM " + str(grib.indicatorOfParameter) + "." + str(grib.table2Version)
long_name = f"UNKNOWN LOCAL PARAM {grib.indicatorOfParameter}"\
f".{grib.table2Version}"
units = "???"

if \
(grib._phenomenonDateTime != -1.0):
aux_coords_and_dims.append((DimCoord(points=grib.startStep, standard_name='forecast_period', units=grib._forecastTimeUnit), None))
aux_coords_and_dims.append((DimCoord(points=grib.phenomenon_points('hours'), standard_name='time', units=Unit('hours since epoch', CALENDAR_GREGORIAN)), None))
if grib._phenomenonDateTime != -1.0:
aux_coords_and_dims.append(
(
DimCoord(
points=grib.startStep,
standard_name='forecast_period',
units=grib._forecastTimeUnit,
),
None
)
)
aux_coords_and_dims.append(
(
DimCoord(
points=grib.phenomenon_points('hours'),
standard_name='time',
units=Unit('hours since epoch', CALENDAR_GREGORIAN),
),
None
)
)

def add_bounded_time_coords(aux_coords_and_dims, grib):
t_bounds = grib.phenomenon_bounds('hours')
Expand Down Expand Up @@ -222,29 +270,94 @@ def add_bounded_time_coords(aux_coords_and_dims, grib):
add_bounded_time_coords(aux_coords_and_dims, grib)
cell_methods.append(CellMethod("standard_deviation", coords="time"))

if \
(grib.levelType == 'pl'):
aux_coords_and_dims.append((DimCoord(points=grib.level, long_name="pressure", units="hPa"), None))

if \
(grib.levelType == 'sfc'):

if (grib._cf_data is not None) and \
(grib._cf_data.set_height is not None):
aux_coords_and_dims.append((DimCoord(points=grib._cf_data.set_height, long_name="height", units="m", attributes={'positive':'up'}), None))
elif grib.typeOfLevel == 'heightAboveGround': # required for NCAR
aux_coords_and_dims.append((DimCoord(points=grib.level, long_name="height", units="m", attributes={'positive':'up'}), None))

if \
(grib.levelType == 'ml') and \
(hasattr(grib, 'pv')):
aux_coords_and_dims.append((AuxCoord(grib.level, standard_name='model_level_number', units=1, attributes={'positive': 'up'}), None))
aux_coords_and_dims.append((DimCoord(grib.pv[grib.level], long_name='level_pressure', units='Pa'), None))
aux_coords_and_dims.append((AuxCoord(grib.pv[grib.numberOfCoordinatesValues//2 + grib.level], long_name='sigma', units=1), None))
factories.append(Factory(HybridPressureFactory, [{'long_name': 'level_pressure'}, {'long_name': 'sigma'}, Reference('surface_pressure')]))
if grib.levelType == 'pl':
aux_coords_and_dims.append(
(
DimCoord(
points=grib.level, long_name="pressure", units="hPa"
),
None
)
)

if grib.levelType == 'sfc':
if grib._cf_data is not None and grib._cf_data.set_height is not None:
aux_coords_and_dims.append(
(
DimCoord(
points=grib._cf_data.set_height,
long_name="height",
units="m",
attributes={'positive': 'up'},
),
None
)
)
elif grib.typeOfLevel == 'heightAboveGround': # required for NCAR
aux_coords_and_dims.append(
(
DimCoord(
points=grib.level,
long_name="height",
units="m",
attributes={'positive': 'up'},
),
None
)
)

if grib.levelType == 'ml' and hasattr(grib, 'pv'):
aux_coords_and_dims.append(
(
AuxCoord(
grib.level,
standard_name='model_level_number',
units=1,
attributes={'positive': 'up'},
),
None
)
)
aux_coords_and_dims.append(
(
DimCoord(
grib.pv[grib.level], long_name='level_pressure', units='Pa'
),
None
)
)
aux_coords_and_dims.append(
(
AuxCoord(
grib.pv[grib.numberOfCoordinatesValues//2 + grib.level],
long_name='sigma',
units=1,
),
None
)
)
factories.append(
Factory(
HybridPressureFactory,
[
{'long_name': 'level_pressure'},
{'long_name': 'sigma'},
Reference('surface_pressure'),
]
)
)

if grib._originatingCentre != 'unknown':
aux_coords_and_dims.append((AuxCoord(points=grib._originatingCentre, long_name='originating_centre', units='no_unit'), None))
aux_coords_and_dims.append(
(
AuxCoord(
points=grib._originatingCentre,
long_name='originating_centre',
units='no_unit',
),
None
)
)

return ConversionMetadata(factories, references, standard_name, long_name,
units, attributes, cell_methods,
Expand Down
2 changes: 1 addition & 1 deletion iris_grib/_load_convert.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import warnings

import cartopy.crs as ccrs
from cf_units import CALENDAR_GREGORIAN, date2num, Unit
from cf_units import CALENDAR_GREGORIAN, Unit
import numpy as np
import numpy.ma as ma

Expand Down
3 changes: 1 addition & 2 deletions iris_grib/_save_rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import gribapi
import numpy as np
import numpy.ma as ma
import cartopy.crs as ccrs

import iris
from iris.aux_factory import HybridHeightFactory, HybridPressureFactory
Expand Down Expand Up @@ -706,7 +705,7 @@ def set_discipline_and_parameter(cube, grib):
category = gc.category
number = gc.number
identity_found = True
except:
except Exception:
pass

if not identity_found:
Expand Down
Loading