NCAS-CMS / NCAS-CMS/cf-python

Most construct data wiped when unary operator taken of field

Open
#797 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug
Dominant language
Python
Stars
150
Forks
23
Avg merge
1d 11h
Merged PRs (30d)
2

Description

Here's a funky one for the end of the working week! When taking the additive inverse i.e. negative of a field, the additive inverse of the (field) data is correctly taken but it results, as an unintended side effect, in all of the data for the metadata constructs being wiped, somehow (no time to investigate until next week, and I won't speculate quite how this even happens!). Note that an operation of -f shows this bug but -1*f does not, which implies it is likely an issue with the setup/logic of the - operator on a field.

Quick examples:

>>> f = cf.example_fields()
>>> print(f[0].data)  # all good
[[0.007, ..., 0.013]] 1
>>> print(-f[0].data)  # all good
[[-0.007, ..., -0.013]] 1
>>> print(-f[0])  # not all good - see the dim coords
Field: specific_humidity (ncvar%q)
----------------------------------
Data            : specific_humidity(latitude(5), longitude(8)) 1
Cell methods    : area: mean
Dimension coords: latitude(5) = 
                : longitude(8) = 
                : time(1) = 
>>> print(-1*f[0])  # also all good
Field: specific_humidity (ncvar%q)
----------------------------------
Data            : specific_humidity(latitude(5), longitude(8)) 1
Cell methods    : area: mean
Dimension coords: latitude(5) = [-75.0, ..., 75.0] degrees_north
                : longitude(8) = [22.5, ..., 337.5] degrees_east
                : time(1) = [2019-01-01 00:00:00]
>>>
>>> print(-f[1])  # note from this result that other constructs are affected too
Field: air_temperature (ncvar%ta)
---------------------------------
Data            : air_temperature(atmosphere_hybrid_height_coordinate(1), grid_latitude(10), grid_longitude(9)) K
Cell methods    : grid_latitude(10): grid_longitude(9): mean where land (interval: 0.1 degrees) time(1): maximum
Field ancils    : air_temperature standard_error
Dimension coords: atmosphere_hybrid_height_coordinate(1) = 
                : grid_latitude(10) = 
                : grid_longitude(9) = 
                : time(1) = 
Auxiliary coords: latitude
                : longitude
                : long_name=Grid latitude name
Cell measures   : measure:area
Coord references: grid_mapping_name:rotated_latitude_longitude
                : standard_name:atmosphere_hybrid_height_coordinate
Domain ancils   : atmosphere_hybrid_height_coordinate
                : ncvar%b
                : surface_altitude

I noticed this during working through issues in the cf-plot basic test suite, whereby a call to cfp.vect(u=c, v=-g) was failing with the error AttributeError: DimensionCoordinate has no data due to the underlying issue whereby the - operation is taken for the field input as the v argument. Which indicates it is more than a representational issue (i.e. the data is missing from the printed output), but I am yet to explore further.

Environment

Using the main branch:

>>> cf.environment()
Platform: Linux-6.5.13-7-MANJARO-x86_64-with-glibc2.39 
HDF5 library: 1.14.2 
netcdf library: 4.9.2 
udunits2 library: /home/slb93/miniconda3/envs/cf-env-312/lib/libudunits2.so.0 
esmpy/ESMF: 8.4.2 /home/slb93/miniconda3/envs/cf-env-312/lib/python3.12/site-packages/esmpy/__init__.py
Python: 3.12.0 /home/slb93/miniconda3/envs/cf-env-312/bin/python
dask: 2024.7.0 /home/slb93/miniconda3/envs/cf-env-312/lib/python3.12/site-packages/dask/__init__.py
netCDF4: 1.6.5 /home/slb93/miniconda3/envs/cf-env-312/lib/python3.12/site-packages/netCDF4/__init__.py
psutil: 5.9.5 /home/slb93/miniconda3/envs/cf-env-312/lib/python3.12/site-packages/psutil/__init__.py
packaging: 23.2 /home/slb93/miniconda3/envs/cf-env-312/lib/python3.12/site-packages/packaging/__init__.py
numpy: 1.26.4 /home/slb93/miniconda3/envs/cf-env-312/lib/python3.12/site-packages/numpy/__init__.py
scipy: 1.11.3 /home/slb93/miniconda3/envs/cf-env-312/lib/python3.12/site-packages/scipy/__init__.py
matplotlib: 3.8.0 /home/slb93/miniconda3/envs/cf-env-312/lib/python3.12/site-packages/matplotlib/__init__.py
cftime: 1.6.2 /home/slb93/miniconda3/envs/cf-env-312/lib/python3.12/site-packages/cftime/__init__.py
cfunits: 3.3.7 /home/slb93/miniconda3/envs/cf-env-312/lib/python3.12/site-packages/cfunits/__init__.py
cfplot: 3.3.0 /home/slb93/git-repos/cf-plot/cfplot/__init__.py
cfdm: 1.11.1.0 /home/slb93/git-repos/cfdm/cfdm/__init__.py
cf: 3.16.2 /home/slb93/git-repos/cf-python/cf/__init__.py

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reproducing the issue with cf.example_fields() and unary negation of a field, comparing -f[0] with -1*f[0]. Trace the Field unary minus entry point and check why metadata construct data is cleared; the fix is complete when constructs retain their data and the cf-plot cfp.vect(u=c, v=-g) case no longer raises AttributeError.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
data
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.