cerfacs-globc / icclim

icclim: Python library for climate indices and climate indicators calculation.
https://icclim.readthedocs.io/en/latest/
Apache License 2.0
80 stars 32 forks source link

Cannot convert from 'centimeter' ([length]) to 'millimeter / second' ([length] / [time]) #320

Open evasinha opened 4 weeks ago

evasinha commented 4 weeks ago

Description

For calculating indexes using SNOW, icclim was giving the error errors.DimensionalityError: Cannot convert from 'centimeter' ([length]) to 'millimeter / second' ([length] / [time])

SNOW is the unit if mm/s in my input files.

Minimal reproducible example

snow_depth = icclim.SD(in_files=listOfFileNames, slice_mode='year')

Output received

2024-08-13 13:43:18,425 --- icclim 5.4.0
2024-08-13 13:43:18,425 --- BEGIN EXECUTION
2024-08-13 13:43:18,425 Processing: 0%
2024-08-13 13:43:59,941 Calculating climate index: SD1
/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/xclim/core/cfchecks.py:48: UserWarning: Variable does not have a `standard_name` attribute.
  check_valid(vardata, "standard_name", data["standard_name"])
/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/xclim/core/units.py:729: UserWarning: Data units millimeter / second are not compatible with requested [length].
  check_units(val, bound_units.arguments.get(name, None))
Traceback (most recent call last):
  File "/qfs/people/sinh210/wrk/E3SM_SFA/E3SM-GCAM-GMD-2023/workflow/icclim/icclim_ELM.py", line 144, in <module>
    icclim.index(index_name             = key,
  File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/icclim/main.py", line 290, in index
    result_ds = _compute_standard_climate_index(
  File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/icclim/main.py", line 446, in _compute_standard_climate_index
    result_da, percentiles_da = compute()
  File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/icclim/main.py", line 414, in compute
    res = climate_index.compute(conf)
  File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/icclim/ecad/ecad_indices.py", line 412, in <lambda>
    compute=lambda c: sd1(c),
  File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/icclim/ecad/ecad_functions.py", line 398, in sd1
    result = land.snow_cover_duration(
  File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/xclim/core/indicator.py", line 838, in __call__
    outs = self.compute(**compute_das, **kwargs, **var_kwargs)
  File "<boltons.funcutils.FunctionBuilder-31>", line 2, in snow_cover_duration
  File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/xclim/core/units.py", line 731, in wrapper
    out = func(*args, **kwargs)
  File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/xclim/indices/_threshold.py", line 1461, in snow_cover_duration
    thresh = convert_units_to(thresh, snd)
  File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/xclim/core/units.py", line 302, in convert_units_to
    return q.to(tu).m
  File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/pint/quantity.py", line 716, in to
    magnitude = self._convert_magnitude_not_inplace(other, *contexts, **ctx_kwargs)
  File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/pint/quantity.py", line 665, in _convert_magnitude_not_inplace
    return self._REGISTRY.convert(self._magnitude, self._units, other)
  File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/pint/registry.py", line 1044, in convert
    return self._convert(value, src, dst, inplace)
  File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/pint/registry.py", line 1959, in _convert
    return super()._convert(value, src, dst, inplace)
  File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/pint/registry.py", line 1566, in _convert
    return super()._convert(value, src, dst, inplace)
  File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/pint/registry.py", line 1077, in _convert
    raise DimensionalityError(src, dst, src_dim, dst_dim)
pint.errors.DimensionalityError: Cannot convert from 'centimeter' ([length]) to 'millimeter / second' ([length] / [time])
pagecp commented 4 weeks ago

Dear Eva,

The first thing would be to install the latest release of icclim. The current version is icclim 7.0.0.

On Aug 13, 2024, at 10:53 PM, Eva Sinha @.***> wrote:

icclim version: 5.4.0 Python version: 3.9.13 Description

Minimal reproducible example

snow_depth = icclim.SD(in_files=listOfFileNames, slice_mode='year')

Output received

2024-08-13 13:43:18,425 --- icclim 5.4.0 2024-08-13 13:43:18,425 --- BEGIN EXECUTION 2024-08-13 13:43:18,425 Processing: 0% 2024-08-13 13:43:59,941 Calculating climate index: SD1 /qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/xclim/core/cfchecks.py:48: UserWarning: Variable does not have a standard_name attribute. check_valid(vardata, "standard_name", data["standard_name"]) /qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/xclim/core/units.py:729: UserWarning: Data units millimeter / second are not compatible with requested [length]. check_units(val, bound_units.arguments.get(name, None)) Traceback (most recent call last): File "/qfs/people/sinh210/wrk/E3SM_SFA/E3SM-GCAM-GMD-2023/workflow/icclim/icclim_ELM.py", line 144, in icclim.index(index_name = key, File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/icclim/main.py", line 290, in index result_ds = _compute_standard_climate_index( File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/icclim/main.py", line 446, in _compute_standard_climate_index result_da, percentiles_da = compute() File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/icclim/main.py", line 414, in compute res = climate_index.compute(conf) File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/icclim/ecad/ecad_indices.py", line 412, in compute=lambda c: sd1(c), File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/icclim/ecad/ecad_functions.py", line 398, in sd1 result = land.snow_cover_duration( File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/xclim/core/indicator.py", line 838, in call outs = self.compute(compute_das, kwargs, var_kwargs) File "", line 2, in snow_cover_duration File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/xclim/core/units.py", line 731, in wrapper out = func(*args, *kwargs) File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/xclim/indices/_threshold.py", line 1461, in snow_cover_duration thresh = convert_units_to(thresh, snd) File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/xclim/core/units.py", line 302, in convert_units_to return q.to(tu).m File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/pint/quantity.py", line 716, in to magnitude = self._convert_magnitude_not_inplace(other, contexts, ctx_kwargs) File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/pint/quantity.py", line 665, in _convert_magnitude_not_inplace return self._REGISTRY.convert(self._magnitude, self._units, other) File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/pint/registry.py", line 1044, in convert return self._convert(value, src, dst, inplace) File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/pint/registry.py", line 1959, in _convert return super()._convert(value, src, dst, inplace) File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/pint/registry.py", line 1566, in _convert return super()._convert(value, src, dst, inplace) File "/qfs/people/sinh210/.conda/envs/py37/lib/python3.9/site-packages/pint/registry.py", line 1077, in _convert raise DimensionalityError(src, dst, src_dim, dst_dim) pint.errors.DimensionalityError: Cannot convert from 'centimeter' ([length]) to 'millimeter / second' ([length] / [time]) — Reply to this email directly, view it on GitHub https://github.com/cerfacs-globc/icclim/issues/320, or unsubscribe https://github.com/notifications/unsubscribe-auth/ABXZ3SWHYMVHROWXGY567ADZRJW3TAVCNFSM6AAAAABMPBCOYCVHI2DSMVQWIX3LMV43ASLTON2WKOZSGQ3DIMJZHA3TINI. You are receiving this because you are subscribed to this thread.

evasinha commented 4 weeks ago

@pagecp I updated icclim to the latest version (7.0.0) but am still getting the same error message.

pagecp commented 3 weeks ago

@evasinha it seems that your input files have units as a rate and not as a depth (Cannot convert from 'centimeter' ([length]) to 'millimeter / second' ([length] / [time]))

UserWarning: Data units millimeter / second are not compatible with requested [length].
  check_units(val, bound_units.arguments.get(name, None))
pint.errors.DimensionalityError: Cannot convert from 'centimeter' ([length]) to 'millimeter / second' ([length] / [time])