Commit 36d76e17 authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

add scenario rcp85_extended and how to handle it.

parent 5e56312a
No related merge requests found
Showing with 118 additions and 51 deletions
+118 -51
...@@ -10,7 +10,8 @@ from netCDF4._netCDF4 import Dataset ...@@ -10,7 +10,8 @@ from netCDF4._netCDF4 import Dataset
from extreme_data.meteo_france_data.adamont_data.adamont.adamont_variables import AbstractAdamontVariable from extreme_data.meteo_france_data.adamont_data.adamont.adamont_variables import AbstractAdamontVariable
from extreme_data.meteo_france_data.adamont_data.adamont_scenario import scenario_to_str, AdamontScenario, \ from extreme_data.meteo_france_data.adamont_data.adamont_scenario import scenario_to_str, AdamontScenario, \
get_year_min_and_year_max_from_scenario, gcm_rcm_couple_to_full_name, get_suffix_for_the_nc_file get_year_min_and_year_max_from_scenario, gcm_rcm_couple_to_full_name, get_suffix_for_the_nc_file, \
scenario_to_real_scenarios, get_year_max
from extreme_data.meteo_france_data.adamont_data.utils.utils import massif_number_to_massif_name from extreme_data.meteo_france_data.adamont_data.utils.utils import massif_number_to_massif_name
ADAMONT_PATH = r"/home/erwan/Documents/projects/spatiotemporalextremes/local/spatio_temporal_datasets/ADAMONT" ADAMONT_PATH = r"/home/erwan/Documents/projects/spatiotemporalextremes/local/spatio_temporal_datasets/ADAMONT"
...@@ -56,31 +57,37 @@ class AbstractAdamontStudy(AbstractStudy): ...@@ -56,31 +57,37 @@ class AbstractAdamontStudy(AbstractStudy):
def ordered_years(self): def ordered_years(self):
return list(range(self.year_min, self.year_max + 1)) return list(range(self.year_min, self.year_max + 1))
@cached_property def winter_years_for_each_time_step(self, real_scenario, dataset):
def winter_year_for_each_time_step(self): year_min, year_max = get_year_min_and_year_max_from_scenario(real_scenario, self.gcm_rcm_couple)
year_min, _ = get_year_min_and_year_max_from_scenario(self.scenario, self.gcm_rcm_couple)
# It was written in the dataset for the TIME variable that it represents # It was written in the dataset for the TIME variable that it represents
# "'hours since 1950-08-01 06:00:00'" for the HISTO scenario # "'hours since 1950-08-01 06:00:00'" for the HISTO scenario
# "'hours since 2005-08-01 06:00:00'" for the RCP scenario # "'hours since 2005-08-01 06:00:00'" for the RCP scenario
start = datetime(year=year_min - 1, month=8, day=1, hour=6, minute=0, second=0) start = datetime(year=year_min - 1, month=8, day=1, hour=6, minute=0, second=0)
hours_after_start = np.array(self.dataset.variables['TIME']) hours_after_start = np.array(dataset.variables['TIME'])
dates = [start + timedelta(hours=h) for h in hours_after_start] dates = [start + timedelta(hours=h) for h in hours_after_start]
winter_year = [date.year if date.month < 8 else date.year + 1 for date in dates] winter_years = [date.year if date.month < 8 else date.year + 1 for date in dates]
# Remark. The last winter year for the HISTO scenario correspond to 2006. return winter_years
# Thus, the last value is not taken into account
return np.array(winter_year)
@cached_property @cached_property
def year_to_variable_object(self) -> OrderedDict: def year_to_variable_object(self) -> OrderedDict:
year_to_data_list = {} year_to_data_list = {}
for year in self.ordered_years: for year in self.ordered_years:
year_to_data_list[year] = [] year_to_data_list[year] = []
data_list = self.dataset.variables[self.variable_class.keyword()] # Load data & year list
data_year_list = self.winter_year_for_each_time_step data_list, data_year_list = [], []
assert len(data_list) == len(data_year_list) for dataset, real_scenario in zip(self.datasets, self.adamont_real_scenarios):
data_list.extend(dataset.variables[self.variable_class.keyword()])
data_year_list.extend(self.winter_years_for_each_time_step(real_scenario, dataset))
# Remark. The last winter year for the HISTO scenario correspond to 2006.
# Thus, the last value is not taken into account
if data_year_list[-1] > get_year_max(real_scenario, self.gcm_rcm_couple):
data_year_list = data_year_list[:-1]
data_list = data_list[:-1]
assert len(data_list) == len(data_year_list)
for year_data, data in zip(data_year_list, data_list): for year_data, data in zip(data_year_list, data_list):
if self.year_min <= year_data <= self.year_max: if self.year_min <= year_data <= self.year_max:
year_to_data_list[year_data].append(data) year_to_data_list[year_data].append(data)
# Load the variable object
year_to_variable_object = OrderedDict() year_to_variable_object = OrderedDict()
for year in self.ordered_years: for year in self.ordered_years:
variable_array = np.array(year_to_data_list[year]) variable_array = np.array(year_to_data_list[year])
...@@ -98,8 +105,13 @@ class AbstractAdamontStudy(AbstractStudy): ...@@ -98,8 +105,13 @@ class AbstractAdamontStudy(AbstractStudy):
return [massif_number_to_massif_name[massif_id] for massif_id in massif_ids] return [massif_number_to_massif_name[massif_id] for massif_id in massif_ids]
@cached_property @cached_property
def datasets(self):
return [Dataset(file_path) for file_path in self.nc_file_paths]
@property
def dataset(self): def dataset(self):
return Dataset(self.nc_file_path) # todo: improve that
return self.datasets[0]
# PATHS # PATHS
...@@ -107,22 +119,29 @@ class AbstractAdamontStudy(AbstractStudy): ...@@ -107,22 +119,29 @@ class AbstractAdamontStudy(AbstractStudy):
def variable_folder_name(self): def variable_folder_name(self):
return self.variable_class.variable_name_for_folder_and_nc_file() return self.variable_class.variable_name_for_folder_and_nc_file()
@property
def scenario_name(self):
return scenario_to_str(self.scenario)
@property @property
def region_name(self): def region_name(self):
return french_region_to_str(self.french_region) return french_region_to_str(self.french_region)
@property @property
def nc_files_path(self): def adamont_real_scenarios(self):
return op.join(ADAMONT_PATH, self.variable_folder_name, self.scenario_name) return scenario_to_real_scenarios(self.scenario)
@property
def scenario_names(self):
return [scenario_to_str(scenario) for scenario in self.adamont_real_scenarios]
@property
def nc_files_paths(self):
return [op.join(ADAMONT_PATH, self.variable_folder_name, name) for name in self.scenario_names]
@property @property
def nc_file_path(self): def nc_file_paths(self):
suffix_nc_file = get_suffix_for_the_nc_file(self.scenario, self.gcm_rcm_couple) file_paths = []
nc_file = '{}_FORCING_{}_{}_{}_{}.nc'.format(self.variable_folder_name, self.gcm_rcm_full_name, for scenario, scenario_name, files_path in zip(self.adamont_real_scenarios, self.scenario_names, self.nc_files_paths):
self.scenario_name, suffix_nc_file = get_suffix_for_the_nc_file(scenario, self.gcm_rcm_couple)
self.region_name, suffix_nc_file) nc_file = '{}_FORCING_{}_{}_{}_{}.nc'.format(self.variable_folder_name, self.gcm_rcm_full_name,
return op.join(self.nc_files_path, nc_file) scenario_name,
self.region_name, suffix_nc_file)
file_paths.append(op.join(files_path, nc_file))
return file_paths
...@@ -6,12 +6,36 @@ class AdamontScenario(Enum): ...@@ -6,12 +6,36 @@ class AdamontScenario(Enum):
rcp26 = 1 rcp26 = 1
rcp45 = 2 rcp45 = 2
rcp85 = 3 rcp85 = 3
rcp85_extended = 4
adamont_scenarios_real = [AdamontScenario.histo, AdamontScenario.rcp26, AdamontScenario.rcp45, AdamontScenario.rcp85]
def get_year_min_and_year_max_from_scenario(adamont_scenario, gcm_rcm_couple): def get_year_min_and_year_max_from_scenario(adamont_scenario, gcm_rcm_couple):
assert isinstance(adamont_scenario, AdamontScenario) assert isinstance(adamont_scenario, AdamontScenario)
year_min = get_year_min(adamont_scenario, gcm_rcm_couple)
year_max = get_year_max(adamont_scenario, gcm_rcm_couple)
return year_min, year_max
def get_year_max(adamont_scenario, gcm_rcm_couple):
real_adamont_scenarios = scenario_to_real_scenarios(adamont_scenario)
gcm, rcm = gcm_rcm_couple gcm, rcm = gcm_rcm_couple
if adamont_scenario == AdamontScenario.histo: if any([scenario is not AdamontScenario.histo for scenario in real_adamont_scenarios]):
if gcm == 'HadGEM2-ES':
year_max = 2099
else:
year_max = 2100
else:
year_max = 2005
return year_max
def get_year_min(adamont_scenario, gcm_rcm_couple):
real_adamont_scenarios = scenario_to_real_scenarios(adamont_scenario)
gcm, rcm = gcm_rcm_couple
if AdamontScenario.histo in real_adamont_scenarios:
if gcm == 'HadGEM2-ES': if gcm == 'HadGEM2-ES':
year_min = 1982 year_min = 1982
elif rcm == 'RCA4': elif rcm == 'RCA4':
...@@ -20,14 +44,9 @@ def get_year_min_and_year_max_from_scenario(adamont_scenario, gcm_rcm_couple): ...@@ -20,14 +44,9 @@ def get_year_min_and_year_max_from_scenario(adamont_scenario, gcm_rcm_couple):
year_min = 1952 year_min = 1952
else: else:
year_min = 1951 year_min = 1951
year_max = 2005
else: else:
year_min = 2006 year_min = 2006
if gcm == 'HadGEM2-ES': return year_min
year_max = 2099
else:
year_max = 2100
return year_min, year_max
def load_gcm_rcm_couples_for_year_min_and_year_max(year_min, year_max, adamont_scenario=AdamontScenario.histo): def load_gcm_rcm_couples_for_year_min_and_year_max(year_min, year_max, adamont_scenario=AdamontScenario.histo):
...@@ -42,6 +61,7 @@ def load_gcm_rcm_couples_for_year_min_and_year_max(year_min, year_max, adamont_s ...@@ -42,6 +61,7 @@ def load_gcm_rcm_couples_for_year_min_and_year_max(year_min, year_max, adamont_s
def get_suffix_for_the_nc_file(adamont_scenario, gcm_rcm_couple): def get_suffix_for_the_nc_file(adamont_scenario, gcm_rcm_couple):
assert isinstance(adamont_scenario, AdamontScenario)
year_min, year_max = get_year_min_and_year_max_from_scenario(adamont_scenario, gcm_rcm_couple) year_min, year_max = get_year_min_and_year_max_from_scenario(adamont_scenario, gcm_rcm_couple)
return '{}080106_{}080106_daysum'.format(year_min - 1, year_max) return '{}080106_{}080106_daysum'.format(year_min - 1, year_max)
...@@ -50,6 +70,16 @@ def scenario_to_str(adamont_scenario): ...@@ -50,6 +70,16 @@ def scenario_to_str(adamont_scenario):
return str(adamont_scenario).split('.')[-1].upper() return str(adamont_scenario).split('.')[-1].upper()
def scenario_to_real_scenarios(adamont_scenario):
if adamont_scenario in adamont_scenarios_real:
return [adamont_scenario]
else:
if adamont_scenario is AdamontScenario.rcp85_extended:
return [AdamontScenario.histo, AdamontScenario.rcp85]
else:
raise NotImplementedError
def gcm_rcm_couple_to_str(gcm_rcm_couple): def gcm_rcm_couple_to_str(gcm_rcm_couple):
return ' / '.join(gcm_rcm_couple) return ' / '.join(gcm_rcm_couple)
......
...@@ -2,8 +2,10 @@ import matplotlib.pyplot as plt ...@@ -2,8 +2,10 @@ import matplotlib.pyplot as plt
from collections import OrderedDict from collections import OrderedDict
import numpy as np
from cached_property import cached_property from cached_property import cached_property
from extreme_data.meteo_france_data.adamont_data.abstract_adamont_study import AbstractAdamontStudy
from extreme_data.meteo_france_data.adamont_data.adamont_scenario import gcm_rcm_couple_to_full_name, \ from extreme_data.meteo_france_data.adamont_data.adamont_scenario import gcm_rcm_couple_to_full_name, \
gcm_rcm_couple_to_str, get_color_from_gcm_rcm_couple gcm_rcm_couple_to_str, get_color_from_gcm_rcm_couple
from extreme_data.meteo_france_data.scm_models_data.abstract_study import AbstractStudy from extreme_data.meteo_france_data.scm_models_data.abstract_study import AbstractStudy
...@@ -19,7 +21,7 @@ class AdamontStudies(object): ...@@ -19,7 +21,7 @@ class AdamontStudies(object):
if gcm_rcm_couples is None: if gcm_rcm_couples is None:
gcm_rcm_couples = list(gcm_rcm_couple_to_full_name.keys()) gcm_rcm_couples = list(gcm_rcm_couple_to_full_name.keys())
self.gcm_rcm_couples = gcm_rcm_couples self.gcm_rcm_couples = gcm_rcm_couples
self.gcm_rcm_couple_to_study = OrderedDict() # type: OrderedDict[int, AbstractStudy] self.gcm_rcm_couple_to_study = OrderedDict() # type: OrderedDict[int, AbstractAdamontStudy]
for gcm_rcm_couple in self.gcm_rcm_couples: for gcm_rcm_couple in self.gcm_rcm_couples:
study = study_class(gcm_rcm_couple=gcm_rcm_couple, **kwargs_study) study = study_class(gcm_rcm_couple=gcm_rcm_couple, **kwargs_study)
self.gcm_rcm_couple_to_study[gcm_rcm_couple] = study self.gcm_rcm_couple_to_study[gcm_rcm_couple] = study
...@@ -55,7 +57,16 @@ class AdamontStudies(object): ...@@ -55,7 +57,16 @@ class AdamontStudies(object):
label = gcm_rcm_couple_to_str(gcm_rcm_couple) label = gcm_rcm_couple_to_str(gcm_rcm_couple)
color = get_color_from_gcm_rcm_couple(gcm_rcm_couple) color = get_color_from_gcm_rcm_couple(gcm_rcm_couple)
ax.plot(x, y, linewidth=linewidth, label=label, color=color) ax.plot(x, y, linewidth=linewidth, label=label, color=color)
if scm_study is not None: if scm_study is None:
y = np.array([study.massif_name_to_annual_maxima[massif_name] for study in self.study_list
if massif_name in study.massif_name_to_annual_maxima])
if len(y) > 0:
y = np.mean(y, axis=0)
label = 'Mean maxima'
color = 'black'
ax.plot(x, y, linewidth=linewidth * 2, label=label, color=color)
else:
# todo: otherwise display the mean in strong black
try: try:
y = scm_study.massif_name_to_annual_maxima[massif_name] y = scm_study.massif_name_to_annual_maxima[massif_name]
label = 'Reanalysis' label = 'Reanalysis'
...@@ -64,10 +75,11 @@ class AdamontStudies(object): ...@@ -64,10 +75,11 @@ class AdamontStudies(object):
except KeyError: except KeyError:
pass pass
ax.xaxis.set_ticks(x[1::10]) ax.xaxis.set_ticks([year for year in y if year % 10 == 0])
ax.grid()
ax.tick_params(axis='both', which='major', labelsize=13) ax.tick_params(axis='both', which='major', labelsize=13)
handles, labels = ax.get_legend_handles_labels() handles, labels = ax.get_legend_handles_labels()
ax.legend(handles[::-1], labels[::-1]) ax.legend(handles[::-1], labels[::-1], ncol=2)
plot_name = 'Annual maxima of {} in {}'.format(ADAMONT_STUDY_CLASS_TO_ABBREVIATION[self.study_class], plot_name = 'Annual maxima of {} in {}'.format(ADAMONT_STUDY_CLASS_TO_ABBREVIATION[self.study_class],
massif_name.replace('_', ' ')) massif_name.replace('_', ' '))
ax.set_ylabel('{} ({})'.format(plot_name, self.study.variable_unit), fontsize=15) ax.set_ylabel('{} ({})'.format(plot_name, self.study.variable_unit), fontsize=15)
......
from collections import OrderedDict
import matplotlib as mpl import matplotlib as mpl
mpl.use('Agg') mpl.use('Agg')
mpl.rcParams['text.usetex'] = True mpl.rcParams['text.usetex'] = True
mpl.rcParams['text.latex.preamble'] = [r'\usepackage{amsmath}'] mpl.rcParams['text.latex.preamble'] = [r'\usepackage{amsmath}']
from projects.projected_snowfall.comparison_with_scm.comparison_plot import individual_plot from projects.projected_snowfall.comparison_with_scm.comparison_plot import individual_plot, collective_plot
from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall
from extreme_data.meteo_france_data.adamont_data.adamont_scenario import load_gcm_rcm_couples_for_year_min_and_year_max, \ from extreme_data.meteo_france_data.adamont_data.adamont_scenario import load_gcm_rcm_couples_for_year_min_and_year_max, \
...@@ -34,15 +36,15 @@ def main(): ...@@ -34,15 +36,15 @@ def main():
# Load visualizers # Load visualizers
# Individual plot # Individual plot
for altitude in altitudes: # for altitude in altitudes:
v = load_visualizer_histo(altitude, massif_names, year_min) # v = load_visualizer_histo(altitude, massif_names, year_min)
individual_plot(v) # individual_plot(v)
# # Collective plot # # Collective plot
# altitude_to_visualizer = OrderedDict() altitude_to_visualizer = OrderedDict()
# for altitude in altitudes: for altitude in altitudes:
# altitude_to_visualizer[altitude] = load_visualizer_histo(altitude, massif_names, year_min) altitude_to_visualizer[altitude] = load_visualizer_histo(altitude, massif_names, year_min)
# collective_plot(altitude_to_visualizer) collective_plot(altitude_to_visualizer)
def load_visualizer_histo(altitude, massif_names, year_min): def load_visualizer_histo(altitude, massif_names, year_min):
......
...@@ -18,7 +18,7 @@ from projects.projected_snowfall.comparison_with_scm.comparison_historical_visua ...@@ -18,7 +18,7 @@ from projects.projected_snowfall.comparison_with_scm.comparison_historical_visua
def main(): def main():
fast = True fast = False
# Set the year_min and year_max for the comparison # Set the year_min and year_max for the comparison
if fast: if fast:
year_min = [2006][0] year_min = [2006][0]
...@@ -29,18 +29,19 @@ def main(): ...@@ -29,18 +29,19 @@ def main():
year_min = [2006][0] year_min = [2006][0]
year_max = [2100][0] year_max = [2100][0]
massif_names = None massif_names = None
altitudes = [900, 1800, 2700] altitudes = [900, 1800, 2700, 3600][2:]
adamont_scenario = AdamontScenario.rcp85
# Load studies # Load studies
for altitude in altitudes: for altitude in altitudes:
adamont_study_class = AdamontSnowfall adamont_study_class = AdamontSnowfall
season = Season.annual season = Season.annual
gcm_rcm_couples = load_gcm_rcm_couples_for_year_min_and_year_max(year_min, year_max, gcm_rcm_couples = load_gcm_rcm_couples_for_year_min_and_year_max(year_min, year_max,
adamont_scenario=AdamontScenario.rcp85) adamont_scenario=adamont_scenario)
adamont_studies = AdamontStudies(adamont_study_class, gcm_rcm_couples, adamont_studies = AdamontStudies(adamont_study_class, gcm_rcm_couples,
altitude=altitude, year_min=year_min, altitude=altitude, year_min=year_min,
year_max=year_max, season=season, year_max=year_max, season=season,
scenario=AdamontScenario.rcp85) scenario=adamont_scenario)
adamont_studies.plot_maxima_time_series(massif_names) adamont_studies.plot_maxima_time_series(massif_names)
......
...@@ -11,14 +11,17 @@ class TestAdamontStudy(unittest.TestCase): ...@@ -11,14 +11,17 @@ class TestAdamontStudy(unittest.TestCase):
AdamontSnowfall(altitude=900), AdamontSnowfall(altitude=900),
AdamontSnowfall(altitude=1800) AdamontSnowfall(altitude=1800)
] ]
study_list.extend([AdamontSnowfall(altitude=900, scenario=AdamontScenario.rcp45), study_list.extend([
AdamontSnowfall(altitude=900, scenario=AdamontScenario.rcp85)]) AdamontSnowfall(altitude=900, scenario=AdamontScenario.rcp45),
AdamontSnowfall(altitude=900, scenario=AdamontScenario.rcp85),
AdamontSnowfall(altitude=900, scenario=AdamontScenario.rcp85_extended)
])
study_list.extend([AdamontSnowfall(altitude=900, gcm_rcm_couple=gcm_rcm_couple) study_list.extend([AdamontSnowfall(altitude=900, gcm_rcm_couple=gcm_rcm_couple)
for gcm_rcm_couple in gcm_rcm_couple_to_full_name.keys()]) for gcm_rcm_couple in gcm_rcm_couple_to_full_name.keys()])
for study in study_list: for study in study_list:
annual_maxima_for_year_min = study.year_to_annual_maxima[study.year_min] annual_maxima_for_year_min = study.year_to_annual_maxima[study.year_min]
# print(study.altitude, study.scenario_name, study.gcm_rcm_couple) # print(study.altitude, study.scenario_name, study.gcm_rcm_couple)
# print(annual_maxima_for_year_min) # print(len(study.massif_name_to_annual_maxima['Vanoise']))
self.assertTrue(True) self.assertTrue(True)
......
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