From 952ce5c919de70f582f78fc601815a3d4a271a5e Mon Sep 17 00:00:00 2001 From: Le Roux Erwan <erwan.le-roux@irstea.fr> Date: Fri, 22 Nov 2019 10:12:33 +0100 Subject: [PATCH] add eurocode snow load --- .../scm_models_data/crocus/crocus.py | 12 +++- .../crocus/crocus_variables.py | 15 ++++- .../main_study_visualizer.py | 4 +- .../study_visualization/study_visualizer.py | 4 +- .../data/main_example_swe_total_plot.py | 56 ++++++++++++++----- 5 files changed, 70 insertions(+), 21 deletions(-) diff --git a/experiment/meteo_france_data/scm_models_data/crocus/crocus.py b/experiment/meteo_france_data/scm_models_data/crocus/crocus.py index 0264b02f..94d7a2fd 100644 --- a/experiment/meteo_france_data/scm_models_data/crocus/crocus.py +++ b/experiment/meteo_france_data/scm_models_data/crocus/crocus.py @@ -3,7 +3,8 @@ import numpy as np from experiment.meteo_france_data.scm_models_data.abstract_extended_study import AbstractExtendedStudy from experiment.meteo_france_data.scm_models_data.abstract_study import AbstractStudy from experiment.meteo_france_data.scm_models_data.crocus.crocus_variables import CrocusTotalSweVariable, \ - CrocusDepthVariable, CrocusRecentSweVariable, TotalSnowLoadVariable, RecentSnowLoadVariable + CrocusDepthVariable, CrocusRecentSweVariable, TotalSnowLoadVariable, RecentSnowLoadVariable, \ + CrocusSnowLoadEurocodeVariable class Crocus(AbstractStudy): @@ -13,7 +14,7 @@ class Crocus(AbstractStudy): def __init__(self, variable_class, *args, **kwargs): assert variable_class in [CrocusTotalSweVariable, CrocusDepthVariable, CrocusRecentSweVariable, - RecentSnowLoadVariable, TotalSnowLoadVariable] + RecentSnowLoadVariable, TotalSnowLoadVariable, CrocusSnowLoadEurocodeVariable] super().__init__(variable_class, *args, **kwargs) self.model_name = 'Crocus' @@ -71,6 +72,13 @@ class CrocusDepth(Crocus): return self.winter_annual_aggregation(time_serie) +class CrocusSnowLoadEurocode(Crocus): + + def __init__(self, *args, **kwargs): + Crocus.__init__(self, CrocusSnowLoadEurocodeVariable, *args, **kwargs) + + + class ExtendedCrocusDepth(AbstractExtendedStudy, CrocusDepth): pass diff --git a/experiment/meteo_france_data/scm_models_data/crocus/crocus_variables.py b/experiment/meteo_france_data/scm_models_data/crocus/crocus_variables.py index 5feaebda..a69fe0cb 100644 --- a/experiment/meteo_france_data/scm_models_data/crocus/crocus_variables.py +++ b/experiment/meteo_france_data/scm_models_data/crocus/crocus_variables.py @@ -4,6 +4,7 @@ from experiment.meteo_france_data.scm_models_data.abstract_variable import Abstr class CrocusVariable(AbstractVariable): + snow_load_multiplication_factor = 9.81 / 1000 @property def daily_time_serie_array(self) -> np.ndarray: @@ -29,11 +30,11 @@ class CrocusRecentSweVariable(CrocusTotalSweVariable): class AbstractSnowLoadVariable(CrocusVariable): UNIT = 'kN $m^{-2}$' - snow_load_multiplication_factor = 9.81 / 1000 @property def daily_time_serie_array(self) -> np.ndarray: - return self.snow_load_multiplication_factor * super().daily_time_serie_array + snow_pressure = self.snow_load_multiplication_factor * super().daily_time_serie_array + return snow_pressure class RecentSnowLoadVariable(AbstractSnowLoadVariable, CrocusRecentSweVariable): @@ -51,3 +52,13 @@ class CrocusDepthVariable(CrocusVariable): @classmethod def keyword(cls): return "DSN_T_ISBA" + + +class CrocusSnowLoadEurocodeVariable(CrocusDepthVariable): + eurocode_snow_density = 150 + + @property + def daily_time_serie_array(self) -> np.ndarray: + snow_weight = super().daily_time_serie_array * self.eurocode_snow_density + snow_pressure = self.snow_load_multiplication_factor * snow_weight + return snow_pressure diff --git a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/main_study_visualizer.py b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/main_study_visualizer.py index 5a5ef8b3..a6db544b 100644 --- a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/main_study_visualizer.py +++ b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/main_study_visualizer.py @@ -6,7 +6,8 @@ from experiment.meteo_france_data.scm_models_data.visualization.study_visualizat from experiment.trend_analysis.abstract_score import MannKendall from experiment.meteo_france_data.scm_models_data.abstract_study import AbstractStudy from experiment.meteo_france_data.scm_models_data.crocus.crocus import CrocusDepth, CrocusSweTotal, ExtendedCrocusDepth, \ - ExtendedCrocusSweTotal, CrocusDaysWithSnowOnGround, CrocusSwe3Days, CrocusSnowLoad3Days, CrocusSnowLoadTotal + ExtendedCrocusSweTotal, CrocusDaysWithSnowOnGround, CrocusSwe3Days, CrocusSnowLoad3Days, CrocusSnowLoadTotal, \ + CrocusSnowLoadEurocode from experiment.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall, ExtendedSafranSnowfall, \ SafranRainfall, \ SafranTemperature, SafranTotalPrecip @@ -25,6 +26,7 @@ SCM_STUDY_CLASS_TO_ABBREVIATION = { SafranSnowfall: 'SF3', CrocusSweTotal: 'SWE', CrocusSwe3Days: 'SWE3', + CrocusSnowLoadEurocode: 'SL_Eurocode', CrocusDepth: 'SD', CrocusSnowLoadTotal: 'SL', CrocusSnowLoad3Days: 'SL3', diff --git a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py index 71ea1aea..389bd027 100644 --- a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py +++ b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py @@ -625,13 +625,13 @@ class StudyVisualizer(VisualizationParameters): self.plot_name = plot_name self.show_or_save_to_file() - def visualize_max_graphs_poster(self, massif_name, altitude, snow_abbreviation, color, label=None, last_plot=True, ax=None): + def visualize_max_graphs_poster(self, massif_name, altitude, snow_abbreviation, color, label=None, last_plot=True, ax=None, linestyle=None): massif_names = self.study.study_massif_names # Display the graph of the max on top if ax is None: ax = plt.gca() x, y = self.smooth_maxima_x_y(massif_names.index(massif_name)) - ax.plot(x, y, color=color, linewidth=5, label=label) + ax.plot(x, y, color=color, linewidth=5, label=label, linestyle=linestyle) # ax.set_ylabel('{} (in {})'.format(snow_abbreviation, self.study.variable_unit), color=color, fontsize=15) if last_plot: diff --git a/experiment/paper_past_snow_loads/data/main_example_swe_total_plot.py b/experiment/paper_past_snow_loads/data/main_example_swe_total_plot.py index 86d87ccf..2c0f8f77 100644 --- a/experiment/paper_past_snow_loads/data/main_example_swe_total_plot.py +++ b/experiment/paper_past_snow_loads/data/main_example_swe_total_plot.py @@ -1,30 +1,26 @@ -from experiment.meteo_france_data.scm_models_data.crocus.crocus import CrocusSnowLoad3Days, CrocusSnowLoadTotal +from experiment.meteo_france_data.scm_models_data.crocus.crocus import CrocusSnowLoad3Days, CrocusSnowLoadTotal, \ + CrocusSnowLoadEurocode from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.main_study_visualizer import \ study_iterator_global, SCM_STUDY_CLASS_TO_ABBREVIATION from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.study_visualizer import \ StudyVisualizer import matplotlib.pyplot as plt -def max_graph_annual_maxima_poster(): +def max_graph_annual_maxima_poster_separate(): """ We choose these massif because each represents a different eurocode region we also choose them because they belong to a different climatic area :return: """ save_to_file = False - - # marker_altitude_massif_name_and_study_class = [ - # ('magenta', 900, 'Parpaillon', CrocusSnowLoadTotal), - # ('darkmagenta', 1800, 'Vercors', CrocusSnowLoadTotal), - # ('mediumpurple', 2700, 'Vanoise', CrocusSnowLoadTotal), - # ] - marker_altitude_massif_name_and_study_class = [ - ('magenta', 900, 'Ubaye', CrocusSnowLoadTotal), - ('darkmagenta', 1800, 'Vercors', CrocusSnowLoadTotal), - ('mediumpurple', 2700, 'Beaufortain', CrocusSnowLoadTotal), + study_class = [CrocusSnowLoadTotal, CrocusSnowLoadEurocode][-1] + marker_altitude_massif_name = [ + ('magenta', 900, 'Ubaye'), + ('darkmagenta', 1800, 'Vercors'), + ('mediumpurple', 2700, 'Beaufortain'), ] ax = plt.gca() - for color, altitude, massif_name, study_class in marker_altitude_massif_name_and_study_class: + for color, altitude, massif_name in marker_altitude_massif_name: for study in study_iterator_global([study_class], altitudes=[altitude]): study_visualizer = StudyVisualizer(study, save_to_file=save_to_file, verbose=True, @@ -34,5 +30,37 @@ def max_graph_annual_maxima_poster(): label = '{} massif at {}m'.format(massif_name, altitude) study_visualizer.visualize_max_graphs_poster(massif_name, altitude, snow_abbreviation, color, label, last_plot, ax) + +def max_graph_annual_maxima_poster_together(): + """ + We choose these massif because each represents a different eurocode region + we also choose them because they belong to a different climatic area + :return: + """ + save_to_file = False + study_class_and_marker = [ + (CrocusSnowLoadTotal, '-'), + (CrocusSnowLoadEurocode, (0, (1,1))), + ] + color_altitude_massif_name = [ + ('magenta', 900, 'Ubaye'), + ('darkmagenta', 1800, 'Vercors'), + ('mediumpurple', 2700, 'Beaufortain'), + ] + ax = plt.gca() + for color, altitude, massif_name in color_altitude_massif_name: + for study_class, linestyle in study_class_and_marker[::-1]: + for study in study_iterator_global([study_class], altitudes=[altitude]): + study_visualizer = StudyVisualizer(study, save_to_file=save_to_file, + verbose=True, + multiprocessing=True) + snow_abbreviation = SCM_STUDY_CLASS_TO_ABBREVIATION[study_class] + last_plot = altitude == 2700 and study_class == CrocusSnowLoadTotal + name = 'SL from Crocus SWE' if study_class == CrocusSnowLoadTotal else 'SL from Crocus HS and snow density=150 kg $m^-3$' + label = '{} for {} massif at {}m'.format(name, massif_name, altitude) + study_visualizer.visualize_max_graphs_poster(massif_name, altitude, snow_abbreviation, color, label, last_plot, ax, linestyle) + + if __name__ == '__main__': - max_graph_annual_maxima_poster() + # max_graph_annual_maxima_poster_separate() + max_graph_annual_maxima_poster_together() -- GitLab