|
26 | 26 | import numpy as np |
27 | 27 | import xarray # type: ignore[import] |
28 | 28 |
|
29 | | -# NOTE: this must exist at runtime too (don’t put it under TYPE_CHECKING) |
30 | 29 | DateLike: TypeAlias = "datetime.datetime | np.datetime64" |
31 | 30 |
|
32 | 31 | ArrayLike: TypeAlias = Any |
33 | 32 |
|
34 | 33 |
|
35 | 34 | def _dispatch_if_xarray(func_name: str, *args: Any, **kwargs: Any) -> Any | None: |
36 | | - """Dispatch to the xarray implementation if any positional argument is xarray.""" |
| 35 | + # Solar functions often take `date` as a scalar and lat/lon as xarray objects. |
| 36 | + # The default dispatch() only checks the first argument, so it would incorrectly |
| 37 | + # select the array backend and drop xarray metadata. This ensures we use the |
| 38 | + # xarray implementation whenever any argument is xarray. |
37 | 39 | if any(_is_xarray(a) for a in args): |
38 | 40 | module = import_module(__name__.rsplit(".", 1)[0] + ".xarray") |
39 | 41 | return getattr(module, func_name)(*args, **kwargs) |
@@ -63,10 +65,10 @@ def julian_day(date): |
63 | 65 |
|
64 | 66 | - :py:meth:`earthkit.meteo.solar.xarray.julian_day` for xarray.DataArray |
65 | 67 | - :py:meth:`earthkit.meteo.solar.array.julian_day` for scalar/array inputs |
66 | | - (including ``numpy.datetime64``) |
67 | 68 |
|
68 | 69 | """ |
69 | | - return dispatch(julian_day, date) |
| 70 | + r = dispatch(julian_day, date) |
| 71 | + return r if r is not None else array.julian_day(date) |
70 | 72 |
|
71 | 73 |
|
72 | 74 | @overload |
@@ -95,10 +97,10 @@ def solar_declination_angle(date): |
95 | 97 |
|
96 | 98 | - :py:meth:`earthkit.meteo.solar.xarray.solar_declination_angle` for xarray.DataArray |
97 | 99 | - :py:meth:`earthkit.meteo.solar.array.solar_declination_angle` for scalar/array inputs |
98 | | - (including ``numpy.datetime64``) |
99 | 100 |
|
100 | 101 | """ |
101 | | - return dispatch(solar_declination_angle, date) |
| 102 | + r = dispatch(solar_declination_angle, date) |
| 103 | + return r if r is not None else array.solar_declination_angle(date) |
102 | 104 |
|
103 | 105 |
|
104 | 106 | @overload |
|
0 commit comments