Open
Description
This is not so much a Feature Request, rather a conversation opener. I have written a cython
implementation of the NREL SPA that was heavily influenced by the pvlib.spa.solar_position_numpy
and I just wanted to share and gauge interest. I've linked the repo below and provided some timeit's
https://github.com/leaver2000/fast_spa/blob/master/tests/benchmark.ipynb
import numpy as np
import pvlib.spa
import fast_spa
def spa(
obj,
lat,
lon,
elevation=0.0,
pressure=1013.25,
temp=12.0,
refraction=0.5667,
):
delta_t = fast_spa.pe4dt(obj)
dt = np.asanyarray(obj, dtype="datetime64[ns]")
unix_time = dt.astype(np.float64) // 1e9
return np.stack(
[
np.stack(
pvlib.spa.solar_position_numpy(
ut,
lat=lat,
lon=lon,
elev=elevation,
pressure=pressure,
temp=temp,
delta_t=delta_t[i : i + 1],
atmos_refract=refraction,
numthreads=None,
sst=False,
esd=False,
)[:-1]
)
for i, ut in enumerate(unix_time)
],
axis=1,
)
lats = np.linspace(30, 31, 100)
lons = np.linspace(-80, -79, 100)
lats, lons = np.meshgrid(lats, lons)
datetime_obj = (
np.arange("2023-01-01", "2023-01-02", dtype="datetime64[h]")
.astype("datetime64[ns]")
.astype(str)
.tolist()
)
%timeit fast_spa.fast_spa(datetime_obj, lats, lons)
# 29.1 ms ± 299 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit spa(datetime_obj, lats, lons)
# 65 ms ± 498 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
Metadata
Metadata
Assignees
Labels
No labels