Source code for openeurotop.reduction_factors

"""
Facteurs de réduction pour le calcul du franchissement selon EurOtop
"""

import numpy as np
from openeurotop.constants import DEG_TO_RAD


[docs] def gamma_f_roughness(type_revetement="lisse"): """ Facteur de réduction pour la rugosité du revêtement γf Parameters ---------- type_revetement : str or float Type de revêtement ou valeur directe du facteur Options : "lisse", "herbe", "beton_rugueux", "enrochement_1couche", "enrochement_2couches", "cubes", "tetrapodes" Returns ------- float Facteur de rugosité γf References ---------- EurOtop (2018) - Table 5.2 """ if isinstance(type_revetement, (int, float)): return float(type_revetement) facteurs = { "lisse": 1.0, "beton_lisse": 1.0, "asphalte": 1.0, "herbe": 1.0, "gazon": 1.0, "beton_rugueux": 0.9, "beton_colonne": 0.85, "enrochement_1couche": 0.55, "enrochement_2couches": 0.50, "enrochement_impermeable": 0.45, "cubes": 0.47, "antifer": 0.47, "tetrapodes": 0.38, "accropode": 0.46, "xbloc": 0.45, "core_loc": 0.44, } revetement_lower = type_revetement.lower().replace(" ", "_") if revetement_lower in facteurs: return facteurs[revetement_lower] else: raise ValueError(f"Type de revêtement '{type_revetement}' non reconnu. " f"Options disponibles : {list(facteurs.keys())}")
[docs] def gamma_beta_obliquity(beta_deg): """ Facteur de réduction pour l'obliquité des vagues γβ Pour β = 0° (vagues perpendiculaires) : γβ = 1.0 Pour β > 0° : γβ = 1 - 0.0033 * |β| (pour 0° ≤ β ≤ 80°) Parameters ---------- beta_deg : float Angle d'obliquité des vagues (degrés) 0° = vagues perpendiculaires à l'ouvrage Returns ------- float Facteur d'obliquité γβ References ---------- EurOtop (2018) - Section 5.2.3.4 """ beta = abs(beta_deg) if beta <= 10: return 1.0 elif beta <= 80: return 1.0 - 0.0033 * beta else: # Au-delà de 80°, formule moins fiable return 1.0 - 0.0033 * 80
[docs] def gamma_b_berm(Rc, Hm0, B_berm, h_berm, gamma_f=1.0): """ Facteur de réduction pour une berme γb Implémentation complète selon EurOtop 2018, Section 5.2.3.3 Prend en compte la largeur, la profondeur et la rugosité de la berme Parameters ---------- Rc : float Revanche (m) Hm0 : float Hauteur significative spectrale (m) B_berm : float Largeur de la berme (m) h_berm : float Hauteur de la berme par rapport au SWL (m) Positive si au-dessus, négative si submergée gamma_f : float, optional Facteur de rugosité (défaut: 1.0) Returns ------- float Facteur de berme γb (0.6 ≤ γb ≤ 1.0) Notes ----- La berme réduit le franchissement si elle est : - Suffisamment large (B > 2*Hm0) - Pas trop haute (h_berm < 0.6*Rc) - Rugueuse (gamma_f < 1.0 améliore l'effet) References ---------- EurOtop (2018) - Section 5.2.3.3, Équations 5.11-5.13 """ # Pas de berme if B_berm <= 0: return 1.0 # Paramètres adimensionnels rdB = B_berm / Hm0 # Largeur relative rdh = h_berm / Hm0 # Hauteur relative # Hauteur critique (berme trop haute = pas d'effet) h_crit = 0.6 * Rc # CAS 1 : Berme trop haute (au-dessus de la zone de run-up) if h_berm >= h_crit: return 1.0 # CAS 2 : Berme submergée (h_berm < 0) if h_berm < 0: # Profondeur de submersion d_berm = abs(h_berm) # Berme peu profonde : effet maximal if d_berm < 0.5 * Hm0: if rdB < 2: gamma_b = 1.0 elif rdB <= 8: # Réduction progressive avec la largeur gamma_b = 1.0 - 0.05 * (rdB - 2) else: # Réduction maximale pour bermes très larges gamma_b = 0.65 if gamma_f >= 0.6 else 0.70 # Berme profondément submergée : effet réduit elif d_berm < 1.5 * Hm0: if rdB < 2: gamma_b = 1.0 elif rdB <= 10: gamma_b = 1.0 - 0.03 * (rdB - 2) else: gamma_b = 0.75 # Berme très profonde : peu d'effet else: if rdB < 4: gamma_b = 1.0 else: gamma_b = 0.90 # CAS 3 : Berme émergée (0 < h_berm < h_crit) else: # Position relative dans la zone de run-up beta_h = h_berm / h_crit # Berme basse (zone active) if beta_h < 0.3: if rdB < 2: gamma_b = 1.0 elif rdB <= 10: # Effet maximum avec correction rugosité reduction = 0.04 * (rdB - 2) if gamma_f < 0.6: # Rugosité améliore l'effet reduction *= 1.2 gamma_b = 1.0 - reduction else: gamma_b = 0.60 if gamma_f < 0.6 else 0.65 # Berme intermédiaire elif beta_h < 0.6: if rdB < 2: gamma_b = 1.0 elif rdB <= 10: reduction = 0.03 * (rdB - 2) * (1.0 - beta_h / 0.6) gamma_b = 1.0 - reduction else: gamma_b = 0.70 # Berme haute (effet réduit) else: if rdB < 3: gamma_b = 1.0 else: gamma_b = 0.85 # Limiter entre 0.6 et 1.0 return max(0.60, min(1.0, gamma_b))
[docs] def gamma_v_vertical_wall(h_parapet, Hm0): """ Facteur pour mur vertical avec parapet γv Parameters ---------- h_parapet : float Hauteur du parapet (m) Hm0 : float Hauteur significative spectrale (m) Returns ------- float Facteur de parapet """ if h_parapet <= 0: return 1.0 # Formule simplifiée gamma_v = 1.0 - h_parapet / (2 * Hm0) return max(0.5, min(1.0, gamma_v))
[docs] def gamma_star_composite(h_toe, h, Hm0): """ Facteur pour structures composites γ* Parameters ---------- h_toe : float Profondeur d'eau au pied de la structure (m) h : float Profondeur d'eau au large (m) Hm0 : float Hauteur significative spectrale (m) Returns ------- float Facteur composite γ* """ if h_toe <= 0: return 1.0 # Facteur basé sur la profondeur relative au pied d_star = h_toe / Hm0 if d_star >= 3.0: gamma_star = 1.0 elif d_star >= 0.3: gamma_star = 0.5 + 0.5 * (d_star - 0.3) / 2.7 else: gamma_star = 0.5 return gamma_star
[docs] def gamma_h_water_depth(h, Hm0, Tm_10): """ Facteur de réduction pour faible profondeur γh Parameters ---------- h : float Profondeur d'eau (m) Hm0 : float Hauteur significative spectrale (m) Tm_10 : float Période spectrale (s) Returns ------- float Facteur de profondeur γh """ from openeurotop.wave_parameters import wave_length_deep_water L0 = wave_length_deep_water(Tm_10) h_L0 = h / L0 if h_L0 >= 0.3: # Eau profonde ou intermédiaire return 1.0 else: # Eau peu profonde gamma_h = max(0.5, h_L0 / 0.3) return gamma_h
[docs] def gamma_cf_wind(U10, Hm0, Tm_10, angle_wind_deg=0): """ Facteur de correction pour le vent γcf Parameters ---------- U10 : float Vitesse du vent à 10m (m/s) Hm0 : float Hauteur significative spectrale (m) Tm_10 : float Période spectrale (s) angle_wind_deg : float, optional Angle entre vent et direction des vagues (degrés) Returns ------- float Facteur de vent γcf """ # Vitesse adimensionnelle du vent from openeurotop.constants import G U_star = U10 / np.sqrt(G * Hm0) if U_star <= 1.0: # Vent faible return 1.0 else: # Vent fort (augmente le franchissement) gamma_cf = 1.0 + 0.15 * (U_star - 1.0) return min(gamma_cf, 1.5) # Limité à 1.5