#! /usr/bin/env python """ """ # region // imports import sys import argparse from SDToolBox import outputmessages as outputmessages from SDToolBox import data_acquisition import netCDF4 import numpy as np # endregion # region // variables # endregion class ExtractWavesEra5 : __lon_key = 'lon' __lat_key = 'lat' def __init__(self, input_data: data_acquisition.DataAcquisition) : # verify input_data not none self.dataset = dataset input_data.lat_key = __lon_key input_data.max_longitude = __lat_key def extract_wave_era_5(self, directory_path, yearFrom, yearTo) : variable_name_list = ["swh","pp1d","mwd","mwp"] variable_key_list = ["Hs","Tp","MWD","Tm"] years = [] i = 1 longitude = self.check_for_longitude(self.longitude) years = self.generate_years_array(self.year1, self.yearN) data_struct = {} for name_idx, variable_name in enumerate(variable_name_list) : for year_idx, year in enumerate(range(yearFrom, yearTo)) : variable_idx = 1 file_name = "era5_Global_" + variable_key_list[variable_idx] + "_" + str(year) + ".nc" directory_data_path = directory_path + variable_key_list[variable_idx] file_data_path = directory_data_path + file_name if year_idx == 0 : if variable_idx == 1 : with netCDF4.Dataset(file_data_path, 'r') as f: # result = self.data_acquisition.validate(f) # if result is False : # print("Dataset {} validation failed".format(filepath)) # pass data_struct.time = f.variables['time'] #time variable data_struct.longitude = f.variables['longitude'] #longitude variable data_struct.latitude = f.variables['latitude'] #latitude variable idlon = np.min(np.abs(data_struct.longitude-__lon_key)) idlat = np.min(np.abs(data_struct.latitude-__lat_key)) data_struct.longitude = data_struct.longitude[idlon] data_struct.latitude = data_struct.latitude[idlat] #a_squeezed = np.squeeze(netCDF4.Dataset(file_data_path, variable_name, [idlon idlat 1], [1 1 inf] ) else : #b_squeezed = np.squeeze(netCDF4.Dataset(file_data_path, variable_name, [idlon idlat 1], [1 1 inf] ) #b = [b ; a] if variable_idx == 1 : data_struct.time = np.block(1, data_struct.time, netCDF4.Dataset(file_data_path, 'time')) data_struct.time.add(netCDF4.Dataset(file_data_path, 'time')) #data_struct.add(variable_name, b) @staticmethod def check_for_longitude(longitude): if longitude > 180 : validated_longitude = longitude-180 return validated_longitude return longitude @staticmethod def generate_years_array(year1, yearN): years = [] for i in range(yearN - year1) : years.append(year1 + i) # fills an array of years years.append(yearN) return years