# SPDX-License-Identifier: GPL-3.0-or-later
import numpy as np
import numpy.typing as npt
import deltares_coastal_structures_toolbox.functions.core_physics as core_physics
import deltares_coastal_structures_toolbox.functions.core_utility as core_utility
[docs]
def check_validity(
Hs: float | npt.NDArray[np.float64] = np.nan,
ht: float | npt.NDArray[np.float64] = np.nan,
h: float | npt.NDArray[np.float64] = np.nan,
Dn50: float | npt.NDArray[np.float64] = np.nan,
Nod: float | npt.NDArray[np.float64] = np.nan,
Delta: float | npt.NDArray[np.float64] = np.nan,
):
"""Check the parameter values vs the validity range as defined in Van der Meer (1998).
For all parameters supplied, their values are checked versus the range of validity
specified by Van der Meer (1998). When parameters are nan (by default), they are not checked.
For more information, please refer to:
WL|Delft Hydraulics (former Deltares), report number H2458/H3051, June, 1997
or
Meer, J. Van der, 1998. “Geometrical design of coastal structures.” Infram publication Nr. 2.
Parameters
----------
Hs : float | npt.NDArray[np.float64], optional
Incident significant wave height near the toe (m), by default np.nan
ht : float | npt.NDArray[np.float64], optional
Water depth above the toe (m), by default np.nan
h : float | npt.NDArray[np.float64], optional
Water depth in front of the toe (m), by default np.nan
Dn50 : float | npt.NDArray[np.float64], optional
Nominal diameter of toe armour (m), by default np.nan
Nod : float | npt.NDArray[np.float64], optional
Damage parameter (-), by default np.nan
Delta : float | npt.NDArray[np.float64], optional
Buoyant density (-), by default np.nan
"""
if not np.any(np.isnan(Hs)):
core_utility.check_variable_validity_range(
"Relative toe height (h)",
"van der Meer (1998)",
Hs,
0.01,
20,
)
if not np.any(np.isnan(ht)) and not np.any(np.isnan(h)):
core_utility.check_variable_validity_range(
"Relative toe height (Dn50)",
"van der Meer (1998)",
ht / h,
0.4,
0.9,
)
if not np.any(np.isnan(ht)) and not np.any(np.isnan(Dn50)):
core_utility.check_variable_validity_range(
"Relative toe height (Dn50)",
"van der Meer (1998)",
ht / Dn50,
3,
25,
)
if (
not np.any(np.isnan(Nod))
and not np.any(np.isnan(Dn50))
and not np.any(np.isnan(Hs))
and not np.any(np.isnan(Delta))
):
core_utility.check_variable_validity_range(
"Nod vs Ns",
"van der Meer (1998)",
(Nod**-0.15) * (Hs / Delta * Dn50),
2,
np.inf,
)
return
[docs]
def calculate_damage_Nod(
Hs: float | npt.NDArray[np.float64],
ht: float | npt.NDArray[np.float64],
h: float | npt.NDArray[np.float64],
Dn50: float | npt.NDArray[np.float64],
rho_rock: float | npt.NDArray[np.float64],
rho_water: float | npt.NDArray[np.float64],
) -> float | npt.NDArray[np.float64]:
"""calculate damage number Nod for toe structures using van der Meer 1998
For more information, please refer to:
WL|Delft Hydraulics (former Deltares), report number H2458/H3051, June, 1997
or
Meer, J. Van der, 1998. “Geometrical design of coastal structures.” Infram publication Nr. 2.
Parameters
----------
Hs : float | npt.NDArray[np.float64]
Incident significant wave height near the toe (m)
ht : float | npt.NDArray[np.float64]
Water depth above the toe (m)
h : float | npt.NDArray[np.float64]
Water depth in front of the toe (m)
Dn50 : float | npt.NDArray[np.float64]
Nominal diameter of toe armour (m)
rho_rock : float | npt.NDArray[np.float64]
Density of rock material (kg/m^3)
rho_water : float | npt.NDArray[np.float64]
Density of water (kg/m^3)
Returns
-------
Nod : float | npt.NDArray[np.float64]
Damage parameter (-)
"""
Delta = core_physics.calculate_buoyant_density_Delta(
rho_rock=rho_rock, rho_water=rho_water
)
Ns = Hs / (Delta * Dn50)
Nod = (Ns / (2 + 6.2 * (ht / h) ** 2.7)) ** (1 / 0.15)
check_validity(Hs=Hs, ht=ht, h=h, Dn50=Dn50, Nod=Nod, Delta=Delta)
return Nod
[docs]
def calculate_nominal_diameter_Dn50(
Hs: float | npt.NDArray[np.float64],
ht: float | npt.NDArray[np.float64],
h: float | npt.NDArray[np.float64],
Nod: float | npt.NDArray[np.float64],
rho_rock: float | npt.NDArray[np.float64],
rho_water: float | npt.NDArray[np.float64],
) -> float | npt.NDArray[np.float64]:
"""calculate nominal diameter Dn50 for toe structures using van der Meer 1998
For more information, please refer to:
WL|Delft Hydraulics (former Deltares), report number H2458/H3051, June, 1997
or
Meer, J. Van der, 1998. “Geometrical design of coastal structures.” Infram publication Nr. 2.
Parameters
----------
Hs : float | npt.NDArray[np.float64]
Incident significant wave height near the toe (m)
ht : float | npt.NDArray[np.float64]
Water depth above the toe (m)
h : float | npt.NDArray[np.float64]
Water depth in front of the toe (m)
Nod : float | npt.NDArray[np.float64]
Damage parameter (-)
rho_rock : float | npt.NDArray[np.float64]
Density of rock material (kg/m^3)
rho_water : float | npt.NDArray[np.float64]
Density of water (kg/m^3)
g : float | npt.NDArray[np.float64], optional
Gravitational acceleration, by default 9.81
Returns
-------
Dn50 : float | npt.NDArray[np.float64]
Nominal diameter of toe armour (m)
"""
Delta = core_physics.calculate_buoyant_density_Delta(
rho_rock=rho_rock, rho_water=rho_water
)
Dn50 = Hs / ((2 + 6.2 * (ht / h) ** 2.7) * Nod**0.15 * Delta)
check_validity(Hs=Hs, ht=ht, h=h, Dn50=Dn50, Nod=Nod, Delta=Delta)
return Dn50
[docs]
def calculate_wave_height_Hs(
Dn50: float | npt.NDArray[np.float64],
ht: float | npt.NDArray[np.float64],
h: float | npt.NDArray[np.float64],
Nod: float | npt.NDArray[np.float64],
rho_rock: float | npt.NDArray[np.float64],
rho_water: float | npt.NDArray[np.float64],
) -> float | npt.NDArray[np.float64]:
"""calculate wave height Hs for toe structures using van der Meer 1998
For more information, please refer to:
WL|Delft Hydraulics (former Deltares), report number H2458/H3051, June, 1997
or
Meer, J. Van der, 1998. “Geometrical design of coastal structures.” Infram publication Nr. 2.
Parameters
----------
Dn50 : float | npt.NDArray[np.float64]
Nominal diameter of toe armour (m)
ht : float | npt.NDArray[np.float64]
Water depth above the toe (m)
h : float | npt.NDArray[np.float64]
Water depth in front of the toe (m)
Nod : float | npt.NDArray[np.float64]
Damage parameter (-)
rho_rock : float | npt.NDArray[np.float64]
Density of rock material (kg/m^3)
rho_water : float | npt.NDArray[np.float64]
Density of water (kg/m^3)
g : float | npt.NDArray[np.float64], optional
Gravitational acceleration, by default 9.81
Returns
-------
Hs : float | npt.NDArray[np.float64]
Incident significant wave height near the toe (m)
"""
Delta = core_physics.calculate_buoyant_density_Delta(
rho_rock=rho_rock, rho_water=rho_water
)
Hs = ((2 + 6.2 * (ht / h) ** 2.7) * Delta * Dn50) / Nod**-0.15
check_validity(Hs=Hs, ht=ht, h=h, Dn50=Dn50, Nod=Nod, Delta=Delta)
return Hs
[docs]
def calculate_depth_above_toe_ht(
Hs: float | npt.NDArray[np.float64],
Dn50: float | npt.NDArray[np.float64],
h: float | npt.NDArray[np.float64],
Nod: float | npt.NDArray[np.float64],
rho_rock: float | npt.NDArray[np.float64],
rho_water: float | npt.NDArray[np.float64],
) -> float | npt.NDArray[np.float64]:
"""calculate depth above toe ht for toe structures using van der Meer 1998
For more information, please refer to:
WL|Delft Hydraulics (former Deltares), report number H2458/H3051, June, 1997
or
Meer, J. Van der, 1998. “Geometrical design of coastal structures.” Infram publication Nr. 2.
Parameters
----------
Hs : float | npt.NDArray[np.float64]
Incident significant wave height near the toe (m)
Dn50 : float | npt.NDArray[np.float64]
Nominal diameter of toe armour (m)
h : float | npt.NDArray[np.float64]
Water depth in front of the toe (m)
Nod : float | npt.NDArray[np.float64]
Damage parameter (-)
rho_rock : float | npt.NDArray[np.float64]
Density of rock material (kg/m^3)
rho_water : float | npt.NDArray[np.float64]
Density of water (kg/m^3)
g : float | npt.NDArray[np.float64], optional
Gravitational acceleration, by default 9.81
Returns
-------
ht : float | npt.NDArray[np.float64]
Water depth above the toe (m)
"""
Delta = core_physics.calculate_buoyant_density_Delta(
rho_rock=rho_rock, rho_water=rho_water
)
ht = (((Hs * Nod**-0.15) / (Delta * Dn50)) - 2) / 6.2
if ht > 0:
ht = ht ** (1 / 2.7) * h
else:
ht = np.nan
check_validity(Hs=Hs, ht=ht, h=h, Dn50=Dn50, Nod=Nod, Delta=Delta)
return ht