Commit 6cfb4131 authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[EUROCODE DATA] add display function for eurocode data

parent 8b581b73
No related merge requests found
Showing with 151 additions and 29 deletions
+151 -29
......@@ -51,27 +51,3 @@ class Drome(AbstractDepartementAlpesFrancaises):
super().__init__(C2)
massif_name_to_departements = {
'Chablais': [HauteSavoie],
'Aravis': [HauteSavoie, Savoie],
'Mont-Blanc': [HauteSavoie],
'Bauges': [HauteSavoie, Savoie],
'Beaufortain': [HauteSavoie, Savoie],
'Haute-Tarentaise': [Savoie],
'Chartreuse': [Isere, Savoie],
'Belledonne': [Isere, Savoie],
'Maurienne': [Savoie],
'Vanoise': [Savoie],
'Haute-Maurienne': [Savoie],
'Grandes-Rousses': [Isere, Savoie],
'Thabor': [HauteSavoie],
'Vercors': [Isere, Drome],
'Oisans': [Isere, HautesAlpes],
'Pelvoux': [Isere, HautesAlpes],
'Queyras': [HautesAlpes],
'Devoluy': [Drome, Isere, HautesAlpes],
'Champsaur': [HautesAlpes],
'Parpaillon': [HautesAlpes, AlpesDeHauteProvence],
'Ubaye': [AlpesDeHauteProvence],
'Haut_Var-Haut_Verdon': [AlpesDeHauteProvence],
'Mercantour': [AlpesMaritimes, AlpesDeHauteProvence]}
from collections import OrderedDict
import matplotlib.pyplot as plt
from experiment.eurocode_data.massif_name_to_departement import massif_name_to_departements
from experiment.eurocode_data.region_eurocode import AbstractRegionType
from utils import get_display_name_from_object_type
def display_region_limit(region_type, altitudes, ordered_massif_name_to_quantiles, ordered_massif_name_to_significances=None,
display=True):
assert isinstance(ordered_massif_name_to_quantiles, OrderedDict)
assert ordered_massif_name_to_significances is None or isinstance(ordered_massif_name_to_significances, OrderedDict)
# First, select massif name correspond to the region
massif_name_belong_to_the_region = []
for massif_name in ordered_massif_name_to_quantiles.keys():
if any([isinstance(dep.region, region_type) for dep in massif_name_to_departements[massif_name]]):
massif_name_belong_to_the_region.append(massif_name)
region_object = region_type() # type: AbstractRegionType
# Then, display the limit for the region
fig, ax = plt.subplots(1, 1)
ax.plot(altitudes, [region_object.eurocode_max_loading(altitude) for altitude in altitudes], label='Eurocode limit')
# Finally, display the massif curve
for massif_name in massif_name_belong_to_the_region:
ax.plot(altitudes, ordered_massif_name_to_quantiles[massif_name], label=massif_name)
ax.set_title('{} Eurocode region'.format(get_display_name_from_object_type(region_type)))
ax.set_xlabel('Altitude')
ax.set_ylabel('0.98 quantile (in N $m^-2$)')
ax.legend()
if display:
plt.show()
\ No newline at end of file
from typing import Dict, List
from experiment.eurocode_data.departementalpesfrancaises import HauteSavoie, Savoie, Isere, Drome, HautesAlpes, \
AlpesDeHauteProvence, AlpesMaritimes, AbstractDepartementAlpesFrancaises
massif_name_to_departements = {
'Chablais': [HauteSavoie],
'Aravis': [HauteSavoie, Savoie],
'Mont-Blanc': [HauteSavoie],
'Bauges': [HauteSavoie, Savoie],
'Beaufortain': [HauteSavoie, Savoie],
'Haute-Tarentaise': [Savoie],
'Chartreuse': [Isere, Savoie],
'Belledonne': [Isere, Savoie],
'Maurienne': [Savoie],
'Vanoise': [Savoie],
'Haute-Maurienne': [Savoie],
'Grandes-Rousses': [Isere, Savoie],
'Thabor': [HauteSavoie],
'Vercors': [Isere, Drome],
'Oisans': [Isere, HautesAlpes],
'Pelvoux': [Isere, HautesAlpes],
'Queyras': [HautesAlpes],
'Devoluy': [Drome, Isere, HautesAlpes],
'Champsaur': [HautesAlpes],
'Parpaillon': [HautesAlpes, AlpesDeHauteProvence],
'Ubaye': [AlpesDeHauteProvence],
'Haut_Var-Haut_Verdon': [AlpesDeHauteProvence],
'Mercantour': [AlpesMaritimes, AlpesDeHauteProvence]}
massif_name_to_departements = {m: [d() for d in deps] for m, deps in massif_name_to_departements.items()} # type: Dict[str, List[AbstractDepartementAlpesFrancaises]]
class AbstractRegionType(object):
def __init__(self, sk0, sad) -> None:
# Valeurs caracteristique de la charge de neige sur le sol à une altitude inférieure à 200m
self.sk0 = sk0
# Valeur de calcul de la charge exceptionelle
self.sad = sad
class AbstractRegionType(object):
pass
def eurocode_max_loading(self, altitude):
valeur_caracteritique = self.valeur_caracteristique(altitude)
if self.sad is None:
return valeur_caracteritique
else:
return max(self.sad, valeur_caracteritique)
def valeur_caracteristique(self, altitude):
return self.sk0 + self.lois_de_variation_de_la_valeur_caracteristique(altitude)
def lois_de_variation_de_la_valeur_caracteristique(self, altitude):
if 200 <= altitude <= 2000:
if 200 <= altitude <= 500:
a, b = self.lois_de_variation_200_and_500
elif 500 <= altitude <= 1000:
a, b = self.lois_de_variation_500_and_1000
else:
a, b = self.lois_de_variation_1000_and_2000
return a * altitude / 1000 + b
else:
raise ValueError('altitude {}m is out of range'.format(altitude))
@property
def lois_de_variation_200_and_500(self):
return 1.0, -0.20
@property
def lois_de_variation_500_and_1000(self):
return 1.5, -0.45
@property
def lois_de_variation_1000_and_2000(self):
return 3.5, -2.45
class C1(AbstractRegionType):
pass
def __init__(self) -> None:
super().__init__(0.65, None)
class C2(AbstractRegionType):
pass
def __init__(self) -> None:
super().__init__(0.65, 1.35)
class E(AbstractRegionType):
pass
\ No newline at end of file
def __init__(self) -> None:
super().__init__(1.40, None)
@property
def lois_de_variation_200_and_500(self):
return 1.5, -0.30
@property
def lois_de_variation_500_and_1000(self):
return 3.5, -1.30
@property
def lois_de_variation_1000_and_2000(self):
return 7, -4.80
import unittest
from collections import OrderedDict
from experiment.eurocode_data.eurocode_visualizer import display_region_limit
from experiment.eurocode_data.region_eurocode import C1, E
from experiment.meteo_france_data.scm_models_data.crocus.crocus import CrocusSweTotal
from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.main_study_visualizer import \
study_iterator_global
from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.study_visualizer import \
StudyVisualizer
from experiment.trend_analysis.non_stationary_trends import \
ConditionalIndedendenceLocationTrendTest
from spatio_temporal_dataset.coordinates.transformed_coordinates.transformation.uniform_normalization import \
BetweenZeroAndOneNormalization, BetweenZeroAndOneNormalizationMinEpsilon, BetweenZeroAndOneNormalizationMaxEpsilon
from utils import get_display_name_from_object_type
class TestCoordinateSensitivity(unittest.TestCase):
DISPLAY = False
def test_region_eurocode(self):
altitudes = [900, 1200, 1500, 1800]
ordered_massif_name_to_quantiles = OrderedDict()
ordered_massif_name_to_quantiles['Vanoise'] = [1.2, 1.5, 1.7, 2.1]
ordered_massif_name_to_quantiles['Vercors'] = [0.7, 0.8, 1.1, 1.5]
display_region_limit(C1, altitudes, ordered_massif_name_to_quantiles, display=self.DISPLAY)
display_region_limit(E, altitudes, ordered_massif_name_to_quantiles, display=self.DISPLAY)
if __name__ == '__main__':
unittest.main()
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment