Skip to content

Commit

Permalink
Add option to set generatingProcessIdentifier when writing GRIB data
Browse files Browse the repository at this point in the history
  • Loading branch information
sandorkertesz committed Jan 9, 2024
1 parent 2df9f5b commit 7fcdf5a
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 27 deletions.
7 changes: 1 addition & 6 deletions earthkit/data/readers/grib/codes.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,15 +219,10 @@ def get_longitudes(self, dtype=None):
def get_data_points(self):
return eccodes.codes_grib_get_data(self._handle)

def set_values(self, values, generating_proc_id=None):
def set_values(self, values):
try:
assert self.path is None, "Only cloned handles can have values changed"
eccodes.codes_set_values(self._handle, values.flatten())
# For ECMWF gribs: indicates that something has been modified (255=unknown)
if generating_proc_id is not None:
eccodes.codes_set_long(
self._handle, "generatingProcessIdentifier", generating_proc_id
)
except Exception as e:
LOG.error("Error setting values")
LOG.exception(e)
Expand Down
5 changes: 4 additions & 1 deletion earthkit/data/readers/grib/output.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,12 +123,15 @@ def write(
k: v for k, v in sorted(metadata.items(), key=lambda x: order(x[0]))
}

if "generatingProcessIdentifier" not in metadata:
metadata["generatingProcessIdentifier"] = 255

LOG.debug("GribOutput.metadata %s", metadata)

for k, v in metadata.items():
handle.set(k, v)

handle.set_values(values, generating_proc_id=255)
handle.set_values(values)

file, path = self.f(handle)
handle.write(file)
Expand Down
8 changes: 2 additions & 6 deletions earthkit/data/writers/grib.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
class GribWriter(Writer):
DATA_FORMAT = "grib"

def write(self, f, values, metadata, check_nans=True, generating_proc_id=None):
def write(self, f, values, metadata, check_nans=True):
r"""Write a GRIB field to a file object.
Parameters
Expand All @@ -26,10 +26,6 @@ def write(self, f, values, metadata, check_nans=True, generating_proc_id=None):
Metadata of the GRIB field/message.
check_nans: bool
Replace nans in ``values`` with GRIB missing values when writing to``f``.
generating_proc_id: int
Set the ``generatingProcessIdentifier`` ecCodes GRIB key
to the specified value when writing to ``f``. When
``None`` no changes are made.
"""
handle = metadata._handle
if check_nans:
Expand All @@ -41,7 +37,7 @@ def write(self, f, values, metadata, check_nans=True, generating_proc_id=None):
handle.set_double("missingValue", missing_value)
handle.set_long("bitmapPresent", 1)

handle.set_values(values, generating_proc_id=generating_proc_id)
handle.set_values(values)
handle.write(f)


Expand Down
19 changes: 5 additions & 14 deletions tests/numpy_fs/test_numpy_fs_write.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,16 +113,7 @@ def test_numpy_fs_grib_write_append():
assert r_tmp.metadata("shortName") == ["msl", "2d"]


@pytest.mark.parametrize(
"_kwargs,expected_value",
[
({}, 150),
({"generating_proc_id": None}, 150),
({"generating_proc_id": 255}, 255),
({"generating_proc_id": 144}, 144),
],
)
def test_numpy_fs_grib_write_generating_proc_id(_kwargs, expected_value):
def test_numpy_fs_grib_write_generating_proc_id():
ds = from_source("file", earthkit_examples_file("test.grib"))

assert ds[0].metadata("shortName") == "2t"
Expand All @@ -132,21 +123,21 @@ def test_numpy_fs_grib_write_generating_proc_id(_kwargs, expected_value):
v2 = v + 2

md = ds[0].metadata()
md1 = md.override(shortName="msl")
md1 = md.override(shortName="msl", generatingProcessIdentifier=255)
md2 = md.override(shortName="2d")

r1 = FieldList.from_numpy([v1, v2], [md1, md2])

# save to disk: using generatingProcessIdentifier=255 (default)
with temp_file() as tmp:
r1.save(tmp, **_kwargs)
r1.save(tmp)
assert os.path.exists(tmp)
r_tmp = from_source("file", tmp)
assert len(r_tmp) == 2
assert r_tmp.metadata("shortName") == ["msl", "2d"]
assert r_tmp.metadata("generatingProcessIdentifier") == [
expected_value,
expected_value,
255,
150,
]


Expand Down

0 comments on commit 7fcdf5a

Please sign in to comment.