mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-23 21:11:08 +00:00
Add rainfall intensity calculation function (#11432)
* Add rainfall intensity calculation function * chore: improve fuction and coefficient documentation * Update physics/rainfall_intensity.py --------- Co-authored-by: Tianyi Zheng <tianyizheng02@gmail.com>
This commit is contained in:
parent
5827aac79a
commit
41a1cdf38d
143
physics/rainfall_intensity.py
Normal file
143
physics/rainfall_intensity.py
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
"""
|
||||||
|
Rainfall Intensity
|
||||||
|
==================
|
||||||
|
This module contains functions to calculate the intensity of
|
||||||
|
a rainfall event for a given duration and return period.
|
||||||
|
|
||||||
|
This function uses the Sherman intensity-duration-frequency curve.
|
||||||
|
|
||||||
|
References
|
||||||
|
----------
|
||||||
|
- Aparicio, F. (1997): Fundamentos de Hidrología de Superficie.
|
||||||
|
Balderas, México, Limusa. 303 p.
|
||||||
|
- https://en.wikipedia.org/wiki/Intensity-duration-frequency_curve
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def rainfall_intensity(
|
||||||
|
coefficient_k: float,
|
||||||
|
coefficient_a: float,
|
||||||
|
coefficient_b: float,
|
||||||
|
coefficient_c: float,
|
||||||
|
return_period: float,
|
||||||
|
duration: float,
|
||||||
|
) -> float:
|
||||||
|
"""
|
||||||
|
Calculate the intensity of a rainfall event for a given duration and return period.
|
||||||
|
It's based on the Sherman intensity-duration-frequency curve:
|
||||||
|
|
||||||
|
I = k * T^a / (D + b)^c
|
||||||
|
|
||||||
|
where:
|
||||||
|
I = Intensity of the rainfall event [mm/h]
|
||||||
|
k, a, b, c = Coefficients obtained through statistical distribution adjust
|
||||||
|
T = Return period in years
|
||||||
|
D = Rainfall event duration in minutes
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
coefficient_k : float
|
||||||
|
Coefficient obtained through statistical distribution adjust.
|
||||||
|
coefficient_a : float
|
||||||
|
Coefficient obtained through statistical distribution adjust.
|
||||||
|
coefficient_b : float
|
||||||
|
Coefficient obtained through statistical distribution adjust.
|
||||||
|
coefficient_c : float
|
||||||
|
Coefficient obtained through statistical distribution adjust.
|
||||||
|
return_period : float
|
||||||
|
Return period in years.
|
||||||
|
duration : float
|
||||||
|
Rainfall event duration in minutes.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
intensity : float
|
||||||
|
Intensity of the rainfall event in mm/h.
|
||||||
|
|
||||||
|
Raises
|
||||||
|
------
|
||||||
|
ValueError
|
||||||
|
If any of the parameters are not positive.
|
||||||
|
|
||||||
|
Examples
|
||||||
|
--------
|
||||||
|
|
||||||
|
>>> rainfall_intensity(1000, 0.2, 11.6, 0.81, 10, 60)
|
||||||
|
49.83339231138578
|
||||||
|
|
||||||
|
>>> rainfall_intensity(1000, 0.2, 11.6, 0.81, 10, 30)
|
||||||
|
77.36319588106228
|
||||||
|
|
||||||
|
>>> rainfall_intensity(1000, 0.2, 11.6, 0.81, 5, 60)
|
||||||
|
43.382487747633625
|
||||||
|
|
||||||
|
>>> rainfall_intensity(0, 0.2, 11.6, 0.81, 10, 60)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValueError: All parameters must be positive.
|
||||||
|
|
||||||
|
>>> rainfall_intensity(1000, -0.2, 11.6, 0.81, 10, 60)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValueError: All parameters must be positive.
|
||||||
|
|
||||||
|
>>> rainfall_intensity(1000, 0.2, -11.6, 0.81, 10, 60)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValueError: All parameters must be positive.
|
||||||
|
|
||||||
|
>>> rainfall_intensity(1000, 0.2, 11.6, -0.81, 10, 60)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValueError: All parameters must be positive.
|
||||||
|
|
||||||
|
>>> rainfall_intensity(1000, 0, 11.6, 0.81, 10, 60)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValueError: All parameters must be positive.
|
||||||
|
|
||||||
|
>>> rainfall_intensity(1000, 0.2, 0, 0.81, 10, 60)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValueError: All parameters must be positive.
|
||||||
|
|
||||||
|
>>> rainfall_intensity(1000, 0.2, 11.6, 0, 10, 60)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValueError: All parameters must be positive.
|
||||||
|
|
||||||
|
>>> rainfall_intensity(0, 0.2, 11.6, 0.81, 10, 60)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValueError: All parameters must be positive.
|
||||||
|
|
||||||
|
>>> rainfall_intensity(1000, 0.2, 11.6, 0.81, 0, 60)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValueError: All parameters must be positive.
|
||||||
|
|
||||||
|
>>> rainfall_intensity(1000, 0.2, 11.6, 0.81, 10, 0)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValueError: All parameters must be positive.
|
||||||
|
|
||||||
|
"""
|
||||||
|
if (
|
||||||
|
coefficient_k <= 0
|
||||||
|
or coefficient_a <= 0
|
||||||
|
or coefficient_b <= 0
|
||||||
|
or coefficient_c <= 0
|
||||||
|
or return_period <= 0
|
||||||
|
or duration <= 0
|
||||||
|
):
|
||||||
|
raise ValueError("All parameters must be positive.")
|
||||||
|
intensity = (coefficient_k * (return_period**coefficient_a)) / (
|
||||||
|
(duration + coefficient_b) ** coefficient_c
|
||||||
|
)
|
||||||
|
return intensity
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import doctest
|
||||||
|
|
||||||
|
doctest.testmod()
|
Loading…
Reference in New Issue
Block a user