diff --git a/extreme_data/meteo_france_data/adamont_data/abstract_adamont_study.py b/extreme_data/meteo_france_data/adamont_data/abstract_adamont_study.py index 53f2031b1d5db9ba392cad927b53d9bc2ca818f2..00ccb21bed31f65bf5dcb8f2417956f2ddfdfd6f 100644 --- a/extreme_data/meteo_france_data/adamont_data/abstract_adamont_study.py +++ b/extreme_data/meteo_france_data/adamont_data/abstract_adamont_study.py @@ -85,6 +85,7 @@ class AbstractAdamontStudy(AbstractStudy): year_to_annual_maxima = OrderedDict() for dataset, real_scenario in zip(self.datasets, self.adamont_real_scenarios): annual_maxima = np.array(dataset.variables[self.variable_class.indicator_name_for_maxima]) + annual_maxima = self.variable_class.transform_annual_maxima(annual_maxima) assert annual_maxima.shape[1] == len(self.column_mask) annual_maxima = annual_maxima[:, self.column_mask] year_min, year_max = get_year_min_and_year_max_from_scenario(real_scenario, self.gcm_rcm_couple) diff --git a/extreme_data/meteo_france_data/adamont_data/adamont/adamont_crocus.py b/extreme_data/meteo_france_data/adamont_data/adamont/adamont_crocus.py new file mode 100644 index 0000000000000000000000000000000000000000..32da20bddc33356bab8d0c932c8105ba49e699d6 --- /dev/null +++ b/extreme_data/meteo_france_data/adamont_data/adamont/adamont_crocus.py @@ -0,0 +1,28 @@ +from extreme_data.meteo_france_data.adamont_data.abstract_adamont_study import AbstractAdamontStudy +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_variables import CrocusSweSimulationVariable, \ + CrocusTotalSnowLoadVariable +from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario +from extreme_data.meteo_france_data.scm_models_data.crocus.crocus_variables import CrocusVariable +from extreme_data.meteo_france_data.scm_models_data.utils import Season, FrenchRegion + + +class AdamontSwe(AbstractAdamontStudy): + + def __init__(self, *args, **kwargs): + super().__init__(CrocusSweSimulationVariable, *args, **kwargs) + + +class AdamontSnowLoad(AbstractAdamontStudy): + + def __init__(self, *args, **kwargs): + super().__init__(CrocusTotalSnowLoadVariable, *args, **kwargs) + + def load_annual_maxima(self, dataset): + return CrocusVariable.snow_load_multiplication_factor * super().load_annual_maxima(dataset) + + +if __name__ == '__main__': + for study_class in [AdamontSwe, AdamontSnowLoad]: + study = study_class(altitude=1800, adamont_version=2, gcm_rcm_couple=('HadGEM2-ES', 'RACMO22E'), + scenario=AdamontScenario.rcp85_extended) + print(study.year_to_annual_maxima[2000]) \ No newline at end of file diff --git a/extreme_data/meteo_france_data/adamont_data/adamont/adamont_snowfall.py b/extreme_data/meteo_france_data/adamont_data/adamont/adamont_safran.py similarity index 57% rename from extreme_data/meteo_france_data/adamont_data/adamont/adamont_snowfall.py rename to extreme_data/meteo_france_data/adamont_data/adamont/adamont_safran.py index 822136ea6d190e518eafe47c8f6fcde4a27571d2..87ece7924c7b93880fd78303e728ceb61ea0194f 100644 --- a/extreme_data/meteo_france_data/adamont_data/adamont/adamont_snowfall.py +++ b/extreme_data/meteo_france_data/adamont_data/adamont/adamont_safran.py @@ -7,15 +7,8 @@ from extreme_data.meteo_france_data.scm_models_data.utils import Season, FrenchR class AdamontSnowfall(AbstractAdamontStudy): - def __init__(self, altitude: int = 1800, - year_min=None, year_max=None, - multiprocessing=True, season=Season.annual, - french_region=FrenchRegion.alps, - scenario=AdamontScenario.histo, gcm_rcm_couple=('CNRM-CM5', 'ALADIN53'), - adamont_version=2): - super().__init__(SafranSnowfallSimulationVariable, altitude, - year_min, year_max, - multiprocessing, season, french_region, scenario, gcm_rcm_couple, adamont_version) + def __init__(self, *args, **kwargs): + super().__init__(SafranSnowfallSimulationVariable, *args, **kwargs) if __name__ == '__main__': diff --git a/extreme_data/meteo_france_data/adamont_data/adamont/adamont_variables.py b/extreme_data/meteo_france_data/adamont_data/adamont/adamont_variables.py index 816094750b06a4ddb8ffd23fca14f8f0edeeb2cc..ab6a061c1ffb2248349548d9d74674e7c25c2e50 100644 --- a/extreme_data/meteo_france_data/adamont_data/adamont/adamont_variables.py +++ b/extreme_data/meteo_france_data/adamont_data/adamont/adamont_variables.py @@ -1,6 +1,8 @@ import numpy as np from extreme_data.meteo_france_data.scm_models_data.abstract_variable import AbstractVariable +from extreme_data.meteo_france_data.scm_models_data.crocus.crocus_variables import AbstractSnowLoadVariable, \ + TotalSnowLoadVariable, CrocusTotalSweVariable from extreme_data.meteo_france_data.scm_models_data.safran.safran_variable import SafranSnowfallVariable from root_utils import classproperty @@ -15,10 +17,16 @@ class AbstractAdamontVariable(AbstractVariable): def indicator_name_for_maxima(cls): raise NotImplementedError + @classmethod + def transform_annual_maxima(cls, annual_maxima): + return annual_maxima + class SafranSnowfallSimulationVariable(AbstractAdamontVariable): UNIT = SafranSnowfallVariable.UNIT NAME = SafranSnowfallVariable.NAME + # For adamont v1 + @property def daily_time_serie_array(self) -> np.ndarray: return self.variable_array @@ -27,6 +35,8 @@ class SafranSnowfallSimulationVariable(AbstractAdamontVariable): def keyword(cls): return 'SNOW' + # For adamont v2 + @classmethod def variable_name_for_folder_and_nc_file(cls): return 'Snow' @@ -35,3 +45,28 @@ class SafranSnowfallSimulationVariable(AbstractAdamontVariable): def indicator_name_for_maxima(cls): return 'max-1day-snowf' + +class CrocusSweSimulationVariable(AbstractAdamontVariable): + UNIT = CrocusTotalSweVariable.UNIT + NAME = CrocusTotalSweVariable.NAME + + # For adamont v2 + + @classmethod + def variable_name_for_folder_and_nc_file(cls): + return cls.indicator_name_for_maxima.replace('-', '_').capitalize() + + @classproperty + def indicator_name_for_maxima(cls): + return 'swe-max-winter-11-04-NN' + + +class CrocusTotalSnowLoadVariable(CrocusSweSimulationVariable): + NAME = TotalSnowLoadVariable.NAME + UNIT = TotalSnowLoadVariable.UNIT + + @classmethod + def transform_annual_maxima(cls, annual_maxima): + return AbstractSnowLoadVariable.transform_swe_into_snow_load(annual_maxima) + + diff --git a/extreme_data/meteo_france_data/adamont_data/utils/download_adamont.py b/extreme_data/meteo_france_data/adamont_data/utils/download_adamont_v1.py similarity index 100% rename from extreme_data/meteo_france_data/adamont_data/utils/download_adamont.py rename to extreme_data/meteo_france_data/adamont_data/utils/download_adamont_v1.py diff --git a/extreme_data/meteo_france_data/scm_models_data/crocus/crocus.py b/extreme_data/meteo_france_data/scm_models_data/crocus/crocus.py index ff0473ca1ff0f28ee91c65550b7e81e96a2bd0ab..104dbf30250a92087d863dac9f66b44c7f4fbd09 100644 --- a/extreme_data/meteo_france_data/scm_models_data/crocus/crocus.py +++ b/extreme_data/meteo_france_data/scm_models_data/crocus/crocus.py @@ -134,7 +134,7 @@ class CrocusDaysWithSnowOnGround(Crocus): if __name__ == '__main__': - for study in [CrocusSwe3Days(altitude=900, orientation=90.0)]: + for study in [CrocusSnowLoadTotal(altitude=900, orientation=90.0)]: d = study.year_to_dataset_ordered_dict[1959] print(d) print(study.reanalysis_path) diff --git a/extreme_data/meteo_france_data/scm_models_data/crocus/crocus_variables.py b/extreme_data/meteo_france_data/scm_models_data/crocus/crocus_variables.py index 77896b70591f34f3c2f03e63956094f15446ef3d..ab426a9f6e6798df5c6689ecc60889717419e92b 100644 --- a/extreme_data/meteo_france_data/scm_models_data/crocus/crocus_variables.py +++ b/extreme_data/meteo_france_data/scm_models_data/crocus/crocus_variables.py @@ -57,8 +57,11 @@ class AbstractSnowLoadVariable(CrocusVariable): @property def daily_time_serie_array(self) -> np.ndarray: - snow_pressure = self.snow_load_multiplication_factor * super().daily_time_serie_array - return snow_pressure + return self.transform_swe_into_snow_load(super().daily_time_serie_array) + + @classmethod + def transform_swe_into_snow_load(cls, swe): + return cls.snow_load_multiplication_factor * swe class RecentSnowLoadVariableOneDay(AbstractSnowLoadVariable, CrocusRecentSweVariableOneDay): diff --git a/extreme_data/meteo_france_data/scm_models_data/visualization/main_study_visualizer.py b/extreme_data/meteo_france_data/scm_models_data/visualization/main_study_visualizer.py index c6899e4dc6c313e50f4736b1c955ca08eef9f25e..7dbf4ba2bbbb91518a5d1de2fe68fd6f1deb852f 100644 --- a/extreme_data/meteo_france_data/scm_models_data/visualization/main_study_visualizer.py +++ b/extreme_data/meteo_france_data/scm_models_data/visualization/main_study_visualizer.py @@ -2,7 +2,7 @@ import time from collections import OrderedDict from typing import List -from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_safran import AdamontSnowfall from extreme_data.meteo_france_data.scm_models_data.abstract_study import AbstractStudy from extreme_data.meteo_france_data.scm_models_data.crocus.crocus import CrocusDepth, CrocusSweTotal, \ ExtendedCrocusDepth, \ diff --git a/projects/past_extreme_snowfall/section_data_and_results/preliminary_analysis.py b/projects/past_extreme_snowfall/section_data_and_results/preliminary_analysis.py index e3387eadfe3386efa83f928d53ef61b23a9358e0..ff04a43df66d4ffae21261a4cec76fe0d70034cc 100644 --- a/projects/past_extreme_snowfall/section_data_and_results/preliminary_analysis.py +++ b/projects/past_extreme_snowfall/section_data_and_results/preliminary_analysis.py @@ -5,7 +5,7 @@ from itertools import chain import numpy as np from extreme_data.meteo_france_data.adamont_data.abstract_adamont_study import AbstractAdamontStudy -from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_safran import AdamontSnowfall from extreme_data.meteo_france_data.adamont_data.adamont_gcm_rcm_couples import _gcm_rcm_couple_adamont_v2_to_full_name from extreme_data.meteo_france_data.adamont_data.adamont_scenario import get_gcm_rcm_couples, rcp_scenarios from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall1Day diff --git a/projects/projected_extreme_snowfall/checks/main_inquiry_weird_pattern.py b/projects/projected_extreme_snowfall/checks/main_inquiry_weird_pattern.py index 4cc564ef46c3ca82ba775887b7d046f383ecd4b1..ab3ddc47b2a764bdb2a3aa05054d9b65ba1e731e 100644 --- a/projects/projected_extreme_snowfall/checks/main_inquiry_weird_pattern.py +++ b/projects/projected_extreme_snowfall/checks/main_inquiry_weird_pattern.py @@ -1,4 +1,4 @@ -from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_safran import AdamontSnowfall from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario from extreme_data.meteo_france_data.scm_models_data.altitudes_studies import AltitudesStudies diff --git a/projects/projected_extreme_snowfall/evaluation/main_comparison_on_quantile_period.py b/projects/projected_extreme_snowfall/evaluation/main_comparison_on_quantile_period.py index 042cc1dffd2e62d4d573d8583993936a9e153eb1..ff21e6353c9ca157b108a7bb1e6851d1d863ce18 100644 --- a/projects/projected_extreme_snowfall/evaluation/main_comparison_on_quantile_period.py +++ b/projects/projected_extreme_snowfall/evaluation/main_comparison_on_quantile_period.py @@ -2,7 +2,7 @@ import numpy as np import os.path as op import matplotlib -from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_safran import AdamontSnowfall from extreme_data.meteo_france_data.adamont_data.adamont_gcm_rcm_couples import \ get_year_min_and_year_max_used_to_compute_quantile, gcm_rcm_couple_to_color from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario, \ diff --git a/projects/projected_extreme_snowfall/main_elevation_temporal_for_projections_ensemble.py b/projects/projected_extreme_snowfall/main_elevation_temporal_for_projections_ensemble.py index d991d92676e50ade982dc859ad25fa7de0df9e69..06b95de05fc99405dbe5e82408f5c39d9f8ce452 100644 --- a/projects/projected_extreme_snowfall/main_elevation_temporal_for_projections_ensemble.py +++ b/projects/projected_extreme_snowfall/main_elevation_temporal_for_projections_ensemble.py @@ -21,7 +21,7 @@ from extreme_trend.elevation_temporal_model_for_projections.visualizer_for_proje import matplotlib from extreme_fit.model.utils import set_seed_for_test -from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_safran import AdamontSnowfall from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario, get_gcm_rcm_couples, \ rcp_scenarios from spatio_temporal_dataset.coordinates.temporal_coordinates.abstract_temporal_covariate_for_fit import TimeTemporalCovariate diff --git a/projects/projected_extreme_snowfall/section_data/main_data.py b/projects/projected_extreme_snowfall/section_data/main_data.py index 4bb243598ab469b5bf6aaa791a5c38d719b3aa1a..f20e2858bf50acd438cbb9301084e84a5eca762f 100644 --- a/projects/projected_extreme_snowfall/section_data/main_data.py +++ b/projects/projected_extreme_snowfall/section_data/main_data.py @@ -9,7 +9,7 @@ mpl.rcParams['text.latex.preamble'] = [r'\usepackage{amsmath}'] import matplotlib.pyplot as plt from projects.projected_extreme_snowfall.evaluation.comparison_plot import individual_plot -from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_safran import AdamontSnowfall from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario, get_gcm_rcm_couples, \ scenario_to_real_scenarios, rcp_scenarios, rcm_scenarios_extended from extreme_data.meteo_france_data.adamont_data.adamont_studies import AdamontStudies diff --git a/test/test_extreme_data/test_meteo_france_data/test_adamont_study.py b/test/test_extreme_data/test_meteo_france_data/test_adamont_study.py index a987b096c661191d10706b5f20691c32f3606dd7..e7305c8404669ef30dbc8080d4819ce6aa714451 100644 --- a/test/test_extreme_data/test_meteo_france_data/test_adamont_study.py +++ b/test/test_extreme_data/test_meteo_france_data/test_adamont_study.py @@ -1,9 +1,11 @@ import unittest +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_crocus import AdamontSwe, AdamontSnowLoad from extreme_data.meteo_france_data.adamont_data.adamont_gcm_rcm_couples import get_gcm_rcm_couple_adamont_to_full_name from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario, adamont_scenarios_real, \ rcp_scenarios, get_gcm_rcm_couples, rcm_scenarios_extended -from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_safran import AdamontSnowfall +from extreme_data.meteo_france_data.scm_models_data.crocus.crocus_variables import CrocusVariable from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall1Day @@ -11,24 +13,36 @@ class TestAdamontStudy(unittest.TestCase): def test_load_adamont_snowfall(self): for version in [1, 2][:]: - study_list = [ - AdamontSnowfall(altitude=900, adamont_version=version), - AdamontSnowfall(altitude=1800, adamont_version=version) - ] - for scenario in rcp_scenarios + rcm_scenarios_extended: - gcm_rcm_couples = get_gcm_rcm_couples(scenario, version) - if len(gcm_rcm_couples) > 0: - first_gcm_rcm_couple = gcm_rcm_couples[0] - study_list.append(AdamontSnowfall(altitude=900, scenario=scenario, adamont_version=version, - gcm_rcm_couple=first_gcm_rcm_couple)) + self.load_many_study(AdamontSnowfall, version) + self.assertTrue(True) + + def test_load_adamont_swe(self): + self.load_many_study(AdamontSwe, version=2) + self.assertTrue(True) - study_list.extend([AdamontSnowfall(altitude=900, gcm_rcm_couple=gcm_rcm_couple, adamont_version=version) - for gcm_rcm_couple in get_gcm_rcm_couples(adamont_version=version)]) - for study in study_list: - annual_maxima_for_year_min = study.year_to_annual_maxima[study.year_min] - # print(study.altitude, study.scenario_name, study.gcm_rcm_couple) - # print(len(study.massif_name_to_annual_maxima['Vanoise'])) - self.assertTrue(True) + def test_load_adamont_swe(self): + maxima = [study_class(altitude=1800, adamont_version=2, gcm_rcm_couple=('HadGEM2-ES', 'RACMO22E'), + scenario=AdamontScenario.rcp85_extended).year_to_annual_maxima[2000][0] + for study_class in [AdamontSwe, AdamontSnowLoad]] + swe, snow_load = maxima + snow_load_from_swe = swe * CrocusVariable.snow_load_multiplication_factor + self.assertEqual(snow_load_from_swe, snow_load) + + def load_many_study(self, adamont_study_class, version): + study_list = [ + adamont_study_class(altitude=900, adamont_version=version), + adamont_study_class(altitude=1800, adamont_version=version) + ] + for scenario in rcp_scenarios + rcm_scenarios_extended: + gcm_rcm_couples = get_gcm_rcm_couples(scenario, version) + if len(gcm_rcm_couples) > 0: + first_gcm_rcm_couple = gcm_rcm_couples[0] + study_list.append(adamont_study_class(altitude=900, scenario=scenario, adamont_version=version, + gcm_rcm_couple=first_gcm_rcm_couple)) + study_list.extend([adamont_study_class(altitude=900, gcm_rcm_couple=gcm_rcm_couple, adamont_version=version) + for gcm_rcm_couple in get_gcm_rcm_couples(adamont_version=version)]) + for study in study_list: + annual_maxima_for_year_min = study.year_to_annual_maxima[study.year_min] def test_massifs_names_adamont_v2(self): year_min = 2004 @@ -47,7 +61,6 @@ class TestAdamontStudy(unittest.TestCase): self.assertEqual(len(study.ordered_years), len(study.massif_name_to_annual_maxima["Vanoise"])) self.assertTrue(True) - def test_existing_gcm_rcm_couple_and_rcp(self): altitude = 1800 for scenario in rcp_scenarios[:]: diff --git a/test/test_extreme_data/test_meteo_france_data/test_altitudes_studies.py b/test/test_extreme_data/test_meteo_france_data/test_altitudes_studies.py index c1525de2d1dcf7e8d0ab2d2fd06f2dce6d1ae177..0c34971cefba5eb9110d174d184899de9979a47b 100644 --- a/test/test_extreme_data/test_meteo_france_data/test_altitudes_studies.py +++ b/test/test_extreme_data/test_meteo_france_data/test_altitudes_studies.py @@ -1,6 +1,6 @@ import unittest -from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_safran import AdamontSnowfall from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall1Day from extreme_data.meteo_france_data.scm_models_data.altitudes_studies import AltitudesStudies diff --git a/test/test_extreme_trend/test_one_fold_fit.py b/test/test_extreme_trend/test_one_fold_fit.py index e4e2a5462834fcf18701f332880490d888b9df1b..0196e983d32419e281d4536a8b299b9d54f711f2 100644 --- a/test/test_extreme_trend/test_one_fold_fit.py +++ b/test/test_extreme_trend/test_one_fold_fit.py @@ -1,6 +1,6 @@ import unittest -from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_safran import AdamontSnowfall from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario from extreme_data.meteo_france_data.adamont_data.cmip5.temperature_to_year import temperature_minmax_to_year_minmax from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall1Day