From 69e8c9ec3f5a735021090012d6d9bbdc3536f567 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 4 Apr 2023 16:35:25 -0600 Subject: [PATCH 01/81] Feature: UFS Replay --- scm/etc/scripts/UFS_IC_generator.py | 3789 ++++++++++------- scm/etc/scripts/UFS_LSM_param.py | 36 +- .../scripts/UFS_forcing_ensemble_generator.py | 212 + scm/etc/scripts/fv3_remap.py | 1681 ++++++++ scm/src/fv_eta.h | 458 +- scm/src/run_scm.py | 14 +- scm/src/scm_input.F90 | 3 +- scm/src/scm_vgrid.F90 | 67 +- 8 files changed, 4553 insertions(+), 1707 deletions(-) create mode 100755 scm/etc/scripts/UFS_forcing_ensemble_generator.py create mode 100755 scm/etc/scripts/fv3_remap.py diff --git a/scm/etc/scripts/UFS_IC_generator.py b/scm/etc/scripts/UFS_IC_generator.py index b6db23e87..3005a11b8 100755 --- a/scm/etc/scripts/UFS_IC_generator.py +++ b/scm/etc/scripts/UFS_IC_generator.py @@ -11,6 +11,9 @@ import math import f90nml import re +import fv3_remap +import xesmf +from datetime import datetime, timedelta ############################################################################### # Global settings # @@ -20,11 +23,18 @@ earth_radius = 6371000.0 #m rdgas = 287.05 rvgas = 461.50 +cp = 1004.6 zvir = rvgas/rdgas - 1. +rocp = rdgas/cp grav = 9.80665 +deg_to_rad = math.pi/180.0 +kappa = rdgas/cp +p0 = 100000.0 missing_value = -9999.0 #9.99e20 +n_lam_halo_points = 3 + missing_variable_snow_layers = 3 missing_variable_soil_layers = 4 missing_variable_ice_layers = 2 @@ -32,8 +42,8 @@ # Path to the directory containing processed case input files PROCESSED_CASE_DIR = '../../data/processed_case_input' -# Path to the directory containing NoahMP table files (need MPTABLE.TBL and SOILPARM.TBL) -NOAHMP_TABLES_DIR = '../../data/raw_case_input/NoahMP_tables' +# Path to the directory containing comparison data files +COMPARISON_DATA_DIR = '../../data/comparison_data' # For developers: set logging level to DEBUG for additional output #LOGLEVEL = logging.DEBUG @@ -45,34 +55,39 @@ parser = argparse.ArgumentParser() group1 = parser.add_mutually_exclusive_group(required=True) -group1.add_argument('-l', '--location', help='longitude and latitude in degress E and N, respectively, separated by a space', nargs=2, type=float) -group1.add_argument('-ij','--index', help='i,j indices within the tile (if known - bypasses search for closest model point to lon/lat location)', nargs=2, type=int) -parser.add_argument('-d', '--date', help='date corresponding to initial conditions in YYYYMMDDHHMM format', required=True) -parser.add_argument('-i', '--in_dir', help='input directory path containing FV3 input files', required=True) -parser.add_argument('-g', '--grid_dir', help='directory path containing FV3 tile supergrid files', required=True) -parser.add_argument('-t', '--tile', help='tile of desired point (if known - bypasses tile search if present)', type=int, choices=range(1,7)) -parser.add_argument('-a', '--area', help='area of grid cell in m^2', type=float) -parser.add_argument('-mp','--noahmp', help='flag to generate cold-start ICs for NoahMP LSM from Noah LSM ICs', action='store_true') -parser.add_argument('-n', '--case_name', help='name of case', required=True) -parser.add_argument('-oc','--old_chgres', help='flag to denote that the initial conditions use an older data format (pre-chgres_cube)', action='store_true') - -############################################################################### -# Functions and subroutines # -############################################################################### +group1.add_argument('-l', '--location', help='longitude and latitude in degress E and N, respectively, separated by a space', nargs=2, type=float) +group1.add_argument('-ij', '--index', help='i,j indices within the tile (if known - bypasses search for closest model point to lon/lat location)', nargs=2, type=int) +parser.add_argument('-d', '--date', help='date corresponding to initial conditions in YYYYMMDDHHMMSS format', required=False) +parser.add_argument('-i', '--in_dir', help='input directory path containing FV3 input files', required=True) +parser.add_argument('-g', '--grid_dir', help='directory path containing FV3 tile supergrid files', required=True) +parser.add_argument('-f', '--forcing_dir', help='directory path containing physics diag files', required=True) +parser.add_argument('-n', '--case_name', help='name of case', required=True) +parser.add_argument('-t', '--tile', help='tile of desired point (if known - bypasses tile search if present)', type=int, choices=range(1,8)) +parser.add_argument('-a', '--area', help='area of grid cell in m^2', type=float) +parser.add_argument('-oc', '--old_chgres', help='flag to denote that the initial conditions use an older data format (pre-chgres_cube)', action='store_true') +parser.add_argument('-lam', '--lam', help='flag to signal that the ICs and forcing is from a limited-area model run', action='store_true') +parser.add_argument('-sc', '--save_comp', help='flag to create UFS reference file for comparison', action='store_true') +parser.add_argument('-near','--use_nearest', help='flag to indicate using the nearest UFS history file gridpoint',action='store_true') +######################################################################################## +# +######################################################################################## def parse_arguments(): """Parse command line arguments""" - args = parser.parse_args() - location = args.location - index = args.index - date = args.date - in_dir = args.in_dir - grid_dir = args.grid_dir - tile = args.tile - area = args.area - case_name = args.case_name - noahmp = args.noahmp - old_chgres = args.old_chgres + args = parser.parse_args() + location = args.location + index = args.index + date = args.date + in_dir = args.in_dir + grid_dir = args.grid_dir + forcing_dir = args.forcing_dir + tile = args.tile + area = args.area + case_name = args.case_name + old_chgres = args.old_chgres + lam = args.lam + save_comp = args.save_comp + use_nearest = args.use_nearest #validate args if not os.path.exists(in_dir): @@ -92,24 +107,39 @@ def parse_arguments(): raise Exception(message) date_dict = {} - if len(date) != 12: - message = 'The entered date {0} does not have the 12 characters expected in the format YYYYMMDDHHMM'.format(date) - logging.critical(message) - raise Exception(message) - else: - date_dict["year"] = np.int(date[0:4]) - date_dict["month"] = np.int(date[4:6]) - date_dict["day"] = np.int(date[6:8]) - date_dict["hour"] = np.int(date[8:10]) - date_dict["minute"] = np.int(date[10:]) - - return (location, index, date_dict, in_dir, grid_dir, tile, area, noahmp, case_name, old_chgres) + if date: + if len(date) != 14: + message = 'The entered date {0} does not have the 14 characters expected in the format YYYYMMDDHHMMSS'.format(date) + logging.critical(message) + raise Exception(message) + else: + date_dict["year"] = int(date[0:4]) + date_dict["month"] = int(date[4:6]) + date_dict["day"] = int(date[6:8]) + date_dict["hour"] = int(date[8:10]) + date_dict["minute"] = int(date[10:12]) + date_dict["second"] = int(date[12:]) + + if tile: + if (not lam and tile > 6): + message = 'The entered tile {0} is not compatibile with the global cubed-sphere grid'.format(date) + logging.critical(message) + raise Exception(message) + + return (location, index, date_dict, in_dir, grid_dir, forcing_dir, tile, \ + area, case_name, old_chgres, lam, save_comp, use_nearest) +######################################################################################## +# +######################################################################################## def setup_logging(): """Sets up the logging module.""" logging.basicConfig(format='%(levelname)s: %(message)s', level=LOGLEVEL) - -def find_tile(loc, dir): + +######################################################################################## +# +######################################################################################## +def find_tile(loc, dir, lam): """Find the FV3 tile with the given lon/lat""" #returns the integer tile number @@ -133,8 +163,8 @@ def find_tile(loc, dir): for f_name in grid_fnames: if not found_tile: nc_file = Dataset('{0}/{1}'.format(dir,f_name)) - longitude = np.array(nc_file['x']).swapaxes(0,1) - latitude = np.array(nc_file['y']).swapaxes(0,1) + longitude = np.asarray(nc_file['x']).swapaxes(0,1) + latitude = np.asarray(nc_file['y']).swapaxes(0,1) nc_file.close() adj_long = False @@ -149,20 +179,20 @@ def find_tile(loc, dir): edge_1_lon = longitude[0,:] edge_1_lat = latitude[0,:] - edge_1 = zip(edge_1_lon, edge_1_lat) + edge_1 = list(zip(edge_1_lon, edge_1_lat)) edge_2_lon = longitude[:,-1] edge_2_lat = latitude[:,-1] - edge_2 = zip(edge_2_lon, edge_2_lat) + edge_2 = list(zip(edge_2_lon, edge_2_lat)) edge_3_lon = longitude[-1,:] edge_3_lat = latitude[-1,:] - edge_3 = zip(edge_3_lon, edge_3_lat) + edge_3 = list(zip(edge_3_lon, edge_3_lat)) edge_3.reverse() #need to reverse the direction of this edge to form a regular polygon edge_4_lon = longitude[:,0] edge_4_lat = latitude[:,0] - edge_4 = zip(edge_4_lon, edge_4_lat) + edge_4 = list(zip(edge_4_lon, edge_4_lat)) edge_4.reverse() #need to reverse the direction of this edge to form a regular polygon polygon_points = edge_1 + edge_2 + edge_3 + edge_4 @@ -178,28 +208,44 @@ def find_tile(loc, dir): loc_point = Point(temp_loc) if tile_polygon.contains(loc_point): found_tile = True - return f_name.split('tile')[1].split('.nc')[0] + if (lam): + return f_name.split('tile')[1].split('.halo')[0] + else: + return f_name.split('tile')[1].split('.nc')[0] else: polar_tile_filenames.append(f_name) #if the tile hasn't been found by this point, it must be contained within a polar tile for f_name in polar_tile_filenames: nc_file = Dataset('{0}/{1}'.format(dir,f_name)) - latitude = np.array(nc_file['y']).swapaxes(0,1) + latitude = np.asarray(nc_file['y']).swapaxes(0,1) nc_file.close() #if the sign of the mean latitude of the tile is the same as that of the point, the tile has been found if np.sign(np.mean(latitude)) == np.sign(loc[1]): found_tile = True - return f_name.split('tile')[1].split('.nc')[0] + if (lam): + return f_name.split('tile')[1].split('.halo')[0] + else: + return f_name.split('tile')[1].split('.nc')[0] return -1 -def find_loc_indices(loc, dir, tile): +######################################################################################## +# +######################################################################################## +def find_loc_indices(loc, dir, tile, lam): """Find the nearest neighbor FV3 grid point given a lon/lat pair and the tile number""" #returns the indices of the nearest neighbor point in the given tile, the lon/lat of the nearest neighbor, #and the distance (m) from the given point to the nearest neighbor grid cell - filename_pattern = '*grid.tile{0}.nc'.format(tile) + if (tile >= 0): + if (lam): + filename_pattern = '*grid.tile7.halo{}.nc'.format(n_lam_halo_points) + else: + filename_pattern = '*grid.tile{0}.nc'.format(tile) + else: + filename_pattern = 'atmf000.nc' + for f_name in os.listdir(dir): if fnmatch.fnmatch(f_name, filename_pattern): filename = f_name @@ -209,13 +255,29 @@ def find_loc_indices(loc, dir, tile): raise Exception(message) nc_file = Dataset('{0}/{1}'.format(dir,filename)) - #read in supergrid longitude and latitude - lon_super = np.array(nc_file['x']) #[lat,lon] or [y,x] #.swapaxes(0,1) - lat_super = np.array(nc_file['y']) #[lat,lon] or [y,x] #.swapaxes(0,1) - #get the longitude and latitude data for the grid centers by slicing the supergrid - #and taking only odd-indexed values - longitude = lon_super[1::2,1::2] - latitude = lat_super[1::2,1::2] + + if (tile >= 0): + #read in supergrid longitude and latitude + lon_super = np.asarray(nc_file['x']) #[lat,lon] or [y,x] #.swapaxes(0,1) + lat_super = np.asarray(nc_file['y']) #[lat,lon] or [y,x] #.swapaxes(0,1) + if (lam): + #strip ghost/halo points and return central (A-grid) points + #assuming n_lam_halo_points + lon_super_no_halo = lon_super[2*n_lam_halo_points:lon_super.shape[0]-2*n_lam_halo_points,2*n_lam_halo_points:lon_super.shape[1]-2*n_lam_halo_points] + lat_super_no_halo = lat_super[2*n_lam_halo_points:lat_super.shape[0]-2*n_lam_halo_points,2*n_lam_halo_points:lat_super.shape[1]-2*n_lam_halo_points] + #get the longitude and latitude data for the grid centers by slicing the supergrid + #and taking only odd-indexed values + longitude = lon_super_no_halo[1::2,1::2] + latitude = lat_super_no_halo[1::2,1::2] + else: + #get the longitude and latitude data for the grid centers by slicing the supergrid + #and taking only odd-indexed values + longitude = lon_super[1::2,1::2] + latitude = lat_super[1::2,1::2] + else: + longitude = np.asarray(nc_file['lon']) + latitude = np.asarray(nc_file['lat']) + nc_file.close() adj_long = False @@ -233,12 +295,12 @@ def find_loc_indices(loc, dir, tile): eucl_dist = np.zeros((longitude.shape[0],longitude.shape[1])) #get the Cartesian location of the given point - cart_loc = np.array(sph2cart(math.radians(temp_loc[0]), math.radians(temp_loc[1]), earth_radius)) + cart_loc = np.asarray(sph2cart(math.radians(temp_loc[0]), math.radians(temp_loc[1]), earth_radius)) for i in range(len(longitude)): for j in range(len(longitude[i])): #get the Cartesian location of all grid points - cart_cell = np.array(sph2cart(math.radians(longitude[i,j]), math.radians(latitude[i,j]), earth_radius)) + cart_cell = np.asarray(sph2cart(math.radians(longitude[i,j]), math.radians(latitude[i,j]), earth_radius)) #calculate the euclidean distance from the given point to the current grid cell eucl_dist[i,j] = np.linalg.norm(cart_loc - cart_cell) @@ -248,10 +310,17 @@ def find_loc_indices(loc, dir, tile): return (i,j,longitude[i,j]%360.0, latitude[i,j], eucl_dist[i,j]) -def find_lon_lat_of_indices(indices, dir, tile): +######################################################################################## +# +######################################################################################## +def find_lon_lat_of_indices(indices, dir, tile, lam): """Find the longitude and latitude of the given indices within the given tile.""" - filename_pattern = '*grid.tile{0}.nc'.format(tile) + if (lam): + filename_pattern = '*grid.tile{0}.halo{1}.nc'.format(tile, n_lam_halo_points) + else: + filename_pattern = '*grid.tile{0}.nc'.format(tile) + for f_name in os.listdir(dir): if fnmatch.fnmatch(f_name, filename_pattern): filename = f_name @@ -261,17 +330,73 @@ def find_lon_lat_of_indices(indices, dir, tile): raise Exception(message) nc_file = Dataset('{0}/{1}'.format(dir,filename)) + #read in supergrid longitude and latitude - lon_super = np.array(nc_file['x']) #[lat,lon] or [y,x] #.swapaxes(0,1) - lat_super = np.array(nc_file['y']) #[lat,lon] or [y,x] #.swapaxes(0,1) - #get the longitude and latitude data for the grid centers by slicing the supergrid - #and taking only odd-indexed values - longitude = lon_super[1::2,1::2] - latitude = lat_super[1::2,1::2] + lon_super = np.asarray(nc_file['x']) #[lat,lon] or [y,x] #.swapaxes(0,1) + lat_super = np.asarray(nc_file['y']) #[lat,lon] or [y,x] #.swapaxes(0,1) + if (lam): + #strip ghost/halo points and return central (A-grid) points + #assuming n_lam_halo_points + lon_super_no_halo = lon_super[2*n_lam_halo_points:lon_super.shape[0]-2*n_lam_halo_points,2*n_lam_halo_points:lon_super.shape[1]-2*n_lam_halo_points] + lat_super_no_halo = lat_super[2*n_lam_halo_points:lat_super.shape[0]-2*n_lam_halo_points,2*n_lam_halo_points:lat_super.shape[1]-2*n_lam_halo_points] + #get the longitude and latitude data for the grid centers by slicing the supergrid + #and taking only odd-indexed values + longitude = lon_super_no_halo[1::2,1::2] + latitude = lat_super_no_halo[1::2,1::2] + else: + #get the longitude and latitude data for the grid centers by slicing the supergrid + #and taking only odd-indexed values + longitude = lon_super[1::2,1::2] + latitude = lat_super[1::2,1::2] + nc_file.close() return (longitude[indices[1],indices[0]], latitude[indices[1],indices[0]]) + +######################################################################################## +# +######################################################################################## +def get_initial_lon_lat_grid(dir, tile, lam): + if (lam): + filename_pattern = '*grid.tile{0}.halo{1}.nc'.format(tile, n_lam_halo_points) + else: + filename_pattern = '*grid.tile{0}.nc'.format(tile) + + for f_name in os.listdir(dir): + if fnmatch.fnmatch(f_name, filename_pattern): + filename = f_name + if not filename: + message = 'No filenames matching the pattern {0} found in {1}'.format(filename_pattern,dir) + logging.critical(message) + raise Exception(message) + + nc_file = Dataset('{0}/{1}'.format(dir,filename)) + #read in supergrid longitude and latitude + lon_super = np.asarray(nc_file['x']) #[lat,lon] or [y,x] #.swapaxes(0,1) + lat_super = np.asarray(nc_file['y']) #[lat,lon] or [y,x] #.swapaxes(0,1) + if (lam): + #strip ghost/halo points and return central (A-grid) points + #assuming n_lam_halo_points + lon_super_no_halo = lon_super[2*n_lam_halo_points:lon_super.shape[0]-2*n_lam_halo_points,2*n_lam_halo_points:lon_super.shape[1]-2*n_lam_halo_points] + lat_super_no_halo = lat_super[2*n_lam_halo_points:lat_super.shape[0]-2*n_lam_halo_points,2*n_lam_halo_points:lat_super.shape[1]-2*n_lam_halo_points] + #get the longitude and latitude data for the grid centers by slicing the supergrid + #and taking only odd-indexed values + longitude = lon_super_no_halo[1::2,1::2] + latitude = lat_super_no_halo[1::2,1::2] + else: + #get the longitude and latitude data for the grid centers by slicing the supergrid + #and taking only odd-indexed values + longitude = lon_super[1::2,1::2] + latitude = lat_super[1::2,1::2] + + nc_file.close() + + return (longitude, latitude) + +######################################################################################## +# +######################################################################################## def sph2cart(az, el, r): """Calculate the Cartesian coordiates from spherical coordinates""" @@ -282,6 +407,9 @@ def sph2cart(az, el, r): return (x, y, z) +######################################################################################## +# +######################################################################################## def read_NetCDF_var(nc_file, var_name, i, j): try: var = nc_file[var_name][j,i] @@ -291,6 +419,9 @@ def read_NetCDF_var(nc_file, var_name, i, j): var = missing_value return var +######################################################################################## +# +######################################################################################## def read_NetCDF_surface_var(nc_file, var_name, i, j, old_chgres, vert_dim): if old_chgres: if vert_dim > 0: @@ -325,251 +456,727 @@ def read_NetCDF_surface_var(nc_file, var_name, i, j, old_chgres, vert_dim): var = missing_value return var -def get_UFS_IC_data(dir, grid_dir, tile, i, j, old_chgres): +######################################################################################## +# +######################################################################################## +def get_UFS_IC_data(dir, grid_dir, tile, i, j, old_chgres, lam): """Get the state, surface, and orographic data for the given tile and indices""" #returns dictionaries with the data - state_data = get_UFS_state_data(dir, tile, i, j, old_chgres) - surface_data = get_UFS_surface_data(dir, tile, i, j, old_chgres) - oro_data = get_UFS_oro_data(dir, tile, i, j) vgrid_data = get_UFS_vgrid_data(grid_dir) #only needed for ak, bk to calculate pressure - - #calculate derived quantities - if old_chgres: - #temperature - nlevs = state_data["nlevs"] - gz=state_data["z"]*grav - pn1=np.zeros([nlevs+1]) - temp=np.zeros([nlevs]) - for k in range(nlevs+1): - pn1[k]=np.log(vgrid_data["ak"][k]+state_data["p_surf"]*vgrid_data["bk"][k]) - for k in range(nlevs): - temp[k] = (gz[k]-gz[k+1])/( rdgas*(pn1[k+1]-pn1[k])*(1.+zvir*state_data["qv"][k]) ) - state_data["T"] = temp - state_data["pres"] = np.exp(pn1[0:nlevs]) + state_data = get_UFS_state_data(vgrid_data, dir, tile, i, j, old_chgres, lam) + surface_data = get_UFS_surface_data(dir, tile, i, j, old_chgres, lam) + oro_data = get_UFS_oro_data(dir, tile, i, j, lam) return (state_data, surface_data, oro_data) - -def get_UFS_state_data(dir, tile, i, j, old_chgres): + +######################################################################################## +# +######################################################################################## +def get_UFS_state_data(vgrid, dir, tile, i, j, old_chgres, lam): """Get the state data for the given tile and indices""" - nc_file = Dataset('{0}/{1}'.format(dir,'gfs_data.tile{0}.nc'.format(tile))) - - #the majority of this routine is from Phil Pegion (NOAA PSD) - - # assume model contains one less level than the cold start spectral GFS initial conditions - nlevs=len(nc_file.dimensions['lev'])-1 - - # upper air fields from initial conditions - zh=nc_file['zh'][::-1,j,i] - uw1=nc_file['u_w'][::-1,j,i] - uw2=nc_file['u_w'][::-1,j,i+1] - us1=nc_file['u_s'][::-1,j,i] - us2=nc_file['u_s'][::-1,j+1,i] - vw1=nc_file['v_w'][::-1,j,i] - vw2=nc_file['v_w'][::-1,j,i+1] - vs1=nc_file['v_s'][::-1,j,i] - vs2=nc_file['v_s'][::-1,j+1,i] - ucomp=0.25*(uw1+uw2+us1+us2) # estimate u winds on the A grid - vcomp=0.25*(vw1+vw2+vs1+vs2) # estimate v winds on the A grid - sphum=nc_file['sphum'][::-1,j,i] + if lam: + nc_file_data = Dataset('{0}/{1}'.format(dir,'gfs_data.nc')) + else: + nc_file_data = Dataset('{0}/{1}'.format(dir,'gfs_data.tile{0}.nc'.format(tile))) + + # get nlevs from the gfs_ctrl.nc data + nlevs_model=vgrid["nlevs"] + + # upper air fields from initial conditions (all data are top-first) + zh_rev=nc_file_data['zh'][:,j,i] + sphum_rev=nc_file_data['sphum'][:,j,i] # o3 and qv are taken from ics. - o3=nc_file['o3mr'][::-1,j,i] - liqwat=nc_file['liq_wat'][::-1,j,i] - - # surface pressure - ps=nc_file['ps'][j,i] + o3_rev=nc_file_data['o3mr'][:,j,i] + liqwat_rev=nc_file_data['liq_wat'][:,j,i] + ps_data = nc_file_data['ps'][j,i] - if not old_chgres: - #gfs_data.tileX.nc files created from chgres_cube already containt temperature and pressure profiles(well, surface pressure and delp); use those - #older version of global_chgres did not include these vars - t = nc_file['t'][::-1,j,i] - delp = nc_file['delp'][::-1,j,i] + #The 3D fields above are apparently on grid vertical interfaces. In the file external_ic.F90/get_nggps_ic subroutine in FV3, these fields + #are further processed to get to the vertical grid centers/means. + + # following remap_scalar_nggps in external_ic.F90 + levp_data = len(sphum_rev) - p = np.zeros(nlevs) - p[0] = ps - for k in range(1, nlevs): - p[k] = p[k-1] - delp[k-1] + ak_rev = vgrid["ak"][::-1] + bk_rev = vgrid["bk"][::-1] + ak_rev[0] = np.max([1.0E-9, ak_rev[0]]) + + ptop_data = ak_rev[1] + + pressure_from_data_rev = ak_rev + bk_rev*ps_data + log_pressure_from_data_rev = np.log(pressure_from_data_rev) + + gz_rev = np.zeros(2*levp_data +1) + pn_rev = np.zeros(2*levp_data +1) - nc_file.close() + for k in range(0,levp_data+1): + gz_rev[k] = zh_rev[k]*grav + pn_rev[k] = log_pressure_from_data_rev[k] + k2 = int(np.max([10, levp_data/2])) + for k in range(levp_data+1,levp_data+k2): + #do k=km+2, km+k2 + l = 2*(levp_data) - k + gz_rev[k] = 2.*gz_rev[levp_data] - gz_rev[l] + pn_rev[k] = 2.*pn_rev[levp_data] - pn_rev[l] + + phis = zh_rev[-1]*grav + + for k in range(levp_data+k2-2,0,-1): + #do k=km+k2-1, 2, -1 + if (phis <= gz_rev[k] and phis >= gz_rev[k+1]): + log_ps_calc = pn_rev[k] + (pn_rev[k+1]-pn_rev[k])*(gz_rev[k]-phis)/(gz_rev[k]-gz_rev[k+1]) + break + + ps_calc = np.exp(log_ps_calc) + + pressure_model_interfaces_rev = np.zeros(nlevs_model+1) + log_pressure_model_interfaces_rev = np.zeros(nlevs_model+1) + pressure_model_interfaces_rev[0] = ak_rev[1] + log_pressure_model_interfaces_rev[0] = np.log(pressure_model_interfaces_rev[0]) + for k in range(1,nlevs_model+1): + pressure_model_interfaces_rev[k] = ak_rev[k+1] + bk_rev[k+1]*ps_calc + log_pressure_model_interfaces_rev[k] = np.log(pressure_model_interfaces_rev[k]) + + pressure_thickness_model_rev = np.zeros(nlevs_model) + for k in range(0,nlevs_model): + pressure_thickness_model_rev[k] = pressure_model_interfaces_rev[k+1] - pressure_model_interfaces_rev[k] + + sphum_model_rev = fv3_remap.mappm(levp_data, pressure_from_data_rev[np.newaxis, :], sphum_rev[np.newaxis, :], nlevs_model, pressure_model_interfaces_rev[np.newaxis, :], 1, 1, 0, 8, ptop_data) + sphum_model_rev_3d = fv3_remap.fillq(1, nlevs_model, 1, np.expand_dims(sphum_model_rev, axis=2), pressure_thickness_model_rev[np.newaxis, :]) + sphum_model_rev = sphum_model_rev_3d[:,:,0] + + o3_model_rev = fv3_remap.mappm(levp_data, pressure_from_data_rev[np.newaxis, :], o3_rev[np.newaxis, :], nlevs_model, pressure_model_interfaces_rev[np.newaxis, :], 1, 1, 0, 8, ptop_data) + o3_model_rev_3d = fv3_remap.fillz(1, nlevs_model, 1, np.expand_dims(o3_model_rev, axis=2), pressure_thickness_model_rev[np.newaxis, :]) + o3_model_rev = o3_model_rev_3d[:,:,0] + + liqwat_model_rev = fv3_remap.mappm(levp_data, pressure_from_data_rev[np.newaxis, :], liqwat_rev[np.newaxis, :], nlevs_model, pressure_model_interfaces_rev[np.newaxis, :], 1, 1, 0, 8, ptop_data) + liqwat_model_rev_3d = fv3_remap.fillz(1, nlevs_model, 1, np.expand_dims(liqwat_model_rev, axis=2), pressure_thickness_model_rev[np.newaxis, :]) + liqwat_model_rev = liqwat_model_rev_3d[:,:,0] - #put data in a dictionary if old_chgres: - state = { - "nlevs": nlevs, - "z": zh, - "u": ucomp, - "v": vcomp, - "qv": sphum, - "o3": o3, - "ql": liqwat, - "p_surf": ps - } + gz_fv = np.zeros(nlevs_model+1) + gz_fv[-1] = phis + m = 0 + for k in range(0,nlevs_model): + for l in range(m, levp_data+k2-1): + if ( (log_pressure_model_interfaces_rev[k] <= pn_rev[l+1]) and (log_pressure_model_interfaces_rev[k] >= pn_rev[l]) ): + gz_fv[k] = gz_rev[l] + (gz_rev[l+1]-gz_rev[l])*(log_pressure_model_interfaces_rev[k]-pn_rev[l])/(pn_rev[l+1]-pn_rev[l]) + break + m = l + + temp_model_rev = np.zeros((1,nlevs_model)) + for k in range(0, nlevs_model): + temp_model_rev[0,k] = (gz_fv[k]-gz_fv[k+1])/(rdgas*(log_pressure_model_interfaces_rev[k+1]-log_pressure_model_interfaces_rev[k])*(1.+zvir*sphum_model_rev[0,k]) ) else: - state = { - "nlevs": nlevs, - "z": zh, - "u": ucomp, - "v": vcomp, - "qv": sphum, - "o3": o3, - "ql": liqwat, - "p_surf": ps, - "T": t, - "pres": p - } + temp_rev = nc_file_data['t'][:,j,i] + + temp_model_rev = fv3_remap.mappm(levp_data, pressure_from_data_rev[np.newaxis, :], temp_rev[np.newaxis, :], nlevs_model, pressure_model_interfaces_rev[np.newaxis, :], 1, 1, 2, 4, ptop_data) + + + icewat_model_rev = np.zeros(nlevs_model) + all_liquid_threshold = 273.16 + all_ice_threshold = 233.16 + intermediate_threshold = 258.16 + cloud_ice_mixing_ratio_threshold = 1.0E-5 + for k in range(0, nlevs_model): + cloud_water = liqwat_model_rev[0,k] + if (temp_model_rev[0,k] > all_liquid_threshold): + liqwat_model_rev[0,k] = cloud_water + icewat_model_rev[k] = 0.0 + elif (temp_model_rev[0,k] < all_ice_threshold): + liqwat_model_rev[0,k] = 0.0 + icewat_model_rev[k] = cloud_water + else: + if k == 0: + liqwat_model_rev[0,k] = cloud_water*(temp_model_rev[0,k]-all_ice_threshold)/(all_liquid_threshold - all_ice_threshold) + icewat_model_rev[k] = cloud_water - liqwat_model_rev[0,k] + else: + if (temp_model_rev[0,k] < intermediate_threshold and icewat_model_rev[k-1] > cloud_ice_mixing_ratio_threshold): + liqwat_model_rev[0,k] = 0.0 + icewat_model_rev[k] = cloud_water + else: + liqwat_model_rev[0,k] = cloud_water*(temp_model_rev[0,k]-all_ice_threshold)/(all_liquid_threshold - all_ice_threshold) + icewat_model_rev[k] = cloud_water - liqwat_model_rev[0,k] + (liqwat_model_rev[0,k], dummy_rain, icewat_model_rev[k], dummy_snow) = fv3_remap.mp_auto_conversion(liqwat_model_rev[0,k], icewat_model_rev[k]) + + [u_s, u_n, v_w, v_e] = get_zonal_and_meridional_winds_on_cd_grid(tile, dir, i, j, nc_file_data, lam) + + #put C/D grid zonal/meridional winds on model pressure levels + u_s_model_rev = fv3_remap.mappm(levp_data, pressure_from_data_rev[np.newaxis, :], u_s[np.newaxis, :], nlevs_model, pressure_model_interfaces_rev[np.newaxis, :], 1, 1, -1, 8, ptop_data) + u_n_model_rev = fv3_remap.mappm(levp_data, pressure_from_data_rev[np.newaxis, :], u_n[np.newaxis, :], nlevs_model, pressure_model_interfaces_rev[np.newaxis, :], 1, 1, -1, 8, ptop_data) + v_w_model_rev = fv3_remap.mappm(levp_data, pressure_from_data_rev[np.newaxis, :], v_w[np.newaxis, :], nlevs_model, pressure_model_interfaces_rev[np.newaxis, :], 1, 1, -1, 8, ptop_data) + v_e_model_rev = fv3_remap.mappm(levp_data, pressure_from_data_rev[np.newaxis, :], v_e[np.newaxis, :], nlevs_model, pressure_model_interfaces_rev[np.newaxis, :], 1, 1, -1, 8, ptop_data) + + #put C/D grid zonal/meridional winds on A grid (simple averaging for now, but FV3 has more complex methods that should be implemented) + + u_model_rev = np.zeros(nlevs_model) + v_model_rev = np.zeros(nlevs_model) + u_model_rev = 0.5*(u_s_model_rev + u_n_model_rev) + v_model_rev = 0.5*(v_w_model_rev + v_e_model_rev) + + nc_file_data.close() + + pressure_model_interfaces = pressure_model_interfaces_rev[::-1] + pressure_model = np.zeros(nlevs_model) + for k in range(0,nlevs_model): + #from gmtb_scm_vgrid + pressure_model[k] = ((1.0/(rocp+1.0))*(pressure_model_interfaces[k]**(rocp+1.0) - pressure_model_interfaces[k+1]**(rocp+1.0))/(pressure_model_interfaces[k] - pressure_model_interfaces[k+1]))**(1.0/rocp) + #put data in a dictionary + state = { + "nlevs": nlevs_model, + "zh": zh_rev[nlevs_model:0:-1], + "ua": u_model_rev[0][::-1], + "va": v_model_rev[0][::-1], + "qv": sphum_model_rev[0][::-1], + "o3": o3_model_rev[0][::-1], + "ql": liqwat_model_rev[0][::-1], + "qi": icewat_model_rev[::-1], + "ps": np.asarray(ps_calc), + "ta": temp_model_rev[0,::-1], + "pa": pressure_model, + "pa_i": pressure_model_interfaces + } return state -def get_UFS_surface_data(dir, tile, i, j, old_chgres): +######################################################################################## +# +######################################################################################## +def get_zonal_and_meridional_winds_on_cd_grid(tile, dir, i, j, nc_file_data, lam): + if lam: + filename_pattern = '*grid.tile{0}.halo{1}.nc'.format(tile, n_lam_halo_points) + for f_name in os.listdir(dir): + if fnmatch.fnmatch(f_name, filename_pattern): + filename = f_name + if not filename: + message = 'No filenames matching the pattern {0} found in {1}'.format(filename_pattern,dir) + logging.critical(message) + raise Exception(message) + else: + filename_pattern = '*grid.tile{0}.nc'.format(tile) + + for f_name in os.listdir(dir): + if fnmatch.fnmatch(f_name, filename_pattern): + filename = f_name + if not filename: + message = 'No filenames matching the pattern {0} found in {1}'.format(filename_pattern,dir) + logging.critical(message) + raise Exception(message) + + nc_file_grid = Dataset('{0}/{1}'.format(dir,filename)) + + if (lam): + #strip ghost/halo points and return supergrid + lon_super_data = np.asarray(nc_file_grid['x']) + lat_super_data = np.asarray(nc_file_grid['y']) + #assuming n_lam_halo_points + lon_super = lon_super_data[2*n_lam_halo_points:lon_super_data.shape[0]-2*n_lam_halo_points,2*n_lam_halo_points:lon_super_data.shape[1]-2*n_lam_halo_points] + lat_super = lat_super_data[2*n_lam_halo_points:lat_super_data.shape[0]-2*n_lam_halo_points,2*n_lam_halo_points:lat_super_data.shape[1]-2*n_lam_halo_points] + else: + lon_super = np.asarray(nc_file_grid['x']) #[lat,lon] or [y,x] #.swapaxes(0,1) + lat_super = np.asarray(nc_file_grid['y']) #[lat,lon] or [y,x] #.swapaxes(0,1) + + num_agrid_x = int(0.5*(lon_super.shape[1]-1)) + num_agrid_y = int(0.5*(lon_super.shape[0]-1)) + + #find orientation + #A-grid point + agrid_super_i_index = 2*i + 1 + agrid_super_j_index = 2*j + 1 + point_on_agrid = np.asarray((lon_super[agrid_super_j_index,agrid_super_i_index],lat_super[agrid_super_j_index,agrid_super_i_index])) + + test_dgrid_points = [(lon_super[agrid_super_j_index,agrid_super_i_index+1],lat_super[agrid_super_j_index,agrid_super_i_index+1]),\ + (lon_super[agrid_super_j_index,agrid_super_i_index-1],lat_super[agrid_super_j_index,agrid_super_i_index-1]),\ + (lon_super[agrid_super_j_index+1,agrid_super_i_index],lat_super[agrid_super_j_index+1,agrid_super_i_index]),\ + (lon_super[agrid_super_j_index-1,agrid_super_i_index],lat_super[agrid_super_j_index-1,agrid_super_i_index])] + + test_lon_diff = [p[0] - point_on_agrid[0] for p in test_dgrid_points] + test_lat_diff = [p[1] - point_on_agrid[1] for p in test_dgrid_points] + + east_test_point = np.argmax(test_lon_diff) + north_test_point = np.argmax(test_lat_diff) + + if east_test_point == 0: + #longitude increases most along the positive i axis + if north_test_point == 2: + #latitude increases most along the positive j axis + # ---> j+ north + # | + # V + # i+ east + + #calculation of zonal wind on first (south) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*j,2*(i+1)],lat_super[2*j,2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_s = nc_file_data['u_s'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of zonal wind on second (north) D-grid point + p1 = np.asarray((lon_super[2*(j+1),2*i],lat_super[2*(j+1),2*i,])) + p2 = np.asarray((lon_super[2*(j+1),2*(i+1)],lat_super[2*(j+1),2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_n = nc_file_data['u_s'][:,j+1,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j+1,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on first (west) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*(j+1),2*i],lat_super[2*(j+1),2*i])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_w = nc_file_data['u_w'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on second (east) D-grid point + p1 = np.asarray((lon_super[2*j,2*(i+1)],lat_super[2*j,2*(i+1)])) + p2 = np.asarray((lon_super[2*(j+1),2*(i+1)],lat_super[2*(j+1),2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_e = nc_file_data['u_w'][:,j,i+1]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i+1]*fv3_remap.inner_prod(e1, ey) + elif north_test_point == 3: + #latitude increases most along the negative j axis + # <--- j- north + # | + # V + # i+ east + #calculation of zonal wind on first (south) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*j,2*(i+1)],lat_super[2*j,2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_s = nc_file_data['u_s'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of zonal wind on second (north) D-grid point + p1 = np.asarray((lon_super[2*(j-1),2*i],lat_super[2*(j-1),2*i])) + p2 = np.asarray((lon_super[2*(j-1),2*(i+1)],lat_super[2*(j-1),2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_n = nc_file_data['u_s'][:,j-1,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j-1,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on first (west) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*(j-1),2*i],lat_super[2*(j-1),2*i])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_w = nc_file_data['u_w'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on second (east) D-grid point + p1 = np.asarray((lon_super[2*j,2*(i+1)],lat_super[2*j,2*(i+1)])) + p2 = np.asarray((lon_super[2*(j-1),2*(i+1)],lat_super[2*(j-1),2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_e = nc_file_data['u_w'][:,j,i+1]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i+1]*fv3_remap.inner_prod(e1, ey) + else: + print('unknown grid orientation') + elif east_test_point == 1: + #longitude increases most along the negative i axis + if north_test_point == 2: + #latitude increases most along the positive j axis + # i- east + # ^ + # | + # ---> j+ north + #calculation of zonal wind on first (south) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*j,2*(i-1)],lat_super[2*j,2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_s = nc_file_data['u_s'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of zonal wind on second (north) D-grid point + p1 = np.asarray((lon_super[2*(j+1),2*i],lat_super[2*(j+1),2*i])) + p2 = np.asarray((lon_super[2*(j+1),2*(i-1)],lat_super[2*(j+1),2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_n = nc_file_data['u_s'][:,j+1,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j+1,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on first (west) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*(j+1),2*i],lat_super[2*(j+1),2*i])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_w = nc_file_data['u_w'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on second (east) D-grid point + p1 = np.asarray((lon_super[2*j,2*(i-1)],lat_super[2*j,2*(i-1)])) + p2 = np.asarray((lon_super[2*(j+1),2*(i-1)],lat_super[2*(j+1),2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_e = nc_file_data['u_w'][:,j,i-1]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i-1]*fv3_remap.inner_prod(e1, ey) + elif north_test_point == 3: + #latitude increases most along the negative j axis + # i- east + # ^ + # | + # <--- j- north + #calculation of zonal wind on first (south) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*j,2*(i-1)],lat_super[2*j,2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_s = nc_file_data['u_s'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of zonal wind on second (north) D-grid point + p1 = np.asarray((lon_super[2*(j-1),2*i],lat_super[2*(j-1),2*i])) + p2 = np.asarray((lon_super[2*(j-1),2*(i-1)],lat_super[2*(j-1),2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_n = nc_file_data['u_s'][:,j-1,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j-1,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on first (west) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*(j-1),2*i],lat_super[2*(j-1),2*i])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_w = nc_file_data['u_w'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on second (east) D-grid point + p1 = np.asarray((lon_super[2*j,2*(i-1)],lat_super[2*j,2*(i-1)])) + p2 = np.asarray((lon_super[2*(j-1),2*(i-1)],lat_super[2*(j-1),2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_e = nc_file_data['u_w'][:,j,i-1]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i-1]*fv3_remap.inner_prod(e1, ey) + else: + print('unknown grid orientation') + elif east_test_point == 2: + #longitude increases most along the positive j axis + if north_test_point == 0: + #latitude increases most along the positive i axis + # ---> j+ east + # | + # V + # i+ north + #calculation of zonal wind on first (south) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*(j+1),2*i],lat_super[2*(j+1),2*i])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_s = nc_file_data['u_s'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of zonal wind on second (north) D-grid point + p1 = np.asarray((lon_super[2*j,2*(i+1)],lat_super[2*j,2*(i+1)])) + p2 = np.asarray((lon_super[2*(j+1),2*(i+1)],lat_super[2*(j+1),2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_n = nc_file_data['u_s'][:,j,i+1]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i+1]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on first (west) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*j,2*(i+1)],lat_super[2*j,2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_w = nc_file_data['u_w'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on second (east) D-grid point + p1 = np.asarray((lon_super[2*(j+1),2*i],lat_super[2*(j+1),2*i])) + p2 = np.asarray((lon_super[2*(j+1),2*(i+1)],lat_super[2*(j+1),2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_e = nc_file_data['u_w'][:,j+1,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j+1,i]*fv3_remap.inner_prod(e1, ey) + elif north_test_point == 1: + #latitude increases most along the negative i axis + # i- north + # ^ + # | + # ---> j+ east + #calculation of zonal wind on first (south) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*(j+1),2*i],lat_super[2*(j+1),2*i])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_s = nc_file_data['u_s'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of zonal wind on second (north) D-grid point + p1 = np.asarray((lon_super[2*j,2*(i-1)],lat_super[2*j,2*(i-1)])) + p2 = np.asarray((lon_super[2*(j+1),2*(i-1)],lat_super[2*(j+1),2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_n = nc_file_data['u_s'][:,j,i-1]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i-1]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on first (west) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*j,2*(i-1)],lat_super[2*j,2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_w = nc_file_data['u_w'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on second (east) D-grid point + p1 = np.asarray((lon_super[2*(j+1),2*i],lat_super[2*(j+1),2*i])) + p2 = np.asarray((lon_super[2*(j+1),2*(i-1)],lat_super[2*(j+1),2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_e = nc_file_data['u_w'][:,j+1,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j+1,i]*fv3_remap.inner_prod(e1, ey) + else: + print('unknown grid orientation') + elif east_test_point == 3: + #longitude increases most along the negative j axis + if north_test_point == 0: + #latitude increases most along the positive i axis + # <--- j- east + # | + # V + # i+ north + #calculation of zonal wind on first (south) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*(j-1),2*i],lat_super[2*(j-1),2*i])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_s = nc_file_data['u_s'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of zonal wind on second (north) D-grid point + p1 = np.asarray((lon_super[2*j,2*(i+1)],lat_super[2*j,2*(i+1)])) + p2 = np.asarray((lon_super[2*(j-1),2*(i+1)],lat_super[2*(j-1),2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_n = nc_file_data['u_s'][:,j,i+1]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i+1]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on first (west) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*j,2*(i+1)],lat_super[2*j,2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_w = nc_file_data['u_w'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on second (east) D-grid point + p1 = np.asarray((lon_super[2*(j-1),2*i],lat_super[2*(j-1),2*i])) + p2 = np.asarray((lon_super[2*(j-1),2*(i+1)],lat_super[2*(j-1),2*(i+1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_e = nc_file_data['u_w'][:,j-1,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j-1,i]*fv3_remap.inner_prod(e1, ey) + elif north_test_point == 1: + #latitude increases most along the negative i axis + # i- north + # ^ + # | + # <--- j- east + #calculation of zonal wind on first (south) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*(j-1),2*i],lat_super[2*(j-1),2*i])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_s = nc_file_data['u_s'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of zonal wind on second (north) D-grid point + p1 = np.asarray((lon_super[2*j,2*(i-1)],lat_super[2*j,2*(i-1)])) + p2 = np.asarray((lon_super[2*(j-1),2*(i-1)],lat_super[2*(j-1),2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + u_n = nc_file_data['u_s'][:,j,i-1]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_s'][:,j,i-1]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on first (west) D-grid point + p1 = np.asarray((lon_super[2*j,2*i],lat_super[2*j,2*i])) + p2 = np.asarray((lon_super[2*j,2*(i-1)],lat_super[2*j,2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_w = nc_file_data['u_w'][:,j,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j,i]*fv3_remap.inner_prod(e1, ey) + + #calculation of meridionial wind on second (east) D-grid point + p1 = np.asarray((lon_super[2*(j-1),2*i],lat_super[2*(j-1),2*i])) + p2 = np.asarray((lon_super[2*(j-1),2*(i-1)],lat_super[2*(j-1),2*(i-1)])) + p3 = fv3_remap.mid_pt_sphere(p1*deg_to_rad, p2*deg_to_rad) + e1 = fv3_remap.get_unit_vect2(p1*deg_to_rad, p2*deg_to_rad) + (ex, ey) = fv3_remap.get_latlon_vector(p3) + v_e = nc_file_data['u_w'][:,j-1,i]*fv3_remap.inner_prod(e1, ex) + nc_file_data['v_w'][:,j-1,i]*fv3_remap.inner_prod(e1, ey) + else: + print('unknown grid orientation') + + + nc_file_grid.close() + + return [u_s, u_n, v_w, v_e] + +######################################################################################## +# +######################################################################################## +def get_UFS_surface_data(dir, tile, i, j, old_chgres, lam): """Get the surface data for the given tile and indices""" - nc_file = Dataset('{0}/{1}'.format(dir,'sfc_data.tile{0}.nc'.format(tile))) + if lam: + nc_file = Dataset('{0}/{1}'.format(dir,'sfc_data.nc')) + else: + nc_file = Dataset('{0}/{1}'.format(dir,'sfc_data.tile{0}.nc'.format(tile))) #FV3/io/FV3GFS_io.F90/sfc_prop_restart_read was used as reference for variables that can be read in - #read in scalars (would be 2D variables in a 3D model) - - # surface properties (assuming Noah LSM; may contain variables needed for fractional land fraction) - tsfco_in = read_NetCDF_surface_var(nc_file, 'tsea', i, j, old_chgres, 0) - tg3_in = read_NetCDF_surface_var(nc_file, 'tg3', i, j, old_chgres, 0) + # + # read in scalars (2D) + # + + # Noah LSM ( may contain variables needed for fractional land fraction) + tsfco_in = read_NetCDF_surface_var(nc_file, 'tsea', i, j, old_chgres, 0) + tg3_in = read_NetCDF_surface_var(nc_file, 'tg3', i, j, old_chgres, 0) uustar_in = read_NetCDF_surface_var(nc_file, 'uustar', i, j, old_chgres, 0) - alvsf_in = read_NetCDF_surface_var(nc_file, 'alvsf', i, j, old_chgres, 0) - alvwf_in = read_NetCDF_surface_var(nc_file, 'alvwf', i, j, old_chgres, 0) - alnsf_in = read_NetCDF_surface_var(nc_file, 'alnsf', i, j, old_chgres, 0) - alnwf_in = read_NetCDF_surface_var(nc_file, 'alnwf', i, j, old_chgres, 0) - facsf_in = read_NetCDF_surface_var(nc_file, 'facsf', i, j, old_chgres, 0) - facwf_in = read_NetCDF_surface_var(nc_file, 'facwf', i, j, old_chgres, 0) - styp_in = read_NetCDF_surface_var(nc_file, 'stype', i, j, old_chgres, 0) - slope_in = read_NetCDF_surface_var(nc_file, 'slope', i, j, old_chgres, 0) - vtyp_in = read_NetCDF_surface_var(nc_file, 'vtype', i, j, old_chgres, 0) - vfrac_in = read_NetCDF_surface_var(nc_file, 'vfrac', i, j, old_chgres, 0) + alvsf_in = read_NetCDF_surface_var(nc_file, 'alvsf', i, j, old_chgres, 0) + alvwf_in = read_NetCDF_surface_var(nc_file, 'alvwf', i, j, old_chgres, 0) + alnsf_in = read_NetCDF_surface_var(nc_file, 'alnsf', i, j, old_chgres, 0) + alnwf_in = read_NetCDF_surface_var(nc_file, 'alnwf', i, j, old_chgres, 0) + facsf_in = read_NetCDF_surface_var(nc_file, 'facsf', i, j, old_chgres, 0) + facwf_in = read_NetCDF_surface_var(nc_file, 'facwf', i, j, old_chgres, 0) + styp_in = read_NetCDF_surface_var(nc_file, 'stype', i, j, old_chgres, 0) + slope_in = read_NetCDF_surface_var(nc_file, 'slope', i, j, old_chgres, 0) + vtyp_in = read_NetCDF_surface_var(nc_file, 'vtype', i, j, old_chgres, 0) + vfrac_in = read_NetCDF_surface_var(nc_file, 'vfrac', i, j, old_chgres, 0) shdmin_in = read_NetCDF_surface_var(nc_file, 'shdmin', i, j, old_chgres, 0) shdmax_in = read_NetCDF_surface_var(nc_file, 'shdmax', i, j, old_chgres, 0) - zorlw_in = read_NetCDF_surface_var(nc_file, 'zorl', i, j, old_chgres, 0) - slmsk_in = read_NetCDF_surface_var(nc_file, 'slmsk', i, j, old_chgres, 0) + zorlo_in = read_NetCDF_surface_var(nc_file, 'zorl', i, j, old_chgres, 0) + slmsk_in = read_NetCDF_surface_var(nc_file, 'slmsk', i, j, old_chgres, 0) canopy_in = read_NetCDF_surface_var(nc_file, 'canopy', i, j, old_chgres, 0) - hice_in = read_NetCDF_surface_var(nc_file, 'hice', i, j, old_chgres, 0) - fice_in = read_NetCDF_surface_var(nc_file, 'fice', i, j, old_chgres, 0) - tisfc_in = read_NetCDF_surface_var(nc_file, 'tisfc', i, j, old_chgres, 0) + hice_in = read_NetCDF_surface_var(nc_file, 'hice', i, j, old_chgres, 0) + fice_in = read_NetCDF_surface_var(nc_file, 'fice', i, j, old_chgres, 0) + tisfc_in = read_NetCDF_surface_var(nc_file, 'tisfc', i, j, old_chgres, 0) snwdph_in = read_NetCDF_surface_var(nc_file, 'snwdph', i, j, old_chgres, 0) snoalb_in = read_NetCDF_surface_var(nc_file, 'snoalb', i, j, old_chgres, 0) sheleg_in = read_NetCDF_surface_var(nc_file, 'sheleg', i, j, old_chgres, 0) - f10m_in = read_NetCDF_surface_var(nc_file, 'f10m', i, j, old_chgres, 0) - t2m_in = read_NetCDF_surface_var(nc_file, 't2m', i, j, old_chgres, 0) - q2m_in = read_NetCDF_surface_var(nc_file, 'q2m', i, j, old_chgres, 0) - ffmm_in = read_NetCDF_surface_var(nc_file, 'ffmm', i, j, old_chgres, 0) - ffhh_in = read_NetCDF_surface_var(nc_file, 'ffhh', i, j, old_chgres, 0) - tprcp_in = read_NetCDF_surface_var(nc_file, 'tprcp', i, j, old_chgres, 0) + f10m_in = read_NetCDF_surface_var(nc_file, 'f10m', i, j, old_chgres, 0) + t2m_in = read_NetCDF_surface_var(nc_file, 't2m', i, j, old_chgres, 0) + q2m_in = read_NetCDF_surface_var(nc_file, 'q2m', i, j, old_chgres, 0) + ffmm_in = read_NetCDF_surface_var(nc_file, 'ffmm', i, j, old_chgres, 0) + ffhh_in = read_NetCDF_surface_var(nc_file, 'ffhh', i, j, old_chgres, 0) + tprcp_in = read_NetCDF_surface_var(nc_file, 'tprcp', i, j, old_chgres, 0) srflag_in = read_NetCDF_surface_var(nc_file, 'srflag', i, j, old_chgres, 0) sncovr_in = read_NetCDF_surface_var(nc_file, 'sncovr', i, j, old_chgres, 0) - tsfcl_in = read_NetCDF_surface_var(nc_file, 'tsfcl', i, j, old_chgres, 0) - zorll_in = read_NetCDF_surface_var(nc_file, 'zorll', i, j, old_chgres, 0) - zorli_in = read_NetCDF_surface_var(nc_file, 'zorli', i, j, old_chgres, 0) - - #present when cplwav = T - zorlwav_in = read_NetCDF_surface_var(nc_file, 'zorlwav', i, j, old_chgres, 0) - - #NSST variables that may be in the surface file - tref_in = read_NetCDF_surface_var(nc_file, 'tref', i, j, old_chgres, 0) - z_c_in = read_NetCDF_surface_var(nc_file, 'z_c', i, j, old_chgres, 0) - c_0_in = read_NetCDF_surface_var(nc_file, 'c_0', i, j, old_chgres, 0) - c_d_in = read_NetCDF_surface_var(nc_file, 'c_d', i, j, old_chgres, 0) - w_0_in = read_NetCDF_surface_var(nc_file, 'w_0', i, j, old_chgres, 0) - w_d_in = read_NetCDF_surface_var(nc_file, 'w_d', i, j, old_chgres, 0) - xt_in = read_NetCDF_surface_var(nc_file, 'xt', i, j, old_chgres, 0) - xs_in = read_NetCDF_surface_var(nc_file, 'xs', i, j, old_chgres, 0) - xu_in = read_NetCDF_surface_var(nc_file, 'xu', i, j, old_chgres, 0) - xv_in = read_NetCDF_surface_var(nc_file, 'xv', i, j, old_chgres, 0) - xz_in = read_NetCDF_surface_var(nc_file, 'xz', i, j, old_chgres, 0) - zm_in = read_NetCDF_surface_var(nc_file, 'zm', i, j, old_chgres, 0) - xtts_in = read_NetCDF_surface_var(nc_file, 'xtts', i, j, old_chgres, 0) - xzts_in = read_NetCDF_surface_var(nc_file, 'xzts', i, j, old_chgres, 0) - d_conv_in = read_NetCDF_surface_var(nc_file, 'd_conv', i, j, old_chgres, 0) - ifd_in = read_NetCDF_surface_var(nc_file, 'ifd', i, j, old_chgres, 0) + tsfcl_in = read_NetCDF_surface_var(nc_file, 'tsfcl', i, j, old_chgres, 0) + zorll_in = read_NetCDF_surface_var(nc_file, 'zorll', i, j, old_chgres, 0) + zorli_in = read_NetCDF_surface_var(nc_file, 'zorli', i, j, old_chgres, 0) + + # present when cplwav = T + zorlw_in = read_NetCDF_surface_var(nc_file, 'zorlw', i, j, old_chgres, 0) + + # NSST + tref_in = read_NetCDF_surface_var(nc_file, 'tref', i, j, old_chgres, 0) + z_c_in = read_NetCDF_surface_var(nc_file, 'z_c', i, j, old_chgres, 0) + c_0_in = read_NetCDF_surface_var(nc_file, 'c_0', i, j, old_chgres, 0) + c_d_in = read_NetCDF_surface_var(nc_file, 'c_d', i, j, old_chgres, 0) + w_0_in = read_NetCDF_surface_var(nc_file, 'w_0', i, j, old_chgres, 0) + w_d_in = read_NetCDF_surface_var(nc_file, 'w_d', i, j, old_chgres, 0) + xt_in = read_NetCDF_surface_var(nc_file, 'xt', i, j, old_chgres, 0) + xs_in = read_NetCDF_surface_var(nc_file, 'xs', i, j, old_chgres, 0) + xu_in = read_NetCDF_surface_var(nc_file, 'xu', i, j, old_chgres, 0) + xv_in = read_NetCDF_surface_var(nc_file, 'xv', i, j, old_chgres, 0) + xz_in = read_NetCDF_surface_var(nc_file, 'xz', i, j, old_chgres, 0) + zm_in = read_NetCDF_surface_var(nc_file, 'zm', i, j, old_chgres, 0) + xtts_in = read_NetCDF_surface_var(nc_file, 'xtts', i, j, old_chgres, 0) + xzts_in = read_NetCDF_surface_var(nc_file, 'xzts', i, j, old_chgres, 0) + d_conv_in = read_NetCDF_surface_var(nc_file, 'd_conv', i, j, old_chgres, 0) + ifd_in = read_NetCDF_surface_var(nc_file, 'ifd', i, j, old_chgres, 0) dt_cool_in = read_NetCDF_surface_var(nc_file, 'dt_cool', i, j, old_chgres, 0) - qrain_in = read_NetCDF_surface_var(nc_file, 'qrain', i, j, old_chgres, 0) - - #NoahMP variables that may be in the surface file - snowxy_in = read_NetCDF_surface_var(nc_file, 'snowxy', i, j, old_chgres, 0) - tvxy_in = read_NetCDF_surface_var(nc_file, 'tvxy', i, j, old_chgres, 0) - tgxy_in = read_NetCDF_surface_var(nc_file, 'tgxy', i, j, old_chgres, 0) - canicexy_in = read_NetCDF_surface_var(nc_file, 'canicexy', i, j, old_chgres, 0) - canliqxy_in = read_NetCDF_surface_var(nc_file, 'canliqxy', i, j, old_chgres, 0) - eahxy_in = read_NetCDF_surface_var(nc_file, 'eahxy', i, j, old_chgres, 0) - tahxy_in = read_NetCDF_surface_var(nc_file, 'tahxy', i, j, old_chgres, 0) - cmxy_in = read_NetCDF_surface_var(nc_file, 'cmxy', i, j, old_chgres, 0) - chxy_in = read_NetCDF_surface_var(nc_file, 'chxy', i, j, old_chgres, 0) - fwetxy_in = read_NetCDF_surface_var(nc_file, 'fwetxy', i, j, old_chgres, 0) - sneqvoxy_in = read_NetCDF_surface_var(nc_file, 'sneqvoxy', i, j, old_chgres, 0) - alboldxy_in = read_NetCDF_surface_var(nc_file, 'alboldxy', i, j, old_chgres, 0) - qsnowxy_in = read_NetCDF_surface_var(nc_file, 'qsnowxy', i, j, old_chgres, 0) - wslakexy_in = read_NetCDF_surface_var(nc_file, 'wslakexy', i, j, old_chgres, 0) - zwtxy_in = read_NetCDF_surface_var(nc_file, 'zwtxy', i, j, old_chgres, 0) - waxy_in = read_NetCDF_surface_var(nc_file, 'waxy', i, j, old_chgres, 0) - wtxy_in = read_NetCDF_surface_var(nc_file, 'wtxy', i, j, old_chgres, 0) - lfmassxy_in = read_NetCDF_surface_var(nc_file, 'lfmassxy', i, j, old_chgres, 0) - rtmassxy_in = read_NetCDF_surface_var(nc_file, 'rtmassxy', i, j, old_chgres, 0) - stmassxy_in = read_NetCDF_surface_var(nc_file, 'stmassxy', i, j, old_chgres, 0) - woodxy_in = read_NetCDF_surface_var(nc_file, 'woodxy', i, j, old_chgres, 0) - stblcpxy_in = read_NetCDF_surface_var(nc_file, 'stblcpxy', i, j, old_chgres, 0) - fastcpxy_in = read_NetCDF_surface_var(nc_file, 'fastcpxy', i, j, old_chgres, 0) - xsaixy_in = read_NetCDF_surface_var(nc_file, 'xsaixy', i, j, old_chgres, 0) - xlaixy_in = read_NetCDF_surface_var(nc_file, 'xlaixy', i, j, old_chgres, 0) - taussxy_in = read_NetCDF_surface_var(nc_file, 'taussxy', i, j, old_chgres, 0) - smcwtdxy_in = read_NetCDF_surface_var(nc_file, 'smcwtdxy', i, j, old_chgres, 0) + qrain_in = read_NetCDF_surface_var(nc_file, 'qrain', i, j, old_chgres, 0) + + # NoahMP LSM + snowxy_in = read_NetCDF_surface_var(nc_file, 'snowxy', i, j, old_chgres, 0) + tvxy_in = read_NetCDF_surface_var(nc_file, 'tvxy', i, j, old_chgres, 0) + tgxy_in = read_NetCDF_surface_var(nc_file, 'tgxy', i, j, old_chgres, 0) + canicexy_in = read_NetCDF_surface_var(nc_file, 'canicexy', i, j, old_chgres, 0) + canliqxy_in = read_NetCDF_surface_var(nc_file, 'canliqxy', i, j, old_chgres, 0) + eahxy_in = read_NetCDF_surface_var(nc_file, 'eahxy', i, j, old_chgres, 0) + tahxy_in = read_NetCDF_surface_var(nc_file, 'tahxy', i, j, old_chgres, 0) + cmxy_in = read_NetCDF_surface_var(nc_file, 'cmxy', i, j, old_chgres, 0) + chxy_in = read_NetCDF_surface_var(nc_file, 'chxy', i, j, old_chgres, 0) + fwetxy_in = read_NetCDF_surface_var(nc_file, 'fwetxy', i, j, old_chgres, 0) + sneqvoxy_in = read_NetCDF_surface_var(nc_file, 'sneqvoxy', i, j, old_chgres, 0) + alboldxy_in = read_NetCDF_surface_var(nc_file, 'alboldxy', i, j, old_chgres, 0) + qsnowxy_in = read_NetCDF_surface_var(nc_file, 'qsnowxy', i, j, old_chgres, 0) + wslakexy_in = read_NetCDF_surface_var(nc_file, 'wslakexy', i, j, old_chgres, 0) + zwtxy_in = read_NetCDF_surface_var(nc_file, 'zwtxy', i, j, old_chgres, 0) + waxy_in = read_NetCDF_surface_var(nc_file, 'waxy', i, j, old_chgres, 0) + wtxy_in = read_NetCDF_surface_var(nc_file, 'wtxy', i, j, old_chgres, 0) + lfmassxy_in = read_NetCDF_surface_var(nc_file, 'lfmassxy', i, j, old_chgres, 0) + rtmassxy_in = read_NetCDF_surface_var(nc_file, 'rtmassxy', i, j, old_chgres, 0) + stmassxy_in = read_NetCDF_surface_var(nc_file, 'stmassxy', i, j, old_chgres, 0) + woodxy_in = read_NetCDF_surface_var(nc_file, 'woodxy', i, j, old_chgres, 0) + stblcpxy_in = read_NetCDF_surface_var(nc_file, 'stblcpxy', i, j, old_chgres, 0) + fastcpxy_in = read_NetCDF_surface_var(nc_file, 'fastcpxy', i, j, old_chgres, 0) + xsaixy_in = read_NetCDF_surface_var(nc_file, 'xsaixy', i, j, old_chgres, 0) + xlaixy_in = read_NetCDF_surface_var(nc_file, 'xlaixy', i, j, old_chgres, 0) + taussxy_in = read_NetCDF_surface_var(nc_file, 'taussxy', i, j, old_chgres, 0) + smcwtdxy_in = read_NetCDF_surface_var(nc_file, 'smcwtdxy', i, j, old_chgres, 0) deeprechxy_in = read_NetCDF_surface_var(nc_file, 'deeprechxy', i, j, old_chgres, 0) - rechxy_in = read_NetCDF_surface_var(nc_file, 'rechxy', i, j, old_chgres, 0) - albdvis_in = read_NetCDF_surface_var(nc_file, 'albdvis', i, j, old_chgres, 0) - albdnir_in = read_NetCDF_surface_var(nc_file, 'albdnir', i, j, old_chgres, 0) - albivis_in = read_NetCDF_surface_var(nc_file, 'albivis', i, j, old_chgres, 0) - albinir_in = read_NetCDF_surface_var(nc_file, 'albinir', i, j, old_chgres, 0) - emiss_in = read_NetCDF_surface_var(nc_file, 'emiss', i, j, old_chgres, 0) - - #RUC LSM variables that may be in the surface file - wetness_in = read_NetCDF_surface_var(nc_file, 'wetness', i, j, old_chgres, 0) - clw_surf_land_in = read_NetCDF_surface_var(nc_file, 'clw_surf_land', i, j, old_chgres, 0) - clw_surf_ice_in = read_NetCDF_surface_var(nc_file, 'clw_surf_ice', i, j, old_chgres, 0) - qwv_surf_land_in = read_NetCDF_surface_var(nc_file, 'qwv_surf_land', i, j, old_chgres, 0) - qwv_surf_ice_in = read_NetCDF_surface_var(nc_file, 'qwv_surf_ice', i, j, old_chgres, 0) - tsnow_land_in = read_NetCDF_surface_var(nc_file, 'tsnow_land', i, j, old_chgres, 0) - tsnow_ice_in = read_NetCDF_surface_var(nc_file, 'tsnow_ice', i, j, old_chgres, 0) + rechxy_in = read_NetCDF_surface_var(nc_file, 'rechxy', i, j, old_chgres, 0) + + # RUC LSM + wetness_in = read_NetCDF_surface_var(nc_file, 'wetness', i, j, old_chgres, 0) + clw_surf_land_in = read_NetCDF_surface_var(nc_file, 'clw_surf_land', i, j, old_chgres, 0) + clw_surf_ice_in = read_NetCDF_surface_var(nc_file, 'clw_surf_ice', i, j, old_chgres, 0) + qwv_surf_land_in = read_NetCDF_surface_var(nc_file, 'qwv_surf_land', i, j, old_chgres, 0) + qwv_surf_ice_in = read_NetCDF_surface_var(nc_file, 'qwv_surf_ice', i, j, old_chgres, 0) + tsnow_land_in = read_NetCDF_surface_var(nc_file, 'tsnow_land', i, j, old_chgres, 0) + tsnow_ice_in = read_NetCDF_surface_var(nc_file, 'tsnow_ice', i, j, old_chgres, 0) snowfall_acc_land_in = read_NetCDF_surface_var(nc_file, 'snowfall_acc_land', i, j, old_chgres, 0) - snowfall_acc_ice_in = read_NetCDF_surface_var(nc_file, 'snowfall_acc_ice', i, j, old_chgres, 0) - sncovr_ice_in = read_NetCDF_surface_var(nc_file, 'sncovr_ice', i, j, old_chgres, 0) - lai_in = read_NetCDF_surface_var(nc_file, 'lai', i, j, old_chgres, 0) - - #read in profiles (would be 3D variables in a 3D model) - - #land_state + snowfall_acc_ice_in = read_NetCDF_surface_var(nc_file, 'snowfall_acc_ice', i, j, old_chgres, 0) + sfalb_lnd_in = read_NetCDF_surface_var(nc_file, 'sfalb_lnd', i, j, old_chgres, 0) + sfalb_lnd_bck_in = read_NetCDF_surface_var(nc_file, 'sfalb_lnd_bck', i, j, old_chgres, 0) + sfalb_ice_in = read_NetCDF_surface_var(nc_file, 'sfalb_ice', i, j, old_chgres, 0) + lai_in = read_NetCDF_surface_var(nc_file, 'lai', i, j, old_chgres, 0) + albdirvis_ice_in = read_NetCDF_surface_var(nc_file, 'albdirvis_ice', i, j, old_chgres, 0) + albdirnir_ice_in = read_NetCDF_surface_var(nc_file, 'albdirnir_ice', i, j, old_chgres, 0) + albdifvis_ice_in = read_NetCDF_surface_var(nc_file, 'albdifvis_ice', i, j, old_chgres, 0) + albdifnir_ice_in = read_NetCDF_surface_var(nc_file, 'albdifnir_ice', i, j, old_chgres, 0) + emis_lnd_in = read_NetCDF_surface_var(nc_file, 'emis_lnd', i, j, old_chgres, 0) + emis_ice_in = read_NetCDF_surface_var(nc_file, 'emis_ice', i, j, old_chgres, 0) + + # + # read in profiles (3D) + # + + # land_state stc_in = read_NetCDF_surface_var(nc_file, 'stc', i, j, old_chgres, missing_variable_soil_layers) smc_in = read_NetCDF_surface_var(nc_file, 'smc', i, j, old_chgres, missing_variable_soil_layers) slc_in = read_NetCDF_surface_var(nc_file, 'slc', i, j, old_chgres, missing_variable_soil_layers) - #NoahMP 3D variables + # NoahMP LSM snicexy_in = read_NetCDF_surface_var(nc_file, 'snicexy', i, j, old_chgres, missing_variable_snow_layers) snliqxy_in = read_NetCDF_surface_var(nc_file, 'snliqxy', i, j, old_chgres, missing_variable_snow_layers) - tsnoxy_in = read_NetCDF_surface_var(nc_file, 'tsnoxy', i, j, old_chgres, missing_variable_snow_layers) + tsnoxy_in = read_NetCDF_surface_var(nc_file, 'tsnoxy', i, j, old_chgres, missing_variable_snow_layers) smoiseq_in = read_NetCDF_surface_var(nc_file, 'smoiseq', i, j, old_chgres, missing_variable_soil_layers) zsnsoxy_in = read_NetCDF_surface_var(nc_file, 'zsnsoxy', i, j, old_chgres, missing_variable_soil_layers + missing_variable_snow_layers) - #RUC LSM 3D variables - tslb_in = read_NetCDF_surface_var(nc_file, 'tslb', i, j, old_chgres, missing_variable_soil_layers) + # RUC LSM + tslb_in = read_NetCDF_surface_var(nc_file, 'tslb', i, j, old_chgres, missing_variable_soil_layers) smois_in = read_NetCDF_surface_var(nc_file, 'smois', i, j, old_chgres, missing_variable_soil_layers) - sh2o_in = read_NetCDF_surface_var(nc_file, 'sh2o', i, j, old_chgres, missing_variable_soil_layers) - smfr_in = read_NetCDF_surface_var(nc_file, 'smfr', i, j, old_chgres, missing_variable_soil_layers) - flfr_in = read_NetCDF_surface_var(nc_file, 'flfr', i, j, old_chgres, missing_variable_soil_layers) + sh2o_in = read_NetCDF_surface_var(nc_file, 'sh2o', i, j, old_chgres, missing_variable_soil_layers) + smfr_in = read_NetCDF_surface_var(nc_file, 'smfr', i, j, old_chgres, missing_variable_soil_layers) + flfr_in = read_NetCDF_surface_var(nc_file, 'flfr', i, j, old_chgres, missing_variable_soil_layers) - #fractional grid 3D variables + # fractional grid tiice_in = read_NetCDF_surface_var(nc_file, 'tiice', i, j, old_chgres, missing_variable_ice_layers) - #print("zorlwav_in = {}".format(zorlwav_in)) - + # nc_file.close() #put data in a dictionary surface = { - #Noah LSM + # Noah LSM "tsfco": tsfco_in, "tg3": tg3_in, "uustar": uustar_in, @@ -579,21 +1186,21 @@ def get_UFS_surface_data(dir, tile, i, j, old_chgres): "alnwf": alnwf_in, "facsf": facsf_in, "facwf": facwf_in, - "styp": styp_in, - "slope": slope_in, - "vtyp": vtyp_in, - "vfrac": vfrac_in, + "soiltyp": styp_in, + "slopetyp": slope_in, + "vegtyp": vtyp_in, + "vegfrac": vfrac_in, "shdmin": shdmin_in, "shdmax": shdmax_in, - "zorlw": zorlw_in, + "z0": zorlo_in, "slmsk": slmsk_in, "canopy": canopy_in, "hice": hice_in, "fice": fice_in, "tisfc": tisfc_in, - "snwdph": snwdph_in, + "snowd": snwdph_in, "snoalb": snoalb_in, - "sheleg": sheleg_in, + "weasd": sheleg_in, "f10m": f10m_in, "t2m": t2m_in, "q2m": q2m_in, @@ -606,7 +1213,7 @@ def get_UFS_surface_data(dir, tile, i, j, old_chgres): "zorll": zorll_in, "zorli": zorli_in, #cplwav - "zorlwav": zorlwav_in, + "zorlw": zorlw_in, #NSST "tref": tref_in, "z_c": z_c_in, @@ -656,12 +1263,7 @@ def get_UFS_surface_data(dir, tile, i, j, old_chgres): "smcwtdxy": smcwtdxy_in, "deeprechxy": deeprechxy_in, "rechxy": rechxy_in, - "albdvis": albdvis_in, - "albdnir": albdnir_in, - "albivis": albivis_in, - "albinir": albinir_in, - "emiss": emiss_in, - #RUC LSM + # RUC LSM 2D "wetness": wetness_in, "clw_surf_land": clw_surf_land_in, "clw_surf_ice": clw_surf_ice_in, @@ -671,8 +1273,16 @@ def get_UFS_surface_data(dir, tile, i, j, old_chgres): "tsnow_ice": tsnow_ice_in, "snowfall_acc_land": snowfall_acc_land_in, "snowfall_acc_ice": snowfall_acc_ice_in, - "sncovr_ice": sncovr_ice_in, + "sfalb_lnd": sfalb_lnd_in, + "sfalb_lnd_bck": sfalb_lnd_bck_in, + "sfalb_ice": sfalb_ice_in, "lai": lai_in, + "albdirvis_ice": albdirvis_ice_in, + "albdirnir_ice": albdirnir_ice_in, + "albdifvis_ice": albdifvis_ice_in, + "albdifnir_ice": albdifnir_ice_in, + "emis_lnd": emis_lnd_in, + "emis_ice": emis_ice_in, #Noah LSM 3D "stc": stc_in, "smc": smc_in, @@ -694,99 +1304,128 @@ def get_UFS_surface_data(dir, tile, i, j, old_chgres): } return surface -def get_UFS_oro_data(dir, tile, i, j): +######################################################################################## +# +######################################################################################## +def get_UFS_oro_data(dir, tile, i, j, lam): """Get the orographic data for the given tile and indices""" - filename_pattern = 'oro_data.tile{0}.nc'.format(tile) - for f_name in os.listdir(dir): - if fnmatch.fnmatch(f_name, filename_pattern): - filename = f_name - - nc_file = Dataset('{0}/{1}'.format(dir,filename)) + if lam: + nc_file = Dataset('{0}/{1}'.format(dir,'oro_data.nc')) + else: + filename_pattern = 'oro_data.tile{0}.nc'.format(tile) + for f_name in os.listdir(dir): + if fnmatch.fnmatch(f_name, filename_pattern): + filename = f_name + + nc_file = Dataset('{0}/{1}'.format(dir,filename)) # orographyic properties - stddev_in = read_NetCDF_var(nc_file, "stddev", i, j) - convexity_in = read_NetCDF_var(nc_file, "convexity", i, j) - oa1_in = read_NetCDF_var(nc_file, "oa1", i, j) - oa2_in = read_NetCDF_var(nc_file, "oa2", i, j) - oa3_in = read_NetCDF_var(nc_file, "oa3", i, j) - oa4_in = read_NetCDF_var(nc_file, "oa4", i, j) - ol1_in = read_NetCDF_var(nc_file, "ol1", i, j) - ol2_in = read_NetCDF_var(nc_file, "ol2", i, j) - ol3_in = read_NetCDF_var(nc_file, "ol3", i, j) - ol4_in = read_NetCDF_var(nc_file, "ol4", i, j) - theta_in = read_NetCDF_var(nc_file, "theta", i, j) - gamma_in = read_NetCDF_var(nc_file, "gamma", i, j) - sigma_in = read_NetCDF_var(nc_file, "sigma", i, j) - elvmax_in = read_NetCDF_var(nc_file, "elvmax", i, j) - orog_filt_in = read_NetCDF_var(nc_file, "orog_filt", i, j) - orog_raw_in = read_NetCDF_var(nc_file, "orog_raw", i, j) + stddev_in = read_NetCDF_var(nc_file, "stddev", i, j) + convexity_in = read_NetCDF_var(nc_file, "convexity", i, j) + oa1_in = read_NetCDF_var(nc_file, "oa1", i, j) + oa2_in = read_NetCDF_var(nc_file, "oa2", i, j) + oa3_in = read_NetCDF_var(nc_file, "oa3", i, j) + oa4_in = read_NetCDF_var(nc_file, "oa4", i, j) + ol1_in = read_NetCDF_var(nc_file, "ol1", i, j) + ol2_in = read_NetCDF_var(nc_file, "ol2", i, j) + ol3_in = read_NetCDF_var(nc_file, "ol3", i, j) + ol4_in = read_NetCDF_var(nc_file, "ol4", i, j) + theta_in = read_NetCDF_var(nc_file, "theta", i, j) + gamma_in = read_NetCDF_var(nc_file, "gamma", i, j) + sigma_in = read_NetCDF_var(nc_file, "sigma", i, j) + elvmax_in = read_NetCDF_var(nc_file, "elvmax", i, j) + orog_filt_in = read_NetCDF_var(nc_file, "orog_filt", i, j) + orog_raw_in = read_NetCDF_var(nc_file, "orog_raw", i, j) #fractional landmask variables - land_frac_in = read_NetCDF_var(nc_file, "land_frac", i, j) - #lake variables - lake_frac_in = read_NetCDF_var(nc_file, "lake_frac", i, j) + land_frac_in = read_NetCDF_var(nc_file, "land_frac", i, j) + #lake variables (optional) + lake_frac_in = read_NetCDF_var(nc_file, "lake_frac", i, j) lake_depth_in = read_NetCDF_var(nc_file, "lake_depth", i, j) - + + # nc_file.close() - #put data in a dictionary - oro = { - "stddev": stddev_in, - "convexity": convexity_in, - "oa1": oa1_in, - "oa2": oa2_in, - "oa3": oa3_in, - "oa4": oa4_in, - "ol1": ol1_in, - "ol2": ol2_in, - "ol3": ol3_in, - "ol4": ol4_in, - "theta": theta_in, - "gamma": gamma_in, - "sigma": sigma_in, - "elvmax": elvmax_in, - "orog_filt": orog_filt_in, - "orog_raw": orog_raw_in, - "land_frac": land_frac_in, - "lake_frac": lake_frac_in, - "lake_depth": lake_depth_in - } + # Store data in a dictionary + oro = {"stddev": stddev_in, + "convexity": convexity_in, + "oa1": oa1_in, + "oa2": oa2_in, + "oa3": oa3_in, + "oa4": oa4_in, + "ol1": ol1_in, + "ol2": ol2_in, + "ol3": ol3_in, + "ol4": ol4_in, + "theta": theta_in, + "gamma": gamma_in, + "sigma": sigma_in, + "elvmax": elvmax_in, + "oro": orog_filt_in, + "oro_uf": orog_raw_in, + "landfrac": land_frac_in, + "lakefrac": lake_frac_in, + "lakedepth": lake_depth_in} + return oro +######################################################################################## +# +######################################################################################## def get_UFS_vgrid_data(dir): """Get the vertical grid data for resolution of the data within the IC directory""" nc_file = Dataset('{0}/{1}'.format(dir,'gfs_ctrl.nc')) # vertical coordinate definition + # GJF: it looks like there is an extra level on top that represents 0 Pa, otherwise these values are for vertical grid interfaces ak=nc_file['vcoord'][0,::-1] bk=nc_file['vcoord'][1,::-1] + #GJF: in external_ic.F90, when external_eta is true (which it apparently is for FV3GFS runs), the top value is ignored + #ak = ak[0:len(ak)-1] + #bk = bk[0:len(bk)-1] + nc_file.close() vgrid = { "ak": ak, - "bk": bk + "bk": bk, + "nlevs": len(ak)-2 #full grid levels are interfaces - 1 and there is an extra level on top (subtract 2) } return vgrid -def get_UFS_grid_area(dir, tile, i, j): +######################################################################################## +# +######################################################################################## +def get_UFS_grid_area(dir, tile, i, j, lam): """Get the horizontal grid cell area for the given tile and indices""" #this information is in the supergrid files - filename_pattern = '*grid.tile{0}.nc'.format(tile) - - for f_name in os.listdir(dir): - if fnmatch.fnmatch(f_name, filename_pattern): - filename = f_name - if not filename: - message = 'No filenames matching the pattern {0} found in {1}'.format(filename_pattern,dir) - logging.critical(message) - raise Exception(message) - + if lam: + filename_pattern = '*grid.tile{0}.halo{1}.nc'.format(tile, n_lam_halo_points) + for f_name in os.listdir(dir): + if fnmatch.fnmatch(f_name, filename_pattern): + filename = f_name + if not filename: + message = 'No filenames matching the pattern {0} found in {1}'.format(filename_pattern,dir) + logging.critical(message) + raise Exception(message) + else: + filename_pattern = '*grid.tile{0}.nc'.format(tile) + + for f_name in os.listdir(dir): + if fnmatch.fnmatch(f_name, filename_pattern): + filename = f_name + if not filename: + message = 'No filenames matching the pattern {0} found in {1}'.format(filename_pattern,dir) + logging.critical(message) + raise Exception(message) + nc_file = Dataset('{0}/{1}'.format(dir,filename)) + # extract out area of grid cell #calculate supergrid indices from regular grid indices @@ -794,1291 +1433,1307 @@ def get_UFS_grid_area(dir, tile, i, j): ipt2 = i*2+1 #from Phil Pegion: the area is calculated by adding up the 4 components of the contained supergrid cells - area_in=nc_file['area'][jpt2-1:jpt2+1,ipt2-1:ipt2+1] + if lam: + area_data = nc_file['area'][:,:] + area_data_no_halo = area_data[2*n_lam_halo_points:area_data.shape[0]-2*n_lam_halo_points,2*n_lam_halo_points:area_data.shape[1]-2*n_lam_halo_points] + area_in = area_data_no_halo[jpt2-1:jpt2+1,ipt2-1:ipt2+1] + else: + area_in=nc_file['area'][jpt2-1:jpt2+1,ipt2-1:ipt2+1] return area_in.sum() -def get_UFS_forcing_data(nlevs): +######################################################################################## +# +######################################################################################## +def search_in_dict(listin,name): + for count, dictionary in enumerate(listin): + if dictionary["name"] == name: + return count + +######################################################################################## +# +######################################################################################## +def get_UFS_forcing_data(nlevs, state_IC, location, use_nearest, forcing_dir, grid_dir, + tile, i, j, lam, save_comp_data): """Get the horizontal and vertical advective tendencies for the given tile and indices""" - - #Note: this is a placeholder function that sets forcing to 0, but will need to be filled out in the future from custom FV3 output - - ntimes = 1 - - time = np.zeros(ntimes) - w_ls = np.zeros((nlevs,ntimes),dtype=float) - omega = np.zeros((nlevs,ntimes),dtype=float) - u_g = np.zeros((nlevs,ntimes),dtype=float) - v_g = np.zeros((nlevs,ntimes),dtype=float) - u_nudge = np.zeros((nlevs,ntimes),dtype=float) - v_nudge = np.zeros((nlevs,ntimes),dtype=float) - T_nudge = np.zeros((nlevs,ntimes),dtype=float) - thil_nudge = np.zeros((nlevs,ntimes),dtype=float) - qt_nudge = np.zeros((nlevs,ntimes),dtype=float) - rad_heating = np.zeros((nlevs,ntimes),dtype=float) - h_advec_thil = np.zeros((nlevs,ntimes),dtype=float) - v_advec_thil = np.zeros((nlevs,ntimes),dtype=float) - h_advec_qt = np.zeros((nlevs,ntimes),dtype=float) - v_advec_qt = np.zeros((nlevs,ntimes),dtype=float) - - forcing = { - "time": time, - "w_ls": w_ls, - "omega": omega, - "u_g": u_g, - "v_g": v_g, - "u_nudge": u_nudge, - "v_nudge": v_nudge, - "T_nudge": T_nudge, - "thil_nudge": thil_nudge, - "qt_nudge": qt_nudge, - "rad_heating": rad_heating, - "h_advec_thil": h_advec_thil, - "v_advec_thil": v_advec_thil, - "h_advec_qt": h_advec_qt, - "v_advec_qt": v_advec_qt - } - - return forcing - -def add_noahmp_coldstart(surface, date): - """Add cold-start ICs for the NoahMP LSM from Noah LSM variables""" - - #use cold start section of FV3/io/FV3GFS_io.F90 to initialize NoahMP-specific variables (this is a python port of the Fortran code in that file) - - #MPTABLE.TBL uses a namelist format, so can use f90nml to read it in - mptable_nml_all = f90nml.read(os.path.join(NOAHMP_TABLES_DIR, 'MPTABLE.TBL')) - #MPTABLE.TBL contains data (with distinct namelists) for USGS and MODIS data; looks like MODIS is the operational - mptable_nml_active = mptable_nml_all['noah_mp_modis_parameters'] #alternative is mptable_nml_all['noah_mp_usgs_parameters'] - - #operational values; change if necessary (or read from somewhere?) - n_snow_layers = 3 - n_soil_layers = 4 - - #thickness of each soil level - dzs = np.array([0.1,0.3,0.6,1.0]) - - #bottom depth of each soil level - zsoil = np.array([-0.1,-0.4,-1.0,-2.0]) - - #initialize all NoahMP vars as missing - surface["tvxy"] = missing_value - surface["tgxy"] = missing_value - surface["tahxy"] = missing_value - surface["canicexy"] = missing_value - surface["canliqxy"] = missing_value - surface["eahxy"] = missing_value - surface["cmxy"] = missing_value - surface["chxy"] = missing_value - surface["fwetxy"] = missing_value - surface["sneqvoxy"] = missing_value - surface["alboldxy"] = missing_value - surface["qsnowxy"] = missing_value - surface["wslakexy"] = missing_value - surface["taussxy"] = missing_value - surface["waxy"] = missing_value - surface["wtxy"] = missing_value - surface["zwtxy"] = missing_value - surface["xlaixy"] = missing_value - surface["xsaixy"] = missing_value - - surface["lfmassxy"] = missing_value - surface["stmassxy"] = missing_value - surface["rtmassxy"] = missing_value - surface["woodxy"] = missing_value - surface["stblcpxy"] = missing_value - surface["fastcpxy"] = missing_value - surface["smcwtdxy"] = missing_value - surface["deeprechxy"] = missing_value - surface["rechxy"] = missing_value - - surface["snowxy"] = missing_value - surface["snicexy"] = np.ones(n_snow_layers)*missing_value - surface["snliqxy"] = np.ones(n_snow_layers)*missing_value - surface["tsnoxy"] = np.ones(n_snow_layers)*missing_value - surface["smoiseq"] = np.ones(n_soil_layers)*missing_value - surface["zsnsoxy"] = np.ones(n_snow_layers + n_soil_layers)*missing_value - - if surface["slmsk"] > 0.01: - surface["tvxy"] = surface["tsfco"] - surface["tgxy"] = surface["tsfco"] - surface["tahxy"] = surface["tsfco"] - - if (surface["snwdph"] > 0.01 and surface["tsfco"] > 273.15 ): - surface["tvxy"] = 273.15 - surface["tgxy"] = 273.15 - surface["tahxy"]= 273.15 - - surface["canicexy"] = 0.0 - surface["canliqxy"] = surface["canopy"] - surface["eahxy"] = 2000.0 - - # eahxy = psfc*qv/(0.622+qv); qv is mixing ratio, converted from sepcific - # humidity specific humidity /(1.0 - specific humidity) + + # Determine UFS history file format (tiled/quilted) + if lam: + atm_ftag = 'atmf*.tile{0}.nc'.format(tile) + sfc_ftag = 'sfcf*.tile{0}.nc'.format(tile) + else: + atm_ftag = 'atmf*.nc' + sfc_ftag = 'sfcf*.nc' + + # Get list of UFS history files with 3D ATMospheric state variables. + atm_filenames = [] + for f_name in os.listdir(forcing_dir): + if fnmatch.fnmatch(f_name, atm_ftag): + atm_filenames.append(f_name) + if not atm_filenames: + message = 'No filenames matching the pattern {0} found in {1}'. \ + format(atm_ftag,forcing_dir) + logging.critical(message) + raise Exception(message) + atm_filenames = sorted(atm_filenames) + n_filesA = len(atm_filenames) + + # Get list of UFS history files with 2D fields. + sfc_filenames = [] + for f_name in os.listdir(forcing_dir): + if fnmatch.fnmatch(f_name, sfc_ftag): + sfc_filenames.append(f_name) + if not sfc_filenames: + message = 'No filenames matching the pattern {0} found in {1}'. \ + format(sfc_ftag,forcing_dir) + logging.critical(message) + raise Exception(message) + sfc_filenames = sorted(sfc_filenames) + n_filesS = len(sfc_filenames) + + if (n_filesS == n_filesA): + n_files = n_filesA + else: + message = 'Number of UFS 2D/3D history files is inconsistent' + logging.critical(message) + raise Exception(message) + + # Physical constants (used by FV3 remapping functions) + kord_tm = -9 + kord_tr = 9 + t_min = 184.0 + q_min = 0.0 + sec_in_hr = 3600. + + #################################################################################### + # + # Read in atmospheric state, atmf*.nc history files. + # + #################################################################################### + + # Find nearest point on UFS history file (quilted) grid. + if use_nearest: + (tile_jj, tile_ii, point_lon, point_lat, dist_min) = find_loc_indices(location, forcing_dir, -999, lam) + print('The closest point has indices [{0},{1}]'.format(tile_ii,tile_jj)) + print('This index has a central longitude/latitude of [{0},{1}]'.format(point_lon,point_lat)) + print('This grid cell is approximately {0} km away from the desired location of {1} {2}'.format(dist_min/1.0E3,location[0],location[1])) + + # + ps = [] + p_lev = [] + p_lay = [] + t_lay = [] + qv_lay = [] + u_lay = [] + v_lay = [] + time_hr = [] + + # Get grid from UFS IC data + (ic_grid_lon, ic_grid_lat) = get_initial_lon_lat_grid(grid_dir, tile, lam) + + # Read in 3D UFS history files + for count, filename in enumerate(atm_filenames, start=1): + nc_file = Dataset('{0}/{1}'.format(forcing_dir,filename)) + nc_file.set_always_mask(False) - surface["cmxy"] = 0.0 - surface["chxy"] = 0.0 - surface["fwetxy"] = 0.0 - surface["sneqvoxy"] = surface["sheleg"] # mm - surface["alboldxy"] = 0.65 - surface["qsnowxy"] = 0.0 + # Check if UFS history file grid is different than UFS initial-condition grid. + if not use_nearest: + try: + data_grid_lon = nc_file['lon'][:,:] + data_grid_lat = nc_file['lat'][:,:] + except: + data_grid_lon = nc_file['grid_xt'][:,:] + data_grid_lat = nc_file['grid_yt'][:,:] + equal_grids = False + if (ic_grid_lon.shape == data_grid_lon.shape and \ + ic_grid_lat.shape == ic_grid_lat.shape): + if (np.equal(ic_grid_lon,data_grid_lon).all() and \ + np.equal(ic_grid_lat,data_grid_lat).all()): + equal_grids = True + + # If necessary, remap history file (data_grid) to IC file (ic_grid). + if (not equal_grids): + print('Regridding {} onto native grid: regridding progress = {}%'. \ + format(filename, 100.0*count/(2*n_files))) + + grid_in = {'lon': data_grid_lon, 'lat': data_grid_lat} + grid_out = {'lon': np.reshape(ic_grid_lon[j,i],(-1,1)), 'lat': \ + np.reshape(ic_grid_lat[j,i],(-1,1))} + regridder = xesmf.Regridder(grid_in, grid_out, 'bilinear') + ps_data = regridder(nc_file['pressfc'][0,:,:]) + t_data = regridder(nc_file['tmp'][0,::-1,:,:]) + qv_data = regridder(nc_file['spfh'][0,::-1,:,:]) + u_data = regridder(nc_file['ugrd'][0,::-1,:,:]) + v_data = regridder(nc_file['vgrd'][0,::-1,:,:]) + i_get = 0 + j_get = 0 + # Same grids for history file (data_grid) to IC file (ic_grid). + else: + ps_data = nc_file['pressfc'][0,:,:] + t_data = nc_file['tmp'][0,::-1,:,:] + qv_data = nc_file['spfh'][0,::-1,:,:] + u_data = nc_file['ugrd'][0,::-1,:,:] + v_data = nc_file['vgrd'][0,::-1,:,:] + i_get = i + j_get = j + else: + print('Using nearest UFS point {} progress = {}%'.format(filename, 100.0*count/(2*n_files))) + ps_data = nc_file['pressfc'][0,:,:] + t_data = nc_file['tmp'][0,::-1,:,:] + qv_data = nc_file['spfh'][0,::-1,:,:] + u_data = nc_file['ugrd'][0,::-1,:,:] + v_data = nc_file['vgrd'][0,::-1,:,:] + j_get = tile_jj + i_get = tile_ii + + # Compute and store vertical grid information. + ak = getattr(nc_file, "ak")[::-1] + bk = getattr(nc_file, "bk")[::-1] + ps.append(ps_data[j_get,i_get]) + nlevs = len(nc_file.dimensions['pfull']) + p_interface = np.zeros(nlevs+1) + for k in range(nlevs+1): + p_interface[k]=ak[k]+ps[-1]*bk[k] + p_lev.append(p_interface) + p_layer = np.zeros(nlevs) + for k in range(nlevs): + p_layer[k] = ((1.0/(rocp+1.0))*(p_interface[k]**(rocp+1.0) - \ + p_interface[k+1]**(rocp+1.0))/(p_interface[k] - \ + p_interface[k+1]))**(1.0/rocp) + p_lay.append(p_layer) + + # Store state variables. + t_lay.append(t_data[:,j_get,i_get]) + qv_lay.append(qv_data[:,j_get,i_get]) + u_lay.append(u_data[:,j_get,i_get]) + v_lay.append(v_data[:,j_get,i_get]) + time_hr.append(nc_file['time'][0]) - surface["wslakexy"] = 0.0 - surface["taussxy"] = 0.0 - surface["waxy"] = 4900.0 - surface["wtxy"] = surface["waxy"] - surface["zwtxy"] = (25.0 + 2.0) - surface["waxy"] / 1000.0 /0.2 + # Close file + nc_file.close() + + # Convert from python list to numpy array + ps = np.asarray(ps) + p_lev = np.asarray(p_lev) + p_lay = np.asarray(p_lay) + t_lay = np.asarray(t_lay) + qv_lay = np.asarray(qv_lay) + u_lay = np.asarray(u_lay) + v_lay = np.asarray(v_lay) + tv_lay = t_lay*(1.0 + zvir*qv_lay) + time_hr = np.asarray(time_hr) + + # Read in 2D UFS history files + vars2d =[{"name":"spfh2m"}, {"name":"tmp2m"}, \ + {"name":"dswrf_ave"}, {"name":"ulwrf_ave"},\ + {"name":"lhtfl_ave"}, {"name":"shtfl_ave"},\ + {"name":"dswrf"}, {"name":"ulwrf"},\ + {"name":"lhtfl"}, {"name":"shtfl"},\ + {"name":"pwat"}, {"name":"vgrd10m"},\ + {"name":"ugrd10m"}] + for var2d in vars2d: var2d["values"] = [] + + for count, filename in enumerate(sfc_filenames, start=1): + nc_file = Dataset('{0}/{1}'.format(forcing_dir,filename)) + nc_file.set_always_mask(False) - vegtyp = np.int(surface['vtyp']) - if (vegtyp == 0): - vegtyp = 7 - if ((vegtyp == mptable_nml_active['ISBARREN']) or (vegtyp == mptable_nml_active['ISSNOW']) or (vegtyp == mptable_nml_active['ISURBAN']) or (vegtyp == mptable_nml_active['ISWATER'])) : - surface["xlaixy"] = 0.0 - surface["xsaixy"] = 0.0 - - surface["lfmassxy"] = 0.0 - surface["stmassxy"] = 0.0 - surface["rtmassxy"] = 0.0 - - surface["woodxy"] = 0.0 - surface["stblcpxy"] = 0.0 - surface["fastcpxy"] = 0.0 + # Check if UFS history file grid is different than UFS initial-condition grid. + if not use_nearest: + try: + data_grid_lon = nc_file['lon'][:,:] + data_grid_lat = nc_file['lat'][:,:] + except: + data_grid_lon = nc_file['grid_xt'][:,:] + data_grid_lat = nc_file['grid_yt'][:,:] + equal_grids = False + if (ic_grid_lon.shape == data_grid_lon.shape and \ + ic_grid_lat.shape == ic_grid_lat.shape): + if (np.equal(ic_grid_lon,data_grid_lon).all() and \ + np.equal(ic_grid_lat,data_grid_lat).all()): + equal_grids = True + + # If necessary, remap history file (data_grid) to IC file (ic_grid). + if (not equal_grids): + print('Regridding {} onto native grid: regridding progress = {}%'. \ + format(filename, 50+50.0*count/(n_files))) + + grid_in = {'lon': data_grid_lon, 'lat': data_grid_lat} + grid_out = {'lon': np.reshape(ic_grid_lon[j,i],(-1,1)), 'lat': \ + np.reshape(ic_grid_lat[j,i],(-1,1))} + regridder = xesmf.Regridder(grid_in, grid_out, 'bilinear') + i_get = 0 + j_get = 0 + # Same grids for history file (data_grid) to IC file (ic_grid). + else: + i_get = i + j_get = j else: - #laim gives monthly values for each of the vegetation types - laim = np.array(mptable_nml_active['LAIM']).reshape(12,20) - - #be sure to use month-1, vegtyp-1 since python is 0-indexed - surface["xlaixy"] = np.amax([laim[date["month"]-1,vegtyp-1],0.05]) - surface["xsaixy"] = np.amax([surface["xlaixy"]*0.1,0.05]) - - sla = np.array(mptable_nml_active['SLA']) - masslai = 1000.0 / np.amax([sla[vegtyp-1],1.0]) - surface["lfmassxy"] = surface["xlaixy"]*masslai - masssai = 1000.0 / 3.0 - surface["stmassxy"] = surface["xsaixy"]*masssai - - surface["rtmassxy"] = 500.0 + print('Using nearest UFS point {} progress = {}%'.format(filename, 50+50.0*count/(n_files))) + j_get = tile_jj + i_get = tile_ii - surface["woodxy"] = 500.0 - surface["stblcpxy"] = 1000.0 - surface["fastcpxy"] = 1000.0 - - if ( vegtyp == mptable_nml_active['ISSNOW'] ): - for k in range(n_soil_layers): - surface["stc"][k] = np.amin([surface["stc"][k],np.amin([surface["tg3"],263.15])]) - surface["smc"][k] = 1 - surface["slc"][k] = 0 + for var2d in vars2d: + if not use_nearest: + data = regridder(nc_file[var2d["name"]][0,:,:]) + else: + data = nc_file[var2d["name"]][0,:,:] + var2d["values"].append(data[j_get,i_get]) + var2d["units"] = nc_file[var2d["name"]].getncattr(name="units") + var2d["long_name"] = nc_file[var2d["name"]].getncattr(name="long_name") + + nc_file.close() + + # Convert to numpy arrays + for var2d in vars2d: + var2d["values"] = np.asarray(var2d["values"]) + + # + # Create dictionary with full "Native" state (IC@t=0,ATMF*@t>0) + # + ps_IC = np.zeros([1]) + ps_IC[0] = state_IC["ps"] + pi_IC = np.zeros([1,nlevs+1]) + pi_IC[0,:] = state_IC["pa_i"] + p_IC = np.zeros([1,nlevs]) + p_IC[0,:] = state_IC["pa"] + t_IC = np.zeros([1,nlevs]) + t_IC[0,:] = state_IC["ta"] + qv_IC = np.zeros([1,nlevs]) + qv_IC[0,:] = state_IC["qv"] + u_IC = np.zeros([1,nlevs]) + u_IC[0,:] = state_IC["ua"] + v_IC = np.zeros([1,nlevs]) + v_IC[0,:] = state_IC["va"] + tv_IC = t_IC*(1.0 + zvir*qv_IC) + stateNATIVE = {"time": np.concatenate((np.asarray([0.]), time_hr[:])), \ + "ps": np.concatenate((ps_IC, ps), axis=0), \ + "p_lev": np.concatenate((pi_IC, p_lev), axis=0), \ + "p_lay": np.concatenate((p_IC, p_lay), axis=0), \ + "t_lay": np.concatenate((t_IC, t_lay), axis=0), \ + "qv_lay": np.concatenate((qv_IC, qv_lay), axis=0), \ + "u_lay": np.concatenate((u_IC, u_lay), axis=0), \ + "v_lay": np.concatenate((v_IC, v_lay), axis=0), \ + "tv_lay": np.concatenate((tv_IC, tv_lay), axis=0)} + + #################################################################################### + # + # The "total" advection, where "total" = "advective + remapping", can be computed + # directly by taking the difference across time. + # The advective part is the piece needed to force the SCM, which we can "back-out" + # by computing the "remapping" component, and removing it from the total. + # + # At initial-time (ICs) + # - Remap IC state to vertical grid of first UFS history file. + # + # At subsequent time(s) + # - Remap UFS state at current time-step to vertical grid of subsequent time-step + # (used for differencing) + # + # This "REGRID"ed state is used to remove the impact vertical remapping on the + # change of state. + # + # *NOTE* The first UFS history file is AFTER the first physics timestep. Subsequent + # history files are controlled by "output_fh" in the UFS. + # + #################################################################################### + + # + nlevs = len(p_lay[0,:]) + dummy = np.zeros(1) + from_p = np.zeros([1,nlevs+1]) + to_p = np.zeros([1,nlevs+1]) + log_from_p = np.zeros([1,nlevs+1]) + log_to_p = np.zeros([1,nlevs+1]) + dp2 = np.zeros([1,nlevs]) + tv_rev = np.zeros([1,nlevs]) + qv_rev = np.zeros([1,nlevs]) + u_rev = np.zeros([1,nlevs]) + v_rev = np.zeros([1,nlevs]) + tv_layr = np.zeros([n_files+1,nlevs]) + qv_layr = np.zeros([n_files+1,nlevs]) + u_layr = np.zeros([n_files+1,nlevs]) + v_layr = np.zeros([n_files+1,nlevs]) + p_layr = np.zeros([n_files+1,nlevs]) + p_levr = np.zeros([n_files+1,nlevs+1]) + + # + # First timestep... + # + + # Interpolation range + from_p[0,:] = state_IC["pa_i"][::-1] + to_p[0,:] = p_lev[0,::-1] + log_from_p[0,:] = np.log(state_IC["pa_i"][::-1]) + log_to_p[0,:] = np.log(p_lev[0,::-1]) + + # IC Virtual Temperature on vertical-grid of first UFS history file. + tv_init = state_IC["ta"]*(1.0 + zvir*state_IC["qv"]) + tv_init_rev = tv_init[::-1] + tv_rev_new = fv3_remap.map_scalar(nlevs, log_from_p, tv_init_rev[np.newaxis, :], \ + dummy, nlevs, log_to_p, 0, 0, 1, \ + np.abs(kord_tm), t_min) + + # IC Specific humidity on vertical-grid of first UFS history file. + qv_init_rev = state_IC["qv"][::-1] + for k in range(0,nlevs): dp2[0,k] = from_p[0,k+1] - from_p[0,k] + qv_rev_new = fv3_remap.map1_q2(nlevs, from_p, qv_init_rev[np.newaxis, :], \ + nlevs, to_p, dp2, 0, 0, 0, kord_tr, q_min) + + # IC Zonal wind on vertical-grid of first UFS history file. + u_init_rev = state_IC["ua"][::-1] + u_rev_new = fv3_remap.map1_ppm(nlevs, from_p, u_init_rev[np.newaxis, :], 0.0, \ + nlevs, to_p, 0, 0, -1, kord_tm ) + + # IC Meridional wind on vertical-grid of first UFS history file. + v_init_rev = state_IC["va"][::-1] + v_rev_new = fv3_remap.map1_ppm(nlevs, from_p, v_init_rev[np.newaxis, :], 0.0, \ + nlevs, to_p, 0, 0, -1, kord_tm ) + + # Store + p_layr[0,:] = p_lay[0,:] + p_levr[0,:] = p_lev[0,:] + v_layr[0,:] = v_rev_new[0,::-1] + u_layr[0,:] = u_rev_new[0,::-1] + tv_layr[0,:] = tv_rev_new[0,::-1] + qv_layr[0,:] = qv_rev_new[0,::-1] + + # + # Subsequent timestep(s)... + # (current state on vertical grid of subsequent time-step(s). Used for differencing) + # + + # + for t in range(n_files-1): + # + from_p[0,:] = p_lev[t,::-1] + to_p[0,:] = p_lev[t+1,::-1] + log_from_p[0,:] = np.log(p_lev[t,::-1]) + log_to_p[0,:] = np.log(p_lev[t+1,::-1]) + + # Virtual Temperature @ time > 0 + tv_rev[0,:] = tv_lay[t,::-1] + tv_rev_new = fv3_remap.map_scalar(nlevs, log_from_p, tv_rev, dummy, nlevs, \ + log_to_p, 0, 0, 1, np.abs(kord_tm), t_min) + # Specific humidity @ time > 0 + qv_rev[0,:] = qv_lay[t,::-1] + for k in range(0,nlevs): dp2[0,k] = to_p[0,k+1] - to_p[0,k] + qv_rev_new = fv3_remap.map1_q2(nlevs, from_p, qv_rev, nlevs, to_p, dp2, \ + 0, 0, 0, kord_tr, q_min) + # Zonal wind @ time > 0 + u_rev[0,:] = u_lay[t,::-1] + u_rev_new = fv3_remap.map1_ppm(nlevs, from_p, u_rev, 0.0, nlevs, to_p, \ + 0, 0, -1, kord_tm ) + # Meridional wind @ time > 0 + v_rev[0,:] = v_lay[t,::-1] + v_rev_new = fv3_remap.map1_ppm(nlevs, from_p, v_rev, 0.0, nlevs, to_p, \ + 0, 0, -1, kord_tm ) + + # Store + p_layr[t+1,:] = p_lay[t+1,:] + p_levr[t+1,:] = p_lev[t+1,:] + tv_layr[t+1,:] = tv_rev_new[0,::-1] + qv_layr[t+1,:] = qv_rev_new[0,::-1] + u_layr[t+1,:] = u_rev_new[0,::-1] + v_layr[t+1,:] = v_rev_new[0,::-1] + + # + p_layr[t+2,:] = p_layr[t+1,:] + p_levr[t+2,:] = p_levr[t+1,:] + tv_layr[t+2,:] = tv_layr[t+1,:] + qv_layr[t+2,:] = qv_layr[t+1,:] + u_layr[t+2,:] = u_layr[t+1,:] + v_layr[t+2,:] = v_layr[t+1,:] + + # Temperature + t_layr = tv_layr/(1.0 + zvir*qv_layr) + + # Create dictionary with "Regridded" state + stateREGRID = {"time": np.concatenate((np.asarray([0.]), time_hr[:])), \ + "ps": np.concatenate((ps[0:1], ps), axis=0), \ + "p_lev": p_levr, \ + "p_lay": p_layr, \ + "t_lay": t_layr, \ + "qv_lay": qv_layr, \ + "u_lay": u_layr, \ + "v_lay": v_layr, \ + "tv_lay": tv_layr } + + #################################################################################### + # + # Compute tendencies advective = total - remapping + # + #################################################################################### + + # + dtdt_adv = np.zeros([n_files+1,nlevs]) + dqvdt_adv = np.zeros([n_files+1,nlevs]) + dudt_adv = np.zeros([n_files+1,nlevs]) + dvdt_adv = np.zeros([n_files+1,nlevs]) + pres_adv = np.zeros([n_files+1,nlevs]) + pres_i_adv = np.zeros([n_files+1,nlevs+1]) + tend_remap = np.zeros([1,nlevs]) + tend_total = np.zeros([1,nlevs]) + + # + for t in range(n_files): + # + dtime_sec = (stateNATIVE["time"][t+1] - stateNATIVE["time"][t])*sec_in_hr + # + pres_adv[t,:] = stateNATIVE["p_lay"][t,:] + pres_i_adv[t,:] = stateNATIVE["p_lev"][t,:] + # + tend_total[0,:] = stateREGRID["t_lay"][t+1,:] - stateREGRID["t_lay"][t,:] + tend_remap[0,:] = stateREGRID["t_lay"][t,:] - stateNATIVE["t_lay"][t,:] + dtdt_adv[t,:] = (tend_total[0,:] - tend_remap[0,:]) / dtime_sec + # + tend_total[0,:] = stateREGRID["qv_lay"][t+1,:] - stateREGRID["qv_lay"][t,:] + tend_remap[0,:] = stateREGRID["qv_lay"][t,:] - stateNATIVE["qv_lay"][t,:] + dqvdt_adv[t,:] = (tend_total[0,:] - tend_remap[0,:]) / dtime_sec + # + tend_total[0,:] = stateREGRID["u_lay"][t+1,:] - stateREGRID["u_lay"][t,:] + tend_remap[0,:] = stateREGRID["u_lay"][t,:] - stateNATIVE["u_lay"][t,:] + dudt_adv[t,:] = (tend_total[0,:] - tend_remap[0,:]) / dtime_sec + # + tend_total[0,:] = stateREGRID["v_lay"][t+1,:] - stateREGRID["v_lay"][t,:] + tend_remap[0,:] = stateREGRID["v_lay"][t,:] - stateNATIVE["v_lay"][t,:] + dvdt_adv[t,:] = (tend_total[0,:] - tend_remap[0,:]) / dtime_sec + + # + dtdt_adv[t+1,:] = dtdt_adv[t,:] + dqvdt_adv[t+1,:] = dqvdt_adv[t,:] + dudt_adv[t+1,:] = dudt_adv[t,:] + dvdt_adv[t+1,:] = dvdt_adv[t,:] + pres_adv[t+1,:] = pres_adv[t,:] + pres_i_adv[t+1,:] = pres_i_adv[t,:] + + if save_comp_data: + # + t_layr = np.zeros([n_files+1,nlevs]) + qv_layr = np.zeros([n_files+1,nlevs]) + u_layr = np.zeros([n_files+1,nlevs]) + v_layr = np.zeros([n_files+1,nlevs]) + p_layr = np.zeros([n_files+1,nlevs]) + + # + for t in range(0,n_files): + from_p[0,:] = stateNATIVE["p_lev"][t,::-1] + to_p[0,:] = stateNATIVE["p_lev"][1,::-1] + log_from_p[0,:] = np.log(from_p[0,:]) + log_to_p[0,:] = np.log(to_p[0,:]) + p_layr[t,:] = stateNATIVE["p_lay"][1,::-1] + for k in range(0,nlevs): dp2[0,k] = to_p[0,k+1] - to_p[0,k] + t_layr[t,:] = fv3_remap.map_scalar(nlevs, log_from_p, stateNATIVE["t_lay"][t:t+1,::-1], \ + dummy, nlevs, log_to_p, 0, 0, 1, np.abs(kord_tm), t_min) + qv_layr[t,:] = fv3_remap.map1_q2(nlevs, from_p, stateNATIVE["qv_lay"][t:t+1,::-1], \ + nlevs, to_p, dp2, 0, 0, 0, kord_tr, q_min) + u_layr[t,:] = fv3_remap.map1_ppm(nlevs, from_p, stateNATIVE["u_lay"][t:t+1,::-1], \ + 0.0, nlevs, to_p, 0, 0, -1, kord_tm) + v_layr[t,:] = fv3_remap.map1_ppm(nlevs, from_p, stateNATIVE["v_lay"][t:t+1,::-1], \ + 0.0, nlevs, to_p, 0, 0, -1, kord_tm) + + t_layr[t+1,:] = t_layr[t,:] + qv_layr[t+1,:] = qv_layr[t,:] + u_layr[t+1,:] = u_layr[t,:] + v_layr[t+1,:] = v_layr[t,:] + p_layr[t+1,:] = p_layr[t,:] + + #################################################################################### + # + # if we had atmf,sfcf files at every timestep (and the SCM timestep is made to match + # the UFS), then dqvdt_adv should be applied uninterpolated for each time step. If + # atmf and sfcf files represent time averages over the previous diagnostic period, + # and if forcing terms are interpolatd in time in the SCM, then dqvdt_adv should + # represent the forcing values in the middle of time[t] and time[t+1] from atmf/sfcf. + # That way, the time-averaged applied forcing from time[t] to time[t+1] in the SCM + # will be equal to what is derived from atmf/sfcf. (preference should be to have + # option to remove time-interpolation of forcing such that the constant forcing + # applied converged to time-step values as the diag interval approaches the time + # step) + # + #################################################################################### + time_method = 'constant_simple' #this is not implemented in the SCM code yet + #time_method = 'constant_interp' + #time_method = 'gradient' #this produced wonky results in the SCM; avoid until investigated more + + if (time_method == 'constant_simple'): + print('Forcing should not be interpolated in time. Rather, forcing should held constant at their current values until the next forcing interval is reached.') + ntimes = n_files + time = np.zeros(ntimes) - snd = surface["snwdph"]/1000.0 # go to m from snwdph + p_s = np.zeros((ntimes),dtype=float) + pressure_forc = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_T = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_qv = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_u = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_v = np.zeros((nlevs,ntimes),dtype=float) - if (surface["sheleg"] != 0.0 and snd == 0.0 ): - snd = surface["sheleg"]/1000.0 - - if (vegtyp == 15): # land ice in MODIS/IGBP - if ( surface["sheleg"] < 0.1): - surface["sheleg"] = 0.1 - snd = 0.01 + p_s[0] = ps[0] + pressure_forc[:,0] = pres_adv[0,:] + tot_advec_T[:,0] = dtdt_adv[0,:] + tot_advec_qv[:,0] = dqvdt_adv[0,:] + tot_advec_u[:,0] = dudt_adv[0,:] + tot_advec_v[:,0] = dvdt_adv[0,:] - dzsno = np.zeros(n_snow_layers) - if (snd < 0.025 ): - surface["snowxy"] = 0.0 - dzsno[:] = 0.0 - elif (snd >= 0.025 and snd <= 0.05 ): - surface["snowxy"] = -1.0 - dzsno[-1] = snd - elif (snd > 0.05 and snd <= 0.10 ): - surface["snowxy"] = -2.0 - dzsno[-2] = 0.5*snd - dzsno[-1] = 0.5*snd - elif (snd > 0.10 and snd <= 0.25 ): - surface["snowxy"] = -2.0 - dzsno[-2] = 0.05 - dzsno[-1] = snd - 0.05 - elif (snd > 0.25 and snd <= 0.45 ): - surface["snowxy"] = -3.0 - dzsno[-3] = 0.05 - dzsno[-2] = 0.5*(snd-0.05) - dzsno[-1] = 0.5*(snd-0.05) - elif (snd > 0.45): - surface["snowxy"] = -3.0 - dzsno[-3] = 0.05 - dzsno[-2] = 0.20 - dzsno[-1] = snd - 0.05 - 0.20 - else: - message = 'problem with the logic assigning snow layers.' - logging.critical(message) - raise Exception(message) + for t in range(1,n_files): + time[t] = sec_in_hr*time_hr[t-1] + p_s[t] = ps[t] + pressure_forc[:,t] = pres_adv[t,:] + tot_advec_T[:,t] = dtdt_adv[t,:] + tot_advec_qv[:,t] = dqvdt_adv[t,:] + tot_advec_u[:,t] = dudt_adv[t,:] + tot_advec_v[:,t] = dvdt_adv[t,:] + elif (time_method == 'constant_interp'): + print('Forcing can be interpolated in time, but the time values are chosen such that forcing will effectively be held consant during a diagnostic time interval.') + ntimes = 2*n_files - surface["tsnoxy"][:] = 0.0 - surface["snicexy"][:] = 0.0 - surface["snliqxy"][:] = 0.0 - surface["zsnsoxy"][:] = 0.0 + time_setback = 1.0 #s - isnow = np.int(surface["snowxy"] + n_snow_layers) - dzsnso = np.zeros(n_snow_layers + n_soil_layers) - for k in range(isnow, n_snow_layers): - surface["tsnoxy"][k] = surface["tgxy"] - surface["snliqxy"][k] = 0.0 - surface["snicexy"][k] = 1.00 * dzsno[k] * surface["sheleg"]/snd #this line causes a warning + time = np.zeros(ntimes) + p_s = np.zeros((ntimes),dtype=float) + pressure_forc = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_T = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_qv = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_u = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_v = np.zeros((nlevs,ntimes),dtype=float) - dzsnso[k] = -dzsno[k] - - for k in range(n_snow_layers, n_snow_layers + n_soil_layers): - dzsnso[k] = -dzs[k - n_snow_layers] + time[0] = 0.0 + time[1] = sec_in_hr*time_hr[0] - time_setback #forcing period should extend from beginning of diagnostic period to right BEFORE the next one + p_s[0] = ps[0] + p_s[1] = p_s[0] + pressure_forc[:,0] = pres_adv[0,:] + pressure_forc[:,1] = pressure_forc[:,0] + tot_advec_T[:,0] = dtdt_adv[0,:] + tot_advec_T[:,1] = tot_advec_T[:,0] + tot_advec_qv[:,0] = dqvdt_adv[0,:] + tot_advec_qv[:,1] = tot_advec_qv[:,0] + tot_advec_u[:,0] = dudt_adv[0,:] + tot_advec_u[:,1] = tot_advec_u[:,0] + tot_advec_v[:,0] = dvdt_adv[0,:] + tot_advec_v[:,1] = tot_advec_v[:,0] - surface["zsnsoxy"][isnow] = dzsnso[isnow] - for k in range(isnow+1,n_snow_layers + n_soil_layers): - surface["zsnsoxy"][k] = surface["zsnsoxy"][k-1] + dzsnso[k] - - soilparm = read_noahmp_soil_table() + for t in range(1,n_files): + time[2*t] = sec_in_hr*time_hr[t-1] + time[2*t+1] = sec_in_hr*time_hr[t] - time_setback + p_s[2*t] = ps[t] + p_s[2*t+1] = p_s[2*t] + pressure_forc[:,2*t] = pres_adv[t,:] + pressure_forc[:,2*t+1] = pressure_forc[:,2*t] + tot_advec_T[:,2*t] = dtdt_adv[t,:] + tot_advec_T[:,2*t+1] = tot_advec_T[:,2*t] + tot_advec_qv[:,2*t] = dqvdt_adv[t,:] + tot_advec_qv[:,2*t+1] = tot_advec_qv[:,2*t] + tot_advec_u[:,2*t] = dudt_adv[t,:] + tot_advec_u[:,2*t+1] = tot_advec_u[:,2*t] + tot_advec_v[:,2*t] = dvdt_adv[t,:] + tot_advec_v[:,2*t+1] = tot_advec_v[:,2*t] + # + #p_s[2*t-1] = 0.5*(p_s[2*t] + p_s[2*t-1]) + #pressure_forc[:,2*t-1] = 0.5*(pressure_forc[:,2*t] + pressure_forc[:,2*t-1]) + #tot_advec_T[:,2*t-1] = 0.5*(tot_advec_T[:,2*t] + tot_advec_T[:,2*t-1]) + #tot_advec_qv[:,2*t-1] = 0.5*(tot_advec_qv[:,2*t] + tot_advec_qv[:,2*t-1]) + #tot_advec_u[:,2*t-1] = 0.5*(tot_advec_u[:,2*t] + tot_advec_u[:,2*t-1]) + #tot_advec_v[:,2*t-1] = 0.5*(tot_advec_v[:,2*t] + tot_advec_v[:,2*t-1]) + + + elif (time_method == 'gradient'): #this produced wonky results in the SCM; avoid until investigated more + print('Forcing can be interpolated in time since the forcing terms are assumed to follow a constant time-gradient.') - soiltyp = int(surface["styp"]) - if (soiltyp != 0): - #find the index of the soiltype from the "index" field - index = soilparm["index"].index(soiltyp) - bexp = soilparm["bb"][index] - smcmax = soilparm["maxsmc"][index] - smcwlt = soilparm["wltsmc"][index] - dwsat = soilparm["satdw"][index] - dksat = soilparm["satdk"][index] - psisat = -soilparm["satpsi"][index] + ntimes = 2*n_files + 1 + time = np.zeros(ntimes) + p_s = np.zeros((ntimes),dtype=float) + pressure_forc = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_T = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_qv = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_u = np.zeros((nlevs,ntimes),dtype=float) + tot_advec_v = np.zeros((nlevs,ntimes),dtype=float) - if (vegtyp == mptable_nml_active['ISURBAN']): - smcmax = 0.45 - smcwlt = 0.40 + p_s[0] = state_IC['ps'] + pressure_forc[:,0] = state_IC['pa'] + tot_advec_T[:,0] = 0.0 + tot_advec_qv[:,0] = 0.0 + tot_advec_u[:,0] = 0.0 + tot_advec_v[:,0] = 0.0 - if ((bexp > 0.0) and (smcmax > 0.0) and (-psisat > 0.0 )): - for k in range(n_soil_layers): - if ( k == 0 ): - ddz = -zsoil[k+1] * 0.5 - elif ( k < n_soil_layers-1 ): - ddz = (zsoil[k-1] - zsoil[k+1] ) * 0.5 - else: - ddz = zsoil[k-1] - zsoil[k] -# ! -# ! Use newton-raphson method to find eq soil moisture -# ! - expon = bexp +1. - aa = dwsat/ddz - bb = dksat / smcmax ** expon - - smc = 0.5 * smcmax - for iter in range(100): - func = (smc - smcmax) * aa + bb * smc ** expon - dfunc = aa + bb * expon * smc ** bexp - dx = func/dfunc - smc = smc - dx - if ( abs (dx) < 1.e-6): - break - - surface["smoiseq"][k] = np.amin([np.amax([smc,1.e-4]),smcmax*0.99]) - else: - surface["smoiseq"][:] = smcmax + for t in range(n_files): + time[2*t + 1] = time[2*t] + 0.5*(sec_in_hr*time_hr[t] - time[2*t]) + time[2*t + 2] = sec_in_hr*time_hr[t] + + p_s[2*t+1] = ps[t] + pressure_forc[:,2*t+1] = pres_adv[t,:] + tot_advec_T[:,2*t+1] = dtdt_adv[t,:] + tot_advec_qv[:,2*t+1] = dqvdt_adv[t,:] + tot_advec_u[:,2*t+1] = dudt_adv[t,:] + tot_advec_v[:,2*t+1] = dvdt_adv[t,:] + + #calculate gradient in time and extrapolate for time (2t + 2) + grad = (p_s[2*t + 1] - p_s[2*t])/(time[2*t + 1] - time[2*t]) + p_s[2*t + 2] = p_s[2*t + 1] + grad*(time[2*t + 2] - time[2*t + 1]) + + for k in range(nlevs): + grad = (pressure_forc[k,2*t + 1] - pressure_forc[k, 2*t])/(time[2*t + 1] - time[2*t]) + pressure_forc[k,2*t + 2] = pressure_forc[k,2*t+1] + grad*(time[2*t + 2] - time[2*t + 1]) + grad = (tot_advec_T[k,2*t + 1] - tot_advec_T[k, 2*t])/(time[2*t + 1] - time[2*t]) + tot_advec_T[k,2*t + 2] = tot_advec_T[k,2*t+1] + grad*(time[2*t + 2] - time[2*t + 1]) + grad = (tot_advec_qv[k,2*t + 1] - tot_advec_qv[k, 2*t])/(time[2*t + 1] - time[2*t]) + tot_advec_qv[k,2*t + 2] = tot_advec_qv[k,2*t+1] + grad*(time[2*t + 2] - time[2*t + 1]) + grad = (tot_advec_u[k,2*t + 1] - tot_advec_u[k, 2*t])/(time[2*t + 1] - time[2*t]) + tot_advec_u[k,2*t + 2] = tot_advec_u[k,2*t+1] + grad*(time[2*t + 2] - time[2*t + 1]) + grad = (tot_advec_v[k,2*t + 1] - tot_advec_v[k, 2*t])/(time[2*t + 1] - time[2*t]) + tot_advec_v[k,2*t + 2] = tot_advec_v[k,2*t+1] + grad*(time[2*t + 2] - time[2*t + 1]) + else: + print('Unrecognized forcing time method. Exiting.') + exit() - surface["smcwtdxy"] = smcmax - surface["deeprechxy"] = 0.0 - surface["rechxy"] = 0.0 - - return surface + # + w_ls = np.zeros((nlevs,ntimes),dtype=float) + omega = np.zeros((nlevs,ntimes),dtype=float) + rad_heating = np.zeros((nlevs,ntimes),dtype=float) -def read_noahmp_soil_table(): - """Read values from SOILPARM.TBL for NoahMP LSM ICs""" - #returns a dictionary with data - - #two different datasets are included in the table - choices = ["STAS","STAS-RUC"] - - #get all lines of the file - with open(os.path.join(NOAHMP_TABLES_DIR, 'SOILPARM.TBL'), 'r') as f: - lineList = f.readlines() - f.close() - - #find the line where the desired data starts - line_index = 0 - for line in lineList: - line_index += 1 - #hardcoded to look for choices[0]; swap choices[0] for choices[1] to use choices[1] below - m = re.match(choices[0],line) and not re.match(choices[1],line) - if m: - start_index = line_index - break - - #get the data for each variable from the lines - n_soil_types = int(lineList[start_index].split()[0].split(',')[0]) - soil_index = [] - bb = [] - drysmc = [] - f11 = [] - maxsmc = [] - refsmc = [] - satpsi = [] - satdk = [] - satdw = [] - wltsmc = [] - qtz = [] - name = [] - for line in lineList[start_index+1:start_index+n_soil_types+1]: - values = line.strip().split(',') - soil_index.append(int(values[0])) - bb.append(float(values[1])) - drysmc.append(float(values[2])) - f11.append(float(values[3])) - maxsmc.append(float(values[4])) - refsmc.append(float(values[5])) - satpsi.append(float(values[6])) - satdk.append(float(values[7])) - satdw.append(float(values[8])) - wltsmc.append(float(values[9])) - qtz.append(float(values[10])) - name.append(values[11].strip()) - - soilparm = { - "index": soil_index, - "bb": bb, - "drysmc": drysmc, - "f11": f11, - "maxsmc": maxsmc, - "refsmc": refsmc, - "satpsi": satpsi, - "satdk": satdk, - "satdw": satdw, - "wltsmc": wltsmc, - "qtz": qtz, - "name": name + forcing = { + "time": time, + "wa": w_ls.swapaxes(0,1), + "wap": omega.swapaxes(0,1), + "tnta_rad": rad_heating.swapaxes(0,1), + "ps_forc": np.ones(ntimes)*ps[0], + "pa_forc": pressure_forc.swapaxes(0,1), + "tnta_adv": tot_advec_T.swapaxes(0,1), + "tnqv_adv": tot_advec_qv.swapaxes(0,1), + "tnua_adv": tot_advec_u.swapaxes(0,1), + "tnva_adv": tot_advec_v.swapaxes(0,1) } - return soilparm + if (save_comp_data): + comp_data = { + "time": stateNATIVE["time"]*sec_in_hr, + "pa" : p_layr[:,::-1], + "ta" : t_layr[:,::-1], + "qv" : qv_layr[:,::-1], + "ua" : u_layr[:,::-1], + "va" : v_layr[:,::-1], + "vars2d":vars2d} + else: + comp_data = {} -def write_SCM_case_file(state, surface, oro, forcing, case, date): - """Write all data to a netCDF file that the SCM can read""" - #expects the data to write, the name of the generated file, and the date corresponding to the ICs - - real_type = np.float64 - int_type = np.int32 - - nlevs = state["nlevs"] - nsoil = len(surface["stc"]) - nsnow = len(surface["snicexy"]) - nice = len(surface["tiice"]) - - nc_file = Dataset(os.path.join(PROCESSED_CASE_DIR, case + '.nc'), 'w', format='NETCDF4') - nc_file.description = "FV3GFS model profile input (no forcing)" - nc_file.missing_value = missing_value - - #create groups for scalars, intitialization, and forcing + return (forcing, comp_data, stateREGRID) - scalar_grp = nc_file.createGroup("scalars") - initial_grp = nc_file.createGroup("initial") - forcing_grp = nc_file.createGroup("forcing") - - #create dimensions and write them out +######################################################################################## +# +######################################################################################## +def write_SCM_case_file(state, surface, oro, forcing, case, date, stateREGRID): + """Write all data to a netCDF file in the DEPHY-SCM format""" - time_dim = nc_file.createDimension('time', None) - time_var = nc_file.createVariable('time', real_type, ('time',)) - time_var[:] = forcing["time"] - time_var.units = 's' - time_var.description = 'elapsed time since the beginning of the simulation' + # Working types + wp = np.float64 + wi = np.int32 - levels_dim = nc_file.createDimension('levels', None) - levels_var = nc_file.createVariable('levels', real_type, ('levels',)) - levels_var[:] = state["pres"] - levels_var.units = 'Pa' - levels_var.description = 'pressure levels' - - soil_dim = nc_file.createDimension('nsoil',None) - soil_depth_var = nc_file.createVariable('soil_depth', real_type, ('nsoil',)) - soil_depth_var[:] = [0.1,0.4,1.0,2.0] - soil_depth_var.units = 'm' - soil_depth_var.description = 'depth of bottom of soil layers' - - snow_dim = nc_file.createDimension('nsnow',None) - soil_plus_snow_dim = nc_file.createDimension('nsoil_plus_nsnow',None) - ice_dim = nc_file.createDimension('nice',None) - - #initial group + # Local switches + forcing_on = 1 + forcing_off = 0 + + # Output file + com = 'mkdir -p ' + PROCESSED_CASE_DIR + print(com) + os.system(com) + fileOUT = os.path.join(PROCESSED_CASE_DIR, case + '_SCM_driver.nc') + + nc_file = Dataset(fileOUT, 'w', format='NETCDF3_CLASSIC') + nc_file.description = "FV3GFS model profile input (UFS forcings)" + + nc_file.missing_value = missing_value + + start_date = datetime(date["year"],date["month"],date["day"],date["hour"],date["minute"],date["second"]) + + # + # Create surface type string (Saved as GLOBAL attribute) + # + if surface["slmsk"] > 1.5: + surface_string = 'ice' + elif surface["slmsk"] > 0.5: + surface_string = 'land' + else: + surface_string = 'ocean' + + # + # Global file attributes. + # + runtime = timedelta(seconds=forcing['time'][-1]) + end_date = start_date + runtime + end_date_string = end_date.strftime("%Y-%m-%d %H:%M:%S") + start_date_string = start_date.strftime("%Y-%m-%d %H:%M:%S") + # + loc_string = str(round(surface["lon"],2)) + "E" + str(round(surface["lat"],2)) + "N" + case_string = 'UFS_' + start_date_string + '_' + loc_string + # + nc_file.case = case_string + nc_file.title = 'Forcing and Initial Conditions for ' + case_string + nc_file.reference = 'https://dtcenter.org/sites/default/files/paragraph/scm-ccpp-guide-v6-0-0.pdf' + nc_file.author = 'Grant J. Firl and Dustin Swales' + nc_file.version = 'Created on ' + datetime.today().strftime('%Y-%m-%d %H:%M:%S') + nc_file.format_version = 'DEPHY SCM format version 1' + nc_file.modifications = '' + nc_file.script = os.path.basename(__file__) + nc_file.comment = '' + nc_file.start_date = start_date_string + nc_file.end_date = end_date_string + nc_file.forcing_scale = -1 + nc_file.radiation = "off" + nc_file.adv_ta = forcing_off + nc_file.adv_qv = forcing_off + nc_file.adv_ua = forcing_off + nc_file.adv_va = forcing_off + nc_file.adv_theta = forcing_off + nc_file.adv_thetal = forcing_off + nc_file.adv_qt = forcing_off + nc_file.adv_rv = forcing_off + nc_file.adv_rt = forcing_off + nc_file.forc_wa = forcing_off + nc_file.forc_wap = forcing_off + nc_file.forc_geo = forcing_off + nc_file.nudging_ua = forcing_off + nc_file.nudging_va = forcing_off + nc_file.nudging_ta = forcing_off + nc_file.nudging_theta = forcing_off + nc_file.nudging_thetal = forcing_off + nc_file.nudging_qv = forcing_off + nc_file.nudging_qt = forcing_off + nc_file.nudging_rv = forcing_off + nc_file.nudging_rt = forcing_off + nc_file.zh_nudging_ta = forcing_off + nc_file.zh_nudging_theta = forcing_off + nc_file.zh_nudging_thetal = forcing_off + nc_file.zh_nudging_qv = forcing_off + nc_file.zh_nudging_qt = forcing_off + nc_file.zh_nudging_rv = forcing_off + nc_file.zh_nudging_rt = forcing_off + nc_file.zh_nudging_ua = forcing_off + nc_file.zh_nudging_va = forcing_off + nc_file.pa_nudging_ta = forcing_off + nc_file.pa_nudging_theta = forcing_off + nc_file.pa_nudging_thetal = forcing_off + nc_file.pa_nudging_qv = forcing_off + nc_file.pa_nudging_qt = forcing_off + nc_file.pa_nudging_rv = forcing_off + nc_file.pa_nudging_rt = forcing_off + nc_file.pa_nudging_ua = forcing_off + nc_file.pa_nudging_va = forcing_off + # + nc_file.surface_type = surface_string + # + nc_file.adv_ta = forcing_on + nc_file.adv_qv = forcing_on + nc_file.adv_ua = forcing_on + nc_file.adv_va = forcing_on + # + nc_file.surface_forcing_temp = 'none' + nc_file.surface_forcing_moisture = 'none' + nc_file.surface_forcing_wind = 'none' + nc_file.surface_forcing_lsm = 'none' #'noah' #'noahmp' #'ruc' + nc_file.surface_forcing_lsm = 'lsm' + # Set file dimension + time_dim = nc_file.createDimension('time', len(forcing['time'])) + timei_dim = nc_file.createDimension('t0', 1) + lev_dim = nc_file.createDimension('lev', state["nlevs"]) + soil_dim = nc_file.createDimension('nsoil', len(surface["stc"])) + snow_dim = nc_file.createDimension('nsnow', len(surface["snicexy"])) + nslsnw_dim = nc_file.createDimension('nsoil_plus_nsnow',len(surface["snicexy"]) + len(surface["stc"])) + ice_dim = nc_file.createDimension('nice', len(surface["tiice"])) + + # + timei_var = nc_file.createVariable('t0', wp, ('t0')) + timei_var.units = 'seconds since ' + start_date_string + timei_var.standard_name = 'Initial time' + timei_var.calendar = 'gregorian' + timei_var[:] = 0.0 + # + timef_var = nc_file.createVariable('time', wp, ('time')) + timef_var.units = 'seconds since ' + start_date_string + timef_var.standard_name = 'Forcing time' + timef_var.calendar = 'gregorian' + timef_var[:] = forcing['time'] + # + lev_var = nc_file.createVariable('lev', wp, ('lev')) + lev_var.units = 'm' + lev_var.standard_name = 'height' + lev_var[:] = 0.0 + + # + lon_var = nc_file.createVariable('lon', wp, ('time')) + lon_var.units = 'degrees_east' + lon_var.standard_name = 'longitude' + lon_var[:] = surface["lon"] + + # + lat_var = nc_file.createVariable('lat', wp, ('time')) + lat_var.units = 'degrees_north' + lat_var.standard_name = 'latitude' + lat_var[:] = surface["lat"] + + # + soil_depth_var = nc_file.createVariable('soil_depth', wp, ('nsoil')) + soil_depth_var.units = 'm' + soil_depth_var.standard_name = 'depth of bottom of soil layers' + soil_depth_var[:] = [0.1,0.4,1.0,2.0] + # + theta_oro = nc_file.createVariable('theta_oro',wp, ('t0')) + theta_oro.units = "deg" + theta_oro.standard_name = "angle with respect to east of maximum subgrid orographic variations" + theta_oro[:] = oro["theta"] + # + z0_var = nc_file.createVariable('zorl', wp, ('time')) + z0_var.units = "cm" + z0_var.standard_name = 'surface_roughness_length_for_momentum_in_air' + z0_var[:] = surface["z0"] + # + zorlw_var = nc_file.createVariable('zorlw', wp, ('t0')) + zorlw_var.units = "cm" + zorlw_var.standard_name = "surface roughness length over ocean" + zorlw_var[:] = surface["z0"] + # + zorll_var = nc_file.createVariable('zorll', wp, ('t0')) + zorll_var.units = "cm" + zorll_var.standard_name = "surface roughness length over land" + zorll_var[:] = surface["zorll"] + # + zorli_var = nc_file.createVariable('zorli', wp, ('t0')) + zorli_var.units = "cm" + zorli_var.standard_name = "surface roughness length over ice" + zorli_var[:] = surface["zorli"] + # + zorlwav_var = nc_file.createVariable('zorlwav', wp, ('time')) + zorlwav_var.units = "cm" + zorlwav_var.standard_name = 'surface_roughness_length_from_wave_model' + zorlwav_var[:] = surface["zorlw"] + + # + # Variables to be output to SCM input file. Only fields that come directly from forcing, + # surface, state, and oro. Fields that get renamed are done above. + # + dict = {} + dict.update(date) + dict.update(surface) + dict.update(state) + dict.update(oro) + dict.update(forcing) + + ######################################################################################## + # + # Dictonary format: + # {"name": "", "type", "dimd": (), "units": "", "desc": ""} + # + ######################################################################################## + var_dict = [{"name": "orog", "type":wp, "dimd": ('t0' ), "units": "m", "desc": "surface_altitude"},\ + {"name": "zh", "type":wp, "dimd": ('t0', 'lev'), "units": "m", "desc": "height"},\ + {"name": "pa", "type":wp, "dimd": ('t0', 'lev'), "units": "Pa", "desc": "air_ressure"}, \ + {"name": "ta", "type":wp, "dimd": ('t0', 'lev'), "units": "K", "desc": "air_temperature","default_value": stateREGRID["t_lay"][1,:], "override": True}, \ + {"name": "theta", "type":wp, "dimd": ('t0', 'lev'), "units": "K", "desc": "air_potential_temperature"}, \ + {"name": "thetal", "type":wp, "dimd": ('t0', 'lev'), "units": "K", "desc": "air_liquid_potential_temperature"}, \ + {"name": "rv", "type":wp, "dimd": ('t0', 'lev'), "units": "kg kg-1", "desc": "humidity_mixing_ratio"}, \ + {"name": "rl", "type":wp, "dimd": ('t0', 'lev'), "units": "kg kg-1", "desc": "cloud_liquid_water_mixing_ratio"}, \ + {"name": "ri", "type":wp, "dimd": ('t0', 'lev'), "units": "kg kg-1", "desc": "cloud_ice_water_mixing_ratio"}, \ + {"name": "rt", "type":wp, "dimd": ('t0', 'lev'), "units": "kg kg-1", "desc": "water_mixing_ratio"}, \ + {"name": "qv", "type":wp, "dimd": ('t0', 'lev'), "units": "kg kg-1", "desc": "specific_humidity","default_value": stateREGRID["qv_lay"][1,:], "override": True}, \ + {"name": "ql", "type":wp, "dimd": ('t0', 'lev'), "units": "kg kg-1", "desc": "mass_fraction_of_cloud_liquid_water_in_air"}, \ + {"name": "qi", "type":wp, "dimd": ('t0', 'lev'), "units": "kg kg-1", "desc": "mass_fraction_of_cloud_ice_water_in_air", "default_value": 0.0}, \ + {"name": "qt", "type":wp, "dimd": ('t0', 'lev'), "units": "kg kg-1", "desc": "mass_fraction_of_water_in_air"}, \ + {"name": "hur", "type":wp, "dimd": ('t0', 'lev'), "units": "%", "desc": "relative_humidity"}, \ + {"name": "tke", "type":wp, "dimd": ('t0', 'lev'), "units": "m2 s-2", "desc": "specific_turbulen_kinetic_energy", "default_value": 0.0}, \ + {"name": "ua", "type":wp, "dimd": ('t0', 'lev'), "units": "m s-1", "desc": "eastward_wind", "default_value": stateREGRID["u_lay"][1,:], "override": True}, \ + {"name": "va", "type":wp, "dimd": ('t0', 'lev'), "units": "m s-1", "desc": "northward_wind", "default_value": stateREGRID["v_lay"][1,:], "override": True}, \ + {"name": "ts", "type":wp, "dimd": ('t0' ), "units": "K", "desc": "surface_temperature"},\ + {"name": "tskin", "type":wp, "dimd": ('t0' ), "units": "K", "desc": "surface_skin_pressure"}, \ + {"name": "ps", "type":wp, "dimd": ('t0' ), "units": "Pa", "desc": "surface_air_pressure"}, \ + {"name": "beta", "type":wp, "dimd": ('t0' ), "units": "m", "desc": "soil_water_stress_factor"}, \ + {"name": "mrsos", "type":wp, "dimd": ('t0' ), "units": "kg m-2", "desc": "mass_content_of_water_in_soil_layer"}, \ + {"name": "o3", "type":wp, "dimd": ('t0', 'lev'), "units": "kg kg-1", "desc": "mole_fraction_of_ozone_in_air"}, \ + {"name": "sza", "type":wp, "dimd": ('t0' ), "units": "degree", "desc": "solar_zenith_angle"}, \ + {"name": "io", "type":wp, "dimd": ('t0' ), "units": "W m-2", "desc": "solar_irradiance"}, \ + {"name": "alb", "type":wp, "dimd": ('t0' ), "units": "1", "desc": "surface_albedo"}, \ + {"name": "emis", "type":wp, "dimd": ('t0' ), "units": "1", "desc": "surface_longwave_emissivity"}, \ + {"name": "slmsk", "type":wp, "dimd": ('t0' ), "units": "none", "desc": "land_sea_ice_mask"}] + # + var_frc = [{"name": "zh_forc", "type":wp, "dimd": ('time', 'lev'), "units": "m", "desc": "height_forcing","default_value": 1.},\ + {"name": "pa_forc", "type":wp, "dimd": ('time', 'lev'), "units": "Pa", "desc": "air_pressure_forcing"}, \ + {"name": "wa", "type":wp, "dimd": ('time', 'lev'), "units": "m s-1", "desc": "upward_air_velocity"}, \ + {"name": "wap", "type":wp, "dimd": ('time', 'lev'), "units": "Pa s-1", "desc": "lagrangian_tendency_of_air_pressure"}, \ + {"name": "ug", "type":wp, "dimd": ('time', 'lev'), "units": "m s-1", "desc": "geostrophic_eastward_wind"}, \ + {"name": "vg", "type":wp, "dimd": ('time', 'lev'), "units": "m s-1", "desc": "geostrophic_northward_wind"}, \ + {"name": "tnua_adv", "type":wp, "dimd": ('time', 'lev'), "units": "m s-2", "desc": "tendency_of_eastward_wind_due_to_advection"},\ + {"name": "tnva_adv", "type":wp, "dimd": ('time', 'lev'), "units": "m s-2", "desc": "tendency_of_northward_wind_due_to_advection"}, \ + {"name": "tnta_adv", "type":wp, "dimd": ('time', 'lev'), "units": "K s-1", "desc": "tendency_of_air_temperature_due_to_advection"}, \ + {"name": "tntheta_adv", "type":wp, "dimd": ('time', 'lev'), "units": "K s-1", "desc": "tendency_of_air_potential_temperature_due_to_advection"}, \ + {"name": "tnthetal_adv", "type":wp, "dimd": ('time', 'lev'), "units": "K s-1", "desc": "tendency_of_air_liquid_potential_temperature_due_to_advection"}, \ + {"name": "tnqv_adv", "type":wp, "dimd": ('time', 'lev'), "units": "kg kg-1 s-1", "desc": "tendency_of_specific_humidity_due_to_advection"},\ + {"name": "tnqt_adv", "type":wp, "dimd": ('time', 'lev'), "units": "kg kg-1 s-1", "desc": "tendency_of_mass_fraction_of_water_in_air_due_to_advection"},\ + {"name": "tnrv_adv", "type":wp, "dimd": ('time', 'lev'), "units": "kg kg-1 s-1", "desc": "tendency_of_humidity_mixing_ratio_due_to_advection"},\ + {"name": "tnrt_adv", "type":wp, "dimd": ('time', 'lev'), "units": "kg kg-1 s-1", "desc": "tendency_of_water_mixing_ratio_due_to_advection"},\ + {"name": "tnta_rad", "type":wp, "dimd": ('time', 'lev'), "units": "K s-1", "desc": "tendency_of_air_temperature_due_to_radiative_heating"}, \ + {"name": "tntheta_rad", "type":wp, "dimd": ('time', 'lev'), "units": "K s-1", "desc": "tendency_of_potential_air_temperature_due_to_radiative_heating"}, \ + {"name": "tnthetal_rad", "type":wp, "dimd": ('time', 'lev'), "units": "K s-1", "desc": "tendency_of_air_liquid_potential_temperature_due_to_radiative_heating"}, \ + {"name": "ta_nud", "type":wp, "dimd": ('time', 'lev'), "units": "K", "desc": "nudging_air_temperature"}, \ + {"name": "theta_nud", "type":wp, "dimd": ('time', 'lev'), "units": "K", "desc": "nudging_air_potential_temperature"}, \ + {"name": "thetal_nud", "type":wp, "dimd": ('time', 'lev'), "units": "K", "desc": "nudging_air_liquid_potential_temperature"}, \ + {"name": "qt_nud", "type":wp, "dimd": ('time', 'lev'), "units": "kg kg-1", "desc": "nudging_mass_fraction_of_water_in_air"}, \ + {"name": "rv_nud", "type":wp, "dimd": ('time', 'lev'), "units": "m s-1", "desc": "nudging_humidity_mixing_ratio"}, \ + {"name": "rt_nud", "type":wp, "dimd": ('time', 'lev'), "units": "m s-1", "desc": "nudging_water_mixing_ratio"}, \ + {"name": "ua_nud", "type":wp, "dimd": ('time', 'lev'), "units": "m s-1", "desc": "nudging_eastward_wind"}, \ + {"name": "va_nud", "type":wp, "dimd": ('time', 'lev'), "units": "m s-1", "desc": "nudging_northward_wind"}, \ + {"name": "hfss", "type":wp, "dimd": ('time' ), "units": "W m-2", "desc": "surface_upward_sensible_heat_flux"}, \ + {"name": "hfls", "type":wp, "dimd": ('time' ), "units": "W m-2", "desc": "surface_upward_latent_heat_flux"}, \ + {"name": "wpthetap_s", "type":wp, "dimd": ('time' ), "units": "K m s-1", "desc": "surface_upward_potential_temperature_flux"}, \ + {"name": "wpqvp_s", "type":wp, "dimd": ('time' ), "units": "m s-1", "desc": "surface_upward_specific_humidity_flux"}, \ + {"name": "wpqtp_s", "type":wp, "dimd": ('time' ), "units": "m s-1", "desc": "surface_upward_water_mass_fraction_flux"}, \ + {"name": "wprvp_s", "type":wp, "dimd": ('time' ), "units": "m s-1", "desc": "surface_upward_humidity_mixing_ratio_flux"}, \ + {"name": "wprtp_s", "type":wp, "dimd": ('time' ), "units": "m s-1", "desc": "surface_upward_water_mixing_ratio_flux"}, \ + {"name": "ts_forc", "type":wp, "dimd": ('time' ), "units": "K", "desc": "forcing_surface_temperature"},\ + {"name": "ps_forc", "type":wp, "dimd": ('time' ), "units": "Pa", "desc": "forcing_surface_air_pressure"},\ + {"name": "uustar", "type":wp, "dimd": ('time' ), "units": "m s-1", "desc": "surface_friction_velocity"}, \ + {"name": "z0h", "type":wp, "dimd": ('time' ), "units": "m", "desc": "surface_roughness_length_for_heat_in_air"}, \ + {"name": "z0q", "type":wp, "dimd": ('time' ), "units": "m", "desc": "surface_roughness_length_for_humidity_in_air"}, \ + {"name": "mrsos_forc", "type":wp, "dimd": ('time' ), "units": "kg m-2", "desc": "forcing_mass_content_of_water_in_soil_layer"}] + + # + var_oro = [{"name": "area", "type":wp, "dimd": ('t0'), "units": "m 2-1", "desc": "grid_cell_area"},\ + {"name": "stddev", "type":wp, "dimd": ('t0'), "units": "m", "desc": "standard deviation of subgrid orography"}, \ + {"name": "convexity", "type":wp, "dimd": ('t0'), "units": "none", "desc": "convexity of subgrid orography"}, \ + {"name": "oa1", "type":wp, "dimd": ('t0'), "units": "none", "desc": "assymetry of subgrid orography 1"}, \ + {"name": "oa2", "type":wp, "dimd": ('t0'), "units": "none", "desc": "assymetry of subgrid orography 2"}, \ + {"name": "oa3", "type":wp, "dimd": ('t0'), "units": "none", "desc": "assymetry of subgrid orography 3"}, \ + {"name": "oa4", "type":wp, "dimd": ('t0'), "units": "none", "desc": "assymetry of subgrid orography 4"}, \ + {"name": "ol1", "type":wp, "dimd": ('t0'), "units": "none", "desc": "fraction of grid box with subgrid orography higher than critical height 1"}, \ + {"name": "ol2", "type":wp, "dimd": ('t0'), "units": "none", "desc": "fraction of grid box with subgrid orography higher than critical height 2"}, \ + {"name": "ol3", "type":wp, "dimd": ('t0'), "units": "none", "desc": "fraction of grid box with subgrid orography higher than critical height 3"}, \ + {"name": "ol4", "type":wp, "dimd": ('t0'), "units": "none", "desc": "fraction of grid box with subgrid orography higher than critical height 4"}, \ + {"name": "sigma", "type":wp, "dimd": ('t0'), "units": "none", "desc": "slope of subgrid orography"}, \ + {"name": "gamma", "type":wp, "dimd": ('t0'), "units": "none", "desc": "anisotropy of subgrid orography"}, \ + {"name": "elvmax", "type":wp, "dimd": ('t0'), "units": "m", "desc": "maximum of subgrid orography"}, \ + {"name": "oro", "type":wp, "dimd": ('t0'), "units": "m", "desc": "orography"}, \ + {"name": "oro_uf", "type":wp, "dimd": ('t0'), "units": "m", "desc": "unfiltered orography"}, \ + {"name": "landfrac", "type":wp, "dimd": ('t0'), "units": "none", "desc": "fraction of horizontal grid area occupied by land"}, \ + {"name": "lakefrac", "type":wp, "dimd": ('t0'), "units": "none", "desc": "fraction of horizontal grid area occupied by lake", "default_value":0}, \ + {"name": "lakedepth", "type":wp, "dimd": ('t0'), "units": "none", "desc": "lake depth", "default_value":0}] + # + var_nsst = [{"name": "tref", "type":wp, "dimd": ('t0'), "units": "K", "desc": "sea surface reference temperature for NSST"}, \ + {"name": "z_c", "type":wp, "dimd": ('t0'), "units": "m", "desc": "sub-layer cooling thickness for NSST"}, \ + {"name": "c_0", "type":wp, "dimd": ('t0'), "units": "none", "desc": "coefficient 1 to calculate d(Tz)/d(Ts) for NSST"}, \ + {"name": "c_d", "type":wp, "dimd": ('t0'), "units": "nonw", "desc": "coefficient 2 to calculate d(Tz)/d(Ts) for NSST"}, \ + {"name": "w_0", "type":wp, "dimd": ('t0'), "units": "none", "desc": "coefficient 3 to calculate d(Tz)/d(Ts) for NSST"}, \ + {"name": "w_d", "type":wp, "dimd": ('t0'), "units": "none", "desc": "coefficient 4 to calculate d(Tz)/d(Ts) for NSST"}, \ + {"name": "xt", "type":wp, "dimd": ('t0'), "units": "K m", "desc": "heat content in diurnal thermocline layer for NSST"}, \ + {"name": "xs", "type":wp, "dimd": ('t0'), "units": "ppt m", "desc": "salinity content in diurnal thermocline layer for NSST"}, \ + {"name": "xu", "type":wp, "dimd": ('t0'), "units": "m2 s-1", "desc": "u-current in diurnal thermocline layer for NSST"}, \ + {"name": "xv", "type":wp, "dimd": ('t0'), "units": "m2 s-1", "desc": "v-current in diurnal thermocline layer for NSST"}, \ + {"name": "xz", "type":wp, "dimd": ('t0'), "units": "m", "desc": "thickness of diurnal thermocline layer for NSST"}, \ + {"name": "zm" , "type":wp, "dimd": ('t0'), "units": "m", "desc": "thickness of ocean mixed layer for NSST"}, \ + {"name": "xtts", "type":wp, "dimd": ('t0'), "units": "m", "desc": "sensitivity of diurnal thermocline layer heat content to surface temperature [d(xt)/d(ts)] for NSST"},\ + {"name": "xzts", "type":wp, "dimd": ('t0'), "units": "m K-1", "desc": "sensitivity of diurnal thermocline layer thickness to surface temperature [d(xz)/d(ts)] for NSST"}, \ + {"name": "d_conv", "type":wp, "dimd": ('t0'), "units": "m", "desc": "thickness of free convection layer for NSST"}, \ + {"name": "ifd", "type":wp, "dimd": ('t0'), "units": "none", "desc": "index to start DTM run for NSST"}, \ + {"name": "dt_cool", "type":wp, "dimd": ('t0'), "units": "K", "desc": "sub-layer cooling amount for NSST"}, \ + {"name": "qrain", "type":wp, "dimd": ('t0'), "units": "W m-2", "desc": "sensible heat due to rainfall for NSST"}] + # + var_frgd = [{"name": "tiice", "type":wp, "dimd": ('t0','nice'), "units": "K", "desc": "sea ice internal temperature"}] + # + var_noah = [{"name": "vegsrc", "type":wi, "dimd": ('t0'), "units": "none", "desc": "vegetation source (1-2)", "default_value": 1}, \ + {"name": "tsfco", "type":wp, "dimd": ('t0'), "units": "K", "desc": "sea/skin/ice surface temperature"}, \ + {"name": "weasd", "type":wp, "dimd": ('t0'), "units": "mm", "desc": "water equivalent accumulated snow depth"}, \ + {"name": "tg3", "type":wp, "dimd": ('t0'), "units": "K", "desc": "deep soil temperature"}, \ + {"name": "alvsf", "type":wp, "dimd": ('t0'), "units": "none", "desc": "60 degree vis albedo with strong cosz dependency"}, \ + {"name": "alnsf", "type":wp, "dimd": ('t0'), "units": "none", "desc": "60 degree nir albedo with strong cosz dependency"}, \ + {"name": "alvwf", "type":wp, "dimd": ('t0'), "units": "none", "desc": "60 degree vis albedo with weak cosz dependency"}, \ + {"name": "alnwf", "type":wp, "dimd": ('t0'), "units": "none", "desc": "60 degree nir albedo with weak cosz dependency"}, \ + {"name": "facsf", "type":wp, "dimd": ('t0'), "units": "none", "desc": "fractional coverage with strong cosz dependency"}, \ + {"name": "facwf", "type":wp, "dimd": ('t0'), "units": "none", "desc": "fractional coverage with weak cosz dependency"}, \ + {"name": "vegfrac", "type":wp, "dimd": ('t0'), "units": "none", "desc": "vegetation fraction"}, \ + {"name": "canopy", "type":wp, "dimd": ('t0'), "units": "kg m-2", "desc": "amount of water stored in canopy"}, \ + {"name": "f10m", "type":wp, "dimd": ('t0'), "units": "none", "desc": "ratio of sigma level 1 wind and 10m wind"}, \ + {"name": "t2m", "type":wp, "dimd": ('t0'), "units": "K", "desc": "2-meter absolute temperature"}, \ + {"name": "q2m", "type":wp, "dimd": ('t0'), "units": "kg kg-1", "desc": "2-meter specific humidity"}, \ + {"name": "vegtyp", "type":wi, "dimd": ('t0'), "units": "none", "desc": "vegetation type (1-12)"}, \ + {"name": "soiltyp", "type":wi, "dimd": ('t0'), "units": "none", "desc": "soil type (1-12)"}, \ + {"name": "ffmm", "type":wp, "dimd": ('t0'), "units": "none", "desc": "Monin-Obukhov similarity function for momentum"}, \ + {"name": "ffhh", "type":wp, "dimd": ('t0'), "units": "none", "desc": "Monin-Obukhov similarity function for heat"}, \ + {"name": "hice", "type":wp, "dimd": ('t0'), "units": "m", "desc": "sea ice thickness"}, \ + {"name": "fice", "type":wp, "dimd": ('t0'), "units": "none", "desc": "ice fraction"}, \ + {"name": "tisfc", "type":wp, "dimd": ('t0'), "units": "K", "desc": "ice surface temperature"}, \ + {"name": "tprcp", "type":wp, "dimd": ('t0'), "units": "m", "desc": "instantaneous total precipitation amount"}, \ + {"name": "srflag", "type":wp, "dimd": ('t0'), "units": "none", "desc": "snow/rain flag for precipitation"}, \ + {"name": "snowd", "type":wp, "dimd": ('t0'), "units": "mm", "desc": "water equivalent snow depth"}, \ + {"name": "shdmin", "type":wp, "dimd": ('t0'), "units": "none", "desc": "minimum vegetation fraction"}, \ + {"name": "shdmax", "type":wp, "dimd": ('t0'), "units": "none", "desc": "maximum vegetation fraction"}, \ + {"name": "slopetyp", "type":wi, "dimd": ('t0'), "units": "none", "desc": "slope type (1-9)"}, \ + {"name": "snoalb", "type":wp, "dimd": ('t0'), "units": "none", "desc": "maximum snow albedo"}, \ + {"name": "sncovr", "type":wp, "dimd": ('t0'), "units": "none", "desc": "surface snow area fraction"}, \ + {"name": "tsfcl", "type":wp, "dimd": ('t0'), "units": "K", "desc": "surface skin temperature over land"}, \ + {"name": "stc", "type":wp, "dimd": ('t0','nsoil'), "units": "K", "desc": "initial profile of soil liquid moisture"}, \ + {"name": "smc", "type":wp, "dimd": ('t0','nsoil'), "units": "kg", "desc": "initial profile of soil moisture"}, \ + {"name": "slc", "type":wp, "dimd": ('t0','nsoil'), "units": "kg", "desc": "initial profile of soil temperature"}] + # + var_noahmp=[{"name": "tvxy", "type":wp, "dimd": ('t0'), "units": "K", "desc": "vegetation temperature for NoahMP"}, \ + {"name": "tgxy", "type":wp, "dimd": ('t0'), "units": "K", "desc": "ground temperature for NoahMP"}, \ + {"name": "tahxy", "type":wp, "dimd": ('t0'), "units": "K", "desc": "canopy air temperature for NoahMP"}, \ + {"name": "canicexy", "type":wp, "dimd": ('t0'), "units": "mm", "desc": "canopy intercepted ice mass for NoahMP"}, \ + {"name": "canliqxy", "type":wp, "dimd": ('t0'), "units": "mm", "desc": "canopy intercepted liquid water for NoahMP"}, \ + {"name": "eahxy", "type":wp, "dimd": ('t0'), "units": "Pa", "desc": "canopy air vapor pressure for NoahMP"}, \ + {"name": "cmxy", "type":wp, "dimd": ('t0'), "units": "none", "desc": "surface drag coefficient for momentum for NoahMP"}, \ + {"name": "chxy", "type":wp, "dimd": ('t0'), "units": "none", "desc": "surface exchange coeff heat & moisture for NoahMP"}, \ + {"name": "fwetxy", "type":wp, "dimd": ('t0'), "units": "none", "desc": "area fraction of canopy that is wetted/snowed for NoahMP"}, \ + {"name": "sneqvoxy", "type":wp, "dimd": ('t0'), "units": "mm", "desc": "snow mass at previous time step for NoahMP"}, \ + {"name": "alboldxy", "type":wp, "dimd": ('t0'), "units": "none", "desc": "snow albedo at previous time step for NoahMP"}, \ + {"name": "qsnowxy", "type":wp, "dimd": ('t0'), "units": "mm s-1", "desc": "snow precipitation rate at surface for NoahMP"}, \ + {"name": "wslakexy", "type":wp, "dimd": ('t0'), "units": "mm", "desc": "lake water storage for NoahMP"}, \ + {"name": "taussxy", "type":wp, "dimd": ('t0'), "units": "none", "desc": "non-dimensional snow age for NoahMP"}, \ + {"name": "waxy", "type":wp, "dimd": ('t0'), "units": "mm", "desc": "water storage in aquifer for NoahMP"}, \ + {"name": "wtxy", "type":wp, "dimd": ('t0'), "units": "mm", "desc": "water storage in aquifer and saturated soil for NoahMP"}, \ + {"name": "zwtxy", "type":wp, "dimd": ('t0'), "units": "m", "desc": "water table depth for NoahMP"}, \ + {"name": "xlaixy", "type":wp, "dimd": ('t0'), "units": "none", "desc": "leaf area index for NoahMP"}, \ + {"name": "xsaixy", "type":wp, "dimd": ('t0'), "units": "none", "desc": "stem area index for NoahMP"}, \ + {"name": "lfmassxy", "type":wp, "dimd": ('t0'), "units": "g m-2", "desc": "leaf mass for NoahMP"}, \ + {"name": "stmassxy", "type":wp, "dimd": ('t0'), "units": "g m-2", "desc": "stem mass for NoahMP"}, \ + {"name": "rtmassxy", "type":wp, "dimd": ('t0'), "units": "g m-2", "desc": "fine root mass for NoahMP"}, \ + {"name": "woodxy", "type":wp, "dimd": ('t0'), "units": "g m-2", "desc": "wood mass including woody roots for NoahMP"}, \ + {"name": "stblcpxy", "type":wp, "dimd": ('t0'), "units": "g m-2", "desc": "stable carbon in deep soil for NoahMP"}, \ + {"name": "fastcpxy", "type":wp, "dimd": ('t0'), "units": "g m-2", "desc": "short-lived carbon in shallow soil for NoahMP"}, \ + {"name": "smcwtdxy", "type":wp, "dimd": ('t0'), "units": "m3 m-3", "desc": "soil water content between the bottom of the soil and the water table for NoahMP"}, \ + {"name": "deeprechxy", "type":wp, "dimd": ('t0'), "units": "m", "desc": "recharge to or from the water table when deep for NoahMP"}, \ + {"name": "rechxy", "type":wp, "dimd": ('t0'), "units": "m", "desc": "recharge to or from the water table when shallow for NoahMP"}, \ + {"name": "snowxy", "type":wp, "dimd": ('t0'), "units": "none", "desc": "number of snow layers for NoahMP"}, \ + {"name": "snicexy", "type":wp, "dimd": ('t0','nsnow'), "units": "mm", "desc": "initial profile of snow layer ice"}, \ + {"name": "snliqxy", "type":wp, "dimd": ('t0','nsnow'), "units": "mm", "desc": "initial profile of snow layer liquid"}, \ + {"name": "tsnoxy", "type":wp, "dimd": ('t0','nsnow'), "units": "K", "desc": "initial profile of snow layer temperature"}, \ + {"name": "smoiseq", "type":wp, "dimd": ('t0','nsoil'), "units": "m3 m-3", "desc": "initial profile of equilibrium soil water content"}, \ + {"name": "zsnsoxy", "type":wp, "dimd": ('t0','nsoil_plus_nsnow'), "units": "m","desc": "layer bottom depth from snow surface"}] + # + var_ruc = [{"name": "wetness", "type":wp, "dimd": ('t0'), "units": "none", "desc": "normalized soil wetness for RUC LSM"}, \ + {"name": "lai", "type":wp, "dimd": ('t0'), "units": "none", "desc": "leaf area index for RUC LSM"}, \ + {"name": "clw_surf_land", "type":wp, "dimd": ('t0'), "units": "kg kg-1", "desc": "cloud condensed water mixing ratio at surface over land for RUC LSM"},\ + {"name": "clw_surf_ice", "type":wp, "dimd": ('t0'), "units": "kg kg-1", "desc": "cloud condensed water mixing ratio at surface over ice for RUC LSM"},\ + {"name": "qwv_surf_land", "type":wp, "dimd": ('t0'), "units": "kg kg-1", "desc": "water vapor mixing ratio at surface over land for RUC LSM"},\ + {"name": "qwv_surf_ice", "type":wp, "dimd": ('t0'), "units": "kg kg-1", "desc": "water vapor mixing ratio at surface over ice for RUC LSM"},\ + {"name": "tsnow_land", "type":wp, "dimd": ('t0'), "units": "K", "desc": "snow temperature at the bottom of the first snow layer over land for RUC LSM"},\ + {"name": "tsnow_ice", "type":wp, "dimd": ('t0'), "units": "K", "desc": "snow temperature at the bottom of the first snow layer over ice for RUC LSM"},\ + {"name": "snowfall_acc_land","type":wp, "dimd": ('t0'), "units": "kg m-2", "desc": "run-total snow accumulation on the ground over land for RUC LSM"},\ + {"name": "snowfall_acc_ice", "type":wp, "dimd": ('t0'), "units": "kg m-2", "desc": "run-total snow accumulation on the ground over ice for RUC LSM"},\ + {"name": "sfalb_lnd", "type":wp, "dimd": ('t0'), "units": "none", "desc": "surface albedo over land for RUC LSM"},\ + {"name": "sfalb_lnd_bck", "type":wp, "dimd": ('t0'), "units": "none", "desc": "surface snow-free albedo over land for RUC LSM"},\ + {"name": "sfalb_ice", "type":wp, "dimd": ('t0'), "units": "none", "desc": "surface albedo over ice for RUC LSM"},\ + {"name": "emis_lnd", "type":wp, "dimd": ('t0'), "units": "none", "desc": "surface emissivity over land for RUC LSM"},\ + {"name": "emis_ice", "type":wp, "dimd": ('t0'), "units": "none", "desc": "surface emissivity over ice for RUC LSM"}, \ + {"name": "tslb", "type":wp, "dimd": ('t0','nsoil'), "units": "K", "desc": "soil temperature for RUC LSM"}, \ + {"name": "smois", "type":wp, "dimd": ('t0','nsoil'), "units": "none", "desc": "volume fraction of soil moisture for RUC LSM"}, \ + {"name": "sh2o", "type":wp, "dimd": ('t0','nsoil'), "units": "none", "desc": "volume fraction of unfrozen soil moisture for RUC LSM"}, \ + {"name": "smfr", "type":wp, "dimd": ('t0','nsoil'), "units": "none", "desc": "volume fraction of frozen soil moisture for RUC LSM"}, + {"name": "flfr", "type":wp, "dimd": ('t0','nsoil'), "units": "none", "desc": "flag for frozen soil physics for RUC LSM"}] + + # + var_dict.extend(var_frc) + var_dict.extend(var_oro) + var_dict.extend(var_nsst) + var_dict.extend(var_frgd) + var_dict.extend(var_ruc) + var_dict.extend(var_noah) + var_dict.extend(var_noahmp) + + # + for var in var_dict: + if (var["name"] in dict): + var_temp = nc_file.createVariable(var["name"], var["type"], var["dimd"]) + var_temp.units = var["units"] + var_temp.standard_name = var["desc"] + var_temp[:] = dict[var["name"]] + elif "default_value" in var: + var_temp = nc_file.createVariable(var["name"], var["type"], var["dimd"]) + var_temp.units = var["units"] + var_temp.standard_name = var["desc"] + var_temp[:] = var["default_value"] + if "override" in var: + var_temp[:] = var["default_value"] + # + # Close file + # + nc_file.close() + + return(fileOUT) + +######################################################################################## +def write_comparison_file(comp_data, case_name, date, surface): + """Write UFS history file data to netCDF file for comparison""" + + wp = np.float64 + wi = np.int32 + + nlevs = comp_data["pa"].shape[1] + ntime = comp_data["pa"].shape[0] + + start_date = datetime(date["year"],date["month"],date["day"],date["hour"],date["minute"],date["second"]) + start_date_string = start_date.strftime("%Y%m%d%H%M%S") + + loc_string = str(round(surface["lon"],2)) + "E" + str(round(surface["lat"],2)) + "N" + case_string = 'UFS_' + start_date_string + '_' + loc_string + + com = 'mkdir -p ' + COMPARISON_DATA_DIR + print(com) + os.system(com) + nc_file = Dataset(os.path.join(COMPARISON_DATA_DIR, case_name + '_comp_data.nc'), 'w', format='NETCDF3_CLASSIC') + nc_file.case = case_string + nc_file.title = 'UFS history file data for ' + case_string + nc_file.reference = '' + nc_file.author = 'Grant J. Firl' + nc_file.version = 'Created on ' + datetime.today().strftime('%Y-%m-%d-%H:%M:%S') + nc_file.script = os.path.basename(__file__) + nc_file.startDate = start_date_string + + # Dimensions + lev_dim = nc_file.createDimension('lev', size=nlevs) + time_dim = nc_file.createDimension('time', size=ntime) + time_ufs_history_dim = nc_file.createDimension('time_ufs_history', size=ntime-1) + + # Varaibles + time_var = nc_file.createVariable('time', wp, ('time',)) + time_var.units = 'second' + time_var.long_name = 'history file time' + time_var[:] = comp_data['time'] + + time2_var = nc_file.createVariable('time_ufs_history', wp, ('time_ufs_history',)) + time2_var.units = 'second' + time2_var.long_name = 'UFS history file time' + time2_var[:] = comp_data['time'][1::] - temperature_var = initial_grp.createVariable('temp', real_type, ('levels',)) - temperature_var[:] = state["T"][0:nlevs] + lev_var = nc_file.createVariable('levs', wp, ('time','lev',)) + lev_var.units = 'Pa' + lev_var.long_name = 'pressure' + lev_var[:,:] = comp_data["pa"] + + temperature_var = nc_file.createVariable('temp', wp, ('time', 'lev',)) temperature_var.units = 'K' - temperature_var.description = 'initial profile of absolute temperature' - - qt_var = initial_grp.createVariable('qt', real_type, ('levels',)) - qt_var[:] = state["qv"][0:nlevs] - qt_var.units = 'kg kg^-1' - qt_var.description = 'initial profile of total water specific humidity' - - ql_var = initial_grp.createVariable('ql', real_type, ('levels',)) - ql_var[:] = state["ql"][0:nlevs] - ql_var.units = 'kg kg^-1' - ql_var.description = 'initial profile of liquid water specific humidity' - - qi_var = initial_grp.createVariable('qi', real_type, ('levels',)) - qi_var[:] = 0.0 - qi_var.units = 'kg kg^-1' - qi_var.description = 'initial profile of ice water specific humidity' - - u_var = initial_grp.createVariable('u', real_type, ('levels',)) - u_var[:] = state["u"][0:nlevs] - u_var.units = 'm s^-1' - u_var.description = 'initial profile of E-W horizontal wind' - - v_var = initial_grp.createVariable('v', real_type, ('levels',)) - v_var[:] = state["v"][0:nlevs] - v_var.units = 'm s^-1' - v_var.description = 'initial profile of N-S horizontal wind' - - tke_var = initial_grp.createVariable('tke', real_type, ('levels',)) - tke_var[:] = 0.0 - tke_var.units = 'm^2 s^-2' - tke_var.description = 'initial profile of turbulence kinetic energy' - - ozone_var = initial_grp.createVariable('ozone', real_type, ('levels',)) - ozone_var[:] = state["o3"][0:nlevs] - ozone_var.units = 'kg kg^-1' - ozone_var.description = 'initial profile of ozone mass mixing ratio' - - stc_var = initial_grp.createVariable('stc',real_type,('nsoil',)) - stc_var[:] = surface["stc"][0:nsoil] - stc_var.units = "K" - stc_var.description = "initial profile of soil temperature" - - smc_var = initial_grp.createVariable('smc',real_type,('nsoil',)) - smc_var[:] = surface["smc"][0:nsoil] - smc_var.units = "kg" - smc_var.description = "initial profile of soil moisture" - - slc_var = initial_grp.createVariable('slc',real_type,('nsoil',)) - slc_var[:] = surface["slc"][0:nsoil] - slc_var.units = "kg" - slc_var.description = "initial profile of soil liquid moisture" - - snicexy_var = initial_grp.createVariable('snicexy',real_type,('nsnow',)) - snicexy_var[:] = surface["snicexy"][0:nsnow] - snicexy_var.units = "mm" - snicexy_var.description = "initial profile of snow layer ice" - - snliqxy_var = initial_grp.createVariable('snliqxy',real_type,('nsnow',)) - snliqxy_var[:] = surface["snliqxy"][0:nsnow] - snliqxy_var.units = "mm" - snliqxy_var.description = "initial profile of snow layer liquid" - - tsnoxy_var = initial_grp.createVariable('tsnoxy',real_type,('nsnow',)) - tsnoxy_var[:] = surface["tsnoxy"][0:nsnow] - tsnoxy_var.units = "K" - tsnoxy_var.description = "initial profile of snow layer temperature" - - smoiseq_var = initial_grp.createVariable('smoiseq',real_type,('nsoil',)) - smoiseq_var[:] = surface["smoiseq"][0:nsoil] - smoiseq_var.units = "m3 m-3" - smoiseq_var.description = "initial profile of equilibrium soil water content" - - zsnsoxy_var = initial_grp.createVariable('zsnsoxy',real_type,('nsoil_plus_nsnow',)) - zsnsoxy_var[:] = surface["zsnsoxy"][0:nsoil + nsnow] - zsnsoxy_var.units = "m" - zsnsoxy_var.description = "layer bottom depth from snow surface" - - tiice_var = initial_grp.createVariable('tiice',real_type,('nice',)) - tiice_var[:] = surface["tiice"][0:nice] - tiice_var.units = "K" - tiice_var.description = "sea ice internal temperature" - - tslb_var = initial_grp.createVariable('tslb',real_type,('nsoil',)) - tslb_var[:] = surface["tslb"][0:nsoil] - tslb_var.units = "K" - tslb_var.description = "soil temperature for RUC LSM" - - smois_var = initial_grp.createVariable('smois',real_type,('nsoil',)) - smois_var[:] = surface["smois"][0:nsoil] - smois_var.units = "None" - smois_var.description = "volume fraction of soil moisture for RUC LSM" - - sh2o_var = initial_grp.createVariable('sh2o',real_type,('nsoil',)) - sh2o_var[:] = surface["sh2o"][0:nsoil] - sh2o_var.units = "None" - sh2o_var.description = "volume fraction of unfrozen soil moisture for RUC LSM" - - smfr_var = initial_grp.createVariable('smfr',real_type,('nsoil',)) - smfr_var[:] = surface["smfr"][0:nsoil] - smfr_var.units = "None" - smfr_var.description = "volume fraction of frozen soil moisture for RUC LSM" - - flfr_var = initial_grp.createVariable('flfr',real_type,('nsoil',)) - flfr_var[:] = surface["flfr"][0:nsoil] - flfr_var.units = "None" - flfr_var.description = "flag for frozen soil physics for RUC LSM" - - #forcing group - - p_surf_var = forcing_grp.createVariable('p_surf', real_type, ('time',)) - p_surf_var[:] = state["p_surf"] - p_surf_var.units = 'Pa' - p_surf_var.description = 'surface pressure' - - T_surf_var = forcing_grp.createVariable('T_surf', real_type, ('time',)) - T_surf_var[:] = missing_value - T_surf_var.units = 'K' - T_surf_var.description = 'surface absolute temperature forcing' - - w_ls_var = forcing_grp.createVariable('w_ls', real_type, ('levels','time',)) - w_ls_var[:] = forcing["w_ls"] - w_ls_var.units = 'm s^-1' - w_ls_var.description = 'large scale vertical velocity' - - omega_var = forcing_grp.createVariable('omega', real_type, ('levels','time',)) - omega_var[:] = forcing["omega"] - omega_var.units = 'Pa s^-1' - omega_var.description = 'large scale pressure vertical velocity' - - u_g_var = forcing_grp.createVariable('u_g', real_type, ('levels','time',)) - u_g_var[:] = forcing["u_g"] - u_g_var.units = 'm s^-1' - u_g_var.description = 'large scale geostrophic E-W wind' - - v_g_var = forcing_grp.createVariable('v_g', real_type, ('levels','time',)) - v_g_var[:] = forcing["v_g"] - v_g_var.units = 'm s^-1' - v_g_var.description = 'large scale geostrophic N-S wind' - - u_nudge_var = forcing_grp.createVariable('u_nudge', real_type, ('levels','time',)) - u_nudge_var[:] = forcing["u_nudge"] - u_nudge_var.units = 'm s^-1' - u_nudge_var.description = 'E-W wind to nudge toward' - - v_nudge_var = forcing_grp.createVariable('v_nudge', real_type, ('levels','time',)) - v_nudge_var[:] = forcing["v_nudge"] - v_nudge_var.units = 'm s^-1' - v_nudge_var.description = 'N-S wind to nudge toward' - - T_nudge_var = forcing_grp.createVariable('T_nudge', real_type, ('levels','time',)) - T_nudge_var[:] = forcing["T_nudge"] - T_nudge_var.units = 'K' - T_nudge_var.description = 'absolute temperature to nudge toward' - - thil_nudge_var = forcing_grp.createVariable('thil_nudge', real_type, ('levels','time',)) - thil_nudge_var[:] = forcing["thil_nudge"] - thil_nudge_var.units = 'K' - thil_nudge_var.description = 'potential temperature to nudge toward' - - qt_nudge_var = forcing_grp.createVariable('qt_nudge', real_type, ('levels','time',)) - qt_nudge_var[:] = forcing["qt_nudge"] - qt_nudge_var.units = 'kg kg^-1' - qt_nudge_var.description = 'q_t to nudge toward' - - rad_heating_var = forcing_grp.createVariable('dT_dt_rad', real_type, ('levels','time',)) - rad_heating_var[:] = forcing["rad_heating"] - rad_heating_var.units = 'K s^-1' - rad_heating_var.description = 'prescribed radiative heating rate' - - h_advec_thil_var = forcing_grp.createVariable('h_advec_thetail', real_type, ('levels','time',)) - h_advec_thil_var[:] = forcing["h_advec_thil"] - h_advec_thil_var.units = 'K s^-1' - h_advec_thil_var.description = 'prescribed theta_il tendency due to horizontal advection' - - v_advec_thil_var = forcing_grp.createVariable('v_advec_thetail', real_type, ('levels','time',)) - v_advec_thil_var[:] = forcing["v_advec_thil"] - v_advec_thil_var.units = 'K s^-1' - v_advec_thil_var.description = 'prescribed theta_il tendency due to vertical advection' - - h_advec_qt_var = forcing_grp.createVariable('h_advec_qt', real_type, ('levels','time',)) - h_advec_qt_var[:] = forcing["h_advec_qt"] - h_advec_qt_var.units = 'kg kg^-1 s^-1' - h_advec_qt_var.description = 'prescribed q_t tendency due to horizontal advection' - - v_advec_qt_var = forcing_grp.createVariable('v_advec_qt', real_type, ('levels','time',)) - v_advec_qt_var[:] = forcing["v_advec_qt"] - v_advec_qt_var.units = 'kg kg^-1 s^-1' - v_advec_qt_var.description = 'prescribed q_t tendency due to vertical advection' - - #scalar group - year_var = scalar_grp.createVariable('init_year',int_type) - year_var[:] = date["year"] - year_var.units = "years" - year_var.description = "year at time of initial values" - - month_var = scalar_grp.createVariable('init_month',int_type) - month_var[:] = date["month"] - month_var.units = "months" - month_var.description = "month at time of initial values" - - day_var = scalar_grp.createVariable('init_day',int_type) - day_var[:] = date["day"] - day_var.units = "days" - day_var.description = "day at time of initial values" - - hour_var = scalar_grp.createVariable('init_hour',int_type) - hour_var[:] = date["hour"] - hour_var.units = "hours" - hour_var.description = "hour at time of initial values" - - minute_var = scalar_grp.createVariable('init_minute',int_type) - minute_var[:] = date["minute"] - minute_var.units = "minutes" - minute_var.description = "minute at time of initial values" - - second_var = scalar_grp.createVariable('init_second',int_type) - second_var[:] = 0.0 - second_var.units = "seconds" - second_var.description = "second at time of initial values" - - lat_var = scalar_grp.createVariable('lat', real_type) - lat_var[:] = surface["lat"] - lat_var.units = 'degrees N' - lat_var.description = 'latitude of column' - - lon_var = scalar_grp.createVariable('lon', real_type) - lon_var[:] = surface["lon"] - lon_var.units = 'degrees E' - lon_var.description = 'longitude of column' - - area = scalar_grp.createVariable('area', real_type) - area[:] = surface["area"] - area.units = "m^2" - area.description = "grid cell area" - - #Noah initial parameters - - tsfco = scalar_grp.createVariable('tsfco',real_type) - tsfco[:] = surface["tsfco"] - tsfco.units = "K" - tsfco.description = "sea surface temperature OR surface skin temperature over land OR sea ice surface skin temperature (depends on value of slmsk)" - - vegsrc = scalar_grp.createVariable('vegsrc',int_type) - vegsrc[:] = 1 #when would this be 2? - vegsrc.description = "vegetation soure (1-2)" - - vegtyp = scalar_grp.createVariable('vegtyp',int_type) - vegtyp[:] = surface["vtyp"] - vegtyp.description = "vegetation type (1-12)" - - soiltyp = scalar_grp.createVariable('soiltyp',int_type) - soiltyp[:] = surface["styp"] - soiltyp.description = "soil type (1-12)" - - slopetyp = scalar_grp.createVariable('slopetyp',int_type) - slopetyp[:] = surface["slope"] - slopetyp.description = "slope type (1-9)" - - vegfrac = scalar_grp.createVariable('vegfrac',real_type) - vegfrac[:] = surface["vfrac"] - vegfrac.description = "vegetation fraction" - - shdmin = scalar_grp.createVariable('shdmin',real_type) - shdmin[:] = surface["shdmin"] - shdmin.description = "minimum vegetation fraction" - - shdmax = scalar_grp.createVariable('shdmax',real_type) - shdmax[:] = surface["shdmax"] - shdmax.description = "maximum vegetation fraction" - - zorlw = scalar_grp.createVariable('zorlw',real_type) - zorlw[:] = surface["zorlw"] - zorlw.units = "cm" - zorlw.description = "surface roughness length over ocean" - - islmsk = scalar_grp.createVariable('slmsk',real_type) - islmsk[:] = surface["slmsk"] - islmsk.description = "land-sea-ice mask" - - canopy = scalar_grp.createVariable('canopy',real_type) - canopy[:] = surface["canopy"] - canopy.units = "kg m-2" - canopy.description = "amount of water stored in canopy" - - hice = scalar_grp.createVariable('hice',real_type) - hice[:] = surface["hice"] - hice.units = "m" - hice.description = "sea ice thickness" - - fice = scalar_grp.createVariable('fice',real_type) - fice[:] = surface["fice"] - fice.description = "ice fraction" - - tisfc = scalar_grp.createVariable('tisfc',real_type) - tisfc[:] = surface["tisfc"] - tisfc.units = "K" - tisfc.description = "ice surface temperature" - - snwdph = scalar_grp.createVariable('snwdph',real_type) - snwdph[:] = surface["snwdph"] - snwdph.units = "mm" - snwdph.description = "water equivalent snow depth" - - snoalb = scalar_grp.createVariable('snoalb',real_type) - snoalb[:] = surface["snoalb"] - snoalb.description = "maximum snow albedo" - - tg3 = scalar_grp.createVariable('tg3',real_type) - tg3[:] = surface["tg3"] - tg3.units = "K" - tg3.description = "deep soil temperature" - - uustar = scalar_grp.createVariable('uustar',real_type) - uustar[:] = surface["uustar"] - uustar.units = "m s-1" - uustar.description = "friction velocity" - - alvsf = scalar_grp.createVariable('alvsf',real_type) - alvsf[:] = surface["alvsf"] - alvsf.units = "None" - alvsf.description = "60 degree vis albedo with strong cosz dependency" - - alnsf = scalar_grp.createVariable('alnsf',real_type) - alnsf[:] = surface["alnsf"] - alnsf.units = "None" - alnsf.description = "60 degree nir albedo with strong cosz dependency" - - alvwf = scalar_grp.createVariable('alvwf',real_type) - alvwf[:] = surface["alvwf"] - alvwf.units = "None" - alvwf.description = "60 degree vis albedo with weak cosz dependency" - - alnwf = scalar_grp.createVariable('alnwf',real_type) - alnwf[:] = surface["alnwf"] - alnwf.units = "None" - alnwf.description = "60 degree nir albedo with weak cosz dependency" - - facsf = scalar_grp.createVariable('facsf',real_type) - facsf[:] = surface["facsf"] - facsf.units = "None" - facsf.description = "fractional coverage with strong cosz dependency" - - facwf = scalar_grp.createVariable('facwf',real_type) - facwf[:] = surface["facwf"] - facwf.units = "None" - facwf.description = "fractional coverage with weak cosz dependency" - - weasd = scalar_grp.createVariable('weasd',real_type) - weasd[:] = surface["sheleg"] - weasd.units = "mm" - weasd.description = "water equivalent accumulated snow depth" - - f10m = scalar_grp.createVariable('f10m',real_type) - f10m[:] = surface["f10m"] - f10m.units = "None" - f10m.description = "ratio of sigma level 1 wind and 10m wind" - - t2m = scalar_grp.createVariable('t2m',real_type) - t2m[:] = surface["t2m"] - t2m.units = "K" - t2m.description = "2-meter absolute temperature" - - q2m = scalar_grp.createVariable('q2m',real_type) - q2m[:] = surface["q2m"] - q2m.units = "kg kg-1" - q2m.description = "2-meter specific humidity" - - ffmm = scalar_grp.createVariable('ffmm',real_type) - ffmm[:] = surface["ffmm"] - ffmm.units = "None" - ffmm.description = "Monin-Obukhov similarity function for momentum" - - ffhh = scalar_grp.createVariable('ffhh',real_type) - ffhh[:] = surface["ffhh"] - ffhh.units = "None" - ffhh.description = "Monin-Obukhov similarity function for heat" - - tprcp = scalar_grp.createVariable('tprcp',real_type) - tprcp[:] = surface["tprcp"] - tprcp.units = "m" - tprcp.description = "instantaneous total precipitation amount" - - srflag = scalar_grp.createVariable('srflag',real_type) - srflag[:] = surface["srflag"] - srflag.units = "None" - srflag.description = "snow/rain flag for precipitation" - - sncovr = scalar_grp.createVariable('sncovr',real_type) - sncovr[:] = surface["sncovr"] - sncovr.units = "None" - sncovr.description = "surface snow area fraction" - - tsfcl = scalar_grp.createVariable('tsfcl',real_type) - tsfcl[:] = surface["tsfcl"] - tsfcl.units = "K" - tsfcl.description = "surface skin temperature over land" - - zorll = scalar_grp.createVariable('zorll',real_type) - zorll[:] = surface["zorll"] - zorll.units = "cm" - zorll.description = "surface roughness length over land" - - zorli = scalar_grp.createVariable('zorli',real_type) - zorli[:] = surface["zorli"] - zorli.units = "cm" - zorli.description = "surface roughness length over ice" - - zorlwav = scalar_grp.createVariable('zorlwav',real_type) - zorlwav[:] = surface["zorlwav"] - zorlwav.units = "cm" - zorlwav.description = "surface roughness length from wave model" - - #Orography initial parameters - - stddev = scalar_grp.createVariable('stddev',real_type) - stddev[:] = oro["stddev"] - stddev.units = "m" - stddev.description = "standard deviation of subgrid orography" - - convexity = scalar_grp.createVariable('convexity',real_type) - convexity[:] = oro["convexity"] - convexity.units = "" - convexity.description = "convexity of subgrid orography" - - oa1 = scalar_grp.createVariable('oa1',real_type) - oa1[:] = oro["oa1"] - oa1.units = "" - oa1.description = "assymetry of subgrid orography 1" - - oa2 = scalar_grp.createVariable('oa2',real_type) - oa2[:] = oro["oa2"] - oa2.units = "" - oa2.description = "assymetry of subgrid orography 2" - - oa3 = scalar_grp.createVariable('oa3',real_type) - oa3[:] = oro["oa3"] - oa3.units = "" - oa3.description = "assymetry of subgrid orography 3" - - oa4 = scalar_grp.createVariable('oa4',real_type) - oa4[:] = oro["oa4"] - oa4.units = "" - oa4.description = "assymetry of subgrid orography 4" - - ol1 = scalar_grp.createVariable('ol1',real_type) - ol1[:] = oro["ol1"] - ol1.units = "" - ol1.description = "fraction of grid box with subgrid orography higher than critical height 1" - - ol2 = scalar_grp.createVariable('ol2',real_type) - ol2[:] = oro["ol2"] - ol2.units = "" - ol2.description = "fraction of grid box with subgrid orography higher than critical height 2" - - ol3 = scalar_grp.createVariable('ol3',real_type) - ol3[:] = oro["ol3"] - ol3.units = "" - ol3.description = "fraction of grid box with subgrid orography higher than critical height 3" - - ol4 = scalar_grp.createVariable('ol4',real_type) - ol4[:] = oro["ol4"] - ol4.units = "" - ol4.description = "fraction of grid box with subgrid orography higher than critical height 4" - - theta = scalar_grp.createVariable('theta',real_type) - theta[:] = oro["theta"] - theta.units = "deg" - theta.description = "angle with respect to east of maximum subgrid orographic variations" - - gamma = scalar_grp.createVariable('gamma',real_type) - gamma[:] = oro["gamma"] - gamma.units = "" - gamma.description = "anisotropy of subgrid orography" - - sigma = scalar_grp.createVariable('sigma',real_type) - sigma[:] = oro["sigma"] - sigma.units = "" - sigma.description = "slope of subgrid orography" - - elvmax = scalar_grp.createVariable('elvmax',real_type) - elvmax[:] = oro["elvmax"] - elvmax.units = "m" - elvmax.description = "maximum of subgrid orography" - - orog_filt = scalar_grp.createVariable('oro',real_type) - orog_filt[:] = oro["orog_filt"] - orog_filt.units = "m" - orog_filt.description = "orography" - - orog_raw = scalar_grp.createVariable('oro_uf',real_type) - orog_raw[:] = oro["orog_raw"] - orog_raw.units = "m" - orog_raw.description = "unfiltered orography" - - land_frac = scalar_grp.createVariable('landfrac',real_type) - land_frac[:] = oro["land_frac"] - land_frac.units = "None" - land_frac.description = "fraction of horizontal grid area occupied by land" - - lake_frac = scalar_grp.createVariable('lakefrac',real_type) - lake_frac[:] = oro["lake_frac"] - lake_frac.units = "None" - lake_frac.description = "fraction of horizontal grid area occupied by lake" - - lake_depth = scalar_grp.createVariable('lakedepth',real_type) - lake_depth[:] = oro["lake_depth"] - lake_depth.units = "m" - lake_depth.description = "lake depth" - - #NoahMP initial scalar parameters - tvxy = scalar_grp.createVariable('tvxy',real_type) - tvxy[:] = surface["tvxy"] - tvxy.units = "K" - tvxy.description = "vegetation temperature" - - tgxy = scalar_grp.createVariable('tgxy',real_type) - tgxy[:] = surface["tgxy"] - tgxy.units = "K" - tgxy.description = "ground temperature for NoahMP" - - tahxy = scalar_grp.createVariable('tahxy',real_type) - tahxy[:] = surface["tahxy"] - tahxy.units = "K" - tahxy.description = "canopy air temperature" - - canicexy = scalar_grp.createVariable('canicexy',real_type) - canicexy[:] = surface["canicexy"] - canicexy.units = "mm" - canicexy.description = "canopy intercepted ice mass" - - canliqxy = scalar_grp.createVariable('canliqxy',real_type) - canliqxy[:] = surface["canliqxy"] - canliqxy.units = "mm" - canliqxy.description = "canopy intercepted liquid water" - - eahxy = scalar_grp.createVariable('eahxy',real_type) - eahxy[:] = surface["eahxy"] - eahxy.units = "Pa" - eahxy.description = "canopy air vapor pressure" - - cmxy = scalar_grp.createVariable('cmxy',real_type) - cmxy[:] = surface["cmxy"] - cmxy.units = "" - cmxy.description = "surface drag coefficient for momentum for NoahMP" - - chxy = scalar_grp.createVariable('chxy',real_type) - chxy[:] = surface["chxy"] - chxy.units = "" - chxy.description = "surface exchange coeff heat & moisture for NoahMP" - - fwetxy = scalar_grp.createVariable('fwetxy',real_type) - fwetxy[:] = surface["fwetxy"] - fwetxy.units = "" - fwetxy.description = "area fraction of canopy that is wetted/snowed" - - sneqvoxy = scalar_grp.createVariable('sneqvoxy',real_type) - sneqvoxy[:] = surface["sneqvoxy"] - sneqvoxy.units = "mm" - sneqvoxy.description = "snow mass at previous time step" - - alboldxy = scalar_grp.createVariable('alboldxy',real_type) - alboldxy[:] = surface["alboldxy"] - alboldxy.units = "" - alboldxy.description = "snow albedo at previous time step" - - qsnowxy = scalar_grp.createVariable('qsnowxy',real_type) - qsnowxy[:] = surface["qsnowxy"] - qsnowxy.units = "mm s-1" - qsnowxy.description = "snow precipitation rate at surface" - - wslakexy = scalar_grp.createVariable('wslakexy',real_type) - wslakexy[:] = surface["wslakexy"] - wslakexy.units = "mm" - wslakexy.description = "lake water storage" - - taussxy = scalar_grp.createVariable('taussxy',real_type) - taussxy[:] = surface["taussxy"] - taussxy.units = "" - taussxy.description = "non-dimensional snow age" - - waxy = scalar_grp.createVariable('waxy',real_type) - waxy[:] = surface["waxy"] - waxy.units = "mm" - waxy.description = "water storage in aquifer" - - wtxy = scalar_grp.createVariable('wtxy',real_type) - wtxy[:] = surface["wtxy"] - wtxy.units = "mm" - wtxy.description = "water storage in aquifer and saturated soil" - - zwtxy = scalar_grp.createVariable('zwtxy',real_type) - zwtxy[:] = surface["zwtxy"] - zwtxy.units = "m" - zwtxy.description = "water table depth" - - xlaixy = scalar_grp.createVariable('xlaixy',real_type) - xlaixy[:] = surface["xlaixy"] - xlaixy.units = "" - xlaixy.description = "leaf area index" - - xsaixy = scalar_grp.createVariable('xsaixy',real_type) - xsaixy[:] = surface["xsaixy"] - xsaixy.units = "" - xsaixy.description = "stem area index" - - lfmassxy = scalar_grp.createVariable('lfmassxy',real_type) - lfmassxy[:] = surface["lfmassxy"] - lfmassxy.units = "g m-2" - lfmassxy.description = "leaf mass" - - stmassxy = scalar_grp.createVariable('stmassxy',real_type) - stmassxy[:] = surface["stmassxy"] - stmassxy.units = "g m-2" - stmassxy.description = "stem mass" - - rtmassxy = scalar_grp.createVariable('rtmassxy',real_type) - rtmassxy[:] = surface["rtmassxy"] - rtmassxy.units = "g m-2" - rtmassxy.description = "fine root mass" - - woodxy = scalar_grp.createVariable('woodxy',real_type) - woodxy[:] = surface["woodxy"] - woodxy.units = "g m-2" - woodxy.description = "wood mass including woody roots" - - stblcpxy = scalar_grp.createVariable('stblcpxy',real_type) - stblcpxy[:] = surface["stblcpxy"] - stblcpxy.units = "g m-2" - stblcpxy.description = "stable carbon in deep soil" - - fastcpxy = scalar_grp.createVariable('fastcpxy',real_type) - fastcpxy[:] = surface["fastcpxy"] - fastcpxy.units = "g m-2" - fastcpxy.description = "short-lived carbon in shallow soil" - - smcwtdxy = scalar_grp.createVariable('smcwtdxy',real_type) - smcwtdxy[:] = surface["smcwtdxy"] - smcwtdxy.units = "m3 m-3" - smcwtdxy.description = "soil water content between the bottom of the soil and the water table" - - deeprechxy = scalar_grp.createVariable('deeprechxy',real_type) - deeprechxy[:] = surface["deeprechxy"] - deeprechxy.units = "m" - deeprechxy.description = "recharge to or from the water table when deep" - - rechxy = scalar_grp.createVariable('rechxy',real_type) - rechxy[:] = surface["rechxy"] - rechxy.units = "m" - rechxy.description = "recharge to or from the water table when shallow" - - snowxy = scalar_grp.createVariable('snowxy',real_type) - snowxy[:] = surface["snowxy"] - snowxy.units = "" - snowxy.description = "number of snow layers" - - albdvis = scalar_grp.createVariable('albdvis',real_type) - albdvis[:] = surface["albdvis"] - albdvis.units = "" - albdvis.description = "surface albedo direct visible" - - albdnir = scalar_grp.createVariable('albdnir',real_type) - albdnir[:] = surface["albdnir"] - albdnir.units = "" - albdnir.description = "surface albedo direct near-infrared" - - albivis = scalar_grp.createVariable('albivis',real_type) - albivis[:] = surface["albivis"] - albivis.units = "" - albivis.description = "surface albedo diffuse visible" - - albinir = scalar_grp.createVariable('albinir',real_type) - albinir[:] = surface["albinir"] - albinir.units = "" - albinir.description = "surface albedo diffuse near-infrared" - - emiss = scalar_grp.createVariable('emiss',real_type) - emiss[:] = surface["emiss"] - emiss.units = "" - emiss.description = "surface emissivity" - - #NSST initial scalar parameters - tref = scalar_grp.createVariable('tref',real_type) - tref[:] = surface["tref"] - tref.units = "K" - tref.description = "sea surface reference temperature for NSST" - - z_c = scalar_grp.createVariable('z_c',real_type) - z_c[:] = surface["z_c"] - z_c.units = "m" - z_c.description = "sub-layer cooling thickness for NSST" - - c_0 = scalar_grp.createVariable('c_0',real_type) - c_0[:] = surface["c_0"] - c_0.units = "" - c_0.description = "coefficient 1 to calculate d(Tz)/d(Ts) for NSST" - - c_d = scalar_grp.createVariable('c_d',real_type) - c_d[:] = surface["c_d"] - c_d.units = "" - c_d.description = "coefficient 2 to calculate d(Tz)/d(Ts) for NSST" - - w_0 = scalar_grp.createVariable('w_0',real_type) - w_0[:] = surface["w_0"] - w_0.units = "" - w_0.description = "coefficient 3 to calculate d(Tz)/d(Ts) for NSST" - - w_d = scalar_grp.createVariable('w_d',real_type) - w_d[:] = surface["w_d"] - w_d.units = "" - w_d.description = "coefficient 4 to calculate d(Tz)/d(Ts) for NSST" - - xt = scalar_grp.createVariable('xt',real_type) - xt[:] = surface["xt"] - xt.units = "K m" - xt.description = "heat content in diurnal thermocline layer for NSST" - - xs = scalar_grp.createVariable('xs',real_type) - xs[:] = surface["xs"] - xs.units = "ppt m" - xs.description = "salinity content in diurnal thermocline layer for NSST" - - xu = scalar_grp.createVariable('xu',real_type) - xu[:] = surface["xu"] - xu.units = "m2 s-1" - xu.description = "u-current in diurnal thermocline layer for NSST" - - xv = scalar_grp.createVariable('xv',real_type) - xv[:] = surface["xv"] - xv.units = "m2 s-1" - xv.description = "v-current in diurnal thermocline layer for NSST" - - xz = scalar_grp.createVariable('xz',real_type) - xz[:] = surface["xz"] - xz.units = "m" - xz.description = "thickness of diurnal thermocline layer for NSST" - - zm = scalar_grp.createVariable('zm',real_type) - zm[:] = surface["zm"] - zm.units = "m" - zm.description = "thickness of ocean mixed layer for NSST" - - xtts = scalar_grp.createVariable('xtts',real_type) - xtts[:] = surface["xtts"] - xtts.units = "m" - xtts.description = "sensitivity of diurnal thermocline layer heat content to surface temperature [d(xt)/d(ts)] for NSST" - - xzts = scalar_grp.createVariable('xzts',real_type) - xzts[:] = surface["xzts"] - xzts.units = "m K-1" - xzts.description = "sensitivity of diurnal thermocline layer thickness to surface temperature [d(xz)/d(ts)] for NSST" - - d_conv = scalar_grp.createVariable('d_conv',real_type) - d_conv[:] = surface["d_conv"] - d_conv.units = "m" - d_conv.description = "thickness of free convection layer for NSST" - - ifd = scalar_grp.createVariable('ifd',real_type) - ifd[:] = surface["ifd"] - ifd.units = "" - ifd.description = "index to start DTM run for NSST" - - dt_cool = scalar_grp.createVariable('dt_cool',real_type) - dt_cool[:] = surface["dt_cool"] - dt_cool.units = "K" - dt_cool.description = "sub-layer cooling amount for NSST" - - qrain = scalar_grp.createVariable('qrain',real_type) - qrain[:] = surface["qrain"] - qrain.units = "W" - qrain.description = "sensible heat due to rainfall for NSST" - - #RUC LSM - wetness = scalar_grp.createVariable('wetness',real_type) - wetness[:] = surface["wetness"] - wetness.units = "" - wetness.description = "normalized soil wetness for RUC LSM" - - clw_surf_land = scalar_grp.createVariable('clw_surf_land',real_type) - clw_surf_land[:] = surface["clw_surf_land"] - clw_surf_land.units = "kg kg-1" - clw_surf_land.description = "cloud condensed water mixing ratio at surface over land for RUC LSM" - - clw_surf_ice = scalar_grp.createVariable('clw_surf_ice',real_type) - clw_surf_ice[:] = surface["clw_surf_ice"] - clw_surf_ice.units = "kg kg-1" - clw_surf_ice.description = "cloud condensed water mixing ratio at surface over ice for RUC LSM" - - qwv_surf_land = scalar_grp.createVariable('qwv_surf_land',real_type) - qwv_surf_land[:] = surface["qwv_surf_land"] - qwv_surf_land.units = "kg kg-1" - qwv_surf_land.description = "water vapor mixing ratio at surface over land for RUC LSM" - - qwv_surf_ice = scalar_grp.createVariable('qwv_surf_ice',real_type) - qwv_surf_ice[:] = surface["qwv_surf_ice"] - qwv_surf_ice.units = "kg kg-1" - qwv_surf_ice.description = "water vapor mixing ratio at surface over ice for RUC LSM" - - tsnow_land = scalar_grp.createVariable('tsnow_land',real_type) - tsnow_land[:] = surface["tsnow_land"] - tsnow_land.units = "K" - tsnow_land.description = "snow temperature at the bottom of the first snow layer over land for RUC LSM" - - tsnow_ice = scalar_grp.createVariable('tsnow_ice',real_type) - tsnow_ice[:] = surface["tsnow_ice"] - tsnow_ice.units = "K" - tsnow_ice.description = "snow temperature at the bottom of the first snow layer over ice for RUC LSM" - - snowfall_acc_land = scalar_grp.createVariable('snowfall_acc_land',real_type) - snowfall_acc_land[:] = surface["snowfall_acc_land"] - snowfall_acc_land.units = "kg m-2" - snowfall_acc_land.description = "run-total snow accumulation on the ground over land for RUC LSM" - - snowfall_acc_ice = scalar_grp.createVariable('snowfall_acc_ice',real_type) - snowfall_acc_ice[:] = surface["snowfall_acc_ice"] - snowfall_acc_ice.units = "kg m-2" - snowfall_acc_ice.description = "run-total snow accumulation on the ground over ice for RUC LSM" - - sncovr_ice = scalar_grp.createVariable('sncovr_ice',real_type) - sncovr_ice[:] = surface["sncovr_ice"] - sncovr_ice.units = "" - sncovr_ice.description = "surface snow area fraction over ice for RUC LSM" - - lai = scalar_grp.createVariable('lai',real_type) - lai[:] = surface["lai"] - lai.units = "" - lai.description = "leaf area index for RUC LSM" + temperature_var.long_name = 'Temperature' + temperature_var[:,:] = comp_data["ta"] + + qv_var = nc_file.createVariable('qv', wp, ('time', 'lev',)) + qv_var.units = 'kg kg-1' + qv_var.long_name = 'specific humidity' + qv_var[:,:] = comp_data["qv"] + + u_var = nc_file.createVariable('u', wp, ('time', 'lev',)) + u_var.units = 'm s-1' + u_var.long_name = 'zonal wind' + u_var[:,:] = comp_data["ua"] + + v_var = nc_file.createVariable('v', wp, ('time', 'lev',)) + v_var.units = 'm s-1' + v_var.long_name = 'meridional wind' + v_var[:,:] = comp_data["va"] + + for var2d in comp_data["vars2d"]: + tempVar = nc_file.createVariable(var2d["name"], wp, ('time_ufs_history')) + tempVar.units = var2d["units"] + tempVar.long_name = var2d["long_name"] + tempVar[:] = var2d["values"] + + nc_file.close() + + return + +######################################################################################## +# +######################################################################################## +def find_date(forcing_dir): + + atm_ftag = 'atmf*.nc' + + atm_filenames = [] + for f_name in os.listdir(forcing_dir): + if fnmatch.fnmatch(f_name, atm_ftag): + atm_filenames.append(f_name) + if not atm_filenames: + message = 'No filenames matching the pattern {0} found in {1}'.format(atm_ftag,forcing_dir) + logging.critical(message) + raise Exception(message) + atm_filenames = sorted(atm_filenames) + + nc_file = Dataset('{0}/{1}'.format(forcing_dir,atm_filenames[0])) + + #starting date is in the units attribute of time + + date_string = nc_file['time'].getncattr('units').split('since ')[1] #should be in format YYYY-MM-DD HH:MM:SS nc_file.close() + + date_dict = {} + date_dict["year"] = int(date_string[0:4]) + date_dict["month"] = int(date_string[5:7]) + date_dict["day"] = int(date_string[8:10]) + date_dict["hour"] = int(date_string[11:13]) + date_dict["minute"] = int(date_string[14:16]) + date_dict["second"] = int(date_string[17:]) + + return date_dict +######################################################################################## +# +######################################################################################## def main(): setup_logging() #read in arguments - (location, indices, date, in_dir, grid_dir, tile, area, noahmp, case_name, old_chgres) = parse_arguments() + (location, indices, date, in_dir, grid_dir, forcing_dir, tile, area, case_name, + old_chgres, lam, save_comp, use_nearest) = parse_arguments() #find tile containing the point using the supergrid if no tile is specified + #if not tile and not lam: if not tile: - tile = find_tile(location, grid_dir) + tile = int(find_tile(location, grid_dir, lam)) if tile < 0: message = 'No tile was found for location {0}'.format(location) logging.critical(message) raise Exception(message) - print 'Tile found: {0}'.format(tile) + print('Tile found: {0}'.format(tile)) #find index of closest point in the tile if indices are not specified if not indices: - (tile_j, tile_i, point_lon, point_lat, dist_min) = find_loc_indices(location, grid_dir, tile) - print 'The closest point in tile {0} has indices [{1},{2}]'.format(tile,tile_i,tile_j) - print 'This index has a central longitude/latitude of [{0},{1}]'.format(point_lon,point_lat) - print 'This grid cell is approximately {0} km away from the desired location of {1} {2}'.format(dist_min/1.0E3,location[0],location[1]) + (tile_j, tile_i, point_lon, point_lat, dist_min) = find_loc_indices(location, grid_dir, tile, lam) + print('The closest point in tile {0} has indices [{1},{2}]'.format(tile,tile_i,tile_j)) + print('This index has a central longitude/latitude of [{0},{1}]'.format(point_lon,point_lat)) + print('This grid cell is approximately {0} km away from the desired location of {1} {2}'.format(dist_min/1.0E3,location[0],location[1])) else: tile_i = indices[0] tile_j = indices[1] #still need to grab the lon/lat if the tile and indices are supplied - (point_lon, point_lat) = find_lon_lat_of_indices(indices, grid_dir, tile) + (point_lon, point_lat) = find_lon_lat_of_indices(indices, grid_dir, tile, lam) - print 'This index has a central longitude/latitude of [{0},{1}]'.format(point_lon,point_lat) - - #get UFS IC data (TODO: flag to read in RESTART data rather than IC data and implement different file reads) - (state_data, surface_data, oro_data) = get_UFS_IC_data(in_dir, grid_dir, tile, tile_i, tile_j, old_chgres) + print('This index has a central longitude/latitude of [{0},{1}]'.format(point_lon,point_lat)) - #cold start NoahMP variables - if (noahmp): - surface_data = add_noahmp_coldstart(surface_data, date) + # get UFS IC data (TODO: flag to read in RESTART data rather than IC data and implement + # different file reads) + (state_data, surface_data, oro_data) = get_UFS_IC_data(in_dir, grid_dir, tile, tile_i,\ + tile_j, old_chgres, lam) + + if not date: + # date was not included on command line; look in atmf* file for initial date + date = find_date(forcing_dir) + #get grid cell area if not given if not area: - area = get_UFS_grid_area(grid_dir, tile, tile_i, tile_j) + area = get_UFS_grid_area(grid_dir, tile, tile_i, tile_j, lam) surface_data["area"] = area - - surface_data["lon"] = point_lon - surface_data["lat"] = point_lat - - #get UFS forcing data (zeros for now; only placeholder) - forcing_data = get_UFS_forcing_data(state_data["nlevs"]) - - #write SCM case file - write_SCM_case_file(state_data, surface_data, oro_data, forcing_data, case_name, date) - + surface_data["lon"] = point_lon + surface_data["lat"] = point_lat + + # Get UFS forcing data + (forcing_data, comp_data, stateREGRID) = get_UFS_forcing_data(state_data["nlevs"], state_data, \ + location, use_nearest, forcing_dir, \ + grid_dir, tile, tile_i, tile_j, lam,\ + save_comp) + + # Write SCM case file + fileOUT = write_SCM_case_file(state_data, surface_data, oro_data, forcing_data, case_name, date, \ + stateREGRID) + + # read in and remap the state variables to the first history file pressure profile and + # write them out to compare SCM output to (atmf for state variables and sfcf for physics + # tendencies) + if (save_comp): + write_comparison_file(comp_data, case_name, date, surface_data) if __name__ == '__main__': main() diff --git a/scm/etc/scripts/UFS_LSM_param.py b/scm/etc/scripts/UFS_LSM_param.py index de6efd964..f17372e1b 100755 --- a/scm/etc/scripts/UFS_LSM_param.py +++ b/scm/etc/scripts/UFS_LSM_param.py @@ -31,6 +31,7 @@ group1.add_argument('-l', '--location', help='longitude and latitude in degress E and N, respectively, separated by a space', nargs=2, type=float) group1.add_argument('-ij','--index', help='i,j indices within the tile (if known - bypasses search for closest model point to lon/lat location)', nargs=2, type=int) parser.add_argument('-g', '--grid_dir', help='directory path containing FV3 tile supergrid files', required=True) +parser.add_argument('-ic','--lsm_dir', help='directory path containing FV3 tile IC files', required=True) parser.add_argument('-t', '--tile', help='tile of desired point (if known - bypasses tile search if present)', type=int, choices=range(1,7)) ############################################################################### @@ -43,6 +44,7 @@ def parse_arguments(): location = args.location index = args.index grid_dir = args.grid_dir + lsm_dir = args.lsm_dir tile = args.tile #validate args @@ -50,6 +52,10 @@ def parse_arguments(): message = 'The directory {0} does not exist'.format(grid_dir) logging.critical(message) raise Exception(message) + if not os.path.exists(lsm_dir): + message = 'The directory {0} does not exist'.format(lsm_dir) + logging.critical(message) + raise Exception(message) if not index: if not 0 <= location[0] <= 360 : @@ -62,7 +68,7 @@ def parse_arguments(): logging.critical(message) raise Exception(message) - return (location, index, grid_dir, tile) + return (location, index, grid_dir, lsm_dir, tile) def setup_logging(): """Sets up the logging module.""" @@ -108,20 +114,20 @@ def find_tile(loc, dir): edge_1_lon = longitude[0,:] edge_1_lat = latitude[0,:] - edge_1 = zip(edge_1_lon, edge_1_lat) + edge_1 = list(zip(edge_1_lon, edge_1_lat)) edge_2_lon = longitude[:,-1] edge_2_lat = latitude[:,-1] - edge_2 = zip(edge_2_lon, edge_2_lat) + edge_2 = list(zip(edge_2_lon, edge_2_lat)) edge_3_lon = longitude[-1,:] edge_3_lat = latitude[-1,:] - edge_3 = zip(edge_3_lon, edge_3_lat) + edge_3 = list(zip(edge_3_lon, edge_3_lat)) edge_3.reverse() #need to reverse the direction of this edge to form a regular polygon edge_4_lon = longitude[:,0] edge_4_lat = latitude[:,0] - edge_4 = zip(edge_4_lon, edge_4_lat) + edge_4 = list(zip(edge_4_lon, edge_4_lat)) edge_4.reverse() #need to reverse the direction of this edge to form a regular polygon polygon_points = edge_1 + edge_2 + edge_3 + edge_4 @@ -231,9 +237,9 @@ def find_lon_lat_of_indices(indices, dir, tile): return (longitude[indices[1],indices[0]], latitude[indices[1],indices[0]]) -def get_UFS_surface_fix_data(dir, tile, i, j): +def get_UFS_surface_fix_data(fix_dir, tile, i, j): - fix_dir = dir + '/fix_sfc' + #fix_dir = dir + '/fix_sfc' filename_pattern = '*facsf.tile{0}.nc'.format(tile) for f_name in os.listdir(fix_dir): @@ -388,36 +394,36 @@ def main(): setup_logging() #read in arguments - (location, indices, grid_dir, tile) = parse_arguments() + (location, indices, grid_dir, lsm_dir, tile) = parse_arguments() #find tile containing the point using the supergrid if no tile is specified if not tile: - tile = find_tile(location, grid_dir) + tile = int(find_tile(location, grid_dir)) if tile < 0: message = 'No tile was found for location {0}'.format(location) logging.critical(message) raise Exception(message) - print 'Tile found: {0}'.format(tile) + print('Tile found: {0}'.format(tile)) #find index of closest point in the tile if indices are not specified if not indices: (tile_j, tile_i, point_lon, point_lat, dist_min) = find_loc_indices(location, grid_dir, tile) - print 'The closest point in tile {0} has indices [{1},{2}]'.format(tile,tile_i,tile_j) - print 'This index has a central longitude/latitude of [{0},{1}]'.format(point_lon,point_lat) - print 'This grid cell is approximately {0} km away from the desired location of {1} {2}'.format(dist_min/1.0E3,location[0],location[1]) + print('The closest point in tile {0} has indices [{1},{2}]'.format(tile,tile_i,tile_j)) + print('This index has a central longitude/latitude of [{0},{1}]'.format(point_lon,point_lat)) + print('This grid cell is approximately {0} km away from the desired location of {1} {2}'.format(dist_min/1.0E3,location[0],location[1])) else: tile_i = indices[0] tile_j = indices[1] #still need to grab the lon/lat if the tile and indices are supplied (point_lon, point_lat) = find_lon_lat_of_indices(indices, grid_dir, tile) - print 'This index has a central longitude/latitude of [{0},{1}]'.format(point_lon,point_lat) + print('This index has a central longitude/latitude of [{0},{1}]'.format(point_lon,point_lat)) #get grid cell area if not given #area = get_UFS_grid_area(grid_dir, tile, tile_i, tile_j) - (facsf, facwf, max_snow_alb, alvsf, alvwf, alnsf, alnwf, substrate_t, veg_greenness, max_veg_greenness, min_veg_greenness, slope_type, soil_type, veg_type) = get_UFS_surface_fix_data(grid_dir, tile, tile_i, tile_j) + (facsf, facwf, max_snow_alb, alvsf, alvwf, alnsf, alnwf, substrate_t, veg_greenness, max_veg_greenness, min_veg_greenness, slope_type, soil_type, veg_type) = get_UFS_surface_fix_data(lsm_dir, tile, tile_i, tile_j) print("facsf,facwf={0},{1}".format(facsf,facwf)) print("maximum_snow_albedo={}".format(max_snow_alb)) diff --git a/scm/etc/scripts/UFS_forcing_ensemble_generator.py b/scm/etc/scripts/UFS_forcing_ensemble_generator.py new file mode 100755 index 000000000..a685c3334 --- /dev/null +++ b/scm/etc/scripts/UFS_forcing_ensemble_generator.py @@ -0,0 +1,212 @@ +#!/usr/bin/env python + +############################################################################### +# Dependencies +############################################################################### +import argparse +import os +from netCDF4 import Dataset +import matplotlib.pyplot as plt +import xarray as xr +import numpy as np +import random + +############################################################################### +# Argument list +############################################################################### +parser = argparse.ArgumentParser() +parser.add_argument('-d', '--dir', help='Directory path containing UFS output files', required=False) +parser.add_argument('-i', '--dir_ic', help='Directory path containing FV3 input files', required=False) +parser.add_argument('-g', '--dir_grid', help='directory path containing FV3 tile supergrid files', required=False) +parser.add_argument('-f', '--dir_forcing', help='Directory path containing physics diag files', required=False) +parser.add_argument('-rt', '--dir_ufs_rt', help='Directory path containing UFS regression test output', required=False) +parser.add_argument('-n', '--case_name', help='Name of case', required=True) +parser.add_argument('-lonl', '--lon_limits', help='Longitude range for ensemble, separated by a space', nargs=2, type=float, required=False) +parser.add_argument('-latl', '--lat_limits', help='Latitude range for ensemble, separated by a space', nargs=2, type=float, required=False) +parser.add_argument('-lons', '--lon_list', help='Longitudes for ensemble, separated by a space', nargs='*', type=float, required=False) +parser.add_argument('-lats', '--lat_list', help='Latitudes for ensemble, separated by a space', nargs='*', type=float, required=False) +parser.add_argument('-nens', '--nensmembers', help='Number of SCM UFS ensemble memebers to create', type=int, required=False) +parser.add_argument('-dt', '--timestep', help='SCM timestep, in seconds', type=int, default = 3600) +parser.add_argument('-fhz', '--fhzero', help='UFS frequency, in hours, for emptying diagnostic buckets.', type=int, default = 1) +parser.add_argument('-cres', '--C_RES', help='UFS spatial resolution', type=int, default = 96) +parser.add_argument('-sdf', '--suite', help='CCPP suite definition file to use for ensemble', default = 'SCM_GFS_v16') +parser.add_argument('-sc', '--save_comp', help='Flag to save a file with UFS data for comparisons', action='store_true') +parser.add_argument('-near', '--use_nearest', help='flag to indicate using the nearest UFS history file gridpoint, no regridding',action='store_true') + +############################################################################### +# Main program +############################################################################### +def main(): + # Get command line arguments + args = parser.parse_args() + + if (args.dir): + if (not args.dir_ic): args.dir_ic = args.dir + "/INPUT/" + if (not args.dir_grid): args.dir_grid = args.dir + "/INPUT/" + if (not args.dir_forcing): args.dir_forcing = args.dir + + # Error checking + if (args.lon_limits and args.lon_list): + print("ERROR: Can't provide explicit longitude(s) AND a longitude range") + exit() + if (args.lat_limits and args.lat_list): + print("ERROR: Can't provide explicit latitude(s) AND a latitude range") + exit() + if (args.lon_limits or args.lat_limits) and not args.nensmembers: + print("ERROR: Longitude/Latitude range provided, but NOT ensemble count.") + exit() + + if (args.nensmembers): + npts = args.nensmembers + if (args.lat_list or args.lon_list): + print("ERROR: Can't provide explicit lon/lat range AND number of points for ensemble generation.") + exit() + else: + if (args.lon_list and args.lat_list): + if (len(args.lon_list) == len(args.lat_list)): + npts = len(args.lon_list) + else: + print("ERROR: Number of longitude/latitudes are inconsistent") + exit() + + # Make sure that SCM_WORK has been set. + try: + dir_scm = os.getenv('SCM_WORK')+'/' + except: + print("Environment variable SCM_WORK not set. Stopping.") + exit() + + ########################################################################### + # + # Set longitude/latitude + # + ########################################################################### + if (args.nensmembers): + rng1 = np.zeros((npts), dtype=float) + rng2 = np.zeros((npts), dtype=float) + lons = np.zeros((npts), dtype=float) + lats = np.zeros((npts), dtype=float) + for ipt in range(npts): + # Here the seed is set to give the same set of points each time. + random.seed(ipt) + rng1[ipt] = random.randint(1,1000)*0.001 + rng2[ipt] = random.randint(2,1000)*0.001 + # + if args.lat_limits: + lats[ipt] = args.lat_limits[0] + (args.lat_limits[1]-args.lat_limits[0])*rng1[ipt] + else: + lats[ipt] = rng1[ipt]*180-90 + if args.lon_limits: + lons[ipt] = args.lon_limits[0] + (args.lon_limits[1]-args.lon_limits[0])*rng2[ipt] + else: + lons[ipt] = rng2[ipt]*360 + ########################################################################### + # + # Use longitude and latitude provided + # + ########################################################################### + else: + lons = np.asarray(args.lon_list) + lats = np.asarray(args.lat_list) + + ########################################################################### + # + # Create SCM case configuration (etc/case_config) file. + # + ########################################################################### + + # How many timesteps between clearing the diagnostic buckets? + n_itt_diag = int(args.fhzero*3600/args.timestep) + # + n_itt_out = int(n_itt_diag/args.fhzero) + + # + case_config =[{"name": "input_type", "values": str(1)}, \ + {"name": "dt", "values": str(args.timestep)}, \ + {"name": "C_RES", "values": str(args.C_RES)}] + + # What, if any, options neeed to be passsed to UFS_IC_generator.py? + com_config = '' + if args.save_comp: com_config = com_config + ' -sc' + if args.use_nearest: com_config = com_config + ' -near' + + # Create inputs to SCM + case_list = "" + case_list_nf = "" + count = 0 + run_list = [] + for pt in range(0,npts): + # Call UFS_IC_generator.py + case_name = args.case_name +"_n" + str(pt).zfill(3) + file_scminput = dir_scm+"scm/data/processed_case_input/"+case_name+"_SCM_driver.nc" + com = "./UFS_IC_generator.py -l " +str(lons[pt]) + " " + str(lats[pt]) + \ + " -i " + args.dir_ic + " -g " + args.dir_grid + " -f " + args.dir_forcing + " -n " + case_name + com_config + print(com) + os.system(com) + + # Add case to ensemble list. + case_list = case_list + '"'+case_name+'"' + if (count != npts-1): case_list = case_list + ', ' + + # What is the surface type? (get from SCM input file) + dataset = xr.open_dataset(file_scminput) + sfc_type = int(np.round_(dataset.slmsk.values[0])) + + # Create case_config file(s) + fileOUT = dir_scm+"scm/etc/case_config/"+case_name+".nml" + fileID = open(fileOUT, 'w') + fileID.write('$case_config') + fileID.write('\n') + fileID.write('case_name = ' + "'" + case_name + "',") + fileID.write('\n') + fileID.write('sfc_type = ' + str(sfc_type) + ",") + fileID.write('\n') + for opts in case_config: + fileID.write(opts["name"] + ' = ' + opts["values"] + ",") + fileID.write('\n') + fileID.write('$end') + fileID.write('\n') + fileID.close() + + # Add case to dictionary to be used by run_scm.py + run_list.append({"case": case_name, "suite": args.suite}) + + # + count = count + 1 + + ########################################################################### + # + # Create "multirun file list" needed by run_scm.py + # + ########################################################################### + com = "mkdir -p "+dir_scm+"scm/bin/" + print(com) + os.system(com) + fileOUT = "scm_ufsens_"+case_name+".py" + fileID = open(dir_scm+"scm/bin/"+fileOUT, 'w') + fileID.write('run_list = [') + fileID.write('\n') + for run in run_list: + #print(' {"case": "' , run["case"] , '", "suite": "' , run["suite"] , '"},') + fileID.write(' {"case": "' + run["case"] + '", "suite": "' + run["suite"] + '"},') + fileID.write('\n') + fileID.write(' ]') + fileID.close() + + ########################################################################### + # + # Display run commands + # + ########################################################################### + print("-------------------------------------------------------------------------------------------") + print("Command(s) to execute in ccpp-scm/scm/bin/: ") + print(" ") + print("./run_scm.py --npz_type gfs --file " + fileOUT + " --n_itt_diag " + \ + str(n_itt_diag) + " --n_itt_out " + str(n_itt_out) + " --timestep " + \ + str(args.timestep)) + print("") + print("") + print("-------------------------------------------------------------------------------------------") + +if __name__ == '__main__': + main() diff --git a/scm/etc/scripts/fv3_remap.py b/scm/etc/scripts/fv3_remap.py new file mode 100755 index 000000000..ab384fa0a --- /dev/null +++ b/scm/etc/scripts/fv3_remap.py @@ -0,0 +1,1681 @@ +#!/usr/bin/env python + +import numpy as np +import math + +r3 = 1./3. +r23 = 2./3. +r12 = 1./12. + +def ppm_limiters(dm, a4, itot, lmt): + # INPUT PARAMETERS: + #real , intent(in):: dm(*) !< Linear slope + #integer, intent(in) :: itot !< Total Longitudes + #integer, intent(in) :: lmt !< 0: Standard PPM constraint 1: Improved full monotonicity constraint + # !< (Lin) 2: Positive definite constraint + # !< 3: do nothing (return immediately) + #! INPUT/OUTPUT PARAMETERS: + # real , intent(inout) :: a4(4,*) !< PPM array AA <-- a4(1,i) AL <-- a4(2,i) AR <-- a4(3,i) A6 <-- a4(4,i) + # ! LOCAL VARIABLES: + # real qmp + # real da1, da2, a6da + # real fmin + # integer i + + #! Developer: S.-J. Lin + if (lmt == 3): + return a4 + + if (lmt == 0): + #! Standard PPM constraint + for i in range(0,itot): + if(dm[i] == 0.): + a4[1,i] = a4[0,i] + a4[2,i] = a4[0,i] + a4[3,i] = 0. + else: + da1 = a4[2,i] - a4[1,i] + da2 = da1*da1 + a6da = a4[3,i]*da1 + if(a6da < -da2): + a4[3,i] = 3.*(a4[1,i]-a4[0,i]) + a4[2,i] = a4[1,i] - a4[3,i] + elif(a6da > da2): + a4[3,i] = 3.*(a4[2,i]-a4[0,i]) + a4[1,i] = a4[2,i] - a4[3,i] + elif (lmt == 1): + #! Improved full monotonicity constraint (Lin 2004) + #! Note: no need to provide first guess of A6 <-- a4(4,i) + for i in range(0,itot): + qmp = 2.*dm[i] + a4[1,i] = a4[0,i]-np.sign(qmp)*np.abs(np.min([np.abs(qmp),np.abs(a4[1,i]-a4[0,i])])) + a4[2,i] = a4[0,i]+np.sign(qmp)*np.abs(np.min([np.abs(qmp),np.abs(a4[2,i]-a4[0,i])])) + a4[3,i] = 3.*( 2.*a4[0,i] - (a4[1,i]+a4[2,i]) ) + elif (lmt == 2): + #! Positive definite constraint + for i in range(0,itot): + if( np.abs(a4[2,i]-a4[1,i]) < -a4[3,i] ): + fmin = a4[0,i]+0.25*(a4[2,i]-a4[1,i])**2/a4[3,i]+a4[3,i]*r12 + if( fmin < 0.): + if(a4[0,i] < a4[2,i] and a4[0,i] < a4[1,i]): + a4[2,i] = a4[0,i] + a4[1,i] = a4[0,i] + a4[3,i] = 0. + elif(a4[2,i] > a4[1,i]): + a4[3,i] = 3.*(a4[1,i]-a4[0,i]) + a4[2,i] = a4[1,i] - a4[3,i] + else: + a4[3,i] = 3.*(a4[2,i]-a4[0,i]) + a4[1,i] = a4[2,i] - a4[3,i] + return a4 + +def cs_limiters(im, extm, a4, iv): + #integer, intent(in) :: im + #integer, intent(in) :: iv + #logical, intent(in) :: extm(im) + #real , intent(inout) :: a4(4,im) !< PPM array + #! LOCAL VARIABLES: + #real da1, da2, a6da + #integer i + + if (iv == 0): + #! Positive definite constraint + for i in range(0,im): + if (a4[0,i] <= 0.): + a4[1,i] = a4[0,i] + a4[2,i] = a4[0,i] + a4[3,i] = 0. + else: + if (np.abs(a4[2,i]-a4[1,i]) < -a4[3,i]): + if ((a4[0,i]+0.25*(a4[2,i]-a4[1,i])**2/a4[3,i]+a4[3,i]*r12) < 0.): + #! local minimum is negative + if (a4[0,i] < a4[2,i] and a4[0,i] < a4[1,i]): + a4[2,i] = a4[0,i] + a4[1,i] = a4[0,i] + a4[3,i] = 0. + elif (a4[2,i] > a4[1,i]): + a4[3,i] = 3.*(a4[1,i]-a4[0,i]) + a4[2,i] = a4[1,i] - a4[3,i] + else: + a4[3,i] = 3.*(a4[2,i]-a4[0,i]) + a4[1,i] = a4[2,i] - a4[3,i] + elif (iv == 1): + for i in range(0,im): + if ((a4[0,i]-a4[1,i])*(a4[0,i]-a4[2,i]) >= 0.): + a4[1,i] = a4[0,i] + a4[2,i] = a4[0,i] + a4[3,i] = 0. + else: + da1 = a4[2,i] - a4[1,i] + da2 = da1**2 + a6da = a4[3,i]*da1 + if (a6da < -da2): + a4[3,i] = 3.*(a4[1,i]-a4[0,i]) + a4[2,i] = a4[1,i] - a4[3,i] + elif (a6da > da2): + a4[3,i] = 3.*(a4[2,i]-a4[0,i]) + a4[1,i] = a4[2,i] - a4[3,i] + else: + #! Standard PPM constraint + for i in range(0,im): + if (extm[i]): + a4[1,i] = a4[0,i] + a4[2,i] = a4[0,i] + a4[3,i] = 0. + else: + da1 = a4[2,i] - a4[1,i] + da2 = da1**2 + a6da = a4[3,i]*da1 + if (a6da < -da2): + a4[3,i] = 3.*(a4[1,i]-a4[0,i]) + a4[2,i] = a4[1,i] - a4[3,i] + elif (a6da > da2): + a4[3,i] = 3.*(a4[2,i]-a4[0,i]) + a4[1,i] = a4[2,i] - a4[3,i] + return a4 + +def ppm_profile(a4, delp, km, i1, i2, iv, kord): + + #! INPUT PARAMETERS: + #integer, intent(in):: iv !< iv =-1: winds iv = 0: positive definite scalars iv = 1: others iv = 2: temp (if remap_t) and w (iv=-2) + #integer, intent(in):: i1 !< Starting longitude + #integer, intent(in):: i2 !< Finishing longitude + #integer, intent(in):: km !< Vertical dimension + #integer, intent(in):: kord !< Order (or more accurately method no.): + #real , intent(in):: delp(i1:i2,km) !< Layer pressure thickness + #!INPUT/OUTPUT PARAMETERS: + #real , intent(inout):: a4(4,i1:i2,km) !< Interpolated values + #! DESCRIPTION: + #! + #! Perform the piecewise parabolic reconstruction + #! + #! !REVISION HISTORY: + #! S.-J. Lin revised at GFDL 2007 + #!----------------------------------------------------------------------- + #! local arrays: + it = i2 - i1 + 1 + + dc = np.zeros((it,km)) + h2 = np.zeros((it,km)) + delq = np.zeros((it,km)) + df2 = np.zeros((it,km)) + d4 = np.zeros((it,km)) + #real dc(i1:i2,km) + #real h2(i1:i2,km) + #real delq(i1:i2,km) + #real df2(i1:i2,km) + #real d4(i1:i2,km) + + #! local scalars: + #integer i, k, km1, lmt, it + #real fac + #real a1, a2, c1, c2, c3, d1, d2 + #real qm, dq, lac, qmp, pmp + + + + km1 = km - 1 + + for k in range(1,km): + for i in range(i1-1,i2): + delq[i,k-1] = a4[0,i,k] - a4[0,i,k-1] + d4[i,k ] = delp[i,k-1] + delp[i,k] + + for k in range(1,km1): + for i in range(i1-1,i2): + c1 = (delp[i,k-1]+0.5*delp[i,k])/d4[i,k+1] + c2 = (delp[i,k+1]+0.5*delp[i,k])/d4[i,k] + df2[i,k] = delp[i,k]*(c1*delq[i,k] + c2*delq[i,k-1]) / (d4[i,k]+delp[i,k+1]) + dc[i,k] = np.sign(df2[i,k])*np.abs(np.min([np.abs(df2[i,k]), np.max([a4[0,i,k-1],a4[0,i,k],a4[0,i,k+1]])-a4[0,i,k], a4[0,i,k]-np.min([a4[0,i,k-1],a4[0,i,k],a4[0,i,k+1]])])) + + #!----------------------------------------------------------- + #! 4th order interpolation of the provisional cell edge value + #!----------------------------------------------------------- + + for k in range(2,km1): + for i in range(i1-1,i2): + c1 = delq[i,k-1]*delp[i,k-1] / d4[i,k] + a1 = d4[i,k-1] / (d4[i,k] + delp[i,k-1]) + a2 = d4[i,k+1] / (d4[i,k] + delp[i,k]) + a4[1,i,k] = a4[0,i,k-1] + c1 + 2./(d4[i,k-1]+d4[i,k+1]) * (delp[i,k]*(c1*(a1 - a2)+a2*dc[i,k-1]) - delp[i,k-1]*a1*dc[i,k]) + + #! Area preserving cubic with 2nd deriv. = 0 at the boundaries + #! Top + for i in range(i1-1,i2): + d1 = delp[i,1] + d2 = delp[i,2] + qm = (d2*a4[0,i,0]+d1*a4[0,i,1]) / (d1+d2) + dq = 2.*(a4[0,i,1]-a4[0,i,0]) / (d1+d2) + c1 = 4.*(a4[1,i,2]-qm-d2*dq) / ( d2*(2.*d2*d2+d1*(d2+3.*d1)) ) + c3 = dq - 0.5*c1*(d2*(5.*d1+d2)-3.*d1*d1) + a4[1,i,1] = qm - 0.25*c1*d1*d2*(d2+3.*d1) + #! Top edge: + #!------------------------------------------------------- + a4[1,i,0] = d1*(2.*c1*d1**2-c3) + a4[1,i,1] + #!------------------------------------------------------- + #! a4[2,i,1] = (12./7.)*a4[1,i,1]-(13./14.)*a4[1,i,2]+(3./14.)*a4[1,i,3] + #!------------------------------------------------------- + #! No over- and undershoot condition + a4[1,i,1] = np.max([a4[1,i,1], np.min([a4[0,i,0], a4[0,i,1]])]) + a4[1,i,1] = np.min([a4[1,i,1], np.max([a4[0,i,0], a4[0,i,1]])]) + dc[i,0] = 0.5*(a4[1,i,1] - a4[0,i,0]) + + #! Enforce monotonicity within the top layer + + if (iv == 0): + for i in range(i1-1,i2): + a4[1,i,0] = np.max([0., a4[1,i,0]]) + a4[1,i,1] = np.max([0., a4[1,i,1]]) + elif (iv == -1): + for i in range(i1-1,i2): + if (a4[1,i,0]*a4[0,i,0] <= 0. ): + a4[1,i,0] = 0. + elif (np.abs(iv) == 2): + for i in range(i1-1,i2): + a4[1,i,0] = a4[0,i,0] + a4[2,i,0] = a4[0,i,0] + + #! Bottom + #! Area preserving cubic with 2nd deriv. = 0 at the surface + for i in range(i1-1,i2): + d1 = delp[i,km-1] + d2 = delp[i,km1-1] + qm = (d2*a4[0,i,km-1]+d1*a4[0,i,km1-1]) / (d1+d2) + dq = 2.*(a4[0,i,km1-1]-a4[0,i,km-1]) / (d1+d2) + c1 = (a4[1,i,km1-1]-qm-d2*dq) / (d2*(2.*d2*d2+d1*(d2+3.*d1))) + c3 = dq - 2.0*c1*(d2*(5.*d1+d2)-3.*d1*d1) + a4[1,i,km-1] = qm - c1*d1*d2*(d2+3.*d1) + #! Bottom edge: + #!----------------------------------------------------- + a4[2,i,km-1] = d1*(8.*c1*d1**2-c3) + a4[1,i,km-1] + #! dc[i,km] = 0.5*(a4[3,i,km] - a4[1,i,km]) + #!----------------------------------------------------- + #! a4[3,i,km] = (12./7.)*a4[1,i,km]-(13./14.)*a4[1,i,km-1]+(3./14.)*a4[1,i,km-2] + #! No over- and under-shoot condition + a4[1,i,km-1] = np.max([a4[1,i,km-1], np.min([a4[0,i,km-1], a4[0,i,km1-1]])]) + a4[1,i,km-1] = np.min([a4[1,i,km-1], np.max([a4[0,i,km-1], a4[0,i,km1-1]])]) + dc[i,km-1] = 0.5*(a4[0,i,km-1] - a4[1,i,km-1]) + + #! Enforce constraint on the "slope" at the surface + + ##ifdef BOT_MONO + # do i=i1,i2 + # a4(4,i,km) = 0 + # if( a4(3,i,km) * a4(1,i,km) <= 0. ) a4(3,i,km) = 0. + # d1 = a4(1,i,km) - a4(2,i,km) + # d2 = a4(3,i,km) - a4(1,i,km) + # if ( d1*d2 < 0. ) then + # a4(2,i,km) = a4(1,i,km) + # a4(3,i,km) = a4(1,i,km) + # else + # dq = sign(min(abs(d1),abs(d2),0.5*abs(delq(i,km-1))), d1) + # a4(2,i,km) = a4(1,i,km) - dq + # a4(3,i,km) = a4(1,i,km) + dq + # endif + # enddo + ##else + if (iv == 0): + for i in range(i1-1,i2): + a4[1,i,km-1] = np.max([0.,a4[1,i,km-1]]) + a4[2,i,km-1] = np.max([0.,a4[2,i,km-1]]) + elif (iv < 0): + for i in range(i1-1,i2): + if (a4[0,i,km-1]*a4[2,i,km-1] <= 0.): + a4[2,i,km-1] = 0. + ##endif + + for k in range(0,km1): + for i in range(i1-1,i2): + a4[2,i,k] = a4[1,i,k+1] + + #!----------------------------------------------------------- + #! f(s) = AL + s*[(AR-AL) + A6*(1-s)] ( 0 <= s <= 1 ) + #!----------------------------------------------------------- + #! Top 2 and bottom 2 layers always use monotonic mapping + for k in range(0,2): + for i in range(i1-1,i2): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + a4[:,:,k] = ppm_limiters(dc[:,k], a4[:,:,k], it, 0) + + if (kord >= 7): + #!----------------------- + #! Huynh's 2nd constraint + #!----------------------- + for k in range(1,km1): + for i in range(i1-1,i2): + #! Method#1 + #! h2[i,k] = delq[i,k] - delq[i,k-1] + #! Method#2 - better + h2[i,k] = 2.*(dc[i,k+1]/delp[i,k+1] - dc[i,k-1]/delp[i,k-1]) / (delp[i,k]+0.5*(delp[i,k-1]+delp[i,k+1])) * delp[i,k]**2 + #! Method#3 + #!!! h2[i,k] = dc[i,k+1] - dc[i,k-1] + fac = 1.5 #! original quasi-monotone + + for k in range(2,km-2): + for i in range(i1-1,i2): + #! Right edges + #! qmp = a4[1,i,k] + 2.0*delq[i,k-1] + #! lac = a4[1,i,k] + fac*h2[i,k-1] + 0.5*delq[i,k-1] + pmp = 2.*dc[i,k] + qmp = a4[0,i,k] + pmp + lac = a4[0,i,k] + fac*h2[i,k-1] + dc[i,k] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], qmp, lac])]), np.max([a4[0,i,k], qmp, lac])]) + #! Left edges + #! qmp = a4[1,i,k] - 2.0*delq[i,k] + #! lac = a4[1,i,k] + fac*h2[i,k+1] - 0.5*delq[i,k] + #! + qmp = a4[0,i,k] - pmp + lac = a4[0,i,k] + fac*h2[i,k+1] - dc[i,k] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], qmp, lac])]), np.max([a4[0,i,k], qmp, lac])]) + #!------------- + #! Recompute A6 + #!------------- + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + #! Additional constraint to ensure positivity when kord=7 + if (iv == 0 and kord >= 6): + a4[:,:,k] = ppm_limiters(dc[:,k], a4[:,:,k], it, 2) + else: + lmt = kord - 3 + lmt = np.max([0, lmt]) + if (iv == 0): + lmt = np.min([2, lmt]) + + for k in range(2,km-2): + if( kord != 4): + for i in range(i1-1,i2): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + + if(kord != 6): + a4[:,:,k] = ppm_limiters(dc[:,k], a4[:,:,k], it, lmt) + + for k in range(km1-1,km): + for i in range(i1-1,i2): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + a4[:,:,k] = ppm_limiters(dc[:,k], a4[:,:,k], it, 0) + + return a4 + +def scalar_profile(qs, a4, delp, km, i1, i2, iv, kord, qmin): + #! Optimized vertical profile reconstruction: + #! Latest: Apr 2008 S.-J. Lin, NOAA/GFDL + #integer, intent(in):: i1, i2 + #integer, intent(in):: km !< vertical dimension + #integer, intent(in):: iv !< iv =-1: winds iv = 0: positive definite scalars iv = 1: others + #integer, intent(in):: kord + #real, intent(in) :: qs(i1:i2) + #real, intent(in) :: delp(i1:i2,km) !< Layer pressure thickness + #real, intent(inout):: a4(4,i1:i2,km) !< Interpolated values + #real, intent(in):: qmin + #!----------------------------------------------------------------------- + im = i2 - i1 + 1 + extm = np.zeros([im,km],dtype=bool) + ext5 = np.zeros([im,km],dtype=bool) + ext6 = np.zeros([im,km],dtype=bool) + + gam = np.zeros([im,km]) + q = np.zeros([im,km+1]) + d4 = np.zeros([im]) + + #logical, dimension(i1:i2,km):: extm, ext5, ext6 + #real gam(i1:i2,km) + #real q(i1:i2,km+1) + #real d4(i1:i2) + #real bet, a_bot, grat + #real pmp_1, lac_1, pmp_2, lac_2, x0, x1 + #integer i, k, im + + if (iv == -2): + for i in range(0,im): + gam[i,1] = 0.5 + q[i,0] = 1.5*a4[0,i,0] + for k in range(1,km-1): + for i in range(0,im): + grat = delp[i,k-1] / delp[i,k] + bet = 2. + grat + grat - gam[i,k] + q[i,k] = (3.*(a4[0,i,k-1]+a4[0,i,k]) - q[i,k-1])/bet + gam[i,k+1] = grat / bet + for i in range(0,im): + grat = delp[i,km-2] / delp[i,km-1] + q[i,km-1] = (3.*(a4[0,i,km-2]+a4[0,i,km-1]) - grat*qs[i] - q[i,km-2]) / (2. + grat + grat - gam[i,km-1]) + q[i,km] = qs[i] + for k in range(km-2,-1,-1): + for i in range(0,im): + q[i,k] = q[i,k] - gam[i,k+1]*q[i,k+1] + else: + for i in range(0,im): + grat = delp[i,1] / delp[i,0] #! grid ratio + bet = grat*(grat+0.5) + q[i,0] = ((grat+grat)*(grat+1.)*a4[0,i,0] + a4[0,i,1]) / bet + gam[i,0] = ( 1. + grat*(grat+1.5) ) / bet + for k in range(1,km): + for i in range(0,im): + d4[i] = delp[i,k-1] / delp[i,k] + bet = 2. + d4[i] + d4[i] - gam[i,k-1] + q[i,k] = ( 3.*(a4[0,i,k-1]+d4[i]*a4[0,i,k]) - q[i,k-1] )/bet + gam[i,k] = d4[i] / bet + for i in range(0,im): + a_bot = 1. + d4[i]*(d4[i]+1.5) + q[i,km] = (2.*d4[i]*(d4[i]+1.)*a4[0,i,km-1]+a4[0,i,km-2]-a_bot*q[i,km-1]) / ( d4[i]*(d4[i]+0.5) - a_bot*gam[i,km-1]) + for k in range(km-1,-1,-1): + for i in range(0,im): + q[i,k] = q[i,k] - gam[i,k]*q[i,k+1] + + + #!----- Perfectly linear scheme -------------------------------- + if (np.abs(kord) > 16): + for k in range(0,km): + for i in range(0,im): + a4[1,i,k] = q[i,k] + a4[2,i,k] = q[i,k+1] + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + return a4 + + #!----- Perfectly linear scheme -------------------------------- + #!------------------ + #! Apply constraints + #!------------------ + + #! Apply *large-scale* constraints + for i in range(0,im): + q[i,1] = np.min([q[i,1], np.max([a4[0,i,0], a4[0,i,1]])]) + q[i,1] = np.max([q[i,1], np.min([a4[0,i,0], a4[0,i,1]])]) + + for k in range(1,km): + for i in range(0,im): + gam[i,k] = a4[0,i,k] - a4[0,i,k-1] + + #! Interior: + for k in range(2,km-1): + for i in range(0,im): + if (gam[i,k-1]*gam[i,k+1] > 0.): + #! Apply large-scale constraint to ALL fields if not local max/min + q[i,k] = np.min([q[i,k], np.max([a4[0,i,k-1],a4[0,i,k]])]) + q[i,k] = np.max([q[i,k], np.min([a4[0,i,k-1],a4[0,i,k]])]) + else: + if (gam[i,k-1] > 0): + #! There exists a local max + q[i,k] = np.max([q[i,k], np.min([a4[0,i,k-1],a4[0,i,k]])]) + else: + #! There exists a local min + q[i,k] = np.min([q[i,k], np.max([a4[0,i,k-1],a4[0,i,k]])]) + if (iv == 0): + q[i,k] = np.max([0., q[i,k]]) + + #! Bottom: + for i in range(0,im): + q[i,km-1] = np.min([q[i,km-1], np.max([a4[0,i,km-2], a4[0,i,km-1]])]) + q[i,km-1] = np.max([q[i,km-1], np.min([a4[0,i,km-2], a4[0,i,km-1]])]) + + for k in range(0,km): + for i in range(0,im): + a4[1,i,k] = q[i,k ] + a4[2,i,k] = q[i,k+1] + + for k in range(0,km): + if (k == 0 or k == km-1): + for i in range(0,im): + extm[i,k] = (a4[1,i,k]-a4[0,i,k]) * (a4[2,i,k]-a4[0,i,k]) > 0. + else: + for i in range(0,im): + extm[i,k] = gam[i,k]*gam[i,k+1] < 0. + if ( np.abs(kord) > 9 ): + for i in range(0,im): + x0 = 2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k]) + x1 = np.abs(a4[1,i,k]-a4[2,i,k]) + a4[3,i,k] = 3.*x0 + ext5[i,k] = np.abs(x0) > x1 + ext6[i,k] = np.abs(a4[3,i,k]) > x1 + + #!--------------------------- + #! Apply subgrid constraints: + #!--------------------------- + #! f(s) = AL + s*[(AR-AL) + A6*(1-s)] ( 0 <= s <= 1 ) + #! Top 2 and bottom 2 layers always use monotonic mapping + + if (iv == 0): + for i in range(0,im): + a4[1,i,0] = np.max([0., a4[1,i,0]]) + elif (iv == -1): + for i in range(0,im): + if ( a4[1,i,0]*a4[0,i,0] <= 0. ): + a4[1,i,0] = 0. + elif (iv == 2): + for i in range(0,im): + a4[1,i,0] = a4[0,i,0] + a4[2,i,0] = a4[0,i,0] + a4[3,i,0] = 0. + + if (iv != 2): + for i in range(0,im): + a4[3,i,0] = 3.*(2.*a4[0,i,0] - (a4[1,i,0]+a4[2,i,0])) + a4[:,:,0] = cs_limiters(im, extm[:,0], a4[:,:,0], 1) + + #! k=1 + for i in range(0,im): + a4[3,i,1] = 3.*(2.*a4[0,i,1] - (a4[1,i,1]+a4[2,i,1])) + a4[:,:,1] = cs_limiters(im, extm[:,1], a4[:,:,1], 2) + + #!------------------------------------- + #! Huynh's 2nd constraint for interior: + #!------------------------------------- + for k in range(2,km-2): + if (np.abs(kord) < 9): + for i in range(0,im): + #! Left edges + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + #! Right edges + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + elif (np.abs(kord) == 9): + for i in range(0,im): + if (extm[i,k] and extm[i,k-1]): + #! grid-scale 2-delta-z wave detected + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + a4[3,i,k] = 0. + elif (extm[i,k] and extm[i,k+1]): + #! grid-scale 2-delta-z wave detected + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + a4[3,i,k] = 0. + elif (extm[i,k] and a4[0,i,k] < qmin): + #! grid-scale 2-delta-z wave detected + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + a4[3,i,k] = 0. + else: + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + #! Check within the smooth region if subgrid profile is non-monotonic + if(np.abs(a4[3,i,k]) > np.abs(a4[1,i,k]-a4[2,i,k])): + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + + elif (np.abs(kord) == 10): + for i in range(0,im): + if (ext5[i,k]): + if (ext5[i,k-1] or ext5[i,k+1]): + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + elif (ext6[i,k-1] or ext6[i,k+1]): + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + pmp_2 = a4[1,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + elif (ext6[i,k]): + if (ext5[i,k-1] or ext5[i,k+1]): + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + elif (np.abs(kord) == 12): + for i in range(0,im): + if (extm[i,k]): + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + a4[3,i,k] = 0. + else: #! not a local extremum + a4[3,i,k] = 6.*a4[0,i,k] - 3.*(a4[1,i,k]+a4[2,i,k]) + #! Check within the smooth region if subgrid profile is non-monotonic + if (np.abs(a4[3,i,k]) > np.abs(a4[1,i,k]-a4[2,i,k])): + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + a4[3,i,k] = 6.*a4[0,i,k] - 3.*(a4[1,i,k]+a4[2,i,k]) + elif (np.abs(kord) == 13): + for i in range(0,im): + if (ext6[i,k]): + if (ext6[i,k-1] and ext6[i,k+1]): + #! grid-scale 2-delta-z wave detected + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + elif (np.abs(kord) == 14): + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + elif (np.abs(kord) == 15): #! Revised abs(kord)=9 scheme + for i in range(0,im): + if (ext5[i,k] and ext5[i,k-1]): + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + elif (ext5[i,k] and ext5[i,k+1]): + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + elif (ext5[i,k] and a4[0,i,k] < qmin): + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + elif (ext6[i,k]): + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + elif (np.abs(kord) == 16): + for i in range(0,im): + if (ext5[i,k]): + if (ext5[i,k-1] or ext5[i,k+1]): + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + elif (ext6[i,k-1] or ext6[i,k+1]): + #! Left edges + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + #! Right edges + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + else: #! kord = 11, 13 + for i in range(0,im): + if (ext5[i,k] and (ext5[i,k-1] or ext5[i,k+1] or a4[0,i,k] < qmin)): + #! Noisy region: + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + a4[3,i,k] = 0. + else: + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + + #! Additional constraint to ensure positivity + if (iv == 0): + a4[:,:,k] = cs_limiters(im, extm[:,k], a4[:,:,k], 0) + + ####end for k in range(3,km-2) + + #!---------------------------------- + #! Bottom layer subgrid constraints: + #!---------------------------------- + if (iv == 0): + for i in range(0,im): + a4[2,i,km-1] = np.max([0., a4[2,i,km-1]]) + elif (iv == -1): + for i in range(0,im): + if (a4[2,i,km-1]*a4[0,i,km-1] <= 0.): + a4[2,i,km-1] = 0. + + for k in range(km-2,km): + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + if (k == (km-2)): + a4[:,:,k] = cs_limiters(im, extm[:,k], a4[:,:,k], 2) + if (k == km-1): + a4[:,:,k] = cs_limiters(im, extm[:,k], a4[:,:,k], 1) + + return a4 + +def map_scalar(km, pe1, q1, qs, kn, pe2, i1, i2, iv, kord, q_min): + #! iv=1 + #integer, intent(in) :: i1 !< Starting longitude + #integer, intent(in) :: i2 !< Finishing longitude + #integer, intent(in) :: iv !< Mode: 0 == constituents 1 == temp 2 == remap temp with cs scheme + #integer, intent(in) :: kord !< Method order + #integer, intent(in) :: km !< Original vertical dimension + #integer, intent(in) :: kn !< Target vertical dimension + #real, intent(in) :: qs(i1:i2) !< bottom BC + #real, intent(in) :: pe1(i1:i2,km+1) !< pressure at layer edges from model top to bottom surface in the original vertical coordinate + #real, intent(in) :: pe2(i1:i2,kn+1) !< pressure at layer edges from model top to bottom surface in the new vertical coordinate + #real, intent(in) :: q1(ibeg:iend,km) !< Field input + #! INPUT/OUTPUT PARAMETERS: + #real, intent(inout):: q2(ibeg:iend,kn) !< Field output + + im = i2 - i1 + 1 + q2 = np.zeros([im,kn]) + #real, intent(in):: q_min + + #! DESCRIPTION: + #! IV = 0: constituents + #! pe1: pressure at layer edges (from model top to bottom surface) + #! in the original vertical coordinate + #! pe2: pressure at layer edges (from model top to bottom surface) + #! in the new vertical coordinate + #! LOCAL VARIABLES: + dp1 = np.zeros([im,km]) + q4 = np.zeros([4,im,km]) + #real dp1(i1:i2,km) + #real q4(4,i1:i2,km) + #real pl, pr, qsum, dp, esl + #integer i, k, l, m, k0 + qsum = 0. + + for k in range(0,km): + for i in range(0,im): + dp1[i,k] = pe1[i,k+1] - pe1[i,k] + q4[0,i,k] = q1[i,k] + + #! Compute vertical subgrid distribution + if (kord > 7): + #print qs, q4, dp1, km, i1, i2, iv, kord, q_min + q4 = scalar_profile(qs, q4, dp1, km, i1, i2, iv, kord, q_min) + else: + q4 = ppm_profile(q4, dp1, km, i1, i2, iv, kord) + + for i in range(0,im): + k0 = 0 + for k in range(0,kn): + next_k = False + for l in range(k0,km): #AKA l-loop + #! locate the top edge: pe2(i,k) + if (pe2[i,k] >= pe1[i,l] and pe2[i,k] <= pe1[i,l+1]): + pl = (pe2[i,k]-pe1[i,l]) / dp1[i,l] + if (pe2[i,k+1] <= pe1[i,l+1]): + #! entire new grid is within the original grid + pr = (pe2[i,k+1]-pe1[i,l]) / dp1[i,l] + q2[i,k] = q4[1,i,l] + 0.5*(q4[3,i,l]+q4[2,i,l]-q4[1,i,l]) * (pr+pl)-q4[3,i,l]*r3*(pr*(pr+pl)+pl**2) + k0 = l + next_k = True + break + #goto 555 #(next iteration of "for k in range(0,kn):" loop) + else: + #! Fractional area... + qsum = (pe1[i,l+1]-pe2[i,k])*(q4[1,i,l]+0.5*(q4[3,i,l]+q4[2,i,l]-q4[1,i,l])*(1.+pl)-q4[3,i,l]*(r3*(1.+pl*(1.+pl)))) + for m in range(l+1,km): #AKA m-loop + #! locate the bottom edge: pe2(i,k+1) + if (pe2[i,k+1] > pe1[i,m+1]): + #! Whole layer + qsum = qsum + dp1[i,m]*q4[0,i,m] + else: + dp = pe2[i,k+1]-pe1[i,m] + esl = dp / dp1[i,m] + qsum = qsum + dp*(q4[1,i,m]+0.5*esl*(q4[2,i,m]-q4[1,i,m]+q4[3,i,m]*(1.-r23*esl))) + k0 = m + #goto 123 #(exit out of l-loop) + break + else: + #GJF: the following if statement is not in the fv_mapz, but it captures the case where pe2[kn] > pe1[km] where the m loop is not entered; without this, the lowest layer values are weird + if (l+1 == km): + dp = pe2[i,kn]-pe1[i,km] + esl = dp / dp1[i,km-1] + qsum = qsum + dp*(q4[1,i,km-1]+0.5*esl*(q4[2,i,km-1]-q4[1,i,km-1]+q4[3,i,km-1]*(1.-r23*esl))) + break #handles goto 123 statement below (exits out of l-loop even if m-loop successfully completes) + #continue + break + #goto 123 #(right before going to next iteration of "for k in range(1,kn):" loop) + if not next_k: + q2[i,k] = qsum / (pe2[i,k+1] - pe2[i,k]) #AKA label 123 + + return q2 + +def map1_q2 (km, pe1, q1, kn, pe2, dp2, i1, i2, iv, kord, q_min): + #! INPUT PARAMETERS: + #integer, intent(in) :: i1, i2 + #integer, intent(in) :: iv !< Mode: 0 == constituents 1 == ??? + #integer, intent(in) :: kord + #integer, intent(in) :: km !< Original vertical dimension + #integer, intent(in) :: kn !< Target vertical dimension + #real, intent(in) :: pe1(i1:i2,km+1) !< pressure at layer edges from model top to bottom surface in the original vertical coordinate + #real, intent(in) :: pe2(i1:i2,kn+1) !< pressure at layer edges from model top to bottom surface in the new vertical coordinate + #real, intent(in) :: q1(i1:i2,km) !< Field input + #real, intent(in) :: dp2(i1:i2,kn) + #real, intent(in) :: q_min + #! INPUT/OUTPUT PARAMETERS: + im = i2 - i1 + 1 + q2 = np.zeros([im,kn]) + #real, intent(inout):: q2(i1:i2,kn) !< Field output + #! LOCAL VARIABLES: + im = i2 - i1 + 1 + qs = np.zeros([im]) + dp1 = np.zeros([im,km]) + q4 = np.zeros([4,im,km]) + #real qs(i1:i2) + #real dp1(i1:i2,km) + #real q4(4,i1:i2,km) + #real pl, pr, qsum, dp, esl + #integer i, k, l, m, k0 + qsum = 0. + for k in range(0,km): + for i in range(0,im): + dp1[i,k] = pe1[i,k+1] - pe1[i,k] + q4[0,i,k] = q1[i,k] + + #! Compute vertical subgrid distribution + if (kord > 7): + q4 = scalar_profile (qs, q4, dp1, km, i1, i2, iv, kord, q_min) + else: + q4 = ppm_profile (q4, dp1, km, i1, i2, iv, kord) + + #! Mapping + for i in range(0,im): + k0 = 0 + for k in range(0,kn): + next_k = False + #print 'k new = ',k + for l in range(k0,km): + #print 'l old = ',l + #! locate the top edge: pe2(i,k) + if (pe2[i,k] >= pe1[i,l] and pe2[i,k] <= pe1[i,l+1]): + pl = (pe2[i,k]-pe1[i,l]) / dp1[i,l] + if (pe2[i,k+1] <= pe1[i,l+1]): + #! entire new grid is within the original grid + pr = (pe2[i,k+1]-pe1[i,l]) / dp1[i,l] + q2[i,k] = q4[1,i,l] + 0.5*(q4[3,i,l]+q4[2,i,l]-q4[1,i,l])*(pr+pl)-q4[3,i,l]*r3*(pr*(pr+pl)+pl**2) + k0 = l + next_k = True + #print 'new grid within old; q2 = ', q2[i,k] + break + #goto 555 #next k-loop iteration + else: + #! Fractional area... + #print k, (pe1[i,l+1]-pe2[i,k]), (q4[1,i,l]+0.5*(q4[3,i,l]+q4[2,i,l]-q4[1,i,l])*(1.+pl)-q4[3,i,l]*(r3*(1.+pl*(1.+pl)))), dp2[i,k] + qsum = (pe1[i,l+1]-pe2[i,k])*(q4[1,i,l]+0.5*(q4[3,i,l]+q4[2,i,l]-q4[1,i,l])*(1.+pl)-q4[3,i,l]*(r3*(1.+pl*(1.+pl)))) + for m in range(l+1,km): + #! locate the bottom edge: pe2(i,k+1) + if (pe2[i,k+1] > pe1[i,m+1]): + #! Whole layer.. + qsum = qsum + dp1[i,m]*q4[0,i,m] + #print 'whole layer, m = ',m + else: + dp = pe2[i,k+1]-pe1[i,m] + esl = dp / dp1[i,m] + qsum = qsum + dp*(q4[1,i,m]+0.5*esl*(q4[2,i,m]-q4[1,i,m]+q4[3,i,m]*(1.-r23*esl))) + k0 = m + #print 'partial layer, m = ',m + #goto 123 #end l-loop + break + else: + #GJF: the following if statement is not in the fv_mapz, but it captures the case where pe2[kn] > pe1[km] where the m loop is not entered; without this, the lowest layer values are weird + if (l+1 == km): + dp = pe2[i,kn]-pe1[i,km] + esl = dp / dp1[i,km-1] + qsum = qsum + dp*(q4[1,i,km-1]+0.5*esl*(q4[2,i,km-1]-q4[1,i,km-1]+q4[3,i,km-1]*(1.-r23*esl))) + break + + break + #goto 123 #end l-loop + if not next_k: + q2[i,k] = qsum / dp2[i,k] #formerly labeled 123 + #print 'result q2 ', q2[i,k] + #print q2 + #exit() + return q2 + +def cs_profile(qs, a4, delp, km, i1, i2, iv, kord): + #! Optimized vertical profile reconstruction: + #! Latest: Apr 2008 S.-J. Lin, NOAA/GFDL + #integer, intent(in):: i1, i2 + #integer, intent(in):: km !< vertical dimension + #integer, intent(in):: iv !< iv =-1: winds iv = 0: positive definite scalars iv = 1: others + #integer, intent(in):: kord + #real, intent(in) :: qs(i1:i2) + #real, intent(in) :: delp(i1:i2,km) !< Layer pressure thickness + #real, intent(inout):: a4(4,i1:i2,km) !< Interpolated values + #real, intent(in):: qmin + #!----------------------------------------------------------------------- + im = i2 - i1 + 1 + extm = np.zeros([im,km],dtype=bool) + ext5 = np.zeros([im,km],dtype=bool) + ext6 = np.zeros([im,km],dtype=bool) + + gam = np.zeros([im,km]) + q = np.zeros([im,km+1]) + d4 = np.zeros([im]) + + #logical, dimension(i1:i2,km):: extm, ext5, ext6 + #real gam(i1:i2,km) + #real q(i1:i2,km+1) + #real d4(i1:i2) + #real bet, a_bot, grat + #real pmp_1, lac_1, pmp_2, lac_2, x0, x1 + #integer i, k, im + + if (iv == -2): + for i in range(0,im): + gam[i,1] = 0.5 + q[i,0] = 1.5*a4[0,i,0] + for k in range(1,km-1): + for i in range(0,im): + grat = delp[i,k-1] / delp[i,k] + bet = 2. + grat + grat - gam[i,k] + q[i,k] = (3.*(a4[0,i,k-1]+a4[0,i,k]) - q[i,k-1])/bet + gam[i,k+1] = grat / bet + for i in range(0,im): + grat = delp[i,km-2] / delp[i,km-1] + q[i,km-1] = (3.*(a4[0,i,km-2]+a4[0,i,km-1]) - grat*qs[i] - q[i,km-2]) / (2. + grat + grat - gam[i,km-1]) + q[i,km] = qs[i] + for k in range(km-2,-1,-1): + for i in range(0,im): + q[i,k] = q[i,k] - gam[i,k+1]*q[i,k+1] + else: + for i in range(0,im): + grat = delp[i,1] / delp[i,0] #! grid ratio + bet = grat*(grat+0.5) + q[i,0] = ((grat+grat)*(grat+1.)*a4[0,i,0] + a4[0,i,1]) / bet + gam[i,0] = ( 1. + grat*(grat+1.5) ) / bet + for k in range(1,km): + for i in range(0,im): + d4[i] = delp[i,k-1] / delp[i,k] + bet = 2. + d4[i] + d4[i] - gam[i,k-1] + q[i,k] = ( 3.*(a4[0,i,k-1]+d4[i]*a4[0,i,k]) - q[i,k-1] )/bet + gam[i,k] = d4[i] / bet + for i in range(0,im): + a_bot = 1. + d4[i]*(d4[i]+1.5) + q[i,km] = (2.*d4[i]*(d4[i]+1.)*a4[0,i,km-1]+a4[0,i,km-2]-a_bot*q[i,km-1]) / ( d4[i]*(d4[i]+0.5) - a_bot*gam[i,km-1]) + for k in range(km-1,-1,-1): + for i in range(0,im): + q[i,k] = q[i,k] - gam[i,k]*q[i,k+1] + + + #!----- Perfectly linear scheme -------------------------------- + if (np.abs(kord) > 16): + for k in range(0,km): + for i in range(0,im): + a4[1,i,k] = q[i,k] + a4[2,i,k] = q[i,k+1] + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + return a4 + + #!----- Perfectly linear scheme -------------------------------- + #!------------------ + #! Apply constraints + #!------------------ + + #! Apply *large-scale* constraints + for i in range(0,im): + q[i,1] = np.min([q[i,1], np.max([a4[0,i,0], a4[0,i,1]])]) + q[i,1] = np.max([q[i,1], np.min([a4[0,i,0], a4[0,i,1]])]) + + for k in range(1,km): + for i in range(0,im): + gam[i,k] = a4[0,i,k] - a4[0,i,k-1] + + #! Interior: + for k in range(2,km-1): + for i in range(0,im): + if (gam[i,k-1]*gam[i,k+1] > 0.): + #! Apply large-scale constraint to ALL fields if not local max/min + q[i,k] = np.min([q[i,k], np.max([a4[0,i,k-1],a4[0,i,k]])]) + q[i,k] = np.max([q[i,k], np.min([a4[0,i,k-1],a4[0,i,k]])]) + else: + if (gam[i,k-1] > 0): + #! There exists a local max + q[i,k] = np.max([q[i,k], np.min([a4[0,i,k-1],a4[0,i,k]])]) + else: + #! There exists a local min + q[i,k] = np.min([q[i,k], np.max([a4[0,i,k-1],a4[0,i,k]])]) + if (iv == 0): + q[i,k] = np.max([0., q[i,k]]) + + #! Bottom: + for i in range(0,im): + q[i,km-1] = np.min([q[i,km-1], np.max([a4[0,i,km-2], a4[0,i,km-1]])]) + q[i,km-1] = np.max([q[i,km-1], np.min([a4[0,i,km-2], a4[0,i,km-1]])]) + + for k in range(0,km): + for i in range(0,im): + a4[1,i,k] = q[i,k ] + a4[2,i,k] = q[i,k+1] + + for k in range(0,km): + if (k == 0 or k == km-1): + for i in range(0,im): + extm[i,k] = (a4[1,i,k]-a4[0,i,k]) * (a4[2,i,k]-a4[0,i,k]) > 0. + else: + for i in range(0,im): + extm[i,k] = gam[i,k]*gam[i,k+1] < 0. + if ( np.abs(kord) > 9 ): + for i in range(0,im): + x0 = 2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k]) + x1 = np.abs(a4[1,i,k]-a4[2,i,k]) + a4[3,i,k] = 3.*x0 + ext5[i,k] = np.abs(x0) > x1 + ext6[i,k] = np.abs(a4[3,i,k]) > x1 + + #!--------------------------- + #! Apply subgrid constraints: + #!--------------------------- + #! f(s) = AL + s*[(AR-AL) + A6*(1-s)] ( 0 <= s <= 1 ) + #! Top 2 and bottom 2 layers always use monotonic mapping + + if (iv == 0): + for i in range(0,im): + a4[1,i,0] = np.max([0., a4[1,i,0]]) + elif (iv == -1): + for i in range(0,im): + if ( a4[1,i,0]*a4[0,i,0] <= 0. ): + a4[1,i,0] = 0. + elif (iv == 2): + for i in range(0,im): + a4[1,i,0] = a4[0,i,0] + a4[2,i,0] = a4[0,i,0] + a4[3,i,0] = 0. + + if (iv != 2): + for i in range(0,im): + a4[3,i,0] = 3.*(2.*a4[0,i,0] - (a4[1,i,0]+a4[2,i,0])) + a4[:,:,0] = cs_limiters(im, extm[:,0], a4[:,:,0], 1) + + #! k=1 + for i in range(0,im): + a4[3,i,1] = 3.*(2.*a4[0,i,1] - (a4[1,i,1]+a4[2,i,1])) + a4[:,:,1] = cs_limiters(im, extm[:,1], a4[:,:,1], 2) + + #!------------------------------------- + #! Huynh's 2nd constraint for interior: + #!------------------------------------- + for k in range(2,km-2): + if (np.abs(kord) < 9): + for i in range(0,im): + #! Left edges + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + #! Right edges + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + elif (np.abs(kord) == 9): + for i in range(0,im): + if (extm[i,k] and extm[i,k-1]): + #! grid-scale 2-delta-z wave detected + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + a4[3,i,k] = 0. + elif (extm[i,k] and extm[i,k+1]): + #! grid-scale 2-delta-z wave detected + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + a4[3,i,k] = 0. + else: + a4[3,i,k] = 6.*a4[0,i,k] - 3.*(a4[1,i,k]+a4[2,i,k]) + #! Check within the smooth region if subgrid profile is non-monotonic + if(np.abs(a4[3,i,k]) > np.abs(a4[1,i,k]-a4[2,i,k])): + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + a4[3,i,k] = 6.*a4[0,i,k] - 3.*(a4[1,i,k]+a4[2,i,k]) + + elif (np.abs(kord) == 10): + for i in range(0,im): + if (ext5[i,k]): + if (ext5[i,k-1] or ext5[i,k+1]): + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + elif (ext6[i,k-1] or ext6[i,k+1]): + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + pmp_2 = a4[1,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + elif (ext6[i,k]): + if (ext5[i,k-1] or ext5[i,k+1]): + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + elif (np.abs(kord) == 12): + for i in range(0,im): + if (extm[i,k]): + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + a4[3,i,k] = 0. + else: #! not a local extremum + a4[3,i,k] = 6.*a4[0,i,k] - 3.*(a4[1,i,k]+a4[2,i,k]) + #! Check within the smooth region if subgrid profile is non-monotonic + if (np.abs(a4[3,i,k]) > np.abs(a4[1,i,k]-a4[2,i,k])): + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + a4[3,i,k] = 6.*a4[0,i,k] - 3.*(a4[1,i,k]+a4[2,i,k]) + elif (np.abs(kord) == 13): + for i in range(0,im): + if (ext6[i,k]): + if (ext6[i,k-1] and ext6[i,k+1]): + #! grid-scale 2-delta-z wave detected + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + elif (np.abs(kord) == 14): + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + elif (np.abs(kord) == 15): #! Revised abs(kord)=9 scheme + for i in range(0,im): + if (ext5[i,k] ): + if (ext5[i,k-1] or ext5[i,k+1]): + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + elif (ext6[i,k]): + #! Check within the smooth region if subgrid profile is non-monotonic + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + elif (np.abs(kord) == 16): + for i in range(0,im): + if (ext5[i,k]): + if (ext5[i,k-1] or ext5[i,k+1]): + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + elif (ext6[i,k-1] or ext6[i,k+1]): + #! Left edges + pmp_1 = a4[0,i,k] - 2.*gam[i,k+1] + lac_1 = pmp_1 + 1.5*gam[i,k+2] + a4[1,i,k] = np.min([np.max([a4[1,i,k], np.min([a4[0,i,k], pmp_1, lac_1])]), np.max([a4[0,i,k], pmp_1, lac_1])]) + #! Right edges + pmp_2 = a4[0,i,k] + 2.*gam[i,k] + lac_2 = pmp_2 - 1.5*gam[i,k-1] + a4[2,i,k] = np.min([np.max([a4[2,i,k], np.min([a4[0,i,k], pmp_2, lac_2])]), np.max([a4[0,i,k], pmp_2, lac_2])]) + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + else: #! kord = 11 + for i in range(0,im): + if (ext5[i,k] and (ext5[i,k-1] or ext5[i,k+1])): + #! Noisy region: + a4[1,i,k] = a4[0,i,k] + a4[2,i,k] = a4[0,i,k] + a4[3,i,k] = 0. + else: + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + + #! Additional constraint to ensure positivity + if (iv == 0): + a4[:,:,k] = cs_limiters(im, extm[:,k], a4[:,:,k], 0) + + ####end for k in range(3,km-2) + + #!---------------------------------- + #! Bottom layer subgrid constraints: + #!---------------------------------- + if (iv == 0): + for i in range(0,im): + a4[2,i,km-1] = np.max([0., a4[2,i,km-1]]) + elif (iv == -1): + for i in range(0,im): + if (a4[2,i,km-1]*a4[0,i,km-1] <= 0.): + a4[2,i,km-1] = 0. + + for k in range(km-2,km): + for i in range(0,im): + a4[3,i,k] = 3.*(2.*a4[0,i,k] - (a4[1,i,k]+a4[2,i,k])) + if (k == (km-2)): + a4[:,:,k] = cs_limiters(im, extm[:,k], a4[:,:,k], 2) + if (k == km-1): + a4[:,:,k] = cs_limiters(im, extm[:,k], a4[:,:,k], 1) + + return a4 + +def mappm (km, pe1, q1, kn, pe2, i1, i2, iv, kord, ptop): + #! IV = 0: constituents + #! IV = 1: potential temp + #! IV =-1: winds + + #! Mass flux preserving mapping: q1(im,km) -> q2(im,kn) + + #! pe1: pressure at layer edges (from model top to bottom surface) + #! in the original vertical coordinate + #! pe2: pressure at layer edges (from model top to bottom surface) + #! in the new vertical coordinate + + # integer, intent(in):: i1, i2, km, kn, kord, iv + # real, intent(in ):: pe1(i1:i2,km+1), pe2(i1:i2,kn+1) !< pe1: pressure at layer edges from model top to bottom + # !! surface in the ORIGINAL vertical coordinate + # !< pe2: pressure at layer edges from model top to bottom + # !! surface in the NEW vertical coordinate + #! Mass flux preserving mapping: q1(im,km) -> q2(im,kn) + # real, intent(in ):: q1(i1:i2,km) + # real, intent(out):: q2(i1:i2,kn) + # real, intent(IN) :: ptop + #! local + # real qs(i1:i2) + # real dp1(i1:i2,km) + # real a4(4,i1:i2,km) + # integer i, k, l + # integer k0, k1 + # real pl, pr, tt, delp, qsum, dpsum, esl + im = i2 - i1 + 1 + dp1 = np.zeros([im,km]) + a4 = np.zeros([4,im,km]) + q2 = np.zeros([im,kn]) + qs = np.zeros(im) + + for k in range(0,km): + for i in range(0,im): + dp1[i,k] = pe1[i,k+1] - pe1[i,k] + a4[0,i,k] = q1[i,k] + + if ( kord > 7 ): + a4 = cs_profile( qs, a4, dp1, km, i1, i2, iv, kord ) + else: + a4 = ppm_profile( a4, dp1, km, i1, i2, iv, kord ) + + #!------------------------------------ + #! Lowest layer: constant distribution + #!------------------------------------ + ##ifdef NGGPS_SUBMITTED + # do i=i1,i2 + # a4(2,i,km) = q1(i,km) + # a4(3,i,km) = q1(i,km) + # a4(4,i,km) = 0. + # enddo + #endif + qsum = 0. + for i in range(0,im): + k0 = 0 + for k in range(0,kn): + next_k = False + if (pe2[i,k] <= pe1[i,0]): + #! above old ptop + q2[i,k] = q1[i,0] + elif (pe2[i,k] >= pe1[i,km]): + #! Entire grid below old ps + ##ifdef NGGPS_SUBMITTED + # q2(i,k) = a4(3,i,km) ! this is not good. + #else + q2[i,k] = q1[i,km-1] + #endif + else: + for l in range(k0,km): + #! locate the top edge at pe2(i,k) + if ( pe2[i,k] >= pe1[i,l] and pe2[i,k] <= pe1[i,l+1]): + k0 = l + pl = (pe2[i,k]-pe1[i,l]) / dp1[i,l] + if (pe2[i,k+1] <= pe1[i,l+1]): + #! entire new grid is within the original grid + pr = (pe2[i,k+1]-pe1[i,l]) / dp1[i,l] + tt = r3*(pr*(pr+pl)+pl**2) + q2[i,k] = a4[1,i,l] + 0.5*(a4[3,i,l]+a4[2,i,l]-a4[1,i,l])*(pr+pl)-a4[3,i,l]*tt + next_k = True + break + #goto 555 + else: + #! Fractional area... + delp = pe1[i,l+1] - pe2[i,k] + tt = r3*(1.+pl*(1.+pl)) + qsum = delp*(a4[1,i,l]+0.5*(a4[3,i,l]+a4[2,i,l]-a4[1,i,l])*(1.+pl)-a4[3,i,l]*tt) + dpsum = delp + k1 = l + 1 + break + #goto 111 + if not next_k: + #labeled 111 + for l in range(k1,km): + if( pe2[i,k+1] > pe1[i,l+1] ): + #! Whole layer.. + qsum = qsum + dp1[i,l]*q1[i,l] + dpsum = dpsum + dp1[i,l] + else: + delp = pe2[i,k+1]-pe1[i,l] + esl = delp / dp1[i,l] + qsum = qsum + delp * (a4[1,i,l]+0.5*esl*(a4[2,i,l]-a4[1,i,l]+a4[3,i,l]*(1.-r23*esl))) + dpsum = dpsum + delp + k0 = l + break #goto 123 + else: #when l-loop completes without breaking + delp = pe2[i,k+1] - pe1[i,km] #should this be km? + if (delp > 0.): + #! Extended below old ps + ##ifdef NGGPS_SUBMITTED + #qsum = qsum + delp * a4(3,i,km) ! not good. + ##else + qsum = qsum + delp * q1[i,km-1] # should this be km-1? + ##endif + dpsum = dpsum + delp + q2[i,k] = qsum / dpsum #formerly labeled 123 + + return q2 + +def map1_ppm(km, pe1, q1, qs, kn, pe2, i1, i2, iv, kord): +# subroutine map1_ppm( km, pe1, q1, qs, & +# kn, pe2, q2, i1, i2, & +# j, ibeg, iend, jbeg, jend, iv, kord) +# integer, intent(in) :: i1 !< Starting longitude +# integer, intent(in) :: i2 !< Finishing longitude +# integer, intent(in) :: iv !< Mode: 0 == constituents 1 == ??? 2 == remap temp with cs scheme +# integer, intent(in) :: kord !< Method order +# integer, intent(in) :: j !< Current latitude +# integer, intent(in) :: ibeg, iend, jbeg, jend +# integer, intent(in) :: km !< Original vertical dimension +# integer, intent(in) :: kn !< Target vertical dimension +# real, intent(in) :: qs(i1:i2) !< bottom BC +# real, intent(in) :: pe1(i1:i2,km+1) !< pressure at layer edges from model top to bottom surface in the original vertical coordinate +# real, intent(in) :: pe2(i1:i2,kn+1) !< pressure at layer edges from model top to bottom surface in the new vertical coordinate +# real, intent(in) :: q1(ibeg:iend,jbeg:jend,km) !< Field input +# ! INPUT/OUTPUT PARAMETERS: +# real, intent(inout):: q2(ibeg:iend,jbeg:jend,kn) !< Field output +# +# ! DESCRIPTION: +# ! IV = 0: constituents +# ! pe1: pressure at layer edges (from model top to bottom surface) +# ! in the original vertical coordinate +# ! pe2: pressure at layer edges (from model top to bottom surface) +# ! in the new vertical coordinate +# +# ! LOCAL VARIABLES: +# real dp1(i1:i2,km) +# real q4(4,i1:i2,km) +# real pl, pr, qsum, dp, esl +# integer i, k, l, m, k0 +# + im = i2 - i1 + 1 + q2 = np.zeros([im,kn]) + + qs = np.zeros([im]) + dp1 = np.zeros([im,km]) + q4 = np.zeros([4,im,km]) + qsum = 0. + for k in range(0,km): + for i in range(i1-1,i2): + dp1[i,k] = pe1[i,k+1] - pe1[i,k] + q4[0,i,k] = q1[i,k] +# ! Compute vertical subgrid distribution + if (kord > 7): + q4 = cs_profile( qs, q4, dp1, km, i1, i2, iv, kord ) + else: + q4 = ppm_profile( q4, dp1, km, i1, i2, iv, kord ) + + for i in range(i1-1,i2): + k0 = 0 + for k in range(0,kn): + next_k = False + for l in range(k0,km): + # ! locate the top edge: pe2(i,k) + if( pe2[i,k] >= pe1[i,l] and pe2[i,k] <= pe1[i,l+1] ): + pl = (pe2[i,k]-pe1[i,l]) / dp1[i,l] + if( pe2[i,k+1] <= pe1[i,l+1] ): + # ! entire new grid is within the original grid + pr = (pe2[i,k+1]-pe1[i,l]) / dp1[i,l] + q2[i,k] = q4[1,i,l] + 0.5*(q4[3,i,l]+q4[2,i,l]-q4[1,i,l])*(pr+pl)-q4[3,i,l]*r3*(pr*(pr+pl)+pl**2) + k0 = l + next_k = True + #print 'new grid within old; q2 = ', q2[i,k] + break + #goto 555 #next k-loop iteration + else: + # ! Fractional area... + qsum = (pe1[i,l+1]-pe2[i,k])*(q4[1,i,l]+0.5*(q4[3,i,l]+q4[2,i,l]-q4[1,i,l])*(1.+pl)-q4[3,i,l]*(r3*(1.+pl*(1.+pl)))) + for m in range(l+1,km): # was do m = l+1,km + # ! locate the bottom edge: pe2(i,k+1) + if( pe2[i,k+1] > pe1[i,m+1] ): + # ! Whole layer + qsum = qsum + dp1[i,m]*q4[0,i,m] + else: + dp = pe2[i,k+1]-pe1[i,m] + esl = dp / dp1[i,m] + qsum = qsum + dp*(q4[1,i,m]+0.5*esl*(q4[2,i,m]-q4[1,i,m]+q4[3,i,m]*(1.-r23*esl))) + k0 = m + # goto 123 + break + else: + #GJF: the following if statement is not in the fv_mapz, but it captures the case where pe2[kn] > pe1[km] where the m loop is not entered; without this, the lowest layer values are weird + if (l+1 == km): + dp = pe2[i,kn]-pe1[i,km] + esl = dp / dp1[i,km-1] + qsum = qsum + dp*(q4[1,i,km-1]+0.5*esl*(q4[2,i,km-1]-q4[1,i,km-1]+q4[3,i,km-1]*(1.-r23*esl))) + break + + break + #goto 123 #end l-loop + if not next_k: + q2[i,k] = qsum / ( pe2[i,k+1] - pe2[i,k] ) #formerly labeled 123 + + return q2 + + +def fillq(im, km, nq, q, dp): + + for ic in range(0,nq): + for k in range(km-1,0,-1): + k1 = k-1 + for i in range(0,im): + if( q[i,k,ic] < 0. ): + q[i,k1,ic] = q[i,k1,ic] + q[i,k,ic]*dp[i,k]/dp[i,k1] + q[i,k ,ic] = 0. + + #! Top down: + for k in range(0,km-1): + k1 = k+1 + for i in range(0,im): + if( q[i,k,ic] < 0. ): + q[i,k1,ic] = q[i,k1,ic] + q[i,k,ic]*dp[i,k]/dp[i,k1] + q[i,k ,ic] = 0. + + return q + +def fillz(im, km, nq, q, dp): + #integer, intent(in):: im !< No. of longitudes + #integer, intent(in):: km !< No. of levels + #integer, intent(in):: nq !< Total number of tracers + #real , intent(in):: dp(im,km) !< pressure thickness + #real , intent(inout) :: q(im,km,nq) !< tracer mixing ratio + #! LOCAL VARIABLES: + #logical:: zfix(im) + #real :: dm(km) + #integer i, k, ic, k1 + #real qup, qly, dup, dq, sum0, sum1, fac + + dm = np.zeros([km]) + + #print ('orig q') + #print q + + for ic in range(0,nq): + for i in range(0,im): + #top layer + if( q[i,0,ic] < 0. ): + q[i,1,ic] = q[i,1,ic] + q[i,0,ic]*dp[i,0]/dp[i,1] + q[i,0,ic] = 0. + #! Interior + zfix = [False] * im + for k in range(1,km-1): + for i in range(0,im): + if( q[i,k,ic] < 0. ): + #print('neg in layer',k,q[i,k,ic]) + zfix[i] = True + if ( q[i,k-1,ic] > 0. ): + #print('borrow from above') + #! Borrow from above + dq = np.min( [q[i,k-1,ic]*dp[i,k-1], -q[i,k,ic]*dp[i,k]] ) + q[i,k-1,ic] = q[i,k-1,ic] - dq/dp[i,k-1] + q[i,k ,ic] = q[i,k ,ic] + dq/dp[i,k ] + if ( q[i,k,ic] < 0.0 and q[i,k+1,ic] > 0. ): + #! Borrow from below: + #print('borrow from below') + dq = np.min ( [q[i,k+1,ic]*dp[i,k+1], -q[i,k,ic]*dp[i,k]] ) + q[i,k+1,ic] = q[i,k+1,ic] - dq/dp[i,k+1] + q[i,k ,ic] = q[i,k ,ic] + dq/dp[i,k ] + #print ('new q',q[i,k ,ic]) + #! Bottom layer + k = km-1 + for i in range(0,im): + if( q[i,k,ic] < 0. and q[i,k-1,ic] > 0.): + zfix[i] = True + #! Borrow from above + qup = q[i,k-1,ic]*dp[i,k-1] + qly = -q[i,k ,ic]*dp[i,k ] + dup = np.min([qly, qup]) + q[i,k-1,ic] = q[i,k-1,ic] - dup/dp[i,k-1] + q[i,k, ic] = q[i,k, ic] + dup/dp[i,k ] + + #! Perform final check and non-local fix if needed + for i in range(0,im): + if ( zfix[i] ): + sum0 = 0. + for k in range(1,km): + dm[k] = q[i,k,ic]*dp[i,k] + sum0 = sum0 + dm[k] + #print('sum0',sum0) + if ( sum0 > 0. ): + sum1 = 0. + for k in range(1,km): + sum1 = sum1 + np.max([0., dm[k]]) + fac = sum0 / sum1 + #print('fac',fac) + for k in range(1,km): + q[i,k,ic] = np.max([0., fac*dm[k]/dp[i,k]]) + + return q + +def mp_auto_conversion(ql, qi): + qi0_max = 2.0E-3 + ql0_max = 2.5E-3 + qr = 0.0 + qs = 0.0 + + #! Convert excess cloud water into rain: + if ( ql > ql0_max ): + qr = ql - ql0_max + ql = ql0_max + #! Convert excess cloud ice into snow: + if ( qi > qi0_max ): + qs = qi - qi0_max + qi = qi0_max + + return (ql, qr, qi, qs) + +def latlon2xyz(p): + +#real(kind=R_GRID), intent(in) :: p(2) +#real(kind=R_GRID), intent(out):: e(3) + +#integer n +#real (f_p):: q(2) +#real (f_p):: e1, e2, e3 + + e = np.zeros(3) + + e1 = math.cos(p[1]) * math.cos(p[0]) + e2 = math.cos(p[1]) * math.sin(p[0]) + e3 = math.sin(p[1]) +#!----------------------------------- +#! Truncate to the desired precision: +#!----------------------------------- + e = [e1, e2, e3] + + return e + +def mid_pt3_cart(p1, p2): +# real(kind=R_GRID), intent(IN) :: p1(3), p2(3) +# real(kind=R_GRID), intent(OUT) :: e(3) +#! +# real (f_p):: q1(3), q2(3) +# real (f_p):: dd, e1, e2, e3 +# integer k + + e = np.zeros(3) + + # do k=1,3 + # q1(k) = p1(k) + # q2(k) = p2(k) + # enddo + + e1 = p1[0] + p2[0] + e2 = p1[1] + p2[1] + e3 = p1[2] + p2[2] + + dd = math.sqrt( e1**2 + e2**2 + e3**2 ) + e1 = e1 / dd + e2 = e2 / dd + e3 = e3 / dd + + e = [e1, e2, e3] + + return e + +def cart_to_latlon(q): +#! vector version of cart_to_latlon1 +#integer, intent(in):: np +#real(kind=R_GRID), intent(inout):: q(3,np) +#real(kind=R_GRID), intent(inout):: xs(np), ys(np) +#! local +#real(kind=R_GRID), parameter:: esl=1.d-10 +#real (f_p):: p(3) +#real (f_p):: dist, lat, lon +#integer i,k + esl = 1.0E-10 + + dist = math.sqrt(q[0]**2 + q[1]**2 + q[2]**2) + q = np.divide(q,dist) + + if ( (abs(q[0])+abs(q[1])) < esl ): + lon = 0.0 + else: + lon = math.atan2( q[1], q[0] ) #! range [-pi,pi] + + + if ( lon < 0.): + lon = 2*math.pi + lon + + #! RIGHT_HAND system: + lat = math.asin(q[2]) + + return (lon, lat) + +def mid_pt_sphere(p1, p2): +# real(kind=R_GRID) , intent(IN) :: p1(2), p2(2) +# real(kind=R_GRID) , intent(OUT) :: pm(2) +#!------------------------------------------ +# real(kind=R_GRID) e1(3), e2(3), e3(3) + + pm = np.zeros(2) + + e1 = latlon2xyz(p1) + e2 = latlon2xyz(p2) + e3 = mid_pt3_cart(e1, e2) + (pm[0], pm[1]) = cart_to_latlon(e3) + + return pm + +def vect_cross(p1, p2): + #real(kind=R_GRID), intent(in) :: p1(3), p2(3) + #real(kind=R_GRID), intent(out):: e(3) + e = np.zeros(3) + + e[0] = p1[1]*p2[2] - p1[2]*p2[1] + e[1] = p1[2]*p2[0] - p1[0]*p2[2] + e[2] = p1[0]*p2[1] - p1[1]*p2[0] + + return e + +def normalize_vect(e): + + #real(kind=R_GRID), intent(inout):: e(3) + #real(f_p):: pdot + #integer k + + pdot = e[0]**2 + e[1]**2 + e[2]**2 + pdot = math.sqrt( pdot ) + e = e/pdot + + return e + +def get_unit_vect2( e1, e2): + #real(kind=R_GRID), intent(in) :: e1(2), e2(2) + #real(kind=R_GRID), intent(out):: uc(3) !< unit vector e1--->e2 +#! Local: + #real(kind=R_GRID), dimension(3):: pc, p1, p2, p3 + uc = np.zeros(3) + +#! RIGHT_HAND system: + p1 = latlon2xyz(e1) + p2 = latlon2xyz(e2) + + pc = mid_pt3_cart(p1, p2) + p3 = vect_cross(p2, p1) + uc = vect_cross(pc, p3) + uc = normalize_vect( uc ) + + return uc + +def get_latlon_vector(pp): + #real(kind=R_GRID), intent(IN) :: pp(2) + #real(kind=R_GRID), intent(OUT) :: elon(3), elat(3) + elon = np.zeros(3) + elat = np.zeros(3) + + elon[0] = -math.sin(pp[0]) + elon[1] = math.cos(pp[0]) + elon[2] = 0.0 + elat[0] = -math.sin(pp[1])*math.cos(pp[0]) + elat[1] = -math.sin(pp[1])*math.sin(pp[0]) +#!!! RIGHT_HAND + elat[2] = math.cos(pp[1]) +#! Left-hand system needed to be consistent with rest of the codes +#! elat[2] = -math.cos(pp[1]) + + return (elon, elat) + +def inner_prod(v1, v2): + #real(kind=R_GRID),intent(in):: v1(3), v2(3) + #real (f_p) :: vp1(3), vp2(3), prod16 + #integer k + + return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2] diff --git a/scm/src/fv_eta.h b/scm/src/fv_eta.h index 7df22b11b..66660fb96 100644 --- a/scm/src/fv_eta.h +++ b/scm/src/fv_eta.h @@ -10,7 +10,7 @@ !* (at your option) any later version. !* !* The FV3 dynamical core is distributed in the hope that it will be -!* useful, but WITHOUT ANYWARRANTY; without even the implied warranty +!* useful, but WITHOUT ANY WARRANTY; without even the implied warranty !* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. !* See the GNU General Public License for more details. !* @@ -18,6 +18,7 @@ !* License along with the FV3 dynamical core. !* If not, see . !*********************************************************************** + #ifndef _FV_ETA_ #define _FV_ETA__ @@ -42,11 +43,15 @@ real a63meso(64),b63meso(64) real a64(65),b64(65) real a64gfs(65),b64gfs(65) + real a65(66),b65(66) ! kgao: L65 with enhanced surface resolution by xi chen real a68(69),b68(69) ! cjg: grid with enhanced PBL resolution real a96(97),b96(97) ! cjg: grid with enhanced PBL resolution + real a88(89),b88(89) ! kgao: grid with enhanced PBL resolution + real a75(76),b75(76) ! kgao: emc grid with enhanced PBL resolution real a100(101),b100(101) real a104(105),b104(105) real a125(126),b125(126) + real a127(128),b127(128) !----------------------------------------------- ! GFDL AM2-L24: modified by SJL at the model top @@ -455,39 +460,53 @@ 0.94565, 0.95762, 0.96827, & 0.97771, 0.98608, 0.99347, 1./ -! NAM levels - data a60/200., 1311.4934, 2424.6044, 3541.7594,& - 4662.9584, 5790.2234, 6932.6534, 8095.3034,& - 9278.1734, 10501.4834, 11755.1234, 13049.2034,& - 14403.9434, 15809.2334, 17315.6234, 18953.4434,& - 20783.3534, 22815.4634, 25059.8834, 27567.1634,& - 30148.42896047, 32193.91776039, 33237.35176644, 33332.15200668,& - 32747.34688095, 31710.06232008, 30381.0344269, 28858.71577772,& - 27218.00439794, 25500.31691133, 23734.52294749, 21947.3406187,& - 20167.06984021, 18396.08144096, 16688.20978135, 15067.73749198,& - 13564.49530178, 12183.34512952, 10928.24869364, 9815.02787644,& - 8821.38325756, 7943.05793658, 7181.90985128, 6500.94645341,& - 5932.84856135, 5420.87683616, 4959.15585353, 4522.15047657,& - 4103.63596619, 3703.72540955, 3322.52525084, 2953.65688391,& - 2597.18532669, 2253.10764634, 1915.10585833, 1583.14516612,& - 1257.18953818, 937.3977544 , 623.60136981, 311.11085215,& - 0. / - data b60/0., 0., 0., 0., 0.,& - 0. , 0. , 0. , 0. , 0. ,& - 0. , 0. , 0. , 0. , 0. ,& - 0. , 0. , 0. , 0. , 0. ,& - 0.0014653 , 0.01021565, 0.0301554 , 0.06025816, 0.09756877,& - 0.13994493, 0.18550048, 0.23318371, 0.2819159 , 0.33120838,& - 0.38067633, 0.42985641, 0.47816985, 0.52569303, 0.57109611,& - 0.61383996, 0.6532309 , 0.68922093, 0.72177094, 0.75052515,& - 0.77610288, 0.79864598, 0.81813309, 0.83553022, 0.85001773,& - 0.86305395, 0.8747947 , 0.88589325, 0.89650986, 0.9066434 ,& - 0.91629284, 0.92562094, 0.93462705, 0.94331221, 0.95183659,& - 0.96020153, 0.96840839, 0.97645359, 0.98434181, 0.99219119, 1. / + data a60/ 1.7861000000e-01, 1.0805100000e+00, 3.9647100000e+00, & + 9.7516000000e+00, 1.9816580000e+01, 3.6695950000e+01, & + 6.2550570000e+01, 9.9199620000e+01, 1.4792505000e+02, & + 2.0947487000e+02, 2.8422571000e+02, 3.7241721000e+02, & + 4.7437835000e+02, 5.9070236000e+02, 7.2236063000e+02, & + 8.7076746000e+02, 1.0378138800e+03, 1.2258877300e+03, & + 1.4378924600e+03, 1.6772726600e+03, 1.9480506400e+03, & + 2.2548762700e+03, 2.6030909400e+03, 2.9988059200e+03, & + 3.4489952300e+03, 3.9616028900e+03, 4.5456641600e+03, & + 5.2114401700e+03, 5.9705644000e+03, 6.8361981800e+03, & + 7.8231906000e+03, 8.9482351000e+03, 1.0230010660e+04, & + 1.1689289750e+04, 1.3348986860e+04, 1.5234111060e+04, & + 1.7371573230e+04, 1.9789784580e+04, 2.2005564550e+04, & + 2.3550115120e+04, 2.4468583320e+04, 2.4800548800e+04, & + 2.4582445070e+04, 2.3849999620e+04, 2.2640519740e+04, & + 2.0994737150e+04, 1.8957848730e+04, 1.6579413230e+04, & + 1.4080071030e+04, 1.1753630920e+04, 9.6516996300e+03, & + 7.7938009300e+03, 6.1769062800e+03, 4.7874276000e+03, & + 3.6050497500e+03, 2.6059860700e+03, 1.7668328200e+03, & + 1.0656131200e+03, 4.8226201000e+02, 0.0000000000e+00, & + 0.0000000000e+00 / + + data b60/ 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 5.0600000000e-03, & + 2.0080000000e-02, 4.4900000000e-02, 7.9360000000e-02, & + 1.2326000000e-01, 1.7634000000e-01, 2.3820000000e-01, & + 3.0827000000e-01, 3.8581000000e-01, 4.6989000000e-01, & + 5.5393000000e-01, 6.2958000000e-01, 6.9642000000e-01, & + 7.5458000000e-01, 8.0463000000e-01, 8.4728000000e-01, & + 8.8335000000e-01, 9.1368000000e-01, 9.3905000000e-01, & + 9.6020000000e-01, 9.7775000000e-01, 9.9223000000e-01, & + 1.0000000000e+00 / ! This is activated by USE_GFSL63 -! Thfollowing L63 setting is the same as NCEP GFS's L64 except the top +! The following L63 setting is the same as NCEP GFS's L64 except the top ! 3 layers data a63/64.247, 137.790, 221.958, & 318.266, 428.434, 554.424, & @@ -668,6 +687,51 @@ 0.87352, 0.91502, 0.95235, & 0.98511, 1.00000 / + data a65/1.00000000, 5.13470268, 14.04240036, & + 30.72783852, 53.79505539, 82.45489502, & + 117.05598450, 158.62843323, 208.79000854, & + 270.02725220, 345.50848389, 438.41940308, & + 551.85266113, 689.25054932, 854.40936279, & + 1051.47802734, 1284.95031738, 1559.65148926, & + 1880.71691895, 2253.56542969, 2683.86547852, & + 3177.49560547, 3740.49951172, 4379.03613281, & + 5099.32617188, 5907.59326172, 6810.00781250, & + 7812.62353516, 8921.31933594, 10141.73632812,& + 11285.93066406, 12188.79101562, 12884.30078125,& + 13400.11523438, 13758.84960938, 13979.10351562,& + 14076.26074219, 14063.13085938, 13950.45507812,& + 13747.31445312, 13461.45410156, 13099.54199219,& + 12667.38183594, 12170.08203125, 11612.18847656,& + 10997.79980469, 10330.65039062, 9611.05468750, & + 8843.30371094, 8045.85009766, 7236.31152344, & + 6424.55712891, 5606.50927734, 4778.05908203, & + 3944.97241211, 3146.77514648, 2416.63354492, & + 1778.22607422, 1246.21462402, 826.51950684, & + 511.21385254, 290.74072876, 150.00000000, & + 68.89300000, 14.99899865, 0.00000000 / + + data b65/0.00000000, 0.00000000, 0.00000000, & + 0.00000000, 0.00000000, 0.00000000, & + 0.00000000, 0.00000000, 0.00000000, & + 0.00000000, 0.00000000, 0.00000000, & + 0.00000000, 0.00000000, 0.00000000, & + 0.00000000, 0.00000000, 0.00000000, & + 0.00000000, 0.00000000, 0.00000000, & + 0.00000000, 0.00000000, 0.00000000, & + 0.00000000, 0.00000000, 0.00000000, & + 0.00000000, 0.00000000, 0.00000000, & + 0.00193294, 0.00749994, 0.01640714, & + 0.02841953, 0.04334756, 0.06103661, & + 0.08135860, 0.10420541, 0.12948355, & + 0.15711005, 0.18700911, 0.21910952, & + 0.25334257, 0.28964061, 0.32793567, & + 0.36815873, 0.41023913, 0.45429301, & + 0.50016892, 0.54688859, 0.59356427, & + 0.63976413, 0.68518244, 0.72950502, & + 0.77231618, 0.81251526, 0.84921405, & + 0.88174411, 0.90978803, 0.93327247, & + 0.95249488, 0.96783525, 0.97980107, & + 0.98896214, 0.99575002, 1.00000000 / !-->cjg data a68/1.00000, 2.68881, 5.15524, & 8.86683, 14.20349, 22.00278, & @@ -785,6 +849,129 @@ 0.97918, 0.98723, 0.99460, & 1.00000 / !<--cjg + +!---> kgao: remove top layers from l96 + data a88/65.28397, & + 95.48274, 137.90344, 196.76073, & + 277.45330, 386.81095, 533.37018, & + 727.67600, 982.60677, 1313.71685, & + 1739.59104, 2282.20281, 2967.26766, & + 3824.58158, 4888.33404, 6197.38450, & + 7795.49158, 9731.48414, 11969.71024, & + 14502.88894, 17304.52434, 20134.76139, & + 22536.63814, 24252.54459, 25230.65591, & + 25585.72044, 25539.91412, 25178.87141, & + 24644.84493, 23978.98781, 23245.49366, & + 22492.11600, 21709.93990, 20949.64473, & + 20225.94258, 19513.31158, 18829.32485, & + 18192.62250, 17589.39396, 17003.45386, & + 16439.01774, 15903.91204, 15396.39758, & + 14908.02140, 14430.65897, 13967.88643, & + 13524.16667, 13098.30227, 12687.56457, & + 12287.08757, 11894.41553, 11511.54106, & + 11139.22483, 10776.01912, 10419.75711, & + 10067.11881, 9716.63489, 9369.61967, & + 9026.69066, 8687.29884, 8350.04978, & + 8013.20925, 7677.12187, 7343.12994, & + 7011.62844, 6681.98102, 6353.09764, & + 6025.10535, 5699.10089, 5375.54503, & + 5053.63074, 4732.62740, 4413.38037, & + 4096.62775, 3781.79777, 3468.45371, & + 3157.19882, 2848.25306, 2541.19150, & + 2236.21942, 1933.50628, 1632.83741, & + 1334.35954, 1038.16655, 744.22318, & + 452.71094, 194.91899, 0.00000, & + 0.00000 / + + data b88/0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00000, & + 0.00000, 0.00000, 0.00193, & + 0.00974, 0.02538, 0.04876, & + 0.07817, 0.11081, 0.14514, & + 0.18007, 0.21486, 0.24866, & + 0.28088, 0.31158, 0.34030, & + 0.36701, 0.39210, 0.41554, & + 0.43733, 0.45774, 0.47707, & + 0.49540, 0.51275, 0.52922, & + 0.54495, 0.56007, 0.57459, & + 0.58850, 0.60186, 0.61471, & + 0.62715, 0.63922, 0.65095, & + 0.66235, 0.67348, 0.68438, & + 0.69510, 0.70570, 0.71616, & + 0.72651, 0.73675, 0.74691, & + 0.75700, 0.76704, 0.77701, & + 0.78690, 0.79672, 0.80649, & + 0.81620, 0.82585, 0.83542, & + 0.84492, 0.85437, 0.86375, & + 0.87305, 0.88229, 0.89146, & + 0.90056, 0.90958, 0.91854, & + 0.92742, 0.93623, 0.94497, & + 0.95364, 0.96223, 0.97074, & + 0.97918, 0.98723, 0.99460, & + 1.00000 / +!<--- kgao: end of a88/b88 + +!---> kgao: EMC L75 config + + data a75/200.0, 572.419, 1104.437, & + 1760.239, 2499.052, 3300.438, & + 4161.36, 5090.598, 6114.272, & + 7241.963, 8489.481, 9855.825, & + 11338.34, 12682.56, 13688.97, & + 14422.61, 14934.2, 15263.88, & + 15443.77, 15499.9, 15453.61, & + 15322.6, 15121.64, 14863.23, & + 14557.97, 14214.93, 13841.91, & + 13445.62, 13031.86, 12605.65, & + 12171.31, 11732.57, 11292.65, & + 10854.29, 10419.82, 9991.243, & + 9570.207, 9158.088, 8756.019, & + 8364.893, 7985.424, 7618.15, & + 7263.452, 6921.581, 6592.674, & + 6276.763, 5963.31, 5652.806, & + 5345.765, 5042.658, 4743.966, & + 4450.172, 4161.769, 3879.194, & + 3602.911, 3333.365, 3071.016, & + 2816.274, 2569.556, 2331.264, & + 2101.816, 1881.57, 1670.887, & + 1470.119, 1279.627, 1099.702, & + 930.651, 772.757, 626.305, & + 491.525, 368.641, 257.862, & + 159.399, 73.396, 0.001, & + 0.0/ + data b75/0.0, 0.0, 0.0, & + 0.0, 0.0, 0.0, & + 0.0, 0.0, 0.0, & + 0.0, 0.0, 0.0, & + 0.0, 0.00250213, 0.00944449,& + 0.02010732, 0.03390246, 0.0503391, & + 0.06899972, 0.08952269, 0.1115907, & + 0.134922, 0.1592647, 0.1843923, & + 0.2101002, 0.2362043, 0.2625384, & + 0.2889538, 0.3153166, 0.3415084, & + 0.3674242, 0.3929729, 0.4180741, & + 0.4426602, 0.4666739, 0.4900666, & + 0.5127994, 0.5348418, 0.5561699, & + 0.5767674, 0.5966232, 0.6157322, & + 0.6340936, 0.6517111, 0.668592, & + 0.6847468, 0.7007225, 0.7164985, & + 0.7320531, 0.7473667, 0.7624187, & + 0.7771889, 0.7916558, 0.8058007, & + 0.819604, 0.8330461, 0.8461072, & + 0.8587694, 0.8710147, 0.8828254, & + 0.8941834, 0.9050727, 0.9154776, & + 0.9253828, 0.9347721, 0.9436326, & + 0.9519511, 0.9597148, 0.966911, & + 0.9735298, 0.9795609, 0.9849954, & + 0.9898235, 0.9940391, 0.9976355, & + 1.0/ +! <--- kgao: end of a75/b75 + ! ! Ultra high troposphere resolution data a100/100.00000, 300.00000, 800.00000, & @@ -859,79 +1046,79 @@ 0.99223, 1.00000 / data a104/ & - 1.8827062944e-01, 7.7977549145e-01, 2.1950593583e+00, & - 4.9874566624e+00, 9.8041418997e+00, 1.7019717163e+01, & - 2.7216579591e+01, 4.0518628401e+01, 5.6749646818e+01, & - 7.5513868331e+01, 9.6315093333e+01, 1.1866706195e+02, & - 1.4216835396e+02, 1.6653733709e+02, 1.9161605772e+02, & - 2.1735580129e+02, 2.4379516604e+02, 2.7103771847e+02, & - 2.9923284173e+02, 3.2856100952e+02, 3.5922338766e+02, & - 3.9143507908e+02, 4.2542117983e+02, 4.6141487902e+02, & - 4.9965698106e+02, 5.4039638379e+02, 5.8389118154e+02, & - 6.3041016829e+02, 6.8023459505e+02, 7.3366009144e+02, & - 7.9099869949e+02, 8.5258099392e+02, 9.1875827946e+02, & - 9.8990486716e+02, 1.0664204381e+03, 1.1487325074e+03, & - 1.2372990044e+03, 1.3326109855e+03, 1.4351954993e+03, & - 1.5456186222e+03, 1.6644886848e+03, 1.7924597105e+03, & - 1.9302350870e+03, 2.0785714934e+03, 2.2382831070e+03, & - 2.4102461133e+03, 2.5954035462e+03, 2.7947704856e+03, & - 3.0094396408e+03, 3.2405873512e+03, 3.4894800360e+03, & - 3.7574811281e+03, 4.0460585279e+03, 4.3567926151e+03, & - 4.6913848588e+03, 5.0516670674e+03, 5.4396113207e+03, & - 5.8573406270e+03, 6.3071403487e+03, 6.7914704368e+03, & - 7.3129785102e+03, 7.8745138115e+03, 8.4791420557e+03, & - 9.1301611750e+03, 9.8311179338e+03, 1.0585825354e+04, & - 1.1398380836e+04, 1.2273184781e+04, 1.3214959424e+04, & - 1.4228767429e+04, 1.5320029596e+04, 1.6494540743e+04, & - 1.7758482452e+04, 1.9118430825e+04, 2.0422798801e+04, & - 2.1520147587e+04, 2.2416813461e+04, 2.3118184510e+04, & - 2.3628790785e+04, 2.3952411814e+04, 2.4092209011e+04, & - 2.4050892106e+04, 2.3830930156e+04, 2.3434818358e+04, & - 2.2865410898e+04, 2.2126326004e+04, 2.1222420323e+04, & - 2.0160313690e+04, 1.8948920926e+04, 1.7599915822e+04, & - 1.6128019809e+04, 1.4550987232e+04, 1.2889169132e+04, & - 1.1164595563e+04, 9.4227665517e+03, 7.7259097899e+03, & - 6.1538244381e+03, 4.7808126007e+03, 3.5967415552e+03, & - 2.5886394104e+03, 1.7415964865e+03, 1.0393721271e+03, & - 4.6478852032e+02, 7.0308342481e-13, 0.0000000000e+00 / + 1.8827062944e-01, 7.7977549145e-01, 2.1950593583e+00, & + 4.9874566624e+00, 9.8041418997e+00, 1.7019717163e+01, & + 2.7216579591e+01, 4.0518628401e+01, 5.6749646818e+01, & + 7.5513868331e+01, 9.6315093333e+01, 1.1866706195e+02, & + 1.4216835396e+02, 1.6653733709e+02, 1.9161605772e+02, & + 2.1735580129e+02, 2.4379516604e+02, 2.7103771847e+02, & + 2.9923284173e+02, 3.2856100952e+02, 3.5922338766e+02, & + 3.9143507908e+02, 4.2542117983e+02, 4.6141487902e+02, & + 4.9965698106e+02, 5.4039638379e+02, 5.8389118154e+02, & + 6.3041016829e+02, 6.8023459505e+02, 7.3366009144e+02, & + 7.9099869949e+02, 8.5258099392e+02, 9.1875827946e+02, & + 9.8990486716e+02, 1.0664204381e+03, 1.1487325074e+03, & + 1.2372990044e+03, 1.3326109855e+03, 1.4351954993e+03, & + 1.5456186222e+03, 1.6644886848e+03, 1.7924597105e+03, & + 1.9302350870e+03, 2.0785714934e+03, 2.2382831070e+03, & + 2.4102461133e+03, 2.5954035462e+03, 2.7947704856e+03, & + 3.0094396408e+03, 3.2405873512e+03, 3.4894800360e+03, & + 3.7574811281e+03, 4.0460585279e+03, 4.3567926151e+03, & + 4.6913848588e+03, 5.0516670674e+03, 5.4396113207e+03, & + 5.8573406270e+03, 6.3071403487e+03, 6.7914704368e+03, & + 7.3129785102e+03, 7.8745138115e+03, 8.4791420557e+03, & + 9.1301611750e+03, 9.8311179338e+03, 1.0585825354e+04, & + 1.1398380836e+04, 1.2273184781e+04, 1.3214959424e+04, & + 1.4228767429e+04, 1.5320029596e+04, 1.6494540743e+04, & + 1.7758482452e+04, 1.9118430825e+04, 2.0422798801e+04, & + 2.1520147587e+04, 2.2416813461e+04, 2.3118184510e+04, & + 2.3628790785e+04, 2.3952411814e+04, 2.4092209011e+04, & + 2.4050892106e+04, 2.3830930156e+04, 2.3434818358e+04, & + 2.2865410898e+04, 2.2126326004e+04, 2.1222420323e+04, & + 2.0160313690e+04, 1.8948920926e+04, 1.7599915822e+04, & + 1.6128019809e+04, 1.4550987232e+04, 1.2889169132e+04, & + 1.1164595563e+04, 9.4227665517e+03, 7.7259097899e+03, & + 6.1538244381e+03, 4.7808126007e+03, 3.5967415552e+03, & + 2.5886394104e+03, 1.7415964865e+03, 1.0393721271e+03, & + 4.6478852032e+02, 7.0308342481e-13, 0.0000000000e+00 / data b104/ & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & - 0.0000000000e+00, 0.0000000000e+00, 1.5648447298e-03, & - 6.2617046389e-03, 1.4104157933e-02, 2.5118187415e-02, & - 3.9340510972e-02, 5.6816335609e-02, 7.7596328431e-02, & - 1.0173255472e-01, 1.2927309709e-01, 1.6025505622e-01, & - 1.9469566981e-01, 2.3258141217e-01, 2.7385520518e-01, & - 3.1840233814e-01, 3.6603639170e-01, 4.1648734767e-01, & - 4.6939496013e-01, 5.2431098738e-01, 5.8071350676e-01, & - 6.3803478105e-01, 6.9495048840e-01, 7.4963750338e-01, & - 7.9975208897e-01, 8.4315257576e-01, 8.8034012292e-01, & - 9.1184389721e-01, 9.3821231526e-01, 9.6000677644e-01, & - 9.7779792223e-01, 9.9216315122e-01, 1.0000000000e+00 / + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 0.0000000000e+00, & + 0.0000000000e+00, 0.0000000000e+00, 1.5648447298e-03, & + 6.2617046389e-03, 1.4104157933e-02, 2.5118187415e-02, & + 3.9340510972e-02, 5.6816335609e-02, 7.7596328431e-02, & + 1.0173255472e-01, 1.2927309709e-01, 1.6025505622e-01, & + 1.9469566981e-01, 2.3258141217e-01, 2.7385520518e-01, & + 3.1840233814e-01, 3.6603639170e-01, 4.1648734767e-01, & + 4.6939496013e-01, 5.2431098738e-01, 5.8071350676e-01, & + 6.3803478105e-01, 6.9495048840e-01, 7.4963750338e-01, & + 7.9975208897e-01, 8.4315257576e-01, 8.8034012292e-01, & + 9.1184389721e-01, 9.3821231526e-01, 9.6000677644e-01, & + 9.7779792223e-01, 9.9216315122e-01, 1.0000000000e+00 / ! IFS-like L125(top 12 levels removed from IFSL137) data a125/ 64., & @@ -980,5 +1167,74 @@ 0.984542, 0.988500, 0.991984, 0.995003, 0.997630, 1.000000 / + data a127/ & + 0.99900, 1.60500, 2.53200, 3.92400, & + 5.97600, 8.94700, 13.17700, 19.09600, & + 27.24300, 38.27600, 52.98400, 72.29300, & + 97.26900, 129.11000, 169.13500, 218.76700, & + 279.50600, 352.89400, 440.48100, 543.78200, & + 664.23600, 803.16400, 961.73400, 1140.93100, & + 1341.53800, 1564.11900, 1809.02800, 2076.41500, & + 2366.25200, 2678.37200, 3012.51000, 3368.36300, & + 3745.64600, 4144.16400, 4563.88100, 5004.99500, & + 5468.01700, 5953.84800, 6463.86400, 7000.00000, & + 7563.49400, 8150.66100, 8756.52900, 9376.14100, & + 10004.55300, 10636.85100, 11268.15700, 11893.63900, & + 12508.51900, 13108.09100, 13687.72700, 14242.89000, & + 14769.15300, 15262.20200, 15717.85900, 16132.09000, & + 16501.01800, 16820.93800, 17088.32400, 17299.85200, & + 17453.08400, 17548.35000, 17586.77100, 17569.69700, & + 17498.69700, 17375.56100, 17202.29900, 16981.13700, & + 16714.50400, 16405.02000, 16055.48500, 15668.86000, & + 15248.24700, 14796.86800, 14318.04000, 13815.15000, & + 13291.62900, 12750.92400, 12196.46800, 11631.65900, & + 11059.82700, 10484.20800, 9907.92700, 9333.96700, & + 8765.15500, 8204.14200, 7653.38700, 7115.14700, & + 6591.46800, 6084.17600, 5594.87600, 5124.94900, & + 4675.55400, 4247.63300, 3841.91800, 3458.93300, & + 3099.01000, 2762.29700, 2448.76800, 2158.23800, & + 1890.37500, 1644.71200, 1420.66100, 1217.52800, & + 1034.52400, 870.77800, 725.34800, 597.23500, & + 485.39200, 388.73400, 306.14900, 236.50200, & + 178.65100, 131.44700, 93.74000, 64.39200, & + 42.27400, 26.27400, 15.30200, 8.28700, & + 4.19000, 1.99400, 0.81000, 0.23200, & + 0.02900, 0.00000, 0.00000, 0.00000 / + + + data b127/ & + 0.000000000, 0.000000000, 0.000000000, 0.000000000, & + 0.000000000, 0.000000000, 0.000000000, 0.000000000, & + 0.000000000, 0.000000000, 0.000000000, 0.000000000, & + 0.000000000, 0.000000000, 0.000000000, 0.000000000, & + 0.000000000, 0.000000000, 0.000000000, 0.000000000, & + 0.000000000, 0.000000000, 0.000000000, 0.000000000, & + 0.000000000, 0.000000000, 0.000000000, 0.000000000, & + 0.000000000, 0.000000000, 0.000000000, 0.000000000, & + 0.000000000, 0.000000000, 0.000000000, 0.000000000, & + 0.000000000, 0.000000000, 0.000000000, 0.000000000, & + 0.000010180, 0.000081410, 0.000274690, 0.000650780, & + 0.001270090, 0.002192480, 0.003477130, 0.005182280, & + 0.007365040, 0.010081200, 0.013384920, 0.017328570, & + 0.021962390, 0.027334280, 0.033489540, 0.040470560, & + 0.048316610, 0.057063580, 0.066743720, 0.077385480, & + 0.089006290, 0.101593970, 0.115126180, 0.129576220, & + 0.144912940, 0.161100800, 0.178099890, 0.195866050, & + 0.214351120, 0.233503070, 0.253266330, 0.273582160, & + 0.294388980, 0.315622900, 0.337218050, 0.359107230, & + 0.381222370, 0.403495070, 0.425857160, 0.448241260, & + 0.470581260, 0.492812960, 0.514874340, 0.536706210, & + 0.558252450, 0.579460500, 0.600281540, 0.620670740, & + 0.640587510, 0.659995680, 0.678863350, 0.697163110, & + 0.714872000, 0.731971260, 0.748446460, 0.764287110, & + 0.779486660, 0.794042170, 0.807954130, 0.821226300, & + 0.833865170, 0.845880090, 0.857282640, 0.868086640, & + 0.878307700, 0.887963240, 0.897071780, 0.905653240, & + 0.913728360, 0.921318710, 0.928446350, 0.935133760, & + 0.941403690, 0.947278860, 0.952782090, 0.957935990, & + 0.962762950, 0.967285100, 0.971524000, 0.975500880, & + 0.979236420, 0.982750770, 0.986062530, 0.989185090, & + 0.992129920, 0.994907680, 0.997528200, 1.000000000 / + #endif _FV_ETA_ diff --git a/scm/src/run_scm.py b/scm/src/run_scm.py index c7a7b63f2..0d04edd25 100755 --- a/scm/src/run_scm.py +++ b/scm/src/run_scm.py @@ -9,7 +9,7 @@ import subprocess import sys import time -from suite_info import suite, suite_list +from suite_info import suite_list from netCDF4 import Dataset import importlib @@ -208,7 +208,7 @@ def find_gdb(): class Experiment(object): - def __init__(self, case, suite, runtime, runtime_mult, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag): + def __init__(self, case, suite, runtime, runtime_mult, levels, npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag, timestep): """Initialize experiment. This routine does most of the work, including setting and checking the experiment configuration (namelist).""" @@ -309,11 +309,11 @@ def __init__(self, case, suite, runtime, runtime_mult, levels, npz_type, vert_co self._n_itt_diag = n_itt_diag else: self._n_itt_diag = DEFAULT_DIAG_PERIOD - - if suite.timestep is not None: - self._timestep = suite.timestep + + if timestep: + self._timestep = timestep else: - self._timestep = None + self._timestep = suite.timestep @property def name(self): @@ -866,7 +866,7 @@ def main(): irun, len(run_list), run["case"], run["suite"], active_suite.namelist)) # exp = Experiment(run["case"], active_suite, runtime, runtime_mult, levels, \ - npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag) + npz_type, vert_coord_file, case_data_dir, n_itt_out, n_itt_diag, timestep) # exp_dir = exp.setup_rundir() if len(run_list) > 1: diff --git a/scm/src/scm_input.F90 b/scm/src/scm_input.F90 index dd4f4df38..dcb18fc21 100644 --- a/scm/src/scm_input.F90 +++ b/scm/src/scm_input.F90 @@ -1302,7 +1302,8 @@ subroutine get_case_init_DEPHY(scm_state, scm_input) if (trim(input_surfaceForcingLSM) == "lsm") then !if model ICs are included in the file - + scm_state%lsm_ics = .true. + !variables with vertical extent allocate(input_ozone (input_n_lev, input_n_init_times), & input_stc (input_n_soil, input_n_init_times), & diff --git a/scm/src/scm_vgrid.F90 b/scm/src/scm_vgrid.F90 index bde37775d..f827f89f9 100644 --- a/scm/src/scm_vgrid.F90 +++ b/scm/src/scm_vgrid.F90 @@ -350,6 +350,14 @@ subroutine get_FV3_vgrid(scm_input, scm_state) scm_state%b_k(k) = b64(k) enddo endif + ! xi chen's l65 + case (65) + ks = 29 + do k=1,km+1 + scm_state%a_k(k) = a65(k) + scm_state%b_k(k) = b65(k) + enddo + !-->cjg case (68) ks = 27 @@ -361,11 +369,23 @@ subroutine get_FV3_vgrid(scm_input, scm_state) ptop = 1. stretch_fac = 1.03 auto_routine = 1 - case (75) ! HS-SGO test configuration - pint = 100.E2 - ptop = 10.E2 - stretch_fac = 1.035 - auto_routine = 6 + ! kgao: introduce EMC's L75 config + case (75) + if (trim(scm_state%npz_type) == 'emc') then + ! EMC's L75 config + ks = 12 + do k=1,km+1 + scm_state%a_k(k) = a75(k) + scm_state%b_k(k) = b75(k) + enddo + else + ! HS-SGO test configuration + pint = 100.E2 + ptop = 10.E2 + stretch_fac = 1.035 + auto_routine = 6 + endif + case (79) ! N = 10, M=5 if (trim(scm_state%npz_type) == 'gcrm') then pint = 100.E2 @@ -377,7 +397,14 @@ subroutine get_FV3_vgrid(scm_input, scm_state) stretch_fac = 1.03 auto_routine = 1 endif - case (90) ! super-duper cell + ! kgao L88 + case (88) + ks = 20 !19 bug fix + do k=1,km+1 + scm_state%a_k(k) = a88(k) + scm_state%b_k(k) = b88(k) + enddo + case (90) ! super-duper cell ptop = 40.e2 stretch_fac = 1.025 auto_routine = 2 @@ -421,16 +448,24 @@ subroutine get_FV3_vgrid(scm_input, scm_state) scm_state%b_k(k) = b125(k) enddo case (127) ! N = 10, M=5 - if (trim(scm_state%npz_type) == 'hitop') then - ptop = 1. - stretch_fac = 1.03 - auto_routine = 2 - else - ptop = 1. - pint = 75.E2 - stretch_fac = 1.028 - auto_routine = 6 - endif + if (trim(scm_state%npz_type) == 'hitop') then + ptop = 1. + stretch_fac = 1.03 + auto_routine = 2 + elseif (trim(scm_state%npz_type) == 'gfs') then + ks = 39 + ptop = a127(1) + pint = a127(ks+1) + do k=1,km+1 + scm_state%a_k(k) = a127(k) + scm_state%b_k(k) = b127(k) + enddo + else + ptop = 1. + pint = 75.E2 + stretch_fac = 1.028 + auto_routine = 6 + endif case (151) !LES applications ptop = 75.e2 From cf542b4730ae8c206077e199e42fdab42afc2fe9 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 4 Apr 2023 18:28:44 -0600 Subject: [PATCH 02/81] Some changes to documentation. Work in progress --- scm/doc/TechGuide/chap_cases.tex | 54 +++++++++++++++---- scm/etc/scripts/UFS_IC_generator.py | 8 +-- .../scripts/UFS_forcing_ensemble_generator.py | 39 +++++++------- 3 files changed, 68 insertions(+), 33 deletions(-) diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index eacb6123b..87348a0fa 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -132,7 +132,7 @@ \section{Included Cases} \item UFS initial conditions for 38.1 N, 98.5 W (central Kansas) for 00Z on Oct. 3, 2016 with Noah variables on the C96 FV3 grid (\execout{fv3\_model\_point\_noah.nc}) \item UFS initial conditions for 38.1 N, 98.5 W (central Kansas) for 00Z on Oct. 3, 2016 with NoahMP variables on the C96 FV3 grid (\execout{fv3\_model\_point\_noahmp.nc}) \end{itemize} -See \ref{sec:UFS ICs} for information on how to generate these files for other locations and dates, given appropriate UFS Atmosphere initial conditions. +See \ref{sec:UFS cases} for information on how to generate these files for other locations and dates, given appropriate UFS Atmosphere initial conditions. \section{How to set up new cases} @@ -196,15 +196,16 @@ \section{Using other LASSO cases} \item Create a new case configuration file (or copy and modify an existing one) in \execout{ccpp-scm/scm/etc/case\_config}. Be sure that the \execout{case\_name} variable points to the newly created/processed case input file from above. \end{enumerate} -\section{Using UFS Initial Conditions} -\label{sec:UFS ICs} +\section{Using UFS Output to Create SCM Cases} +\label{sec:UFS cases} -A script exists in \execout{scm/etc/scripts/UFS\_IC\_generator.py} to read in UFS Atmosphere cold start initial conditions and generate a case input data file that the SCM can use. Note that the script requires a few python packages that may not be found by default in all python installations: \exec{argparse}, \exec{fnmatch}, \exec{logging}, \exec{NetCDF4}, \exec{numpy}, \exec{shapely}, \exec{f90nml}, and \exec{re}. +A script exists in \execout{scm/etc/scripts/UFS\_IC\_generator.py} to read in UFS history (output) files and their initial conditions to generate a case input data file, in DEPHY format, that the SCM can use. Note that the script requires a few python packages that may not be found by default in all python installations: \exec{argparse}, \exec{fnmatch}, \exec{logging}, \exec{NetCDF4}, \exec{numpy}, \exec{shapely}, \exec{f90nml}, and \exec{re}. \begin{lstlisting}[language=bash] ./UFS_IC_generator.py [-h] (-l LOCATION LOCATION | -ij INDEX INDEX) -d -DATE -i IN_DIR -g GRID_DIR [-t {1,2,3,4,5,6}] -[-a AREA] -n CASE_NAME [-oc] +DATE -i IN_DIR -g GRID_DIR -f FORCING_DIR -n +CASE_NAME [-t {1,2,3,4,5,6,7}] [-a AREA] [-oc] +[-lam] [-sc] [-near] \end{lstlisting} Mandatory arguments: @@ -214,10 +215,11 @@ \section{Using UFS Initial Conditions} \item -l 261.51 38.2 (two floating point values separated by a space) \item -ij 8 49 (two integer values separated by a space; this option must also use the \exec{-{}-tile (-t)} argument to specify the tile number) \end{itemize} -\item \exec{-{}-date (-d)} YYYYMMDDHHMM: date corresponding to the UFS initial conditions -\item \exec{-{}-in\_dir (-i)}: path to the directory containing UFS initial conditions +\item \exec{-{}-date (-d)} YYYYMMDDHHMMSS: date corresponding to the UFS initial conditions +\item \exec{-{}-in\_dir (-i)}: path to the directory containing the UFS initial conditions \item \exec{-{}-grid\_dir (-g)}: path to the directory containing the UFS supergrid files (AKA "fix" directory) -\item \exec{-{}-case\_name (-n)}: what to call the output NetCDF file +\item \exec{-{}-forcing\_dir (-f)}: path to the directory containing the UFS history files +\item \exec{-{}-case\_name (-n)}: name of case \end{enumerate} Optional arguments: @@ -225,6 +227,40 @@ \section{Using UFS Initial Conditions} \item \exec{-{}-tile (-t)}: if one already knows the correct tile for the given longitude and latitude OR one is specifying the UFS grid index (\exec{-{}-index} argument) \item \exec{-{}-area (-a)}: area of grid cell in $m^2$ (if known or different than the value calculated from the supergrid file) \item \exec{-{}-old\_chgres (-oc)}: flag if UFS initial conditions were generated using older version of chgres (global\_chgres); might be the case for pre-2018 data +\item \exec{-{}-lam (-lam)}: flag to signal that the ICs and forcing is from a limited-area model run +\item \exec{-{}-save\_comp (-sc)}: flag to create UFS reference file for comparison +\item \exec{-{}-use\_nearest (-near)}: flag to indicate using the nearest UFS history file gridpoint +\end{enumerate} + +There is an additional script in \execout{scm/etc/scripts/UFS\_forcing\_ensemble\_generator.py} to create UFS-replay case(s) starting with output from UFS Weather Model (UWM) Regression Tests (RTs). + +\begin{lstlisting}[language=bash] +UFS_forcing_ensemble_generator.py [-h] -d DIR -n CASE_NAME +[-lonl LON_LIMITS LON_LIMITS] +[-latl LAT_LIMITS LAT_LIMITS] +[-lons [LON_LIST [LON_LIST ...]]] +[-lats [LAT_LIST [LAT_LIST ...]]] +[-nens NENSMEMBERS] [-dt TIMESTEP] +[-fhz FHZERO] [-cres C_RES] +[-sdf SUITE] [-sc] [-near] +\end{lstlisting} + +Mandatory arguments: +\begin{enumerate} +\item \exec{-{}-dir (-d)}: path to UFS Regression Test output +\item \exec{-{}-case\_name (-n)}: name of case +\end{enumerate} + +Optional arguments: +\begin{enumerate} +\item \exec{-{}-lon\_limits (-lonl)} AND \exec{-{}-lat\_limits (-latl)} AND \exec{-{}-nensmembers (-nens): longitude range, latitude range, and number of cases to create +\item \exec{-{}-lon\_list (-lons)} AND \exec{-{}-lat\_list (-lats)}: longitude and latitude of cases +\item \exec{-{]-timestep (-dt)}: SCM timestep, in seconds +\item \exec{-{}-fhzero (-fhz)}: UFS frequency, in hours, for emptying diagnostic buckets +\item \exec{-{}-C\_res (-cres)}: UFS spatial resolution +\item \exec{-{}-suite (-sdf)}: CCPP suite definition file to use for ensemble +\item \exec{-{}-save\_comp (-sc)}: flag to create UFS reference file for comparison +\item \exec{-{}-use\_nearest (-near)}: flag to indicate using the nearest UFS history file gridpoint \end{enumerate} The following commands were used from within the \exec{scm/etc/scripts} directory to generate the example UFS Atmosphere initial condition case input file: diff --git a/scm/etc/scripts/UFS_IC_generator.py b/scm/etc/scripts/UFS_IC_generator.py index 3005a11b8..6fdbd13fd 100755 --- a/scm/etc/scripts/UFS_IC_generator.py +++ b/scm/etc/scripts/UFS_IC_generator.py @@ -58,10 +58,10 @@ group1.add_argument('-l', '--location', help='longitude and latitude in degress E and N, respectively, separated by a space', nargs=2, type=float) group1.add_argument('-ij', '--index', help='i,j indices within the tile (if known - bypasses search for closest model point to lon/lat location)', nargs=2, type=int) parser.add_argument('-d', '--date', help='date corresponding to initial conditions in YYYYMMDDHHMMSS format', required=False) -parser.add_argument('-i', '--in_dir', help='input directory path containing FV3 input files', required=True) -parser.add_argument('-g', '--grid_dir', help='directory path containing FV3 tile supergrid files', required=True) -parser.add_argument('-f', '--forcing_dir', help='directory path containing physics diag files', required=True) -parser.add_argument('-n', '--case_name', help='name of case', required=True) +parser.add_argument('-i', '--in_dir', help='path to the directory containing the UFS initial conditions', required=True) +parser.add_argument('-g', '--grid_dir', help='path to the directory containing the UFS supergrid files (AKA "fix" directory)', required=True) +parser.add_argument('-f', '--forcing_dir', help='path to the directory containing the UFS history files', required=True) +parser.add_argument('-n', '--case_name', help='name of case', required=True) parser.add_argument('-t', '--tile', help='tile of desired point (if known - bypasses tile search if present)', type=int, choices=range(1,8)) parser.add_argument('-a', '--area', help='area of grid cell in m^2', type=float) parser.add_argument('-oc', '--old_chgres', help='flag to denote that the initial conditions use an older data format (pre-chgres_cube)', action='store_true') diff --git a/scm/etc/scripts/UFS_forcing_ensemble_generator.py b/scm/etc/scripts/UFS_forcing_ensemble_generator.py index a685c3334..eedfa3c29 100755 --- a/scm/etc/scripts/UFS_forcing_ensemble_generator.py +++ b/scm/etc/scripts/UFS_forcing_ensemble_generator.py @@ -15,22 +15,18 @@ # Argument list ############################################################################### parser = argparse.ArgumentParser() -parser.add_argument('-d', '--dir', help='Directory path containing UFS output files', required=False) -parser.add_argument('-i', '--dir_ic', help='Directory path containing FV3 input files', required=False) -parser.add_argument('-g', '--dir_grid', help='directory path containing FV3 tile supergrid files', required=False) -parser.add_argument('-f', '--dir_forcing', help='Directory path containing physics diag files', required=False) -parser.add_argument('-rt', '--dir_ufs_rt', help='Directory path containing UFS regression test output', required=False) -parser.add_argument('-n', '--case_name', help='Name of case', required=True) -parser.add_argument('-lonl', '--lon_limits', help='Longitude range for ensemble, separated by a space', nargs=2, type=float, required=False) -parser.add_argument('-latl', '--lat_limits', help='Latitude range for ensemble, separated by a space', nargs=2, type=float, required=False) -parser.add_argument('-lons', '--lon_list', help='Longitudes for ensemble, separated by a space', nargs='*', type=float, required=False) -parser.add_argument('-lats', '--lat_list', help='Latitudes for ensemble, separated by a space', nargs='*', type=float, required=False) -parser.add_argument('-nens', '--nensmembers', help='Number of SCM UFS ensemble memebers to create', type=int, required=False) -parser.add_argument('-dt', '--timestep', help='SCM timestep, in seconds', type=int, default = 3600) -parser.add_argument('-fhz', '--fhzero', help='UFS frequency, in hours, for emptying diagnostic buckets.', type=int, default = 1) -parser.add_argument('-cres', '--C_RES', help='UFS spatial resolution', type=int, default = 96) -parser.add_argument('-sdf', '--suite', help='CCPP suite definition file to use for ensemble', default = 'SCM_GFS_v16') -parser.add_argument('-sc', '--save_comp', help='Flag to save a file with UFS data for comparisons', action='store_true') +parser.add_argument('-d', '--dir', help='path to UFS Regression Test output', required=True) +parser.add_argument('-n', '--case_name', help='name of case', required=True) +parser.add_argument('-lonl', '--lon_limits', help='longitude range for ensemble, separated by a space', nargs=2, type=float, required=False) +parser.add_argument('-latl', '--lat_limits', help='latitude range for ensemble, separated by a space', nargs=2, type=float, required=False) +parser.add_argument('-lons', '--lon_list', help='longitudes for ensemble, separated by a space', nargs='*', type=float, required=False) +parser.add_argument('-lats', '--lat_list', help='latitudes for ensemble, separated by a space', nargs='*', type=float, required=False) +parser.add_argument('-nens', '--nensmembers', help='number of SCM UFS ensemble memebers to create', type=int, required=False) +parser.add_argument('-dt', '--timestep', help='sCM timestep, in seconds', type=int, default = 3600) +parser.add_argument('-fhz', '--fhzero', help='UFS frequency, in hours, for emptying diagnostic buckets.', type=int, default = 1) +parser.add_argument('-cres', '--C_RES', help='UFS spatial resolution', type=int, default = 96) +parser.add_argument('-sdf', '--suite', help='CCPP suite definition file to use for ensemble', default = 'SCM_GFS_v16') +parser.add_argument('-sc', '--save_comp', help='flag to save a file with UFS data for comparisons', action='store_true') parser.add_argument('-near', '--use_nearest', help='flag to indicate using the nearest UFS history file gridpoint, no regridding',action='store_true') ############################################################################### @@ -40,10 +36,13 @@ def main(): # Get command line arguments args = parser.parse_args() - if (args.dir): - if (not args.dir_ic): args.dir_ic = args.dir + "/INPUT/" - if (not args.dir_grid): args.dir_grid = args.dir + "/INPUT/" - if (not args.dir_forcing): args.dir_forcing = args.dir + if (not args.dir): + print("ERROR: Need to provide UFS RT directory!") + exit() + else: + args.dir_ic = args.dir + "/INPUT/" + args.dir_grid = args.dir + "/INPUT/" + args.dir_forcing = args.dir # Error checking if (args.lon_limits and args.lon_list): From f0f368ed62ab8c173e81c5355a3caea35c635637 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 4 Apr 2023 19:10:27 -0600 Subject: [PATCH 03/81] Some doc changes --- scm/doc/TechGuide/chap_cases.tex | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index 87348a0fa..72c21ebfb 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -132,7 +132,7 @@ \section{Included Cases} \item UFS initial conditions for 38.1 N, 98.5 W (central Kansas) for 00Z on Oct. 3, 2016 with Noah variables on the C96 FV3 grid (\execout{fv3\_model\_point\_noah.nc}) \item UFS initial conditions for 38.1 N, 98.5 W (central Kansas) for 00Z on Oct. 3, 2016 with NoahMP variables on the C96 FV3 grid (\execout{fv3\_model\_point\_noahmp.nc}) \end{itemize} -See \ref{sec:UFS cases} for information on how to generate these files for other locations and dates, given appropriate UFS Atmosphere initial conditions. +See \ref{sec:UFScases} for information on how to generate these files for other locations and dates, given appropriate UFS Atmosphere initial conditions. \section{How to set up new cases} @@ -197,7 +197,7 @@ \section{Using other LASSO cases} \end{enumerate} \section{Using UFS Output to Create SCM Cases} -\label{sec:UFS cases} +\label{sec:UFScases} A script exists in \execout{scm/etc/scripts/UFS\_IC\_generator.py} to read in UFS history (output) files and their initial conditions to generate a case input data file, in DEPHY format, that the SCM can use. Note that the script requires a few python packages that may not be found by default in all python installations: \exec{argparse}, \exec{fnmatch}, \exec{logging}, \exec{NetCDF4}, \exec{numpy}, \exec{shapely}, \exec{f90nml}, and \exec{re}. @@ -248,14 +248,17 @@ \section{Using UFS Output to Create SCM Cases} Mandatory arguments: \begin{enumerate} \item \exec{-{}-dir (-d)}: path to UFS Regression Test output -\item \exec{-{}-case\_name (-n)}: name of case +\item \exec{-{}-case\_name (-n)}: name of cases \end{enumerate} Optional arguments: \begin{enumerate} -\item \exec{-{}-lon\_limits (-lonl)} AND \exec{-{}-lat\_limits (-latl)} AND \exec{-{}-nensmembers (-nens): longitude range, latitude range, and number of cases to create -\item \exec{-{}-lon\_list (-lons)} AND \exec{-{}-lat\_list (-lats)}: longitude and latitude of cases -\item \exec{-{]-timestep (-dt)}: SCM timestep, in seconds +\item Either + \begin{itemize} + \item \exec{-{}-lon\_limits (-lonl)} AND \exec{-{}-lat\_limits (-latl)} AND \exec{-{}-nensmembers (-nens)}: longitude range, latitude range, and number of cases to create + \item \exec{-{}-lon\_list (-lons)} AND \exec{-{}-lat\_list (-lats)}: longitude and latitude of cases + \end{itemize} +\item \exec{-{}-timestep (-dt)}: SCM timestep, in seconds \item \exec{-{}-fhzero (-fhz)}: UFS frequency, in hours, for emptying diagnostic buckets \item \exec{-{}-C\_res (-cres)}: UFS spatial resolution \item \exec{-{}-suite (-sdf)}: CCPP suite definition file to use for ensemble From cdd9824dbd3a9b3b65561e238648306a3f812c10 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 4 Apr 2023 19:41:11 -0600 Subject: [PATCH 04/81] Some more doc changes --- scm/doc/TechGuide/chap_cases.tex | 48 +++++++++++++++++-- .../scripts/UFS_forcing_ensemble_generator.py | 10 ++-- 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index 72c21ebfb..df3854e0c 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -249,15 +249,15 @@ \section{Using UFS Output to Create SCM Cases} \begin{enumerate} \item \exec{-{}-dir (-d)}: path to UFS Regression Test output \item \exec{-{}-case\_name (-n)}: name of cases -\end{enumerate} - -Optional arguments: -\begin{enumerate} -\item Either +\item Either: \begin{itemize} \item \exec{-{}-lon\_limits (-lonl)} AND \exec{-{}-lat\_limits (-latl)} AND \exec{-{}-nensmembers (-nens)}: longitude range, latitude range, and number of cases to create \item \exec{-{}-lon\_list (-lons)} AND \exec{-{}-lat\_list (-lats)}: longitude and latitude of cases \end{itemize} +\end{enumerate} + +Optional arguments: +\begin{enumerate} \item \exec{-{}-timestep (-dt)}: SCM timestep, in seconds \item \exec{-{}-fhzero (-fhz)}: UFS frequency, in hours, for emptying diagnostic buckets \item \exec{-{}-C\_res (-cres)}: UFS spatial resolution @@ -266,6 +266,44 @@ \section{Using UFS Output to Create SCM Cases} \item \exec{-{}-use\_nearest (-near)}: flag to indicate using the nearest UFS history file gridpoint \end{enumerate} +Below are some examples run from within the \exec{scm/etc/scripts} directory to create SCM cases starting with the output from a UFS Weather Model regression test(s): + +On the supported platforms Cheyenne (NCAR) and Hera (NOAA), there are staged UWM RTs located at: +\begin{itemize} + \item Cheyenne: \exec{RT_DIR=/glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs} + \iten Hera: \exec{RT_DIR=/scratch1/BMC/gmtb/CCPP-SCM/UFS_RTs} +\end{itemize} + +UFS regression test (control_c192), for single point. +\begin{lstlisting}[language=bash] +./UFS_forcing_ensemble_generator.py -d $RT_DIR/control_c192/ -sc --C_RES 192 -dt 360 -fhz 12 -n control_c192 -lons 300 -lats 34 +\end{lstlisting} + +Upon succesfull completion of the script you should see the following: + +\exec{-------------------------------------------------------------------------------------------} +\exec{Command(s) to execute in ccpp-scm/scm/bin/:} + +\exec{./run_scm.py --npz_type gfs --file scm_ufsens_control_c192_n000.py --n_itt_diag 120 --n_itt_out 10 --timestep 360} + +\exec{-------------------------------------------------------------------------------------------} + +The file \exec{scm_ufsens_control_c192_n000.py} is created in \exec{ccpp-scm/scm/bin/}, where the SCM run script is located. + +UFS regression test (control_c384), for multiple points. +\begin{lstlisting}[language=bash] +./UFS_forcing_ensemble_generator.py -d $RT_DIR/control_c384/ -sc --C_RES 384 -dt 225 -fhz 6 -n control_c384 -lons 300 300 300 300 -lats 34 35 35 37 +\end{lstlisting} + +UFS regression test, control_p8, for an ensemble (10) of randomly selected points over a specified longitude (300-320oW) and latitude (40-50oN) range + +But first, to use the control_p8 test we need to rerun the regression test and UFS history files with a denser and constant output interval. First, in control_p8/model_configure, change output_fh to “interval -1, where interval is the UFS history file output frequency (in hours)”. See UFS Weather Model Users Guide (https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html#model-configure-file). Next, in control_p8/input.nml, change “fhzero” in the gfs_phys_nml to the “interval”. Then rerun the test. On Cheyenne, for example, run the following command: “qsub job_card”. +\begin{lstlisting}[language=bash] +./UFS_forcing_ensemble_generator.py -d $RT_DIR/control_p8/ -sc --C_RES 96 -dt 720 -fhz 3 -n control_p8 -lonl 300 320 -latl 40 50 -nens 10 +\end{lstlisting} + + + The following commands were used from within the \exec{scm/etc/scripts} directory to generate the example UFS Atmosphere initial condition case input file: \begin{lstlisting}[language=bash] ./UFS_IC_generator.py -l 261.51 38.2 -d 201610030000 -i ../../data/raw_case_input/FV3_C96_example_ICs -g ../../data/raw_case_input/FV3_C96_example_ICs -n fv3_model_point_noah -oc diff --git a/scm/etc/scripts/UFS_forcing_ensemble_generator.py b/scm/etc/scripts/UFS_forcing_ensemble_generator.py index eedfa3c29..d4d1ac812 100755 --- a/scm/etc/scripts/UFS_forcing_ensemble_generator.py +++ b/scm/etc/scripts/UFS_forcing_ensemble_generator.py @@ -17,12 +17,12 @@ parser = argparse.ArgumentParser() parser.add_argument('-d', '--dir', help='path to UFS Regression Test output', required=True) parser.add_argument('-n', '--case_name', help='name of case', required=True) -parser.add_argument('-lonl', '--lon_limits', help='longitude range for ensemble, separated by a space', nargs=2, type=float, required=False) -parser.add_argument('-latl', '--lat_limits', help='latitude range for ensemble, separated by a space', nargs=2, type=float, required=False) -parser.add_argument('-lons', '--lon_list', help='longitudes for ensemble, separated by a space', nargs='*', type=float, required=False) -parser.add_argument('-lats', '--lat_list', help='latitudes for ensemble, separated by a space', nargs='*', type=float, required=False) +parser.add_argument('-lonl', '--lon_limits', help='longitude range, separated by a space', nargs=2, type=float, required=False) +parser.add_argument('-latl', '--lat_limits', help='latitude range, separated by a space', nargs=2, type=float, required=False) +parser.add_argument('-lons', '--lon_list', help='longitudes, separated by a space', nargs='*', type=float, required=False) +parser.add_argument('-lats', '--lat_list', help='latitudes, separated by a space', nargs='*', type=float, required=False) parser.add_argument('-nens', '--nensmembers', help='number of SCM UFS ensemble memebers to create', type=int, required=False) -parser.add_argument('-dt', '--timestep', help='sCM timestep, in seconds', type=int, default = 3600) +parser.add_argument('-dt', '--timestep', help='SCM timestep, in seconds', type=int, default = 3600) parser.add_argument('-fhz', '--fhzero', help='UFS frequency, in hours, for emptying diagnostic buckets.', type=int, default = 1) parser.add_argument('-cres', '--C_RES', help='UFS spatial resolution', type=int, default = 96) parser.add_argument('-sdf', '--suite', help='CCPP suite definition file to use for ensemble', default = 'SCM_GFS_v16') From e11e7f7933b673002ebb9c528485c8e113cac30a Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 4 Apr 2023 19:45:02 -0600 Subject: [PATCH 05/81] Some more doc changes --- scm/doc/TechGuide/chap_cases.tex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index df3854e0c..c1107d03e 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -268,10 +268,10 @@ \section{Using UFS Output to Create SCM Cases} Below are some examples run from within the \exec{scm/etc/scripts} directory to create SCM cases starting with the output from a UFS Weather Model regression test(s): -On the supported platforms Cheyenne (NCAR) and Hera (NOAA), there are staged UWM RTs located at: +On the supported platforms Cheyenne (NCAR) and Hera (NOAA), there are staged UWM RTs located at (RT_DIR): \begin{itemize} - \item Cheyenne: \exec{RT_DIR=/glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs} - \iten Hera: \exec{RT_DIR=/scratch1/BMC/gmtb/CCPP-SCM/UFS_RTs} + \item Cheyenne: \exec{/glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs} + \iten Hera: \exec{/scratch1/BMC/gmtb/CCPP-SCM/UFS_RTs} \end{itemize} UFS regression test (control_c192), for single point. From 3b7522974515a399494b494f341405bb8fb9ba2b Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 4 Apr 2023 19:47:09 -0600 Subject: [PATCH 06/81] Some more doc changes --- scm/doc/TechGuide/chap_cases.tex | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index c1107d03e..d280db4de 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -269,10 +269,8 @@ \section{Using UFS Output to Create SCM Cases} Below are some examples run from within the \exec{scm/etc/scripts} directory to create SCM cases starting with the output from a UFS Weather Model regression test(s): On the supported platforms Cheyenne (NCAR) and Hera (NOAA), there are staged UWM RTs located at (RT_DIR): -\begin{itemize} - \item Cheyenne: \exec{/glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs} - \iten Hera: \exec{/scratch1/BMC/gmtb/CCPP-SCM/UFS_RTs} -\end{itemize} +\item Cheyenne: \exec{/glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs} +\iten Hera: \exec{/scratch1/BMC/gmtb/CCPP-SCM/UFS_RTs} UFS regression test (control_c192), for single point. \begin{lstlisting}[language=bash] From d2451661babf5edccd944e747eda03a26a1b99ba Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 4 Apr 2023 19:49:40 -0600 Subject: [PATCH 07/81] Some more doc changes --- scm/doc/TechGuide/chap_cases.tex | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index d280db4de..355b8f93e 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -269,8 +269,10 @@ \section{Using UFS Output to Create SCM Cases} Below are some examples run from within the \exec{scm/etc/scripts} directory to create SCM cases starting with the output from a UFS Weather Model regression test(s): On the supported platforms Cheyenne (NCAR) and Hera (NOAA), there are staged UWM RTs located at (RT_DIR): +\begin{itemize} \item Cheyenne: \exec{/glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs} -\iten Hera: \exec{/scratch1/BMC/gmtb/CCPP-SCM/UFS_RTs} +\item Hera: \exec{/scratch1/BMC/gmtb/CCPP-SCM/UFS_RTs} +\end{itemize} UFS regression test (control_c192), for single point. \begin{lstlisting}[language=bash] From 1f9592ff67686d76620f9a6569f0a90acb32e97c Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 4 Apr 2023 19:52:02 -0600 Subject: [PATCH 08/81] Some more doc changes --- scm/doc/TechGuide/chap_cases.tex | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index 355b8f93e..70763ffc3 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -268,7 +268,7 @@ \section{Using UFS Output to Create SCM Cases} Below are some examples run from within the \exec{scm/etc/scripts} directory to create SCM cases starting with the output from a UFS Weather Model regression test(s): -On the supported platforms Cheyenne (NCAR) and Hera (NOAA), there are staged UWM RTs located at (RT_DIR): +On the supported platforms Cheyenne (NCAR) and Hera (NOAA), there are staged UWM RTs located at: \begin{itemize} \item Cheyenne: \exec{/glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs} \item Hera: \exec{/scratch1/BMC/gmtb/CCPP-SCM/UFS_RTs} @@ -276,7 +276,7 @@ \section{Using UFS Output to Create SCM Cases} UFS regression test (control_c192), for single point. \begin{lstlisting}[language=bash] -./UFS_forcing_ensemble_generator.py -d $RT_DIR/control_c192/ -sc --C_RES 192 -dt 360 -fhz 12 -n control_c192 -lons 300 -lats 34 +./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_c192/ -sc --C_RES 192 -dt 360 -fhz 12 -n control_c192 -lons 300 -lats 34 \end{lstlisting} Upon succesfull completion of the script you should see the following: @@ -292,14 +292,14 @@ \section{Using UFS Output to Create SCM Cases} UFS regression test (control_c384), for multiple points. \begin{lstlisting}[language=bash] -./UFS_forcing_ensemble_generator.py -d $RT_DIR/control_c384/ -sc --C_RES 384 -dt 225 -fhz 6 -n control_c384 -lons 300 300 300 300 -lats 34 35 35 37 +./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_c384/ -sc --C_RES 384 -dt 225 -fhz 6 -n control_c384 -lons 300 300 300 300 -lats 34 35 35 37 \end{lstlisting} UFS regression test, control_p8, for an ensemble (10) of randomly selected points over a specified longitude (300-320oW) and latitude (40-50oN) range But first, to use the control_p8 test we need to rerun the regression test and UFS history files with a denser and constant output interval. First, in control_p8/model_configure, change output_fh to “interval -1, where interval is the UFS history file output frequency (in hours)”. See UFS Weather Model Users Guide (https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html#model-configure-file). Next, in control_p8/input.nml, change “fhzero” in the gfs_phys_nml to the “interval”. Then rerun the test. On Cheyenne, for example, run the following command: “qsub job_card”. \begin{lstlisting}[language=bash] -./UFS_forcing_ensemble_generator.py -d $RT_DIR/control_p8/ -sc --C_RES 96 -dt 720 -fhz 3 -n control_p8 -lonl 300 320 -latl 40 50 -nens 10 +./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_p8/ -sc --C_RES 96 -dt 720 -fhz 3 -n control_p8 -lonl 300 320 -latl 40 50 -nens 10 \end{lstlisting} From 0ebb97dcdd956b1f288ee581407adcf5969d91bd Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 4 Apr 2023 19:53:25 -0600 Subject: [PATCH 09/81] Some more doc changes --- scm/doc/TechGuide/chap_cases.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index 70763ffc3..f9a3ff224 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -270,8 +270,8 @@ \section{Using UFS Output to Create SCM Cases} On the supported platforms Cheyenne (NCAR) and Hera (NOAA), there are staged UWM RTs located at: \begin{itemize} -\item Cheyenne: \exec{/glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs} -\item Hera: \exec{/scratch1/BMC/gmtb/CCPP-SCM/UFS_RTs} +\item Cheyenne: /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs +\item Hera: /scratch1/BMC/gmtb/CCPP-SCM/UFS_RTs \end{itemize} UFS regression test (control_c192), for single point. From b7de67c112412de6d58fcd6c11ccdf5156a05ab9 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 4 Apr 2023 19:56:48 -0600 Subject: [PATCH 10/81] Some more doc changes --- scm/doc/TechGuide/chap_cases.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index f9a3ff224..e39111d4d 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -270,8 +270,8 @@ \section{Using UFS Output to Create SCM Cases} On the supported platforms Cheyenne (NCAR) and Hera (NOAA), there are staged UWM RTs located at: \begin{itemize} -\item Cheyenne: /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs -\item Hera: /scratch1/BMC/gmtb/CCPP-SCM/UFS_RTs +\item Cheyenne /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs +\item Hera /scratch1/BMC/gmtb/CCPP-SCM/UFS_RTs \end{itemize} UFS regression test (control_c192), for single point. From 1ae173f0a79d524071306133d7099e29f6c6f864 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 4 Apr 2023 20:07:19 -0600 Subject: [PATCH 11/81] Some more doc changes --- scm/doc/TechGuide/chap_cases.tex | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index e39111d4d..a870b5322 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -270,34 +270,27 @@ \section{Using UFS Output to Create SCM Cases} On the supported platforms Cheyenne (NCAR) and Hera (NOAA), there are staged UWM RTs located at: \begin{itemize} -\item Cheyenne /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs -\item Hera /scratch1/BMC/gmtb/CCPP-SCM/UFS_RTs +\item \execout{Cheyenne /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS\_RTs} +\item \execout{Hera /scratch1/BMC/gmtb/CCPP-SCM/UFS\_RTs} \end{itemize} -UFS regression test (control_c192), for single point. +UFS regression test, \execout{control\_c192}, for single point. \begin{lstlisting}[language=bash] ./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_c192/ -sc --C_RES 192 -dt 360 -fhz 12 -n control_c192 -lons 300 -lats 34 \end{lstlisting} Upon succesfull completion of the script you should see the following: -\exec{-------------------------------------------------------------------------------------------} -\exec{Command(s) to execute in ccpp-scm/scm/bin/:} +The file \exec{scm\_ufsens\_control\_c192\_n000.py} is created in \exec{ccpp-scm/scm/bin/}, where the SCM run script is located. -\exec{./run_scm.py --npz_type gfs --file scm_ufsens_control_c192_n000.py --n_itt_diag 120 --n_itt_out 10 --timestep 360} - -\exec{-------------------------------------------------------------------------------------------} - -The file \exec{scm_ufsens_control_c192_n000.py} is created in \exec{ccpp-scm/scm/bin/}, where the SCM run script is located. - -UFS regression test (control_c384), for multiple points. +UFS regression test, \execout{control\_c384}, for multiple points. \begin{lstlisting}[language=bash] ./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_c384/ -sc --C_RES 384 -dt 225 -fhz 6 -n control_c384 -lons 300 300 300 300 -lats 34 35 35 37 \end{lstlisting} -UFS regression test, control_p8, for an ensemble (10) of randomly selected points over a specified longitude (300-320oW) and latitude (40-50oN) range +UFS regression test, \execout{control\_p8}, for an ensemble (10) of randomly selected points over a specified longitude (300-320oW) and latitude (40-50oN) range -But first, to use the control_p8 test we need to rerun the regression test and UFS history files with a denser and constant output interval. First, in control_p8/model_configure, change output_fh to “interval -1, where interval is the UFS history file output frequency (in hours)”. See UFS Weather Model Users Guide (https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html#model-configure-file). Next, in control_p8/input.nml, change “fhzero” in the gfs_phys_nml to the “interval”. Then rerun the test. On Cheyenne, for example, run the following command: “qsub job_card”. +But first, to use the \execout{control\_p8} test we need to rerun the regression test and UFS history files with a denser and constant output interval. First, in control_p8/model_configure, change output_fh to “interval -1, where interval is the UFS history file output frequency (in hours)”. See UFS Weather Model Users Guide (https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html#model-configure-file). Next, in control_p8/input.nml, change “fhzero” in the gfs_phys_nml to the “interval”. Then rerun the test. On Cheyenne, for example, run the following command: “qsub job_card”. \begin{lstlisting}[language=bash] ./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_p8/ -sc --C_RES 96 -dt 720 -fhz 3 -n control_p8 -lonl 300 320 -latl 40 50 -nens 10 \end{lstlisting} From 98c2163fd3b4baf1a40f75aa814127e645cdb5b4 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 4 Apr 2023 20:08:41 -0600 Subject: [PATCH 12/81] Some more doc changes --- scm/doc/TechGuide/chap_cases.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index a870b5322..eed6c1352 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -290,7 +290,7 @@ \section{Using UFS Output to Create SCM Cases} UFS regression test, \execout{control\_p8}, for an ensemble (10) of randomly selected points over a specified longitude (300-320oW) and latitude (40-50oN) range -But first, to use the \execout{control\_p8} test we need to rerun the regression test and UFS history files with a denser and constant output interval. First, in control_p8/model_configure, change output_fh to “interval -1, where interval is the UFS history file output frequency (in hours)”. See UFS Weather Model Users Guide (https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html#model-configure-file). Next, in control_p8/input.nml, change “fhzero” in the gfs_phys_nml to the “interval”. Then rerun the test. On Cheyenne, for example, run the following command: “qsub job_card”. +But first, to use the \execout{control\_p8} test we need to rerun the regression test and UFS history files with a denser and constant output interval. First, in control_p8/model_configure, change output_fh to “interval -1, where interval is the UFS history file output frequency (in hours)”. See UFS Weather Model Users Guide (https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html#model-configure-file). Next, in control_p8/input.nml, change “fhzero” in the gfs_phys_nml to the “interval”. Then rerun the test. On Cheyenne, for example, run the following command: \execout{qsub jo\b_card}. \begin{lstlisting}[language=bash] ./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_p8/ -sc --C_RES 96 -dt 720 -fhz 3 -n control_p8 -lonl 300 320 -latl 40 50 -nens 10 \end{lstlisting} From 076c3126dd2e6b96b388a173a7401473034e7977 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 4 Apr 2023 20:10:49 -0600 Subject: [PATCH 13/81] Some more doc changes --- scm/doc/TechGuide/chap_cases.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index eed6c1352..d94afb724 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -290,7 +290,7 @@ \section{Using UFS Output to Create SCM Cases} UFS regression test, \execout{control\_p8}, for an ensemble (10) of randomly selected points over a specified longitude (300-320oW) and latitude (40-50oN) range -But first, to use the \execout{control\_p8} test we need to rerun the regression test and UFS history files with a denser and constant output interval. First, in control_p8/model_configure, change output_fh to “interval -1, where interval is the UFS history file output frequency (in hours)”. See UFS Weather Model Users Guide (https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html#model-configure-file). Next, in control_p8/input.nml, change “fhzero” in the gfs_phys_nml to the “interval”. Then rerun the test. On Cheyenne, for example, run the following command: \execout{qsub jo\b_card}. +But first, to use the \execout{control\_p8} test we need to rerun the regression test and UFS history files with a denser and constant output interval. First, in control_p8/model_configure, change output_fh to “interval -1, where interval is the UFS history file output frequency (in hours)”. See \href{https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html}{UFS Weather Model Users Guide}. Next, in control_p8/input.nml, change “fhzero” in the gfs_phys_nml to the “interval”. Then rerun the test. On Cheyenne, for example, run the following command: \execout{qsub jo\b_card}. \begin{lstlisting}[language=bash] ./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_p8/ -sc --C_RES 96 -dt 720 -fhz 3 -n control_p8 -lonl 300 320 -latl 40 50 -nens 10 \end{lstlisting} From 6b1b1448a35c639c049f673b1c093076e79d5a48 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 4 Apr 2023 20:13:17 -0600 Subject: [PATCH 14/81] Some more doc changes --- scm/doc/TechGuide/chap_cases.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index d94afb724..105d5df20 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -290,7 +290,7 @@ \section{Using UFS Output to Create SCM Cases} UFS regression test, \execout{control\_p8}, for an ensemble (10) of randomly selected points over a specified longitude (300-320oW) and latitude (40-50oN) range -But first, to use the \execout{control\_p8} test we need to rerun the regression test and UFS history files with a denser and constant output interval. First, in control_p8/model_configure, change output_fh to “interval -1, where interval is the UFS history file output frequency (in hours)”. See \href{https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html}{UFS Weather Model Users Guide}. Next, in control_p8/input.nml, change “fhzero” in the gfs_phys_nml to the “interval”. Then rerun the test. On Cheyenne, for example, run the following command: \execout{qsub jo\b_card}. +But first, to use the \execout{control\_p8} test we need to rerun the regression test and UFS history files with a denser and constant output interval. First, in \execout{control_p8/model_configure}, change output_fh to \execout{interval -1}, where interval is the UFS history file output frequency (in hours)”. See \href{https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html}{UFS Weather Model Users Guide}. Next, in \execout{control_p8/input.nml}, change fhzero in the gfs_phys_nml to the \execout{interval}. Then rerun the test. On Cheyenne, for example, run the following command: \execout{qsub job\_card}. \begin{lstlisting}[language=bash] ./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_p8/ -sc --C_RES 96 -dt 720 -fhz 3 -n control_p8 -lonl 300 320 -latl 40 50 -nens 10 \end{lstlisting} From 36faf7ccca2b3fefe47b862fe096ae9ab2d890d3 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 4 Apr 2023 20:19:11 -0600 Subject: [PATCH 15/81] Some more doc changes --- scm/doc/TechGuide/chap_cases.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index 105d5df20..4a072ecba 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -290,7 +290,7 @@ \section{Using UFS Output to Create SCM Cases} UFS regression test, \execout{control\_p8}, for an ensemble (10) of randomly selected points over a specified longitude (300-320oW) and latitude (40-50oN) range -But first, to use the \execout{control\_p8} test we need to rerun the regression test and UFS history files with a denser and constant output interval. First, in \execout{control_p8/model_configure}, change output_fh to \execout{interval -1}, where interval is the UFS history file output frequency (in hours)”. See \href{https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html}{UFS Weather Model Users Guide}. Next, in \execout{control_p8/input.nml}, change fhzero in the gfs_phys_nml to the \execout{interval}. Then rerun the test. On Cheyenne, for example, run the following command: \execout{qsub job\_card}. +But first, to use the \execout{control\_p8} test we need to rerun the regression test and UFS history files with a denser and constant output interval. First, in \execout{control_p8/model_configure}, change \exec{-{}-output_fh} to \execout{interval -1}, where interval is the UFS history file output frequency (in hours)”. See \href{https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html}{UFS Weather Model Users Guide}. Next, in \execout{control_p8/input.nml}, change \exec{-{}-fhzero} in the gfs_phys_nml to the \execout{interval}. Then rerun the test. On Cheyenne, for example, run the following command: \execout{qsub job\_card}. \begin{lstlisting}[language=bash] ./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_p8/ -sc --C_RES 96 -dt 720 -fhz 3 -n control_p8 -lonl 300 320 -latl 40 50 -nens 10 \end{lstlisting} From bb311fa9ac419629a13acdfcdde6eda8474b7d8d Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 4 Apr 2023 20:21:01 -0600 Subject: [PATCH 16/81] Some more doc changes --- scm/doc/TechGuide/chap_cases.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index 4a072ecba..4f22fb626 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -290,7 +290,7 @@ \section{Using UFS Output to Create SCM Cases} UFS regression test, \execout{control\_p8}, for an ensemble (10) of randomly selected points over a specified longitude (300-320oW) and latitude (40-50oN) range -But first, to use the \execout{control\_p8} test we need to rerun the regression test and UFS history files with a denser and constant output interval. First, in \execout{control_p8/model_configure}, change \exec{-{}-output_fh} to \execout{interval -1}, where interval is the UFS history file output frequency (in hours)”. See \href{https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html}{UFS Weather Model Users Guide}. Next, in \execout{control_p8/input.nml}, change \exec{-{}-fhzero} in the gfs_phys_nml to the \execout{interval}. Then rerun the test. On Cheyenne, for example, run the following command: \execout{qsub job\_card}. +But first, to use the \execout{control\_p8} test we need to rerun the regression test and UFS history files with a denser and constant output interval. First, in \execout{control\_p8/model\_configure}, change \exec{-{}-output_fh} to \execout{interval -1}, where interval is the UFS history file output frequency (in hours)”. See \href{https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html}{UFS Weather Model Users Guide}. Next, in \execout{control\_p8/input.nml}, change \exec{-{}-fhzero} in the gfs_phys_nml to the \execout{interval}. Then rerun the test. On Cheyenne, for example, run the following command: \execout{qsub job\_card}. \begin{lstlisting}[language=bash] ./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_p8/ -sc --C_RES 96 -dt 720 -fhz 3 -n control_p8 -lonl 300 320 -latl 40 50 -nens 10 \end{lstlisting} From c4c861f44ffde2938f271db72bf437762b9e15ec Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 4 Apr 2023 20:21:44 -0600 Subject: [PATCH 17/81] Some more doc changes --- scm/doc/TechGuide/chap_cases.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index 4f22fb626..64e312d00 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -290,7 +290,7 @@ \section{Using UFS Output to Create SCM Cases} UFS regression test, \execout{control\_p8}, for an ensemble (10) of randomly selected points over a specified longitude (300-320oW) and latitude (40-50oN) range -But first, to use the \execout{control\_p8} test we need to rerun the regression test and UFS history files with a denser and constant output interval. First, in \execout{control\_p8/model\_configure}, change \exec{-{}-output_fh} to \execout{interval -1}, where interval is the UFS history file output frequency (in hours)”. See \href{https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html}{UFS Weather Model Users Guide}. Next, in \execout{control\_p8/input.nml}, change \exec{-{}-fhzero} in the gfs_phys_nml to the \execout{interval}. Then rerun the test. On Cheyenne, for example, run the following command: \execout{qsub job\_card}. +But first, to use the \execout{control\_p8} test we need to rerun the regression test and UFS history files with a denser and constant output interval. First, in \execout{control\_p8/model\_configure}, change \exec{-{}-output\_fh} to \execout{interval -1}, where interval is the UFS history file output frequency (in hours)”. See \href{https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html}{UFS Weather Model Users Guide}. Next, in \execout{control\_p8/input.nml}, change \exec{-{}-fhzero} in the gfs_phys_nml to the \execout{interval}. Then rerun the test. On Cheyenne, for example, run the following command: \execout{qsub job\_card}. \begin{lstlisting}[language=bash] ./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_p8/ -sc --C_RES 96 -dt 720 -fhz 3 -n control_p8 -lonl 300 320 -latl 40 50 -nens 10 \end{lstlisting} From f6de1981cbfa2b0621ebd796a38150e6f08b4584 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 4 Apr 2023 20:26:24 -0600 Subject: [PATCH 18/81] Some more doc changes --- scm/doc/TechGuide/chap_cases.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index 64e312d00..91c623f04 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -290,7 +290,7 @@ \section{Using UFS Output to Create SCM Cases} UFS regression test, \execout{control\_p8}, for an ensemble (10) of randomly selected points over a specified longitude (300-320oW) and latitude (40-50oN) range -But first, to use the \execout{control\_p8} test we need to rerun the regression test and UFS history files with a denser and constant output interval. First, in \execout{control\_p8/model\_configure}, change \exec{-{}-output\_fh} to \execout{interval -1}, where interval is the UFS history file output frequency (in hours)”. See \href{https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html}{UFS Weather Model Users Guide}. Next, in \execout{control\_p8/input.nml}, change \exec{-{}-fhzero} in the gfs_phys_nml to the \execout{interval}. Then rerun the test. On Cheyenne, for example, run the following command: \execout{qsub job\_card}. +But first, to use the \execout{control\_p8} test we need to rerun the regression test and UFS history files with a denser and constant output interval. First, in \execout{control\_p8/model\_configure}, change \exec{-{}-output\_fh} to \execout{interval -1}, where interval is the UFS history file output frequency (in hours)”. See \href{https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html}{UFS Weather Model Users Guide}. Next, in \execout{control\_p8/input.nml}, change \execout{fhzero} in the gfs_phys_nml to the \execout{interval}. Then rerun the test. On Cheyenne, for example, run the following command: \execout{qsub job\_card}. \begin{lstlisting}[language=bash] ./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_p8/ -sc --C_RES 96 -dt 720 -fhz 3 -n control_p8 -lonl 300 320 -latl 40 50 -nens 10 \end{lstlisting} From 04974c2343e09b3000169754575038cced60778a Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 4 Apr 2023 20:28:37 -0600 Subject: [PATCH 19/81] Some more doc changes --- scm/doc/TechGuide/chap_cases.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index 91c623f04..852ff7910 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -290,7 +290,7 @@ \section{Using UFS Output to Create SCM Cases} UFS regression test, \execout{control\_p8}, for an ensemble (10) of randomly selected points over a specified longitude (300-320oW) and latitude (40-50oN) range -But first, to use the \execout{control\_p8} test we need to rerun the regression test and UFS history files with a denser and constant output interval. First, in \execout{control\_p8/model\_configure}, change \exec{-{}-output\_fh} to \execout{interval -1}, where interval is the UFS history file output frequency (in hours)”. See \href{https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html}{UFS Weather Model Users Guide}. Next, in \execout{control\_p8/input.nml}, change \execout{fhzero} in the gfs_phys_nml to the \execout{interval}. Then rerun the test. On Cheyenne, for example, run the following command: \execout{qsub job\_card}. +But first, to use the \execout{control\_p8} test we need to rerun the regression test and UFS history files with a denser and constant output interval. First, in \execout{control\_p8/model\_configure}, change \exec{-{}-output\_fh} to \execout{interval -1}, where interval is the UFS history file output frequency (in hours)”. See \href{https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html}{UFS Weather Model Users Guide}. Next, in \execout{control\_p8/input.nml}, change \execout{fhzero} in the \execout{gfs\_phys\_nml} to the \execout{interval}. Then rerun the test. On Cheyenne, for example, run the following command: \execout{qsub job\_card}. \begin{lstlisting}[language=bash] ./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_p8/ -sc --C_RES 96 -dt 720 -fhz 3 -n control_p8 -lonl 300 320 -latl 40 50 -nens 10 \end{lstlisting} From 6124616d831bf3b2329a4d4664011f32e5a724e3 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Wed, 5 Apr 2023 14:20:57 -0600 Subject: [PATCH 20/81] Some cleanup --- scm/etc/scripts/UFS_forcing_ensemble_generator.py | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/scm/etc/scripts/UFS_forcing_ensemble_generator.py b/scm/etc/scripts/UFS_forcing_ensemble_generator.py index d4d1ac812..ea47638b1 100755 --- a/scm/etc/scripts/UFS_forcing_ensemble_generator.py +++ b/scm/etc/scripts/UFS_forcing_ensemble_generator.py @@ -23,7 +23,6 @@ parser.add_argument('-lats', '--lat_list', help='latitudes, separated by a space', nargs='*', type=float, required=False) parser.add_argument('-nens', '--nensmembers', help='number of SCM UFS ensemble memebers to create', type=int, required=False) parser.add_argument('-dt', '--timestep', help='SCM timestep, in seconds', type=int, default = 3600) -parser.add_argument('-fhz', '--fhzero', help='UFS frequency, in hours, for emptying diagnostic buckets.', type=int, default = 1) parser.add_argument('-cres', '--C_RES', help='UFS spatial resolution', type=int, default = 96) parser.add_argument('-sdf', '--suite', help='CCPP suite definition file to use for ensemble', default = 'SCM_GFS_v16') parser.add_argument('-sc', '--save_comp', help='flag to save a file with UFS data for comparisons', action='store_true') @@ -113,12 +112,6 @@ def main(): # Create SCM case configuration (etc/case_config) file. # ########################################################################### - - # How many timesteps between clearing the diagnostic buckets? - n_itt_diag = int(args.fhzero*3600/args.timestep) - # - n_itt_out = int(n_itt_diag/args.fhzero) - # case_config =[{"name": "input_type", "values": str(1)}, \ {"name": "dt", "values": str(args.timestep)}, \ @@ -181,7 +174,7 @@ def main(): com = "mkdir -p "+dir_scm+"scm/bin/" print(com) os.system(com) - fileOUT = "scm_ufsens_"+case_name+".py" + fileOUT = "scm_ufsens_"+args.case_name+".py" fileID = open(dir_scm+"scm/bin/"+fileOUT, 'w') fileID.write('run_list = [') fileID.write('\n') @@ -200,10 +193,7 @@ def main(): print("-------------------------------------------------------------------------------------------") print("Command(s) to execute in ccpp-scm/scm/bin/: ") print(" ") - print("./run_scm.py --npz_type gfs --file " + fileOUT + " --n_itt_diag " + \ - str(n_itt_diag) + " --n_itt_out " + str(n_itt_out) + " --timestep " + \ - str(args.timestep)) - print("") + print("./run_scm.py --npz_type gfs --file " + fileOUT + " --timestep " + str(args.timestep)) print("") print("-------------------------------------------------------------------------------------------") From d7ec741ad2914746a42994ae4d5e2446595d1a92 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Wed, 5 Apr 2023 14:31:03 -0600 Subject: [PATCH 21/81] Documentation changes for UFS-replay --- scm/doc/TechGuide/chap_cases.tex | 88 +++++++++++++++++++++---------- scm/doc/TechGuide/main.pdf | Bin 557759 -> 566134 bytes 2 files changed, 61 insertions(+), 27 deletions(-) diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index 852ff7910..1f53cf77e 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -132,7 +132,7 @@ \section{Included Cases} \item UFS initial conditions for 38.1 N, 98.5 W (central Kansas) for 00Z on Oct. 3, 2016 with Noah variables on the C96 FV3 grid (\execout{fv3\_model\_point\_noah.nc}) \item UFS initial conditions for 38.1 N, 98.5 W (central Kansas) for 00Z on Oct. 3, 2016 with NoahMP variables on the C96 FV3 grid (\execout{fv3\_model\_point\_noahmp.nc}) \end{itemize} -See \ref{sec:UFScases} for information on how to generate these files for other locations and dates, given appropriate UFS Atmosphere initial conditions. +See \ref{sec:UFSreplay} for information on how to generate these files for other locations and dates, given appropriate UFS Atmosphere initial conditions. \section{How to set up new cases} @@ -196,10 +196,12 @@ \section{Using other LASSO cases} \item Create a new case configuration file (or copy and modify an existing one) in \execout{ccpp-scm/scm/etc/case\_config}. Be sure that the \execout{case\_name} variable points to the newly created/processed case input file from above. \end{enumerate} -\section{Using UFS Output to Create SCM Cases} -\label{sec:UFScases} +\section{Using UFS Output to Create SCM Cases: UFS-Replay} +\label{sec:UFSreplay} -A script exists in \execout{scm/etc/scripts/UFS\_IC\_generator.py} to read in UFS history (output) files and their initial conditions to generate a case input data file, in DEPHY format, that the SCM can use. Note that the script requires a few python packages that may not be found by default in all python installations: \exec{argparse}, \exec{fnmatch}, \exec{logging}, \exec{NetCDF4}, \exec{numpy}, \exec{shapely}, \exec{f90nml}, and \exec{re}. +\subsection{UFS\_IC\_generator.py} +\label{subsection: ufsicgenerator} +A script exists in \execout{scm/etc/scripts/UFS\_IC\_generator.py} to read in UFS history (output) files and their initial conditions to generate a SCM case input data file, in DEPHY format. Note that the script requires a few python packages that may not be found by default in all python installations: \exec{argparse}, \exec{fnmatch}, \exec{logging}, \exec{NetCDF4}, \exec{numpy}, \exec{shapely}, \exec{f90nml}, and \exec{re}. \begin{lstlisting}[language=bash] ./UFS_IC_generator.py [-h] (-l LOCATION LOCATION | -ij INDEX INDEX) -d @@ -232,24 +234,22 @@ \section{Using UFS Output to Create SCM Cases} \item \exec{-{}-use\_nearest (-near)}: flag to indicate using the nearest UFS history file gridpoint \end{enumerate} +\subsection{UFS\_forcing\_ensemble\_generator.py} +\label{subsection: ufsforcingensemblegenerator} There is an additional script in \execout{scm/etc/scripts/UFS\_forcing\_ensemble\_generator.py} to create UFS-replay case(s) starting with output from UFS Weather Model (UWM) Regression Tests (RTs). \begin{lstlisting}[language=bash] UFS_forcing_ensemble_generator.py [-h] -d DIR -n CASE_NAME -[-lonl LON_LIMITS LON_LIMITS] -[-latl LAT_LIMITS LAT_LIMITS] -[-lons [LON_LIST [LON_LIST ...]]] -[-lats [LAT_LIST [LAT_LIST ...]]] -[-nens NENSMEMBERS] [-dt TIMESTEP] -[-fhz FHZERO] [-cres C_RES] -[-sdf SUITE] [-sc] [-near] +(-lonl LON_1 LON_2 -latl LAT_1 LAT_2 -nens NENSMEMBERS | +-lons [LON_LIST] -lats [LAT_LIST]) +[-dt TIMESTEP] [-cres C_RES] [-sdf SUITE] [-sc] [-near] \end{lstlisting} Mandatory arguments: \begin{enumerate} \item \exec{-{}-dir (-d)}: path to UFS Regression Test output \item \exec{-{}-case\_name (-n)}: name of cases -\item Either: +\item Either: (see examples bewlow) \begin{itemize} \item \exec{-{}-lon\_limits (-lonl)} AND \exec{-{}-lat\_limits (-latl)} AND \exec{-{}-nensmembers (-nens)}: longitude range, latitude range, and number of cases to create \item \exec{-{}-lon\_list (-lons)} AND \exec{-{}-lat\_list (-lats)}: longitude and latitude of cases @@ -259,14 +259,13 @@ \section{Using UFS Output to Create SCM Cases} Optional arguments: \begin{enumerate} \item \exec{-{}-timestep (-dt)}: SCM timestep, in seconds -\item \exec{-{}-fhzero (-fhz)}: UFS frequency, in hours, for emptying diagnostic buckets \item \exec{-{}-C\_res (-cres)}: UFS spatial resolution \item \exec{-{}-suite (-sdf)}: CCPP suite definition file to use for ensemble \item \exec{-{}-save\_comp (-sc)}: flag to create UFS reference file for comparison \item \exec{-{}-use\_nearest (-near)}: flag to indicate using the nearest UFS history file gridpoint \end{enumerate} -Below are some examples run from within the \exec{scm/etc/scripts} directory to create SCM cases starting with the output from a UFS Weather Model regression test(s): +Examples to run from within the \exec{scm/etc/scripts} directory to create SCM cases starting with the output from a UFS Weather Model regression test(s): On the supported platforms Cheyenne (NCAR) and Hera (NOAA), there are staged UWM RTs located at: \begin{itemize} @@ -274,39 +273,74 @@ \section{Using UFS Output to Create SCM Cases} \item \execout{Hera /scratch1/BMC/gmtb/CCPP-SCM/UFS\_RTs} \end{itemize} +\subsection{Example 1: UFS-replay for single point} +\label{subsection: example1} + UFS regression test, \execout{control\_c192}, for single point. \begin{lstlisting}[language=bash] -./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_c192/ -sc --C_RES 192 -dt 360 -fhz 12 -n control_c192 -lons 300 -lats 34 +./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_c192/ -sc --C_RES 192 -dt 360 -n control_c192 -lons 300 -lats 34 +\end{lstlisting} + +Upon successful completion of the script, the command to run the case(s) will print to the screen. For example, + +\begin{lstlisting}[language=bash] +./run_scm.py --npz_type gfs --file scm_ufsens_control_c192.py --timestep 360 \end{lstlisting} -Upon succesfull completion of the script you should see the following: +The file \exec{scm\_ufsens\_control\_c192.py} is created in \exec{ccpp-scm/scm/bin/}, where the SCM run script is to be exectued. -The file \exec{scm\_ufsens\_control\_c192\_n000.py} is created in \exec{ccpp-scm/scm/bin/}, where the SCM run script is located. +\subsection{Example 2: UFS-replay for list of points} +\label{subsection: example2} UFS regression test, \execout{control\_c384}, for multiple points. \begin{lstlisting}[language=bash] -./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_c384/ -sc --C_RES 384 -dt 225 -fhz 6 -n control_c384 -lons 300 300 300 300 -lats 34 35 35 37 +./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_c384/ -sc --C_RES 384 -dt 225 -n control_c384 -lons 300 300 300 300 -lats 34 35 35 37 \end{lstlisting} -UFS regression test, \execout{control\_p8}, for an ensemble (10) of randomly selected points over a specified longitude (300-320oW) and latitude (40-50oN) range +Upon successful completion of the script, the command to run the case(s) will print to the screen. For example, + +\begin{lstlisting}[language=bash] +./run_scm.py --npz_type gfs --file scm_ufsens_control_c384.py --timestep 225 +\end{lstlisting} -But first, to use the \execout{control\_p8} test we need to rerun the regression test and UFS history files with a denser and constant output interval. First, in \execout{control\_p8/model\_configure}, change \exec{-{}-output\_fh} to \execout{interval -1}, where interval is the UFS history file output frequency (in hours)”. See \href{https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html}{UFS Weather Model Users Guide}. Next, in \execout{control\_p8/input.nml}, change \execout{fhzero} in the \execout{gfs\_phys\_nml} to the \execout{interval}. Then rerun the test. On Cheyenne, for example, run the following command: \execout{qsub job\_card}. +The file \exec{scm\_ufsens\_control\_c384.py} contains \exec{ALL} of the cases created. Each case created will have the naming convention \exec{case\_name\_nXXX}, where the suffix \exec{XXX} is the case number from 0 to the number of points provided. The contents of the file should look like: \begin{lstlisting}[language=bash] -./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_p8/ -sc --C_RES 96 -dt 720 -fhz 3 -n control_p8 -lonl 300 320 -latl 40 50 -nens 10 +run_list = [{"case": "control_c384_n000", "suite": "SCM_GFS_v16"}, + {"case": "control_c384_n001", "suite": "SCM_GFS_v16"}, + {"case": "control_c384_n002", "suite": "SCM_GFS_v16"}, + {"case": "control_c384_n003", "suite": "SCM_GFS_v16"}] \end{lstlisting} +\subsection{Example 3: UFS-replay for an ensemble of points} +\label{subsection: example3} + +UFS regression test, \execout{control\_p8}, for an ensemble (10) of randomly selected points over a specified longitude ($300-320^oW$) and latitude ($40-50^oN$) range +But first, to use the \execout{control\_p8} test we need to rerun the regression test to generate UFS history files with a denser and constant output interval. First, in \execout{control\_p8/model\_configure}, change \exec{-{}-output\_fh} to \execout{"interval -1"}, where \execout{interval} is the UFS history file output frequency (in hours), see \href{https://ufs-weather-model.readthedocs.io/en/latest/InputsOutputs.html}{UFS Weather Model Users Guide} for more details. -The following commands were used from within the \exec{scm/etc/scripts} directory to generate the example UFS Atmosphere initial condition case input file: +For the purposes of this example the \execout{control\_p8} test has already been rerun, but if starting from your own UWM RTs, you can rerun the UWM regression test, on Cheyenne for example, by running the following command in the RT directory: \execout{qsub job\_card} + +Now the cases can be generated with the following command: \begin{lstlisting}[language=bash] -./UFS_IC_generator.py -l 261.51 38.2 -d 201610030000 -i ../../data/raw_case_input/FV3_C96_example_ICs -g ../../data/raw_case_input/FV3_C96_example_ICs -n fv3_model_point_noah -oc +./UFS_forcing_ensemble_generator.py -d /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_p8/ -sc --C_RES 96 -dt 720 -n control_p8 -lonl 300 320 -latl 40 50 -nens 10 -sdf SCM_GFS_v17_p8 \end{lstlisting} -Note that the \exec{-{}-in\_dir (-i)} and \exec{-{}-grid\_dir (-g)} arguments are the same in this case (since the supergrid files were copied to the same directory as the initial conditions files for point of example), but they will not in general be the same. Also note that the default behavior of the script is to expect that the NetCDF initial condition files were generated from \execout{chgres\_cube} and not the older \execout{global\_chgres}. If they were generated from the older version (which is likely for pre-2018 data), they will have a slightly different format requiring the \exec{-{}-old\_chgres (-oc)} option to be set in order for the files to be read properly by the script. If you try without the \exec{-{}-old\_chgres (-oc)} flag and receive a ``IndexError: t not found'' error, try the script again with the flag. +Upon successful completion of the script, the command to run the case(s) will print to the screen. For example, -In addition to the case input files generated by this script, one will need appropriate case configuration files. Make sure that the \exec{model\_ics} variable is set to \exec{.true.} and that the \exec{C\_RES}, \exec{year}, \exec{month}, \exec{day}, and \exec{hour} are all set to the appropriate values that match the UFS Atmosphere initial conditions used. See \execout{scm/etc/case\_config/fv3\_model\_point\_noah.nml} for an example. +\begin{lstlisting}[language=bash] +./run_scm.py --npz_type gfs --file scm_ufsens_control_p8.py --timestep 720 +\end{lstlisting} -Running the model is the same as for observational field campaign cases: +The file \exec{scm\_ufsens\_control\_p8.py} contains ten cases (n000-n009) to be run. The contents of the file should look like: \begin{lstlisting}[language=bash] -./run_scm.py -c fv3_model_point_noah -s SCM_GFS_v16 +run_list = [{"case": "control_p8_n000", "suite": "SCM_GFS_v17_p8"}, + {"case": "control_p8_n001", "suite": "SCM_GFS_v17_p8"}, + {"case": "control_p8_n002", "suite": "SCM_GFS_v17_p8"}, + {"case": "control_p8_n003", "suite": "SCM_GFS_v17_p8"}, + {"case": "control_p8_n004", "suite": "SCM_GFS_v17_p8"}, + {"case": "control_p8_n005", "suite": "SCM_GFS_v17_p8"}, + {"case": "control_p8_n006", "suite": "SCM_GFS_v17_p8"}, + {"case": "control_p8_n007", "suite": "SCM_GFS_v17_p8"}, + {"case": "control_p8_n008", "suite": "SCM_GFS_v17_p8"}, + {"case": "control_p8_n009", "suite": "SCM_GFS_v17_p8"}] \end{lstlisting} diff --git a/scm/doc/TechGuide/main.pdf b/scm/doc/TechGuide/main.pdf index 13ae9ed1a55bc979ccfdb0faf61e47d63ae8130f..3d6140383746de2f2beff9c7f316318a04f30370 100644 GIT binary patch delta 192595 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

`o`VA<}_rl8)OrjasH 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�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

0A>Kz4nCF@$KCK+J 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 b>Sp5N=H+5xiNMJPUc+KVprVpcl0^7Fw5Ajf delta 184222 zcmYhiQ*fY7*9AJUZQI5K6Wh+jwylYt*tR{fZQHhOW8(Av-#HiOVpZ+l)z#HE-D~gF ztDlESdxA-8za>FgI8*1uq0vBDI8s@-plN`kG+p~lX7rGoce++~EX9p~VES%K8@5_a zEyD=(C#}`S4x>|=oA60&?B%fi8b#^2yZ@r;0sY5f1>b z^P_)=cWp90cHB89u;Y_(tru&EeQ9|$mQTeJ8+WCGrdH#^slUYvOwE3wZf&AK2J7X< zxE?_7h*V!WM15QKC3${R`N-_EB4QR}fujns$$7#jKMF9g-&1C@ zwN*Q7zK4ng%am6~l-3f6q2op~GWlmB|EODhWru#+%`_lYr4@=h=^Aic5AW2`N>gcQ zG}cYo+HZbFO`~8;aV+DUWB%U7e5}Elp?oo1>xHFbb^=Rt_p=@hGIB}3pdSVBMp4Ct zaIhyAc)RSQe5n^Zk40#6#9Vld_7L_;LIWfRJ=hC>)|L;9-w zBNjoXdee)7ST5@NnJ0YB+q$)fBS)vytQXeM1C<${+a&~|aJ&%MLRpVt``=DG_eQPy z$48s1#osW!=*z0sHdUIi_>=%TN+jmi!wR7;RfCam4$PHH)jKr5Uv>xQYbS%4xdR^$ zf7Y(yy+Ccz=I3}N&G?KQP(Xf;=6mjX=kx2&H&(>GW^#s^_ijNt{%sILem22Zqw;U- zwr~8vPJJ*#K}{U73nC^PI$YsoTV#)A?AW)h4vU%{-fE%sIJPme$9h0yAI1tN1k*Uk1%$y^psVeYM7 zUhO<(s;FWFNl=+=;F(4aP#gF{pI|Ul-?4n*TUX((&yDh}4<$BwPc;!-^jYkhm5{gg zlVd!7^v2($rrEl-V9D$y4de{tTfnAZ3#6p45Nf7@;5;-&w_Cz5Kv<6AJzhEFg8?F_Vp%SkY(Lq_+QgVw)$41K4rYt+XXH6kL21W?nwvHy=ekQmE+3S!mm75^y)K&l-}s@wbEqmRHhw3l8>XjL)JF{P)~KmZowpF{ z+1Jy;`kt?habRE7ZuhpNpU=TxaGkDvcL8rF-p8+4jMOnqtAnPvX0KL>#fI@F-hDSx z_}N+a=W<#EHxX>uc81}z`ZbBH78y^JauEibmV}+U_WQe2M^7WI;N{O7snCppL`;l~ zdaT1k5DYs%K27r^D6q>@3%?q+Df|4mP-uxzt1!s`8V0gl{{A>>ZhvpzoJBs}=Gs!_hM} z6KETq4O;QHj-aYXZ;5RzRX8Y88dR+W^bO3i2fnyCtM$AW>A|SYCn$Mb3($oF41j%< z0sHW|C-?@@Wg?9h39yhJU+u2ogcK5oX^2wd-M=)=MLBV<7OC8eTGDM9e4UL7&*@VC zkxw*xejObD?C|oUKnwp0vfej7V4Lin*iBq&ThDGL)9zHlsUoXDZh|CFHw4TDklLW5=4y#Nw3e>!-HD94mudOMJhJ!+- zchBRT}CQL!0;%xR;wKweMD301hoc$+A_0x~;4%T{7i++8| z!qkW~V9Z>cz@hde!W{``Z^R*_mI)CgaR|xCzvLK>nI6^MZyGNWLWu%}%?axwM;>U%SI>W`{Uj1?=V$l_mUxneLo>0&IUAPFPz zm<$I2PIl)W3E&X|9eo*0fwM6netn3j<@`J^zUEeg8!TDe{lTI5EFq3EeZ6v=?#t|W zfEY;#kclzL1v*U+BSdZe5h3eQuZ~#&X2#%f!PE{SWfzG~UiQjs{}Se9&wLog%N+-A zRgE>JQ?HpMwHodeg-=ZtRe-=$S76A@-PdQ0ZSq8b?~f|>ug0Dc=TbJbM7D~Y9`sH3 zH9;7ee!c+g7yJSo`bCb26(r&c(x~M$hx89QAYqWXFBh^ZQ#DO}f;MQY!EXxdC_mZV zKyb)KWvD<P1uXnL+O0Dlf=FHSePJ8B|VL74xLU0GV7Gof6&WXYs#>%N2xKn^?JpJ_gl5L ziA?e7!^izq??(WOGPB62#V;W{N}M=3@gZYWI}DgxFttaR3+FGy89lk zV3~>1Iejc>N&mWdLuRC|<4WCjwr^6X{h1LR&rX97lzCZI{*>>Z#{WnEViui>3J6}r z??*wAE&HR$RYC=s6XKYjyQHF&AaI2tm6qC|o)vfOas!{5I)d<%Bh49cWM04G4nxB=P62L*{A0t?;Bbcs6UZrWeAr#uEncKjeTp0Na^ zbtDh3`JC>6sgKOntTAq7PaF-|XyDVPXMU-vy$8>|r)c) z5lW>e_}`K6f+;Y$y14@1PEP|b7D9h+(fEo?`ev;m7e$HSy?0j(80sIs(ion%Qq9=*+RM}};)J=SFw#uL zQ8-#cN(V%AVH~yv4@wE#x&waYNHN%o;@UV-G`r);$?<{k^f8;P-1K5=^p?Lh%<&}oV@4RN-U7HCnJnTqn{_hJ?Xbo$m)Q_mrA656+CJCnFv3^JKOXL(3L?2#$ z1+D|cYLG?=YX|bMaLm1r!goYb?-nDKIJF_DgPdG_sW~}R<$D_WnEGN5qVG#7 zorTCWdtn9s86wgo)d(L)y%2$~SK}GRdk6Dn=g9lnup_etPJmP>V;8S1CqUbnKSgPX zPkGYEp!4zKjG<1WTR+y|kU6?TH%5Amq|Ws9WBIML;s1&=P!7%pP9r_2M0O*L25Fa0 z=)`18cCeq^%!w@T)WDRMtv!Al!dG{XFwqUHD48-U1x6^?y>bbNrv-9JZ&Qep&2nU< z*I0F(o_->*6FR>dzT@_Mnf?fBej-;uoj^*Y3_Fa&k|WE3zKV=PYZQj?ZV<6o#3Xw= z$DAJKo+Kx`4c(5BQO9{G%o>H1G)ISfPaYyfCdx}CQU^Xj4CLPSLVyqA-N5r;xfm4x zfSgTYo9Tq2K^_vshuC4UbDHyroAi%TN2S5Zox`a77f`)R!F9lgy+VmX#Dc+8HVGY96;xnU50G2~cNAh^MyLpOrh2MKqdD zgC~bKqzc2fPfQ@DqI6tT7$etjROg`ay!tJhAj(E+u1vW^lU|fa#cNV>PGQd~@+{hC zg5+9G?@Vrs=2#frXPXj0Li~_r2oAn?Oln6tCrDY13&=YDq6=$lEwXK(k&Yzp?bnQ^ zO;aSF ze0~(BU`1W*HF~}2v}S%tAU$4{Wf4*HD2~|Xw~U`n!UA3?@9#16k7au$ir)g_p8;oq zN!3Y3?f}d}-a1%B&gX658KT^a)2EwlJJzveZTEKC^{$JTjqe9auKCu+jJeE0SI&2R zmg~$)#g$VNA5`JG!*Z8qP7M=B)5P>ZyD+F zUhn4JoNkd3c^azZ@zaSKzZc9_-nq!j&;p25-=7EvTm-&9w}6z$<)bADi`(;wiz!b> zpmj5YEb48)*Tp_Hw|O0MAF!*YbSjbmmm*IsAV{NcB4(;s6q}6sLAjH#+~u^&2jpiy z#3HedmsBj_9>yT6(DH1y?icghVGhcfW^MeH8t-tkM0>I|>sGppj<8qtF5Jh%*eU%d zPQgx_uLKhDv$TN?Dg6rdCyEp4M}REUa~yjnUaPQgK2r_@GrKpUm$?r~?Q zo%`+9{^q*Or)@8vl1VG)zWLeYwZtb-@Rqk9YDh#;kINif7`@~Q0T&zo1C0TcHiPdc zr}vC|hYomc18<|A{9<+>a11POTntL2t zg{h8b>tq!koOzmB%JL(l*a%Wbj;)PG#CKx!W~XI~v3F<2N4o3Zu~KrTw!>`G3g*ER zfaDGuh~3LC-To`zGlBR4d0vai!VhVVa_e3mLZu|vMcWyqs(}+(yGSy1%kG9My=)4) zBB7ShFH=u%NMtvxuGD*O2>9XLBu2w}N3P2L5ftO~S4C$h=BP)jSmkSgV8p{5Cx1pY z8ay3EH(<(OkgN|jB{D0HgI7Z^U>C+B2R9%hO&fn_J{aM|N@Y zMmE+t40L#gy#|BAbH>>vi>krbueCF10uh1^*Zh$oLdss5#T>l$22^UnB;$=0tuc}+ zt%qjb@kORa^)=ZL8;Gko{Hu`!qm4k5gs6-4pKJY*4l3s9AL;B>dCV0a(^4u;HB@Gom8#*NW~CxFOA} z=1D&v8j(2Bz_;MzPnX4hu+jWJ<{I%y!`VqMvS@$>w;rkMi=b48tUSsPZG66XrbFo{ zvmP9i#I87(0+Q^KeYF3+_PNfi!iKl6EL1P*xAnYz;l5d4*39dx09{23v%oBvT?g$}nM6c1ltt2=B>rp1x$H zcV@OPT1?EJ$bwqY6F8kh_V`fnX5K-uNfp(EZqT9Ki#{pH_dkey13Z7$y7>LI_zhPl zCaKPe1kjBrDDy()RgbWPj}ctpK-RI0^KZ%;v`B`s{Mtn$uFla5!y$~Z`0u=MZbAnx z`BiYosci3_nvB{}l?tB^M}#eANYQ%2L)7;$seEfuCnk}QrLY<0zl4e1GNaTnQ}iIQ zan@19%XVopKFtp6n!|PXCwiV25rBIz=fStk04V=Hs0F2b7rRV<%;M&dI)Roz(Jh{V z>l$e7b@Q;=oZRr!Ux5l16fbc$olNMJ^*y<{A49tTT!4l|=3A5{fDG7tEQ6dJv>vJk zX2~Qz!vm}#gP^J~M++-ywtpoH?KzIHmI~Ymep*7FBk?N&IeT_=9TSzzzeUu|j(&O) z10v8;bBL30EYbNXijoVv2Xr!3A?tiyyj72lp263(?<1M&Z{Hm+8&_+uxgFOg9lhW` zbeJ$7qIGk0T$ljQ_sVy<%7$tl{j9HdldjY5o{=&HwoS4#V#2f{!rs7&6_J43tIO}& z4^LWGuova-?FNJoXt$M2{q~`^gOSK3;OzM!ap=uNlW3)aN`E`2>)YG6oeKzXeWas* z95ZrsTh6Zh?s%)s$>sHxW?U;eQN-z!4*@v@rSc~rQY7dT=m%sB}%?Qb&Da#>*|Mv&IJWNJnRd^*7O z;D$BHz@qfrX_}&RA2;oq8B=zAxJ0ikXU6fjsHdddIQ}u?jJ}O`yAfA2RaVR6MX5kMF3;8n}meP{oBO%l{gy7rmN zJh;D4W-;j+#DD&Ul!{uK>c0nq2FA+Fm8i6Y)`0Jm1_R2%_P=;6qzo36jpcuFX#6lN z=uh_l#YS0OaGIgWpz{^h8H&h{}QY{oO`cL;xN zvhoK*XbjQG`iy0Vu~etyR25qqG+-#ZIF}m5#2IR3gEMGD^Ga z5KlWC4hs|+q!BDqn0-j=J0qj~xR3LI$)FgbC<{OOdo{ zt^+mksSAD%wG~@sRDwx;2hW*aXHQzXojw0eC?NHcr=K;6$wa_9OW@k$qRu)Eq{M@KOa`&QzYn0>p%ami7or{&r>pR;-hv`}`e&M+OFuAh?&5N$;mCmIQ1XVk`ZO?j*gQ&cRj_P-`ofo-rm zu8~OE`XofU*4YwiOwp=Noa(%X$~~}TGv~{ikwY1_jmd6Ob-eDlWb*;f4&F zbF!=0>m@?bLa0J_$J6uQjOMRi9`ad7 z`6E#C@6|W?$4P1Dq%m!cs!e{fczX*v8n{0pqc^dl9=kwA`g(GK1@?tVycc`1cyXo` z$|>{yh*U6Or|tFDz^&3wt6ppYE}5_v*6KNaJuNk?jji1Uer1=Lg!e=L5@$O}&JhZL z8i6Zi)&iyLoWDYiwD$T-Y3bgCdt{}XZ6Y|iWY-*>X@(>JRdgc|*ryQSqF3*N z^KWAH#9GWlwPLbYu^c4VsVH3UiY+V5+>j6LPX}bi zH%QqBJD|K2f0rl}W%+FYRM4t5M@^ai3Z}GQPO*Bq2qmdC^p)4X?>_eSCwC2@TW3Qq z=G?vKUYXpoyo{lo4qQU?928dj!hLp1IQ|c-OPj-{&5RCsC3SRV(PWJjcJPc#coJwQ z0bBF2x}kp#{~k8~+Wcma+TfKQI(N^aWK2X5i11v=EP9f+3JggE^q3B&)XuG?G*2OE zoL|M2kAHv8$8xx@GN33Iny?an3N0him-fl`-0nJEltrDv{kwhx702$J$*mL$hqgfL z>BVi^CJMtFVZdwEzFEVoMdA!*S(R2_yO)d><~V9juA?3pbd)B$=QFdUTgt4oen+d* zCMSC|e4#$#kUxtCBu>G)&O%!-8Mz)4=buH4hLaat9P=KO*DqihgQi^9FMnDTkdn@Ec)Iq~F3GZP5X`v+ms|MtR>9Rk$ z{ucJGw|kh2*tErJoV)wp428_bl(|P`oJr6w=}k6qsur}oL4_+_!<`pIZmNz$qd^e5 z-(z11{IQ}H6EHQ#@keuM+Bo&z*iVN0)QWv&qAKn9O3V*I1LgXE2{E%~4;GA-oArO} zn9!aK4a&-$sJMjLATU4z3(CydU^I0Fm5Kriir!$n^k0UZyCG!93<`uJwT}WCt^Py_ z9)vSh4g-`eG5CQIu(ikIg#WtM&yT$bJ$)2bnny;L-1tjZiy*cDvJsHykgaXB*amm` zF#q+=$4e#ikuV;vQb~k*cX;xjc0;3lLP}ToU#o0>6reIjM+NvZ<4*pH(hT-(q&16V zDZRudtC(aJH;vx&mw^F?z%T`;H8ZV(6XZgM2d&Yb*^Tc4>IXHb@k|3z0+NrusFXP( z;Bjo~*}zi!sMv~F;+C*U{Mg9B4_P%v;NYx-{SG+|sLuAuVBYmO$kC+9t4@C`muD?9!y*xZo~i z!l2OuNlXBfbd(ha9FB>kpp#fsfbKgFh8^3(a1SKq>Mr1?M<)2moig&LXpyAwE|ZAP zO&2Md4YSO2Vy)ug5N}Yfun{w2gi(;gEyQ>MHNC7RIz>gmXpV`=pK#S)!a!(ZQQT0L ziHXX9L{}D^(caOZbmI1Ye4*ymK=&|l=uQkNXe59X24r~bKfqicf$7bxinNNJ{)I&m z4T%;}wh>jg;lyJR$O@{u#1KOUHB+X?yIG^5tRwKK*Pz+M8g}!7O!1=s=g0wuguo4p z*)hn{-)%5G1`EPL1HFe)8vv3EpZI5&E3iUBQH-o3sx=}cSdzA1C-C!A=t-J@r__3p z2l)MYccL#XTBqe*ovuJh6?ihk*xKC!}++j>mQxjcbLn0jcrr#^7K2mn@H-%gs5F6K`^lsR>`T-XNXzu)pa)o0dU zT~ue@vgQ;%wQ^%Znbv2{HNgF$ETG;g>wg`gRdQqnK_W*c1ROZ#c8iir=|?)| zzebSr`6_li1`<3aHzcr+WAq%8QnwG&+iA3?`Eqi%PqIOYQd1SO;M_01^+e z1RiQVQJD%$eP6yk!miBc!?r2}zk7PT$N+&X_pPJLk@8ApIh=LSW6Zz zf7&>6mlnF#KJM$Y-6GT1TDdb9y$an}dn}$A*B3nR;iY-yV=bD5V&E^CNk_O#7*L`5 z74hnK!f{tvOZCF0wAQ}%#OYYo0P~;q#Ot4^ITvN0GHNrXVD2I&pw|rWedv}yv6?;`h&YxrWrSjT2#cjPt+~fF))Eg#r zd`yCTLUnl0hM6w(Q5>IDs97v6bcx}el@W(PDG}3ga#ig8^PjCNv}M+jZWcDhQ#qQ9 zX{SoB%tdW@ymWWmGjByy_6x}rn6kaQUyV9i&>Ft) z+^D0g>Ioyy{x;GnW%BvnPp{6cIq_L7qmvez*n+{eOlq75BbzU(6X!%B+?IK?6;_X( zR@jKoSsqxp?u6uCIA|`F?h-Z{Lu}IwHP0?Xi4~O?%Kk65wcLtzt!ekL|lRr zd9Cbb%k#SG+l?a-g*VEZ?%j&ZS#q^x z19j6loF|kx@w4%mk->A7xE$QW^53@DjAZ&8nK@atVikV5lQ~F%pl4)%NAu>zZ2Pq zz#M^=q>U>SYoU1DGPo>wNF8>_-i^D}g{W0b{d-j<;eMS)>W-wO$lF1Kn<6~7p8Ic- zlEO>NX5^zSpz+eOXra{r7ks=}&0gZ<*qw~Uw1;VWHcab{5qiyJLVLj5Cj|Flhwnn? z@NG$IvAw8lV-x`jLnWVHHlaBpN753|(5n=o5GqpiZo5pOr}CzqT>A2|-LX=Ezf2nc z852KxZCMkZC7wyHKdu)h#WAY!8Kf_$5kKlr9v_2I2^~)}bJb`3l^>OEhQ^L(i>RGvIla~u0mMGLY zcMs;|Jm6qZe$dfSVq9aXZoh_nWNG;_$d*CAzUnZ^p)x|I%|Kt5B;5g_n)0@6ZU}l> zXH0CvQI4@#5ua;>Tm!I0YSvjBk`-6Ql8KQAMO=ZWv2sKwRUj`dEN$h9BV#221;;2S zW+fk{sVzXS+n1f+B}SnLBWq1$#q-y9fKUCZ5GA~kK+?m#XlU?Ao&y2 zk7@`V_5(B_0T-kR#ypRNZ9~(5dqNaCs6Rt^mP85^q`3?mWCJk$AOrX1#)15hX6~Ql z$|*N9XXb$0Evm)&<B8zLZPC|OEF z%g!r_~hp0mSNr$#|DqwLC1pb3?$aG8c; z#LdT-!G;-u{{yIT;srGxX|Rh?;6p6I0}WXnVC5V9(YVYHvU=MDp%x?}$H3~E(8+q+ z5>R$^5>eLvG6%qgq38%l65F^f8%w-9Zll89k z|BeH*H0F1}1jBMr12ax!9~v7QD|(;HCL@lsuhD(Eum`>!Swv$k#2n0#U@$p}_&c+` zzq<@|UyNQ2+kSOqJO>_3#p@SeJk@G(t=oKmS$;08dA1Yk-~(wcOsSDgJlu|36DBYk zoUN%wM%(jI^c{su7F}DrzQRfN9JL;zuV$)mFCfR;EBT|i~aIPN0!^9cV zgu?Y^^=x^L!7J%p>KkT@oVvl@Bno6t*O08vzsT?^_QBn~O@@c-gWVTcCSsz@R?%)N zF!z)7Bw`Nsw+ip~Gy%8H_n|8VSJfpxiQm2vg+TklkP%GGiSY(=e5I|;vPXwqWi8p9 zhuwVk*5vZRS8i(LOX79tkrjXCaOS|qHPP10R^$Vho$NB9w6J`vT0sJDEXF)k^Suf& zA&Bd*jHgLg0frrV0^ZlDr>RR^38qvy1wHSN<;v$cdL-SLMaR2`Bc+O#h%mi9w18~q zC!p^aS&`7upLfk%rR?j+LzB*Y9)g;i>2{#!YwfH1Pm7+u?swINZ;wt-NBXPpYu)=w zx*Epa4M;ixA zuzlv%{xt6)Y`o0u^=@)(9YL54y1rX`q!n$3vk!hpqB zRM|n8a4?Kzk76=}dtxC{Rw<%h$d4qGo0jU!Eco5gQ z8VL4x*i0g3Ng_pUPmSnXVef09UlGBLE<)t4EJlG4z5Q-(PxF9ee%8kl`S)`rH+gW2 zV{Gv)u&TdRQP) zq+aUjeL37kgV|<}5GjNpEo7f=TYv$7yM=J3jWP!LE6pr}8D5hEv(ceW4N2SQ6APJ; zFE^LN>iptC3}#L*Ns)_Hnwk)kLc4XO&;+X(*3A~%Y>jwxa4oQ$_cm{R0H6S;vPLVR zAeCNUFaM2cJ3+Oq2Ysdq z0dAkp63skfOytS}OMP)=T}{OKe%$sayD5>f-2uDTyV2HQpLe_r-UxO|eWRmA5Bj>B z8gEiPzJYlV2mvu+yJ@(soAL;j5?-jCp7e%o!q^7=(jecxrW;a8l#aRShOJ~vXvZsK z48%=I^G48O=(-!8nPTS#VlCVDP+b+{%AvDGX1dJt^EZK<&NTlC*!7U&2oyR(^G)qM z2b;{(b8uJq!P{+ZbLhZriERsu;lGZNYoG~btt~ZQ0R;VjL^`Gb;sguI`M=)y|44TZ z=Rbk?N?YH4g9{b7DPew=g0u?$77gdy6k*D2+_FaOYi5evCRMcM#@t;kqc?By(*Ft( zkrOtJm5f&K?4+QLZ^ky~Io%7V3(Ag(VHYmoo@>27H4ZxNWZ4+gl+t>Z5P!&A6% zsQdz7XEh{`uKNsQ z+xH=;pVh9Onjn>;44FuMlj^$jhS_33eMp%>eR!C`TCoT4e7Jg8Yc!n%@GZG3*!9iy zLs6deGBEG@VLNA1+Dk%RjKtU{3bp|ltOrpAL`wF8ek|b(r2$13ssk>CR5)GDbweN| znEA{fdk0+?k?fd(O(p9CXJ>0BQC-b^5Q~_1ftKyEM$0(?KB*A1rPVKss_ml>kRAW&fdr7~5&u!oF~Ex;Rci3V}Fo;j_r1SNU!+2XY8 zuiZ_1#{RZND7ieJ#+71z(P&4-*e+mmV&NH2BIH#l>A^C;d7tdFx#=NFrVj(Fu(>YY z)xwp7K9cAje-CpW>ItfJI^{3Ejrt04FU5(10@I1ZF;S-(^TBstk)c-fsJF*FL%&sb z9G`<>6N7FU;}YT${pef;)n}-FrPIOU)+4%J>*jJYYO&je6GOg22mQE`0S_Q|S`)!C zyDct5SY6=0wv2wO<*wMl8OEnzL241sS{K>JFCVh>x37*tEzWY!SHyV1a@_53MKSLF zB;^k;C~x8|T)AWA=Lu^l9mm!@`t5RkQ0ZPC@y9`yCWLaD9T%hvBq9*fH>#1}0_Bq3 zXSnjb$F3PM-y!t8k8y;+_6P8C20i=qbDmRjhlEeUGw_jbKC(XM5&FKrc?;WElqO0k z7nLB-G>UcCLJ8%Z0bF#Y^XyN6ca-<_E$660oI?D}c_DOh zlz8wwZnW#e+mQ0Hfn}rrUjhW8=Vc7S-!*roo`D}chcigr&EO(D#1;S)_?2HC0dgal za!a71Yu!@la9AD%>#b=i7}%b~d{6Te5C3qXjQ;AMqVY~RJTppdV;)z71G1^VNlTRN!!zc=WO4br` z^zl2F(i7#igoV9KcqVV0RZgCMr%}ME)a$L$U^p@{pPa0$V3z|K5b&)Ei^HG+zpnRr zIsF^Kn>K46mL}W|mhP-}RdQ{yyTc3qwrCuOgr7L0ZCQEA9w#OSO3?8RoKh zwt!_buE6n(bL{|s@h!bJ6=Qb7+&yb+oo$K_eA>sSSOby_MEYVX)idKNpe!38Ju8@R z1f+bw9{wIr;6tQb$k|~O=tm1jrJufNqADa*eoQfY;=r5tk$g^A>8Dyw%xk4Co(QS_ z?&4^6;f=q=Z&@!J z@BD7M;tMMf6d*f-vt0TSI9kvv(R{6z^=EH;~#$R?FoYd=!CL7&!}3l`cq zPuQTnT8;RDqRsDj`ehi{`hOVv6+5IyB;Xxl$$#=3UTm-{2h)5sdSP3xxthFg?#W3! zIQ>}Czlo!Cttg&#h9bK(TGef&ac~wJr({++d^naZikaoHl91FPk9qFBBi?OI5p36LPl8(W>c%_@x#t!bkq!$M|e4{=Bl3J{Y)*+Bj?VbT}K!$nYo6yxX9^w6rn zhmkZF?IJAEVUEeuxqWb! zr*^?VUav1vG&YB0Hne!q9BcLP3bCVlb}LqOiwuO}-;W|y%oIv_spBLY(!cA+lUM#p zil)awGc@zsMQnJAoZf9~L=dsdD?#PbsaH~D$yp|$4{c5H6pTN_{gdR`DJJjzo*1e z34ef%Tn6mZoz*{H3PTZ!WOiuTc+)X-7cHM4NuQmP+e(Qw`YPFFSWf(m+8>NWA$jSA zTbR^|(PRg)UZIwJj5c{G_5T+tQlIjNFB@I?GKeP~4RVWzLh27ee%{4+O;=GI5Houm zK8xttz0F_x$#RqSc^~zMYM`@N_V|I+r%(*nVIRuBay2>@)Ej-)^S8|)m_D^7<2vio z1W0iM9Hg`vhu0mp{i1ugv;J-^nOs6wOe0yLW|%gqmW;DY7OfX+3I4Il4Y&Rc)Ik;J&bUJ&khZ-Qk*fQvBL}uRWlNdkJRL2cvf9Qa9Lx zgwQ$$^K!|7%w(s}ANX%?E;x`=NZ}NJJ(I9ueJggA5+Bd#juD%{m&#CLS4DZ?)Q4)5 z1*R-Zdq_7SZoDq=N=j0!T}u!d*X0nSs2O_#ZcuLOAQCLkbgyW>H`q-NAht6ijFir| zB~<^_ZfWJNj$#YfApOwET3=bJxgl}SY;ogtr;w_2g|zFnbGzvOI{V725&F9S>x*nM zl!2M48!ruM&Wfy_YBCeh5Na?s=nksPYoVXVQtcavO%$uo>@d|+80uNh4Za&E4IpL7 z3-e9#Ejn%~doTkUTBz@U8UMFBj$rrXjKqkf%}$@Hntc+SbTStpOdUU?Q^WD)wgk}~ zNy^^qh@1P)-DK*0xZ?wAsN)0NL%m1Ug|stK%-jC6EBV17c!kTgv#0)e)e%{9&xMg7 zw9%&9r6?&F;IgCKxRq&;o@$gjF1Fu_6!9GN^c8`hitU{pb;Jd7Ssu@*JTQDO_n*Hu z5a!FAzZn`h_pJ;=KE&NQXp%E?rxEeK7NmCN=}Il?>~#9r@Md?^h-ZxM+vn}H{O24Y z#O-N4w&Fsl(T39#HyL=emPCMM)VG`W&s+A1k1jxf@0H`*t=kdG#iEUHjF99V-I0HX z;6!DuWv649!I|CbG&i`Fk4mM;UGn0&Bp`<0p|ttE7a@1e?L#+P>6#8>Z)X|Is^w>5 zv@H{V_dkKIPf)i1E2+``drbO2L5U5FosIK9vo8&xv1W%Mf$Wo8b1LDHS7LoZQ6D#H zBq&X8f<`mA-cQFz zXWJGyB>QV-T;E^D-7I;&PnNRc-N-&Vk`c00RBrhX-;}%{LMp7*f8Ef5l*SGk{wguP z|MUxvqYR!YNY~1>kfMHHJT%`{lO4y+ewE@k6dSMlf8hK-*e0^@aw?j^&tz};om^k^ zWwJ-$-SRFXcn~6{fZ7qzgAerehmZ9Eq|A--l(5Di+D0K>iLiz3{JE?@tt~(E8C>#|e|A-^d#jMZl%=?u9|0%x$$wU?dJLBAN)p|*aC^vs!o@h9 z%R#aW)sLrTLysihnx#HH=<{89X8fqv#l+su^4jsUU4smwzbX)86a*!&EvY>vAwDRk zBepd=J;2Ycp6}S!{x-ij0D2^_A%9p{CslT|9(je_t2(r`JRPL~**pX9o_(;))I=u= zZGzw@(SEBLQ#7)~&lijdItDUBVf^Tn&>_RZ?S__BO4FGEW>OWA+L40Y~lj(WyFfERO<$@uV7LD!5l48WzMOBpF;`HR7|sG-er zBMdjv8i2b%xPP9f(=pf@LtB`3ysl_k%u+3VjBySBd)RRiC@+|_l6A%qBOEpi>>s10 z`-neMI;dSzZn%hsHs^wk7&HuAo~)J-*11TRo@85;hYV$z7B9w_Scu14gVh;LS)oesu%iO2A|0t%gmMJG$%2ht z3j*UR_$tpPW(es-%nxlR3T`j$yzj079O-&~JMqYP&i1c9 zwi(VBfvhfs)i4&$goN1Z6SC?gx-a!dwW7Zrzq^6I zbNsr93LLb1B|-u^V1NFKk4Gnsus^{>2H^$uS?s^t^+Lq&L{UX>MqldB6Eu}RGc%%h-psQ+yer@!;3WiVt-W3Z@?5twGd>IV>L^dOSd zCCVpx1@~jYFaTb2_XEys*P0HJONNtJ5UFg%0KL8JRG z$PN|U%S(kb>87MhrFV>4+yBGVIYnm{Y|%QlZFOwhb~?6g8-Hxuwr#VMbZpzUliTN< zJI1{ayT*R1dfK~ctvSD0qOf#GaWO3jxoZn{Rj-FqH~wzzbuFM^%)vCl+6j?j^KT1& z((9>Gl2kBf6$+A!#Oy>Uynv{2jqimYZJ-x@-2Sg`pj`Lx6nvvNo`d$Ch=Xp_v9CJ3 zvAo`~yEMnoGjF^fg0U_*N5m&mMd!g?rhVmLrq;hmI|wx-cxV?1jH~DBkxxW}Xd|A| z)oJtxhGTqICd?9{)=_WfLQrVIm#D$qm%^LUP;##~3Q&hC2`NaKZ2+3#HdGK=BZ$r< z6|^#NGB6=S_1`Af?C)rgArB!0%3f%X>FzkjG@4M6&sSa7FKUaz@Y+R-)m$*~ zEK}`4Fi90lbE}=w@E078^%bc0dylb=8AKWZp^!1CDuSb;A^?O)5%=p4{QD>P`zPD} z4N~8x8=RlyHk`_{d-4VPpmi{TaKNomR^=)6hIfi67zcW*uC20eQZ7=z=x(>|R$!Z5 zfng}4L_5|sWdqe7Yc@Qg8Gvr6V{w_*C^*PgLsOB4an3T-!z^XnWJU~kKyUpv_sz)7 z9={8Z6RvTD5%6pC!PNAUUaXzdz};IDYu}LQX*^)|0CIZE0|jbVXef(r2(d?mwHdoK z6*#_=FnXS?xJ~3L;-k~wGAuz=J(Umr*jSq%Cw?qi0}Pq-w0NCdRNFrEonEzOUUY(M z5KUVemI7B+cBbZUMd&EE0@qC&C+LPVA{_x~W*KX!Bf!>l2ND(os?B6f=rk;qLika1 zql5qr_tX!gMld`6GvE45Y3$pqT(RyziZ%X$w%w1O+scXYPLr@q#);q+EOLD-_1R%D`T}R2wY{q@*`hneh zxOo%6?A>d|B8Zsp8&q9@{Is}Uw+ako|3%a20tmU>BKbz$??ae*bT1E;Q5l+=H6(`F zU#nx&(Nz81wWaC(SKiV?Li5EQ3(3s+6CUN{Ppfvp;$+lh!f79;7NS^hl-gk?&A@Cn zFi4l!3L>Y>@vb#Ewg^{{r#7<$Ul3UK(bwKf;v&=j?hhww*#5WJpnjWD83m%6WWCBJ zz*ezzXl>8;1DEv}mi5?rc!&5Kl0I-6!MQO1 z@o@~&1H>+zqlIC>;1{jc{nJG$^p5gBm*6m?ECaFMJzhZ=o!-X$?qY2SkTRzx1P>b(o_ii(L~jT-xTbQ`DWfic@qM-Ei{ez;P>O{M~MH^ZM}Kd}L=v zOGj`0v>MGYD$N7EyG?l(CmwMU3c6o&8SB#(+#c#+h3dtq_da8jTc$ql&##L|068PE z*}7fH{Cc5gGaH3KSDGn>q@dU6hnZS^*0sjbZ&=%TI``=lmGR^nYp~_zh~~oJX7=AE zKho9)10!Pgj-Tj8w|0~7WtMO3sjjD8Pc(hr+3b)iDZ5~Tn(Bx6T%?M*K@egVaN51 zT=DOhxkFS1u^FUImNSXMNu~SjZ^6e}!_9n(k&oCkyBE4=7PlRVyT>GgM(i_r4B(HK zkd4ahcE$PDqS3L2Q)GnV6hqPSI@tKN%-mL{Q&WTsCHWF-XaBq&Wn+VYPNw10@K&6D^hb4jrB=movRu>G$hydTwD|*HKg7H0v(s zvn@nIFS@W=i3qp8X7?c7JeMzf&DE1$`X*G`zlbpoq0kd;)6$x=d}^QWKj5wpyxug6 z;Z$istGDuXvm{#V{_ce2a97&+Lc3J50T!8_fSFxI>B2V2?q)UHEMN?NrKPG$FbKMd$ zAK-)HZ*1K4vzt4s9-CfP25DjT*`C5&Q6O@aQpcRuyuTBp@97Qz@M1NSqFGs=(1<%I z>P4SYWN{PMNf8}W=#~`Alu^^dvPY;4EkT=h4f=|#;~XzCvG4JR5hLYMS2e6o&u-~7 zO;u&gF9Ph@y1!}ZWR;-?rj(gP~eeK z23T$iiBDciWK}GHue9ayjPFgfQvMkX*3K$V3@8pbQx;ykUhww?rSTRxYb%m15N3u{ z85FxzhVlvz!JI&eBAZzUmGFDXG!|yhY0mEl(Xbvc6$109Zf<~KzR+w&se`WqaLg<` z+lJRE#dLR%8hj85Hhc9}T!9r$lxym6`Fj5wCxUA-@K+t6d{2!;m1xOqq__)AV+66g;{-GZl@)6W)ogMxLLy_Zvu@p(nt;l9{rw zOfGpeO_PT7I7&gd(o%L5>$^*DGD$>a>1Y?vr#ePY$Oe@u5?zL}NKuP|1bMK}L@}eSfWaS!1gYN1UMRHlSIlk+r|8twlUU$899AoRHJ-dy*pT*^; zS7&keC8yr%eu5)-aIMe~+XwLWb$#Na<(%uW)k?+%%Q|~tm#`yB2g0+{8yGy59Oe~5 zQhYc0fZsxYL-2Jnrr99OT~OSaeYol+7t~X2b`YLDroI_SLFg=&QBO6ICKsgbwHPS$ zdmG{~k0RVM&aBAjnS+$4qCoUo6z!>zIa%j_@#%sO-}NP&^}>M8p92tMVaOyfC0MlM zm@x~Trk#k38uXR??zd5%AMAj`RNv_?69b-$#E>OD6(827NZ1)tjr&|-tdRaR&9>LAa@#6b>E@+Gl{2@2gIYoz$< zx5DXNkw(-;0Jy=RNH}4^vs>_mRh)or`dJjEIOw-Y(~!j|1LdQG1;f7r4}ms)+Nx;J z`iXzz1U_fAKB|l>L-F3B*%9)JVbOU+%I+-En4ru8?I31!&H@~Z7iftnF5{dA;WhDp zLskWyxr`R|ErCs|(?ls1kN{m%ttuj{kF|ei+q7zbUq2(IgIhYU$J1D>;n>;R7i)CrorM;6*90OaDGbP z-+m5P+in2nE0yUZ!u-eUSJ%WR)Z^`YW7E2{=$Nu(YuyBTe46bn&>`A{=ypKLg!|97 z@RL`+L4X-`I7DVbIci({$CgduTbdd8l2NGW#|F>BjhPEwK_zol#mE}|`1TY1W&0g| z@{ZzSf(MYW_73|J)eN(uK#Of%3)p$TXT{AV#^q0dSyQ~Nav4x2Z&y2o*exf<#o2*i zx$RkYd|Wx!aatK6r$R?fAxjr{@!QoM$EM!u21YO5W*&?n zDR!4thSTso%gc%B%1iLfwpn z%*LkS^@doPjJ??z;az=5dw&NRU)H6|QNANx?gL|nkyHn}_#y>J(T1ZQc?oVHw@a+- z+}Hqr9e?%r%UGB_2jnQ!TpJFwOLKF+7KwUYDFh&y_sq6l^v z!GjSImhM*zM!6OR`F&&f=Rm^Wzrh=HeSl^+2#B_yhmB$n>COx+o_ZfiZRPr3UcO4P z4RQ%wL^KR^M9^kOmJ6yU_nIpZRPPEY-2h#t>NX6wb(c}FiN#%~0z&c0gg!35?JcTr z0~9T#rd=Pu)k1~&rY367Ep~WdeSf2{$Z8)~#r7}fnH10e4Sy_0cfBcQ!XolWF3RdI zvTiFo#=21=Z zW}TMJ!zPBI+;%kr9@1p~F1pZ{q+9Y>O#zqtyt#e6cJ8nD#3P6+;#U33WNN3Li$;s6 zMUHI&0Bw))Wyiu$Uxl%;rU5fHk}?F}Ar$YTQ`ZQQro1l?$9 z^32G-Lpc~8#124cA)oIlmvs|TyaKL+VnJ_Ldui15--z<$EZgPN=j@tE_H9m)gKyi7 z5*le^wmyJPTx0kMWmxp}Y{V=kWTnhxVOrAjzo`CTb;eoFaMjB`p-nRW`TV7X2Ps8W zY7E}qz~t;?uCJfx%R96J=NpJxAvzwyh@dtsxYE@G4#1A`R5_j1X(X|$R^8An*E*pM3e(_o)7@y)bLk)41nnX zT8$!RcUx57lkt=xr5ij;7j62x~Hl3gLeB5q)9f?5lCl+6hA&F7-LWs;0C zXHgo^0Ie!LV_p7!6|6ShO$JE$^O|VzvDmmvagIVk7X=8TU5fD#NjqUPR2V{WePZ3tJ8!3&UW(Ccb?3K z8G)c=#z8+_em>CJxf9#vGl))s(clI6$KPT)dXsGD9g^z}Pw`)GivpNXqo|CXYB?S0 zvjxBiy!&%Nyr}jNQ}Z_8sEBA@bxO~h5wepB@M-y+xrklKjWQAHfzikxineHD^Ob{+ zEi~8Syt_!^d3xJ_f#y&f?`*JtF_yU|=@l#4g=yMs-)NVQ1BV0$+Y$4qo@yu&BT7;z z$%8Wn0RaJ0fpkn|vj9WQyAdiB<_*4&N8m8XNzi5l11NkA6|yDvVoJ!Wo&wlzkrv9G z7_=p&_;svUcUmnDf<<>`lCNkmY14Y-KA0%mj7cVA4Y$G_1#;EZStf!Wi-w+DEJY3a z$=wPhffR8Q8}R1z*^E_#dEjti1eV(jUSdYP8#nj+w_=dQ@&LB> z!_#-SM_`ySAM3#~6Y%L+e^w(*Dij}vCL6SORpkp~J`mblss>)gMTL5p!}At-OE3`8 z3lBWf5*1ijO#$ct6C`pzc^C4W?zGU}K;Ujwp$Ju1!>a3Zg%cRY|E$| zt(Bd#N`^yT6~QmmJ)YDOi9AVt9_YsMjakR0QtgX6PJlJhTBBoS5XVjZ?7K1Frm(zL z$`#Ge>@ApF#%=wNCmtm{Cp`-^ixJ`jls4QBESR7DMye}^&kW3x zt0F6jnk(3#+i0NJ-2#pfCm+}E{5zQbfWNk}2gQkIC{RUGW8ouTE803S_gsqsxwz^B zEi{h7n}EIkg<(4oG`!z$2~A4Z8%Hp!h&z%X-|97%}>FtiL=V-A%RwAv19zZ&&bFy!CcXy9+E(uDl))w zmy+i~G=z&=0!UlY*jioAKw9HrgumQdz*}EKNA}CHrRxl57W<+G&qPWbFfU&+mS(7~=J|f|Pi4Bn!|A$gxRanSUxQh_xwGZy!raJ;(*# z$I;8@KGzp}lkFa+)3$5Ad|oqxKRW*CJn1ioT~sXcqFz%V%_Q-77QkxWzBunrkQy_& zD7+?>k>2G5GYVbS)y;gvvd&E({kJ$sgO~+I0AXSNpUBGckMH}h$SN0wCjr;$NgN4#@`55a8@-$ke7Jd7Jh&Mym-NAs=KDHskyh$UEOnFP zTGC5;H>&uUN5RzhHhOR^PHc$HjvRt0+izD)x2YCN_ENX7W3EcTmgDi7Jyt}KqIx3BovTGrR`#hhPA4moC{nnN-VIgq9e zU;f6xYM~p20Y$)8w^7<;#F~P)(O!kW)ULz@4Gn6LQG>)}tO|ln|L?`VP*QKFNK-N>$Sp1O zDVKnX%mEX997?2p2?5p8sc2|pz^I-ug7()HG-!>TF}-I04E-Tz|H|h6b}Lh8aOaOn)(t#y254`#u!w4 z@Y{pQ8o>B(zJJqd;zwge7D~gnl|tAW4Q(%uqCH_@^k0<6p3xILC}}aH_!+#c&C{<9S#%K*Rz> z3>lPNG)qD5LGzx6f9Eix>N(xCR)RErD{-v~4r-y=DiJ-Z;dIP>aQU8WSo^Ty@ivu0 zI8K{9JF%5bkcaT1KQXQ=NLm3slPn8c)KK&R`aVio46Jfm1fz36`>^GKj>RG8Uy*#e zJGZV`i#$lK8bri8L=H^*+FExhfczS>D9ieOTMr80J{j0e#MD>eFYvKxtD` zb8gX#Afd-#&cUmhuXz#A-SLZy;+MFud%&~c#TkN*M&2e~ErZ*bOT-C3x57o!)`szW zeS|rnXRSj7aEZa$DRBKfrtJccyVA(NwMB4kSL@!U{j0(EY4ZB0stPg;&~`RY7(kE- zgOgPIXVN3KOn1v4f(B(7jTxHqJ`?CW1Vtj?dj8j%$NlrxZMqT3fKhNW@H zSD+gPec+eU{S6&*kZ6SLS;>c`HO70(EA7|ledeL6PdFcBe@fzBt6c@lM$=8d6)t8s z1hm5Re*Q6j+dDUi2Hl(AjSgv_gi#CBH_Hp;y|)%0Ta9{~J)Cwc0)6X09o2{k91QLp z8%YljPh(GIPkUtc_L$cfZ0r?C@T2+Lj5vquid(a?sV_A^4liv)`o&LoduznRB|BUD zX>|zRgR^%%VV7B)fxooB0DnN{&MXvpv@|6v_JR}oqu#H&k=mJvFhH1Azdc4K`NfAm zqlKQWV>f$VPhpikZ>Dy{4>#ujBbTB9bN;t61IqLdq55yA2##*t2Kzl<-=O^oxKWL0 zWTDC~L2XCrsV**FCipcm6^K}=E%CbpsprGpg?%rjjGk@dik<(n;mV=~=ONrl7L59b zYWw@06lLGe4sVBFu4ok{472g#xmlaiGK6EXI(rm|apTgI+mn@TExRK|ZJw^!MYsFc zl0C-{j^*nP;NpZk3uV207O5m=S*Xyc^zoBg^`fzoL4;5E_;sj z*KD}QvV$Sk@k#@em>}K2Lx^eToFBVd3=({cMXOH?XS(@LYUk3D`GA5^bQ%!mzuI(v zbM3fuUDDg9vh&xXe?h!DR(s+$z^r^#Y#fE~;_y1; zbaZ_K^ph4wOMZS>q1HqQHzQ#EP=H-wm5kk01f`jK)rr{36DmeFlmFH>s2qEuEth~k zZP+LzqCLk%)R<+o*n}k5CC+abtlALQTmG|CLHJ5l_nsw^^|4QZ^@ zdFFL9F}jp5AF>;npUUYVryqy{lEtk{sKdVt_yh9+hYr18f81sgxiS-@xkl7v7#xau z#wppXI})&L)K@peX!4gc%YZyUiq0n3fkZqV*AY*nMlB1QirX(|;_d=F2}-~kl-HlG z;}}N8Fr6h;9;<11wTo|P?}c7rB3KAY+XF7Qkx1rmbeR@=FX>-e$-%>b3v&IGlHOmF z0RLp*E5`7e%!^_83dK};A53pxpnwDBq5~tObqM%X?Lsa%6PQ;xg|C2T5YAk62MyyNg zi_AdZ_=5hi?3qEYWS}e3XWkx!6ckprJzNm>Kjx_5>ZWn}vpc1d~zEEOPZsFH2k{d;gDG$Qb)Hb0?25gCykV%G4`kFviZ?x$q zA~1EnQU??gC!1jfO$@^Il=);m{%g(d4qHK{QAwq?CtT#Eti6RfIx9bve};?)mT4=2B3P;p znEgMS34-cv|M1etehcv|&2j{xv5Hu=UJX!xv|~;y+~Li<{-hM!17B?FP4}kbv8M;p z3^u;TWN!i!a_P_D$iXO0XSIL}ocWNBnQS}lnKoOH zaxC)-9uE#@rZeGDK>Wg*BO=4P&~W6sHqSj#P}&m(Oz2RWDP~YuMB$s~54K4e0e#n@ z`?#GNY(aZ*u~1FYY)Z5yRH)LpFr&c~Yzwlmrv!|A^e1x(0YGZ)!k+G9K`hk4n*xa0 zAd$<*T4?*?;J7jSqg~({G@c;#Cma*<A#ocA^+ZEu&)=pc?#JDr;I=E1QYV64|z+ zSd|;zC6$jCH>xi?274q#_p`-DwoIRn)Ess@DLRC`Lnp31?{JUmXb-BG*XKaFffY*C z2N`Qd4tRE1lRH+*BS8iYmj&4;$Py}OGDl&HYUd<9EH|`~NPRMR-n(RQ1x&@~N0mHrC}f9 zR`3kwnQg6roRE3yiWTEEC04t#8{CQM6FmyHfS#c=?5Qz2F#p?gtOHcr%Ku`nqgU|Mw zh7#jx#=K1RVivd>0HT{k8k9tiZm?6OQ-6b0+0L4UNpEavmEv+;15+X^Je$KjUMZ!U zD~|mHhJ+de4Y+6}#DcGuqS(DyWnqS^GA;E^w#z8777y)=Go2X)=!ute$bcUn^_V;I z+PxP7dPfB~&{qD8;TjmKUt`Mr8UFp_tW;vR&k1@HEW7vTM=2q0WrhOL68D9}iIA4A z{BhxT9l#a5g%8PirKKhBsdY?pmc9B3*h;hcT=32G^&(EeAAN25?_Z&lK+i|ro_`y8 zsyJ*MrP-KSGL|qlh74rzt=2bRUd00#-V7iDu=3M)>#=gw^5G9HxY1)g%XCx!rPnp! z+DOut{HeAVYxHaqbRhq=sCP8XH}8D5vS{ z47$B{{kfdZ+U4z+^^%*aA6M%R?bxpdO?+2_kbP~*nQJnod%`Y5+btkOI_Abe-tWTz zfDHPD_0mAo!3P6`@jGZH_PMX z9PyC7YOnE7+Sj8k9ab}hpJGBET~&oZdvgv#>NTfIA_Ympkj2andHsc@*U$Q0{PO6m0XFyk9 zG@auLdEcH(h*Wik=r8lLE*0yCaV&A7y`7;#D7__ScN}v(v*y7TBv%%B9cGv6D3~F8 zYl;N9>4=DTrO6Wxoy~1#RQ%p<*S$xZr)PvDY~Y3Z{AsKYlA>`FY!8Jc3&fBG+iLuEe*yK9YpVD6It?;nV5Yx(nM2^8N1AzNyn1JBf#J;|G|1 zqaaz)#DNU*75}D%lB~Jcm0r2v7=to z7y%2&8DrvNU$e2jrf>rSEva4;ASpRXN~i#LP52zT`1HZc?s`9n@`G4ns*ldny}}1M z<(&>VpJAL`K84{GNSq%uLCcTdEs>5>AxHa&MOamyaH{y(uFQ3Se@5R|^B0}J7@6b7N^Eu65`m3^f)8!G#1};Q&AumoIXwJ0UbJyuFm-O%^92~jwfVE^1sj@Mb z&7NAZj~jdoR%)1NceHKCVBx}VCzJ8Md1_?B$JaM(-l+EemiI}pLeDmRe5pR1mFHoY zZ@f6dZgkK|svUcn2vgaDFn0pzYRrfWXa9b{S+CSqokUq}}j7Vyj)$yewNi;Na#4DWEs#S7V3C z&TG8=mys>S4H

$iX3)q5X++H%nJD;hSV4dUCH0+E`vZ0$sZ^tZ5GpY@H@boJnm! z&0v90Ujfo&XV>mkgFw8gTk7;dWuqp+Ln#s3BOc`6^|Iq6{Oz}U*OmruNf)>gRF$O) zo!Cknjev zQ?5K$mu~j#9bIA1qeYUGCgX;!FT2Rli9pc){fI8@YxaXvGXlY% zUw3<9S%?vvl2rGcYFS}h;w2T~#oNUlXpY(T1eH@aLO!neM}`jWWI=@-UrPW2zZ_55 zoh(EEw?1>Hn&Bm#Mi4umt(p1u4Vk*6l6TPNJ3c0@RKH`um<{k zXAgGk@?|uetz|34#?^UfTFrYyZxWwm3<`IO|C#LmbDoxy+~C#WO2{QCgTD zuwtlB>B#;$w^Y)uUvpQXi@8jofG~dCOfdz3(=RcC6qL_@ky6@1Q?prpg5PIO2iEHm1-q53lOZWU!N z)7r_lgaw&wP7BpnmrI6%8qI?&N&e@>>%^tjAyjp~dn~7u9VvULaW%Nr=sWBJ56YqDnE~gfhU) z0Vm3ZTE!0;PL`=khwQJ0EQefxz&?b-{*Y>EzZoN4m?a%Oj?D^EfGjvXlG=Ps@T(*1 zP=WJF)otc!d<)P6hL(RsGkE6u6YtS3-r<>We*+H=QZD$A2PsSk8>?41ZAi&;TNRdy zB{AOOi17hD{)5^t?1h{-6BIN+nXY{-LZX?=29M<62zk*z%Lr7MiFzF~I<#4X3y3X33ToVb>AE z-~92f)-&t*rCIpbJ$<8Cd2R$bV&-Cs$g_lp)c=}%jwS0dQ0_f)Y9xc)cr;}%%k$V@+mma`1N=|q6;8-KZS1vRQ2cI3 zzohKp6B!T)_PjIs38ryNnFoehdg4}__hk%OjEbn{73%wPHjbnVV6)4G1s-eBm@C^W zHgA?{fSKs9!H$AU!GE>9rCX|Zs_u@67Rn8KhFBj7z#C-Wp{I(7>kkkd$em*3xec1cI56a&~ zg%>n+?>8J;{eWLS06Dhu8iMI~M93txV-%@JA2XtK`YASP7(mNFO3G7|0MNOlK$QF@^hRaROP7FR z-S!`J@$=5d%b?z#&| zSj3PcD5i{M-(Tk@8fybndPU?NYM00E>VLNj-II|BH8?2y-QOYxmU_I8-w*v) zzlB#qxubZ3w@Sac!52a#d0Itx-|xS#QCCu1VC&PP0J}O+yG5L@kWQ480dGdrj1D?P zsuqc$yO~cVR8Ky%m)l5Rxk2Ep0-R_)e+2D(?<9+&sp{VXafg(R##AqBnP}nym{H90 zFFo+n*E!#ELH`!W&=c2-s+tMSDVy7C88eCSgjaIjwF@5yL*AG}EWVyyFZ2mGR6Lx0 z-?SHK1Fo5U5(fHeP0}IT^z8s$Uz9#PU9SCH8MB61ed9Yih#$<WEViCE#wq(TKdAJky+a5x~IJ>r4H+rxg`xehafSOQV>9uDh4byIy+j?%e36#kpg8u@L zR0>oBZ)B*70G2l9D>+HguAQpa$O9^5b34RJT?xrt3iMMhiGcjORuQyr(`9wnc*8zq z%IZLLPJ^4chv2>h^hm{a`;7WdDHY!2->urN+L7UqIjq^Uld;@TenlN%G$~*8W{gxt z0MFlI(o_1sEOL%#;NsMsVzvwD=yCCaSi*2zXb3~W11GJlX{fULJd(uB1c#g9Nq=}}cPTh53go7VmCkoH7{!O=t?`nFOYkQfAg;Mu zwuXrQc7EMQK%1_`xV$V^RZin-aSwV`0g}U5?m4w*RJOY%E0>UWL~L#cNIGX@8yV5g zz~UuMfoOl39Y{U-FHfL@>o}R4U3izmqUUFgJVYE!G)(vAN4qa* zFIiUlPT%Ldss0n^mmQ5ktaI_H==L@8^b-{h>TTcYByi@u@(@kiE5~-;ut3YB0F7+= zFSKvIqxBb@($mp(EwP(RPt*%Ss<|H~?xZDw=UX#;lVYi4QR>cOKpNI3yKDmbXRIhn z`UVEi;2QGcfEt*D}x$+M@yzd(^bh)ii??9c1e+>AUWoHs2VC%fRr{`D@B=- zfxo9Q0zQo@q|AVgjeLRurG6E_kuywTp!{*Uf5Y<^EmPRJAlV}!u%vpemaJIq(kE|D z=)jaa48pBMMkSC^865gKqQKYr!komu1cdham6~xXKbf!9d-LPkf_YDDS-nP+QI9^7 zIlUQK_zTx7d&40~kN`yk;GeGwBoPfzfLSv8Ar!!{EkN{hk0^y5MH+h-CxtBcBO$)+ z;9!0iFw)^zor61uWUU<>vYIcj=}>F}#i~_1;oxy^YBfgO$s)(k1mhr!?6Q}9K=OPG z1)px-UW>3`geYw;Y{Pjp)yJk!_NG2C@%FN@rYa2HaceIm_$(m;_`!cHVq3@qew7bu z=D7FF4L|*C%Su|u_{PlV#851qxmmcj2YsLEAJ-b|&gGb`88&Vo3oDLtKxDV(L`VKp zd0V*vThVoc#{bHolG6RJLEGCMn`LPbyn@fcj0m2Mc&?d1c4^1`IQ@0D7xn{8fX%@5 z|C>0|uF`-Z|0T2iU#Woge_+)=4`ijWB2m6xKCC$GEhyO~sOl<5bSnTV=l?hl8r6AZxEtEXSV)F4ak zqfZP}n$l~qV?{Eqq%BjY|H4biL#_0~)S43bsHgiKtQ*J)v%*YjuJVxEVgyU50K>hj zR+$)o@$RRvm@me#QALP#@|ZRs=)UijN)^i8l{Epm{(NO^d){&Q%_qp}Q!sAC9}(6B z#}pO+n0l3}El;JoX67N=|*eaSB?8G0XV9QtTtWPYJ`8Q5409oyh{f=eYgz4axCJ6CvEG5D=2 z1s%@VTc)~ZCMs-em2td$$h3EY% zB|^p~oEWkWmSjK_zVx?-ERYeCbDylAK(VRPU1EAb+c>`aGiBX}m-e9>ULDfCc6R{> z#Hl+IotcB4#wX!SDv+GVxUC}*7jn0Dx4hkfh?>G(08X+YkXokU7~$_=R7(WviNDBwytRl~aIpUrS5-=H)@7bSa#45TB=E)BPBgO@K8>pQdBh&AwMljwqRqk1=~? z^{UNn{WoyA9>voGCgwY7*?3Q50TX>~yw?gBGfPe9ZZ&6$R`PIioG0Aw1W{LmEo^7B1#H6u+DY+2uJM|j1GVz5vbGnZiMe6#b`{j)iPa- z!}MB1XM0E+k@5eWj0Vtx%hCISaY%=RIC! zTxD%#?b%GH-6cmJedaIy0!e93d&&2I>7Ag{k9?f0dpwhn@%@QcbH_lRKrvx0e^5k|HxcEJ`v9eg39MA8_KzC?91R zm!ZVh@K@FrF%N<73>7~w8Gi?IAAS=BXyvbWvoHriwgZD*aIr$I3>iyH#3;be3xb3` zXRfD72!rp6e1sAG%~1O#6#`-kbOqnSP;UCVQS=1>e!cz9>iGDWreQ8O|`i(AEf!y;o$#UdXaf^KSQvmYE-9IG#RdW=`N45vYi0Ct!%>P+K`A1-1`VV&tczeYE((#C;AN`~mismzX7D>tC8 zmC4{pi3)JV*|Bdo70(%AhFLGS#MLKF)v76Nf^@|0`Rf1vsgd36BG#!_^uFo!682Ap)%9K}Qu6NEAh}HdrPfYI(WJG3{~xd_a_ zN0wrMkimot(D9Bz{gwIsZHOEx7uXQ1RU8I%CsyH2gFbN{7ygnEO%b}St~2)H(QpE= zz$D_a#D75mQgUCdgt;0cquWw}P5uy|2H)|BD8{fQI)};40j22s<54bz+~rErDYa^g z-@W~X%1d1=w%n)QoQDUBlZVyzUu)I7X9g~sya&O4?1Bo1<3;vu%=GQhG zO4ZD6)*-`fmIVVc@7#kMhqyI@vLKoQQ`r&(sY zv*ow6ao*b&!fHU+)?1EMfj&!Kb*%>S{fE|Qx0CCkrs{%pfTm1ZD~fEBd>wbm=kZ{5 z%U=Yashi8w^DVq|jB&FIekc_1R2jXpXg=(3*nKbtm(`kjpg9e!g#Wxe&vAJXQ;%K} zsZJ6z^L-x;Ka|KC-;db-If?kIKp`g!+WL-=qE}UijKj10A}{AN`IBS@UWJi4orj*c zB^Q`sh!!_P-m$!67GgmM!}11>w&kveHbK@NYoeRjeHCl|Qc%)QnTQpzAy%0S2S;j1 z1qQw@7@0@08Nov9w|zk5;x`G~NkfzStH2=abF#Aa_d0Ic4#tti9{E=^RAP1*9+*(E zATXlsSP0rJ%P)%cs3@-l=!6LWW}G)CT7sSJjRRin!QZ}boWTX>11hwqBK_ruoLJeF z0#xC&ON%`$hHn#~bYVLHcjMvw!raya&2^rl9A^21^lXECU-k~X+CNjkBZsiV}{#60VExMb;xXYn+Z zxY&o%G>5X71&32E3rxpWZWFZGRZ5)4qqy4UjmA}Y`Ccx!u&W9{-q|dH=NJ0gyIITD zZ?c{x+Xn6u9ffi~#TP0-S^sbLQ5GO7YH74QA26g@JzHulKY%~eNcgK%koc5DI2$73 zGYgVSfb4{2{-k-AO(UwztRRGHmJaLL7z`-QBzbJYl$@GRbW@fcOvZP_iTjz^2JC)k z9k8$No@qbPy$~8;IBi@BhT#zWF(&v=asmw~;MBGbIxha!Ew$l|sSl)Y;nHolgqq;# zU+J(hzTW%iIf#actdLc{oSZ82o*qd(LjI#@MxEkbUBC6Z9566c>Jl)Jv}pEJ@Y#=_ zMJf^QJ5Hv*zr~NsJ!$Zn5~XX0iIp+!Ws|))(f39#mN^0#x_2oYq}wE7ZtbW0v4`C> zlQ(7H@sl$er$x~K3tBE(E?KrGDwx%fhGi@DneAL0w0@Y#xHypewZ6z1s1>)Kzk=DL zhA*_fEO`I2>Qrfpqxnc%bi!AP`)B3JfYl*HIJ~097EtK)qAH6tF15G8T*SvprYRwN zrEBd-?9m87&{NEMG+S7{7H&qeKwMlNQ#mqWV73La)93Tc5jCfkjy9 zXexq!@at5;m3kDitK}E^M#z?S8ff>@oq2>sXzU4KxmBc{$g^mM&YsV?X%XY~_V);1 zYvaI#uYE~AAg}+|i3FcU2BMnQEuxNMPI` z?E45rA$B9cM=QU}Va;e4;r_x%x;)2RC(RU~bJf{S(8KfuiF?s2tvoxjc!W(S0y`uXhR-TJsP)HaxsACSsxWWR0<*GTA z?8g|K_gaKa3Zpo?9Lp)vrHRik|K0TqN_Q=X<{hqRfL2mLE2Nbf1WCTA^m_%Pv+@G~ zv1B5i&B&(#GeXG?l{2Zm9V`d&a?}kz#ce3aFff#o-M8wVxc~*+RTn1QxRw_!oAjmH zdODM_xy4@c<8F&RyaN%PRMIzhewjPwgK>*Mmq3|SP7H*~X8oo1@r-W$INOx!W(Lp0 z{HY5P>$rRvImJJw3cBrssqn2H{WGB@UXi!BpKKnwNVj;*gW^sISLxaFWmVV_9W`@3 zJD4wRbzSVHs@MqATyL}}_a^dk-a>JA2f%G;V~83JF?&gJ$NkQsV@?;@&oP3{n#j`m zxPKo90CkZNzNPJ@0i$BFFcC2l*&A8G@bdn@RA)x!{{dti^uVQG{DNz11Cc8J5A_N(XVo(Hj&SO`z#8f@|!E}tXG-am$x z-b;6}PZlZ38pCwSn@e%&S!_8~C;r_$`J7U&+RGH}qvdEM!BP9|^?DG^wD1(eS{L9n zpdva^QXB$UC7M5wwz%(}ATu`M<}?|#vUraeB)h${3k#bOYUCmNKV+R_bRbdJrDNN+ zZQHh;PCB+-F*>$w+ji1%IyO2^I#x&1@B7WnnziQlx$FL^Rdwr}yZ3$;NYDHn%fvmi zj6eo3oPxgRs173_bKk3}n?dMc)=%Hp)wVC23I`r_qW$nQ`*CCl8Cv{VdX$6NLSy;p zs6f{}4qscJh-+|^Rc>PHG6*#!s>1@axJ`F5vWm1uygCfbBN7h_qM$VwhGFT>a=SIt z-URQ(&_rI76;Iajzv2b*pFSj46ioq)nnz|OAwB-=8BZ*TS>8Epx}u& z-Han;3yQPruhJZ5O4T&z{c%D05UHiH9W68_T)}~nsxYLSUi3S`Yd2UF%V=TyeuG`+ zLGde$JAx48Xu*jJ3kxi74-Xv(G|~MN5teX;S2RcDun%EHI2j+T%B%Zt*S0_9Z-bMu z%VIzcKvGyNIP00HIN|SyjO24aPrPI4neus<0Z!t7*Ss61Sc8WRCYN7HvY~M zRS365|(*sxPZuEM{Hwo_tY+e9T{24l0lzH^;$P#fia%Y(h_{mSP zCeedL1?;3xu|+c89`|PR{)6L}Xa^hdf@=j(K;86%U^RhG(SaO5UwzX)QBFK@X2b&e zc8b4j$Q)?srx>&gg?~QyQje0IK0*yI3;!JON+$h=4$jT--@C&0jB!vy7=%N^1L8l% zAJFg`dp7_5j(~Cg2d#$DF1HHG0Eghh^LjGQ{ROFLrm^zB%l{>^wO8$f!oVV`Hch^L z9Cm+!G04Gu{!g9jzwnv%lXK8IID|I3!@1|(4`hkn^vVC0)9e1F+ow-Ff(io6-~lQr zHH9RN5Vpo(^g6D*IfP;aE}||iMu7kM0q0ce@1BJ1<$qw2bG~dJ*Y<_%{Qh5epPP@K z^>t*;tWu?>R@|!*v52v3JN5@l6)Xzet8X)oqAlC68qkhAc8WIv-Ng~jsyA&r8$74c zPYFk(PyMT31hm4>0q#eOyxl->S}q=iqe4xLt4P@C4l!{z+qJ`8+l0@n39a(M{-)Ky^=!Mn z>z}DEk~FS~C*R|A)Loj1s;c!rBCxz@DU^e>7fsB~RqyNP79T6i&CfTP zwTGMAN|WzM`l~-fa2Ra@Bl?S;$a-Zp@z!C&!u(*%D<-8xLP2IFWYoSe1++lDWSWjb zOQpH+JWRp42Z4oT)^0#vYvu3WQTpo$t3RS%N2YaE!HH!sMlsR0I?|YQ2QGL(fjE(W z&^A)4^?u64*a$*U17h5RUx}sk99mvD(o|g|V#xK^PhJY;Inp@08*~Oqs`=3J(@Jf_ z=cwx7&P)`KB)T>B>)+{6wL89U12yBQG}r7KtUApD+4tLtFVZshvJ{yES>Y)@d?rOe8s7t$jANViH{#g4P z5I546o8OrONmM^eJe(5$QaM)LSN>TMlf$Xvh=N{HRiQw>^F+r7^IMv2H=LV?|6Nye z|80PoA1Y7h(_a<1m0OoBf$e2;?%Hyo1?}GXWnnJ|=UH&1Um(^sHrY8$VjM^WaS`+g zT8xgyqwVi)jEO)Sv?e$iXr2jLAE|~x6!g#hh&ph_Q~tgE;R=UL^{hn|jCodWOX`W> zHSmDjY}oF{VpG=S5TpEPGL*fn-AN(iTOUp%$kW8({!}zDFW3l5YnjtjXDj3A-KpQo z)J8jz5&~uxGX&EyHy=EwxpLPtr5ZzC5){1^0r87P7tNy@_Kwp5)y=UM>$`69w-!*R z5NYIUC$JTKfuK4Q1&f?zPp=)q;U+CCRIO%c^yP5tADa|OPbdM~fFS1BRW=6}d9>!V8Q^0=K=s8v%Pk4*f+p=Ls*S zf7_hTS^_lxP=`*C<0V={F|y>~eBH#lsNm@W-INNCq>ub%fRHKKVm9~nF8g0jxi^ zM_8x;PMjX`zftJHQPjzi(#ijRRb0%C{xr_ITL%-jg89>&-Iz-7rdTP3XEuz2+VL?# z+&SOsxJex+H2j$GEJ({84_vBZEhNganCWi-vXrGLSi)tJuQmd$#SCObS?8q~Ff`s1 zb4d*McZxVp*<28FaA@@nN=}fP$a0+%?^O93`ersbUu#r_WT7Z-)*NEf5K|v-jkj%1 z5B9E1Q}a}vFZ;wCY4NDl2nl8xi8z(VN~9Z;L8_}7^g3VYvvhuZ73m{ZW5J~~&UA(O&NA1kX%zbF25ATrJCF{<7&A5TMvfF1 zNo2$enU%utm~`R&A&9|n(;ci!wo222Quy z#J#?MSgD^X{W{g3U74OuqiH+I%4Ez2EUv*4ooKHar1u_JcpAb4H+hVpW-6Tr6nNBo zVIwLaCNaRD1hx4gQ#F-;0X*%<=t`z=V`fZ)lUB6y$*qm58-Fu{9h`QJ86jC_#9TcD zu}DcEsnk#@vMNJ{aa7or>}D7O&0VFQ4lX4nB2pzK#(5>&qy#OtN5>7hOq|OA(^K@8 zGAxE;AvZb@9fU8AN2(hCb!@=dv0v>^Q>DzstsK%Gtauc5e$>f zcogM24k29C!o4XnN?i&6Ixjy=a08*#RzCrDqCj=lwdNI^MPz~U`NpPX@y(o$zy(c4HRK7viOU?v1ZFd? z(j_(T!gr4>#)NbtKg9(}ibiEhp$&@Rd$K!CU|%|>FCmgWW*5PQn^mGQ_c+9eKOp66 zvW3JKZZjuu52^=8DssEnI9N~2Wc5=@#oW3xL6v&swyi{1-11=}ura@5{?)6Rk6Ehx z!0IvQ2JciF>9^yNK_M+bnE-_{{q<2yAuT`RW4 z$v$$d-O6_DBX%=FTzHoDNw2|BOgrn+)WKenYV@m6vqqRtXO>KI#`OLLW?0lJ9h{21 z5CPV##bX#py(?|Ho=YPZQC&k= zC(!iv*47D~`Uq)1?7|@G8k}d@^_uXvH$o@wHVDxUoBw+wL{pTUTBrT*CaU9LvQ8d! zgFQa#JlJ5b2q;H-lN%A|#pH3(&mw%39Cv@`UDHN1J*G^WrKKL8s-0iAEDJh6S>5bA zg@$0ClDd0>EQ+Ur-#l6fj)`r(QP>_Aq>ITO&OsOL5qNNKhHSDnOk_B3=_Y$nZJg}-{#VoHl;uIe$N%zk3GbJI0+N* zxTF{TwgAWeorZHEY>-D$TCW!_$GV!9q$=OD?w!H_c5xI0+)f$o8S`idEtCW zLi5|!I172G(eTYG$n7T&N6w*wHzt`|Fy;Ht7;0kZ??`n%+TxJn>F3OmngWe`67lPi ze(XbxQu5z{0*oXMJdZo_3}?#3{ps!?!8mL}gK3q=pm6Dx=wGSt?D3b(l%$;0JyBvy z{NWl$)J+w{vQmd=-x)`cBlVHGmcQcpSnJnVHGpA-36Rv$y(emb>LjH;{fp1G}8e?1oJ_DId2CrKtaI>Pf(3Lu+t;D$d z3Nk4Ix~7*L9wRD$cL1S8_b~!4uH3fAHcvw%4@N4YrLBR{rb9U`9;X zyVHhCU=pT`Va552(jU1$!zX^X4@uj*Ym3l+M+CRtyR%I`G6F@%LN0VliuAH6bbfMW_W*`CBGN?r31~5KfY3Z95yS0r z({KByfN8av%!}@Y%%9QG(k$&bikq*IN`&UmQ7)APswDzDz2T&vAt01jN8iYQoa#~i zAWag#XCK80_V>DXB=VcJN)1^`x>{Tdtc@-JEL@tOKqTjV>qp-FVM2&;_UyiU~!}? zVS>>h@%-N@2OA5^e;lziz>MCe!=@C9|Ee~_eEKozRPJ_WFNRc*!FihqJdQJ53*ueD zgoOPP7GjiAa{o21oQveE*m{#8xHFGDF_NX_-1IC1Av?b1x7qMD{5x|R-z0HyRQ|NDri<|v$Q`Z353;bUyNGd5E_hU zK?4Qm8bo>X4P>wg5V#6%ibX4d4h9Y`4H2|YOMzZwgR~x+gE1XWSdQwA$+iVGoMDpk z$zocGrqQ5XFUD^-ju!eY;}J84pVb=%#PWs5na#jN49#(baybT*N^J%=xZ)VB(3c=s zTNs|Du!6`$LJ%uAv4lNLy2L~f{f|`oqjo`rwgU{$aE6>3047<3IjG9|18#t(9Bl_X zxsMDgLC$gkRT37=GFX8Qf)WnlS6C3Z)KYCPnEU7Umf7N{I_U*mC9ao%iIQx35PYc4 z15-~{!9T|RFUVP4NCDj*;!=n(Nn*uGb58P71kneiit8oV^~{DwU}QOfq^Q) z2Sw+KScV1(0Ka_M!p=^G&(~uQ*K+k)i?#If{%Cm{{+A2ehp$GjgN5|tWr(;_SNyW_ z^4xMZ@)Dxda<|W77V`8CS{lWR6{iJ{#RaN;P;M$ppzrsmCk1z_D&p+t*vg$O#}n-Q zW3QKzOua_)Vfg!xXYzM-+np?AR3rD}+{%EjLuD@vpxK#=EUgT?yqwr^#9L)TKLWBB z^TfZ61>M;MT)>B4E9pA}!~yK;7I^l#qU**q(%g9RM(8Lz^kG}ArTQWEFmYdtFj3oK z8`sh{j^^7;%T-S!G9Q|YNW|v&A`0_S#k!UCaNjAjIWNfB0URZaOCN#Bxm(mvsdOJ! zkRUOSe@B`cQ$18<@PYQ66`kQUXmT}@#mw)9v5jw1j?apZeV>b2^3;r{E-atbM1zpO z+Va|51@a!9DMx!cGZfFg(_^~z`&Xo?4_9Zfe=W%T&_Ncmq{@arb!N#E4T}oGx`~T) z?J*!%Row8p_m9e&;Jazkm*>H`xZX3$2;TI@2eKBa6dMN-79JXPTz=hckHrvW`fyx0 zQ=O-E7Qx;TGq!Fg<4%StTAWgKp|iW`_h;g+s)D+*xyeGpK{^h#X~DT**A;crpJ7=T z-VigdFDF*}w6?GI7WynF7V^~u_&zs(`uT3Po$P8ZdvWm!y&7!ZUQT~5`_(Cp-+SL% z11s1;KMzL%Ve63vllq(rzl1kh^CaK|Jm+la@ann@Q}X8E(NUwT0|Q~nf$ zbPO~&;v5eU6B!xBdfG=qIS-PmFBXR#`{dYTmwj|u`=f95cF9%~S}`j5cgpA3us5QX z587jw3le|@{pc-o=monshZk1-b6GpQ0k^%n>BmXWwmrUSiz%+7Le8l8tIWfB2H@93 zvl6bwuxE6Z#6HJ`8hitV3{&=`r#P;lp!#Q=O}7{16|$l7(29@WIK(^H%Hz-!tQ9KO zX|2<%ru}1e-2@{gZ`bPhXtgnK<8j=rFgItEpZs{^Xi_5H(!}tMoK1Y-DM>dke^4V~ zH<76aySki%)CNdQU|GN_zk`6X1=#i&Z9#VGpw7{6*q_UXrD-M zW$KQ7nYt|snx;h@ybZsXw5UVf5j3{>4B^%kFq+3t%)3(lNb4GVk|qB=Yws;mfWj8w zwsVeaX;M-Yj8U4aptQ<;JXN>#93MyY+mB?wwS(juCmd~crw z5(?{(($g4!-lcf^d2YeP5?7GyjH@R9YR~zDr2<{__OFC{K?$R0;L9-nAOQKGB!tk<$>S6i z{-|nNZM+cSL}LU&IA7bayueaaB2aHux-A??0febcUg_|TG;KCQZq<&+PLwUMR4GFD z!}P>6UNpM=%09k)e=rxYM~>^CRi<*CcJSkBAHP~ZU=x)U+be<#^MXK5YjvCdT-^0g`p%k$M=PC(7#KZeT>P=kQTkOsqk5 zu|Q4CdNk+jM49medHuqe)0f!Pr@XsYdFyNR**}ESSkQOclh1cL+A;Z}Z&p8V?DwX! z*(W6VAlAQByw!gIum8|5caXpoppcodpwFsavLmzsFfNz&#s8K;|9`k8+dnPVz6}g5 zFr%ZNyxE5Nk8U|oynU85l4@c}o!dJSXPM;I?XppJ;Xf~DP)n6mp_0P<@%VwX3I=&g z$4~eyiULEFGZk@75Exl&iW+S{jq#ytamH+FV1-4EdMLG@|4&cZFpKN3b$duZZnkSTg!Dfh>C@~jMJ9WarSc>{bB5xv( zUNuN{7^G&bD4u8an)5=ShWs=iq4==2D%jU43PDY3bqdr+wB0H&D^5Jh$ieY}%!SQq zBP#+aG$0XE@_`V;Kw~o(OK4zGAdz!pPzfZYN2B5xXMpuy02wS!Lr!t&PPTJBfcra?NAdayXB6!V#O=-cQ zjS1lcp*dVPt7AHH!7E_4ik}+*&M$N^a;{UWJ%aJ+n+zk$X_zb|7hKV5Gf4I%ftDm( z$TfybTuB~syJA|Any!Twnu20l&X9<*B?PiDf@+7TupAI*NHfvuf5^8aEogSLFkM*) zsSx>7C$}3R(A{sb%kq2bb{viK1!l>r!7rkYc%+}fBd|QMdNghjiGjrcIjsLVN|RcV z8BAYfsuA8^PM}`oOoN0I++^JBob*0tcQmT^h=cA+z3~@fJgO^(gwFG$LuU`M|FdCs zPMmpy)iPs*0xV6Tn>iTnrctR}B#02wV$=vyjAk!isZy}S$Z$#?Rm}lOP?!*MD5!>? ziH^*w$b;xnXe(SoC3qOniI_rEk*SY*S|ZGaR4RJ_J~mWsmw9wJW1dxnly<;kLBmW)Sf*sl)+N&g|eZ{IcJ z@yfBCrrAgEmo}G?Dt%qrLz+rOyFu^!B!Zm_vTZT}9SMFBA@JE4=G%}m7MP5LJHgYT^dM)sBQkdu}|(6=mTT_I%R zX1{j0@?SH@cI}Gy%~uZ1lXnN+=G{7T>1XR4`hT=8nl-rq`E=%f9wZ`3P!HLS7O+c6 z1xgy}iWWJ_AdOuXBnqNj)vA%hk^BJ;3`}FB$E~$Mt`8yJ*id1$XX)d{^tvnATGCRe zQio+0EQjOxY`@QeKRLj@``-XoMMq=fon}kg`1fDslTa=IoP_Kf_O-d)P4up$s++i? zlA_!UIVU<`Q+BjA#q~X3ed5<>r8jnEFC^OMN*|{^I-N%QAk27vTWyEC4QU7SYrBNg z@DY!W5nyJ!et(Fb!Rq}Ho3X?$RZ$f)A}uIBrDj5a>wzIj!^h)@LYd-CF*aCJ0JC4E`LVo zVh`5THk~#ja=fnax0l1Pu*q+9qIOU6&Dtn3*(ja z|2SPoXd{Jab2&Qe_opx#-uI8*S^_WAs+am^7lBuynn-ggSOnt^$I21I#P3&+l@=#I zA-#Sb^`74uE!%9@wTYy@KG1LH5eV7kw#M25X+o|&r8z`b-vrkSy5w`u*LW{bVsgPT z+qql)tEx26+b2F8ewaG=aNaIjKD2~COgg)<%6NKL*!E0+uuE&xI;?N_$bXi2bWOb9 zo3_#}tGjM{m{%*Glexlw>5JhdG)A<{Z(lCYT=qW1)5xDl!pAUX3L?y(Cr-<(ZOm6XwYmUZV5SqCb8t zesL?XUH+`kb_93dwcpbmf83pCzF3*s?k#Ff)_c|VllElWp|wA_Fn-l^JRMDP=u2Jl zZ%;Dp$T3K_ksd6DZ~Ex=OmqO=iJY{F8S^m})3G8fF=l*OlZIK6zPND=yEl9B)1CVR zIBAd)m1ZN4`I}6kdy}V>P8KJa>G<`9GdJSlm&>msm@Ac;pq4R1_|ANpY^!X8=>;@k zSm3NIJn6R_;52~ecMSvmHqJkP&Nz^l~dGiST>x%>29Q*w#K{Jb|DWls4A#f|w(zfZKpBX;NxvfF{xX zIG3v;#@z+rtGoDk0&_kiqBE+px+nxi3?xJq!9bP@pk=D6t3F<R_cCM?W6A9H2hS&^haR=Y&JgW3HA^mKBe*H%})AVj#5&7gLsT- zJu!*+n)&{E7Qr^d*0u~>Fm8J`F2H^4hXDiqR;Q!{_)L7&Po3@Bf2McQoPJC`*!B9y zZUbL$BQaNoxxJsP*IuEgsm;;%{d8cU$69Rz!k4*UIhm;+#$4X0kY~zhRW=AN z*F(*g3DCXD<9Q3C!$WkmL>?gb-7=JyGb17%9@jOwsGl*)Tj%~t zOeECGWnXHov4RuZJ8%89$68Mo$3U6GF>pRm;^2663YUWQmA~eRKD5gPUjQG73*rU= zBB;Qa`PuSUo)(y90H&|WZyr5BctNIP?Q?_rw2lX!ks%x{&A3ShMkg^(FFusV0Wt_I zrohb9%Bk*&U1qo;QO;tD|pKqgFe z<5+!uZ8d(KKTa;MXbr9*$=v6Ie_Yd;@zd+ieZ{=hqbTkXS8;qvH>KWF(<2vTCZ$GK z9`%>~W$tc?zU@AhykxWsx~9HMm;IO%Z1Tsxd|Pb%+uRI-z+gb|b>zERR2eHczm7XF z`I-*@A{6p<@Fw&kYzL}<#&!+|WM#R1QKt6?Q(P*FT4+6CfoLHq1vVxpH&TP$cSGs$ z@__6xT&r<``@B=4fuI))P8J`xtw0aZBu3cQ|X_ypb6euoQ#b5@4atg{JsiO-(WZs48lyioqzR6yLe^EZGt=!sG$cUEy~0iEdV7jvcE&+5!w8Y`P`ipy3Wt!+}}Mn}n9tNetYO)7WCw3YaTk!{9w7w1o5^tgB9HmqTAZVp-st{_sa_g;_ zYE}p@{3WRon0S|Uc1jYRNc$shY;U|vh;YBc9e{4hzKI{gDz32z8Zw$bh|`v zUuxXSuj>+zh*SL@=|fYpk+IU3U;nl##2{lylbOEam5g|he<|bc>PNt7LPCUGR_@i8 z3hx{P@N#lhBkg5SDE;s#$2%dowlF4k&;P3Mz>)P%8t@2T=6YyYt3cVfk3Pv+&GBjv z1I4ILA{Q#!q3G(f%|JfZ zOImH&2d`uN{Xrw|?0OhDH^!w9_^T6+ErPEZKxIQrY4bDK$tI+Nkmo1JY&U4lE~Az$ z(ff0_@P-OwD| zOw)d2DEn7aOdQ+1bX_gNRtaH&BOIQmNxCKvTO1jEc|9(&XkPjIE z-0Ej(?@oO4?w&C$9V-=$T{?zJtTzq2pH)*x%s5%I*I>e0t8w5qsZU3jXQ`PT3zmih3e;A|dhnB(~>X3XxOZu9OZyNF5plN(| zM);6VN)ImbB^U5C*q3(@vePpgoTE0-{g#xE#D}f1<<79suXAzieBP^GAVubzpZQN1 zdA<$H=zjEJ#5OHaPPu%@^faxVILG4GS5i+Hdvmq1GXoehR;-%|XodDhAmBR#HcM74 znjRtOrBrxlIJC8y-t+=Nhp%wUEaS<;%I6%bp6V)h=xPIa>*2|_RFxU|`3cd2+MU}4 zVX3wqG{M;*p5;DoUA^IiRazY#wC@+x(0)r#7?3UN3ZxKIJ3_R2Ba`izW;=PH2_P-N zVJz|RT!fUq($;El2(}ew3W7c$L0Z_17Zkvb^LuOn9CM+@P5kb#XTd2K_wlISb7(hF z-vOoDG=pLWU70?z0J=3w**9A=rTdywl(-4n_esXvDl-9b*roV~0v?$cqt`D5>oz7W z_*1a4?ame2P9!``M5hst0U^S_2ICfTDg50&&l^Z$;-XC|vuP6kGWa3D>Mtvu5+tQC zM5_VW#kLlop4K8pUk+?vqb^P-xw!8*OWs;T-bLwEGq9u7%6M=#$Glkh`hNgaty<$f zK;*=vg#I3EhuV_V=itNTZhIzr`@!S)Qmmz@*+SnhOD4vVi?FuN!#s!y(23i%>Z*e(l9E9iKAu=Sw$NE2jKn1~ z8po_>-Cd1acN4=)6u|yqLq3uOe8u#bbH7HS#z=HC=YMKQP^B>dYfgKXo5a2wv-68b ze-h0PZ#qU_-1!sdX4(pBzf=wD?H_I4>pDSBcxBP_Vuc{|TS9(AFURLjR9?$&s=lbN z+gr?yCxO!sCw7o!zy4M>v>u@s%M(KB4>lFhG0-TH$ucuGK6mG#tnwDHbfj~Npc%t+ z6IXw|QmV94evF?01nOXMIm6Os)V0Y5M*f`ywQjzo@YQld`FIXi#8POJ5x0XaBdtRW zf3>Y`q9->4?7i}nZq95kcKNDEhbx6$UWN3aw$#GM_2BoQ5r7D-^vwB)+P{)93ifqY z&*ooPMA0VJ6ree09{y1~6u|Fyhm|eKSEqO*b0NrO?$Se`u0b4Kve0_j@8|n_q*Po3 zj}Oe8l2^B7fx9C5bxI%1%X=m)){t)LFg2!`&lYHXko56$W(apkV|UlBKpz)b%&*l;plqp*Q)PB39r> zDf);{j9L%ss#qP|xRN4L(HrZ|bMRWS^sv;Xs zi`qQ*I57X$LcfeOJ}9~L$i*`V2g2xYS{S+j;nuc#qiJvTMKp}tXwCs;0Hx%O1d(s& ztYohp2$P=p-=C_TY@SvYCSYAOj)#^-!^R;i!Yz3>e|sd#QeJFvKji-8C?l>j`&y#L zvNhtamcujT^1YaWSv5Lqha16BQlc@tazI|BIHs~Ekm{bVcEiJ_&W9@K3Kvz(n;}yI zl_oR=wCUgO&E3(~oJHMR9DBEcg^XFOo{%_%aN+}_ar+e+Ef}U-{12o^sAa~LAMok_j#5l52VOI2W z{F$)-6#Njcu$T4pZMB87I=+w z+>h=}5FRpj)$*riItYu%KHE`%L3(r`Si?~!#*>tJ}1l?b~xD#q} zuf9Q)-ULA#jru~9G=d+ecH&NEhNIuRlGRE4dMM8ze`E}=m^e2JuKjg3q7=X8Mdz37 zxP=6tZ{|#L1Gl(w(glaZ8V7abuiDA$lVpuu`u^AiQaoxM#Zq`=*nRjt&6RGs7X~j$ z6yFd2j~=rQlmjmu>OU3-fS#h&x`Tz8)j#Wf;#$cOn}vLG{{po)5UO6GGh^@?wtBcu ziJBP+qIbjiRMho|UF)e9Hff$xTrY@6UAYw*NsTTlo^nJJQJQT6I$Z%X-z?G^Qvm5& zBLdk%{Zms@hoZ~F`2n-oYc%>V<2VV0<+|)gCuGE4o9MV&SU19d8rg#f-7ybwq3>0 zRjp44!%UPBUCMh6i{(tHZ=yCM{pz{27P5~2vdg~256n}D>{J@BX=4T>cR(V0^}g6) zVk0LZzok|!X|<;ZK&Da@y{23-TWOUq=Z;2#7VNOhn z9FZ1keppIUNywsL^`IeO_0&dMZ(XJC*4J3-n_Sv}%!dE$8Yn9S>OuCN`n`40sE&s5 z@fJ&vebGGLi=5r1v9n_Il-N}z-q|uoy3j#VG*0d6w)CbI$T(O!ou!ji(iD~@2T5QK zsZJA$|0cLAZZDizg1A~^HiU?K(l}2}AzB&!idIK zY20*-l_NY3Q;EjlLw&8pZj<`;2+A&&Vh`bRXSe1OH>SUL$V; z-k%$BxfA*gfU=P;FTKRN<6B5+OSMj~cqCcJSQoQU!3_&E03k!})arzU=GGhI@T_?| z4s|3Gces!|2l-2c%HRs->J{P~VkGljNza8{lZcY(4(SJRrjWV?c_xDZXN8@GmQPbH zsQST}(+@C_%%GXhqXSZ9zBG)PrkMTQ?-p!HMmk=50HXM%M22WKKVO%vh8XdU!j##> zw3A|9((~=J+YE{iTYNoPdGtJ8Y5$)IytQ<5yaRF?T8CXyaWUTy4cezpgXZq<^yLa{ z(zxOnyN>VtIBVV)npd>)Q)5iTkA2^f){`fjK%{EHpT^FP0{Co%5ZZ~@s=LpqE2n|_` z8^f&3)gl5fSqma;kxOtSilzwdNdyIl$m`Mv1E!cScN(Y2gku#dofAtSI=w0JT&EXY ze&)}D7yIPRT5gZLe8NixV_(g-2)1oe?2xw1ZQzf0KG35*JnOzbLG|jB1eV^57tp)y z)^YF+n*h5L(e+h;k4ymja>G)D)axoy(NcLSE;rKGck!y`Zlh4TlnJz=&hc0zR(B~K zpjTfCMJs89WbNFhKBj_Pnna(aKFPGg?W*t^JBg}qZK*(r!5i5VAB=3)v8QjYT{(l) zgy-D4pL-?;BT?TPdvr3{1G|^9l?IK63sGin$|kkjG@ueG=Jn`#)=ombg-Z2?F(s$v zq`We|f=}o^W+c{W4&6HU<~5hvM?qmgiUx<2CKlyt ztqrCvr!lzf4lTxo3p~CZ+=slKv(F`g=?yLg!1{EyGjgjvqJ0M~`)O8pfRRk%U`*{7;25cEpj!;vsTe~>DFp_FpvUs0^qyTAmvGE7 zv(E<6WL6K3j2!^KK9-X*;W}(zO6=exm~K(n7#REXF6d!jQsYzM>=Y-gPiMaatq`fo z7QtGWY^)MEtFEJ#^6q!I74IAe#E1KUmNGR8+NVvUFdWgX8L?KB7o`|2J=0Nf#=~zZ z9!$D%Swj<c0M1&+}yZPf1!H3w#AZHHrR0U9{EjeET9OZO29%bIOl#I!AH z!X1Y?DA*K~ei;|?MOqmEAwl*TCvO0Znc?q?RHOK{VLaQ{<(a*KcJw7f=laW*`k?$z za}5^4@=7J#%HAQ_+qP8JbXpY~mGqZsoyxB&JsbB3(kJUhcKk+c(GfYdm$)VpyG7hW zmvrGu>{4y~G-JGNT0MRoml7d(TSJa>lnAEJ&FPclE#!!^TXt}uI`M)B1rteCaCi@S zoZ_l}LaiIJKc1%bNnmPpCis**H-2~~-P_2hb!}E`Mp3}tusf^ zgxn#)a1*_Th$35DT4fcsXIo|K4+Ml5%YaKV*?Va9`p<2S{*)reZ5U7@EF!GxU|Q9E z+y!XDyVmQU1^BO-O2-FK#G2HxmL)ZuK zpJIzLp2&7hG^KRY3+BWRrgYQt&icbW#H~>oWh*c`OZwozEL}4_vG`EoI`KT1=t|(; zpOU4#BFA3U%slH&{greqTuT>vM+?F4wCe~y+N1}LL`a;hN2)o?umh1+eE)_kC5jBY z4r{p1(@^@6i4d%^dDd}RYxi<)>i?x{u59MG^JjkskDFtcR2OiHh_ z@YRh0r~hP>kWI22Q>HC6jaqCYFZ}XPiud}En|)^HQ3JNVBO{|a2;!t%869@m#%7QHI=@r3Pev^w4pHytZ4A#fv_sNbMaA5nJQ5sr?C~K>AE!B? z*O4OzrV>KCE1}Y)Cp5wH84~LKio#jJ6i+-IERW>1l5ZOLJiYE^HbXr=x7j)M8yZZH zFxIynmM|8~+zs_+k~(NBb{pxd9y+9;Q{_0@|9OWmJ^NzbTX)$ExA>7E`5 z1E%@8To}}zA4E{=?Gq*-8QbYRm0v844(ZQB*L^0?!~D$b{f|v~T*5|I#6Simd)O+# z$_nJU?bI&4VsR9bG&5WN3u_$EXaPuk8-`J1!=^_jmo`s=l71?<{^SWih1^f=kQPe@ zQGpmJHa2Yra|%UEL_ABfU)SX%mQD_EG#iHNGwtm}xxu1%{J%!^9Fha6zY#~Q6yH=MoF;pl*RSL?I}St5AeJ^z-X~R` zD5k*J_mcRJx-z1}HyYGnoS~T+vR;b&#MM+6cVabH6xr6j*jlV)zzJc{jxPZy0Vf`r zv_GJEhs2Mm)&H6P8Z?Q`{+!NHMi?8df?P2imzMm>s(|IuNxNJn#1M#r#4&jYXYuP^D zU2&QRau^sz)Vd0c_kmTQBMg$|lzkhx>&A+ZAX!$3MGR|;CmAE-{)TEZl{ zbd#j{vhMD@FU3(E_R6HP^z)>SR93C*sow4ghu#}g7DaJ0fv?IqdY$DrPx;w~{X?fd zV#1kL}!VMo~l3ni!UZ-@ndM0JWq`@|mSYguF-iiSR%;z9r z;gc4RlYNnr&YPb3N4n85$}Fgr(_S0NxZ0o~^>5K}lEga7pB4H=Jltq8rWp?G)TR{G zd?_!8HJ)2p)y{6ym^a|F!;CYrLCZd-SX6Vzu7;B?4EeHI&931gLh)6)YY|IB&aDsT zHTZhtNoQ`j-i;2GgjXxI83<0U& zVyP+Cx^g(A$C7>2>?0xu_|fqvUOs-p{#EJM6%{D{T-Lt3}*T4eClGSLJ#oFCQ-`Ja4?~iz<^>hUWykx-~wuU)fXd zT>da(RIg-Pf1~~(C=Udd3=zR@@(E9pTW_qg+hOAW1hbPDQ~$(V{RD5++j5}Lnd5`s z-IVq=Q{3*?EaAtjhPRi!#mJI`8$#bmI%WEWYT^dYPb~~^ zVSeqwMn?=FBnY^CbLpS`e1XUKCuXck`MkKt;=jManM_#u*9~#XITNDdo@HzPjlD72 zf0#Q^OIq{6sNu|jkjyY?)0yJZb%DMfR{hCTx4SF#G%x-5T@ejlo~B^NAhjPPg+lf^ zhml8U`0No#b~^zeI0Ye4wbmni4~GQi4aP!5Kp(e7@c? z%;dPGX8C5w6l(tIXxvKQhviI89@3#VhA9j7%iMG}i*C85=YMw!Bbnmd#Ozsz49oA->hH3GcpFAX_aor}5d2FKfyIBiU>i9V5n5(Y=$5|5Ci? zr5oF=;{#=H%{P+kol}5r)p&vhuQN2sapn3kxx`CW+kbGcIkW42cz&pv4y_&glSDEr zVbQ@f*+8tz&(K3&{xr}bH^ltJ3JpOkQiRzovF43xRhQQD1zgCW6J(FP=8*wYgh7&{bCuJv=OL8t+Zw z*BfkGnBz3hVJ#n@H)HipqUSP*>!Yv6=X%;sm@ zL0Moba0K46xJte>VSf}HL&Y6ppf*6R>M4Rxa^nSS(Qn_PjrpQ3-3-h7B{ zIk`yUs-kMI+tsTX>5}~H$*I^PJcTOOB(7HWvb`5cnKvqq+{3=Q(woxW;T`$=N`D(d zxtNTS%m0UOOs)=v%sf!C!A1txdzY&AF#XqWhMTdL1%kC9Jt8Q~gwNO*zt@x4{QHFb zcd#kmZd_>DwP!P|JyOR3#(F>1#oDmRh|+MX1mtFG%T~TY^~m``r+Ke+)FMsmlkK~| z$u3Gm3(Y1489str%Rck*cp3ZQ+JAahBRC~}A9W`kL}vdmFShxB)NcpW(4}Q@NS@yI zO|nFm&9zfU-G@W)m*h~A)!Ot(KmI&_jXaU4;$m_?QvbuK5N~59rkMAcUyY67o7v2- zhoQ_()hoeRYb!H>;?*QuL?>9qrU&TIVZ8<7A7tMuIK?-cTgLqM&d6&-l7Aln>9)4l zwUh?L+vXP@FRcne4Hqfv;z?}BCD{9aS;usp9_WZBdjO7xW{Gd|~|zPXp7HsTOV z_N|0mO!Io`{}tdmFCseJ_Oc%2>0HB6Z2_Z2H7CbCn7(Xc^SU%{!Gy^Oqnj{)CIO9j zCnypmi$ga4u`DJ+tOU8g<$wR$J*^*0@33pVmeWTkiqUi|ypvDSL5<**Z z^m~X7d|pGur(0o$uHMVJ8zqPcBl(SV3AQ~ym;SYP;88UeGMwD?!he~!A{VTJHzNum zE8Z(m7!KR8Tjr-CLtGI~c50B74U0q#@sE&Fub%2ID??5#j-9~=Ek?eLP6}7{d1PWH ze7C}E`Oxz&%QT86R&hLW%-b)sJqO!o*4(*f*8@}9CmX+p(H)XpU72gW=2SG8P4i2d z&F*aXiEt*9I+^@mjep=z*~LA}jP;l}c-2tPj0=Q%GEJ_^zJ#R8(pefYd_FqAfP(so zIIrh^N<(Grt6z%QZW|C2p@;&@ZJ{%(noh*HnnI&C{|l2WAAs8LLa8dlXPl}M>(27Sn!2#o07yk183}euOJ&<%1EjnnPc=1EoI~OMgDvw(T!gPyc3EZ4AdY~ z<-nZ-W&G^uEeUSmE{HTg7Y9F3C)jCB=R%e1YzPJXnZe_OnldGh_RVGGSlh~RAFaBR z_YG2|xRqVNw0{Ig@g5z|XpJ`4i9hLiZG92{cEjgDQ%~;4U_Iy=W$mwyqmT+eW)6)9 z3qTBWp-N~wmt}~3ZQzeh2K?!*euv0Jdtv&Mb&rF58c_+K zEFH?{|9>|3a@5P1%aN^h%cB45;6MfvA?pqbBCIHbFx=Xx@~jM38iH7E@w6E1d4l&>ewTihqm}q0+S-TqO$n0*dT%^ygffjIzt0 zS0!Y=>l|FeLyuK_d;5+ZV)GEQ_%o%uND0(4PX@!4@CECTd#n&+D?25ZchwK>w* zWtmJMIc)QJwD0)o)teG}o}Gc~Jcl%(6}enjD`WIkI7gc38`<_WZ)WZY8%+KdQNnoD zY=1z62bDE`^ns%`XQeVF2zh|(minf)eS0g@LzW02-xlOx`&jP8NQm-?rOmJ!-~{3s)~_#W08MUo>MGwbQstxWkbO1Mn4;Z98x>k zPeRMQ0*_6qkXG2KYs;U(b_dL%&bdoJ5`R-2O_S|fW4xkcf-O!8!sy2}C5JwzHfMbP zs7eSVmP@begzc?tNSVX7M7qWRYarPAw8zP&QZQdztCt%o86)d(-`4x&KZ;L`%MJL| zQatZLYQXuMXrA=fL>_1M;zIH{(?>6j8^-#~4R+LJwy8U^HncY0@GGU-?5Ey@?0=0Y zFs|HzCh5d)-(THRs%IM=FY)b)BT$&{L$D)XvFxBJHw+s-q$&0{`l)nmx{solex7ACwVkJy-qHd_y&UM;N35nSeS-}FQM>0v-W%Dyq$ z^~|6%j%FZ4EmHlVl0{Y@DS;Su6B##5%kSj*G9tql@)mQMDz&OUm^HB5#(yY>g-@MF zpVeJKZuNL>y+3$uSeucu2kLzb;?gF{%7RR+wraptVqB>h?*^L?mx-tylJx~_jjXjs z*O68e96yIjud1rs$i-3${@7{_Y9KEpybMMpo@@WCustoL=Sp)>@N0ml8fBWZAJwh; z7~@n%q-}#KQyIJQ_0>L|zkktuQ6LRHyFo!WJb@8vD-B6>j}I3Ke+Cwfdr@)AK%Z83 z_tP0-8IHfu1$=Exm8Fr2Zzr9JD-w>t#02?vU`=`i1}%k*c-g*gRpHNBm>Um6wFS6O zo!ZeIPC0+e<&?(APG(Q? zriK*P7CYzD_ zXmffBiet{!7JvL+*E6kf`hf!g9f_+P(ZJj*kSr#sr}j9LRo~~JJ9Ft-Ns>R!`pWU4 zK!lS;I|6R=fvC+jihK|I=mve9!RDLLY4ZrtFrDbn3^d^l1;}Z0e{#vwPx~%tSTZW8 z{^m_GpZyUm+SR+PWE@gbc_tM4Ws80pcD_E^4yz$HS$`R~NdGq1DhY>(gr!YsR=M$s zn40-|#|ougHn5tlk$3QNTdBX(4o)lEh|>vuS+C7V(hn1vd2^<6?n9y&=N@zo{GrL9 zjuzg5%^1c&*DE1am*jToVhQouL7a;%`7n>ekHhn zLzvT}Yy7y4hYgiBcoxpGTH8(`;Uu7yRv%{TjRJ&>FwK-RU8+$D_hT~dI#XrZ{UA#G z!;7^(y)z5VmlkQw%NB3uj!zlp8fE(;w9e+0cYl*IPmKxL-;(f3E7@HIl6s;g3#HC$ z>jd^C>3eQAf_)t^l0WKYr$J8+)^e*sF?hzpTyZT0;)FGxwH@0XB5EU-nu|_oXaK%w z?C`dQEfJOoUiO5~D$M&r*C|2*cYORZrBtWJaSty638?~=nv&+CiSG(!PgX%CO$`HC z&VMo!qnmnkYvg4)kJR#GguSNHrwvM!e(Nl2YWCq2ucg2^{LT$mwt@elbNAU8bxd)z zx-Pv#h)~4ja(eADih75sr+4#d7w3_fXgVb;5M7z?bK-fbsNoA%BL6+o2UG43HRz6p zbBo=8LX=5%KU~}jeYrY5s)0f=u%l5UBN|y^-bt_O zOW7%+V!L1Ha$!Gen&Z%U7b9kiXnzz4hfGaAsO_s59p}&@@aY^+oN z6#|}mZSoS}DD$HPMsBA=Pa!r9wSGjNBi#FMruBbgy}! zQq1E->vNM1_;HA0#YQ0;oLfqeJDq;>phPrn^}J3a)CXB3F?~?SX|gF+MIF?&?3yU^ zF`eRzGbS6FS1?JJwQVh7(+c}X{Z$T+EXIIC`OpODZ+3@N(!>D_y$C0uMQu~XTV3+; zLeohnY#APtky|iNJuWOfn18*5$M%AOk`Met^q$0&xAP3{91#2IqTjtud@hHjU*m~5 z0^2uMGgdQz;^b$|$>QeNWOnRl#j^_q2Do-;2MAI!<8DXVrSeq;TqFoTmpfc(h&&#C z99UAj*yfB-f8C69eMtW{Ac$S2;CtTLrL>lmQ4z8i+$uw{#mo0Y-hY!MsL;41?yTqr z-z`}k{F<&ISVGNW7T4Y5YfJIS<0}Hj?%~Gav8hE4SGU^7Ap_)rO9MS|m0Cf9`Xv4q zm^mnsb0+cw;4KnyfwfYuqm})Ob&28O&uPn4b3ODFr={uOhrl2JAjDsFAc0_;5Aca# z6+dkD2v59^mVX^iqkl6@c((Oxhyu)bW3As=-|y9oOH#B=Uvq({H5iE>uZQdTAwTkA z7Y(OfKfHedcSI^;N+m;BVWyCeI(oal{oIZT61gOJj2R7EO2Jk}K@<#mRfdWpN$HJJ zWb79ACVmdE{SFMb^?Nn|#S>UYo z0@6)Gi;%`@eh~bcr^Ln0`1yLitWCP9{a7Fbxen4>C_vczwiXO|ZmHW~gaJ#+-8aVX zIb2MEf{)g|+JDoj!1#l{YkL^oDrm$W)>|3D!&^et?DzJzv1}A02G6?!9%oN)FeyxJg zm_65w;UQ9~nR2^rZw~8Cofx|mm^b!GU*7_zPO}suE)IN@MnxJ-B=xEko<(u8#@g?5 zR}+xQn~_ac(ag6gRU=hMxJ*ZxHcCOMF^inEjsI%=`gMo{(%Nwb3#|51?&w&8fF7p( z0mi&CWPkA6YrGaNwK{kh7mSI%FX3i!j<9DX?WAL{t4v5V6H*9tu3M|lh}`)nz4UI= zp%$+=qcrpBOmeBiwQ1?Vadp4{iJ4k*0!ne$6kJ*o(q>;9!{(*LoFi(wd%2 z=d*ZFpOZitA?h)8&Fk%X-p7GdX1lXZ69`C+P=Cp0Kl_EVY;mLX6yNTv)K=q&Z<_ZU zLNgYKI$WKJQ;8@VQa4;t=*9QObEaJUK7#yQo{lD~Vb0a0N6Yj&j=a4`IwQRtQp>aF z)p8X11(U66n9(V+<$4&Q3jnSX34YmqvCh;S>Q|7G3g)vL(iwtus7WwXln zDaRrnynPY;#zdm7=HbiuRK39^ErN=TCNB*1$X-JnDo5!F0mSNq?60 z$*YIqraMR7#L3|os?W+@WO}>GT5csJy+hS*ESjC^$EFT|xUfs5*-)u}s%!HfSKcf| ziXg!I4JQtZ5SMdmK|sT9 zY^^j~JWtSotwVtb!|t=je8n7KgxU&mB8~;)ytou>aPh&jVFq^H^CI4VOMgY928&@h zjX3&|{fI*=4EBKPOF{N`=)U!Y%i`u(fx(EnF>bpsvq#0&yVn9|$EgdvUd;Qphl{2e zc+$i5%*hGn?dWqFE=m$Qw>{4bDZSbR6W`GxS>HG^cOZV{I8CLy=i?Y*YVZf#&di1j z{nWVkudl$3gGlqheru(%{C^?NE|Cu1K+dQ*IA0(;e`!M7Mf@eNj*S&fFmMpn7g5#D z(>3YJdH}hcks+NhFvAIokV%5+9L|-vDbS+eCDCBO>uN^Ydxu`)R(Lw*_7o3&k!E2) zN)_6!8iw>^SzI3e8ud1HG!K?K^TEIY>UqTV=5rn89yfaC4M$AJa(@9@7_*>kN}h1y zK<1-DPut4^Jz8lzzK_uZfEAyGPpBf7;p&eTzQj~BZ7YPnfmhVQsM zjA0TjGzvW4gj-m~WPgQ>rO0Tucv-jYKLHzA69fw^q6>L4Ww3Z$=qEni{gHu{qWDpy!kf zJXM<#7x1zcX@5sdleE?1rEh%zD|KpdDz&h0NL5v1WEu z*JdAo+|2Z3WW$#etN$7sb3-&Vhr|~y4n^ZyEhZk8?0>(q=OEZ*N&o#i;i!)+o&|0z zK%fvt@l#l$&HngtIus$kf7OhapNzhaa56WRY-&e(V7u)BsJ5SQ;e@~{>gkLEZwZRi zlJm?9^MfH9cVI8|XGsnU={GT_R$A-13f!+R@z@VA{5&IS$n~AjQPF#}@z_XLB?Tyf z%lMFN1bsAd-hKzI7}-hrd*ARQ2=-1O@Y;qi4bkAS4Zip)i2C=2rSZ8D})tp5bdxRpwM}H`x ztuJ5V?>(1iq&XL!<%dTw*4o)Ft}f)0iKih3m>(Vl2;s#^DN*HujT=w<5SIGOJ^V?6 za;BxrLyJnY+l%vltI-EqLR=+>p3M-f7cj>RQX0o z>x^M63-C6s``w1ah(%Ogl`eS#srPkZm?LMNRgW?aKYaWx&J>GvvbfC0EPrEzfO%{4 zHE%m|xICkX4QYNXwnA6VgrSxMD!d=5CMujTmAW)?+mc(!VKW`jW#M{G-?efJjgD5y z=++rCFla9H%*CvpQv%x4aPcDjXiH)m$~p$0;nFOFbHVzl6EQlWqL*w!8^X!-2G;dvo&$fJn|zG| zVRbZDSWCED2Q~T;3y2TWH@PWg@-GJw$Tnw~&I4zM57(@FbwsWUnqw^{)s@qjbBxvR z3y*^Q?IoGNKDg+YYa^D+?azr|rBYAs(YUiT!-n<=eDqnSNMPBy0Dt0t+xj`t`Re?A z4!4A~L}fYjr^Qe9DYg0dDydI;XHFRs(7DsX)))KzP>NcgLycC)K4Vj7&XH4J4+q*| z-qM*lS7A_pw=#REov36kwM`e0R;mGr8HXqv8fCA*eJV)Er=VzC0fPB~%boB|s`K(i z;-hPQepAoaC@p5<^M5?|O}n$8g<_70#!ye><+UoyMD@47vGJr^{3XBvOl`h@I`m;C z_msyDR0eRChjIJHrCNSTB$X}{O;c1)lK$O?2Hoo!d#!vX{H8AyGSA3>cH8P#$ZqJv z7>E3N$f(wFYp6T3g4Lob-8k*;zib=zvN$uMDGxk|u*)C%A%7E2coT-5TbKeTed)^2 zzuzT!M#5zs6-howyY92#jNj;4Htg^j{)HE2YYC6l!quDFi1$7-7~QDQt2N?18oCiCVDpEUt2!Ih0lBW z?4J5(LyNM?aIzWuFqT}1lzpd!hmzTxf25u>iQ8z<|0X*le*8@)nB&b;5@~$>{{oaC zYv17FaDSSW=Argi7_Q5W2Joq(cMM zz~A~;CG@bSyT|uU;UA>>=_U+bilSCE5BpYh%wJh5+X26A(I^!N)qi+Geprrv3jLD-k}{ey&VTFwx1P6e zj|fUKfF@>gz;?ipxN6-`AD|98r}um8^o^RG9H<~5Hrd#9VzJ8~|9Z|T%}?v6`xJQi zRZPbuRwEX>I^n&1)pI4aqfEnh?H|nQVy94wAb4BI2254!(Ek%AHd!f4Nm)pAB2!IB zZhs6xQ^~*=S)^k;pGl@j$$Oe7g0$#q#A&jfun?=BIKt9q2&kd>94Pls5`!ZykkY|- zZ2WWwjs~i4K!3`gk=^Y}eORPW>z@Pc75Y_x$#nKJI$RG`6t1MqWx`kNN^B1_LCu<4tdKhfrEm&=q04&Z^*^HJZ-m83 z*+q-&ZvzyUw}Qa72~W_fz=erJ-8O&6CZwC>&m&jVhPr+S>)(M&Q zl-KwelbfNsuffZ6AW2Rtw|DiJ9V+(yRJg%okBOsJ4Vj1h8%01j$Gb6kGKebZB9i;- zD_ZBzJK2szs9gb}yQ|Hdmz+Q5Xe%OAbgr%0IrY&xQQZP`wzy8?#-W{RHV#&S3?`;bS zaON$%?y}ul3cQc`T0`i7CVwfdsytID&akXD!Oj|RlEVcTaRGq&Jp5D(!H?Bou#adJs)C2y$^Sc*O?gPeyoSyYNPxfe1FgXy@_2q<=d^M{R7|(2RjD zuRuk!y{0}uf8nCCs$Une@#XH*w*?Se{%ua@CBEM>L@7;$fr4cTNijUC6CgD9c z=MxtNOL?Lu^;E)I|2E*KnTPo-R}xq~oK@qh7GX1*czD#gdB*EA$dBi<#%t2>_+AzA zT2k1L5`Vu$ITY?FZ1p`T3RBP^`ul}U$2IQ zIN){b*seZM*?zT1g~mvl%&q~KLheA%U2rj{)77n(qx!WUq zjlm+ZLn>>jsHSwvEnhlTnrX^{OA&n8lQd#rNvW-gEln|YNVT=ag}s%Z_|VH~+(utA z6MY*>kC3&UlTBqUcVST1zX^2pm=<|fb!NIiQmdj+pwz>~Vw~w0QUS=IMi?C- zbF+Qu%*L8V{(qTV5AUg;1N&FfZ>Le5yVoew{jpGW;imLamsb@q$+U@qZCemVYWh@S z(smf1eXQmSE}$-E>lwS44Zb@bz$Tj9n`zCq!H81ostbn58lq+0r9VWrkXHoHHP^q4 zJhHF8FqWLMXc_Gyspva=g&M3swVq6W&CN^a=SC|t{C~qeXQy9)LmdU1_t$_yfx4we z+{1h?{2upjqNbdh!EwWgbqt%aXKxB+^TkO|x{EuZj-rbDbBCFm?ClLws0YW~D1`(S z*{{LKsAzy2nGE96ZFA{p#>1))N-2YsF!7mzIyW|%T-%lvT-u+Fwo?5`7$V)l{Q^hG?7?j6 zpl|I^Ud9h}U;=Ek8COFbX{4*JK|DC0kU_25T{)lRYcO37L0{KGjziA1#J#1Ulk}7I z8&Y_SMJ1&S91w3(2p_sWdCn>PrNsiXjE30N2Y;!FmrcrcK(RXvS5qcPrQ<>7<94P# zj*!Z=U7heGOxcC)_c2=|kOAsrA8t`-TaahS>g<4!pTOU3kp>bM zGKDl4lf|4?BfYC(N#eZAJga(b+LUv%BO8IuxL5?G?+20^{Be1;d={r;&&j?Vmas0Y z?th*YEmhrRd@Z)LbmdoKrQzFgDMV_ER|R0&SF}0bq*%qJ%heP^?Nwy=Ah1IRxsq&X z^xPE~n=m`|w)mkCploMz)<9Wg>)Rh0mqu=|n<=+Lav3u2)%r9lTO~K^mcAz7G%i79 z(*g)YjFS^Q9>U+qaG|H;K-C1k59+@pwST;ao_4UbJ+^+S8S6pU=)4PRqo{wVwTkQ4 z0H(^SwsWUK%fb%_Z9b{~-o`Q|-R1m~Rj#2CNgq+a@Y%e`Xx>$n100(}{%99vwLoX0 z>94kkxMEbszj+dDLvO-n8r*<7{@}kS>^ltsk>mjb`8Q)MwseJ$0Qo1R^c{FU6o1sO z(g5?Rsc)rLBPew(dM``RJUsRHsGUr_wo0R&$0`Ml$2U5*+1lKT!BLf>9PKSt?9 z*VeCUjx$yb(Q`Mf)$HXJs4K;NP27o?LQ97r9_kdP z@|!e9dWYR2G$i#c3-UfUt9Pd6#1XP|$C=gWj3{}@@ILcR|)R(mjCx0#XaEF6T zwz`5&uk@6wcpzs|V1yP82b;ZI7U#nV6JX4xs!1@^JOrdv!rRdO%V-8WWwL6O!vk>{ zL)_`F1^n`X_0p3ok@jMfn5O~ezP8mb8CL;<0_hkZrM>$fq9xAWK$?T-;VB_tHSvkb zaI4csuGbEwpR1<>nn{-l_kYM=2XRqt<&NEgknocK%-RuqrX*Eh>QCfOIS~B^X9*8l z0mrjl$b}qC!^~fyO4MB;1Ha+c(8^RphSCX@j)LQy7H^hlmR}48fbrnTO0`g&(UN)2 zdLzdfWAki8>T0&Y zDnqym5`JPoKFnmiyMGj%Xr)PpvG>+ww3rxq#+VvVZAQ=vPW{Eh3aDr>79?PVfm6px z?+xbcgNKai!2F zzYa3)Zdu?Gfz0?KIyv&MXjTwi9)k3_+kgu!1 z!1swq(IbMfe}CK?Lem^s@F8oeu7oGr8oj{i>)=z)qdA5(w}w8uxpr=?fGe8Rr_|>h z_wV@REzZ4-FfyQgyEeG{e4q-=i3D)1;{w^Epwo7RYaljbN^)@z$l8^fW-odC_soUv zC9i~bCOMp{A|1eykk6Jp>^XPsoj*u*v6pBN%Gn8&Xn*z9A+;J)ojTmlEvl`95CGzH z2iD6frtJ0kE>o)um;;QZ_22c=C6`|)4BkWn?1Adr&}LHT2f#%zXTb&cnw3q8{kq4Z zjUM+(C4pJQB(qtssC(Z50lDiM0b00q@09Knz*-Mcd%HEj`oMbu8EvHwq@MixA6m45|*JLdxBSvU=q) zwhSb`hlE<}b59sG0B;+uIYyH4RS)c%7ECsrBYo13#J(s)18#>aDhFyF4O3#&Q1#C6 zVlSKXPRdg_V70slrmo74dn4a3_ejHAW-qv7j8CSA{iz=J9|u zJ))kr)Re}Hg*2Qxa>e(wd3Y=U>=?O)hlc?~GiPZ2WRLOneXO4Q+NKK{%tj~S1jU&~ z*nfA`W{~%}$9N=*C)BZTM>*TrlG7?pPG0(C!%0X&BB}i6+{m?$WCZ;;$O{!Hy+lpX zuz$5oy?Fo2?mX5c5#D?}Z>fO{*xeT^Rlzq?b$mR3Cq+eTT5YC=1DPbT5F5 zkK_O|_}NoebT=wF^}Zo`fm-NXR>^!cdw=KgRUAoN2YssKeru1g6iS93Q?uX3lZqoX z%+o~>EL8p?2oouJ?}tG7BJm)vC|qrLRJBcWd~NfVE0wgg(S`?Vu%j(~nM$xVJCWAB zGFr+QVjrIrk!_9MNs52Fh}`d^YCa*(1g*aGPT%QCfOIURL$aSR4{?)M4|SE$&2`ujqO>{oet6EIU8s)P_I+|sP02}NUh48kl)9ahZI zII=zL4S-T+9G+Hd#kclpK`TE~OJ$Ve<~Wr?s_ZT}o}4$3?Uc(b zq zmKAQlTYX|mfHD>xRHS05yuq8vZZ<2un(NjznTz1w>$_;VZ8e zecY#UFbocHE8kp|}t7 zm9FF8#z0!vH6XO7itf2;wtuj^F^?$G@H+6ql-Htwo)&Kvkh^pm=RMXVQt~rB{PWp* znEa_pvD$H~Cx}sl-Jw&&zhAVOu6*i6Pss4m{qdE)HNkL7ie-9?wc9s%4PZB-ER!2HD+ zyR23dN-{P74Ccgoo8jlqgC}5>O)TKfM@u?bCf)?K=nuW}6vzTM`Q?XF_0GM#$1r)k zuy|dq8YvSAjCrB~9e>^|#lk}?$TGHD>RNpcid-MWANv0zCbSMG;56KI=jWHTJ?m7M z6zF`Zw24UdAuJ>!)#Q_xIBRnR+?QUMnmemNN8(bguv}}nc1Xvh?s`Afp;kXP%(ce! zpO#O#?W>R8TJx|c8wA-F^MR|(f*bFoLdenzS|b4yGK+#N41c1=K-7BpX-Gtk&;U8x zLFvW58h&oY3=EKqYBLD9n~rzNq*5rFnDGNC=Bq^C#IYZVqd%$+zR54^1jDAF{t5ez zXy?1-H3agoihzeq@YsncA4g%Z-w6H0&D*?4%ms3LaaeD-dakN$A5BlwwQML>>3A&T zrrAryxsIQ%cz>q?mUoc(5y(RM#K1ZD>RS_|sZ~x-c%1$@XFe#?KYg&6UkW@foi~w* zHV^GH-JDPtKcXfY`B;+BupKy*b!+VAl1el3Hg!RwBeEBq&_NTXd?w}9$ipGk2Wu}o zdGRiZnL*%dGTG6YlYh3ru|Hp3hy+TGg(HCkE1I4L(SO^ZQ#0z|`L>2H$%tI)i5RAy=6IRErnk&^ z<4w_PxUNZzeONIoR8j2wr|XQ6UjbNnsT&~Fk(ZLdJgGYTm~1q_gImo&-Hrgrcos#y zHkQP;p?~rCKVDx>*reI$90{oQjR|*NbTWvu@bB=}B90}NO#y$S1tFLUFLG_?MpBST z2%BpHbzNCViWuWKSBWRf$8QE{o3MoNN#iMwNTZ1x0S0TMYZ<@0N1}Oz>X>Ioy^3Na zaW^DLBd<{e%jr`=#D;b>EF62^G={b%4klcRh<`H^1r`JvBzqGcy6JsT9iJ)33PDCn_dQj=ex9^52t>>1XHzSxcyyRZ^;+pq|d1S>VMGF7EvJbb)NNdfJ6znL9jH-BZ7(j%4OC>S|zJ)OY2dYawpCDN&n_z1zETA`q_si-VCnO?U0^8BxVLUkd`vyIRSv#UYMTqOPQX8V(+eug)HlvdX=IEB z4f&ab^1pOODha6kk)EHk!_ww<^w50ggs>dyH?taFg3uHp;~GGyaN326r|fO*Cqw*( zECqQPL?K}sHUBOjwI9F7vV4Z6rGJVKMhH0*zeBQZ)jg2V6@!m}K-}pWqpdl(Sq|1` zIJ~wS1LocmV;8L1B-N%L!xmsW$#-m=G*E(LgiZk1Aes$)-qD)(1{yI10v`(s*>T;f zHX(v3J97(|fV|DcUk*FhihWI#i8J_xBv~&4gJ#%8S+UP+`~g~2#qw%9Kz~b{lXmBt zfHWuZvhCKzhV{Vwi_ASWT2DNCxc>nY^OEZ)U8k5e`&8~hvZBq3jr&rb;Uz9tWa%xb zXh}jB=l5EVjS@pwvP!aQN8Kb5{TC1spWU{{34t`(50AK()fGNufRy86XCFPw6dzNSt(>xk$hN?9dRJ=7fv@u~YVFPS12{Jo^if#;zD$#*gyP4` zBDOQP4>;A_N#u0fwdOPWP98km%Qq;dTDQPnZnoRJitMpKz1ba~!GDtJd4(>n!PX&3 zD(2KdB$MFHu^>Ke9~@A#aTv2H@+>Gb3S zqAsIuhJRCYnxZD<7)r%Nr&MC3Tkl^t)||=5bs}cImp9YYbl8i;O4{pLw)$Z# z)^W=$XJ#9$l+tx%RFF@(=e(cJ0&`i7$i<15OjS`j=k?dO80FBKB!7r@BKc5}Hy8|R z<8dDM0BwoxZhwy`+l{j&5Y;WNWbuO@FKfT27&}c1@(hUj;pJ<+CHe0w3x*FWlaQZn z&YigU%Vx}XT8;?uKT@Y^(ku7{z-ULHo%#qyyMG*fp6E`U5ovN11ogDID>B>F!77_( zpeyJxzkK@Dha3Gd(`DBgj7;K1J&i8HC$d?J#jTUltAAig4yR3SB@igQoP3WqTS%PL z4Yy?eAi&AJmhdg3i0Ned{et8rw*Eg9vhrr<-Tv0ENCJ-sln!BSt>i5aFa;~h{%k2o z5?A+tnO<%$&oHVj4ia*V8{5i-q-TAGv18M7Y9yn#bRg}gUVRw3j$xmsz6D@D>0msy zsx#ku&41BpsEPPoB;wr`VHQ*s>M0Q@0`S9^JXU%?>VcY6Kv9`)_Y~pwXFF@{7Vxji z+N@hSh5a{4XHSx1#&l| zIe!RPSRt#u6HAhGXQM124T;K%!&wC8DZ9{(Y~bQ&!iR}(7`@kkj+=^~HDY}A?R;E9 z83uWvx=1e+kPNG7%w_u~+6!q?F*rHK{g)7+Pf?OX^IFzBt=p(#NNNvey;Dhqy_=16 z)h0JS%?W4-))mqV1EeU$A2gva6ivXP41Y0pox*7;{hs)(QabNOu_u~zcP@ylG=ZMJO04UW|b_fg?rd}9GBl*rYHweOomSl_8xhHHgwX;hDJ?E0F|U)K!3dVe~M z?XeogH=ekK&kNLz9AOVKl=YuY~{VS3l|k%mxR#`-H=@B!9F zJt&(QA`eW3;$5%6*|;3$RMU*@*?%it`Fo|^R#BQ;s1-8St!JU@Y;l*~(_C5hHo9JA zygdJA92h9f05OV+1B64HIBD492&V&mI>j+^2v>x(Fx?4bzYC59|HCq%3D?CHtxu-Q zvp=xqj>?1cOG!gjzW^yKM>FmCg7RMnvdZ7U*()u_x5z3L?{tb+&6c>i_J5*#Fo2^J zoPLNa;~D|eh4N_NWE8ee%p}UyxKydo16A(}WK5UnE_oT6f6uXyov0XYno3`FE}DGl zA}I8$X2s|^>$TK_$CWx88QdxB>f()_ST>v1tuN1;8o47$;$Sz(0V7}>QR2lm=z4}O ziK{9yzK-}3Pt1sOm53nU^nbjY)wac`0r<;LrWc(x?!ehGbG{3Oc26~tdVV=g2?Q2{ z`xp4eDNih94nB*}3lM@=`TnAx-R~>I?Hqxb+-S>l!0r{HouW^Yjh*GsEjEy;k zV&dlGg5y0;#r+W;2sOi%@aSpVU$#Pxn#*w3~04Q6HwcQO%1bby;E=?Z5y>4+cqcW#F^N(CdtIMolM70CYjjI z#I|kQwr%XZ-`-XGKluBgs~=T$_tDd<@3k%gb#y zu%zz!ph`D^PUZj@L9=95B8S16j*qwp4>Z^VIPn}oDKBJWIy(IOKcNDYGKD1Czi=bw zqu9|_T=7=wVVaXNX%8z}#ejC-6Sdmyc#qvXwW(^UJ9CRU2Fo=FckVsTQJR*?Fk#%5OB#Z$5pHrB@GM zZ{`-X8qb&w!`2_S&YjQhf>s;rj+Cwd9p%0Jd2?3Q(P|)w}AkiCI!63|0eAo1l4cDFLlP?ODQEN1k!OI(9T6@M|u8 z%xmmH=c8OHCsScTNgJbOyBYF&)x!jaz77UCo%q?EvAsuY^z^SXXS}`=n0yMT#Ndn( zDujH$dz}Op68J5(54(mPn~nMK9`urdZtOxSf)p9-Rm*E&5g>-`6%<%}W@<_Q8x+-l zbYd>!xs*YvuefA(zSxE5;|4QOy4dykv$49?FeX`KTL_l{>LlT0L}p!qot!6HE4B;{ zcQ7waVAmQHoicfkUcy~O-2!nnndvxMN6T{&zGzbbCHa?Kekz_5X#Z=V_e^S@Bnl0~ zb+(eTI;C@VsFi&k`nBK>k45i*I9L*Mg5O)zF679!et3@;V$=7YOA_?_y6>+pO!DbF zcTGQL5v9p*ruT_!l&(asYo2obzb3$nyi;1fxK!z9%Y*y0emWtGnm(od-^dsoNjZsN z7>zWMV9s#h+}vFMH8D}xzNkX7CbnkI<}4(vTwE;w;W044*_m0Alp?`s0W}X^)z?=h z3Iy03;dCsXTG-_ZAH5o;1eO5<%39_Kiono7U=A3vVG#!tsm%mDt&!*_4-yU^x@vO@S}+&S_%^BQU{WnAX(?EO>r!E6Yif5dW3 z7=$=~fQo=B+Owg-qGQe%0=_tSnX)t8Q-UTS1%kbx>ez&5o-ZM7AO~IMg zvhRWkaG~;2S-%De-UGwwmfQBlUB*}50fl9OwTE)R@uw4Xg)9^D0=fpI7iZw68hK5O zY$;$v(6p!dc!%Nzyrvs!8m5y#o!Q3ATtKJPp{5$EYfQbh1HKgjoVZu; zbqdm8#(b6rLmY9oQ#QVH^liQc3-`yeroSG@!0Td|fu!>Z&=2U}UK$wAyNyg2rD`%Z&W1X9=uSsP0Ym)fOP9bs>v&BZd(!fccRTv${Vy`TZBq)L$ z@UP_?whc=xjEh{*_pRA(5w7VW481-8Wi3PWf%5r1X&zI-(ZNKvJLtl%igcUrI6G$| z>w65`gUTTkFaz=p#1kwV87o9Te!~<=B+9UeR1)lscZkTBE?5u}{HlWF&i`5IyDo`f z-c&b8CxG|C(5)Em3r{2yAc@R?WX;n`I-Gz&{jMmI@n-T8hlFO%Rj2TGYNjPd3PP_7 z(m9B9Y=|wC0PRzN=TU}%?}wj$FsVP0#pF zRYSf6Z%N*@__>B00~`VQGvAs~1qHEOz@p<-1V5{mm>Z%%rtw-*uf8nFHFP7Nh5wQ1wDvoF4X}YR&jnuQ1d$t{fr$yd7Bc9^pCq#lwT!SbuHA8KAa!kEzB!7_9n9bQ zQ0m$M-mMV-&`YovYZVy5E-7O?3^4a83s7IW6fmPmO(jslWMyT*4{fxY#`oD~1^mPDqNU~W*E@D& z07H^u0khq?cxdt2E6s#j8~_b=~^*lJ=5=Ahx{VzhXp9^-XB|NMc8k7mA|RZ zU-9f@F$$%eep*f)%i{q5riuOxM!o(6q$jrB=U5kBpMN5IoHSR{EW&Ok;33il{?T>u zglUMNc`C2aa6t}q!dXvHuW2cJw^VQld)YQTZn13+33^Rc8gdBt-pQ8bbn}@$8K zLTvP}jjDX;z8-4zw6ns6khKp} zUEF(hx=)6y-aDheJ)7k&cg3V1=!UG7iYZ zS!LZ%L$)g~-GHbWL^JO4T;Qu>DyeQC{X4XOTdYNQM!Ij;Hh3N77oC#@5D=>0Mx|jz zf+Y-MbcoWlh9}qQx#}sw8{?f>I(~6_yy`58F5Mxfe?{q8DN45DMDdsE-mcxC`^d9s z&MogKpUnjv65*t%yZY76vlq55ai`x+tZz${8`qxhxm!N6ms_YI8i)|H0UzqSIx}dd=uk=65sw`CCceP=)N^k+BPjzPL4dUo9XV*pU7%{DCTE5ng!EH5X0;-Ghi9}p zo#3v;;b)KO=bPO>aqlzvt8lk2c}S9H2(!x4VR(3_?uu!2)+P^QVMpS6-hwO3lF$S8 z4%QjZLe6#N6|N+^G#8VVR)_j!JKlJsD4$Huw9UF~!%NeezP;XtepTB%a!~lM9lZ>@ z0+*}P0Q~|^Cp|r|sH>yv{ia5sF)lroPIx>&%iVqj^O147yzrZf^xi9fC4Y?9^=&D7 z)q9~)Ke{F5#t*WYf)^dNy@r$VZ)%5jxenispFBdMNR+$Lg~`JxWX+SO-crkq{do5b zJE@aJ;xb}TZ-ok#G8#_=Hp9q(S&BTN-o{lz+_J}azt-=-#N9a0()G>t>#%jRt;vOJm!@qmm9T?Y3G7nWgr_;wvx@Y*;7gY3r?^eLlzSVBT!;#)< zOm;3jnwDV#SNl&b>J=MV>Y!=lAcqK`!EV; zNwCiqT(l)V)PzrgHi9iGSaoVVH9MCa+Xn@=*S?y1$(!99DMtPT{Z%)oGh15IecgWE z?^&OQrNL=pC%a@YCC}!^y*j?0b|I8Dz{k+{(y$sCF_L*&gDA3lUecO` zU~(`v2#kWxc*#e&ux)3~fd#l#v^0iPT2)O(Thd71HumhyAApyQ(Rpd795BMjwp9+6 zbbKpRIt^wB(D zIGJg9Rd0;a!(;E1&E;W0?%^hzsMRuHhi^pBhFC@1uC1lSJjNLFfBx>Gqi>VZ6Kpys zLB%9Yo%r>!U_svfu)nk?(e65(&SG?!6y~7`u>65~33ND9*1f+A7cuFFA~O5C5celS zc}`PUdz`q^SSreV9Z3LI9@3TeuI9IOhj$^vh}4$;a`^1?ozEe@02%iKWC+IkZA1WO z+#v*^7u3z(__`R&HEHxFlPx40^mE?>&H6cw5@$&D^15S^>eRjcbE0V z9~^NnTc~*7Xuah}?A9+25BqnDXa|Lhrowm;vUi6H(R~Lz4~03iQwQ9gZJ~g~J+{xu zFT;Xi^LEwl$5cna^og{;jx!suS04%Jiqm8 zz*c1RRxLPe15#VE!T7GRdSf_Zl*Q~VGL>;6vCpn0ir`RHy>6Fq8uvACTl>vhVlpOq z(-7b#Yb9$v0NL~tYR`q!6~X=Ob7D&fv@#|oQK#uUaaYecejmwh>Ib_w8sl~Xp1TTD z$`ZH9^}Zop7;EFD==35fWO>vLq6ECc7Kh)GSf#_?7ft{?m)-Z zwrsg67)fZNWiSjY5>I&nD;ZA9998KOX0#w8@7j^_9XV;F(xSNU0J0P!oPuy#xArcy z=92J$zybumaQ{~pzofv^g}uQv9dS#p_63^#_Uz>|iAmLh^wK}+l!$O@AiNmGgmGJs z_VZn8_4IGXE;~|y-ScMjATws5H@{RI-S6*4Ut18$@q*fxYLfUJ?6&4_b*%d@UB*O% zKLj-N9YNP0j?WT8r(>d~sXueI2Q-%6u(4xSK0@)-5YtFf=qYS{6mMh9vr_pY?axcj zpHnp&smdkNBn(vu=`vM_`Mv&9z-tV<-~Zk*E7=aJG*_|FPz zXphm>YmDd0(?ybQqx7mbNchXlsxatM%{kOK@2e+<3;3n3D(F#vflJ$o_bcumd5PRV z?QQYrd&cj>3I9|J5*4N5n+}H4gruLD?d@`_mSmKZ9q+f+t-O01&m#}ke+Gvnx8z&S z4bGZIYS5h^VKotIm%H+o-56Yc{}i)>?@VTndpyb0de?rhe>G=M(BV2@%TJUiYd`UE zJQ0^=#D1*%k^Ey04bXYINu4+iBfQsHBO2U=4f;q*pYTW*dm)IE!NSxs8$TAP{_)C$StIcp)orG{VAfsi4#58+R5e^ z`C6@n?L0!@*gc&#yPe8MJ6D8h0^L0T>@omGtu_MvvP>us0={Q*l_IO;6US)Ow7TL(|7 zpVC{1ar?AL#p;J?CuamSPZZ$TtuESgYV}cym>m*Df2Z1Gd9JV$LE~R`jjcKfeVfL=P@ zw6>4t^AsT@oLSbBl9*e!zmt7=&|mJbS37j;hWKbyNXw2Q56VV)Su1+NdhG|z z+8A4_kNM5~`z<;3cpFxOm&$F&bufRoZKsiTs_@CQG{qc%znPEC`wkbZ_SBvYHZOQb z?mpN)968%l+zXiKT)UULoO;ccS{w)bL{ev!qXg1wh$;r$Ki_G~y|HrsY!m8Q_!~F0 zK=WksUrCiWJ?ooCSXqUX=aFZ%4vA)6e#J&B~5olve6}MRwosCy+^&?ppC`nrL;vA~wlzy5k+;wh8Tckq21uv1sPVW-iQc}LeOX2jbUYmm1 zaLeI0zE3e-(6s%g8n?o4c6gr1vD%*ICTAk%=Ny~kFYa_YJ1sgDZ*MRVWpo$h1jSM@ zdFX-u9Y14Ym^!9<2&b7pvT3(|&HgKOp2D%SYcHJ)FPU znIf7F+BO$vEdpjj#LgEoSB*VeF;5sAM3SPSozv0A(=*h})k!8=3y7)0aH5h@ zs0zblPU2p?ub(teW=&e@noW2=Og_GQ03CTP(@~Mt+1-95u)!z@pb?x9>FF6XFzZA) z%($vPkMRD%s9U( zf7el9*=H+?7%=k0gDR5XZTY$kfH5*-tFeH%;DCV%{RqN^=o0d!IsymWV{Lece9J?= z0_HTqBPc1IdU_2O^xA*M^0iyngIK|1E8v5yl|U|e#_~OHW|9Ox5SKwVx#zn6CY*~U zzOdf4*gifr73sR31VQnYjOjPM8vR&E!&||2{L=;j5^Vd>n6U-i8s)73A)`k()Wy-s39N@20S1&5PE?E#6|TnsoCn+a2z-Wv zfdd9iod7FBulLyw{j}5M!*(4_T;X6cGOWNJ$iji#sd9S{9Ipfh3wuz~y2Y0waD_-h zyCI&}YoA$-1mS;}!DD;5)Lx8b>VlUc4_4K_6-E~ZVRFW4MQ1y-OdYIgn_2qFSnZ*v!n zG~)edR@7@bR#>lbi(-%9JX$bOqaklvy8}J)`0-|3Rqnb$KP_YQ$JXy_;KD!kdsUhga?%d#naEdgqzwlLjuWpF} za+WRM^~~%9EEP1j6>}{F`&F?7hCS`sWF_NYZVp#7Gm-H?QMc$x*RIs@^ z-;jzk*0RU6?jV09G`O(sl6JB|@w5$nyy(#Oz=^P}Gf4$LXW>uwRmIbvB*#MyRB)$U zx>s>sJK%G(ezUS(F{Jl9C4MY1VegJ)#;&dr=~bF2)w>-{$P0Hlb>dVhEhg8blC{Es z?hAx$>7dDab(TN%F}`w+*sUjVNSN$PfjIeo8=Dx$hcB?6$$FEt!q{w_uzPT*=Z*-~ z_g!?w@x2^jvoe{r+-p6ppUSca5O>aU)^a6u=v*Q7rZk*sjVZl#sS9s6ICxR~ZWH#D z7hWyo4yZ7HBzD$~e;prAq4l_*BQIjl&RH~~|Ia?4qLz$D z6?2Z*HjlsM?9wt8$$4XSWAOFnP^{DDkCR;_w|It0mdDjyj8r7&453~ekV`PrL+SHE zuKexrtwUUep~%Scp-R?5&}VgJgwWLK2lnN!kqz|iS7vICch}P5S)|I#wqv1Vk!Xnu zd;duSbdRUOU>T45d&3{sVpXHVUm%=$SKN_UF`3E;Vq2Y0mJXUes9lFsj&!K_X2{=n zjVcPv({knZ-X|57(=agXfX+SkLu5Svk>Tp>cCEk08snNPKNg!B&qwb?u*ALlAFOg% z@g~k-i6D8*Zxl3zlPHvX>@+Tlf3*+y#&I4UbOu`pOllkU-<{B8q}!xcJt5@Rc**$w zwj6k|Hg0)^9sNUK1#&H)u)(hzPZudY5zBtQ?8#f)-BwP?J(g700HcI_ZkJx8dnn*| ztEcU>*31iwFT1J%2IyRO{kULKgL}>53O!Df7Kc>ED;-U135|c?0d8l%)l3IFY;N`C zkj2)*y}Q<3y%lMWeKxOopA{DOG}Q|+>gBAu9om|S*LA40_|czxTJpYQ@4NYi8{;!C zaf_KYQNFXIYb^&fz)S_{;kx!7GUZ`&f%D#e5Y^jpY=)(sXGBH;mebO$>BM8yxBd0g z0`(t~(gtVX>*ii}H~M-}PU}RP<^KJQqc+Ef>$P-j&Buwk-=e`Ii_#}I90qHF22o-8 zNB^pd@%v-&V!FgFZOP(!p~a*J9(U0ZR)M*}vBy5;@z)SOpvy3lkit4qryxJjXYYNa zW^ku{d^q$BV#t0rW{kct_os4$-BYw+kzP07d~6ElHGLjloN9YjWn|oo*&zo}`a@+h z&Wf49u0-aA_cOnnvb^n#d1rO}ch|+(u%0s69ej^#zqV0fto*mCq`1wJx5E|);Rk|z z*|MhC=ghSrU~y9-<5cQPcEC3ma0%&_PCZVKS+qJdH-RWydP04fgcRHUxseLNaD1`h zRnP4euZ|oo;GAICyx!JTlVCyrVQ+Gf{t5F6X?A?~7fN8{9o-GdW6pJqua>XVNbu=4 z-l!;C_2o=m`L#;&)LhWOLR;g}pqs@V5-lf8s&uItxUU}r*VcB_9VvaDswIniO?u4i zTes44{q}f{hfTL5^t>pMq0YfoplGy2-a!Cmn^$}=C0IB7ly^=w7OU3&N38^cukU_V zzCTI630pl(-Nc2_fuh_P9uvFMPG8{U!ed&BMm}o9s$#-hqnPYC$7|)-m$saBrq9^x zs(Mrm0Bx#{HgbP9nH35YWPXNz%oo0+nn-_2yOzuI+RdE2Qys*_FMd^>pa@SJ<)puK z!a1H)Q@sd7Pqo_6Ij*8t35vl|U*F}!9q4mx>JbJu_BJlES4!f6&XIAQCu zXv2Mfx6FNY^tdb4?eQTkDOUQ6R<*&NX?JNkWnzi-Wl|wbj+$P|xsvMmDOk`zl(rd2Q#a8*p}g7>s-D5!?mrFgHI*KjfT7aqsZ;WU6}^*X96Jr zq!|`EZ7$lDfu*sUJ{js5gSeW0q{eCX*R8#nuVM!mZ=E8OGqoUl@Oh_quBSU^%;{3R zoUuhSd&c|P6(P495HA#4$5T~_8NApJ#}(wlAwvx;k%j9GAC~FPyceK?T89O8is%Zb zOuiIXmMDo`J;v2wXWz8<*GMZyJ7xU>Rz07|y&xFoe{3H3FDbQO@-$(;3l`Ul^CHHz zKb>sszC1DopC@(xhb75Y{KsKgpP}o6rmVZXGOt9~uDr#TS(_tBrrz-HrzlgHDqg8e zqg=;njNHQf1O54;1$*UzmMB}6fwHmbodDZLPrOrS5}rKUGmTGLbCn5E{%i-|6|JFDsw`LfMXuV5?cV z(nTx_bXT!~dPI%bLv_8fPLL=nt<%vm{3Uuq*gmt_=&Ym3w3z1u1NxbQ+cCbL^(T?mdi7>_owr(C{`gW@1PS|8GDDiquw_e%koNf zM0K2^BI}yJGrSxDt3qnfV{|{zKh4#Nj%%!+ALKoB*VY6>>Gj1=c$^#HVQ`4+hKCY8 z;<$*0N#SQ)ft6$?_I+|0xOo94K(t(3f7XnoR;k!T{6h@yBG(8oRqp;*|H#|mk+RqL z?aQW^z1{UW ze3`A4PULEw#BgglWjxplafa=t#jBzpTZhV=D3ZATN$BTqn|}u-RK(;kX;KUtNEuG` zDnGyps7E7OX50FJqia;<_Wfn8K^&&>jq6K_3KonU@XNmxJj2({4u0teOV4988`GLW zX;clD^mw(c4#svrDb()@WHK9*R?zMEYFzm5Z<|k`pM}NwZL9=5K-}2DUf`vTY%n`) zWgM5tX1sx6NZiGW6t-QoRu{Jfx~+1g6lBM=KZs5&iNqQJ;e8jbxut7;*6b{&w$Jv zrktgxilQd7%0oIhHgSWlJL2;BOn~DA6 z`tg>;TK*ZJ5UVzxq-{1O4Cb~O;duGw+DE-xArYpXwrIsSIm8K6is|*mqavFw&BkX{ z*!bKOJ4mEFE=Zx+2}_G%LAZbQ!N;p^9qBhK^#=F-jmQ${Z{B-DAJd ziEyFw@a#fRglp>$^yxw*#=rCfO8w+JVktVLqX*jso`VOaHQDziHR=4-?xU54-a`*j z1xa(B)knL8SLc(P0=>D{Hd0P0x!W7hFQmi^=frP1oRm$vHi^Rgt786IeFYEJ8ojyC zog*So_$vX-C!>P@Pvu}q5?X=8Y;@@W<8cLJX8TX`KyU141Ah($WBy+m6lUXmJGg-s z81w(CpfDO`aUdR5z`is8w+^FG(;C8`3+y|~f9tT4=(3>U8$a?PV7|K8{@)1%>k!qp zVBb0Z*FxoB;rjo@6c#RS_M|KsC@ctOHa700Yc_Cdpvgq_*YW~8LihSQoZHudh(ZAO z&)y9l$!`m5Z57Kn1bWx*v4sg!&GeA8D_PF!5x=%+>O+}uo}37BM9sks!m z?+;lJO&huLO@Vq}lB(Zyl)m9uOP^`b1W!CVnp!fyWEA95GwvVpK+Zsrvm;8!?N&ag z#lh8~p2!i?EsuAOuCPIUCsxMCrF;|SXJ_O3N7m<~`ltKD`-eZ6e6$ugDnJw@uz5g$ zr&&mIVnIrHnB zZ~fR{#h=pSFmb^2z_pNLFr~QK@=H!2>|O`0Zt`e;$9!+iY>NL2;`=8Gx@%$*QXd?- zm~BXSX1W`+Yz6b$?KR)J%g52l`P%gTQE}CefKRC7)2OZvRP*P@MRQOqdMO7mG_Xua z&GhB9(MR7QPQ#o+?1BRM0q(1Nuu#?+_O-RyG=11KwFiIm$sou8Ni2M*5CrgLNS?r_ z7w6}|VeFk8pkH1;X0Po6hbG{ws=m8{|KWN{Cizg)Au>LO+4@{XP`@Ew{Iua;*OQ1R z^5$nC5PH}EfzPHOD-F-XcgFyZK0dh(K6@#4ZS5)zPeAftH3U96hvvEmHeU4%KGCnS zp0uggKgkyd)CLCN&2vn5O>N)Z6h0e9TT}d@bqS13kRdJy^(fCb&4!40%eLSL4<3CW z^-T|Vo{5Rwk;cyj1vNB4h!6D`Nt(bv$+6cSHVr|`Qtb*7^6POw`RD+kUov2fkil9| z9R$gi$hSBmqL`Bm-yMXjsTs86Y>TD=#Pgk<6hs{>CJ&zra%=D60J+N9S?H}jf_Du> z{d%*o6BXH4Z3lS=vP$|x$QwkxSRj{#modBrB$qMJlV7JBpjYj=9`V8#=`m_GyD^sujlcWkOLjb01 z|C|`Ybn%sG2l`d^t53dG0EWQgL$43=fE9WZ63AU%?wVov0PSA!`}EbnP6SAxn^FtL zf$yA$c1PD#nXhh5d99-YaK0jCUz5PfK8HY=mR44QVLX@@35X@rTVxpBv~>XzcZY|s z^?XPG36DDiAng#KBDB^05klO?H7IblWjqKpcb{Z@GK*90V8yqO6CFZ;XBD@t*zi26(>=VrI~s z*8nktDYVu$Hd zb$*ioYYKi9Ao*D~C_vIwoB5fHXWy{+b=mg#bvoq-x&b{7%g(GSfKPboV~zjw@#GqN z!P&{74!onj8l=3Cqm;;D(K8F%x?C)+&4t5N{ znVozmF?pDfUoSKEZay_Co;U440Y0y;#XaEaQi2%-<_;{C{3F?o4I80W&dNiNh(w1= z6I5h;(or>tF1IuW=AGQBCJsiA)-Dc=S_@+hD_%@xujm_XuhWZ z;&U*`VQetL%O(&Eq-FSck3))Zl}x-bR20L8d}j($fb=Z*HLH0ZcAgJ%{uP$;ma+cm zK(JehgI$aPg?Uc*%$(U@dse>0_>im{aTKT*ibd5a*wVgXMAeu25ca8`{GG=A&#MmT zLUAL$6+TPD&pW>s2hX^!Vj$>f&Q`sR>Q~hn0@e=pAu|gYBN3R(b!8-;l7%$QP6bNf zF2)PjkIFi;51pSA;*2bMGv%_43t^}mvR)&|UOo-s%hfB|A&-qLnMJ>U$J%d*MBPeV!7w;BGW;P}`ik2b zW~PM6XZs#7@4;;^_pe#KJCXda<2Ts40TQoJM1{TbZxNr_bjce!R{HXloG)tLEGFtJ z#Ype_&1S_gKie7SHY5QIo4xIu^ZdfPdc~Fo1{Mj)+rxGXbugBJSrJ8ZtjJa5opnog z71Xf@UIZO@4%>{;-qVFg#go052F4>vftb{?>(-ySx9n_0B>bQ!lagN1O`V$)K&^Tc zRY0hyau9iASX%9ddAcm-<@7o%v;#G#wTA)O34zgWiU;0NqZn}M)>hj)81^9LS&Q7~ zM0b;E5`ml_lCw{cS74~og#T?QInKW~*y>(&N{E=YmD}dQG&f%1YB8ShnEL16VcF~U zql2|gfA!vipaC`KhU_nH2`xKm&6&rnv$7@G?`=~CF9;8xC-svzl07&Ld(Nka6+EiM zU)3UR{?}ZEZLk0w0{_p@)~7j{hNHX zIoWp2)4CA$^=CZE#QaB@R$JyEGow;Z?UL>FA;BcUd+}xddk(2CczPpn59v5hU(uC| ziqv8Y^Hx;tm6i6P7N*9|$cs#(xV7wyxShG;$qm3rsRnX}uvtmxI&dUppIFH#_%bF9 z$BZH&*PvtWzOC}wD8@3mp3TmAlO1VI2GkRwP+q&0;ZN!mD>c3iQ;$d__SVm5R-Y&eYdi~ zK#1DE2x%>$iS7q^;+stxi z$EM882aFAg2w-hl1y<$cSA(4?ZHn_@C=UWF# zV759(smHryM+#C( zJiI+NEGG=St&H7Cz=AdLa)V>_4o1Uxm;4t}{96sxhc#0Ygx>>Ws6}siS{C5)7)s0aQFu=d*_YAO@1An9)-VB^eFa|2(B}i(4X)1wZP}>P?-|f zeOpuO<+s4KiN-Qbt2Hd&$0Mv=72t0SG*@}*n$8k)1s6@0V7l>WcfGf4I~Cjw=EP?d z>w8*BMsA^uvwk1!VSv~2$v1Fhlv=Ii+zUwhj+~9BWrCL<<$j`JJ%WH2t5zF3SU6oK z0vn?eN+07j;3anNH@m3*t_tZL5d4Ys?!@JKdAijN#Fk3cS#neA5=E z?zlzGD>S8u*uEf-4$W*rN|ahhj>y9v>A45t4e4a+W z(zf1%XMQu0e8;56q}D*ZMRl*u@S8hi)If-K)|GAHaC~7D+iUZ%)(V8iXsnlQ6DA;P zW9=-_yUS#N9e?hHcAzC!3b1owkD*ZW^Z4g)cQ5NoxKG0ak3yfJ2Po9MVHg-bq*2KR zY}7B{uSo^H^lQ+Su6gZP+Pe#uW-`%ii_f@77Cl>1r&i}`h(RoxU206>QOQz-?0Oqu z6yc@o)Sskp`Xkm($Vl6;txyLmxm@D=lGy0Ljl8%7c-%GYHY`PV+=G6(ujuw>-4nj$ zs*CvubTx}2z1$w^0vz88bQZF(e!AYnUL!X%$?EA~A2kx;p#Q8!T$|#=7I#1FBpQ@G6g!n<92DH)+WD?KQ$$`1Ysne5k9OZQ4&n5C|7)mI zx<-@teSsVswJ(W#S&=u0_ccKgfpklK*GfY9?Iy!;Q%t?<31~_wkXSg(^&(RZO`8+Z zQO{e!^-CV=URDTXN50WBT+dG`ALOPTAaJs+j?S(oDPU4AeMo?mt;94bTtMhA^hf+7 zgX&=y;sFo-XSQ?ZXYjYpGmM(_Un{@)AK;-w|5R$zCej-a93e~^)&z4v@ZxLuQu=0?V4n&0`57p_=R-~z3jjc$kJ3;$6XwcMAk-Pe$%du@ajV)NaUa|OgQE(P8a z3J{%sh(#?}d7SKUnYW1oZ`91Ek_;Ftk~SUOSH;26xd1O{mALG1o57{+(OrM&wY5vR zK^>11Cq7SoSt*J}Yi?^5=SOL3Rgo)cW&G;1byCFbZk`MrH&; z7uu9P6FZz+Ek&|$qZW@A|12s7j&CdX3ChibL=}SZxq)DPX2-d(FzK7vhPBMX-)i>y z((JWf7U1mNUSl;F^+cOYYSL2kbg=gxmgl+F`D1eJ9$PI$7`!%ts31py*n);r%{}_3 zOHQ@^Y@1uA{+dpWn-A|hR8YL5=3yUAKBWsbe}5R&2)upoupAm^qlN^GD0JetAfgB| zk+9A(^(OO4Si>(m4>3K`u8?@-I#krJ<3V!PTYzqgEw7(ISpcG7v0S1|BK+%zWy98n zQ=Yooo|jxs?R8x~!6IuXyLKRJ!*CLkR3l^RD^!F}_sziA1AJ1EphC0UU59eU)CUHf zg}UzD?Gg#cb!wxFxi5xWZK*q;pF+3B7vwYK~)jENB{4_+A)!T zT9>)F`$yNf%m^j6Js9B_De}EORwe0>ycNMok|@#reV(BXtscv=@ezp2d7=U{zwP;v&DZj2SpWf{^=F4e!1tLmrfO`t}Fwhk#`A4(|2HI!&%sci?sL^%x(`jn!^?M^G>8oX@d|%+xM1S6zlxVyVhC)%yfNzRgTV z^YYEHSY$2UK$2SV!Fek3;O2o5G643MK}vL46-4@{j9%v=a*Gga!~T?y4k>X*yqUX~ zL?ItNA2}^<7kDj4B6+J#idYmcnFAH7LTecq`YtDfLvac1>lFTgh?&RYm{>y4jnB1@ zrRTSej^vZnO1enfKNAC{NcCj+&*7#EZ8LFR6^sR9)XG*Q9>VySx~x=)DuB3sS~v@S zr?|l0nMzZFNGPRadED*ekF?lzc_RcSeFn2Rp8zmekLN0}oEG_8YsP)l`1^&F_21nt zW`y*dRFxf9z1qf6)Hhr@G2>#uCi+)WV!kx_4WGlqA6!?C-l<>MFO z7bi4LL9g16*%j@YvOrJh6z+MZsEHV~_eVrq-W z+9_$9&s)*b84#f4bkB8^u#!V1_ji-1srYa%X*+Y0UC$FSExAuU&&-q=FM%pBYaZs8 zEw0|gmd!>{|Lq*^l@Qq|doP&aqX0jhTxEZ+qEDL`0&ciu>XN4Ci@C_Obtp4?VL8&2-)6hN5GT#~dkAx~)5uw&b6R=O?>LUgF5=)P zYf>VIw~G4^BD?-p5kXSjb-&6>c7h7}*V1Mt%mR_~$(1_u)s65R{(`9POs*z(-2Qp| za{hOXOdzWOHwTd=HmW>+==LA=2uDP};AkdvEbY2pQ6}s?{kJLJk>87m2p;mx3(v|i z%}QvGn|L$~JIu^TdI2IXOQq+8t2;aI4Vpzs(8-;TQv=gH4W!h1;Sg6Ryu^FxigS?EguEZY!^8aokoX*z%O!qQ< zByrP^TixDPE2)0q{;sC!r~Zc2BFjH4ruh|n!aEw`M2*`;r*@0wG_f(2)z)AEe}zjT4dK8 zdK6jyNKEo+hkaPoM-TnX>-os1*^fwf!sRLJDd9{jmQ-(|vY=+zX33?PQsxH=_8~oP zkHXn%yj5)Gc_D5As<{>msy?WteH`GuleC_{mqy_sPIB5aJZ@l~CF z%pd+25*j%?mv4eeXIjdpEPN+Nj-4Upy^E?ol))cF{RXTLY8C7{Wwi{!dg=nc{|^98 zK(W8r8h=MiI=E8^xqy{gbbD)R2PDY~)Q_c9V8b={FHPJdQ*=%?6orty2qblFal$Qz zk^4yKLliL1Ol3%4o>xq9lXCWT)GY5CS#CXK9f={Qe9N6Rk7~(U*CQQN_&oQH8y4QK z-n%PGTl3)A)FiFsUV~tANtw>&{e%hnZ($L3r+>HlPrzhfsZTVkcK!?P^TQJ)PM=34 zgO`}b)o2KKkGJcX?gdE7=D!)g#cqgnK;)yrO*?$4AQSx6+WwY8g7hPEDA4bN6xZdL zuj;V~lFE)jn!&9a{lG~f!ccNXlsrkuLB83{Q=|$<7^&R`9bP^QupKxwZl-T$UGVd++--7UDZOaTYiw;}`7O65w7%+X_{f2kpcqpR&pw~0VkqM6PE96w zrN+jlUhMqzN)fq^pW9rfPvMg3uixAXJ|PcRr!A^|bk2&!xLUC#-H3TmIE+u2zyZo3 z58=>F6uTLk*mb!vj}4~5bR`$b4;&^iN`I2|I|ONk&lAig42XUKiMm)Kw(CeV1sTfi zJ86w49aoE}s0qRy314W4P1uh^LSE4k%rVNYj7qY+zQB~}B9;wUmwlAv zGhU}p6m=d)We!uguIIkGdO^>BLlx0Yb_(6JMH!yz(8SYYdd!4H7{5q<4~B}$EmQYt>y6+&Vy*as z-?IBen!%vzt(?SB0qD!Jzf2g`VLAQCgpZqIAmoN?tQc17Utxo!y5RO;=fT`KGuhEZ z(-N6^3FGX_A!wUxXpk{^%P#sQK7Ys~Q~hQVkfX~&yja&)B4===a2jIT;aR&?WU_{b zG#{4Sd!-(7GVND>pc6k3_~oM+%4=?5Ux|krDuHajw|cUFXoAhfZrMn&=ksh{|95RO z>2E+dg}B)*bu~I|A%Z6lHyw&GP@)s$4tDxwJZ{%n+Ng4(~*J#4^05Y3fH&ORwm1n$@U+ z4o$1k)5iarYq*zqyk2L~VSnU^TQJb(BFwVds^SSu| z9mKz);+a@8#QGrgUiA(9+o%j}^96ECnE7?P0VKe2qqn9stEJ|OO60`^=;Je3fvoY`J|V0$Uud+b4^p;!ky+hpp=juq z3*)zO>a(;{H}SPVKzL4<o-R|P;$CWZOz_=Q^;oGCtIqc?+09j*H_)-V!Y`v*g# zdjYCkCHX)bJbyc4zYVli_koH$0>}{W0FzLCH`Heris)WLWPcli@wJz;$SuTq7C5zc zrRAzpoG20m)54=0bYeu6Dx4Gy6qWU!gC>EH^7bS^P1{-+#m_j>?1v{~2GQ?&!_kh0 z9-=fldn(#GUJN30m(Gy0(`E1%;W6w8K1~MZ9TbZO!kV$*=@z#PgQR9Pk~J{1s_zD~ z29Dljea|D5)_=c9@*XbKHmqMW(b^9=fftxSO8I<_1c~7R`wIwnr0Zr`xARWtLy9pC zq7-4XBDDpw4Nhr<^OTs3GbStfX!ex4w%_C?)|}PcVv(je@@@K%*qe)yv5z9B#24>N z-~a3lvLKCRG>Jg{5r5sJ7MR3pA&9e18otq=HtPk`^HDQD*?W#!Re} zu(S3&L7H6!HZA^uQtp$H`s_u9@eU`^$cTY6C?_;|wKI27i00La`ZJ66s-bS$xyW)O zw_`42&c?IBTPYx?f;f&X96Z6VIM=Y13q-ciq+Uy@p+(&Fj+v09Bv9d07}31_LXcSQ zxnRTBvwu^4?nM)dWopZ!&X7@?vc~BISmLb5Pd)&d>f2F`-;vRQDx} zM3mrTV4$%J_1@(w)NZ|$ctUf`3le`2(b3~7KIq3f_^cqk79xM3dj(aZ;aySxI7YvG z@zL*CrXxb?BS&T!UFC_XfLN?+yjU-ayx~eiYkzx>648X$Mt>Y>p&CEM_Zfc@8d`*f zBhzl18PIrVjpwQc36eI*#c;et{-!borFq268qw`cP;mNlQQm`H2jFa-nyXePYq&2) z(LyjN7t2jahW0zIdv!t*i+ya14V;QBzewHI4f#7S+2~iZ{w*%nKHCc2S-YcGO~+hy zBY)<&)+J3%5h~@aWnz4Lk`qJM(W8&jB265?#86?}o9BJE#IUPi$#=P}GKhXj2&xbR zA$x%!@=_9H_DmU@I!Rv|YYh>!;vx7;K;CL+j3uUV8@!UhnSq&IYBmgB*V< zn_A<}Vno>Cbo?PS$s`K805|22msbasEd^H<%d(@PD_KX2Ms#kDW2n7YA zxrs3ZzyR=$ds&uRF@HzOj(r?LKYv3<_Et?T2Et<<+cVmE=j+Qa`#9yhz%wn5W?X}~ zwF{%yqiaSP)m=@EYmnDm%=ynG)-N*)-4{Mt@4G?|-!EPHm5VJK59j<$B*SSV5EC)I zj*Y7kmT+B*39O3ALbc4NOa#R+oN*2Doh}+IYiZjJ4!v4GPD+t#0Wgz2uPcz@xV;5Qy>$@<1~WA7(6d=2m=>8{8m<)L1Ss56+XtvQwm zE`=VfG*@G$fB6ps7QSK1yGxR}VGhpf@qd#r*epc(pj2|i;FV1HjD*g5J{fn+*{eb$ zgaeoG{oIM;mEf3xF;1Av2SN8ZDq7LXm83^!cfKJf1By->{-NQ`Hh*SEITO5GjA~-U z(OI6pRhR*U8u@esG79-9uO!KHEiYQm`q!mQdA zOp6~>Yzdl2tfz-PkM$pV`=c^xGg3@W3B)4yzQ;+6WDB-Tk=to9zpb`OlqbgeP!~A$ zX`00DVO!<6y`y{wwSO5zKNRb{OKo04_pPTX(J};oAXUaN9Ze#H5b4{rDBAMI27&0X zxAQLZzCRt5V(eh@Mq(@>@QQ`P33+$!R;5rezraq|>b``i%=qk$!5Jq*c zcyMUoR4XhI%{jTw=w&-C|D;r1YetC5_fb6;zB zKy@5)^FU=Z^OcF2A9Y_ou3)vsp2S)m%6J?Gtbd8w(UwIaojSd{92hQ6#aYxHq0xpa z%<3|KK)KD3QByQrpl4KaMb;WwG%)6|=ijE~)6>s^xf0qh>*vb0``OSf+UcpQ;Lhis z1c52twdX4~j$_kZt-g@9cybwYKHecp^LYr`O~E|^Nph+qiDte081pP9QA#IxEZhI) zD@*q!lcrMQ}U_i$?O zx$^u4WC8-e92I;QGdYJ1et*&y;xPi8wd>t!`bCS+S4N1TzAsbID0#NL zFxtjwdEpEiYjAw|^-yGUeZzQ9#J+VB>6q83gIxGP?NJxHvjd42qYQI}Vc%7dsz|PlvV)HN_3k#O0|mjfAW(g86UOU-eqq&5;Kq{R%uXk`uC}x*t@?BD4R5Z?j(4<|;*iQbj z@e*gh?(5D!7#UW79h0%cT*%8p8%krvb6M<7&6cQ@~;xXeN5pBPpwoHXpQFR59(U0h=kVZ2B%Q7sp;I8;_3T zfN7WE{Nz2882x9-g^eqN4GWX8(l9Gh9%o1)iVDA%S3$oEwEl$4-i=1W6Lg4&s zF_*0eYR8TWPd)y$9KnkBm~m=P{VWFUgX843+1&eS`gn)N1m%|^-D65-QL3+@nYBoz z-KT05H6P%PZXMj-5Ut}ErSFK#E}yv=w! zXmgnKYaW{xAt-ctJ&cH#qYAV0Jt9`J35JhDuv<*5z6Dp$Yk_9& zoKY&GRx0(bPk(u?q&ieUvE<%yH*go~at&#K_oX*E|8)bGRnfHX?fCpb11;bU;MY3> zW3_qBC(%OhN7cOQPoXrK8FOkpHaI>uN3W`p9#|^x3=K(w$>`kyEo{AaB&Jz|{?3fI z<9&WVTaV+|3vvRPqwS3Zt9x1=c3=FEh<;k=Vy>gQF9_YBq%ClK z_!OZApd|EP+-zgB{PdpfQQIjeyf4=YyG&J&rpjl=`YNH?0jOgk8~VD*ulYH*yR`NZ zVeX5!Z9Av92}Mf8)e6SVQMw%zNEmjzYppR6c_3Db2mK-m7TN>rbZAu}Os++o*K&0S z)l>yQQGfdlflfhLvY`|`SZ8*IDh*SXG(1mFBir8;a&vB2sHlp~20;BbgqvWHB8kw{ zKowJ`)qgIzmF%332*ql4W{lUs+eG961kXnJp}+}9r=jqv@Kn4pp84zfVhu-qZP?AA zrIav>^BX-DbmGDobAMm3KIz0X5FqS8DZ#x*p^+%_lCHOM{;n}c%Ma#?^U>!LU#a?J{=lQ#D*hKzcn zWoQNc5Y8OWju{z4dRm;eVa82==cK$iQ1=7lWvvTf^7$g279|9EoFL(8q*A`!%Y>xE@-!jhTFF4X_1KziNz#3@_%N; zsXdjdTsrkE;))Scbp<64cRu+PWJ&T5WgG;ju>5$L3MZ}vo+jGAWcskTfbH`^k zNQs5vORFsI@K$^N_Vc~pRS)Z(cZKRv1BxGd0ZM2Yg+QzGi0Pfxf-tq;M8yFqSKG(; zt`!a*h(Z1F58Ig5Uy^dJr+CQd1676c3?pOnRj zlc(~}C3zx2Yg=b?#A>&{kf&Irj_>6BaA|&B0Wz+BoIaA4Jn2X_A87O%>z_Ibo4%BK z@O()3+#9V(tEMMphZSrrK%qx$DI2U4#BtjJHu=C3d@> zt6Qc^#m~4s_bPl_e>S(6;3e-g4HIA9@+r_eu_6^DG@Rdba4nk_QgM{8kSSA%8Sf8KMh_!^IMc7T+1bLeaVKp)W0r!ym#M(pPy?kH1kDl=szj zvtJ?onmdmn1##t~GI3`7vuoCu7g0v?s@1l&TYRjpV4`8-w(utfwOwPHbc^JKlPcbq z-iJ85IMt$}%}Omg3YO_59R?{SamA_fANE6sP`OkoWZ%8>rhecBw9 z2UW(OWg?6QcJx5RUX&t3p!JY&^xV&zJ+bIn37_f+9F26lC?Sj=>V8$=UDa5XIPf*l z(2g(_=2VySCVzIU+Y(gdOvUIntq{b>$Vy z!BmH2(XT~O{Wu1iX7;GFh1P^&Q%>SpBsn3*Z0jl6hYDp6?S!pQ#ao~A21TpeAJBOD zUA!+!*cF*OdvAJMWH=h0yS}~n`6A5{^z1&^dVf~5%Z-^}>2?olT@I-`cG)0Wg+xA; zE~YK~8j6(8;%|f^A3Um|wKM+`X++!)vSF2>T2yvQPL>#n`7CID(&}SC#}VbkDQrE2 zfGVwUzpa^c-ZbK_<@Up8P_L@Ku7B1p)-G1F`r4oKSJYRsE!xj?+v2D^qwcvOI#)3Z-pQ! zs#wgBa2bqPk^X%cUv-%zHlMB3G*{Rqk$SD$N2JqLY%1?#)g7@QZ0h%iWz34yDZAhh#Mb@# zSl?I~($|JyQITM_Eq>D%y-;KF70h<>h|sU5sX8j1N_+OMFF$PQXZ|_}QW~^`WSi4FD9U)DbcS z&9h>+r6rS9Y?|xIr=h-WiGR$Qg1ZU%v7#O2=F1Ir(=;L-IVXwoBU!ZMgg#SsY5mHV z02UF2zDm;ea!gt}FVSbk2HQwj3j0?#$~3;wsEA%{!asSlh54yl|f9RCW z*tX3V2Bn_QYwCtMz9pmeuh#VsxYrY>rOC=6zkh=HP=6_fOHQU*_5_W zPu_X(yhH1Q->YTesVkzq`}kF8gEy{CV+#n#k#<$mp(5MXmjMZxu*@fr@mIu#;_ubB z>W^PUv5$Sr^z*oYqJJ|fFb9IVh0y|iTaTfEJ;}Fj(E1$=t*LSh5Sv|(^IPuG`oz2B zRXef~BZ&nX0s^<(YusMAZAC(y>Z6*qY)F{|#TnLV^SmxL1$@)@uu@W%`FFglqBLU7 zY)^q&_?v-@)TLLs8IS#+I=L*0ueMV^+#=urmg~})$|s)P9DkN;KUfE5CNlc*&W2C~ z3RPlz#_gzlh*F@X=Q|grKxU|Y4+r7as(AO6BnplA&4+C9_PowA8u#TfmpI;0i-V{V z#Gz9<7=sP!46y|MAt}N4@h6|po<03r`o_MLSxt$;V?=kRGr8&JT}rT(d)7BoAi~I> z1TCWRLxNhpV1Lort?jwTngz=RaN44NQsxucGjKojGwnwgEWpV2*rfPx=1iq<+-EBrZLTGKBPb(Saez%!pH|ON=3DMy>{=q|)U7^>m-VK>3lS@+pM}-j@R^@{? zygqaI5G-8u(&2_F)II0#lDE#SI44bVMd&cxPPd~nuKX;)~oP=0=$mL3EH>U z14b{$IgbyX<-fhe1K-H_b=e!`&4^OAPsB(Z)xF`k`Onr%=q>Kc z6Vt!4jFNr*6y5$e=DJ#o*D}6yy zv09d!u*>%d=_y#uo6i~az)%Q=XQ;0zwxhi$v1JEyHlJ2ZHHAxUy8cAISi657RXb3mHTdp!55&9GMd&_bVfA_IM8{TKeShyH zKVv4FX~m7&v+kfr%4UYiE8s{gxpmwM`Gs<7Iion&k~&GUFOSE;I@5=T5mVK6$ZzRR zrq4ro$4>0M3C7jKElQGVfCpq871_{eACWiNx1rlR3K1WeWKu^W-_Js>nXM-uQSAsH z+Vy&6RY#~|99+WEN_d&&FNm1*LVxnQhdXE{$IpY4=P(~w$%+b*uaDvFX1y9V%8@86 z8S*Og?Q(hVC8`4R4sHTbV@NIzPe>7Fj~D$I`xEkr;eULMZC}RBm=I49**FvS{dSlp zA!=N&1bo`93&8`)G34&(v37oC@5&5GvkinTL!Dhkzv zSe=UdI}FiTxDLq9{a^GQ*ss5S?hdqImcbwjf5blN=q6>-Brs(TPDELZj42opwno^Q zzVKn{<~+LX7U-m#XxqiDV}GjuX{aw{nmy5>-Md~J)@*ac(~lKOusjRxMgn^B&J`W-|wJh&eCi*p0+= zPo{;Tayl)Qted){l=4cYoUGNN8q58GJ;;@Xq1AEU6*f7GNx@!L!(upf58a^U!=eW6 z?`hV&i8@uvHYamuGk2iGc*lf%_dGqr&P`dA*EqVCq2#{c(>-5N?kc*XJhdW1HSHhQd=e=)z+bS?)ljHjkXu1D9H9mJ zyU+>uH754*yy~{OKJvL&y6r`x+D3K=Jl>_rgoMh(x`}<0P=Hkv@Szxcx;ajXZ7>nza_ZjLw{Ow(eZ8EbRMT_phuW@gI=T? z>|(>(8S2wNIy7MeC)T>s&Kf`LC3Q_P_v)6eS$<+L8G!Ivo|CVbXWw!(Eg&>{-BD+= z$(tDg!m>DBISD?K-4E*>-cAS2j<*Y*BqQAUX+Q>jm&y`%v*58!@>-O?-moHiFa3%o z&Z31x>VKn>X=S``Ck^8?E@eqhDE=N_puFliy#G+4Pb%(1{8R|;!D_J}hNutwN4#cv z!wIQ~$lP`v3ViCJDGT)T;vdMjuj_>29+LW08kgvm^`3FQ(eq4xyZ1{ngronm}rI)aMKhadBtE70D6KBt%=UNO*S zAN>?d5DALkA|h<~+$fe5l-0Nvg8d2PMOia@3+bR5dQCNic_vI9oZu`%T5?u0SKBOZ z=KyFA_G!u?ogflGC(gAIw65AfQX^P3ZfC z$Rr$N8%Le|eb{mv9k`~{c9nz$Q>K`4!hOJwHu26G(y$<4RvF8dog*Wg_d$4^w&fcu zmfJ8{Dur{w8Dbv1m%9s^Ab-dRW3Q$39JLtSO$z7hez{ro&E}^Z(LL(o-n)-@L4Wvm z1;19hB2(hDvZL#w8g|=QTpWks0)9x95(jN1|Cm-&(*1w@P3`vui7BEa)4U)}D+hA) zuAC`&Qcco}6?urlZ;b&N(_M3ni&mw0ZQY5E zdkfzJC6}81c@fuwo|&Fj6h|&gk3<>57OECiTnl`|sCPPMjG^p}ZVPm;Q3es76eF62 zC6lH{tLZvXcYWY0&q&oHbbqT@mF45}{o_h)K6vLR6K)RpF(YjdT@Y1(of7I+h%U@;P_^_A-bMLBo8u;T@M2^}h>Aiidg zdodhyT{2U7PJeDEoV{%bxb;RK2a>&RV7{Q#K*eVyEVfQSQ;5u>r)&ATkf{*yFm>J?*3CznhDm+84Mpu=6s zx@{kYyRRHE+}x5M1Y&w+L$j%pdv-;bOS}{Ab2Bj(&wm&7Z95FiI!)p9gqWttzs0}7 zOqPO_o;j^KE#a1Pi%zcEPeQ?5G2qU2ux2<6gU#RJgE-?gB?>lfY^l4wJ7Oq!u_0ya zgM)N{nm@nk-j7gXWgm`gIn4wSS*nQw(+d|5i|)S5gfyOzt*<8t6~f#qEvmvLgrM!q z5S(tEKYwKXN37kvb!9h{Qd?LQ+RM!S z8Uxt_X*C$^`isu70tzHFh}L(wN?sC1)8)EXh zhIRojzb{O6Z|N4F2Fb0M!@0LRS?D^zqA*n;AAekyC}_HdI*BOxk^-`+?y_o^MdIDP zq$tRi#ppPskIQuAW-j9Q-a&ND)ZKLqRl$?#Csb6VX#9Ib(tmi~-loYN=O(x?$M)^J3q<7_}sk$RrSr`L(z zW4~+FZ?DQeXi-MQ*+L!XL|)e)O5k~agmoIn!=s{eQO02onr`3zpjOEPio@onaeppv zOH7E?6IwZ-#v*ulhM2vhRytNaJH*aO2|^0eLe15N;-MadI$*e3ox(Z2jQ=u?@bO($ zAZCEP+szQ;Mjb#GV_iwb(VPmUS+kl)Z9Z}**_0Cjs}`AL~NTeHGfE6fH;4e zx;XJ_x5Qsd!e0jH+%pIL@e^pm+8RCzC^xNelwGa|tMw4*V~jz>+;snn)|`4yA2Gt=PPIW=P}DO#<2y&@3Lh$ z=QphqU?8tD(O{ zNbgcTkb=)3J>K%{HHkjHE{RrA)Gk~O^Zpnrzjz-3TrPbBRjS}7vw#0RwRStNpHbC3 z%1#EuA0g}(n(Gl~yI|t(ibh4$+@p6PkK~_pChSY`z(GF(da)P|;#$5}g2~FDD@~Fp! zUPTL70%ubr=2qm-=qg!I)|Zmy3TqCz8eO~rvO(@(nXk5brGL2>ezy?X=qeiZS&+Nc zm(pZ-3-f}cx>Z6|(b^A`iY^+dQ~HEmdh=&l$U#k~ep8={K~Dp%HT)7j?~WRN{s}q8 zy|u%H=gJwef)u2erHO?BVC_N7Gz&=cI41xwjr`T60JhAh2y;^K%m6cG|7b|7WVnA(zsf~#NRl}of5xc(C;|9 z;835!x`?NP#-dWc0Ek;65_s^1=~Z6&aj{@Tzu%Nw`9StnQ*_$pvli=L5g0Z9O-xD` zI5qWmg;dC7k3jMfDqb4CaD@7uxBmwjIUs*2qoCO}2!AQwg*KCDW7gQLxq~+PaJ*$$ z2i&I^6f=yj#n^)YTNPL_H%dd=RZP=`9ga+F@#d@jXTQKFE`1h=>!e8*PIPKbUHS7F z)c}tyE|EcrGl%!cU1tZ`DczceJXf&!{0rBZ1?0wmX`d`fiPgR2Yzt4JCpiF4UXD6A z%%h`bMt=$UFJwKMe$XnfSrekcPdoN8&g{4uC_JSMb1vcdsaZ3Hi58+jGx8obss`nS z8&?8W0t3t-eK_uXp2RtBg!31!GlS)496;XUllI*HuKxxbc$&&$sP%{ykGi(*zE*^G z8zq|%Vh&)YKe6v%yi4&=%G;aV=6^DP9&B=Zy?+x5CP!r{VKf_V?57jSNf{k1s6SL$ z=TykI_r)xX3sh3WT#onW>}>K6SYBD%rni#@r4JT8*sK>ZsWN6H(%O^9U9d{m49LJB zrC}1?x27F`r~OO%>Iin4A<^l33Fu6vrVDhU)?zbzoY=hn!nRc%%Q0#a=9LCQ*ROjd z-G6WU9lJcDo~M%e*sw@LP&0y6KomE--IBXy zOF5b`l@4U>v<2K-I85k-zG&H~54B)jGJn~TtLZ-xZtjqrfdOb<47XSJV~J73B+IEl z*jSpm`@5yQr1SgWgRzhMNlmFsW6DvWrPhvH}tO&wt!X zo}8w{;4=?Z-rBBiE!;8>j)(N_bPc@h4(U#cpU{|c>Y<{qXg(+REIHb(C2A_tT*JN< zS>wf9%?$TKzSpbd;tIfm(H1s`c#X}@GXBiXaf0%}V>@%66Vqkj@7Hq1;u}kM{oW=0 zshJ-vcKG}1{>5!zQzqok7$y8#&@5F zb_VVLF^)e06@7e}UeDBup(RrmQRrl3jPX>5$^|q;SVNRk?{H+}G1|hp#+W7LXL4`EnOM3$21pCUZ{> z5Db_{V1%g6y-sezF>wuQ{uDpgi!{0D_}bBJA5$VN$eL&hLW^b($(+3Ony759al~DC zj~&(hP#*Y+BSd@=s%H1AF6LDjVYuIKirdPDvodA5qF&RkU4I%AXL*Hf|8E*u17`?b zQva5hwJm?0i`X!YcTD<8VF@Ra&)fkDgTg|Bx5dnhI~_(lDm*6y@mNS5zo)Z8V>;v) z7C2YI#kmvj?FX#Ajgs`U`HC`9w_7ii^Hs4zGu*<|j(>qARTcn>8yhcyMJ$)a3Am!I zd`fk-8#1?E%{+IAz43%=&&%hP11*ZX7sF%JER8eMEm}b zk3o#x80Tb7FD?+Am;Vg2sfd-Pj+wczc~0^JazOpb1&wje){5ox@|Zq*%Z1qkkH!Y2yo!{>jLh*$8nO$J|;>$fR)Gl8g5CgowP>FRMyEh!Q5*BZTea3hZ)G z3+5`H`3UBTH6pVU2QcA*CfduEHquu3@XoKNFSnsC96%cP9KyqSvns3klX9A|P^JJ{ zvUJQfK~v&2VDKeDO|~V$KOL9;lr7GPeQmrO0Dr@wWSL3V3pg&3cVDS?;*-wJ9`Dor z$sGPmI)5jul;kKCFNsI>E$8%3m~RUOc54Ig%nhtFHCZ%O6celOK5@p8)yxf*7NF8t zD@iwW!SU!Fj!1?6`kLF{kFu*N4r%ntG@^T=Ta>KiGGEp(pJBg25@-XX8VoZVs~sd` z7Jr;k4te)#ztiLh4Vg$v_3TG?o^SA^c4xekQO9`jPj8Fe5LRDQHHly0$d^ZgK%thO zeDuZV?)x;!i&i@wds>_6;U6wU@C+;26MirFjNe87VFosMt*G366lq(N(2;G`!!9Z; znah)sSko@dxdQ9}Q(a;z${)`*G(tk^7Jtf9?@*(WKdgi$dZacfM$-GPF+cG!mY2DpZO#l%rr@m zD6l#pIunzU6M48oc!6L1F)VEQMR&pS_x(wn#$5HNXMGzN3lYScy?Fz?b?!OQEq|&7 zTsrM|YorO@5j6>^DxN>^3dp1PM|{H8xPDthwFxzHy$>D5o+e0YBGDm0?Ul%~rma;_ zNt9USY-Ra#IteSM$cF594ecyGnA6D{*$JAMaiQ`L%;z{z1w6;Q2Xc9F1 zrHI79Jcx~UYpLt3Mp)u<t&R~c>G|-&SH%eDZp8{drC|@~R@}POk4bJ02`hB0+62FN+L&uc zML2@g?b94zlQW-}SS5O&=&(wfZrDQO4U7C+L-|xSNM9ph9Ahjzu78&_?Fpue5Jr)^ zzoD&@x+tAYL4Ri_5vk=+wm{1j1<>e0VOx^ZCSN^!UM6%@)D<;NzIBrRf_@F3gu~IQ zAaejbga(vI21?55`WzjNQ<-nYq1Srk=+FDGsd}=8*O0V`k>YipH7!kH`DRJ~3WkNW zA!k8#5h^t770L)rU4IhRRfZb(du|GXIru(>sHATE|;uL(EK@1Mnm;SCCL90JoZ&hLZaeM~N* zAqK^S(>N~P`|uPBnWNWFJI9gad~APE!fB*FzlE=St2|uWlYch$Dz*mxv+?+K5wtz|v&w?nf?Sj{ADgWoQ{DcwvbwgJRs{;YKrKj)Knkqw_+`p3@XWoB-5nU%;A~*4 zIxJoq}R35KeULI`S(8p zfK#uEi3%9UL4W={yGD;)ezhJ3@UXV-^gt7^w03#H@s%SQCH*P_vPQOX-ThB;UV#Ox z0dF5{{T`A8F@=0FPlK@vhsJ|Fz(siwd<4URQNcT+foDGcgi%MF}Oh#d?1-OJx~TTNQ@`Y#to& zNA}%u2X`sBVn*NX_6O#-I5|R>jK4M0ogQW+4`pnX{my< zNcBm5Nv5?JjoOPx>=wU;PCV*-@WBm5Y@EcX*aENx$_7>$z#5 zE1dzKCFCM~E;v$m#q>CB=$uufj(2o15pL0=fU3Y3oNKGn-F$pCe_t*$ zT1#7##ou>MSCF+nvMsVs#1ab_Z-qu0!O}3`rS~gSk>V+}bwM#-&EmsrS$H9naI%5WhgZ6 zJF-(-7tewz5)R?smL=eClDzbT&(ahTVgv0JIj3M!F4orTdZa`9P9f_;d3}=EM9~!O zf}U;T%MCA_W~`Hd4s2OtrEE-M9ukZa=5Q; z-u*Zj195G)v!JPY;_wmzpe(HJMAmbRP zdyH7os``Gl-q>!;(oiO62|c4X?F{rzSfhQ-1A(v&yJOk0uhem&| zS%I;QjBGx)h^2D5nEWWM2qp;pf65u{qKt5SSgw0KRTCYx{!S<1+L1v15PIPw&Sg9) zlRbWyCp-5sz1nO2?ZB~a+?{DyHK81h32?d}Oq=<>#Il)J=qZU(I^|v&Fj;JcKqBxm z1-=FlMt77?GN5r3z&E!(*euplf6ISb^AurjybwNyRgdA*IgJfYU#nAe9GS^w;{H`0 zv>e}w%AX>i<>Uh;c{>Y$JKDL&9_`zF!T?k>+Sg#Tl4QLNI!f5UJ~wuSV>u0dnRrM* zhZ|W_176_0-4B|2wN;WE6}?gHAccr>c6i!!{vg$EJ9xE`=ff{GPyD1s%|ne{{n8Bd8A1G z$L9$HDsz~!3z_H{=zDOeLU7wrqFyhkTYN@fI8g6MHIWL~6AkU$2>4f>NqFsM9ZYVP zj{ai6>@~f>nOieL<8#!Ls)c_c?=T2P0s!?%v244)2?|_;RagMgnBr}q0fFdpn+)}W zKPJ%@c!{ruh2?x7TowWhAPg@Car(_jtdVu&&K;|8-_yFvVe~Zj_5mjYqJ z4RT0#7565tHhN?L>2ZL3`}|zy^o}HZIBBuujxDLeo7D|TvYBCcBn*G#WG2E7-Sd=+ z`!7xyG0AZ16gd43+VmPc+X(8-7&6QE2FD!2+7-IC(d(smx-P^O?klv|DschH&k!KP zw~8u)nZYO_`>~FhqbxC+0w;+6d=_G#?^z(@6(5``ou32{b*;*W>O@TJG+M)^3KKed zAcW44IQvc$nR9^DfSVX* zC^ao(2Oxz(00Z3VLQ77dELqMDlIJA z6>tLsRL!~ji7VJGqLUVJ9~sELSx1FEWN%+me`Cs z+CgvSt$TkhpU4)Fh(pjfg_5{=8!8HQV|^O3sqCG9kAye}v9yEmV=gP7GqIEuU zdr%XvkE4elCZqz^q7Cxa;2g^psGH`Zj1{K8KIt9L6g zKQFuy(mgUbZSOq#-XS;JMk5t42}UOq7O0uSZ2^DHa#%y2*i97qjcw?Q4CM+*VD4+r z#}dIoj0_w-KpnboU${lt@`W~$aCTqc9p0D|6fR|{gbmKwi zwWvn6i2QiEvjb99r^D6{ynwFaq=R#UuD-0xz4z87O>vSQb0hrW>TD>n|hd4+%3!$(V#x5+fG2tp9OrdKsJNb0j#tk|XL zX@H?K*7!odtO5w5m*Q;D2zZhIJxwR=~d=xY_EUa}7jL$ia88AEsGn%eDxbz=ft;#BuYtbRYN0Gvt&Uhpj zflEV%{jr@NVHAf&q44*7)jxog6%v1Barsd! z8f6ekzXFV}x{=hu#XoGfb0+ejF@UIUx5)q0PE_#IKH{3J@ad(3?@8avb1}S8^)|vI zK;7GdCNL_;y20OE1t{q!6G>3D9(sH(#WIUC>%ZLr`K8?=b(erM#k%&7aUFk{0@4&= z!na(1Q6$4hKh)43DMA=Bbzaryjck)JxFbtnDeyIRynEJ~)77eF-j@?@aG^E|Y#W+a zUL5@T7=QiEj-YD^n2r#$+*xoiuZPa!txL}`6;!gf=bvL_|Gz{E@r8Q_rm!3W{N3-s zfq?*_Li{K~fED!vCfI8J7Lb3kvQCuk(1JgA>J&6!egvv*33KLISz=U#mr2vzW`Mzo z54^1M0G^aB@;sZ`e6PY4hy=RK-S56E5^TFIx7oZ?}rq2qh<`t|T_GZfs0FW~C_V}; zekWw^lHdEH-{zLmboT7aGJ?-OMu?L!JqKlxA!W9K_)}@jZax!P9{x@ny^WB=%lEJ? z(HmWWWeaIYIh*%~%CQY@CWA;|4 zo}cg;sny(~{HxHnKvW02UIwc4KVr|LYQewAIz=%{`*3N;eBd?M+|4rngaL^uAQzeVq#V1 zi0v&$LAnn`{lLxxkc1a6uubO>hiI}Kme^rtiM1Sq@HCU7vHtBds?LJdc z)@aPdjL^D|*`tWD;pV|=u}0)y?-6kO&4EfO(88X%=v42=+lyZo9-4?PwX&Sr`Zp}b zjsJhClYCK7c~<=AiVV+r+Ym9^Epg)MUm@O0hG&&kW8-kKJ|cz$1e!_xi$UsSPjP79 z+_pjSwn_(`ZNKn>TO20R6}OZ535{tf0O;uASK8)812vp?V$9ZRMwBjj?>a85oX&`d zAd%LJFGzocua6zMq+`xsM8t#TXp_Pl8EAjC$~EjPe>KmM$EH$-L?u_K%6(^=->OO1~e zWNY$1o!R`+WL4uQt})1}cB4WW`Yv ztLzRkG&Y(Q2H#|aMw6CGu>dovagrYXaicJF;%oaN%O5d3Bn0OBuO0!h{zT3W8zIOy z3Sc^zY3CSM@boB4b2_~9Kw$y@c}~Z4oV^8As8Vw}W=`e@$#+r)!vzQXP;G%hZ|J#0#8R~8(feL>DVxA@~%1~G7wm*m{}>+?5*mMJGnn4<0Q?bhLr z`G+wj`ca>|4FG=f-Y%(Y5sP$k_h7780BTj2!i0O%{2x9BQUWYBpo;=dnFpiupzhuSdBuW01y~rhLxG#ZtE<*@H2L;Y79h zRoqH_Wc-2-(5qeYsnQn?=6Zez&AtBW9vh5Ey|XQw8q^Fl!{Zl2+otFX~g8T<&u%C^}g(JqC+ErjePJ!Kdviq zznAzvR0k3*P$;|xY{u}>Gt8aOniW^Hp82wDu!w5v7Ko_~kmon;= z1nSYA=-kvyGE#qO*2BeL^Bjuff5L!m42t97>rhp{n*{smyRS;M$%oQ&>g7Z;s6(av zwE?09L(`R@%Zi_qZ4J2DDdOyvp{wY z4wFn6%M4+CRbyYzS8TiYSlExbG%nq`!*NN?idpO>|511Ks%+&HtWxROS14 zN7OEHhm?N;bb)E)!qV}Sbw%YD1h2XT)F6tsz271p23X%aV?8!uy;Kw(vF8DpAf|k; zcngHFveEspeyEz~80K{uM>CQq{cb4dtgrjeNb`}T(BwJw_XMT>218Y}6N^?2)}03B zcZn)sXq=1St87+OY!sx)J`9P_D0}29%PA)y115iYiECbYU@J1Go0n6oDfZ-=L^TL{ zLwIc6e$2oOczMuIjN8QamwiDX(>!>QVfdH4s3pd$hL`~DUmT`oUd0 zqFYlV0sTh0GQw7xsiLy&Sqr~Rz40A?8w!CrvNH6g!2`veXD`SF_!|zbmr+^ums-2= z3Ri!e_t!ra=FXc`xb>@At_aH!3R+i0Mo=2wr@B-r_Uat%u97al4`(3rP3E0EQ`%L` z5o`pWR1x*1H)s6!-8D)?9%|Qj!r7r7PED)!laW=w~yFNMa^SA_EGsKddPONH*xUYgEQa(9Le~;m) z(|>Crj*h7g^Xtc7!(6sgT*#KGa}eP zd+@iMxMov%ZT52w7}}qGsKO?A+kbzFUZq1-IH;*WIWOv~iDB$78WY=gb$y!Fxq9tx zD!{A2259F#aXZIThJNq+22#rPWr1Bs4LphUr9f$|fu;EaYN=M1wb*;T&4;Q>4iKmz zk&XocsMVL+tT>p&7IL@|Pz%+p4kgkoof!H9NvZ*Uj|v2y0msYQKFm%&%$0wlEad7o z`K||KPi4^9sM=79!Hp?82{JW#_01G3-Pl>`?HkAbOn675O6m6tGmf?=co`!5KOP4S zsZ5WczP)xNMg$rjqD_Xny(cut;*Ohmn&)eU$*?J%KQz8ply%Yg=hMDpcbw06simQ*i;Dnd)?UwW%ODXt8^txx ze!fD&qII=bo?q-KT>cVRmPl4732=A`zAajVV7mv@4euf0+;pb&`D%Y8&pqejs1IF? zKuNErJd{n0_}^*uiDR7P8Fm67ya6; z>F~;H`A20^n4z)eDDJsp=?esTrx~JqavB_fG8>@asRfIC3NSvtEbgS*J4Fa(zg(1s4JX*;zI~OoI!1O7)$r6V4$|g>7mn zxT9pv#j)zY&?e~WJA4=_BZ3Bp#?mk}Ypsf&%)kZ{CXrj@xlP4fJ~RooP%OpEh;PF{ zqF~G}PpNdTIX{0nB#w*AUJ>`zg{EJCihXKXwM992ma;l`ffeS&eV6GSFoAq=;#qoU zMET}j@+Pk~IR^}q&fR4zpxrOf5~DmE6XQzjU8o%uGmKM;D31RGckvI+@O#D{nMD#+;)u+Q z;1!JDXEoRZt>qf=92l*6aGi5TW7T^CaW(4UNOmL^r6W_J13%TPAPyR4%oDy606?x8 zrH~8gobB)OIHnpbf0pB`t_A z`bb~Z+!JqQT!c(Y=SY=sS2$WEn4>-TfZ_te6fGL=#<8B&wk3^~NFhhWXeULC=;uR_ zy4YJxGNAH(qGu$(>05|`YU-*x8?js6(|BQ^0S-RdDfP zSgd~uh?NSVv9n9td~HJcuFg%$erP8P?ga0$HNhHfDeusGztJ?Z2?}lKU~Vw;xHrLY z`00t`8=aOx;Pxr~SE)%d&kLHp^`VCYOZv%u&_L<`r(>?GMnfZAC7I{;^_d&)gjI-5qz)ro_YITQJinopF9_qA+9(H$Aj8C z?p_F)C%H20;EZMpR_75l@w3H9jJSWK_6zn8zRkmF-x>)l`j7N|l6fj28k$Ma6iiQ> z(~5CIM8)4r%Xb#O=`*;opYMQPT?|}O`d~@9awRrk?1%jQn`USEptpG0IgQ2lD9W|mF)D6GI2L*#)B1(AB>JY@xTu;tr*YdU;OSk=sJE#E z(QBzJ0Ol`J^G1a5GDArky8E_*Oa;CrRbwb%Dhvn)mM#Zth#B9z4+%tX1=|NhRHIfr zHVBvX3)Gz#I0mZ(?bBD_fEJ<>w9Hsr8XCGGM)3awF|B~xlOatL128c-m!Xyd6t^72 z1!W79!9WwYl+OjL3IZ}RmqFSE77#NEFHB`_XLM*XATl>LH#e7{C;}A(IWRIfm+>?M zD1W+TRGiDYHHt$ZxO?O7?(Xg$v~g(M-Q9w_yIXK~f)m``odgmBA6fgHz1H6M{Jn$G zH1p9}v!1FK7)?Q1~LIkg6v%wSQwdk0rCn8AbXI!3kx%YD9F|fz{<$X%nnaM zA?5@$cCiB4iyONDc>&Daj4aHItjx?j@P8BlDWE;j>D_DwF!2N^09}mLJsp570BYmE zfHKJ0g~7zw`P~h)x3IDY(!8gLfgC)YtSl^D0Pi)}7#RLk`jain2#_^4wE?+1+gJgN z?actPj0%hZMUeZu(F#BfvIm#|Esbr>0U&dLI#3&+p(dfK29Q!!(oj~TVSF#F=6~wo z0CM^tE@Eox8dCHCaS=sz2>?)&9w4QmrvB%CYMfEC4s4le5*Iw*SSA@|_vrZ))$U=1w5HzZw9jEnQq3c$t{o-Q5{2T%BDQ zK~5Ho4z_>sQ@6Bo2DpQqYyj`?PJcjK;9tVH+M5BL04|ome--$%8vuDLQ=q*w@K2H? z=wD8|cPZbK-t8{`CiX6b%b%LI{|W~<1A+h1#?sjNuUvU$WqE*|v6a0G(B9bI^gYnU z*u~WuVDy*m{RK3m`WHbUK+M(2=}!-Z|8+V2yUqVn7X`hqOyAbq*Vz5PcYn;--qqRb zAKLuqvQ0tu&Q{JY&i|?i1ejad0{^gg{(mX!Lx7y%&bgZ-pBm? zsKEbKUB=!V1mO9X`JKuCy8dSXsQ)^kH1DU=3}kQX2`~ei!!s#@Tz}rjf%^ZSQ}$oI zBwcN76^-qH)c>XEe}@^{S=oC2SKxoeXaWC_rT#y%t(+yTJb-4(RxYNNe~I`nvy6-J z``nAzTi62Mx8yIA#-F2P`#!Vp_m0({3k$%&!pZhuzV~r7wXp{}I|H~`|8fD}Mffki z@5=vS3t$r0)s|6|rGNYHf%z*+!rl~QW@T>yVCCQh7&|!`d%`onPXQ|j2f&-ZaBy|;1(<`J;QwqTCkKE@L40yxXk)0pEqO{s(;L zZSxQKPTck%@SVBc-;m{<`QMc}-c#-02jCz6_oaaTCi9*Q`VaT}VjTW%rv!v3Ud0V z2=5BJ{R6&>;ML~ z_sQX6WB)UsJih;tYWlAS;9pnn`_=Hj_|MY^00epfP2pFUK&E^l)@iL_6@C&$vz5>k zJd79BSbu`rvWZZunX_H^IO6$xq(GtKz_x%a%3_ebG_QeQN}zqIHbn@g?dw*1a?Q+x znTqhfv7dq;K9YpUWS%CYMo^Z*NpllmUa3K z^)8iEzp`Va0NTA|k>v}9lP#LZ3JP8~{>p4OxPQyrGe&%j@qoxG?SfHZ7}lgLj6;7f ziY{GRp}J1yN}|q>;);GZuy-(Mn*y5kgsD|0!tY!&y~d(0mCUzk_Z~%I=FqX_rOZ z1AiD6avLYKx@C0xnNDarMm?}W+>)O%X0=7@uwJVU1Ief#zdNKiaJCS=3cQ}Y)F#3J z+F5fEQ zPk7|m%s&j$adC+BHjP;n<~D4_G2KJLTSRd~j&f*hAY<0{$NX?PRV~%7+2Sd1FMp$6 zs_?4|@{kS$dC6C*%MWDi*+Y`Sx!$5kUjlILgeB9j3=jj z-&dN#5bgN7+@!QTACH(YsSqT})0#Y36Eq*6X1vqj@fdWV#eBjsR3RX=VLlg-LI$Vm z4AzKVW~y!;+IeQD9a;#O2?OsD9e-6zBU_>oJImn7Ch-o|v)MF{R@H)R$l(;%s}kdg z$!ccS6@SUVjXMAFmZm4-@OBY+(lpR#d2$?Y!tc)g{W$ku46V41)?Cseq z2Oh_oAN9n0BfMWL;d$E-{Wq`|fUf3zZGwaxjSVCqn7*$sqCd7#?9N+$gw>uxb zf`#m%?JpLc0ngX?ELx|}Tu{3b_`~HqiWw7w+3hwN%E!u#VmRVi0`aas_;i}50zx5X z4h7i987k_j{i2H@+I=1Fs((0C^d`HS7d=Re<3Gz`3hSR`IU=iM1hAZ0Zt$Dg3Nm+F zGNSSxamjv8lo2gdTxuuhdqiCiQM%UJTOHSOnGFMR3H%tJPT zMn3z`KgR9riOJs}bpYqH)SBYZDz~2QcZv@DiwtH0`VT*te-B=6)PE|5AIPDBZBTl& zUl9`E=}d}|L1cnFFO#1XMvs~u;A3dvq$?`iyvsHzV7KC!Kg!3WeR3lXTU0kwLsM{J zyK0tqQe4UoOPjS;mD~nzY@qS9-X1;GK42GS@aA}7?N|KHLQ(TQ_{QgDui0Vet21i6 zaFC9CEYt8g1KbR1aDPw*9Vpp$iUdjPuwaenOtrTa3v3-n1&iT*;ot6bM1Ig_cV$43 zGeMem#}}o$G(~ASA9=dP*JNs}Y}vZX8V@Jv&CqV&e9wCf&{IoDn?L+y>!mt4iUQgL z#(eGD`S24cNkkk8iG|vU1SRU^EnrwrqpiF%UkG z``rAO#Q;V43r1vs%FypU*c%+H-&BEmBb6MLg%Z-&A$+2(8N*~=xNVF`R1S1cY%uwQ zduqtb9T1vy7oYJ%#Cd^Q=VG36Jp7++W%=u*C zk)@$Bc0D>>3Tt>^4NFlGTNj4v#g@Y=qoUh@`0J*NPk+sak4WpY;-E_T6ZV8AgXv5G zQ@G_M@8*QEpf$z!yHH$5tPcj_R(sq9p!6c5xx@=vpEfemM)` z&d8^Zg>tGzrk~&`T`s#c-8=MsC_v8}r6_-yUqu733^F)0^utT$X~;agH<)wKv2*G; z=f^1?`F~E56s_Jxs2@KCbzSg?&V|`a7*%37J+30-t-A1+EjiU-_Wf{Iup|c zI(GEGjv(BZ?N=z1LlI+z)q%Ds4`vezC`h6Ta$5jkE%`HmiD2jj62g+zO zCEc=--$(uQ$R<5&!0ZvEQ4MK$10TZ(kN=46uYWWPdKxv72yZdOW|q~wjgnv3OGuRy^Ixyvq-{K8diAKjPE%93KEU0SHwmFWJR zInv{4!$ITr?v~m233v^&Wymt#wyEk+Mn$nMd1hll&kxmu)qli4`{j|_DL;8=h-(4E z;eUqvq>|yeMt#RH9o3B0jGF1|$JtbDGJnG_=Dyp5Rw-4*+>n&yk%a64bDML{ZC77c zgt!?cNHE>d1v=OChqUPjNm5TQC<&K0O$1d(b8D?8D>kSR_<4S|-ooA@hsCRhoRLJv z_HTtU+RWym9|a;o^6sriGL{)WDVkf#DAe>f~qpW^0GpRo*_z&#<}`X z_hE6Dop(qRYF!R~q;MgxJKN|7k0{1k<#j92eCN(Vp4E@zm-~drzQUYMTdhotuQm&v zy2`~%*?CNo06@>v^ynhdd*qdh=x9KwSB-Y-@PKf6NL_Q1lUPvUCFyC8+G!@@(|>`8 z^A=h#%blaa2LT5s3r}G%Wf+{Ay3o3bL32OG<<#<}uI$rzI>*&83ZN48ON)s>0S6(( z{N9OTI8Yd-$vy++3nb0tKsA*b%bPTGBshad;Mj3sXj;?h_jx6H@ezF! zmPe}|C5j~8>-A4Y%55g_4xQ*EV}I2eFA7H)^<(lJB~Q@Ffy5hi?YK(7@;2u(wwx;q z_(iv@TsI-B$49}Dn)8@yKBybd0}Zb;;%uB53gls2y_Y;+_`ETVL=OBRpY* zjk!-XJzLzas{Gq;$h?;BeGVj`sUl=8vL8+jZVI{d*-KsVVFq0BD8&P3@W@QgB5@x3 zH87w}--d4dL(N1PvG8=dT|L{2_KT$v5PT1x1-wNJr~9P1Swls~zqFeM zQbJ0&+I#X^4vUF*z>VLeR%L%zwEHP1(R#qhVgk6{$&gTGl~4xz&3~K61)1G1S+m(a z-T*V^D#a3R235WnbS&0Zq%Ks-%-oaVZ{Jei(-eVzBDniYkkxp<^fH4QcX28lz(fm6bcTDvS3IPE|Ouguzd>S+$wZo$JAxkiw`Gf-`(kaB`At$ zAL#8RnDUv958vX~;IVJ%4Wo3{+H9>NoT25{&!442VxJkrk%q;3Lo^I2pPf zLG~qP+f^QKIPB{bJVrMUx9=K}W$}w0&x2=s4IXzs(s9(W8x`fR<4rj7MKm}RgSvlW(X8Z_ z!^Om;Itmt%R|ww5j^qGrZb=t><|!f~`S4kFc80aZtfWk?6oGtJpA@7Cm{jGpB;3=! zm-MM~f^es^FFpbS1KYg`bGCs}mLGPVXeVj@WZ&GcvVY}N{xd2uf>aZfAE?Jtjr5V!$4@^%GJnTp#%X}2mz{WL>_IsewX5jn{b3(iprh4;^%7xx`()2mCt_XJILvx3s=?dH(wW1*0&T*v7!bW{^78(6&q ze}7HD=zdAM&?A*9KDqOz^(`o6&ewOZW?hueqOQoDPVO^gL$i4AY~fy6u*yV0m0}W9 zprd`R8hFJ}a4~_TtYL2aXxXJeMwc6f+d@Rx`R|Z2#Lo*#BEd~5HtSn-q9P;czmeJX z_|pzV9b}G(2en*VS`J(+2Ivbb3jxT~9 zRFZB_EU>M6M&?Xika$R?vxYsx%6}bjc;$y9P)zh=Yd#)gcN@*=hd$uLf$Pgcx0kBz z_sS$Q+%l2x54CvX*q?7Ggt^YfoW5nmPXt_$f}+LAla9-C7;XTHKwl*Bmy#bD_En8T z#F`xZryKV~6StjJob&a}I8l_Vvmjjud3v5tx-R?~e)vhltfPWKu%e-fk z@B7h|ZB*YeG)FR9Wp^OlZD(bD+<&t7#$A!@Fo(=zeUd^hwPFeF!JIzcq!-?<@#*+EoipO)nMm(g2gpQl|TV7ooJ9AP=#(yM!675B|*;m+- z`R{1+Nhs2iV{-hDa+R&LeRH09I9;LbkHfQ-M2=9DYO+18VgVq+)1 zWX2bo_iObvKa@@p5PuQY9@`#sc6bpIARAz^Ny!r?x%v{-R%(2C0G1#$A2x)mO%mDT z{D$iV+aYX~aTBQ{21Om@caJzv50WIhTIZ%eguAI<%qa~q!;I!Gj+>6=)A|eSvT;8$ z(SK&fc^&`ucAymFNg&mnFt)$a684RO*1c)K)REa>1}i+x%72VZS*BZ%{}|#R+kPi* z+C}5?%oq{5HB)p%j+q3Vz{GnQQ9l+(KY}D8Ksgc?hqcX95g? zMgZ;5)AvIQ)QwZyr#J;sW+J@}Bs4WiEdt)L8@2q*R!cDcQ*8D6o2AVy22&&>I_@xQ z(95dtMKuY2*nj*fj`#pA{}!BPcbM>edqapKWLfT)OD!G7$>#t|JbYn5n{_V6kvnLv zN?iRjHbGIbSTvtqWB z{87Z$m@GfdVw-SGdXRuTXTe#EpFnado*Jby?spYE&VTD%EZ3@od;5Ht-6Mq9P>C=n2+8J^5&KQvK^e3yo~soboYwy zkoml&Mt|wHu#BcH+c0dhcLH8m0EoBk~>Njhod(Fnd z`8Z{8mkPL$f<$CX!(wm@%k2i!(H3RT;2eNFNlUKVLy<^zEA{=z@1>nAq^E{gK1I`1 zay)Pv&DbTZ!RQk8ubyH2xyo~JN=0pFMl0w(4BED2x&6?kbL)bDiV59pT?~i zb2GkIK;_(bhlDH+DgUM)7R)jDED*~c;ruvr;PN6X`RhObUTRI$WnV*d*cRp4E1T}5 zOm57Uk)g=T1p;(ZY3wvZu<> zq<<&Xv(VyBG_~&DW5Yf3omn{v3!fW<4RZPXR#;(k6cVhVz50`-K6@W1c&X8w#>t~^ zl*OX^RY^wEew*uxJ96HFz{?TBJt61^PJ1iXj<>-J#rF@48}z2#%Hw8b&Nr8P{I?i% zyTFCa^7sT*bbVe%XRn+ge$w!uE^G}s8h=>!az!$c?LEtQNhzuxg6+IVvTPH!c)zxw z!ToUgO~q9bNq%@V?%eT04UOwhb_~c@U}xzQFD{ATIa=+a^M5=+I54WATly zKo%1JJ~2r=4P81J%1Y$|{y-6ICHpIcKfOHn}$u18M=~N&@c*wVIE$+ z_@L#_L}P@ln{cQ`Cf1l~Euwqm{cy1~>?|@srEexTa|1Y#6$%vVYM|3YD1Rq)7dY0U z3=*0S-%aLrYumuR^HWx0Jda^o6r$HK4-Bn@G({EBkmuYJ*%Co->MJ(l4`AAh%MfUN=~yFc{J)-mM-MdA63acU#ecFMW2wFs6Kv`kl!h!vZN1K9;tm~AJTSBS*lQU_`X$P z#SJ2z$t>8Os+=n8CCZu2O84E$G&}9ALcipX+uY@?bNSNkak%g4M}Lo`g6qPptK{g2 z{qJY&u4}yxnBH9?k)X?rKF9Am^-q5Z8bBQbTI(Y%yn)Jc3P(Hrxgwo zLvhz-TU7mTfm`G-(5{_4oRB;n}@JL~|@sRQs-HDnkh0 zr2MMjmG)miUiau=Hp=P1z@WQ3-?#+4Oa=pZ6a#2u6-1M#z<&nv{7n%<76u>(dd<=0 z>7h{vmKJNu51)H=E%xn&&zM@g=@I#=w8V)~EW_@5)SP)0LhY33sc!CK8T$_5S!#a5 zzu7n?RrHAVv5dZ$;9kiyMG`UQqct(#+HY?OdG^ae+>oDN=@WSt!;NLjCX@xWE4z^GPN0X*{e-@X&27=TZ8Kx?H@xzoYafP&Rpj zzl#LJw!WmfiZ7sZt>sD-!44g?kxX!cJ2Kx5K@0a8uAkZpvY3w=Wui$JPv9O2Iwr{sLwi2JA4Iv21yyTI8gKiw90b z5kfJYrs_|4NtoMQPpY;yy>|`kK48X%AkWkdF$`h|u)H1Cad$jsn%zp-A3v>3kG*C- zxwyD&I)BJ=eSj3MT*$`gh`a71wr=?4W!md08qAaPG0$fY21gTftXDV0i5Jl(BR%Le zcOAKAxdoH8RU-ipGT@2>a$`#Am2$qM?uNW(J1YZ?OZ|r{1?*OcMIs2rx~3;2@&>xzUjQldh<(hwl&1>6WU#CY_fkn?31fYk%J3!JMCO6Yc9p&iR3vsZ=|@$2Bo) z9wir=mZs-g(6ZnO@b*OB3Q6J9LC`yf)kn?0U{HUE@jk?kaLQDK==IJ`LzR6bO|JB_ zN>rVQvcZkFKfxRT(|M>(cC$I}K&?qxy=8=yI79(*oIqm!1f9-aCtBmZc4~Gi-h@g+)7V1xTYVJneroqE@iRE6 znZn*}2&1dFQ9A)Hr`7<_z=ED>$KULgCi*+OGYbDt)>a=ZT!YhZnaJYav8~xBzwMb`^3g2ohTvv#Ywij^x|DmmZI`?X&ron%}}V-4;oz{lKfDAJKHoj{g5&i~OZo*aK< zjR61kb^@NF3S|dLK{xgzYsPOb2O${K7QME5DcIfsE+k-OSXiYkW|$p@M(y3K{}hJ-kP`#7FVIPnX!d&x8|@6p8f@= zFIJ*H$%1FqXwg_sWi@S08+A$&b9f2y4gI09_hw)**15>4xCs6_C{vZu;Q(@@CBx~h zORH1rrn0W&fL-YG7d>i5F^qqXL|$Q>-|qd6VuM8q;rTvuLQ1TV@nbBqy5&A>t?*Vd zU=QPJX|d*3jt(y;sk~m^U6aUTE~jum!KcF3Gf_AxG3#YI?t`V=z^2f$QJ7D`lo$F5 zzj+t>d|N&{*n$sc-cn=r3%e^CLum`LnF(T4C&1%;6z_rj}61U*RUK-v9@b7sOCY{aio07Q)?Kjq92pYkp1}FN)hTky5NjYi>V=g9?A#3#D z*`n*Cl1-A>xtg3%0%vAK=rXVzRTuR7jvSA)E>~QvmW5P0n%=`uU;yB#A$ZmgGtHToVelHLJlN znc2`^Wi}|#Ihun7(;xKQR^$CqbuF}F5~i7puv#~AGNaKhJH~%(AnS2{_=ena6u{Yp zilBY_cn+5g9!@|xy7^+D-*dJn6OK2!XP&i21C<7G*4a!>B(4FVz;4tMQ=~Y8R!bm>Jr2E(kH#DC=wmb zzI+Po(<`aE>Z=F5;{QFfr|3^k!g^3;E@8A8Ld9DQ*w_wqmpF?wQP z%8c4-{(upgIH(p%CqEwy9@m22Df{&0H19?u-b{%WFSe!j4PINx<}0#k_MTj>)cUq~ zhRZ{5PLcNc6br@cW%hiY1>KYa?)POdorMoy7~rKZ$nj`&@q4TqaxS_*%=1iYQsESP zkqPhN9pQg+4e8zvz2sB*7EXyse+^8L@(E*F$IJfR2!)weUgFLyY5Mq6F8hJGD`IA` z9kH7yefQ_H9`~T{&7}6Y(|*zB1tgEOb9QjgT2t6~gV1;eF!7=Xh$Oq|%<41bz5TuK zMTb3H3=6k(MsS(pyvc_O8v)9O>M{35lnZwmHzSS3_2c^MrCO>K zxY^@1sLT1(7|6FgJH7kcR!!ZnYqEv6%8(g$sn!R(&ykeHLcHh^+nP_?^S)jsXDiG> z1FC;;UUfHSrT~1fC$@thL1-j7uJbqM(xTBexQgu)7@deT6fhVB%ZWh?jU3II5UbAAqA3w%Z-<`GATR3CUl%zZ@Z;60d$JP zAg>aLtLX_!-&q9x`xLi~CnuPETCS_33bB750s(bS5-T^Zmo8~P6-J$qQ7+=cnzAY? z_eE%o9a^Qo>gV=R$K8>E4;`LvkhAB}7)yl=vgP#3D=4H;?8ZY&jEj8B{wcl{IIc;} zGDWsEganMlP$|$*>R5-9Zn^V2#k!HqHM;G>hqhiA| zC`}q|NIrPD5MBWHDzQ{dl^B`tBSe2{xW<#cLA1^Yr&L1a+n|Bg zZ-!?I7YAn%zl$v3%ZQeJ-xfL=xww{Uxn!Mw;R~me#h>NGW`Lnr_lemJd;QvYbvt@(jwIo2QL;b?fo4qp9eyn>)}<)B`Kx~}W&*l6 zfd}{8R#VVbZabMYJT<6%c3x(xqX}K&!ElMIU{-VE^W`WcZcaC=|T5)d4j z4+|A^UL2&8pDhn{`iw9Y_sOUWgmHCFp3-Bt?c)eD0uuaQo|j{P6!L$hIp1e+xL&h% z%xx$v9sxC~PUMOmlU)7`vEXb$nYEUN*C(WvJ1T@pwZN7`rhP_g z~QVxhU z3}tR-4ubY4&KFQ7ySJwW6Ai&TpPui{a&$)P^zZvv+@JX@+}8uxh8}#aKcE zLccPfA3N_9esYSw9&{&#`iEcrPciZ1x!px^YB`@J9$MmU;sm)qqOPKp=!-^OX~;k> zbQM)3OG7a?1^UZ}S1?L7A>1N@(_~8!9If-mLH_V ze6zDmyT=Uld0Ia9xUu;8lPG@Y$~rFasHpR~UsWDUi4IM=0E15u<_k(I5 z&j`i$cN_;DcxZz7=8t6)JI*Y8tE2XH!GupWZ(0LCp$L09h*xi1#$)U-(@p9tf`GYU z1fRvdpCNyKD-e~PGqpqlO@$R8#|WfR+q@myxWh&Hqq`L z)oux)i5&?>X4wmcS*>&nhoe3$62?n=+_pXN`5|$@bjKs_O{IUcAM1g@TS;Le;xhG>2k8WOfJGz*t#&?8H%pVhn&m zH)Vh0b{VpnY~#LBsmO{Ydl5w%L+9@a6&lQvlkg%3gy+Y-@}pbXUS!qe?5=tMp9WT2 z^ikzjsJu5B!@^73AQpup1PMIlas*H7qV(tB+5JX&it>7I%;`QielXS81S2P; zH46Npsiso@#m(W^O(rG6%WN=LTJ*5%ucc{<7>VqfgydfVwIONWoKDX znL%erlBcv{q&zr~`ZJrqWTmrLL}0}@{f7p*#ucxklxur}DC<-QwS)7t<^bwX+#`&y zPpKde6wX>nbSy3Ouj7d7KR+S)jBS6Eiq0GsSH#Lz7O2f)JU*Ti@psk0oJ_*&XuEo3 z&7{Fb)01(-vnM_INoK~%BINk!P|nrc9v%lGTHT2TNK6^!l1+1YqMM{3e-Ztt6oB2S z^ux0ivlxiesM$EgN3|D6u@9}tDJ_1}3)!PAY7}|l;D{ll;wT@i50#y=#1MZFc~I*e zD|ydH1j`#Pz;^EsQB++T{;TPM)*Y&IDItij9z6WA_E}d|BJBfZJgqu}hSSUHcLiEn zXaOVf&yWoR3OZPOrH`T76I6;h!j2vXM|dSdXUP)3h;|`q(-*TM4HBw7CxV4Gj@_!G z9v3RMB1V@8z}rN*2(|4X7c+m+X*5b*Mi8}Jj{T746-^$?4JPI5QhI`BD$N3SNG8=T zSmA4IFJ{eN9^0b;5E#F~G48j zO*HW9GmLN?#p3g=kz zs{K5;m|nI}%zy}U?@8ujVrs>{dCSZ&9slV>UAkm&M#s)KfWjl8v~_i=!!m}Dm|3KO z7scRdh#2Eky_H8V{8bysRVaHCa;&Zp<%TIET0K3>>mIri$szl52lX{TxU`RJ2M)2_ z$f2{aBgEBVlQMrB?u^ISEF1E}43QdjXmLsgd``9rO94d&y`?4V8ZMZZ3LQBsg{?5L zmDhOY%;y>l3TKg=J?^^u5e1sIZvucaLJ_>6*FEk@+zoYDNM3E(J-RP^QorXoTp}?; zL5GOqbmvj-&ooi4d}2mVTYeod@)W^oQ($&wCQ^v%`bU3l8?rHem|TfS#x6H!75RA~ z!ojgKDcM=sqn_d2X_*<0zzn~BhCuu1jd`K!T8gcu)4?tm{HfJiSKf@LIc)Wu1g{l1}1EGXTCpLK0WpT8q`76xOGp z@EsMmq3(ZNVcoZV-V(N-l>M~AnYYk>_IE57Ui~SEB5e&@tb#Swa7a?W786Zu%N+Mw zvkxb#Di_M!++;HB8m&RvVa1#jBc(|0MZN|Pf;+FATZUA1n&2`0s1Nk(9NXodN{I{V z>O%}iZ%@@>!J8(RPL7m!oTCW_l%aRO*-#acDUE;lA>CFMy3Q_=w7=mXLsg*=$4Y%3 z0x0;3qFazExcXc?s?mscjJWd?HScZ<$D$$Naivvr3Z~MWc-G zj)fUkI%hV(%bA7y%b^fnmT_!f&`nivg)tb>*^gw>+}KI@Pq{f zuq}u%{Wt^9BOX*AjX#esEoh<9R>BPHCJ2A)-8=-@TbUI!jW@1Pix*|S8DbtGA%|(~ z47%|X3_o2Nzrm6l?6RDhqt<_v$@#ofku3kA8PYMbuzptj!(@o$cJyrCa8`WCk}58JH9kU zgIPygA$bQzx=aT;j_8DTF`Jp7pVWWoZ0x^{zNE5=f@hBFY&=jXlL~Rd_xu9$m2?6N z97+cdRJvhU!316tp;x9Ud!>uK!tue-PpzBXjWC3f@4l4CwYWckH_x+{cUZ#%VYLfR z^lc<)-%wfOsg=VFh0Ohl5p)iIj64$M5(>N!`pPTSY3!;D=3Pfi9T@ln2xWhl=O=F6 zmD4!9L|r#{#K?L0^HQT;kl4`IoL!r5kek8hD;ebKk4jS)3uP{s?_1p-$t0W#904fQ zJ31TPoH3tBOp+kj(?hlxHQw&vmX=wDe2t{Tzjp^smFM0GWEZ{iiiMuPddjqkecMPN zc*t%V+sp@PueWD8k%}pg8#sRzx)Hdu-sRG9p3IE1)-kM6FR={kbbft6riMT_#9zF8 z9%OA&v1-}jwbSP~cgPn2TqWvgP=h?K;MIOG^vLQSTtpN= z9jN2@T_jwih^~3qny~*$Uk^*aOa8J(K_^#rO>gY4!?r{2gmSFxxcofKbfm$$PU!## zK~K1W9CSx8J96xw@bLypIpE1F%Sc8c=i$SBa`Fd7fe}*b0{1uY9>+Yp`3F(yE%Vm1 z4H&2iC~Jftbe4@{3eA5aMquT1ULLJ>%ghvrma4ico2VdSHw$ zw}tpzE+vBybj7%arh6Zj)w8`qVrpB~>)F!Qm-K0@-GLfWu-XJMbfCF!gzJh1#nml! z@Rp+@@|!hn)6jIVea6;3t*Ww{ZjPLcFeAQur)4}zEsvmwBY(HbSjE<^j*Vr}+Qut_ zVfZh+Y&Cz=ZR@S83OG8v26>xdnpE^a&X5fq|3my;A$u*gd{1@hAxeNkEYesNZKD9W z()#62x-l}x8A?WmB~)zbh+$p1@I%q()!y~2!`OKR&Z~0_F`BluCN;=$QZdFP9@!LJ zy9z{lH_|4c0qr+Tf@NB5&I$22^xUUsp;}1D_4I%B(bv+KkMd!6gz13_Mb+Yn0tKo# z_V)%looO-wPqR{y9K-IF)0BG}-ROC~Jg5(G_=hVXmzmQ8{sA-A$3}sObIvYCt4!1j zyuCOi5FIxc+H?|jrx}0vX7U7GLul864_cr{{*T_+uNK){SG|EeGcZ$JV!Plv&t%Z|||g3>z%` zjI&wE`I4b#IW?=e*ICL^N}xYT{aJlZYzlubcVo_pI}vuJxqEc7$>b8~c-+Gx8CuXf zF%ofL0OT8pWAwh|ov`6+QPg&_B|Kq{tMM#-{+vk@-;}-7NnV;D6t%G1d658bavT3- z{oGj6v{!yy6UjX8?loIA>7phVNeHY$3QzJzZ9%&z$oz83BPB}Z{32(vY~HA~&M1E) z^+Q=X8q94QU7R^jAPbM6z%EDS?dnF(>+wFCB=c*U*#1dCtg)+nrRgDMIy?w1rC;A= z4S(c-+LyO-12KP`C#TfXwn;7$9x`WwVIa&U2C?r`Ai7Lu= zb@w|Ipq{D2%4g@_4@i<^8Dt_#JSr4Wz_`p{4!kiN8gB&&}&Aox_ z>iM|WTQ{{Taz0lX*-Y9_)l7dfE5qOB=rPQNFmj#p+ygShJ72~EnYQn^68)17Q;bDlsvZLwn^amg0yT4ip9*gAFHkJ#*)Tk+CH;;&>%=|()<%#NGwrb5!nimvd!85eMdgP4EXdG$7@PT)q5 zY)+ELB;itTSwC?@f8#fVVpO3kflwY8{2gX&=R4&@tU?E2Mjq1l{2V)ZEmyPic_A`t%iSEYkk8by&o;py5I-g@=O~ObWF|AC4XKuv1K#Z3Lf3yb6cJEjTXEztbls7;#$&uX^ z%+dV*%UmK5gxc?_EKbMO6dU6dj;d;b-{F>d5ARtHGP~gOrN@8W$l@5_RPB#VsHe~U zh*LVXemK#qxtM)Q;zElyM-0bn_jE~C0t4Kmn)9XDw7gxR8ePKP99}iR9z>+xf`B z&HQ3Vc_f=;tg&jTSAd_YiFbo&``uTEV)*m+78fIc`bZ@S1`Fo<^Nuux2af;Fa+oDZ zM+44b*_A)_o?0)UGHz(gANua%>_M$`g$jJ{f!}{HXtudDn6LU|Hfo1RGp#(+NTR|` z?1PNh-P_Y`H{Z$wUE>R<$#Qpt6lrAF)#U23K1IV;IC6{Bl2$t^&vZt1)-NQ`m%WOB zNYBRC+l2I<%~?}1|C7<9My&%U<#?!=$p`8W&(c$K7P5zrxic5x=8x_TVdQ!nA6UDt zlYD=a`;6*yf6GEa=${a0-)JvfxJqMCnC7AQegA)LoWpV`00IPK+qP}nwr$(C?c~L_ zZQHhOo4c32?O#k+cg-$LbJ@E!dY&@@r>HQT0GO=`C0deOx-d!?h~POfw{7v!0xM=> zN5Rm^lyUg{UHv8*JD|db+rCI;5`bK+Huit3FEeO0RDpB4{WBKMIis0sMX1X^8|7=QU z(u`yhTSPXUx5}YhKZEn_D>a8ck65mfZCQVc_%Ifp62o(Sj!X!RB`#2xfB@yfLg{}& zDZ<~w%MqEPnf~-0=FetQj)K{dGo_JiXxt2k{y3LcD1&EGtZc|cG%rhIkY%zYT2eY+ zt9qNiK#R2mo;{nIm^=_49;kf~XDS8KT`0;h@Gq;zG2;}OWtmnC`mG&vt`3uDTa5Ha zG;yb1gyq|><<5a@gBYEBh9-wJY6O3cH5?JzgLJT&Jrs#flr~Z3QiS$#Y}PM79K4Fi z;rYf&uOrM-{@bPvIB{kT~SZBrk{O1vt zbGTADeS_A3z9aL0YcPqs4?JIN=@3@!&rx-q@3M6FJ}3@xjU=5xHSYH`X*7Qd5NSsn zBo#GZvSTQ#^TFgEz_BAXst|G~35z`%Kj|Ue+e6D44M~Upr^$>P6wdKjv=!|=^A?yr zJxCNuC+E=ZLu5pl+i+8vO3lk`oNjleVL=1w6P|WR z&LYrD78pk6jfx-(n!TS9!$_U+b!jpRx^mBm#Vq`;*9{S`g*2MVVN`!{1(9X!xS4<6 z6D<<>dp({d_~mPp$qg2g|2c4J>c_{FsKa2IUtD)th19M=vuPHNP2;u{6+9oLuc#8ws?OWFtP$cNvHZ|Wmyx4ErLU3K|LoL{KT-BVMA>0icdffvi=|# z|E=XFeXJnl2{V&uQ|Bld$Hco}HumC-cI*j61i@o&5i`93$|mG-4)z1|VC0@TpOo!R zR%IKe7O~X2W>-||-=Gf^rf;b1sM06^jiMvMgSVjPvAw9Pt`~o{@I1n>8|@2+Bd(`` z=o&2c2wBJ3B!NkQuo;hxz8{xBOyb0^UL5D!Yqm9hTe>cVf$(TlI1JEyv}|q2fK1+u ze1_^LCToTx-)Euus4&9jp##Zg7E5?#y-4tnPwo#Igg0lss5BwW7l-_Ze=ip)Jghx~ zyvxq+y4{$;@}PfPm}eII%)R&Z3KyyAYlpHH4nmltb{8aFVl50S7)%#z+eO6jNms(( ziz?x(-64@ZU#B|APWt8Gx1nS=uQKe|PE|r}0|_gEkb;XH)}m`v-9{7cRd^)q4Xp3y zw^ZuNpNeH%*QQ)rG`#oGsoXgFB&Ki}IB>WP)2J8k=emEmqZ)1!FvT}4JpA5hyZKym$()Ltq09F>_R+Tdowq$`7y$AO z)9;QQ4nP#pxlP3sF0=$a^Ea!bb}v+C($?8CO1lq_%+AU)e6atRa~N2E61f_ynPpQr!eoX2^PbC*#6D%e_oc z$3=f&7>=mQYHE9$12bRb=?IkgsP4TQp}(1$$-#CAr$3gJDB8oT>B5EF=tV&t!6oS5Tc&fo#hOkP@cN ziv7bnveTVh$(@AmR5h+(Gk5z{;tq_hopd`0DYE^>#i(~>dPyT|F@7jW4JhcLa8`dH zqfx^MD+sv(%T2Y$&rNVD&7tF#iFSl)fX)L3H#?W|(%TS`cH!m=(!Kj3jbZ7j6ggK% zJg(d@*FyUnKQBQN{fXw7dIc?lJ{&{WYQ}Acx*;m^qP^%n$uH{dVwAB38sQJ3j2r`kix zWX#?OQkxy;es6}QbzkvtCA0@Y&g|FLu+}9~h?HYSqW1^1e<2-{i4kp<#wPyx=>b7B+_obHG)ltiU3Acait0?ejpf%s% zkL2&lYB;r4F0@K9BY(SeZ0J1(TY&my2A#1hCkF8G)1t;b&aX?DWnJ6Dzq?m*l0SVrT~ew-Scw1+y!Zv`rLyz*VB#PjxJg5B6^xlSB+QZB!CFJ<*NIV<5`3FRT+Z zf!dLcRQA74k$lxu&e4By_IKgKrKtB8+kmr}U)nD*VgMQn)sus+PH4+!ak+xEVRhaI zM=3P}*;S)i#Mr=$Oh!s0$a@K%KU~W4X0}WE zO*Z-KWO9}K1)YDpD~kjhGXyc~Goe$k@N;G!c`6Xnk0VYb_6!{&^Jgr@g4<6z_pLMuLQ};w#3uCsY?suYi$n&B^tWmD{hb> zjyu7p%@QPESaQTF8e-pMxaO(7o83O*%GA;UZ{DxB!gGJ~F-b=bJ#zuAs3bxD91f7$ zGiY;U`!K8A)661k)0mq^F;?2}^0_8W7EECKxlbcajP9K!9whb)q@#2>!sr*_CoyGL z5N7&eyj`Az=`-$elD?jIGosCba?q6&vtcTY3OdNHSmt{lNrUDw^APg5pKyb<(V@;7 zqXQMR%oTt91U)SjmVpiakxbhfuteV>H0Eu>*~JuF{TN7RPyL zXz3`mrRgNvqrEl^^dN{WRd0se=cCIOp^F@xzH!#A9hQ08MqD4(m!$sc^bzFSr}Dby z?h$wGVKZ>3h5Jf}giZuswuNp@Bg~X3u0p_KckzGep2;rbnDf5=T`Th|TQB3u0 zJuQa2He(~pcv%Pp^E-OCj*jH>l-Mwbp2_h%to93j)zK8lwAAAxi+IKhI)i>1nwM&H zH_FwczM<8hT(7nR54qCk&i7=zq$brvY)^lTta8KF5B4Iwsx+R`q}?eJ79t6!DBc%| zcfmny_X)E0_sJGQlykn=e@qDJiwqn>L%?H5;8%Ud#FP2vha)$1<(4O1%T@s!5&F8( z%zjeWKPt-Dh_25&s4DoYv0Cmq@urz2&5))XX5aCRPo)`a>m@H005&}~9?%5!7mdbK4%s7=x0&VOnSby{t}~N82INOCa8&hpIP+jUA}lB`Z*VtVm6yr2Mxh&&*COZL7C7 z$!YqDhjrLqa6*V8Gy`QdmvoOIgPVW*acm}SEBHea8I2tDSWhdFz;LTi9>cu7XQiSr z!DVdXIgfUc8vpjf-ilVo?!3IWcYwAp5rxMBR@7+9Q5+o?w6B_k&KlT7F)4i}W!jgz zG`gCL0zz(oOl*xMkakM+%bR|X@giWtjQopPPUS~Vk5LhF&y4Uq`%PD2{wRN()p+&8 zW4tbOugXs8nb(mUmZ)8;X05F28C=uwYfO*GmAMCsZeO|x!5(bqLHH8t28E?#Cx=50 z{AI%(`$iFRZ5{q8TFOV%s~BaL!CXsciee%D6F$6dW{`B>oZHJ|If8{HdCrlyuB~NM z%fx2dU^JSA3@~?jBCQZXo@9T-E5-@AiZMe6`x8@mZkKv9zMU?NCEMP)s!&^XpSS=B z^BqH)Cb8dA&D*=_0>0D2JVa$IbWcQeL0n^gg zV{8iR^i@ax*RU4J`$DVUV}oVwB0w@Xs#V7X*6BMY51D)<;*(@YzzM_Lrim6Iygi>Z zYZHw9+M`?ifGQX0Hmu=*$^QLy%$@^Z2lfYiOKAnlD$>-D!}doBExphV?vmAK;NDxR%6`p@*Pk&UvI;fu zHN~cHui(fupFN2qCp#UsG)jN5Z&~1^bv3Qi@K$+srnEEKo9~xAgllR7>;cS0_c=an zsIim_2zG30$NGN>^!bvI%xUCW+j=XYppBieUmEas$&d68M%U}iM3Cg|w% zN(^6C+Lk>{vn~St9p<)4Klems4CeOUz5o znWsem;(f(f8NpWVdh8!oTtzFpgpvRwS=Yh@Dcpk?q?4v$r6StdVphmE)lveD;4b#_k_Qo3YW_t6gdJ`r4|!5w;yR z18e1plnY{=pUgb?QA90U`q%4Lv8Stm4&0R6S`eL);+Bp80CSV%C>aAz@G$`X>KiUI zM8WvQD(*1hMHdGW3+&eIz}JuUn}~j(c}Xp4=^cy?w(xa6P4{@)HM&6v`b5E$`&zL{ z!!>{O9MVE(up`=XMtE4C)gj3X7$d0I04?IMJ(Dv%cR^J=%^c_I8q{=+^HGO}Jw;3enJC+R0JeXY zV_>fx=qpHmVtOaj9M*En&fr&D(PJd}jM0Z=p}gsqDn(EbKc*$jyMt{gk72+o@h*no zkSK_0C=nCw+{8#X2lA$*=2mkk3tW~XX%g<6*uc28yZ#A@jCwP!mS*@TU;GV9Sh*q{ zU^@ItIu+aFEBhe8UcvZgT$#^ilfHkFFGG0#bJMt z^O6(|j^~-Q3E9E!4!^NS8sLdmVy*XN?nthAC&i;UTsn{tA6ZIBNs7+O#JsRAozt;I z9+GXJmzwRk=cY720}kXGL$6ZK?)!o51slrIAx@PT7-8W1Y3OU%b2)Y6IhB8Wgq#tp zfnReT=T2W8C}^$n)8zkIAGJ?IGGO0nP46fi5jsG~E5T^hAybjJLjt0?l>w;jZVXSC zkM1kZr%el7F!t8FROT{ueX^k@4_xUh*FQW`iEfyU+kS7o{_Ex=>kGBLs((UfgR1=U z!Hiko+UMdqbBc|?>^`qV2Rnahm0LnvKd5tF@e%3=nE2{X!pOo~#0~T`U z?AR%_b+RU~R^s?a*cVc7<)0%ptuW-W9?tT$oU|yQt&?gbPW;@onK5Xj? zt?)TN5Dly**NO#8hJjRcbJ8b3e61;$t2<36jbn@tpabztis%f0HSU);{`J^w4+uyz zAxGZ?gC~NR7#B&#*a3eg0u@z901=a2j8aSpsJz06H?He%%XjB)O33Z2Uhbkfox6YN zZ(@?QA57&K1m^MF?oCPa7_r1Lj2n@Z6p9xnGgIWc3Y_Q1JjBgs-8F*1$&5RERA^|5 zId#4!TqfNzuGdwS3ES!o&%07gt$a1R+7vCVmajc08&`IT;qHH=4Z1rJxSS2j!HJ$5 z0&j?WC!0>H$4r9v%`n^^+;7(#XFAE0IC_Su5B$+8K1n(1Qn+yng4{Dzp+xZEI=wih zLqoP~14ld3ks~y0mGeU`x-IOe71IKn2q&;#%wmzn5rMR4pg8UcjA{WY^qW@Q9XK2u z&oj0CYce{J=<0t)(-J65W>3@?3ySnM=3kP4Hf!~mJSVn5(hDDE@>}Z2D+`8pd&?gT z;OA48@;G)b`V9drX8@H+a8rBgGwP4y6gBk|isTQJuz8sEF9CmW2;|$_@vsEmDcjYKOey?%x3gG$Ks7La=(^f`ES?EgeKrm?bl*JI7tB_mllF zS)BuF=wVU(4-ws-tZMe8O4?zE=)ve=qT0TwcFl#l{l_U0H6EfQEp^k< z0U9>JQM&%S~T5LbvkcQ08}woP`D*!$jR%%x{VX1x)4>gmtqx%{+b8yuTaufwpwI2Pu=s8>3zo!w0GvTiWo}Dcr zwI_~}bh8?rm@a{ zS#BrIt{-F|AS~u0Z+8$620)#E1j}=341|<~3~{hs=hFtb=+bm4sr)K9+#$=XD{|#- zk^S)24zfJm2%cx`bkKjx?y&+|Iy%UVs4#!G*eP^YstS^%)T|eVLdVm!HZpmDE-J1K zM?zWt;A}*GNr;SSU8z^Tuzb{cBbz)NTC%MTTb?qvSF+67aP})M1*>fstgcs$dJBP~ z00rO2wz_S8^+b~(&mV|B$vZkXk#TD=$2Y-z4LuidOAb6wNQXk8e+7ec`N<%XPCuE(+QV;)pLJK^yV<4 z3o7ULIR2qR;kY%5yf+bL#I_hbV%r-8!ul|XUvuHKgT;K`4j57*^hG?rxU`etJQ&Xb zl6W25MfUj`eG4L}&oCt6T2Dc^#1PlHIo{Mv8#mViWu_?8q>M7fV&PXl%r_VGpOZ%r zX=nGEyKO_#KE0XHdDc+n?uCCqb`uZjQfkYer#(Q*{o{Bx%5yqgx%|@`wZ1Fo6b(h< zrMu!If8<6~^HI#THl#W%`R38$E9l{!3FJfal#80#Ghp8gb~b>fn4Ue)MBTy7Ex1@v zN3%$v0vD~C6cHTc{xxt3F%kvsKN-iDZ1Y~>ADj59u_3-tGQ{}%kf49@8WLl!N5Z2R zJjIg}OXAd*Ve^|I&7e718*$?9&z~L2Td##yIycJuS3=F5SVH`5#GG{e2_QASUDNgb z;LjsKLdX7HdJt({J*~OflaYs5cVM-wM|>>=nQoY7XwneQ<)UjYU#t-G_zbGj@BvrX zs^ZfEeRCaU6q-b>!hL^zT=K*$V)*F=IjJWU2@yV|HKZGy>H7BZDBDlIJZ9!i)4HK3 zwpZqIT_4LC2XYL~RZqF!p;dU0D^~x+w^P7&T@cJk6MDRBK=If@E9hOuNEn7B_eXDw znuE1WcF&hvY3L+5Xn@`0&3~?kwxs(Y(kG=8vZF9|lP2@D{X&0myR}?r4MlBWiURIc zW_MYk>>@A}eR8|&jLhkZ-7O3*8FkupNhbbbKCcokA)uoWs!yTO)K{@cy{SjoGdysO zBTI75P}C8oTMN}&89Qc+2vg5j25^uwA)JEOi<)(032X`s>X(5j{T`41qlxVpn^i$M z`JJ!teQX&OV+?=uAhlHJDN0YOTkuv==D;3-$076+jgQjF28{1Abz+ zDe7S==8z#%u9SdBj@ODz$mB01O7Jw*20{by6dL68AT{{sn7SV036Oa9?UHY{W*1< zjT(hr!LbEeF~)m;KlZG6H%KiagS# z+q{cY0VZsb4;#5J1Kth{d{r!dU_@{6<8a}0izdH(8W{>Go4=yJVCA}})Q+$vG0za!l{i)q8Dl~U;Q zB%6T8at|k#s^E@n=X>@I9PD=;Mh`s@^(Yg#7o0G7%|QzMXw+28XC3K zatl+7$ya|Z#Q_U_cyWu>@r4Eoj9e11wDyF=lCr{=9*3*XPkm>#f>y z&-AYS6#0$q1zPU9Q(g2|)7BdqJ@v-9#?G0@yF9-vcy z(^_-lU~1z`mOEt^XvZn>1qV{FsuepiYs#U38go1z=Nd=SF@M`$NYU4ja!wI2=+)M? z>-IL4jJ#ECvs|Fk9iEf;153p<`*VjaO(mcN51G(?7u#!-McIToF|IhC=~|_*ID#jO zOt`6}Y3C2yr=NZW7SB5)QR2ocT*SqHyUEWe(=8g+4V#YEQU1|m& zPEZcs`5+rAEKA_9WL+VyXdf6#2cL^sk`cX5>7U($Pf^y?7j-ivuSwV1h%HHfT>7(= zYcOzCGP4r0((4Oxm9{}#r}s($M9aXd?8F-y0qgF-SXAtXq4Y`VT9R!XnH$)YhrlQ? zu8;=mwX-${P-5*9>$|tMa+!&caCV@`c5;M`qQL0ikuW4Gfa@b2R%^w+s{*6IJj@QG2MGgpj_5slB)1252s7?kKEmmxO-{eT9OM+ ziIoK0^gOJI`csA^G(@6ch0Rn&ReXyA||IVhvfWKKT#29taRp~8%_bdyv6h^Td z8ZZ$zR3)2-xa-rOl2Q<>e3jtdKLlxi8as|@W_;)0JKM)Iy58MSu=ZQPgS9@Xq%hW` zFJF>$! zhVJrwIS>cUc8vXaulm7%$}mi?P=l`qQ3-UafB$}vBhI>vB@_`08hEWac2q;l{|j=2 zmDO%(nFTxIKm1AIYa*N?Y8vw*P8Wo-1-#>^l(L1!0CgQsd|S$1rx$eQ{qfVyF|fQwIKd~j=8B06VAgAw{N-Jd zf-1*+@+vLUm+{n)in*+Rqz>FIQ{L-ifUvjcU!-BfjLWT0jJCS)v+JMxVRDxKQGtyr z1Mz|_*GhPQv`Ez}i(MJ@h^D2*hn+>HQ4DRI6%r0646pm%(z96DM6DJUbW7A8!2A~K zZG9FNZfjnw%F@OO4z-eX;==1hu`x-Dcmpq+hPoMKOuGz#l`5qlryH;R=ab8%@)Bo0 z3qJ(3X0T`n&H5&c6?E1#DzP0Y#WMwz8vR2D`3PHockwo5gRup#QC>oZeZwXj3*3Nt zS@#!B2+3T{mDRkw?z{gT42U&r&x{I72bd`?148PA2aT6v7c7Y+vdtj&l zgV{+#I9KubA0lw=gv>pRo{>fM`RIUR4e5lueE64p-I#GZhy`37Gf#D)E+L6T`n5_* z?7l#M{c!N$6Wez)?vbH_SR0dKbO!u;&|EPDqh2j~XN6SI^+*Fy*V1r_qSCR0pvD`a zx=g|}%{n~4ipp4CNv(wtYDw3>{Vbo;e+0m`(w10vtRa)uDh6mF>6HfAid|Ht4Q#5Z z08_}ec%60wju#*c#z*yUjx^L|lUVEh1 zMSEthoQE`@CN_4TZ(t~vZC_dL&;58{$rQsfV^-yCvmyZ~YuzVeO7MJ9aITAy#EN=< z-yrwL!W3tqh=@7MjAJ{Y@JT`b#HOyHH`5uzU+v@W;S$n?5@8=Q5=JCJy&WUhi_zYR$ zR&lOa|AnNwfGL6jG^3w>xpJiQ?58e&%q~!1?3a#h4wvbNb&yXAV-`8!1&0V<3?_$Y zK!=hS17znatpV`YKl8 zsCkR?;2oofS8%-gZ1%Y}1r^f7BF6K)J>xN-vq8!a+1!Kxc{JnY3b`oT+v-9U1Ri_q zZ)S-TD%VZZa?2JzyME`O8GcRP#1aDZZ?qau+Ul$->5iZ;#%EK9bI2&jo`#c~u5Dq` zZb83y%yh_F+{Gb2t*z%c(5_m46k1DvM~2E6i9D{d!ptGXhSGuw90fYiR${jdvcBBP zX*OP??sH^v1{M)Eo_|6jHNciTX*Fw$uwNelo$XM-`g?F^K>6tWrg6M(tZj9|(WPM? zbSAo7cEw{$hUOWtgfM)-cWC*kn7+q(Bw`Bmdrr-JKimByY;Ra<{F;4G&CynJ) z=8URRD@C`U!eH25jtSwRg3!#4Hgj9-Hd0?uFh@fJzzeV|6%J$Mfv%%giicR(pOPyj z0X~$$x$Pl*_2Xa9R@lpb0{*hWnA93!_2)-`he#ED(|?{W@3_@1zo=_~0`>vWR5S3D zSg&MC^*&yO&R~;o+i`QkV>8WpC;qc8hmrcKjrnmdA;78_scWrrf;%s-@3_Y#$6lu! zC7WO)$aHmod~TLi@HQ3mu_Mj8g>HaQ5&NKn$&q$Ryg(Zf;lU<BOOVLERVp{vN?b5yE> zFg~qnp%N%;i~lEo_#BO`VVJE-dcsa-`*G;RRy@c*eoPIuebt*JJ&^Nxy*1zZN+*GC z)e@F9`fSFSkfAqmABYMLxR-1);iA^~503b3;QYSUPTbBBZ%FV2dn+hJ$R?%Ix{Fd4 zO_yTRkLtIElsB5ud2YZ7&1~1(k4xHA`#i&_okY3B5U=}xgL*SIBqK$QL!oyhdRWvF ztqPIYTaFDr4ZoeHxL1MCDPhLkfh`I#FoP+YpQC@EsS$`?I3$z3oMPBuqROIdtPyYr z&N$T75f)4OM7D%}VEFIeO*m+%1|8|wI8QCb?t>&__MNH~_%~fewGbVc6j4Sq)Y%(! z>*VULwRdoT_czl^*RMaOX48I3zK0)4r++)+)Fo7C;+HlgYo_N}H@MjK!>G@C8x7bf z9S+nisrV11{$sNa=KczX1!nlbeEq_(0FL*uUao9_x0he^g;Cxls&0Ptv%It4RK)f7 zB^E~?JLe|sYLR*~DgEVLSf2bi(OP&nKpc%sk(q>l7*h6vmsd$FZ`=vC?g9Xt1%x7m z=DRox=U|Tz`Fwp3ok@3{v5|{Rq*?bd|J&^q8ZBTBMgzSdwi$xuUC;@k#;ug;7>Ut` z!#R4j0$&zO$yUx%8QP0CyuIf_1+-IR)GHmd9uAn#(-#+k@{cx_T{4^%(x*63E#!T` zhYW9j&TI7>vzD$W@l9*0XP>q)5~ADTF+D(zS;Zt|?Jk8xv}w4@^Kg}C&1D8wQi`KNR+N^*iw|Ga?7V+qD@K^n{$aT(o<`K zxHns0VQWlH(7Q(m;g!rV6l*(hE+4<+_k445h+F^y_I3VD7KnO^Z$qN?VC zL%*?j1)3Ph>s*58+_U>R6)LhK)6lvH0b<&wYpz_gO}KWd?OSZlLJ#TTtf4dU>eAOM zNOJ@x1EhYiRP(*gT8lZH44myCH_!!nvv%chn^nH zeDTQhTON&i#f$eFN{alq5khGJS)i#X0JJTrdKbyi+zCMCKhI9AW|JXJ69X_ZG?$^4 z0uvK6FgG{~FHB`_XLM*XATu#EHZ_-^O9mDLF)%on@iYS{f4XH<73$VDOoMa@NG?D^ zx)G3Wq@+`F(Xi<5?(XjHl#uT3?v{{NLf~8Oea^;x-skT(7{oR6n)9A_z<`2OUXfnV z5Tp+j16kSAGcz!81EghSKvp1TCVB;+v4e%4Er5lAiHQx7fw9MGr$Wqu&a?R$nviQ0BRF^duwh+MkgmH24e?1dj^oLF@v?mU;LCzOzi+p zAX{?)fB3sC&;s~ZV;rmu!R@p+0sbA}_o4u#O$~rncEI0GVxYg3mf%)`oxpPYe~5t_ zVgEa(#oy)tJ0S31X-xF&{_>TUmzM@u>X};E1FiI|48Vr=diD->0NuZ2;7_0-)!zhx z0AUAP+uu24{;RV6C(VDU3xU9uX<4{==sErGe~Rf@IoP@W(VKslZ2+>eGqtm~`#T~K zU}S0m{LS9(_nMhn{UwtTl$8_{RaByv1`nPUy$lH49V-TVXZydbf5#IPkp_<<=X(GP z3k!e=JfxylhQc6AOE7CY#NX``F$MR@9%Spn`2WncxfRIC%I*J^8<|=e8vX9Pp@TJ} zf3lUSjRR0p~JJroT@v06jAY=l|%y6KP;>1+=pRaB%&l0)o5nKYYQh|IHS_s3D;&2_h;; z`~Qs0UuKtRPX;O=>;kZMu=fBMfou_fFD3^&fKl+b=x@XUU=(^moB&4Qm$6Rdlg1}tV|3O?}E*dWg?5Fn+Vg>u@Sz3el&F`82uaphUP!D|m*qYjz zzc_+T_5VT4EMTVk;1z!nfD6&L)qgVpAK^y!e~8)tBmR5W{S%G(Z?QSh{$KW7tpCXW z#{pcE!9R!{OvV6Y0iNW4IJ5nhSX#c+#>@mR{G}*XaQh5F78ZYUW&*PSz61qZ0RNSg znH?Mgybtv3OkT$9w~vj3p2bUKFlX>QTj*K-5gFV8~=W00RJ=rm-xbi4cu507i$xs)gKmMndu)8T#(rx5WMu}e?V{#Uy9%WS8DNl z_rK`D9si>uX0X9aDt2%zEAXlD(gbj7D+f#c-$$_VAC#EE?E<}!2FC>b;l<1hF4X!( z4bEY$2fk|mH4|*i|B?QCB7a!H6u^`F*X93@DaT(jQ;^{wDZrhzdGP`_(Z&G;zFhTR zif3lye3AZpe%ao?X#Sm_`FFCvRR1Gq2B-LA*_gqdd1)&kZ@KQMau}{H4 zo&SK~tS)~*@G`l+a0W+m1={}2;NMq-{O=diUzb1A%boF`r{iB((cTth4pcQY1V5Yq zFp<#%?{{ZSCh*P843>jG{`-^mzY+K?XejW=V~KC7z;rlclf}Tns1WIDBeSF)&N1 zlWhceBH7zyK>mE6FWzaC`56ZNE zqHKtGHe^GC4KbbdLqU~5rowlE0{v8?V$HD3yw{L+xuK>O=E;+~(uax-E)mwqcrh`SBdjaY7!hnaE~w#L3T}BfpJuPoJKZm#+fI+jrPm-r z2;rg*?;BG~3HKdJ-mdfl;W3# z$uC%+>T(pHz>Jze^FcByHZ-RyBK%pV2XjAP zNnLaL&;`Oc`D<2<@u0X(lFK?0#}^%Wz1qyJV7w_M&2@JCEkK=occz60gYERZp7r>=0Yw#ZlR{Z(56@>sC-p}SAT-7 zB3VWrO9725Kpn#+@^#)UGCu{_ng@AJ!?M%YC!bNP&k5grRNT zw?G`j!;jX-vx68UUWZOjV!vMLW4g1xfj|bPTyARV?kk+x^OKI88%Erk>(BFaezxRk zvaU+gu=nghN*q)+Ik04_(3WAA8-G;{@jo3vhD)=0o44&MIUfEk?wN!gaE-z-n4gpy ztbr(%3wm?Q7THf4Qcso?7&_e>Y`)E%%_>PZ82pXSR zPT)8sd8JxNe9o{T+;^N!lYc51%7ac+8$d`QnkZVd?p}icN_{IhmBUd!HROz#eW_Cd zZ<-o!B1n}-#NQZnOP6>f1N+}_Bjo_`WcH40SPe_49F z8yR`zRz~7^H_g|}@X<~tN=xGvT#I5KYR_#MP_8Kh0G z9|MUZt=OwXXk?+b#=3x4B~Ww=ah(S0CQb@Vd`;nUbjfkFSw{Cn4<9{9dfg|pYuIR* zxxY>vFxDehUC(9|+JCi3(w)d}@#OnlRuDVXSYx_BeP99?S4O%??UAo zVU`e=hZ3aYsrBA|eh_bYxT8Yu%a+wrVq0Kg4n2rD9l#gAEaS?1GNPRN$Qa|X@rGPY zto8b?@LXiHH?hoS6aqg&WCNr8Oj7X6o_Zw4BUU_xpeBNxgMWxpd56gAbs~w$O0}W1 zf75;fwmSliqN1agbK3ql|L-;SSasdzh^w$i zo1*bQ5GobHRtl4Y4tsnhcZs?z^Z7^TiyFvm-uwu++7eNIZc|lzMvlR0MS*DC7Q!Ao zu8j$c`_`e%%$~RL;ZQgyzKpm zNdxg4%ydx!)Ue=1_QJ$79?S>$l(jRKs%wfMMl#WX2h1CukF}6 zYJW8hO@PEL2d4iF%(RRg@_!6D)tYhD#>NXRbQzok?S5pT z(UD8ln8?6Js;AwcRq<1Ei?TI1IK)l-LaLapWB9t`f(GI^O& zIPLd|yX@U(6&0I_%JN=ZK1hS?#)X8*lmw_{7JrixKa{Mr;*!Q$^B9AthH|Wry#i^e zNuy;M1p|5#!BI?=FasytB&P}aeCI(^TA2!>di0QwFWKX?q7_O9CG7D6jT zdw&T6Bp$VZvrmJG>WgJHSrthwPc)Cb7MTGIa)hL2TkGDJ#L;Z*ravuX2*a4GJ>lh| zAgpm6X4sz^g02?W_UVZE7-+xPVY_aQQhbIzHnhW*oB3`v!XKuNq3DvGdemt36GvkV zo>V92^E+vwK+OrIIQbDYyu6l^4(F#)`+w!hjWZD*F0J@pr$aYGtt3}!BYzRT!Z(i= zinSAGs`)6zn-w@Ydt_cESuH8?w2KzI^`M*nw6bCM7<3sCkCuIrawv_o=pTsAW2rn= z+xuRa=*C5vAKA$K23UC~ewIWd1Y2F5W^T>Y=X)0J7%jZ&)A&UPsU}1LqhUF+n$XI!TO5K8u(Q+rq8rF97fhg-F*`1&ucIos%(-pkOJvaYbk*kGQ=BC!lYjD~<>vV1v!b`R$r|QV7o3#mYJ>lyvrPKNvo99D zB|;t%eA2+=29afOMennzyVme2l{P*=aG_%=a540YM|;-0%2!#<>2FzUy;~ioW&$5G^>YOg2Bh@N?TnP*aLT^Sz1|ah7 z%ZAso?~Jpw?>wGQKoHvV7Jo!VW}P=-U-#MmpkE;DmcLOy@=7Uhvs<-vhp5w!*_*)c*YZlPb10FS9VCwsada@+eGWmb|`IS?M=^ zl5!Ri z=$W=0JlvrvdCbjr|E+joHP`o@3N0vW7D{<$l0_aRq*UU#hE3*pH4HBa&$9=17GA9)I&$^i;S#^@WTehtUBp*uRSdZH2f_6HIP}rR+S+^ zk_hMf`g-k>*{+ME#~es!%;zWb-2y39T%*Uz9%gFvHiqG2@o8M=e5DYYD#u`H(( zkOfdQh$>44=70J=@10w7InKv znO4oG`}m{heADE~|IRQcFh1MAUFBQWp?j_i<2`*6g2da3rr>WE> zAS=_|N=N+Hcsifm>Mn+rZ$~*iRusFb`WKdGE`zt%81shkgwhN{DAo;lcFc7iE*3Zz z3seRflxwQe%7}S^(iM!mFr8dK1)H#Ef594@!vSG0omWWhVG;7=OH8qa028De}Nf`36-OO@=R?Pub^ws7$yxfs1q4S-Qu2xZaeHMc#?o7D!)Q zX0`St?b!Qxe^g_IQcJzdv-QW4YEDuPU~IEWBPC>`-*4F2@i)#bVMm$m|`3v@jM_Rz`7ZDuqYiA}TjXjcs zF=_cy!^EG>wWxu-~w@M*Dvg%V4f?pd6G$~C%2v@n7XPONPRQ!~d<9lpJCdkm^o z67%*GVVR9_chE2+1Bt@k5S3TBsdcDHg2#^H;mB`LDSKkc5Lh0dE$8~SuCnXe9lk|b z*?%mx=6)T}FhWh{WNpNnt|?YT)BGBR%}c}8W^;XK@u5NiV+ZidBysy1;fuiRLsH;@ zZ!I(`0q~WkbIhbD)h-b%9GfjHHC>aH?!Qih@Ejk%o@6X5zA5 zpN^%w#)c`8G|qd!)_3u~X7NLaBJ^jk8h_I#Gq6|Z@I(yRC&-G+!}>R!d+Y3(s)F-w zKd~%BP>^WIaxZ0y?<5$a!#KSU%$8dIaRKQ^(54cX_(o1J=xMxkA}1y&ySy^|k>kVG zhvF2JF>KuEHT!vX1vt3EwxlrNXyakqW7JAnY4%6E5eC_|pOF52TT4Sb8o@&Y%TeefJE_xf3gLBRnEi z+b|PwS)!HqTsu8Ql8G?JaE!;|W|2@OhGs0b7Q@iA_JiF%Tnt>|=NC1A;b`l*t(ekZ z&o%ZCn{}?FHLq~3_y}JI>GhSi{(muQ5c;5G)(km-vVDW{!lv(f5W%K=VT{GS7E2V8 z(P*_xfUiV4EpaqA0vegH@g^!Fd3j;*$4vgpPkqUVWAVDxlG}Ap>RV3^uF05K#v#nf z`c<2ZRpcV?NmdtF&prDb&D6KFb31HEviKNCKTpfvQ47t82O_G%d3)odMEjl!e*M#m&i$mksHID%4=@yaTeIWTK9j)M$Xn60L-LoV6SY ze?UvzoP8fUC}&O?jvda}ZRO?8$Pv-~P|L)p)0L2Y8Zb51MFxpZ0wGgJU!c)w>4FFp zrqh-aD}HkrbJ$nG#D5R7Q4ghd!_!S4*@fD>FwlJ(P;c}@THzeG7J0cfU|K|BGmuM~ zq{$5^SKNQU#aV`Ugf4m%)w!OK`}Qq*CZjJQ^~o$7+6l?n@{D+`fsu?y(gdZ3?0i8p zY7;7L(?B+i*V^h1s7R@FO#Q?ww{b}_>VSfk+8M$R2BdF@T-NlUQDK3Aw z?DrhX96%=SC4(FV684IYi|Gv<8sjEaeFmGw3xmV5hFG-wK| z2_`FLjCQf=L}H{nFn*x=Z(!s`iI3b-HdVXb5V<5E zV3|hhZe2rO45C&?O{3eZYovD3?GYOP*%5P1*TpRX7R_FqoxNQ3(t;JS58TwZ+s_Sz;m;hmA_75D$ftW~m zI@TobMUXICMEUIrC%=aSR8nA$yCqsmZ*?$zy|-5^CHff$A<2Fq*x$N^8}e;89baM` zo@=q;Y2eA-QuEs!_uDtNtMM_jiOGGo6n|mx2vdVXgo=XJMVueICfABhJ}dqNzR2Xp zOtzr8aulh@(0`pw6#HW>`b_(mBc87zerzVE*ox_Ux9POu! zsg-hdm@y3o-f|HgM@A`^vv1bg&mc9bS58V!wcL%2SP&lvAhJNI313%`7#i#lXn&jR zzj8aBXH{t-eJ^Tm%;)pEBvucz`>IHPy;RjE5aV2_?;Yo7;f@RylGBo#A!1y6TAc?i zY;A)u8}Rk=Zfesp%Ji4MLqWaoX@B$zyjK8{3-&-l^*|m{Cf=eIamvY8dGDJyK|e8r zXTltL(l~}or=Kgl)>p^}VXw&5^?!G$gF+ROu_8*!M>gK`VoFWs{VHbbWiWE?g9%0u zHZyfF)QEsH`6@t_9v%PiaG(O6orBvYm~r=RI|njuv*I#mTks*?!(zS687sI9+(^6x;Cf{v`(|?Z5am;oY zCluy6&5mW1FaX!l`O4u!qyDIZ{i{ppTYrDAElH^-(wszOBKV@&>66gNUxRXLOc{yu zDnl-GTSVfh-QVWEvO(b`oZ_HkD$sD&$T$fvIUL#-OtS0XqO3_3sJ}y;;VDqwW~?_! zPtHWZtWS5FfO_4Qk3fww?0<&n$nhE5(toRc-K~|b)<%}IYUGV$7uHUz-b$#cptRKo ziJ+O9@oqRO&rZ+~p(w|uy+r(xF) z;__~*@m7`L4SD6&aV7=(plwO z{ptX%q+!S4O=UUY`t*oezUI#wmZUL7hT<7_%@z+9D+Ena5h132bB8z~y2WSb}x7Qb@ z-pbzB$In5{G^hdscYim91j@nqvuQaMG6IJb1ioP_g$V8?!D-B;Vfy^UTu+H+U8J%y zd1&-BeXqZlN5U(L-lDQIZ8t+V%HjWt*7o?Kqa-B`twJ9Z7h)+UoNhlrxDSHvf1-9D zKm(mUa$~58JeK4xF^r5RSx;h7QZEc|MUczLREEF-I^L#|Mt^J)gvFx0`gR|=69LrY zehz2(LMAP-_qCHOerzhlijUq;FoqT?W_!@O4vkyAQFRHCpeZ`s6hr-@Qi)(2{JW9( ztderJez@ncwxAWcc<7u(pw@K|SCUyn`D?};8qlt&Gu5$y=7XhHxKYoPzqNEA8+T6# zg|BdOcbw~G&42fTV3sxao38B`7-R08?BynocR8!53!Q2euaRXm_lJKCOv(uh2Db>! zn7Z;&e{w^XQ0QYNxmTi&B{eucnJ+L~m^HO0!C#MtQ?*W$sbE))nAs(K ze-T?XOmnuBR6*LO!f8qRU~NfBfluo@oCJeh671bw6Mt44LF2SFchuzyAI>o22A}nj zWV<+Zfu0C|x+AQ=j#z57E@<6)fco;oGBc!}`SU|vNh6IDlZ6tqL=`Gg9mDDZfy7t~ zOh(nt+1H}Q`%l>#>%k9~^UZRYyGPtfp+1fq>1c-yy}5whIB$1A(g7%Dh9^65w9!a2t`G;`ipps{i5!NERry6b3LWBCQwiH^dpe2e-9q_Zhy zv6-{UgT3H3EzRTF!SX$3EZD17-q+X1SIZR|L$}EwEc&s_kS?xT(xmDPaC5)r{FKYy)&HYP)TtiuZR)t%>oUx}xmsKVQ=JPTgN6`@M5OinhBvO^=SL^u|_`B=k}^hapamZSGyxRJeIzmDkt0wH;H!{qnLVhK0ll;AWsLlfLMX^#iVq)4bWZh7W(mo?$Xib#h~7s z^GpI4kgpmc?D1XM8tC3&%5Vq_a}#oqzsJt2y|38e2#IL^6v?y0kALJ~AoGL5&9Nb4 ztE6%-jo`RvYtm;fqJ*WUyjxZ19)beyB^Ii8KW#EmS*kFQik%c++I}7kXh)!d+f!SeHOJLx2XP1(b?$p zomzQ@b(B3UFTk!j6{_spJFM3Z^ctaEV+wVg;?n_F{$b6JXj6>LorZb6)nY*8x5#Oq zlZQ1FP;jkXiGMLyYo1`QFKE%w;iHpG^H}%FdKCeiA*vlgbniv#tCVJeg*sHM8jPr^ zT%Yg1Tz^AuzZ?GwEH;zb>x)Ug!4$_B-s~)}iR@qU?Y2l1j*C^biEoElvKb&JCXanv zq%7k!Jo6lSeLKcO;1?iCQ014{4QW9Ksss>Pg`NU2q z@_(1WnU7Q%+27i3^{xKE$RrHy}n9X{v>jxL+sdJN{qJ0It zswNHW?#vdP%DjuGYCoW6f9?x)coF=;J)J2)N(_N3%27Q44HPG*2qmQZ^D7Q0E~XgYr9i=(lofA!YKb|}E9!jeEYM2k9B_t3d~_lGhE`dg%;`F}HY zr|&fZv)ibZ`yX;u33ocD1IH4t^!v)%{TB+pyyI4gj*u0?p=L?iy-E}VtPa|UHuv=O zjiZsxHmrB&I0x2FtdF^;?KkyVB;!=P33zaPd$SwAAisFPjsaGDwzs0l#X6?ZvQ%z_tHyW{#br5l@Jnh zkfoT5$#%8MFkN=fkD~`K?tI+%P7%8S6bTvqD3_aENNJv$fZ>xtLRb17;jwge`^_vd zW0kDAK^z-5{u;)hYyi2}$!EJtxN!q#XJ=A4|1jbF`I?rKp5@3~)hGjV9e=^rl4&LU z_)N6`#x6R`ZOr(Fv@P~xpM-m0nSmh|M2@E`B;%ZFxCdKairSinawAg=YPn{z0 zgo;VZ2#9$sb!>hV-Bw7~_J7Ea4nGRG3s8b_#oG03A-6xff1y!PXQcW?bupWvbKTmx zrO)i`N$Is~iXp}StL;|MhziYn7^4Cpl?I!sEmz4sb28{8HnfNTl0`G30Z*QWn*^BFE< zCIpjgtU%g1_D-6)^+v-2UN{JrDn+cWqEzIt)Wcot@iHLQ-i2YS8hMj*@1s?_l|5cVgPI@WT43Yv^7BqLHf>c zg<)#K=jt0(fQf%kZ}(GAwmfc0+!9e)H!v@AH$T2@ebeDi>R={zGxoL9gDn5#55nP1 z+FY)%AKP-4qn8V0*wM~H%tscNA-?(Ih&C!uQhe4UhMZlYpnrWb97 zi~>Vj$zW##eadpSiX3$}T5>_-=40L}_Jf4n8Pd2_28=!8(i1exCpz3f`=5)?z}1Y# z){Ug;Rwq<}B6+w>ySRi&?~PFB#H_2%0R43V%$76ORhysUZh_nb`=c|{wte2D1gs?) zeOo4njR1)*B!4peSRT0bAA-RhiPWMSmtFl`l3jKK)bwrM@U|D9lSiszVcojllle#X z-OOp_pvBF7V3+iYD^NyWTBjDGfk$fVdk)wC62A%W^h)Vlf~TP$uTfQW7^=3dHt7vB zJgIlrqQRvYZucWRLc1099lp|KX7!VklSjwXt^R2IxPP}?>7Z%off%;6%IIbG>H@Te z@UJT)dxGcXd<^t$S?8Qc>QC@9mEq4$or6BzPtSsfTOFS1)r<^cN#>tqCC%$kVDZAO z{ocq7esJ<{vJ)T!qJ8bj+8l;d6n(=vgCPW{fR7bQFzUEb=Da5Ai`UNW#~cN0#TcR+|;9Q z<2Lam{0+_=1M`MfZ?jS1O`~hG$%IrJm60$CbE&`hc{UZY6Po zc470RVa1m8>|G{b%(>|t1T`$Ra#j^e3Dc}DLFb+d6c<}QQcQrDN>w3D&ru*HzGtRL z-N&17U&Mcr$ALY(tDC+#N6V1uWu%5yRvAqexSz7tEAY&8@4}!lj*%}|N=od86-wFz zzDR#zac1nRuBEjezgOkZ`<@rvT+9NE|sM` z5K`vkm(q;F9e-j(KIoUXFUg9|VLurl5F}LO*6QD8Z~SluB^{O<8`pGXVq4IiS7wc6 zI@C|qn@94>msQr?G3Xm4C@I{W7MdcZryAD6#RmPbJZO;pJaYuTY8{)}m1XM=#*A}p z%rAdfdHqyAxm=w|Nzs&_llHB*6>2 z!R;SxVtVTl!iG(#?enRRmyE}b#Lbi5)hFOM=9857Ey)2H$QTfUV68?Q7rD61-15EM zF6*8}Nj@aNN~sP*_=7nS8#be~m`=R)Ym$EmFStet;cEQtJ|PW|>x%I{sXHwm{zci;dNLrBjA$n&b%E{O3b^@uO=EdT|xpb8fcOGriu716h@4at~L%x=mcD##ivP z8maGduA&c;(?p2<#vGE8H<=>U;`(E-mVQl+eVEhZtvaV%+EU&Bv|&QLOM^x}imQJ= zTA1WiPqrO;&z4dTtVVxMzaOHN7G4(J0GL!f1l!!2;KN$GyrVo+9iNAIi_5@)`Vl9i zgoCPf!vxluDS^dr$F16tiw~IHIai9~kBGAQBkyZl>_+PutqgB{T zzJ5>s?WdEETBFwt0ZE==kLs{+>S8BKv}>K!%0k7=E{E!9at7A zWSe9gxLo?P;GOkOPCkKzS zDTJ=iA{R_EM08kF9YSdwe)9Fw3cti zBp2_~%3IvTZVx(VOgiH)?gi1gKtI7<4bi${UXNjNSz$Ek<_~cG4(&5J-qZEu(MJXl1 z94vflg3)wy_l19U1Tvc5clX%5YuX_1XXc>bv2mhR8VFr(?OFej7H4E<7P9nN3dmC+ zA>H2%xe;`J0XvZFJCE}^DPYsv{#us`_6ys$YA#|-i-bHJtG;SU`Ui8HOLZ8gHm16finOnKoMi z{S%sYh=ssI;(P2p2%L$;lM9LBoWoX9Ml$ZD`6c@Gk0^zN&>h0MPx;Y?kKb^kHXC36 zxQ@M@DaCBsj*Scw;RS7)T8H||!PaHV@^IP!9I29w-&B$_Cmm3&ihiTE4#+LDapu9v z-zah;wl9DCsZoxCd=hlxjCt9j=?N?zslt4FMT;uSOe3x?-UsWMM!>Nva)vY+;i#-5+CQ%6=86Fur5|(oFCE%C#RkXfhr-&|(Fd=^WU>LYv z>$87#;UwUAQ(O}&ScTeBdJtDw2@`=A1@O)ww6dk;QA`h&SzLlFXu#tN;Sp$iLcYmk zMoWLg){%OvOE6;N2K+&6Exj-?9q|r8VZ^H*N|9RbzHYOYT~*)z4mBF3C$&Pk8{##J zyBpn-8#@D~>6+6v^|Zb0yh;QqM4ptB{f|nlgk5~5=BkT1fMs$)kDI>AUCROM5KD(; zwBdDF{u};xO>f>TS`0&15Io-~_=jPvFF1cTob$sv7uv1_#psViRuXVdEtg5Aq#mL>6Yk6r%dB++I5SYPn^M1&;RnuZ-@3)w3r|-%S;@L{JDP? za)JX0F3Jz;wBGbRx?6CvLraXO z-`IL~$&UqI{qSMl<3k_T`+@2@OjffKbj5M?21EW{dup6xTv?Bv9S6_Iv%*%BJ_8L& z{u1Kz#B~I#W*-9pHMz&kCBH@usAPYT%w;jKCwmNOb5%P(u=e!0FWjAc&{1!@pHj+y z@Qv2_(Y%(XZF6F)hq=mnBZ?u2tPE)#DOeeaDcPqFL|8{V(%FF$$*S6Uu6B$*<56jh z*S_6LYnzbehF+q6>4C4oV`0(xi#}G3B>wJeicM&GU54EgpCkb1UTZykd2@f_f~9AI zwWOmvAV^ou!ALUS>#!P&%pf6r(beXB@W5Y>z76%fZ6S4tC3T5kLbWTzKa^(+?S6sa z9ex@E&YXT}f^@0ne!n6#xetHlSc~U(IH$TPSmaNx1~hZ<{HX*vEbsgiHOWi7Q# zj*v`$Tj}uNogz*Xc!~ zpImtExau2MjKGP_U1bkLvx~OudKn+r1Lawsc{mD&f2No*pp12LsyR&OW>XK2kFod< zCL@#gzcn~KP<5IoXU>2A;sipjd4&O(0VOmgyEB6>5A=SuR2VX{YjsB6!PQoC;c}2$ zTo2}{(*7)Wf3yv7(4{|q`o@R86P@4ser@`Dym8y$n$`ZcK|g8K>dfgnp1hS^{Z8UN zD; zz9KT}l@L+8jC?fP9n!gM#Nc<|)8^+rj5>+GC)OH`(}40{Yx}xzmk|*43%`z+b|hAS z?{qht^Ij9U5gYxWBvqdzyG8eo)}Ty7(OmdCrd9CdvMvZF)op>(0R z1o;$Ww74PPTb+M8+H2!uYzMja0>S(byyx~BBFvIoCA#DlQ<9peOovwOQGKrm+R3-! zQ&Z%k8}KK}sjHGj#q15%y8(%Tlx=Bz1?W(acke}%iPQK$8LeQ;zv6?$65R!1+;2<| zXQ1aRr-dgwHyen^pYiX%AN?3<$^maB%pF3ItcXM&TnT@AmVbP^=o$D`a^Y1=BF8Mlw8<5@UL6^})0@R_bW=moQXXd& zRb6zWAZarqeZKLa+%_%uLxRNSbD8B$1g+ql+Q}e&@oBUPvdwmI@rYia-Q6l=>5)RYXQ~|NBOYK zX^N%!G$7)oC%dIP(V)r-Ej4ZZc3?+>+f=QizCoR5K!a=HlYA{m=e%Ei3jt=1NYN!L zZ|%4bYUwqw3(u09aFQe#QUaBD<*4{d)SvPaV@ZEwp{uhg35!}2oqbxC;ae^oLtYMiAyUp6tzt6#eidTK%ZT# z?XmZCWOq6MO+M*)ssA(~`VR3Nh2#8sQQ9=Lc&9Wn&-lJumOI1g-7pd*2LrA2wCfOc zG{k>{6J3>>LV3_66Rz9pk>{hiFBJhl!9^^NA^n(*qvmHqgyVhfIhej-)Ag&?^$cj* zQBWDy>84sgY#Qr9LA3I!NWrnGK=5(ra`#W;J+*7UnK9zIT>EiK9M9!-hn)2ECq@V| zviENUHJ>OTAr=P?b{-Gz^U;fpS3GaNl5l_bDm9<6aSHRG!{1Z?GO=g}9=M4GXM-h5q*l&CD(=&^&C>IsG zwaZm7gR$@#&5a)y=VYGq&>R;x7~JxDv7~|s_Icr;eec+Cj^1aXn5Sz%I&lw=SwnyQ zQhdMTZBS-FGq1zc++>1Am}&57=yC=^!oN1MJ+%hQqqm)t-2%1lhAd2A*KxM5+}@1b z5bS!s0ji8y zU#bk#vIJwsih?kW7R#`Tn8N4ory2*OvW}jD+r8D1FxJI+&5W_-#L^Igw(CqNAz>{!)XdK!>_eurPp%76{B;wAXxI*3byZ z&s&L0dCDfFg%_3{hbOPcBtW!1IR(BWQ)ZtgA(b*E`wLz~-l!u3EL$JJ# zF5Sh*Ea8kJ;fbMyQOL25EQVq#BVoOg?_i~hH%~~#YoFh7Ulvt6kLdtmckf|$4+b#d z-nAh{1=-9eVLkX2nF}S#(FHHS9D;&4^4w!hAQEw)P%_AmE!E?9CglK z5Bb}Y)ssg0wJh12hp}P^7ltPioqUZYBC|+TKmwUiH&TgGXt%iWyS{w9D{!L1qTxpl zNzfJU1V@@0U&cLb-t*n8LdK#Q$g^AP%H|# zMP;puK^2M&NpOHl~>Wl9U02FzT< zREgPXy*X^8@TZj$id}j7vZ|I|Rlu*uI(h-+sfkjp7k9ozK~*?9=h0+bAWfoT-uSl7!M5~8v*f%hh=vM%Z@fZ0=P*X}6D9O(0m43Ns z01_-Pex}h}f%#WXw`SQ9A6lofM%}~_Cc84=`1*fztyz{5>*?y;>?(glOQ%8RJ;%w~wITVz) zYqql5t~EA0Rm>GQ*;n&ms=~xqcR0Q2aShS7B~CLzVug!x+^1v6um<{(bG+q`lsz)L zrX7D2Cb|>R-W{2#gt9{M{BU7=23KK`>4%PEA5IlGX%n}6=!oZY3?+W>-Un#t1{qn| z)h@J?=WetrqM$Y`=lZQ%7=~%N@Y+18tfQ_Lj14@8vw#e_!D)>muh+%tdN4b>8QdNP9#OE@*e^ag>%6$7(x6~8wo zOru!HKfmC;8U%QAna8F|Vu%m3U3FS#b zO_oL-V#Hi&oYHeRt?l*}RV{)?q;n$br0)+F2X~s~sE0ggMno35jNBb9cAZmSXrh0w ziK_Lb`{~oeULsO+=`5;__!x_F(jo6`GCljTkDKvJ2ZfZX0 z<@sm>bDn3ZhT2o@9m1S|5BuM~v__B;hK3UymVWitnv_TmqctY9`_G|f>Ggl??pnAA z2)c!kf5Tsphx#V1fxda+<^^$y4~bD}_uR?c%HN?&6bew-mpP0S3Nnw#`1e*5oaBjRYQDjHuxV5K9wClpCE; z=1$`l`24x!BiYOI$Rh7aeH(v+zOhl%y_XSJ=NbSx{YWE0v8Nf76i_F%>I#Qczh+po z4Jn1Qs5b=rO^b|?3XSOfzPJKw+qun_UJ)LwZ}6lnZZqbAfVbSy?2e^#nw~=AekQ;_ z@P@1T7{aC>1R{|2JoUs)3bvrRbEMbA+7Z+C-IE~SkN#;^7y0ihJsvw7+L%m@^YR|0T-QRlhGX0M#vc3)`K5xPS z4wohJigB;3H^sDSCVYRw-${Th!5OUCA5iIv`aStZw0`mJz(>39sd<2h?ixo(LJQ`f zR5DpY)Tqn15d~NF3ui#I=h4-nXQ6vZ+gZ>9Sa?5L3hz9WR%RAsReXO6;32v8JKr3c zsu~)(GOZ^A_dQ=kqhV!i#W{r3@m$e0$}C{qv@#56w?(f_=*GH0!5pm+R8< zVTrbO#d(m|SnjUpv_O_QEcTXP3&kfjLtsoLvT0iT#uN&bes~;Z#3diwfGT zmWl(s1)qMB!Z3eryQ?SAdN@opi`5OVKUNp8Lw`ju>v{+1F>@CtX6$u{@n;j~TShRB zB9B4jlv)z8XuYPN@i#OG_&%HzqDjZ^z3!T}FvV)Cx4IJA;9jG=f%J69T)B`N$sftPHt2Rdm!8G zY~vhzTc?!*TPP}5U;nkBm*+|bhqGgHj5syJI%EgMn5zbEDC3Hq6S~0Hb?$#(gD2Y^ z#Kx=gqQHOH%vgb*#{aV)89)Mw9Y~)|(_%QAsV>}~@zCLCDV^A{hD<@Is}enXT-sq> z0P~j^eY}+6xh}G)zVj8kf-==YCi?i$C<)KTcIR0{b;yUEyC^i}GrsW4lq&YjUp|!} zfvo?I<{!JO)*g8!7SjuGi7PjDm(XEOgsfh^sGNVYL(?RdA`4X(;Kev5T4&0fYMJ^I z?kKPdck&2U$$%(EZCq18Mfk`44iujw%ijq6hat^YLE6So>eap=Pd5$6;hlN4|4d7OitJrO1(6SdsvQIDF`eO}TozP?yG{p=^oy&9Hv+k-z#o6?A?K%l z`k0z;2A&x-)Q+vz4lJ|VIEn~ztsd2JQoeuXs587nU<%i(8Hb|PLICMkl(uP%#zGFT z#1p;Vk2IXuFs-Bn2W>qrfw2{myx9_k{y6;OQpb-_0y#=;$LR)^qCto$^)<(hcc5z{ zCxqVAv0k;#P9mN3hc|mi&VaoweUuXrEj5IGlLEeRj)L^2OmKvux*9X^L?k!-lx2U# z>fFn?Y#&Xw$1-i7t9CWS9iCq^oa5w-XH2u&fV(xhcZ&-$ zs_4?E$D7nlY~|_l=S*?qr!WunH-)m+!~xSA+zz_~CXc9smY8ZMFb032z_Kl|p8+kQ z!M48Zue{uy7t`(Fnf=2RNSFIr7pKdZ+hJovgqh$%g_vV$h1dG1zc(QpEDXP!(6e_p zb#4m>E19yLGc7)4wo_NqVN8UhG|&trH|s*tS5o*KkKK3es*26Smr1k*+%N9 zZ`P5$xh)b~X>ovi{~(TFFsw8Qg*Yt{3BK^WE?N3OqQbW`Vnl4R<{*bjMHAF4)#bBU z_(ztxTY-kc#4&$>AZL-1@X$i$NJtG3Gza{CD+lqXAG_yOxObETQ@mnK5KM)PRop(0 z8|^CkG|E8|;{uAf0z{$k08j?tPW zcBi|S#Y-qmZ+7tJCYvL@)t!~FJjRgCzQ7@&N(jo7H2%yC zibZ&yle>S>D@H}WC&oAk#JyqIO#NT@6({Qb9f{o3hVQVB@S~M#4WTTQw3;BY6IKgY z1aXri3qRmi^YMkKT*kEl+_<17PZ#wyPkG)4A{dZ(pgj`yqYoXBdKVLS)Cr%Bm|C4n zS!G~0)hw0pE(aM{5@~#z@ReWknlZ3bC&h%DQPzK8mMa+6-$qA|`8626z0%TZNwK|qbO zQQdjlO&EAM!Qg9W$L)J1O(cCDqj|(&Re&Lio3_(YZA|GPCO38}d`bKq=K35-*0EomM#-b?4Z5CovBGtlaS zra@4>UM1-x-4Z&r@oxhn;>Ig+py-rRfP$!*vhcc9Au>Uaxp@v#Sg`bN3AGYg*Lp<; zbr+I)v;ho$;Yu!h$*Qq+=1>zoMfK_SC8+n%0u(W!KO1O| z{_f-&20RccN65}DZ#a!H?}f}TfAs~Lt}$ zBVjAV~P|N18kUSgXC;BUY%K4}`StPkX%F&5W z7)v@e+Q&W0?ySJd0P*IK@KDL_**J?~vfD=sQS&fyeY@!d8M1NR632g-RY=zu>f^5( zZSKQ1&@t-g+nX)E4i@EaGmD`y>uEjIW)(bP9_HX5EAg?u*^-1gf5EenE|H_lLDkp! z*~?kyxoatvDVH>uivKZgwGZ>RV#!K#dl;hQn!mp`+I2=YdFin3*<_O&%YhvYYg%1w zF~mBYikxB5N0&aQdn41Mw$`yn*NfNs=(_BE=qoO51JP?sa_JCLAZxjfdF$FnI#WsF~v_#qx&%w2T|I+JUps|}Wc%wx- zb#=~Wx;o@X0OC}X*spz{aYBe6?6G6m7mN_>|DmhSD^$i7w%Q_D4-jaCZMRbB8xwKI zm2#{V|A;w!Xv=>-_SiFx9Bs_`MwNn3{2&0La-NZ5AnBTSo<;;sc}j^s{~BD zVv}f%t5J!>2ZVy9P@l4%y~LdFIZvNs3O5{@5+VMffx-Hr-mY}RAz%89?jkj|zr3vR z&BP!i;8TGFWE;Y09ol684*`dnk$=U1VK;zK^%s&@q-1{%iVevih6ESDwgUZ!TDd;^ zTD}@+07Q;0pmB??imT7k_2y-XX1kcE;wG2I%=r!(Ols!GA#KFI&1U>gTq?po#|}x^)W>L|0q2cX|Q^^p=}(5 zcK(50zfOoHw?tO!yGx%iYK45o;K(qPR~fOaQ_ z{^`4Hig{wjz0EOz$=>qNIu(H%7h(zy|5Rcd$)&vms|K3w0M}e+4Lk%22hx27IiyY0 zXJ5|*P%fkt1Rm$j_^8X2HluP83Se8<&TLybpJIP)&dk!3?OaKqWzO5zCLlkpt6>*K zyKJ`5!y}Sxx$EL#^pP#7AkIik+wl6r30}S;CcGWpC#*mYOx}SRS#TsYtE|Uq4{Mj> zaKdHm>$LqOB>i%fmm?5GE}Wqf>>rixpcu-98|+}*_WZjb+I>*cJ1BZxXX6TRi5z4< zQ>uSvEhN%KaEP*`nPK?G;vPMOL^`B~5Q%_0aX?r>wD9K{X z_XaF%qagxswLukz+TeuNB+yXx=z%}d7$Rznu!?FxMmA=Dj~1-|z0IPSVFI3k#d5DS zsmyzam0FDH%Ro-2nieT9P9|_ZIc?nKM#_J`k(NA2-Ww+zoDPMb|X* z^0QYu@f_wwa}&Ya3<8vOVbP!h8g;p@-(}d#Oa;|fbIm!8(h`P5d)8x{|7ru>0(6=N zd5G#}t!wN#I1$FaRy2ou7vtq}=x>-HQ{(iQTxRY-7WD8OU%m*YBJs7G&I2=CQGS0% zQABpXY6AAEH}eAyaqd&@o`O2iYHOgG#}pqRC^?^P|H#1M@lg=c=}z%iSgyY6m99*w z8^)K5rGg6|BK@n5@1EOdsTLo2uKjp^;2nDb)U5#F7*6jm7B1pk7FI(wV$)U!NSNV| zhtA%Nhoj!_!2}lI*FtQn+s(P=pcH>!C`TOQTn)LpZhN>Rt-5PK&%FJdPsGNZI+cJp z#S$j}mtnjqiWeR))lD^-R=Bn~Pf{94QaEm*Tuk$gz6rciwq1TfTCzlNRn}7j@x4FW zB+l?jJZfgRiIZHh^0`-s03w!^H~lrPC=W- zFI!_=0t?owJ+=hBDsU#iL%ApQ(5JRQI8AU5#Tj5$1g&Dge8V2#ZnubMG#jv5`+E^y zrdE<(+nx#k$_UpZ40gD&u)u%Ez>`F`I~ZZXTm7%08)NIB;>V+n9fGu)RcGBgRVpv{ z{}CAh%*!2$YV8p9GyYdqWZ~Go0`Ut|-*S)Ah359@gs3rU;pCP_bzU~`aUoW%f;mgn z(xn92I+#%_6!iv)d;AI=jxt?}>%FvNKnduJdG|%B#l=<9jk800)f<2Gy&~);r=^5$ zqgIoZ1PV})>bWLqfW1r~_Lmd898{NZT;JA2Dpg;o9*1-0U46qx_6qy%aj!IZa1iL^ z6kkxu90(@&3D!G8@_{Y;@Y^S#pZ&=T4E{>y7M;w7uoZRFsa=XI*~xaGY*cP@z=Mg<4g}KS^YT zc6%W;V71IO3JLbbt5RK>?JCM7LG9Jw81ms3zbL#SmjE~N>>suBMcO{wE$nG_ieiL2 z<_%M6Go3c($w$>-D}P}9V`EXn<%z!IQ#pw^E{d`P7Th}{Jab)h8bOY7_+M!#uwfHm zWBZ?Oh*ft1=!}2O;?P>aGMxY(cqfTpvQ^5_6tHNYO8|(0l8t`)UbT`n*0XXJEwiZP zKl#SxOEYs{%%^9(v8v5YhtUf!bNA^2_$=~sWDpj-zC*X#sBt|(m$H{2s8 z{-de5GBWauf>-~17>oZoN0jxs?$tleP@s+$50YY(ETu51HK(^!d1hf3qZo%TD5x2k z;Ys^ccD7=zY!hm-g!L@Xq~2bZL$cGtd%I6gwajFdR5mxxt(_8G6CvV|a0KTOK|$JP zpJ48aqA!0w?*_kNa{WhQg7%70u!AacL5}DP@i8fp^LITuHoX>d5lJ1xVfDfRGEt3? zoOjg$uX#9^3>C^08*1j*t?pdf_^9CL##q`r_Ss6m<`+`F?e!RZ|2z|N>C6JYsXH}( zdXcuMd{7&TC6VI$@>k&lMEiEtb5;lyo2}jE$jyHjgy+92u80>goLA|Mjc!=b;x!dB zN7=&Wub(oL@AAmDmOjr2N2iETwb+;Jw<&~gddRV_8SF4n#M8Mp4bCz3$BDCCNVJ|p zGDm`)W@lf0Ms|Xm*+U*^68w^!UY_q%~#E9Wj7tcCTn>apnOP1o=c4Mvor5O>|<0hDzANB z=FSP%6F7}v(Zx&kK{lO!Ho@lO{{BEdJ`56sIu+gUCR86ckRU=|E@^oe83|kZw=R1w zMCNW_pHv|fMla${@4nMBCd^vtnw6XNU15J67`XWIJ$KkCwgn#D`z;7zibB!d|NQOE zXt({)K}m2@{LR|%&+5bjew^i_#1r;vnQpnrp{&QhMkiv}s<+7oTJ-MD3yC#Kk}2&h zEuHW#6G2tXik=0|*5-N-dXERG5z1fG8;V|yyrdVU+42+9We5pR+-TwY+esY& zy-;SqJe!7%Dxc({KjbLecym|WMqPsG!5m!n+oT3{RS_!Ivs0lInk>Lwv`- zE=NkGmpk^uEmxbUU^&7iX=~7%`D2=042*+(US?u|P!<0rYIvuHvjv`PzT?#rTH+s-+Y+f^Ep>^&Z<>8*}W~9JP}H9jcMkTGl?1 znA8(he?_Q@aGEZ$F#eH7nzumua& z(^{a*vry1}HJ7P!@kA78Jo=NWDQa1pUGe%Wu`!pLJb98O?!~LDG{YJY5dxj1Y~p0Y4&2y)`uz2n{E$sJ@(8OP1?kD0)jD zH8kOlG9Q!}7q|tNTW=%U7KjCJiZ4_OHRN6E!0lm@Qo}LC)g_g2J^x?}T7drQqCln9 z*toN`@pizH5e$EQSlauAtI~e0^IW^IOW=j$WhE&M!Q9ojv37X8LJeg&S-Mt(;?dBt zWWl~MW317Us2C{m-8V^FqyRy9Yc>x~McT5!PsgYxyMp*MgpgOcuewF=)#;fes)N-6 z-6^yu{46OMWRaMhWhZCejtg}Ygz5OSK|j}^A-G z1M3BXyG4LZf$X^fyV$uo43&ERhXVjHuj;@-GoVQR*Hw~M;BRsNeW0$X2NTfiP0x+} zz4Z?omZE=N@`<+u8h%f{{1KIhg|d&)OTpdc6!5ga8~Zl4zaHhVRa;AGp+XK#sGiWC zzc1NEDOa~cz;728f;BRp4qa>MhxcZATH+5=mKhn}^}j6F3~@P( z!1sUEzQQ>e&}c3#**^-hhqv^hSW^_kbQh;yWlTcfwqu{g)uF)8Xe}(U0TUIa7n`YDRl#|OS4*(W)&P81ZhIKFb?C>1yH!2Bo z1pcNNT2m;%dZK|1vc@NOdjIM4Gs%4SEKvh%-p3j#-&0jrwVdJ%SgBw;Gph|mg6@Co zuG5OD(M@mQ+HP_^<)`3BA#vu-MOh+Ivw9E38mKJWHoWUfWR;!lIwLVFd(-%?y5wg} zBJgABS7w#~YeFkY@McGjGs&8Kp@{pVY0>(Kd9g-EDR4nvV-yyb!KSC#R4=vWAi>z zU1)fJ*V_l$G;We=-+P{(!?h|~>9u#GOpk!%$&2njF(hIPMWOG4TPJ=#i->=w%Z{Il zID(uBYzz1d=>8|fY5-gZ2&m?)V_%8j_C*lDQ#7p$kpz-!X6bfNt;ip10R!Q#c5b8( z!(8JAW>5CMi~6Z)9+7^I*^a^Wq^ul}DGX5f86pUnEFu7-EaDLU$zzkHbb(H?bri)n zecHOIk{I)TE>2L+!PU&R1@{9y-{zqpd#oG&oQQV$8KB~sxHk7g51W91K@1sc@; zGL=zm_H{0_rh9Bh$2aQTE(U@76L!N6nl1Rvsi=@cFQC9Hn_gNNMoxd5Au$M4wJ*T} zDqd*PrifiGc2C!>v^UMMuWJC4XazpW)X-UW7l7=Kmo*l+Ofvuh5m0-94wQDOW_?pc zA&PrKb+oQrGkirmz+Y>>PZD;{Cn9S7@<)+l7cZN$TvcxlB#8Zf*#R;9f+P(?LcAsl z)6q8N(Ql==T5x)U$TEtcRgiQaItlWSCsId z^zBYfoFqc+_5oed7brM^eKFO;-ab$^>Rf5-#w5PMsq+NdrLcI9o}7I6vqw(!k+C-X z_JYZTIx-e`QsbGqQ?>Eyw;WgUY>eH-qzZL3)yyt5a~tV{fQ9?teIH%Ghcnp$pFF_4 zaS6dSq%izWTl#-$Wp&>u>MH5I3AgVEb1KZ2mU}1*Er*I{69?&o8n1K6a1x=X9IPY} zl(H0d=JaC`R7TyddqERDD28Gm0>86w@T&1tL(y&!V-6@f{L;+qN)C8iGg`X4^G)(% zMdGchRXZOoI%lbJPQYSazX7s*2IJDrt}KcK zL~YA;MjL?`?nGHS2KfNr@N~pw_#U7h+LE86e#AiwhsA z>!2D^5L`Y!Un#(U9O?$2+KR3z(X9ViPy{uc zxeDfOurTe3SUn9;){50YfROYX|EtA%4M2VqHh*8KYRvPF!h(auLk9wj79X#h&%`&l zN>m}z?KIFs=9TB?y;dtB2b`x&p{o+}Yeb|U|8IX)iwkAJyeY@m)k*K*dWSDz14n(m z!uTKc&FQE>cXOheDk9}FnHp;j!pa;FEM-1nRDV`CcWF6fx*BU%uem&{562(hm76^- zQHNG7tEY>ghCt{pe+EyBbo9=0Y$90_YO+922Kssks*^8 z24;T=#94TJv2>!H*;4t1CC5f{Ho+&gn4$RoUA9`tx?qbFIv^L?j_a*oh$0jyuMC@; zPpGLw2l~O)xWz(VD*8+kbPM-#N~9mPdsZwQ2iNJpb%RxzZ2TGul=fgio$b(|#6Pv3 z071lE2NvrB3N}If4QiXXD09&1R^!)cc?L<*(;ZC zpPGL{OAK1H#TJcb3<-S?c2j+XTmIjJ#)lt{d0N#h_n%M2vK@IoWEjraQlL6ANte9R z`g#qS-34cw8-M>!5N8FCh)sSWy&foj08D2Gc0e{Yiq)?eVf)5urpf4B4{h5H1hGHyM{xr-x6-f#lxv`SC39Lu@uK+h5cBj3GGhOZ=zNZygQ z<~FCrj#URT&aRZ$4Ds|UR_|8Z-qC+f8k}>@|8xZ)%jDvOg!qf8TvtpNmNy0)NQ?KxR;eRaUYAifMX{HHb;7=tiU%nLrNy;i5=1tcc0y#T`b(rY zpnJr?3z;YEKG%i@HT4lXo#L7Yq7<& zquZNKr)Gx!j5lKqGKNBU4)*csW&6P?18?cp!~L07ZM93;W1p~zGlpXxJEX_tX0nC? z%;30N6W(D_dX|%XMZXc_u5N#>avH2dbMfk53w&72x%+tM+seH>wa(RL&CiH^i`j?| zlVQ2Hj)r3l(kPlY+b2ilReN}@zahirByWSSDYiIe`%v}hpF{yL?0zsnh-F^7u)Y7F z3jK#!j&kQV^Fc2EdJdqvz)TzOa5w4eVz5KD4rt6q#bA@B#Mua5=BZ zeE|jFXKWN;jv|pUE{7}7mf|s8$*rBH*-D1a?Xf+{Niku>N@mp1?&d!#>|m>UP1iuu zrzIG00ak^uY{NroXZnBImu>K|iZH`R6R9)5zd_FAtwQH4d1RHi;89xBAw<3E<_q)^5zEi@EkBzDKc3(tdKhDeEnrq zUC-|a3ghms#ogVV;_mM5Rvb1?ad&rjm*VaeXmNL^Kyi5J_xHcgeRtnvC7I78IWuRS zz1N&fVn}GpR?=r9FFGcdU35`NWd#v_RT&b2fw2`yzfUnaBIb$G;u-5kptIM-NF(*&D zLl8KHu*Kl$iyFZPqA?Ca!YoF1cf=AQKMPF7PwkK*>Efm)_pI(48k~^IFe19hus?LE zM<-b(>(jTnn_hfHzUN2&;YA1Vyt8-fltvdJLtRbM4`n{kg;6Y(AV{U6kO+kJVlTzI zWaHN&VQqX%08GE@D$=F;gl+BTzD31mwVKa+J)DEojf2NGI*NYQXU?w8ZENYn05#%y zdfzrgENy;atPX4{QW7olo=azrIdy0q#G2e=GBaLA@3qr7)B#EUBa8yff7|F=nS1|^ zZ#34|W$(|Ae1ixz9_xwod&UC+Ah%_{9@!IC)%Yw98{RYNeBzLm;gI?wxR6^?rN$7W zaxedc3YHx$Q}WVz(90qp3<@nPg44N4tVsufi4u}Ya^?cjK>}dOFSlLTRSMe;{25DL z=>+diXCy^e*2gii9stT_%*O56vdKM(Db=fT`=F;Fc>4>A-6faeWtg zl$g=VU$4ebVOCT+#q|g<3LG$SLxqs&wx$DPUCe*(MKQ)P2)r$ulW#9sRq2Z#jZwP$ z_1!ul*?R8o9vSC7P)eC|32D%9s}&UtaDYPRjm}Xvhg@IQ9WA(zI=^M%b=E?v_mHQ2p$6NNkgws{P9rA@}g#8m^_I>*7>KtLgh<96h@v66D0QQ8cBHi7AjQ|d{mW(z z!<@t^ZUx`zyf5(M(OuO#dK?JKH`?fqPH2blRbtDWN;`sy;qk2AIbL0xw5Ve-8Ao7v zIM$*n6aP%NU`R2{J{Rywd8~m{jah#MO+UHB+EL!%MEJqfS4Hl(=I5H=6Hu4DfeM@A z(}s%B=D>mQ_A8#cj9qh@!s?pfo-;j06!7!0QOgl0*bQ z_|!NTtwuFjkM3?7zhY^}v-MN$1TOYl!E>nx_(lPY?rXF-_=mcM8Sc&APNJ?Uuv~F} z5RSo!BCw_uKn&I7wJ-XKlxxYO{&M~{X;;yKDPd35v~aG^0~vW?g!D`PDWzgI`qq4OqOPOtqiruRH;mutvw%UMQBl<#kzL<0SZei9be{|%I zvRpYklxeMnX6pK7y%XBhA% z#m4c#D7bpo+jSPgnq_LYPJiR0$kD|N_O#Ov5m8_EThaWcv}9c(wc_>S*9@cy83)nV z&=PD%a4=(3*A_AMdH%k3>6s{@bRb0(pX2L5yr~+Dl=dW5PH%on^M?kjWfA4mI3yLo z*Ioq5S_>f}eP}{O5zOdd0NZzk8L#{o3=T{wHJRLR^d*yF3ja^l-jdRX0oq^73*ndS z((No~4WtJYs&6XlJW(iWHvYbZh6S+Mbu@@vJz_hhMGkP-uDSO9)nB0|56*gCZ{$7r_C%g*8rmOE;ezrdGsMb{v+;P zzki~|0JXMB26?W~{bdHU-IPRm-tn`pWvp?u+0JI1GN0>ZSp_vYHU{FL5bc#B(`;mn z(yWTo&<@WNg5VI#HzT7tw|+`V&_CuKo9nI;!&i~`rZS`l(Z+&rMLr+F>eSQ;kQosR zAkRTfE4WfMJX_LZ3~g_NBa%Oe@B*ymyT!mdUq1 zahjj^@h@y!s z-(P<<5NLAgjm32K4bY`0Z1^J7$8^1ewM(&_*J*<4yM&VunDj%7l>^jip zzO`;CFc#(Zucv1qQsn68Lsg0sCI?OzCy|*4egVejdu7r$H_H#I;eL!X{$MN$tL<1w zdYd&1A!58SX>s*ws^p4fUIJ$wu?nOR6pZOdx>rfKJ07IUa>+ZR?hA*aWX?w;PVc~N za6ekMmP>^`w3B6n{aru={DHUer9vW3XIAW|Qel32mhaUwLF(gw&ogwU?Q5XsR3u+@ zlzvVmvMY@dqyr4t>{T<8R4~_kz|Vzl59>%ihC?pEsVoAN^SC?LlWoLi(Bd&b;*p$x z{POf`q-Qem-KZ|2U6bwgiU(cZIl;~pcV{%{TCnY!JD_v8MoRYwB7Ew!%+^4i)2IWa zw46aNh2XP??s0NQUm#<{<=N!IR@mX7G2Jm}%5ckqcuOX(oXVk%F)q*|lm1+9AsL$|3z|x~2=43sa8l>G=c-usP`e-Y zHOGpg@;_iMsG~&ZaQ&EJ(Ero-tWR(s(~Zq;G!RoW;H?I2IEl!Dy-lxuf~!sA%d{-E ztfpAt0UQ>K9kZ{EGh2eqWWGb*QKwAtrrjVyobzUaXsk>D@Pl}ALWgs_QV)3obPtlz zuFpR>ZxDXWg%Z#oUIr&`y3c4is<~_+bmwb(nE!5HI75eZ>VhC)pk44M^0LJI&Nt-k z`xxi_U0H!MhF=RP4`C>5l!fvw6Bdasi{J4~!A6i`;kFtWUlnJCIs@@^DjrC1mMlQi z^b_Le+54#s1oX#bu@?r$kVrs5b$kZibM50`X!X(5iH+0FWb!Elij z@ITZ}mjk>TkB$LawXU~)b9i4y@Zc&&1u8dx5xz+B0khVPv^k+p;(e;RkiiUQ7r-gH z>DF%wZlV;4*O%Bq{~8cj8%IfO95%?hE1B$dJL5I@Lll^{8};*mwnY6PuXP6d{HUIG zg;6PiA||VQuu9Dr^T0me)87Vms-fU)?Nf9|exxf?p*X%jI-`6W=Ygx_M6SSI> zJm*QWfh*?Ewpu8Kv3x{5nn^MP#)(wAUXQ~fl(SwXh}!QLlo0ypwvO9trFC+b{j#Pe zx#g6}D(zPfm<`W~DY8Sb!+yajph&DKvPJ4Gw++-^I9Pwt#^&DBoFsjR8i$|O?eRYt zMiYyb?Unlc0o?0kT#BwfgQ8@();r7RD4TKc14giY0}bKrr=)^7>mDj=Hbm)&Unuev zrmK$Jh`n6a1buqIJ<5rrS-26C;t}W)+RukO<7ShE{|b?^X*ryM>87oUQYL>a3SN0K z0x=zQ^d`o}Kd>!67_;Dy+@VgYyj4pgl1CD}`f8yw;vpg*UVQSsbz}n=Xv&B@`OcQp zfC)pAG8?Tb!nEfkV?8m5i7uto<{OFf5m0;{uMZss(ek{=!@f2%m2egPvHt=0dcsc|D7>afofX&s(i|&-(_X?Bx zITDMUCM5*=3@vzX2L6y1C98GR_vxkiFxb`I)+Z625`>|w$ddVRLx#`tohxqLj6`8> z-PbH63mb!8PS|fswM9~))y={{AlmJzdWcpSObDwsHd8`^gb8u$v1`IgFI};mh+Qfo2KMBj#J6#iEGd{tPM$Ox6Rb zJYPCy_FI68qzS?wW-53~+$auja}=&SF@s<-in*i(uK4R(&&h|f{XP=F7Hy>6WgrBO z*zk33z*`bWbl#b&bc{)@;@Grn%`f+FrF0`_5emX*<^EMv#sNI5yj<|ts1_5vA}MSI zOPbsfJ+5AdqEjr*s%b2mmm$tRNbdbS;Ic630z@d6kFF&#q zL{`|D0<6_%6-?;mCaUQT%-b#(a3qF@w4h3_mh)u;)7;1;~` zQ?geAv_gz7kk;}j60axQpc4EavfxL5f?h4|C{b0DcAL|9`1-H{#*afHFRzEgbFkB& z=f~1oFGtdRq|y8aEo10$km!6P_-7>+@?zC^_jC=cH1(OrL(gK6t{efIPpka)iG!3a zBHK*o-`9N!TsB}@-1yUtNQ1xAE)-yfepC}QdTH?}Bc}6q8=x6FI;Db^IdH6o4=} z*MBAqS^W4cHi!3zD);`p-6Pk)ip`g(&cKBKumOX0$1=5GsbGqh>tR@ra?8N7F?Fnp z!YlN#Ub5DfTECg9Ay!~NU2R~5vj!fclW+3z8GO$@AUm=Ikhb{IT&O-y@fgK&M&TlB z-6fiOcD$oJAkTuQL(&32OF1$KX8QR}-tkToE$YnUB__FxyAPdB zi2zCV!sw)#ZH$$+{__Z>kRr!3cp~}gT#Uk_z&dQ|Y{FYQ3D-%yF;eO{R1alI?cIb3-y=k?f*(f}AekuZp zDdJUot3NklB!wlUs4$Xc?7K3yvDv%znUCa7Wxmh3e!=W>9(G34XYd4xpgl z>rUbq-bw71iseqWqBNO+;&f&9$HuU>8Uz~EnPOC_YZh`0n)=4Zh8r=YaRRG}Bf-KB zIv4hn$F62m$?<|(Ih6S(t~GryDrtg7^Evz zN_{5r>vOWo)_y#{fi`S?Pwf^rqsAZyH=`oZ2PZQh>iEqmaIQ~A&zH)SIqX33L^+gE zx8*qiy4w1>rgiuy?nDPZh_G=>@J#cIW^0hM;gp+IE7;x7L>mu+9o}0ZW3tiDKS5be zt;U(5E7a5~7|~-;ABC_C?i`Xxn-YUDv!%^Rz+k3r^TE)!Repi70sp7!r+}Gg+a`tC z0{fJbjHl7l02-L~wrEP2O|VZ3Txs(XFv4l|>@aj`43sd2ZCtdU1E9=ls9<0iX;DHj z@@cc|Fg9&F3^3dO@I3$U7-=y=FtYy}h++900AprP6465c58w8QmjMT7W@q^aMQ>x` zhROUVvi>)-?K8U6eZzq!L~>}nCZ_s9BfIT(&%mWhA;>apA!3jQk*FaJjADof9}!S>MUU%!N7S~ z+0q=OKq--V*ty}DZ?SXk4Pqrqr^3w~?IwUO4XH@e4*miF&FFJKsuXlv3* z%eA(Aw)orQtoCObsd~~1N$<}-GZ`d27+)h?{sirAknULh<#}N(JP#eyIt-mD4nR(V zt=(BL7u_kFEe`S@XS2rijg(`9&!b&{TjOoI_OxcR9ga<7+>7p*qJzR*7rBXsH_ayn z3U-~P%=NUZ)1z&X!s)V{$r^SGOpE};Ny3?V(!Ja>!a53J3yQmAIT*bXP>mC3RxtQ@ z?+dm9V@*eHH3B(KQuJTOaT6iv%ciX3c1>x$gn`NS%vwKf9NoC58TKB_(%ds-_0P_Za@N!k%Yg|vZ0~6@v{9g8V1=x zv4BoygNk)xbd}qSpUoD55tz*85*C|Hh}8=8`f_s45wFP_C|`~X#m0{k$Mcl{q|o)S z0?zCR?GajCYltBLPF;%v#IJgQH6PDmFhLXR5kXyx5;U8ze1LUX*obK=5sD872se); zfzJpqm*K7)U@fs`l)})QQN>KPK2RnHF|Q@e9Y>)gBM_xD&Y1rRYQnt59RU#r8b#~{ z-c)nATviW7eoIWgju)35>RP=t2EyIP%Mbc>igz1x0-CDP<=91ZnQ$A|1H>!LiW~6= z-a%=VUG8gjHnfwlf$*hMWI#(kfQ*D1oC#(C%Bm#xg=QU>JFb0zvJbq~6hs-cI4A}b zsh@mG;u5x0M7?-W89tdkpb7+5JQEB7!5pC#qYn`&c)1Ls66TcLCEavbr}uUcS=&GL zV7ByVfqrYYCkuOU*ot>$sq6XWe3Zze=S5xzJnk(9bfICn#-^8L`1%$Tz;dOR(2}cf zcaZmt9M)ca>&}!v!&0{o80OCD3?FXJ1UgKV1$aMtLVsObIJHq*bd|;=Tjz)kORG2c zmx#gBTWIO2Gb3AXzbI5@>TiOAD5sQ-=BS6$XMS%z@rfJOUuBcRzqL`2Z&VlFG$eQW z8_;=970D0Q>OYXWPLPnJhg= zlYJX>*Hw&W=Y_w2!@e!Ee`#Y#cxj55nzs3oTgxoo6yq7?@5v>8SD_!b(EvHqOxGo%#BIwGbL3TEg+6A)vy-yeGjgPue_YOHegHKt;K+9$tLF$3Y z%(%=u0?nj05pS}dLZY5s+il&mt#1oKQ(2tVn)mBgUy8aRL}T>TQQ5)fL-k!iCYf-Iu4bo;lI@pi1tc&Lua;qsWyTcUa<=M1 zuig$fpnr{uRkAb)L;k_sRyFjNvbfak_A$4Y4Z+=w-9_Qs%*7w6K`3ZVS_5u9r`6heYUC8#Exaj-F9Xg!G>qb&bR1X zeMOciU{|H4K`bd27lxi8mJV@`2kV5hoj~aojEiI)d>bE@UB16(L*{na5wX`0_iJRM zq#si}uU%+n!EHy45IJtA{acJxb!cd233Wrx`F5X(K^ybd1TtLrUl7>Yh$A zE+rdR9fu$-0S;F1MTQqQ#wTjMp6!m#UdagqwLkw+dO4XKL(BhBs+23k|b*PMG6sJHj ztq*ZLyMacdJ*K%P2FxDUI(2)Hh4h3aM^dwj5-VhXVVg7mCdu4Hdz;bmomvamOyZ+A zD4V*N54P%`_=E`7iA3wd*sPGVpw3hSHX}#B`+$sqB2ELuxkwug96D2H)vrhQTHTxZ zyeZ^!IObe3)0N@i5>_OHftYAw;U@qNrBpt;8gdDIAa6=$qrMm{zP93o^S3cw77tf6 zSe!;#Oqc%nDr0(SH8@k_r1VfqCwuQ*8`>gigfI%6ub0a71L~qWtTM~i3c}3$OU~^3 zEoiQF?cfwInP~1rjhdP0lV)v7j^`4#VmWLll@ip58!Q1F@U6-zG#)q%3obyjb+*b* zym06XB)xezk5L2H!Dp{~(KvWLIJ&Bpf@BDAN_!(BT<SHkVFXtq+!4?AV1u{`3*($b)1^xuis7Z>VBY~jr64p#bT6&X zt475LMP&}5^PNm3kbfoQx5Z(DXiEq#u)hU3;89G+AJ~{4mnJRZUXVYv9LJnCcFQ9j z^6JHHmxM^gyiE8UtsY5VymNXCemwMOz6(A4*x^_6pkebSct+z-V5~hsC#sRJD_e(t zpe7m|oXpkuJ`#LYxSI~NxH0MGh?!v-QDEQ z_1`6^-b>nz%tNwLj!i+Hr_z?Z{&n|M|M|Yb_w;nsMLLiM6nT)Dj2X z#_V#vyL6Mq^})-}o3n{TsmJflN@zF`aa&J;^ zOjPoKfCE%hlSzVKn$S4%pQ9&b|J1yr;8#+j!@-k_3*z3XsP1$Yw+K0Za%T0e(bE-n?MU-I_+O3LgHi z4cHYkTjxZ%=b#m_P*GXIicu!4MDkSG0=x{hSEIozHkGiD;}JxcY|SzYva$n<83Qpe_I^%d5@2FA~k*a>SIj&Zz`W zNc{}@uaqvkY5U@}pUo5WQasNbx{>KXaj|cCr22^Zu7~9ta6s0CI9WW_jNYG*eLvE; z5U2E!EmSl6Ry0M|BNc{%hqe*|xUL}LgNpA-d?TW=|5n({gU(cd-u!CFbobHb;EXOd+};m;7Y>CSCzFRUrq{P z1guyOhcB$S2^FcHe4|UDHp zUG-%}tr$J}G!SQwdgtE^zj^A>fA^5uA8KB3V!s|HdI)wl@WqRTZX45m6`DBtkTm+s z-J7{N8?g1e$ppl*)c3<<_-Wiq1>~hnsTMo1>*kFhdX(s4n7~jNj?~$UrIxn2)-I%E zu@ZREgj2dfCC-c!R4;69&%pfJ^XR%tqV{AsY}ZMyt=m!Ar1|2wC0Ii~=@3sJ1{WiA z7XR4vC00|pMRf9;yQ~L~dzuWEt<0}@9KW3ML(&gd*o_*!#r}mN!_CXIV~6^A8B?5K zAtB|>)_TAAr^Zs%IH^;m+JH4#YKMa;e=p$X&hzSMNE}+YQ^{>!RCfOqJ3rmqsA)ti zzk(YCJrHU)K3dEg2MY0pAIg0eE$O*K8oeiF&D-nx{qBysA^27rB8 z749AlekFDpfaN>ZHf`pO(V!#V46l|gYq1e`7Nx7URV!PJBN7s_0cghzR1(kee5UWH zQnpyH&|uz*^b+CBQ|?pjXZ!aq^)GFITlD?^Zk*PaNl$5jEUqEeUI)+-7+yP{@#{)P z54EvgC=y-eTnfaoJgywAMV)x|umA^O@@3Icdnxhq7=)sK!oTjMSALW7z`a-p3wXM) zauG5d@Sx-Sczk@lUvWm?LPSCwbbf81KSJ6{x-|sfaM0}q6KhCW+5|rSKHb0%Iq_zE zVfOwa8h9E(yGDI zY&jDCvytEKn_}HxS4CDCsu*P_a z;cm2dM;>X`EAp7__bM2Bb$<1tH zeGW+?`2Dn7Nm^YhX8n16A07dH8ucs_GZG|-2`gH;e&;NGV}LxLx|eRM?Xh`9!?Z9beTTGZNTCBfT&{tIv&1?Q#w|1F zni#CK_mP1?1_#1aNA?a88YSFHa!6`D)G}$1j+`>!>3#U*q&HTw4g0|rrVaVGr}t|V z(e{b`qZpP!i86wTW|6}5m)zVcaBvowa2yU9VpdABj zL~>yZlk@v{C^-81nDxL(eY#~YZR;O;n897=3>P=iQq0^;+^nlW(CIvp?ldCv*aIq* z6$m$0$6Jv@KVdjf*zY3Kzs5wG%PX%W1TFNgUvI+=`dpeukj?8AozgSv-3+-3Z9A)! zDa}s==)O`_S!HWQlH%EQI&!xsXGctk^4c8J=9jW=e5 zLDHnUs(3L!edD>1M=I|g%?lv}t!i4%BaIW&$!{BRQ;V@U8Wg|5WJr{WxP5F~8{c~v zw#dsOxZ+aHTfb>B4X-j~cu&N^8_ooTlO_g1Paw0E{c%my6NeL5F9VCx#Q2Wldx}=# zAKnmOXV#cddJh4x>-h(-kgrT6GaW#SCK1C3a3xZ1dH_~g3e1`h*zh(cRLj*=!Crx6 z8-_ES^bTPF84QE`yBm8J)7)4f*5!V9@bb15^Hww?Hka#jmpFSHM9TXs(tWm~p}g=< zrg1a3A>b@P|CT}p-JtP$5~PbUpymX!-XElI!?3p*!~sxF&teP^xPq)-`LfN?_RJ7) z!PUG&cUx#p zlUFtIaRR!SJaw)eSgm;jHSdEo9grO#mPFt;Q@N=(qz&icH=(&ZX7qkQ);dN6pOV&H zKwpCEt%qT_;aZJ-g04b-yPrp=mDzdJ%+HmDREpO6*HG7D0;l8-73hv8VPWD|N%_NpP6As4aEl+61zFS9kOl zwwn_4cWWPqH)K1qlivnYO>@4zbe&AFd=6aj31sc_uf>#@WiZ_oBI^>_*qQ*(&|5xS zJ#41i9A8K8xVA06x!j!;V!2pxPoB<@^DI2=dXNm`f?-p~@11O4*fW3Let?J_56u1V zn3sd=zY|3i9=8AYM3I$;n=6Usg&N4wmW?BCL+qKYo0~^BvYfn!F1fCYnKAt0NX zzBb-P$OiqpGj#_w-iu6AQF&*iN#(PAL90wIzgB3>m<9B*8hN z{u9iG1eQs#+zYJ%W491R9pJ1y^*Du`e%WZrG>%^9xi{B9IGZ}`1=T7y<{rRcIrZ8n zva&7bZq;`KWMKB0yYFyINOg}Uf?jRtAC3`gZ4MTQ8KEB75f>hWn-MGTLeJ8($W7Q~ zEF+`prV2-h1x+!3PZz=OM*$X2a^O9NFr2lzp#zCLGnP9aGL}?X1({=p_@9ooqayw& zi_0Y|W}H|Q^8dkSQO?a~{tVx8QckTtmVr$euU9aC6bPVKtS9Y^FkIxW2% z1#E2xL^Qe^ntL#!A)X9fiJ7leP7h&!x$%0G=0HA!JPuaQ%>Zq-9w3Wfl!v2)l1`G> zqhv|*8y80~$ek0P_!`{q2__w3mee;Pc*yO1_h(-&5ziG(PDYuYERDFMktv-Vb69ac zKe#a!0W4`&(TZ8aMbo`CB)Md!CF>aI55?uB{a&@Ces=?-w-pNtz#&PNF!0j->BPT7NJ*2pA67 zerM;`5Z4Di<>e?{LD-5ShFQ?JJ}hS!%MfWWTPkdKqF0Wba31*wWRBw5Q><1(w~2Gj z=sUP=h|6gDjR6Ph37gfoDDFlK&OYl&t9e3(o4vjm(?Z?dJ^B;I+P?lTLyj&aDQz}b z9vf+sFP1&1Vkz&bL|Hn6xu&YG@AprJ2dBwx(rXv1y7^6iJ!U_8lHomM|T|1p3a&zbL#Oo3ZKUh?j|kh^^&XLj$LSF(M6^e;nxY9jdHtr9^p~ z2WhmKmj?nn5iLq;``62Fn`D7@H%rDJ7y7M6l)CP12iDCk)?B*M^M5_9Mpf;%$ZoWo zzNvLXZ)hxNBoJUCYabOifPmlN*UR{VyT^EPIjeBN42Wrbg)Z+?sf5qP1=)6l8&{>5Tg_Pv zD$N)3S6GTI;g=pd4{Jp)_H*{?_Jrf}W4}(a*|&_T%Mi5~%An45=2w3V(kxid?>cD= zc#5vv{J~Q!=YB4Z4xhczTh3_~RK6sd*qIAcy#U_z^0V1>efUrg*mOfa{bJ7>)BP7g z)k$Ke1SyNiW&a<6&+b0KBJboHmvSiI z_-@qSBN7$rwCx&S;{3$|u*KOpzdg=k|BD#In55xxavXr6*z%I4-1AJ=8tb2K(GUD@ z)d-oVgZQ*DrSTm(8&v={hrU_@R=4PA_L%6dl|ym5ep9SsYpnGa+W=*{kN@~=FanGI zoKCDuPS+);GCFTOgA*KFYdl=4G<%JeZ8}XDLU3|<@cr72ZQC5@sUY_0prqC-CXAmJ zBD@wNnHK#tNSNa+@IToBc!g|)+vVKk)G)-)zq7xWseAnAmK|YWzlH1(2N$-nR-eTC zf|dKfX(tG)*Lau z(A(?v;K9kgi{mQOSHriPKd(FUH$E={l?=;1;1}2xtph&3giEcM@tD8sJhiQRpSxfF z9t=*J|LMGXu@2LK-069>*vg1*M0-vlrvqo-$K(Gh zub!~nXZ5>pJ<{O^p#;a{H=;;)`<^7w-Y(to-~v1bV-=Qzt)!sf741W3J!f#t#?apG z-SvAup9KB?2u|AMV32tB9ed=0Us^0303)zm1S5+4_YR`Kvb?{KIq0H^sIdC(2GadY zwt8U1Z@=G|M%1Uls);FrR3wu!$YgK=Z>eK+$6WeOX zfuLz~Y{f!w0%Ffa;@xj*e4tT2l7DLH`a-^JrAc6T`)(neql?DT!3y-0QLzYE0WWt{ z@hQc7g)gR`(Re9eok+_eBb8Z1HvU{l!l6a7loZuI=^{(0KBlVj-0;u`P5t_#EL@;( z4zMzpRYZmp7~BaIomE1iMy1MOcJ93T>0B@u9IRRZ{nGu(2pCh}&4I`r{jR1 zv>Sf)yr3m5D3cVCLq;40;n4<8oEv2OB>v2Pcs}3%d40z3xL@cVVW<2-S2EIR58qBn zr?Ftvf-}8`MrB!Kt-Cu1J4#{E{pMw7D8t$rf@^%#z1Csm`+js(HaS@q7k4v{oxf;= z7zFlPKIjfd9K7P&;7i-&OIq9HPrR>nR6REG_NvpgR+ z$g)DV^!`^2b!8OP%0g;Vfo_-d6R47eL6sxAU+PyH0VU9hr)snUl}hGeV)~>!GB&Yh zmBGa>G<$^A(~Y9~_YOl;rljN?n5;}e2G*=;pr^`GsjY){Xws=l2P%i+`EFnGjXqJ3 z)adF;d=&_}HYnzm2sQwUd3Ur;>O?l~5*P!x2#2W++5Wsm^z8e9+CaB%@L8kcIMPLptsmO_ZP9&M7m0n8m$iEuu6O$R$a8Jcn+!G z1}%bzo1zi*pzs@jr$rwEIY%%dfQ^x;3Yoz!4H{7e5v8C8Rz%z1)CV{5^^Cnn^O zWHE0QLxiEd*#(s2&03yy@vbZdzWhYd4NEf@U88wsH%Nz1rdPOzP;L8n$hWc~#tQ3x z4r8SS(Ms_|Im$`KmLu#D8bk%>g`%0$+akc~eYU7#AS5^D$wG_th z8Uwxs19YLsrYZaCDrko(YTngo6wH;09L7DYQBUN|z2wzaIgnU3IvRh(Zb*Zf* zWJnr|^#JK4&xCwRSW+I@Wi$jEd`-pL?Rns0%E z*~5^sMmHKjkBqXh3PEb2XpAp?p!L4$8*Qx?-9eZa!=o16A-kbDc~Vs~!KkW2z2+G(I=S}l+;A;O5!A5y?F z29OYcXAM2J$4 z3K!m2+D6?=R1J`nlhqjXRZhzmBeIlb^gB#XYXqQ-BFt$>JmNZ&scm(Oc4l|WoeIn%ThIX2sjrBj@!n4U1`e&&mEF}1*$1TfdwBKzBX)QObT1QFN$6sxg+ zyU!<;sG%|Swg)sWnrw7E1*A$4r**)Xt&19eEn6P*5eH_uEA!s>_>iZyX5PnRwrd}! z_W=joaD)PhsVq}Q6Mj)R1Ty{gU)oo5Q1P|9bWqeZWHsvy4L4qWADlnhU*F5ZN6Qqq z1bfziAHU9=HnuOZtQr_Ubf9!Y8B}za87g*4OEDcH*1+s0?7_17|NcEaEPIK2P-Ft3 z%yq1DaAdkcKuxmjtPhaQFNHymQwWNHmIRD9T1#j7|5yi85b(-wMeCQ9Se{RxM?PHJebQ43x{5Adjb6u&0G_%{^B!B7C!e zC{QV-g;kqSqfpY65fCkrQ;$@tnA^igJw&5?9TCGRvt$Od*-IaQJJ_a zsB>aG2cg*@qn;~r`0i4k_5^x%%tZ#15OT>LEG6oZDMDUAiYtyri>6Tev)n91 z`)5er#pjY4hRKMkPbf)qe<>$dD?vyJsZ1_NoCD86J>-@)4)}Hl{QI;CpGuWtTJv&@ z3K>r++7g3&mE!OM;wfhrklXaa6zfQhPX#SzIR=l~KL{l4*GiQ@nTRi8LCj^+aH=C1 zHFB!WU@2(o6~ZOr>H~fy$%dga5tV8MDuv+%q*K<3L8&ZXs}?Y7L_dcsm1vx?lxUPw zXw_6IRe(^L?w)d(CIyvr-cqY?nT6`*Luf1=65ZM|>-0(yC00MrjB3{5X&W%)y|pWv zFlutktTwJlg-+BfG-i$0fe@!x|q>-I3)=ZgDVLwqXF;JLC`fnE?TITW#sh4Eb zMU`#n)L~OHYkUV_l9W_~XbcXi_;xvqfU@-T$dJrM4O%oC72VGY*o)UQQ5m#yp&9i; zQF6y84sKa%1D)4G#i`H1>66G`ub43A}KSevIm})=26Q5fFh6(!# zqDA`$BFC`7DwpCu4gGwYSf{DZfiKQG4j@xhz^Z>@{vYx!6Be)pO$o_`Tui3)&M<=e z&(7x_g(NQiKcvi|fLuv6b8hg{7h_pIba~NM2$76RR5HXT$%asiB%oE3ag)q1Zx;7} zh?J2{qKb}HRGL-|Qlgnh49#3bTLQy2Dj3B|$)s=yl8Ly)R7*+y6Jof6+6ya$QIZOj z%TUWOD5oeTXR4$qRc3q=^~|5HQI$X4T)=hKQG0Pk%8S(~_DMrW@V{2j{98hrhaedl zWbjIv1!*W#)5z2^58_A_)k?HT6}JB)G8~^=r3{-l&ZjZ?%Rc^6E3eE#5(awqa%!3B ze;z+c`Qp@Lh!QY8aCKavY-4HW@ab>%_VQ^DWc764gd#@{T&cw3)R7^enwlJ+aWQbGJt4kKiS&( zX@MY!TZ~x!?#-^Gr*-eO2;b+VdNhs3t$oAJ`{R%X--uiCUajT(aW;}jXWs82=atJB z>R9*#Szr?aL0vYsj1Os8Mj?xZf#0i%PC3(TgV;Xm=qBmrwsN+}0OZ#|5*MggOTr|S z1ia#kU2YiN{z5F2>@QU<#1x1xjPxhL+~u6YoCVhL;))NxV&qw3PFpBB4v#NBAj@v+ zWO=3Eb3u(!!reZI=$$&r=5|)j_TJwX-i{Q3OWX7LVWx+M zS^{JlfxyY1%Y+Q^%$O3J||Y1m)OUy1fdZU6TD{qo~xtt-iI)x!pt-lg92)WxDd7t@5t?na#9dOmH; zEu?64%!&`JYje!T@5&p`*`goHAfm)Emvj**13Tvpm;_8Q-ykA!u{CTV}AlWN>etz8z%M$<9bQC=_^EvSQP%;uaEyq1< z+Omc`Zqy$M-36OCf{WcxukTBB ziXMh}t2%(sDzM(|;bTD71>8soaK^UD*mB46>-mIx1=l(0q&~x~uvm^}6W-nc=`CSJ zW1+R%kh_C#dkb%6$o6f$Xe6>cce`^@VoYBKcAenpWE8Q#uW?*FFP$jz`A+YeMJCZG zlzK`buKDf4QmjOG8p&@(=8`lfQ1KOIvw(0Vr)?M2>vcoK3ZclD^bvCfZ+Q=tot&F>8H(&%wTbTcIo__zS);|)}C)-E{G zOvO7)n_IK8Jb!N}m^xT2xn!gi_&bnJ^%gtIU2zS&ayO}yEG3kX13LfdzA1$leS4nr zRCaQO^4B-;C1gQNFl^|rTV}=@E_3#D9^iTzgn*ga{PE}G<10PesFuZei~ew z7Q(NWd>!e9-ab7{lXtw}eO&B9>gHcL>21II7(5`#`&iz3eQ~}T^f^-WxcZA6S7*5O z`g*aqcV%n)>V13vSHov-`r={@YUePG=|vGZ>9UZHJp+gX1g`)0(#*x2CYc690!lvwZS!Oq#^HEW~WY|FkNOj&7e?PHtjmVihe%{Nh~V zJfGRkTs&VzMLF5Ova_;qbFy%AiLkM9v2losun7|Xe?!pzVLn~`U#>4J*Jtwdzms{2 zbXhxnP0X;_&Yp+ogymSmwcmBi9j)lSdk<@|7t67Re6fV1(gdT(`(k$%(oG^;U`2O%OQ@0G0UNjL=ej%zY#;925vf#S%FP&gIR&rY?F=! zbIu|0_E9+Dx&<-LA$kil9fOM*fh5Z`-|_gR`#XhFb;^GuJZ`!O=-LM5hCl|;AKAAR z1lo2w;)$T>Dx_R2`?Q(Cu=>!J!N#A4Gy-Ilknx1cKCL?8A_UPeBU<$N2F0&iSN8od zYj?1Khz??5MxyK^PX}8tf|?5Aal)JmhIB$ikZJx~5j#mL)(HPMv8n@u8k&b0L86a3 z9ny81Rtx<9SJstBL;bb!+02Yx$slHEqWm;u{f%N6S+XWs%CwlG!i$kNkuvk0QPyND zCiP1^c9AkGp6l9NlP4>PPu!`1p?sBz z&;IU(m)lIc_3)Gl!G2z&Iem+Z_ICy1vG3~Y1Wfrw&cr!p>q(63_iAg(WycrSM$KXt zmAZXQlK%thkRgA0Lpp{eeP*AtS`k!f{^mL`jSb-6+Z7C?X;CeA$BUU23-kM@k&t`z6vII}>01I__@m{-|WUS@6QWV|WN7Ds6emV(@LDCF({rHh%bG zo=SqHxR%&yb!azTB0jq|@0-5D`x5XY;sb}gkqeVCi!69AV{ZzyQ)SOY(vX&4nqZZ- zosg$|45Y(SI0kdl*;ANt%v1o%1Q|L%kUvik=0PJZ)dYycTo9SmE=@nVvDW00_AbV0 zy&XN?RZIO7To0~lhR=x({ep2+y>STo6GI{1JknYAsMtTq=s>`kWnK*qW(2XJ!P{IC z0+N;8ih>=N<}HMm!?^^u>Np@k;!Oc>S z#nm}B5s4X(J@VIzXF^jA7XwkFIt_!4*HVW67<;3e`dBgSY%i^0LJ>H*xG3URU=CbhRnvBs zny>ibe&%oHSXAOFup+XDlVcNUTnJba zhLa0%BWoj_#OQH|iD+Us6fWKgvD9JhQs!)8f<#7-sOwQ+Kco4n4i^3j?-wI9_7d*a z(x#cXPstyPayPvEk61{%7gimxam_{MTdp5YEikQsC3^Zi3+^b|_urWfFg~1%F#>FP zu&jD99)whHlY$6hq0a-3d;k+4h?SOV%a}Q z58hG_W5V3XTRTDh@nRcv^&%T2+NW$-M!iI}j3=0u*bYf-Z-5WL;OrLMFZu)=B`XRT zx55HPWvV56H+|!qn}B4w+f3j)L0xFsY4?%+*kqT=X2^rMo#kvyWfea znc(>U!j{uqX^kiuLlf%@r?DgGUg?O&lajGIs*ghk8aBY#6H;o`TCS+pPWpHDule6V z(d=Fu>Ss-Y;c!SqqmU2H9y%$B2f@KuQ|k-J*%fQ*{3Qa4QoRc#L{FM7g|$t$*bLX) z`!yj<5p5` z3Ji_${#e{i*FK2QwlP=km)^La`dFzxABwVwhSRt{G2T8?t3CTFBH>tGrF&x$;`VWg;D z54LTG;z24pkT+Q!2(cQpY!3IMCVC=LEogQNgB3yU-#yY^Yu>wV;@!DCSb^g#Tq0WF zJ+hziF+q}j=G88xBn*J4=yH$cZ!42{QD?Zkzaq)Km4D?iT_UF?^~U`LbV@%BIHjs` z&u{s#R)4X!bK=w~j>=j8dD4B_52%0miBosQMut%Xe9%s*m{$%O4I4S zF02Y5y<_bx$}MBPEbZ%=^jhkl^tX5DY-|d+Sfk;Bxx2qJrAY;Nm>^Vx!1ZlAm_12h z#fcgEhnm{tw|iZ?rvI{K1y836$D)-eOa(ESED^U4t@Wk7Ep<8&ecpCbNRt!?hu+-{+YvCT7`{Yg?XUG1J=@5YqTlxtZ(ua zR3=N*WURX$Mo`lfK%wP3l`sx^pU*Igwdwaq*di(bFlS+cR+^HXb-5+`(hcfSd)oypS1i*Z6T(>JTEU1~(^t7`RDAgf^zDWDnf|H?_~j=xMaOLmGTb zKzj^6fHxUb0!vI)b(2DHit;O1gcVZ~$c*+E<0v{|<{b2QeoxZd5{dw@CksC0wM6+Dt6 oH;i+9F8ZvzXEl_vWMLMKkk53!i$qHq8{zjDOK57^xY$bk8{ks-f&c&j From 0251bb1cf92925cac554cd02f8b54ece9d46cc84 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Thu, 6 Apr 2023 14:37:29 -0600 Subject: [PATCH 22/81] Added YAML configuration to create SCM environment --- environment-ufsreplay.yml | 12 ++++++++++++ environment.yml | 8 ++++++++ scm/etc/scripts/UFS_forcing_ensemble_generator.py | 1 - 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 environment-ufsreplay.yml create mode 100644 environment.yml diff --git a/environment-ufsreplay.yml b/environment-ufsreplay.yml new file mode 100644 index 000000000..0033a690e --- /dev/null +++ b/environment-ufsreplay.yml @@ -0,0 +1,12 @@ +name: env_ufsreplay + +dependencies: + - conda-forge::python=3.7 + - conda-forge::netcdf4 + - conda-forge::f90nml + - conda-forge::xarray + - conda-forge::numpy + - conda-forge::shapely + - conda-forge::xesmf +variables: + SCM_ROOT: $PWD/ \ No newline at end of file diff --git a/environment.yml b/environment.yml new file mode 100644 index 000000000..0d6570816 --- /dev/null +++ b/environment.yml @@ -0,0 +1,8 @@ +name: scm_py37 + +dependencies: + - conda-forge::python=3.7 + - conda-forge::netcdf4 + - conda-forge::f90nml +variables: + SCM_ROOT: $PWD/ \ No newline at end of file diff --git a/scm/etc/scripts/UFS_forcing_ensemble_generator.py b/scm/etc/scripts/UFS_forcing_ensemble_generator.py index ea47638b1..c529c31d6 100755 --- a/scm/etc/scripts/UFS_forcing_ensemble_generator.py +++ b/scm/etc/scripts/UFS_forcing_ensemble_generator.py @@ -6,7 +6,6 @@ import argparse import os from netCDF4 import Dataset -import matplotlib.pyplot as plt import xarray as xr import numpy as np import random From e0abe8ceff83f1498f32a2c14f64ec1b0e89143b Mon Sep 17 00:00:00 2001 From: dustinswales Date: Thu, 6 Apr 2023 15:04:05 -0600 Subject: [PATCH 23/81] Doc changes for YAML environment files --- scm/doc/TechGuide/chap_cases.tex | 20 +++++++++++++++++++- scm/doc/TechGuide/main.pdf | Bin 566134 -> 565439 bytes 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index 1f53cf77e..d71b55d92 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -199,9 +199,27 @@ \section{Using other LASSO cases} \section{Using UFS Output to Create SCM Cases: UFS-Replay} \label{sec:UFSreplay} + +\subsection{Python Dependencies} +\label{subsection: pydepend} +The scripts here require a few python packages that may not be found by default in all python installations. There is a YAML file with the python environment needed to run the script in \execout{ccpp-scm/environment-ufsreplay.yml}. To create and activate this environment using conda: + +Create environment (only once): + +\execout{> conda env create -f environment-ufsreplay.yml} + +This will create the conda environment \execout{env\_ufsreplay} + + +Activate environment: + +\execout{> conda activate env\_ufsreplay} + + \subsection{UFS\_IC\_generator.py} \label{subsection: ufsicgenerator} -A script exists in \execout{scm/etc/scripts/UFS\_IC\_generator.py} to read in UFS history (output) files and their initial conditions to generate a SCM case input data file, in DEPHY format. Note that the script requires a few python packages that may not be found by default in all python installations: \exec{argparse}, \exec{fnmatch}, \exec{logging}, \exec{NetCDF4}, \exec{numpy}, \exec{shapely}, \exec{f90nml}, and \exec{re}. +A script exists in \execout{scm/etc/scripts/UFS\_IC\_generator.py} to read in UFS history (output) files and their initial conditions to generate a SCM case input data file, in DEPHY format. + \begin{lstlisting}[language=bash] ./UFS_IC_generator.py [-h] (-l LOCATION LOCATION | -ij INDEX INDEX) -d diff --git a/scm/doc/TechGuide/main.pdf b/scm/doc/TechGuide/main.pdf index 3d6140383746de2f2beff9c7f316318a04f30370..cc0ffc1a1b6c3344d49edd6f2e132519736d7cf2 100644 GIT binary patch delta 59282 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%0DthSV>~%12pYHK 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

-SxnBYAuf2Oa4*e?V?nJ%yqwFu4Z4t9 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 J%c#nt{T~%DiuV8j delta 59993 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ɥVtNU;s)__cuuE^}tQi*5fo&zQ|eZ!`xsU+l_N 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 From bf8ea288bc73459824c9f3fe7e23ad9ce2ceb21c Mon Sep 17 00:00:00 2001 From: dustinswales Date: Fri, 7 Apr 2023 12:17:25 -0600 Subject: [PATCH 24/81] Initial commit --- .github/workflows/ci_run_scm_ufs_replay.yml | 74 +++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 .github/workflows/ci_run_scm_ufs_replay.yml diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml new file mode 100644 index 000000000..714f027f3 --- /dev/null +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -0,0 +1,74 @@ +name: CI test to create UFS-replay case for the SCM + +on: [pull_request, workflow_dispatch] + +jobs: + run_scm_ufs_replay: + + # The type of runner that the job will run on + runs-on: ubuntu-22.04 + strategy: + matrix: +# fortran-compiler: [gfortran-11] +# c-compiler: [gcc-11] +# build-type: [Release] + py-version: [3.9.12] + + # Environmental variables + env: +# FC: ${{ matrix.fortran-compiler }} + GITHUB_WORKSPACE: /home/runner/ +# CC: ${{ matrix.c-compiler }} +# NFHOME: /home/runner/netcdf-fortran +# NFVERSION: v4.5.3 +# bacio_ROOT: /home/runner/bacio +# sp_ROOT: /home/runner/NCEPLIBS-sp +# w3emc_ROOT: /home/runner/myw3emc + SCM_ROOT: /home/runner/work/ccpp-scm + + # Workflow steps + steps: + + ####################################################################################### + # Initial + ####################################################################################### + - name: Checkout SCM code (into /home/runner/work/ccpp-scm/) + uses: actions/checkout@v3 + + - name: Initialize submodules + run: git submodule update --init --recursive + + ####################################################################################### + # Python setup + ####################################################################################### + - name: Set up Python + uses: actions/setup-python@v3 + with: + python-version: ${{matrix.py-version}} + + - name: Add conda to system path + run: | + echo $CONDA/bin >> $GITHUB_PATH + + - name: Install python libraries + run: | + conda install --yes -c conda-forge f90nml + conda install --yes -c conda-forge netCDF4 + conda install --yes -c conda-forge xarray + conda install --yes -c conda-forge numpy + conda install --yes -c conda-forge shapely + conda install --yes -c conda-forge xesmf + + - name: Update system packages + run: sudo apt-get update + + ####################################################################################### + # Create UFS-replay case for SCM using UWM Regression Tests + ####################################################################################### + - name: Download UWM regression tests from #?@%$W@!*&#? + - name: Run UFS_forcing_ensemble_generator.py + run: | + cd $SCM_ROOT + pwd + ./UFS_forcing_ensemble_generator.py -h + # /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_c192/ -sc --C_RES 192 -dt 360 -n control_c192 -lons 300 -lats 34 From 4de6dd41b4c2a09cf56b9eaf367217a61b278900 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Fri, 7 Apr 2023 12:18:52 -0600 Subject: [PATCH 25/81] New CI test for ufs-replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 714f027f3..9fd49140c 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -1,6 +1,6 @@ name: CI test to create UFS-replay case for the SCM -on: [pull_request, workflow_dispatch] +on: [push, pull_request, workflow_dispatch] jobs: run_scm_ufs_replay: From a61102adf93b5ac633dbc1c8814af38bc9f525e8 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Fri, 7 Apr 2023 12:21:42 -0600 Subject: [PATCH 26/81] New CI test for ufs-replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 9fd49140c..2e64d0ee9 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -1,6 +1,6 @@ name: CI test to create UFS-replay case for the SCM -on: [push, pull_request, workflow_dispatch] +on: [pull_request, workflow_dispatch] jobs: run_scm_ufs_replay: @@ -9,21 +9,11 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: -# fortran-compiler: [gfortran-11] -# c-compiler: [gcc-11] -# build-type: [Release] py-version: [3.9.12] # Environmental variables env: -# FC: ${{ matrix.fortran-compiler }} - GITHUB_WORKSPACE: /home/runner/ -# CC: ${{ matrix.c-compiler }} -# NFHOME: /home/runner/netcdf-fortran -# NFVERSION: v4.5.3 -# bacio_ROOT: /home/runner/bacio -# sp_ROOT: /home/runner/NCEPLIBS-sp -# w3emc_ROOT: /home/runner/myw3emc + GITHUB_WORKSPACE: /home/runner/ SCM_ROOT: /home/runner/work/ccpp-scm # Workflow steps From e6f3328eb2b308caccef5096f4395affb08d5228 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Fri, 7 Apr 2023 12:29:03 -0600 Subject: [PATCH 27/81] New CI test for ufs-replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 35 ++++++++------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 2e64d0ee9..428d614bc 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -1,43 +1,33 @@ -name: CI test to create UFS-replay case for the SCM +name: CI test to create SCM UFS-replay cases from UWM regression tests -on: [pull_request, workflow_dispatch] +on: [push, pull_request] jobs: run_scm_ufs_replay: # The type of runner that the job will run on - runs-on: ubuntu-22.04 - strategy: - matrix: - py-version: [3.9.12] + runs-on: ubuntu-20.04 # Environmental variables env: - GITHUB_WORKSPACE: /home/runner/ - SCM_ROOT: /home/runner/work/ccpp-scm + SCM_ROOT: /home/runner/work/ccpp-scm - # Workflow steps steps: - ####################################################################################### - # Initial - ####################################################################################### - - name: Checkout SCM code (into /home/runner/work/ccpp-scm/) + - name: Checkout code uses: actions/checkout@v3 - name: Initialize submodules run: git submodule update --init --recursive - - ####################################################################################### - # Python setup - ####################################################################################### - - name: Set up Python + + - name: Set up Python 3.8.5 uses: actions/setup-python@v3 with: - python-version: ${{matrix.py-version}} + python-version: 3.8.5 - name: Add conda to system path run: | + # $CONDA is an environment variable pointing to the root of the miniconda directory echo $CONDA/bin >> $GITHUB_PATH - name: Install python libraries @@ -55,10 +45,11 @@ jobs: ####################################################################################### # Create UFS-replay case for SCM using UWM Regression Tests ####################################################################################### - - name: Download UWM regression tests from #?@%$W@!*&#? + +# - name: Download UWM regression tests from #?@%$W@!*&#? + - name: Run UFS_forcing_ensemble_generator.py run: | - cd $SCM_ROOT + cd $SCM_ROOT/scm/etc/scripts/ pwd ./UFS_forcing_ensemble_generator.py -h - # /glade/scratch/epicufsrt/GMTB/CCPP-SCM/UFS_RTs/control_c192/ -sc --C_RES 192 -dt 360 -n control_c192 -lons 300 -lats 34 From 9b9bf8f88a778fdfd52f6a6ff353f5925f4ed1be Mon Sep 17 00:00:00 2001 From: dustinswales Date: Fri, 7 Apr 2023 12:48:29 -0600 Subject: [PATCH 28/81] New CI test for ufs-replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 428d614bc..a273b1018 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -10,7 +10,7 @@ jobs: # Environmental variables env: - SCM_ROOT: /home/runner/work/ccpp-scm + SCM_ROOT: /home/runner/work/ccpp-scm/ccpp-scm steps: From 6c0ef33b19b55ebb6a4b8636a64ee77562bd985a Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 09:08:28 -0600 Subject: [PATCH 29/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index a273b1018..1f655c239 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -11,6 +11,7 @@ jobs: # Environmental variables env: SCM_ROOT: /home/runner/work/ccpp-scm/ccpp-scm + dir_rt: /home/runner/work/ccpp-scm/ccpp-scm/data/ufs_rts steps: @@ -46,7 +47,13 @@ jobs: # Create UFS-replay case for SCM using UWM Regression Tests ####################################################################################### -# - name: Download UWM regression tests from #?@%$W@!*&#? + - name: Download UWM regression tests from DTC FTP site + run: | + mkdir ${dir_rt} && cd ${dir_rt} + wget ftp://ftp.rap.ucar.edu:/pub/ccpp-scm/ufs_rts_scmreplay_ci.tar + tar -xvf ufs_rts_scmreplay_ci.tar + ls ${dir_rt} + - name: Run UFS_forcing_ensemble_generator.py run: | From aa7ea8cd8537106c3e36bdd3a55f6d4a7f04684e Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 09:25:31 -0600 Subject: [PATCH 30/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 71 +++++++++++++-------- 1 file changed, 44 insertions(+), 27 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 1f655c239..b625af865 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -6,13 +6,13 @@ jobs: run_scm_ufs_replay: # The type of runner that the job will run on - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 # Environmental variables env: SCM_ROOT: /home/runner/work/ccpp-scm/ccpp-scm dir_rt: /home/runner/work/ccpp-scm/ccpp-scm/data/ufs_rts - + steps: - name: Checkout code @@ -20,39 +20,56 @@ jobs: - name: Initialize submodules run: git submodule update --init --recursive - - - name: Set up Python 3.8.5 - uses: actions/setup-python@v3 - with: - python-version: 3.8.5 - - - name: Add conda to system path - run: | - # $CONDA is an environment variable pointing to the root of the miniconda directory - echo $CONDA/bin >> $GITHUB_PATH - - - name: Install python libraries - run: | - conda install --yes -c conda-forge f90nml - conda install --yes -c conda-forge netCDF4 - conda install --yes -c conda-forge xarray - conda install --yes -c conda-forge numpy - conda install --yes -c conda-forge shapely - conda install --yes -c conda-forge xesmf - name: Update system packages run: sudo apt-get update + + - name: Cache Conda environment + uses: actions/cache@v3 + with: + path: ~/conda_pkgs_dir + key: conda-pkgs + + - name: Set up Conda + uses: conda-incubator/setup-miniconda@v2 + with: + miniforge-version: latest + activate-environment: env_ufsreplay + environment-file: environment-ufsreplay.yml + python-version: 3.9 + auto-activate-base: false + +# - name: Set up Python 3.8.5 +# uses: actions/setup-python@v3 +# with: +# python-version: 3.8.5 +# +# - name: Add conda to system path +# run: | +# # $CONDA is an environment variable pointing to the root of the miniconda directory +# echo $CONDA/bin >> $GITHUB_PATH +# +# - name: Install python libraries +# run: | +# conda install --yes -c conda-forge f90nml +# conda install --yes -c conda-forge netCDF4 +# conda install --yes -c conda-forge xarray +# conda install --yes -c conda-forge numpy +# conda install --yes -c conda-forge shapely +# conda install --yes -c conda-forge xesmf ####################################################################################### # Create UFS-replay case for SCM using UWM Regression Tests ####################################################################################### - - name: Download UWM regression tests from DTC FTP site - run: | - mkdir ${dir_rt} && cd ${dir_rt} - wget ftp://ftp.rap.ucar.edu:/pub/ccpp-scm/ufs_rts_scmreplay_ci.tar - tar -xvf ufs_rts_scmreplay_ci.tar - ls ${dir_rt} + - name: Cache UWM regression test output. + +# - name: Download UWM regression tests from DTC FTP site. +# run: | +# mkdir -p ${dir_rt} && cd ${dir_rt} +# wget ftp://ftp.rap.ucar.edu:/pub/ccpp-scm/ufs_rts_scmreplay_ci.tar +# tar -xvf ufs_rts_scmreplay_ci.tar +# ls ${dir_rt} - name: Run UFS_forcing_ensemble_generator.py From 770a07f589b5f1ef2bfc451a43fe636f2ef6c449 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 09:29:06 -0600 Subject: [PATCH 31/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index b625af865..fa445054c 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -62,7 +62,7 @@ jobs: # Create UFS-replay case for SCM using UWM Regression Tests ####################################################################################### - - name: Cache UWM regression test output. +# - name: Cache UWM regression test output. # - name: Download UWM regression tests from DTC FTP site. # run: | From 82672deeebf3a951b784a8524862d7008f1992e2 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 09:33:46 -0600 Subject: [PATCH 32/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index fa445054c..704fead3b 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -12,7 +12,7 @@ jobs: env: SCM_ROOT: /home/runner/work/ccpp-scm/ccpp-scm dir_rt: /home/runner/work/ccpp-scm/ccpp-scm/data/ufs_rts - + ufs_rt_cache: /home/runner/ufs_rts steps: - name: Checkout code @@ -36,7 +36,7 @@ jobs: miniforge-version: latest activate-environment: env_ufsreplay environment-file: environment-ufsreplay.yml - python-version: 3.9 + python-version: 3.8.5 auto-activate-base: false # - name: Set up Python 3.8.5 @@ -66,10 +66,10 @@ jobs: # - name: Download UWM regression tests from DTC FTP site. # run: | -# mkdir -p ${dir_rt} && cd ${dir_rt} +# mkdir -p ${dir_rt_cache} && cd ${dir_rt_cache} # wget ftp://ftp.rap.ucar.edu:/pub/ccpp-scm/ufs_rts_scmreplay_ci.tar # tar -xvf ufs_rts_scmreplay_ci.tar -# ls ${dir_rt} +# ls ${dir_rt_cache} - name: Run UFS_forcing_ensemble_generator.py From 21db6ab1642b9a9f8f97df21d517e735f8bae999 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 09:41:03 -0600 Subject: [PATCH 33/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 45 ++++++++++++--------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 704fead3b..bf1154780 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -30,26 +30,28 @@ jobs: path: ~/conda_pkgs_dir key: conda-pkgs - - name: Set up Conda - uses: conda-incubator/setup-miniconda@v2 +# - name: Set up Conda +# uses: conda-incubator/setup-miniconda@v2 +# with: +# miniforge-version: latest +# activate-environment: env_ufsreplay +# environment-file: environment-ufsreplay.yml +# python-version: 3.8.5 +# auto-activate-base: false + + - name: Set up Python 3.8.5 + uses: actions/setup-python@v3 with: - miniforge-version: latest - activate-environment: env_ufsreplay - environment-file: environment-ufsreplay.yml python-version: 3.8.5 - auto-activate-base: false + environment-file: environment-ufsreplay.yml + activate-environment: env_ufsreplay -# - name: Set up Python 3.8.5 -# uses: actions/setup-python@v3 -# with: -# python-version: 3.8.5 -# # - name: Add conda to system path # run: | # # $CONDA is an environment variable pointing to the root of the miniconda directory # echo $CONDA/bin >> $GITHUB_PATH -# -# - name: Install python libraries + +# - name: In # run: | # conda install --yes -c conda-forge f90nml # conda install --yes -c conda-forge netCDF4 @@ -66,11 +68,18 @@ jobs: # - name: Download UWM regression tests from DTC FTP site. # run: | -# mkdir -p ${dir_rt_cache} && cd ${dir_rt_cache} -# wget ftp://ftp.rap.ucar.edu:/pub/ccpp-scm/ufs_rts_scmreplay_ci.tar -# tar -xvf ufs_rts_scmreplay_ci.tar -# ls ${dir_rt_cache} - +# if test ! -d "${dir_rt_cache}"; then +# mkdir -p ${dir_rt_cache} && cd ${dir_rt_cache} +# wget ftp://ftp.rap.ucar.edu:/pub/ccpp-scm/ufs_rts_scmreplay_ci.tar +# tar -xvf ufs_rts_scmreplay_ci.tar +# ls ${dir_rt_cache} +# fi +# for file in "${dir_rt_cache}"/*; do +# if test ! -d "${file}"; then +# echo "copying '${file}'..." +# cp "${file}" "${GITHUB_WORKSPACE}" +# fi +# done - name: Run UFS_forcing_ensemble_generator.py run: | From f6ee58e98b0c5e7a4161cbda24564e38f980b896 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 09:45:16 -0600 Subject: [PATCH 34/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index bf1154780..12204f312 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -6,12 +6,11 @@ jobs: run_scm_ufs_replay: # The type of runner that the job will run on - runs-on: ubuntu-22.04 + runs-on: ubuntu-20.04 # Environmental variables env: - SCM_ROOT: /home/runner/work/ccpp-scm/ccpp-scm - dir_rt: /home/runner/work/ccpp-scm/ccpp-scm/data/ufs_rts + dir_rt: /data/ufs_rts ufs_rt_cache: /home/runner/ufs_rts steps: @@ -83,6 +82,6 @@ jobs: - name: Run UFS_forcing_ensemble_generator.py run: | - cd $SCM_ROOT/scm/etc/scripts/ + cd ${GITHUB_WORKSPACE}/scm/etc/scripts/ pwd ./UFS_forcing_ensemble_generator.py -h From f22bad2b6649b223df693a1ae3f73b303520ca5c Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 09:49:15 -0600 Subject: [PATCH 35/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 26 ++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 12204f312..621bc1c0d 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -29,21 +29,21 @@ jobs: path: ~/conda_pkgs_dir key: conda-pkgs -# - name: Set up Conda -# uses: conda-incubator/setup-miniconda@v2 -# with: -# miniforge-version: latest -# activate-environment: env_ufsreplay -# environment-file: environment-ufsreplay.yml -# python-version: 3.8.5 -# auto-activate-base: false - - - name: Set up Python 3.8.5 - uses: actions/setup-python@v3 + - name: Set up Conda + uses: conda-incubator/setup-miniconda@v2 with: - python-version: 3.8.5 - environment-file: environment-ufsreplay.yml + miniforge-version: latest activate-environment: env_ufsreplay + environment-file: environment-ufsreplay.yml + python-version: 3.8.5 + auto-activate-base: false + +# - name: Set up Python 3.8.5 +# uses: actions/setup-python@v3 +# with: +# python-version: 3.8.5 +# environment-file: environment-ufsreplay.yml +# activate-environment: env_ufsreplay # - name: Add conda to system path # run: | From a7b95ccd3493d659e2f1f39bc80e52c4a0e5f90c Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 09:58:19 -0600 Subject: [PATCH 36/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 621bc1c0d..01b2e6549 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -8,6 +8,10 @@ jobs: # The type of runner that the job will run on runs-on: ubuntu-20.04 + defaults: + run: + shell: bash -el {0} + # Environmental variables env: dir_rt: /data/ufs_rts @@ -15,7 +19,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v2 - name: Initialize submodules run: git submodule update --init --recursive @@ -32,7 +36,6 @@ jobs: - name: Set up Conda uses: conda-incubator/setup-miniconda@v2 with: - miniforge-version: latest activate-environment: env_ufsreplay environment-file: environment-ufsreplay.yml python-version: 3.8.5 From be0022ebc20a437f2f373f209f6c0114f5681055 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 10:07:49 -0600 Subject: [PATCH 37/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 01b2e6549..88d1c1504 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -33,28 +33,20 @@ jobs: path: ~/conda_pkgs_dir key: conda-pkgs - - name: Set up Conda - uses: conda-incubator/setup-miniconda@v2 + - name: Set up Python 3.8.5 + uses: actions/setup-python@v3 with: - activate-environment: env_ufsreplay - environment-file: environment-ufsreplay.yml python-version: 3.8.5 - auto-activate-base: false - -# - name: Set up Python 3.8.5 -# uses: actions/setup-python@v3 -# with: -# python-version: 3.8.5 -# environment-file: environment-ufsreplay.yml -# activate-environment: env_ufsreplay # - name: Add conda to system path # run: | # # $CONDA is an environment variable pointing to the root of the miniconda directory # echo $CONDA/bin >> $GITHUB_PATH -# - name: In -# run: | + - name: In + run: | + conda env create -f environment-ufsreplay.yml + conda activate env_ufsreplay # conda install --yes -c conda-forge f90nml # conda install --yes -c conda-forge netCDF4 # conda install --yes -c conda-forge xarray From b257b620ae9aaf06c8ebeec567424b1104f4bfa2 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 10:17:50 -0600 Subject: [PATCH 38/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 88d1c1504..57a9d5ef7 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -38,10 +38,10 @@ jobs: with: python-version: 3.8.5 -# - name: Add conda to system path -# run: | -# # $CONDA is an environment variable pointing to the root of the miniconda directory -# echo $CONDA/bin >> $GITHUB_PATH + - name: Add conda to system path + run: | + # $CONDA is an environment variable pointing to the root of the miniconda directory + echo $CONDA/bin >> $GITHUB_PATH - name: In run: | From 84a65706e3232bb9a2803e34ee378a9867a82320 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 10:28:38 -0600 Subject: [PATCH 39/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 57a9d5ef7..9ba58073b 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -8,10 +8,6 @@ jobs: # The type of runner that the job will run on runs-on: ubuntu-20.04 - defaults: - run: - shell: bash -el {0} - # Environmental variables env: dir_rt: /data/ufs_rts @@ -33,18 +29,19 @@ jobs: path: ~/conda_pkgs_dir key: conda-pkgs - - name: Set up Python 3.8.5 - uses: actions/setup-python@v3 - with: - python-version: 3.8.5 +# - name: Set up Python 3.8.5 +# uses: actions/setup-python@v3 +# with: +# python-version: 3.8.5 - - name: Add conda to system path - run: | - # $CONDA is an environment variable pointing to the root of the miniconda directory - echo $CONDA/bin >> $GITHUB_PATH +# - name: Add conda to system path +# run: | +# # $CONDA is an environment variable pointing to the root of the miniconda directory +# echo $CONDA/bin >> $GITHUB_PATH - name: In run: | + echo $CONDA/bin >> $GITHUB_PATH conda env create -f environment-ufsreplay.yml conda activate env_ufsreplay # conda install --yes -c conda-forge f90nml From 586442f4e9f97c7997ef01cd9506d4c2bab96489 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 10:41:00 -0600 Subject: [PATCH 40/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 9ba58073b..f8f088395 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -29,21 +29,12 @@ jobs: path: ~/conda_pkgs_dir key: conda-pkgs -# - name: Set up Python 3.8.5 -# uses: actions/setup-python@v3 -# with: -# python-version: 3.8.5 - -# - name: Add conda to system path -# run: | -# # $CONDA is an environment variable pointing to the root of the miniconda directory -# echo $CONDA/bin >> $GITHUB_PATH - - name: In run: | echo $CONDA/bin >> $GITHUB_PATH - conda env create -f environment-ufsreplay.yml - conda activate env_ufsreplay + conda init + conda env create -f environment.yml #environment-ufsreplay.yml + conda activate scm_py37 #env_ufsreplay # conda install --yes -c conda-forge f90nml # conda install --yes -c conda-forge netCDF4 # conda install --yes -c conda-forge xarray From d4573e7d88aaae368acff3653700eae8fc40cc0a Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 10:48:12 -0600 Subject: [PATCH 41/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index f8f088395..b0b50f189 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -14,6 +14,10 @@ jobs: ufs_rt_cache: /home/runner/ufs_rts steps: + ####################################################################################### + # + ####################################################################################### + - name: Checkout code uses: actions/checkout@v2 @@ -31,16 +35,11 @@ jobs: - name: In run: | - echo $CONDA/bin >> $GITHUB_PATH + source ~/anaconda3/etc/profile.d/conda.sh +# echo $CONDA/bin >> $GITHUB_PATH conda init conda env create -f environment.yml #environment-ufsreplay.yml conda activate scm_py37 #env_ufsreplay -# conda install --yes -c conda-forge f90nml -# conda install --yes -c conda-forge netCDF4 -# conda install --yes -c conda-forge xarray -# conda install --yes -c conda-forge numpy -# conda install --yes -c conda-forge shapely -# conda install --yes -c conda-forge xesmf ####################################################################################### # Create UFS-replay case for SCM using UWM Regression Tests From c69e82c6328ea2d8b5563a0c3faa1112fe3fc48b Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 10:49:35 -0600 Subject: [PATCH 42/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index b0b50f189..5952d1cb2 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -35,7 +35,7 @@ jobs: - name: In run: | - source ~/anaconda3/etc/profile.d/conda.sh + source /usr/share/miniconda/etc/profile.d/conda.csh # echo $CONDA/bin >> $GITHUB_PATH conda init conda env create -f environment.yml #environment-ufsreplay.yml From c794c2cc2076bd9f86320e4eb1eceb01caa4d719 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 10:50:40 -0600 Subject: [PATCH 43/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 5952d1cb2..a5175f84e 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -33,10 +33,9 @@ jobs: path: ~/conda_pkgs_dir key: conda-pkgs - - name: In + - name: Setup Python run: | source /usr/share/miniconda/etc/profile.d/conda.csh -# echo $CONDA/bin >> $GITHUB_PATH conda init conda env create -f environment.yml #environment-ufsreplay.yml conda activate scm_py37 #env_ufsreplay From a25ff45d62a17c040415995f7855c7beee74a635 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 10:58:28 -0600 Subject: [PATCH 44/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index a5175f84e..05b5d6295 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -26,6 +26,10 @@ jobs: - name: Update system packages run: sudo apt-get update + + - name: Add conda to system path + run: | + echo $CONDA/bin >> $GITHUB_PATH - name: Cache Conda environment uses: actions/cache@v3 @@ -35,8 +39,6 @@ jobs: - name: Setup Python run: | - source /usr/share/miniconda/etc/profile.d/conda.csh - conda init conda env create -f environment.yml #environment-ufsreplay.yml conda activate scm_py37 #env_ufsreplay From 24a3d25709d632aa9d0444e1228fb325e835a382 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 11:02:22 -0600 Subject: [PATCH 45/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 05b5d6295..9fea62cf0 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -40,7 +40,7 @@ jobs: - name: Setup Python run: | conda env create -f environment.yml #environment-ufsreplay.yml - conda activate scm_py37 #env_ufsreplay +# conda activate scm_py37 #env_ufsreplay ####################################################################################### # Create UFS-replay case for SCM using UWM Regression Tests From cbe1569892bc0f03d2002e2eb74abd44e65f4d2b Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 11:10:34 -0600 Subject: [PATCH 46/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 36 ++++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 9fea62cf0..c57ee3d01 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -6,7 +6,11 @@ jobs: run_scm_ufs_replay: # The type of runner that the job will run on - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 + defaults: + run: + shell: bash -el {0} + # Environmental variables env: @@ -27,19 +31,27 @@ jobs: - name: Update system packages run: sudo apt-get update - - name: Add conda to system path - run: | - echo $CONDA/bin >> $GITHUB_PATH - - - name: Cache Conda environment - uses: actions/cache@v3 + - uses: conda-incubator/setup-miniconda@v2 with: - path: ~/conda_pkgs_dir - key: conda-pkgs + activate-environment: env_ufsreplay + environment-file: environment-ufsreplay.yml + use-only-tar-bz2: true + auto-update-conda: true + auto-activate-base: true - - name: Setup Python - run: | - conda env create -f environment.yml #environment-ufsreplay.yml +# - name: Add conda to system path +# run: | +# echo $CONDA/bin >> $GITHUB_PATH +# +# - name: Cache Conda environment +# uses: actions/cache@v3 +# with: +# path: ~/conda_pkgs_dir +# key: conda-pkgs +# +# - name: Setup Python +# run: | +# conda env create -f environment.yml #environment-ufsreplay.yml # conda activate scm_py37 #env_ufsreplay ####################################################################################### From d183d256de1b000bb5a6ef5e3cadfd32a65c1495 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 11:21:10 -0600 Subject: [PATCH 47/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 55 ++++++++------------- 1 file changed, 21 insertions(+), 34 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index c57ee3d01..09cb0cdcb 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -11,15 +11,14 @@ jobs: run: shell: bash -el {0} - # Environmental variables env: - dir_rt: /data/ufs_rts ufs_rt_cache: /home/runner/ufs_rts + steps: ####################################################################################### - # + # Checkout SCM code, setup python. ####################################################################################### - name: Checkout code @@ -39,44 +38,32 @@ jobs: auto-update-conda: true auto-activate-base: true -# - name: Add conda to system path -# run: | -# echo $CONDA/bin >> $GITHUB_PATH -# -# - name: Cache Conda environment -# uses: actions/cache@v3 -# with: -# path: ~/conda_pkgs_dir -# key: conda-pkgs -# -# - name: Setup Python -# run: | -# conda env create -f environment.yml #environment-ufsreplay.yml -# conda activate scm_py37 #env_ufsreplay - ####################################################################################### # Create UFS-replay case for SCM using UWM Regression Tests ####################################################################################### -# - name: Cache UWM regression test output. + - name: Cache UWM regression test output. + uses: actions/cache@v3 + with: + path: ${dir_rt_cache} + key: ufs-rt-files -# - name: Download UWM regression tests from DTC FTP site. -# run: | -# if test ! -d "${dir_rt_cache}"; then -# mkdir -p ${dir_rt_cache} && cd ${dir_rt_cache} -# wget ftp://ftp.rap.ucar.edu:/pub/ccpp-scm/ufs_rts_scmreplay_ci.tar -# tar -xvf ufs_rts_scmreplay_ci.tar -# ls ${dir_rt_cache} -# fi -# for file in "${dir_rt_cache}"/*; do -# if test ! -d "${file}"; then -# echo "copying '${file}'..." -# cp "${file}" "${GITHUB_WORKSPACE}" -# fi -# done + - name: Download UWM regression tests from DTC FTP site. + run: | + if test ! -d "${dir_rt_cache}"; then + mkdir -p ${dir_rt_cache} && cd ${dir_rt_cache} + wget ftp://ftp.rap.ucar.edu:/pub/ccpp-scm/ufs_rts_scmreplay_ci.tar + tar -xvf ufs_rts_scmreplay_ci.tar + ls ${dir_rt_cache} + fi + for file in "${dir_rt_cache}"/*; do + if test ! -d "${file}"; then + echo "copying '${file}'..." + cp "${file}" "${GITHUB_WORKSPACE}/data/ufs_rts" + fi + done - name: Run UFS_forcing_ensemble_generator.py run: | cd ${GITHUB_WORKSPACE}/scm/etc/scripts/ - pwd ./UFS_forcing_ensemble_generator.py -h From c6ecc6df4094328b634b2db2a5ca9842f098b0e4 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 11:39:07 -0600 Subject: [PATCH 48/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 09cb0cdcb..751bb26e3 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -13,7 +13,7 @@ jobs: # Environmental variables env: - ufs_rt_cache: /home/runner/ufs_rts + dir_rt_cache: /home/runner/ufs_rts steps: @@ -48,7 +48,7 @@ jobs: path: ${dir_rt_cache} key: ufs-rt-files - - name: Download UWM regression tests from DTC FTP site. + - name: Download UWM regression tests from NCAR-DTC FTP site. run: | if test ! -d "${dir_rt_cache}"; then mkdir -p ${dir_rt_cache} && cd ${dir_rt_cache} @@ -67,3 +67,12 @@ jobs: run: | cd ${GITHUB_WORKSPACE}/scm/etc/scripts/ ./UFS_forcing_ensemble_generator.py -h + + ####################################################################################### + # Run UFS-replay case in SCM + ####################################################################################### + + + ####################################################################################### + # Done + ####################################################################################### \ No newline at end of file From d6ab1d13326ebf844c09c824dc80627ce9316eb7 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 11:42:57 -0600 Subject: [PATCH 49/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 751bb26e3..af15dffab 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -66,12 +66,17 @@ jobs: - name: Run UFS_forcing_ensemble_generator.py run: | cd ${GITHUB_WORKSPACE}/scm/etc/scripts/ - ./UFS_forcing_ensemble_generator.py -h + ./UFS_forcing_ensemble_generator.py -d ${GITHUB_WORKSPACE}/data/ufs_rts/ -sc --C_RES 192 -dt 360 -n control_c192 -lons 300 -lats 34 ####################################################################################### # Run UFS-replay case in SCM ####################################################################################### +# - name: Run the SCM using the UFS-replay column. +# run: | +# cd ${GITHUB_WORKSPACE}/scm/bin +# ./run_scm.py --npz_type gfs --file scm_ufsens_control_c192.py --timestep 360 + ####################################################################################### # Done From c76cbaf0d9108978c0937c9a8dbdc3e835baa1f4 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 11:55:32 -0600 Subject: [PATCH 50/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 108 ++++++++++++++++++-- 1 file changed, 102 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index af15dffab..e2e5ac859 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -14,6 +14,11 @@ jobs: # Environmental variables env: dir_rt_cache: /home/runner/ufs_rts + NFHOME: /home/runner/netcdf-fortran + NFVERSION: v4.5.3 + bacio_ROOT: /home/runner/bacio + sp_ROOT: /home/runner/NCEPLIBS-sp + w3emc_ROOT: /home/runner/myw3emc steps: @@ -52,7 +57,7 @@ jobs: run: | if test ! -d "${dir_rt_cache}"; then mkdir -p ${dir_rt_cache} && cd ${dir_rt_cache} - wget ftp://ftp.rap.ucar.edu:/pub/ccpp-scm/ufs_rts_scmreplay_ci.tar + wget -q ftp://ftp.rap.ucar.edu:/pub/ccpp-scm/ufs_rts_scmreplay_ci.tar tar -xvf ufs_rts_scmreplay_ci.tar ls ${dir_rt_cache} fi @@ -69,14 +74,105 @@ jobs: ./UFS_forcing_ensemble_generator.py -d ${GITHUB_WORKSPACE}/data/ufs_rts/ -sc --C_RES 192 -dt 360 -n control_c192 -lons 300 -lats 34 ####################################################################################### - # Run UFS-replay case in SCM + # Setup environment for SCM. ####################################################################################### -# - name: Run the SCM using the UFS-replay column. -# run: | -# cd ${GITHUB_WORKSPACE}/scm/bin -# ./run_scm.py --npz_type gfs --file scm_ufsens_control_c192.py --timestep 360 + - name: Cache bacio library v2.4.1 + id: cache-bacio-fortran + uses: actions/cache@v3 + with: + path: /home/runner/bacio + key: cache-bacio-fortran-${{matrix.fortran-compiler}}-key + + - name: Install bacio library v2.4.1 + if: steps.cache-bacio-fortran.outputs.cache-hit != 'true' + run: | + git clone --branch v2.4.1 https://github.com/NOAA-EMC/NCEPLIBS-bacio.git bacio + cd bacio && mkdir build && cd build + cmake -DCMAKE_INSTALL_PREFIX=${bacio_ROOT} ../ + make -j2 + make install + echo "bacio_DIR=/home/runner/bacio/lib/cmake/bacio" >> $GITHUB_ENV + + - name: Cache SP-library v2.3.3 + id: cache-sp-fortran + uses: actions/cache@v3 + with: + path: /home/runner/NCEPLIBS-sp + key: cache-sp-fortran-${{matrix.fortran-compiler}}-key + + - name: Install SP-library v2.3.3 + if: steps.cache-sp-fortran.outputs.cache-hit != 'true' + run: | + git clone --branch v2.3.3 https://github.com/NOAA-EMC/NCEPLIBS-sp.git NCEPLIBS-sp + cd NCEPLIBS-sp && mkdir build && cd build + cmake -DCMAKE_INSTALL_PREFIX=${sp_ROOT} ../ + make -j2 + make install + echo "sp_DIR=/home/runner/NCEPLIBS-sp/lib/cmake/sp" >> $GITHUB_ENV + + - name: Cache w3emc library v2.9.2 + id: cache-w3emc-fortran + uses: actions/cache@v3 + with: + path: /home/runner/myw3emc + key: cache-w3emc-fortran-${{matrix.fortran-compiler}}-key + + - name: Install w3emc library v2.9.2 + if: steps.cache-w3emc-fortran.outputs.cache-hit != 'true' + run: | + git clone --branch v2.9.2 https://github.com/NOAA-EMC/NCEPLIBS-w3emc.git NCEPLIBS-w3emc + cd NCEPLIBS-w3emc && mkdir build && cd build + cmake -DCMAKE_INSTALL_PREFIX=${w3emc_ROOT} ../ + make -j2 + make install + echo "w3emc_DIR=/home/runner/myw3emc/lib/cmake/w3emc" >> $GITHUB_ENV + + - name: Install NetCDF C library + run: sudo apt-get install libnetcdf-dev + + - name: Cache NetCDF Fortran library v4.4.4 + id: cache-netcdf-fortran + uses: actions/cache@v3 + with: + path: /home/runner/netcdf-fortran + key: cache-netcdf-fortran-${{matrix.fortran-compiler}}-key + + - name: Install NetCDF Fortran library + if: steps.cache-netcdf-fortran.outputs.cache-hit != 'true' + run: | + git clone --branch ${NFVERSION} https://github.com/Unidata/netcdf-fortran.git + cd netcdf-fortran + ./configure + make -j + sudo make install + export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${NFHOME}/lib + ####################################################################################### + # Build SCM, run UFS-replay case. + ####################################################################################### + + - name: Download data for SCM + run: | + cd ${GITHUB_WORKSPACE} + ./contrib/get_all_static_data.sh + ./contrib/get_thompson_tables.sh + + - name: Configure build with CMake + run: | + cd ${GITHUB_WORKSPACE}/scm + mkdir bin && cd bin + cmake -DCCPP_SUITES=${suites} ../src + + - name: Build SCM + run: | + cd ${GITHUB_WORKSPACE}/scm/bin + make -j4 + + - name: Run the SCM using the UFS-replay column case. + run: | + cd ${GITHUB_WORKSPACE}/scm/bin + ./run_scm.py --npz_type gfs --file scm_ufsens_control_c192.py --timestep 360 ####################################################################################### # Done From e57e966ce7fb96fe153966c2378b9a5385539e86 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 12:15:09 -0600 Subject: [PATCH 51/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index e2e5ac859..e8b087b04 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -64,7 +64,7 @@ jobs: for file in "${dir_rt_cache}"/*; do if test ! -d "${file}"; then echo "copying '${file}'..." - cp "${file}" "${GITHUB_WORKSPACE}/data/ufs_rts" + cp "${file}" "${GITHUB_WORKSPACE}/scm/data/ufs_rts" fi done From e4ae622b95827d5ea3c5cdafd0ea026bed3f0f00 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 12:28:49 -0600 Subject: [PATCH 52/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 28 +++++++++++++-------- environment-ufsreplay.yml | 3 ++- environment.yml | 1 + 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index e8b087b04..9da987e89 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -35,7 +35,14 @@ jobs: - name: Update system packages run: sudo apt-get update - - uses: conda-incubator/setup-miniconda@v2 + - name: Cache conda/python. + uses: actions/cache@v3 + with: + path: ~/conda_pkgs_dir + key: conda-pkgs + + - name: Setup python. + uses: conda-incubator/setup-miniconda@v2 with: activate-environment: env_ufsreplay environment-file: environment-ufsreplay.yml @@ -53,7 +60,7 @@ jobs: path: ${dir_rt_cache} key: ufs-rt-files - - name: Download UWM regression tests from NCAR-DTC FTP site. + - name: Stage UWM regression test data (download from NCAR-DTC FTP site, if not cached). run: | if test ! -d "${dir_rt_cache}"; then mkdir -p ${dir_rt_cache} && cd ${dir_rt_cache} @@ -61,20 +68,21 @@ jobs: tar -xvf ufs_rts_scmreplay_ci.tar ls ${dir_rt_cache} fi - for file in "${dir_rt_cache}"/*; do - if test ! -d "${file}"; then - echo "copying '${file}'..." - cp "${file}" "${GITHUB_WORKSPACE}/scm/data/ufs_rts" - fi - done + #for file in "${dir_rt_cache}"/*; do + # if test ! -d "${file}"; then + # echo "copying '${file}'..." + # cp "${file}" "${GITHUB_WORKSPACE}/scm/data/ufs_rts" + # fi + #done - name: Run UFS_forcing_ensemble_generator.py run: | cd ${GITHUB_WORKSPACE}/scm/etc/scripts/ - ./UFS_forcing_ensemble_generator.py -d ${GITHUB_WORKSPACE}/data/ufs_rts/ -sc --C_RES 192 -dt 360 -n control_c192 -lons 300 -lats 34 - +# ./UFS_forcing_ensemble_generator.py -d ${GITHUB_WORKSPACE}/data/ufs_rts/ -sc --C_RES 192 -dt 360 -n control_c192 -lons 300 -lats 34 + ./UFS_forcing_ensemble_generator.py -d ${dir_rt_cache}/ --C_RES 192 -dt 360 -n control_c192 -lons 300 -lats 34 ####################################################################################### # Setup environment for SCM. + # *NOTE* We should add hpstack ci build. ####################################################################################### - name: Cache bacio library v2.4.1 diff --git a/environment-ufsreplay.yml b/environment-ufsreplay.yml index 0033a690e..4b2091492 100644 --- a/environment-ufsreplay.yml +++ b/environment-ufsreplay.yml @@ -1,7 +1,7 @@ name: env_ufsreplay dependencies: - - conda-forge::python=3.7 + - conda-forge::python=3.8.5 - conda-forge::netcdf4 - conda-forge::f90nml - conda-forge::xarray @@ -9,4 +9,5 @@ dependencies: - conda-forge::shapely - conda-forge::xesmf variables: + SCM_WORK: $PWD/ SCM_ROOT: $PWD/ \ No newline at end of file diff --git a/environment.yml b/environment.yml index 0d6570816..ea997461e 100644 --- a/environment.yml +++ b/environment.yml @@ -5,4 +5,5 @@ dependencies: - conda-forge::netcdf4 - conda-forge::f90nml variables: + SCM_WORK: $PWD/ SCM_ROOT: $PWD/ \ No newline at end of file From edbfe692a57ab2991cb5d7c30d0ef15f0240c936 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 12:30:01 -0600 Subject: [PATCH 53/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 9da987e89..61c6af7f2 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -68,17 +68,10 @@ jobs: tar -xvf ufs_rts_scmreplay_ci.tar ls ${dir_rt_cache} fi - #for file in "${dir_rt_cache}"/*; do - # if test ! -d "${file}"; then - # echo "copying '${file}'..." - # cp "${file}" "${GITHUB_WORKSPACE}/scm/data/ufs_rts" - # fi - #done - name: Run UFS_forcing_ensemble_generator.py run: | cd ${GITHUB_WORKSPACE}/scm/etc/scripts/ -# ./UFS_forcing_ensemble_generator.py -d ${GITHUB_WORKSPACE}/data/ufs_rts/ -sc --C_RES 192 -dt 360 -n control_c192 -lons 300 -lats 34 ./UFS_forcing_ensemble_generator.py -d ${dir_rt_cache}/ --C_RES 192 -dt 360 -n control_c192 -lons 300 -lats 34 ####################################################################################### # Setup environment for SCM. From a96c0a6a5f046ec77a10c8c7cba9395ee4366442 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 12:36:29 -0600 Subject: [PATCH 54/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 61c6af7f2..6d10f6834 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -10,6 +10,10 @@ jobs: defaults: run: shell: bash -el {0} + # + strategy: + matrix: + fortran-compiler: [gfortran-12] # Environmental variables env: @@ -19,6 +23,7 @@ jobs: bacio_ROOT: /home/runner/bacio sp_ROOT: /home/runner/NCEPLIBS-sp w3emc_ROOT: /home/runner/myw3emc + suites: SCM_GFS_v16,SCM_GFS_v16_ps steps: @@ -26,13 +31,13 @@ jobs: # Checkout SCM code, setup python. ####################################################################################### - - name: Checkout code + - name: Checkout SCM. uses: actions/checkout@v2 - - name: Initialize submodules + - name: Initialize SCM submodules. run: git submodule update --init --recursive - - name: Update system packages + - name: Update system packages. run: sudo apt-get update - name: Cache conda/python. @@ -60,7 +65,7 @@ jobs: path: ${dir_rt_cache} key: ufs-rt-files - - name: Stage UWM regression test data (download from NCAR-DTC FTP site, if not cached). + - name: Download UWM regression test output from NCAR-DTC FTP site, if not cached. run: | if test ! -d "${dir_rt_cache}"; then mkdir -p ${dir_rt_cache} && cd ${dir_rt_cache} @@ -69,13 +74,14 @@ jobs: ls ${dir_rt_cache} fi - - name: Run UFS_forcing_ensemble_generator.py + - name: Create UFS-replay case. run: | cd ${GITHUB_WORKSPACE}/scm/etc/scripts/ ./UFS_forcing_ensemble_generator.py -d ${dir_rt_cache}/ --C_RES 192 -dt 360 -n control_c192 -lons 300 -lats 34 + ####################################################################################### # Setup environment for SCM. - # *NOTE* We should add hpstack ci build. + # *NOTE* We should add hpstack and replace this section. ####################################################################################### - name: Cache bacio library v2.4.1 From 4e9576272933571b22db33cf4df5f830e05118d9 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 13:59:08 -0600 Subject: [PATCH 55/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 6d10f6834..9ddd56a3d 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -24,6 +24,7 @@ jobs: sp_ROOT: /home/runner/NCEPLIBS-sp w3emc_ROOT: /home/runner/myw3emc suites: SCM_GFS_v16,SCM_GFS_v16_ps + SCM_WORK: ${GITHUB_WORKSPACE} steps: From e8ae9fc7016c331c1c7674c9d35ad7e611f037cb Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 14:14:46 -0600 Subject: [PATCH 56/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 9ddd56a3d..2e9fc342c 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -41,20 +41,14 @@ jobs: - name: Update system packages. run: sudo apt-get update - - name: Cache conda/python. - uses: actions/cache@v3 - with: - path: ~/conda_pkgs_dir - key: conda-pkgs - - name: Setup python. uses: conda-incubator/setup-miniconda@v2 with: activate-environment: env_ufsreplay environment-file: environment-ufsreplay.yml use-only-tar-bz2: true - auto-update-conda: true auto-activate-base: true + auto-update-conda: true ####################################################################################### # Create UFS-replay case for SCM using UWM Regression Tests From 67f3f851dc80ed0afad7527548bbdcf307f361ab Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 14:32:47 -0600 Subject: [PATCH 57/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 2e9fc342c..2ffd4a476 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -41,6 +41,12 @@ jobs: - name: Update system packages. run: sudo apt-get update + - name: Cache conda + uses: actions/cache@v2 + with: + path: ~/conda_pkgs_dir + key: ${{ runner.os }}-conda + - name: Setup python. uses: conda-incubator/setup-miniconda@v2 with: From 2679bb93013fddf41b3a669496c48bc0c9cbfc98 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 14:35:00 -0600 Subject: [PATCH 58/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_DEPHY.yml | 2 +- .github/workflows/ci_run_scm_rts.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_run_scm_DEPHY.yml b/.github/workflows/ci_run_scm_DEPHY.yml index a07f1698a..3e598c975 100644 --- a/.github/workflows/ci_run_scm_DEPHY.yml +++ b/.github/workflows/ci_run_scm_DEPHY.yml @@ -1,6 +1,6 @@ name: CI test to run the SCM with DEPHY v1 data -on: [push, pull_request] +on: [workflow_dispatch] jobs: run-scm-DEPHY: diff --git a/.github/workflows/ci_run_scm_rts.yml b/.github/workflows/ci_run_scm_rts.yml index 436dc9379..c322a95cb 100644 --- a/.github/workflows/ci_run_scm_rts.yml +++ b/.github/workflows/ci_run_scm_rts.yml @@ -1,6 +1,6 @@ name: CI test to build and run SCM regression tests -on: [pull_request, workflow_dispatch] +on: [workflow_dispatch] jobs: run_scm_rts: From 76955c14b93247db6143cd48841704a0e1e3daff Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 15:25:26 -0600 Subject: [PATCH 59/81] Update CI test for UFS replay --- scm/etc/scripts/UFS_forcing_ensemble_generator.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/scm/etc/scripts/UFS_forcing_ensemble_generator.py b/scm/etc/scripts/UFS_forcing_ensemble_generator.py index c529c31d6..86e70b8bb 100755 --- a/scm/etc/scripts/UFS_forcing_ensemble_generator.py +++ b/scm/etc/scripts/UFS_forcing_ensemble_generator.py @@ -66,13 +66,6 @@ def main(): print("ERROR: Number of longitude/latitudes are inconsistent") exit() - # Make sure that SCM_WORK has been set. - try: - dir_scm = os.getenv('SCM_WORK')+'/' - except: - print("Environment variable SCM_WORK not set. Stopping.") - exit() - ########################################################################### # # Set longitude/latitude From 9f06ac3f148c9c01fca8c83a6abf64e494bee0cd Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 15:54:46 -0600 Subject: [PATCH 60/81] Update CI test for UFS replay --- environment-ufsreplay.yml | 3 --- environment.yml | 3 --- scm/etc/scripts/UFS_forcing_ensemble_generator.py | 7 +++++++ 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/environment-ufsreplay.yml b/environment-ufsreplay.yml index 4b2091492..fc76fe24b 100644 --- a/environment-ufsreplay.yml +++ b/environment-ufsreplay.yml @@ -8,6 +8,3 @@ dependencies: - conda-forge::numpy - conda-forge::shapely - conda-forge::xesmf -variables: - SCM_WORK: $PWD/ - SCM_ROOT: $PWD/ \ No newline at end of file diff --git a/environment.yml b/environment.yml index ea997461e..02b6eb2f4 100644 --- a/environment.yml +++ b/environment.yml @@ -4,6 +4,3 @@ dependencies: - conda-forge::python=3.7 - conda-forge::netcdf4 - conda-forge::f90nml -variables: - SCM_WORK: $PWD/ - SCM_ROOT: $PWD/ \ No newline at end of file diff --git a/scm/etc/scripts/UFS_forcing_ensemble_generator.py b/scm/etc/scripts/UFS_forcing_ensemble_generator.py index 86e70b8bb..c529c31d6 100755 --- a/scm/etc/scripts/UFS_forcing_ensemble_generator.py +++ b/scm/etc/scripts/UFS_forcing_ensemble_generator.py @@ -66,6 +66,13 @@ def main(): print("ERROR: Number of longitude/latitudes are inconsistent") exit() + # Make sure that SCM_WORK has been set. + try: + dir_scm = os.getenv('SCM_WORK')+'/' + except: + print("Environment variable SCM_WORK not set. Stopping.") + exit() + ########################################################################### # # Set longitude/latitude From 207886576843c04297a37ab7f85a796b4363e33b Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 10 Apr 2023 16:42:00 -0600 Subject: [PATCH 61/81] Update CI test for UFS replay --- scm/etc/scripts/UFS_forcing_ensemble_generator.py | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/scm/etc/scripts/UFS_forcing_ensemble_generator.py b/scm/etc/scripts/UFS_forcing_ensemble_generator.py index c529c31d6..b13c486eb 100755 --- a/scm/etc/scripts/UFS_forcing_ensemble_generator.py +++ b/scm/etc/scripts/UFS_forcing_ensemble_generator.py @@ -66,13 +66,6 @@ def main(): print("ERROR: Number of longitude/latitudes are inconsistent") exit() - # Make sure that SCM_WORK has been set. - try: - dir_scm = os.getenv('SCM_WORK')+'/' - except: - print("Environment variable SCM_WORK not set. Stopping.") - exit() - ########################################################################### # # Set longitude/latitude @@ -129,7 +122,7 @@ def main(): for pt in range(0,npts): # Call UFS_IC_generator.py case_name = args.case_name +"_n" + str(pt).zfill(3) - file_scminput = dir_scm+"scm/data/processed_case_input/"+case_name+"_SCM_driver.nc" + file_scminput = "../../data/processed_case_input/"+case_name+"_SCM_driver.nc" com = "./UFS_IC_generator.py -l " +str(lons[pt]) + " " + str(lats[pt]) + \ " -i " + args.dir_ic + " -g " + args.dir_grid + " -f " + args.dir_forcing + " -n " + case_name + com_config print(com) @@ -144,7 +137,7 @@ def main(): sfc_type = int(np.round_(dataset.slmsk.values[0])) # Create case_config file(s) - fileOUT = dir_scm+"scm/etc/case_config/"+case_name+".nml" + fileOUT = "../../etc/case_config/"+case_name+".nml" fileID = open(fileOUT, 'w') fileID.write('$case_config') fileID.write('\n') @@ -170,11 +163,11 @@ def main(): # Create "multirun file list" needed by run_scm.py # ########################################################################### - com = "mkdir -p "+dir_scm+"scm/bin/" + com = "mkdir -p ../../bin/" print(com) os.system(com) fileOUT = "scm_ufsens_"+args.case_name+".py" - fileID = open(dir_scm+"scm/bin/"+fileOUT, 'w') + fileID = open("../../bin/"+fileOUT, 'w') fileID.write('run_list = [') fileID.write('\n') for run in run_list: From 58da39069ccba5555f95e14875739b9e626ad91a Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 11 Apr 2023 09:41:37 -0600 Subject: [PATCH 62/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 2ffd4a476..31834c1b4 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -168,8 +168,7 @@ jobs: - name: Configure build with CMake run: | - cd ${GITHUB_WORKSPACE}/scm - mkdir bin && cd bin + cd ${GITHUB_WORKSPACE}/scm/bin cmake -DCCPP_SUITES=${suites} ../src - name: Build SCM From 8266e075e5fd1a2b3400b75ca9c275cc1dd421f2 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 11 Apr 2023 10:11:22 -0600 Subject: [PATCH 63/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 31834c1b4..14dab2da4 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -25,6 +25,7 @@ jobs: w3emc_ROOT: /home/runner/myw3emc suites: SCM_GFS_v16,SCM_GFS_v16_ps SCM_WORK: ${GITHUB_WORKSPACE} + SCM_ROOT: ${GITHUB_WORKSPACE} steps: From 3b7c82ab569ad47370a3aa1da956f5db594ff297 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 11 Apr 2023 10:23:33 -0600 Subject: [PATCH 64/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 14dab2da4..d12631d79 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -43,10 +43,10 @@ jobs: run: sudo apt-get update - name: Cache conda - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ~/conda_pkgs_dir - key: ${{ runner.os }}-conda + key: conda-pkgs - name: Setup python. uses: conda-incubator/setup-miniconda@v2 From caa2230a4d0e09d88c6b0f82572f88c29e4b890e Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 11 Apr 2023 11:47:32 -0600 Subject: [PATCH 65/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index d12631d79..085397042 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -24,8 +24,8 @@ jobs: sp_ROOT: /home/runner/NCEPLIBS-sp w3emc_ROOT: /home/runner/myw3emc suites: SCM_GFS_v16,SCM_GFS_v16_ps - SCM_WORK: ${GITHUB_WORKSPACE} - SCM_ROOT: ${GITHUB_WORKSPACE} + SCM_WORK: ${{ github.workspace }} + SCM_ROOT: ${{ github.workspace }} steps: From a1bf06597dbb2bfd5530a7642b41d290fa1a4287 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 11 Apr 2023 13:02:39 -0600 Subject: [PATCH 66/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 085397042..764da6fd2 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -1,6 +1,6 @@ name: CI test to create SCM UFS-replay cases from UWM regression tests -on: [push, pull_request] +on: [pull_request] jobs: run_scm_ufs_replay: @@ -34,7 +34,7 @@ jobs: ####################################################################################### - name: Checkout SCM. - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Initialize SCM submodules. run: git submodule update --init --recursive From 1ac2930a565b79685e52e05a5c33c7b6a70a3984 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 11 Apr 2023 13:07:09 -0600 Subject: [PATCH 67/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 764da6fd2..ef5edf8f0 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -35,6 +35,8 @@ jobs: - name: Checkout SCM. uses: actions/checkout@v3 + with: + ls -l ${{ github.workspace }}/scm/etc/scripts - name: Initialize SCM submodules. run: git submodule update --init --recursive From f1c2264af698aaf4c8dd7251cf9ae59da494a395 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 11 Apr 2023 13:09:10 -0600 Subject: [PATCH 68/81] Update CI test for UFS replay --- .github/workflows/ci_run_scm_ufs_replay.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index ef5edf8f0..23faaec06 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -35,8 +35,9 @@ jobs: - name: Checkout SCM. uses: actions/checkout@v3 - with: - ls -l ${{ github.workspace }}/scm/etc/scripts + + - name: Check + run: ls -l ${{ github.workspace }}/scm/etc/scripts - name: Initialize SCM submodules. run: git submodule update --init --recursive From d8b9e6be6e7239bd6e3a364536d16be0c0d44627 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 11 Apr 2023 15:07:42 -0600 Subject: [PATCH 69/81] Update to CI --- .github/workflows/ci_run_scm_ufs_replay.yml | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 23faaec06..9391e6f2f 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -36,9 +36,6 @@ jobs: - name: Checkout SCM. uses: actions/checkout@v3 - - name: Check - run: ls -l ${{ github.workspace }}/scm/etc/scripts - - name: Initialize SCM submodules. run: git submodule update --init --recursive @@ -81,7 +78,7 @@ jobs: - name: Create UFS-replay case. run: | - cd ${GITHUB_WORKSPACE}/scm/etc/scripts/ + cd ${SCM_ROOT}/scm/etc/scripts/ ./UFS_forcing_ensemble_generator.py -d ${dir_rt_cache}/ --C_RES 192 -dt 360 -n control_c192 -lons 300 -lats 34 ####################################################################################### @@ -166,24 +163,24 @@ jobs: - name: Download data for SCM run: | - cd ${GITHUB_WORKSPACE} + cd ${SCM_ROOT} ./contrib/get_all_static_data.sh ./contrib/get_thompson_tables.sh - name: Configure build with CMake run: | - cd ${GITHUB_WORKSPACE}/scm/bin + cd ${SCM_ROOT}/scm/bin cmake -DCCPP_SUITES=${suites} ../src - name: Build SCM run: | - cd ${GITHUB_WORKSPACE}/scm/bin + cd ${SCM_ROOT}/scm/bin make -j4 - name: Run the SCM using the UFS-replay column case. run: | - cd ${GITHUB_WORKSPACE}/scm/bin - ./run_scm.py --npz_type gfs --file scm_ufsens_control_c192.py --timestep 360 + cd ${SCM_ROOT}/scm/bin + ./run_scm.py --npz_type gfs --file ${{ github.workspace }}/scm/bin/scm_ufsens_control_c192.py --timestep 360 -v ####################################################################################### # Done From 9dc2bd3ec3cc746158682605ec3046a25188a994 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 11 Apr 2023 16:08:58 -0600 Subject: [PATCH 70/81] Update to CI --- .github/workflows/ci_run_scm_ufs_replay.yml | 43 +++++++++++++++------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 9391e6f2f..623f67332 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -42,20 +42,39 @@ jobs: - name: Update system packages. run: sudo apt-get update - - name: Cache conda - uses: actions/cache@v3 +# - name: Cache conda +# uses: actions/cache@v3 +# with: +# path: ~/conda_pkgs_dir +# key: conda-pkgs + +# - name: Setup python. +# uses: conda-incubator/setup-miniconda@v2 +# with: +# activate-environment: env_ufsreplay +# environment-file: environment-ufsreplay.yml +# use-only-tar-bz2: true +# auto-activate-base: true +# auto-update-conda: true + + - name: Set up Python 3.8.5 + uses: actions/setup-python@v3 with: - path: ~/conda_pkgs_dir - key: conda-pkgs + python-version: 3.8.5 - - name: Setup python. - uses: conda-incubator/setup-miniconda@v2 - with: - activate-environment: env_ufsreplay - environment-file: environment-ufsreplay.yml - use-only-tar-bz2: true - auto-activate-base: true - auto-update-conda: true + - name: Add conda to system path + run: | + # $CONDA is an environment variable pointing to the root of the miniconda directory + echo $CONDA/bin >> $GITHUB_PATH + + - name: Install python libraries + run: | + conda install --yes -c conda-forge f90nml + conda install --yes -c conda-forge netCDF4 + conda install --yes -c conda-forge xarray + conda install --yes -c conda-forge numpy + conda install --yes -c conda-forge shapely + conda install --yes -c conda-forge xesmf ####################################################################################### # Create UFS-replay case for SCM using UWM Regression Tests From 35cffbae284a7b5c3e7a518eae2d4cb1d5531c5c Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 11 Apr 2023 16:23:38 -0600 Subject: [PATCH 71/81] Update to CI --- .github/workflows/ci_run_scm_ufs_replay.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 623f67332..cb0535928 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -7,9 +7,9 @@ jobs: # The type of runner that the job will run on runs-on: ubuntu-22.04 - defaults: - run: - shell: bash -el {0} +# defaults: +# run: +# shell: bash -el {0} # strategy: matrix: From f88ee389c4e62aa8799bf515473d9aaf4b25954d Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 11 Apr 2023 16:25:28 -0600 Subject: [PATCH 72/81] Update to CI --- .github/workflows/ci_run_scm_ufs_replay.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index cb0535928..3d5ba0591 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -6,10 +6,10 @@ jobs: run_scm_ufs_replay: # The type of runner that the job will run on - runs-on: ubuntu-22.04 -# defaults: -# run: -# shell: bash -el {0} + runs-on: ubuntu-20.04 + defaults: + run: + shell: bash -el {0} # strategy: matrix: From 570872bdbf73998b2f71307b2b5b9a489880be4b Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 11 Apr 2023 16:37:31 -0600 Subject: [PATCH 73/81] Update to CI --- .github/workflows/ci_run_scm_ufs_replay.yml | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 3d5ba0591..7c889ab5f 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -7,9 +7,9 @@ jobs: # The type of runner that the job will run on runs-on: ubuntu-20.04 - defaults: - run: - shell: bash -el {0} +# defaults: +# run: +# shell: bash -el {0} # strategy: matrix: @@ -42,21 +42,6 @@ jobs: - name: Update system packages. run: sudo apt-get update -# - name: Cache conda -# uses: actions/cache@v3 -# with: -# path: ~/conda_pkgs_dir -# key: conda-pkgs - -# - name: Setup python. -# uses: conda-incubator/setup-miniconda@v2 -# with: -# activate-environment: env_ufsreplay -# environment-file: environment-ufsreplay.yml -# use-only-tar-bz2: true -# auto-activate-base: true -# auto-update-conda: true - - name: Set up Python 3.8.5 uses: actions/setup-python@v3 with: From 4a9ea720f6b9df41965ac574e1960c2c99e7ff01 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 11 Apr 2023 16:52:15 -0600 Subject: [PATCH 74/81] Update to CI --- .github/workflows/ci_run_scm_ufs_replay.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 7c889ab5f..27a9899cf 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -39,9 +39,6 @@ jobs: - name: Initialize SCM submodules. run: git submodule update --init --recursive - - name: Update system packages. - run: sudo apt-get update - - name: Set up Python 3.8.5 uses: actions/setup-python@v3 with: @@ -61,6 +58,9 @@ jobs: conda install --yes -c conda-forge shapely conda install --yes -c conda-forge xesmf + - name: Update system packages. + run: sudo apt-get update + ####################################################################################### # Create UFS-replay case for SCM using UWM Regression Tests ####################################################################################### From 4c469ed64674a64072cf215801caed390f223a18 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 11 Apr 2023 17:11:07 -0600 Subject: [PATCH 75/81] Update to CI --- .github/workflows/ci_run_scm_ufs_replay.yml | 42 ++++++++++----------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 27a9899cf..3dd158ea6 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -6,10 +6,10 @@ jobs: run_scm_ufs_replay: # The type of runner that the job will run on - runs-on: ubuntu-20.04 -# defaults: -# run: -# shell: bash -el {0} + runs-on: ubuntu-22.04 + defaults: + run: + shell: bash -el {0} # strategy: matrix: @@ -39,28 +39,24 @@ jobs: - name: Initialize SCM submodules. run: git submodule update --init --recursive - - name: Set up Python 3.8.5 - uses: actions/setup-python@v3 - with: - python-version: 3.8.5 - - - name: Add conda to system path - run: | - # $CONDA is an environment variable pointing to the root of the miniconda directory - echo $CONDA/bin >> $GITHUB_PATH - - - name: Install python libraries - run: | - conda install --yes -c conda-forge f90nml - conda install --yes -c conda-forge netCDF4 - conda install --yes -c conda-forge xarray - conda install --yes -c conda-forge numpy - conda install --yes -c conda-forge shapely - conda install --yes -c conda-forge xesmf - - name: Update system packages. run: sudo apt-get update + - name: Cache conda + uses: actions/cache@v3 + with: + path: ~/conda_pkgs_dir + key: conda-pkgs + + - name: Setup python. + uses: conda-incubator/setup-miniconda@v2 + with: + activate-environment: env_ufsreplay + environment-file: environment-ufsreplay.yml + use-only-tar-bz2: false + auto-activate-base: true + auto-update-conda: false + ####################################################################################### # Create UFS-replay case for SCM using UWM Regression Tests ####################################################################################### From 5000c474191ff9665f0d91c2211df622c137c9f4 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 11 Apr 2023 21:16:31 -0600 Subject: [PATCH 76/81] Update to CI --- .github/workflows/ci_run_scm_ufs_replay.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 3dd158ea6..9391e6f2f 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -53,9 +53,9 @@ jobs: with: activate-environment: env_ufsreplay environment-file: environment-ufsreplay.yml - use-only-tar-bz2: false + use-only-tar-bz2: true auto-activate-base: true - auto-update-conda: false + auto-update-conda: true ####################################################################################### # Create UFS-replay case for SCM using UWM Regression Tests From 03d668508d0dde8507247a8941eb3e16a9085631 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Wed, 12 Apr 2023 08:36:58 -0600 Subject: [PATCH 77/81] Update to CI --- .github/workflows/ci_run_scm_ufs_replay.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 9391e6f2f..23f0b9fe9 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -79,7 +79,7 @@ jobs: - name: Create UFS-replay case. run: | cd ${SCM_ROOT}/scm/etc/scripts/ - ./UFS_forcing_ensemble_generator.py -d ${dir_rt_cache}/ --C_RES 192 -dt 360 -n control_c192 -lons 300 -lats 34 + ./UFS_forcing_ensemble_generator.py -d ${dir_rt_cache}/ --C_RES 192 -dt 360 -n control_c192 -lons 300 -lats 34 -sc ####################################################################################### # Setup environment for SCM. From 4e157fb4b2bfb8c7e90dfefd741c33f679bbf79e Mon Sep 17 00:00:00 2001 From: dustinswales Date: Fri, 14 Apr 2023 11:18:27 -0600 Subject: [PATCH 78/81] CI tests working! --- .github/workflows/ci_run_scm_DEPHY.yml | 2 +- .github/workflows/ci_run_scm_rts.yml | 2 +- .github/workflows/ci_run_scm_ufs_replay.yml | 101 -------------------- 3 files changed, 2 insertions(+), 103 deletions(-) diff --git a/.github/workflows/ci_run_scm_DEPHY.yml b/.github/workflows/ci_run_scm_DEPHY.yml index 3e598c975..a07f1698a 100644 --- a/.github/workflows/ci_run_scm_DEPHY.yml +++ b/.github/workflows/ci_run_scm_DEPHY.yml @@ -1,6 +1,6 @@ name: CI test to run the SCM with DEPHY v1 data -on: [workflow_dispatch] +on: [push, pull_request] jobs: run-scm-DEPHY: diff --git a/.github/workflows/ci_run_scm_rts.yml b/.github/workflows/ci_run_scm_rts.yml index c322a95cb..436dc9379 100644 --- a/.github/workflows/ci_run_scm_rts.yml +++ b/.github/workflows/ci_run_scm_rts.yml @@ -1,6 +1,6 @@ name: CI test to build and run SCM regression tests -on: [workflow_dispatch] +on: [pull_request, workflow_dispatch] jobs: run_scm_rts: diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index 23f0b9fe9..e2530900e 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -81,107 +81,6 @@ jobs: cd ${SCM_ROOT}/scm/etc/scripts/ ./UFS_forcing_ensemble_generator.py -d ${dir_rt_cache}/ --C_RES 192 -dt 360 -n control_c192 -lons 300 -lats 34 -sc - ####################################################################################### - # Setup environment for SCM. - # *NOTE* We should add hpstack and replace this section. - ####################################################################################### - - - name: Cache bacio library v2.4.1 - id: cache-bacio-fortran - uses: actions/cache@v3 - with: - path: /home/runner/bacio - key: cache-bacio-fortran-${{matrix.fortran-compiler}}-key - - - name: Install bacio library v2.4.1 - if: steps.cache-bacio-fortran.outputs.cache-hit != 'true' - run: | - git clone --branch v2.4.1 https://github.com/NOAA-EMC/NCEPLIBS-bacio.git bacio - cd bacio && mkdir build && cd build - cmake -DCMAKE_INSTALL_PREFIX=${bacio_ROOT} ../ - make -j2 - make install - echo "bacio_DIR=/home/runner/bacio/lib/cmake/bacio" >> $GITHUB_ENV - - - name: Cache SP-library v2.3.3 - id: cache-sp-fortran - uses: actions/cache@v3 - with: - path: /home/runner/NCEPLIBS-sp - key: cache-sp-fortran-${{matrix.fortran-compiler}}-key - - - name: Install SP-library v2.3.3 - if: steps.cache-sp-fortran.outputs.cache-hit != 'true' - run: | - git clone --branch v2.3.3 https://github.com/NOAA-EMC/NCEPLIBS-sp.git NCEPLIBS-sp - cd NCEPLIBS-sp && mkdir build && cd build - cmake -DCMAKE_INSTALL_PREFIX=${sp_ROOT} ../ - make -j2 - make install - echo "sp_DIR=/home/runner/NCEPLIBS-sp/lib/cmake/sp" >> $GITHUB_ENV - - - name: Cache w3emc library v2.9.2 - id: cache-w3emc-fortran - uses: actions/cache@v3 - with: - path: /home/runner/myw3emc - key: cache-w3emc-fortran-${{matrix.fortran-compiler}}-key - - - name: Install w3emc library v2.9.2 - if: steps.cache-w3emc-fortran.outputs.cache-hit != 'true' - run: | - git clone --branch v2.9.2 https://github.com/NOAA-EMC/NCEPLIBS-w3emc.git NCEPLIBS-w3emc - cd NCEPLIBS-w3emc && mkdir build && cd build - cmake -DCMAKE_INSTALL_PREFIX=${w3emc_ROOT} ../ - make -j2 - make install - echo "w3emc_DIR=/home/runner/myw3emc/lib/cmake/w3emc" >> $GITHUB_ENV - - - name: Install NetCDF C library - run: sudo apt-get install libnetcdf-dev - - - name: Cache NetCDF Fortran library v4.4.4 - id: cache-netcdf-fortran - uses: actions/cache@v3 - with: - path: /home/runner/netcdf-fortran - key: cache-netcdf-fortran-${{matrix.fortran-compiler}}-key - - - name: Install NetCDF Fortran library - if: steps.cache-netcdf-fortran.outputs.cache-hit != 'true' - run: | - git clone --branch ${NFVERSION} https://github.com/Unidata/netcdf-fortran.git - cd netcdf-fortran - ./configure - make -j - sudo make install - export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${NFHOME}/lib - - ####################################################################################### - # Build SCM, run UFS-replay case. - ####################################################################################### - - - name: Download data for SCM - run: | - cd ${SCM_ROOT} - ./contrib/get_all_static_data.sh - ./contrib/get_thompson_tables.sh - - - name: Configure build with CMake - run: | - cd ${SCM_ROOT}/scm/bin - cmake -DCCPP_SUITES=${suites} ../src - - - name: Build SCM - run: | - cd ${SCM_ROOT}/scm/bin - make -j4 - - - name: Run the SCM using the UFS-replay column case. - run: | - cd ${SCM_ROOT}/scm/bin - ./run_scm.py --npz_type gfs --file ${{ github.workspace }}/scm/bin/scm_ufsens_control_c192.py --timestep 360 -v - ####################################################################################### # Done ####################################################################################### \ No newline at end of file From a85c10a9f19aca60df66e774c3b8df8078564d9f Mon Sep 17 00:00:00 2001 From: dustinswales Date: Fri, 14 Apr 2023 11:36:27 -0600 Subject: [PATCH 79/81] Add consistent event triggers for CI tests --- .github/workflows/ci_run_scm_DEPHY.yml | 2 +- .github/workflows/ci_run_scm_ufs_replay.yml | 13 +------------ .github/workflows/ci_scm_ccpp_prebuild.yml | 2 +- 3 files changed, 3 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci_run_scm_DEPHY.yml b/.github/workflows/ci_run_scm_DEPHY.yml index a07f1698a..0f0463c77 100644 --- a/.github/workflows/ci_run_scm_DEPHY.yml +++ b/.github/workflows/ci_run_scm_DEPHY.yml @@ -1,6 +1,6 @@ name: CI test to run the SCM with DEPHY v1 data -on: [push, pull_request] +on: [pull_request,workflow_dispatch] jobs: run-scm-DEPHY: diff --git a/.github/workflows/ci_run_scm_ufs_replay.yml b/.github/workflows/ci_run_scm_ufs_replay.yml index e2530900e..0bd6a161d 100644 --- a/.github/workflows/ci_run_scm_ufs_replay.yml +++ b/.github/workflows/ci_run_scm_ufs_replay.yml @@ -1,6 +1,6 @@ name: CI test to create SCM UFS-replay cases from UWM regression tests -on: [pull_request] +on: [pull_request,workflow_dispatch] jobs: run_scm_ufs_replay: @@ -10,21 +10,10 @@ jobs: defaults: run: shell: bash -el {0} - # - strategy: - matrix: - fortran-compiler: [gfortran-12] # Environmental variables env: dir_rt_cache: /home/runner/ufs_rts - NFHOME: /home/runner/netcdf-fortran - NFVERSION: v4.5.3 - bacio_ROOT: /home/runner/bacio - sp_ROOT: /home/runner/NCEPLIBS-sp - w3emc_ROOT: /home/runner/myw3emc - suites: SCM_GFS_v16,SCM_GFS_v16_ps - SCM_WORK: ${{ github.workspace }} SCM_ROOT: ${{ github.workspace }} steps: diff --git a/.github/workflows/ci_scm_ccpp_prebuild.yml b/.github/workflows/ci_scm_ccpp_prebuild.yml index 40beaa2c0..bb9e3bd17 100644 --- a/.github/workflows/ci_scm_ccpp_prebuild.yml +++ b/.github/workflows/ci_scm_ccpp_prebuild.yml @@ -1,6 +1,6 @@ name: CI test to run SCM ccpp_prebuild script -on: [push, pull_request] +on: [push, pull_request, workflow_dispatch] jobs: build-linux: From fdeefbfcbc17ca6000eaeb39206e56e2589365d3 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 2 May 2023 11:13:24 -0600 Subject: [PATCH 80/81] Address reviewers comments --- scm/doc/TechGuide/chap_cases.tex | 4 ++-- scm/etc/scripts/UFS_forcing_ensemble_generator.py | 11 ++++------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/scm/doc/TechGuide/chap_cases.tex b/scm/doc/TechGuide/chap_cases.tex index d71b55d92..e12b75ead 100644 --- a/scm/doc/TechGuide/chap_cases.tex +++ b/scm/doc/TechGuide/chap_cases.tex @@ -132,7 +132,7 @@ \section{Included Cases} \item UFS initial conditions for 38.1 N, 98.5 W (central Kansas) for 00Z on Oct. 3, 2016 with Noah variables on the C96 FV3 grid (\execout{fv3\_model\_point\_noah.nc}) \item UFS initial conditions for 38.1 N, 98.5 W (central Kansas) for 00Z on Oct. 3, 2016 with NoahMP variables on the C96 FV3 grid (\execout{fv3\_model\_point\_noahmp.nc}) \end{itemize} -See \ref{sec:UFSreplay} for information on how to generate these files for other locations and dates, given appropriate UFS Atmosphere initial conditions. +See \ref{sec:UFSreplay} for information on how to generate these files for other locations and dates, given appropriate UFS Atmosphere initial conditions and output. \section{How to set up new cases} @@ -267,7 +267,7 @@ \subsection{UFS\_forcing\_ensemble\_generator.py} \begin{enumerate} \item \exec{-{}-dir (-d)}: path to UFS Regression Test output \item \exec{-{}-case\_name (-n)}: name of cases -\item Either: (see examples bewlow) +\item Either: (see examples below) \begin{itemize} \item \exec{-{}-lon\_limits (-lonl)} AND \exec{-{}-lat\_limits (-latl)} AND \exec{-{}-nensmembers (-nens)}: longitude range, latitude range, and number of cases to create \item \exec{-{}-lon\_list (-lons)} AND \exec{-{}-lat\_list (-lats)}: longitude and latitude of cases diff --git a/scm/etc/scripts/UFS_forcing_ensemble_generator.py b/scm/etc/scripts/UFS_forcing_ensemble_generator.py index b13c486eb..d057dc6cf 100755 --- a/scm/etc/scripts/UFS_forcing_ensemble_generator.py +++ b/scm/etc/scripts/UFS_forcing_ensemble_generator.py @@ -34,13 +34,10 @@ def main(): # Get command line arguments args = parser.parse_args() - if (not args.dir): - print("ERROR: Need to provide UFS RT directory!") - exit() - else: - args.dir_ic = args.dir + "/INPUT/" - args.dir_grid = args.dir + "/INPUT/" - args.dir_forcing = args.dir + # This asssumes using UFS Weather Model Regression Test output. + args.dir_ic = args.dir + "/INPUT/" + args.dir_grid = args.dir + "/INPUT/" + args.dir_forcing = args.dir # Error checking if (args.lon_limits and args.lon_list): From 8460880a0f6a9fc269e1ec8ea45238ae4565d2e5 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 2 May 2023 11:15:24 -0600 Subject: [PATCH 81/81] Update techguide PDF --- scm/doc/TechGuide/main.pdf | Bin 565439 -> 565520 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/scm/doc/TechGuide/main.pdf b/scm/doc/TechGuide/main.pdf index cc0ffc1a1b6c3344d49edd6f2e132519736d7cf2..0f50aceba85f31601dfc74661f005a7c7ab3ae76 100644 GIT binary patch delta 36306 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 delta 36273 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