-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Fix omission in snow_coverage_nrel #2292
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 2 commits
3594450
9716bc8
cd579f2
c11aee4
7194e3c
11cf12e
b6424e3
d46837c
0ef3d7a
57f5eef
81c44d7
4e4350e
fb97cd9
e3d97e5
1113823
4d0110a
b1ff01a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -13,30 +13,36 @@ def _time_delta_in_hours(times): | |
| return delta.dt.total_seconds().div(3600) | ||
|
|
||
|
|
||
| def fully_covered_nrel(snowfall, threshold_snowfall=1.): | ||
| def fully_covered_nrel(snowfall, snow_depth=None, threshold_snowfall=1.): | ||
| ''' | ||
| Calculates the timesteps when the row's slant height is fully covered | ||
| by snow. | ||
|
|
||
| Parameters | ||
| ---------- | ||
| snowfall : Series | ||
| Accumulated snowfall in each time period [cm] | ||
|
|
||
| threshold_snowfall : float, default 1.0 | ||
| snowfall: Series | ||
| Accumulated snowfall in each time period. [cm] | ||
| snow_depth: Series, optional | ||
| Snow depth on the ground at the beginning of each time period. | ||
| Must have the same index as `snowfall`. [cm] | ||
| threshold_snowfall: float, default 1.0 | ||
| Hourly snowfall above which snow coverage is set to the row's slant | ||
| height. [cm/hr] | ||
|
|
||
| Returns | ||
| ---------- | ||
| boolean: Series | ||
| Series | ||
| True where the snowfall exceeds the defined threshold to fully cover | ||
| the panel. | ||
|
|
||
| Notes | ||
| ----- | ||
| Implements the model described in [1]_ with minor improvements in [2]_. | ||
|
|
||
| `snow_depth` is used to set coverage=0 when no snow is present on the | ||
| ground. This check is described in [2]_ as needed for systems with | ||
| low tilt angle. | ||
cwhanse marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| References | ||
| ---------- | ||
| .. [1] Marion, B.; Schaefer, R.; Caine, H.; Sanchez, G. (2013). | ||
|
|
@@ -56,11 +62,15 @@ def fully_covered_nrel(snowfall, threshold_snowfall=1.): | |
| hourly_snow_rate.iloc[0] = snowfall.iloc[0] / timedelta | ||
| else: # can't infer frequency from index | ||
| hourly_snow_rate.iloc[0] = 0 # replaces NaN | ||
| return hourly_snow_rate > threshold_snowfall | ||
| covered = (hourly_snow_rate > threshold_snowfall) | ||
| # no coverage when no snow on the ground | ||
| if snow_depth is not None: | ||
| covered = covered & (snow_depth > 0.) | ||
| return covered | ||
|
|
||
|
|
||
| def coverage_nrel(snowfall, poa_irradiance, temp_air, surface_tilt, | ||
| initial_coverage=0, threshold_snowfall=1., | ||
| snow_depth=None, initial_coverage=0, threshold_snowfall=1., | ||
| can_slide_coefficient=-80., slide_amount_coefficient=0.197): | ||
| ''' | ||
| Calculates the fraction of the slant height of a row of modules covered by | ||
|
|
@@ -82,6 +92,9 @@ def coverage_nrel(snowfall, poa_irradiance, temp_air, surface_tilt, | |
| surface_tilt : numeric | ||
| Tilt of module's from horizontal, e.g. surface facing up = 0, | ||
| surface facing horizon = 90. [degrees] | ||
| snow_depth : Series, optional | ||
| Snow depth on the ground at the beginning of each time period. | ||
| Must have the same index as `snowfall`. [cm] | ||
| initial_coverage : float, default 0 | ||
| Fraction of row's slant height that is covered with snow at the | ||
| beginning of the simulation. [unitless] | ||
|
|
@@ -106,6 +119,10 @@ def coverage_nrel(snowfall, poa_irradiance, temp_air, surface_tilt, | |
| In [1]_, `can_slide_coefficient` is termed `m`, and the value of | ||
| `slide_amount_coefficient` is given in tenths of a module's slant height. | ||
|
|
||
| `snow_depth` is used to set coverage=0 when no snow is present on the | ||
cwhanse marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| ground. This check is described in [2]_ as needed for systems with | ||
| low tilt angle. | ||
|
|
||
| References | ||
| ---------- | ||
| .. [1] Marion, B.; Schaefer, R.; Caine, H.; Sanchez, G. (2013). | ||
|
|
@@ -117,7 +134,7 @@ def coverage_nrel(snowfall, poa_irradiance, temp_air, surface_tilt, | |
| ''' | ||
|
|
||
| # find times with new snowfall | ||
| new_snowfall = fully_covered_nrel(snowfall, threshold_snowfall) | ||
| new_snowfall = fully_covered_nrel(snowfall, snow_depth, threshold_snowfall) | ||
|
|
||
| # set up output Series | ||
| snow_coverage = pd.Series(np.nan, index=poa_irradiance.index) | ||
|
|
@@ -143,6 +160,10 @@ def coverage_nrel(snowfall, poa_irradiance, temp_air, surface_tilt, | |
| snow_coverage.ffill(inplace=True) | ||
| snow_coverage -= cumulative_sliding | ||
|
|
||
| if snow_depth is not None: | ||
| # no coverage when there's no snow on the ground | ||
| # described in [2] to avoid non-sliding snow for low-tilt systems. | ||
| snow_coverage[snow_depth <= 0] = 0. | ||
|
||
| # clean up periods where row is completely uncovered | ||
| return snow_coverage.clip(lower=0) | ||
|
|
||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.