From a21be08f19b69ddae9075150cbca86e9d555ef27 Mon Sep 17 00:00:00 2001 From: CPKalb Date: Fri, 4 Sep 2020 23:40:20 -0600 Subject: [PATCH 01/93] Add files via upload --- ush/Blocking.py | 540 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 540 insertions(+) create mode 100644 ush/Blocking.py diff --git a/ush/Blocking.py b/ush/Blocking.py new file mode 100644 index 0000000000..543d4f1cfd --- /dev/null +++ b/ush/Blocking.py @@ -0,0 +1,540 @@ +import os +import glob +import numpy as np +import netCDF4 +import pandas as pd +import datetime +import bisect +from scipy import stats +from scipy.signal import argrelextrema + +class BlockingCalculation(): + """Contains the programs to calculate Blocking via the Pelly-Hoskins Method + """ + def __init__(self,config): + + from metplus.util import config_metplus + from metplus.util import get_start_end_interval_times + loop_time, end_time, time_interval = get_start_end_interval_times(config) + + self.start_date = loop_time.strftime('%Y%m%d%H') + self.end_date = end_time.strftime('%Y%m%d%H') + self.start_mth = loop_time.strftime('%m') + self.blocking_dir = config.getdir('Blocking','BLOCKING_DIR') + self.blocking_var = config.getstr('Blocking','BLOCKING_VAR') + self.smoothing_pts = config.getint('Blocking','SMOOTHING_PTS') + lat_delta_in = config.getstr('Blocking','LAT_DELTA') + self.lat_delta = list(map(float,lat_delta_in.split(","))) + self.ibl_dist = config.getint('Blocking','IBL_DIST') + self.ibl_in_gibl = config.getint('Blocking','IBL_IN_GIBL') + self.gibl_overlap = config.getint('Blocking','GIBL_OVERLAP') + self.block_time = config.getint('Blocking','BLOCK_TIME') #####Probably should fix this so it supports other times" + self.block_travel = config.getint('Blocking','BLOCK_TRAVEL') + self.block_method = config.getstr('Blocking','BLOCK_METHOD') + + + def read_nc_met(self,indir,invar): + + infiles = glob.glob(indir+"/*.nc") + infiles.sort() + + print("Reading in Data") + indata = netCDF4.Dataset(infiles[0]) + lats = indata.variables['lat'][:] + lons = indata.variables['lon'][:] + var_3d = indata.variables[invar][:] + var_3d = np.expand_dims(var_3d,axis=0) + init_time_str = indata.variables[invar].getncattr('init_time') + valid_time_str = indata.variables[invar].getncattr('valid_time') + indata.close() + yrlist = [] + pmth = valid_time_str[4:6] + loclist = [0] + cntr = 1 + + # Create a list of all the dates I need, so I can fill missing days + sdate_pd = self.start_date[0:4]+'-'+self.start_date[4:6]+'-'+self.start_date[6:8] + edate_pd = self.end_date[0:4]+'-'+self.end_date[4:6]+'-'+self.end_date[6:8] + djf_dates = [dt for dt in pd.date_range(start=sdate_pd, end=edate_pd).to_pydatetime() if dt.month in [1,2,12] and + not (dt.month == 2 and dt.day == 29)] + + valid_datetime = datetime.datetime(int(valid_time_str[0:4]),int(valid_time_str[4:6]),int(valid_time_str[6:8])) + datediff = valid_datetime - djf_dates[0] + if valid_datetime > djf_dates[0]: + diff = bisect.bisect_left(djf_dates,valid_datetime) + filldata = np.empty((diff,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) + filldata[:] = np.nan + var_3d = np.append(filldata,var_3d,axis=0) + icnt = diff + 1 + elif valid_datetime < djf_dates[0]: + print('Extra data present, not set up to handle this. Exiting...') + exit() + else: + icnt = 1 + + for i in range(1,len(infiles)): + + #Read in the data + indata = netCDF4.Dataset(infiles[i]) + new_invar = indata.variables[invar][:] + new_invar = np.expand_dims(new_invar,axis=0) + init_time_str = indata.variables[invar].getncattr('init_time') + valid_time_str = indata.variables[invar].getncattr('valid_time') + indata.close() + cmth = valid_time_str[4:6] + + valid_datetime = datetime.datetime(int(valid_time_str[0:4]),int(valid_time_str[4:6]),int(valid_time_str[6:8])) + if valid_datetime > djf_dates[icnt]: + locvd = bisect.bisect_left(djf_dates,valid_datetime) + locc = bisect.bisect_left(djf_dates,djf_dates[icnt]) + diff = bisect.bisect_left(djf_dates,valid_datetime) - bisect.bisect_left(djf_dates,djf_dates[icnt]) + filldata = np.empty((diff,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) + filldata[:] = np.nan + var_3d = np.append(var_3d,filldata,axis=0) + icnt+=diff + elif valid_datetime < djf_dates[i]: + print('Extra data present, not set up to handle this. Exiting...') + exit() + var_3d = np.append(var_3d,new_invar,axis=0) + + if (int(cmth) == int(self.start_mth)) and (int(pmth) != int(self.start_mth)): + yrlist.append(int(valid_time_str[0:4])) + loclist.append(cntr) + + pmth = cmth + cntr+=1 + icnt+=1 + + if len(djf_dates) > len(var_3d[:,0,0]): + diff = len(djf_dates) - len(var_3d[:,0,0]) + filldata = np.empty((diff,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) + filldata[:] = np.nan + var_3d = np.append(var_3d,filldata,axis=0) + + yrlist.append(int(valid_time_str[0:4])) + yr = np.array(yrlist) + sdim = len(var_3d[:,0,0])/float(len(yrlist)) + var_4d = np.reshape(var_3d,[len(yrlist),int(sdim),len(var_3d[0,:,0]),len(var_3d[0,0,:])]) + + return var_4d,lats,lons,yr,mhweight + + + def run_CBL(self): + + #z500_anom_4d,lats,lons,yr = self.read_nc_met(self.blocking_dir,self.blocking_var) + z500_anom_4d = np.load('Z500_anom.npy') + lats = np.load('lats1.npy') + lons = np.load('lons1.npy') + yr = np.load('yr1.npy') + + #Create Latitude Weight based for NH + cos = lats + cos = cos * np.pi / 180.0 + way = np.cos(cos) + way = np.sqrt(way) + weightf = np.repeat(way[:,np.newaxis],360,axis=1) + + ####Find latitude of maximum high-pass STD (CBL) + mstd = np.nanstd(z500_anom_4d,axis=1) + mhweight = mstd * weightf + cbli = np.argmax(mhweight,axis=1) + CBL = np.zeros((len(z500_anom_4d[:,0,0,0]),len(lons))) + for j in np.arange(0,len(yr),1): + CBL[j,:] = lats[cbli[j,:]] + + ###Apply 9-degree moving average to smooth CBL profiles + lt = len(lons)-1 + CBLf = np.zeros((len(z500_anom_4d[:,0,0,0]),len(lons))) + m=((self.smoothing_pts-1)/2.0) + 1 + for i in np.arange(0,len(CBL[0,:]),1): + if i < m: + temp1 = CBL[:,-m+i:-1] + temp2 = CBL[:,-1:] + temp3 = CBL[:,0:m+i+1] + temp = np.concatenate((temp1,temp2),axis=1) + temp = np.concatenate((temp,temp3),axis=1) + CBLf[:,i] = np.nanmean(temp,axis=1).astype(int) + elif i > (lt-m): + temp1 = CBL[:,i-m:-1] + temp2 = CBL[:,-1:] + temp3 = CBL[:,0:m+i-lt] + temp = np.concatenate((temp1,temp2),axis=1) + temp = np.concatenate((temp,temp3),axis=1) + CBLf[:,i] = np.nanmean(temp,axis=1).astype(int) + else: + temp = CBL[:,i-m:i+m+1] + CBLf[:,i] = np.nanmean(temp,axis=1).astype(int) + + np.save('TINA_CBL.npy',CBLf) + return CBLf,lats,lons,yr,mhweight + + + def run_mod_blocking1d(self,a,cbl,lat,lon,meth): + d = self.lat_delta + blon=0 + dc = 90 - cbl + dc = dc.astype(int) + db = 30 + BI=np.zeros((len(a[:,0,0]),len(lon))) + blon = np.zeros((len(a[:,0,0]),len(lon))) + if meth=='PH': + # loop through days + for k in np.arange(0,len(a[:,0,0]),1): + blontemp=0 + bitemp=0 + q=0 + BI1=np.zeros((3,len(lon))) + for l in d: + blon1 = np.zeros(len(lon)) + d0 = dc-l#(dc - 1*db/2) - l + dn = (dc - 1*db/2) - l + dn = dn.astype(np.int64) + ds = (dc + 1*db/2) - l + ds = ds.astype(np.int64) + GHGS = np.zeros(len(cbl)) + GHGN = np.zeros(len(cbl)) + for jj in np.arange(0,len(cbl),1): + GHGN[jj] = np.mean(a[k,dn[jj]:d0[jj]+1,jj]) + GHGS[jj] = np.mean(a[k,d0[jj]:ds[jj]+1,jj]) + BI1[q,:] = GHGN-GHGS + q = q +1 + BI1 = np.max(BI1,axis=0) + block = np.where((BI1>0))[0] + blon1[block]=1 + blontemp = blontemp + blon1 + BI[k,:] = BI1 + #blontemp[blontemp!=0]=1 + blon[k,:] = blontemp + + return blon,BI + + + def run_Calc_IBL(self,cbl): + + #z500_daily,lats,lons,yr = self.read_nc_met(self.daily_dir,self.var) + z500_daily = np.load('Z500_daily.npy') + lats = np.load('lats2.npy') + lons = np.load('lons2.npy') + yr = np.load('yr2.npy') + + #Initilize arrays for IBLs and the blocking index + # yr, day, lon + blonlong = np.zeros((len(yr),len(z500_daily[0,:,0,0]),len(lons))) + BI = np.zeros((len(yr),len(z500_daily[0,:,0,0]),len(lons))) + + #Using long-term mean CBL and acsessing module of mod.py + cbl = np.nanmean(cbl,axis=0) + for i in np.arange(0,len(yr),1): + blon,BI[i,:,:] = self.run_mod_blocking1d(z500_daily[i,:,:,:],cbl,lats,lons,self.block_method) + blonlong[i,:,:] = blon + + np.save('TINA_IBL.npy',blonlong) + return blonlong + + def run_Calc_GIBL(self,ibl,lons,dd,year): + + #Initilize GIBL Array + GIBL = np.zeros(np.shape(ibl)) + + #####Loop finds IBLs within 7 degree of each other creating one group. Finally + ##### A GIBL exist if it has more than 15 IBLs + crit = self.ibl_in_gibl + + for i in np.arange(0,len(GIBL[:,0,0]),1): + for k in np.arange(0,len(GIBL[0,:,0]),1): + gibli = np.zeros(360) + thresh = crit/2.0 + a = ibl[i,k,:] + db = self.ibl_dist + ibli = np.where(a==1)[0] + if len(ibli)==0: + continue + idiff = ibli[1:] - ibli[:-1] + bt=0 + btlon = ibli[0] + ct = 1 + btfin = [] + block = ibli + block = np.append(block,block+360) + for ll in np.arange(1,len(block),1): + diff = np.abs(block[ll] - block[ll-1]) + if diff == 1: + bt = [block[ll]] + btlon = np.append(btlon,bt) + ct = ct + diff + if diff <= thresh and diff != 1: + bt = np.arange(block[ll-1]+1,block[ll]+1,1) + btlon = np.append(btlon,bt) + ct = ct + diff + if diff > thresh or ll==(len(block)-1): + if ct >= crit: + btfin = np.append(btfin,btlon) + ct=1 + ct = 1 + btlon = block[ll] + if len(btfin)/2 < crit : + btfin = [] + if len(btfin)==0: + continue + gibl1 = btfin + temp = np.where(gibl1>359)[0] + gibl1[temp] = gibl1[temp] - 360 + gibli[gibl1.astype(int)]=1 + GIBL[i,k,:] = gibli + + np.save('TINA_GIBL.npy',GIBL) + + return GIBL + + + def Remove(self,duplicate): + final_list = [] + for num in duplicate: + if num not in final_list: + final_list.append(num) + return final_list + + + def run_Calc_Blocks(self,ibl,GIBL,lon,year): + + days = np.arange(1,32,1) + days = np.append(days,days) + days = np.append(days,np.arange(1,29,1)) + + crit = self.ibl_in_gibl + + ##Count up the blocked longitudes for each GIBL + c = np.zeros((GIBL.shape)) + sz = [] + mx = [] + min = [] + + for y in np.arange(0,len(GIBL[:,0,0]),1): + for k in np.arange(0,len(GIBL[0,:,0]),1): + a = GIBL[y,k] + ct=1 + ai = np.where(a==1)[0] + ai = np.append(ai,ai+360) + temp = np.where(ai>359)[0] + bi=list(ai) + bi = np.array(bi) + bi[temp] = bi[temp]-360 + for i in np.arange(0,len(ai)-1,1): + b = ai[i] + b1 = ai[i+1] + diff = b1-b + if diff==1: + c[y,k,bi[i]] = ct + ct=ct+1 + if diff != 1: + c[y,k,bi[i]]=ct + sz = np.append(sz,ct) + ct=1 + + ########## - finding where the left and right limits of the block are - ################ + for i in np.arange(0,len(c[:,0,0]),1): + for k in np.arange(0,len(c[0,:,0]),1): + maxi = argrelextrema(c[i,k],np.greater,mode='wrap')[0] + mini = np.where(c[i,k]==1)[0] + if c[i,k,359]!=0 and c[i,k,0]!=0: + mm1 = mini[-1] + mm2 = mini[:-1] + mini = np.append(mm1,mm2) + mx = np.append(mx,maxi) + min = np.append(min,mini) + + locy, locd, locl = np.where(c==crit) + + A = np.zeros(360) + A = np.expand_dims(A,axis=0) + + ################# - Splitting up each GIBL into its own array - ################### + + for i in np.arange(0,len(locy),1): + m = locy[i] #year + n = locd[i] #day + o = locl[i] #long where 15 + mm = int(mx[i]) + mn = min[i] + temp1 = GIBL[m,n] + temp2 = np.zeros(360) + if mn>mm: + diff = int(mm - c[m,n,mm] + 1) + lons = lon[diff] + place1 = np.arange(lons,360,1) + place2 = np.arange(0,mm+1,1) + bl = np.append(place2,place1).astype(int) + if temp1[359] ==1 and mm>200: + lons = lon[mm] + beg = mm - c[m,n,mm] + 1 + bl = np.arange(beg,mm+1,1).astype(int) + if mm>mn: #temp1[359] ==0: + lons = lon[mm] + beg = mm - c[m,n,mm] + 1 + bl = np.arange(beg,mm+1,1).astype(int) + temp2[bl] = 1 + temp2 = np.expand_dims(temp2,axis=0) + A = np.concatenate((A,temp2),axis=0) + + A = A[1:] + + ######### - Getting rid of non-consectutve days which would prevent blocking - ################# + + dd=[] + dy = [] + dA = A[0] + dA = np.expand_dims(dA,axis=0) + ct=0 + for i in np.arange(1,len(locy),1): + dd1 = locd[i-1] + dd2 = locd[i] + if dd2-dd1 > 2: + ct = 0 + continue + if ct == 0: + dd = np.append(dd,locd[i-1]) + dy = np.append(dy,locy[i-1]) + temp2 = np.expand_dims(A[i-1],axis=0) + dA = np.concatenate((dA,temp2),axis=0) + ct = ct + 1 + if dd2-dd1<=2: + dd=np.append(dd,locd[i]) + dy = np.append(dy,locy[i]) + temp2 = np.expand_dims(A[i],axis=0) + dA = np.concatenate((dA,temp2),axis=0) + ct = ct + 1 + + dA=dA[1:] + dAfin = dA + + ############ - Finding center longitude of block - ############## + + middle=[] + for l in np.arange(0,len(dAfin),1): + temp = np.where(dAfin[l]==1)[0] + if len(temp) % 2 == 0: + temp = np.append(temp,0) + midtemp = np.median(temp) + middle = np.append(middle,midtemp) + + overlap=self.gibl_overlap = 10 + + #####Track blocks. Makes sure that blocks overlap with at least 10 longitude points on consecutive days + fin = [[]] + finloc = [[]] + ddcopy=dd*1.0 + noloc=[] + failloc = [[]] + for i in np.arange(0,len(c[:,0,0]),1): + yri = np.where(dy==i)[0] + B = [[]] + ddil =1.0 * ddcopy[yri] + dyy = np.where(dy==i)[0] + rem = [] + for dk in ddil: + if len(ddil) < 5: + continue + ddil = np.append(ddil[0]-1,ddil) + diff = np.diff(ddil) + diffB=[] + dB =1 + cnt = 1 + while dB<=2: + diffB = np.append(diffB,ddil[cnt]) + dB = diff[cnt-1] + if ddil[cnt]==ddil[-1]: + dB=5 + cnt=cnt+1 + diffB = np.array(self.Remove(diffB)) + locb = [] + for ll in diffB: + locb = np.append(locb,np.where((dy==i) & (dd==ll))[0]) + ddil=ddil[1:] + locbtemp = 1.0*locb + re=[] + for hh in np.arange(0,len(noloc),1): + re = np.append(re,np.where(locb == noloc[hh])[0]) + locbtemp = np.delete(locbtemp,re) + locb=locbtemp * 1.0 + datemp = dAfin[locb.astype(int)] + blocktemp = [[datemp[0]]] + locbi = np.array([locb[0]]) + ll1=0 + pass1 = 0 + ai=[0] + add=0 + for ll in np.arange(0,len(locb)-1,1): + if ((dd[locb[ll+1].astype(int)] - dd[locb[ll1].astype(int)]) >=1) & ((dd[locb[ll+1].astype(int)] - dd[locb[ll1].astype(int)]) <=2): + add = datemp[ll1] + datemp[ll+1] + ai = np.where(add==2)[0] + if len(ai)>overlap: + locbi=np.append(locbi,locb[ll+1]) + ll1=ll+1 + add=0 + if (len(ai)4: + noloc = np.append(noloc,locbi) + finloc = finloc + [locbi] + for jj in locbi: + rem = np.append(rem,np.where(dyy==jj)[0]) + ddil = np.delete(ddcopy[yri],rem.astype(int)) + if len(locbi)<=4: + noloc = np.append(noloc,locbi) + if len(locbi)<=2: + failloc=failloc+[locbi] + for jj in locbi: + rem = np.append(rem,np.where(dyy==jj)[0]) + ddil = np.delete(ddcopy[yri],rem.astype(int)) + + blocks = finloc[1:] + noblock = failloc[1:] + + ############Get rid of blocks that travel downstream########## + ######If center of blocks travel downstream further than 45 degrees longitude, + ######cancel block moment it travels out of this limit + newblock = [[]] + newnoblock=[[]] + distthresh = 45 + for bb in blocks: + diffb = [] + start = middle[bb[0].astype(int)] + for bbs in bb: + diffb = np.append(diffb, start - middle[bbs.astype(int)]) + loc = np.where(np.abs(diffb) > distthresh)[0] + if len(loc)==0: + newblock = newblock +[bb] + if len(loc)>0: + if len(bb[:loc[0]]) >4: + newblock = newblock + [bb[:loc[0]]] + if len(bb[:loc[0]]) <=2: + noblock = noblock + [bb] + + blocks = newblock[1:] + + #londist = 100 + #plon = np.arange(-londist,londist+1,1) + #plat = np.arange(30,-31,-1) + + #Create a final array with blocking longitudes. Similar to IBL/GIBL, but those that pass the duration threshold + blockfreq = np.zeros((len(year),len(ibl[0,:,0]),360)) + savecbl=[] + savemiddle = [] + saveyr=[] + numblock=0 + for i in np.arange(0,len(blocks),1): + temp = blocks[i] + numblock=numblock+1 + for j in temp: + j=int(j) + daycomp = int(dd[j]) + yearcomp = int(dy[j]) + saveyr = np.append(saveyr,dy[j]) + middlecomp = middle[j].astype(int) + mc1 = int(round(middlecomp / 2.5)) + blockfreq[yearcomp,daycomp] = blockfreq[yearcomp,daycomp] + dAfin[j] + ct = ct + 1 + + print(blockfreq) + return blockfreq From 578daac169b323bc5b5bb032bbd0a0ec2c2fbd1f Mon Sep 17 00:00:00 2001 From: CPKalb Date: Fri, 4 Sep 2020 23:40:42 -0600 Subject: [PATCH 02/93] Add files via upload --- Blocking_driver.py | 81 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 Blocking_driver.py diff --git a/Blocking_driver.py b/Blocking_driver.py new file mode 100644 index 0000000000..b49942e5b6 --- /dev/null +++ b/Blocking_driver.py @@ -0,0 +1,81 @@ +import sys +import os +import numpy as np +import netCDF4 +from Blocking import BlockingCalculation + + +def main(): + + # add metplus directory to path so the wrappers and utilities can be found + sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), + os.pardir))) + from metplus.util import config_metplus + from ush.master_metplus import get_config_inputs_from_command_line + from metplus.wrappers import PCPCombineWrapper + from metplus.wrappers import RegridDataPlaneWrapper + + config_list = get_config_inputs_from_command_line() + + ###################################################################### + # Pre-Process Data: + ###################################################################### + config = config_metplus.setup(config_list) + # Regrid to 1 Degree + # + + #Compute Daily Average + #daily_config = config_metplus.replace_config_from_section(config, 'daily_mean') + + #Take a running mean + rmean_config = config_metplus.replace_config_from_section(config, 'running_mean') + #PCPCombineWrapper(rmean_config).run_all_times() + + #Compute anomaly + anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly') + #PCPCombineWrapper(anomaly_config).run_all_times() + + + ###################################################################### + # Blocking Calculation + ###################################################################### + # Set up the data + steps = BlockingCalculation(config) + + # Calculate Central Blocking Latitude + cbls,lats,lons,yr,mhweight = steps.run_CBL() + + # Run IBL + ibls = steps.run_Calc_IBL(cbls) + daynum = np.arange(0,len(ibls[0,:,0]),1) + + # Run GIBL + gibls = steps.run_Calc_GIBL(ibls,lons,daynum,yr) + + # Calc Blocks + block_freq = steps.run_Calc_Blocks(ibls,gibls,lons,yr) + + + ###################################################################### + # Plotting + ###################################################################### + # Write CBLS and mstd to a file + #cblfile = netCDF4.Dataset("CBL.nc", "w", format="NETCDF4") + #yrout = cblfile.createDimension("yrs",len(yr)) + #lonout = cblfile.createDimension("lon",len(mhweight[0,0,:])) + #latout = cblfile.createDimension("lat",len(mhweight[0,:,0])) + #years = cblfile.createVariable("yrs","i4",("yrs",)) + #latitudes = cblfile.createVariable("lat","f4",("lat",)) + #longitudes = cblfile.createVariable("lon","f4",("lon",)) + #cblout = cblfile.createVariable("CBL","f4",("yrs","lon",)) + #msdtout = cblfile.createVariable("MWEIGHT","f4",("yrs","lat","lon",)) + #years[:] = yr + #latitudes[:] = lats + #longitudes[:] = lons + #cblout[:] = cbls + #msdtout[:] = mhweight + #cblfile.close() + + +if __name__ == "__main__": + main() From 5a764da18dec2bb95ce7fc77851e717d3a60f040 Mon Sep 17 00:00:00 2001 From: CPKalb Date: Fri, 4 Sep 2020 23:41:17 -0600 Subject: [PATCH 03/93] Add files via upload --- .../Regrid_PCP_obsERA_obsOnly_Blocking.conf | 219 ++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf new file mode 100644 index 0000000000..c6d8d87225 --- /dev/null +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf @@ -0,0 +1,219 @@ +# Blocking METplus Configuration + +[config] +# time looping - options are INIT, VALID, RETRO, and REALTIME +LOOP_BY = VALID + +# Format of INIT_BEG and INIT_END +VALID_TIME_FMT = %Y%m%d%H + +# Start time for METplus run +VALID_BEG = 1979120100 + +# End time for METplus run +VALID_END = 2017022818 + +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 21600 + +# list of forecast leads to process +LEAD_SEQ = 0 + +SKIP_TIMES = "%m:begin_end_incr(3,11,1)" + +LOOP_ORDER = processes + +# Obs or Forecast +OBS_RUN = True +FCST_RUN = False + +# List of applications to run +PROCESS_LIST = RegridDataPlane + +# REGRID_DATA_PLANE (Step 1) +# Run regrid_data_plane on forecast data +OBS_REGRID_DATA_PLANE_RUN = True + +# If true, process each field individually and write a file for each +# If false, run once per run time passing in all fields specified +OBS_DATA_PLANE_ONCE_PER_FIELD = False + +# Name of input field to process +OBS_REGRID_DATA_PLANE_VAR1_INPUT_FIELD_NAME = Z + +# Level of input field to process +OBS_REGRID_DATA_PLANE_VAR1_INPUT_LEVEL = P500 + +# Name of output field to create +OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = Z500 + +# Mask to use for regridding +#REGRID_DATA_PLANE_VERIF_GRID = {MASK_DIR}/NH_block_grid.nc +REGRID_DATA_PLANE_VERIF_GRID = latlon 360 90 89 0 -1.0 1.0 + +# Method to run regrid_data_plane, not setting this will default to NEAREST +REGRID_DATA_PLANE_METHOD = BILIN + +# Regridding width used in regrid_data_plane, not setting this will default to 1 +REGRID_DATA_PLANE_WIDTH = 2 + +[dir] +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + +# input and output data directories for each application in PROCESS_LIST +OBS_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds627.0/ei.oper.an.pl +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s + +[filename_templates] +# format of filenames +# Input ERA Interim +OBS_REGRID_DATA_PLANE_INPUT_TEMPLATE = {valid?fmt=%Y%m}/ei.oper.an.pl.regn128sc.{valid?fmt=%Y%m%d%H} +OBS_REGRID_DATA_PLANE_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{init?fmt=%Y%m%d%H}_NH.nc + + + +[daily_mean] +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 86400 + +LOOP_ORDER = processes + +# List of applications to run +PROCESS_LIST = PcpCombine + +# PCP_COMBINE (Step 1) +# run pcp_combine on obs data +OBS_PCP_COMBINE_RUN = {OBS_RUN} +FCST_PCP_COMBINE_RUN = {FCST_RUN} + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, and DERIVE +OBS_PCP_COMBINE_METHOD = DERIVE +OBS_PCP_COMBINE_STAT_LIST = MEAN + +# field name of 1 hr accumulation in forecast files +OBS_PCP_COMBINE_INPUT_ACCUMS = 6 +OBS_PCP_COMBINE_INPUT_NAMES = Z500 +OBS_PCP_COMBINE_INPUT_LEVELS = "(*,*)" +OBS_PCP_COMBINE_OUTPUT_NAME = Z500 +OBS_PCP_COMBINE_OUTPUT_ACCUM = 24 +OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 + +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + +# input and output data directories for each application in PROCESS_LIST +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/daily + +# Input ERA Interim +OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc +OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d?shift=-64800}_NH.nc + + + +[running_mean] +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 86400 + +SKIP_TIMES = "%m:begin_end_incr(3,11,1)" + +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 86400 + +# List of applications to run +PROCESS_LIST = PcpCombine + +# PCP_COMBINE (Step 1) +# run pcp_combine on obs data +OBS_PCP_COMBINE_RUN = {OBS_RUN} +FCST_PCP_COMBINE_RUN = {FCST_RUN} + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, and DERIVE +OBS_PCP_COMBINE_METHOD = DERIVE +OBS_PCP_COMBINE_STAT_LIST = MEAN + +# field name of 1 hr accumulation in forecast files +OBS_PCP_COMBINE_INPUT_ACCUMS = 24 +OBS_PCP_COMBINE_INPUT_NAMES = Z500 +OBS_PCP_COMBINE_INPUT_LEVELS = "(*,*)" +OBS_PCP_COMBINE_INPUT_OPTIONS = convert(x) = x / 9.81; +OBS_PCP_COMBINE_OUTPUT_NAME = Z500 +OBS_PCP_COMBINE_OUTPUT_ACCUM = 120 +OBS_PCP_COMBINE_DERIVE_LOOKBACK = 120 + +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + +# input and output data directories for each application in PROCESS_LIST +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/daily +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Rmean5d + +# format of filenames +# Input ERA Interim +OBS_PCP_COMBINE_INPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_5daymean_{valid?fmt=%Y%m%d?shift=-172800}_NH.nc + + +[anomaly] +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 86400 + +# list of forecast leads to process +LEAD_SEQ = 0 + +SKIP_TIMES = "%m:begin_end_incr(3,11,1)" + +# Options are times, processes +# times = run all items in the PROCESS_LIST for a single initialization +# time, then repeat until all times have been evaluated. +# processes = run each item in the PROCESS_LIST for all times +# specified, then repeat for the next item in the PROCESS_LIST. +LOOP_ORDER = processes + +# List of applications to run +PROCESS_LIST = PcpCombine + +# PCP_COMBINE (Step 1) +# run pcp_combine on obs data +OBS_PCP_COMBINE_RUN = {OBS_RUN} +FCST_PCP_COMBINE_RUN = {FCST_RUN} + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, and DERIVE +OBS_PCP_COMBINE_METHOD = USER_DEFINED + +OBS_PCP_COMBINE_COMMAND = -subtract {OBS_PCP_COMBINE_INPUT_DIR}/daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc {OBS_PCP_COMBINE_INPUT_DIR}/Rmean5d/Z500_5daymean_{valid?fmt=%Y%m%d}_NH.nc -field 'name="Z500"; level="(*,*)";' + +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + +# input and output data directories for each application in PROCESS_LIST +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Anomaly + +OBS_PCP_COMBINE_INPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc + + +[Blocking] +BLOCKING_DIR = {OUTPUT_BASE}/s2s/Anomaly +BLOCKING_VAR = Z500 + +# +SMOOTHING_PTS = 9 + +# +LAT_DELTA = -5,0,5 + +# +IBL_DIST = 7 + +# +IBL_IN_GIBL = 15 +GIBL_OVERLAP = 10 +BLOCK_TIME = 5 +BLOCK_TRAVEL = 45 +BLOCK_METHOD = 'PH' From 85fb2d936866360592df0b34db33960830980f43 Mon Sep 17 00:00:00 2001 From: CPKalb Date: Fri, 4 Sep 2020 23:49:01 -0600 Subject: [PATCH 04/93] Delete Blocking_driver.py --- Blocking_driver.py | 81 ---------------------------------------------- 1 file changed, 81 deletions(-) delete mode 100644 Blocking_driver.py diff --git a/Blocking_driver.py b/Blocking_driver.py deleted file mode 100644 index b49942e5b6..0000000000 --- a/Blocking_driver.py +++ /dev/null @@ -1,81 +0,0 @@ -import sys -import os -import numpy as np -import netCDF4 -from Blocking import BlockingCalculation - - -def main(): - - # add metplus directory to path so the wrappers and utilities can be found - sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), - os.pardir))) - from metplus.util import config_metplus - from ush.master_metplus import get_config_inputs_from_command_line - from metplus.wrappers import PCPCombineWrapper - from metplus.wrappers import RegridDataPlaneWrapper - - config_list = get_config_inputs_from_command_line() - - ###################################################################### - # Pre-Process Data: - ###################################################################### - config = config_metplus.setup(config_list) - # Regrid to 1 Degree - # - - #Compute Daily Average - #daily_config = config_metplus.replace_config_from_section(config, 'daily_mean') - - #Take a running mean - rmean_config = config_metplus.replace_config_from_section(config, 'running_mean') - #PCPCombineWrapper(rmean_config).run_all_times() - - #Compute anomaly - anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly') - #PCPCombineWrapper(anomaly_config).run_all_times() - - - ###################################################################### - # Blocking Calculation - ###################################################################### - # Set up the data - steps = BlockingCalculation(config) - - # Calculate Central Blocking Latitude - cbls,lats,lons,yr,mhweight = steps.run_CBL() - - # Run IBL - ibls = steps.run_Calc_IBL(cbls) - daynum = np.arange(0,len(ibls[0,:,0]),1) - - # Run GIBL - gibls = steps.run_Calc_GIBL(ibls,lons,daynum,yr) - - # Calc Blocks - block_freq = steps.run_Calc_Blocks(ibls,gibls,lons,yr) - - - ###################################################################### - # Plotting - ###################################################################### - # Write CBLS and mstd to a file - #cblfile = netCDF4.Dataset("CBL.nc", "w", format="NETCDF4") - #yrout = cblfile.createDimension("yrs",len(yr)) - #lonout = cblfile.createDimension("lon",len(mhweight[0,0,:])) - #latout = cblfile.createDimension("lat",len(mhweight[0,:,0])) - #years = cblfile.createVariable("yrs","i4",("yrs",)) - #latitudes = cblfile.createVariable("lat","f4",("lat",)) - #longitudes = cblfile.createVariable("lon","f4",("lon",)) - #cblout = cblfile.createVariable("CBL","f4",("yrs","lon",)) - #msdtout = cblfile.createVariable("MWEIGHT","f4",("yrs","lat","lon",)) - #years[:] = yr - #latitudes[:] = lats - #longitudes[:] = lons - #cblout[:] = cbls - #msdtout[:] = mhweight - #cblfile.close() - - -if __name__ == "__main__": - main() From 15a8fcd455a950944c47a63cd5fe562be4289478 Mon Sep 17 00:00:00 2001 From: CPKalb Date: Fri, 4 Sep 2020 23:49:17 -0600 Subject: [PATCH 05/93] Add files via upload --- ush/Blocking_driver.py | 81 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 ush/Blocking_driver.py diff --git a/ush/Blocking_driver.py b/ush/Blocking_driver.py new file mode 100644 index 0000000000..b49942e5b6 --- /dev/null +++ b/ush/Blocking_driver.py @@ -0,0 +1,81 @@ +import sys +import os +import numpy as np +import netCDF4 +from Blocking import BlockingCalculation + + +def main(): + + # add metplus directory to path so the wrappers and utilities can be found + sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), + os.pardir))) + from metplus.util import config_metplus + from ush.master_metplus import get_config_inputs_from_command_line + from metplus.wrappers import PCPCombineWrapper + from metplus.wrappers import RegridDataPlaneWrapper + + config_list = get_config_inputs_from_command_line() + + ###################################################################### + # Pre-Process Data: + ###################################################################### + config = config_metplus.setup(config_list) + # Regrid to 1 Degree + # + + #Compute Daily Average + #daily_config = config_metplus.replace_config_from_section(config, 'daily_mean') + + #Take a running mean + rmean_config = config_metplus.replace_config_from_section(config, 'running_mean') + #PCPCombineWrapper(rmean_config).run_all_times() + + #Compute anomaly + anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly') + #PCPCombineWrapper(anomaly_config).run_all_times() + + + ###################################################################### + # Blocking Calculation + ###################################################################### + # Set up the data + steps = BlockingCalculation(config) + + # Calculate Central Blocking Latitude + cbls,lats,lons,yr,mhweight = steps.run_CBL() + + # Run IBL + ibls = steps.run_Calc_IBL(cbls) + daynum = np.arange(0,len(ibls[0,:,0]),1) + + # Run GIBL + gibls = steps.run_Calc_GIBL(ibls,lons,daynum,yr) + + # Calc Blocks + block_freq = steps.run_Calc_Blocks(ibls,gibls,lons,yr) + + + ###################################################################### + # Plotting + ###################################################################### + # Write CBLS and mstd to a file + #cblfile = netCDF4.Dataset("CBL.nc", "w", format="NETCDF4") + #yrout = cblfile.createDimension("yrs",len(yr)) + #lonout = cblfile.createDimension("lon",len(mhweight[0,0,:])) + #latout = cblfile.createDimension("lat",len(mhweight[0,:,0])) + #years = cblfile.createVariable("yrs","i4",("yrs",)) + #latitudes = cblfile.createVariable("lat","f4",("lat",)) + #longitudes = cblfile.createVariable("lon","f4",("lon",)) + #cblout = cblfile.createVariable("CBL","f4",("yrs","lon",)) + #msdtout = cblfile.createVariable("MWEIGHT","f4",("yrs","lat","lon",)) + #years[:] = yr + #latitudes[:] = lats + #longitudes[:] = lons + #cblout[:] = cbls + #msdtout[:] = mhweight + #cblfile.close() + + +if __name__ == "__main__": + main() From 4ff9306a93d19e69f1b5a685298c690b1e8b653b Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Sat, 5 Sep 2020 02:01:10 -0600 Subject: [PATCH 06/93] Cleaned up the run_CBL so the smoothing had better logic --- ush/Blocking.py | 34 +++++++++++----------------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/ush/Blocking.py b/ush/Blocking.py index 543d4f1cfd..5d88cf297b 100644 --- a/ush/Blocking.py +++ b/ush/Blocking.py @@ -24,7 +24,7 @@ def __init__(self,config): self.blocking_var = config.getstr('Blocking','BLOCKING_VAR') self.smoothing_pts = config.getint('Blocking','SMOOTHING_PTS') lat_delta_in = config.getstr('Blocking','LAT_DELTA') - self.lat_delta = list(map(float,lat_delta_in.split(","))) + self.lat_delta = list(map(int,lat_delta_in.split(","))) self.ibl_dist = config.getint('Blocking','IBL_DIST') self.ibl_in_gibl = config.getint('Blocking','IBL_IN_GIBL') self.gibl_overlap = config.getint('Blocking','GIBL_OVERLAP') @@ -143,29 +143,15 @@ def run_CBL(self): CBL[j,:] = lats[cbli[j,:]] ###Apply 9-degree moving average to smooth CBL profiles - lt = len(lons)-1 + lt = len(lons) CBLf = np.zeros((len(z500_anom_4d[:,0,0,0]),len(lons))) - m=((self.smoothing_pts-1)/2.0) + 1 + m=int((self.smoothing_pts-1)/2.0) for i in np.arange(0,len(CBL[0,:]),1): - if i < m: - temp1 = CBL[:,-m+i:-1] - temp2 = CBL[:,-1:] - temp3 = CBL[:,0:m+i+1] - temp = np.concatenate((temp1,temp2),axis=1) - temp = np.concatenate((temp,temp3),axis=1) - CBLf[:,i] = np.nanmean(temp,axis=1).astype(int) - elif i > (lt-m): - temp1 = CBL[:,i-m:-1] - temp2 = CBL[:,-1:] - temp3 = CBL[:,0:m+i-lt] - temp = np.concatenate((temp1,temp2),axis=1) - temp = np.concatenate((temp,temp3),axis=1) - CBLf[:,i] = np.nanmean(temp,axis=1).astype(int) - else: - temp = CBL[:,i-m:i+m+1] - CBLf[:,i] = np.nanmean(temp,axis=1).astype(int) - - np.save('TINA_CBL.npy',CBLf) + ma_indices = np.arange(i-m,i+m+1) + ma_indices = np.where(ma_indices >= lt,ma_indices-lt,ma_indices) + CBLf[:,i] = np.nanmean(CBL[:,ma_indices],axis=1).astype(int) + + #np.save('TINA_CBL.npy',CBLf) return CBLf,lats,lons,yr,mhweight @@ -228,6 +214,8 @@ def run_Calc_IBL(self,cbl): blon,BI[i,:,:] = self.run_mod_blocking1d(z500_daily[i,:,:,:],cbl,lats,lons,self.block_method) blonlong[i,:,:] = blon + print(blonlong) + exit() np.save('TINA_IBL.npy',blonlong) return blonlong @@ -379,7 +367,7 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,year): A = A[1:] ######### - Getting rid of non-consectutve days which would prevent blocking - ################# - + print(A) dd=[] dy = [] dA = A[0] From d8a4fa15001d760db8207a008d0bf84d61b443d6 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Sat, 5 Sep 2020 02:13:20 -0600 Subject: [PATCH 07/93] Fixed error in parm file --- .../s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf index c6d8d87225..a686893311 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf @@ -216,4 +216,4 @@ IBL_IN_GIBL = 15 GIBL_OVERLAP = 10 BLOCK_TIME = 5 BLOCK_TRAVEL = 45 -BLOCK_METHOD = 'PH' +BLOCK_METHOD = PH From 78a37583670d4eda9ab708e6c5775321f6af2e03 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Thu, 10 Sep 2020 14:51:26 -0600 Subject: [PATCH 08/93] Edits/cleanup/corrections to Blocking.py and Blocking_driver.py --- .../Regrid_PCP_obsERA_obsOnly_Blocking.conf | 32 ++++++-- ush/Blocking.py | 82 +++++++++---------- ush/Blocking_driver.py | 4 +- 3 files changed, 67 insertions(+), 51 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf index a686893311..dc566f0a5a 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf @@ -19,7 +19,7 @@ VALID_INCREMENT = 21600 # list of forecast leads to process LEAD_SEQ = 0 -SKIP_TIMES = "%m:begin_end_incr(3,11,1)" +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" LOOP_ORDER = processes @@ -117,7 +117,7 @@ OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d?shift=-64800}_NH. # Increment between METplus runs in seconds. Must be >= 60 VALID_INCREMENT = 86400 -SKIP_TIMES = "%m:begin_end_incr(3,11,1)" +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" # Increment between METplus runs in seconds. Must be >= 60 VALID_INCREMENT = 86400 @@ -199,21 +199,43 @@ OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc [Blocking] -BLOCKING_DIR = {OUTPUT_BASE}/s2s/Anomaly -BLOCKING_VAR = Z500 +# Directory for the Z500 data to read in to the blocking python code +BLOCKING_ANOMALY_DIR = {OUTPUT_BASE}/s2s/Anomaly + +# Variable Name for the Z500 data to read in to the blocking python code +BLOCKING_ANOMALY_VAR = Z500_ANA + +# +BLOCKING_DIR = {OUTPUT_BASE}/s2s/daily # +BLOCKING_VAR = Z500 + +# Number of model grid points used for a moving average +# Must be odd SMOOTHING_PTS = 9 # LAT_DELTA = -5,0,5 # +NORTH_SOUTH_LIMITS = 30 + +# Maximum number of grid points between IBLs for everything in between to be included as an IBL IBL_DIST = 7 -# +# Number of grid points in and IBL to make a GIBL IBL_IN_GIBL = 15 + +# GIBL_OVERLAP = 10 + +# BLOCK_TIME = 5 + +# Number of grid points a block must travel to terminate BLOCK_TRAVEL = 45 + +# Method to compute blocking. Currently, the only option is 'PH' for the +# Pelly-Hoskins Method BLOCK_METHOD = PH diff --git a/ush/Blocking.py b/ush/Blocking.py index 5d88cf297b..84fc5b94ae 100644 --- a/ush/Blocking.py +++ b/ush/Blocking.py @@ -20,11 +20,14 @@ def __init__(self,config): self.start_date = loop_time.strftime('%Y%m%d%H') self.end_date = end_time.strftime('%Y%m%d%H') self.start_mth = loop_time.strftime('%m') - self.blocking_dir = config.getdir('Blocking','BLOCKING_DIR') + self.blocking_anomaly_dir = config.getstr('Blocking','BLOCKING_ANOMALY_DIR') + self.blocking_anomaly_var = config.getstr('Blocking','BLOCKING_ANOMALY_VAR') + self.blocking_dir = config.getstr('Blocking','BLOCKING_DIR') self.blocking_var = config.getstr('Blocking','BLOCKING_VAR') self.smoothing_pts = config.getint('Blocking','SMOOTHING_PTS') lat_delta_in = config.getstr('Blocking','LAT_DELTA') self.lat_delta = list(map(int,lat_delta_in.split(","))) + self.n_s_limits = config.getint('Blocking','NORTH_SOUTH_LIMITS') self.ibl_dist = config.getint('Blocking','IBL_DIST') self.ibl_in_gibl = config.getint('Blocking','IBL_IN_GIBL') self.gibl_overlap = config.getint('Blocking','GIBL_OVERLAP') @@ -32,6 +35,10 @@ def __init__(self,config): self.block_travel = config.getint('Blocking','BLOCK_TRAVEL') self.block_method = config.getstr('Blocking','BLOCK_METHOD') + # Check data requirements + if self.smoothing_pts % 2 == 0: + print('ERROR: Smoothing Radius must be an odd number given in grid points, Exiting...') + exit() def read_nc_met(self,indir,invar): @@ -116,12 +123,12 @@ def read_nc_met(self,indir,invar): sdim = len(var_3d[:,0,0])/float(len(yrlist)) var_4d = np.reshape(var_3d,[len(yrlist),int(sdim),len(var_3d[0,:,0]),len(var_3d[0,0,:])]) - return var_4d,lats,lons,yr,mhweight + return var_4d,lats,lons,yr def run_CBL(self): - #z500_anom_4d,lats,lons,yr = self.read_nc_met(self.blocking_dir,self.blocking_var) + #z500_anom_4d,lats,lons,yr = self.read_nc_met(self.blocking_anomaly_dir,self.blocking_anomaly_var) z500_anom_4d = np.load('Z500_anom.npy') lats = np.load('lats1.npy') lons = np.load('lons1.npy') @@ -142,7 +149,7 @@ def run_CBL(self): for j in np.arange(0,len(yr),1): CBL[j,:] = lats[cbli[j,:]] - ###Apply 9-degree moving average to smooth CBL profiles + ###Apply Moving Average to Smooth CBL Profiles lt = len(lons) CBLf = np.zeros((len(z500_anom_4d[:,0,0,0]),len(lons))) m=int((self.smoothing_pts-1)/2.0) @@ -151,32 +158,28 @@ def run_CBL(self): ma_indices = np.where(ma_indices >= lt,ma_indices-lt,ma_indices) CBLf[:,i] = np.nanmean(CBL[:,ma_indices],axis=1).astype(int) - #np.save('TINA_CBL.npy',CBLf) return CBLf,lats,lons,yr,mhweight def run_mod_blocking1d(self,a,cbl,lat,lon,meth): - d = self.lat_delta - blon=0 - dc = 90 - cbl - dc = dc.astype(int) - db = 30 - BI=np.zeros((len(a[:,0,0]),len(lon))) + lat_d = self.lat_delta + #blon = 0 + dc = (90 - cbl).astype(int) + db = self.n_s_limits + BI = np.zeros((len(a[:,0,0]),len(lon))) blon = np.zeros((len(a[:,0,0]),len(lon))) if meth=='PH': # loop through days for k in np.arange(0,len(a[:,0,0]),1): blontemp=0 - bitemp=0 + #bitemp=0 q=0 - BI1=np.zeros((3,len(lon))) - for l in d: + BI1=np.zeros((len(lat_d),len(lon))) + for l in lat_d: blon1 = np.zeros(len(lon)) - d0 = dc-l#(dc - 1*db/2) - l - dn = (dc - 1*db/2) - l - dn = dn.astype(np.int64) - ds = (dc + 1*db/2) - l - ds = ds.astype(np.int64) + d0 = dc-l + dn = ((dc - 1*db/2) - l).astype(np.int64) + ds = ((dc + 1*db/2) - l).astype(np.int64) GHGS = np.zeros(len(cbl)) GHGN = np.zeros(len(cbl)) for jj in np.arange(0,len(cbl),1): @@ -189,7 +192,6 @@ def run_mod_blocking1d(self,a,cbl,lat,lon,meth): blon1[block]=1 blontemp = blontemp + blon1 BI[k,:] = BI1 - #blontemp[blontemp!=0]=1 blon[k,:] = blontemp return blon,BI @@ -197,7 +199,7 @@ def run_mod_blocking1d(self,a,cbl,lat,lon,meth): def run_Calc_IBL(self,cbl): - #z500_daily,lats,lons,yr = self.read_nc_met(self.daily_dir,self.var) + #z500_daily,lats,lons,yr = self.read_nc_met(self.blocking_dir,self.blocking_var) z500_daily = np.load('Z500_daily.npy') lats = np.load('lats2.npy') lons = np.load('lons2.npy') @@ -214,11 +216,10 @@ def run_Calc_IBL(self,cbl): blon,BI[i,:,:] = self.run_mod_blocking1d(z500_daily[i,:,:,:],cbl,lats,lons,self.block_method) blonlong[i,:,:] = blon - print(blonlong) - exit() - np.save('TINA_IBL.npy',blonlong) + #np.save('Nstart_IBL.npy',blonlong) return blonlong + def run_Calc_GIBL(self,ibl,lons,dd,year): #Initilize GIBL Array @@ -230,7 +231,7 @@ def run_Calc_GIBL(self,ibl,lons,dd,year): for i in np.arange(0,len(GIBL[:,0,0]),1): for k in np.arange(0,len(GIBL[0,:,0]),1): - gibli = np.zeros(360) + gibli = np.zeros(len(GIBL[0,0,:])) thresh = crit/2.0 a = ibl[i,k,:] db = self.ibl_dist @@ -265,13 +266,11 @@ def run_Calc_GIBL(self,ibl,lons,dd,year): if len(btfin)==0: continue gibl1 = btfin - temp = np.where(gibl1>359)[0] + temp = np.where(gibl1>=360)[0] gibl1[temp] = gibl1[temp] - 360 - gibli[gibl1.astype(int)]=1 + gibli[gibl1.astype(int)] = 1 GIBL[i,k,:] = gibli - np.save('TINA_GIBL.npy',GIBL) - return GIBL @@ -285,10 +284,6 @@ def Remove(self,duplicate): def run_Calc_Blocks(self,ibl,GIBL,lon,year): - days = np.arange(1,32,1) - days = np.append(days,days) - days = np.append(days,np.arange(1,29,1)) - crit = self.ibl_in_gibl ##Count up the blocked longitudes for each GIBL @@ -303,7 +298,7 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,year): ct=1 ai = np.where(a==1)[0] ai = np.append(ai,ai+360) - temp = np.where(ai>359)[0] + temp = np.where(ai>=360)[0] bi=list(ai) bi = np.array(bi) bi[temp] = bi[temp]-360 @@ -311,11 +306,12 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,year): b = ai[i] b1 = ai[i+1] diff = b1-b + c[y,k,bi[i]] = ct if diff==1: - c[y,k,bi[i]] = ct + #c[y,k,bi[i]] = ct ct=ct+1 - if diff != 1: - c[y,k,bi[i]]=ct + else: + #c[y,k,bi[i]]=ct sz = np.append(sz,ct) ct=1 @@ -335,6 +331,7 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,year): A = np.zeros(360) A = np.expand_dims(A,axis=0) + lon = np.arange(0,360,1) ################# - Splitting up each GIBL into its own array - ################### @@ -367,7 +364,6 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,year): A = A[1:] ######### - Getting rid of non-consectutve days which would prevent blocking - ################# - print(A) dd=[] dy = [] dA = A[0] @@ -405,7 +401,7 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,year): midtemp = np.median(temp) middle = np.append(middle,midtemp) - overlap=self.gibl_overlap = 10 + overlap = self.gibl_overlap #####Track blocks. Makes sure that blocks overlap with at least 10 longitude points on consecutive days fin = [[]] @@ -454,7 +450,7 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,year): for ll in np.arange(0,len(locb)-1,1): if ((dd[locb[ll+1].astype(int)] - dd[locb[ll1].astype(int)]) >=1) & ((dd[locb[ll+1].astype(int)] - dd[locb[ll1].astype(int)]) <=2): add = datemp[ll1] + datemp[ll+1] - ai = np.where(add==2)[0] + ai = np.where(add==2)[0] if len(ai)>overlap: locbi=np.append(locbi,locb[ll+1]) ll1=ll+1 @@ -484,7 +480,7 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,year): ######cancel block moment it travels out of this limit newblock = [[]] newnoblock=[[]] - distthresh = 45 + distthresh = self.block_travel for bb in blocks: diffb = [] start = middle[bb[0].astype(int)] @@ -501,10 +497,6 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,year): blocks = newblock[1:] - #londist = 100 - #plon = np.arange(-londist,londist+1,1) - #plat = np.arange(30,-31,-1) - #Create a final array with blocking longitudes. Similar to IBL/GIBL, but those that pass the duration threshold blockfreq = np.zeros((len(year),len(ibl[0,:,0]),360)) savecbl=[] diff --git a/ush/Blocking_driver.py b/ush/Blocking_driver.py index b49942e5b6..e53a811c54 100644 --- a/ush/Blocking_driver.py +++ b/ush/Blocking_driver.py @@ -3,7 +3,7 @@ import numpy as np import netCDF4 from Blocking import BlockingCalculation - +from plot_blocking import plot_blocks def main(): @@ -76,6 +76,8 @@ def main(): #msdtout[:] = mhweight #cblfile.close() + plot_blocks(block_freq,gibls,ibls) + if __name__ == "__main__": main() From 4acd3e3b1813e646d87cf061b48a328a58ed2551 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Thu, 17 Sep 2020 14:33:11 -0600 Subject: [PATCH 09/93] updated scripts --- .../Regrid_PCP_obsERA_obsOnly_Blocking.conf | 14 ++++++--- ush/Blocking.py | 25 ++++++++-------- ush/Blocking_driver.py | 29 +++++++++++++++---- 3 files changed, 46 insertions(+), 22 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf index dc566f0a5a..9df3e92bf9 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf @@ -1,5 +1,4 @@ # Blocking METplus Configuration - [config] # time looping - options are INIT, VALID, RETRO, and REALTIME LOOP_BY = VALID @@ -58,6 +57,12 @@ REGRID_DATA_PLANE_METHOD = BILIN REGRID_DATA_PLANE_WIDTH = 2 [dir] +INPUT_BASE = /glade/scratch/kalb/METplus +OUTPUT_BASE = /glade/scratch/kalb/METplus/model_applications +STAGING_DIR={OUTPUT_BASE}/stage +MET_INSTALL_DIR = /glade/p/ral/jntp/MET/MET_releases/9.1 +TMP_DIR = {OUTPUT_BASE}/tmp + # location of configuration files used by MET applications CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s @@ -96,6 +101,7 @@ OBS_PCP_COMBINE_STAT_LIST = MEAN OBS_PCP_COMBINE_INPUT_ACCUMS = 6 OBS_PCP_COMBINE_INPUT_NAMES = Z500 OBS_PCP_COMBINE_INPUT_LEVELS = "(*,*)" +OBS_PCP_COMBINE_INPUT_OPTIONS = convert(x) = x / 9.81; set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S?shift=-64800}"; OBS_PCP_COMBINE_OUTPUT_NAME = Z500 OBS_PCP_COMBINE_OUTPUT_ACCUM = 24 OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 @@ -117,7 +123,7 @@ OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d?shift=-64800}_NH. # Increment between METplus runs in seconds. Must be >= 60 VALID_INCREMENT = 86400 -SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:1201,1202,1203,1204,0229" # Increment between METplus runs in seconds. Must be >= 60 VALID_INCREMENT = 86400 @@ -139,7 +145,7 @@ OBS_PCP_COMBINE_STAT_LIST = MEAN OBS_PCP_COMBINE_INPUT_ACCUMS = 24 OBS_PCP_COMBINE_INPUT_NAMES = Z500 OBS_PCP_COMBINE_INPUT_LEVELS = "(*,*)" -OBS_PCP_COMBINE_INPUT_OPTIONS = convert(x) = x / 9.81; +OBS_PCP_COMBINE_INPUT_OPTIONS = set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S?shift=-172800}"; OBS_PCP_COMBINE_OUTPUT_NAME = Z500 OBS_PCP_COMBINE_OUTPUT_ACCUM = 120 OBS_PCP_COMBINE_DERIVE_LOOKBACK = 120 @@ -164,7 +170,7 @@ VALID_INCREMENT = 86400 # list of forecast leads to process LEAD_SEQ = 0 -SKIP_TIMES = "%m:begin_end_incr(3,11,1)" +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:1201,1202,1203,1204,0229" # Options are times, processes # times = run all items in the PROCESS_LIST for a single initialization diff --git a/ush/Blocking.py b/ush/Blocking.py index 84fc5b94ae..5d5372f04f 100644 --- a/ush/Blocking.py +++ b/ush/Blocking.py @@ -282,18 +282,21 @@ def Remove(self,duplicate): return final_list - def run_Calc_Blocks(self,ibl,GIBL,lon,year): + def run_Calc_Blocks(self,ibl,GIBL,lon,dayin,year): crit = self.ibl_in_gibl ##Count up the blocked longitudes for each GIBL c = np.zeros((GIBL.shape)) + lonlen = len(lon) + yrlen = len(year) + daylen = len(dayin) sz = [] mx = [] min = [] - for y in np.arange(0,len(GIBL[:,0,0]),1): - for k in np.arange(0,len(GIBL[0,:,0]),1): + for y in np.arange(0,yrlen,1): + for k in np.arange(0,daylen,1): a = GIBL[y,k] ct=1 ai = np.where(a==1)[0] @@ -316,11 +319,11 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,year): ct=1 ########## - finding where the left and right limits of the block are - ################ - for i in np.arange(0,len(c[:,0,0]),1): - for k in np.arange(0,len(c[0,:,0]),1): + for i in np.arange(0,yrlen,1): + for k in np.arange(0,daylen,1): maxi = argrelextrema(c[i,k],np.greater,mode='wrap')[0] mini = np.where(c[i,k]==1)[0] - if c[i,k,359]!=0 and c[i,k,0]!=0: + if c[i,k,lonlen-1]!=0 and c[i,k,0]!=0: mm1 = mini[-1] mm2 = mini[:-1] mini = np.append(mm1,mm2) @@ -329,9 +332,8 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,year): locy, locd, locl = np.where(c==crit) - A = np.zeros(360) + A = np.zeros(lonlen) A = np.expand_dims(A,axis=0) - lon = np.arange(0,360,1) ################# - Splitting up each GIBL into its own array - ################### @@ -342,14 +344,14 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,year): mm = int(mx[i]) mn = min[i] temp1 = GIBL[m,n] - temp2 = np.zeros(360) + temp2 = np.zeros(lonlen) if mn>mm: diff = int(mm - c[m,n,mm] + 1) lons = lon[diff] - place1 = np.arange(lons,360,1) + place1 = np.arange(lons,lonlen,1) place2 = np.arange(0,mm+1,1) bl = np.append(place2,place1).astype(int) - if temp1[359] ==1 and mm>200: + if temp1[lonlen-1] ==1 and mm>200: lons = lon[mm] beg = mm - c[m,n,mm] + 1 bl = np.arange(beg,mm+1,1).astype(int) @@ -392,7 +394,6 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,year): dAfin = dA ############ - Finding center longitude of block - ############## - middle=[] for l in np.arange(0,len(dAfin),1): temp = np.where(dAfin[l]==1)[0] diff --git a/ush/Blocking_driver.py b/ush/Blocking_driver.py index e53a811c54..1d880c8cc5 100644 --- a/ush/Blocking_driver.py +++ b/ush/Blocking_driver.py @@ -3,7 +3,7 @@ import numpy as np import netCDF4 from Blocking import BlockingCalculation -from plot_blocking import plot_blocks +import plot_blocking as pb def main(): @@ -22,18 +22,24 @@ def main(): ###################################################################### config = config_metplus.setup(config_list) # Regrid to 1 Degree - # + #print('Regridding') + #RegridDataPlaneWrapper(config).run_all_times() #Compute Daily Average + #print('Computing Daily Averages') #daily_config = config_metplus.replace_config_from_section(config, 'daily_mean') + #PCPCombineWrapper(daily_config).run_all_times() #Take a running mean - rmean_config = config_metplus.replace_config_from_section(config, 'running_mean') + #print('Computing Running means') + #rmean_config = config_metplus.replace_config_from_section(config, 'running_mean') #PCPCombineWrapper(rmean_config).run_all_times() #Compute anomaly - anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly') + #print('Computing Anomalies') + #anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly') #PCPCombineWrapper(anomaly_config).run_all_times() + #exit() ###################################################################### @@ -43,17 +49,20 @@ def main(): steps = BlockingCalculation(config) # Calculate Central Blocking Latitude + print('Computing CBLs') cbls,lats,lons,yr,mhweight = steps.run_CBL() # Run IBL + print('Computing IBLs') ibls = steps.run_Calc_IBL(cbls) daynum = np.arange(0,len(ibls[0,:,0]),1) # Run GIBL + print('Computing GIBLs') gibls = steps.run_Calc_GIBL(ibls,lons,daynum,yr) # Calc Blocks - block_freq = steps.run_Calc_Blocks(ibls,gibls,lons,yr) + block_freq = steps.run_Calc_Blocks(ibls,gibls,lons,daynum,yr) ###################################################################### @@ -76,7 +85,15 @@ def main(): #msdtout[:] = mhweight #cblfile.close() - plot_blocks(block_freq,gibls,ibls) + + # Plot ---Minna's code + + + # Plot IBL's + #pb.plot_ibls() + + # Plot Blocking Frequency + pb.plot_blocks(block_freq,gibls,ibls,lons,'DJF','Block_Freq_DJF') if __name__ == "__main__": From 1ce38a0d04b7270ccad0f15dd77f974dfed48195 Mon Sep 17 00:00:00 2001 From: Minna Win Date: Fri, 18 Sep 2020 17:12:19 +0000 Subject: [PATCH 10/93] Added call to CBL_plot code to generate the CBL plot. --- ush/Blocking_driver.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/ush/Blocking_driver.py b/ush/Blocking_driver.py index 1d880c8cc5..8e3c24bd73 100644 --- a/ush/Blocking_driver.py +++ b/ush/Blocking_driver.py @@ -3,7 +3,8 @@ import numpy as np import netCDF4 from Blocking import BlockingCalculation -import plot_blocking as pb +#import plot_blocking as pb +import metplotpy.blocking_s2s.CBL_plot as cpl def main(): @@ -53,16 +54,16 @@ def main(): cbls,lats,lons,yr,mhweight = steps.run_CBL() # Run IBL - print('Computing IBLs') - ibls = steps.run_Calc_IBL(cbls) - daynum = np.arange(0,len(ibls[0,:,0]),1) +# print('Computing IBLs') +# ibls = steps.run_Calc_IBL(cbls) +# daynum = np.arange(0,len(ibls[0,:,0]),1) # Run GIBL - print('Computing GIBLs') - gibls = steps.run_Calc_GIBL(ibls,lons,daynum,yr) - +# print('Computing GIBLs') +# gibls = steps.run_Calc_GIBL(ibls,lons,daynum,yr) +# # Calc Blocks - block_freq = steps.run_Calc_Blocks(ibls,gibls,lons,daynum,yr) +# block_freq = steps.run_Calc_Blocks(ibls,gibls,lons,daynum,yr) ###################################################################### @@ -86,14 +87,17 @@ def main(): #cblfile.close() - # Plot ---Minna's code + # Plot ---Using CBL_plot.py code + month_str='DJF' + outfile = '/d1/mwin/output_cbl_plot' + cpl.create_cbl_plot(lons,lats,cbls, mhweight,month_str, outfile) # Plot IBL's #pb.plot_ibls() # Plot Blocking Frequency - pb.plot_blocks(block_freq,gibls,ibls,lons,'DJF','Block_Freq_DJF') + #pb.plot_blocks(block_freq,gibls,ibls,lons,'DJF','Block_Freq_DJF') if __name__ == "__main__": From 32e2e31cc80e07b8ea0a853ace7104b5b9e38753 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Tue, 22 Sep 2020 12:50:26 -0600 Subject: [PATCH 11/93] Updates to the driver plotting script --- .../Regrid_PCP_obsERA_obsOnly_Blocking.conf | 32 ++++++++++++++--- ush/Blocking.py | 16 ++++----- ush/Blocking_driver.py | 36 +++++++------------ 3 files changed, 48 insertions(+), 36 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf index 9df3e92bf9..45b82b4611 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf @@ -18,6 +18,7 @@ VALID_INCREMENT = 21600 # list of forecast leads to process LEAD_SEQ = 0 +# Only Process DJF SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" LOOP_ORDER = processes @@ -79,6 +80,12 @@ OBS_REGRID_DATA_PLANE_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{init?fm [daily_mean] +# Start time for METplus run +VALID_BEG = 1979120118 + +# End time for METplus run +VALID_END = 2017022818 + # Increment between METplus runs in seconds. Must be >= 60 VALID_INCREMENT = 86400 @@ -120,6 +127,12 @@ OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d?shift=-64800}_NH. [running_mean] +# Start time for METplus run +VALID_BEG = 1979120100 + +# End time for METplus run +VALID_END = 2017022800 + # Increment between METplus runs in seconds. Must be >= 60 VALID_INCREMENT = 86400 @@ -147,6 +160,7 @@ OBS_PCP_COMBINE_INPUT_NAMES = Z500 OBS_PCP_COMBINE_INPUT_LEVELS = "(*,*)" OBS_PCP_COMBINE_INPUT_OPTIONS = set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S?shift=-172800}"; OBS_PCP_COMBINE_OUTPUT_NAME = Z500 +# Running mean is 5 days OBS_PCP_COMBINE_OUTPUT_ACCUM = 120 OBS_PCP_COMBINE_DERIVE_LOOKBACK = 120 @@ -205,13 +219,13 @@ OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc [Blocking] -# Directory for the Z500 data to read in to the blocking python code +# Directory for the Z500 anomaly data to read in to the blocking python code BLOCKING_ANOMALY_DIR = {OUTPUT_BASE}/s2s/Anomaly -# Variable Name for the Z500 data to read in to the blocking python code +# Variable Name for the Z500 anomaly data to read in to the blocking python code BLOCKING_ANOMALY_VAR = Z500_ANA -# +# Directory for the Z500 data to read in to the blocking python code BLOCKING_DIR = {OUTPUT_BASE}/s2s/daily # @@ -233,10 +247,10 @@ IBL_DIST = 7 # Number of grid points in and IBL to make a GIBL IBL_IN_GIBL = 15 -# +# Overlap across days for a GIBL GIBL_OVERLAP = 10 -# +# Time duration needed for a block BLOCK_TIME = 5 # Number of grid points a block must travel to terminate @@ -245,3 +259,11 @@ BLOCK_TRAVEL = 45 # Method to compute blocking. Currently, the only option is 'PH' for the # Pelly-Hoskins Method BLOCK_METHOD = PH + +# IBL plot title and name +IBL_TITLE = DJF Instantaneous Blocked Longitude +IBL_OUTPUT_NAME = IBL_Freq_DJF + +# Blocking plot title and name +BLOCKING_TITLE = DJF Blocking Frequency +BLOCKING_OUTPUT_NAME = Block_Freq_DJF diff --git a/ush/Blocking.py b/ush/Blocking.py index 5d5372f04f..9731a7d762 100644 --- a/ush/Blocking.py +++ b/ush/Blocking.py @@ -220,7 +220,8 @@ def run_Calc_IBL(self,cbl): return blonlong - def run_Calc_GIBL(self,ibl,lons,dd,year): + #def run_Calc_GIBL(self,ibl,lons,dd,year): + def run_Calc_GIBL(self,ibl,lons): #Initilize GIBL Array GIBL = np.zeros(np.shape(ibl)) @@ -282,7 +283,7 @@ def Remove(self,duplicate): return final_list - def run_Calc_Blocks(self,ibl,GIBL,lon,dayin,year): + def run_Calc_Blocks(self,ibl,GIBL,lon,tsin,year): crit = self.ibl_in_gibl @@ -290,13 +291,13 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,dayin,year): c = np.zeros((GIBL.shape)) lonlen = len(lon) yrlen = len(year) - daylen = len(dayin) + tslen = len(tsin) sz = [] mx = [] min = [] for y in np.arange(0,yrlen,1): - for k in np.arange(0,daylen,1): + for k in np.arange(0,tslen,1): a = GIBL[y,k] ct=1 ai = np.where(a==1)[0] @@ -320,7 +321,7 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,dayin,year): ########## - finding where the left and right limits of the block are - ################ for i in np.arange(0,yrlen,1): - for k in np.arange(0,daylen,1): + for k in np.arange(0,tslen,1): maxi = argrelextrema(c[i,k],np.greater,mode='wrap')[0] mini = np.where(c[i,k]==1)[0] if c[i,k,lonlen-1]!=0 and c[i,k,0]!=0: @@ -365,7 +366,7 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,dayin,year): A = A[1:] - ######### - Getting rid of non-consectutve days which would prevent blocking - ################# + ######### - Getting rid of non-consectutve Time steps which would prevent blocking - ################# dd=[] dy = [] dA = A[0] @@ -404,7 +405,7 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,dayin,year): overlap = self.gibl_overlap - #####Track blocks. Makes sure that blocks overlap with at least 10 longitude points on consecutive days + #####Track blocks. Makes sure that blocks overlap with at least 10 longitude points on consecutive fin = [[]] finloc = [[]] ddcopy=dd*1.0 @@ -517,5 +518,4 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,dayin,year): blockfreq[yearcomp,daycomp] = blockfreq[yearcomp,daycomp] + dAfin[j] ct = ct + 1 - print(blockfreq) return blockfreq diff --git a/ush/Blocking_driver.py b/ush/Blocking_driver.py index 1d880c8cc5..2b246ec9d1 100644 --- a/ush/Blocking_driver.py +++ b/ush/Blocking_driver.py @@ -3,17 +3,20 @@ import numpy as np import netCDF4 from Blocking import BlockingCalculation -import plot_blocking as pb def main(): # add metplus directory to path so the wrappers and utilities can be found sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))) + sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy/metplotpy/blocking_s2s") + sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy_feature_33/metplotpy/blocking_s2s") from metplus.util import config_metplus from ush.master_metplus import get_config_inputs_from_command_line from metplus.wrappers import PCPCombineWrapper from metplus.wrappers import RegridDataPlaneWrapper + import plot_blocking as pb + from CBL_plot import create_cbl_plot config_list = get_config_inputs_from_command_line() @@ -39,7 +42,6 @@ def main(): #print('Computing Anomalies') #anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly') #PCPCombineWrapper(anomaly_config).run_all_times() - #exit() ###################################################################### @@ -59,41 +61,29 @@ def main(): # Run GIBL print('Computing GIBLs') - gibls = steps.run_Calc_GIBL(ibls,lons,daynum,yr) + gibls = steps.run_Calc_GIBL(ibls,lons) # Calc Blocks + print('Computing Blocks') block_freq = steps.run_Calc_Blocks(ibls,gibls,lons,daynum,yr) ###################################################################### # Plotting ###################################################################### - # Write CBLS and mstd to a file - #cblfile = netCDF4.Dataset("CBL.nc", "w", format="NETCDF4") - #yrout = cblfile.createDimension("yrs",len(yr)) - #lonout = cblfile.createDimension("lon",len(mhweight[0,0,:])) - #latout = cblfile.createDimension("lat",len(mhweight[0,:,0])) - #years = cblfile.createVariable("yrs","i4",("yrs",)) - #latitudes = cblfile.createVariable("lat","f4",("lat",)) - #longitudes = cblfile.createVariable("lon","f4",("lon",)) - #cblout = cblfile.createVariable("CBL","f4",("yrs","lon",)) - #msdtout = cblfile.createVariable("MWEIGHT","f4",("yrs","lat","lon",)) - #years[:] = yr - #latitudes[:] = lats - #longitudes[:] = lons - #cblout[:] = cbls - #msdtout[:] = mhweight - #cblfile.close() - - # Plot ---Minna's code + create_cbl_plot(lons, lats, cbls, mhweight, 'DFJ', 'Minna_CBL', do_averaging=True) # Plot IBL's - #pb.plot_ibls() + ibl_plot_title = config.getstr('Blocking','IBL_TITLE') + ibl_plot_outname = config.getstr('Blocking','IBL_OUTPUT_NAME') + pb.plot_ibls(ibls,lons,ibl_plot_title,ibl_plot_outname) # Plot Blocking Frequency - pb.plot_blocks(block_freq,gibls,ibls,lons,'DJF','Block_Freq_DJF') + blocking_plot_title = config.getstr('Blocking','BLOCKING_TITLE') + blocking_plot_outname = config.getstr('Blocking','BLOCKING_OUTPUT_NAME') + pb.plot_blocks(block_freq,gibls,ibls,lons,blocking_plot_title,blocking_plot_outname) if __name__ == "__main__": From 3f5c2a21840d053ffc91732b3cf80966ca62c463 Mon Sep 17 00:00:00 2001 From: CPKalb Date: Tue, 22 Sep 2020 12:51:34 -0600 Subject: [PATCH 12/93] Delete Blocking_driver.py --- ush/Blocking_driver.py | 104 ----------------------------------------- 1 file changed, 104 deletions(-) delete mode 100644 ush/Blocking_driver.py diff --git a/ush/Blocking_driver.py b/ush/Blocking_driver.py deleted file mode 100644 index 8e3c24bd73..0000000000 --- a/ush/Blocking_driver.py +++ /dev/null @@ -1,104 +0,0 @@ -import sys -import os -import numpy as np -import netCDF4 -from Blocking import BlockingCalculation -#import plot_blocking as pb -import metplotpy.blocking_s2s.CBL_plot as cpl - -def main(): - - # add metplus directory to path so the wrappers and utilities can be found - sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), - os.pardir))) - from metplus.util import config_metplus - from ush.master_metplus import get_config_inputs_from_command_line - from metplus.wrappers import PCPCombineWrapper - from metplus.wrappers import RegridDataPlaneWrapper - - config_list = get_config_inputs_from_command_line() - - ###################################################################### - # Pre-Process Data: - ###################################################################### - config = config_metplus.setup(config_list) - # Regrid to 1 Degree - #print('Regridding') - #RegridDataPlaneWrapper(config).run_all_times() - - #Compute Daily Average - #print('Computing Daily Averages') - #daily_config = config_metplus.replace_config_from_section(config, 'daily_mean') - #PCPCombineWrapper(daily_config).run_all_times() - - #Take a running mean - #print('Computing Running means') - #rmean_config = config_metplus.replace_config_from_section(config, 'running_mean') - #PCPCombineWrapper(rmean_config).run_all_times() - - #Compute anomaly - #print('Computing Anomalies') - #anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly') - #PCPCombineWrapper(anomaly_config).run_all_times() - #exit() - - - ###################################################################### - # Blocking Calculation - ###################################################################### - # Set up the data - steps = BlockingCalculation(config) - - # Calculate Central Blocking Latitude - print('Computing CBLs') - cbls,lats,lons,yr,mhweight = steps.run_CBL() - - # Run IBL -# print('Computing IBLs') -# ibls = steps.run_Calc_IBL(cbls) -# daynum = np.arange(0,len(ibls[0,:,0]),1) - - # Run GIBL -# print('Computing GIBLs') -# gibls = steps.run_Calc_GIBL(ibls,lons,daynum,yr) -# - # Calc Blocks -# block_freq = steps.run_Calc_Blocks(ibls,gibls,lons,daynum,yr) - - - ###################################################################### - # Plotting - ###################################################################### - # Write CBLS and mstd to a file - #cblfile = netCDF4.Dataset("CBL.nc", "w", format="NETCDF4") - #yrout = cblfile.createDimension("yrs",len(yr)) - #lonout = cblfile.createDimension("lon",len(mhweight[0,0,:])) - #latout = cblfile.createDimension("lat",len(mhweight[0,:,0])) - #years = cblfile.createVariable("yrs","i4",("yrs",)) - #latitudes = cblfile.createVariable("lat","f4",("lat",)) - #longitudes = cblfile.createVariable("lon","f4",("lon",)) - #cblout = cblfile.createVariable("CBL","f4",("yrs","lon",)) - #msdtout = cblfile.createVariable("MWEIGHT","f4",("yrs","lat","lon",)) - #years[:] = yr - #latitudes[:] = lats - #longitudes[:] = lons - #cblout[:] = cbls - #msdtout[:] = mhweight - #cblfile.close() - - - # Plot ---Using CBL_plot.py code - month_str='DJF' - outfile = '/d1/mwin/output_cbl_plot' - cpl.create_cbl_plot(lons,lats,cbls, mhweight,month_str, outfile) - - - # Plot IBL's - #pb.plot_ibls() - - # Plot Blocking Frequency - #pb.plot_blocks(block_freq,gibls,ibls,lons,'DJF','Block_Freq_DJF') - - -if __name__ == "__main__": - main() From 445ca0ea1db8df3dc7009d245922b71f6fb5dd6e Mon Sep 17 00:00:00 2001 From: CPKalb Date: Tue, 22 Sep 2020 12:54:17 -0600 Subject: [PATCH 13/93] Delete Blocking.py --- ush/Blocking.py | 521 ------------------------------------------------ 1 file changed, 521 deletions(-) delete mode 100644 ush/Blocking.py diff --git a/ush/Blocking.py b/ush/Blocking.py deleted file mode 100644 index 5d5372f04f..0000000000 --- a/ush/Blocking.py +++ /dev/null @@ -1,521 +0,0 @@ -import os -import glob -import numpy as np -import netCDF4 -import pandas as pd -import datetime -import bisect -from scipy import stats -from scipy.signal import argrelextrema - -class BlockingCalculation(): - """Contains the programs to calculate Blocking via the Pelly-Hoskins Method - """ - def __init__(self,config): - - from metplus.util import config_metplus - from metplus.util import get_start_end_interval_times - loop_time, end_time, time_interval = get_start_end_interval_times(config) - - self.start_date = loop_time.strftime('%Y%m%d%H') - self.end_date = end_time.strftime('%Y%m%d%H') - self.start_mth = loop_time.strftime('%m') - self.blocking_anomaly_dir = config.getstr('Blocking','BLOCKING_ANOMALY_DIR') - self.blocking_anomaly_var = config.getstr('Blocking','BLOCKING_ANOMALY_VAR') - self.blocking_dir = config.getstr('Blocking','BLOCKING_DIR') - self.blocking_var = config.getstr('Blocking','BLOCKING_VAR') - self.smoothing_pts = config.getint('Blocking','SMOOTHING_PTS') - lat_delta_in = config.getstr('Blocking','LAT_DELTA') - self.lat_delta = list(map(int,lat_delta_in.split(","))) - self.n_s_limits = config.getint('Blocking','NORTH_SOUTH_LIMITS') - self.ibl_dist = config.getint('Blocking','IBL_DIST') - self.ibl_in_gibl = config.getint('Blocking','IBL_IN_GIBL') - self.gibl_overlap = config.getint('Blocking','GIBL_OVERLAP') - self.block_time = config.getint('Blocking','BLOCK_TIME') #####Probably should fix this so it supports other times" - self.block_travel = config.getint('Blocking','BLOCK_TRAVEL') - self.block_method = config.getstr('Blocking','BLOCK_METHOD') - - # Check data requirements - if self.smoothing_pts % 2 == 0: - print('ERROR: Smoothing Radius must be an odd number given in grid points, Exiting...') - exit() - - def read_nc_met(self,indir,invar): - - infiles = glob.glob(indir+"/*.nc") - infiles.sort() - - print("Reading in Data") - indata = netCDF4.Dataset(infiles[0]) - lats = indata.variables['lat'][:] - lons = indata.variables['lon'][:] - var_3d = indata.variables[invar][:] - var_3d = np.expand_dims(var_3d,axis=0) - init_time_str = indata.variables[invar].getncattr('init_time') - valid_time_str = indata.variables[invar].getncattr('valid_time') - indata.close() - yrlist = [] - pmth = valid_time_str[4:6] - loclist = [0] - cntr = 1 - - # Create a list of all the dates I need, so I can fill missing days - sdate_pd = self.start_date[0:4]+'-'+self.start_date[4:6]+'-'+self.start_date[6:8] - edate_pd = self.end_date[0:4]+'-'+self.end_date[4:6]+'-'+self.end_date[6:8] - djf_dates = [dt for dt in pd.date_range(start=sdate_pd, end=edate_pd).to_pydatetime() if dt.month in [1,2,12] and - not (dt.month == 2 and dt.day == 29)] - - valid_datetime = datetime.datetime(int(valid_time_str[0:4]),int(valid_time_str[4:6]),int(valid_time_str[6:8])) - datediff = valid_datetime - djf_dates[0] - if valid_datetime > djf_dates[0]: - diff = bisect.bisect_left(djf_dates,valid_datetime) - filldata = np.empty((diff,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) - filldata[:] = np.nan - var_3d = np.append(filldata,var_3d,axis=0) - icnt = diff + 1 - elif valid_datetime < djf_dates[0]: - print('Extra data present, not set up to handle this. Exiting...') - exit() - else: - icnt = 1 - - for i in range(1,len(infiles)): - - #Read in the data - indata = netCDF4.Dataset(infiles[i]) - new_invar = indata.variables[invar][:] - new_invar = np.expand_dims(new_invar,axis=0) - init_time_str = indata.variables[invar].getncattr('init_time') - valid_time_str = indata.variables[invar].getncattr('valid_time') - indata.close() - cmth = valid_time_str[4:6] - - valid_datetime = datetime.datetime(int(valid_time_str[0:4]),int(valid_time_str[4:6]),int(valid_time_str[6:8])) - if valid_datetime > djf_dates[icnt]: - locvd = bisect.bisect_left(djf_dates,valid_datetime) - locc = bisect.bisect_left(djf_dates,djf_dates[icnt]) - diff = bisect.bisect_left(djf_dates,valid_datetime) - bisect.bisect_left(djf_dates,djf_dates[icnt]) - filldata = np.empty((diff,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) - filldata[:] = np.nan - var_3d = np.append(var_3d,filldata,axis=0) - icnt+=diff - elif valid_datetime < djf_dates[i]: - print('Extra data present, not set up to handle this. Exiting...') - exit() - var_3d = np.append(var_3d,new_invar,axis=0) - - if (int(cmth) == int(self.start_mth)) and (int(pmth) != int(self.start_mth)): - yrlist.append(int(valid_time_str[0:4])) - loclist.append(cntr) - - pmth = cmth - cntr+=1 - icnt+=1 - - if len(djf_dates) > len(var_3d[:,0,0]): - diff = len(djf_dates) - len(var_3d[:,0,0]) - filldata = np.empty((diff,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) - filldata[:] = np.nan - var_3d = np.append(var_3d,filldata,axis=0) - - yrlist.append(int(valid_time_str[0:4])) - yr = np.array(yrlist) - sdim = len(var_3d[:,0,0])/float(len(yrlist)) - var_4d = np.reshape(var_3d,[len(yrlist),int(sdim),len(var_3d[0,:,0]),len(var_3d[0,0,:])]) - - return var_4d,lats,lons,yr - - - def run_CBL(self): - - #z500_anom_4d,lats,lons,yr = self.read_nc_met(self.blocking_anomaly_dir,self.blocking_anomaly_var) - z500_anom_4d = np.load('Z500_anom.npy') - lats = np.load('lats1.npy') - lons = np.load('lons1.npy') - yr = np.load('yr1.npy') - - #Create Latitude Weight based for NH - cos = lats - cos = cos * np.pi / 180.0 - way = np.cos(cos) - way = np.sqrt(way) - weightf = np.repeat(way[:,np.newaxis],360,axis=1) - - ####Find latitude of maximum high-pass STD (CBL) - mstd = np.nanstd(z500_anom_4d,axis=1) - mhweight = mstd * weightf - cbli = np.argmax(mhweight,axis=1) - CBL = np.zeros((len(z500_anom_4d[:,0,0,0]),len(lons))) - for j in np.arange(0,len(yr),1): - CBL[j,:] = lats[cbli[j,:]] - - ###Apply Moving Average to Smooth CBL Profiles - lt = len(lons) - CBLf = np.zeros((len(z500_anom_4d[:,0,0,0]),len(lons))) - m=int((self.smoothing_pts-1)/2.0) - for i in np.arange(0,len(CBL[0,:]),1): - ma_indices = np.arange(i-m,i+m+1) - ma_indices = np.where(ma_indices >= lt,ma_indices-lt,ma_indices) - CBLf[:,i] = np.nanmean(CBL[:,ma_indices],axis=1).astype(int) - - return CBLf,lats,lons,yr,mhweight - - - def run_mod_blocking1d(self,a,cbl,lat,lon,meth): - lat_d = self.lat_delta - #blon = 0 - dc = (90 - cbl).astype(int) - db = self.n_s_limits - BI = np.zeros((len(a[:,0,0]),len(lon))) - blon = np.zeros((len(a[:,0,0]),len(lon))) - if meth=='PH': - # loop through days - for k in np.arange(0,len(a[:,0,0]),1): - blontemp=0 - #bitemp=0 - q=0 - BI1=np.zeros((len(lat_d),len(lon))) - for l in lat_d: - blon1 = np.zeros(len(lon)) - d0 = dc-l - dn = ((dc - 1*db/2) - l).astype(np.int64) - ds = ((dc + 1*db/2) - l).astype(np.int64) - GHGS = np.zeros(len(cbl)) - GHGN = np.zeros(len(cbl)) - for jj in np.arange(0,len(cbl),1): - GHGN[jj] = np.mean(a[k,dn[jj]:d0[jj]+1,jj]) - GHGS[jj] = np.mean(a[k,d0[jj]:ds[jj]+1,jj]) - BI1[q,:] = GHGN-GHGS - q = q +1 - BI1 = np.max(BI1,axis=0) - block = np.where((BI1>0))[0] - blon1[block]=1 - blontemp = blontemp + blon1 - BI[k,:] = BI1 - blon[k,:] = blontemp - - return blon,BI - - - def run_Calc_IBL(self,cbl): - - #z500_daily,lats,lons,yr = self.read_nc_met(self.blocking_dir,self.blocking_var) - z500_daily = np.load('Z500_daily.npy') - lats = np.load('lats2.npy') - lons = np.load('lons2.npy') - yr = np.load('yr2.npy') - - #Initilize arrays for IBLs and the blocking index - # yr, day, lon - blonlong = np.zeros((len(yr),len(z500_daily[0,:,0,0]),len(lons))) - BI = np.zeros((len(yr),len(z500_daily[0,:,0,0]),len(lons))) - - #Using long-term mean CBL and acsessing module of mod.py - cbl = np.nanmean(cbl,axis=0) - for i in np.arange(0,len(yr),1): - blon,BI[i,:,:] = self.run_mod_blocking1d(z500_daily[i,:,:,:],cbl,lats,lons,self.block_method) - blonlong[i,:,:] = blon - - #np.save('Nstart_IBL.npy',blonlong) - return blonlong - - - def run_Calc_GIBL(self,ibl,lons,dd,year): - - #Initilize GIBL Array - GIBL = np.zeros(np.shape(ibl)) - - #####Loop finds IBLs within 7 degree of each other creating one group. Finally - ##### A GIBL exist if it has more than 15 IBLs - crit = self.ibl_in_gibl - - for i in np.arange(0,len(GIBL[:,0,0]),1): - for k in np.arange(0,len(GIBL[0,:,0]),1): - gibli = np.zeros(len(GIBL[0,0,:])) - thresh = crit/2.0 - a = ibl[i,k,:] - db = self.ibl_dist - ibli = np.where(a==1)[0] - if len(ibli)==0: - continue - idiff = ibli[1:] - ibli[:-1] - bt=0 - btlon = ibli[0] - ct = 1 - btfin = [] - block = ibli - block = np.append(block,block+360) - for ll in np.arange(1,len(block),1): - diff = np.abs(block[ll] - block[ll-1]) - if diff == 1: - bt = [block[ll]] - btlon = np.append(btlon,bt) - ct = ct + diff - if diff <= thresh and diff != 1: - bt = np.arange(block[ll-1]+1,block[ll]+1,1) - btlon = np.append(btlon,bt) - ct = ct + diff - if diff > thresh or ll==(len(block)-1): - if ct >= crit: - btfin = np.append(btfin,btlon) - ct=1 - ct = 1 - btlon = block[ll] - if len(btfin)/2 < crit : - btfin = [] - if len(btfin)==0: - continue - gibl1 = btfin - temp = np.where(gibl1>=360)[0] - gibl1[temp] = gibl1[temp] - 360 - gibli[gibl1.astype(int)] = 1 - GIBL[i,k,:] = gibli - - return GIBL - - - def Remove(self,duplicate): - final_list = [] - for num in duplicate: - if num not in final_list: - final_list.append(num) - return final_list - - - def run_Calc_Blocks(self,ibl,GIBL,lon,dayin,year): - - crit = self.ibl_in_gibl - - ##Count up the blocked longitudes for each GIBL - c = np.zeros((GIBL.shape)) - lonlen = len(lon) - yrlen = len(year) - daylen = len(dayin) - sz = [] - mx = [] - min = [] - - for y in np.arange(0,yrlen,1): - for k in np.arange(0,daylen,1): - a = GIBL[y,k] - ct=1 - ai = np.where(a==1)[0] - ai = np.append(ai,ai+360) - temp = np.where(ai>=360)[0] - bi=list(ai) - bi = np.array(bi) - bi[temp] = bi[temp]-360 - for i in np.arange(0,len(ai)-1,1): - b = ai[i] - b1 = ai[i+1] - diff = b1-b - c[y,k,bi[i]] = ct - if diff==1: - #c[y,k,bi[i]] = ct - ct=ct+1 - else: - #c[y,k,bi[i]]=ct - sz = np.append(sz,ct) - ct=1 - - ########## - finding where the left and right limits of the block are - ################ - for i in np.arange(0,yrlen,1): - for k in np.arange(0,daylen,1): - maxi = argrelextrema(c[i,k],np.greater,mode='wrap')[0] - mini = np.where(c[i,k]==1)[0] - if c[i,k,lonlen-1]!=0 and c[i,k,0]!=0: - mm1 = mini[-1] - mm2 = mini[:-1] - mini = np.append(mm1,mm2) - mx = np.append(mx,maxi) - min = np.append(min,mini) - - locy, locd, locl = np.where(c==crit) - - A = np.zeros(lonlen) - A = np.expand_dims(A,axis=0) - - ################# - Splitting up each GIBL into its own array - ################### - - for i in np.arange(0,len(locy),1): - m = locy[i] #year - n = locd[i] #day - o = locl[i] #long where 15 - mm = int(mx[i]) - mn = min[i] - temp1 = GIBL[m,n] - temp2 = np.zeros(lonlen) - if mn>mm: - diff = int(mm - c[m,n,mm] + 1) - lons = lon[diff] - place1 = np.arange(lons,lonlen,1) - place2 = np.arange(0,mm+1,1) - bl = np.append(place2,place1).astype(int) - if temp1[lonlen-1] ==1 and mm>200: - lons = lon[mm] - beg = mm - c[m,n,mm] + 1 - bl = np.arange(beg,mm+1,1).astype(int) - if mm>mn: #temp1[359] ==0: - lons = lon[mm] - beg = mm - c[m,n,mm] + 1 - bl = np.arange(beg,mm+1,1).astype(int) - temp2[bl] = 1 - temp2 = np.expand_dims(temp2,axis=0) - A = np.concatenate((A,temp2),axis=0) - - A = A[1:] - - ######### - Getting rid of non-consectutve days which would prevent blocking - ################# - dd=[] - dy = [] - dA = A[0] - dA = np.expand_dims(dA,axis=0) - ct=0 - for i in np.arange(1,len(locy),1): - dd1 = locd[i-1] - dd2 = locd[i] - if dd2-dd1 > 2: - ct = 0 - continue - if ct == 0: - dd = np.append(dd,locd[i-1]) - dy = np.append(dy,locy[i-1]) - temp2 = np.expand_dims(A[i-1],axis=0) - dA = np.concatenate((dA,temp2),axis=0) - ct = ct + 1 - if dd2-dd1<=2: - dd=np.append(dd,locd[i]) - dy = np.append(dy,locy[i]) - temp2 = np.expand_dims(A[i],axis=0) - dA = np.concatenate((dA,temp2),axis=0) - ct = ct + 1 - - dA=dA[1:] - dAfin = dA - - ############ - Finding center longitude of block - ############## - middle=[] - for l in np.arange(0,len(dAfin),1): - temp = np.where(dAfin[l]==1)[0] - if len(temp) % 2 == 0: - temp = np.append(temp,0) - midtemp = np.median(temp) - middle = np.append(middle,midtemp) - - overlap = self.gibl_overlap - - #####Track blocks. Makes sure that blocks overlap with at least 10 longitude points on consecutive days - fin = [[]] - finloc = [[]] - ddcopy=dd*1.0 - noloc=[] - failloc = [[]] - for i in np.arange(0,len(c[:,0,0]),1): - yri = np.where(dy==i)[0] - B = [[]] - ddil =1.0 * ddcopy[yri] - dyy = np.where(dy==i)[0] - rem = [] - for dk in ddil: - if len(ddil) < 5: - continue - ddil = np.append(ddil[0]-1,ddil) - diff = np.diff(ddil) - diffB=[] - dB =1 - cnt = 1 - while dB<=2: - diffB = np.append(diffB,ddil[cnt]) - dB = diff[cnt-1] - if ddil[cnt]==ddil[-1]: - dB=5 - cnt=cnt+1 - diffB = np.array(self.Remove(diffB)) - locb = [] - for ll in diffB: - locb = np.append(locb,np.where((dy==i) & (dd==ll))[0]) - ddil=ddil[1:] - locbtemp = 1.0*locb - re=[] - for hh in np.arange(0,len(noloc),1): - re = np.append(re,np.where(locb == noloc[hh])[0]) - locbtemp = np.delete(locbtemp,re) - locb=locbtemp * 1.0 - datemp = dAfin[locb.astype(int)] - blocktemp = [[datemp[0]]] - locbi = np.array([locb[0]]) - ll1=0 - pass1 = 0 - ai=[0] - add=0 - for ll in np.arange(0,len(locb)-1,1): - if ((dd[locb[ll+1].astype(int)] - dd[locb[ll1].astype(int)]) >=1) & ((dd[locb[ll+1].astype(int)] - dd[locb[ll1].astype(int)]) <=2): - add = datemp[ll1] + datemp[ll+1] - ai = np.where(add==2)[0] - if len(ai)>overlap: - locbi=np.append(locbi,locb[ll+1]) - ll1=ll+1 - add=0 - if (len(ai)4: - noloc = np.append(noloc,locbi) - finloc = finloc + [locbi] - for jj in locbi: - rem = np.append(rem,np.where(dyy==jj)[0]) - ddil = np.delete(ddcopy[yri],rem.astype(int)) - if len(locbi)<=4: - noloc = np.append(noloc,locbi) - if len(locbi)<=2: - failloc=failloc+[locbi] - for jj in locbi: - rem = np.append(rem,np.where(dyy==jj)[0]) - ddil = np.delete(ddcopy[yri],rem.astype(int)) - - blocks = finloc[1:] - noblock = failloc[1:] - - ############Get rid of blocks that travel downstream########## - ######If center of blocks travel downstream further than 45 degrees longitude, - ######cancel block moment it travels out of this limit - newblock = [[]] - newnoblock=[[]] - distthresh = self.block_travel - for bb in blocks: - diffb = [] - start = middle[bb[0].astype(int)] - for bbs in bb: - diffb = np.append(diffb, start - middle[bbs.astype(int)]) - loc = np.where(np.abs(diffb) > distthresh)[0] - if len(loc)==0: - newblock = newblock +[bb] - if len(loc)>0: - if len(bb[:loc[0]]) >4: - newblock = newblock + [bb[:loc[0]]] - if len(bb[:loc[0]]) <=2: - noblock = noblock + [bb] - - blocks = newblock[1:] - - #Create a final array with blocking longitudes. Similar to IBL/GIBL, but those that pass the duration threshold - blockfreq = np.zeros((len(year),len(ibl[0,:,0]),360)) - savecbl=[] - savemiddle = [] - saveyr=[] - numblock=0 - for i in np.arange(0,len(blocks),1): - temp = blocks[i] - numblock=numblock+1 - for j in temp: - j=int(j) - daycomp = int(dd[j]) - yearcomp = int(dy[j]) - saveyr = np.append(saveyr,dy[j]) - middlecomp = middle[j].astype(int) - mc1 = int(round(middlecomp / 2.5)) - blockfreq[yearcomp,daycomp] = blockfreq[yearcomp,daycomp] + dAfin[j] - ct = ct + 1 - - print(blockfreq) - return blockfreq From 871a4660be88057f1a8ff1fbab8f139cdcefcd72 Mon Sep 17 00:00:00 2001 From: CPKalb Date: Tue, 22 Sep 2020 12:54:35 -0600 Subject: [PATCH 14/93] Add files via upload --- ush/Blocking.py | 521 +++++++++++++++++++++++++++++++++++++++++ ush/Blocking_driver.py | 90 +++++++ 2 files changed, 611 insertions(+) create mode 100644 ush/Blocking.py create mode 100644 ush/Blocking_driver.py diff --git a/ush/Blocking.py b/ush/Blocking.py new file mode 100644 index 0000000000..9731a7d762 --- /dev/null +++ b/ush/Blocking.py @@ -0,0 +1,521 @@ +import os +import glob +import numpy as np +import netCDF4 +import pandas as pd +import datetime +import bisect +from scipy import stats +from scipy.signal import argrelextrema + +class BlockingCalculation(): + """Contains the programs to calculate Blocking via the Pelly-Hoskins Method + """ + def __init__(self,config): + + from metplus.util import config_metplus + from metplus.util import get_start_end_interval_times + loop_time, end_time, time_interval = get_start_end_interval_times(config) + + self.start_date = loop_time.strftime('%Y%m%d%H') + self.end_date = end_time.strftime('%Y%m%d%H') + self.start_mth = loop_time.strftime('%m') + self.blocking_anomaly_dir = config.getstr('Blocking','BLOCKING_ANOMALY_DIR') + self.blocking_anomaly_var = config.getstr('Blocking','BLOCKING_ANOMALY_VAR') + self.blocking_dir = config.getstr('Blocking','BLOCKING_DIR') + self.blocking_var = config.getstr('Blocking','BLOCKING_VAR') + self.smoothing_pts = config.getint('Blocking','SMOOTHING_PTS') + lat_delta_in = config.getstr('Blocking','LAT_DELTA') + self.lat_delta = list(map(int,lat_delta_in.split(","))) + self.n_s_limits = config.getint('Blocking','NORTH_SOUTH_LIMITS') + self.ibl_dist = config.getint('Blocking','IBL_DIST') + self.ibl_in_gibl = config.getint('Blocking','IBL_IN_GIBL') + self.gibl_overlap = config.getint('Blocking','GIBL_OVERLAP') + self.block_time = config.getint('Blocking','BLOCK_TIME') #####Probably should fix this so it supports other times" + self.block_travel = config.getint('Blocking','BLOCK_TRAVEL') + self.block_method = config.getstr('Blocking','BLOCK_METHOD') + + # Check data requirements + if self.smoothing_pts % 2 == 0: + print('ERROR: Smoothing Radius must be an odd number given in grid points, Exiting...') + exit() + + def read_nc_met(self,indir,invar): + + infiles = glob.glob(indir+"/*.nc") + infiles.sort() + + print("Reading in Data") + indata = netCDF4.Dataset(infiles[0]) + lats = indata.variables['lat'][:] + lons = indata.variables['lon'][:] + var_3d = indata.variables[invar][:] + var_3d = np.expand_dims(var_3d,axis=0) + init_time_str = indata.variables[invar].getncattr('init_time') + valid_time_str = indata.variables[invar].getncattr('valid_time') + indata.close() + yrlist = [] + pmth = valid_time_str[4:6] + loclist = [0] + cntr = 1 + + # Create a list of all the dates I need, so I can fill missing days + sdate_pd = self.start_date[0:4]+'-'+self.start_date[4:6]+'-'+self.start_date[6:8] + edate_pd = self.end_date[0:4]+'-'+self.end_date[4:6]+'-'+self.end_date[6:8] + djf_dates = [dt for dt in pd.date_range(start=sdate_pd, end=edate_pd).to_pydatetime() if dt.month in [1,2,12] and + not (dt.month == 2 and dt.day == 29)] + + valid_datetime = datetime.datetime(int(valid_time_str[0:4]),int(valid_time_str[4:6]),int(valid_time_str[6:8])) + datediff = valid_datetime - djf_dates[0] + if valid_datetime > djf_dates[0]: + diff = bisect.bisect_left(djf_dates,valid_datetime) + filldata = np.empty((diff,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) + filldata[:] = np.nan + var_3d = np.append(filldata,var_3d,axis=0) + icnt = diff + 1 + elif valid_datetime < djf_dates[0]: + print('Extra data present, not set up to handle this. Exiting...') + exit() + else: + icnt = 1 + + for i in range(1,len(infiles)): + + #Read in the data + indata = netCDF4.Dataset(infiles[i]) + new_invar = indata.variables[invar][:] + new_invar = np.expand_dims(new_invar,axis=0) + init_time_str = indata.variables[invar].getncattr('init_time') + valid_time_str = indata.variables[invar].getncattr('valid_time') + indata.close() + cmth = valid_time_str[4:6] + + valid_datetime = datetime.datetime(int(valid_time_str[0:4]),int(valid_time_str[4:6]),int(valid_time_str[6:8])) + if valid_datetime > djf_dates[icnt]: + locvd = bisect.bisect_left(djf_dates,valid_datetime) + locc = bisect.bisect_left(djf_dates,djf_dates[icnt]) + diff = bisect.bisect_left(djf_dates,valid_datetime) - bisect.bisect_left(djf_dates,djf_dates[icnt]) + filldata = np.empty((diff,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) + filldata[:] = np.nan + var_3d = np.append(var_3d,filldata,axis=0) + icnt+=diff + elif valid_datetime < djf_dates[i]: + print('Extra data present, not set up to handle this. Exiting...') + exit() + var_3d = np.append(var_3d,new_invar,axis=0) + + if (int(cmth) == int(self.start_mth)) and (int(pmth) != int(self.start_mth)): + yrlist.append(int(valid_time_str[0:4])) + loclist.append(cntr) + + pmth = cmth + cntr+=1 + icnt+=1 + + if len(djf_dates) > len(var_3d[:,0,0]): + diff = len(djf_dates) - len(var_3d[:,0,0]) + filldata = np.empty((diff,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) + filldata[:] = np.nan + var_3d = np.append(var_3d,filldata,axis=0) + + yrlist.append(int(valid_time_str[0:4])) + yr = np.array(yrlist) + sdim = len(var_3d[:,0,0])/float(len(yrlist)) + var_4d = np.reshape(var_3d,[len(yrlist),int(sdim),len(var_3d[0,:,0]),len(var_3d[0,0,:])]) + + return var_4d,lats,lons,yr + + + def run_CBL(self): + + #z500_anom_4d,lats,lons,yr = self.read_nc_met(self.blocking_anomaly_dir,self.blocking_anomaly_var) + z500_anom_4d = np.load('Z500_anom.npy') + lats = np.load('lats1.npy') + lons = np.load('lons1.npy') + yr = np.load('yr1.npy') + + #Create Latitude Weight based for NH + cos = lats + cos = cos * np.pi / 180.0 + way = np.cos(cos) + way = np.sqrt(way) + weightf = np.repeat(way[:,np.newaxis],360,axis=1) + + ####Find latitude of maximum high-pass STD (CBL) + mstd = np.nanstd(z500_anom_4d,axis=1) + mhweight = mstd * weightf + cbli = np.argmax(mhweight,axis=1) + CBL = np.zeros((len(z500_anom_4d[:,0,0,0]),len(lons))) + for j in np.arange(0,len(yr),1): + CBL[j,:] = lats[cbli[j,:]] + + ###Apply Moving Average to Smooth CBL Profiles + lt = len(lons) + CBLf = np.zeros((len(z500_anom_4d[:,0,0,0]),len(lons))) + m=int((self.smoothing_pts-1)/2.0) + for i in np.arange(0,len(CBL[0,:]),1): + ma_indices = np.arange(i-m,i+m+1) + ma_indices = np.where(ma_indices >= lt,ma_indices-lt,ma_indices) + CBLf[:,i] = np.nanmean(CBL[:,ma_indices],axis=1).astype(int) + + return CBLf,lats,lons,yr,mhweight + + + def run_mod_blocking1d(self,a,cbl,lat,lon,meth): + lat_d = self.lat_delta + #blon = 0 + dc = (90 - cbl).astype(int) + db = self.n_s_limits + BI = np.zeros((len(a[:,0,0]),len(lon))) + blon = np.zeros((len(a[:,0,0]),len(lon))) + if meth=='PH': + # loop through days + for k in np.arange(0,len(a[:,0,0]),1): + blontemp=0 + #bitemp=0 + q=0 + BI1=np.zeros((len(lat_d),len(lon))) + for l in lat_d: + blon1 = np.zeros(len(lon)) + d0 = dc-l + dn = ((dc - 1*db/2) - l).astype(np.int64) + ds = ((dc + 1*db/2) - l).astype(np.int64) + GHGS = np.zeros(len(cbl)) + GHGN = np.zeros(len(cbl)) + for jj in np.arange(0,len(cbl),1): + GHGN[jj] = np.mean(a[k,dn[jj]:d0[jj]+1,jj]) + GHGS[jj] = np.mean(a[k,d0[jj]:ds[jj]+1,jj]) + BI1[q,:] = GHGN-GHGS + q = q +1 + BI1 = np.max(BI1,axis=0) + block = np.where((BI1>0))[0] + blon1[block]=1 + blontemp = blontemp + blon1 + BI[k,:] = BI1 + blon[k,:] = blontemp + + return blon,BI + + + def run_Calc_IBL(self,cbl): + + #z500_daily,lats,lons,yr = self.read_nc_met(self.blocking_dir,self.blocking_var) + z500_daily = np.load('Z500_daily.npy') + lats = np.load('lats2.npy') + lons = np.load('lons2.npy') + yr = np.load('yr2.npy') + + #Initilize arrays for IBLs and the blocking index + # yr, day, lon + blonlong = np.zeros((len(yr),len(z500_daily[0,:,0,0]),len(lons))) + BI = np.zeros((len(yr),len(z500_daily[0,:,0,0]),len(lons))) + + #Using long-term mean CBL and acsessing module of mod.py + cbl = np.nanmean(cbl,axis=0) + for i in np.arange(0,len(yr),1): + blon,BI[i,:,:] = self.run_mod_blocking1d(z500_daily[i,:,:,:],cbl,lats,lons,self.block_method) + blonlong[i,:,:] = blon + + #np.save('Nstart_IBL.npy',blonlong) + return blonlong + + + #def run_Calc_GIBL(self,ibl,lons,dd,year): + def run_Calc_GIBL(self,ibl,lons): + + #Initilize GIBL Array + GIBL = np.zeros(np.shape(ibl)) + + #####Loop finds IBLs within 7 degree of each other creating one group. Finally + ##### A GIBL exist if it has more than 15 IBLs + crit = self.ibl_in_gibl + + for i in np.arange(0,len(GIBL[:,0,0]),1): + for k in np.arange(0,len(GIBL[0,:,0]),1): + gibli = np.zeros(len(GIBL[0,0,:])) + thresh = crit/2.0 + a = ibl[i,k,:] + db = self.ibl_dist + ibli = np.where(a==1)[0] + if len(ibli)==0: + continue + idiff = ibli[1:] - ibli[:-1] + bt=0 + btlon = ibli[0] + ct = 1 + btfin = [] + block = ibli + block = np.append(block,block+360) + for ll in np.arange(1,len(block),1): + diff = np.abs(block[ll] - block[ll-1]) + if diff == 1: + bt = [block[ll]] + btlon = np.append(btlon,bt) + ct = ct + diff + if diff <= thresh and diff != 1: + bt = np.arange(block[ll-1]+1,block[ll]+1,1) + btlon = np.append(btlon,bt) + ct = ct + diff + if diff > thresh or ll==(len(block)-1): + if ct >= crit: + btfin = np.append(btfin,btlon) + ct=1 + ct = 1 + btlon = block[ll] + if len(btfin)/2 < crit : + btfin = [] + if len(btfin)==0: + continue + gibl1 = btfin + temp = np.where(gibl1>=360)[0] + gibl1[temp] = gibl1[temp] - 360 + gibli[gibl1.astype(int)] = 1 + GIBL[i,k,:] = gibli + + return GIBL + + + def Remove(self,duplicate): + final_list = [] + for num in duplicate: + if num not in final_list: + final_list.append(num) + return final_list + + + def run_Calc_Blocks(self,ibl,GIBL,lon,tsin,year): + + crit = self.ibl_in_gibl + + ##Count up the blocked longitudes for each GIBL + c = np.zeros((GIBL.shape)) + lonlen = len(lon) + yrlen = len(year) + tslen = len(tsin) + sz = [] + mx = [] + min = [] + + for y in np.arange(0,yrlen,1): + for k in np.arange(0,tslen,1): + a = GIBL[y,k] + ct=1 + ai = np.where(a==1)[0] + ai = np.append(ai,ai+360) + temp = np.where(ai>=360)[0] + bi=list(ai) + bi = np.array(bi) + bi[temp] = bi[temp]-360 + for i in np.arange(0,len(ai)-1,1): + b = ai[i] + b1 = ai[i+1] + diff = b1-b + c[y,k,bi[i]] = ct + if diff==1: + #c[y,k,bi[i]] = ct + ct=ct+1 + else: + #c[y,k,bi[i]]=ct + sz = np.append(sz,ct) + ct=1 + + ########## - finding where the left and right limits of the block are - ################ + for i in np.arange(0,yrlen,1): + for k in np.arange(0,tslen,1): + maxi = argrelextrema(c[i,k],np.greater,mode='wrap')[0] + mini = np.where(c[i,k]==1)[0] + if c[i,k,lonlen-1]!=0 and c[i,k,0]!=0: + mm1 = mini[-1] + mm2 = mini[:-1] + mini = np.append(mm1,mm2) + mx = np.append(mx,maxi) + min = np.append(min,mini) + + locy, locd, locl = np.where(c==crit) + + A = np.zeros(lonlen) + A = np.expand_dims(A,axis=0) + + ################# - Splitting up each GIBL into its own array - ################### + + for i in np.arange(0,len(locy),1): + m = locy[i] #year + n = locd[i] #day + o = locl[i] #long where 15 + mm = int(mx[i]) + mn = min[i] + temp1 = GIBL[m,n] + temp2 = np.zeros(lonlen) + if mn>mm: + diff = int(mm - c[m,n,mm] + 1) + lons = lon[diff] + place1 = np.arange(lons,lonlen,1) + place2 = np.arange(0,mm+1,1) + bl = np.append(place2,place1).astype(int) + if temp1[lonlen-1] ==1 and mm>200: + lons = lon[mm] + beg = mm - c[m,n,mm] + 1 + bl = np.arange(beg,mm+1,1).astype(int) + if mm>mn: #temp1[359] ==0: + lons = lon[mm] + beg = mm - c[m,n,mm] + 1 + bl = np.arange(beg,mm+1,1).astype(int) + temp2[bl] = 1 + temp2 = np.expand_dims(temp2,axis=0) + A = np.concatenate((A,temp2),axis=0) + + A = A[1:] + + ######### - Getting rid of non-consectutve Time steps which would prevent blocking - ################# + dd=[] + dy = [] + dA = A[0] + dA = np.expand_dims(dA,axis=0) + ct=0 + for i in np.arange(1,len(locy),1): + dd1 = locd[i-1] + dd2 = locd[i] + if dd2-dd1 > 2: + ct = 0 + continue + if ct == 0: + dd = np.append(dd,locd[i-1]) + dy = np.append(dy,locy[i-1]) + temp2 = np.expand_dims(A[i-1],axis=0) + dA = np.concatenate((dA,temp2),axis=0) + ct = ct + 1 + if dd2-dd1<=2: + dd=np.append(dd,locd[i]) + dy = np.append(dy,locy[i]) + temp2 = np.expand_dims(A[i],axis=0) + dA = np.concatenate((dA,temp2),axis=0) + ct = ct + 1 + + dA=dA[1:] + dAfin = dA + + ############ - Finding center longitude of block - ############## + middle=[] + for l in np.arange(0,len(dAfin),1): + temp = np.where(dAfin[l]==1)[0] + if len(temp) % 2 == 0: + temp = np.append(temp,0) + midtemp = np.median(temp) + middle = np.append(middle,midtemp) + + overlap = self.gibl_overlap + + #####Track blocks. Makes sure that blocks overlap with at least 10 longitude points on consecutive + fin = [[]] + finloc = [[]] + ddcopy=dd*1.0 + noloc=[] + failloc = [[]] + for i in np.arange(0,len(c[:,0,0]),1): + yri = np.where(dy==i)[0] + B = [[]] + ddil =1.0 * ddcopy[yri] + dyy = np.where(dy==i)[0] + rem = [] + for dk in ddil: + if len(ddil) < 5: + continue + ddil = np.append(ddil[0]-1,ddil) + diff = np.diff(ddil) + diffB=[] + dB =1 + cnt = 1 + while dB<=2: + diffB = np.append(diffB,ddil[cnt]) + dB = diff[cnt-1] + if ddil[cnt]==ddil[-1]: + dB=5 + cnt=cnt+1 + diffB = np.array(self.Remove(diffB)) + locb = [] + for ll in diffB: + locb = np.append(locb,np.where((dy==i) & (dd==ll))[0]) + ddil=ddil[1:] + locbtemp = 1.0*locb + re=[] + for hh in np.arange(0,len(noloc),1): + re = np.append(re,np.where(locb == noloc[hh])[0]) + locbtemp = np.delete(locbtemp,re) + locb=locbtemp * 1.0 + datemp = dAfin[locb.astype(int)] + blocktemp = [[datemp[0]]] + locbi = np.array([locb[0]]) + ll1=0 + pass1 = 0 + ai=[0] + add=0 + for ll in np.arange(0,len(locb)-1,1): + if ((dd[locb[ll+1].astype(int)] - dd[locb[ll1].astype(int)]) >=1) & ((dd[locb[ll+1].astype(int)] - dd[locb[ll1].astype(int)]) <=2): + add = datemp[ll1] + datemp[ll+1] + ai = np.where(add==2)[0] + if len(ai)>overlap: + locbi=np.append(locbi,locb[ll+1]) + ll1=ll+1 + add=0 + if (len(ai)4: + noloc = np.append(noloc,locbi) + finloc = finloc + [locbi] + for jj in locbi: + rem = np.append(rem,np.where(dyy==jj)[0]) + ddil = np.delete(ddcopy[yri],rem.astype(int)) + if len(locbi)<=4: + noloc = np.append(noloc,locbi) + if len(locbi)<=2: + failloc=failloc+[locbi] + for jj in locbi: + rem = np.append(rem,np.where(dyy==jj)[0]) + ddil = np.delete(ddcopy[yri],rem.astype(int)) + + blocks = finloc[1:] + noblock = failloc[1:] + + ############Get rid of blocks that travel downstream########## + ######If center of blocks travel downstream further than 45 degrees longitude, + ######cancel block moment it travels out of this limit + newblock = [[]] + newnoblock=[[]] + distthresh = self.block_travel + for bb in blocks: + diffb = [] + start = middle[bb[0].astype(int)] + for bbs in bb: + diffb = np.append(diffb, start - middle[bbs.astype(int)]) + loc = np.where(np.abs(diffb) > distthresh)[0] + if len(loc)==0: + newblock = newblock +[bb] + if len(loc)>0: + if len(bb[:loc[0]]) >4: + newblock = newblock + [bb[:loc[0]]] + if len(bb[:loc[0]]) <=2: + noblock = noblock + [bb] + + blocks = newblock[1:] + + #Create a final array with blocking longitudes. Similar to IBL/GIBL, but those that pass the duration threshold + blockfreq = np.zeros((len(year),len(ibl[0,:,0]),360)) + savecbl=[] + savemiddle = [] + saveyr=[] + numblock=0 + for i in np.arange(0,len(blocks),1): + temp = blocks[i] + numblock=numblock+1 + for j in temp: + j=int(j) + daycomp = int(dd[j]) + yearcomp = int(dy[j]) + saveyr = np.append(saveyr,dy[j]) + middlecomp = middle[j].astype(int) + mc1 = int(round(middlecomp / 2.5)) + blockfreq[yearcomp,daycomp] = blockfreq[yearcomp,daycomp] + dAfin[j] + ct = ct + 1 + + return blockfreq diff --git a/ush/Blocking_driver.py b/ush/Blocking_driver.py new file mode 100644 index 0000000000..2b246ec9d1 --- /dev/null +++ b/ush/Blocking_driver.py @@ -0,0 +1,90 @@ +import sys +import os +import numpy as np +import netCDF4 +from Blocking import BlockingCalculation + +def main(): + + # add metplus directory to path so the wrappers and utilities can be found + sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), + os.pardir))) + sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy/metplotpy/blocking_s2s") + sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy_feature_33/metplotpy/blocking_s2s") + from metplus.util import config_metplus + from ush.master_metplus import get_config_inputs_from_command_line + from metplus.wrappers import PCPCombineWrapper + from metplus.wrappers import RegridDataPlaneWrapper + import plot_blocking as pb + from CBL_plot import create_cbl_plot + + config_list = get_config_inputs_from_command_line() + + ###################################################################### + # Pre-Process Data: + ###################################################################### + config = config_metplus.setup(config_list) + # Regrid to 1 Degree + #print('Regridding') + #RegridDataPlaneWrapper(config).run_all_times() + + #Compute Daily Average + #print('Computing Daily Averages') + #daily_config = config_metplus.replace_config_from_section(config, 'daily_mean') + #PCPCombineWrapper(daily_config).run_all_times() + + #Take a running mean + #print('Computing Running means') + #rmean_config = config_metplus.replace_config_from_section(config, 'running_mean') + #PCPCombineWrapper(rmean_config).run_all_times() + + #Compute anomaly + #print('Computing Anomalies') + #anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly') + #PCPCombineWrapper(anomaly_config).run_all_times() + + + ###################################################################### + # Blocking Calculation + ###################################################################### + # Set up the data + steps = BlockingCalculation(config) + + # Calculate Central Blocking Latitude + print('Computing CBLs') + cbls,lats,lons,yr,mhweight = steps.run_CBL() + + # Run IBL + print('Computing IBLs') + ibls = steps.run_Calc_IBL(cbls) + daynum = np.arange(0,len(ibls[0,:,0]),1) + + # Run GIBL + print('Computing GIBLs') + gibls = steps.run_Calc_GIBL(ibls,lons) + + # Calc Blocks + print('Computing Blocks') + block_freq = steps.run_Calc_Blocks(ibls,gibls,lons,daynum,yr) + + + ###################################################################### + # Plotting + ###################################################################### + # Plot ---Minna's code + create_cbl_plot(lons, lats, cbls, mhweight, 'DFJ', 'Minna_CBL', do_averaging=True) + + + # Plot IBL's + ibl_plot_title = config.getstr('Blocking','IBL_TITLE') + ibl_plot_outname = config.getstr('Blocking','IBL_OUTPUT_NAME') + pb.plot_ibls(ibls,lons,ibl_plot_title,ibl_plot_outname) + + # Plot Blocking Frequency + blocking_plot_title = config.getstr('Blocking','BLOCKING_TITLE') + blocking_plot_outname = config.getstr('Blocking','BLOCKING_OUTPUT_NAME') + pb.plot_blocks(block_freq,gibls,ibls,lons,blocking_plot_title,blocking_plot_outname) + + +if __name__ == "__main__": + main() From 767f941f86c5ad094fc3dbed2c0e1ae4dbc6d86d Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Wed, 23 Sep 2020 11:02:54 -0600 Subject: [PATCH 15/93] updated blocking driver order --- ush/Blocking_driver.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/ush/Blocking_driver.py b/ush/Blocking_driver.py index 2b246ec9d1..93c825b5bf 100644 --- a/ush/Blocking_driver.py +++ b/ush/Blocking_driver.py @@ -45,7 +45,7 @@ def main(): ###################################################################### - # Blocking Calculation + # Blocking Calculation and Plotting ###################################################################### # Set up the data steps = BlockingCalculation(config) @@ -54,35 +54,35 @@ def main(): print('Computing CBLs') cbls,lats,lons,yr,mhweight = steps.run_CBL() + #Plot Central Blocking Latitude + cbl_plot_mthstr = config.getstr('Blocking','CBL_PLOT_MTHSTR') + cbl_plot_outname = config.getstr('Blocking','CBL_PLOT_OUTPUT_NAME') + create_cbl_plot(lons, lats, cbls, mhweight, cbl_plot_mthstr, cbl_plot_outname, do_averaging=True) + + # Run IBL print('Computing IBLs') ibls = steps.run_Calc_IBL(cbls) daynum = np.arange(0,len(ibls[0,:,0]),1) + # Plot IBLS + ibl_plot_title = config.getstr('Blocking','IBL_PLOT_TITLE') + ibl_plot_outname = config.getstr('Blocking','IBL_PLOT_OUTPUT_NAME') + pb.plot_ibls(ibls,lons,ibl_plot_title,ibl_plot_outname) + + # Run GIBL print('Computing GIBLs') gibls = steps.run_Calc_GIBL(ibls,lons) + # Calc Blocks print('Computing Blocks') block_freq = steps.run_Calc_Blocks(ibls,gibls,lons,daynum,yr) - - ###################################################################### - # Plotting - ###################################################################### - # Plot ---Minna's code - create_cbl_plot(lons, lats, cbls, mhweight, 'DFJ', 'Minna_CBL', do_averaging=True) - - - # Plot IBL's - ibl_plot_title = config.getstr('Blocking','IBL_TITLE') - ibl_plot_outname = config.getstr('Blocking','IBL_OUTPUT_NAME') - pb.plot_ibls(ibls,lons,ibl_plot_title,ibl_plot_outname) - # Plot Blocking Frequency - blocking_plot_title = config.getstr('Blocking','BLOCKING_TITLE') - blocking_plot_outname = config.getstr('Blocking','BLOCKING_OUTPUT_NAME') + blocking_plot_title = config.getstr('Blocking','BLOCKING_PLOT_TITLE') + blocking_plot_outname = config.getstr('Blocking','BLOCKING_PLOT_OUTPUT_NAME') pb.plot_blocks(block_freq,gibls,ibls,lons,blocking_plot_title,blocking_plot_outname) From f4868ada3a8f2823326743ffff91ec238e0b6dea Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Thu, 24 Sep 2020 15:48:48 -0600 Subject: [PATCH 16/93] updated parm file --- .../Regrid_PCP_obsERA_obsOnly_Blocking.conf | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf index 45b82b4611..476771c2c7 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf @@ -58,12 +58,6 @@ REGRID_DATA_PLANE_METHOD = BILIN REGRID_DATA_PLANE_WIDTH = 2 [dir] -INPUT_BASE = /glade/scratch/kalb/METplus -OUTPUT_BASE = /glade/scratch/kalb/METplus/model_applications -STAGING_DIR={OUTPUT_BASE}/stage -MET_INSTALL_DIR = /glade/p/ral/jntp/MET/MET_releases/9.1 -TMP_DIR = {OUTPUT_BASE}/tmp - # location of configuration files used by MET applications CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s @@ -260,10 +254,14 @@ BLOCK_TRAVEL = 45 # Pelly-Hoskins Method BLOCK_METHOD = PH +#CBL plot title and name +CBL_PLOT_MTHSTR = DJF +CBL_PLOT_OUTPUT_NAME = CBL_avg + # IBL plot title and name -IBL_TITLE = DJF Instantaneous Blocked Longitude -IBL_OUTPUT_NAME = IBL_Freq_DJF +IBL_PLOT_TITLE = DJF Instantaneous Blocked Longitude +IBL_PLOT_OUTPUT_NAME = IBL_Freq_DJF # Blocking plot title and name -BLOCKING_TITLE = DJF Blocking Frequency -BLOCKING_OUTPUT_NAME = Block_Freq_DJF +BLOCKING_PLOT_TITLE = DJF Blocking Frequency +BLOCKING_PLOT_OUTPUT_NAME = Block_Freq_DJF From b9c1a0a6d77ed80f1a2cf874fe407f926c09d0eb Mon Sep 17 00:00:00 2001 From: Hank Fisher Date: Mon, 19 Oct 2020 17:04:03 -0600 Subject: [PATCH 17/93] Added a command line parameter to grab a list of steps if desired --- ush/Blocking_driver.py | 64 +++++++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 20 deletions(-) diff --git a/ush/Blocking_driver.py b/ush/Blocking_driver.py index 93c825b5bf..17abdef15c 100644 --- a/ush/Blocking_driver.py +++ b/ush/Blocking_driver.py @@ -15,11 +15,28 @@ def main(): from ush.master_metplus import get_config_inputs_from_command_line from metplus.wrappers import PCPCombineWrapper from metplus.wrappers import RegridDataPlaneWrapper - import plot_blocking as pb - from CBL_plot import create_cbl_plot + #import plot_blocking as pb + #from CBL_plot import create_cbl_plot + all_steps = ["CBL","PLOTCBL","IBL","IBLS","GIBL","CALCBLOCKS","PLOTFREQ"] config_list = get_config_inputs_from_command_line() + # If the user has defined the steps they want to run + # grab the command line parameter + steps_config_part = [s for s in config_list if "STEPS" in s] + steps_list = [] + + # If no steps have been listed on the command line run them all + if not steps_config_part: + steps_list = all_steps + else: + # If a list of steps has been added to the command line + # parse them, put them in a python list and remove that + # parameter from the original config list + steps_param = steps_config_part[0].split("=")[1] + steps_list = steps_param.split("+") + config_list.remove(steps_config_part[0]) + ###################################################################### # Pre-Process Data: ###################################################################### @@ -51,39 +68,46 @@ def main(): steps = BlockingCalculation(config) # Calculate Central Blocking Latitude - print('Computing CBLs') - cbls,lats,lons,yr,mhweight = steps.run_CBL() + if ("CBL" in steps_list): + print('Computing CBLs') + cbls,lats,lons,yr,mhweight = steps.run_CBL() #Plot Central Blocking Latitude - cbl_plot_mthstr = config.getstr('Blocking','CBL_PLOT_MTHSTR') - cbl_plot_outname = config.getstr('Blocking','CBL_PLOT_OUTPUT_NAME') - create_cbl_plot(lons, lats, cbls, mhweight, cbl_plot_mthstr, cbl_plot_outname, do_averaging=True) + if ("PLOTCBL" in steps_list ): + cbl_plot_mthstr = config.getstr('Blocking','CBL_PLOT_MTHSTR') + cbl_plot_outname = config.getstr('Blocking','CBL_PLOT_OUTPUT_NAME') + create_cbl_plot(lons, lats, cbls, mhweight, cbl_plot_mthstr, cbl_plot_outname, do_averaging=True) # Run IBL - print('Computing IBLs') - ibls = steps.run_Calc_IBL(cbls) - daynum = np.arange(0,len(ibls[0,:,0]),1) + if( "IBL" in steps_list): + print('Computing IBLs') + ibls = steps.run_Calc_IBL(cbls) + daynum = np.arange(0,len(ibls[0,:,0]),1) # Plot IBLS - ibl_plot_title = config.getstr('Blocking','IBL_PLOT_TITLE') - ibl_plot_outname = config.getstr('Blocking','IBL_PLOT_OUTPUT_NAME') - pb.plot_ibls(ibls,lons,ibl_plot_title,ibl_plot_outname) + if( "IBLS" in steps_list): + ibl_plot_title = config.getstr('Blocking','IBL_PLOT_TITLE') + ibl_plot_outname = config.getstr('Blocking','IBL_PLOT_OUTPUT_NAME') + pb.plot_ibls(ibls,lons,ibl_plot_title,ibl_plot_outname) # Run GIBL - print('Computing GIBLs') - gibls = steps.run_Calc_GIBL(ibls,lons) + if( "GIBL" in steps_list): + print('Computing GIBLs') + gibls = steps.run_Calc_GIBL(ibls,lons) # Calc Blocks - print('Computing Blocks') - block_freq = steps.run_Calc_Blocks(ibls,gibls,lons,daynum,yr) + if( "CALCBLOCKS" in steps_list): + print('Computing Blocks') + block_freq = steps.run_Calc_Blocks(ibls,gibls,lons,daynum,yr) # Plot Blocking Frequency - blocking_plot_title = config.getstr('Blocking','BLOCKING_PLOT_TITLE') - blocking_plot_outname = config.getstr('Blocking','BLOCKING_PLOT_OUTPUT_NAME') - pb.plot_blocks(block_freq,gibls,ibls,lons,blocking_plot_title,blocking_plot_outname) + if( "PLOTFREQ" in steps_list): + blocking_plot_title = config.getstr('Blocking','BLOCKING_PLOT_TITLE') + blocking_plot_outname = config.getstr('Blocking','BLOCKING_PLOT_OUTPUT_NAME') + pb.plot_blocks(block_freq,gibls,ibls,lons,blocking_plot_title,blocking_plot_outname) if __name__ == "__main__": From 6bf0a0fe733ef65b4aecc23d68a53faf25637a6b Mon Sep 17 00:00:00 2001 From: Hank Fisher Date: Wed, 21 Oct 2020 15:37:39 -0600 Subject: [PATCH 18/93] Added more command line parameters to split up sections --- ush/Blocking_driver.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/ush/Blocking_driver.py b/ush/Blocking_driver.py index 17abdef15c..6b4cc3f6e8 100644 --- a/ush/Blocking_driver.py +++ b/ush/Blocking_driver.py @@ -17,7 +17,7 @@ def main(): from metplus.wrappers import RegridDataPlaneWrapper #import plot_blocking as pb #from CBL_plot import create_cbl_plot - all_steps = ["CBL","PLOTCBL","IBL","IBLS","GIBL","CALCBLOCKS","PLOTFREQ"] + all_steps = ["REGRID","DAILYAVE","RUNMEAN","ANOMALY","CBL","PLOTCBL","IBL","IBLS","GIBL","CALCBLOCKS","PLOTBLOCKS"] config_list = get_config_inputs_from_command_line() @@ -42,23 +42,27 @@ def main(): ###################################################################### config = config_metplus.setup(config_list) # Regrid to 1 Degree - #print('Regridding') - #RegridDataPlaneWrapper(config).run_all_times() + if ("REGRID" in steps_list): + print('Regridding') + RegridDataPlaneWrapper(config).run_all_times() #Compute Daily Average - #print('Computing Daily Averages') - #daily_config = config_metplus.replace_config_from_section(config, 'daily_mean') - #PCPCombineWrapper(daily_config).run_all_times() + if ("DAILYAVE" in steps_list): + print('Computing Daily Averages') + daily_config = config_metplus.replace_config_from_section(config, 'daily_mean') + PCPCombineWrapper(daily_config).run_all_times() #Take a running mean - #print('Computing Running means') - #rmean_config = config_metplus.replace_config_from_section(config, 'running_mean') - #PCPCombineWrapper(rmean_config).run_all_times() + if ("RUNMEAN" in steps_list): + print('Computing Running means') + rmean_config = config_metplus.replace_config_from_section(config, 'running_mean') + PCPCombineWrapper(rmean_config).run_all_times() #Compute anomaly - #print('Computing Anomalies') - #anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly') - #PCPCombineWrapper(anomaly_config).run_all_times() + if ("ANOMALY" in steps_list): + print('Computing Anomalies') + anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly') + PCPCombineWrapper(anomaly_config).run_all_times() ###################################################################### @@ -104,7 +108,7 @@ def main(): block_freq = steps.run_Calc_Blocks(ibls,gibls,lons,daynum,yr) # Plot Blocking Frequency - if( "PLOTFREQ" in steps_list): + if( "PLOTBLOCKS" in steps_list): blocking_plot_title = config.getstr('Blocking','BLOCKING_PLOT_TITLE') blocking_plot_outname = config.getstr('Blocking','BLOCKING_PLOT_OUTPUT_NAME') pb.plot_blocks(block_freq,gibls,ibls,lons,blocking_plot_title,blocking_plot_outname) From f36c58eb3c013a0ebc18e0d84da407aafe9b5583 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Sun, 25 Oct 2020 21:45:29 -0600 Subject: [PATCH 19/93] updates to Blocking programs for model data --- ush/Blocking.py | 90 ++++++++++++++++++++++++++++++------------------- 1 file changed, 55 insertions(+), 35 deletions(-) diff --git a/ush/Blocking.py b/ush/Blocking.py index 9731a7d762..7ed33ebd10 100644 --- a/ush/Blocking.py +++ b/ush/Blocking.py @@ -13,13 +13,9 @@ class BlockingCalculation(): """ def __init__(self,config): - from metplus.util import config_metplus - from metplus.util import get_start_end_interval_times - loop_time, end_time, time_interval = get_start_end_interval_times(config) + from metplus.util import config_metplus, get_start_end_interval_times, get_lead_sequence + from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate - self.start_date = loop_time.strftime('%Y%m%d%H') - self.end_date = end_time.strftime('%Y%m%d%H') - self.start_mth = loop_time.strftime('%m') self.blocking_anomaly_dir = config.getstr('Blocking','BLOCKING_ANOMALY_DIR') self.blocking_anomaly_var = config.getstr('Blocking','BLOCKING_ANOMALY_VAR') self.blocking_dir = config.getstr('Blocking','BLOCKING_DIR') @@ -31,15 +27,45 @@ def __init__(self,config): self.ibl_dist = config.getint('Blocking','IBL_DIST') self.ibl_in_gibl = config.getint('Blocking','IBL_IN_GIBL') self.gibl_overlap = config.getint('Blocking','GIBL_OVERLAP') - self.block_time = config.getint('Blocking','BLOCK_TIME') #####Probably should fix this so it supports other times" + self.block_time = config.getint('Blocking','BLOCK_TIME') ###Probably should fix this so it supports other times" self.block_travel = config.getint('Blocking','BLOCK_TRAVEL') self.block_method = config.getstr('Blocking','BLOCK_METHOD') + blocking_config = config_metplus.replace_config_from_section(config, 'Blocking') + use_init = is_loop_by_init(blocking_config) + loop_time, end_time, time_interval = get_start_end_interval_times(blocking_config) + skip_times = get_skip_times(blocking_config) + + self.start_mth = loop_time.strftime('%m') + + alldays_list = [] + if use_init: + timname = 'init' + else: + timname = 'valid' + input_dict = {} + input_dict['loop_by'] = timname + while loop_time <= end_time: + lead_seq = get_lead_sequence(config) + for ls in lead_seq: + new_time = loop_time + ls + input_dict[timname] = loop_time + input_dict['lead'] = ls + + outtimestuff = ti_calculate(input_dict) + if not skip_time(outtimestuff, skip_times): + alldays_list.append(outtimestuff['valid']) + + loop_time += time_interval + + self.date_list = alldays_list + # Check data requirements if self.smoothing_pts % 2 == 0: print('ERROR: Smoothing Radius must be an odd number given in grid points, Exiting...') exit() + def read_nc_met(self,indir,invar): infiles = glob.glob(indir+"/*.nc") @@ -60,12 +86,10 @@ def read_nc_met(self,indir,invar): cntr = 1 # Create a list of all the dates I need, so I can fill missing days - sdate_pd = self.start_date[0:4]+'-'+self.start_date[4:6]+'-'+self.start_date[6:8] - edate_pd = self.end_date[0:4]+'-'+self.end_date[4:6]+'-'+self.end_date[6:8] - djf_dates = [dt for dt in pd.date_range(start=sdate_pd, end=edate_pd).to_pydatetime() if dt.month in [1,2,12] and - not (dt.month == 2 and dt.day == 29)] + djf_dates = self.date_list - valid_datetime = datetime.datetime(int(valid_time_str[0:4]),int(valid_time_str[4:6]),int(valid_time_str[6:8])) + valid_datetime = datetime.datetime(int(valid_time_str[0:4]),int(valid_time_str[4:6]),int(valid_time_str[6:8]), + int(valid_time_str[9:11]),int(valid_time_str[11:13]),int(valid_time_str[13:15])) datediff = valid_datetime - djf_dates[0] if valid_datetime > djf_dates[0]: diff = bisect.bisect_left(djf_dates,valid_datetime) @@ -78,7 +102,7 @@ def read_nc_met(self,indir,invar): exit() else: icnt = 1 - + for i in range(1,len(infiles)): #Read in the data @@ -90,7 +114,8 @@ def read_nc_met(self,indir,invar): indata.close() cmth = valid_time_str[4:6] - valid_datetime = datetime.datetime(int(valid_time_str[0:4]),int(valid_time_str[4:6]),int(valid_time_str[6:8])) + valid_datetime = datetime.datetime(int(valid_time_str[0:4]),int(valid_time_str[4:6]), + int(valid_time_str[6:8]),int(valid_time_str[9:11]),int(valid_time_str[11:13]),int(valid_time_str[13:15])) if valid_datetime > djf_dates[icnt]: locvd = bisect.bisect_left(djf_dates,valid_datetime) locc = bisect.bisect_left(djf_dates,djf_dates[icnt]) @@ -199,11 +224,11 @@ def run_mod_blocking1d(self,a,cbl,lat,lon,meth): def run_Calc_IBL(self,cbl): - #z500_daily,lats,lons,yr = self.read_nc_met(self.blocking_dir,self.blocking_var) - z500_daily = np.load('Z500_daily.npy') - lats = np.load('lats2.npy') - lons = np.load('lons2.npy') - yr = np.load('yr2.npy') + z500_daily,lats,lons,yr = self.read_nc_met(self.blocking_dir,self.blocking_var) + #z500_daily = np.load('Z500_daily.npy') + #lats = np.load('lats2.npy') + #lons = np.load('lons2.npy') + #yr = np.load('yr2.npy') #Initilize arrays for IBLs and the blocking index # yr, day, lon @@ -220,7 +245,6 @@ def run_Calc_IBL(self,cbl): return blonlong - #def run_Calc_GIBL(self,ibl,lons,dd,year): def run_Calc_GIBL(self,ibl,lons): #Initilize GIBL Array @@ -290,15 +314,13 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,tsin,year): ##Count up the blocked longitudes for each GIBL c = np.zeros((GIBL.shape)) lonlen = len(lon) - yrlen = len(year) - tslen = len(tsin) sz = [] mx = [] min = [] - for y in np.arange(0,yrlen,1): - for k in np.arange(0,tslen,1): - a = GIBL[y,k] + for y in np.arange(0,len(GIBL[:,0,0]),1): + for k in np.arange(0,len(GIBL[0,:,0]),1): + a = GIBL[y,k] # Array of lons for each year,day ct=1 ai = np.where(a==1)[0] ai = np.append(ai,ai+360) @@ -306,22 +328,19 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,tsin,year): bi=list(ai) bi = np.array(bi) bi[temp] = bi[temp]-360 + # Loop through the lons that are part of the GIBL for i in np.arange(0,len(ai)-1,1): - b = ai[i] - b1 = ai[i+1] - diff = b1-b + diff = ai[i+1] - ai[i] c[y,k,bi[i]] = ct if diff==1: - #c[y,k,bi[i]] = ct ct=ct+1 else: - #c[y,k,bi[i]]=ct sz = np.append(sz,ct) ct=1 ########## - finding where the left and right limits of the block are - ################ - for i in np.arange(0,yrlen,1): - for k in np.arange(0,tslen,1): + for i in np.arange(0,len(c[:,0,0]),1): + for k in np.arange(0,len(c[0,:,0]),1): maxi = argrelextrema(c[i,k],np.greater,mode='wrap')[0] mini = np.where(c[i,k]==1)[0] if c[i,k,lonlen-1]!=0 and c[i,k,0]!=0: @@ -403,9 +422,10 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,tsin,year): midtemp = np.median(temp) middle = np.append(middle,midtemp) - overlap = self.gibl_overlap - #####Track blocks. Makes sure that blocks overlap with at least 10 longitude points on consecutive + #####Track blocks. Makes sure that blocks overlap with at least 10 longitude points on consecutive + overlap = self.gibl_overlap + btime = self.block_time fin = [[]] finloc = [[]] ddcopy=dd*1.0 @@ -418,7 +438,7 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,tsin,year): dyy = np.where(dy==i)[0] rem = [] for dk in ddil: - if len(ddil) < 5: + if len(ddil) < btime: continue ddil = np.append(ddil[0]-1,ddil) diff = np.diff(ddil) From e9d0a198815b93e3fa62056130f7ea680336a7c9 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Tue, 27 Oct 2020 12:44:08 -0600 Subject: [PATCH 20/93] Updated the name of IBL plotting --- .../Regrid_PCP_fcstGFS_fcstOnly_Blocking.conf | 248 ++++++++++++++++++ ush/Blocking_driver.py | 8 +- 2 files changed, 252 insertions(+), 4 deletions(-) create mode 100644 parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_fcstOnly_Blocking.conf diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_fcstOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_fcstOnly_Blocking.conf new file mode 100644 index 0000000000..579b362393 --- /dev/null +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_fcstOnly_Blocking.conf @@ -0,0 +1,248 @@ +# Blocking METplus Configuration +[config] +# time looping - options are INIT, VALID, RETRO, and REALTIME +LOOP_BY = INIT + +# Format of INIT_BEG and INIT_END +INIT_TIME_FMT = %Y%m%d%H + +# Start time for METplus run +INIT_BEG = 2016010100 + +# End time for METplus run +INIT_END = 2016010100 + +# Increment between METplus runs in seconds. Must be >= 60 +INIT_INCREMENT = 21600 + +# list of forecast leads to process +LEAD_SEQ = 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99, 102, 105, 108, 111, 114, 117, 120, 123, 126, 129, 132, 135, 138, 141, 144, 147, 150, 153, 156, 159, 162, 165, 168, 171, 174, 177, 180, 183, 186, 189, 192, 195, 198, 201, 204, 207, 210, 213, 216, 219, 222, 225, 228, 231, 234, 237, 240 + +# Only Process DJF +#SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" + +LOOP_ORDER = processes + +# Obs or Forecast +OBS_RUN = False +FCST_RUN = True + +# List of applications to run +PROCESS_LIST = RegridDataPlane + +# REGRID_DATA_PLANE (Step 1) +# Run regrid_data_plane on forecast data +FCST_REGRID_DATA_PLANE_RUN = {FCST_RUN} + +# If true, process each field individually and write a file for each +# If false, run once per run time passing in all fields specified +FCST_DATA_PLANE_ONCE_PER_FIELD = False + +# Name of input field to process +FCST_REGRID_DATA_PLANE_VAR1_INPUT_FIELD_NAME = HGT + +# Level of input field to process +FCST_REGRID_DATA_PLANE_VAR1_INPUT_LEVEL = P500 + +# Name of output field to create +FCST_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = Z500 + +# Mask to use for regridding +REGRID_DATA_PLANE_VERIF_GRID = latlon 360 90 89 0 -1.0 1.0 + +# Method to run regrid_data_plane, not setting this will default to NEAREST +REGRID_DATA_PLANE_METHOD = BILIN + +# Regridding width used in regrid_data_plane, not setting this will default to 1 +REGRID_DATA_PLANE_WIDTH = 2 + +[dir] +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + +# input and output data directories for each application in PROCESS_LIST +FCST_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/p/ral/jntp/GMTB/Phys_Test_FV3GFSv2/POST/suite1/ +FCST_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/FV3GFS + +[filename_templates] +# format of filenames +# Input ERA Interim +FCST_REGRID_DATA_PLANE_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/gfs.t00z.pgrb2.0p25.f{lead?fmt=%HHH} +FCST_REGRID_DATA_PLANE_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/Z500_3hourly_{valid?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc + + + +[daily_mean] +LOOP_ORDER = processes + +# List of applications to run +PROCESS_LIST = PcpCombine + +# PCP_COMBINE (Step 1) +# run pcp_combine on obs data +OBS_PCP_COMBINE_RUN = {OBS_RUN} +FCST_PCP_COMBINE_RUN = {FCST_RUN} + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, and DERIVE +FCST_PCP_COMBINE_METHOD = DERIVE +FCST_PCP_COMBINE_STAT_LIST = MEAN + +# field name of 1 hr accumulation in forecast files +FCST_PCP_COMBINE_INPUT_ACCUMS = 3 +FCST_PCP_COMBINE_INPUT_NAMES = Z500 +FCST_PCP_COMBINE_INPUT_LEVELS = "(*,*)" +FCST_PCP_COMBINE_INPUT_OPTIONS = convert(x) = x / 9.81; set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S?shift=-64800}"; +FCST_PCP_COMBINE_OUTPUT_NAME = Z500 +FCST_PCP_COMBINE_OUTPUT_ACCUM = 3 +FCST_PCP_COMBINE_DERIVE_LOOKBACK = 3 + +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + +# input and output data directories for each application in PROCESS_LIST +FCST_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/FV3GFS +FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/FV3GFS/converted + +# Input ERA Interim +FCST_PCP_COMBINE_INPUT_TEMPLATE = {init?fmt=%Y%m%d}/Z500_3hourly_{valid?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc +FCST_PCP_COMBINE_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d}/Z500_3hourly_{valid?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc + + + +[running_mean] +# Start time for METplus run +#VALID_BEG = 1979120100 + +# End time for METplus run +#VALID_END = 2017022800 + +# Increment between METplus runs in seconds. Must be >= 60 +#VALID_INCREMENT = 86400 + +# List of applications to run +PROCESS_LIST = PcpCombine + +# PCP_COMBINE (Step 1) +# run pcp_combine on obs data +OBS_PCP_COMBINE_RUN = {OBS_RUN} +FCST_PCP_COMBINE_RUN = {FCST_RUN} + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, and DERIVE +OBS_PCP_COMBINE_METHOD = DERIVE +OBS_PCP_COMBINE_STAT_LIST = MEAN + +# field name of 1 hr accumulation in forecast files +OBS_PCP_COMBINE_INPUT_ACCUMS = 24 +OBS_PCP_COMBINE_INPUT_NAMES = Z500 +OBS_PCP_COMBINE_INPUT_LEVELS = "(*,*)" +OBS_PCP_COMBINE_INPUT_OPTIONS = set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S?shift=-172800}"; +OBS_PCP_COMBINE_OUTPUT_NAME = Z500 +# Running mean is 5 days +OBS_PCP_COMBINE_OUTPUT_ACCUM = 120 +OBS_PCP_COMBINE_DERIVE_LOOKBACK = 120 + +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + +# input and output data directories for each application in PROCESS_LIST +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/daily +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Rmean5d + +# format of filenames +# Input ERA Interim +OBS_PCP_COMBINE_INPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_5daymean_{valid?fmt=%Y%m%d?shift=-172800}_NH.nc + + +[anomaly] +# Increment between METplus runs in seconds. Must be >= 60 +#VALID_INCREMENT = 86400 + +# list of forecast leads to process +#LEAD_SEQ = 0 + +# Options are times, processes +# times = run all items in the PROCESS_LIST for a single initialization +# time, then repeat until all times have been evaluated. +# processes = run each item in the PROCESS_LIST for all times +# specified, then repeat for the next item in the PROCESS_LIST. +LOOP_ORDER = processes + +# List of applications to run +PROCESS_LIST = PcpCombine + +# PCP_COMBINE (Step 1) +# run pcp_combine on obs data +OBS_PCP_COMBINE_RUN = {OBS_RUN} +FCST_PCP_COMBINE_RUN = {FCST_RUN} + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, and DERIVE +FCST_PCP_COMBINE_METHOD = USER_DEFINED + +FCST_PCP_COMBINE_COMMAND = -subtract /glade/scratch/kalb/METplus/model_applications/s2s/FV3GFS/{init?fmt=%Y%m%d%H}/Z500_3hourly_{valid?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc /glade/scratch/kalb/METplus/model_applications/s2s/Rmean5d/Z500_5daymean_{valid?fmt=%Y%m%d}_NH.nc -field 'name="Z500"; level="(*,*)";' + +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + +# input and output data directories for each application in PROCESS_LIST +FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/FV3GFS/Anomaly + +FCST_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_anomaly_{valid?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc + + +[Blocking] +# Directory for the Z500 anomaly data to read in to the blocking python code +BLOCKING_ANOMALY_DIR = {OUTPUT_BASE}/s2s/FV3GFS/Anomaly + +# Variable Name for the Z500 anomaly data to read in to the blocking python code +BLOCKING_ANOMALY_VAR = Z500_P500 + +# Directory for the Z500 data to read in to the blocking python code +BLOCKING_DIR = {OUTPUT_BASE}/s2s/FV3GFS/orig + +# +BLOCKING_VAR = Z500 + +# Number of model grid points used for a moving average +# Must be odd +SMOOTHING_PTS = 9 + +# +LAT_DELTA = -5,0,5 + +# +NORTH_SOUTH_LIMITS = 30 + +# Maximum number of grid points between IBLs for everything in between to be included as an IBL +IBL_DIST = 7 + +# Number of grid points in and IBL to make a GIBL +IBL_IN_GIBL = 15 + +# Overlap across days for a GIBL +GIBL_OVERLAP = 30 + +# Time duration needed for a block +BLOCK_TIME = 15 + +# Number of grid points a block must travel to terminate +BLOCK_TRAVEL = 45 + +# Method to compute blocking. Currently, the only option is 'PH' for the +# Pelly-Hoskins Method +BLOCK_METHOD = PH + +#CBL plot title and name +CBL_PLOT_MTHSTR = DJF +CBL_PLOT_OUTPUT_NAME = CBL_avg + +# IBL plot title and name +IBL_PLOT_TITLE = DJF Instantaneous Blocked Longitude +IBL_PLOT_OUTPUT_NAME = IBL_Freq_GFS + +# Blocking plot title and name +BLOCKING_PLOT_TITLE = DJF Blocking Frequency +BLOCKING_PLOT_OUTPUT_NAME = Block_Freq_GFS diff --git a/ush/Blocking_driver.py b/ush/Blocking_driver.py index 6b4cc3f6e8..ecaee832a5 100644 --- a/ush/Blocking_driver.py +++ b/ush/Blocking_driver.py @@ -15,9 +15,9 @@ def main(): from ush.master_metplus import get_config_inputs_from_command_line from metplus.wrappers import PCPCombineWrapper from metplus.wrappers import RegridDataPlaneWrapper - #import plot_blocking as pb - #from CBL_plot import create_cbl_plot - all_steps = ["REGRID","DAILYAVE","RUNMEAN","ANOMALY","CBL","PLOTCBL","IBL","IBLS","GIBL","CALCBLOCKS","PLOTBLOCKS"] + import plot_blocking as pb + from CBL_plot import create_cbl_plot + all_steps = ["REGRID","DAILYAVE","RUNMEAN","ANOMALY","CBL","PLOTCBL","IBL","PLOTIBL","GIBL","CALCBLOCKS","PLOTBLOCKS"] config_list = get_config_inputs_from_command_line() @@ -90,7 +90,7 @@ def main(): daynum = np.arange(0,len(ibls[0,:,0]),1) # Plot IBLS - if( "IBLS" in steps_list): + if( "PLOTIBL" in steps_list): ibl_plot_title = config.getstr('Blocking','IBL_PLOT_TITLE') ibl_plot_outname = config.getstr('Blocking','IBL_PLOT_OUTPUT_NAME') pb.plot_ibls(ibls,lons,ibl_plot_title,ibl_plot_outname) From 2b7c2a29f678517121164c604529a235c71f470d Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Wed, 25 Nov 2020 19:08:52 -0700 Subject: [PATCH 21/93] New driver with options for syncing 2 datasets --- .../Regrid_PCP_fcstGFS_fcstOnly_Blocking.conf | 25 +- .../Regrid_PCP_fcstGFS_obsERA_Blocking.conf | 426 ++++++++++++++++++ .../Regrid_PCP_obsERA_obsOnly_Blocking.conf | 82 ++-- ush/Blocking.py | 196 +++----- ush/Blocking_driver.py | 273 ++++++++--- 5 files changed, 760 insertions(+), 242 deletions(-) create mode 100644 parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_fcstOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_fcstOnly_Blocking.conf index 579b362393..9422b12024 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_fcstOnly_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_fcstOnly_Blocking.conf @@ -24,7 +24,6 @@ LEAD_SEQ = 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 5 LOOP_ORDER = processes # Obs or Forecast -OBS_RUN = False FCST_RUN = True # List of applications to run @@ -80,7 +79,6 @@ PROCESS_LIST = PcpCombine # PCP_COMBINE (Step 1) # run pcp_combine on obs data -OBS_PCP_COMBINE_RUN = {OBS_RUN} FCST_PCP_COMBINE_RUN = {FCST_RUN} # method to run pcp_combine on forecast data @@ -125,7 +123,6 @@ PROCESS_LIST = PcpCombine # PCP_COMBINE (Step 1) # run pcp_combine on obs data -OBS_PCP_COMBINE_RUN = {OBS_RUN} FCST_PCP_COMBINE_RUN = {FCST_RUN} # method to run pcp_combine on forecast data @@ -195,38 +192,38 @@ FCST_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_anomaly_{valid?fmt=%Y%m%d%H}_{lead?fmt=% [Blocking] # Directory for the Z500 anomaly data to read in to the blocking python code -BLOCKING_ANOMALY_DIR = {OUTPUT_BASE}/s2s/FV3GFS/Anomaly +FCST_BLOCKING_ANOMALY_DIR = {OUTPUT_BASE}/s2s/FV3GFS/Anomaly # Variable Name for the Z500 anomaly data to read in to the blocking python code -BLOCKING_ANOMALY_VAR = Z500_P500 +FCST_BLOCKING_ANOMALY_VAR = Z500_P500 # Directory for the Z500 data to read in to the blocking python code -BLOCKING_DIR = {OUTPUT_BASE}/s2s/FV3GFS/orig +FCST_BLOCKING_DIR = {OUTPUT_BASE}/s2s/FV3GFS/orig # -BLOCKING_VAR = Z500 +FCST_BLOCKING_VAR = Z500 # Number of model grid points used for a moving average # Must be odd -SMOOTHING_PTS = 9 +FCST_SMOOTHING_PTS = 9 # -LAT_DELTA = -5,0,5 +FCST_LAT_DELTA = -5,0,5 # -NORTH_SOUTH_LIMITS = 30 +FCST_NORTH_SOUTH_LIMITS = 30 # Maximum number of grid points between IBLs for everything in between to be included as an IBL -IBL_DIST = 7 +FCST_IBL_DIST = 7 # Number of grid points in and IBL to make a GIBL -IBL_IN_GIBL = 15 +FCST_IBL_IN_GIBL = 15 # Overlap across days for a GIBL -GIBL_OVERLAP = 30 +FCST_GIBL_OVERLAP = 30 # Time duration needed for a block -BLOCK_TIME = 15 +FCST_BLOCK_TIME = 15 # Number of grid points a block must travel to terminate BLOCK_TRAVEL = 45 diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf new file mode 100644 index 0000000000..6363b2c740 --- /dev/null +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf @@ -0,0 +1,426 @@ +# Blocking METplus Configuration +[config] +# Obs or Forecast +FCST_STEPS = IBL+PLOTIBL +OBS_STEPS = CBL+IBL+PLOTIBL + + +[regrid_fcst] +# time looping - options are INIT, VALID, RETRO, and REALTIME +LOOP_BY = INIT + +# Format of INIT_BEG and INIT_END +INIT_TIME_FMT = %Y%m%d%H + +# Start time for METplus run +INIT_BEG = 2016010100 + +# End time for METplus run +INIT_END = 2018010100 + +# Increment between METplus runs in seconds. Must be >= 60 +INIT_INCREMENT = 86400 + +# list of forecast leads to process +LEAD_SEQ = 0, 3, 6, 9, 12, 15, 18, 21, 24 + +# Only Process DJF +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" + +LOOP_ORDER = processes + +# List of applications to run +PROCESS_LIST = RegridDataPlane + +# REGRID_DATA_PLANE (Step 1) +# Run regrid_data_plane on forecast data +FCST_REGRID_DATA_PLANE_RUN = True + +# If true, process each field individually and write a file for each +# If false, run once per run time passing in all fields specified +FCST_DATA_PLANE_ONCE_PER_FIELD = False + +# Name of input field to process +FCST_REGRID_DATA_PLANE_VAR1_INPUT_FIELD_NAME = HGT + +# Level of input field to process +FCST_REGRID_DATA_PLANE_VAR1_INPUT_LEVEL = P500 + +# Name of output field to create +FCST_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = Z500 + +# Mask to use for regridding +REGRID_DATA_PLANE_VERIF_GRID = latlon 360 90 89 0 -1.0 1.0 + +# Method to run regrid_data_plane, not setting this will default to NEAREST +REGRID_DATA_PLANE_METHOD = BILIN + +# Regridding width used in regrid_data_plane, not setting this will default to 1 +REGRID_DATA_PLANE_WIDTH = 2 + +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + +# input and output data directories for each application in PROCESS_LIST +FCST_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/p/ral/jntp/GMTB/Phys_Test_FV3GFSv2/POST/suite1/ +FCST_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/FV3GFS + +# format of filenames +# Input ERA Interim +FCST_REGRID_DATA_PLANE_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/gfs.t00z.pgrb2.0p25.f{lead?fmt=%HHH} +FCST_REGRID_DATA_PLANE_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc + + +[regrid_obs] +# time looping - options are INIT, VALID, RETRO, and REALTIME +LOOP_BY = VALID + +# Format of INIT_BEG and INIT_END +VALID_TIME_FMT = %Y%m%d%H + +# Start time for METplus run +VALID_BEG = 1979120100 + +# End time for METplus run +VALID_END = 2017022818 + +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 21600 + +# list of forecast leads to process +LEAD_SEQ = 0 + +# Only Process DJF +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" + +LOOP_ORDER = processes + +# List of applications to run +PROCESS_LIST = RegridDataPlane + +# REGRID_DATA_PLANE (Step 1) +# Run regrid_data_plane on forecast data +OBS_REGRID_DATA_PLANE_RUN = True + +# If true, process each field individually and write a file for each +# If false, run once per run time passing in all fields specified +OBS_DATA_PLANE_ONCE_PER_FIELD = False + +# Name of input field to process +OBS_REGRID_DATA_PLANE_VAR1_INPUT_FIELD_NAME = Z + +# Level of input field to process +OBS_REGRID_DATA_PLANE_VAR1_INPUT_LEVEL = P500 + +# Name of output field to create +OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = Z500 + +# Mask to use for regridding +#REGRID_DATA_PLANE_VERIF_GRID = {MASK_DIR}/NH_block_grid.nc +REGRID_DATA_PLANE_VERIF_GRID = latlon 360 90 89 0 -1.0 1.0 + +# Method to run regrid_data_plane, not setting this will default to NEAREST +REGRID_DATA_PLANE_METHOD = BILIN + +# Regridding width used in regrid_data_plane, not setting this will default to 1 +REGRID_DATA_PLANE_WIDTH = 2 + +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + +# input and output data directories for each application in PROCESS_LIST +OBS_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds627.0/ei.oper.an.pl +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s + +# format of filenames +# Input ERA Interim +OBS_REGRID_DATA_PLANE_INPUT_TEMPLATE = {valid?fmt=%Y%m}/ei.oper.an.pl.regn128sc.{valid?fmt=%Y%m%d%H} +OBS_REGRID_DATA_PLANE_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{init?fmt=%Y%m%d%H}_NH.nc + + +[daily_mean_fcst] +LOOP_BY = INIT + +# Format of INIT_BEG and INIT_END +INIT_TIME_FMT = %Y%m%d%H + +# Start time for METplus run +INIT_BEG = 2016010100 + +# End time for METplus run +INIT_END = 2018010100 + +# Increment between METplus runs in seconds. Must be >= 60 +INIT_INCREMENT = 86400 + +# list of forecast leads to process +LEAD_SEQ = 0 + +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" + +LOOP_ORDER = processes + +# List of applications to run +PROCESS_LIST = PcpCombine + +# PCP_COMBINE (Step 1) +# run pcp_combine on obs data +FCST_PCP_COMBINE_RUN = True + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, and DERIVE +FCST_PCP_COMBINE_METHOD = USER_DEFINED + +FCST_PCP_COMBINE_COMMAND = -derive MEAN {FCST_PCP_COMBINE_INPUT_DIR}/s2s/FV3GFS/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=75600}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/s2s/FV3GFS/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=64800}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/s2s/FV3GFS/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=54000}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/s2s/FV3GFS/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=43200}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/s2s/FV3GFS/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=32400}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/s2s/FV3GFS/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=21600}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/s2s/FV3GFS/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=10800}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/s2s/FV3GFS/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc -field 'name="Z500"; level="(*,*)"; convert(x) = x / 9.81; set_attr_valid = "{init?fmt=%Y%m%d_%H%M%S}";' + +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + +# input and output data directories for each application in PROCESS_LIST +FCST_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE} +FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/FV3GFS/daily + +# Input ERA Interim +FCST_PCP_COMBINE_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc +FCST_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_daily_{init?fmt=%Y%m%d}_NH.nc + + +[daily_mean_obs] +LOOP_BY = VALID + +# Format of INIT_BEG and INIT_END +VALID_TIME_FMT = %Y%m%d%H + +# Start time for METplus run +VALID_BEG = 1979120118 + +# End time for METplus run +VALID_END = 2017022818 + +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 86400 + +LOOP_ORDER = processes + +# List of applications to run +PROCESS_LIST = PcpCombine + +# PCP_COMBINE (Step 1) +# run pcp_combine on obs data +OBS_PCP_COMBINE_RUN = True + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, and DERIVE +OBS_PCP_COMBINE_METHOD = DERIVE +OBS_PCP_COMBINE_STAT_LIST = MEAN + +# field name of 1 hr accumulation in forecast files +OBS_PCP_COMBINE_INPUT_ACCUMS = 6 +OBS_PCP_COMBINE_INPUT_NAMES = Z500 +OBS_PCP_COMBINE_INPUT_LEVELS = "(*,*)" +OBS_PCP_COMBINE_INPUT_OPTIONS = convert(x) = x / 9.81; set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S?shift=-64800}"; +OBS_PCP_COMBINE_OUTPUT_NAME = Z500 +OBS_PCP_COMBINE_OUTPUT_ACCUM = 24 +OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 + +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + +# input and output data directories for each application in PROCESS_LIST +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/daily + +# Input ERA Interim +OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc +OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d?shift=-64800}_NH.nc + + +[running_mean_obs] +LOOP_BY = VALID + +# Format of INIT_BEG and INIT_END +VALID_TIME_FMT = %Y%m%d%H + +# Start time for METplus run +VALID_BEG = 1979120100 + +# End time for METplus run +VALID_END = 2017022800 + +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 86400 + +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:1201,1202,0227,0228,0229" + +# List of applications to run +PROCESS_LIST = PcpCombine + +# PCP_COMBINE (Step 1) +# run pcp_combine on obs data +OBS_PCP_COMBINE_RUN = TRUE + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, and DERIVE +OBS_PCP_COMBINE_METHOD = DERIVE +OBS_PCP_COMBINE_STAT_LIST = MEAN + +# field name of 1 hr accumulation in forecast files +OBS_PCP_COMBINE_INPUT_ACCUMS = 24 +OBS_PCP_COMBINE_INPUT_NAMES = Z500 +OBS_PCP_COMBINE_INPUT_LEVELS = "(*,*)" +OBS_PCP_COMBINE_INPUT_OPTIONS = set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S?shift=-172800}"; +OBS_PCP_COMBINE_OUTPUT_NAME = Z500 +# Running mean is 5 days +OBS_PCP_COMBINE_OUTPUT_ACCUM = 120 +OBS_PCP_COMBINE_DERIVE_LOOKBACK = 120 + +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + +# input and output data directories for each application in PROCESS_LIST +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/daily +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Rmean5d + +# format of filenames +# Input ERA Interim +OBS_PCP_COMBINE_INPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_5daymean_{valid?fmt=%Y%m%d?shift=-172800}_NH.nc + + +[anomaly_obs] +LOOP_BY = VALID + +# Format of INIT_BEG and INIT_END +VALID_TIME_FMT = %Y%m%d%H + +# Start time for METplus run +VALID_BEG = 1979120100 + +# End time for METplus run +VALID_END = 2017022800 + +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 86400 + +# list of forecast leads to process +LEAD_SEQ = 0 + +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:1201,1202,0227,0228,0229" + +# Options are times, processes +# times = run all items in the PROCESS_LIST for a single initialization +# time, then repeat until all times have been evaluated. +# processes = run each item in the PROCESS_LIST for all times +# specified, then repeat for the next item in the PROCESS_LIST. +LOOP_ORDER = processes + +# List of applications to run +PROCESS_LIST = PcpCombine + +# PCP_COMBINE (Step 1) +# run pcp_combine on obs data +OBS_PCP_COMBINE_RUN = True + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, and DERIVE +OBS_PCP_COMBINE_METHOD = USER_DEFINED + +OBS_PCP_COMBINE_COMMAND = -subtract {OBS_PCP_COMBINE_INPUT_DIR}/daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc {OBS_PCP_COMBINE_INPUT_DIR}/Rmean5d/Z500_5daymean_{valid?fmt=%Y%m%d}_NH.nc -field 'name="Z500"; level="(*,*)";' + +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + +# input and output data directories for each application in PROCESS_LIST +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Anomaly + +OBS_PCP_COMBINE_INPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc + + +[Blocking] +LOOP_BY = VALID + +VALID_TIME_FMT = %Y%m%d%H + +CBL_VALID_BEG = 1979120100 +CBL_VALID_END = 2017022800 + +VALID_BEG = 2016010100 + +VALID_END = 2018010100 + +VALID_INCREMENT = 86400 + +# list of forecast leads to process +LEAD_SEQ = 0 + +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:1201,1202,0227,0228,0229" + +USE_CBL_OBS = True + +# Number of model grid points used for a moving average +# Must be odd +FCST_SMOOTHING_PTS = 9 +OBS_SMOOTHING_PTS = {FCST_SMOOTHING_PTS} + +# Lat Delta +FCST_LAT_DELTA = -5,0,5 +OBS_LAT_DELTA = {FCST_LAT_DELTA} + +# +FCST_NORTH_SOUTH_LIMITS = 30 +OBS_NORTH_SOUTH_LIMITS = {FCST_NORTH_SOUTH_LIMITS} + +# Maximum number of grid points between IBLs for everything in between to be included as an IBL +FCST_IBL_DIST = 7 +OBS_IBL_DIST = {FCST_IBL_DIST} + +# Number of grid points in and IBL to make a GIBL +FCST_IBL_IN_GIBL = 15 +OBS_IBL_IN_GIBL = {FCST_IBL_IN_GIBL} + +# Overlap across days for a GIBL +FCST_GIBL_OVERLAP = 10 +OBS_GIBL_OVERLAP = {FCST_GIBL_OVERLAP} + +# Time duration needed for a block +FCST_BLOCK_TIME = 5 +OBS_BLOCK_TIME = {FCST_BLOCK_TIME} + +# Number of grid points a block must travel to terminate +FCST_BLOCK_TRAVEL = 45 +OBS_BLOCK_TRAVEL = {FCST_BLOCK_TRAVEL} + +# Method to compute blocking. Currently, the only option is 'PH' for the +# Pelly-Hoskins Method +FCST_BLOCK_METHOD = PH +OBS_BLOCK_METHOD = {FCST_BLOCK_METHOD} + +# Directory for the Z500 anomaly data to read in to the blocking python code +FCST_BLOCKING_ANOMALY_DIR = {OUTPUT_BASE}/s2s/FV3GFS/Anomaly +OBS_BLOCKING_ANOMALY_DIR = {OUTPUT_BASE}/s2s/Anomaly + +# Variable Name for the Z500 anomaly data to read in to the blocking python code +FCST_BLOCKING_ANOMALY_VAR = Z500_P500 +OBS_BLOCKING_ANOMALY_VAR = Z500_ANA + +# Directory for the Z500 data to read in to the blocking python code +FCST_BLOCKING_DIR = {OUTPUT_BASE}/s2s/FV3GFS/orig +OBS_BLOCKING_DIR = {OUTPUT_BASE}/s2s/daily + +# Variable for the Z500 data +FCST_BLOCKING_VAR = Z500 +OBS_BLOCKING_VAR = Z500 + +# Plot titles +#CBL plot title and name +OBS_CBL_PLOT_MTHSTR = DJF +OBS_CBL_PLOT_OUTPUT_NAME = ERA_CBL_avg + +# IBL plot title and name +IBL_PLOT_TITLE = DJF Instantaneous Blocked Longitude +IBL_PLOT_OUTPUT_NAME = IBL_Freq_DJF + +IBL_PLOT_OBS_LABEL = ERA Reanalysis +IBL_PLOT_FCST_LABEL = GEFS diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf index 476771c2c7..366db4eba1 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf @@ -1,5 +1,8 @@ # Blocking METplus Configuration [config] +# Steps to Run +OBS_STEPS = CBL+PLOTCBL+IBL+PLOTIBL + # time looping - options are INIT, VALID, RETRO, and REALTIME LOOP_BY = VALID @@ -12,9 +15,6 @@ VALID_BEG = 1979120100 # End time for METplus run VALID_END = 2017022818 -# Increment between METplus runs in seconds. Must be >= 60 -VALID_INCREMENT = 21600 - # list of forecast leads to process LEAD_SEQ = 0 @@ -23,16 +23,20 @@ SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" LOOP_ORDER = processes -# Obs or Forecast OBS_RUN = True -FCST_RUN = False + + + +[regrid_obs] +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 21600 # List of applications to run PROCESS_LIST = RegridDataPlane # REGRID_DATA_PLANE (Step 1) # Run regrid_data_plane on forecast data -OBS_REGRID_DATA_PLANE_RUN = True +OBS_REGRID_DATA_PLANE_RUN = {OBS_RUN} # If true, process each field individually and write a file for each # If false, run once per run time passing in all fields specified @@ -73,7 +77,7 @@ OBS_REGRID_DATA_PLANE_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{init?fm -[daily_mean] +[daily_mean_obs] # Start time for METplus run VALID_BEG = 1979120118 @@ -91,7 +95,6 @@ PROCESS_LIST = PcpCombine # PCP_COMBINE (Step 1) # run pcp_combine on obs data OBS_PCP_COMBINE_RUN = {OBS_RUN} -FCST_PCP_COMBINE_RUN = {FCST_RUN} # method to run pcp_combine on forecast data # Options are ADD, SUM, SUBTRACT, and DERIVE @@ -120,7 +123,7 @@ OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d?shift=-64800}_NH. -[running_mean] +[running_mean_obs] # Start time for METplus run VALID_BEG = 1979120100 @@ -141,7 +144,6 @@ PROCESS_LIST = PcpCombine # PCP_COMBINE (Step 1) # run pcp_combine on obs data OBS_PCP_COMBINE_RUN = {OBS_RUN} -FCST_PCP_COMBINE_RUN = {FCST_RUN} # method to run pcp_combine on forecast data # Options are ADD, SUM, SUBTRACT, and DERIVE @@ -171,14 +173,12 @@ OBS_PCP_COMBINE_INPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d}_NH.nc OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_5daymean_{valid?fmt=%Y%m%d?shift=-172800}_NH.nc -[anomaly] + +[anomaly_obs] # Increment between METplus runs in seconds. Must be >= 60 VALID_INCREMENT = 86400 -# list of forecast leads to process -LEAD_SEQ = 0 - -SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:1201,1202,1203,1204,0229" +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:1201,1202,0227,0228,0229" # Options are times, processes # times = run all items in the PROCESS_LIST for a single initialization @@ -193,7 +193,6 @@ PROCESS_LIST = PcpCombine # PCP_COMBINE (Step 1) # run pcp_combine on obs data OBS_PCP_COMBINE_RUN = {OBS_RUN} -FCST_PCP_COMBINE_RUN = {FCST_RUN} # method to run pcp_combine on forecast data # Options are ADD, SUM, SUBTRACT, and DERIVE @@ -212,56 +211,59 @@ OBS_PCP_COMBINE_INPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d}_NH.nc OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc + [Blocking] +VALID_INCREMENT = 86400 + # Directory for the Z500 anomaly data to read in to the blocking python code -BLOCKING_ANOMALY_DIR = {OUTPUT_BASE}/s2s/Anomaly +OBS_BLOCKING_ANOMALY_TEMPLATE = {OUTPUT_BASE}/s2s/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc # Variable Name for the Z500 anomaly data to read in to the blocking python code -BLOCKING_ANOMALY_VAR = Z500_ANA +OBS_BLOCKING_ANOMALY_VAR = Z500_ANA # Directory for the Z500 data to read in to the blocking python code -BLOCKING_DIR = {OUTPUT_BASE}/s2s/daily +OBS_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc -# -BLOCKING_VAR = Z500 +# Variable for the Z500 data +OBS_BLOCKING_VAR = Z500 # Number of model grid points used for a moving average # Must be odd -SMOOTHING_PTS = 9 +OBS_SMOOTHING_PTS = 9 -# -LAT_DELTA = -5,0,5 +# Lat Delta +OBS_LAT_DELTA = -5,0,5 -# -NORTH_SOUTH_LIMITS = 30 +# Number of grid points for the North-South limits of the block +OBS_NORTH_SOUTH_LIMITS = 30 # Maximum number of grid points between IBLs for everything in between to be included as an IBL -IBL_DIST = 7 +OBS_IBL_DIST = 7 # Number of grid points in and IBL to make a GIBL -IBL_IN_GIBL = 15 +OBS_IBL_IN_GIBL = 15 -# Overlap across days for a GIBL -GIBL_OVERLAP = 10 +# Overlap across the model timestep for a GIBL +OBS_GIBL_OVERLAP = 10 -# Time duration needed for a block -BLOCK_TIME = 5 +# Time duration needed for a block in the model timestep +OBS_BLOCK_TIME = 5 # Number of grid points a block must travel to terminate -BLOCK_TRAVEL = 45 +OBS_BLOCK_TRAVEL = 45 # Method to compute blocking. Currently, the only option is 'PH' for the # Pelly-Hoskins Method -BLOCK_METHOD = PH +OBS_BLOCK_METHOD = PH #CBL plot title and name -CBL_PLOT_MTHSTR = DJF -CBL_PLOT_OUTPUT_NAME = CBL_avg +OBS_CBL_PLOT_MTHSTR = DJF +OBS_CBL_PLOT_OUTPUT_NAME = ERA_CBL_avg # IBL plot title and name -IBL_PLOT_TITLE = DJF Instantaneous Blocked Longitude -IBL_PLOT_OUTPUT_NAME = IBL_Freq_DJF +OBS_IBL_PLOT_TITLE = DJF ERA Instantaneous Blocked Longitude +OBS_IBL_PLOT_OUTPUT_NAME = ERA_IBL_Freq_DJF # Blocking plot title and name -BLOCKING_PLOT_TITLE = DJF Blocking Frequency -BLOCKING_PLOT_OUTPUT_NAME = Block_Freq_DJF +OBS_BLOCKING_PLOT_TITLE = DJF ERA Blocking Frequency +OBS_BLOCKING_PLOT_OUTPUT_NAME = ERA_Block_Freq_DJF diff --git a/ush/Blocking.py b/ush/Blocking.py index 7ed33ebd10..73b34cf76d 100644 --- a/ush/Blocking.py +++ b/ush/Blocking.py @@ -1,5 +1,5 @@ import os -import glob +#import glob import numpy as np import netCDF4 import pandas as pd @@ -7,58 +7,50 @@ import bisect from scipy import stats from scipy.signal import argrelextrema +from metplus.util import config_metplus, get_start_end_interval_times, get_lead_sequence +from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate class BlockingCalculation(): """Contains the programs to calculate Blocking via the Pelly-Hoskins Method """ - def __init__(self,config): + def __init__(self,config,label): - from metplus.util import config_metplus, get_start_end_interval_times, get_lead_sequence - from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate - - self.blocking_anomaly_dir = config.getstr('Blocking','BLOCKING_ANOMALY_DIR') - self.blocking_anomaly_var = config.getstr('Blocking','BLOCKING_ANOMALY_VAR') - self.blocking_dir = config.getstr('Blocking','BLOCKING_DIR') - self.blocking_var = config.getstr('Blocking','BLOCKING_VAR') - self.smoothing_pts = config.getint('Blocking','SMOOTHING_PTS') - lat_delta_in = config.getstr('Blocking','LAT_DELTA') + self.blocking_anomaly_var = config.getstr('Blocking',label+'_BLOCKING_ANOMALY_VAR','') + self.blocking_var = config.getstr('Blocking',label+'_BLOCKING_VAR','') + self.smoothing_pts = config.getint('Blocking',label+'_SMOOTHING_PTS',9) + lat_delta_in = config.getstr('Blocking',label+'_LAT_DELTA','-5,0,5') self.lat_delta = list(map(int,lat_delta_in.split(","))) - self.n_s_limits = config.getint('Blocking','NORTH_SOUTH_LIMITS') - self.ibl_dist = config.getint('Blocking','IBL_DIST') - self.ibl_in_gibl = config.getint('Blocking','IBL_IN_GIBL') - self.gibl_overlap = config.getint('Blocking','GIBL_OVERLAP') - self.block_time = config.getint('Blocking','BLOCK_TIME') ###Probably should fix this so it supports other times" - self.block_travel = config.getint('Blocking','BLOCK_TRAVEL') - self.block_method = config.getstr('Blocking','BLOCK_METHOD') - - blocking_config = config_metplus.replace_config_from_section(config, 'Blocking') - use_init = is_loop_by_init(blocking_config) - loop_time, end_time, time_interval = get_start_end_interval_times(blocking_config) - skip_times = get_skip_times(blocking_config) - - self.start_mth = loop_time.strftime('%m') - - alldays_list = [] - if use_init: - timname = 'init' - else: - timname = 'valid' - input_dict = {} - input_dict['loop_by'] = timname - while loop_time <= end_time: - lead_seq = get_lead_sequence(config) - for ls in lead_seq: - new_time = loop_time + ls - input_dict[timname] = loop_time - input_dict['lead'] = ls - - outtimestuff = ti_calculate(input_dict) - if not skip_time(outtimestuff, skip_times): - alldays_list.append(outtimestuff['valid']) - - loop_time += time_interval - - self.date_list = alldays_list + self.n_s_limits = config.getint('Blocking',label+'_NORTH_SOUTH_LIMITS',30) + self.ibl_dist = config.getint('Blocking',label+'_IBL_DIST',7) + self.ibl_in_gibl = config.getint('Blocking',label+'_IBL_IN_GIBL',15) + self.gibl_overlap = config.getint('Blocking',label+'_GIBL_OVERLAP',10) + self.block_time = config.getint('Blocking',label+'_BLOCK_TIME',5) ###Should fix so it supports other times" + self.block_travel = config.getint('Blocking',label+'_BLOCK_TRAVEL',45) + self.block_method = config.getstr('Blocking',label+'_BLOCK_METHOD','PH') + + # Get a date list for the data + #blocking_config = config_metplus.replace_config_from_section(config, 'Blocking') + #use_init = is_loop_by_init(blocking_config) + + #self.date_list, self.ymd_list, self.start_mth = self.get_date_list(blocking_config,use_init) + + # Check to see if a separate CBL start/end date is present + #cbl_config_init = config.find_section('Blocking','CBL_INIT_BEG') + #cbl_config_valid = config.find_section('Blocking','CBL_VALID_BEG') + #if use_init and (cbl_config_init is not None): + # config.set('Blocking','INIT_BEG',config.getstr('Blocking','CBL_INIT_BEG')) + # config.set('Blocking','INIT_END',config.getstr('Blocking','CBL_INIT_END')) + # blocking_config = config_metplus.replace_config_from_section(config, 'Blocking') + # self.cbl_date_list, self.cbl_ymd_list, self.cbl_start_mth = self.get_date_list(blocking_config,use_init) + #elif cbl_config_valid is not None: + # config.set('Blocking','VALID_BEG',config.getstr('Blocking','CBL_VALID_BEG')) + # config.set('Blocking','VALID_END',config.getstr('Blocking','CBL_VALID_END')) + # blocking_config = config_metplus.replace_config_from_section(config, 'Blocking') + # self.cbl_date_list, self.cbl_ymd_list, self.cbl_start_mth = self.get_date_list(blocking_config,use_init) + #else: + # self.cbl_date_list = self.date_list + # self.cbl_ymd_list = self.ymd_list + # self.cbl_start_mth = self.start_mth # Check data requirements if self.smoothing_pts % 2 == 0: @@ -66,84 +58,35 @@ def __init__(self,config): exit() - def read_nc_met(self,indir,invar): - - infiles = glob.glob(indir+"/*.nc") - infiles.sort() + def read_nc_met(self,infiles,yrlist,invar): print("Reading in Data") - indata = netCDF4.Dataset(infiles[0]) + + #Find the first non empty file name so I can get the variable sizes + locin = next(sub for sub in infiles if sub) + indata = netCDF4.Dataset(locin) lats = indata.variables['lat'][:] lons = indata.variables['lon'][:] - var_3d = indata.variables[invar][:] - var_3d = np.expand_dims(var_3d,axis=0) - init_time_str = indata.variables[invar].getncattr('init_time') - valid_time_str = indata.variables[invar].getncattr('valid_time') + invar_arr = indata.variables[invar][:] indata.close() - yrlist = [] - pmth = valid_time_str[4:6] - loclist = [0] - cntr = 1 - - # Create a list of all the dates I need, so I can fill missing days - djf_dates = self.date_list - - valid_datetime = datetime.datetime(int(valid_time_str[0:4]),int(valid_time_str[4:6]),int(valid_time_str[6:8]), - int(valid_time_str[9:11]),int(valid_time_str[11:13]),int(valid_time_str[13:15])) - datediff = valid_datetime - djf_dates[0] - if valid_datetime > djf_dates[0]: - diff = bisect.bisect_left(djf_dates,valid_datetime) - filldata = np.empty((diff,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) - filldata[:] = np.nan - var_3d = np.append(filldata,var_3d,axis=0) - icnt = diff + 1 - elif valid_datetime < djf_dates[0]: - print('Extra data present, not set up to handle this. Exiting...') - exit() - else: - icnt = 1 - for i in range(1,len(infiles)): + var_3d = np.empty([len(infiles),len(invar_arr[:,0]),len(invar_arr[0,:])]) + + for i in range(0,len(infiles)): #Read in the data - indata = netCDF4.Dataset(infiles[i]) - new_invar = indata.variables[invar][:] - new_invar = np.expand_dims(new_invar,axis=0) - init_time_str = indata.variables[invar].getncattr('init_time') - valid_time_str = indata.variables[invar].getncattr('valid_time') - indata.close() - cmth = valid_time_str[4:6] - - valid_datetime = datetime.datetime(int(valid_time_str[0:4]),int(valid_time_str[4:6]), - int(valid_time_str[6:8]),int(valid_time_str[9:11]),int(valid_time_str[11:13]),int(valid_time_str[13:15])) - if valid_datetime > djf_dates[icnt]: - locvd = bisect.bisect_left(djf_dates,valid_datetime) - locc = bisect.bisect_left(djf_dates,djf_dates[icnt]) - diff = bisect.bisect_left(djf_dates,valid_datetime) - bisect.bisect_left(djf_dates,djf_dates[icnt]) - filldata = np.empty((diff,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) - filldata[:] = np.nan - var_3d = np.append(var_3d,filldata,axis=0) - icnt+=diff - elif valid_datetime < djf_dates[i]: - print('Extra data present, not set up to handle this. Exiting...') - exit() - var_3d = np.append(var_3d,new_invar,axis=0) - - if (int(cmth) == int(self.start_mth)) and (int(pmth) != int(self.start_mth)): - yrlist.append(int(valid_time_str[0:4])) - loclist.append(cntr) - - pmth = cmth - cntr+=1 - icnt+=1 - - if len(djf_dates) > len(var_3d[:,0,0]): - diff = len(djf_dates) - len(var_3d[:,0,0]) - filldata = np.empty((diff,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) - filldata[:] = np.nan - var_3d = np.append(var_3d,filldata,axis=0) - - yrlist.append(int(valid_time_str[0:4])) + if infiles[i]: + indata = netCDF4.Dataset(infiles[i]) + new_invar = indata.variables[invar][:] + #new_invar = np.expand_dims(new_invar,axis=0) + init_time_str = indata.variables[invar].getncattr('init_time') + valid_time_str = indata.variables[invar].getncattr('valid_time') + indata.close() + else: + new_invar = np.empty((1,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) + new_invar[:] = np.nan + var_3d[i,:,:] = new_invar + yr = np.array(yrlist) sdim = len(var_3d[:,0,0])/float(len(yrlist)) var_4d = np.reshape(var_3d,[len(yrlist),int(sdim),len(var_3d[0,:,0]),len(var_3d[0,0,:])]) @@ -151,13 +94,9 @@ def read_nc_met(self,indir,invar): return var_4d,lats,lons,yr - def run_CBL(self): + def run_CBL(self,cblinfiles,cblyrs): - #z500_anom_4d,lats,lons,yr = self.read_nc_met(self.blocking_anomaly_dir,self.blocking_anomaly_var) - z500_anom_4d = np.load('Z500_anom.npy') - lats = np.load('lats1.npy') - lons = np.load('lons1.npy') - yr = np.load('yr1.npy') + z500_anom_4d,lats,lons,yr = self.read_nc_met(cblinfiles,cblyrs,self.blocking_anomaly_var) #Create Latitude Weight based for NH cos = lats @@ -188,7 +127,6 @@ def run_CBL(self): def run_mod_blocking1d(self,a,cbl,lat,lon,meth): lat_d = self.lat_delta - #blon = 0 dc = (90 - cbl).astype(int) db = self.n_s_limits BI = np.zeros((len(a[:,0,0]),len(lon))) @@ -197,7 +135,6 @@ def run_mod_blocking1d(self,a,cbl,lat,lon,meth): # loop through days for k in np.arange(0,len(a[:,0,0]),1): blontemp=0 - #bitemp=0 q=0 BI1=np.zeros((len(lat_d),len(lon))) for l in lat_d: @@ -222,13 +159,9 @@ def run_mod_blocking1d(self,a,cbl,lat,lon,meth): return blon,BI - def run_Calc_IBL(self,cbl): + def run_Calc_IBL(self,cbl,iblinfiles,iblyr): - z500_daily,lats,lons,yr = self.read_nc_met(self.blocking_dir,self.blocking_var) - #z500_daily = np.load('Z500_daily.npy') - #lats = np.load('lats2.npy') - #lons = np.load('lons2.npy') - #yr = np.load('yr2.npy') + z500_daily,lats,lons,yr = self.read_nc_met(iblinfiles,iblyr,self.blocking_var) #Initilize arrays for IBLs and the blocking index # yr, day, lon @@ -241,7 +174,6 @@ def run_Calc_IBL(self,cbl): blon,BI[i,:,:] = self.run_mod_blocking1d(z500_daily[i,:,:,:],cbl,lats,lons,self.block_method) blonlong[i,:,:] = blon - #np.save('Nstart_IBL.npy',blonlong) return blonlong diff --git a/ush/Blocking_driver.py b/ush/Blocking_driver.py index ecaee832a5..25abaf67ea 100644 --- a/ush/Blocking_driver.py +++ b/ush/Blocking_driver.py @@ -2,66 +2,148 @@ import os import numpy as np import netCDF4 +import re + +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), + os.pardir))) +sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy/metplotpy/blocking_s2s") +sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy_feature_33/metplotpy/blocking_s2s") from Blocking import BlockingCalculation +from metplus.util import config_metplus, get_start_end_interval_times, get_lead_sequence +from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub +from ush.master_metplus import get_config_inputs_from_command_line +from metplus.wrappers import PCPCombineWrapper +from metplus.wrappers import RegridDataPlaneWrapper +import plot_blocking as pb +from CBL_plot import create_cbl_plot + +def find_input_files(inconfig, use_init, intemplate): + loop_time, end_time, time_interval = get_start_end_interval_times(inconfig) + skip_times = get_skip_times(inconfig) + + start_mth = loop_time.strftime('%m') + template = inconfig.getraw('config',intemplate) + + file_list = [] + yr_list = [] + if use_init: + timname = 'init' + else: + timname = 'valid' + input_dict = {} + input_dict['loop_by'] = timname + pmth = start_mth + while loop_time <= end_time: + lead_seq = get_lead_sequence(inconfig) + for ls in lead_seq: + new_time = loop_time + ls + input_dict[timname] = loop_time + input_dict['lead'] = ls + + outtimestuff = ti_calculate(input_dict) + cmth = outtimestuff['valid'].strftime('%m') + filepath = do_string_sub(template, **outtimestuff) + if skip_time(outtimestuff, skip_times): + continue + if os.path.exists(filepath): + file_list.append(filepath) + else: + file_list.append('') + + if (int(cmth) == int(start_mth)) and (int(pmth) != int(start_mth)): + yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) + pmth = cmth + + loop_time += time_interval + + yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) + + return file_list, yr_list + def main(): - # add metplus directory to path so the wrappers and utilities can be found - sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), - os.pardir))) - sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy/metplotpy/blocking_s2s") - sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy_feature_33/metplotpy/blocking_s2s") - from metplus.util import config_metplus - from ush.master_metplus import get_config_inputs_from_command_line - from metplus.wrappers import PCPCombineWrapper - from metplus.wrappers import RegridDataPlaneWrapper - import plot_blocking as pb - from CBL_plot import create_cbl_plot - all_steps = ["REGRID","DAILYAVE","RUNMEAN","ANOMALY","CBL","PLOTCBL","IBL","PLOTIBL","GIBL","CALCBLOCKS","PLOTBLOCKS"] + all_steps = ["REGRID","TIMEAVE","RUNMEAN","ANOMALY","CBL","PLOTCBL","IBL","PLOTIBL","GIBL","CALCBLOCKS","PLOTBLOCKS"] config_list = get_config_inputs_from_command_line() + # If the user has defined the steps they want to run # grab the command line parameter - steps_config_part = [s for s in config_list if "STEPS" in s] - steps_list = [] + steps_config_part_fcst = [s for s in config_list if "FCST_STEPS" in s] + steps_list_fcst = [] + + steps_config_part_obs = [s for s in config_list if "OBS_STEPS" in s] + steps_list_obs = [] + + # Setup the Steps + if steps_config_part_fcst: + steps_param_fcst = steps_config_part_fcst[0].split("=")[1] + steps_list_fcst = steps_param_fcst.split("+") + config_list.remove(steps_config_part_fcst[0]) + if steps_config_part_obs: + steps_param_obs = steps_config_part_obs[0].split("=")[1] + steps_list_obs = steps_param_obs.split("+") + config_list.remove(steps_config_part_obs[0]) + + config = config_metplus.setup(config_list) + if not steps_config_part_fcst: + steps_param_fcst = config.getstr('config','FCST_STEPS','') + steps_list_fcst = steps_param_fcst.split("+") + if not steps_config_part_obs: + steps_param_obs = config.getstr('config','OBS_STEPS','') + steps_list_obs = steps_param_obs.split("+") + + if not steps_list_obs and not steps_list_fcst: + print('No processing steps requested for either the model or observations,') + print('no data will be processed') - # If no steps have been listed on the command line run them all - if not steps_config_part: - steps_list = all_steps - else: - # If a list of steps has been added to the command line - # parse them, put them in a python list and remove that - # parameter from the original config list - steps_param = steps_config_part[0].split("=")[1] - steps_list = steps_param.split("+") - config_list.remove(steps_config_part[0]) ###################################################################### # Pre-Process Data: ###################################################################### - config = config_metplus.setup(config_list) - # Regrid to 1 Degree - if ("REGRID" in steps_list): - print('Regridding') - RegridDataPlaneWrapper(config).run_all_times() + # Regrid + if ("REGRID" in steps_list_obs): + print('Regridding Observations') + regrid_config = config_metplus.replace_config_from_section(config, 'regrid_obs') + RegridDataPlaneWrapper(regrid_config).run_all_times() + + if ("REGRID" in steps_list_fcst): + print('Regridding Model') + regrid_config = config_metplus.replace_config_from_section(config, 'regrid_fcst') + RegridDataPlaneWrapper(regrid_config).run_all_times() #Compute Daily Average - if ("DAILYAVE" in steps_list): + if ("TIMEAVE" in steps_list_obs): + print('Computing Daily Averages') + daily_config = config_metplus.replace_config_from_section(config, 'daily_mean_obs') + PCPCombineWrapper(daily_config).run_all_times() + + if ("TIMEAVE" in steps_list_fcst): print('Computing Daily Averages') - daily_config = config_metplus.replace_config_from_section(config, 'daily_mean') + daily_config = config_metplus.replace_config_from_section(config, 'daily_mean_fcst') PCPCombineWrapper(daily_config).run_all_times() #Take a running mean - if ("RUNMEAN" in steps_list): - print('Computing Running means') - rmean_config = config_metplus.replace_config_from_section(config, 'running_mean') + if ("RUNMEAN" in steps_list_obs): + print('Computing Obs Running means') + rmean_config = config_metplus.replace_config_from_section(config, 'running_mean_obs') + PCPCombineWrapper(rmean_config).run_all_times() + + if ("RUNMEAN" in steps_list_fcst): + print('Computing Model Running means') + rmean_config = config_metplus.replace_config_from_section(config, 'running_mean_fcst') PCPCombineWrapper(rmean_config).run_all_times() #Compute anomaly - if ("ANOMALY" in steps_list): - print('Computing Anomalies') - anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly') + if ("ANOMALY" in steps_list_obs): + print('Computing Obs Anomalies') + anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly_obs') + PCPCombineWrapper(anomaly_config).run_all_times() + + if ("ANOMALY" in steps_list_fcst): + print('Computing Model Anomalies') + anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly_fcst') PCPCombineWrapper(anomaly_config).run_all_times() @@ -69,46 +151,125 @@ def main(): # Blocking Calculation and Plotting ###################################################################### # Set up the data - steps = BlockingCalculation(config) + steps_fcst = BlockingCalculation(config,'FCST') + steps_obs = BlockingCalculation(config,'OBS') + + # Check to see if CBL's are used from an obs climatology + use_cbl_obs = config.getbool('Blocking','USE_CBL_OBS',False) # Calculate Central Blocking Latitude - if ("CBL" in steps_list): - print('Computing CBLs') - cbls,lats,lons,yr,mhweight = steps.run_CBL() + cbl_config = config_metplus.replace_config_from_section(config,'Blocking') + cbl_config_init = config.find_section('Blocking','CBL_INIT_BEG') + cbl_config_valid = config.find_section('Blocking','CBL_VALID_BEG') + use_init = is_loop_by_init(cbl_config) + if use_init and (cbl_config_init is not None): + config.set('Blocking','INIT_BEG',config.getstr('Blocking','CBL_INIT_BEG')) + config.set('Blocking','INIT_END',config.getstr('Blocking','CBL_INIT_END')) + cbl_config = config_metplus.replace_config_from_section(config, 'Blocking') + elif cbl_config_valid is not None: + config.set('Blocking','VALID_BEG',config.getstr('Blocking','CBL_VALID_BEG')) + config.set('Blocking','VALID_END',config.getstr('Blocking','CBL_VALID_END')) + cbl_config = config_metplus.replace_config_from_section(config, 'Blocking') + + if ("CBL" in steps_list_obs): + print('Computing Obs CBLs') + obs_infiles, yr_obs = find_input_files(cbl_config, use_init, 'OBS_BLOCKING_ANOMALY_TEMPLATE') + cbls_obs,lats_obs,lons_obs,yr_obs,mhweight_obs = steps_obs.run_CBL(obs_infiles,yr_obs) + + if ("CBL" in steps_list_fcst): + # Add in step to use obs for CBLS + print('Computing Forecast CBLs') + fcst_infiles,yr_fcst = find_input_files(cbl_config, use_init, 'FCST_BLOCKING_ANOMALY_TEMPLATE') + cbls_fcst,lats_fcst,lons_fcst,yr_fcst,mhweight_fcst = steps_fcst.run_CBL(fcst_infiles,yr_fcst) + elif use_cbl_obs: + cbls_fcst = cbls_obs + lats_fcst = lats_obs + lons_fcst = lons_obs + yr_fcst = yr_obs + mhweight_fcst = mhweight_obs #Plot Central Blocking Latitude - if ("PLOTCBL" in steps_list ): - cbl_plot_mthstr = config.getstr('Blocking','CBL_PLOT_MTHSTR') - cbl_plot_outname = config.getstr('Blocking','CBL_PLOT_OUTPUT_NAME') - create_cbl_plot(lons, lats, cbls, mhweight, cbl_plot_mthstr, cbl_plot_outname, do_averaging=True) + if ("PLOTCBL" in steps_list_obs): + cbl_plot_mthstr = config.getstr('Blocking','OBS_CBL_PLOT_MTHSTR') + cbl_plot_outname = config.getstr('Blocking','OBS_CBL_PLOT_OUTPUT_NAME') + create_cbl_plot(lons_obs, lats_obs, cbls_obs, mhweight_obs, cbl_plot_mthstr, cbl_plot_outname, do_averaging=True) + if ("PLOTCBL" in steps_list_fcst): + cbl_plot_mthstr = config.getstr('Blocking','FCST_CBL_PLOT_MTHSTR') + cbl_plot_outname = config.getstr('Blocking','FCST_CBL_PLOT_OUTPUT_NAME') + create_cbl_plot(lons_fcst, lats_fcst, cbls_fcst, mhweight_fcst, cbl_plot_mthstr, cbl_plot_outname, + do_averaging=True) # Run IBL - if( "IBL" in steps_list): - print('Computing IBLs') - ibls = steps.run_Calc_IBL(cbls) - daynum = np.arange(0,len(ibls[0,:,0]),1) + ibl_config = config_metplus.replace_config_from_section(config,'Blocking') + use_init = is_loop_by_init(ibl_config) + if ("IBL" in steps_list_obs) and not ("IBL" in steps_list_fcst): + print('Computing Obs IBLs') + obs_infiles, yr_obs = find_input_files(ibl_config, use_init, 'OBS_BLOCKING_TEMPLATE') + ibls_obs = steps_obs.run_Calc_IBL(cbls_obs,obs_infiles,yr_obs) + daynum_obs = np.arange(0,len(ibls_obs[0,:,0]),1) + elif ("IBL" in steps_list_fcst) and not ("IBL" in steps_list_obs): + print('Computing Forecast IBLs') + fcst_infiles, yr_fcst = find_input_files(ibl_config, use_init, 'FCST_BLOCKING_TEMPLATE') + ibls_fcst = steps_fcst.run_Calc_IBL(cbls_fcst,fcst_infiles,yr_fcst) + daynum_fcst = np.arange(0,len(ibls_fcst[0,:,0]),1) + elif ("IBL" in steps_list_obs) and ("IBL" in steps_list_fcst): + ## FIX THIS LINE obs_infiles, yr_obs = find_infiles(ibl_config, use_init, 'OBS') + ibls_obs = steps_obs.run_Calc_IBL(cbls_obs,obs_infiles,yr_obs) + daynum_obs = np.arange(0,len(ibls_obs[0,:,0]),1) + ibls_fcst = steps_fcst.run_Calc_IBL(cbls_fcst,fcst_infiles,yr_fcst) + daynum_fcst = np.arange(0,len(ibls_fcst[0,:,0]),1) # Plot IBLS - if( "PLOTIBL" in steps_list): + if("PLOTIBL" in steps_list_obs) and not ("PLOTIBL" in steps_list_fcst): + ibl_plot_title = config.getstr('Blocking','OBS_IBL_PLOT_TITLE','IBL Frequency') + ibl_plot_outname = config.getstr('Blocking','OBS_IBL_PLOT_OUTPUT_NAME','') + ibl_plot_label1 = config.getstr('Blocking','IBL_PLOT_OBS_LABEL','') + pb.plot_ibls(ibls_obs,lons_obs,ibl_plot_title,ibl_plot_outname,label1=ibl_plot_label1) + elif ("PLOTIBL" in steps_list_fcst) and not ("PLOTIBL" in steps_list_obs): + ibl_plot_title = config.getstr('Blocking','FCST_IBL_PLOT_TITLE','IBL Frequency') + ibl_plot_outname = config.getstr('Blocking','FCST_IBL_PLOT_OUTPUT_NAME') + ibl_plot_label1 = config.getstr('Blocking','IBL_PLOT_FCST_LABEL',None) + pb.plot_ibls(ibls_fcst,lons_fcst,ibl_plot_title,ibl_plot_outname,label1=ibl_plot_label1) + elif ("PLOTIBL" in steps_list_obs) and ("PLOTIBL" in steps_list_fcst): ibl_plot_title = config.getstr('Blocking','IBL_PLOT_TITLE') ibl_plot_outname = config.getstr('Blocking','IBL_PLOT_OUTPUT_NAME') - pb.plot_ibls(ibls,lons,ibl_plot_title,ibl_plot_outname) + #Check to see if there are plot legend labels + ibl_plot_label1 = config.getstr('Blocking','IBL_PLOT_OBS_LABEL','Observation') + ibl_plot_label2 = config.getstr('Blocking','IBL_PLOT_FCST_LABEL','Forecast') + pb.plot_ibls(ibls_obs,lons_obs,ibl_plot_title,ibl_plot_outname,data2=ibls_fcst,lon2=lons_fcst, + label1=ibl_plot_label1,label2=ibl_plot_label2) # Run GIBL - if( "GIBL" in steps_list): + if ("GIBL" in steps_list_obs): print('Computing GIBLs') - gibls = steps.run_Calc_GIBL(ibls,lons) + gibls_obs = steps_obs.run_Calc_GIBL(ibls_obs,lons_obs) + + if ("GIBL" in steps_list_fcst): + print('Computing GIBLs') + gibls_fcst = steps_fcst.run_Calc_GIBL(ibls_fcst,lons_fcst) # Calc Blocks - if( "CALCBLOCKS" in steps_list): + if ("CALCBLOCKS" in steps_list_obs): + print('Computing Blocks') + block_freq_obs = steps_obs.run_Calc_Blocks(ibls_obs,gibls_obs,lons_obs,daynum_obs,yr_obs) + + if ("CALCBLOCKS" in steps_list_fcst): print('Computing Blocks') - block_freq = steps.run_Calc_Blocks(ibls,gibls,lons,daynum,yr) + block_freq_fcst = steps_fcst.run_Calc_Blocks(ibls_fcst,gibls_fcst,lons_fcst,daynum_fcst,yr_fcst) # Plot Blocking Frequency - if( "PLOTBLOCKS" in steps_list): + if ("PLOTBLOCKS" in steps_list_obs) and not ("PLOTBLOCKS" in steps_list_fcst): + blocking_plot_title = config.getstr('Blocking','OBS_BLOCKING_PLOT_TITLE') + blocking_plot_outname = config.getstr('Blocking','OBS_BLOCKING_PLOT_OUTPUT_NAME') + pb.plot_blocks(block_freq_obs,gibls_obs,ibls_obs,lons_obs,blocking_plot_title,blocking_plot_outname) + elif ("PLOTBLOCKS" in steps_list_fcst) and not ("PLOTBLOCKS" in steps_list_obs): + blocking_plot_title = config.getstr('Blocking','FCST_BLOCKING_PLOT_TITLE') + blocking_plot_outname = config.getstr('Blocking','FCST_BLOCKING_PLOT_OUTPUT_NAME') + pb.plot_blocks(block_freq_fcst,gibls_fcst,ibls_fcst,lons_fcst,blocking_plot_title,blocking_plot_outname) + elif ("PLOTBLOCKS" in steps_list_obs) and ("PLOTBLOCKS" in steps_list_fcst): blocking_plot_title = config.getstr('Blocking','BLOCKING_PLOT_TITLE') blocking_plot_outname = config.getstr('Blocking','BLOCKING_PLOT_OUTPUT_NAME') pb.plot_blocks(block_freq,gibls,ibls,lons,blocking_plot_title,blocking_plot_outname) From dc57879652a608e9b3fa54d8056c31c2a5a93e28 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Thu, 3 Dec 2020 18:04:49 -0700 Subject: [PATCH 22/93] Updated documentation --- .../Regrid_PCP_obsERA_obsOnly_Blocking.conf | 118 ++++++++++++++++++ .../Regrid_PCP_fcstGFS_obsERA_Blocking.conf | 12 +- ush/Blocking_driver.py | 74 ++++++++--- 3 files changed, 177 insertions(+), 27 deletions(-) create mode 100644 docs/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf diff --git a/docs/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf b/docs/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf new file mode 100644 index 0000000000..1fbd6b5313 --- /dev/null +++ b/docs/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf @@ -0,0 +1,118 @@ +""" +Blocking Calculation: RegridDataPlane, PcpCombine, and Blocking python code +============================================================================ + +model_applications/ +s2s/ +Regrid_PCP_obsERA_obsOnly_Blocking.conf + +""" + +############################################################################## +# Scientific Objective +# -------------------- +# +# To compute the Central Blocking Latitude, Instantaneousy blocked latitudes, +# Group Instantaneousy blocked latitudes, and the frequency of atmospheric +# blocking using the Pelly-Hoskins Method. + +############################################################################## +# Datasets +# -------- +# +# * Observation dataset: ERA Reanlaysis 500 mb height. + +############################################################################## +# METplus Components +# ------------------ +# +# This use case runs the blocking driver script which runs the steps the user +# lists in STEPS_OBS. The possible steps are regridding (REGRID), time averaging +# (TIMEAVE), computing a running mean (RMEAN), computing anomalies (ANOMALY), computing CBLs +# (CBL), plotting CBLs (PLOTCBL), computing IBLs (IBL), plotting IBL frequency (PLOTIBL), +# computing GIBLs (GIBL), computing blocks (CALCBLOCKS), and plotting the blocking frequency +# (PLOTBLOCKS). The steps can be listed on the command line or in a .conf file and are +# formatted as follows: +# +# STEPS_OBS = REGRID+TIMEAVE+RUNMEAN+ANOMALY+CBL+PLOTCBL+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS + +############################################################################## +# METplus Workflow +# ---------------- +# +# The regrid_data_plane, pcp_combine, and blocking python code are run for each +# time. This example loops by valid time. It processes 1 valid time, listed below. +# +# | **Valid:** 2020-02-06_12Z +# | **Forecast lead:** 36 + +############################################################################## +# METplus Configuration +# --------------------- +# +# METplus first loads all of the configuration files found in parm/metplus_config, +# then it loads any configuration files passed to METplus via the command line +# with the -c option, i.e. -c parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf +# +# .. highlight:: bash +# .. literalinclude:: ../../../../parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf + +############################################################################## +# MET Configuration +# --------------------- +# +# METplus sets environment variables based on the values in the METplus configuration file. +# These variables are referenced in the MET configuration file. **YOU SHOULD NOT SET ANY OF THESE ENVIRONMENT VARIABLES YOURSELF! THEY WILL BE OVERWRITTEN BY METPLUS WHEN IT CALLS THE MET TOOLS!** If there is a setting in the MET configuration file that is not controlled by an environment variable, you can add additional environment variables to be set only within the METplus environment using the [user_env_vars] section of the METplus configuration files. See the 'User Defined Config' section on the 'System Configuration' page of the METplus User's Guide for more information. +# +# .. highlight:: bash +# .. literalinclude:: ../../../../parm/use_cases/model_applications/convection_allowing_models/GridStatConfig_ss +# +# See the following files for more information about the environment variables set in this configuration file. +# +# parm/use_cases/met_tool_wrapper/GridStat/GridStat.py + +############################################################################## +# Running METplus +# --------------- +# +# This use case is run in the following way: +# +# 1) Passing in Regrid_PCP_obsERA_obsOnly_Blocking.conf then a user-specific system configuration file:: +# +# blocking_driver.py /path/to/METplus/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf /path/to/user_system.conf +# +# The following variables must be set correctly: +# +# * **INPUT_BASE** - Path to directory where sample data tarballs are unpacked (See Datasets section to obtain tarballs). This is not required to run METplus, but it is required to run the examples in parm/use_cases +# * **OUTPUT_BASE** - Path where METplus output will be written. This must be in a location where you have write permissions +# * **MET_INSTALL_DIR** - Path to location where MET is installed locally +# +# Example User Configuration File:: +# +# [dir] +# INPUT_BASE = /path/to/sample/input/data +# OUTPUT_BASE = /path/to/output/dir +# MET_INSTALL_DIR = /path/to/met-X.Y +# + +############################################################################## +# Expected Output +# --------------- +# +# Refer to the value set for **OUTPUT_BASE** to find where the output data was generated. +# Output for this use case will be found in model_applications/s2s/Blocking (relative to **OUTPUT_BASE**) +# and will contain output for the steps requested. This may include the regridded data, daily averaged files, running mean files, anomaly files and the +# requested plots. + +############################################################################## +# Keywords +# -------- +# +# sphinx_gallery_thumbnail_path = '_static/convection_allowing_models-SS_PP_prob.png' +# +# .. note:: `GridStatToolUseCase `_, +# `ConvectionAllowingModelsAppUseCase `_, +# `NetCDFFileUseCase `_, +# `NOAAHWTOrgUseCase `_, +# `NCAROrgUseCase `_ +# `NOAAHMTOrgUseCase `_, diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf index 6363b2c740..e9c89ba82b 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf @@ -347,8 +347,7 @@ CBL_VALID_BEG = 1979120100 CBL_VALID_END = 2017022800 VALID_BEG = 2016010100 - -VALID_END = 2018010100 +VALID_END = 2017123100 VALID_INCREMENT = 86400 @@ -398,19 +397,18 @@ FCST_BLOCK_METHOD = PH OBS_BLOCK_METHOD = {FCST_BLOCK_METHOD} # Directory for the Z500 anomaly data to read in to the blocking python code -FCST_BLOCKING_ANOMALY_DIR = {OUTPUT_BASE}/s2s/FV3GFS/Anomaly -OBS_BLOCKING_ANOMALY_DIR = {OUTPUT_BASE}/s2s/Anomaly +OBS_BLOCKING_ANOMALY_TEMPLATE = {OUTPUT_BASE}/s2s/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc # Variable Name for the Z500 anomaly data to read in to the blocking python code FCST_BLOCKING_ANOMALY_VAR = Z500_P500 OBS_BLOCKING_ANOMALY_VAR = Z500_ANA # Directory for the Z500 data to read in to the blocking python code -FCST_BLOCKING_DIR = {OUTPUT_BASE}/s2s/FV3GFS/orig -OBS_BLOCKING_DIR = {OUTPUT_BASE}/s2s/daily +FCST_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/FV3GFS/daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc # Variable for the Z500 data -FCST_BLOCKING_VAR = Z500 +FCST_BLOCKING_VAR = Z500_NA_MEAN OBS_BLOCKING_VAR = Z500 # Plot titles diff --git a/ush/Blocking_driver.py b/ush/Blocking_driver.py index 25abaf67ea..26a47819ca 100644 --- a/ush/Blocking_driver.py +++ b/ush/Blocking_driver.py @@ -9,7 +9,7 @@ sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy/metplotpy/blocking_s2s") sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy_feature_33/metplotpy/blocking_s2s") from Blocking import BlockingCalculation -from metplus.util import config_metplus, get_start_end_interval_times, get_lead_sequence +from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub from ush.master_metplus import get_config_inputs_from_command_line from metplus.wrappers import PCPCombineWrapper @@ -17,12 +17,15 @@ import plot_blocking as pb from CBL_plot import create_cbl_plot -def find_input_files(inconfig, use_init, intemplate): +def find_input_files(inconfig, use_init, intemplate, secondtemplate=''): loop_time, end_time, time_interval = get_start_end_interval_times(inconfig) skip_times = get_skip_times(inconfig) start_mth = loop_time.strftime('%m') template = inconfig.getraw('config',intemplate) + if secondtemplate: + template2 = inconfig.getraw('config',secondtemplate) + file_list2 = [] file_list = [] yr_list = [] @@ -41,14 +44,23 @@ def find_input_files(inconfig, use_init, intemplate): input_dict['lead'] = ls outtimestuff = ti_calculate(input_dict) - cmth = outtimestuff['valid'].strftime('%m') - filepath = do_string_sub(template, **outtimestuff) if skip_time(outtimestuff, skip_times): continue - if os.path.exists(filepath): - file_list.append(filepath) + cmth = outtimestuff['valid'].strftime('%m') + filepath = do_string_sub(template, **outtimestuff) + if secondtemplate: + filepath2 = do_string_sub(template2, **outtimestuff) + if os.path.exists(filepath) and os.path.exists(filepath2): + file_list.append(filepath) + file_list2.append(filepath2) + else: + file_list.append('') + file_list2.append('') else: - file_list.append('') + if os.path.exists(filepath): + file_list.append(filepath) + else: + file_list.append('') if (int(cmth) == int(start_mth)) and (int(pmth) != int(start_mth)): yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) @@ -56,6 +68,8 @@ def find_input_files(inconfig, use_init, intemplate): loop_time += time_interval + if secondtemplate: + file_list = [file_list,file_list2] yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) return file_list, yr_list @@ -67,7 +81,6 @@ def main(): config_list = get_config_inputs_from_command_line() - # If the user has defined the steps they want to run # grab the command line parameter steps_config_part_fcst = [s for s in config_list if "FCST_STEPS" in s] @@ -86,7 +99,8 @@ def main(): steps_list_obs = steps_param_obs.split("+") config_list.remove(steps_config_part_obs[0]) - config = config_metplus.setup(config_list) + #config = config_metplus.setup(config_list) + config = pre_run_setup(config_list) if not steps_config_part_fcst: steps_param_fcst = config.getstr('config','FCST_STEPS','') steps_list_fcst = steps_param_fcst.split("+") @@ -162,14 +176,20 @@ def main(): cbl_config_init = config.find_section('Blocking','CBL_INIT_BEG') cbl_config_valid = config.find_section('Blocking','CBL_VALID_BEG') use_init = is_loop_by_init(cbl_config) - if use_init and (cbl_config_init is not None): - config.set('Blocking','INIT_BEG',config.getstr('Blocking','CBL_INIT_BEG')) - config.set('Blocking','INIT_END',config.getstr('Blocking','CBL_INIT_END')) - cbl_config = config_metplus.replace_config_from_section(config, 'Blocking') - elif cbl_config_valid is not None: - config.set('Blocking','VALID_BEG',config.getstr('Blocking','CBL_VALID_BEG')) - config.set('Blocking','VALID_END',config.getstr('Blocking','CBL_VALID_END')) - cbl_config = config_metplus.replace_config_from_section(config, 'Blocking') + if use_init: + orig_beg = config.getstr('Blocking','INIT_BEG') + orig_end = config.getstr('Blocking','INIT_END') + if cbl_config_init is not None: + config.set('Blocking','INIT_BEG',config.getstr('Blocking','CBL_INIT_BEG')) + config.set('Blocking','INIT_END',config.getstr('Blocking','CBL_INIT_END')) + cbl_config = config_metplus.replace_config_from_section(config, 'Blocking') + else: + orig_beg = config.getstr('Blocking','VALID_BEG') + orig_end = config.getstr('Blocking','VALID_END') + if cbl_config_valid is not None: + config.set('Blocking','VALID_BEG',config.getstr('Blocking','CBL_VALID_BEG')) + config.set('Blocking','VALID_END',config.getstr('Blocking','CBL_VALID_END')) + cbl_config = config_metplus.replace_config_from_section(config, 'Blocking') if ("CBL" in steps_list_obs): print('Computing Obs CBLs') @@ -201,22 +221,36 @@ def main(): # Run IBL + if use_init: + config.set('Blocking','INIT_BEG',orig_beg) + config.set('Blocking','INIT_END',orig_end) + else: + config.set('Blocking','VALID_BEG',orig_beg) + config.set('Blocking','VALID_END',orig_end) ibl_config = config_metplus.replace_config_from_section(config,'Blocking') - use_init = is_loop_by_init(ibl_config) if ("IBL" in steps_list_obs) and not ("IBL" in steps_list_fcst): + #if ("IBL" in steps_list_obs): print('Computing Obs IBLs') - obs_infiles, yr_obs = find_input_files(ibl_config, use_init, 'OBS_BLOCKING_TEMPLATE') + obs_infiles, yr_obs = find_input_files(ibl_config, use_init, 'OBS_BLOCKING_TEMPLATE') ibls_obs = steps_obs.run_Calc_IBL(cbls_obs,obs_infiles,yr_obs) daynum_obs = np.arange(0,len(ibls_obs[0,:,0]),1) + #if ("IBL" in steps_list_fcst): elif ("IBL" in steps_list_fcst) and not ("IBL" in steps_list_obs): print('Computing Forecast IBLs') fcst_infiles, yr_fcst = find_input_files(ibl_config, use_init, 'FCST_BLOCKING_TEMPLATE') ibls_fcst = steps_fcst.run_Calc_IBL(cbls_fcst,fcst_infiles,yr_fcst) daynum_fcst = np.arange(0,len(ibls_fcst[0,:,0]),1) elif ("IBL" in steps_list_obs) and ("IBL" in steps_list_fcst): - ## FIX THIS LINE obs_infiles, yr_obs = find_infiles(ibl_config, use_init, 'OBS') + both_infiles, yr_obs = find_input_files(ibl_config, use_init, 'OBS_BLOCKING_TEMPLATE', + secondtemplate='FCST_BLOCKING_TEMPLATE') + # TEST THIS + obs_infiles = both_infiles[0] + fcst_infiles = both_infiles[1] + yr_fcst = yr_obs + print('Computing Obs IBLs') ibls_obs = steps_obs.run_Calc_IBL(cbls_obs,obs_infiles,yr_obs) daynum_obs = np.arange(0,len(ibls_obs[0,:,0]),1) + print('Computing Forecast IBLs') ibls_fcst = steps_fcst.run_Calc_IBL(cbls_fcst,fcst_infiles,yr_fcst) daynum_fcst = np.arange(0,len(ibls_fcst[0,:,0]),1) From 8d763b5bc01227b7fb4a7609234b9cc2f61d0b87 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Fri, 4 Dec 2020 19:14:24 -0700 Subject: [PATCH 23/93] Added documentation plot --- .../s2s-OBS_ERA_blocking_frequency.png | Bin 0 -> 302388 bytes .../Regrid_PCP_obsERA_obsOnly_Blocking.conf | 40 +- ush/drivers/Blocking.py | 473 ++++++++++++++++++ ush/drivers/Blocking_driver.py | 313 ++++++++++++ 4 files changed, 807 insertions(+), 19 deletions(-) create mode 100644 docs/_static/s2s-OBS_ERA_blocking_frequency.png create mode 100644 ush/drivers/Blocking.py create mode 100644 ush/drivers/Blocking_driver.py diff --git a/docs/_static/s2s-OBS_ERA_blocking_frequency.png b/docs/_static/s2s-OBS_ERA_blocking_frequency.png new file mode 100644 index 0000000000000000000000000000000000000000..6492a1c13d897a23f1251ae63ff3e4d0e72c3e3d GIT binary patch literal 302388 zcmeFZc{G;o|2BFzmy#xxIZ1>vL`tH;5Q@xm5;Bvq%o>!8nbKhD4w*&f45cCxk(nrj z%=0|#af+w1##-?iSo_Pf^Jf4tUu))Q{`bzSHA8II%l9OwPulB^^p1uX@MM52^B zFQz~uZQ>x2HZW{lkDpvsSrW(p*4mtvQrd_w=Z*TF_-R@2 ztqr+fj0rW9Nc%`qVrP_Yh7Ekbp+?;>B{(wt+|$#2|LWTmUbO4BJDt0;m$Rfzpx%hz ze&Na97ZL@J9)FQ?4fUbXbtw{f-SfBUliw6AFMzWx94MJD_EN{jvHSG0|p(to@V--heG*s=XT zzkbuxh5WZ`o$qOk`_K0j6B8~E+VXnH;VCgbY6vNEZOS${9D@`gMznJm_CZEcNz{u9RMv;T)F zVHn)LZre)yQ?IkKvhwuyR_v$uIJ=64h2`<%$8SG;SQ{f9ayup_#*d>y^xXZe9z{h( zZQU(zZgA(>^~Yw@7$VWH8MF_rzbv^>$WVy$H&JnqJuxsFAIG2>Xo~P z$GQs_F6bxud7gh76tpu!*nylq+g9k}&1X>FYcBF9j}<8YCcpkGlRA!yCr2gwg;}M8 z-FjAMee{%`M|gee#6Hq&DtWbEfJ0_wUy*oU|AFRUTqcmK;CX-@xf> z`8|)?dk?q7gB`3BiVuD8Dz<)K*P};|)~0CF+4a|pzrROWovbOSrm6Y)QRLrZ(mVWj z8u0q|f4+S?N+VSyId3pJ8 zpr>{2&C&g|0w#CYY}ndsE~`xUaP{id+xF~v*>aU4H~i#{;_u%Xda5F;h86xUXPoDc zddoi-@KC#Yb${%IC%3Uqdj0juaoTU}T|=WEX=YoLMSQESmY)iX&dtc+pXjUGe4mO* z0{3Vqq^hrf;OyD6NR(k+Ay(wNc)h2Rp|QESTx)cBW`6$MwzVPtIz_H7 z0me#W6BAc;Tpu#-1r$8u$4WhL4RUAFJuygq=?qwjeF2jwDsjv7|}n49c3s!w{-<$!g)pPHJ=$oaR!lgXZcyY)IP)Uc7o z>GsZ{?{6B@4ZLfTzo0e}6@dPPwU|Hkj#bGTnP=71_R{hj?Q^Io@ueFbXgV5R;Wjs6 zEG8l0RkAeGNu`veCePnJJe(TjNI`ew#*MWbHoR|X(Hwgm!l}BSjZM;D`ENeS%fJ5z zXpqkqzkN$uoS!aD*39P7|Fo^FGyU~z-kT#=!UgVblS+H_>g}yH8!ly;saM~;cI_Z? zKQ<^Axy~&#G&Hmo7uiC8{1Shm!ROuj*RJ(N#}>z;oHk|{??m3P(fa%ONvNqkj!66q zYRKfff1laICpY&*eX5TC37hWoj5`s|+gT)f(>Taf1A~LS#x)1ZZk|5vK423Y8+#Qy zM@~C)XZ0cd2AtRX=z*3VDz(zOy7WJM{P?cE zUL|XGVR2Esv}mSdb7M=3+uSgo{wFGUuHQ+=3HHkcjviybK7UqG)a@P^;G&VaaG_R@ zwGXjQD;swF781JS-JK0LmljSaC@Ka71+78RZ)|LQ+tftkODBltwudO5Yt}3-G3dz3 zZat!v<4(jX_Uz`u4DZ#eS04rj-uCg?^7zS&l9qhG#UX1N@Dfu=TIaYI{MTW>=u6Fmci%`Zm^a>)3DKxr6<^#U>ZA50_F`S7+DE;vyPgj7%t5_x(MSo~=|=rDZ{ERzHi^3Evzc z$wi7R+A^>!C+tc}PX0MC;DgL1qg;-Rjol6i7+O9dilRC{JzN@b%4yq<9f78ty2xUs zWDROYM#kRyWICZ6Lt9W!!W)!#3A-)Pm-;chM?WNPA})^oz`=tZ-{0Ke;pIK^gwNno zj5IazED;eABU4lNa&sLD>*l+^(9s{iPGXY{d;8^?;P#z6??gvO%SFD#ilTp>ekmLN zHA($wK_S(Soja`-W~{VwuK)aIw@{a;dR|86&e`V#$l&7Qx|C_6oRgPFbQkmHj58<} z6Dll3s2^hf1C0XeuYGySO4_#gz{jWdcdMX9>$Y7K9$gFQMXH=Smo7cjKO!nBn%Pgs zr|+p>NR}AtkyYK#!ou1gCSdxA%O=CTMa9~$zajNA-~D~gH@OssmnrFvEp#@9a_dms zyLXRViXN?$_0+ZuT`I#>PEM|=`_rdS51j`~d}vGI1n6TBI?5isVNI0mT zUF%;^P{4CzNQ;@5SN@Sku*2L$JdZ*7u6LD{vV%gaHmazo6r;9y{P=MtvpdAG%4ohR zI6VCDg~vQ+(l2k=u;FKYvSwh9jP`v*MO}(`UFqYnFs=)cBHFJqGL&W=vNJQO(Slg? z4Gj~uLpdzI=dos3wqH)3#>NKl7=7LM^VjFlb%JLf|7C>Qy+<~u0%)+L5^ z8J4uWO$~id99tM}E7+-$q{f_+lN0Ac`6?}Kdw0bXmIDV4e3}hjc;EfynFo?0QCT&F zL-{Utu%|qx&nDR?GBVQ0kNMoaPZOSYH+&b~+}S`yaryG)+bA&_Rmp%gJkB%MfBt-b zKfU&OpXrW0d)Ry!PO9(-2q@>)CnzUUyty&_C`Q%*xyo!i)T+)dPrln+bdI!k&z?QH zc&OrUFXdQ!kiNNB(ES~k5YcvHIjEJ~LOO`FyTAzH6$EMtj+`-6`v+WTg$vnzeRIRI zY$noeDZbRiQ-obLB}|_S7tL}Yib-}LClVp=#_*CqucoGEhG~N=KUKEdeB|A`Ys=K| zz7uLvZAh`7eSKb*MT@&pbQR}`2-3rnT(`F`d30FQ_R`P$bxwuLOHM?Rc<(-3j3O#f zK8`pyYs;r0n$(^3l=>+Or+)wbO{BEz^5Tu^9B=Qd)mfHmr&eA8gL#bz5@I zR9Wv01oA0>r8?iirYZZ1W|kQZdYt>)x2H2JKbMymqty{N2nxakjh1ygd zCKS7~_V!t3xi3R<_`kGHq>3YY}fOsC`lY+Xvdd}?8; z#WKBHd5ZS81|Vv4wxvI?tXIh?Vd3jj15K+l3o5Y=qaXL^{6Hwu_7I?5Bh$pAu~99# zfBV{1ou&Tw{r&w*1Y1_^6A@v=-oXkjhAmVH>*;~B^;c-qy<&l{~dy$(z>h$v) z!)-)#*Uw(n)2mKY<-QOuq?{qIsttZOGBNR?&}BZO{I%1xMTYS=iTZ0@#bzJ9sEuml zwja?cOtMQsVj^inbA(v{D(0C2~nO89-P5_Uk7@tzL{m6JdMkSNf($4k^Ba}mcfqc;7%L7x7(}_4ApBirG zHm$@%6B*5xIJG#}pSoAjB20y7{?%!ElAy8Y9zCs$6!k}xl+~P8eta=Pmbd z9Ub%ZgYsjeRg6t)qBr%`#jcbxx;=zLlYMCY> zMoEs7ee14rrUIj1`C05C?QdmkOHhnU*%sQzj~^$9Jh8B1Vrv0Y?}5%pMZ7VrV)S7W zWlU5}tFDT!xpf$k+V5MkEr}-0shaWw_)5CJ zF7)J$p(v;dH_^R}oIxAZa;;gnP*P56J;^{7zxvjFRc@9{f>QjB{DOk&bORZ19kN!g z_4)JXPlIa^;ONKORnajq54wfz`gRd`_xZW|CQ9D`^g{~WC@Cq4axpR3vIhgvqkc-Yb7ZcD-h zcyH=*{9VJkg_eIKveM)1^M^6l;!DWj)^A%{=nxMcP)N#y58auWxhd?ruvgNL{v8@B z>$5aM8bN=*>EK|j)zFxxH}1^+1VRvSCYs7Q2q3z8dTTas-i#*xW3VL~+5Hw!z-qKZ zJX7U^BKxkH?q`++*Xr>~R(~zg*`Dk68BoT|xx<8zd6l9!{fXY_O!e2-Hj%{KfRiQ_ z-eYlDO^IwQces7~_JQ%4+1YsQhKJ1O4vbR^Sc~4s+d)HfNWBLJIcqWp!Vv@txK=3U0mgU#n?E0ELUNe#!loJ5W2+^zEV|w}@f?-d>}31c@ANZf>SPM42?u z0M1}LrMm5GY<7ao1R6%5o^KLe7`X$uGT}ddn2XESUOV*8kyM?8K*yow#a87MEp>#l zVZ>}rP0d~O=jz7nc2~|5kpxz=Xg$u%!NE~Qlq(P1(MB-7z+8e=PuZlIw;YRUhzHc# zh$`UF-BjdObj8#(vBqiprQtV#VUhag)&ZTgv+|d#;8pbL&A^#(Bo&%Hk0l?*vZCmst0Z1Hg2YO0l8Q=leQRM>r~R(s`aZ> zf(W0zR{es1G>QFWfYLzT+^mUx3Ll4ymXFYkPfP?G_(AnSDv0wR%p7cyBoGteyqI2I zW5i3I9GCfH8rc@UP?tPQzPGmW*bk_kQk|4z%61QEUWx(j+ek$v87bm2re#1j`1~lx zs&hRk3YSC0-Ay}3rUo@LO?Ita1z9ghYw<&CD?O1kON;aJ2!W7sp%W)`n=_1afJp3z zTH_}ixwDbdQMes)mB;hv%s?XEk*;%6mXmRvv*SIHOW9B)En0JKflBtwF2$k7q1E^^ zo^tdo(bLnjni$k`S07L{c%7XsdFj$NY{k#s-p4)kSeIfs z(Z#z_QTrfK_IMc@80ew`J9N*!0RmoVUtWyVcLp+0D{?&rk~CIP7bCL=_~%_y)9g1j zD`)P)o1?2=Nc!*gMSZw}(skT<=9M&O7{@LOs21Cx5{d(?iuuo?WQ~sfl1VmM>K$$< zM`i9r-J2Qv%snn#_3`66u(#8IFyfsJDcbMRo9a^7fFRmkro;7HA-hsB3cp2t)V+2s zRzVi@5ryezmFTjVlG3hg6_0O04Q4-8+T5&R9U~M!*j&pRVu+@}A$kl^LN50Ft6NcT z_w(}umdh|2m$0?96;TS#h6dMUt&DoiD)T7#Fq82?e*RrcOG|;H`AilMOoLG&~b=yWrLGCzwdKeYKn17AN=I z+d@OGcUX7P#3aG2eFIvsJhIuh%CbI*#*hBQZQQhR7z@;0y%L}8zD>=|9j&=G*R8D; zPFkV`T_0%VqNS}piZs-+5)~~H&MuzMh6du@y;{V~4nqiw%#@zxYX$}$pb81L z1JHrekl9+DC+!E`0)yzHa9c4zZ7PXZd?}{a?mX^W;y_IPC_J1mSN|CS#+_&1s9Ch> z_K30OzBDG~tl@2I7cCYK_Ee#`)umjtD33U)y%hI`H8ds5)!Wl^8$CV!0UJS+TK1~L zp-RaZX?RwSj#r5$26rMg1MPsawfbr8#7(?uwHKY2W_vVr-gh<6CF8ls4v-bD&yE@R z_B#Q)NlP$mi*p4;T!bOWy&*}wGM3s5)76pazuTMQrZ}|A`-5DUEhMba3I}dtxCo8`6 z({KO{W;IO$3wZeSX@ZsSQ)@dr>SRMai^i{zIjyhPJ`1m8@9lrHmzkPF>7mcZl9Il( z9UQXgazFa}y@BJ;r+mF~<%&B1NKfvsKn{Y3t1i#xCv@7SNbIX94Zyk(QMKh#sg5&Z?gEqVt^>~M`FRcIt z94O`v=o4z2s8vu_&?QypYydCUu3ry5o_eM)G4;of zAMV)Ueb7VrhRNdIM3N`>?_9fz?wHv&U-Tt1N(e_!VDr5pX!bb{k5KepJGDVxTeY96?}yyo_|M5n7Ix3R;oJ8$mjh%9-unS7RiJhik~-FOZg! zA`}Hyx6;<{->sGw9Gs_`3>{N09K{6iEiyf`T-VU>J~*pqNs3NUih|#(S3G4U+v4ed z^u=8+5CRlPwu|Vv@ch!J8hSvRbpRM$w21!?7^r4q4NFQ&$eOP=-F8Qp>vmWIW)dsa z*3$Z#qJ1*i1W-4fzkAog;r60Z)Om3|o9>E$#6ZFICnEZFQ2^6Y#Hl&z?Q2iA0?xgHG)gbrn8l+2%t?PtHhw zwVdnE%><8Bg`K$b554w}o)~Ut0&gMny1BV!nsQQHE_B|+#KfeOqD2FVU3IpboB|2p zf^ELI_wMVqwzWb<4<2lCoE|z%d(vsjETW+bIzbuj{KW4&*1yV)wO^zlJIQFL8@FuP zc#|pPx@)N;^hDLBVP(WtG%b?tmQCRw!udDvhh6RgW^)Wf)bjR!&f= z7OKM2ikAXtvGxzkVnQcg8q;R#c4Mqds@lq&PFbW6(4jENF-Qk#9Duo_X+CORZ)@&r zvvGclR<#ML9ZC*g#%l_kZeV(C6#kMZs+|d!IRSwlK6!G8b{EG*~zL$N)qZE1oOT}s`_ZnS8(HTs;P`ntl08md<&suOCP&1IoP6_bu92C+aDq`6{zs{{E%tfMR;q zbw(I2^*g)OOZCnA~`!>#M-)^gTCP)Rq zTPHPiJF8dFI<%dH3GEtH}HG!iWS4DyqOw7S)_{t^Q; z^&nRN+DvgXYHD6E$K4E=yEWv*y1jn=`VLaKqoYIrb38W&4;!~`t!$v}Ye-GC^CO}^ zR{DgF>5um+)+l2)p@4~&Fr9L|TTyYLti&#U`YL)b0iv4v5_O71(E8al3vUm=kwEUW zF6t(sVD1yb2!555laufG?qJiHT0>)~R{SYaN6>Iq@Q=VmY;-gcO?!E--Yw5XnPHm) zM*fog*3FP`QUz}QJAC%qX3(+|fFJ#FP7v~b*9K&?FK&W@*{fX!Phn&=hni4ZTdT$EarTyu>+Cu} zd2JD;gH)!brs`v$dftACj^o-UEiX`+jkJRHV!7!>UA5}NK6-e2d)J>BYAfK(HCO)f zR3Ni**%GMWb6s3;P|zK8Y@&&fd(LaiX=`ii8X2)`n&%nS9Eu~x6GAD84O(!F_^3E+ zF3wcgwzjpvNtOSgp)ypHOp0;Wn9N|Vj zC_#j|qWJxL)@N)`j)+kPl=$-&#)_C)HK}?9nW%g+)eJ`}dHH>AI?tMoG<|N`kV3vF zjUEFGtM}YOVYNF{gYrPhgj*~pPoAu@ftt&mI~Wii9z2f+V`Yi^Alwt+F(0Q^>RilB>8EVM6MDerAK*i z@9fVNz~FZ=L!&^-L?9OFW7d=|-kI+aaOch%P%Eyc5guYHt(gvYYK`9mCC-m!HBO!dG>6P{+ zKSE`!9>w35iG(V>K6_d4R!j#*%k_B&T{Pd=ABH=N$8Bk0;YiG<&t+u+0+AdooB>1Z zrqbWo;$ttLo^vz-H2COsx;%cVEZo?T7Q$P9HlU}!nKji6C4x!6ru}v{OQs&QC>U)(hacO34X?I&L=>76@-R9l(77W{+ zX)?J7lMd$l`DQk(tgK~^ylV}wTpAJNewg=2N_(DP`C+PyH3zZF&&}p@A)-NOmi4b= z7j&HH)$)~od*A$fG;IhBG$72Zw4HzSR{H;Xs8Lo?*0|@95DqB)W54N-qY>ch5fGracOTCGMTB zd>0sK-0WsB{>dMcVqk5ltD@EBU4D67bZKS{R@5>6eMyM~_jqq$dJi8n^C}29j!6=^ zpsMdnOE-*;jxO&Nwdvl1HV6&&i&oFtb?bgY!p<$Zc;NyM;jpP&+4D>PF2F{R*J30F zYbRvE8XaDxq{G+<43%%fFp<(oXkn|?tbbcmqwvca-mS(=)6g*1ghA{&lo-NHFqXO1 zMKR0q44O<^-$RqGui`r&Dplq`m5R35;l0SX>i~=v$FKh&p}pLLX8X&FTc?m7#f7lb z?V=DDQBs?sp`&|WUe3`#X->k-;}EPV2G9C`e|wq!Yyae-H`kh5THa%T?_cK`l&4bW za_aD>i%*whzf75zU$&8v`Fu6oJn2}lfF^ZDRZSqP%vJD8H4uT6Mik;#H%G5lTk)QP zk>gULIN@ISy}9AwA2$@oYC^+-BKM#K^YMFCBJ&rjsO7B;OijIUZSRuHMXtWclK2oy zXhrF%6HyNqF4r9rh2QFY3DM-TgIaC!iLsW}$O#Z~1-&3h6svA-Q^g zzgP-9UH14G=cTwrAOvzJ8Vi_hsCfkBPYgRx^FLC3{W38zv3CajTwIldgP=0kCwk=x z3{%pOq<#nJh#AhWst{^Qg<*fN%cgEmA0MT;lQMZd9Uc2=g7UI@pVej#;68Joa%M2A ze$)D06C+-#sGy)<78w{wuIoI;&o2f9Dz3Ng7fKr8Dj9}$7CNDIu?^OnRovXETAisn zMU{2I8E6yL!xxcXJqg)FOE&vAvL9|n(>{OR(+FJl3N&2D6i=@=2oUL%gy68Sq>Qwo zVe*R?+v(}KXz4%=*PeN}D4Afj@6;&&%emYAkk+>tdeS_$NE_M|q4yy$f6hxzp$| zYRyUOy?Msr%jTW&RW&f2_T}!V^I<%tVY|@YlAo;oMr9%gUbgF+%EY#3{k!d+G11ZI zmsm~^lBSgPXPW)mv?9(qUAvERsw7=9w%d_15A@;uV_cO*Z*!T4NJSk-Q88ZX;`p9X3 z<7IrMX#Frl9FRE@-`@w-&Y;WNBa!WZa9i3k9*XMah0tndh_Fve-91r+)fyJ zgV^MVxh;7VnnD!p&7UeNYHbWWR1x~DZiW!SQtXz{a6555jUMJfJBUHH3*bBH0>ef! zeU5o9^Y&%kSL_CwGi9=_Nx<$=J&Ms8(RRY!(2+EHdTZl%`uO_V`1W*ly~Rwbf8nDP zej$&>TipoKHHn16?|GePMzlI_?{n4=|J|O*=~A0%stW5~Zw6r~C*St@D|vZbl8{(W zkW_e&q#2J|cYPAh=G(ktgtJM)~NC`uh4n&Y5-V*PDc#gu;kG`^vF_ zM9dqH#m&ym?Z;4{|AZIev5!Kqk<&23VmFVfYB>K_jy&+fw-(WMEV)<*>dKEmQ4t_OglmSy&&E4Q5Xw(a*g zh$VNiJP%3;)&!9`yfU&K1L3smKhKuk#L#0x?aKy&3}f^xu4h`GbOv_UlHAUYj*-aa z1xfyEkZr~~&D#r4p;j`}&UgBY5~B!T(+VmJ3k%To-QVlileRJndx9bUgsg>SyiR+< z`T!U&#D3TL!%$0O<=c?cg!{8OSOTD$FVKvBGX(|5w)QU&B-ooiiNJ3H@xnOF3Hohh zR(_xiEGOcnnN34HEG%mvCD2ALTPoxdXA{s^KBp@vTMQUI7w$Sj2B~HIQLeK;V zbGaoth0YIB3+JRW+BlRG&Rf_>5|v!*Uvl*jSmf}v%CHCE#zbxhmWCWsTo0E-a6Yqi zv>Y5C9#D0S%x1@aku|e%SGveDat|C^I^2n~gj?8l0X)zn<);_}NXH_DG&fT(Q%K^FwcPdJI)PLnS zB?~Yu91cVMw)S`oC6o+*RbZlJ^)g|pNw*pYf-q`GVSs)ZuTqIw+7%!M>tIQ~r#!m1 zyEsncf@@%2;G7S`r5Z6{E-zgsW{bTyVU8$VnltsKHLVOkc^}5lM3>8#3t`Ev9!1s> z118#EVSEN&DwHY9^%=&BP*~3K+r#fc5KOi&(r7^979S5%QBhTwFp+MK{8$A=LivY? zjRcf4A;xXn_6dnx{jjktnG>Q%!9j56`xg zloZFL!1Eet)Vx+5V%5Z{0@SAnQ)f8#&dbW~J|)?Zc*vy|#~b$2&^##d>X@7(Ugl+2_@SKgnGo=J2sVogC!tAY9;FxK|b@C(~GW!D@ zCa^ERnAF;|X%jSJ=CH7^1JC?F5VSwAojMyfAI#(vly%^Y&$Ina4x+9nx*diokSw<{ zB&ggW?9C9jH|Xf-z(={DaJb>xN zeb_jSh;bYdJMgIqR7T>I1A^dly;{%UVDi{x1I#woiE2b$?hsqhX+>wl*ZE^``b$bn zd+7_~ArMk<@}4s@>CTXh(UR9wanp!^A|5F&n^-@79;q4m-*drNWQ~y0HO%RG#vVI?tM9|o(Cm!X?c-> zOl}LeAhBSIdQ^1*mKB)3KLQ+o1jor0bb!pVqZ0Vr8|Q0#iYy`&-F&V zDgp>XS3lKV8J?JW|D3e*?61(r$F0alM^pA~d@N|m2rH;BTo{b-R@?>mEzgCj?v2&b zL)HK<&Ac3b0LKnT59VJV(B!N0>`bfg9YEX==Rj~;N6|5yn5_YGjeL_6WoBXN{B{!} zi9lQBNIN8#YRJZD{+y}%p!Un0V2v?9->W_%;m_;(_)eo#fco;y9EKHE>qAD>-RJ zou;@FR8#$!TxVA8WRq1grdB_*jhOa<&91`;M*`xSK1)F!Cgr>+GH^_CR_UFDJrWD} ziI1CTjJkgt<9-HH0HVqs6k2YT)XT}$7wu~NF>Aa6d$&+{Cow@yaOi%4rh5f<2UpRV z6g3DLF!xT&Rb7P74VEae@eGqXY3t1#+Ix>*k1~3p;OHm>>V7b{PSO=x21jdatL>vA zh$}cW;91@h^;;S=DGi*EaD4MG!GD4Bxd!tYafom~aJU2_F|1F76$M%K7FzFk>zE<9 zLvMRgk%R!8iZrMu5`a*wbQhnJx6VU`CbBbZpCz_smTHgL7d$Ibc4~s3nC&5 z7uN;0mi6)P%gTN$zOF&+*?c7CPPjlPvfa@#n&Se5X+PY_&u5l}0m9wrAIQP9@)M9a z2}2UjF?pB3xmTAGltGL=#Uv$VEGF$yShvs}+k$p$R83w-oRlEa8#Z_1ltLSvuNZa# z5B|X0fmjG(;O7U$`g1yM(94%>h4Vuv36BMNbn~7gZ(%w?MG}Kb@dJkzuwle`2VP!Y z;`oUDKqGT=aIWK|31J=YrxkrF>LvmN!R~mm0LQ0 zL(TmOpEbE*k?>E#)|<}HvFbD~@ye)re_35JL9qcdbOHZBaCnh{KjDpp_Yc_X%(lC7 zsSYS&gdGU1pc6%mWBKP4rB){ddIWfo?EK++YSgBSkXI z3gu8%u!(!VGn%0PA;I@oeEIToc$mBC;qz3Yp&|~0^ak*upR1<@$c@^%Rb=NfG zkxncJ4@!)63z1+cRLkI%rT(60_uh+|lm9T)+xzR?(fG*FhNQF4Vr#@!SErzAoK3J!&sd8pcZmkV>ZeiqoTnvaA%Zu&$}8iCjty_XIW=mtdL= z9A1j?DG@nkoy5clucH^TJ?~%V^6JXF)hLge))r^B;rz*M7*s=S=4NJoU=9?VC`MvZ znVA3mGIC|yk+W|jLF@dOL{qFQ(eYADP;78I+u7>*hKQJ6V?lhH@ zWV1&AhR?I$39w8a@OQve59XGPW)fj9)hQ=EjoH2b;8$YX8K4p4MrtpB@x8@rlDaE=@r5J^)TD``r1$~ zypF8|bq>2v?F(=ECcKwpvSd5it^a zOhnUMS{Rp8f3^uzMy!biA+w~nh1uS?5qdcEAP!^^>WVsXMwe)9`Hqv)P=$`*a@cow ze}5`ujgm+eyiG+5W1FFTVltR4*9qK3E`6=O-|f&Y3Rv2y0k}PIHhN$d8s=9x_aRD4 zzZeHUe}MA)^FEX7*BM7k(0D+J?XY0hsI%OIaq5^^qdOFKld$(-^{}p&xGm4?gu7+g z4K!}YK(hpO$!;u+n6V?!JTOoi$lbgH!#U$`u|Ls2F{+L*bHEh|FKg4-D&q7mYf;eN zy?cp+eCd@d6y@=#obDex)L6i+TdNR^SFT(8O4eft9(U>aYNB64i7fu|g%T=N zgXTrx?7%c2oy71|U>DfMYRLOJI0gm=ctEJ-64@5Dot=d%(H&43A4IgoE3#>avL)bA zA0IXJ>y_5?nCy-^`}{OY5qw&kWMo$C-vE+EIEjmW;F9U|FC_ecXfA5m77T=!CXe9> zAJT8{DM$W;7ao)FH{rEvI0v@?D;lga?>atur$J0Oz{(mQUW)A?PE(*SRY#p!!=RMF zh{OvMvZElZ&PGN?DTMO(^VcsA$QQ-+^~abvxad)eUZE=yhwsrG-=pYR;e4L3!`ND! z*yA~N>|RU^D`efDXt9_o5J$gkPiF7ozU)~kep6k<$%6%cL)PHvpaAWzjlq3~D@@e1%j6n2HJ#4y)XiG5cbX4_Ce zf;sCEfvdBHSW%DUT@^MqTiliXldt0C1d@ef=UK9X(!6OPv=C-XV)_8CN?0gicZYL` z`u4skl=xSfnc}cte|@EU4tFaB7zyp7Scl@L zYhgh^n%V^A&8T5Oh+=4M6a#%K!OLsUxD%Y21=X_(Q}>5d$^m?cOlWGmh^~WVhCD_A zzYXE(gv9`#Q$U^A@~99j~iIc79>DD+nC7|A4w+)%9sR5nBKnHz)h3;ShtTb-ku$i(Et1 z?Hc|_Ot?`#iS_~l^ASXQ1eQ(MLx>Zv?Dzx)cyNhE54aKq$s}^g=()pqHx6Gaxr*Lh zjmEnke3)?mqgZaEruHBJf!i`8rg=Pqg7*=Wgz`^}!-)K8$x4=`GsN!8KR>&!y3QB? zk1aQxhuAx-5C6zH`{(WhOX*>hNlt^-wj_XG%dfJ*6XP^r7i~7CtgSoz&WBD^$B8LD zBr27yX)yt&goJ1%BwBymMdj;dSzIdHi?`jreNl93NcciRU+bQchBX(DvhY11Z;Xq3 zEADf3vTT=GgQWN+UgWm*KX~x1%<7ZXdHS8zVySD&c*zn!XJH@*1%HNe23#-1#*$!qlEF~w{zf9~)%#8XXlc|m4Dh>_~ z1L>cSoRD2ZGOJocCHydb@w3j7wOf~bc^rOzg%VH7AqIYXqi7Mq2L5NT$s~PZt}y8q$qR6 zxV0qGTSJh%J)a*PmT@pc-~Dr4oIqnhTfN{gP^&2S#fsK_sweiDg>;kahwYLdhTaTE zbn=r(=8< zJURMObn(!yG;i+0X6cE63M7%#{)6pnICto2GUB8%{>2|+Y>?e>({Rnvg=76hQPj~Uo2gZPPN)p z<#aza?SS-H*}LGj(8)BKnd)-55`)IL_;{(Np57P!ek^{+$*di#AD(q_aas7WLDaJd zVE2%}j@3tMc_pRbP9+j)_Bng?S5*tF3_ClL)d%Ad46zLi3=nf1(8_4!gh$2lXS<(K zMl>L8K;h(Jc{r&mzbfj=;^(3TnG0x@&$0@pnmM-~|KZ*UN={79s!Xvh(Oih#|T!I;VesV?(M@gVR=Y^GC^3QX9=2zwLY!EWc{$M8NqE81!}c z3buJ70NAcoMTC!qq0ABP!52A=8mma8_~0yi+&0OYIO7Q@d)KGx&96tAyAG{7z5B4* zt9`q<)V4tjaeH0z8-4gfgs^(Rj?(W1H5 zjqi5J4C_dZemiB4Gvj6%VCyj*WG4;QTa_~GSza1mZfoWxk(z})r15vov6yKTj)xC_ zfC$;yzBJgbadInZSC}ND!vTwe$@=5i{TCS-8D*WpAt4{j*dpndXG%pos@#@rFgS=> zr?~oI%GlUg&QM-|M_MVPX}t>rDXM^7`oN9{^;_{Qr>9OWFN_mQ;_1nLr5o%Vz<87`z7E||WIIXV|$922(Jiy(9; z>L6w(plmX|8Ok&Dp+CU~E>9;(ZzX06i6QeP=@2zFb&T1x)!NyEb;H&eXJ0L4xZxAP zB3bhMJ|nGRgu}IgoKC;whg(VeL{~zc*gX;{y|Ui&&%bcz_5b%@$gZsN%I_Z9tyGVd zf4e8Gl!8BhqaVJKlq=ut>)*wJ$N%%C{_@hMzyJOuw6g9i-~R8sglcp1Dw4)~Slv6Z zORcfy7}h~d3009ssapAZ(gL}VOFdoxSyrmsVn6Sdx9%#^wLBiur{7F;1<94H+oScB zh>Vr5sE^+fE>>`@XWRQ6$Z}ot&(BHe|I?M=G#@09l67%iDf1hxR+2t@dCAl@8A)DV zUigHQsbl6i|LBF5nyo;7r2J`|^FyvV2r}}n&L|S-Llnwm;0v+CsoNs6lPeC3Qg^hr z%8cnSS5>u+dCyC^9?f1*^0YCfnhx|Vb{@*&`}=LsS?9Ku@8WE1M9VC@A4O7FSq!nx z4x$wM4g(>#WW>x}$Ul53Zf%B4{1TPz2hZ(RU(amFJp1%fCa#Xp3Hf}?d;|S;;v92g z$d1gUvk^MXmC0oC{$m!cjYg4ZB|NFiB(4uV=A1U46gX^{PEOMJDk>{eqanXPW)2dFi+MfrY2o-2FA0f>LERJLL@$EA)Wt6U zne%Ua2?xr zK%+DRUqZ`%T?!@D7pFtbzGY?h9%_H0>B{jTx2~>^^~-N>T=_*x$`Q#28kdc!Zt61SHa@a}UJ!!|X+ehbr%< z62p(0197Yo8j~H2Rzk?*9e}d_K-l$u$~^zn!LBE88bRpgBm-q}c7_HAi-EXg8FL;v zQdyp9{iStG5lM$LjmEO^b6v0hM@c<6dO7g?0WzR+wGC2pFF}`a#=Qif=ZZ|u?x;US zcAq~!_T+;klS}PNF&op!6PLsdi_CTf#U&(o!FSH7Vsh}GBJ8mL+x{3Be<1>$!-pOk zOk8usYSz}*TYOW|(0DrC9_7cA?X2u+BXeMfyrSYaqsZjt#qPxa$=#*fiN|0e&L7y( za>@;om^{3aE^`xQ{iV+{|7j+l)}VnPtckYxaggN>jzNszrsUb#@j*Y_tEY-l=vOX=!P4Z0x~= zganv0_j7P^(s5~NU}J2dmf1Jz-q#X4a(;GRXQdsTJ_$HToa>-u9EKc+&v4?#Dae6m z1=vv>xWQr#Fa%IDEJ`s>TPwGBkY|41puD5@A{ zVTz3SU4_-t|9Y)y@0Vc=dJe6;EFJ%fF>43$^b6Xx{-0PdSHjkp3l`zyGRRO;38YVo zayf(rz!_}TOiMJYzP>&UW_j0tit<+p^QLrGx^&L!*)?o*h z{|Ot+0jN2s_w13xT%9u-CCez%%iH@!&hgw2C0^1`{=K2Ph6c7wJM1-zjRwraq|@`r zhF!2UpEr@4eCk{BPjQ5npD}*~WYb#;7bIy&BnTEz6WFusazevZiV!~3d-lB$^(_an z3MA4W1ha2Cf43>k|GT~=t$C7oLrVCqya9EZMZT&vT2`Si~_|CZ5_o||P_?sOwc%2jwJcj|#wGHS4Ahu{ zUrbyEP1<{((a}ij`nz?b{W{A+xWUdh?TZ$|6JO7@OrSiB5*P|2Ee2?c*TWq9;+s6F zRxWYqzjqv?JhA=Tin(A-q(yxi*6kiGY@^r_}mABx# z)-Q+^IM$V%-R6ZO-zWPU;**mvCdU1Nl^R|I@Wih@_FVqdl*#Bi^D{0rwW?`y<&TZp zSE4LqJE$PM$Ub4(mhd%dr$2R#dUe}55DQxBz?bSVyc><)sm5#0-_3N>5A&8zr` z20?>%s6nMT_Vu*$?%zLRSb4X@N$Kf)l_z?_9z$n4HW;d9E#(YC?yIxdr-~Ap{w0kd zZlT*n$8o$z5;aMI5zp-mKUQAO@7QOw!mgi~?|)#vPapW^G`Nk#^Bs{-MBQBBCKrTe z$cQ6qo&*7booS$8x-AXH5OHYU8YesKmC-Z6fQZj1OvCgmE-sFEB?=}3@iBj-Uy#6@0$Nsz1aDf%h#R=YYhU9pWqcC@_ zFR^n^(Tw=fK=VYr4iwm*;K86shY3mv6SOD6h@cwl0TUm#PrgSSsCi?f0CnT5&@PTl z8;Bd;nijdNjLswPh>uRVvj`@<8&pb5%esu!>c_1O-8{OTP#JdvXSeI&x}zQ5+$Fe^ z?C&<1-0s2W?s#tI&gUudXNt@;Bi0{;jT2-sW=p7v#!we-ToOHp4Ie_=i#!M(^T``3I`u!0a#{dGU;YzMOT z`!&;kf*UUlL{2vuM$S~;DBNinW+gF@@l7^)`*xDMic+18N5RrQ5CYA8dh7E9gT0IoRNP%PGt=o`iaF3#6gc1Ahs4EzMM?;L=lHK+#g3>u zTTQ0!U(n%)e}3;td$Ta>@8ttCwAX!YS5D}&LxQ&iLnIjKsYGU1}4B+dzD6$8`qMaD` z`ZIy>|6gpq1z6ST_C3yo6FBG?sFYZMfPhMuI0gs^NJ|K#D4l``QtFIJDblIZEgcdn z0ty0>2M(nmB?2Pd|Med5-ur!if1c;wxz5FNKJmVLuf5jV`^A)}7x`abtv5n;OJ)0= z?mDYlLemB->}wwcul%0-yhIyhit>PxUHQYWtbZbC)*LGwk(}wU@0F98SA7>Qp4Daq zK0)sgw9i=(P)M6k*EO8fx33Yl>$%5O0l?-zUVxqHix~Aps|-~k#6-6uYcqv3Ad0sl#*?fl$2bD^}6qaD>v3i$X*zIUWs)rvoM3) zU0x&F%?i(gyZ)7CO}qJ__)5g~NL6bRa*n0}7MHVK?brm|5T< zTYEcKlFg<7%tye|KwGy{i$Y$JS(&Sg z#(p1v6tx)hRtM~S!k>CqoReZm#kTE z92Ku_t?xx(@Fd(L)Y1D+eF54%clY|7l88sOp)5I)J!1Wq@&FG1N}$ld%u_=N(LVQ) zwkj*xJy-=wW-mx#rDniz0JYLgAH<-lez>b1S=c=`9t(PpGVwsRgIe;$3q9OBarm5) z{cx^LdlrT~#Yy)|juka>E~ov9M;!^Io9&@iTpFHckygM-_W!oi8|aSe#hgiG!yqkX zeGFlc9|5!FLaZd5N}*d}U~la|i#*f=1mS}Oj9kwvST~ZB;12cqo|vaSX3kx z>H6($KFCv}yiP|&2^%ohH_%5P21J0S$NMOcvfY7(FMyRChg3%kJ++c!USqBUk{M+iBxA0mMlF8g8n5C_ zzvwKB$Bt5MIq{l1KAhB7W>JO)20L-*dQ}%|2gXWq5|+I(izXWs$3bIr=0w@oinm*?Yj|MfBhERByN{XPcw}~$bxy=}+C%*3h?XL;7qnRq z!JG3}8ak)>dZN}X6O=+-VkEq0o0^u^Hu8~003n3vm0c(quV7)adB{L_boop|lX48t zKG1F2i*+k=GJ?zl$ZQHaFZ`;H#oo?!tk!^*LlB1i2%>w9saYF|Y20}_iY8M}>xPlB zT*q9x70o?9C&rTb?@)kuvwOekUUn5#BC%=|0eV`-;YZXfafV6R*$ zpEqc10JyRniVdp3I0;gGAA-*RAi_aQVRV) z$6_5n5GoXXJ6OF40!qwd!A3s!XhrQnuUZPB(5t4Q7sp(2M~Ofpq5O!Fn?#n~qgB;rSngcg#JmS)}H1ROR<>Jlsu!C{K{`0Fi#N4Opxi-kR@ zf-kRQGv+1S19=6hU%A6|qK4Eq;g%K%mf7rNg%H;DWiLG6B$D?ZB+vaRo;%3~YI@i$ zy#(|$IDvy2?-TG4Pn6btsjNrA^f&*J^75gj_(Nb=VB1hvTL4&Z`E)w5)(wvdBuHHS z1d22x%xco9%Y>~Fo~mn)Du1TiFH~?=i9|#niO&gMb=3$_yJ5!ieWY@v?G7^EQBQ6N z6@X?%^+#Z`s8wZ#up|FOO%iRc?_zQhk<(x9iEvEjBebpM1SyxK8TfDc6=jK9H*1?U`1KMxw+sz?(rLsLKXZ$unc;5#D zxtbQ8itY>T-NsAI+s`?u66y_AVOz|E3pm+5;uy8N$ya*%EZI9JD|kP3E817vEQ`Dq zAdH~1wO-Dr;){3K9A_;rO%n3%wM_Q}prmDnMT`Z;35k~)rv-!d{ZwEzH76dYtGY6Q zywDNjavYC5x)Qx2txspdQ|(bYm}eVeIX_B&UOeLr#wP1BJKv{ndHZUQTVi#`!W(G} zB)*TahgC2{T}i3NWSxTEN+5W;dxWLnZ96<(UN_l(Sg({ZpJd5PnjZi$8&d3$@do@y z7_4Gjwn>AS9S5Z6$bs2uJjzYd%0;avufW&p#B21~G!(W>`-o0TUE0&UV{TIFC%TJ@ zfci!7c$&?0UkWWs6Qdoh+Y8WZ_3aXlvg!_DVf||8TZn4eLY(|2}F!oj`ap~210WUNo#tK&e+^O*^wQtt5Ak0Fdm5Z-c(tw1X z4$1JaE&Cw63%j_29GN00FM9b`cGs^aD;;PdFt%X|=jSC^+DZwGrxf&AhMnwUwto{b z{VI^$8z%C;@DO4w#}JCLDn~(fsOfQb@3-LtE*a}V?3Xw1w#w`5K?$Si5}rHV8dvow z^}x`lAL#a9gs+qgqmSwI08U{@QwX(!26Fr#kH$+1w32)CPPfT=+0t;A*^hSy4uYdB zKm>l#+|(3fDZpp7d_kASR)P$%p3ZNZgtxJhhK8mwm?$53TP7&;{lY+zQ`GugbegtEYXlWGt%;sJl96LqfbIbtaKsu#C5Ll z8qO)m@?JGQu9%vTjX>+~p$>Q{gsjI&=s!|51Cg>YOd}KMb=a0Mh@bui#jdc2;eKj1 z=<+yAn|oHz)x7K9Pw6(IJY+|>IO~d?B41f6F`SYQ_d=+UHMw`TI&$wql}KP&BGXzR zWR-P~I05VU5@B?hQk#olSUH?tTB6jx#(<^zCtPCuwg?@T*f?N-7orY;An}48@PCvp zvAkSIfw}IL1rL*^6}Yy2VJ#D(a<$j#LE>7Zcr0mqdSTAiikJ3Xp4Z*g&{j*ca~9-9 zw)RZqB56QS)k_=WfQB~vWhtbm$HRS$cyMtROWro7(%lGV8E`&YQGwbz_V7C8iL7cV z8us%~>*_Ml<6B>XglFDR`~+UV`d&iMo06fqgaSPPCmk_QAY6Kax7-6ef9IexOoTqD z7^TP_&Q5QBFw*%C)PhhqcD~o$Z*h4m7q7{@mAf_HaWYu11d>}pkYzV^kc{4-(Qr4Z zLkMaMWT5^$m%X{N|fp?fFyC zk@7})YfHgw@ETt%hrwNIm6In=s_7x?P&>wK)njzmC78;fvwPs|n>w26 z9I0n?S-6s*Gq{-|9aqp;QK?-z-#oHh6EZT8%Hf#-%+c#*&-iUDwtz9xHOgqW3{6IN zw)QrAE1ss4#feo9rH+TEihAcKkaLigNI3yJ>a&^*Fk-)GGu3e+^_W{&L?pRC({AQ*Hxr4wfz3jWXf{ErF!j{(kl2bjs^G@Jwr~K6U zzn?5Bhw7a-|1AA9b^oVaJYG$+yC|^st&AsoW);lMvdCv z?`U6J=&&cW&oj`O1`&$JYu?bI{-hGWmyJ9Kb5Gbb%i($rm2Lsuptoxi-Fq!fEv^2k z``TM`fwfANTz_loa?LoK$uW}KZar?ZGHqiA@=^{MHp`I>slq2t+w8%1C=pSaZcyE7 znDd@YuoN1kr6Rj;ke+<+1kLP`4;w1lanK@pZ}RT0Cc@)JmSY)KiePf+Rk4OTP-vLV zj3FjBXl13wVr`UbrP4SXAtDcvg5nU4Hz0hFzGK^^`~LXqO$d3`n3st;)|D~S8hTGI zJ$*8Pb9rWrz1ugV$$*h8x*|YZ`AUL{3Dux$Dg0Pt!fMn=4>TBJy2`L_yW}!fsPIBN ze`0^*wn!7Y>-sL>fc>-@E#JX=G$Jx(H5SODp$lV{rx(IewhH#39qy_!#3Ygl+MiC* z%JRZ@0#V}wL@Hv?k{_vA+U9V4U?ZDEwob1I1)!$)S=k0p0A~(1NyN`yVmGRKl^RC{ z-{nUQU1%)HR|jIvLNTr``;8db z2Ze$lh)+j3w+R@qmV%KY-hcG|y(Xlqo+J=~_+wNaM0oL|V)J*V9O`!J^^VCs=h(&p z=C3owF3bqiitLcMD#3&VI9Q^u4E2r*@g8~_2sRr%M}16m@JE%W3A!efG$@rCmo)6; zMnZN8)`FBZHE^41CiM_?snUz7@k6&sY9FXPZ`7tjF5#dsbKh($17WghQ%+6}jat6D zY43$^pWf2A$ph-(UP*D8XoV(|3}_9UzH^{UVy;B!>tKdA$u&wk{`LqVmB>I$B*u*o ziwF&9_^K4DMc_!Uu^lx2gaL(sV}~6UM3A9-!O5%>*`xLhbnltJxe3SKy-SGGh^t*~ zdyIsyGOB_u@E{Nb363g5A}equNXLyApd{FV%C7)_vK{Q9Vl+hu_fPaMJDC3mOpUP& zps8~Hl z2(FSJfn~`sOv*UPek0%n(FrDtknF`^ugHvyC5#F>zBzq=r+Z+7Sj|S5z{b&TWGk_e z?8eOCgrSmgZ=2WThQ0&@&;&6CQsxml00Y8}0IO*$Va8)+hP)Z6=~kl*ELPEL%a}}f zcsUa?=-hD>fzPn=DhZ~i3eG+2n}AVI=H#A-t#PS1$%K^aoZb{xFvNCEs&eHhuCSj$ zgpI@4No46P$0c0z>^!A3vgwHPw@(Sl$<u+><8}(g@8%iiB_w)OO$|DnP(LnBIZ)UUlIZ z1k*pE8&?uPDJo$*bbN|ZXBrd*yz{!Q@ru3#9OA~?dHwp{mPgd(Z$YK6!Rs7m=7Q-F z#AkcVG{M#c-+Xda!l7gpVj$sJI&NEIq&Ug5DFdgbTGIf0b~=B0=v6uIyE5w=lZ(h& z0d6mpJ)8EH5G#x%A+z%bVj2AkW5~MljW)^31NOd;HfwhpRFWW5n>hdr_|{NI1Uu z;n&xOEAx~=bZ5#Mi8KS$6KPC-gvP0Z+Z?eYR!#)Yt7;37i6Sy*_v5&$!q++`5dlr^ zB+}vH!yE%qI^~0@dqlIm^g%I41hBP!@GX=Zy zVe~Y2ei(-yScxY0$g&goYd1mRkO}#AP)7IVtbE+)amuAH3Kt<-0uL=$&PEVN%3>e? zH8we|jk-77_SNq+0o(|<&SP=J#={e<{L=vyfGU01ZRJN`KR-R^6q^ZjG&`MF$|fu< z+@6hgl*)~e9lgFS4$8^g2S$VkMqPbN_wsa}5!4-!Y{g@40)2N>Lbm1pfSYNze$E%Y zOjcf?-^Feau@4=)FQ`X;2lueh^Fc(jjM$Snu%F<3HFy-?MBvUv$hINLG}la~ z*GupzzywhUM4U#Ue{LfBB9TdkS_yqrUS5#wEQunq7YkBP%>`q-dr&Sa74)db5p&Wi z>!<>bKOcFQP?D{2OT-E5fact^(&hR6d`e4E?U0+9<0G$`6V`pG)fe%B)Q5sqCAf`p z@<(D}&NcIZv%ClT{{? z=*~J4>9IWLRa=1gW`q&Hir4;{f<2v+m?%gI+(R-lNrc}8Dk4-uSPR#X+O`S(i^2Z9 z!m+*gdDHF^+8yZ$&k}{w1>7;IiN#=WxB$xHE~+>ThR~71Ya^UiIZ}0mP!}v*f8vX6 zh|uyWnP|k=;0>cI=_~W;^6h*Bj|h(r60xDH#0lqr!8P!h4t&%}BxQm`hpO-0()fD8 zdX7tT)3&*ExX3n$e|jKWy6+nz9fw=m4+SBSS(`b|r>$*h(P?)`KVGyhLzh zD%b71x^Si5m?mZumjDQYP^k*U zZ6g2!CH@$04T9mw-7r|E2Ko?L7qSpL5s9)giQ{0LtSI+|5z41SME)oDUaJj_*whLW zu^e0hYRqP2`h$%wKqjfa@U-L2#f3cV=SzovNBA`$erfNWhG@6;@x%6BPai-{#3bW# zoGo(!#bDiFQG_Fv8yyZMq(~=DMID8pZt@yn{&jTiW$Au1SOiPOY+IfCHd0k#czEuq zK>Ro9!eG_bw>#+{6cq1ffG9yWxyg`0*?tR#}9P7wp%W>_;>>#8Mut(I6=wj#oz^BLW!fjAv(sL>@lRW za-t1^wbjj9?~grFY#b4FYG3FTcYfN#s+3tilvemTDIZd@5whJlah$lhEr~3l)qV%D z3$w!HOfy_qaKzolwO0y2ZODgE)C+zD@~YDw^8N4}QsWHKJwhBOt9=phx3uE>^rXn0 z5zsG4-Rz8q?iuYP!Q*-FGS?%(NH@8{;e7b)#h0mKuQv(Au{tOEke zNu8idU_O5BfBY)Q`@!`|iohQ+$g>95hGL0|a@as=2&_z9Tem}7ASg5<>p^x#F{*PK z^!e7pk<{QOV4Br;v6Uyo8(%4lAr*R(vVZXi2-FS!6J^PRD?yhP;vTFOL8tchJe1pc z4+}vG*gSlE4(HGkw}5{s%oln=F_<@f;As)2thOQa) zN38nRzrbIoZ8X^70cOlA0vqx*&Qfc*n*ICAgaE(MMbR$|@32vzTK5;*YG{asZ;6CmNotlMt zL>p6rWoBP)yzEbpn^9f8nHoNgLa2B~V2Dhg2w5q{@$!H-zp1Z74-QiYw@UnUv(RRk zz-?2lS3H&|9^S+(@hbsl95k23^TzOFu_RmoOzR$0YWI_W(m>?t|H+d8?r_E;7cypG zRtlb|EYT*2+Dqz;1_=)oYwhRkU_M!lAx>XYZDQ#{Y5#UGe60}ZAsiB_y^GvB?FV65 zA?8)&k?i>>Kq5OtsY>k3kiLt!af>$>T?X%Zq=mzm(fw(73i2QMszI=2k1AUuiFWS} z?arcVn}^`+Q>*F|KS~S?XRn_w}U0rcFSp#K@Sv zfLREF5LOt$gS(&^<^U(wr|xlBAY^4~xYbA&A(}E%>Lhh59$~Mu@Ia*n2i^6RRa+9K ztR-X<$S^hg$_@AJ8Yt?wL2p+hhlgtZJl1?fk-QyQD z&nPwEG<^WlQc(FmD{b}C;za<4*C02y0wMB+qng>Tff((L@8Boyu0e!bi%JB~YFceH zQbAgtpz0|+_i*9UnE$L@O8sOX4=g~8X}W~9J!48dmD>%R&J&H7==Is2Rse>x@x=f4 zUX5t0j@=}RBS&Qg|3YW#i8sCtH#@RCQg9{_V{kIicF7sB!oD)jZU;di#}+rU%MhH= z2{f=rV{g=>I~9io9mRB|eTd^xVxJxyzW{*?2p;b4ALvZc$ano_1`| z<#}Y)jqx>q5|72U#_V$>mH<-HtN^H7nW9!O)2afEGDg7EI;S8+jx++lGnzzP(em_l zL4{Nay|lBZSC(eJf}bkaY#1zFi>E(;fq#9FM(EQg1p$HcgA8L z=<@1!uGggRgm}sy)q3Fb^u$)prgOC3nfLs}5Q%=a5XY72!jbj?HwZmGU`a1#U+&Xd zGepkrS=~1WVb~;1bk9qV#d=_Fi$)PJH33v!wQHu|7u#3g_pQ^pZo_!oL`L>B`=$s= zq66&3c(UOV&xk!qMPBrTRKT03wGLc&+zpX7eIX2xV-DWd+ODyEq=%Q%7 zBKw_eO6H77L&C^1eSjJ-;yvMu$scIHHB0M1JNmNvVtXEe1r0$Zh{|(T@THi|xWT`Z z8H`X$+?~;6x9@if*~&w5IzV7%FlXr{><_2$9%32a)=2xn2P(9cyN>VSsf!v3_|yvg z&elyt9zFn6fS+C6v7ijGH!_(N1W}KjJn|PI>^?guj&*+3~A$Cx}#W=KWzE zr9^@zB?ccKh~xevBqeDQ3;iO2MF0C+-2QDKjmX>{ozv<&4s&aSB78x-yhIWO`Ndfx+1)M-z_7u+6@dq+Y+7W|9;#v z5GNOC_rWe=d3IalRv)x{ybdavjLlvs#WMNNd!uEgttkY|HF~97<6XdMiDol~|8u(=S8td1QEGQef`7q3 z8zlCRlwc=Y(=Z(%=Gre*x7f4=AaxS=8o1`Q3wfMMYrf$lW<@|j3`Zq@&FU|p5F(b2 zEa$pc>%%%k1PEgLLYnj|KS3^#F8dM*8sBqc_U;hN1ynE>-#j?L!L1LEtPk2A;A~J% zUO}ZAx7t+lm@SJmE1h|OcT2@fj3(sNY4u=&1!2cBq%K9l6-D|J2t2_L^)PM!{-q0$ zN_Cq7yLW(-+cLy*h4e8HZ^PPKe;-KOz4U6hR%jPB7yMq4=3}pU!U6%31;ws*E|H7I z!@cSMw#7zE!@Q8#SqXQSy^s#}1%Wm2``u}-{^G^qypH_>0=`JPq$69hD2c~rWyMWx z*S_6N@56pRxasFT|6cg(w+%P$)oo zJ3Aend*! z&llm~I0+hDge=&|i~X&65CnLnq&g~uZhVCI;1OK+9z$r|z5O}Qvh67>NES!~B3!f( zhtG0akIS9)#!wTMGz=flAzS^ckf0C#{c=qzt%p| zFDxt>xt%G^M2^Fvyu92D6jt1*Gqeb+|9&Xv+K2KQ`?x)d2@c*7=J#_N+>H$yOK^W= zV_a5P1Gzx*Q?$+-V3Ce)@qUO=H%1G@;z%u)#-HOrE1BZG+#ZGqM&e>?@PFP2gDI_9 z?1T2ZFA1+RY^I&Tnw)MXMF57ter zozc*Gc&bhulYwD3%>M6Hs;^z8=sVU098}DE>&~6_;9vZZ?Cex7OBt**hNv2;k2S{l44|5RB8_AmwySsH;~rv3b%&%77i-NB0y zU!t83k3P<0DlACk_W!$TOh9>>g3Xpb%{+Hc{Ub6>!13ly6EAt7e}{oLpEtM6C< zeHauCJi8Gqg_}v_02G|eii@zKUi^Q5c|bfuxfoUd?O_}eb1CWkFD<{()2m@3_s4li zw0N9rSN-Apr8onGG=sJLgAyiw^N$vcO8w`f?rP}4uf8ZmNy zA{&eIwj-onS}OkYyspxZJJ8WRQ@}}dAE_8M)J~8{ej{9fQ(%}`(rg-H?qTxdd80iV zm8YZCaIzSVTx`af(JWiOzs?TwI^Cl|2}Pp*qLca?h6ElyK4E(EJZHke#btqFocjD~It~j=$CykW85zTM>(=ocIG}+6&^SS8 z>!wXlU>{CEJTk|a4~$mCD~iW75MlUt8hvkeJAul?h~z|tbeIa1(PeSfW*1hD`Pzdp zfl4ui$!v%8$85!fa3llEmX8+@Sum02F{UihE-9;q7L->sbaj)^raB1fz8<>c6(n=d zE_HqVl%Adoef|BPA<_i2fNxbr-zNpI_e$p#3iqBpuNpc~aW=zBqt-WtN<$e_3=-=* z0P0%+3Cx32o__f7_eoh<;1~ta4w?=Q*(f{Wa8zk|Wo0r_EdB2pE2;Su0~aMMn&e4p z4#hx`1i7y~YwJ%3kgFNq`wRK*z%@9PAj0j&-@mOsNH^thu_r)HpCOQtN#J}@9*|%F zUfRgkT$lH5VUiE!K?)8%ekpaCEa5uuf~NWX3*2V9~F<}t>e zAqqxj#>x-n(XU@GjG;Z};08w{Un5vL(oNJ(nPNog(}-_xPSq1-z?fG|ss8G)4`1XP zy}FB4B(6;+fYZ5$AXJa0$ZeoDk;(jDd)qXwMQ#Y&Im}9aa9Qwl7IQ~ zr3mLuRak;FK;1D=>=y~tKU08iEol&r7=8Kx2C9K?t{d)@^@)=e3nl9~S}sbe?dQU< zNXQU~LUd?poIN`@gf;@Yott`w@DDn=zqRD$@0Bb~>y=I6`~{L(z3=^fyX@l`aC!{v zoq1-BoME(WRWg92U5H?x<1nOFHuLYl|0bZ>0(5H-tkh&;VIo)}Os0y&@hps(WOVc9 zj}hYbvLtkZ-;9AFZ-~s*f>NK3H_2j9z5OZ!Ui#tY6sY)G(O1aCvQBvDbu%yCyLq!! z9oP2rwl(Myj*lL~OSwIak4wYY7lcCN5HpPnas;S+IEGwN2)7N!2{0d@f@iY@I+w6z z>p}eI8I_7`i44GtBhzsa#UFGpU(O`+l3@lugX!rBcJ4OVTL-+^WxCG5Jer8Z*$ESh zv1G{a>Y%LVLA6hz)#cpeGMVU);GP5vmFjll_?ab_IO~mLR?2cPmkOkCCMgo0HKO!a zYVJmHCc^QT61EddT4#ZMymHi$RM4btv`GGy0b&`mpt08z&RE2aVwCZP5J3*;JV(nL zd9av}a+0{`LNRO(^EYhXc9h^qZ(Vp;9-he@ z7ZA+#8G`iBTmN4?_3TmO5JF1m$9a5&8G&D%$CS{PR->^5{>7P%L{WM81s?;tX;~?m znkE=H_c2O?2g+sT+lDL(a@zum?L276DexNl+1y+Y$Q*MFG;0LgFh#CJNBhi~$7t~w zMycv(B!Q2t>-nIEf6yK28;J5~K{#iiz~QfhHH&C`kHk`JsQ<}FFGLBLC4E&n!Wd57 zfQK1R@^`Kf_fiXjN&?d2QZM_;84Rl)8J@e3Lquvq1mzH{({e|_<3DH|a!?1QL09*E z>teQ*sQ$36m;?9-M29r6F7Y3!w0uTT&{ub~4;Bw*w2*H@t2~)KEE+4pB_?(ji{%+6 zP@Y~29~;AwXjAZ~@d^oLSB2tmtzfF~4umAiTAGayp8Lt#)wKwN(~#Wr_w3&N(w2`F z5`S}m0uzkUhX#F9h`fBd*>5HfRcjT3h(Zgcgi^Rzy%AH95+cx*G6qo%y|OV$RLu{* zCk#x0;oiHq%+~F~g{R(TA9w_#vb(ZOd=X~P)AIKVmrEBfnvQl9G`En+%^+)S)t@Fc zr=8P7S(gT3b7W}0K`*X6eR>{S@>3iMYmsuRs5L4BL(uyM23XQyMSP5pPXf9OP8v|J zz%Tu#0oQFfM%*M9?L?9T72M%{j~}NxUyJnlAdLR~q+<8aP28fS&i^X4wrRbP*voPd zR0w-%b^0f5?8Y;g!78e+Li@@e>yZ?u&`6`DHv!@hkF!bX-rrg{6Dfy+KKc%Sypk6a zYfw%Qy44?)X&iBevzA5TZXm*J{)5s$fX(%zlPH_fo}W@RjM}*c`L7e)Ari9!AC}o5Ikd>_ZGG7vfZhFdma62X8YxGPD!PBQPs?jn0=cFP&AHz8@w+#&)N!4+5S3zrCDXIv2_03JN z<`j@lGjrcVQ5aNCgJ@1WSJ8Zt0b1@A6crgL8(GEPAC$_I#<=1gONnyz?G-~@}*|R;U$uE z%c712>9kX>lti?z*DwnEwgr^nbRZm-MyJwO#}YkO?kgz_@agRF-mzPA;)y}t;fZUQ zqd?fZwTD%Pitp^m6jn$Qco=Jip9B#j3C=6VSg__6lr+cDA7D=lG-EG(XoXsl0p?@<|Vq&coLR~g32Zk=NY;;=~DL5A}T2Lt+lGKQC)ap|(C`05*UadBr?tp^8;zL`V zo%&`CoU=iUO%irJ|AG?9#xzB@Z*RG7`{cTVo)f|_WYHKb|F8UOOUPVYT%20$lJ{{Q z=dIxOWa8DYO=%kC*!MfhMXLeqHo@fTS+dE#3qXi$s~4Qg@%}+v0f7p0bK4Dg1%i$( zeh{dV3bWzi3t;uJH@wk<1>J05(~=T`;?xI|SwHXGQo0YgHN;>qAS0St3kiH{oWV<< z{Yhqa3YSB7U1kBBr_Vv+`&;c2;8mnPr<@(xC=>3om-lc(%cy*2?so>PNK^ z$F}ZCEV-Ly^K}(A>)xc_Wr;VA$=dR-CAE^Lvmz=A$&XDg=;%^CO zXJ$5^3ssI+2Yv{23kVFV!JFkebsCWl+JmNC2u|uUtzXyabJ59KgSc zE*OburO?ZgYxPJu;_y}9JRzQQX!au5?c+5c(k6Gk6t%3@_b{xb``j@VS}c!J$l+VE z{CGSM)~-7Mnj{CR1BzC+a-WY4mfg@P0aQv8g?n@SkJ*IVQEp4 zf$?@E#nLeRGXH@CDb!&YG{`pNI(%3SNyWUYr~rKeiSVN+0c5LV2V>92;UE_cXL8W) zR$yApXLx?-5T1_-(#Z=OIIGGVQH@+biJr{gNfB%7hC{_URU$2o_Ka!kA4ol?m*tXY z6Er`WA)=y$MbDC^BrmUukO+jkAE1G5IT0tFG#khuZG`zf=7cTcGQ19kP@}_e)6+aG z)i69g1`(&nbF7 z9)k9hdZ4b+`(U(+53-0ebYu#UvSU?)zO7isriHN)rrsal7*dEsYKGF1>m8pDAZmCtQkSRk?u% zn(Rtwq3uN!CaOH44g;KNDl7YhHN4P7Z*&aiZzdHTF{x!m1zbqTpX(+X#dZ7e{dD=N zIIx7g6ZILKprj_+Vfzm*SI&L8AiCSU3KzVO`^XUkG>0A12=nv1U=IrBN0rXPhM`8n zCVZQi5Xj%g#H2G)f3oBzLK14T%VJUyuZnR_Ndlt(F!X!PmYDc>`^iw>yFNZz0AxpC zs8L8C=<6GT6~6^W{Lb({@cfEhSMs)yOLG5+j+6$NR!(=?!*Z}t9>$-ho2SgfmpZqE zqi^Ds<)?=Af)a_P$~r%g4U7F*WZCYMCnFZx_6&+HjLXR?EPsvOUe_O{pjan7_-p9w z?5sIU02#Q>9N_u}SCnk2;THo0O+z}1-;*9a>;Z>0yOC_B2J6e>gi6W-jJj*vOFE~- zQ~qRUx5+0C&;O#9Is(>`i%ZO#c|-qCKO&0I7si~JWygX>OT?AZ*1b?evHKuT@49aappIv zT>zDDf5s_aLO6#mj3j%y$W1IP$tZ>`P`?Hk2;gLPOd=L`{&rE6>$uX1lP8g0QK77Y zFL5lduPnffBKkPh*@6UZ=pmDD)xFRpbfKNOkt*#dUzM;Tq$xDPMV>O_4 zl5<{A|7bfe5q<;al4_r}VjD9X-RR>q)wT?N*xtH9bR9Hdz_ z|MPbh`%2DJ_=iGFVtm+QYr;}PCcd73`+CSF_i$rEwgrVB#MZfkfjGMa+U6h}l)mH? zn1G-lJvM9>I$JUbYY^?vNxA*-^QeOc2;2N54(IYD6%)$k|9)o^MnXB@NSLyz8yyK6 zXLc!t?=P=V5GdNUH2ElJ!lgP*!Ixuc*8OF*G#fuV%=y}g?O zrp@Fu@Z~S~;A$+@e4dOx@_yh_tQ2}W6%=Av ztREQH1%9FKdV`IOapKLG`&KrEPEj&346R1YmqEV%9{7uCO7M%EyWNrcIJwhXGBfl?mJjW&+LI6z*OTndhE-u^HyV$}> zG1_k*4$kVd9U%f0jMzhPeQ36j$^uQg5D_TfE%^2ZcJ)oqblIN<7D}52s!Pbpn%{6!+G7>;56d*BALFZ3l^W|!@sYuuNR3MSC(`<#j9OtQ@n2dGTKXLN@IWc zDQ2cS$a0V=Neihx(z%}rL;2q}IA>*MYJh-+8lxj2fbaakk4hI-l?;5}wR+AcU@U>_ z)6`&>6+-kuUOtVJ{SwBh;Ht=)#FY3w=);rS-pR55Pq=Ql1q4(YBaXiL?ghZCkp|db zajIz&gnU_?NpX90&jGF+l4%42mHw*-0tMdU%J88*FQ;JU#4YN z66bWiSri40PpQc8ElsM|^q)nH>y_m`kkYSXegV1STCcaLe`u(ATR75cRc);n zb|qgJ$&t2s@bJ6AtqgL@zXUC&o-H=5&;G*HqBD41@XAHwfefQE#@UG@WMcy78e-Cz zDqaj0fqzs~I=af)q_1gUmBXi?hIl~oBP>l!wL`XI`p&2G!a#76NUJ`R-;lxxDhrh& zus}(Ly*`}D7F##>l;r&c!Z;O-aHG{QHfQ(oXtnFG%~3FdECF_#zp#+Dr`Ak#$9VB*5V%i&vx!Qax zXltI`yZ^#DPZ_%-4qFbAM+KLbkF^B#6s(WV);Tcrq@Ft&iU=5yL%4ouk$0-Lu zFkT<#U(0*IVX#K@xy8p<%Gh2 ze{)?P#4>r0s;aYr)W{#KOf~2a61G+Ratv~-r$YLj+qaV-UND2~0wEjw=FJ<0VeE%k z)Xr>2Tw81NA8g&aH3m-T>c&I(-UB93vavidFTbinXquXN@>+k0Cx!3qpYbX(-g8qP zrBi_gS4vh4l2W3o@5{z6F4|YVaef6C@>3EbMA&JN_p2y~qy~s&lNcJs4N-hA6OnsJ zeg>!31Yp9r^|jua(q=5~ns9M-?0TpZ6AqX=K*NXpkbH1_1KNJ#k$-E~kG5gUVkmPmdhqsxgP8u(WeO0jTk2lSVZQ{J#?KugnKc4#+5Kx<u|4Ibs(N@yWAlmU5BQ4|*&5G-myNu)S-u(>?QYXNdH6y37J{yb2 zCxnB^pp#cpYR0e}jq{5jO6p-GYX&%>ryM(eTo^~NFzl2%iwdU+ALRCOil}Coi{65P z4>o$%(QEn|sLcda6DTs{FWcK+LC9&(HHP{HG{F}#jOj`yvAr0bX6rl(VIJPZ%06d& zc?zCL3Ih3#w3$Am?rnU2EvbT6>-21{P`uRz5#iRhq3jhSpOB(xSLGO8IH_phTwx=rgqGd!ocbBoEH zs!+c)j9yyr_>W%<{29;r9wlR}y88JPn6|@Jp>8ZTpa{}Dd)73+OPeKtetm4^&g8b@ zlP4==?y)j)b8u+7Ngp_U|K3ALTRMR&)4m?3X1WCmTpDYzftD~Lh5~z@i(70*9-kHp3Sups$Pvto-@&=W)W3 zHr^a6+b57lxJ5*?kn6Mn{+pkkT(4)J2kBKgTCX9rsno-xx}TqqPt)Cfd7TjoetK9^ z^=u%J<~SU&xdsyTgU9T>Jx5^<)Im#g!og)ocl$*|THdolCclQpE(gFlgM*Pc$d9O+ zb=He#uiyb@SKq&?Q}h~oPr$>6s^_I(v{TW=4V4n_3tBxqMOs{vhZo zfVd^*a4J-yS=s{q)8!V0SM#ikgADu>6jQ_M5+FzvLqiL6y)P;)-Ffo_zKr%Gh|o!g zD;?dLj^ z5YM{n*mHwW^cXA9&7~7P2ZWUbAys3CAsSh{``0@V?2mIuZ;gWoaoU9idVMJ~D~oq& zE}I7^IOmYJbgt#YE|)rK3#QdlBKF2lsd`tbLO`O0bMHut0TDG(v}9G-qY{Od@a`2U zQ^?PC&nK$fbO3ruug*F-IeB+~{eAuV^oZU!f!#?Xq z;$fiN{`cSfCa<2~mE$KXWeQDFe_@EJkM^eEP)_+EL+ctU6H~)Ll%AlrQinsMl7g~w z3p`Iah?oGc@{WMVCs~vKsA$hP2 zkvxp2Ap$&$LP>#e*EE=aL1lh$@6f_nXI4w+RmA{HN8Q*8?^s6O7`dI| zlur%@Ww#r)sGKquoeGzj(l-i>hrI`$D^+YhxFkA>4eWDw5HuZ@Mp9>!A9vo@jX(Td zisK3BjnKVsXI6{KUuy?W=krGe9*?bCD0FpK2-w!}fTAoTN`?(eQVI9Pd~*61#1moD z_eb$=Ckx{e-n~2BPD%LEH~~^FadO8IL(KXKQK&q2Y_V6bL`Eh`=7`>{fM{5d z9VxKrkruZ&-sU>8Ag?srJM6d<1PuP%u~ZzBpFd0KRru#-t=ni5+;HyynmKcr6a@wa zEtJ_nuQiWn4bc?VoVJbj+#0u5O^N z&d~rdHh%Bf+9*R&T%vPh7U*OiVc}+5H^?9iZc$$Y$2cIUYwGGg)oVey6+b;z*Rs5n zRyWlx-Er?;&~UXtJ4?yTL%Hyzb1vTI&4(!mFHuT^@LGlRpM&!z+4I{UU6U)~$#WA~ z5d(bPDk-1p(pkuJoNKGi`sN}JOyu6lRE$E}uXd>h$FSCA3VZSF-*3ARI{GSWj?=?E zcVcmzX=yy9wztjok&H~c$3*48WTlCOFUYy&MazM?UcpdjGUVEj#lLn%SxZgrDUQ|9 z%M5|swn0VipjUMFVh2%UM(8b@lL8bc;NQq>7>84!P{?K%EY>!Y=+)BRK@=+14MtIa zixQBfi;1hTfTg6cfPv5gT}TS2PQ8aYJr(A^v!U1qNBu|z27bP53dueDkoOdn)||w7 z{&Vj2#WQg{LQNf953fy%Jw0UP7+P4F@UhH8!}i&D90t|yotzt}U9cIx76+R{YjA~bUmvt{&93)`On1r>F?$V2!T@dq=BdwD&Q1+SrDh%x z%0A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 literal 0 HcmV?d00001 diff --git a/docs/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf b/docs/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf index 1fbd6b5313..0809bcd90d 100644 --- a/docs/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf +++ b/docs/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf @@ -34,7 +34,7 @@ Regrid_PCP_obsERA_obsOnly_Blocking.conf # (PLOTBLOCKS). The steps can be listed on the command line or in a .conf file and are # formatted as follows: # -# STEPS_OBS = REGRID+TIMEAVE+RUNMEAN+ANOMALY+CBL+PLOTCBL+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS +# OBS_STEPS = REGRID+TIMEAVE+RUNMEAN+ANOMALY+CBL+PLOTCBL+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS ############################################################################## # METplus Workflow @@ -52,10 +52,10 @@ Regrid_PCP_obsERA_obsOnly_Blocking.conf # # METplus first loads all of the configuration files found in parm/metplus_config, # then it loads any configuration files passed to METplus via the command line -# with the -c option, i.e. -c parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf +# with the -c option, i.e. -c parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/convection_allowing_models/GridStat_fcstHRRR_obsPracPerfect_SurrogateSevere.conf +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf ############################################################################## # MET Configuration @@ -64,23 +64,26 @@ Regrid_PCP_obsERA_obsOnly_Blocking.conf # METplus sets environment variables based on the values in the METplus configuration file. # These variables are referenced in the MET configuration file. **YOU SHOULD NOT SET ANY OF THESE ENVIRONMENT VARIABLES YOURSELF! THEY WILL BE OVERWRITTEN BY METPLUS WHEN IT CALLS THE MET TOOLS!** If there is a setting in the MET configuration file that is not controlled by an environment variable, you can add additional environment variables to be set only within the METplus environment using the [user_env_vars] section of the METplus configuration files. See the 'User Defined Config' section on the 'System Configuration' page of the METplus User's Guide for more information. # -# .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/convection_allowing_models/GridStatConfig_ss -# # See the following files for more information about the environment variables set in this configuration file. # -# parm/use_cases/met_tool_wrapper/GridStat/GridStat.py +# parm/use_cases/met_tool_wrapper/RegridDataPlane/RegridDataPlane.py +# parm/use_cases/met_tool_wrapper/PCPCombine/PCPCOmbine_derive.py +# parm/use_cases/met_tool_wrapper/PCPCombine/PCPCOmbine_subtract.py ############################################################################## # Running METplus # --------------- # -# This use case is run in the following way: +# This use case is run in the following ways: # # 1) Passing in Regrid_PCP_obsERA_obsOnly_Blocking.conf then a user-specific system configuration file:: # # blocking_driver.py /path/to/METplus/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf /path/to/user_system.conf # +# 2) Passing in Regrid_PCP_obsERA_obsOnly_Blocking.conf then a user-specific system configuration file and then listing steps:: +# +# blocking_driver.py /path/to/METplus/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf /path/to/user_system.conf OBS_STEPS=REGRID+TIMEAVE+RUNMEAN+ANOMALY+CBL+PLOTCBL+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS +# # The following variables must be set correctly: # # * **INPUT_BASE** - Path to directory where sample data tarballs are unpacked (See Datasets section to obtain tarballs). This is not required to run METplus, but it is required to run the examples in parm/use_cases @@ -99,20 +102,19 @@ Regrid_PCP_obsERA_obsOnly_Blocking.conf # Expected Output # --------------- # -# Refer to the value set for **OUTPUT_BASE** to find where the output data was generated. -# Output for this use case will be found in model_applications/s2s/Blocking (relative to **OUTPUT_BASE**) -# and will contain output for the steps requested. This may include the regridded data, daily averaged files, running mean files, anomaly files and the -# requested plots. +# Refer to the value set for **OUTPUT_BASE** to find where the output data was generated. Output for this use +# case will be found in model_applications/s2s/Blocking (relative to **OUTPUT_BASE**) and will contain output +# for the steps requested. This may include the regridded data, daily averaged files, running mean files, +# anomaly files, the CBL , an IBL frequency plot, and blocking frequency plots. ############################################################################## # Keywords # -------- # -# sphinx_gallery_thumbnail_path = '_static/convection_allowing_models-SS_PP_prob.png' +# sphinx_gallery_thumbnail_path = '_static/s2s-OBS_ERA_blocking_frequency.png' # -# .. note:: `GridStatToolUseCase `_, -# `ConvectionAllowingModelsAppUseCase `_, -# `NetCDFFileUseCase `_, -# `NOAAHWTOrgUseCase `_, -# `NCAROrgUseCase `_ -# `NOAAHMTOrgUseCase `_, +# .. note:: `RegridDataPlaneUseCase `_, +# `PCPCombineUseCase `_, +# `S2SAppUseCase `_, +# `NetCDFFileUseCase `_, +# `GRIB2FileUseCase `_, diff --git a/ush/drivers/Blocking.py b/ush/drivers/Blocking.py new file mode 100644 index 0000000000..73b34cf76d --- /dev/null +++ b/ush/drivers/Blocking.py @@ -0,0 +1,473 @@ +import os +#import glob +import numpy as np +import netCDF4 +import pandas as pd +import datetime +import bisect +from scipy import stats +from scipy.signal import argrelextrema +from metplus.util import config_metplus, get_start_end_interval_times, get_lead_sequence +from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate + +class BlockingCalculation(): + """Contains the programs to calculate Blocking via the Pelly-Hoskins Method + """ + def __init__(self,config,label): + + self.blocking_anomaly_var = config.getstr('Blocking',label+'_BLOCKING_ANOMALY_VAR','') + self.blocking_var = config.getstr('Blocking',label+'_BLOCKING_VAR','') + self.smoothing_pts = config.getint('Blocking',label+'_SMOOTHING_PTS',9) + lat_delta_in = config.getstr('Blocking',label+'_LAT_DELTA','-5,0,5') + self.lat_delta = list(map(int,lat_delta_in.split(","))) + self.n_s_limits = config.getint('Blocking',label+'_NORTH_SOUTH_LIMITS',30) + self.ibl_dist = config.getint('Blocking',label+'_IBL_DIST',7) + self.ibl_in_gibl = config.getint('Blocking',label+'_IBL_IN_GIBL',15) + self.gibl_overlap = config.getint('Blocking',label+'_GIBL_OVERLAP',10) + self.block_time = config.getint('Blocking',label+'_BLOCK_TIME',5) ###Should fix so it supports other times" + self.block_travel = config.getint('Blocking',label+'_BLOCK_TRAVEL',45) + self.block_method = config.getstr('Blocking',label+'_BLOCK_METHOD','PH') + + # Get a date list for the data + #blocking_config = config_metplus.replace_config_from_section(config, 'Blocking') + #use_init = is_loop_by_init(blocking_config) + + #self.date_list, self.ymd_list, self.start_mth = self.get_date_list(blocking_config,use_init) + + # Check to see if a separate CBL start/end date is present + #cbl_config_init = config.find_section('Blocking','CBL_INIT_BEG') + #cbl_config_valid = config.find_section('Blocking','CBL_VALID_BEG') + #if use_init and (cbl_config_init is not None): + # config.set('Blocking','INIT_BEG',config.getstr('Blocking','CBL_INIT_BEG')) + # config.set('Blocking','INIT_END',config.getstr('Blocking','CBL_INIT_END')) + # blocking_config = config_metplus.replace_config_from_section(config, 'Blocking') + # self.cbl_date_list, self.cbl_ymd_list, self.cbl_start_mth = self.get_date_list(blocking_config,use_init) + #elif cbl_config_valid is not None: + # config.set('Blocking','VALID_BEG',config.getstr('Blocking','CBL_VALID_BEG')) + # config.set('Blocking','VALID_END',config.getstr('Blocking','CBL_VALID_END')) + # blocking_config = config_metplus.replace_config_from_section(config, 'Blocking') + # self.cbl_date_list, self.cbl_ymd_list, self.cbl_start_mth = self.get_date_list(blocking_config,use_init) + #else: + # self.cbl_date_list = self.date_list + # self.cbl_ymd_list = self.ymd_list + # self.cbl_start_mth = self.start_mth + + # Check data requirements + if self.smoothing_pts % 2 == 0: + print('ERROR: Smoothing Radius must be an odd number given in grid points, Exiting...') + exit() + + + def read_nc_met(self,infiles,yrlist,invar): + + print("Reading in Data") + + #Find the first non empty file name so I can get the variable sizes + locin = next(sub for sub in infiles if sub) + indata = netCDF4.Dataset(locin) + lats = indata.variables['lat'][:] + lons = indata.variables['lon'][:] + invar_arr = indata.variables[invar][:] + indata.close() + + var_3d = np.empty([len(infiles),len(invar_arr[:,0]),len(invar_arr[0,:])]) + + for i in range(0,len(infiles)): + + #Read in the data + if infiles[i]: + indata = netCDF4.Dataset(infiles[i]) + new_invar = indata.variables[invar][:] + #new_invar = np.expand_dims(new_invar,axis=0) + init_time_str = indata.variables[invar].getncattr('init_time') + valid_time_str = indata.variables[invar].getncattr('valid_time') + indata.close() + else: + new_invar = np.empty((1,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) + new_invar[:] = np.nan + var_3d[i,:,:] = new_invar + + yr = np.array(yrlist) + sdim = len(var_3d[:,0,0])/float(len(yrlist)) + var_4d = np.reshape(var_3d,[len(yrlist),int(sdim),len(var_3d[0,:,0]),len(var_3d[0,0,:])]) + + return var_4d,lats,lons,yr + + + def run_CBL(self,cblinfiles,cblyrs): + + z500_anom_4d,lats,lons,yr = self.read_nc_met(cblinfiles,cblyrs,self.blocking_anomaly_var) + + #Create Latitude Weight based for NH + cos = lats + cos = cos * np.pi / 180.0 + way = np.cos(cos) + way = np.sqrt(way) + weightf = np.repeat(way[:,np.newaxis],360,axis=1) + + ####Find latitude of maximum high-pass STD (CBL) + mstd = np.nanstd(z500_anom_4d,axis=1) + mhweight = mstd * weightf + cbli = np.argmax(mhweight,axis=1) + CBL = np.zeros((len(z500_anom_4d[:,0,0,0]),len(lons))) + for j in np.arange(0,len(yr),1): + CBL[j,:] = lats[cbli[j,:]] + + ###Apply Moving Average to Smooth CBL Profiles + lt = len(lons) + CBLf = np.zeros((len(z500_anom_4d[:,0,0,0]),len(lons))) + m=int((self.smoothing_pts-1)/2.0) + for i in np.arange(0,len(CBL[0,:]),1): + ma_indices = np.arange(i-m,i+m+1) + ma_indices = np.where(ma_indices >= lt,ma_indices-lt,ma_indices) + CBLf[:,i] = np.nanmean(CBL[:,ma_indices],axis=1).astype(int) + + return CBLf,lats,lons,yr,mhweight + + + def run_mod_blocking1d(self,a,cbl,lat,lon,meth): + lat_d = self.lat_delta + dc = (90 - cbl).astype(int) + db = self.n_s_limits + BI = np.zeros((len(a[:,0,0]),len(lon))) + blon = np.zeros((len(a[:,0,0]),len(lon))) + if meth=='PH': + # loop through days + for k in np.arange(0,len(a[:,0,0]),1): + blontemp=0 + q=0 + BI1=np.zeros((len(lat_d),len(lon))) + for l in lat_d: + blon1 = np.zeros(len(lon)) + d0 = dc-l + dn = ((dc - 1*db/2) - l).astype(np.int64) + ds = ((dc + 1*db/2) - l).astype(np.int64) + GHGS = np.zeros(len(cbl)) + GHGN = np.zeros(len(cbl)) + for jj in np.arange(0,len(cbl),1): + GHGN[jj] = np.mean(a[k,dn[jj]:d0[jj]+1,jj]) + GHGS[jj] = np.mean(a[k,d0[jj]:ds[jj]+1,jj]) + BI1[q,:] = GHGN-GHGS + q = q +1 + BI1 = np.max(BI1,axis=0) + block = np.where((BI1>0))[0] + blon1[block]=1 + blontemp = blontemp + blon1 + BI[k,:] = BI1 + blon[k,:] = blontemp + + return blon,BI + + + def run_Calc_IBL(self,cbl,iblinfiles,iblyr): + + z500_daily,lats,lons,yr = self.read_nc_met(iblinfiles,iblyr,self.blocking_var) + + #Initilize arrays for IBLs and the blocking index + # yr, day, lon + blonlong = np.zeros((len(yr),len(z500_daily[0,:,0,0]),len(lons))) + BI = np.zeros((len(yr),len(z500_daily[0,:,0,0]),len(lons))) + + #Using long-term mean CBL and acsessing module of mod.py + cbl = np.nanmean(cbl,axis=0) + for i in np.arange(0,len(yr),1): + blon,BI[i,:,:] = self.run_mod_blocking1d(z500_daily[i,:,:,:],cbl,lats,lons,self.block_method) + blonlong[i,:,:] = blon + + return blonlong + + + def run_Calc_GIBL(self,ibl,lons): + + #Initilize GIBL Array + GIBL = np.zeros(np.shape(ibl)) + + #####Loop finds IBLs within 7 degree of each other creating one group. Finally + ##### A GIBL exist if it has more than 15 IBLs + crit = self.ibl_in_gibl + + for i in np.arange(0,len(GIBL[:,0,0]),1): + for k in np.arange(0,len(GIBL[0,:,0]),1): + gibli = np.zeros(len(GIBL[0,0,:])) + thresh = crit/2.0 + a = ibl[i,k,:] + db = self.ibl_dist + ibli = np.where(a==1)[0] + if len(ibli)==0: + continue + idiff = ibli[1:] - ibli[:-1] + bt=0 + btlon = ibli[0] + ct = 1 + btfin = [] + block = ibli + block = np.append(block,block+360) + for ll in np.arange(1,len(block),1): + diff = np.abs(block[ll] - block[ll-1]) + if diff == 1: + bt = [block[ll]] + btlon = np.append(btlon,bt) + ct = ct + diff + if diff <= thresh and diff != 1: + bt = np.arange(block[ll-1]+1,block[ll]+1,1) + btlon = np.append(btlon,bt) + ct = ct + diff + if diff > thresh or ll==(len(block)-1): + if ct >= crit: + btfin = np.append(btfin,btlon) + ct=1 + ct = 1 + btlon = block[ll] + if len(btfin)/2 < crit : + btfin = [] + if len(btfin)==0: + continue + gibl1 = btfin + temp = np.where(gibl1>=360)[0] + gibl1[temp] = gibl1[temp] - 360 + gibli[gibl1.astype(int)] = 1 + GIBL[i,k,:] = gibli + + return GIBL + + + def Remove(self,duplicate): + final_list = [] + for num in duplicate: + if num not in final_list: + final_list.append(num) + return final_list + + + def run_Calc_Blocks(self,ibl,GIBL,lon,tsin,year): + + crit = self.ibl_in_gibl + + ##Count up the blocked longitudes for each GIBL + c = np.zeros((GIBL.shape)) + lonlen = len(lon) + sz = [] + mx = [] + min = [] + + for y in np.arange(0,len(GIBL[:,0,0]),1): + for k in np.arange(0,len(GIBL[0,:,0]),1): + a = GIBL[y,k] # Array of lons for each year,day + ct=1 + ai = np.where(a==1)[0] + ai = np.append(ai,ai+360) + temp = np.where(ai>=360)[0] + bi=list(ai) + bi = np.array(bi) + bi[temp] = bi[temp]-360 + # Loop through the lons that are part of the GIBL + for i in np.arange(0,len(ai)-1,1): + diff = ai[i+1] - ai[i] + c[y,k,bi[i]] = ct + if diff==1: + ct=ct+1 + else: + sz = np.append(sz,ct) + ct=1 + + ########## - finding where the left and right limits of the block are - ################ + for i in np.arange(0,len(c[:,0,0]),1): + for k in np.arange(0,len(c[0,:,0]),1): + maxi = argrelextrema(c[i,k],np.greater,mode='wrap')[0] + mini = np.where(c[i,k]==1)[0] + if c[i,k,lonlen-1]!=0 and c[i,k,0]!=0: + mm1 = mini[-1] + mm2 = mini[:-1] + mini = np.append(mm1,mm2) + mx = np.append(mx,maxi) + min = np.append(min,mini) + + locy, locd, locl = np.where(c==crit) + + A = np.zeros(lonlen) + A = np.expand_dims(A,axis=0) + + ################# - Splitting up each GIBL into its own array - ################### + + for i in np.arange(0,len(locy),1): + m = locy[i] #year + n = locd[i] #day + o = locl[i] #long where 15 + mm = int(mx[i]) + mn = min[i] + temp1 = GIBL[m,n] + temp2 = np.zeros(lonlen) + if mn>mm: + diff = int(mm - c[m,n,mm] + 1) + lons = lon[diff] + place1 = np.arange(lons,lonlen,1) + place2 = np.arange(0,mm+1,1) + bl = np.append(place2,place1).astype(int) + if temp1[lonlen-1] ==1 and mm>200: + lons = lon[mm] + beg = mm - c[m,n,mm] + 1 + bl = np.arange(beg,mm+1,1).astype(int) + if mm>mn: #temp1[359] ==0: + lons = lon[mm] + beg = mm - c[m,n,mm] + 1 + bl = np.arange(beg,mm+1,1).astype(int) + temp2[bl] = 1 + temp2 = np.expand_dims(temp2,axis=0) + A = np.concatenate((A,temp2),axis=0) + + A = A[1:] + + ######### - Getting rid of non-consectutve Time steps which would prevent blocking - ################# + dd=[] + dy = [] + dA = A[0] + dA = np.expand_dims(dA,axis=0) + ct=0 + for i in np.arange(1,len(locy),1): + dd1 = locd[i-1] + dd2 = locd[i] + if dd2-dd1 > 2: + ct = 0 + continue + if ct == 0: + dd = np.append(dd,locd[i-1]) + dy = np.append(dy,locy[i-1]) + temp2 = np.expand_dims(A[i-1],axis=0) + dA = np.concatenate((dA,temp2),axis=0) + ct = ct + 1 + if dd2-dd1<=2: + dd=np.append(dd,locd[i]) + dy = np.append(dy,locy[i]) + temp2 = np.expand_dims(A[i],axis=0) + dA = np.concatenate((dA,temp2),axis=0) + ct = ct + 1 + + dA=dA[1:] + dAfin = dA + + ############ - Finding center longitude of block - ############## + middle=[] + for l in np.arange(0,len(dAfin),1): + temp = np.where(dAfin[l]==1)[0] + if len(temp) % 2 == 0: + temp = np.append(temp,0) + midtemp = np.median(temp) + middle = np.append(middle,midtemp) + + + #####Track blocks. Makes sure that blocks overlap with at least 10 longitude points on consecutive + overlap = self.gibl_overlap + btime = self.block_time + fin = [[]] + finloc = [[]] + ddcopy=dd*1.0 + noloc=[] + failloc = [[]] + for i in np.arange(0,len(c[:,0,0]),1): + yri = np.where(dy==i)[0] + B = [[]] + ddil =1.0 * ddcopy[yri] + dyy = np.where(dy==i)[0] + rem = [] + for dk in ddil: + if len(ddil) < btime: + continue + ddil = np.append(ddil[0]-1,ddil) + diff = np.diff(ddil) + diffB=[] + dB =1 + cnt = 1 + while dB<=2: + diffB = np.append(diffB,ddil[cnt]) + dB = diff[cnt-1] + if ddil[cnt]==ddil[-1]: + dB=5 + cnt=cnt+1 + diffB = np.array(self.Remove(diffB)) + locb = [] + for ll in diffB: + locb = np.append(locb,np.where((dy==i) & (dd==ll))[0]) + ddil=ddil[1:] + locbtemp = 1.0*locb + re=[] + for hh in np.arange(0,len(noloc),1): + re = np.append(re,np.where(locb == noloc[hh])[0]) + locbtemp = np.delete(locbtemp,re) + locb=locbtemp * 1.0 + datemp = dAfin[locb.astype(int)] + blocktemp = [[datemp[0]]] + locbi = np.array([locb[0]]) + ll1=0 + pass1 = 0 + ai=[0] + add=0 + for ll in np.arange(0,len(locb)-1,1): + if ((dd[locb[ll+1].astype(int)] - dd[locb[ll1].astype(int)]) >=1) & ((dd[locb[ll+1].astype(int)] - dd[locb[ll1].astype(int)]) <=2): + add = datemp[ll1] + datemp[ll+1] + ai = np.where(add==2)[0] + if len(ai)>overlap: + locbi=np.append(locbi,locb[ll+1]) + ll1=ll+1 + add=0 + if (len(ai)4: + noloc = np.append(noloc,locbi) + finloc = finloc + [locbi] + for jj in locbi: + rem = np.append(rem,np.where(dyy==jj)[0]) + ddil = np.delete(ddcopy[yri],rem.astype(int)) + if len(locbi)<=4: + noloc = np.append(noloc,locbi) + if len(locbi)<=2: + failloc=failloc+[locbi] + for jj in locbi: + rem = np.append(rem,np.where(dyy==jj)[0]) + ddil = np.delete(ddcopy[yri],rem.astype(int)) + + blocks = finloc[1:] + noblock = failloc[1:] + + ############Get rid of blocks that travel downstream########## + ######If center of blocks travel downstream further than 45 degrees longitude, + ######cancel block moment it travels out of this limit + newblock = [[]] + newnoblock=[[]] + distthresh = self.block_travel + for bb in blocks: + diffb = [] + start = middle[bb[0].astype(int)] + for bbs in bb: + diffb = np.append(diffb, start - middle[bbs.astype(int)]) + loc = np.where(np.abs(diffb) > distthresh)[0] + if len(loc)==0: + newblock = newblock +[bb] + if len(loc)>0: + if len(bb[:loc[0]]) >4: + newblock = newblock + [bb[:loc[0]]] + if len(bb[:loc[0]]) <=2: + noblock = noblock + [bb] + + blocks = newblock[1:] + + #Create a final array with blocking longitudes. Similar to IBL/GIBL, but those that pass the duration threshold + blockfreq = np.zeros((len(year),len(ibl[0,:,0]),360)) + savecbl=[] + savemiddle = [] + saveyr=[] + numblock=0 + for i in np.arange(0,len(blocks),1): + temp = blocks[i] + numblock=numblock+1 + for j in temp: + j=int(j) + daycomp = int(dd[j]) + yearcomp = int(dy[j]) + saveyr = np.append(saveyr,dy[j]) + middlecomp = middle[j].astype(int) + mc1 = int(round(middlecomp / 2.5)) + blockfreq[yearcomp,daycomp] = blockfreq[yearcomp,daycomp] + dAfin[j] + ct = ct + 1 + + return blockfreq diff --git a/ush/drivers/Blocking_driver.py b/ush/drivers/Blocking_driver.py new file mode 100644 index 0000000000..079df63163 --- /dev/null +++ b/ush/drivers/Blocking_driver.py @@ -0,0 +1,313 @@ +import sys +import os +import numpy as np +import netCDF4 +import re + +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), + os.pardir,os.pardir))) +sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy/metplotpy/blocking_s2s") +sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy_feature_33/metplotpy/blocking_s2s") +from Blocking import BlockingCalculation +from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence +from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub +from ush.master_metplus import get_config_inputs_from_command_line +from metplus.wrappers import PCPCombineWrapper +from metplus.wrappers import RegridDataPlaneWrapper +import plot_blocking as pb +from CBL_plot import create_cbl_plot + +def find_input_files(inconfig, use_init, intemplate, secondtemplate=''): + loop_time, end_time, time_interval = get_start_end_interval_times(inconfig) + skip_times = get_skip_times(inconfig) + + start_mth = loop_time.strftime('%m') + template = inconfig.getraw('config',intemplate) + if secondtemplate: + template2 = inconfig.getraw('config',secondtemplate) + file_list2 = [] + + file_list = [] + yr_list = [] + if use_init: + timname = 'init' + else: + timname = 'valid' + input_dict = {} + input_dict['loop_by'] = timname + pmth = start_mth + while loop_time <= end_time: + lead_seq = get_lead_sequence(inconfig) + for ls in lead_seq: + new_time = loop_time + ls + input_dict[timname] = loop_time + input_dict['lead'] = ls + + outtimestuff = ti_calculate(input_dict) + if skip_time(outtimestuff, skip_times): + continue + cmth = outtimestuff['valid'].strftime('%m') + filepath = do_string_sub(template, **outtimestuff) + if secondtemplate: + filepath2 = do_string_sub(template2, **outtimestuff) + if os.path.exists(filepath) and os.path.exists(filepath2): + file_list.append(filepath) + file_list2.append(filepath2) + else: + file_list.append('') + file_list2.append('') + else: + if os.path.exists(filepath): + file_list.append(filepath) + else: + file_list.append('') + + if (int(cmth) == int(start_mth)) and (int(pmth) != int(start_mth)): + yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) + pmth = cmth + + loop_time += time_interval + + if secondtemplate: + file_list = [file_list,file_list2] + yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) + + return file_list, yr_list + + +def main(): + + all_steps = ["REGRID","TIMEAVE","RUNMEAN","ANOMALY","CBL","PLOTCBL","IBL","PLOTIBL","GIBL","CALCBLOCKS","PLOTBLOCKS"] + + config_list = get_config_inputs_from_command_line() + + # If the user has defined the steps they want to run + # grab the command line parameter + steps_config_part_fcst = [s for s in config_list if "FCST_STEPS" in s] + steps_list_fcst = [] + + steps_config_part_obs = [s for s in config_list if "OBS_STEPS" in s] + steps_list_obs = [] + + # Setup the Steps + if steps_config_part_fcst: + steps_param_fcst = steps_config_part_fcst[0].split("=")[1] + steps_list_fcst = steps_param_fcst.split("+") + config_list.remove(steps_config_part_fcst[0]) + if steps_config_part_obs: + steps_param_obs = steps_config_part_obs[0].split("=")[1] + steps_list_obs = steps_param_obs.split("+") + config_list.remove(steps_config_part_obs[0]) + + #config = config_metplus.setup(config_list) + config = pre_run_setup(config_list) + if not steps_config_part_fcst: + steps_param_fcst = config.getstr('config','FCST_STEPS','') + steps_list_fcst = steps_param_fcst.split("+") + if not steps_config_part_obs: + steps_param_obs = config.getstr('config','OBS_STEPS','') + steps_list_obs = steps_param_obs.split("+") + + if not steps_list_obs and not steps_list_fcst: + print('No processing steps requested for either the model or observations,') + print('no data will be processed') + + + ###################################################################### + # Pre-Process Data: + ###################################################################### + # Regrid + if ("REGRID" in steps_list_obs): + print('Regridding Observations') + regrid_config = config_metplus.replace_config_from_section(config, 'regrid_obs') + RegridDataPlaneWrapper(regrid_config).run_all_times() + + if ("REGRID" in steps_list_fcst): + print('Regridding Model') + regrid_config = config_metplus.replace_config_from_section(config, 'regrid_fcst') + RegridDataPlaneWrapper(regrid_config).run_all_times() + + #Compute Daily Average + if ("TIMEAVE" in steps_list_obs): + print('Computing Daily Averages') + daily_config = config_metplus.replace_config_from_section(config, 'daily_mean_obs') + PCPCombineWrapper(daily_config).run_all_times() + + if ("TIMEAVE" in steps_list_fcst): + print('Computing Daily Averages') + daily_config = config_metplus.replace_config_from_section(config, 'daily_mean_fcst') + PCPCombineWrapper(daily_config).run_all_times() + + #Take a running mean + if ("RUNMEAN" in steps_list_obs): + print('Computing Obs Running means') + rmean_config = config_metplus.replace_config_from_section(config, 'running_mean_obs') + PCPCombineWrapper(rmean_config).run_all_times() + + if ("RUNMEAN" in steps_list_fcst): + print('Computing Model Running means') + rmean_config = config_metplus.replace_config_from_section(config, 'running_mean_fcst') + PCPCombineWrapper(rmean_config).run_all_times() + + #Compute anomaly + if ("ANOMALY" in steps_list_obs): + print('Computing Obs Anomalies') + anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly_obs') + PCPCombineWrapper(anomaly_config).run_all_times() + + if ("ANOMALY" in steps_list_fcst): + print('Computing Model Anomalies') + anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly_fcst') + PCPCombineWrapper(anomaly_config).run_all_times() + + + ###################################################################### + # Blocking Calculation and Plotting + ###################################################################### + # Set up the data + steps_fcst = BlockingCalculation(config,'FCST') + steps_obs = BlockingCalculation(config,'OBS') + + # Check to see if CBL's are used from an obs climatology + use_cbl_obs = config.getbool('Blocking','USE_CBL_OBS',False) + + # Calculate Central Blocking Latitude + cbl_config = config_metplus.replace_config_from_section(config,'Blocking') + cbl_config_init = config.find_section('Blocking','CBL_INIT_BEG') + cbl_config_valid = config.find_section('Blocking','CBL_VALID_BEG') + use_init = is_loop_by_init(cbl_config) + if use_init: + orig_beg = config.getstr('Blocking','INIT_BEG') + orig_end = config.getstr('Blocking','INIT_END') + if cbl_config_init is not None: + config.set('Blocking','INIT_BEG',config.getstr('Blocking','CBL_INIT_BEG')) + config.set('Blocking','INIT_END',config.getstr('Blocking','CBL_INIT_END')) + cbl_config = config_metplus.replace_config_from_section(config, 'Blocking') + else: + orig_beg = config.getstr('Blocking','VALID_BEG') + orig_end = config.getstr('Blocking','VALID_END') + if cbl_config_valid is not None: + config.set('Blocking','VALID_BEG',config.getstr('Blocking','CBL_VALID_BEG')) + config.set('Blocking','VALID_END',config.getstr('Blocking','CBL_VALID_END')) + cbl_config = config_metplus.replace_config_from_section(config, 'Blocking') + + if ("CBL" in steps_list_obs): + print('Computing Obs CBLs') + obs_infiles, yr_obs = find_input_files(cbl_config, use_init, 'OBS_BLOCKING_ANOMALY_TEMPLATE') + cbls_obs,lats_obs,lons_obs,yr_obs,mhweight_obs = steps_obs.run_CBL(obs_infiles,yr_obs) + + if ("CBL" in steps_list_fcst): + # Add in step to use obs for CBLS + print('Computing Forecast CBLs') + fcst_infiles,yr_fcst = find_input_files(cbl_config, use_init, 'FCST_BLOCKING_ANOMALY_TEMPLATE') + cbls_fcst,lats_fcst,lons_fcst,yr_fcst,mhweight_fcst = steps_fcst.run_CBL(fcst_infiles,yr_fcst) + elif use_cbl_obs: + cbls_fcst = cbls_obs + lats_fcst = lats_obs + lons_fcst = lons_obs + yr_fcst = yr_obs + mhweight_fcst = mhweight_obs + + #Plot Central Blocking Latitude + if ("PLOTCBL" in steps_list_obs): + cbl_plot_mthstr = config.getstr('Blocking','OBS_CBL_PLOT_MTHSTR') + cbl_plot_outname = config.getstr('Blocking','OBS_CBL_PLOT_OUTPUT_NAME') + create_cbl_plot(lons_obs, lats_obs, cbls_obs, mhweight_obs, cbl_plot_mthstr, cbl_plot_outname, do_averaging=True) + if ("PLOTCBL" in steps_list_fcst): + cbl_plot_mthstr = config.getstr('Blocking','FCST_CBL_PLOT_MTHSTR') + cbl_plot_outname = config.getstr('Blocking','FCST_CBL_PLOT_OUTPUT_NAME') + create_cbl_plot(lons_fcst, lats_fcst, cbls_fcst, mhweight_fcst, cbl_plot_mthstr, cbl_plot_outname, + do_averaging=True) + + + # Run IBL + if use_init: + config.set('Blocking','INIT_BEG',orig_beg) + config.set('Blocking','INIT_END',orig_end) + else: + config.set('Blocking','VALID_BEG',orig_beg) + config.set('Blocking','VALID_END',orig_end) + ibl_config = config_metplus.replace_config_from_section(config,'Blocking') + if ("IBL" in steps_list_obs) and not ("IBL" in steps_list_fcst): + #if ("IBL" in steps_list_obs): + print('Computing Obs IBLs') + obs_infiles, yr_obs = find_input_files(ibl_config, use_init, 'OBS_BLOCKING_TEMPLATE') + ibls_obs = steps_obs.run_Calc_IBL(cbls_obs,obs_infiles,yr_obs) + daynum_obs = np.arange(0,len(ibls_obs[0,:,0]),1) + #if ("IBL" in steps_list_fcst): + elif ("IBL" in steps_list_fcst) and not ("IBL" in steps_list_obs): + print('Computing Forecast IBLs') + fcst_infiles, yr_fcst = find_input_files(ibl_config, use_init, 'FCST_BLOCKING_TEMPLATE') + ibls_fcst = steps_fcst.run_Calc_IBL(cbls_fcst,fcst_infiles,yr_fcst) + daynum_fcst = np.arange(0,len(ibls_fcst[0,:,0]),1) + elif ("IBL" in steps_list_obs) and ("IBL" in steps_list_fcst): + both_infiles, yr_obs = find_input_files(ibl_config, use_init, 'OBS_BLOCKING_TEMPLATE', + secondtemplate='FCST_BLOCKING_TEMPLATE') + # TEST THIS + obs_infiles = both_infiles[0] + fcst_infiles = both_infiles[1] + yr_fcst = yr_obs + print('Computing Obs IBLs') + ibls_obs = steps_obs.run_Calc_IBL(cbls_obs,obs_infiles,yr_obs) + daynum_obs = np.arange(0,len(ibls_obs[0,:,0]),1) + print('Computing Forecast IBLs') + ibls_fcst = steps_fcst.run_Calc_IBL(cbls_fcst,fcst_infiles,yr_fcst) + daynum_fcst = np.arange(0,len(ibls_fcst[0,:,0]),1) + + # Plot IBLS + if("PLOTIBL" in steps_list_obs) and not ("PLOTIBL" in steps_list_fcst): + ibl_plot_title = config.getstr('Blocking','OBS_IBL_PLOT_TITLE','IBL Frequency') + ibl_plot_outname = config.getstr('Blocking','OBS_IBL_PLOT_OUTPUT_NAME','') + ibl_plot_label1 = config.getstr('Blocking','IBL_PLOT_OBS_LABEL','') + pb.plot_ibls(ibls_obs,lons_obs,ibl_plot_title,ibl_plot_outname,label1=ibl_plot_label1) + elif ("PLOTIBL" in steps_list_fcst) and not ("PLOTIBL" in steps_list_obs): + ibl_plot_title = config.getstr('Blocking','FCST_IBL_PLOT_TITLE','IBL Frequency') + ibl_plot_outname = config.getstr('Blocking','FCST_IBL_PLOT_OUTPUT_NAME') + ibl_plot_label1 = config.getstr('Blocking','IBL_PLOT_FCST_LABEL',None) + pb.plot_ibls(ibls_fcst,lons_fcst,ibl_plot_title,ibl_plot_outname,label1=ibl_plot_label1) + elif ("PLOTIBL" in steps_list_obs) and ("PLOTIBL" in steps_list_fcst): + ibl_plot_title = config.getstr('Blocking','IBL_PLOT_TITLE') + ibl_plot_outname = config.getstr('Blocking','IBL_PLOT_OUTPUT_NAME') + #Check to see if there are plot legend labels + ibl_plot_label1 = config.getstr('Blocking','IBL_PLOT_OBS_LABEL','Observation') + ibl_plot_label2 = config.getstr('Blocking','IBL_PLOT_FCST_LABEL','Forecast') + pb.plot_ibls(ibls_obs,lons_obs,ibl_plot_title,ibl_plot_outname,data2=ibls_fcst,lon2=lons_fcst, + label1=ibl_plot_label1,label2=ibl_plot_label2) + + + # Run GIBL + if ("GIBL" in steps_list_obs): + print('Computing GIBLs') + gibls_obs = steps_obs.run_Calc_GIBL(ibls_obs,lons_obs) + + if ("GIBL" in steps_list_fcst): + print('Computing GIBLs') + gibls_fcst = steps_fcst.run_Calc_GIBL(ibls_fcst,lons_fcst) + + + # Calc Blocks + if ("CALCBLOCKS" in steps_list_obs): + print('Computing Blocks') + block_freq_obs = steps_obs.run_Calc_Blocks(ibls_obs,gibls_obs,lons_obs,daynum_obs,yr_obs) + + if ("CALCBLOCKS" in steps_list_fcst): + print('Computing Blocks') + block_freq_fcst = steps_fcst.run_Calc_Blocks(ibls_fcst,gibls_fcst,lons_fcst,daynum_fcst,yr_fcst) + + # Plot Blocking Frequency + if ("PLOTBLOCKS" in steps_list_obs) and not ("PLOTBLOCKS" in steps_list_fcst): + blocking_plot_title = config.getstr('Blocking','OBS_BLOCKING_PLOT_TITLE') + blocking_plot_outname = config.getstr('Blocking','OBS_BLOCKING_PLOT_OUTPUT_NAME') + pb.plot_blocks(block_freq_obs,gibls_obs,ibls_obs,lons_obs,blocking_plot_title,blocking_plot_outname) + elif ("PLOTBLOCKS" in steps_list_fcst) and not ("PLOTBLOCKS" in steps_list_obs): + blocking_plot_title = config.getstr('Blocking','FCST_BLOCKING_PLOT_TITLE') + blocking_plot_outname = config.getstr('Blocking','FCST_BLOCKING_PLOT_OUTPUT_NAME') + pb.plot_blocks(block_freq_fcst,gibls_fcst,ibls_fcst,lons_fcst,blocking_plot_title,blocking_plot_outname) + elif ("PLOTBLOCKS" in steps_list_obs) and ("PLOTBLOCKS" in steps_list_fcst): + blocking_plot_title = config.getstr('Blocking','BLOCKING_PLOT_TITLE') + blocking_plot_outname = config.getstr('Blocking','BLOCKING_PLOT_OUTPUT_NAME') + pb.plot_blocks(block_freq,gibls,ibls,lons,blocking_plot_title,blocking_plot_outname) + + +if __name__ == "__main__": + main() From 4b9a429c28c35209ab788c6a747d9f95ba9d9b9b Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Fri, 4 Dec 2020 19:14:58 -0700 Subject: [PATCH 24/93] Added plot --- ush/Blocking.py | 473 ------------------------------------------------ 1 file changed, 473 deletions(-) delete mode 100644 ush/Blocking.py diff --git a/ush/Blocking.py b/ush/Blocking.py deleted file mode 100644 index 73b34cf76d..0000000000 --- a/ush/Blocking.py +++ /dev/null @@ -1,473 +0,0 @@ -import os -#import glob -import numpy as np -import netCDF4 -import pandas as pd -import datetime -import bisect -from scipy import stats -from scipy.signal import argrelextrema -from metplus.util import config_metplus, get_start_end_interval_times, get_lead_sequence -from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate - -class BlockingCalculation(): - """Contains the programs to calculate Blocking via the Pelly-Hoskins Method - """ - def __init__(self,config,label): - - self.blocking_anomaly_var = config.getstr('Blocking',label+'_BLOCKING_ANOMALY_VAR','') - self.blocking_var = config.getstr('Blocking',label+'_BLOCKING_VAR','') - self.smoothing_pts = config.getint('Blocking',label+'_SMOOTHING_PTS',9) - lat_delta_in = config.getstr('Blocking',label+'_LAT_DELTA','-5,0,5') - self.lat_delta = list(map(int,lat_delta_in.split(","))) - self.n_s_limits = config.getint('Blocking',label+'_NORTH_SOUTH_LIMITS',30) - self.ibl_dist = config.getint('Blocking',label+'_IBL_DIST',7) - self.ibl_in_gibl = config.getint('Blocking',label+'_IBL_IN_GIBL',15) - self.gibl_overlap = config.getint('Blocking',label+'_GIBL_OVERLAP',10) - self.block_time = config.getint('Blocking',label+'_BLOCK_TIME',5) ###Should fix so it supports other times" - self.block_travel = config.getint('Blocking',label+'_BLOCK_TRAVEL',45) - self.block_method = config.getstr('Blocking',label+'_BLOCK_METHOD','PH') - - # Get a date list for the data - #blocking_config = config_metplus.replace_config_from_section(config, 'Blocking') - #use_init = is_loop_by_init(blocking_config) - - #self.date_list, self.ymd_list, self.start_mth = self.get_date_list(blocking_config,use_init) - - # Check to see if a separate CBL start/end date is present - #cbl_config_init = config.find_section('Blocking','CBL_INIT_BEG') - #cbl_config_valid = config.find_section('Blocking','CBL_VALID_BEG') - #if use_init and (cbl_config_init is not None): - # config.set('Blocking','INIT_BEG',config.getstr('Blocking','CBL_INIT_BEG')) - # config.set('Blocking','INIT_END',config.getstr('Blocking','CBL_INIT_END')) - # blocking_config = config_metplus.replace_config_from_section(config, 'Blocking') - # self.cbl_date_list, self.cbl_ymd_list, self.cbl_start_mth = self.get_date_list(blocking_config,use_init) - #elif cbl_config_valid is not None: - # config.set('Blocking','VALID_BEG',config.getstr('Blocking','CBL_VALID_BEG')) - # config.set('Blocking','VALID_END',config.getstr('Blocking','CBL_VALID_END')) - # blocking_config = config_metplus.replace_config_from_section(config, 'Blocking') - # self.cbl_date_list, self.cbl_ymd_list, self.cbl_start_mth = self.get_date_list(blocking_config,use_init) - #else: - # self.cbl_date_list = self.date_list - # self.cbl_ymd_list = self.ymd_list - # self.cbl_start_mth = self.start_mth - - # Check data requirements - if self.smoothing_pts % 2 == 0: - print('ERROR: Smoothing Radius must be an odd number given in grid points, Exiting...') - exit() - - - def read_nc_met(self,infiles,yrlist,invar): - - print("Reading in Data") - - #Find the first non empty file name so I can get the variable sizes - locin = next(sub for sub in infiles if sub) - indata = netCDF4.Dataset(locin) - lats = indata.variables['lat'][:] - lons = indata.variables['lon'][:] - invar_arr = indata.variables[invar][:] - indata.close() - - var_3d = np.empty([len(infiles),len(invar_arr[:,0]),len(invar_arr[0,:])]) - - for i in range(0,len(infiles)): - - #Read in the data - if infiles[i]: - indata = netCDF4.Dataset(infiles[i]) - new_invar = indata.variables[invar][:] - #new_invar = np.expand_dims(new_invar,axis=0) - init_time_str = indata.variables[invar].getncattr('init_time') - valid_time_str = indata.variables[invar].getncattr('valid_time') - indata.close() - else: - new_invar = np.empty((1,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) - new_invar[:] = np.nan - var_3d[i,:,:] = new_invar - - yr = np.array(yrlist) - sdim = len(var_3d[:,0,0])/float(len(yrlist)) - var_4d = np.reshape(var_3d,[len(yrlist),int(sdim),len(var_3d[0,:,0]),len(var_3d[0,0,:])]) - - return var_4d,lats,lons,yr - - - def run_CBL(self,cblinfiles,cblyrs): - - z500_anom_4d,lats,lons,yr = self.read_nc_met(cblinfiles,cblyrs,self.blocking_anomaly_var) - - #Create Latitude Weight based for NH - cos = lats - cos = cos * np.pi / 180.0 - way = np.cos(cos) - way = np.sqrt(way) - weightf = np.repeat(way[:,np.newaxis],360,axis=1) - - ####Find latitude of maximum high-pass STD (CBL) - mstd = np.nanstd(z500_anom_4d,axis=1) - mhweight = mstd * weightf - cbli = np.argmax(mhweight,axis=1) - CBL = np.zeros((len(z500_anom_4d[:,0,0,0]),len(lons))) - for j in np.arange(0,len(yr),1): - CBL[j,:] = lats[cbli[j,:]] - - ###Apply Moving Average to Smooth CBL Profiles - lt = len(lons) - CBLf = np.zeros((len(z500_anom_4d[:,0,0,0]),len(lons))) - m=int((self.smoothing_pts-1)/2.0) - for i in np.arange(0,len(CBL[0,:]),1): - ma_indices = np.arange(i-m,i+m+1) - ma_indices = np.where(ma_indices >= lt,ma_indices-lt,ma_indices) - CBLf[:,i] = np.nanmean(CBL[:,ma_indices],axis=1).astype(int) - - return CBLf,lats,lons,yr,mhweight - - - def run_mod_blocking1d(self,a,cbl,lat,lon,meth): - lat_d = self.lat_delta - dc = (90 - cbl).astype(int) - db = self.n_s_limits - BI = np.zeros((len(a[:,0,0]),len(lon))) - blon = np.zeros((len(a[:,0,0]),len(lon))) - if meth=='PH': - # loop through days - for k in np.arange(0,len(a[:,0,0]),1): - blontemp=0 - q=0 - BI1=np.zeros((len(lat_d),len(lon))) - for l in lat_d: - blon1 = np.zeros(len(lon)) - d0 = dc-l - dn = ((dc - 1*db/2) - l).astype(np.int64) - ds = ((dc + 1*db/2) - l).astype(np.int64) - GHGS = np.zeros(len(cbl)) - GHGN = np.zeros(len(cbl)) - for jj in np.arange(0,len(cbl),1): - GHGN[jj] = np.mean(a[k,dn[jj]:d0[jj]+1,jj]) - GHGS[jj] = np.mean(a[k,d0[jj]:ds[jj]+1,jj]) - BI1[q,:] = GHGN-GHGS - q = q +1 - BI1 = np.max(BI1,axis=0) - block = np.where((BI1>0))[0] - blon1[block]=1 - blontemp = blontemp + blon1 - BI[k,:] = BI1 - blon[k,:] = blontemp - - return blon,BI - - - def run_Calc_IBL(self,cbl,iblinfiles,iblyr): - - z500_daily,lats,lons,yr = self.read_nc_met(iblinfiles,iblyr,self.blocking_var) - - #Initilize arrays for IBLs and the blocking index - # yr, day, lon - blonlong = np.zeros((len(yr),len(z500_daily[0,:,0,0]),len(lons))) - BI = np.zeros((len(yr),len(z500_daily[0,:,0,0]),len(lons))) - - #Using long-term mean CBL and acsessing module of mod.py - cbl = np.nanmean(cbl,axis=0) - for i in np.arange(0,len(yr),1): - blon,BI[i,:,:] = self.run_mod_blocking1d(z500_daily[i,:,:,:],cbl,lats,lons,self.block_method) - blonlong[i,:,:] = blon - - return blonlong - - - def run_Calc_GIBL(self,ibl,lons): - - #Initilize GIBL Array - GIBL = np.zeros(np.shape(ibl)) - - #####Loop finds IBLs within 7 degree of each other creating one group. Finally - ##### A GIBL exist if it has more than 15 IBLs - crit = self.ibl_in_gibl - - for i in np.arange(0,len(GIBL[:,0,0]),1): - for k in np.arange(0,len(GIBL[0,:,0]),1): - gibli = np.zeros(len(GIBL[0,0,:])) - thresh = crit/2.0 - a = ibl[i,k,:] - db = self.ibl_dist - ibli = np.where(a==1)[0] - if len(ibli)==0: - continue - idiff = ibli[1:] - ibli[:-1] - bt=0 - btlon = ibli[0] - ct = 1 - btfin = [] - block = ibli - block = np.append(block,block+360) - for ll in np.arange(1,len(block),1): - diff = np.abs(block[ll] - block[ll-1]) - if diff == 1: - bt = [block[ll]] - btlon = np.append(btlon,bt) - ct = ct + diff - if diff <= thresh and diff != 1: - bt = np.arange(block[ll-1]+1,block[ll]+1,1) - btlon = np.append(btlon,bt) - ct = ct + diff - if diff > thresh or ll==(len(block)-1): - if ct >= crit: - btfin = np.append(btfin,btlon) - ct=1 - ct = 1 - btlon = block[ll] - if len(btfin)/2 < crit : - btfin = [] - if len(btfin)==0: - continue - gibl1 = btfin - temp = np.where(gibl1>=360)[0] - gibl1[temp] = gibl1[temp] - 360 - gibli[gibl1.astype(int)] = 1 - GIBL[i,k,:] = gibli - - return GIBL - - - def Remove(self,duplicate): - final_list = [] - for num in duplicate: - if num not in final_list: - final_list.append(num) - return final_list - - - def run_Calc_Blocks(self,ibl,GIBL,lon,tsin,year): - - crit = self.ibl_in_gibl - - ##Count up the blocked longitudes for each GIBL - c = np.zeros((GIBL.shape)) - lonlen = len(lon) - sz = [] - mx = [] - min = [] - - for y in np.arange(0,len(GIBL[:,0,0]),1): - for k in np.arange(0,len(GIBL[0,:,0]),1): - a = GIBL[y,k] # Array of lons for each year,day - ct=1 - ai = np.where(a==1)[0] - ai = np.append(ai,ai+360) - temp = np.where(ai>=360)[0] - bi=list(ai) - bi = np.array(bi) - bi[temp] = bi[temp]-360 - # Loop through the lons that are part of the GIBL - for i in np.arange(0,len(ai)-1,1): - diff = ai[i+1] - ai[i] - c[y,k,bi[i]] = ct - if diff==1: - ct=ct+1 - else: - sz = np.append(sz,ct) - ct=1 - - ########## - finding where the left and right limits of the block are - ################ - for i in np.arange(0,len(c[:,0,0]),1): - for k in np.arange(0,len(c[0,:,0]),1): - maxi = argrelextrema(c[i,k],np.greater,mode='wrap')[0] - mini = np.where(c[i,k]==1)[0] - if c[i,k,lonlen-1]!=0 and c[i,k,0]!=0: - mm1 = mini[-1] - mm2 = mini[:-1] - mini = np.append(mm1,mm2) - mx = np.append(mx,maxi) - min = np.append(min,mini) - - locy, locd, locl = np.where(c==crit) - - A = np.zeros(lonlen) - A = np.expand_dims(A,axis=0) - - ################# - Splitting up each GIBL into its own array - ################### - - for i in np.arange(0,len(locy),1): - m = locy[i] #year - n = locd[i] #day - o = locl[i] #long where 15 - mm = int(mx[i]) - mn = min[i] - temp1 = GIBL[m,n] - temp2 = np.zeros(lonlen) - if mn>mm: - diff = int(mm - c[m,n,mm] + 1) - lons = lon[diff] - place1 = np.arange(lons,lonlen,1) - place2 = np.arange(0,mm+1,1) - bl = np.append(place2,place1).astype(int) - if temp1[lonlen-1] ==1 and mm>200: - lons = lon[mm] - beg = mm - c[m,n,mm] + 1 - bl = np.arange(beg,mm+1,1).astype(int) - if mm>mn: #temp1[359] ==0: - lons = lon[mm] - beg = mm - c[m,n,mm] + 1 - bl = np.arange(beg,mm+1,1).astype(int) - temp2[bl] = 1 - temp2 = np.expand_dims(temp2,axis=0) - A = np.concatenate((A,temp2),axis=0) - - A = A[1:] - - ######### - Getting rid of non-consectutve Time steps which would prevent blocking - ################# - dd=[] - dy = [] - dA = A[0] - dA = np.expand_dims(dA,axis=0) - ct=0 - for i in np.arange(1,len(locy),1): - dd1 = locd[i-1] - dd2 = locd[i] - if dd2-dd1 > 2: - ct = 0 - continue - if ct == 0: - dd = np.append(dd,locd[i-1]) - dy = np.append(dy,locy[i-1]) - temp2 = np.expand_dims(A[i-1],axis=0) - dA = np.concatenate((dA,temp2),axis=0) - ct = ct + 1 - if dd2-dd1<=2: - dd=np.append(dd,locd[i]) - dy = np.append(dy,locy[i]) - temp2 = np.expand_dims(A[i],axis=0) - dA = np.concatenate((dA,temp2),axis=0) - ct = ct + 1 - - dA=dA[1:] - dAfin = dA - - ############ - Finding center longitude of block - ############## - middle=[] - for l in np.arange(0,len(dAfin),1): - temp = np.where(dAfin[l]==1)[0] - if len(temp) % 2 == 0: - temp = np.append(temp,0) - midtemp = np.median(temp) - middle = np.append(middle,midtemp) - - - #####Track blocks. Makes sure that blocks overlap with at least 10 longitude points on consecutive - overlap = self.gibl_overlap - btime = self.block_time - fin = [[]] - finloc = [[]] - ddcopy=dd*1.0 - noloc=[] - failloc = [[]] - for i in np.arange(0,len(c[:,0,0]),1): - yri = np.where(dy==i)[0] - B = [[]] - ddil =1.0 * ddcopy[yri] - dyy = np.where(dy==i)[0] - rem = [] - for dk in ddil: - if len(ddil) < btime: - continue - ddil = np.append(ddil[0]-1,ddil) - diff = np.diff(ddil) - diffB=[] - dB =1 - cnt = 1 - while dB<=2: - diffB = np.append(diffB,ddil[cnt]) - dB = diff[cnt-1] - if ddil[cnt]==ddil[-1]: - dB=5 - cnt=cnt+1 - diffB = np.array(self.Remove(diffB)) - locb = [] - for ll in diffB: - locb = np.append(locb,np.where((dy==i) & (dd==ll))[0]) - ddil=ddil[1:] - locbtemp = 1.0*locb - re=[] - for hh in np.arange(0,len(noloc),1): - re = np.append(re,np.where(locb == noloc[hh])[0]) - locbtemp = np.delete(locbtemp,re) - locb=locbtemp * 1.0 - datemp = dAfin[locb.astype(int)] - blocktemp = [[datemp[0]]] - locbi = np.array([locb[0]]) - ll1=0 - pass1 = 0 - ai=[0] - add=0 - for ll in np.arange(0,len(locb)-1,1): - if ((dd[locb[ll+1].astype(int)] - dd[locb[ll1].astype(int)]) >=1) & ((dd[locb[ll+1].astype(int)] - dd[locb[ll1].astype(int)]) <=2): - add = datemp[ll1] + datemp[ll+1] - ai = np.where(add==2)[0] - if len(ai)>overlap: - locbi=np.append(locbi,locb[ll+1]) - ll1=ll+1 - add=0 - if (len(ai)4: - noloc = np.append(noloc,locbi) - finloc = finloc + [locbi] - for jj in locbi: - rem = np.append(rem,np.where(dyy==jj)[0]) - ddil = np.delete(ddcopy[yri],rem.astype(int)) - if len(locbi)<=4: - noloc = np.append(noloc,locbi) - if len(locbi)<=2: - failloc=failloc+[locbi] - for jj in locbi: - rem = np.append(rem,np.where(dyy==jj)[0]) - ddil = np.delete(ddcopy[yri],rem.astype(int)) - - blocks = finloc[1:] - noblock = failloc[1:] - - ############Get rid of blocks that travel downstream########## - ######If center of blocks travel downstream further than 45 degrees longitude, - ######cancel block moment it travels out of this limit - newblock = [[]] - newnoblock=[[]] - distthresh = self.block_travel - for bb in blocks: - diffb = [] - start = middle[bb[0].astype(int)] - for bbs in bb: - diffb = np.append(diffb, start - middle[bbs.astype(int)]) - loc = np.where(np.abs(diffb) > distthresh)[0] - if len(loc)==0: - newblock = newblock +[bb] - if len(loc)>0: - if len(bb[:loc[0]]) >4: - newblock = newblock + [bb[:loc[0]]] - if len(bb[:loc[0]]) <=2: - noblock = noblock + [bb] - - blocks = newblock[1:] - - #Create a final array with blocking longitudes. Similar to IBL/GIBL, but those that pass the duration threshold - blockfreq = np.zeros((len(year),len(ibl[0,:,0]),360)) - savecbl=[] - savemiddle = [] - saveyr=[] - numblock=0 - for i in np.arange(0,len(blocks),1): - temp = blocks[i] - numblock=numblock+1 - for j in temp: - j=int(j) - daycomp = int(dd[j]) - yearcomp = int(dy[j]) - saveyr = np.append(saveyr,dy[j]) - middlecomp = middle[j].astype(int) - mc1 = int(round(middlecomp / 2.5)) - blockfreq[yearcomp,daycomp] = blockfreq[yearcomp,daycomp] + dAfin[j] - ct = ct + 1 - - return blockfreq From e2b87752cbce89bb8685cf05e363eacead15cdf3 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Fri, 4 Dec 2020 19:15:28 -0700 Subject: [PATCH 25/93] Another documentation file --- ush/Blocking_driver.py | 313 ----------------------------------------- 1 file changed, 313 deletions(-) delete mode 100644 ush/Blocking_driver.py diff --git a/ush/Blocking_driver.py b/ush/Blocking_driver.py deleted file mode 100644 index 26a47819ca..0000000000 --- a/ush/Blocking_driver.py +++ /dev/null @@ -1,313 +0,0 @@ -import sys -import os -import numpy as np -import netCDF4 -import re - -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), - os.pardir))) -sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy/metplotpy/blocking_s2s") -sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy_feature_33/metplotpy/blocking_s2s") -from Blocking import BlockingCalculation -from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence -from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub -from ush.master_metplus import get_config_inputs_from_command_line -from metplus.wrappers import PCPCombineWrapper -from metplus.wrappers import RegridDataPlaneWrapper -import plot_blocking as pb -from CBL_plot import create_cbl_plot - -def find_input_files(inconfig, use_init, intemplate, secondtemplate=''): - loop_time, end_time, time_interval = get_start_end_interval_times(inconfig) - skip_times = get_skip_times(inconfig) - - start_mth = loop_time.strftime('%m') - template = inconfig.getraw('config',intemplate) - if secondtemplate: - template2 = inconfig.getraw('config',secondtemplate) - file_list2 = [] - - file_list = [] - yr_list = [] - if use_init: - timname = 'init' - else: - timname = 'valid' - input_dict = {} - input_dict['loop_by'] = timname - pmth = start_mth - while loop_time <= end_time: - lead_seq = get_lead_sequence(inconfig) - for ls in lead_seq: - new_time = loop_time + ls - input_dict[timname] = loop_time - input_dict['lead'] = ls - - outtimestuff = ti_calculate(input_dict) - if skip_time(outtimestuff, skip_times): - continue - cmth = outtimestuff['valid'].strftime('%m') - filepath = do_string_sub(template, **outtimestuff) - if secondtemplate: - filepath2 = do_string_sub(template2, **outtimestuff) - if os.path.exists(filepath) and os.path.exists(filepath2): - file_list.append(filepath) - file_list2.append(filepath2) - else: - file_list.append('') - file_list2.append('') - else: - if os.path.exists(filepath): - file_list.append(filepath) - else: - file_list.append('') - - if (int(cmth) == int(start_mth)) and (int(pmth) != int(start_mth)): - yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) - pmth = cmth - - loop_time += time_interval - - if secondtemplate: - file_list = [file_list,file_list2] - yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) - - return file_list, yr_list - - -def main(): - - all_steps = ["REGRID","TIMEAVE","RUNMEAN","ANOMALY","CBL","PLOTCBL","IBL","PLOTIBL","GIBL","CALCBLOCKS","PLOTBLOCKS"] - - config_list = get_config_inputs_from_command_line() - - # If the user has defined the steps they want to run - # grab the command line parameter - steps_config_part_fcst = [s for s in config_list if "FCST_STEPS" in s] - steps_list_fcst = [] - - steps_config_part_obs = [s for s in config_list if "OBS_STEPS" in s] - steps_list_obs = [] - - # Setup the Steps - if steps_config_part_fcst: - steps_param_fcst = steps_config_part_fcst[0].split("=")[1] - steps_list_fcst = steps_param_fcst.split("+") - config_list.remove(steps_config_part_fcst[0]) - if steps_config_part_obs: - steps_param_obs = steps_config_part_obs[0].split("=")[1] - steps_list_obs = steps_param_obs.split("+") - config_list.remove(steps_config_part_obs[0]) - - #config = config_metplus.setup(config_list) - config = pre_run_setup(config_list) - if not steps_config_part_fcst: - steps_param_fcst = config.getstr('config','FCST_STEPS','') - steps_list_fcst = steps_param_fcst.split("+") - if not steps_config_part_obs: - steps_param_obs = config.getstr('config','OBS_STEPS','') - steps_list_obs = steps_param_obs.split("+") - - if not steps_list_obs and not steps_list_fcst: - print('No processing steps requested for either the model or observations,') - print('no data will be processed') - - - ###################################################################### - # Pre-Process Data: - ###################################################################### - # Regrid - if ("REGRID" in steps_list_obs): - print('Regridding Observations') - regrid_config = config_metplus.replace_config_from_section(config, 'regrid_obs') - RegridDataPlaneWrapper(regrid_config).run_all_times() - - if ("REGRID" in steps_list_fcst): - print('Regridding Model') - regrid_config = config_metplus.replace_config_from_section(config, 'regrid_fcst') - RegridDataPlaneWrapper(regrid_config).run_all_times() - - #Compute Daily Average - if ("TIMEAVE" in steps_list_obs): - print('Computing Daily Averages') - daily_config = config_metplus.replace_config_from_section(config, 'daily_mean_obs') - PCPCombineWrapper(daily_config).run_all_times() - - if ("TIMEAVE" in steps_list_fcst): - print('Computing Daily Averages') - daily_config = config_metplus.replace_config_from_section(config, 'daily_mean_fcst') - PCPCombineWrapper(daily_config).run_all_times() - - #Take a running mean - if ("RUNMEAN" in steps_list_obs): - print('Computing Obs Running means') - rmean_config = config_metplus.replace_config_from_section(config, 'running_mean_obs') - PCPCombineWrapper(rmean_config).run_all_times() - - if ("RUNMEAN" in steps_list_fcst): - print('Computing Model Running means') - rmean_config = config_metplus.replace_config_from_section(config, 'running_mean_fcst') - PCPCombineWrapper(rmean_config).run_all_times() - - #Compute anomaly - if ("ANOMALY" in steps_list_obs): - print('Computing Obs Anomalies') - anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly_obs') - PCPCombineWrapper(anomaly_config).run_all_times() - - if ("ANOMALY" in steps_list_fcst): - print('Computing Model Anomalies') - anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly_fcst') - PCPCombineWrapper(anomaly_config).run_all_times() - - - ###################################################################### - # Blocking Calculation and Plotting - ###################################################################### - # Set up the data - steps_fcst = BlockingCalculation(config,'FCST') - steps_obs = BlockingCalculation(config,'OBS') - - # Check to see if CBL's are used from an obs climatology - use_cbl_obs = config.getbool('Blocking','USE_CBL_OBS',False) - - # Calculate Central Blocking Latitude - cbl_config = config_metplus.replace_config_from_section(config,'Blocking') - cbl_config_init = config.find_section('Blocking','CBL_INIT_BEG') - cbl_config_valid = config.find_section('Blocking','CBL_VALID_BEG') - use_init = is_loop_by_init(cbl_config) - if use_init: - orig_beg = config.getstr('Blocking','INIT_BEG') - orig_end = config.getstr('Blocking','INIT_END') - if cbl_config_init is not None: - config.set('Blocking','INIT_BEG',config.getstr('Blocking','CBL_INIT_BEG')) - config.set('Blocking','INIT_END',config.getstr('Blocking','CBL_INIT_END')) - cbl_config = config_metplus.replace_config_from_section(config, 'Blocking') - else: - orig_beg = config.getstr('Blocking','VALID_BEG') - orig_end = config.getstr('Blocking','VALID_END') - if cbl_config_valid is not None: - config.set('Blocking','VALID_BEG',config.getstr('Blocking','CBL_VALID_BEG')) - config.set('Blocking','VALID_END',config.getstr('Blocking','CBL_VALID_END')) - cbl_config = config_metplus.replace_config_from_section(config, 'Blocking') - - if ("CBL" in steps_list_obs): - print('Computing Obs CBLs') - obs_infiles, yr_obs = find_input_files(cbl_config, use_init, 'OBS_BLOCKING_ANOMALY_TEMPLATE') - cbls_obs,lats_obs,lons_obs,yr_obs,mhweight_obs = steps_obs.run_CBL(obs_infiles,yr_obs) - - if ("CBL" in steps_list_fcst): - # Add in step to use obs for CBLS - print('Computing Forecast CBLs') - fcst_infiles,yr_fcst = find_input_files(cbl_config, use_init, 'FCST_BLOCKING_ANOMALY_TEMPLATE') - cbls_fcst,lats_fcst,lons_fcst,yr_fcst,mhweight_fcst = steps_fcst.run_CBL(fcst_infiles,yr_fcst) - elif use_cbl_obs: - cbls_fcst = cbls_obs - lats_fcst = lats_obs - lons_fcst = lons_obs - yr_fcst = yr_obs - mhweight_fcst = mhweight_obs - - #Plot Central Blocking Latitude - if ("PLOTCBL" in steps_list_obs): - cbl_plot_mthstr = config.getstr('Blocking','OBS_CBL_PLOT_MTHSTR') - cbl_plot_outname = config.getstr('Blocking','OBS_CBL_PLOT_OUTPUT_NAME') - create_cbl_plot(lons_obs, lats_obs, cbls_obs, mhweight_obs, cbl_plot_mthstr, cbl_plot_outname, do_averaging=True) - if ("PLOTCBL" in steps_list_fcst): - cbl_plot_mthstr = config.getstr('Blocking','FCST_CBL_PLOT_MTHSTR') - cbl_plot_outname = config.getstr('Blocking','FCST_CBL_PLOT_OUTPUT_NAME') - create_cbl_plot(lons_fcst, lats_fcst, cbls_fcst, mhweight_fcst, cbl_plot_mthstr, cbl_plot_outname, - do_averaging=True) - - - # Run IBL - if use_init: - config.set('Blocking','INIT_BEG',orig_beg) - config.set('Blocking','INIT_END',orig_end) - else: - config.set('Blocking','VALID_BEG',orig_beg) - config.set('Blocking','VALID_END',orig_end) - ibl_config = config_metplus.replace_config_from_section(config,'Blocking') - if ("IBL" in steps_list_obs) and not ("IBL" in steps_list_fcst): - #if ("IBL" in steps_list_obs): - print('Computing Obs IBLs') - obs_infiles, yr_obs = find_input_files(ibl_config, use_init, 'OBS_BLOCKING_TEMPLATE') - ibls_obs = steps_obs.run_Calc_IBL(cbls_obs,obs_infiles,yr_obs) - daynum_obs = np.arange(0,len(ibls_obs[0,:,0]),1) - #if ("IBL" in steps_list_fcst): - elif ("IBL" in steps_list_fcst) and not ("IBL" in steps_list_obs): - print('Computing Forecast IBLs') - fcst_infiles, yr_fcst = find_input_files(ibl_config, use_init, 'FCST_BLOCKING_TEMPLATE') - ibls_fcst = steps_fcst.run_Calc_IBL(cbls_fcst,fcst_infiles,yr_fcst) - daynum_fcst = np.arange(0,len(ibls_fcst[0,:,0]),1) - elif ("IBL" in steps_list_obs) and ("IBL" in steps_list_fcst): - both_infiles, yr_obs = find_input_files(ibl_config, use_init, 'OBS_BLOCKING_TEMPLATE', - secondtemplate='FCST_BLOCKING_TEMPLATE') - # TEST THIS - obs_infiles = both_infiles[0] - fcst_infiles = both_infiles[1] - yr_fcst = yr_obs - print('Computing Obs IBLs') - ibls_obs = steps_obs.run_Calc_IBL(cbls_obs,obs_infiles,yr_obs) - daynum_obs = np.arange(0,len(ibls_obs[0,:,0]),1) - print('Computing Forecast IBLs') - ibls_fcst = steps_fcst.run_Calc_IBL(cbls_fcst,fcst_infiles,yr_fcst) - daynum_fcst = np.arange(0,len(ibls_fcst[0,:,0]),1) - - # Plot IBLS - if("PLOTIBL" in steps_list_obs) and not ("PLOTIBL" in steps_list_fcst): - ibl_plot_title = config.getstr('Blocking','OBS_IBL_PLOT_TITLE','IBL Frequency') - ibl_plot_outname = config.getstr('Blocking','OBS_IBL_PLOT_OUTPUT_NAME','') - ibl_plot_label1 = config.getstr('Blocking','IBL_PLOT_OBS_LABEL','') - pb.plot_ibls(ibls_obs,lons_obs,ibl_plot_title,ibl_plot_outname,label1=ibl_plot_label1) - elif ("PLOTIBL" in steps_list_fcst) and not ("PLOTIBL" in steps_list_obs): - ibl_plot_title = config.getstr('Blocking','FCST_IBL_PLOT_TITLE','IBL Frequency') - ibl_plot_outname = config.getstr('Blocking','FCST_IBL_PLOT_OUTPUT_NAME') - ibl_plot_label1 = config.getstr('Blocking','IBL_PLOT_FCST_LABEL',None) - pb.plot_ibls(ibls_fcst,lons_fcst,ibl_plot_title,ibl_plot_outname,label1=ibl_plot_label1) - elif ("PLOTIBL" in steps_list_obs) and ("PLOTIBL" in steps_list_fcst): - ibl_plot_title = config.getstr('Blocking','IBL_PLOT_TITLE') - ibl_plot_outname = config.getstr('Blocking','IBL_PLOT_OUTPUT_NAME') - #Check to see if there are plot legend labels - ibl_plot_label1 = config.getstr('Blocking','IBL_PLOT_OBS_LABEL','Observation') - ibl_plot_label2 = config.getstr('Blocking','IBL_PLOT_FCST_LABEL','Forecast') - pb.plot_ibls(ibls_obs,lons_obs,ibl_plot_title,ibl_plot_outname,data2=ibls_fcst,lon2=lons_fcst, - label1=ibl_plot_label1,label2=ibl_plot_label2) - - - # Run GIBL - if ("GIBL" in steps_list_obs): - print('Computing GIBLs') - gibls_obs = steps_obs.run_Calc_GIBL(ibls_obs,lons_obs) - - if ("GIBL" in steps_list_fcst): - print('Computing GIBLs') - gibls_fcst = steps_fcst.run_Calc_GIBL(ibls_fcst,lons_fcst) - - - # Calc Blocks - if ("CALCBLOCKS" in steps_list_obs): - print('Computing Blocks') - block_freq_obs = steps_obs.run_Calc_Blocks(ibls_obs,gibls_obs,lons_obs,daynum_obs,yr_obs) - - if ("CALCBLOCKS" in steps_list_fcst): - print('Computing Blocks') - block_freq_fcst = steps_fcst.run_Calc_Blocks(ibls_fcst,gibls_fcst,lons_fcst,daynum_fcst,yr_fcst) - - # Plot Blocking Frequency - if ("PLOTBLOCKS" in steps_list_obs) and not ("PLOTBLOCKS" in steps_list_fcst): - blocking_plot_title = config.getstr('Blocking','OBS_BLOCKING_PLOT_TITLE') - blocking_plot_outname = config.getstr('Blocking','OBS_BLOCKING_PLOT_OUTPUT_NAME') - pb.plot_blocks(block_freq_obs,gibls_obs,ibls_obs,lons_obs,blocking_plot_title,blocking_plot_outname) - elif ("PLOTBLOCKS" in steps_list_fcst) and not ("PLOTBLOCKS" in steps_list_obs): - blocking_plot_title = config.getstr('Blocking','FCST_BLOCKING_PLOT_TITLE') - blocking_plot_outname = config.getstr('Blocking','FCST_BLOCKING_PLOT_OUTPUT_NAME') - pb.plot_blocks(block_freq_fcst,gibls_fcst,ibls_fcst,lons_fcst,blocking_plot_title,blocking_plot_outname) - elif ("PLOTBLOCKS" in steps_list_obs) and ("PLOTBLOCKS" in steps_list_fcst): - blocking_plot_title = config.getstr('Blocking','BLOCKING_PLOT_TITLE') - blocking_plot_outname = config.getstr('Blocking','BLOCKING_PLOT_OUTPUT_NAME') - pb.plot_blocks(block_freq,gibls,ibls,lons,blocking_plot_title,blocking_plot_outname) - - -if __name__ == "__main__": - main() From b86dab10f02cd326a0cd442bedd89121d2f08b46 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Fri, 4 Dec 2020 22:16:18 -0700 Subject: [PATCH 26/93] Added Documentation plot --- docs/_static/s2s-IBL_frequency.png | Bin 0 -> 6635 bytes .../Regrid_PCP_fcstGFS_obsERA_Blocking.conf | 123 ++++++++++++++++++ .../Regrid_PCP_obsERA_obsOnly_Blocking.conf | 6 +- ush/drivers/Blocking_driver.py | 2 + 4 files changed, 128 insertions(+), 3 deletions(-) create mode 100644 docs/_static/s2s-IBL_frequency.png create mode 100644 docs/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf mode change 100644 => 100755 ush/drivers/Blocking_driver.py diff --git a/docs/_static/s2s-IBL_frequency.png b/docs/_static/s2s-IBL_frequency.png new file mode 100644 index 0000000000000000000000000000000000000000..5594bb3b4e23a85feea3e52fcd7cd907f2a061c2 GIT binary patch literal 6635 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 BG1veA literal 0 HcmV?d00001 diff --git a/docs/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf b/docs/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf new file mode 100644 index 0000000000..a64c30b9cd --- /dev/null +++ b/docs/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf @@ -0,0 +1,123 @@ +""" +Blocking Calculation: RegridDataPlane, PcpCombine, and Blocking python code +============================================================================ + +model_applications/ +s2s/ +Regrid_PCP_fcstGFS_obsERA_Blocking.conf + +""" + +############################################################################## +# Scientific Objective +# -------------------- +# +# To compute the Central Blocking Latitude, Instantaneousy blocked latitudes, +# Group Instantaneousy blocked latitudes, and the frequency of atmospheric +# blocking using the Pelly-Hoskins Method. + +############################################################################## +# Datasets +# -------- +# +# * Forecast dataset: GEFS Forecast 500 mb height. +# * Observation dataset: ERA Reanlaysis 500 mb height. + +############################################################################## +# METplus Components +# ------------------ +# +# This use case runs the blocking driver script which runs the steps the user +# lists in STEPS_OBS. The possible steps are regridding (REGRID), time averaging +# (TIMEAVE), computing a running mean (RMEAN), computing anomalies (ANOMALY), computing CBLs +# (CBL), plotting CBLs (PLOTCBL), computing IBLs (IBL), plotting IBL frequency (PLOTIBL), +# computing GIBLs (GIBL), computing blocks (CALCBLOCKS), and plotting the blocking frequency +# (PLOTBLOCKS). The steps can be listed on the command line or in a .conf file and are +# formatted as follows: +# +# FCST_STEPS = REGRID+TIMEAVE+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS +# OBS_STEPS = REGRID+TIMEAVE+RUNMEAN+ANOMALY+CBL+PLOTCBL+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS + +############################################################################## +# METplus Workflow +# ---------------- +# +# The regrid_data_plane, pcp_combine, and blocking python code are run for each +# time for the forecast and observations data. This example loops by valid time. +# It processes 1 valid time, listed below. +# +# | **Valid:** 2020-02-06_12Z +# | **Forecast lead:** 36 + +############################################################################## +# METplus Configuration +# --------------------- +# +# METplus first loads all of the configuration files found in parm/metplus_config, +# then it loads any configuration files passed to METplus via the command line +# i.e. parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf +# +# .. highlight:: bash +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf + +############################################################################## +# MET Configuration +# --------------------- +# +# METplus sets environment variables based on the values in the METplus configuration file. +# These variables are referenced in the MET configuration file. **YOU SHOULD NOT SET ANY OF THESE ENVIRONMENT VARIABLES YOURSELF! THEY WILL BE OVERWRITTEN BY METPLUS WHEN IT CALLS THE MET TOOLS!** If there is a setting in the MET configuration file that is not controlled by an environment variable, you can add additional environment variables to be set only within the METplus environment using the [user_env_vars] section of the METplus configuration files. See the 'User Defined Config' section on the 'System Configuration' page of the METplus User's Guide for more information. +# +# See the following files for more information about the environment variables set in this configuration file. +# +# parm/use_cases/met_tool_wrapper/RegridDataPlane/RegridDataPlane.py +# parm/use_cases/met_tool_wrapper/PCPCombine/PCPCOmbine_derive.py +# parm/use_cases/met_tool_wrapper/PCPCombine/PCPCOmbine_subtract.py + +############################################################################## +# Running METplus +# --------------- +# +# This use case is run in the following ways: +# +# 1) Passing in Regrid_PCP_fcstGFS_obsERA_Blocking.conf then a user-specific system configuration file:: +# +# Blocking_driver.py /path/to/METplus/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf /path/to/user_system.conf +# +# 2) Passing in Regrid_PCP_fcstGFS_obsERA_Blocking.conf then a user-specific system configuration file and then listing steps:: +# +# Blocking_driver.py /path/to/METplus/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf /path/to/user_system.conf FCST_STEPS=REGRID+TIMEAVE+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS OBS_STEPS=REGRID+TIMEAVE+RUNMEAN+ANOMALY+CBL+PLOTCBL+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS +# +# The following variables must be set correctly: +# +# * **INPUT_BASE** - Path to directory where sample data tarballs are unpacked (See Datasets section to obtain tarballs). This is not required to run METplus, but it is required to run the examples in parm/use_cases +# * **OUTPUT_BASE** - Path where METplus output will be written. This must be in a location where you have write permissions +# * **MET_INSTALL_DIR** - Path to location where MET is installed locally +# +# Example User Configuration File:: +# +# [dir] +# INPUT_BASE = /path/to/sample/input/data +# OUTPUT_BASE = /path/to/output/dir +# MET_INSTALL_DIR = /path/to/met-X.Y +# + +############################################################################## +# Expected Output +# --------------- +# +# Refer to the value set for **OUTPUT_BASE** to find where the output data was generated. Output for this use +# case will be found in model_applications/s2s/Blocking (relative to **OUTPUT_BASE**) and will contain output +# for the steps requested. This may include the regridded data, daily averaged files, running mean files, +# anomaly files, the CBL , an IBL frequency plot, and blocking frequency plots. + +############################################################################## +# Keywords +# -------- +# +# sphinx_gallery_thumbnail_path = '_static/s2s-IBL_frequency.png' +# +# .. note:: `RegridDataPlaneUseCase `_, +# `PCPCombineUseCase `_, +# `S2SAppUseCase `_, +# `NetCDFFileUseCase `_, +# `GRIB2FileUseCase `_, diff --git a/docs/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf b/docs/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf index 0809bcd90d..a9880ee08f 100644 --- a/docs/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf +++ b/docs/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf @@ -52,7 +52,7 @@ Regrid_PCP_obsERA_obsOnly_Blocking.conf # # METplus first loads all of the configuration files found in parm/metplus_config, # then it loads any configuration files passed to METplus via the command line -# with the -c option, i.e. -c parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf +# i.e. parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf # # .. highlight:: bash # .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf @@ -78,11 +78,11 @@ Regrid_PCP_obsERA_obsOnly_Blocking.conf # # 1) Passing in Regrid_PCP_obsERA_obsOnly_Blocking.conf then a user-specific system configuration file:: # -# blocking_driver.py /path/to/METplus/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf /path/to/user_system.conf +# Blocking_driver.py /path/to/METplus/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf /path/to/user_system.conf # # 2) Passing in Regrid_PCP_obsERA_obsOnly_Blocking.conf then a user-specific system configuration file and then listing steps:: # -# blocking_driver.py /path/to/METplus/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf /path/to/user_system.conf OBS_STEPS=REGRID+TIMEAVE+RUNMEAN+ANOMALY+CBL+PLOTCBL+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS +# Blocking_driver.py /path/to/METplus/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf /path/to/user_system.conf OBS_STEPS=REGRID+TIMEAVE+RUNMEAN+ANOMALY+CBL+PLOTCBL+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS # # The following variables must be set correctly: # diff --git a/ush/drivers/Blocking_driver.py b/ush/drivers/Blocking_driver.py old mode 100644 new mode 100755 index 079df63163..efa6c7e727 --- a/ush/drivers/Blocking_driver.py +++ b/ush/drivers/Blocking_driver.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python3 + import sys import os import numpy as np From 72557abc3e7f6388059047f6a482f0211e76c675 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Fri, 8 Jan 2021 12:35:04 -0700 Subject: [PATCH 27/93] Adding Weather Regime driver --- ...grid_PCP_obsERA_obsOnly_WeatherRegime.conf | 144 ++++++++++++ ush/drivers/Blocking.py | 68 +----- ush/drivers/Blocking_WeatherRegime_util.py | 126 ++++++++++ ush/drivers/Blocking_driver.py | 104 ++------- ush/drivers/WeatherRegime.py | 221 ++++++++++++++++++ ush/drivers/WeatherRegime_driver.py | 111 +++++++++ 6 files changed, 630 insertions(+), 144 deletions(-) create mode 100644 parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf create mode 100644 ush/drivers/Blocking_WeatherRegime_util.py create mode 100644 ush/drivers/WeatherRegime.py create mode 100755 ush/drivers/WeatherRegime_driver.py diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf new file mode 100644 index 0000000000..5ea29a77b0 --- /dev/null +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf @@ -0,0 +1,144 @@ +# Blocking METplus Configuration +[config] +# Steps to Run +OBS_STEPS = ELBOW + +# time looping - options are INIT, VALID, RETRO, and REALTIME +LOOP_BY = VALID + +# Format of INIT_BEG and INIT_END +VALID_TIME_FMT = %Y%m%d%H + +# Start time for METplus run +VALID_BEG = 1979120100 + +# End time for METplus run +VALID_END = 2017022818 + +# list of forecast leads to process +LEAD_SEQ = 0 + +# Only Process DJF +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" + +LOOP_ORDER = processes + +OBS_RUN = True + + + +[regrid_obs] +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 21600 + +# List of applications to run +PROCESS_LIST = RegridDataPlane + +# REGRID_DATA_PLANE (Step 1) +# Run regrid_data_plane on forecast data +OBS_REGRID_DATA_PLANE_RUN = {OBS_RUN} + +# If true, process each field individually and write a file for each +# If false, run once per run time passing in all fields specified +OBS_DATA_PLANE_ONCE_PER_FIELD = False + +# Name of input field to process +OBS_REGRID_DATA_PLANE_VAR1_INPUT_FIELD_NAME = Z + +# Level of input field to process +OBS_REGRID_DATA_PLANE_VAR1_INPUT_LEVEL = P500 + +# Name of output field to create +OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = Z500 + +# Mask to use for regridding +#REGRID_DATA_PLANE_VERIF_GRID = {MASK_DIR}/NH_block_grid.nc +REGRID_DATA_PLANE_VERIF_GRID = latlon 360 90 89 0 -1.0 1.0 + +# Method to run regrid_data_plane, not setting this will default to NEAREST +REGRID_DATA_PLANE_METHOD = BILIN + +# Regridding width used in regrid_data_plane, not setting this will default to 1 +REGRID_DATA_PLANE_WIDTH = 2 + +[dir] +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + +# input and output data directories for each application in PROCESS_LIST +OBS_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds627.0/ei.oper.an.pl +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s + +[filename_templates] +# format of filenames +# Input ERA Interim +OBS_REGRID_DATA_PLANE_INPUT_TEMPLATE = {valid?fmt=%Y%m}/ei.oper.an.pl.regn128sc.{valid?fmt=%Y%m%d%H} +OBS_REGRID_DATA_PLANE_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{init?fmt=%Y%m%d%H}_NH.nc + + + +[daily_mean_obs] +# Start time for METplus run +VALID_BEG = 1979120118 + +# End time for METplus run +VALID_END = 2017022818 + +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 86400 + +LOOP_ORDER = processes + +# List of applications to run +PROCESS_LIST = PcpCombine + +# PCP_COMBINE (Step 1) +# run pcp_combine on obs data +OBS_PCP_COMBINE_RUN = {OBS_RUN} + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, and DERIVE +OBS_PCP_COMBINE_METHOD = DERIVE +OBS_PCP_COMBINE_STAT_LIST = MEAN + +# field name of 1 hr accumulation in forecast files +OBS_PCP_COMBINE_INPUT_ACCUMS = 6 +OBS_PCP_COMBINE_INPUT_NAMES = Z500 +OBS_PCP_COMBINE_INPUT_LEVELS = "(*,*)" +OBS_PCP_COMBINE_INPUT_OPTIONS = convert(x) = x / 9.81; set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S?shift=-64800}"; +OBS_PCP_COMBINE_OUTPUT_NAME = Z500 +OBS_PCP_COMBINE_OUTPUT_ACCUM = 24 +OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 + +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + +# input and output data directories for each application in PROCESS_LIST +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/daily + +# Input ERA Interim +OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc +OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d?shift=-64800}_NH.nc + + + +[WeatherRegime] +VALID_BEG = 1979120100 + +# End time for METplus run +VALID_END = 2017022800 + +VALID_INCREMENT = 86400 + +# Directory for the Z500 data to read in to the blocking python code +OBS_WR_TEMPLATE = {OUTPUT_BASE}/s2s/daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc + +# Variable for the Z500 data +OBS_WR_VAR = Z500 + +# Weather Regime Number +OBS_WR_NUMBER = 6 + +# Number of clusters +OBS_NUM_CLUSTERS = 20 diff --git a/ush/drivers/Blocking.py b/ush/drivers/Blocking.py index 73b34cf76d..22954dc776 100644 --- a/ush/drivers/Blocking.py +++ b/ush/drivers/Blocking.py @@ -1,7 +1,6 @@ import os -#import glob import numpy as np -import netCDF4 +#import netCDF4 import pandas as pd import datetime import bisect @@ -9,6 +8,7 @@ from scipy.signal import argrelextrema from metplus.util import config_metplus, get_start_end_interval_times, get_lead_sequence from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate +from Blocking_WeatherRegime_util import read_nc_met class BlockingCalculation(): """Contains the programs to calculate Blocking via the Pelly-Hoskins Method @@ -28,75 +28,15 @@ def __init__(self,config,label): self.block_travel = config.getint('Blocking',label+'_BLOCK_TRAVEL',45) self.block_method = config.getstr('Blocking',label+'_BLOCK_METHOD','PH') - # Get a date list for the data - #blocking_config = config_metplus.replace_config_from_section(config, 'Blocking') - #use_init = is_loop_by_init(blocking_config) - - #self.date_list, self.ymd_list, self.start_mth = self.get_date_list(blocking_config,use_init) - - # Check to see if a separate CBL start/end date is present - #cbl_config_init = config.find_section('Blocking','CBL_INIT_BEG') - #cbl_config_valid = config.find_section('Blocking','CBL_VALID_BEG') - #if use_init and (cbl_config_init is not None): - # config.set('Blocking','INIT_BEG',config.getstr('Blocking','CBL_INIT_BEG')) - # config.set('Blocking','INIT_END',config.getstr('Blocking','CBL_INIT_END')) - # blocking_config = config_metplus.replace_config_from_section(config, 'Blocking') - # self.cbl_date_list, self.cbl_ymd_list, self.cbl_start_mth = self.get_date_list(blocking_config,use_init) - #elif cbl_config_valid is not None: - # config.set('Blocking','VALID_BEG',config.getstr('Blocking','CBL_VALID_BEG')) - # config.set('Blocking','VALID_END',config.getstr('Blocking','CBL_VALID_END')) - # blocking_config = config_metplus.replace_config_from_section(config, 'Blocking') - # self.cbl_date_list, self.cbl_ymd_list, self.cbl_start_mth = self.get_date_list(blocking_config,use_init) - #else: - # self.cbl_date_list = self.date_list - # self.cbl_ymd_list = self.ymd_list - # self.cbl_start_mth = self.start_mth - # Check data requirements if self.smoothing_pts % 2 == 0: print('ERROR: Smoothing Radius must be an odd number given in grid points, Exiting...') exit() - def read_nc_met(self,infiles,yrlist,invar): - - print("Reading in Data") - - #Find the first non empty file name so I can get the variable sizes - locin = next(sub for sub in infiles if sub) - indata = netCDF4.Dataset(locin) - lats = indata.variables['lat'][:] - lons = indata.variables['lon'][:] - invar_arr = indata.variables[invar][:] - indata.close() - - var_3d = np.empty([len(infiles),len(invar_arr[:,0]),len(invar_arr[0,:])]) - - for i in range(0,len(infiles)): - - #Read in the data - if infiles[i]: - indata = netCDF4.Dataset(infiles[i]) - new_invar = indata.variables[invar][:] - #new_invar = np.expand_dims(new_invar,axis=0) - init_time_str = indata.variables[invar].getncattr('init_time') - valid_time_str = indata.variables[invar].getncattr('valid_time') - indata.close() - else: - new_invar = np.empty((1,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) - new_invar[:] = np.nan - var_3d[i,:,:] = new_invar - - yr = np.array(yrlist) - sdim = len(var_3d[:,0,0])/float(len(yrlist)) - var_4d = np.reshape(var_3d,[len(yrlist),int(sdim),len(var_3d[0,:,0]),len(var_3d[0,0,:])]) - - return var_4d,lats,lons,yr - - def run_CBL(self,cblinfiles,cblyrs): - z500_anom_4d,lats,lons,yr = self.read_nc_met(cblinfiles,cblyrs,self.blocking_anomaly_var) + z500_anom_4d,lats,lons,yr = read_nc_met(cblinfiles,cblyrs,self.blocking_anomaly_var) #Create Latitude Weight based for NH cos = lats @@ -161,7 +101,7 @@ def run_mod_blocking1d(self,a,cbl,lat,lon,meth): def run_Calc_IBL(self,cbl,iblinfiles,iblyr): - z500_daily,lats,lons,yr = self.read_nc_met(iblinfiles,iblyr,self.blocking_var) + z500_daily,lats,lons,yr = read_nc_met(iblinfiles,iblyr,self.blocking_var) #Initilize arrays for IBLs and the blocking index # yr, day, lon diff --git a/ush/drivers/Blocking_WeatherRegime_util.py b/ush/drivers/Blocking_WeatherRegime_util.py new file mode 100644 index 0000000000..9bd27940b8 --- /dev/null +++ b/ush/drivers/Blocking_WeatherRegime_util.py @@ -0,0 +1,126 @@ +import os +import netCDF4 +import numpy as np +from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence +from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub + +def parse_steps(config_list): + + steps_config_part_fcst = [s for s in config_list if "FCST_STEPS" in s] + steps_list_fcst = [] + + steps_config_part_obs = [s for s in config_list if "OBS_STEPS" in s] + steps_list_obs = [] + + # Setup the Steps + if steps_config_part_fcst: + steps_param_fcst = steps_config_part_fcst[0].split("=")[1] + steps_list_fcst = steps_param_fcst.split("+") + config_list.remove(steps_config_part_fcst[0]) + if steps_config_part_obs: + steps_param_obs = steps_config_part_obs[0].split("=")[1] + steps_list_obs = steps_param_obs.split("+") + config_list.remove(steps_config_part_obs[0]) + + config = pre_run_setup(config_list) + if not steps_config_part_fcst: + steps_param_fcst = config.getstr('config','FCST_STEPS','') + steps_list_fcst = steps_param_fcst.split("+") + if not steps_config_part_obs: + steps_param_obs = config.getstr('config','OBS_STEPS','') + steps_list_obs = steps_param_obs.split("+") + + return steps_list_fcst, steps_list_obs, config_list + + +def find_input_files(inconfig, use_init, intemplate, secondtemplate=''): + loop_time, end_time, time_interval = get_start_end_interval_times(inconfig) + skip_times = get_skip_times(inconfig) + + start_mth = loop_time.strftime('%m') + template = inconfig.getraw('config',intemplate) + if secondtemplate: + template2 = inconfig.getraw('config',secondtemplate) + file_list2 = [] + + file_list = [] + yr_list = [] + if use_init: + timname = 'init' + else: + timname = 'valid' + input_dict = {} + input_dict['loop_by'] = timname + pmth = start_mth + while loop_time <= end_time: + lead_seq = get_lead_sequence(inconfig) + for ls in lead_seq: + new_time = loop_time + ls + input_dict[timname] = loop_time + input_dict['lead'] = ls + + outtimestuff = ti_calculate(input_dict) + if skip_time(outtimestuff, skip_times): + continue + cmth = outtimestuff['valid'].strftime('%m') + filepath = do_string_sub(template, **outtimestuff) + if secondtemplate: + filepath2 = do_string_sub(template2, **outtimestuff) + if os.path.exists(filepath) and os.path.exists(filepath2): + file_list.append(filepath) + file_list2.append(filepath2) + else: + file_list.append('') + file_list2.append('') + else: + if os.path.exists(filepath): + file_list.append(filepath) + else: + file_list.append('') + + if (int(cmth) == int(start_mth)) and (int(pmth) != int(start_mth)): + yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) + pmth = cmth + + loop_time += time_interval + + if secondtemplate: + file_list = [file_list,file_list2] + yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) + + return file_list, yr_list + +def read_nc_met(infiles,yrlist,invar): + + print("Reading in Data") + + #Find the first non empty file name so I can get the variable sizes + locin = next(sub for sub in infiles if sub) + indata = netCDF4.Dataset(locin) + lats = indata.variables['lat'][:] + lons = indata.variables['lon'][:] + invar_arr = indata.variables[invar][:] + indata.close() + + var_3d = np.empty([len(infiles),len(invar_arr[:,0]),len(invar_arr[0,:])]) + + for i in range(0,len(infiles)): + + #Read in the data + if infiles[i]: + indata = netCDF4.Dataset(infiles[i]) + new_invar = indata.variables[invar][:] + #new_invar = np.expand_dims(new_invar,axis=0) + init_time_str = indata.variables[invar].getncattr('init_time') + valid_time_str = indata.variables[invar].getncattr('valid_time') + indata.close() + else: + new_invar = np.empty((1,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) + new_invar[:] = np.nan + var_3d[i,:,:] = new_invar + + yr = np.array(yrlist) + sdim = len(var_3d[:,0,0])/float(len(yrlist)) + var_4d = np.reshape(var_3d,[len(yrlist),int(sdim),len(var_3d[0,:,0]),len(var_3d[0,0,:])]) + + return var_4d,lats,lons,yr diff --git a/ush/drivers/Blocking_driver.py b/ush/drivers/Blocking_driver.py index efa6c7e727..ea105ce6f8 100755 --- a/ush/drivers/Blocking_driver.py +++ b/ush/drivers/Blocking_driver.py @@ -18,97 +18,41 @@ from metplus.wrappers import RegridDataPlaneWrapper import plot_blocking as pb from CBL_plot import create_cbl_plot - -def find_input_files(inconfig, use_init, intemplate, secondtemplate=''): - loop_time, end_time, time_interval = get_start_end_interval_times(inconfig) - skip_times = get_skip_times(inconfig) - - start_mth = loop_time.strftime('%m') - template = inconfig.getraw('config',intemplate) - if secondtemplate: - template2 = inconfig.getraw('config',secondtemplate) - file_list2 = [] - - file_list = [] - yr_list = [] - if use_init: - timname = 'init' - else: - timname = 'valid' - input_dict = {} - input_dict['loop_by'] = timname - pmth = start_mth - while loop_time <= end_time: - lead_seq = get_lead_sequence(inconfig) - for ls in lead_seq: - new_time = loop_time + ls - input_dict[timname] = loop_time - input_dict['lead'] = ls - - outtimestuff = ti_calculate(input_dict) - if skip_time(outtimestuff, skip_times): - continue - cmth = outtimestuff['valid'].strftime('%m') - filepath = do_string_sub(template, **outtimestuff) - if secondtemplate: - filepath2 = do_string_sub(template2, **outtimestuff) - if os.path.exists(filepath) and os.path.exists(filepath2): - file_list.append(filepath) - file_list2.append(filepath2) - else: - file_list.append('') - file_list2.append('') - else: - if os.path.exists(filepath): - file_list.append(filepath) - else: - file_list.append('') - - if (int(cmth) == int(start_mth)) and (int(pmth) != int(start_mth)): - yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) - pmth = cmth - - loop_time += time_interval - - if secondtemplate: - file_list = [file_list,file_list2] - yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) - - return file_list, yr_list - +from Blocking_WeatherRegime_util import find_input_files, parse_steps def main(): all_steps = ["REGRID","TIMEAVE","RUNMEAN","ANOMALY","CBL","PLOTCBL","IBL","PLOTIBL","GIBL","CALCBLOCKS","PLOTBLOCKS"] - config_list = get_config_inputs_from_command_line() + inconfig_list = get_config_inputs_from_command_line() + steps_list_fcst,steps_list_obs,config_list = parse_steps(inconfig_list) + config = pre_run_setup(config_list) # If the user has defined the steps they want to run # grab the command line parameter - steps_config_part_fcst = [s for s in config_list if "FCST_STEPS" in s] - steps_list_fcst = [] + #steps_config_part_fcst = [s for s in config_list if "FCST_STEPS" in s] + #steps_list_fcst = [] - steps_config_part_obs = [s for s in config_list if "OBS_STEPS" in s] - steps_list_obs = [] + #steps_config_part_obs = [s for s in config_list if "OBS_STEPS" in s] + #steps_list_obs = [] # Setup the Steps - if steps_config_part_fcst: - steps_param_fcst = steps_config_part_fcst[0].split("=")[1] - steps_list_fcst = steps_param_fcst.split("+") - config_list.remove(steps_config_part_fcst[0]) - if steps_config_part_obs: - steps_param_obs = steps_config_part_obs[0].split("=")[1] - steps_list_obs = steps_param_obs.split("+") - config_list.remove(steps_config_part_obs[0]) - - #config = config_metplus.setup(config_list) - config = pre_run_setup(config_list) - if not steps_config_part_fcst: - steps_param_fcst = config.getstr('config','FCST_STEPS','') - steps_list_fcst = steps_param_fcst.split("+") - if not steps_config_part_obs: - steps_param_obs = config.getstr('config','OBS_STEPS','') - steps_list_obs = steps_param_obs.split("+") + #if steps_config_part_fcst: + # steps_param_fcst = steps_config_part_fcst[0].split("=")[1] + # steps_list_fcst = steps_param_fcst.split("+") + # config_list.remove(steps_config_part_fcst[0]) + #if steps_config_part_obs: + # steps_param_obs = steps_config_part_obs[0].split("=")[1] + # steps_list_obs = steps_param_obs.split("+") + # config_list.remove(steps_config_part_obs[0]) + + #config = pre_run_setup(config_list) + #if not steps_config_part_fcst: + # steps_param_fcst = config.getstr('config','FCST_STEPS','') + # steps_list_fcst = steps_param_fcst.split("+") + #if not steps_config_part_obs: + # steps_param_obs = config.getstr('config','OBS_STEPS','') + # steps_list_obs = steps_param_obs.split("+") if not steps_list_obs and not steps_list_fcst: print('No processing steps requested for either the model or observations,') diff --git a/ush/drivers/WeatherRegime.py b/ush/drivers/WeatherRegime.py new file mode 100644 index 0000000000..465d7bdf63 --- /dev/null +++ b/ush/drivers/WeatherRegime.py @@ -0,0 +1,221 @@ +import os +import numpy as np +from netCDF4 import Dataset +from pylab import * +from sklearn.cluster import KMeans +from scipy import stats,signal +from numpy import ones,vstack +from numpy.linalg import lstsq +from metplus.util import config_metplus, get_start_end_interval_times, get_lead_sequence +from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate +from Blocking_WeatherRegime_util import read_nc_met + +class WeatherRegimeCalculation(): + """Contains the programs to perform a Weather Regime Analysis + """ + def __init__(self,config,label): + + self.invar = config.getstr('WeatherRegime',label+'_WR_VAR','') + self.wrnum = config.getint('WeatherRegime',label+'_WR_NUMBER',6) + self.numi = config.getint('WeatherRegime',label+'_NUM_CLUSTERS',20) + + + def get_cluster_fraction(self, m, label): + return (m.labels_==label).sum()/(m.labels_.size*1.0) + + + def weights_detrend(self,lats,lons,indata): + + ##Set up weight array + cos = lats * np.pi / 180.0 + way = np.cos(cos) + weightf = np.repeat(way[:,np.newaxis],len(lons),axis=1) + + #Remove trend and seasonal cycle + atemp = np.zeros(indata.shape) + for i in np.arange(0,len(indata[0,:,0,0]),1): + atemp[:,i] = signal.detrend(atemp[:,i],axis=0) + atemp[:,i] = (indata[:,i] - np.nanmean(indata[:,i],axis=0)) * weightf + + a = atemp + atemp=0 + + #Reshape into time X space + a1 = np.reshape(a,[len(a[:,0,0,0])*len(a[0,:,0,0]),len(lons)*len(lats)]) + + return a,a1 + + + def run_elbow(self,elbowinfiles,elbowyrs): + wrnum=6 + k=KMeans(n_clusters=wrnum, random_state=0, n_jobs=-1) #Initilize cluster centers + + a,lat,lon,yr = read_nc_met(elbowinfiles,elbowyrs,self.invar) + + #var = 'Z500' + #file1 = '/glade/work/demiller/ERAi/Z/Z500day/Z500dayDJF.nc' + #f1 = Dataset(file1, mode="r") + #dec = f1.variables[var][:] + #a=np.array(dec) + #f1.close() + + #Set your domain. Limits below specify US + lon1=230 + lon2=301 + lat1=35 #index, lat = 90-lat1 + lat2=66 #index, lat = 90-lat2 + + a = a[:,:,lat1:lat2,lon1:lon2] + + #US Lats and lons + lat = np.arange(90-lat1,90-lat2,-1) + lon = np.arange(lon1,lon2,1) + + a,a1 = self.weights_detrend(lat,lon,a) + ##Set up weight array + #cos = lat * np.pi / 180.0 + #way = np.cos(cos) + #weightf = np.repeat(way[:,np.newaxis],len(lon),axis=1) + + #Remove trend and seasonal cycle + #atemp = np.zeros(a.shape) + #for i in np.arange(0,len(a[0,:,0,0]),1): + # atemp[:,i] = signal.detrend(atemp[:,i],axis=0) + # atemp[:,i] = (a[:,i] - np.nanmean(a[:,i],axis=0)) * weightf + + #a = atemp + #atemp=0 + + #Reshape into time X space + #a1 = np.reshape(a,[len(a[:,0,0,0])*len(a[0,:,0,0]),len(lon)*len(lat)]) + + #Calculate sum of squared distances for clusters 1-15 + kind = np.arange(1,self.numi,1) + Sum_of_squared_distances = [] + K = range(1,self.numi) + for k in K: + km = KMeans(n_clusters=k) + km = km.fit(a1) + Sum_of_squared_distances.append(km.inertia_) + + # Calculate the bend of elbow + points = [(K[0],Sum_of_squared_distances[0]),(K[-1],Sum_of_squared_distances[-1])] + x_coords, y_coords = zip(*points) + A = vstack([x_coords,ones(len(x_coords))]).T + m, c = lstsq(A, y_coords,rcond=None)[0] + line = m*kind + c + curve = Sum_of_squared_distances + curve=np.array(curve)*10**-10 + line = line*10**-10 + + d=[] + for i in np.arange(0,self.numi-1,1): + p1=np.array([K[0],curve[0]]) + p2=np.array([K[-1],curve[-1]]) + p3=np.array([K[i],curve[i]]) + d=np.append(d,np.cross(p2-p1,p3-p1)/np.linalg.norm(p2-p1)) + + mi = np.where(d==d.min())[0] + print('Optimal Cluster # = '+str(mi+1)+'') + + print(line) + print(curve) + exit() + return a,lat,lon,yr,K,d,mi,line,curve + + + def Calc_EOF(self,Z500in,lats,lons): + + #Set your domain. Limits below specify US + lon1=230 + lon2=301 + lat1=35 #index, lat = 90-lat1 + lat2=66 #index, lat = 90-lat2 + + a = a[:,:,lat1:lat2,lon1:lon2] + + #US Lats and lons + lat = np.arange(90-lat1,90-lat2,-1) + lon = np.arange(lon1,lon2,1) + + eofin = a #signal.detrend + #Remove trend and seasonal cycle + for d in np.arange(0,len(eofin[0,:,0,0]),1): + eofin[:,d] = signal.detrend(eofin[:,d],axis=0) + eofin[:,d] = eofin[:,d] - np.nanmean(eofin[:,d],axis=0) + + #Reshape into time X space + eofin = np.reshape(eofin,(len(eofin[:,0,0,0])*len(eofin[0,:,0,0]),len(eofin[0,0,:,0])*len(eofin[0,0,0,:]))) + + # Use EOF solver and get PCs and EOFs + solver = Eof(eofin,center=False) + pc = solver.pcs(npcs=NUMPCS,pcscaling=1) + eof = solver.eofsAsCovariance(neofs=NUMPCS,pcscaling=1) + eof = np.reshape(eof,(NUMPCS,len(lats),len(lons))) + + #Get variance fractions + variance_fractions = solver.varianceFraction(neigs=10) * 100 + print(variance_fractions) + + lonext=lons + latext=lats + + return + + + def run_K_means(self,Z500in,lats,lons): + + #Set your domain. Limits below specify US + lon1=230 + lon2=301 + lat1=35 #index, lat = 90-lat1 + lat2=66 #index, lat = 90-lat2 + + a = a[:,:,lat1:lat2,lon1:lon2] + + #US Lats and lons + lat = np.arange(90-lat1,90-lat2,-1) + lon = np.arange(lon1,lon2,1) + + a,a1 = self.weights_detrend(lats,lons,z500in) + + #fit the K-means algorithm to the data + f=k.fit(a1) + + #Obtain the cluster anomalies + y=f.cluster_centers_ + + #Obtain cluster labels for each day [Reshape to Year,day] + wr = f.labels_ + wr = np.reshape(wr,[len(a[:,0,0,0]),len(a[0,:,0,0])]) + + yf = np.reshape(y,[self.wrnum,len(lat),len(lon)]) # reshape cluster anomalies to latlon + + #Get frequency of occurence for each cluster + perc=np.zeros(self.wrnum) + for ii in np.arange(0,self.wrnum,1): + perc[ii] = get_cluster_fraction(f,ii) + + #Sort % from low to high + ii = np.argsort(perc) + print(perc[ii]) + + #Reorder + perc = perc[ii] + input=yf[ii] + ii = ii[::-1] + + #Reorder from max to min and relabel + wrc = wr*1.0/1.0 + for i in np.arange(0,self.wrnum,1): + wrc[wr==ii[i]] = i + + perc = perc[::-1] + input = input[::-1] + + #Save Label data [YR,DAY] + np.save('WR_LABELS',wrc) + print(wr.shape) + + return + diff --git a/ush/drivers/WeatherRegime_driver.py b/ush/drivers/WeatherRegime_driver.py new file mode 100755 index 0000000000..ad85fec3d0 --- /dev/null +++ b/ush/drivers/WeatherRegime_driver.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 + +import sys +import os +import numpy as np +import netCDF4 +import re + +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), + os.pardir,os.pardir))) +sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy_feature_74/metplotpy/contributed/blocking_s2s") +from WeatherRegime import WeatherRegimeCalculation +from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence +from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub +from ush.master_metplus import get_config_inputs_from_command_line +from metplus.wrappers import PCPCombineWrapper +from metplus.wrappers import RegridDataPlaneWrapper +import plot_weather_regime as pwr +from Blocking_WeatherRegime_util import find_input_files, parse_steps + +def main(): + + all_steps = ["REGRID","TIMEAVE","ELBOW","PLOTELBOW","CALCEOF","PLOTEOF","KMEANS","PLOTBLOCKS"] + + inconfig_list = get_config_inputs_from_command_line() + steps_list_fcst,steps_list_obs,config_list = parse_steps(inconfig_list) + config = pre_run_setup(config_list) + + if not steps_list_obs and not steps_list_fcst: + print('No processing steps requested for either the model or observations,') + print('no data will be processed') + + #Check to make sure the setps have the required pre-steps + + ###################################################################### + # Pre-Process Data: + ###################################################################### + # Regrid + if ("REGRID" in steps_list_obs): + print('Regridding Observations') + regrid_config = config_metplus.replace_config_from_section(config, 'regrid_obs') + RegridDataPlaneWrapper(regrid_config).run_all_times() + + if ("REGRID" in steps_list_fcst): + print('Regridding Model') + regrid_config = config_metplus.replace_config_from_section(config, 'regrid_fcst') + RegridDataPlaneWrapper(regrid_config).run_all_times() + + #Compute Daily Average + if ("TIMEAVE" in steps_list_obs): + print('Computing Daily Averages') + daily_config = config_metplus.replace_config_from_section(config, 'daily_mean_obs') + PCPCombineWrapper(daily_config).run_all_times() + + if ("TIMEAVE" in steps_list_fcst): + print('Computing Daily Averages') + daily_config = config_metplus.replace_config_from_section(config, 'daily_mean_fcst') + PCPCombineWrapper(daily_config).run_all_times() + + + ###################################################################### + # Blocking Calculation and Plotting + ###################################################################### + # Set up the data + steps_obs = WeatherRegimeCalculation(config,'OBS') + steps_fcst = WeatherRegimeCalculation(config,'FCST') + + elbow_config = config_metplus.replace_config_from_section(config,'WeatherRegime') + elbow_config_init = config.find_section('WeatherRegime','INIT_BEG') + elbow_config_valid = config.find_section('WeatherRegime','VALID_BEG') + use_init = is_loop_by_init(elbow_config) + + if ("ELBOW" in steps_list_obs): + print('Running Obs Elbow.py') + obs_infiles, yr_obs = find_input_files(elbow_config, use_init, 'OBS_WR_TEMPLATE') + elbow_obs,lats_obs,lons_obs,yr_obs,K_obs,d_obs,mi_obs,line_obs,curve_obs = steps_obs.run_elbow(obs_infiles,yr_obs) + + if ("ELBOW" in steps_list_fcst): + print('Running Forecast Elbow.py') + fcst_infiles,yr_fcst = find_input_files(elbow_config, use_init, 'FCST_WR_TEMPLATE') + elbow_fcst,lats_fcst,lons_fcst,yr_fcst,K_fcst,d_fcst,mi_fcst,line_fcst,curve_fcst = steps_obs.run_elbow(fcst_infiles,yr_fcst) + + if ("PLOTELBOW" in steps_list_obs): + elbow_plot_title = config.getstr('Blocking','OBS_ELBOW_PLOT_TITLE','Elbow Method For Optimal k') + elbow_plot_outname = config.getstr('Blocking','OBS_ELBOW_PLOT_OUTPUT_NAME','obs_elbow') + pwr.plot_elbow(K_obs,d_obs,mi_obs,line_obs_curve_obs) + + if ("PLOTELBOW" in steps_list_obs): + elbow_plot_title = config.getstr('Blocking','FCST_ELBOW_PLOT_TITLE','Elbow Method For Optimal k') + elbow_plot_outname = config.getstr('Blocking','FCST_ELBOW_PLOT_OUTPUT_NAME','fcst_elbow') + pwr.plot_elbow(K_fcst,d_fcst,mi_fcst,line_obs_curve_fcst) + + + if ("CALCEOF" in steps_list_obs): + print('Running Obs EOF') + steps_obs.Calc_EOF(elbow_obs,lats_obs,lons_obs) + + if ("CALCEOF" in steps_list_fcst): + print('Running Forecast EOF') + steps_fcst.Calc_EOF(elbow_fcst,lats_fcst,lons_fcst) + + + if ("KMEANS" in steps_list_obs): + print('Running Obs K Means') + + if ("KMEANS" in steps_list_fcst): + print('Running Forecast K Means') + + +if __name__ == "__main__": + main() From d9994ea77d2b4ec59c5988477cb8308df9ac1917 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Sat, 9 Jan 2021 00:49:42 -0700 Subject: [PATCH 28/93] User Script setup --- .../Regrid_PCP_fcstGFS_fcstOnly_Blocking.conf | 245 ------------------ .../Regrid_PCP_fcstGFS_obsERA_Blocking.conf | 31 ++- .../UserScript_fcstGFS_obsERA_Blocking.conf | 56 ++++ .../UserScript_obsERA_obsOnly_Blocking.conf | 56 ++++ ush/drivers/Blocking_driver.py | 74 +++--- 5 files changed, 161 insertions(+), 301 deletions(-) delete mode 100644 parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_fcstOnly_Blocking.conf create mode 100644 parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf create mode 100644 parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_fcstOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_fcstOnly_Blocking.conf deleted file mode 100644 index 9422b12024..0000000000 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_fcstOnly_Blocking.conf +++ /dev/null @@ -1,245 +0,0 @@ -# Blocking METplus Configuration -[config] -# time looping - options are INIT, VALID, RETRO, and REALTIME -LOOP_BY = INIT - -# Format of INIT_BEG and INIT_END -INIT_TIME_FMT = %Y%m%d%H - -# Start time for METplus run -INIT_BEG = 2016010100 - -# End time for METplus run -INIT_END = 2016010100 - -# Increment between METplus runs in seconds. Must be >= 60 -INIT_INCREMENT = 21600 - -# list of forecast leads to process -LEAD_SEQ = 0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99, 102, 105, 108, 111, 114, 117, 120, 123, 126, 129, 132, 135, 138, 141, 144, 147, 150, 153, 156, 159, 162, 165, 168, 171, 174, 177, 180, 183, 186, 189, 192, 195, 198, 201, 204, 207, 210, 213, 216, 219, 222, 225, 228, 231, 234, 237, 240 - -# Only Process DJF -#SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" - -LOOP_ORDER = processes - -# Obs or Forecast -FCST_RUN = True - -# List of applications to run -PROCESS_LIST = RegridDataPlane - -# REGRID_DATA_PLANE (Step 1) -# Run regrid_data_plane on forecast data -FCST_REGRID_DATA_PLANE_RUN = {FCST_RUN} - -# If true, process each field individually and write a file for each -# If false, run once per run time passing in all fields specified -FCST_DATA_PLANE_ONCE_PER_FIELD = False - -# Name of input field to process -FCST_REGRID_DATA_PLANE_VAR1_INPUT_FIELD_NAME = HGT - -# Level of input field to process -FCST_REGRID_DATA_PLANE_VAR1_INPUT_LEVEL = P500 - -# Name of output field to create -FCST_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = Z500 - -# Mask to use for regridding -REGRID_DATA_PLANE_VERIF_GRID = latlon 360 90 89 0 -1.0 1.0 - -# Method to run regrid_data_plane, not setting this will default to NEAREST -REGRID_DATA_PLANE_METHOD = BILIN - -# Regridding width used in regrid_data_plane, not setting this will default to 1 -REGRID_DATA_PLANE_WIDTH = 2 - -[dir] -# location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s - -# input and output data directories for each application in PROCESS_LIST -FCST_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/p/ral/jntp/GMTB/Phys_Test_FV3GFSv2/POST/suite1/ -FCST_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/FV3GFS - -[filename_templates] -# format of filenames -# Input ERA Interim -FCST_REGRID_DATA_PLANE_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/gfs.t00z.pgrb2.0p25.f{lead?fmt=%HHH} -FCST_REGRID_DATA_PLANE_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/Z500_3hourly_{valid?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc - - - -[daily_mean] -LOOP_ORDER = processes - -# List of applications to run -PROCESS_LIST = PcpCombine - -# PCP_COMBINE (Step 1) -# run pcp_combine on obs data -FCST_PCP_COMBINE_RUN = {FCST_RUN} - -# method to run pcp_combine on forecast data -# Options are ADD, SUM, SUBTRACT, and DERIVE -FCST_PCP_COMBINE_METHOD = DERIVE -FCST_PCP_COMBINE_STAT_LIST = MEAN - -# field name of 1 hr accumulation in forecast files -FCST_PCP_COMBINE_INPUT_ACCUMS = 3 -FCST_PCP_COMBINE_INPUT_NAMES = Z500 -FCST_PCP_COMBINE_INPUT_LEVELS = "(*,*)" -FCST_PCP_COMBINE_INPUT_OPTIONS = convert(x) = x / 9.81; set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S?shift=-64800}"; -FCST_PCP_COMBINE_OUTPUT_NAME = Z500 -FCST_PCP_COMBINE_OUTPUT_ACCUM = 3 -FCST_PCP_COMBINE_DERIVE_LOOKBACK = 3 - -# location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s - -# input and output data directories for each application in PROCESS_LIST -FCST_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/FV3GFS -FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/FV3GFS/converted - -# Input ERA Interim -FCST_PCP_COMBINE_INPUT_TEMPLATE = {init?fmt=%Y%m%d}/Z500_3hourly_{valid?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc -FCST_PCP_COMBINE_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d}/Z500_3hourly_{valid?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc - - - -[running_mean] -# Start time for METplus run -#VALID_BEG = 1979120100 - -# End time for METplus run -#VALID_END = 2017022800 - -# Increment between METplus runs in seconds. Must be >= 60 -#VALID_INCREMENT = 86400 - -# List of applications to run -PROCESS_LIST = PcpCombine - -# PCP_COMBINE (Step 1) -# run pcp_combine on obs data -FCST_PCP_COMBINE_RUN = {FCST_RUN} - -# method to run pcp_combine on forecast data -# Options are ADD, SUM, SUBTRACT, and DERIVE -OBS_PCP_COMBINE_METHOD = DERIVE -OBS_PCP_COMBINE_STAT_LIST = MEAN - -# field name of 1 hr accumulation in forecast files -OBS_PCP_COMBINE_INPUT_ACCUMS = 24 -OBS_PCP_COMBINE_INPUT_NAMES = Z500 -OBS_PCP_COMBINE_INPUT_LEVELS = "(*,*)" -OBS_PCP_COMBINE_INPUT_OPTIONS = set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S?shift=-172800}"; -OBS_PCP_COMBINE_OUTPUT_NAME = Z500 -# Running mean is 5 days -OBS_PCP_COMBINE_OUTPUT_ACCUM = 120 -OBS_PCP_COMBINE_DERIVE_LOOKBACK = 120 - -# location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s - -# input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/daily -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Rmean5d - -# format of filenames -# Input ERA Interim -OBS_PCP_COMBINE_INPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d}_NH.nc -OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_5daymean_{valid?fmt=%Y%m%d?shift=-172800}_NH.nc - - -[anomaly] -# Increment between METplus runs in seconds. Must be >= 60 -#VALID_INCREMENT = 86400 - -# list of forecast leads to process -#LEAD_SEQ = 0 - -# Options are times, processes -# times = run all items in the PROCESS_LIST for a single initialization -# time, then repeat until all times have been evaluated. -# processes = run each item in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST. -LOOP_ORDER = processes - -# List of applications to run -PROCESS_LIST = PcpCombine - -# PCP_COMBINE (Step 1) -# run pcp_combine on obs data -OBS_PCP_COMBINE_RUN = {OBS_RUN} -FCST_PCP_COMBINE_RUN = {FCST_RUN} - -# method to run pcp_combine on forecast data -# Options are ADD, SUM, SUBTRACT, and DERIVE -FCST_PCP_COMBINE_METHOD = USER_DEFINED - -FCST_PCP_COMBINE_COMMAND = -subtract /glade/scratch/kalb/METplus/model_applications/s2s/FV3GFS/{init?fmt=%Y%m%d%H}/Z500_3hourly_{valid?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc /glade/scratch/kalb/METplus/model_applications/s2s/Rmean5d/Z500_5daymean_{valid?fmt=%Y%m%d}_NH.nc -field 'name="Z500"; level="(*,*)";' - -# location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s - -# input and output data directories for each application in PROCESS_LIST -FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/FV3GFS/Anomaly - -FCST_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_anomaly_{valid?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc - - -[Blocking] -# Directory for the Z500 anomaly data to read in to the blocking python code -FCST_BLOCKING_ANOMALY_DIR = {OUTPUT_BASE}/s2s/FV3GFS/Anomaly - -# Variable Name for the Z500 anomaly data to read in to the blocking python code -FCST_BLOCKING_ANOMALY_VAR = Z500_P500 - -# Directory for the Z500 data to read in to the blocking python code -FCST_BLOCKING_DIR = {OUTPUT_BASE}/s2s/FV3GFS/orig - -# -FCST_BLOCKING_VAR = Z500 - -# Number of model grid points used for a moving average -# Must be odd -FCST_SMOOTHING_PTS = 9 - -# -FCST_LAT_DELTA = -5,0,5 - -# -FCST_NORTH_SOUTH_LIMITS = 30 - -# Maximum number of grid points between IBLs for everything in between to be included as an IBL -FCST_IBL_DIST = 7 - -# Number of grid points in and IBL to make a GIBL -FCST_IBL_IN_GIBL = 15 - -# Overlap across days for a GIBL -FCST_GIBL_OVERLAP = 30 - -# Time duration needed for a block -FCST_BLOCK_TIME = 15 - -# Number of grid points a block must travel to terminate -BLOCK_TRAVEL = 45 - -# Method to compute blocking. Currently, the only option is 'PH' for the -# Pelly-Hoskins Method -BLOCK_METHOD = PH - -#CBL plot title and name -CBL_PLOT_MTHSTR = DJF -CBL_PLOT_OUTPUT_NAME = CBL_avg - -# IBL plot title and name -IBL_PLOT_TITLE = DJF Instantaneous Blocked Longitude -IBL_PLOT_OUTPUT_NAME = IBL_Freq_GFS - -# Blocking plot title and name -BLOCKING_PLOT_TITLE = DJF Blocking Frequency -BLOCKING_PLOT_OUTPUT_NAME = Block_Freq_GFS diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf index e9c89ba82b..f94b84eff9 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf @@ -1,10 +1,9 @@ # Blocking METplus Configuration [config] # Obs or Forecast -FCST_STEPS = IBL+PLOTIBL +FCST_STEPS = CBL+IBL+PLOTIBL OBS_STEPS = CBL+IBL+PLOTIBL - [regrid_fcst] # time looping - options are INIT, VALID, RETRO, and REALTIME LOOP_BY = INIT @@ -63,7 +62,7 @@ CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST FCST_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/p/ral/jntp/GMTB/Phys_Test_FV3GFSv2/POST/suite1/ -FCST_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/FV3GFS +FCST_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/FV3GFS # format of filenames # Input ERA Interim @@ -130,7 +129,7 @@ CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST OBS_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds627.0/ei.oper.an.pl -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE} # format of filenames # Input ERA Interim @@ -178,7 +177,7 @@ CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST FCST_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE} -FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/FV3GFS/daily +FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/FV3GFS/daily # Input ERA Interim FCST_PCP_COMBINE_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc @@ -227,8 +226,8 @@ OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/daily +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE} +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/daily # Input ERA Interim OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc @@ -278,8 +277,8 @@ OBS_PCP_COMBINE_DERIVE_LOOKBACK = 120 CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/daily -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Rmean5d +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/daily +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/Rmean5d # format of filenames # Input ERA Interim @@ -331,8 +330,8 @@ OBS_PCP_COMBINE_COMMAND = -subtract {OBS_PCP_COMBINE_INPUT_DIR}/daily/Z500_daily CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Anomaly +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE} +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/Anomaly OBS_PCP_COMBINE_INPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d}_NH.nc OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc @@ -397,15 +396,15 @@ FCST_BLOCK_METHOD = PH OBS_BLOCK_METHOD = {FCST_BLOCK_METHOD} # Directory for the Z500 anomaly data to read in to the blocking python code -OBS_BLOCKING_ANOMALY_TEMPLATE = {OUTPUT_BASE}/s2s/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc +OBS_BLOCKING_ANOMALY_TEMPLATE = {OUTPUT_BASE}/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc # Variable Name for the Z500 anomaly data to read in to the blocking python code FCST_BLOCKING_ANOMALY_VAR = Z500_P500 OBS_BLOCKING_ANOMALY_VAR = Z500_ANA # Directory for the Z500 data to read in to the blocking python code -FCST_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/FV3GFS/daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc -OBS_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +FCST_BLOCKING_TEMPLATE = {OUTPUT_BASE}/FV3GFS/daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_BLOCKING_TEMPLATE = {OUTPUT_BASE}/daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc # Variable for the Z500 data FCST_BLOCKING_VAR = Z500_NA_MEAN @@ -414,11 +413,11 @@ OBS_BLOCKING_VAR = Z500 # Plot titles #CBL plot title and name OBS_CBL_PLOT_MTHSTR = DJF -OBS_CBL_PLOT_OUTPUT_NAME = ERA_CBL_avg +OBS_CBL_PLOT_OUTPUT_NAME = {OUTPUT_BASE}/plots/ERA_CBL_avg # IBL plot title and name IBL_PLOT_TITLE = DJF Instantaneous Blocked Longitude -IBL_PLOT_OUTPUT_NAME = IBL_Freq_DJF +IBL_PLOT_OUTPUT_NAME = {OUTPUT_BASE}/plots/IBL_Freq_DJF IBL_PLOT_OBS_LABEL = ERA Reanalysis IBL_PLOT_FCST_LABEL = GEFS diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf new file mode 100644 index 0000000000..09fccf2ecd --- /dev/null +++ b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf @@ -0,0 +1,56 @@ +# UserScript wrapper example + +[config] + +# List of applications to run - only UserScript for this case +PROCESS_LIST = UserScript + + +# time looping - options are INIT, VALID, RETRO, and REALTIME +# If set to INIT or RETRO: +# INIT_TIME_FMT, INIT_BEG, INIT_END, and INIT_INCREMENT must also be set +# If set to VALID or REALTIME: +# VALID_TIME_FMT, VALID_BEG, VALID_END, and VALID_INCREMENT must also be set +LOOP_BY = VALID + +# Format of VALID_BEG and VALID_END using % items +# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. +# see www.strftime.org for more information +# %Y%m%d%H expands to YYYYMMDDHH +VALID_TIME_FMT = %Y%m%d%H%M%S + +# Start time for METplus run - must match VALID_TIME_FMT +VALID_BEG = 20141031093015 + +# End time for METplus run - must match VALID_TIME_FMT +VALID_END = 20141101093015 + +# Increment between METplus runs (in seconds if no units are specified) +# Must be >= 60 seconds +VALID_INCREMENT = 12H + +# List of forecast leads to process for each run time (init or valid) +# In hours if units are not specified +# If unset, defaults to 0 (don't loop through forecast leads) +LEAD_SEQ = 0H, 12H, 24H, 120H + +# Order of loops to process data - Options are times, processes +# Not relevant if only one item is in the PROCESS_LIST +# times = run all wrappers in the PROCESS_LIST for a single run time, then +# increment the run time and run all wrappers again until all times have +# been evaluated. +# processes = run the first wrapper in the PROCESS_LIST for all times +# specified, then repeat for the next item in the PROCESS_LIST until all +# wrappers have been run +LOOP_ORDER = processes + +# list of strings to loop over for each run time. +# value for each item can be referenced in filename templates with {custom?fmt=%s} +USER_SCRIPT_CUSTOM_LOOP_LIST = nc + +USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE + +USER_SCRIPT_INPUT_TEMPLATE = init_{init?fmt=%Y%m%d%H%M%S}_valid_{valid?fmt=%Y%m%d%H%M%S}_lead_{lead?fmt=%3H}.{custom} +USER_SCRIPT_INPUT_DIR = {METPLUS_BASE}/internal_tests/data/user_script + +USER_SCRIPT_COMMAND = {METPLUS_BASE}/ush/drivers/Blocking_driver.py {METPLUS_BASE}/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf dir.INPUT_BASE={INPUT_BASE} dir.OUTPUT_BASE={OUTPUT_BASE} dir.MET_INSTALL_DIR={MET_INSTALL_DIR} diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf new file mode 100644 index 0000000000..ca2291bf6e --- /dev/null +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf @@ -0,0 +1,56 @@ +# UserScript wrapper example + +[config] + +# List of applications to run - only UserScript for this case +PROCESS_LIST = UserScript + + +# time looping - options are INIT, VALID, RETRO, and REALTIME +# If set to INIT or RETRO: +# INIT_TIME_FMT, INIT_BEG, INIT_END, and INIT_INCREMENT must also be set +# If set to VALID or REALTIME: +# VALID_TIME_FMT, VALID_BEG, VALID_END, and VALID_INCREMENT must also be set +LOOP_BY = VALID + +# Format of VALID_BEG and VALID_END using % items +# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. +# see www.strftime.org for more information +# %Y%m%d%H expands to YYYYMMDDHH +VALID_TIME_FMT = %Y%m%d%H%M%S + +# Start time for METplus run - must match VALID_TIME_FMT +VALID_BEG = 20141031093015 + +# End time for METplus run - must match VALID_TIME_FMT +VALID_END = 20141101093015 + +# Increment between METplus runs (in seconds if no units are specified) +# Must be >= 60 seconds +VALID_INCREMENT = 12H + +# List of forecast leads to process for each run time (init or valid) +# In hours if units are not specified +# If unset, defaults to 0 (don't loop through forecast leads) +LEAD_SEQ = 0H, 12H, 24H, 120H + +# Order of loops to process data - Options are times, processes +# Not relevant if only one item is in the PROCESS_LIST +# times = run all wrappers in the PROCESS_LIST for a single run time, then +# increment the run time and run all wrappers again until all times have +# been evaluated. +# processes = run the first wrapper in the PROCESS_LIST for all times +# specified, then repeat for the next item in the PROCESS_LIST until all +# wrappers have been run +LOOP_ORDER = processes + +# list of strings to loop over for each run time. +# value for each item can be referenced in filename templates with {custom?fmt=%s} +USER_SCRIPT_CUSTOM_LOOP_LIST = nc + +USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE + +USER_SCRIPT_INPUT_TEMPLATE = init_{init?fmt=%Y%m%d%H%M%S}_valid_{valid?fmt=%Y%m%d%H%M%S}_lead_{lead?fmt=%3H}.{custom} +USER_SCRIPT_INPUT_DIR = {METPLUS_BASE}/internal_tests/data/user_script + +USER_SCRIPT_COMMAND = {METPLUS_BASE}/ush/drivers/Blocking_driver.py {METPLUS_BASE}/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf dir.INPUT_BASE={INPUT_BASE} dir.OUTPUT_BASE={OUTPUT_BASE} dir.MET_INSTALL_DIR={MET_INSTALL_DIR} diff --git a/ush/drivers/Blocking_driver.py b/ush/drivers/Blocking_driver.py index ea105ce6f8..cfe087a1ec 100755 --- a/ush/drivers/Blocking_driver.py +++ b/ush/drivers/Blocking_driver.py @@ -28,32 +28,6 @@ def main(): steps_list_fcst,steps_list_obs,config_list = parse_steps(inconfig_list) config = pre_run_setup(config_list) - # If the user has defined the steps they want to run - # grab the command line parameter - #steps_config_part_fcst = [s for s in config_list if "FCST_STEPS" in s] - #steps_list_fcst = [] - - #steps_config_part_obs = [s for s in config_list if "OBS_STEPS" in s] - #steps_list_obs = [] - - # Setup the Steps - #if steps_config_part_fcst: - # steps_param_fcst = steps_config_part_fcst[0].split("=")[1] - # steps_list_fcst = steps_param_fcst.split("+") - # config_list.remove(steps_config_part_fcst[0]) - #if steps_config_part_obs: - # steps_param_obs = steps_config_part_obs[0].split("=")[1] - # steps_list_obs = steps_param_obs.split("+") - # config_list.remove(steps_config_part_obs[0]) - - #config = pre_run_setup(config_list) - #if not steps_config_part_fcst: - # steps_param_fcst = config.getstr('config','FCST_STEPS','') - # steps_list_fcst = steps_param_fcst.split("+") - #if not steps_config_part_obs: - # steps_param_obs = config.getstr('config','OBS_STEPS','') - # steps_list_obs = steps_param_obs.split("+") - if not steps_list_obs and not steps_list_fcst: print('No processing steps requested for either the model or observations,') print('no data will be processed') @@ -142,12 +116,14 @@ def main(): obs_infiles, yr_obs = find_input_files(cbl_config, use_init, 'OBS_BLOCKING_ANOMALY_TEMPLATE') cbls_obs,lats_obs,lons_obs,yr_obs,mhweight_obs = steps_obs.run_CBL(obs_infiles,yr_obs) - if ("CBL" in steps_list_fcst): + if ("CBL" in steps_list_fcst) and not use_cbl_obs: # Add in step to use obs for CBLS print('Computing Forecast CBLs') fcst_infiles,yr_fcst = find_input_files(cbl_config, use_init, 'FCST_BLOCKING_ANOMALY_TEMPLATE') cbls_fcst,lats_fcst,lons_fcst,yr_fcst,mhweight_fcst = steps_fcst.run_CBL(fcst_infiles,yr_fcst) - elif use_cbl_obs: + elif ("CBL" in steps_list_fcst) and use_cbl_obs: + if not ("CBL" in steps_list_obs): + raise Exception('Must run observed CBLs before using them as a forecast.') cbls_fcst = cbls_obs lats_fcst = lats_obs lons_fcst = lons_obs @@ -158,7 +134,8 @@ def main(): if ("PLOTCBL" in steps_list_obs): cbl_plot_mthstr = config.getstr('Blocking','OBS_CBL_PLOT_MTHSTR') cbl_plot_outname = config.getstr('Blocking','OBS_CBL_PLOT_OUTPUT_NAME') - create_cbl_plot(lons_obs, lats_obs, cbls_obs, mhweight_obs, cbl_plot_mthstr, cbl_plot_outname, do_averaging=True) + create_cbl_plot(lons_obs, lats_obs, cbls_obs, mhweight_obs, cbl_plot_mthstr, cbl_plot_outname, + do_averaging=True) if ("PLOTCBL" in steps_list_fcst): cbl_plot_mthstr = config.getstr('Blocking','FCST_CBL_PLOT_MTHSTR') cbl_plot_outname = config.getstr('Blocking','FCST_CBL_PLOT_OUTPUT_NAME') @@ -175,21 +152,24 @@ def main(): config.set('Blocking','VALID_END',orig_end) ibl_config = config_metplus.replace_config_from_section(config,'Blocking') if ("IBL" in steps_list_obs) and not ("IBL" in steps_list_fcst): - #if ("IBL" in steps_list_obs): + if not ("CBL" in steps_list_obs): + raise Exception('Must run observed CBLs before running IBLs.') print('Computing Obs IBLs') obs_infiles, yr_obs = find_input_files(ibl_config, use_init, 'OBS_BLOCKING_TEMPLATE') ibls_obs = steps_obs.run_Calc_IBL(cbls_obs,obs_infiles,yr_obs) daynum_obs = np.arange(0,len(ibls_obs[0,:,0]),1) - #if ("IBL" in steps_list_fcst): elif ("IBL" in steps_list_fcst) and not ("IBL" in steps_list_obs): + if (not "CBL" in steps_list_fcst): + raise Exception('Must run forecast CBLs or use observed CBLs before running IBLs.') print('Computing Forecast IBLs') fcst_infiles, yr_fcst = find_input_files(ibl_config, use_init, 'FCST_BLOCKING_TEMPLATE') ibls_fcst = steps_fcst.run_Calc_IBL(cbls_fcst,fcst_infiles,yr_fcst) daynum_fcst = np.arange(0,len(ibls_fcst[0,:,0]),1) elif ("IBL" in steps_list_obs) and ("IBL" in steps_list_fcst): + if not ("CBL" in steps_list_obs) and not ("CBL" in steps_list_fcst): + raise Exception('Must run observed and forecast CBLs before running IBLs.') both_infiles, yr_obs = find_input_files(ibl_config, use_init, 'OBS_BLOCKING_TEMPLATE', secondtemplate='FCST_BLOCKING_TEMPLATE') - # TEST THIS obs_infiles = both_infiles[0] fcst_infiles = both_infiles[1] yr_fcst = yr_obs @@ -202,16 +182,22 @@ def main(): # Plot IBLS if("PLOTIBL" in steps_list_obs) and not ("PLOTIBL" in steps_list_fcst): + if not ("IBL" in steps_list_obs): + raise Exception('Must run observed IBLs before plotting them.') ibl_plot_title = config.getstr('Blocking','OBS_IBL_PLOT_TITLE','IBL Frequency') ibl_plot_outname = config.getstr('Blocking','OBS_IBL_PLOT_OUTPUT_NAME','') ibl_plot_label1 = config.getstr('Blocking','IBL_PLOT_OBS_LABEL','') pb.plot_ibls(ibls_obs,lons_obs,ibl_plot_title,ibl_plot_outname,label1=ibl_plot_label1) elif ("PLOTIBL" in steps_list_fcst) and not ("PLOTIBL" in steps_list_obs): + if not ("IBL" in steps_list_fcst): + raise Exception('Must run forecast IBLs before plotting them.') ibl_plot_title = config.getstr('Blocking','FCST_IBL_PLOT_TITLE','IBL Frequency') ibl_plot_outname = config.getstr('Blocking','FCST_IBL_PLOT_OUTPUT_NAME') ibl_plot_label1 = config.getstr('Blocking','IBL_PLOT_FCST_LABEL',None) pb.plot_ibls(ibls_fcst,lons_fcst,ibl_plot_title,ibl_plot_outname,label1=ibl_plot_label1) elif ("PLOTIBL" in steps_list_obs) and ("PLOTIBL" in steps_list_fcst): + if (not "IBL" in steps_list_obs) and (not "IBL" in steps_list_fcst): + raise Exception('Must run forecast and observed IBLs before plotting them.') ibl_plot_title = config.getstr('Blocking','IBL_PLOT_TITLE') ibl_plot_outname = config.getstr('Blocking','IBL_PLOT_OUTPUT_NAME') #Check to see if there are plot legend labels @@ -223,36 +209,44 @@ def main(): # Run GIBL if ("GIBL" in steps_list_obs): - print('Computing GIBLs') + if not ("IBL" in steps_list_obs): + raise Exception('Must run observed IBLs before running GIBLs.') + print('Computing Obs GIBLs') gibls_obs = steps_obs.run_Calc_GIBL(ibls_obs,lons_obs) if ("GIBL" in steps_list_fcst): - print('Computing GIBLs') + if not ("IBL" in steps_list_fcst): + raise Exception('Must run Forecast IBLs before running GIBLs.') + print('Computing Forecast GIBLs') gibls_fcst = steps_fcst.run_Calc_GIBL(ibls_fcst,lons_fcst) # Calc Blocks if ("CALCBLOCKS" in steps_list_obs): + if not ("GIBL" in steps_list_obs): + raise Exception('Must run observed GIBLs before calculating blocks.') print('Computing Blocks') block_freq_obs = steps_obs.run_Calc_Blocks(ibls_obs,gibls_obs,lons_obs,daynum_obs,yr_obs) if ("CALCBLOCKS" in steps_list_fcst): + if not ("GIBL" in steps_list_fcst): + raise Exception('Must run Forecast GIBLs before calculating blocks.') print('Computing Blocks') block_freq_fcst = steps_fcst.run_Calc_Blocks(ibls_fcst,gibls_fcst,lons_fcst,daynum_fcst,yr_fcst) # Plot Blocking Frequency - if ("PLOTBLOCKS" in steps_list_obs) and not ("PLOTBLOCKS" in steps_list_fcst): + if ("PLOTBLOCKS" in steps_list_obs): + if not ("CALCBLOCKS" in steps_list_obs): + raise Exception('Must compute observed blocks before plotting them.') blocking_plot_title = config.getstr('Blocking','OBS_BLOCKING_PLOT_TITLE') blocking_plot_outname = config.getstr('Blocking','OBS_BLOCKING_PLOT_OUTPUT_NAME') pb.plot_blocks(block_freq_obs,gibls_obs,ibls_obs,lons_obs,blocking_plot_title,blocking_plot_outname) - elif ("PLOTBLOCKS" in steps_list_fcst) and not ("PLOTBLOCKS" in steps_list_obs): + if ("PLOTBLOCKS" in steps_list_fcst): + if not ("CALCBLOCKS" in steps_list_fcst): + raise Exception('Must compute forecast blocks before plotting them.') blocking_plot_title = config.getstr('Blocking','FCST_BLOCKING_PLOT_TITLE') blocking_plot_outname = config.getstr('Blocking','FCST_BLOCKING_PLOT_OUTPUT_NAME') pb.plot_blocks(block_freq_fcst,gibls_fcst,ibls_fcst,lons_fcst,blocking_plot_title,blocking_plot_outname) - elif ("PLOTBLOCKS" in steps_list_obs) and ("PLOTBLOCKS" in steps_list_fcst): - blocking_plot_title = config.getstr('Blocking','BLOCKING_PLOT_TITLE') - blocking_plot_outname = config.getstr('Blocking','BLOCKING_PLOT_OUTPUT_NAME') - pb.plot_blocks(block_freq,gibls,ibls,lons,blocking_plot_title,blocking_plot_outname) if __name__ == "__main__": From 11789aa0975e44fa278f4897ef05f5225dc3575d Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Sat, 9 Jan 2021 01:12:36 -0700 Subject: [PATCH 29/93] Updated docs --- ... => UserScript_fcstGFS_obsERA_Blocking.py} | 15 ++++------ .../Regrid_PCP_fcstGFS_obsERA_Blocking.conf | 28 +++++++++---------- .../Regrid_PCP_obsERA_obsOnly_Blocking.conf | 2 +- 3 files changed, 20 insertions(+), 25 deletions(-) rename docs/use_cases/model_applications/s2s/{Regrid_PCP_fcstGFS_obsERA_Blocking.conf => UserScript_fcstGFS_obsERA_Blocking.py} (86%) diff --git a/docs/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf b/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py similarity index 86% rename from docs/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf rename to docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py index a64c30b9cd..ef8688c2a5 100644 --- a/docs/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf +++ b/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py @@ -32,10 +32,9 @@ # (TIMEAVE), computing a running mean (RMEAN), computing anomalies (ANOMALY), computing CBLs # (CBL), plotting CBLs (PLOTCBL), computing IBLs (IBL), plotting IBL frequency (PLOTIBL), # computing GIBLs (GIBL), computing blocks (CALCBLOCKS), and plotting the blocking frequency -# (PLOTBLOCKS). The steps can be listed on the command line or in a .conf file and are -# formatted as follows: +# (PLOTBLOCKS). The steps are listed in a .conf file and are formatted as follows: # -# FCST_STEPS = REGRID+TIMEAVE+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS +# FCST_STEPS = REGRID+TIMEAVE+CBL+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS # OBS_STEPS = REGRID+TIMEAVE+RUNMEAN+ANOMALY+CBL+PLOTCBL+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS ############################################################################## @@ -44,10 +43,6 @@ # # The regrid_data_plane, pcp_combine, and blocking python code are run for each # time for the forecast and observations data. This example loops by valid time. -# It processes 1 valid time, listed below. -# -# | **Valid:** 2020-02-06_12Z -# | **Forecast lead:** 36 ############################################################################## # METplus Configuration @@ -81,11 +76,11 @@ # # 1) Passing in Regrid_PCP_fcstGFS_obsERA_Blocking.conf then a user-specific system configuration file:: # -# Blocking_driver.py /path/to/METplus/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf /path/to/user_system.conf +# master_metplus.py /path/to/METplus/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf /path/to/user_system.conf # -# 2) Passing in Regrid_PCP_fcstGFS_obsERA_Blocking.conf then a user-specific system configuration file and then listing steps:: +# 2) Modifying the configurations in parm/metplus_config, then passing in Regrid_PCP_fcstGFS_obsERA_Blocking.conf:: # -# Blocking_driver.py /path/to/METplus/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf /path/to/user_system.conf FCST_STEPS=REGRID+TIMEAVE+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS OBS_STEPS=REGRID+TIMEAVE+RUNMEAN+ANOMALY+CBL+PLOTCBL+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS +# master_metplus.py /path/to/METplus/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf # # The following variables must be set correctly: # diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf index f94b84eff9..3a8049f4a4 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf @@ -62,7 +62,7 @@ CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST FCST_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/p/ral/jntp/GMTB/Phys_Test_FV3GFSv2/POST/suite1/ -FCST_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/FV3GFS +FCST_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/FV3GFS/Regrid # format of filenames # Input ERA Interim @@ -129,7 +129,7 @@ CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST OBS_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds627.0/ei.oper.an.pl -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE} +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Regrid # format of filenames # Input ERA Interim @@ -170,14 +170,14 @@ FCST_PCP_COMBINE_RUN = True # Options are ADD, SUM, SUBTRACT, and DERIVE FCST_PCP_COMBINE_METHOD = USER_DEFINED -FCST_PCP_COMBINE_COMMAND = -derive MEAN {FCST_PCP_COMBINE_INPUT_DIR}/s2s/FV3GFS/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=75600}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/s2s/FV3GFS/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=64800}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/s2s/FV3GFS/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=54000}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/s2s/FV3GFS/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=43200}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/s2s/FV3GFS/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=32400}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/s2s/FV3GFS/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=21600}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/s2s/FV3GFS/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=10800}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/s2s/FV3GFS/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc -field 'name="Z500"; level="(*,*)"; convert(x) = x / 9.81; set_attr_valid = "{init?fmt=%Y%m%d_%H%M%S}";' +FCST_PCP_COMBINE_COMMAND = -derive MEAN {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=75600}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=64800}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=54000}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=43200}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=32400}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=21600}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=10800}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc -field 'name="Z500"; level="(*,*)"; convert(x) = x / 9.81; set_attr_valid = "{init?fmt=%Y%m%d_%H%M%S}";' # location of configuration files used by MET applications CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST -FCST_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE} -FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/FV3GFS/daily +FCST_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/FV3GFS/Regrid +FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/FV3GFS/daily # Input ERA Interim FCST_PCP_COMBINE_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc @@ -226,8 +226,8 @@ OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE} -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/daily +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/ERA/Regrid +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/ERA/daily # Input ERA Interim OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc @@ -330,8 +330,8 @@ OBS_PCP_COMBINE_COMMAND = -subtract {OBS_PCP_COMBINE_INPUT_DIR}/daily/Z500_daily CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE} -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/Anomaly +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/Blocking/ERA +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/Blocking/ERA/Anomaly OBS_PCP_COMBINE_INPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d}_NH.nc OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc @@ -396,15 +396,15 @@ FCST_BLOCK_METHOD = PH OBS_BLOCK_METHOD = {FCST_BLOCK_METHOD} # Directory for the Z500 anomaly data to read in to the blocking python code -OBS_BLOCKING_ANOMALY_TEMPLATE = {OUTPUT_BASE}/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc +OBS_BLOCKING_ANOMALY_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc # Variable Name for the Z500 anomaly data to read in to the blocking python code FCST_BLOCKING_ANOMALY_VAR = Z500_P500 OBS_BLOCKING_ANOMALY_VAR = Z500_ANA # Directory for the Z500 data to read in to the blocking python code -FCST_BLOCKING_TEMPLATE = {OUTPUT_BASE}/FV3GFS/daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc -OBS_BLOCKING_TEMPLATE = {OUTPUT_BASE}/daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +FCST_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/FV3GFS/daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/ERA/daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc # Variable for the Z500 data FCST_BLOCKING_VAR = Z500_NA_MEAN @@ -413,11 +413,11 @@ OBS_BLOCKING_VAR = Z500 # Plot titles #CBL plot title and name OBS_CBL_PLOT_MTHSTR = DJF -OBS_CBL_PLOT_OUTPUT_NAME = {OUTPUT_BASE}/plots/ERA_CBL_avg +OBS_CBL_PLOT_OUTPUT_NAME = {OUTPUT_BASE}/s2s/Blocking/plots/ERA_CBL_avg # IBL plot title and name IBL_PLOT_TITLE = DJF Instantaneous Blocked Longitude -IBL_PLOT_OUTPUT_NAME = {OUTPUT_BASE}/plots/IBL_Freq_DJF +IBL_PLOT_OUTPUT_NAME = {OUTPUT_BASE}/s2s/Blocking/plots/IBL_Freq_DJF IBL_PLOT_OBS_LABEL = ERA Reanalysis IBL_PLOT_FCST_LABEL = GEFS diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf index 366db4eba1..9aeb89c687 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf @@ -1,7 +1,7 @@ # Blocking METplus Configuration [config] # Steps to Run -OBS_STEPS = CBL+PLOTCBL+IBL+PLOTIBL +OBS_STEPS = CBL+PLOTCBL+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS # time looping - options are INIT, VALID, RETRO, and REALTIME LOOP_BY = VALID From 9869efbd0478f9881f97804c41985237e565a835 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Sat, 9 Jan 2021 22:44:54 -0700 Subject: [PATCH 30/93] Updates to weather regime driver --- .../Regrid_PCP_fcstGFS_obsERA_Blocking.conf | 22 +++++++------ ...grid_PCP_obsERA_obsOnly_WeatherRegime.conf | 19 ++++++----- ush/drivers/Blocking_WeatherRegime_util.py | 8 ++++- ush/drivers/Blocking_driver.py | 4 +-- ush/drivers/WeatherRegime.py | 3 -- ush/drivers/WeatherRegime_driver.py | 33 +++++++++++++------ 6 files changed, 55 insertions(+), 34 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf index 3a8049f4a4..091cc98e8b 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf @@ -1,6 +1,8 @@ # Blocking METplus Configuration [config] # Obs or Forecast +#FCST_STEPS = CBL+IBL+PLOTIBL +#OBS_STEPS = REGRID+TIMEAVE+RUNMEAN+ANOMALY+CBL+IBL+PLOTIBL FCST_STEPS = CBL+IBL+PLOTIBL OBS_STEPS = CBL+IBL+PLOTIBL @@ -177,7 +179,7 @@ CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST FCST_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/FV3GFS/Regrid -FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/FV3GFS/daily +FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/FV3GFS/Daily # Input ERA Interim FCST_PCP_COMBINE_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc @@ -226,8 +228,8 @@ OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/ERA/Regrid -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/ERA/daily +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Regrid +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Daily # Input ERA Interim OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc @@ -277,8 +279,8 @@ OBS_PCP_COMBINE_DERIVE_LOOKBACK = 120 CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/daily -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/Rmean5d +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Daily +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Rmean5d # format of filenames # Input ERA Interim @@ -324,14 +326,14 @@ OBS_PCP_COMBINE_RUN = True # Options are ADD, SUM, SUBTRACT, and DERIVE OBS_PCP_COMBINE_METHOD = USER_DEFINED -OBS_PCP_COMBINE_COMMAND = -subtract {OBS_PCP_COMBINE_INPUT_DIR}/daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc {OBS_PCP_COMBINE_INPUT_DIR}/Rmean5d/Z500_5daymean_{valid?fmt=%Y%m%d}_NH.nc -field 'name="Z500"; level="(*,*)";' +OBS_PCP_COMBINE_COMMAND = -subtract {OBS_PCP_COMBINE_INPUT_DIR}/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc {OBS_PCP_COMBINE_INPUT_DIR}/Rmean5d/Z500_5daymean_{valid?fmt=%Y%m%d}_NH.nc -field 'name="Z500"; level="(*,*)";' # location of configuration files used by MET applications CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/Blocking/ERA -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/Blocking/ERA/Anomaly +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Anomaly OBS_PCP_COMBINE_INPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d}_NH.nc OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc @@ -403,8 +405,8 @@ FCST_BLOCKING_ANOMALY_VAR = Z500_P500 OBS_BLOCKING_ANOMALY_VAR = Z500_ANA # Directory for the Z500 data to read in to the blocking python code -FCST_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/FV3GFS/daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc -OBS_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/ERA/daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +FCST_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/FV3GFS/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc # Variable for the Z500 data FCST_BLOCKING_VAR = Z500_NA_MEAN diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf index 5ea29a77b0..f1f14aa383 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf @@ -1,7 +1,7 @@ # Blocking METplus Configuration [config] # Steps to Run -OBS_STEPS = ELBOW +OBS_STEPS = KMEANS # time looping - options are INIT, VALID, RETRO, and REALTIME LOOP_BY = VALID @@ -26,7 +26,6 @@ LOOP_ORDER = processes OBS_RUN = True - [regrid_obs] # Increment between METplus runs in seconds. Must be >= 60 VALID_INCREMENT = 21600 @@ -67,7 +66,7 @@ CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST OBS_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds627.0/ei.oper.an.pl -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Regrid [filename_templates] # format of filenames @@ -76,7 +75,6 @@ OBS_REGRID_DATA_PLANE_INPUT_TEMPLATE = {valid?fmt=%Y%m}/ei.oper.an.pl.regn128sc. OBS_REGRID_DATA_PLANE_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{init?fmt=%Y%m%d%H}_NH.nc - [daily_mean_obs] # Start time for METplus run VALID_BEG = 1979120118 @@ -114,15 +112,14 @@ OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/daily +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Regrid +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Daily # Input ERA Interim OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d?shift=-64800}_NH.nc - [WeatherRegime] VALID_BEG = 1979120100 @@ -132,7 +129,7 @@ VALID_END = 2017022800 VALID_INCREMENT = 86400 # Directory for the Z500 data to read in to the blocking python code -OBS_WR_TEMPLATE = {OUTPUT_BASE}/s2s/daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_WR_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc # Variable for the Z500 data OBS_WR_VAR = Z500 @@ -142,3 +139,9 @@ OBS_WR_NUMBER = 6 # Number of clusters OBS_NUM_CLUSTERS = 20 + +# Elbow Plot Title +OBS_ELBOW_PLOT_TITLE = Elbow Method For Optimal k + +# Elbow Plot Output Name +OBS_ELBOW_PLOT_OUTPUT_NAME = obs_elbow diff --git a/ush/drivers/Blocking_WeatherRegime_util.py b/ush/drivers/Blocking_WeatherRegime_util.py index 9bd27940b8..442c334283 100644 --- a/ush/drivers/Blocking_WeatherRegime_util.py +++ b/ush/drivers/Blocking_WeatherRegime_util.py @@ -110,7 +110,6 @@ def read_nc_met(infiles,yrlist,invar): if infiles[i]: indata = netCDF4.Dataset(infiles[i]) new_invar = indata.variables[invar][:] - #new_invar = np.expand_dims(new_invar,axis=0) init_time_str = indata.variables[invar].getncattr('init_time') valid_time_str = indata.variables[invar].getncattr('valid_time') indata.close() @@ -120,6 +119,13 @@ def read_nc_met(infiles,yrlist,invar): var_3d[i,:,:] = new_invar yr = np.array(yrlist) + if len(var_3d[:,0,0])%float(len(yrlist)) != 0: + lowval = int(len(var_3d[:,0,0])/float(len(yrlist))) + newarrlen = (lowval+1) * float(len(yrlist)) + arrexp = int(newarrlen - len(var_3d[:,0,0])) + arrfill = np.empty((arrexp,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) + arrfill[:] = np.nan + var_3d = np.append(var_3d,arrfill,axis=0) sdim = len(var_3d[:,0,0])/float(len(yrlist)) var_4d = np.reshape(var_3d,[len(yrlist),int(sdim),len(var_3d[0,:,0]),len(var_3d[0,0,:])]) diff --git a/ush/drivers/Blocking_driver.py b/ush/drivers/Blocking_driver.py index cfe087a1ec..8d90595554 100755 --- a/ush/drivers/Blocking_driver.py +++ b/ush/drivers/Blocking_driver.py @@ -49,12 +49,12 @@ def main(): #Compute Daily Average if ("TIMEAVE" in steps_list_obs): - print('Computing Daily Averages') + print('Computing Time Averages') daily_config = config_metplus.replace_config_from_section(config, 'daily_mean_obs') PCPCombineWrapper(daily_config).run_all_times() if ("TIMEAVE" in steps_list_fcst): - print('Computing Daily Averages') + print('Computing Time Averages') daily_config = config_metplus.replace_config_from_section(config, 'daily_mean_fcst') PCPCombineWrapper(daily_config).run_all_times() diff --git a/ush/drivers/WeatherRegime.py b/ush/drivers/WeatherRegime.py index 465d7bdf63..cb53b8d81a 100644 --- a/ush/drivers/WeatherRegime.py +++ b/ush/drivers/WeatherRegime.py @@ -118,9 +118,6 @@ def run_elbow(self,elbowinfiles,elbowyrs): mi = np.where(d==d.min())[0] print('Optimal Cluster # = '+str(mi+1)+'') - print(line) - print(curve) - exit() return a,lat,lon,yr,K,d,mi,line,curve diff --git a/ush/drivers/WeatherRegime_driver.py b/ush/drivers/WeatherRegime_driver.py index ad85fec3d0..7906d3a51a 100755 --- a/ush/drivers/WeatherRegime_driver.py +++ b/ush/drivers/WeatherRegime_driver.py @@ -8,7 +8,7 @@ sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir,os.pardir))) -sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy_feature_74/metplotpy/contributed/blocking_s2s") +sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy_feature_74/metplotpy/contributed/weather_regime") from WeatherRegime import WeatherRegimeCalculation from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub @@ -20,7 +20,7 @@ def main(): - all_steps = ["REGRID","TIMEAVE","ELBOW","PLOTELBOW","CALCEOF","PLOTEOF","KMEANS","PLOTBLOCKS"] + all_steps = ["REGRID","TIMEAVE","ELBOW","PLOTELBOW","CALCEOF","PLOTEOF","KMEANS","PLOTKMEANS"] inconfig_list = get_config_inputs_from_command_line() steps_list_fcst,steps_list_obs,config_list = parse_steps(inconfig_list) @@ -30,7 +30,6 @@ def main(): print('No processing steps requested for either the model or observations,') print('no data will be processed') - #Check to make sure the setps have the required pre-steps ###################################################################### # Pre-Process Data: @@ -81,14 +80,16 @@ def main(): elbow_fcst,lats_fcst,lons_fcst,yr_fcst,K_fcst,d_fcst,mi_fcst,line_fcst,curve_fcst = steps_obs.run_elbow(fcst_infiles,yr_fcst) if ("PLOTELBOW" in steps_list_obs): - elbow_plot_title = config.getstr('Blocking','OBS_ELBOW_PLOT_TITLE','Elbow Method For Optimal k') - elbow_plot_outname = config.getstr('Blocking','OBS_ELBOW_PLOT_OUTPUT_NAME','obs_elbow') - pwr.plot_elbow(K_obs,d_obs,mi_obs,line_obs_curve_obs) + print('Creating Obs Elbow plot') + elbow_plot_title = config.getstr('WeatherRegime','OBS_ELBOW_PLOT_TITLE','Elbow Method For Optimal k') + elbow_plot_outname = config.getstr('WeatherRegime','OBS_ELBOW_PLOT_OUTPUT_NAME','obs_elbow') + pwr.plot_elbow(K_obs,d_obs,mi_obs,line_obs,curve_obs,elbow_plot_title,elbow_plot_outname) - if ("PLOTELBOW" in steps_list_obs): - elbow_plot_title = config.getstr('Blocking','FCST_ELBOW_PLOT_TITLE','Elbow Method For Optimal k') - elbow_plot_outname = config.getstr('Blocking','FCST_ELBOW_PLOT_OUTPUT_NAME','fcst_elbow') - pwr.plot_elbow(K_fcst,d_fcst,mi_fcst,line_obs_curve_fcst) + if ("PLOTELBOW" in steps_list_fcst): + print('Creating Forecast Elbow plot') + elbow_plot_title = config.getstr('WeatherRegime','FCST_ELBOW_PLOT_TITLE','Elbow Method For Optimal k') + elbow_plot_outname = config.getstr('WeatherRegime','FCST_ELBOW_PLOT_OUTPUT_NAME','fcst_elbow') + pwr.plot_elbow(K_fcst,d_fcst,mi_fcst,line_fcst,curve_fcst,elbow_plot_title,elbow_plot_outname) if ("CALCEOF" in steps_list_obs): @@ -99,6 +100,12 @@ def main(): print('Running Forecast EOF') steps_fcst.Calc_EOF(elbow_fcst,lats_fcst,lons_fcst) + if ("PLOTEOF" in steps_list_obs): + print('Plotting Obs EOFs') + + if ("PLOTEOF" in steps_list_fcst): + print('Plotting Forecast EOFs') + if ("KMEANS" in steps_list_obs): print('Running Obs K Means') @@ -106,6 +113,12 @@ def main(): if ("KMEANS" in steps_list_fcst): print('Running Forecast K Means') + if ("PLOTKMEANS" in steps_list_obs): + print('Plotting Obs K Means') + + if ("PLOTKMEANS" in steps_list_fcst): + print('Plotting Forecast K Means') + if __name__ == "__main__": main() From 44c2a66a8aaaff7fa9799a2a231314e25b00ec23 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Sat, 9 Jan 2021 23:24:11 -0700 Subject: [PATCH 31/93] Added plot directory --- .../Regrid_PCP_fcstGFS_obsERA_Blocking.conf | 8 ++++--- ush/drivers/Blocking_driver.py | 22 +++++++++++++------ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf index 091cc98e8b..9ed692b69d 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf @@ -412,14 +412,16 @@ OBS_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/ERA/Daily/Z500_daily_{valid?f FCST_BLOCKING_VAR = Z500_NA_MEAN OBS_BLOCKING_VAR = Z500 -# Plot titles +# Plots +BLOCKING_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/plots/ + #CBL plot title and name OBS_CBL_PLOT_MTHSTR = DJF -OBS_CBL_PLOT_OUTPUT_NAME = {OUTPUT_BASE}/s2s/Blocking/plots/ERA_CBL_avg +OBS_CBL_PLOT_OUTPUT_NAME = ERA_CBL_avg # IBL plot title and name IBL_PLOT_TITLE = DJF Instantaneous Blocked Longitude -IBL_PLOT_OUTPUT_NAME = {OUTPUT_BASE}/s2s/Blocking/plots/IBL_Freq_DJF +IBL_PLOT_OUTPUT_NAME = IBL_Freq_DJF IBL_PLOT_OBS_LABEL = ERA Reanalysis IBL_PLOT_FCST_LABEL = GEFS diff --git a/ush/drivers/Blocking_driver.py b/ush/drivers/Blocking_driver.py index 8d90595554..345a474522 100755 --- a/ush/drivers/Blocking_driver.py +++ b/ush/drivers/Blocking_driver.py @@ -88,6 +88,14 @@ def main(): steps_fcst = BlockingCalculation(config,'FCST') steps_obs = BlockingCalculation(config,'OBS') + # Check to see if there is a plot directory + oplot_dir = config.getstr('Blocking','BLOCKING_PLOT_OUTPUT_DIR','') + if not oplot_dir: + obase = config.getstr('config','OUTPUT_BASE') + oplot_dir = obase+'/'+plots + if not os.path.exists(oplot_dir): + os.makedirs(oplot_dir) + # Check to see if CBL's are used from an obs climatology use_cbl_obs = config.getbool('Blocking','USE_CBL_OBS',False) @@ -133,12 +141,12 @@ def main(): #Plot Central Blocking Latitude if ("PLOTCBL" in steps_list_obs): cbl_plot_mthstr = config.getstr('Blocking','OBS_CBL_PLOT_MTHSTR') - cbl_plot_outname = config.getstr('Blocking','OBS_CBL_PLOT_OUTPUT_NAME') + cbl_plot_outname = oplot_dir+'/'+config.getstr('Blocking','OBS_CBL_PLOT_OUTPUT_NAME') create_cbl_plot(lons_obs, lats_obs, cbls_obs, mhweight_obs, cbl_plot_mthstr, cbl_plot_outname, do_averaging=True) if ("PLOTCBL" in steps_list_fcst): cbl_plot_mthstr = config.getstr('Blocking','FCST_CBL_PLOT_MTHSTR') - cbl_plot_outname = config.getstr('Blocking','FCST_CBL_PLOT_OUTPUT_NAME') + cbl_plot_outname = oplot_dir+'/'+config.getstr('Blocking','FCST_CBL_PLOT_OUTPUT_NAME') create_cbl_plot(lons_fcst, lats_fcst, cbls_fcst, mhweight_fcst, cbl_plot_mthstr, cbl_plot_outname, do_averaging=True) @@ -185,21 +193,21 @@ def main(): if not ("IBL" in steps_list_obs): raise Exception('Must run observed IBLs before plotting them.') ibl_plot_title = config.getstr('Blocking','OBS_IBL_PLOT_TITLE','IBL Frequency') - ibl_plot_outname = config.getstr('Blocking','OBS_IBL_PLOT_OUTPUT_NAME','') + ibl_plot_outname = oplot_dir+'/'+config.getstr('Blocking','OBS_IBL_PLOT_OUTPUT_NAME','') ibl_plot_label1 = config.getstr('Blocking','IBL_PLOT_OBS_LABEL','') pb.plot_ibls(ibls_obs,lons_obs,ibl_plot_title,ibl_plot_outname,label1=ibl_plot_label1) elif ("PLOTIBL" in steps_list_fcst) and not ("PLOTIBL" in steps_list_obs): if not ("IBL" in steps_list_fcst): raise Exception('Must run forecast IBLs before plotting them.') ibl_plot_title = config.getstr('Blocking','FCST_IBL_PLOT_TITLE','IBL Frequency') - ibl_plot_outname = config.getstr('Blocking','FCST_IBL_PLOT_OUTPUT_NAME') + ibl_plot_outname = oplot_dir+'/'+config.getstr('Blocking','FCST_IBL_PLOT_OUTPUT_NAME') ibl_plot_label1 = config.getstr('Blocking','IBL_PLOT_FCST_LABEL',None) pb.plot_ibls(ibls_fcst,lons_fcst,ibl_plot_title,ibl_plot_outname,label1=ibl_plot_label1) elif ("PLOTIBL" in steps_list_obs) and ("PLOTIBL" in steps_list_fcst): if (not "IBL" in steps_list_obs) and (not "IBL" in steps_list_fcst): raise Exception('Must run forecast and observed IBLs before plotting them.') ibl_plot_title = config.getstr('Blocking','IBL_PLOT_TITLE') - ibl_plot_outname = config.getstr('Blocking','IBL_PLOT_OUTPUT_NAME') + ibl_plot_outname = oplot_dir+'/'+config.getstr('Blocking','IBL_PLOT_OUTPUT_NAME') #Check to see if there are plot legend labels ibl_plot_label1 = config.getstr('Blocking','IBL_PLOT_OBS_LABEL','Observation') ibl_plot_label2 = config.getstr('Blocking','IBL_PLOT_FCST_LABEL','Forecast') @@ -239,13 +247,13 @@ def main(): if not ("CALCBLOCKS" in steps_list_obs): raise Exception('Must compute observed blocks before plotting them.') blocking_plot_title = config.getstr('Blocking','OBS_BLOCKING_PLOT_TITLE') - blocking_plot_outname = config.getstr('Blocking','OBS_BLOCKING_PLOT_OUTPUT_NAME') + blocking_plot_outname = oplot_dir+'/'+config.getstr('Blocking','OBS_BLOCKING_PLOT_OUTPUT_NAME') pb.plot_blocks(block_freq_obs,gibls_obs,ibls_obs,lons_obs,blocking_plot_title,blocking_plot_outname) if ("PLOTBLOCKS" in steps_list_fcst): if not ("CALCBLOCKS" in steps_list_fcst): raise Exception('Must compute forecast blocks before plotting them.') blocking_plot_title = config.getstr('Blocking','FCST_BLOCKING_PLOT_TITLE') - blocking_plot_outname = config.getstr('Blocking','FCST_BLOCKING_PLOT_OUTPUT_NAME') + blocking_plot_outname = oplot_dir+'/'+config.getstr('Blocking','FCST_BLOCKING_PLOT_OUTPUT_NAME') pb.plot_blocks(block_freq_fcst,gibls_fcst,ibls_fcst,lons_fcst,blocking_plot_title,blocking_plot_outname) From cfccdf37bc40ee4d70d42476514d81c046709fe1 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Sat, 23 Jan 2021 00:39:13 -0700 Subject: [PATCH 32/93] Updates to Weather Regime Driver --- ...grid_PCP_obsERA_obsOnly_WeatherRegime.conf | 5 +- ush/drivers/WeatherRegime.py | 79 +++---------------- ush/drivers/WeatherRegime_driver.py | 37 +++++++-- 3 files changed, 44 insertions(+), 77 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf index f1f14aa383..2e4e8c3797 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf @@ -1,7 +1,7 @@ # Blocking METplus Configuration [config] # Steps to Run -OBS_STEPS = KMEANS +OBS_STEPS = KMEANS+PLOTKMEANS # time looping - options are INIT, VALID, RETRO, and REALTIME LOOP_BY = VALID @@ -145,3 +145,6 @@ OBS_ELBOW_PLOT_TITLE = Elbow Method For Optimal k # Elbow Plot Output Name OBS_ELBOW_PLOT_OUTPUT_NAME = obs_elbow + +# Elbow Plot Output Name +OBS_KMEANS_PLOT_OUTPUT_NAME = obs_kmeans diff --git a/ush/drivers/WeatherRegime.py b/ush/drivers/WeatherRegime.py index cb53b8d81a..7cf270f7b3 100644 --- a/ush/drivers/WeatherRegime.py +++ b/ush/drivers/WeatherRegime.py @@ -8,14 +8,13 @@ from numpy.linalg import lstsq from metplus.util import config_metplus, get_start_end_interval_times, get_lead_sequence from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate -from Blocking_WeatherRegime_util import read_nc_met + class WeatherRegimeCalculation(): """Contains the programs to perform a Weather Regime Analysis """ def __init__(self,config,label): - self.invar = config.getstr('WeatherRegime',label+'_WR_VAR','') self.wrnum = config.getint('WeatherRegime',label+'_WR_NUMBER',6) self.numi = config.getint('WeatherRegime',label+'_NUM_CLUSTERS',20) @@ -46,48 +45,10 @@ def weights_detrend(self,lats,lons,indata): return a,a1 - def run_elbow(self,elbowinfiles,elbowyrs): - wrnum=6 - k=KMeans(n_clusters=wrnum, random_state=0, n_jobs=-1) #Initilize cluster centers - - a,lat,lon,yr = read_nc_met(elbowinfiles,elbowyrs,self.invar) - - #var = 'Z500' - #file1 = '/glade/work/demiller/ERAi/Z/Z500day/Z500dayDJF.nc' - #f1 = Dataset(file1, mode="r") - #dec = f1.variables[var][:] - #a=np.array(dec) - #f1.close() - - #Set your domain. Limits below specify US - lon1=230 - lon2=301 - lat1=35 #index, lat = 90-lat1 - lat2=66 #index, lat = 90-lat2 - - a = a[:,:,lat1:lat2,lon1:lon2] - - #US Lats and lons - lat = np.arange(90-lat1,90-lat2,-1) - lon = np.arange(lon1,lon2,1) + def run_elbow(self,a,lat,lon,yr): + k=KMeans(n_clusters=self.wrnum, random_state=0, n_jobs=-1) #Initilize cluster centers a,a1 = self.weights_detrend(lat,lon,a) - ##Set up weight array - #cos = lat * np.pi / 180.0 - #way = np.cos(cos) - #weightf = np.repeat(way[:,np.newaxis],len(lon),axis=1) - - #Remove trend and seasonal cycle - #atemp = np.zeros(a.shape) - #for i in np.arange(0,len(a[0,:,0,0]),1): - # atemp[:,i] = signal.detrend(atemp[:,i],axis=0) - # atemp[:,i] = (a[:,i] - np.nanmean(a[:,i],axis=0)) * weightf - - #a = atemp - #atemp=0 - - #Reshape into time X space - #a1 = np.reshape(a,[len(a[:,0,0,0])*len(a[0,:,0,0]),len(lon)*len(lat)]) #Calculate sum of squared distances for clusters 1-15 kind = np.arange(1,self.numi,1) @@ -118,23 +79,11 @@ def run_elbow(self,elbowinfiles,elbowyrs): mi = np.where(d==d.min())[0] print('Optimal Cluster # = '+str(mi+1)+'') - return a,lat,lon,yr,K,d,mi,line,curve + return a,K,d,mi,line,curve def Calc_EOF(self,Z500in,lats,lons): - #Set your domain. Limits below specify US - lon1=230 - lon2=301 - lat1=35 #index, lat = 90-lat1 - lat2=66 #index, lat = 90-lat2 - - a = a[:,:,lat1:lat2,lon1:lon2] - - #US Lats and lons - lat = np.arange(90-lat1,90-lat2,-1) - lon = np.arange(lon1,lon2,1) - eofin = a #signal.detrend #Remove trend and seasonal cycle for d in np.arange(0,len(eofin[0,:,0,0]),1): @@ -160,21 +109,11 @@ def Calc_EOF(self,Z500in,lats,lons): return - def run_K_means(self,Z500in,lats,lons): + def run_K_means(self,a,lat,lon,yr): - #Set your domain. Limits below specify US - lon1=230 - lon2=301 - lat1=35 #index, lat = 90-lat1 - lat2=66 #index, lat = 90-lat2 + k=KMeans(n_clusters=self.wrnum, random_state=0, n_jobs=-1) - a = a[:,:,lat1:lat2,lon1:lon2] - - #US Lats and lons - lat = np.arange(90-lat1,90-lat2,-1) - lon = np.arange(lon1,lon2,1) - - a,a1 = self.weights_detrend(lats,lons,z500in) + a,a1 = self.weights_detrend(lat,lon,a) #fit the K-means algorithm to the data f=k.fit(a1) @@ -191,7 +130,7 @@ def run_K_means(self,Z500in,lats,lons): #Get frequency of occurence for each cluster perc=np.zeros(self.wrnum) for ii in np.arange(0,self.wrnum,1): - perc[ii] = get_cluster_fraction(f,ii) + perc[ii] = self.get_cluster_fraction(f,ii) #Sort % from low to high ii = np.argsort(perc) @@ -214,5 +153,5 @@ def run_K_means(self,Z500in,lats,lons): np.save('WR_LABELS',wrc) print(wr.shape) - return + return input, self.wrnum, perc diff --git a/ush/drivers/WeatherRegime_driver.py b/ush/drivers/WeatherRegime_driver.py index 7906d3a51a..ed3780be77 100755 --- a/ush/drivers/WeatherRegime_driver.py +++ b/ush/drivers/WeatherRegime_driver.py @@ -16,7 +16,7 @@ from metplus.wrappers import PCPCombineWrapper from metplus.wrappers import RegridDataPlaneWrapper import plot_weather_regime as pwr -from Blocking_WeatherRegime_util import find_input_files, parse_steps +from Blocking_WeatherRegime_util import find_input_files, parse_steps, read_nc_met def main(): @@ -69,15 +69,36 @@ def main(): elbow_config_valid = config.find_section('WeatherRegime','VALID_BEG') use_init = is_loop_by_init(elbow_config) + + lon1=230 + lon2=301 + lat1=35 #index, lat = 90-lat1 + lat2=66 #index, lat = 90-lat2 + if ("ELBOW" in steps_list_obs) or ("CALCEOF" in steps_list_obs) or ("KMEANS" in steps_list_obs): + obs_infiles, yr_obs = find_input_files(elbow_config, use_init, 'OBS_WR_TEMPLATE') + obs_invar = config.getstr('WeatherRegime','OBS_WR_VAR','') + z500_obs,lats_obs,lons_obs,year_obs = read_nc_met(obs_infiles,yr_obs,obs_invar) + z500_obs = z500_obs[:,:,lat1:lat2,lon1:lon2] + lats_obs = np.arange(90-lat1,90-lat2,-1) + lons_obs = np.arange(lon1,lon2,1) + + if ("ELBOW" in steps_list_fcst) or ("CALCEOF" in steps_list_fcst) or("KMEANS" in steps_list_fcst): + fcst_infiles,yr_fcst = find_input_files(elbow_config, use_init, 'FCST_WR_TEMPLATE') + fcst_invar = config.getstr('WeatherRegime','FCST_WR_VAR','') + z500_fcst,lats_fcst,lons_fcst,year_fcst = read_nc_met(fcst_infiles,yr_fcst,fcst_invar) + z500_fcst = z500_fcst[:,:,lat1:lat2,lon1:lon2] + lats_fcst = np.arange(90-lat1,90-lat2,-1) + lons_fcst = np.arange(lon1,lon2,1) + if ("ELBOW" in steps_list_obs): print('Running Obs Elbow.py') obs_infiles, yr_obs = find_input_files(elbow_config, use_init, 'OBS_WR_TEMPLATE') - elbow_obs,lats_obs,lons_obs,yr_obs,K_obs,d_obs,mi_obs,line_obs,curve_obs = steps_obs.run_elbow(obs_infiles,yr_obs) + elbow_obs,K_obs,d_obs,mi_obs,line_obs,curve_obs = steps_obs.run_elbow(z500_obs,lats_obs,lons_obs,year_obs) if ("ELBOW" in steps_list_fcst): print('Running Forecast Elbow.py') fcst_infiles,yr_fcst = find_input_files(elbow_config, use_init, 'FCST_WR_TEMPLATE') - elbow_fcst,lats_fcst,lons_fcst,yr_fcst,K_fcst,d_fcst,mi_fcst,line_fcst,curve_fcst = steps_obs.run_elbow(fcst_infiles,yr_fcst) + elbow_fcst,K_fcst,d_fcst,mi_fcst,line_fcst,curve_fcst = steps_fcst.run_elbow(z500_fcst,lats_fcst,lons_fcst,year_fcst) if ("PLOTELBOW" in steps_list_obs): print('Creating Obs Elbow plot') @@ -94,11 +115,9 @@ def main(): if ("CALCEOF" in steps_list_obs): print('Running Obs EOF') - steps_obs.Calc_EOF(elbow_obs,lats_obs,lons_obs) if ("CALCEOF" in steps_list_fcst): print('Running Forecast EOF') - steps_fcst.Calc_EOF(elbow_fcst,lats_fcst,lons_fcst) if ("PLOTEOF" in steps_list_obs): print('Plotting Obs EOFs') @@ -109,15 +128,21 @@ def main(): if ("KMEANS" in steps_list_obs): print('Running Obs K Means') + kmeans_obs,wrnum_obs,perc_obs =steps_obs.run_K_means(z500_obs,lats_obs,lons_obs,year_obs) if ("KMEANS" in steps_list_fcst): print('Running Forecast K Means') + kmeans_fcst,wrnum_fcst,perc_fcst = steps_fcst.run_K_means(z500_fcst,lats_fcst,lons_fcst,year_fcst) - if ("PLOTKMEANS" in steps_list_obs): + if ("PLOTKMEANS" in steps_list_obs): print('Plotting Obs K Means') + kmeans_plot_outname = config.getstr('WeatherRegime','OBS_ELBOW_PLOT_OUTPUT_NAME','fcst_elbow') + pwr.plot_K_means(kmeans_obs,wrnum_obs,lons_obs,lats_obs,perc_obs,kmeans_plot_outname) if ("PLOTKMEANS" in steps_list_fcst): print('Plotting Forecast K Means') + kmeans_plot_outname = config.getstr('WeatherRegime','FCST_ELBOW_PLOT_OUTPUT_NAME','fcst_elbow') + pwr.plot_K_means(kmeans_fcst,wrnum_fcst,lons_fcst,lats_fcst,perc_fcts,kmeans_plot_outname) if __name__ == "__main__": From def8c57366a2a9b201e586cf40a63fa5133e82b1 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Sat, 23 Jan 2021 16:21:58 -0700 Subject: [PATCH 33/93] Updates to Blocking driver --- ...Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf | 2 +- ush/drivers/Blocking_driver.py | 11 +++++++++++ ush/drivers/WeatherRegime.py | 17 ++++++++--------- ush/drivers/WeatherRegime_driver.py | 16 ++++++++++++++-- 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf index 2e4e8c3797..7f542642f0 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf @@ -1,7 +1,7 @@ # Blocking METplus Configuration [config] # Steps to Run -OBS_STEPS = KMEANS+PLOTKMEANS +OBS_STEPS = CALCEOF # time looping - options are INIT, VALID, RETRO, and REALTIME LOOP_BY = VALID diff --git a/ush/drivers/Blocking_driver.py b/ush/drivers/Blocking_driver.py index 345a474522..319eaf98ea 100755 --- a/ush/drivers/Blocking_driver.py +++ b/ush/drivers/Blocking_driver.py @@ -140,11 +140,17 @@ def main(): #Plot Central Blocking Latitude if ("PLOTCBL" in steps_list_obs): + if not ("CBL" in steps_list_obs): + raise Exception('Must run observed CBLs before plotting them.') + print('Plotting Obs CBLs') cbl_plot_mthstr = config.getstr('Blocking','OBS_CBL_PLOT_MTHSTR') cbl_plot_outname = oplot_dir+'/'+config.getstr('Blocking','OBS_CBL_PLOT_OUTPUT_NAME') create_cbl_plot(lons_obs, lats_obs, cbls_obs, mhweight_obs, cbl_plot_mthstr, cbl_plot_outname, do_averaging=True) if ("PLOTCBL" in steps_list_fcst): + if not ("CBL" in steps_list_fcst): + raise Exception('Must run forecast CBLs before plotting them.') + print('Plotting Forecast CBLs') cbl_plot_mthstr = config.getstr('Blocking','FCST_CBL_PLOT_MTHSTR') cbl_plot_outname = oplot_dir+'/'+config.getstr('Blocking','FCST_CBL_PLOT_OUTPUT_NAME') create_cbl_plot(lons_fcst, lats_fcst, cbls_fcst, mhweight_fcst, cbl_plot_mthstr, cbl_plot_outname, @@ -192,6 +198,7 @@ def main(): if("PLOTIBL" in steps_list_obs) and not ("PLOTIBL" in steps_list_fcst): if not ("IBL" in steps_list_obs): raise Exception('Must run observed IBLs before plotting them.') + print('Plotting Obs IBLs') ibl_plot_title = config.getstr('Blocking','OBS_IBL_PLOT_TITLE','IBL Frequency') ibl_plot_outname = oplot_dir+'/'+config.getstr('Blocking','OBS_IBL_PLOT_OUTPUT_NAME','') ibl_plot_label1 = config.getstr('Blocking','IBL_PLOT_OBS_LABEL','') @@ -199,6 +206,7 @@ def main(): elif ("PLOTIBL" in steps_list_fcst) and not ("PLOTIBL" in steps_list_obs): if not ("IBL" in steps_list_fcst): raise Exception('Must run forecast IBLs before plotting them.') + print('Plotting Forecast IBLs') ibl_plot_title = config.getstr('Blocking','FCST_IBL_PLOT_TITLE','IBL Frequency') ibl_plot_outname = oplot_dir+'/'+config.getstr('Blocking','FCST_IBL_PLOT_OUTPUT_NAME') ibl_plot_label1 = config.getstr('Blocking','IBL_PLOT_FCST_LABEL',None) @@ -206,6 +214,7 @@ def main(): elif ("PLOTIBL" in steps_list_obs) and ("PLOTIBL" in steps_list_fcst): if (not "IBL" in steps_list_obs) and (not "IBL" in steps_list_fcst): raise Exception('Must run forecast and observed IBLs before plotting them.') + print('Plotting Obs and Forecast IBLs') ibl_plot_title = config.getstr('Blocking','IBL_PLOT_TITLE') ibl_plot_outname = oplot_dir+'/'+config.getstr('Blocking','IBL_PLOT_OUTPUT_NAME') #Check to see if there are plot legend labels @@ -246,12 +255,14 @@ def main(): if ("PLOTBLOCKS" in steps_list_obs): if not ("CALCBLOCKS" in steps_list_obs): raise Exception('Must compute observed blocks before plotting them.') + print('Plotting Obs Blocks') blocking_plot_title = config.getstr('Blocking','OBS_BLOCKING_PLOT_TITLE') blocking_plot_outname = oplot_dir+'/'+config.getstr('Blocking','OBS_BLOCKING_PLOT_OUTPUT_NAME') pb.plot_blocks(block_freq_obs,gibls_obs,ibls_obs,lons_obs,blocking_plot_title,blocking_plot_outname) if ("PLOTBLOCKS" in steps_list_fcst): if not ("CALCBLOCKS" in steps_list_fcst): raise Exception('Must compute forecast blocks before plotting them.') + print('Plotting Forecast Blocks') blocking_plot_title = config.getstr('Blocking','FCST_BLOCKING_PLOT_TITLE') blocking_plot_outname = oplot_dir+'/'+config.getstr('Blocking','FCST_BLOCKING_PLOT_OUTPUT_NAME') pb.plot_blocks(block_freq_fcst,gibls_fcst,ibls_fcst,lons_fcst,blocking_plot_title,blocking_plot_outname) diff --git a/ush/drivers/WeatherRegime.py b/ush/drivers/WeatherRegime.py index 7cf270f7b3..9478be605f 100644 --- a/ush/drivers/WeatherRegime.py +++ b/ush/drivers/WeatherRegime.py @@ -1,11 +1,12 @@ import os import numpy as np -from netCDF4 import Dataset from pylab import * from sklearn.cluster import KMeans +import scipy from scipy import stats,signal from numpy import ones,vstack from numpy.linalg import lstsq +from eofs.standard import Eof from metplus.util import config_metplus, get_start_end_interval_times, get_lead_sequence from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate @@ -17,6 +18,7 @@ def __init__(self,config,label): self.wrnum = config.getint('WeatherRegime',label+'_WR_NUMBER',6) self.numi = config.getint('WeatherRegime',label+'_NUM_CLUSTERS',20) + self.NUMPCS = 10 def get_cluster_fraction(self, m, label): @@ -82,7 +84,7 @@ def run_elbow(self,a,lat,lon,yr): return a,K,d,mi,line,curve - def Calc_EOF(self,Z500in,lats,lons): + def Calc_EOF(self,a,lats,lons): eofin = a #signal.detrend #Remove trend and seasonal cycle @@ -95,18 +97,15 @@ def Calc_EOF(self,Z500in,lats,lons): # Use EOF solver and get PCs and EOFs solver = Eof(eofin,center=False) - pc = solver.pcs(npcs=NUMPCS,pcscaling=1) - eof = solver.eofsAsCovariance(neofs=NUMPCS,pcscaling=1) - eof = np.reshape(eof,(NUMPCS,len(lats),len(lons))) + pc = solver.pcs(npcs=self.NUMPCS,pcscaling=1) + eof = solver.eofsAsCovariance(neofs=self.NUMPCS,pcscaling=1) + eof = np.reshape(eof,(self.NUMPCS,len(lats),len(lons))) #Get variance fractions variance_fractions = solver.varianceFraction(neigs=10) * 100 print(variance_fractions) - lonext=lons - latext=lats - - return + return eof def run_K_means(self,a,lat,lon,yr): diff --git a/ush/drivers/WeatherRegime_driver.py b/ush/drivers/WeatherRegime_driver.py index ed3780be77..f972b72966 100755 --- a/ush/drivers/WeatherRegime_driver.py +++ b/ush/drivers/WeatherRegime_driver.py @@ -92,21 +92,23 @@ def main(): if ("ELBOW" in steps_list_obs): print('Running Obs Elbow.py') - obs_infiles, yr_obs = find_input_files(elbow_config, use_init, 'OBS_WR_TEMPLATE') elbow_obs,K_obs,d_obs,mi_obs,line_obs,curve_obs = steps_obs.run_elbow(z500_obs,lats_obs,lons_obs,year_obs) if ("ELBOW" in steps_list_fcst): print('Running Forecast Elbow.py') - fcst_infiles,yr_fcst = find_input_files(elbow_config, use_init, 'FCST_WR_TEMPLATE') elbow_fcst,K_fcst,d_fcst,mi_fcst,line_fcst,curve_fcst = steps_fcst.run_elbow(z500_fcst,lats_fcst,lons_fcst,year_fcst) if ("PLOTELBOW" in steps_list_obs): + if not ("ELBOW" in steps_list_obs): + raise Exception('Must run observed Elbow before plotting observed elbow.') print('Creating Obs Elbow plot') elbow_plot_title = config.getstr('WeatherRegime','OBS_ELBOW_PLOT_TITLE','Elbow Method For Optimal k') elbow_plot_outname = config.getstr('WeatherRegime','OBS_ELBOW_PLOT_OUTPUT_NAME','obs_elbow') pwr.plot_elbow(K_obs,d_obs,mi_obs,line_obs,curve_obs,elbow_plot_title,elbow_plot_outname) if ("PLOTELBOW" in steps_list_fcst): + if not ("ELBOW" in steps_list_fcst): + raise Exception('Must run forecast Elbow before plotting forecast elbow.') print('Creating Forecast Elbow plot') elbow_plot_title = config.getstr('WeatherRegime','FCST_ELBOW_PLOT_TITLE','Elbow Method For Optimal k') elbow_plot_outname = config.getstr('WeatherRegime','FCST_ELBOW_PLOT_OUTPUT_NAME','fcst_elbow') @@ -115,14 +117,20 @@ def main(): if ("CALCEOF" in steps_list_obs): print('Running Obs EOF') + eof_obs = steps_obs.Calc_EOF(z500_obs,lats_obs,lons_obs) if ("CALCEOF" in steps_list_fcst): print('Running Forecast EOF') + eof_fcst = steps_fcst.Calc_EOF(z500_fcst,lats_fcst,lons_fcst) if ("PLOTEOF" in steps_list_obs): + if not ("CALCEOF" in steps_list_obs): + raise Exception('Must run observed EOFs before plotting observed EOFs.') print('Plotting Obs EOFs') if ("PLOTEOF" in steps_list_fcst): + if not ("CALCEOF" in steps_list_fcst): + raise Exception('Must run forecast EOFs before plotting forecast EOFs.') print('Plotting Forecast EOFs') @@ -135,11 +143,15 @@ def main(): kmeans_fcst,wrnum_fcst,perc_fcst = steps_fcst.run_K_means(z500_fcst,lats_fcst,lons_fcst,year_fcst) if ("PLOTKMEANS" in steps_list_obs): + if not ("KMEANS" in steps_list_obs): + raise Exception('Must run observed Kmeans before plotting observed Kmeans.') print('Plotting Obs K Means') kmeans_plot_outname = config.getstr('WeatherRegime','OBS_ELBOW_PLOT_OUTPUT_NAME','fcst_elbow') pwr.plot_K_means(kmeans_obs,wrnum_obs,lons_obs,lats_obs,perc_obs,kmeans_plot_outname) if ("PLOTKMEANS" in steps_list_fcst): + if not ("KMEANS" in steps_list_fcst): + raise Exception('Must run forecast Kmeans before plotting forecast Kmeans.') print('Plotting Forecast K Means') kmeans_plot_outname = config.getstr('WeatherRegime','FCST_ELBOW_PLOT_OUTPUT_NAME','fcst_elbow') pwr.plot_K_means(kmeans_fcst,wrnum_fcst,lons_fcst,lats_fcst,perc_fcts,kmeans_plot_outname) From d7ff1a8b695fc9770e33d5e73db6ca260b4842fb Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Wed, 27 Jan 2021 15:27:46 -0700 Subject: [PATCH 34/93] Updates to Weather Regime driver --- ...grid_PCP_obsERA_obsOnly_WeatherRegime.conf | 11 +++++++- ush/drivers/WeatherRegime.py | 2 +- ush/drivers/WeatherRegime_driver.py | 28 +++++++++++++------ 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf index 7f542642f0..968f5b4e7b 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf @@ -1,7 +1,7 @@ # Blocking METplus Configuration [config] # Steps to Run -OBS_STEPS = CALCEOF +OBS_STEPS = CALCEOF+PLOTEOF # time looping - options are INIT, VALID, RETRO, and REALTIME LOOP_BY = VALID @@ -146,5 +146,14 @@ OBS_ELBOW_PLOT_TITLE = Elbow Method For Optimal k # Elbow Plot Output Name OBS_ELBOW_PLOT_OUTPUT_NAME = obs_elbow +# +OBS_EOF_PLOT_OUTPUT_NAME = + +# Levels for the EOF contour plots +EOF_PLOT_LEVELS = -50, -45, -40, -35, -30, -25, -20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 + # Elbow Plot Output Name OBS_KMEANS_PLOT_OUTPUT_NAME = obs_kmeans + +# Levels for the K Means Contours plots +KMEANS_PLOT_LEVELS = -80, -70, -60, -50, -40, -30, -20, -10, 0, 10, 20, 30, 40, 50, 60, 70, 80 diff --git a/ush/drivers/WeatherRegime.py b/ush/drivers/WeatherRegime.py index 9478be605f..8a2de3fa9c 100644 --- a/ush/drivers/WeatherRegime.py +++ b/ush/drivers/WeatherRegime.py @@ -105,7 +105,7 @@ def Calc_EOF(self,a,lats,lons): variance_fractions = solver.varianceFraction(neigs=10) * 100 print(variance_fractions) - return eof + return eof, self.wrnum, variance_fractions def run_K_means(self,a,lat,lon,yr): diff --git a/ush/drivers/WeatherRegime_driver.py b/ush/drivers/WeatherRegime_driver.py index f972b72966..c1b8b2ef55 100755 --- a/ush/drivers/WeatherRegime_driver.py +++ b/ush/drivers/WeatherRegime_driver.py @@ -11,7 +11,7 @@ sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy_feature_74/metplotpy/contributed/weather_regime") from WeatherRegime import WeatherRegimeCalculation from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence -from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub +from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub, getlist from ush.master_metplus import get_config_inputs_from_command_line from metplus.wrappers import PCPCombineWrapper from metplus.wrappers import RegridDataPlaneWrapper @@ -117,26 +117,34 @@ def main(): if ("CALCEOF" in steps_list_obs): print('Running Obs EOF') - eof_obs = steps_obs.Calc_EOF(z500_obs,lats_obs,lons_obs) + eof_obs,wrnum_obs,variance_fractions_obs = steps_obs.Calc_EOF(z500_obs,lats_obs,lons_obs) if ("CALCEOF" in steps_list_fcst): print('Running Forecast EOF') - eof_fcst = steps_fcst.Calc_EOF(z500_fcst,lats_fcst,lons_fcst) + eof_fcst,wrnum_fcst,variance_fractions_fcst = steps_fcst.Calc_EOF(z500_fcst,lats_fcst,lons_fcst) if ("PLOTEOF" in steps_list_obs): if not ("CALCEOF" in steps_list_obs): raise Exception('Must run observed EOFs before plotting observed EOFs.') print('Plotting Obs EOFs') + pltlvls_str = getlist(config.getstr('WeatherRegime','EOF_PLOT_LEVELS','')) + pltlvls = [float(pp) for pp in pltlvls_str] + eof_plot_outname = config.getstr('WeatherRegime','OBS_EOF_PLOT_OUTPUT_NAME','obs_eof') + pwr.plot_eof(eof_obs,wrnum_obs,variance_fractions_obs,lons_obs,lats_obs,eof_plot_outname,pltlvls) if ("PLOTEOF" in steps_list_fcst): if not ("CALCEOF" in steps_list_fcst): raise Exception('Must run forecast EOFs before plotting forecast EOFs.') print('Plotting Forecast EOFs') + pltlvls_str = getlist(config.getstr('WeatherRegime','EOF_PLOT_LEVELS','')) + pltlvls = [float(pp) for pp in pltlvls_str] + eof_plot_outname = config.getstr('WeatherRegime','OBS_EOF_PLOT_OUTPUT_NAME','obs_eof') + pwr.plot_eof(eof_fcst,wrnum_fcst,variance_fractions_fcst,lons_fcst,lats_fcst,eof_plot_outname,pltlvls) if ("KMEANS" in steps_list_obs): print('Running Obs K Means') - kmeans_obs,wrnum_obs,perc_obs =steps_obs.run_K_means(z500_obs,lats_obs,lons_obs,year_obs) + kmeans_obs,wrnum_obs,perc_obs = steps_obs.run_K_means(z500_obs,lats_obs,lons_obs,year_obs) if ("KMEANS" in steps_list_fcst): print('Running Forecast K Means') @@ -146,15 +154,19 @@ def main(): if not ("KMEANS" in steps_list_obs): raise Exception('Must run observed Kmeans before plotting observed Kmeans.') print('Plotting Obs K Means') - kmeans_plot_outname = config.getstr('WeatherRegime','OBS_ELBOW_PLOT_OUTPUT_NAME','fcst_elbow') - pwr.plot_K_means(kmeans_obs,wrnum_obs,lons_obs,lats_obs,perc_obs,kmeans_plot_outname) + pltlvls_str = getlist(config.getstr('WeatherRegime','KMEANS_PLOT_LEVELS','')) + pltlvls = [float(pp) for pp in pltlvls_str] + kmeans_plot_outname = config.getstr('WeatherRegime','OBS_KMEANS_PLOT_OUTPUT_NAME','obs_kmeans') + pwr.plot_K_means(kmeans_obs,wrnum_obs,lons_obs,lats_obs,perc_obs,kmeans_plot_outname,pltlvls) if ("PLOTKMEANS" in steps_list_fcst): if not ("KMEANS" in steps_list_fcst): raise Exception('Must run forecast Kmeans before plotting forecast Kmeans.') print('Plotting Forecast K Means') - kmeans_plot_outname = config.getstr('WeatherRegime','FCST_ELBOW_PLOT_OUTPUT_NAME','fcst_elbow') - pwr.plot_K_means(kmeans_fcst,wrnum_fcst,lons_fcst,lats_fcst,perc_fcts,kmeans_plot_outname) + pltlvls_str = getlist(config.getstr('WeatherRegime','KMEANS_PLOT_LEVELS','')) + pltlvls = [float(pp) for pp in pltlvls_str] + kmeans_plot_outname = config.getstr('WeatherRegime','FCST_KMEANS_PLOT_OUTPUT_NAME','fcst_kmeans') + pwr.plot_K_means(kmeans_fcst,wrnum_fcst,lons_fcst,lats_fcst,perc_fcts,kmeans_plot_outname,pltlvls) if __name__ == "__main__": From 9853bae12af2aea2b09bd7a663326aed3c502d4e Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Tue, 2 Feb 2021 16:01:47 -0700 Subject: [PATCH 35/93] Updates to weather regime driver --- .../s2s/UserScript_fcstGFS_obsERA_Blocking.py | 23 ++-- ... => UserScript_obsERA_obsOnly_Blocking.py} | 30 +++-- ...UserScript_obsERA_obsOnly_WeatherRegime.py | 120 ++++++++++++++++++ ...grid_PCP_obsERA_obsOnly_WeatherRegime.conf | 24 ++-- ...erScript_obsERA_obsOnly_WeatherRegime.conf | 56 ++++++++ ush/drivers/Blocking_driver.py | 2 +- ush/drivers/WeatherRegime.py | 2 +- ush/drivers/WeatherRegime_driver.py | 54 ++++---- 8 files changed, 255 insertions(+), 56 deletions(-) rename docs/use_cases/model_applications/s2s/{Regrid_PCP_obsERA_obsOnly_Blocking.conf => UserScript_obsERA_obsOnly_Blocking.py} (79%) create mode 100644 docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py create mode 100644 parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf diff --git a/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py b/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py index ef8688c2a5..ecb1ffe125 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py +++ b/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py @@ -4,7 +4,7 @@ model_applications/ s2s/ -Regrid_PCP_fcstGFS_obsERA_Blocking.conf +UserScript_fcstGFS_obsERA_Blocking.py """ @@ -42,7 +42,7 @@ # ---------------- # # The regrid_data_plane, pcp_combine, and blocking python code are run for each -# time for the forecast and observations data. This example loops by valid time. +# time for the forecast and observations data. This example loops by init time. ############################################################################## # METplus Configuration @@ -50,10 +50,13 @@ # # METplus first loads all of the configuration files found in parm/metplus_config, # then it loads any configuration files passed to METplus via the command line -# i.e. parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf +# i.e. parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py. +# The file UserScript_fcstGFS_obsERA_Blocking.conf runs the python program, however +# UserScript_fcstGFS_obsERA_Blocking/Regrid_PCP_fcstGFS_obsERA_Blocking.conf sets the +# variables for all steps of the Blocking use case. # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s ############################################################################## # MET Configuration @@ -74,13 +77,13 @@ # # This use case is run in the following ways: # -# 1) Passing in Regrid_PCP_fcstGFS_obsERA_Blocking.conf then a user-specific system configuration file:: +# 1) Passing in UserScript_fcstGFS_obsERA_Blocking.py then a user-specific system configuration file:: # -# master_metplus.py /path/to/METplus/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf /path/to/user_system.conf +# master_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py -c /path/to/user_system.conf # -# 2) Modifying the configurations in parm/metplus_config, then passing in Regrid_PCP_fcstGFS_obsERA_Blocking.conf:: +# 2) Modifying the configurations in parm/metplus_config, then passing in UserScript_fcstGFS_obsERA_Blocking.py:: # -# master_metplus.py /path/to/METplus/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf +# master_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py # # The following variables must be set correctly: # @@ -103,7 +106,9 @@ # Refer to the value set for **OUTPUT_BASE** to find where the output data was generated. Output for this use # case will be found in model_applications/s2s/Blocking (relative to **OUTPUT_BASE**) and will contain output # for the steps requested. This may include the regridded data, daily averaged files, running mean files, -# anomaly files, the CBL , an IBL frequency plot, and blocking frequency plots. +# and anomaly files. In addition, output CBL, IBL, and Blocking frequency plots can be generated. The location +# of these output plots can be specified as BLOCKING_PLOT_OUTPUT_DIR. If it is not specified, plots will be sent +# to model_applications/s2s/Blocking/plots (relative to **OUTPUT_BASE**). ############################################################################## # Keywords diff --git a/docs/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py similarity index 79% rename from docs/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf rename to docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py index a9880ee08f..845a1e9606 100644 --- a/docs/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf +++ b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py @@ -4,7 +4,7 @@ model_applications/ s2s/ -Regrid_PCP_obsERA_obsOnly_Blocking.conf +UserScript_obsERA_obsOnly_Blocking.py """ @@ -20,6 +20,7 @@ # Datasets # -------- # +# * Forecast dataset: None # * Observation dataset: ERA Reanlaysis 500 mb height. ############################################################################## @@ -31,8 +32,7 @@ # (TIMEAVE), computing a running mean (RMEAN), computing anomalies (ANOMALY), computing CBLs # (CBL), plotting CBLs (PLOTCBL), computing IBLs (IBL), plotting IBL frequency (PLOTIBL), # computing GIBLs (GIBL), computing blocks (CALCBLOCKS), and plotting the blocking frequency -# (PLOTBLOCKS). The steps can be listed on the command line or in a .conf file and are -# formatted as follows: +# (PLOTBLOCKS). The steps are listed in a .conf file and are formatted as follows: # # OBS_STEPS = REGRID+TIMEAVE+RUNMEAN+ANOMALY+CBL+PLOTCBL+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS @@ -41,10 +41,7 @@ # ---------------- # # The regrid_data_plane, pcp_combine, and blocking python code are run for each -# time. This example loops by valid time. It processes 1 valid time, listed below. -# -# | **Valid:** 2020-02-06_12Z -# | **Forecast lead:** 36 +# time for the forecast and observations data. This example loops by valid time. ############################################################################## # METplus Configuration @@ -52,10 +49,13 @@ # # METplus first loads all of the configuration files found in parm/metplus_config, # then it loads any configuration files passed to METplus via the command line -# i.e. parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf +# i.e. parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py. +# The file UserScript_obsERA_obsOnly_Blocking.conf runs the python program, however +# UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking.conf sets the +# variables for all steps of the Blocking use case. # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s ############################################################################## # MET Configuration @@ -76,13 +76,13 @@ # # This use case is run in the following ways: # -# 1) Passing in Regrid_PCP_obsERA_obsOnly_Blocking.conf then a user-specific system configuration file:: +# 1) Passing in UserScript_obsERA_obsOnly_Blocking.py then a user-specific system configuration file:: # -# Blocking_driver.py /path/to/METplus/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf /path/to/user_system.conf +# master_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py -c /path/to/user_system.conf # -# 2) Passing in Regrid_PCP_obsERA_obsOnly_Blocking.conf then a user-specific system configuration file and then listing steps:: +# 2) Modifying the configurations in parm/metplus_config, then passing in UserScript_obsERA_obsOnly_Blocking.py:: # -# Blocking_driver.py /path/to/METplus/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf /path/to/user_system.conf OBS_STEPS=REGRID+TIMEAVE+RUNMEAN+ANOMALY+CBL+PLOTCBL+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS +# master_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py # # The following variables must be set correctly: # @@ -105,7 +105,9 @@ # Refer to the value set for **OUTPUT_BASE** to find where the output data was generated. Output for this use # case will be found in model_applications/s2s/Blocking (relative to **OUTPUT_BASE**) and will contain output # for the steps requested. This may include the regridded data, daily averaged files, running mean files, -# anomaly files, the CBL , an IBL frequency plot, and blocking frequency plots. +# and anomaly files. In addition, output CBL, IBL, and Blocking frequency plots can be generated. The location +# of these output plots can be specified as BLOCKING_PLOT_OUTPUT_DIR. If it is not specified, plots will be sent +# to model_applications/s2s/Blocking/plots (relative to **OUTPUT_BASE**). ############################################################################## # Keywords diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py new file mode 100644 index 0000000000..ca6d7df8c5 --- /dev/null +++ b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py @@ -0,0 +1,120 @@ +""" +WeatherRegime Calculation: RegridDataPlane, PcpCombine, and WeatherRegime python code +============================================================================ + +model_applications/ +s2s/ +UserScript_obsERA_obsOnly_WeatherRegime.py + +""" + +############################################################################## +# Scientific Objective +# -------------------- +# +# To compute the Central Blocking Latitude, Instantaneousy blocked latitudes, +# Group Instantaneousy blocked latitudes, and the frequency of atmospheric +# blocking using the Pelly-Hoskins Method. + +############################################################################## +# Datasets +# -------- +# +# * Forecast dataset: None +# * Observation dataset: ERA Reanlaysis 500 mb height. + +############################################################################## +# METplus Components +# ------------------ +# +# This use case runs the weather regime driver script which runs the steps the user +# lists in STEPS_OBS. The possible steps are regridding (REGRID), time averaging +# (TIMEAVE), computing the elbow (ELBOX), plotting the elbow (PLOTELBOW), computing +# EOFs (EOF), plotting EOFs (PLOTEOF), computing K means (KMEANS), and plotting the +# K means (PLOTKMEANS). The steps are listed in a .conf file and are formatted as follows: +# +# OBS_STEPS = REGRID+TIMEAVE+ELBOW+PLOTELBOW+EOF+PLOTEOF+KMEANS+PLOTKMEANS + +############################################################################## +# METplus Workflow +# ---------------- +# +# The regrid_data_plane, pcp_combine, and weather regime python code are run for +# each time for the forecast and observations data. This example loops by valid time. + +############################################################################## +# METplus Configuration +# --------------------- +# +# METplus first loads all of the configuration files found in parm/metplus_config, +# then it loads any configuration files passed to METplus via the command line +# i.e. parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py. +# The file UserScript_obsERA_obsOnly_WeatherRegime.conf runs the python program, however +# UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf sets the +# variables for all steps of the Weather Regime use case. +# +# .. highlight:: bash +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s + +############################################################################## +# MET Configuration +# --------------------- +# +# METplus sets environment variables based on the values in the METplus configuration file. +# These variables are referenced in the MET configuration file. **YOU SHOULD NOT SET ANY OF THESE ENVIRONMENT VARIABLES YOURSELF! THEY WILL BE OVERWRITTEN BY METPLUS WHEN IT CALLS THE MET TOOLS!** If there is a setting in the MET configuration file that is not controlled by an environment variable, you can add additional environment variables to be set only within the METplus environment using the [user_env_vars] section of the METplus configuration files. See the 'User Defined Config' section on the 'System Configuration' page of the METplus User's Guide for more information. +# +# See the following files for more information about the environment variables set in this configuration file. +# +# parm/use_cases/met_tool_wrapper/RegridDataPlane/RegridDataPlane.py +# parm/use_cases/met_tool_wrapper/PCPCombine/PCPCOmbine_derive.py + +############################################################################## +# Running METplus +# --------------- +# +# This use case is run in the following ways: +# +# 1) Passing in UserScript_obsERA_obsOnly_WeatherRegime.py then a user-specific system configuration file:: +# +# master_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py -c /path/to/user_system.conf +# +# 2) Modifying the configurations in parm/metplus_config, then passing in UserScript_obsERA_obsOnly_WeatherRegime.py:: +# +# master_metplus.py -c /path/to/METplus/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py +# +# The following variables must be set correctly: +# +# * **INPUT_BASE** - Path to directory where sample data tarballs are unpacked (See Datasets section to obtain tarballs). This is not required to run METplus, but it is required to run the examples in parm/use_cases +# * **OUTPUT_BASE** - Path where METplus output will be written. This must be in a location where you have write permissions +# * **MET_INSTALL_DIR** - Path to location where MET is installed locally +# +# Example User Configuration File:: +# +# [dir] +# INPUT_BASE = /path/to/sample/input/data +# OUTPUT_BASE = /path/to/output/dir +# MET_INSTALL_DIR = /path/to/met-X.Y +# + +############################################################################## +# Expected Output +# --------------- +# +# Refer to the value set for **OUTPUT_BASE** to find where the output data was generated. Output for this use +# case will be found in model_applications/s2s/WeatherRegime (relative to **OUTPUT_BASE**) and will contain output +# for the steps requested. This may include the regridded data, daily averaged files, and a weather regime output +# file. In addition, output elbow, EOF, and Kmeans weather regime plots can be generated. The location +# of these output plots can be specified as WR_OUTPUT_DIR. If it is not specified, plots will be sent +# to model_applications/s2s/WeatherRegime/plots (relative to **OUTPUT_BASE**). + +############################################################################## +# Keywords +# -------- +# +# sphinx_gallery_thumbnail_path = '_static/s2s-OBS_ERA_weather_regime.png' +# +# .. note:: `RegridDataPlaneUseCase `_, +# `PCPCombineUseCase `_, +# `S2SAppUseCase `_, +# `NetCDFFileUseCase `_, +# `GRIB2FileUseCase `_, diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf index 968f5b4e7b..d97e260a98 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf @@ -1,7 +1,8 @@ # Blocking METplus Configuration [config] # Steps to Run -OBS_STEPS = CALCEOF+PLOTEOF +#OBS_STEPS = ELBOW+PLOTELBOW+EOF+PLOTTEOF+KMEANS+PLOTKMEANS +OBS_STEPS = EOF+PLOTEOF # time looping - options are INIT, VALID, RETRO, and REALTIME LOOP_BY = VALID @@ -52,7 +53,8 @@ OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = Z500 # Mask to use for regridding #REGRID_DATA_PLANE_VERIF_GRID = {MASK_DIR}/NH_block_grid.nc -REGRID_DATA_PLANE_VERIF_GRID = latlon 360 90 89 0 -1.0 1.0 +#REGRID_DATA_PLANE_VERIF_GRID = latlon 360 90 89 0 -1.0 1.0 +REGRID_DATA_PLANE_VERIF_GRID = latlon 71 31 54 230 -1.0 1.0 # Method to run regrid_data_plane, not setting this will default to NEAREST REGRID_DATA_PLANE_METHOD = BILIN @@ -66,7 +68,7 @@ CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST OBS_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds627.0/ei.oper.an.pl -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Regrid +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/WeatherRegime/ERA/Regrid [filename_templates] # format of filenames @@ -112,8 +114,8 @@ OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Regrid -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Daily +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/WeatherRegime/ERA/Regrid +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/WeatherRegime/ERA/Daily # Input ERA Interim OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc @@ -129,7 +131,7 @@ VALID_END = 2017022800 VALID_INCREMENT = 86400 # Directory for the Z500 data to read in to the blocking python code -OBS_WR_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_WR_TEMPLATE = {OUTPUT_BASE}/s2s/WeatherRegime/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc # Variable for the Z500 data OBS_WR_VAR = Z500 @@ -140,14 +142,20 @@ OBS_WR_NUMBER = 6 # Number of clusters OBS_NUM_CLUSTERS = 20 +# Number of principal components +OBS_NUM_PCS = 10 + +# Plot output dir +WR_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/WeatherRegime/plots/ + # Elbow Plot Title OBS_ELBOW_PLOT_TITLE = Elbow Method For Optimal k # Elbow Plot Output Name OBS_ELBOW_PLOT_OUTPUT_NAME = obs_elbow -# -OBS_EOF_PLOT_OUTPUT_NAME = +# EOF plot output name +OBS_EOF_PLOT_OUTPUT_NAME = obs_eof # Levels for the EOF contour plots EOF_PLOT_LEVELS = -50, -45, -40, -35, -30, -25, -20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf new file mode 100644 index 0000000000..9c1048445e --- /dev/null +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf @@ -0,0 +1,56 @@ +# UserScript wrapper example + +[config] + +# List of applications to run - only UserScript for this case +PROCESS_LIST = UserScript + + +# time looping - options are INIT, VALID, RETRO, and REALTIME +# If set to INIT or RETRO: +# INIT_TIME_FMT, INIT_BEG, INIT_END, and INIT_INCREMENT must also be set +# If set to VALID or REALTIME: +# VALID_TIME_FMT, VALID_BEG, VALID_END, and VALID_INCREMENT must also be set +LOOP_BY = VALID + +# Format of VALID_BEG and VALID_END using % items +# %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. +# see www.strftime.org for more information +# %Y%m%d%H expands to YYYYMMDDHH +VALID_TIME_FMT = %Y%m%d%H%M%S + +# Start time for METplus run - must match VALID_TIME_FMT +VALID_BEG = 20141031093015 + +# End time for METplus run - must match VALID_TIME_FMT +VALID_END = 20141101093015 + +# Increment between METplus runs (in seconds if no units are specified) +# Must be >= 60 seconds +VALID_INCREMENT = 12H + +# List of forecast leads to process for each run time (init or valid) +# In hours if units are not specified +# If unset, defaults to 0 (don't loop through forecast leads) +LEAD_SEQ = 0H, 12H, 24H, 120H + +# Order of loops to process data - Options are times, processes +# Not relevant if only one item is in the PROCESS_LIST +# times = run all wrappers in the PROCESS_LIST for a single run time, then +# increment the run time and run all wrappers again until all times have +# been evaluated. +# processes = run the first wrapper in the PROCESS_LIST for all times +# specified, then repeat for the next item in the PROCESS_LIST until all +# wrappers have been run +LOOP_ORDER = processes + +# list of strings to loop over for each run time. +# value for each item can be referenced in filename templates with {custom?fmt=%s} +USER_SCRIPT_CUSTOM_LOOP_LIST = nc + +USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE + +USER_SCRIPT_INPUT_TEMPLATE = init_{init?fmt=%Y%m%d%H%M%S}_valid_{valid?fmt=%Y%m%d%H%M%S}_lead_{lead?fmt=%3H}.{custom} +USER_SCRIPT_INPUT_DIR = {METPLUS_BASE}/internal_tests/data/user_script + +USER_SCRIPT_COMMAND = {METPLUS_BASE}/ush/drivers/WeatherRegime_driver.py {METPLUS_BASE}/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf dir.INPUT_BASE={INPUT_BASE} dir.OUTPUT_BASE={OUTPUT_BASE} dir.MET_INSTALL_DIR={MET_INSTALL_DIR} diff --git a/ush/drivers/Blocking_driver.py b/ush/drivers/Blocking_driver.py index 319eaf98ea..3fcdb2f25a 100755 --- a/ush/drivers/Blocking_driver.py +++ b/ush/drivers/Blocking_driver.py @@ -92,7 +92,7 @@ def main(): oplot_dir = config.getstr('Blocking','BLOCKING_PLOT_OUTPUT_DIR','') if not oplot_dir: obase = config.getstr('config','OUTPUT_BASE') - oplot_dir = obase+'/'+plots + oplot_dir = obase+'/'+'plots' if not os.path.exists(oplot_dir): os.makedirs(oplot_dir) diff --git a/ush/drivers/WeatherRegime.py b/ush/drivers/WeatherRegime.py index 8a2de3fa9c..e71158f405 100644 --- a/ush/drivers/WeatherRegime.py +++ b/ush/drivers/WeatherRegime.py @@ -18,7 +18,7 @@ def __init__(self,config,label): self.wrnum = config.getint('WeatherRegime',label+'_WR_NUMBER',6) self.numi = config.getint('WeatherRegime',label+'_NUM_CLUSTERS',20) - self.NUMPCS = 10 + self.NUMPCS = config.getint('WeatherRegime',label+'_NUM_PCS',10) def get_cluster_fraction(self, m, label): diff --git a/ush/drivers/WeatherRegime_driver.py b/ush/drivers/WeatherRegime_driver.py index c1b8b2ef55..06146f9267 100755 --- a/ush/drivers/WeatherRegime_driver.py +++ b/ush/drivers/WeatherRegime_driver.py @@ -20,7 +20,7 @@ def main(): - all_steps = ["REGRID","TIMEAVE","ELBOW","PLOTELBOW","CALCEOF","PLOTEOF","KMEANS","PLOTKMEANS"] + all_steps = ["REGRID","TIMEAVE","ELBOW","PLOTELBOW","EOF","PLOTEOF","KMEANS","PLOTKMEANS"] inconfig_list = get_config_inputs_from_command_line() steps_list_fcst,steps_list_obs,config_list = parse_steps(inconfig_list) @@ -64,31 +64,39 @@ def main(): steps_obs = WeatherRegimeCalculation(config,'OBS') steps_fcst = WeatherRegimeCalculation(config,'FCST') + # Check to see if there is a plot directory + oplot_dir = config.getstr('WeatherRegime','WR_PLOT_OUTPUT_DIR','') + if not oplot_dir: + obase = config.getstr('config','OUTPUT_BASE') + oplot_dir = obase+'/'+'plots' + if not os.path.exists(oplot_dir): + os.makedirs(oplot_dir) + elbow_config = config_metplus.replace_config_from_section(config,'WeatherRegime') elbow_config_init = config.find_section('WeatherRegime','INIT_BEG') elbow_config_valid = config.find_section('WeatherRegime','VALID_BEG') use_init = is_loop_by_init(elbow_config) - lon1=230 - lon2=301 - lat1=35 #index, lat = 90-lat1 - lat2=66 #index, lat = 90-lat2 - if ("ELBOW" in steps_list_obs) or ("CALCEOF" in steps_list_obs) or ("KMEANS" in steps_list_obs): + #lon1=230 + #lon2=301 + #lat1=35 #index, lat = 90-lat1 + #lat2=66 #index, lat = 90-lat2 + if ("ELBOW" in steps_list_obs) or ("EOF" in steps_list_obs) or ("KMEANS" in steps_list_obs): obs_infiles, yr_obs = find_input_files(elbow_config, use_init, 'OBS_WR_TEMPLATE') obs_invar = config.getstr('WeatherRegime','OBS_WR_VAR','') z500_obs,lats_obs,lons_obs,year_obs = read_nc_met(obs_infiles,yr_obs,obs_invar) - z500_obs = z500_obs[:,:,lat1:lat2,lon1:lon2] - lats_obs = np.arange(90-lat1,90-lat2,-1) - lons_obs = np.arange(lon1,lon2,1) + #z500_obs = z500_obs[:,:,lat1:lat2,lon1:lon2] + #lats_obs = np.arange(90-lat1,90-lat2,-1) + #lons_obs = np.arange(lon1,lon2,1) - if ("ELBOW" in steps_list_fcst) or ("CALCEOF" in steps_list_fcst) or("KMEANS" in steps_list_fcst): + if ("ELBOW" in steps_list_fcst) or ("EOF" in steps_list_fcst) or("KMEANS" in steps_list_fcst): fcst_infiles,yr_fcst = find_input_files(elbow_config, use_init, 'FCST_WR_TEMPLATE') fcst_invar = config.getstr('WeatherRegime','FCST_WR_VAR','') z500_fcst,lats_fcst,lons_fcst,year_fcst = read_nc_met(fcst_infiles,yr_fcst,fcst_invar) - z500_fcst = z500_fcst[:,:,lat1:lat2,lon1:lon2] - lats_fcst = np.arange(90-lat1,90-lat2,-1) - lons_fcst = np.arange(lon1,lon2,1) + #z500_fcst = z500_fcst[:,:,lat1:lat2,lon1:lon2] + #lats_fcst = np.arange(90-lat1,90-lat2,-1) + #lons_fcst = np.arange(lon1,lon2,1) if ("ELBOW" in steps_list_obs): print('Running Obs Elbow.py') @@ -103,7 +111,7 @@ def main(): raise Exception('Must run observed Elbow before plotting observed elbow.') print('Creating Obs Elbow plot') elbow_plot_title = config.getstr('WeatherRegime','OBS_ELBOW_PLOT_TITLE','Elbow Method For Optimal k') - elbow_plot_outname = config.getstr('WeatherRegime','OBS_ELBOW_PLOT_OUTPUT_NAME','obs_elbow') + elbow_plot_outname = oplot_dir+'/'+config.getstr('WeatherRegime','OBS_ELBOW_PLOT_OUTPUT_NAME','obs_elbow') pwr.plot_elbow(K_obs,d_obs,mi_obs,line_obs,curve_obs,elbow_plot_title,elbow_plot_outname) if ("PLOTELBOW" in steps_list_fcst): @@ -111,34 +119,34 @@ def main(): raise Exception('Must run forecast Elbow before plotting forecast elbow.') print('Creating Forecast Elbow plot') elbow_plot_title = config.getstr('WeatherRegime','FCST_ELBOW_PLOT_TITLE','Elbow Method For Optimal k') - elbow_plot_outname = config.getstr('WeatherRegime','FCST_ELBOW_PLOT_OUTPUT_NAME','fcst_elbow') + elbow_plot_outname = oplot_dir+'/'+config.getstr('WeatherRegime','FCST_ELBOW_PLOT_OUTPUT_NAME','fcst_elbow') pwr.plot_elbow(K_fcst,d_fcst,mi_fcst,line_fcst,curve_fcst,elbow_plot_title,elbow_plot_outname) - if ("CALCEOF" in steps_list_obs): + if ("EOF" in steps_list_obs): print('Running Obs EOF') eof_obs,wrnum_obs,variance_fractions_obs = steps_obs.Calc_EOF(z500_obs,lats_obs,lons_obs) - if ("CALCEOF" in steps_list_fcst): + if ("EOF" in steps_list_fcst): print('Running Forecast EOF') eof_fcst,wrnum_fcst,variance_fractions_fcst = steps_fcst.Calc_EOF(z500_fcst,lats_fcst,lons_fcst) if ("PLOTEOF" in steps_list_obs): - if not ("CALCEOF" in steps_list_obs): + if not ("EOF" in steps_list_obs): raise Exception('Must run observed EOFs before plotting observed EOFs.') print('Plotting Obs EOFs') pltlvls_str = getlist(config.getstr('WeatherRegime','EOF_PLOT_LEVELS','')) pltlvls = [float(pp) for pp in pltlvls_str] - eof_plot_outname = config.getstr('WeatherRegime','OBS_EOF_PLOT_OUTPUT_NAME','obs_eof') + eof_plot_outname = oplot_dir+'/'+config.getstr('WeatherRegime','OBS_EOF_PLOT_OUTPUT_NAME','obs_eof') pwr.plot_eof(eof_obs,wrnum_obs,variance_fractions_obs,lons_obs,lats_obs,eof_plot_outname,pltlvls) if ("PLOTEOF" in steps_list_fcst): - if not ("CALCEOF" in steps_list_fcst): + if not ("EOF" in steps_list_fcst): raise Exception('Must run forecast EOFs before plotting forecast EOFs.') print('Plotting Forecast EOFs') pltlvls_str = getlist(config.getstr('WeatherRegime','EOF_PLOT_LEVELS','')) pltlvls = [float(pp) for pp in pltlvls_str] - eof_plot_outname = config.getstr('WeatherRegime','OBS_EOF_PLOT_OUTPUT_NAME','obs_eof') + eof_plot_outname = oplot_dir+'/'+config.getstr('WeatherRegime','OBS_EOF_PLOT_OUTPUT_NAME','obs_eof') pwr.plot_eof(eof_fcst,wrnum_fcst,variance_fractions_fcst,lons_fcst,lats_fcst,eof_plot_outname,pltlvls) @@ -156,7 +164,7 @@ def main(): print('Plotting Obs K Means') pltlvls_str = getlist(config.getstr('WeatherRegime','KMEANS_PLOT_LEVELS','')) pltlvls = [float(pp) for pp in pltlvls_str] - kmeans_plot_outname = config.getstr('WeatherRegime','OBS_KMEANS_PLOT_OUTPUT_NAME','obs_kmeans') + kmeans_plot_outname = oplot_dir+'/'+config.getstr('WeatherRegime','OBS_KMEANS_PLOT_OUTPUT_NAME','obs_kmeans') pwr.plot_K_means(kmeans_obs,wrnum_obs,lons_obs,lats_obs,perc_obs,kmeans_plot_outname,pltlvls) if ("PLOTKMEANS" in steps_list_fcst): @@ -165,7 +173,7 @@ def main(): print('Plotting Forecast K Means') pltlvls_str = getlist(config.getstr('WeatherRegime','KMEANS_PLOT_LEVELS','')) pltlvls = [float(pp) for pp in pltlvls_str] - kmeans_plot_outname = config.getstr('WeatherRegime','FCST_KMEANS_PLOT_OUTPUT_NAME','fcst_kmeans') + kmeans_plot_outname = oplot_dir+'/'+config.getstr('WeatherRegime','FCST_KMEANS_PLOT_OUTPUT_NAME','fcst_kmeans') pwr.plot_K_means(kmeans_fcst,wrnum_fcst,lons_fcst,lats_fcst,perc_fcts,kmeans_plot_outname,pltlvls) From 4302ce240fcb86b891df6b2598668349e6eb9d2e Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Thu, 4 Feb 2021 22:06:47 -0700 Subject: [PATCH 36/93] Added EOF changes to Weather Regime driver --- docs/_static/s2s-OBS_ERA_weather_regime.png | Bin 0 -> 874931 bytes ...UserScript_obsERA_obsOnly_WeatherRegime.py | 7 +-- ...grid_PCP_obsERA_obsOnly_WeatherRegime.conf | 5 +- ush/drivers/WeatherRegime.py | 53 ++++++++++++------ ush/drivers/WeatherRegime_driver.py | 31 +++++----- 5 files changed, 56 insertions(+), 40 deletions(-) create mode 100644 docs/_static/s2s-OBS_ERA_weather_regime.png diff --git a/docs/_static/s2s-OBS_ERA_weather_regime.png b/docs/_static/s2s-OBS_ERA_weather_regime.png new file mode 100644 index 0000000000000000000000000000000000000000..c5483116bc7b621f85d5f80c5170cee028c08ae5 GIT binary patch literal 874931 zcmeFZby!sE+cu1WjcgS`T15qErKC*|C8b+LX$GYmEKpKf8bq3*dk7UNX$FQIkdC3d z`K|@JfA8}?&->r^$9EjxJIArNFtJ$cURRvgd7k%tl$91IIYD)Th=_lfx0hGr-(_M7ZCST7n_TD}zE;P}t$>}KZr9B~T* z-9$tei6rjdQLv4e!rMi7FYoTokD2J{a(dU6VfC}`XLDI!ziN0X$Ps((@k&zQBM;fT z6WD~WWTp!KZf=HCb@wl*bDi?Wb5=}^t-42xNR1UYMsSVQ^Hd1U6omJ%&30Io_GeI9 zSf-9GJ8Nt4hBsV;ll~tbw__LCCy|T)A09DZpT6b$AD)M&RNj&F{m-vFJ;Q5z=zo04 z^+D%vlK=4)B66Mo`-g~#{_oQ5MaTaQ24orjzZ49v=gyuzOLpM`69-2|xy$nZf?%)xHflr z^4Pyee{h|TPg%byO7ZU9H!Cyv)N_o|OoD=#q#kC=;ZC0}6W;i*Uzu*)kaJj_Q8YKt z#;+2L0;8hRhlig}<1xzar1VNgMn-Z43YS0WBDLyeP)LJb&UveI$R9Y-pBU|&vc0+5 z;~jEcUMx=BcV%2{akN1m4y40&`SM+-&6VX&wXUu%`;j2!=S$JN-qd_b(IQSXeJ;Z_ zXCnD65^fuBuC3Md_iM*L4pCB3`CL-^xQbGZH(Y9SWg43x6`t#|>s&GG)DXtQ^YZs? zLO9D67Ugt>)fxPv7cnuhVSkxZibj!nY?|H9mYr!=_5<~Nla}?xF_H|*TQ6gbaA~Sc zgfV?MrHz#yv-9W9#T6FbsvyC4Xjpht@tP#1YhqGlqD6{#HVB?E^2S%LTrn8=73AUV zt?1}j0yokUj;dK=EBE^K>l3F>D^+@&S4@d?RCE(DCSetCr`*|Y0*;Q zyoO_qk=p_jIasb#a4ub-@kuf9`9bP$(pXLtek-J z#JQ1B=e`;eqvbdMIX8BhlT+54isuQeP7kF557M)~U7#+3;C4Mb zIFT5Q%QeKFGOqTamAADm6vx%p)W{Z@k4VZ0r7NZepQaNU_shFtSm8#398G6>xkJ0- z^9@~^K2f;WPFwTUsMUe#Y4ook78VGmhHyS*I8uAEJmdPtMzOGsoS@@cCa-Dt(rO00 z)UWy(!fkz+QMwZ5yt{1^GCSLr9H3=Can;u??!k3ILG_aq>}@4> zi@DC*8wVTCoH-NQV^*%Y+UJlF#$&AXTdOgGKknl>Mx(wGyI-}nuWZqf?6BGi5&_rF z|GIYq(gRl?$^{v{_WSL|aDa?Z8E&{XfalfVPa)m*ROOB+VF#!jeLr1l zhU)wRD}s{K_HxI@NQic>-QuVt*A1>0b;0cwq@roD_uNygr@QH9S_OtXcLM?f;)qX@ z8^9@aXX@O0J$mfKi6@XG%Wd*96K>R~xtH!yRx`c)POEquwKB(|FJHb`ZmrE9Y-&%C zq9&mi(Xhc=DaUS=-uBrR9qvTV!7KASHT=VL$$4vDe0i!1o0)Gr{|pZYpi|X{;PvqG zvb1d&sBl-zGg9qc2$8Bb%mQ-;n303Z8d%j!Yj+<`GJ9C zl~q-v#|?aG1xFWzl(9!<;k|})zrWj6y?OH{@bl-S%*@P#4Mn=ur%ihc=Vxc<;U)zJ z1&u5SDIFO)N=nz}df?C!tbY-YZ%9Z8o%5PbLzM8Q$7%KucFmM5-D;!RzEZl-+0k$_ zoQ&wULX5-eY<~v3X7PA)>^*k8GRE5U!Gi~OOG{gt7;9u@WUZ}N`gJc|y5!;OySmo% zEB-MlheE1S!^~lOeLAm$$WkDW2fj2t7x-7MB4;2@@AQ?UZ0#ShM5fPCvPMtSV zE<1LRB6gN2mQT9c*~T60Bs8~V!+A{?Y8>G$R9t#q*QCO}y1Eki)=wOVLWiU}Ih)$o zk-88T28N2bMLvV(+tJP&$zj}vgIWBwS+!Y6uNZE^Bq29~=&3i{?%L|=>P&K4+UYDS zsBrZ2hk##_Yc+i7ij2eKOQGq+y;b``K3|8361u4#WU0gm_R z;lnu<(R=Qv8_sz=Zv83|aN;Ui2>bgP8KL=i__elV`Jk{cH74VK*SP6Yb$(w^pl7-OU3N8}&Et^14I#UQ=Xof++UDx)>e|-(k2IV9Q0WO()MiVaqo|42rb;+edx@O| zbV)lCEt~lG_+;&JXQc8Amldh|@2m}x=9zRofwr<(<2c;8AKwubN6cVVW8NJ*e!PW* zulK2n#kG3tV6NDLL|k1%gQBFQmk!#rCqIGopvv@MrKkN$m%bGNT`>9M{mBRT(;9P) zg0r3P^UKQ0sCbMN&R9J!rFUMtQ_$~>!PmCVbeB0{iY+I;K-aak?E7Ik*>>G(vQ1*P zeAij7;POOk|7%i_wHO~dVIyUS@mTj<6kZ@w&_+5@IPF~d;J4pkw< z1R5ixDi+$ENAdYYKi$XlE?ZfUGXr)*u}%N9!pI#+n)%anNZNN*m=Fqjw>&1RPebzmvU#7{W->3lLC^d`EGY;8UnNE#}i1=a9ABRMGP0d575iLtp zqN1W!)7^>zj50X?tB=X3sZ*zW3RtdP6RQhm!$Pe<-+6l^`PER>!oq?%Cb6K;zHVk# zgM)*EO(pX-bYd8k(*^N>< zEjI9V7g;1C{V6St6#(D(@9%Fnpfmzld;9oPP2J-ABZ;Y&$F^`J`)c? zk%Hy0a@awu7clei@bnV~hlZ@+#uRi|SiULl>XaI{9zlO~bPG=S9XNIBu_ zefhRK-!!!cg^_xDloSW|G6PT|t$^i2xD&x@`6j9{Q3$ZstvZF7zoA<-{`x2#XQ|o3 zaP4GQP9lD7X#$JyHrQRL;~+qLv#WyW44=JsCTd}A$hXHEK&}{4F|QK-B01ML4As_B z5=~ikAsiXdzK!t3Rs!}*Nh0gR=Y-dX1CZO6qLBP0Cgvi7wVqXa0FDh6^STfVAi;Qh zWBGJW$IqYlALsmj!#u&CZ+V@XTkvadM~5;;>5~6xT7j=nsweV$Q1Z)@?TW>ghH#MU zLP8pReYSCKrzpQDrYgZ3q&z-+;M8PcW_}b6A+FR{Xx)EUF0KhVL@7{%u$hJI#SI^OFc=GJo7wBYH=;`UPcE~|Y@x|>U&NW$!m#Yz$ zjrVAhYEA;PQkntZ3{#u6zVJk=UY%Y;Sdp-cv!j#Kd2;fE z4&KU=zL2{VE)AeYnqje@4#+_Zq`n>QE9AYt3l>dLSXST9PhT)hS=h-d@A z!bY8$I&uZdOeVbHef9)4%>2eOf#v4SY*`$uW^wLi1_mDcB?AQEK?mtbmQP%Q3?Tny zzaA>$R1ER2tHJ_r3+B*H_hS$juu56hw86(iwzj7z)@6zSdZZPyZALqv#6luU(bK_g z%d?*8O%Bnrmw;H5Zc+sRL_*CgN$AMvfWJ&qVI&^Rrk?Qi>sKLNXzm>rO~N6wr5WWr z#U-VSI~;K5PftLw*(AHyK|U=*9~-7b&Oqm-wu)M=L2Q*bb&q!w0%~mU3GLN$_}^7Z z{(OB+G`}?j%`)_8=Ihrba`c;&pmfnV3-96p#G|##wP10$O5yU#j9*DJ$v?S zsZ-ZC*>QbAx?dZ@3BeC)c}77H4W}|{q4<9|!=N$aO(V#$UpdzI2`bq)@1Tsz#fiD` z$Q*7Lv$!uNmI7GdeRforTOEM*nx>|v>GhLepf}k=ead_K{UDZ;pM~WyHc_UakZa7= z&Mq0Ig5t$SK^|E9?XATo0jtSC=oX1^AsTUF-cJzRB|NbGsK9aEyrQAOS7akee3bOm zDFrC^JkM+XX^0lpcG;SD|1&X7U=vf#`pZ(}6Me*S%pWYq8Yf`j;6rn06gH0(oNP-` ze9WShCMzrZNs~=j7@vH*fGJHS>#oIU{f#sLzVfidPoTl#)#3nq!}R$1@hZes8)~Z0 zVU~yF_wMz}mw(J1AdTaXyaBEG#fujslnyY%Da1btI@q8r3oSdF`tieuOmqKf&}nyk zG}qFHX)rLgZ9uum({G{^Ug^|zvy00)c<|s-En{>Nl-`66$w+~`Z;KT9{!zLBg`T2D zVG^)je`+dm;>3y8>=$)pfo&H85+N}@(bM&ggsJIc<_&m+ghJA2wcfBrR? zRrQ&D(q?y_@p)=$LTkiu=Ss~UxV-h_4+y%^6If*0!y75;Qub|ebaZqQfJ_cG-^nVx zu%Q!7-2$%$-{~~8dndjhfKK00_-aU!pzS#SUh|Uz%_&*|1>g&C9ojDFw z9WYM}4-F0Z@o#T!al7m|5+6B2g^T<0B`_jl$}dj{{dKIx+!Y`u#lPj+M?5NK!1cS}6j6WJ^O4a}$SsEJbr& zYquR4mSdVj-&gVT^Sgb|&p~ER=oVF|637#`?`w^bf>s+#69+TKm{d4Ue=ocu^_lYy zlwz(lq^D5xnq(HnZP_uCmHX2Q+bf9fZsp)@G1k*$baXR*JRX~?b}e5XB=Feu=L*}- zJylGS{f-i1WE6)<-@+Ir6E0|zzB1cy#z%MILK3vY`lVRkAHl)FdbT&qSr~Kq3|oJq zOyGtWzZ`gjwa_Shc?ZVVd}a#E2X{j^*Toh1oM zZz^CsW?+J%!W#6j5beUnQI>{7FFeWFP6%Z%2C=Ct!I&FjSbB?iXe}BpUb3jD$a=_W zW9j-ER9c9?{}(F)juIzeJ(WaA$26kXfys$?r+4nm)LSX#IH9Vl8U`Ih$8@;HFGah& ztde%S3C8}ZKIWO(*^J5dR6$|!Qv2npD(FMfQ9=_-G#Moe9?+Nr_0xcCn(QmZU@dIJ zTE^P+a*70iJ* ztpBtyGc(IG#8$--Lf=mUKgH~S&Zgl)2J}VQ`LxAy?$)qwExWtiZ)7^4Ry-3I3jEu3pSe;MKzY;Hc4qAML z+AGIY6riN56EJlp@W_-_Zgm@H@X$2X*DuvFY9Z5TB#!O;+;G2SHqf*RtDo-gO(qhC4pbhvnbiZg+o{Af4K!UUvYh51Z_I1{X|}V zy6WJeLz-a>OiVQsMc$`?N1>#ow5z%%`8fur!ooK9L`{e3JOsw!*MQ|YCED}vMX$j{ zpXSd;k_y{93k(~%%@9H`03XVW4mHKC27YP$a8ezpM=9g~@p^Bb^v%i6MoMbPSWl@# zfe*bXijR(xa(z{lns}(Ez>Gtdb8`Hrr8uKE#d`qWRk=u->oC5oS{SJ#srKw?Qq&Ou zBFzvDR34ow!<8%db#!#x@&G5=!R68jT1%GiY^3T;M>))7G<$V|!Eua*<@D!=1QG)nz~X`}<$^>gA~Re$<7L zQ~~NyE->LYeA9GzWuQC=-E?{NVny{+#IDdMT|u#ZD)HDKDzTCyK;I2 zEa}qfEC3c1#j%m$;c@6ui#7JG@!x9Y%`U72!ia+n1GxG=@*Ab-_ENxr?JGgKa!vq= zpK&l$k7Zfaj{@Ki2TU)NFMWqqyR0|U{Ym_zWIzNDn&q^_`Y|vJVwPe)cHNU$-=@?C z0+>O}E0a2!$2hp6x&M(KY4$%}e~X=LiJz{zJB|7;Ktg~iPZomRPTtULe#L3w_h?;_?a7Rl^%dQFrZJ?cpmuR4n z3ZG!ID}o%-o9Af!exCV#BB)p^vTwEPjw3l8>n+!XoL$$=C8@3 z{ZqX5CDYr-Uyv`Ec4mGbI3mLUFes1O)5|ND+PJ^06#rTEAHz{-?i;{Okr-FrD1ppL zG(-b2O>X^W%cQqZ4#vn_>I{GqWjX`xUlo#{B;>WVDfpr-fYZmS$(haheEfKW#ti7Q zvehWyT>j`PP^X`-agC(^{{3`&OmsJk+Sk+5!rrIfWfzZP1s3|wojVDuG(xtrFhkXG zk^l2g3}3$^cESq%&)Kuj*5;J0t*u}8<^N>>h|=!)n36!VgZ9CR<}vMV`yoxkP~AwF zucqgt*@fw!+ZdO2u*m_a6sgdgm6bK9r?>6ilyFQTfJXZ>YUZ`$|+P*fn0-3yU+xQ&c~7 zgdrv&Z;0s4o!TkBWh#<3T24`HGV%5c<}-FxA>@>;S{nm(0IA zk(?NnEx7CqjBtu3CLc>si-+FqHl!B~Hi7+zEaba-9H1*`!W(lHq$I|DeSJ_*0xD@k zVWm<53?-P&I|Gv5x&H0`UoXHCFjPfC`Vdnyg+r$!h3s0>$*HJPfNC!i8Vh=kK%b+z zn2k|$P)znA!xr_QV)9Gw!_+UsVX-?_0QFJD6W1{F$UIVA&Df*@6b25hK8CaRA08V^ zgdYWkea|B^HI!p2TuDjEDH(V1magmp$N>Rt6G29$I{H z`xs1SD83ayy#mX@NWU_GG2VKp0B;>WAuPHz_g3?>R*s&OH@#@zM-*CrrReH~qkmR1 z#uoTKAU0bmv>jvNlNWHn!^U`=XHo0*;|J`C&=4@SO;zROVXV=b4b|1+$UC774O=%=DoRWHBuGaZsm*p|L_c2i`&*lT_wQR20%ei;I7f9p znkJHc$4u;!J~aV72d zGdUy$Bvjm)g#lk)ECo;2;WD&m{djm$y-B^j8rThhRzlg*cW&7`*n&QIWdf2O5zG)O z0~qL#(Sj}$D2Jh8d}e!d`}WiC<*;IPGk4wq4=8Y|pMzS|xg$1?@#3&QhmT%g#1pF{E!xaO=mj{{} z#tz1B9+)qHM(Oe3NUkXXEYuA#ql1RvWv5@e{Wr;7U3B-vVA(gJko63kyqsOgmufWylL-pu!S5yl4e+KYTt#BWrlBJ7eYOg&j2T zJ_&ii#(@mhF9eNarAB~wz@Wm~z#s{chCziWT&g<40Evi<r+4e)jVi zX8yW-f&mO(39F?GzgXN{_`EONxC_j;+p1(ZZ^O)D3(N@5wmIK+jjh04di3~lPT{{e z;P(mhsULTIoNCwRhk`zTHc&C{&P_&g*HiE&j0@~HZ$5#*xhee5Wqy8D`9x_&=vj)T z_EtgcnrhC@&MC67Z%`%kVhBN&P-F#kCmE=@N9k;1{waU+CFIkm-*cI7DYR_AkAPzG zr;W^+{i%|iIh_1FJnhL?9bX#$XKVTD;*4ul??+*Tk`)sZDTQ9JW=e|bN89q`xEfIGcF z$tdW1DD=Q-aq1HIY$_r*jkm|B*dQV)0Ppey zm}P{Y1=N+SoS|h8->TXiZbi(U|FYMgF5z}mS4SfTW?FpqeN^!9-NI zj&x0!&pu{`R(00+&TKEfQHZeDItI7(P43&1(>%MNYcK< z#Z6Zsvs#KG3)aEw&HU1mCBnrIe4GezxH(85q(TY^loVV9rfecJDl!t}Z8C&m1oVaj zDl7#Evs)#JplGROK7GyD^X};9$YyqlAQt8P%z(iGAHkVspjW4>OnJi-Bt!jYkC=)B z@)o8Qw5}iEX%u3TSD`V@1!b~2C@}CjA5s_rk2)1E8CE{z6hSa$g7AZc-EshgIss+51BkikS(*+l2Q)dW%0=Kf zD>i`VvV`Cl(uF8j0)kC*vfb!Bvw|$N!NAZ^LuKH0WbfahUhWq)PW96r%Ycp=21H|&^M)ZJ?}pvbb%Sh%;R!$)m5^;FGCx4eC4Z7w zSqD@Lq7GH40h0|hE&gDWl#i(o4U%8q%Cq)0+V6;e06sv4Qt|Tf!NGt{+h<0mz-Nq; z+=DIe+}%?_670sLgwXGutPp%-y1l*JuJq8WKa?cJz+0*rD< zV~iAW>dw?EKxvl3d`NB+Bx-IlhRi`g1-5{&q|w*QrrB+~1-u0z(xy+Y0EOp%HHc6? z>Hi3@(TVJ==^}bg!ZIb7UJ?vdDD)j4Q?Ea_%8tTnZ*=eo?wS|_p8Z!tgOzPYOYImm z#PxJTGS~3;eIZbGl?1J)IMetAzL(ybTV8Jebm<OBl)c~VOB5OoDl>j={w4zzz>Bl zz7C}cDgtk*9<;F2e4oP&n`2%hRFv>S4a34pnG2 zpf5Auy47hp1NSinKwa@jusXL{pAe$f)z;Sj(Wl5LC=$UTAtUUtq5uqN?z74hW970G zp-#?Cz|I={FQV^W$GuwJSXZ*WZor5ME*douh0R~{ z+Uy1Zy@RmYFq5Q$(hK6-yli4+HB9!)Kv{?4V46vVd8C)Yc+W?HAm%xlKRw}Ajx0a8 zsb0N$m9Pp0=?5oG-RzQij`1^H-Jr-wQ~M@3iqzYUK`Jk87~K)s9*R^vzr|>hWa!NY z__LD0iG6=rawXb+2WW}w7cYLx3$U-|Q_p-5;6*y(h z;vpYFq)4imwI%r>72G#n!pGEiKPN=j$^Yg=T)?l6G}Sm@Z^Cdp4Lv>TAY0ejNX0!B z0=*O%Jvr!Mky$qC8Xxq?ry?d9%#Xz#T+1vjs2E+YBKD5>~zFMYRCQ zur=GuCrHWxj@E)mI*2!`npzAG4jyf>LP`(va2@m0rHJwm)CCfE(H^WhQUpZ9{`UG1 z+PLNcke)zKA!rQh8#Qisc6UdnNq98^*40!%e0OL2MNU^P2*bjQ^;{c6zM@m<63~f2 z56iQjRs%fIpu0`+{!dB3LDrrk@EEl<1Nn1u`rA?Ssa>!i!a2;zlm9N2uc-d0P-TVu!>+zUsBf7OF$%cu)7h;cegW&ZD!fc z%!YP!1Tefu`=<-lFQ=J?Dq zkbB|kn?~$B-vX4xJ1#aLa7L#TuoO~EfqvJ2rJueZ(=YS>*lDpZ*THEA6+HyM1{`%B zxXLiEa$NBr%f(VI5rE^-6LxTv2*h;1N@Xu|x zK^sO4ofzypIib(QFZ8~vNeqJ62KJE2x1=I3H`xw_$n2DjML7h9ho{0BRuDYQ-`c?B zT44{)G?-)|F{O;*c=I(>>Bt0`sZ%jk1;beS%@@Be^euvEauS9oyDCJbg@F7VHKzrR z2LvBln~^_!^r#hJ(#g(J;hZKj=m*s}B!u@K@7-y7tYG?A)^>^)r?dOH^p7hPX?0*? z%7D0FovDWx?GRHh7?fglOaTBBclSDlf-ontyJZ2Y2rg3uWOiUw$!vGNdZ4*V}KUzd1E{1-yG%zge#iFCxai%1ZwBx0VxZh3RRk zozPCcjE@^2H_B}pW+1yIshT;OoS3w)M~1|}f}~SfT}=R;({g>-015*#-y!y95MP)i z1i%tI(9htn0B${-9=1%#Wp^u^{yryFI1z*~ujqb#=%`S(TWX)sbG@|^n7H3 z!8-KWjnQJV;Pn)+r=IRG0xb#=Aln>?D{II8u9-$xO_p%nm61+ht(2kENbwD>jJMo_ zZkF5gO;rOxIuAH~D!eyg$_=~q>Pyd}yPKO4Sgzdiz~{>b)bTV=8e*dBD|KMu<;7(p z5)kwZCDZQQtU|7ieQlyJY#*SzB4Q`D04F9cF31C9tZ+zQaSzxup}3}hBS?h234*FD zSekGiEReb2vfR^cM8OsU155p2`lo1s1{Zu1fyhSPW&emkTqNue78J6rEkj$hJzcYB z?!bpnpZ)=5P7aiGWf&a6bQC_e820JY(_(3WU?<|765D`pMHlBly#-F>YDIUs%-Mn; zFugCgKIRyqT%4b8LB_{fevkzQDkOb{7Cy)uQ)w1}G7Q!wek&Je=x@5WqWZ5n|6NFg z#dDCBsL6_pi?iy`w7HIOz@S1T!;sg#^v~$v2O7Z)ghcZJwA`)h{y`K>9)HLPxlR~6 zt)Qz;hG;wANJGpAz~4=F=cQIg7X2A<+I{wS(F{Ybf#0hltR;C!OjmC;e12s`32M<| zq#*F1Fi78wsA%~({U8}o+Qy(K2f{?D(1TbHUV65f6FzN8auqLyfS#%Lr7tK9AIt#v zI29O6kQ4xe$!)}Z1dRm|;*nHAoXd|Mc_1cXSRMi(y}WQ;h?9gxs8dOtJvK=I%}x`d z94}Ol4_uUZBqg=nN!5s;MSSr+w^Ogy^s`_t!DMA-a^``Il+2@^XB3Z!FepcGJxk+f zYu=xvuw0o^tqAKHqy4*>WE{htQC2)-oxo5un-<{pHuQR-{Sja&RR#nPtKv?x>2jK0 zBn{d+2$eQ7Q(0Cp=A=T0rNq_uxoJiWgLeP@C_Oj+)GRot!6%stlMuO$66c@XwcgL& zi?u?XJBSAjj1lE7(U9{%LUwC*0LK*4!CkBmeg~LZ5f8o_$*-Ck&XV%NBSWq6Bq?C; z<4J=$Z3GH6xy@m58sZlZ=6Oe0yrZL|0ivgXa4HQnoWrv=IvYIe5DCEQguTgv#bj62+JV!j!~W@B`pv@Cp%AfsQ5!X`9m1Qq?1~5obkAwQZjXcS=amq1s1%5rzNE*vI>HrHJI%F> zQ||kIy<)n)4@_?RBM$l?4(-0om8O>)(U;a=02WgO5=BER2biN1r%qYg2}>Bk#Q5XK z4-GBsBLE)A8ju)YzkXeLcw$UB2V6|lKC^gC$Dnk&Gd!zSfQr;X1I0ydqniPOK|S?-JKbBv)uaOVYq|Lz>4-x{%j)GTSANDXd#CelmK9zW5$Su`8x+v> zS7y20!ce_Zl6tjz2Ly}u_{S7jsSp_CmBIWpp|`?940u^fjh7jtLV7@dgj01xs7AL!%` zmb5ZswhABBLwTL6Te=54Cx^k>QzJrTC6DPlR)eu}WZf4-i>EK3_fpyK?iImH`0JElS!b?(VT~?4Z}hFjI3;}!(z9*AwId_rD@T?gBahj z7J-m^sHy%t4$fZbd|@5uVF=*9z_%IkpBdhh2J=$mBfm9tDVPS*p#V_hV4YLJt&jwE zXDIo$h!hQ`H$ziUYUtGUVPgcM_v@ewX{qKwvoHqRWWw@+Lq`l|dW*=dhryXupNl{NIR@Cct@G$!k|+G19-#|BwAf|7U>a(1F;s?=)i#kNdMEB zhKRKv^5$cmIVJ|ZG8RVfF7L#|L}NI+2hA<*j9gsu4B|fAY0DE>aX<`_p!Xpj_*2#A z&YjBxOJBjLw2Vv#@Z%t$YZhC^imoBMTfjEi?OhJa)d><3D|@;)`GwW#p0Ot!VjY44 zPW_aK-*4cMIB@kvDRiTMqb24muuC+`YCcW_KZx=61T>=m>j>Yvr6Rhs7Ki8x5H1>s zEg@Z_Yl);AZW|&j3uiZ$^HJ=|Lz4iI$>_M;t_<$wPl&p=4U{7ecy`$5#{r+c^=Hk_ z{8=+ZL<3QcCk?HdBi7Q=Vm$;zh6T$%%rM-B@tPX(mDw*Ffplu-wh9jStZ#(#K|l=O zg|&6d17G@Mgo7w#xG>QY=RU9o5X#7uK^bwbPr!Dp0%{J$lt7?{)DF{zf+Ehng^}2s z&lg4S+NKB62*Uj;by!t0F-g-AzIgFABIyI(f_Z=n z7S0l=S_D`1#PbP-^V=53TWt6Uuh6C_m z0O3xx`N)`5qyRAf4L8$37}bI;7T4!`!NdXDN60`1vj57qPe018>ZKzDAF=c8i|p); zIx?W?aWt1SBA!OrwX-gy3yB)WrSDTxs=3*JAG%yNwIEyxuSw_cwr%J|*xCTbNJv8P ze|&Z-`x{%g=f!7JZ5d?P~VoHWKMnV9|3Su;)t;j;(Q!wW=lwrh@i*{NYaNhv> z?4*#5wRJvN)e>PKr^FH3Qxn02TN}@RlA#)W3371v_UJM&1m%Eh^RlRD`N0Nlg?-*2 zP+=dueR7X$=7%jqsCw3iHt*#)QMtj49jqq+L@2^0yHm!00uKC%R!5*p z5%1bWQ!DV7(<{mS>vkIxiPL?#oDfq8x*aJ(@*LO@NKoK>rSZsakRERyRIdtD9*d%o zI#4J{=${`42m?j(q!7nn2*ac{-1$E7)>tQOHGmPN6+%!~1=z+G{b(m-3T+>3Onczt zB;iXZOm^msj@oXytopr`zg~ddO;I-0?4KicKu}orJFQ-4X8yGl26!DKl#vKoD20gU z>>7nnRm@;lWH9Ux1MiHdpauP&m%`QmSHb?yD%p}=U^|hGo@#1pWgYNFHP}gM<;UP+FE;+n9j4wF9F&ycsL`& z7{GmxIK)?#KZB{aEm4LZxDU~$H9+O(fn`Bd6kTKf&Fyt4IkY%HQW0U*OyBBd0L~(N z7Iv%qBCD&c`k>YUi{~wgY><7Z_76Evtdd$0~7iA8b#UMd&Q2+nrc69-nfx9wdO9mrPJQtj-G(8jo5#D z6R6i6ley8P>$04x-Cn*!DA%K%B@pWDW~{C%ag~R0)azjS(d~F#!a1 zyT0hAD&A#xdva!`(O$TMa|uT5NzhKP0Cci(YoSe!*Tw`E2S9Er2D0ZSs<64MD;X@; zoP^mrqY($Gql=yOdvG$SUhjgNj@23DWIXCN`*)oYqP9b5_7MG=Yn1)ub@`bhP-RI@ zozhq=X>wl4;h#+j_mpv72%uzqw>aMvKQUowWn+^_V#mwPjcma+wCQ92YUVgZy)nvH zu9~^IU8%kGzHHvxjBLueW5H8<>n^13YW7g{dcA(@Oj`-;rf$eJ9(l&&5>>uEZN@=J zFNG-znQr;;mH~)i+0E?;EZKE(PeXHaLXvly{+|)F_)dOv~w$-7^B@$vz-J4(gg>T6CXU_?d3IIG!}(r@D=(3f$tSv z&@;VJE93md*Lf+>;|Lui&)s}XFey*;Ts zIXS7e5*izO3E4jlykeXG5G^e&Qn0t2cT))Kzm&_q%sS0F)cJ^lT4lGr{IB%7UM;k8 zHHh06kH@2-5m0QEJ#lu9?0920W#cqs5sgL8ByH?gq%m%h7wru3)s*IM- zI+;nI8?xzr zcWo(A6b<9kWKaK&b@%+kD_;;d0qlbq_sB4Xh_-QAwXuuN-5wxyDKvSq1-o3E$3#|( zcr*(V62wHe21u8C%C~zS`#`r*L$(Laz_vuEts(jjpsl%ic@vPM^>5$`xZyhtrqo0? zT6}Tb*V!d@7e#k-rc`uwlSsY%x{iR+#pPtT+NaS?~e{hoiEesd;zT)MgH-M^Ngk?S9 z>Y;f9z~%{fu8@!O$o76f3<-EFSn}95Dnz#`a&@s-?8bLeXW8E#FY}rJb1&Em)%ong zYj26$1Kl?^?1h(_?;+NaHayc9jb{0vAKO+PwYqc06!t;Qm4!mKq} ztA%(M_sp)x_P+S$Va3q=I8NQH!M+jrQ>-*ix{{5}Di0(6mrlpx1D6Fx7ytQ=S;78w zA98Z?6B=jI+q%0``nU1@n$}y$mSczj;`6FQq&vS!mq2$J2f-|LMxzwI-N0$Hr++VL z@-mzn0weR$mY|r8gCW9x?)y>YJlUtf;cbABW`^u$LcU#NL3ZE?V$&uH}`LQOg}Lej)o92(SfEWw8`W7BJWYFRDdXvV23&*8Hn+;B@H( zcRyFNqv~}zRv{O(ksNl}?r@m^M~lj`6$tZ7l^o7;;=Xk4zAjt3Jlx!$Rj#I2{aqgR zEJ`;W70rErLS+JUJB-b&mh~2#jN0<)rg#%)XDyI>T45Nn1WgRt4+0{|iNgm^9C>Rl z5Sfymt|Tt*4%V9l*aD`CAUW_kCMddBcxv7ZZ3CE*0bksqhHTaWzydout=2o@pd`S~ zHDzt>XxJB$LFzPqZ*pSdx{8yVjsbju03vM$)9lXJl&5Amj5Q7$oO~4*Z zy*vT}DbT6lN|H)THNigLQZ2G_!|C@S`cHKuH%Fq7>akSR*)hYajMe4|oD|1KEO zQ=ZYR9BL}6Rv5{x=6>Iy6>(I7-8f;9k?m7cX_x&z7#SNYYHMdes{(3W0_FoOx}Yxw zu+syrjE>0#mV}5q%<^i2ag6q*2Rx3dXU= z;yyI0=3C&MXyb5Mf9#p^cjO@=T7c>vvv$K5*`jliVx;TtewjPxNKo(hZ_raWpMpMY z4_KZp<=D4&I)|yO7XgE<@fq5Ce;D~+OfRP|37P0#iy#_)lqz2lk+}=sCnPOd8%Ua^4_aVNvo{{Z3RnZ*1-4)FyxU-z$5-IWO--9R|9?g0^_(KS> zMY{%>t7-1P68{?;y_0*5k@5U#_Yj(L*u`XTZ_k=?B1y8MqGF>)T;z+d<1j;rFMp)8 z(+G=pRwnbmM~umYQ}O`(hCHM6>p$r2-*^1`gY5AsC5nH4`>#I){k`e`^=bHx?AV_O z{co=@{d4gD@LgfD7Z2~>t^f9!nA`is^uN78bo=!``)m5&UUEHn>HqZoV#Ig9{p;EM zub(^d?oSl|*QepP|6g5DVmtBIbH@%No0C)P{+Fdl`vy6wATO_LMQI0t{hwC?qn<@p zv;T5k1?kxG_qPN8+ouq$4V_tCQ%nm=#(zE*pQtjHHU0l`c)`gJPwqH~CYjQ*DTN$} zskg(}quCEIsVNfHH*U{=D0EZ`AtH;H53qoLiCkY?K6yY>XhW~+m9|u5asDjp(+Ba4 zp&wXoie@zbi1_i^?!mn~wVVs)9Em*)F82bAsKZB+)BPIsFhaN1~p$?a;E7YM7>xmiH8Q zqTGM!m^uoDwo2Yg36;H%jZHe}_j!TKlg&=^be^KJp{8ljq!a4JhLbuA?m5FbocJME z{zry%nCCn3W$3sE7z`$j{m|_$PuBHNmpXRONg@w<676$Lm+#2rwO=KAP|eS6XmuQb zeo9f9QUFEM3!47oZTl`-pC9KHh6h_dyvf0;eGYB?Q6D&X@&Nyp_ClHzLz7Qb)RLHx z29&bZy&R)(bp>o2vrN#gd6I*&evaWP6ho%m88-Fy0)}mjMU+L_h%Y-_TIETF9=I+3 zZyIazWbU>cyQT-f5p#>y&GIpK)ZE@$*fpCgWKBDq#K{n{lUVATAxKuxZRNeUHUaA@ z3D>6DLRAv%jP3~<>6#BSinF@7HC*>py%p7LdogYP{imvfmm0*L`8Tkvm!>Q})}C!S4YS%#erUfM<2rhD9Ov`P;zbg*YhL=6 z{go;2XWXJM#qyjiUyH4GPD(sKZrells7qmpvz*Z?In6;P;R#iQW^>I}{B4_yVf|xO z_R;FodCpdC>+NdO0To)GrB0|ict1#UIzpuJ5iTX|Tl;IXWXqlTlb=7v@OcnlLhyoy zp|d$Fp|C==DC3@fwHuG+mT6_&`gE@nwk>7DiZ;d6#IKH^c~h(q0zl#N-9FrL`;>`6 zSe!@iFmi^+tPfS1&Kn2D@DXvXIoKf4N#(6i`VYn=hW|8O$~V9VD53#o1YnltiDTM$!!q69qJnPzSNT%#IE@ok_EIUJw0sE>MYv*u64Q z)O@Q!XI3?D&g;CB>n20fP?tx`9+E;GHk@JhMDuaDkmAnOp?9Hs6{L{2*hcyE4}22Y zyW-ca_nN7R7AiQu22f&b9+UV4mb^E-sA=irBTbn5eP1hm`jtSN+O)i}w~Xd;d&+#_ zqItANW@GWqtaLap7U)P%ZyxMV;nTYbe@ ziLUKrzRxeG`^g_l&}^DmNh*$=SRnN+2mWDt;nr&u)RU2MSg{(nmo_68d%exYlciHKF(L(;Y}m5#!^AuDNaV{ zQU@0fjs(L1DFGKV0G=OQpv*fXZA zY3y)-g_-X4gal=BTZ-uH%EoZ{<>u)XMYix`jA?sVyK-W(q4od~Cv_|;#?kxK&*OH7 zzEM%SS>6mQawzDJdg5-eY*A#Gp?cZaR($N~XU(IV6E{G`$X zj-gwxufToGyEIHfbo<3+xQTZ&sgooRmmV1Y(T}N^JnJEyKZ8ew$CAwan(AYdAQADU zu@3i7Hny4X>+1W8zq+6mWQ85^Ualo_byVrf=Oc10IUY5oy>N)>=z$&9ii4KAaNCkt z{ocEdGFIR8;WO*Jf?-(vX;)-XBs^KnULY|%znFObIJ;9+UwfD1`u+gHNs7m?92!6c zdiuS-HGm>=q`&=rp7s3`-soIIZa=#y`y9dR;_t0zgRf-NB|A~~mgVgJ~P9vdq;)`K6$&Z8C;MaZS9w4pL8pd6rRPG=nxCo!QD{s`FJvv!n$+%G>?rH zMf&HyOk$Y#odZO{ z7eBpwBL3;zZ2`;0Bd)y>jjg3Um+po4O32SDdl2d!!Y11WS0{e{Ogo}aLG~fRWk-_A zt&b+GnKoSTq=pVkghl_F@b)!uc20K<+5_OScH@1TJI8F|0$b43x7pXU z4iJT2J!Qxl#h;SX66s(4^NP%MHw;C)Exy>!DOIGUDvud;B8SD9Ly_#C& zf>!5dju4TZh2&$pqwH1+y&>?h^vb!VBd!Ny&yf+uoUQlqWe$>jPGi+Z? z`|Pt%+}H54ADWt46&}})4~wxOitqnzdXLkqpdsX_qyD8!^KG)EfoHhy1_?r+ukWRz zri&(Ri-$~D9A3Y7OYL2jfoOF6&-Z)$YG_xc1V77o*1>beb$8Tl?33l?2C^t#Ln#!? z7jl}a{881b$Su=ksg8l?8@>Tly9e9ACOW7?9?`HW)`WiqT5%Z_x+TTGZS^JNk^S!+ z!X2H>x(1S;KR`sD^rTCGhMeu4*_8be2xL<1MOnq#&Ux7RecIFU-4-hIs1*h=rQO7V zD7A%m62#ZRWy$85Mv6m*ANh68*&~okk zCr^JU&#Wgq&LFD)<+QOGwTXHZEqz$OVgYwn2r_y%J~aR(E#t}ATc)%`=;LqUQ0DRC z0n<}F6I@UZQ|vKZ((mM~AI+OtuR>K*PWtWWTL{GCPLO-QhO@5-a8L>7+A|Z$W009tZ`_j^4<9Z(C5HsSW)rc)mwpi%5fgPf;@X4 zD|Hd&;SMqgGdS^tUAU=7I2My_|h zQyVG}$P&`-T@6`Bs6Nz7JTnp6_dnhv0;u{b9n6@r08Wy_3rNvfu94uHcGX2Y>#ZQe9e_)?U(--|h+& zSk;+Y%j&Ar)1vJZh@usy)q{fai^`Rd0Jh>^4rtj7yimRj|FZ%5uB~Mqet@J4fY^$4 zP*35sSb)%=lHeO5U`+l#oJpueF&_eLkZ7^rvNFBoM{o z-;Sam{uq*q*o*r|n7EyAl@^q{^naa%7wMIVT%WDEdomJ^r2BAyjU$BUBhN&+SE8lpH`iwZr~fPSWRr0NNB)E>h5i7>9 zq~OhG8^Wj#zt;`q-==SdAL=dw<42?D$>~fS4v%&{`-ExMep+t=j~=ufa<@YK21xX~ zJ3AJSqVJO1rtvbn%6g}lv;xD+ojMLDO+`Q(Rv-&eq@J21Vb1K;1?Q*VI9WL<`rsW@-#ApI>=ogMjknlxQz zknDacMZa8zsv7g!)L~~J+veJdqGsA`Hod&!ap_xIg&`-UiS!Ns$Xo*0k-DNlC( zSaCQ+_d1d~M;=K5H}?&lhsZoyD2GIIhv`_rO;aT(f`m?X(qzlVdWvA6j!J5BlhO{ zf6`sDV`7zsry=W(z|y5avfHt$b(2f8m4N&eQLsCD-RRc*Z>dw9Q`ei%uY0#{RvtX4 zb3V*C+kc%lP+Tmmj*&+GWB^?;Pn)uYPy4Hna8rKa#wng0(arPH5j2tU8xIiSdmf`m zL$a&@0)Yc%VxGv57vZa;w0^lY{Yxi6oP8b{R`4gg3=3v&pSPk!}GH9I=1Z~5TZ0U_+^G0wD9e@7G%wP-vrY0(Pwn% z6tSz*KyS`vK6&X3i%5~N85!R_Hy`w$NE*cJczQLS_ePG@SKWcCZN4J}JVP%#mERN% zw@wli#lPxwm{f(1sJ27NlwO!eQRj8S{^}47J3}-?1l`)19gh9u@BJUt?jg}NRY+Zd zBzYWM@`xXO`;S0~Q!?suo!;%ZG%ShZGd8!-{dBBVf%3XYAH=~CYHELhtPUH!ja0FmN~U^pl;1JM|pHmk1A)kQev*#a1mEyP}eX@tC@ z^Rkm*uvxY6T>N2i?F!O;^@DR{X`OFI<#<%ItUuxhzlrhIs)z9M7`pn0Ggh63PdOga z$}w=MjU4Q){&ea2Mr#lGjdJ!{=duA}#vgzl0BjKGs6b$46&Rx;8j-%R{Gfs!*k2py z>fa-XB~g2Lb|fD~m>_RTskFMV29#fE`hC+%*SJpS+o z#2ZN331FDLTB=3mw2UOYA5}i*+R^Bs4)w zv%>Nm25R!%osv$P0J6RgqA+6C!DAWP=1ZRf4zXr+=tlm=2C`-x#gIk%P8)c0$B&c! zZE=4&pD*=%HOdc*i%)peug6AJ3b>Vz1-_cHK2c(gh@OqVZDiYt2qv&}`!dD}Y24#xkEWwhc@?r=B1hNb4XAnU2^ek2=cUhIrO7fi zM8CG3-Lu%=94f0`m>3%y;~fO+0qpo?*B!aNSf1EE@T$zSv{bjYPt2Qas0*$(APIV# zX;-UF`uzEX*6nQq36;Y2bocj1BG-M~7Qo0M(D_2gy}j%S^t1~dfzMbFkgwLGs64H6 zdB6zmmzRL6b)D=ytZsWQj_At7ErMs+2>*56%{qgZD7zKub#-R*QUvK9yMtFs1c-RN zG{fHs560VZ`Pi+op%t%oeXaZ0a>&-YuqG;+i(P~;HApaesD}tH&#>nzx;b)+_*LZ^ z>5~5hB7+AYjq$&P7Q%XTkzY~#Igy>xgL}`JrzWlT5P!Vdk+9~stjtzc9hinw7&JXS zu~MUZI^2GDxl*{1qr~LbZlJ2pJ^YxER(uYk=n9f|$J;ve#_@%cOdG0?G!YuZ8w@XB zo}4HvY-el1hJlWGtU?cYL2&O5b@2AbzTlpLVuD3wUY=Tnv-sUYVorHVDi^lj$|F^`k-M4le>Kiew%-cSR)n}ylju@1 zi!O?!R&0foDl0!1blm97uBOFx)~3OAup`9vkiy^xW>^T;Vu>N<3p9bAr7rjO6jG~f4;oK61PSR$k+92 zrDsJ`s=G2m?ct$sDFpEy-?Qw_B&Wz_KB{-6xQ}}uHn&6E0jmSp2dSSg2Iz-_+YsaA zZs4i}7=Ng6KzQ%on$zIAZlmW#Wg)2VQzwhqztyUOu_>yGtcV{w`=%Ln_mP!JUY?nC)tmEGc(I%h3G{dHz-gWbQYoI4-sD zvc^I_Svfg5`3*nubYXQ=6(a9BNKlLciQvh)mMb!*T`g8gO)2jeJGqNQxlud#^-Hhd zy5xVQ`hV&?*5+iuREb>7qXjZ_6h888`jcIBuPmS*rOjD60l-uSm(* zKy=TU%K$0fZHME?abK7W<`7ODt#v$g@JCY%eg*YXvODOnKItr5QH%Yk7I|1R&~zCD zl+O>1#iLteAPZ71`NZy>V)5@E$VjDpY@v`}@BWf8%Kt+EQCl&RoUhvk$`h+edGM3n zL?^ty)>efhg{*&TPOv1vu|vwMvbGe}()8Q%m!gt)+!Kr7epDMhepT=p6yF66t z9L(8GU^TNQ+z!DU)M2%;550oK)otRe%UIAjjDgE}^%#@HLya6lFdw4@ON`#iYcxXg{E*#bqh^UxlR(4Uc|~mdR4l(kYVDN#5Stj&APB`M&kM zZT@BOJ6b`H3q{a$rq;XXv~wne44>TLJ*|TTsfQPDd2MYXLfmPma3GU!|B|UEQ1NHZ zG*N=OhZAgi_p+2pYP`oXW>9j(z*7W%11Gk5phgbfGBqRD@=u&DWg zV5LP1-&&ODgxCeajL9%u?SC#WNJfUHYEr)LIac!VTDV)xv~Bk&aK#Vhsq3lm5b~_K zdVa06*s-XD>D0ScTSW|3SAD*(0k7f#E$J@+708-CbzY&%&uqlbV-2~jL=8;6z> zW~AqWj@_#;>qiqyZB}Tt-+F)um$wwv1&;LCno;Yb_uF@GPma_Qp+fd_;}ANo zW{JYGoYgPIND8AYyP3TpdS&x2ZQOcM`~5ou%2}Gi#tu#VRdm}*W3Do~Igd&u9Jnk! z;ejXZveJvi2`2?{k(3iWgLpceE%&~LfcbEP(WO#l==IZO7d*(34d*5s{#oZX&`7*w zogDd&kFX$$XX`Jy;Yr1o)_TL0%mP!5xn+6M>57bdaqUZrG!fyw9p20Ucl04WoZfWm#Pkn6NRdO3a}o%nNA*v+px-?>kwfA=*)X^g+dwo8Q{s9gpC3-*Zrzyq z9Fv56;%YgWg#$?eQWO{BOsvybM)VE-@8-$L+v0oS9HN+D_(|}^L}g*`7Aac&!uarX zUTZM%Xs8s80fonPpwoh_(YFHB$H8JyFPV>eTC@T4#l{vUWH9wQW8vb~Z`H>3{D3oy zZVdJ-gs{YXXoh^L97qx^s;w0OyPM^9W@eu~3gG1x$+BgnOYCRQ>1E0pWr`i8Z(b-_ z|4Af}Oka6l_fMn4-$jQUKRH5I%qLQce?YHuTBxj@2TDi&>mwyNnC~)NjTXUHqK2jx zRaN$h85&}6rV4*{>9Hlwvu9#&l*!spgMfLup7=PR z-MmX7MHuV~w+Zj>#EoU7LaRejVU8Wm>nE#oSWa@$$ztgqI-~_fxu3H;AmKZ>(bnCL zOGp}%jjCmfw5y%lo^JRAdLfiOBqVgVnVjxf@%e*SQh9~et(Cy#O=;(FAnUZNAPA|{ zUZhkhiO4y+S{lnlICJe?w8WR!nRGdVR@3J@mJyE(fC^{FpOkN7IobC&d^{_znC=1M z(e%mNsXVQMr#)+*SRzewGR435W^;1}4E!P2+?TP4<)E%UHTjgS%}{A~xleBAPrp}em_&@Oh*&@+5B&!KHLek(m@w~zZ<-}s;yW_*HANp_SYwtPbhq1lSYMcwO-yw%mzr|)@SBmKsO<-l zM5yIH!o$u@SS|LU{xhNtITT2Tk3JN#N({)+fd)o1pJ;vhd;fL6C1-I}WaN)?jn1{w zo$O+wMrS9Uy$f;1!m@6rB1;1iG0`WxoiUj94;X#V5PJ!!AZORr-Jg>=dt}SAH1s_; zoh{|p?(_9d<<2bR{KiUX8xb6bcm-GPAIFM=8>w*)l{YIU^rjy_6L>DQwO2<(~q(E@Ao^SkZ;>^blI5Mhz0wsH~{MKjr z)QQc_Tv+q1h~^{$<|yz`ir5CyLIa2}D}aNvSNCv0udB7b``3Xn<7G2+#hFR=x&N-q zc1B}fnc4#*?gZSdg%8JLe!*xBa-Eu*?|~a?wC|nfZTL3|eqF`sXnRx8%PH554mRnS zjpYS@sdu`3YT?1aXiYMrI9Ck*{gS|mUM0!;ce}sbAjbU6vbumbCg%1tbAR4uf z{c=}-0+7RZ*P{#-Pac2Lk?(#k;-Ouh*}gsJ)CfwsbkZQTbh6Umrj^i)OIBizD6Q!^ z5pPXP@!XcyX*LRg)f~PQAn&M*7laV9Oe{xZw9UW50i6{Hg~QpxQ@@BJse39t;T z&GR^{-nbA3HO@xd3|(^K46^06Zm7bQL-=?n5(L8<8*S=!`ETCN9F7uWI4*XQ84r%B zJ{2&!wK6ekWb!gxDzOO8`9gSrOKn- zBcCLlxz@+bUS*T5D|E*$cd-AKg;KxYB>VfL7@_g#KaE%HGPl@fOvAtIPn-4|%kG@K zZfTLzRf3svn^e#)onJfs31n1$0scI~JiiXhIOpr`yv(Ck$m;7)dwK&#LcurX6ch?- zpUa9Mnd9nWKKkQF@L1hf6sMarCEj{A=L0qwawxTrYo(wZ^IY1|4}F$RY#oX zU8vu@KtEoCt_=zcSE>QY)v5g;Q^fntAz6;Rswy>md)f9K28AR=(Aa-frT4i} zd-uU9o(o0D8gQ+_lM63M_wY5+T5kog_=~IE+u?Ybq1dbbm+HDx#b4*9-%j3a29NLGdLoy(iPUD1PJAzN`i@skf%=CR_gYk6BZ0` zIa#Z1vs+LnCe^Il6ZN;tPO+WBI2K_)2a5L?VGh^mKWR5Zw9yck_Tr$F4#=bq?&q_~ zlwmUmRTP`{SD+J*Fy!qs@ClYOsh(XszFa+4?cQ=om|(ls1g)z)ufH-4CCg-;j1efj zkF>DdSv_{)2q?vCK1<+pvWXnr;9hG=*3pT7fLI}zX_}9og?z$qK=ryIi;o+-5g*#- zQbfxb&IPk11t}^0YO$ygDVEXB8wfMT{Yjz(q>qq$k~cdtvpc$>;DQJ=tVJ?O0JU`3 zSgA}>$th7zH&$6RR$0Ej$o6=u>|#v}-V>f8>iIEJWyi61$3YvZ;^}NFPDW;-Mq$?M z8nWLRdiDclANcIvT%C#Pd7cUysII018<`oH%9Ppu-RAlr)iNu|N1Ii(SxCBqGW{dk zbdEQ{VVr6G?;exe)U0F+nTymWS&i|3l$5yBH@-`X)3Pg}{q$f?cZU71?_Q^Rx)8KEA-f%u)yL}Y^ekzjhy z$$F~hElAZsvk{AWsg6>%ViT}sg9^|Z{T*_dSm-{^p_DYS#-}q zX`NZCfjlvVK7BE+$1$F*O2T5dr#RwoU^tZPzBmt2OadI)($iBu?Diz*`QR79WY8@R zI)nwU&hYPLg))u4=xc^3X|R-yG2*?2lapHW#pPh7&0P_gxv=RuEm=LjR8d#Y0m~ri zyHeec9{GvO!kI!kGqUHa^YWyD-t#u$Au1LY7O-TtBi1_;+94dsgeK-1(T&uX9mH5> zRTZE0F7oH(PNTcK{eBjVH%C5Y3{+v5;`JePmwW2!;UrK?>}9xa-+*2Ug^NpRBl2-Vytg{$ymKfu;@)hSbk*@ z+m7R|)6ZuRv6qDf5N6_gl<;&fL04pb>hHj~szM`sj`;7tqy&E5?*ZE?o`&XJ)Y%$t$!8uaW7sdeFt@8^?lZY zc`i$vUK*n)TGK~q5MKzy5$^+9KvRO(DG?AQLYq7!%O^M4%}D%pJ=WGNotU(P?>Svx zU*B3P9=Q_k_NXefxi ziVaTZ)~Y|>{pck}`x>mtPdLJ@@H)#+Y(3=f&i0PuAjVhaYrMIaIivAsNnkJJkt*m& z_z4OkYDS=@qYt!K%!TrAmB;_p2qNLk+e7Zm*Yzsx;ksl%zmUVQD98RWXvRn0cyqk6 zQtrAubxGgVH>A5W35@n>c{g%lPsOs5W5d!E3(jF-Y0<;)^u>X7!%a03G!)pvpT8Kx zNsFw2%_WVxOizqHOZ*-8rTY2$zI=t!qk82Hk7;6=89GO)Y=`R;d`HQbCe0a0oODjd zfVaom^rcR~evg3tDDLg|1aw+@@fPDc$;NumGK5kMUJ1nZI`%_qo_m|unGFu~ZI-3p zsyukmWgN%Pv`~F3c)K1TS_sNqCLGy2+uIHsI`Hl_yLhM9(w`ozfT4Sy(`LLiKXzb0 zLCr)`#|?ytxdZ~ov2v!#B??i!PvmhB`oNE)IGV7v?VAQ`w$ZyVFu!72Zr(dlbakGm7#= z5(rPC)J2MKQMasbQ5Dth)dz1ph@w(4uA`p0p}RJa96*cN%12fUagb!@k*jdNjaj$|o(`{&pb&ScpZA;ozP{YD zvf-2KjFTtJ=w2felcPnU6GX`rxIlEo1iVialb)2N7t=; zTglqhSggO?NGM=i~;PPK_y?)@g?6be8!kYABc6TflM$FJ0Gy^x<2EMGO$_k*PA> zfBr8)^N|eK>gi-|e({?DmV~qqeXGrnetZHPeV!z7^7PyBQI=u80vhj*=Cw~}h&_X9 z%#ZDiYN>XFDgAEk>m+{)O21v0YL?xsNVoYfl~fHxKL(=-H~^vE4A+lbR(^y28MMZ- zzf?Mle#AhOPBFo9;sC{5@lMXzS!<6))6i@m5w^7F$O2t|=KQuj_R8FQ2-OkIdwMKRm2h`8=5Pa#5!hbmob<n$tJ9 zakIN+R||%is%DgW#qYT-j!frr_BiCe>4ODS#33?N)HeE#8W>GZQRCK1uWqm3#7Zy0 z66vZ(sjJ)B!$zrr<&Aq3`BT8>?(*a}$jgHUBp0N32S&rE9ZlE!J8-4ci_wIhY3TSf$#5;|!~~kzn`!K1aBI$0 zf0l4|??i9U)vz0RA*USYOQ-1r9lB;dsnjryh=#c09NvjGE5y-tpy-E`A-yR z?A-pUY(piGVa(;y?@IM`_jBEGasAlDPZx$m!}0M-QKOdYJ+N+VqDo$8XOg&vS;OxD zRBU2vJUlCH5ZRzBH#U_l5qiRSF=1(0SKOsnl+Z~uz3b#?J)3^k?~y=Rn_I@s5dHU1 z0B+{|-s2^V9aQWUAAvkV%mr|ymdExHef#@!xb@2{n9fi&m$6UkMK7Dr?ZRh|6nToJu2GLpJ?kPxSv}8E@n}Q23}?M8Qbil*@FDo2*jqSc4cXHI z1$|>QKoxmPZNr*zUyAXnReQRtYutO3%|@dA>B7OnLI&&*1gy^jX8uuDHW<`=$L8i} zs)df_*T5hjbj~@7&w6{`2i5b%DgBA+Dw*S86?@4f-e+9q z`<9^l{EeUY>rall)`$;DIH)U+oX`q1YMj&4J4ULKPaExt>G zZe@`rs9~-bVu_h?DO}m{l8v-8{OLE&>yMxQ`R%{(}l=RQjxEwlH5yX6W5Xi(jxZD8L&Ow zoRsXkXX9r6KvUgAT1}=y7kc>r{jujT+n8XRsdfv{e#RBnKQl2RmJ8a>)VqZvoRv9w zJGnVX%B5$X^B1V^Y4PqKm26Yul$}h%pG)th3S{3|&tygSr<^585g-M#=={iaL)^A` zk;MvHgW)AoQ4xZB*h%!OAwg1bn`ka?gofl_vS5(bf)<5&3-9@0QV?$smmd-o)DpH( zl9B_#W^v8P@$}RJ)zjnordy{8w_i$3jR!X+ zYXG)}r_C*H0fE;m0dvQ4cXzw<8*p;I<^J?d3p^yV=CkmR%Y-vugX2AB+THxQd7e+Il_VuQ?KkZ@QZA;ByU!wCn4pOUIXpAIgk`{Jc)2sXDjhnnip|Ns)9*t+#H0k|S;sZq$#w zy@t!meyt?oVj$;h69b-oWFJEl*>?x;t^R0ADD&(}A>~`PV7d6;)A$RD&(X}hq=Ifr z2^-C~3wO`HUXD^7-b|N!w9mW!j3qMQ`;7P^9N*tBcXQExesN57M^Fu$YdJe}8Yl)k z3Qzc)_On%9&B;ls{JXe2mCQ3(VRtzp**UVK`2526VF4DNdf&zM*kjMvqG4KCiE-8Z zOKt_qHR6PvGt<5b=z@w_K?|p35IP9>xj;IX+F#nMW>s{Ur~?$Qe>x=1ueF8YQGNDk zH0-d2AG+2WxEzE36D|4^Xr3KYLNf|g9}1W=Pp!}5q+$KjEWLNOFBZPqC{USaVUlb! z__Nb1=k&qUFv+5-MVXGtpV6x~R+iWTwUiNa2wXSr1G$a?q4UT$Himx_A*G2F_r|GP z#dO-wD=2yQ?sE>SeHJa@V*?YH=jZ!~j{UopJMbiK7=%5JNM^OP0^equS=w|>HeaIS z;DkKdICK_{yI}IP%^|6*sxq*(W!$PMDw5M+ol9bUhV4LrkH6-xRMh%SdE;XyG~1)t z!;&Jx_GbCGvsiSx-rB~-x<_y!rK97a`#D%DSybG%d`}$o8*ZXX#4Wtz9^HPE7Fd7;e$xoXP zSH0f`>Guf)%Y{5Dn0Z;FI-Zxzh&h#OAr^KQTOBd0D!7|_iW&TPvz>C2#5kSPM+OzkOzBvjh zyVsYu^>Bk%Bxhl`(LUOJ>jAUAc}>ibfW&;D{jj_TKzYqslGMufgo?;hK80|8U$DdLd&_ZobTo+R=v& z!;ibjU42tm(!mr_IT9qg*LynD^64bo4`m-22`@II6kgfwI=6ihE#XjL$xta%2KfKc z0Mi?y>_!Y=MsBB}zm|#Lsp?5^N2%Z?>ahaS0Pcui)z4cf*BmV}H$OX>>aL$4p8n*f z>2@EBHUbj>)&uEfd8gW?;4j~ENdUBT-@^-l8g{;wo;gpsjO~K43&R>L|Lrloe8$IO zF-p`MBZxrhr%sJ14KrUBFa7Ba0A{PD>tbz|+v<3%g^F zHG+C4VqzzN>=_O*@+@)Kd-*#kOO539bRI+VSJo@17W5r*`-=%mIQ0F*VHzmifM*zp@^8^;(Ew!(?!qhJ2}d_Gl5h@~k0yPl6nXMcGFuZ7WXd zD|(-9R4do-1&zt6hAKTj%Qjp}cIys@KQ#PX|9c!w#NGDo{Szy9e^|fpGKeOWoT7E; z;7#9P|5C?=y{~wB&5A_&6WBt-_X0ilZ^KAVNQut^ZaoE2dRu@x@U_f;(7d>f(hlZ$BZ%Ey#zpXe0~5z^`|m7 zD1DnP@IydEG`=PaWiT$<7Ce%WL+{f{a;`Oh!$|u28b7Gh_Om%wDvnb|uOil>a)*z#q5iKEN%eoVe9a|IN-VM1YNHeCHeU;z|?YCij-%T$Rf*{?+&m zkL-IOBg12Sq-UZ`R$Hq?z|i!#pBB`n<##<9+=`#P?bPzF%`Z51XnY>$BcTCLygpC- zD;{BN2qwBusRk=>AVc_P4AbMPLY*c+v5b_Xtd7^Bye>G#c}PQ~>vKBq|rT`l>o=>dD1=)qH5{A>o6o=>1T=mu`NfT zaHT-9!rGQ`{!oyGb{@>{k`A0#q>U`C;IZ_=fzn_(nVY>zzE+xLp4tC7*>kyQsp^4O*#%KsJfJ!p?PkAOcVEtk; z4nRGcfAv6&5Ov*Rrc5(=hRk=YEU<8rf%)MsQm(^mzJUc#0s-7fQsw(&ie1lC`J8rQ zy?>9ZZ4fQn+ZJSs^-mj=1XFT#u^L9{(A-54GmQ&*h#-;w!Ow2Bf&} zY$N6KdYuGmA}~{4djxH5?S(axeoD4^nzw!0@|bWZTTdyxOAqeB5t zQp%Imaub@FnMFzR?^6jk)NBJ&!xXNJO2V zWae~=Vh$*;1DDK@QDH@SBf6hy#T3mPCs=3jNr(AF34w`*TH~_vt|p27efSUp5lZ{+ zUE1)kCcIm|<1;=aqVYl4Z1R!7yh!77onYXvjH>sB9=@LHNZceY%o}*^$GE7ZM+RfK zAKCmd9SVF={c84OQ7F|zrJ!YwZ~O8s1lUHsYaQ96!Qgw}-f!2&_$M$Ynb~}Bai{Tf zE=K4NF$n+LOTOk8bcSq%h7q2M^6e;M`J}@#mQVV2do~-Q`W?ASeBV==P#vIqc`m#x z+!l0>nGxrB2+<#IxF&iL_M4PXm93M!WMq4n;#=Tlf>WUyG|Ta}%Il$jAhgInu;+O@ zLWOa6UFQ?Y5x^*#3_GMGzwP=xlt+pvF zX+CbIa1!d9oxQl})yr}$A;k>%Yf-_#x6m`Gl{`3Wm&w(kC@Avc&tY+*rqstt(~x-e#iI^SRA& zzV07rx2jy4RAO!*MjWj4>9x;hOpXH!`e<6DA^%cRmqh!k zHp4GX2K`z2-#!_MX$2)$a&OJxK*l2={vwv~tP#01uXg1wJ7I_zKkEISKkWAiqcR{v zKXqH>Ada96!??TZS~%PqAB=L!^-O(%nOjsOWo^BO(M2ci%AK8rO(hsuUv0xcZd9gW zdppDHez+E^NW8S}%xRPs82G!x)@dthWiWh@Avjn(OML%3cbuCuS%huwQ15hXhhgh> z&*Q7BYh}{r#!5f%!ldl+N-_x8c=pQa>cdM}x_k}YfAjK^(M10D=lp)=GULPFPuDC# zsO)D|OSq8%4I=5Uiu((fqgruE3P#<^s$O6YnU4*bi(&_CSWwju4Q7Sm;w}bYggp(N zE}J=srGhP2r+T7=2v#n-i>uRet~pQ1&q;`?hAvvgJxFp^!1ZM*gLQ0Hq+4I?0Tnwo)iSJ{NUd|NkgZ zu6DFxjoYB^-)oSH#-%38^7B2xT%7%SOF;GYhzX2Yn$&vMKCC}KIXyM9HhEZ3Q1Ga0 zdXG=|>p$|(11bHZJu<`+^O6-*=#@-l@i+etTufo+72}&CqW+gT=hPiR_EeKr2zk;2 z+<ivMn z+(fJczD5rs7>k=V+hhJYRg9_j+TCjJ8WFc2ueGMIvliLtn|shM@fWmzf5*Y_Wozua za1pC0di`-gD~wqR+e(>c`o{AWxh}~w0cwO`Rb^EL!h_!}JBlFG{5 zl%h3ZW;~?#!M_teS+dew(gfZO%B=uE7@@IS303@3WJ(#2FEd*0Ece5fEm}JPi*>)HY%DHY%1Hlk~w1WRBx?t%>G6 zV9sAuRiS2P{+)1_=lP^AkgETUkft{u_!+LEq(Bh*wGBY%ZwbHW$M`Ycb~sMWayG9P z)%9*k!7D~Zoch*lR+8iy_$DTYho|Ga#$&RZ{&|wfy}Vhm`5HoYgwQZ*NkpN}80kFV z!|yJVQ4fBQ!>;df#W2OEj@3w>J8q$Ud0{j*KH0u=YUpV4P_5vhd;o!b4lU9{H@{e~ z9=%aF44Fa+cF$$#mc*K`0np7OLEeW%njUP+w9%-N8C{UOaQN5T8hJhtqWn7dWk3v* zOrAsVq=Nt#^psAuB49kEI2Y~J3$)}Lm!{OH2yCYfP(F^9#kM8z2&6tZQ85PkkmP&* z)lc8px7!O620VP`WSD{i!>_4^U9JglGDsD6@LKZod!=*dGRN97#|+c6aoA8;aO>66 zyy&hS1DU6FrxNi5-plW<%cL&xakhIxmEFC&8APk@pCQPQvKE7NnOZ?h>1$h;hsqw^B5Hi<7bp8kUB&wP?nfhJdWc@%kB{~y4&);W3S&5 zat>U|Nb3ve$1iym2XHBjhV!^Kn0AF+TYj+=Acy1 zwM-n|fo|N+NXGc;G)e={&}jmY#QHxt?w`Nx z0V^yNW+V*q?b@HK^Lx+l-I|^*T*P=s0-<3hNBtKpCP%3li`3J>( z-cp+)+ST*5o2yG~`2HuIPpzw~Xrbf+3Fnp|#rWv*A5^clup?BYHCB@9+$Rp$Kj}C( zSiEJFE_DOClXu6;J0JPPm6#578OPEdy6dThg|C4i6OzEVva3R$h*(Dl2L{t;PBN>6 zynO-N`R;?SZ|6|`*OsC;EW6t?e>S8!|DbWk%J#+!=wQsCs+s+oYo1Te9pT)RvorWx z?+!BAd*bJ(_I(NIcj+?MXfL#P{O|I-*+Ad+NzP!B9I1Y>L!N_f(!~}%Iyy#hm8{WA z5UYBq{A<4F&VA27b;Rl4cQ-XN59or)Ij6h`3OCGq_LV5{vqDN*a|zYV_O>{OU#^*p z3!cgox9fi@?o*A4XaCcIBx@rFXXd4X3C@33kBaW=aTo9pDTb95n=<~nK{o!>ytQO@ z8y(Cx1z@Uv=3#|iZx5)iD-{q`Vm9`^A_0X!Ev6H}c4io&ENv^~Y{@TPIInrp@yayy zjbggLTvofO>H``>&#%9>%}6-kNJ{n=riVojaIk%3a&v2sHL&R!(``lf zL97J;`q&DdMB&>RvWv8+z+6;S!&0}wUgDMKsX|a8tm@ei+1L`X0=7A=q2PJsfcyw2 zV3(0}F;Xpwt+0$agYd+_P2$cocA%0iRw0pY+D|0ON$S09Tkyi>AJ49n8b;hSooE$| z(>(qDf_#A0_%!wFg^1|gvMdiDZ+FA*T^DdH&H+d~qrRt$?_u{Y>33wua@b2j5Dx_R zNB&>ZOP*<}dj4k1(m1cPmj1`>)Ui&?FjB_#B3$mDN`3Mgi z17Fb$A&?!O!H?7y^BBWxChQ2V6MgTpy;^iHbwD#k^!@mVP$6;St~V-^K5^l?LqabD zosCI4sm~t^qBfLK_b@n}W?Pjd!d>n|BKSJWiu9Rx6HeI`e-8BXixn!*u-0?~a$yHd zu!WMVsL&P^fvT#jpJ1bb$gBT~ba-kC^W%rR>72=(4)EHq$k5R(hv)rztRzV4NMhi* zlHH)pfuv>NygncjN4XQ~lJrAu?CMlh&UyDftFx!~bNH_thaD6Y;YG#J zxcS??s@Z_ocNKx(-ir7q;^cnZK$<+e%!fPHiA=rPfAIucyhy3lcqnt)*gNh`j$PPb zzz%$$fkItN8OQI(^%OR|H@Fqq)BXaAAH#y)5Tz*lG0CZ+P0||ADqmCVi6Yh6Vz}G0 z%HhexH8R!ginjR-LOG#897w(f$sP)etNW~?>@Yl(H-LOdi=i}gxE+M9oS~M?A(~vp z9G-I(YbYHg8QX!AUH25FnOnj^>xB~FX3AIMSgT&Bi2OtpF&LN_7*6NC1e$N(Hn|iRK`HMh z&m~OU+`!02FxUzkV1a%u5<|B8UXJ@TPu`G&nH=8w$O7##GFQmfL!uU}XlXL&kR-Z& zImPy0GqF}x)EFg5K*h48NG3=5xs9dJ`}X(;{1EqwhWeO^681V#TDZv0&myM}w#2{` zz-KwTL{>(vs|vS1N9}#9RwY6-lM%m>d(`$)fZ#0_Mx%x*3HEA&3ohL&RMddKO^$91 zUFASf8U`Q$_leW#5&nGF*e6{h#IBj_mO(6QQrWszF~k>7GVR_^E>+M~55gboGyQ#P z@JCvGPLYY;a}T`#XA@IjYRVl-uGCtB7#X5igjW+1H}Sbibx?h8nBnRNT+PnZ zZQ?IUFFQN-?xF9m0FR}!!^sfZ5HZ%nB|xAC|55Zykjo1Gz)O!jS4m zGEYI{Z|v!*8-QrRM`DiL+Wq_5{|@z6b*-eLD)G;f((aK1sQ09K)#It#i@1c+)2(I6 zuM`wUFAf(i!o#=pcVSBZofoxIl5Bp2miK)C9`^BPEYJoo&~~oXJYo$A_tOx=<)>85 z>4T$_I#1OJ&%>ua!Ux%H;c$8irRyVka9(U6@Z}aCPm;@q+1z8OsKNDm7^S1P@57#n zZEHuT6SRgoopGHzKP_5TS`09b=l%jRdpuC?xYDme{E;SHTtW??C+!ONCRkn`X!<`b z07(7F+H zk@&Ya1o3+0yD&os2U=n*bfBBQR^GG@YD0RGpG7t(a*o1O(=eE_4ct*Mdb^MXKqWb~ zWq4t6R3F=n5-vn~2LO_0T%|KE%tRPr1o*tCJu5AFqExu1;Ou=NB6=etK|?JRO2nj+ zUmg0|q&$_`4M`QQXQ-FVAdZ`qVGoDjvN~NHk^J~$J>TH@G;aq?V_8O0j=*DXvmH|p z4i290{@px>U)H|q={DhxmhcW$Df3G|JYCzE*z$;zL&j(+O*)Xl{wA?W`0`v+%s#FH z7wc8)_^G}J3^?;CYtLCf}@ zT+<*+0yKhG464K9U!aBa0bgrr?A>I>j~}gHE?@D6e*Y9KyX+->+Tc#IIqbN@DbZ5AqVu?PR4AXmPwW7^erJja+N`xBunj&N0jI&W47D(V3Z$ zfJMAl#95=3Pad>mt`?JG`&}=4pZjdveNy-w+!cb(#=(|ZRfTP8F+|*$1M&9uo<(&) zajai)C}n5oSm|4pJ-E7gvuR~x({o6~G}i1#$Ms7xfgH)ibPbNoqV9CFHsb2ebH~e} zA=7m*Kd;lIaE}1<9xAdZJjM0~py=Vurr{FQq3jvBd$8i8qaaRVB>E{}K`5XQ01qRf zVKt#0-apxrWs*+_Lzo|^KJUCiR5YQ^e_ssX{C?D*K~Jl`BzyB?PRcdTpRqT9eKum3ZKQW z(4n?EP2Kz34hvol#Nq=*wbfvg*22AvueX%(FbgcG6O2FNrzO|67CJ!iq)`n|e6bf$0KiF{CYHZ|WZ)O;GhTV=Yv0{(tN@}2Nt*o|T~-A@ zSaSH%|8>EQVWDSe-6gGbGAVkfXkzcq_OP#$xEXrKmFEb_84V~R8!~T-+nd+|EZ127 zBkYca4@)UCr$b}}1YJD=wThbR#5qISf5JX+ToR#8|2djp+RjG(UZs-5huw@E@WFcf&4{1>?(qfqfivHcQ#)>dLqTcNmM- z`O^Yx!ibw=KgQC?Q7al3m(5cL;(>#pVX}?QLle+s;KIwxy99pmWlrC1NK!q}*Nk$K zZ!prc(#j`d-7pPjH^81;&2Q}4X>W{D;+$WmE@s!3al*fX8av#?DN&$Y^$S+WmA{nc zHhK9|WRYz!`0;6o!M(m8GCA!9LDc8A4?! zh`ZvT!ICKW=Wf}h>%Bt1$Mv`wc%+o*^TD2Eo>^Ic$_z5|ur~NuHwc(&8wnu>FNM_J za080^pcsxq_4fukWA>WGRMsw$xJwQ3f+7fa;IA;g>b1IJA)YtauKt%j9jOFeZ$PG+ zWtla)a7L{t1tw4<<`vw3Jwc*(x#YV;Vz2N=#%3dvCf{k5kg^R7o4S}j-Ghf9bIAUT zyWlT51%Mj+UK=|JNLBT52!qc};Gx&xx>%QBooo@s+8u z0f)lM6aoL;?Fg_FlCeoe@{*3D8z>h6Ntt?aJqa2ryW50iVNvJ=Wo!0Cgi-++T+n#W zqh>+;+RphQlQ0GM^bh~4xU`+i2`#ozT3T`Nq$*_MgM*vVt6AEomAd&=5=*YNL*Ze>Ek>~_oYvJ!(#u8SF*QO(M9lv1{gwB~W8v*)x zl5(1_sIfcn&p>Ic_RwS`RlV&K#M7u3+KA+2dy)DPZR0wTJHQcqRV?#|1Mnd=HB}3g zmm3>0@|&{s1fpK&D9`)*1^t)rS?~M><55srJ5@N1D{^aJ2@CQ@m%`zA;)Z&9Qq1Iv zUVaXSv_t74oFEY5;<#(%nPjGh|9HWYAb*l38Wd81x8yQgm0s46kCB#^_M&)Ke?d$P zq!sN$L%8?+B!2$V;RSr^UI;QqX*T``0cHCzhw12QD3Jj03 zr3DN3``S+Wn#V4~$B;>#8k}n>?Y?}cV=FYG;IgfFgCLh27n+QgT8IEVy zo+k*}-a~ox2Z5i)8c;H`vIuet#OKQmb@jV)!tg$4i13F3F>Lg^Z`e3)8qbi+6@JD{ zEdPs!yt{q;N_+5WBt3^-;Ew-3uK+YWva7s9_3$Mz zJ;SS)n)n1kD5wFFd9Gffa8sTiEnyf&c|0L3++lH06Os2n(jUFs4#BJ=JWL6q4;vp5hUyAB}y*h%xrPh0yZ(b zEQgxYVza!i=HpAQx_v=4VkfgqS__%j*M*vmF1y>E#56a&DF?z~cqgl4g+$u^w8h5* zI6+`m)<=8#>~^D85m_`8eLtRjYws7r{=HS9lbJU`!_QC*q)7m$sP)$EfVs#I*EuTu zVOh{Z3RkEeSLpl}*6vG|t{2~e!Xx_)MktM@Q^h;&VR`?<;KG6TRn^Gp2vJBL8J~-~ zLcrTMkDrNcu17gpR_owA!rQdf_iCcC7|!U~uCg$$)>?8D1~oSR1GFsF@E>JUIVDZh zAg!eRzT*x(H1QE#zGh9t0tgNZ=oaYU*MuX3O|~lt)Ih3Mtkl%Ib**7qFgk}YPG)=a zdC66jwa`pYEjmcS`56@sC z1naaQ=K!xGV=->jmoYja$4w<${F5uom5-Yp8McK~nDSNi--bNBeV(1FmVY{p11<2?dC)5W>y!Vr9-W!JS0Z!VR?iVfroxy{I8>(2>SWA&m0ZFzpY}Ku z8byS(>yVxR2yQio?bo91ms*PZJ;f2BBkPM7OD<6Pu=jk_j)m51IxCd?Zq&Aag?BAa z$lZosJ(K>>ffoHm(H24RyCOXWA5)<20r3qu=I)8%mH@Ae6=1kOaY|FVUUPoL3iuE6 z{GBXcTwqr=wY<}zgH-)BcBQypFIcQvzMvQ}d$HlFpUs?^*A|?Fq49fDYuCN=^R8(e z&ZC#{>*D-2BI8JxW{h;$=fELKV#$q2`;-^$j0vkelRmf=`8WxrWFm(sR^?p*= zzDpTtQfd7jE>9Z-I}s0URG|D%k&zeztS|pvk<)EE`pL=J((MBDz^lm#S&PhHA7V7$ zZcthtksC#HnM}{lcW!Jj`iOIavUXNP7+jfk%2-Yv)%|&BJVC}tPZ_vGp?@yX`IRPf z=EOvssS4+(lER;tnb5)A-RGi>{t~OW3x$5|p$2Ffug8_}gL>f?64C+3W(;!>BzD;lwcN1u$@gUZj z-k8jc4y8lY+7S;N?6$ukd)%Y^GJr0q7B=|^v2MgCm4J=oH9q%0>tXuOdJx?6`r@;* zv;UBPl?>7D-J+4578l5JGfm50AQp1uSL&V0Jh1>^v@-Vdr+VKLL%_4g7{b%S(BDe-Vk)Z0VmL&GC$*HBCj;8ZI>aIUN*Z!C; z-oAB+YjkmOo}^ld)EKt+Lv{0+Dt++V$FE$SfS5_O`Cx}Q_dzs?D!YJAI- zxXAQfbLI(IcFLYN8UZ-(f8a7QE8vg--pFD&O%?!D@cCvE$o%y@m6zAm$mC?w7dMZ2 z`}r1sJl)h(KqTAoUmq+$fOvruC^j<%$N>|v8k@}U5V5}y(y`pSRjA?6;NKrZN5M)4 zm>B@O*l`Y-yQVX|IX?{BKkNgf&eE+I8~cWU?R$NVFH<|nB53&^jK)h98FCv;wAS- zBy$>cQXenD^shH+TY}`DIe=+6>+LPKhY+-T9}~KPt2y_--MI?^cR;$jy0&kg(i3An z6SV*&PTNbAO-_RZzO_Lkfka`9hKTSVBlpq=u$uXzPoaFjabYnDI{3fD>=CIeGp36!u5B(NC-H1AD<1^_D`T`P6K$UWv*$Et6#Fx zFX{ilyor<}A0b{Fdt7)_Khku5Z$ccBl}umc3OFN-0{Nay0aO63{X|M^gkpXP9ArHw zQ2PkZoRCZ`bq~lpYieuG#NdY>T;S)sl{4b^zJZzn=*Z-R=5P2x9%p{+{(F^-j4ZQc z(&Xfi*6frQrR0Lq`$oiW0m~bB8d~IQExhu3S5p72w1fLTn-QiK;DyrEakRc`g&c(Uy6Zn1~M>k z!W#;5nVM4NB%2{cl@9Cb-!I;?<`?8Uu5CTw{dTe#+6VTZ6~Kn!KfX=~)Y6x0>2cmn zTJnxqSO56=Gf=)HR3|S~C+8JlI>AH{x=53(4nL*$uFEc=Y@kvtZ3l{DySTa8DbKd{`=s6hC4&-{v;)wk zz*%s1_c$FMtrwRP#mF4)_7N$nsC?j4X#g!MY^2z;b93Xuaj1`3pZ#;VELOX_UGU%c zOh#|8dDh1!Cvi1`9s+0^6y~gXSgeVEPyOGsWL;kHRLk5Cc^yAqt?KlXnta(8Tw~hQ zhO8k$QvlJ9siDFj%^x-S7#49cOGD$ES2S^N2-6i6SH@i|Ds?1zDLQTrlh3W(If^{T zNTS|w>Dp~s+j$;8?pWyKo=%fMF3a1{&ksGk-}5g!3t}}z|N22s_se$BwCdPMd86#8 zo?FltZ$kVwPhW8*q~-B-zIsn7EHQ#^f2;%ej4ljY#5rJX zWnyV%^+UlZ*f;Hax&jqI4>iAZA5f8!O3X_57J!fZm?S)tH-6!66=iwqHeMiKK7L*V&IdwF9NHMEA&YA< z-=+H*c`{HGb|@dGWt42`a<-YJnVSG&A1?^lQKB^4$-UqDJKbyvSpmDplS1x}Yh4H& zNHYG^fXO^(w)#q1hDSk_K%xXEc9H^a)BrND$pa7v4JGi&(r&%W!ydh>O^Nc#N}SZe zvmqH5R?zjPfd#qSNL^gPkYK1m` z;X&$oNxm>J49n+qr|dDDF}t$W*D3oNsNg^`@%CCII$Zwk&zNAeSFP(6qrs-PCpU3g zdb(j<@Rz(43O3Y0zg9pDzs+cAjJ#X*zohmOnH~QoLGTKN!p|?Z&kJZoU`*D*-DH_!~vRp?$>aMx4Yw6e+dfQOn@MEL28~`(S#& zsyo6Rx&YKvZ^qp88hsuEMhN9#v?l{7k)uHUIbHltkjfn`sExO!YATjW3@eS}HdGM! z#DRZhfpeaw&4|k`F=>W`6kA_^5Kyo!IX~lMMXGXmEQViYsrFVY(tF_<4k#uD4id6r z2RR`V{{)rdASJPR>R71*Yb$h4!$C%>&0|c*y&+$eG6YgH3{V)5#g5KS&tNS@q*(hVu+zE^($-|*UWOYRANOfpr&?2ykt%oLmW2~VTP&cY79C;?jiLcNaPj` zq#k5$9N4kZ{&5#sJO|q+SFu1Qv89#LdEM5j?v5sl-B;L3kbubc>)H<{gP4BG&=dif zx9@}jE!5)v0|@oR*A`sHODE5YuTOALhi^m7gwt?)l)rcGr3w%ZxjDNM18O1Ui6&gR z1}VbiKprjdA|aVPQ)i@)XEqpUZ0~>X^54U`7xV9G*?sN2hXPU%S$_-6%LZZNA4R@A z?mioD$6^9cqI6cCrVwBuK->CKM%Ztv{L(IY@~eK9jad=wC66e>n;Ma z*052_&a9`hBNG!bd3kxkn`z=Mq>>#S4|~G1!*B23$CpO8Uu;NmWe0r$hJL5d$#J^z zV!2OVcl~Q&`l+d-&mKBt5IR?RKiLh_AnZ}RBRN(cR<#V#x2w?d>WWW}u|RhFTE)R3 z{hcBZkOrXGz zzzCx02@M;W8jZb3tPbAPrx5$tasTGu(=9jCFcZ@^LlIotI)7M6{17ueKdkLlcD#Qu z0J{XT3r$w?F%I0BTOqC|20G*iLr+ly+L|8)`CbK?5~4sW*x~hqsV+DW4ZTDDTJr1s z*G41I7l85*p6-JBAT{~~YTKrDsb|GyCCg_ex(~v}z2`iILD>MGZ%A~V2lHAY!EA@z z)iYPb$x`2!o`Wl&hdpT&lvhvYK~hITi45xD21ID6ZZU&DY;13rzB0VgGK?~`6yo*y z^sln~{Qw!er4k-a$`F0v&}QF0>Sk=P{w z{f!Rw)u7|v(!T{c3-y158wp4p&`>~H#%UP6x*kOqVgPQaC@B#uaTGYXe6;23>kF_q zIls>|y>l8tA z3C|0!?YYr7BrqDILK4m$74eU&a9O>9yJ!Xv4{MYllX-s`RHojFgba~-`s}d|BZ0k# zVI4?%*4EyZ*o(#C

4yYH;`QV=(GIz@vfK6C8VHaHzmav(qh)YOy61xFui!l&^onknNaaZS{c;z+K`dfL8+|zSuJ|p6xUfzTljfk^~ zZ2-OX1Fh=k`yF$dyX5zhY45|NUlS-@_lt?2k<3n-kJO0YSCjvYk^D+CD;Pg&V_iqn zV?V6<@p--;FtWyqRDh3OJO=v84qf_eHlSzp23pA`DC7keWa`hK%$zDB02Dn4>u{{s zE7vIjhNWHBZ~5YbYq~+1tcD8@kPiCB?eJQM>io$3*MIUk?sZCC?ou3(tAN-M*&!SI zI!krUM+`JagtJXer0%f&nkmV%DuWKSBzGzh8zn( z7{4FA!haHp)oC*78wXJMXbJz=^}J`_TRaFrQw69kfdr-l6H(DzgMngcXVZ~VwW<34 zeexG%jr#AE_+oPFHhXMGhiD>NXBU^PxU_)J(CsbB5Djgck;+u_)wDqdtq8x!0O|82 ze*PuL`f-EfMF&`0nM4Dcq`uwkrU8}M$3;VE?9C-rjhkz(m|?w1orpKUWax36h@O${ zXMB;z@#9(2m$DXhuiGJV@VK)1%k6Zn@vF4u_2yrOPA$cnogOKIGF-y|6+}N}-1kt@ z0jlQkc#A1I`6K-(c|54kmwECNq$Y(-;y<;xb5xuCY+O&8mw*kZPYy=tqNzl16IpNX zgP}Cmnh>|Fsv>MA<=FORM?FNKry z330l(=QVuu)NN~jrCV_QA8-TOKTC?jreen(B>ztfV5}h6z3jM@;eRKBOD!I4+N1I^ zCHEMD?C$Zqz7?6aZ7DXkaUqiMyQ2o+RV~neN@-$DH$k2MJC0TVj^lIA=$BGm&$UZ_ z^ndXpdZ|Xt^@2Biv;#9sxjar^qeR-FnzV`9PS9odfvqwb>EtALRXJMOV#ZkYyaDH} z%O`|zbR{u`-!mG`>P!BuEj~=qy7YFeO{Y%Xi}3g3u}9Q<>1HA8c8sru@1 z@ggr10)#*dB9L-GWmkbzu4FXVXJP!l*hmrD0DDYFPET+MeiHvrLel)!ncaq!FI&df`f6;!u0+s(h5W?I{SPS`Dx29$;)SRF@JMhuNJZVJA2TzMkt*!A-hc3^T?V3B)Ny^FT@0ZPwSthy>|p$C8cOJZ z5eEEt9TKjNuA+bc-DO-4wT;!TS!*hx$x>=%S0=<0q>1PM$srklYMCV-+{Fz-FR)q9 z#Z}ONMlR%cFD8bi@tPZqQTw>O93<#ygi`CU&^i0pT7HwAlie6%L6*#6D5K%x(q7>Z z_7=mtfqQy9ZQ@&mdK*xudmbERtk<23CPt7!9H&WK|q! zfdm2w<}`4Giz4Y-|rAwe7h%X#Vv->H{pbX9X^TPuxXm zNcDZxZ7I@U?0YvBRihWgQoVKwV%f1_A;zM5EEtdlqw(>-qf43;&=7X;b9-c7M3Rv% z5;WQU=kE*9K6rWQwzacAY|^z3RJ8-3oE8FQ0jtvC?abgU{Fy)b0mlnF%BqpM+VV*k zVs{O1`AxK+HWj13{e@qjy!^zV-H@VjMt+{J2*R&8Kzn|({{uUKl6bA7q6cXbPlQ)b|!-Uwj4}6E|DwNJeNiTyxY@Z|D`|ER#d`1 z=RvExujMYf!J<1EF^fp7oeLd%vaPFY45R+x!yBb*B5 zSH7%ygc*i{adRpe#@6E1WPbHc;@8_yTBqAiZYoL|MZqM##C?-;5f>cyWP#B7h~JCf zpQ&#>%LRiSsjv%q4<;#=3;Eg&^}~Mr2xfTj2@MrrN-hxPgJ8II84;g>h_z_!T}IOt zJa$$1K>V)h?Zjgt%ne2Pgdg8+wUa*B?522{yCY_fzb{l>-8)O$OSc$?4~ecm>65E%dn6j%E!Myu|J`;H6wJBr`12NCN~>Z zl%&pu8JZX7<*e;o7<|1beYF9_=)bKWIDvmSxIL}RfE4&lnc5CNWDLV45~MjixffRI zuRt$mxR=$(iq-s~h}cU2LmF1C1oc3+2JS|$*w0|~IC(60@iZQ+r06$oP&zb8ixO<^ zFZvrEtv26mu%&N0?VcaX?rY4mL#5Sf<sko8WKNIe1NHQexMsGZ#@^L-ghszL--e;7|u=%9_pW?MqK~NRFaQ&=%I+uO>_Q z98@*!E?$4!=g?nXIi)0yl5P;5_1r&wzrFXj_-q8Es_uy^_Q;?;V>fs`zxi$|SU7e$ zaZ}~+_i+I$Z+3Or1-yv!OL*7$Mo-i;33$}L|C2S(@4}VtVVQMTZz7?!%4!f(^#OMJ zYUPg*bmB&?Rqt4yacHt0uiBXD1~iPOX^-@XVeI%9hxpP+b=3d_kGlpzJn6*BxAu8n z$S2fHR{+!gHqEh_-~DJvdPPs{bcl$+r=j`_wgqf6&%y6K&uW5232rlqcfSm=*OUZu zapP;j+V-9?!;`#>qnAU-hCw&~#ZgpC;&okF^L3yUeOm==%t4%`k_ZbbT_amjvny5T z?{{)-zskJfqPS4scil;TVVj@Z!zTXK>!fCf9dq#(Cf0cKCBxalHGy{c?j=52B8BrC zOXa$YHfaZd zM?-G>cZl5uaJ%N| z)#HdglH<|yukf5Vm$1*X4r+#1!`j*0Pb#KId#0N;I>)e27HEwta^eO^-H%IyXJAdl z?P|(tcRcw&pMK2qpxiXPa2$-&?)l)e#eC&(SJ$8Oc~5nhJx?x9Z-hw2O)3S?(e8U(%WH_v{PN zDQ|=ZV9?sAr}2B0lP^Tvldq;YSIKHy>iRfIwkw>EV0CAD1CAW;s|-`y z#lp%AfiIR!Uo0`7e14;b6LQ$Jhq)$_XuJPxVphq^a4;x55rWkh*Z!g8FbMVs}~MX6LST%FwSbO{7-AYk>Cl68-L?0}r4` zR;-Z?(&@PYx>D{PoiRmVXpq6#@zC%vkAwu?O9ch&dOc84cwzs{XJkrAPtPtZYXR>( z3GTkSZCvKAf9(gscuGHa{#MJ9_11o47x~ zA(Ert^x-L1(@rw|{%l?^)X$2{0kn)SyyB%;UqHZsY);qbW+Hj*n6l^Dc$Ev= zhpNt;QGJRmUV7<;u>oSoD7osvd8kHw-IZ0L=HJn|^i4H3(&v7I)n+`}kzMo(+q~Na z29+~7={p1wGTXbmX8X;)ohB8P2L8^@M`|a{G&XkHWi0gSW$((c?)aW_EC|QF*JzU7dir2~%wHj9fAzw%(FC>jQ;*S`8bs2`v`qnw zRRTUX}x++MW!>m0c?-@&Q&?^f=6U0uri4Vc5@V(h#W1#|TQ za`@jXSCoPd?$=A+F?w@F{&!~`_>$G3>GRN@xVXj5k*p3VFOVtML3y#DJ3)c=1Xk~` z8vCEjOjhNUH|$b{nRs|&QWt1FNzz8c4v~v~%^X;fl(fc1?LzcxSQ(#n?I6;Vic-|+ zTS%-pN5-x8OxSxI={l!fJ_At%cW4jfsS1;Do%aFnc9QbE$;XdZPjTj3lv%Fq$=Xx* z$u%EXz0Z=#oz|WFOjDoP3msxUDpi{8(nXrN9q=@2U8_#F+i3#lyQ%oe_QfqWlPfSE5cpJl( zmyLnc7ocZT-p+8}>sw#(i}ReyIL_q$!`fkqO>lBsRs@G~5W@qaOHh~1uPG^Xgt#u( zoo|p;F?Z^)nZ=6~r8w>1W)NNw^WwcSfw5VSPvll@T*cL5*fbjg%S*RZvR;+zG`YSk z*gu#NShN$2OOt1WIB8Z(8$+y!-KY4`7wGBxfwO)kPBnM(_4ev1!{@5bN)|;hhyvZF zjXY_^E>~ALW!lBI$Mj(%{`MqXwk6hV{MVq$XbqRrTsv|6{3X%v8O#3IvKDy#s$H%Q z)KX~(rF?p_V|`qrqf{}0Op*XjB_6czxm)k;IS$5aZ9w>jyIBzza(2L>7g-7HU*_~e z`B{!iRU-5vU8N+hvROnAdsHXC3oEN$-eaT~hBna%dLLd(qDd}Fjs zS4U@ymfXn5DB$+vD;=Fle?J$e3g@T;QZh1+1EX&MZ9rjUVmx14je8Kd-uf(~|8P&h z0%Yus9vcJso6m`lQVlf(R0#<@O`5{O!!?JzULoA$=2$}3=;;&3cWo?E-Po<4mYwoG z8!$zjob4U`unw9$PLy$i?5T~g(^vAN!#*sXcRiA@zn9_2A-Vr&fyuqxk2yZQrvjCT zgj|>7n~~SjlkxkQsNrVnaVGmU7gqEaJ#DoWiM~f{WD%p^&=#HQ!IU#uCxrECN6%x5 zrpp2NN|CmF)Tl4y_<&j>r?eAR} zWfFIH9LAUQZG!TN7V<a&^;D#fQ&Coo^eehmz)lvB}5you>=}(pPlGDf+jJG-m-_BV0dlEy++_zWI!8i}EjtVWC zH%a(8n^-!XjOs-+Lwr%aLzW2p_`lO7a^6hoG&z9|R%Wa3v2fBygv|*GzstlzX=g2I zyn#=}!NJkAGMfOhHWw_YO&IV1@naxH22HNvFg}>XNkT1Nec^S$TP4=93w2Ac39%Z` z=+Tq7c(;y;wPwPu*rSt<)m&hy>w!Xo+Za==Wn{hdB&2s1nto*v?y7(Ze52d2%hkc- zBpqS?ru3biu#e_>)4DISAYy83`rhEGL*FqDq?cUJ1F>UN#|a@ByL!+z=THtt%Tng# z5MxQ>!XIz^iI)`I5#47QR4}gngB>zYKekJ_mu7@BZQ<}5*T}B*yqAPDpOIYD>vPhO zeYB@Dv6px%W~myv zyC=b5rw)FuXFFvnsi|`(Uh$tu&->4|EGR*Wt6f492p?oVCnbn?w(LGF82r`jaw>XO zUEzcka_{PFZ*{t2Rf#XIq#U_|MJlgqkx3?4K}-I@gRKwnJ%9U-)v*$NJ-=nKMxP`{ zx+o1c!aAB6t<%@vd)grDPp5YZVBOExm_z9)X&{FKoLeakLGOE)NsfZCgrXnGRlD;n z_!}*Jy0t2a;#nuJ`BNWOQTuv-Bk`Zl#05T6EV2<9{8Er-xJqrh=^J5QF|+=bjr=T4|k(TT!F{1 z?3U6Xo#J{H$WB7{4d`iOx%uimrF3v)SweH5Tt8>4wC8U|f|{v0=&O@%598C)Bq<`@ zPwnkz2chE3N2FkH;&n2C-MlF@uI-f}c2i(SmK5p@w~{@~Yn21h3kxUHCUhzlpB6*Z zCejC2;9>R)^V$iPIHLY1y|F_;^*~QQnDrR!Zt*Ff>Ipc6;UPbJlA!{shm4mgPJQ&97 z$LvOl)huWB23Sot86ZQ-)^FTVp-;B{%ftir$z2{e3c{|1N)6yu-+}auVCJzYj<<4i z!2Z>MO7z~WoBt(zm@9U9axgV|0s8(3J{beA9v>bboz&Sg1_`fbu=_sgjCj|4-Z;l1 zNQ4KzIf+^Dl!a-|H}QuoKvj?r`vE-c)B9BQUP*EsgEwMKNe(Ug#tY*)Zl}FGo-1YEH|i zVf`kuwA)ET`Vm7#ED8ON=YOYo&n#FHGxeKNHN4hdYe>|;E&3Hz3!LM>gtbI%o;^m& zsn#|boDqz!`Rbn8&+zo@-a>#Kc03_UWT%#8}*o7I+=r zXDFYBH&ecSGjlcxjEHz>p8DimxikBEr9{Ay$~T9E;J=hq9%SIoG=6p@UJ51TE$T)G zQa@%p@Z&K?Z7ENAcPQjS7Hl-8n?!)+4vtCH@Cu^CNXEW>Uq3-)aCt3xGKR*!Tcdo_ zkar(@r+XmXFxSOCaH#&F(c6QC(H;|T2T6=YCQcujx=%%5+lGL_ae#w?jPLCKB~jp% z*;^4~K|er=-TUp;NAw@F(2jkiv(22S_MlX}(!$n;`uH$%v5EOqgyx|n1+HTri0W3RED%u=>z3RPB7$;pMh68*7K_NXbf7z^BInyyO1MQNT$z=YyOQo)b zqfhPd-x`0|6A90%q;7DeSK|*?v{p;~%d3L}MVFt*P7f0tx;%HVpl!l?vMKW>bhgjq zVWe_+_Uba_{-}-3cc!6jtqfJwC&X)qf%oX3fA=y2x;{bLiRT}9GQEa9`U0UR{(eC8 zr8V|6f=rzu@(sNosQ~ke4(%|h(>>bgtfk9=agLhR#fZ?ms^6ndnJfv?6~TKNXw?@ zPWOThU?+EHpvhw1?*sSsV!;UJ{CvhYj9+p!Skw!NXKZV1P3P@4%k)+^9h%=Eou}r+ z-_$(?(^2>WJ*CF9z8F@Mbnd9tppA=VjazCY6rI@p{kLrU!dxxxLDj#wdm$IH`&BQ8 zVt~Pz%?qLcTj?AoJaY*S5)B=6xTZYj>AW6jphY+_3)2`qKu1qg%IVbMz@152Z_4vL&aJrRh;XFg@32vc#!?e@cKx%^ef@Ga(3R0owUAcFz-&k_zvO|)Jp&p0A{lBwY_Hy&V~8D*%~0d zAdZCQ5isv2m8eg%C+25*TR5ZU-jnqDK(=Sk*^2t&Bb~z|I#VmRWXUZB?YPmvjw-&HT#)-Pul0d^_(E^ zb}jXm<<=sWuCh!j&Y92r&Oa-cH7e)znoS!1(Xe}Ozp$|cGseZid+W`N%n~ZGiQT41 zK}e*Jk+zYid|y@SsX2f175Ehprsmes(dqp{!&`iaV46Q3MQP7Ggof|enJoy$o<5de z%zG}-)XjG0j6!|Nj@GIXH(GZaMNk(VS7*#QS713PUlU zT};>JnLU}JEuw<2fmc&u?p>W-$;q6nZu=(ifLtl=o&D~I{Kp7=(%%*eSdHF{`y*mi zjo0Q`IdQ47hR?{9L@zxAQ#V>;_Mg9y5jcqW@VWDa&Ef?e7jC`fcg4mSSB1@-WSyCd ztFz@~RzeS5ql%_v+u}q=`-qw@%sRh{-KqH5f@x?42tObnwFz@S1o>IK3^G0Yh=j94 z7Svg=8v0H1EzjvzEATCsAy1FE*)Vo6cTHQ@sZJVDd$Of38)GCLY?2+&xK=66qi_q2 zJbwyXv#D8laugZSHnU;Q&a|p(JssdM`igjTd^;pAYei+iprgLDz*iR*d%G?tB*Zhg zl}FoaK^ry^Ar&|U^T>H&dLjyh`j-1!TF0w?6>`F9=6-(ZDJhT5EoiuScrC>0{W$oU>*n@e6f9M!WU~R7k0>0n}9}F!;-$ z>hY?5$byRcyuJZe!-oRG5b3jgdjd{-aR|d{58V?ur=4Rbj-)~kTj*>`G~O4SGBE)} zc(v3u4toeggvsadj4myOwufqt?c}Z1UF*rMJ>Y99+O!2zk=V{E$vDHet>N^0`}+J` z;;$=n9L85mGrUs!E?9PdCmk8kA*7bXxcq_~Zx5v|j-2tTHmEUw4_2U7C`M{AN>2^k z$W9H1nda)!VlEaYDM!8yZ+00)>zm}z`2u{W1wY|t_u&+PvcwN>OSjd|=9{E^-bg6& z7yYX&x{n<18D>HDRM+%HK(xU7hjbpX0ibgqA(&2%hH^PMeRI=#Q=U8poW0SyUT zRsKIM05`yOX0v;dpqZ5WYp2>jB4DFf!D&;DZ0L7rTyo@CWf@E4W0$=PCGB~k%gcs_ zF*)t4n@c!*g|R*35`c-Yckr^c4#K~Nx-2>);M4~Gt4g5l9Fvi;yJB)|ad8-2K%VJu zlo_1^`_3IIl^r6Ly`Hk=ZEPH`XdW>zMwpU^qmZ&b)wf2UqWFQ7!}sKZ>{^A^?5|3|_-ZtzZNf^cY_a`xwJiL~6VK{%*ZH%8xUZ?W!6`Oy)s z&KA}Rx!n#6x?89;e=sSb>^>v!I8R>%TNA5yqqCSP1%e?t2!_(}5W5k8R15-=m`1FS zjouB^DSvpt6C&3d7pvhpQ@JC{j!@+VY|y8CvuNY<&f`uI;d<}oE9$hJ zwiDi#tGK(f&MPociJX#h^EEcw^){iqTiqG%jH9w-xx0Y@3!S_Yp2)1;#de|+Z z3Va@RTv^!!bQ=Hhg5(D=$j_2gU0H*bky96u$Wny`Dbsuh+K4|?lBQGcj(k=OSWT3& zUTgOPUhh+60ca6m5qJ@LKUp%+NC0f2gj}Gm1$E&10j1XPoYP_1uWk9=&r7d+z8+GO`bfekj!3bdmmRkq?W|}_J)l(R z)XK)l9y*#Mz|4NWkH=+puUD%>-KZC>zpRRMS7TFNFo{DTv;R@J2>y$ta&5o8D$&qq zHeZIOZfLY2jJnq5T$5|@^$rrQB+QTdi2ER5ok(B^TEFT{aBjf zBR59RjJ9iI3bsT#Q@otxb!SARfkgpf1S#xp>Hh8YcELPUKxfiLWoY1Nrgrfdwo|st z+)(3wY>FZSj~<(w=}Y<2Q|rqP;$MLk!rn?IvVk(y{g^b~Yb@GEJJo8?vZ}b>w%aWx z5=!Ep9F%R(LMFgG7N43WAo8m5YiTc^kBuBrRw5gvQkWLDLhzfp2P~9yO2G*+;)gq2 z(w77DX+wkrky6a~{9Ws{O7UFM?HhgnA5C8!7UlQ6Eh^F=A)u7BN{4g^2uKTvbV~{B zQnJ*7bO}f|NE>v+(zSFd&C(6K^wRr2e16~ey3V72>Yg)a=AL`*ne$P=Ub0f?Z3u5_ z;?zJZacqq_?R_#fjgGZ<-D8o#fgcMUIbPDR#wa2hDGr?Q!cy+z z9TAGV?m1hBr|s_t(d&7b83O<2qe#mn_Q0b_R+X>}BF(kKV{+1nE>-`OK5}M_L5hO| zXS@Skq3cGK{r5}8tk$70MxHD_oUwDTg_Po9yCW4ECQhj{F@ zYxeNWp<_04ni}~qcWg|Lu%x@oLHT{KXNWASCuaeG4NO3EB_(|syaM`V69Kbgj%c)E zr}(04VrHJZ#hYdt{XG!Br`20lswh{UjF^Ip^D-nj@$0O)=&bKKnSg`<>5br2TRAx| ztpO&bO}1V3-dkl6_G07bk0>iC`P+~1$f8*r`wT9EEVsM(Y4LG62QNc@<;t<~o^$#U z`M_vRrEi4Zz$~BQV$(*S2MwIeS?IP<>JuEdbT)zY4(K*MGF=#~nP=mj3R{+Ye6?wN zJphJ18ZV`6G0jxdp8It)nKFdYLQO+9Th>RHJA-6te5!t70fgq6hHr=8721!vs`|sE zt7(I0WT1D52yfF(`j0wRvg$6&{3QN#dT-~oko(}+FA_~NKxMPn3n=m4u`o|+F30e61Nay=u6^$XMxUl&ypB~cG73%?mx=p#cM z2)?ATdQ`s)vGh?X)BiN8|6HA(gkj{|<6+Rjp=$ZHRFWx;*>Fz-m76mwHH&HO{L~8B zY`Xae`FG`sAm9cc-QSp|ey|q(O!773wZsdt`F`<{Jqr^&?j(91 zvo->1Tclkyyl=QQrD+BI#CQ&7k(`0gdC08uOj zl7+G8WhSP%Q>T(3LE?P`*O06^#8rEXYhBQ{plvC9wxuui9oK}|SkJhF{nIB9jy(jP z{DRi+NXv8v*WT2XC+M^24n#uKNjq^8Uvc} z@RnB}FFk`@KT`?1|6uq&JR_V8bkgD~Mf}T&hG1Epvcs4ngExzd>`>tCH7BWbBo)O= zF?wuv)popifK$nQ?C*RS^}u?66Krj>yXi@XjnE!?70Lq0wfJ`9<%_z0DTr7U2~r8;)0d`^iv>*2?9; zNeS-N-2`MK39_h5^Z_>#zxj^_U`H?Sxa3%a{CdM3fHKpM=>W|T%P+vdf+#2Ms^;J{ z`lN{pCY+Al5zFaBx-w(A8TV|2TEo2!pH0p88Tf?Q1jGY8rGVrn$$e^k!@z(p(y(X5 zwJu$uimZc2<4RhRp{|MG;g<_p<2?^_zw&DN)x(-p2DH-KW0HvsiN7j(^~i!P}iM+;Y$z&A<; zL^1c6WiX9!YEI3g^Lnd!s2BR}i&4wC>a@MQWM29EwD$?+X(=7QdD7Sn_vn`&j=SUV z%z#D~sa=A4D=KT3e{HX5wx-Aa$joSo9kB{m8DN+UXU_*-}dYv zs_tlIMLcHF*NX{eD+`#!_Iu00=A_))+eyLi(7NFVNqzpEdgwm9x%b?1i)&o78$|~Z z1Ab3k#wbfOy}VVX!nn9x&~0`|l;q(Slpym)m6)#mp;Scy3jkdfNEGa{(~G?_nl^{! z;~bk==2T3>_Rr<-Lsq5x$vYMGxAry<{#8}yZ`2AFdS7MbQAa1aIbd$~ZvxqelyV?9 z6CebW77xH8hlL4}1MnsW*eSqO1BuZV(6InMm#X?_Cp>_7-_~BP5eoAhbRg{dEg4%S z59CV(#Atl(3Hi>CY(+$W0#J&}=p*Dr)c6bc`Xsc$kxvbU#jvS2>6?xUw}$qk$hzwq zk2BDAM0G(^NOb1I2LfoMS$3m;EmicWWK&F1DSgxEQAf=DI9c6@AFRN>x(?!moC7y_ zEISKIO8I90(JfsPAqKRYKv$USQkzUjNa!DW_H55>D>imOXp;8og6~dq0cs-eiJ4NU z7v}4`0=KA}LZ*^>PWFQ%Ke;x)0Ma7JC-HCi2;kUzZ--mqwS4t`;|!a@jGf;y9|7 zy$ zeybgkt$GM((?hPlrnFOsU9>`!%ZUx3j>5PCcYcHFv>{t&*jzUwN{5%a_G_| zw_>11-n^U6gxZ|w%3*HLbHkKkN9X${F;sRC z8sWj_L`ePj!xtb|vN?-)k3!b8cMIk842)FfE4qgI?L!l%D9eU72J?uU(qA~$EjhK8 zH;Lp9Rk(Q$m_t55WfpAnjhpD;RwIX-Pet4^3W7zCW(cEKABVGt)qOF`nl%=moE?tU zUEG*lY;EUBs>R)pVeqR)!ULY0fq>_s8$?0hzKxE}^cjMi)xf5U(NblZPPC!ftr!Ad z^c?1SqH5AfN*2O|tp_eF2?Fu;VUGKXny%-SOgxb+AUs$y4$vq_Q?Or&SezJAVUJ06 zD+c_^yDF`Du7buiHwsU{&Ga^=N$x%BUN9^uhlzd=TQP}=9DyNT%NCwsIyt9bWIu@! z0FytV)&D~0%;wqMtTuf<=hbBSqw~|&^J8Ev%OtCvWxhj@AgPv+Y`=n1*>z(WZ1}0Y zb`r1O3#k!vo3!R(!g~Zl!*1oYZZ7Yk$a#@Tf&?^l zp(sa}CTHq746W;e++98GeEd>cg1h$A>3Hi8Yg7Xi6u_+8(nC~>9x{FiXnq9bf#d(b zY#gB1C4r65(4OWhc>mYfd)P*TGH`suo~g%$ch6ODWy(0L>4`RW=b}JPL!lp|+fWQ9dN}F*%^22u{Z}Nx zscK(qXk_ScjKOyVChZ*qy+SANHyHx2xnFeiNG+jTuedIJd?!`~RGyyg&%w{nMS?qe zB2S8IGGI>O;+AMn%+S;}($*9`eWg8dec@myUWj_SwV4cVmFb-re;iwrugLwu8J9n`4B00o!2MPo0yD5!YMQ?_2;slg>(nXQ@%* z{KC)!bH=ya5PX#3+PxG$PIc79ucU5tnK3YOlh8JI?%ZG-5I8mBe7>WPr1QuMU$#uo z^7~Z~&tQ7_6_6%XkEoFi^DJLV$@8ePA^P1Gu_zlKDbu6E3H%l|ZpoQOw6=`1DLi$7 zlI{*5TBzZPRe3!`UT{Yb*QlEVMN9KKhqp2iN17q=d2R=Z_I-<|_}F_y7bjknMR;r! z3P=CaPeu&o5W<6HhZQLmZjJ4E3l-uIGURREY+dhqpWz?eU z#dv|*2*wPQg}KU;cDdXlJtIDg4};@*a?coLU39bPf)}jaa!=B0FcaR=-PF*$yHR=i zF~FH}-xY?mh=}J(zcL(wW zXZHCk9hm!Hitsch$^7gKz1a{?Gs9G310ab^t--r~M7&@3dkk^~Tt{n|XOWh0a_7+c z*7*ibq2Fm$W#&|ftSaWn_|a{v^wP!v`odw|UciIt?d}R8P}%HB++6Hle11f16l17p zy4)4q>H_%sY8IOY&l8=yc#W8Je!A$IaVQB_p`S8X`PIO7&aV1f1_;uCC}&9hKf&*Z zNOx3{S8l!GN8ldrYW_85h-+C!rABQsorU_Cggv40szcULI5_%tJhktoFh-UMrV=NC zM);So2|cj5Ko{<`NgF2%YfL=oIvsCnoy}lok7Zn*=4*bx+mngP%sM^JqfHG=7x;EN z8<0v^iK9NAo}!NjOrgCD(ia|`nGMjz%|AS?OH{4btYyu&kL31CuGjbKD4>3w$AI@F z(Jedd{AVxz%tpf|^iER!k_LeDQSY4V_7d)L;n=8`NRSV3sq)HUQvc+-nzKIgH*JHO zR8GIN#(-}EiJA@31|1F(irQRw@$BZ-)2P9FONN~Zj;ki4eR`uxae9f0dg;$t0e{#m zUvvKH%k?ldS8{2rSk1-ozk*k_buK8sD~9mJ7DZc7*5m+l{fyDfaBC{ubW_O-?AO0m z<`*3mG$kn&Z@bx%YU;GoVY;14&l;PyIZhy*_qg<0xLj7m;L!dZkbD@M0+%ECKi;3z zP70_NWdZRo6hKA>K<$KTu|rsezMBYyHHUoIM9m?zPCO=Q(pGGGMX>&W5WqxkW6O%q zmmdO3tSq(}N8|jsjfIEs=1%Vf(jH*i$0?_1l+*KTwNte|g>xE1xF@UOT{J*0rbp+@- zyDSkvudo4BYIcGmMUP41~9c9n35 zg#q&a2;kWybG|k+W^+&FsyP*WnC-q&0ykZ-#lA}+kiHG8spZ@x4EQQu2X@^&bL2K| z>P<~Hu^2%>&s#Kdz88Jx;Y1ZX0s~DWCnqN>jnHc)hLYc47{BH@n+ny}?C@a)WOs<9_v7o!X9L#ydDF$tbshidkVvA)T+7yV&_c$; zhRLmzF|Qq;`}|{AOA%1&qWB}3z-1?(KRfTN-nhC}4B!8eo-V^c;y~cwr0w;K zM2*Hnc$R$R(bn~uL^usZPXZb+*kT@_cj2By%w)cS@Jwugm>8o|k_M)>FIQ;UUSP;| zVsTu7^VMeaJ9Y)mH(U2{B>z?XR9JL$GL(>}!Fh!Ul;N?OijLVA?_Sz^a<+JT7>=eg zzH@};g^?G( zEF7dHTgV#-N#*Cr(|K@xT#77sd@7b>R32jJnGCET@^T348E9isH+G-52VkYkoB&l1 zaA;lA&6<@nNBf+aBb%aEr&Ad>m%CqLMBVp9%9;-!l^Wi*wgE#Cua7$YmH=@1mb=ck zK6A+W0+2b2PA?js@j0w%m}ag6A9UkpliOrtFnqP?bUfbmWrL6ZNQ)>O5J@Vc#IIK6 zea~h&GDO^djCVen(b>0RF<^M6QMS!<0;OVog8&ZqiJdq+l~2Y?#Fh2^l? z*Dj;Yvsjy0@cBNXn2UaC)wqS3_cfGOxW}G{FHqjeyJwFUNwwGN#rvEgaq=|lNs9wR zKawfdci&k-Udt~n*z%zjI$Q}(d}<{;GoNl*?PU8k*iWfvN<`G9(BR26 z&I;AaXL5;RxubWAwIu6;|1yJ5!hksQ7tWpD05ZTYzYxW|PSY~tAkpm3yH~|tjNN?0 zI51GbB>hR^noa@H$(X&JE7#ufgQ{GZ*393{Ob?$>1&gC>D7vgB$!*DrbrV=)`;Tbx zuLy(hXNYBHrgOJ#SC8BQjcHuynukQ}8*^ zyTO=ffWh1YW`gp~&zQvWIlvdojMm$-7$51nAKhK3ypdLxRCQ@*qsI@g*VA23&~9Th zg$vvAZ`0HSN?`Flh4qGSe>?tHWy=B7COZj}IYLPariL?wFbD@S=^r3|F0{sL)U{{r zOh@*Hz>Q9?8pv&j7NB!|RJWui5HK0Pc=}Z9K15)N^Kp;OUw4-QRJWNOpQwRqbWq=T z$I%>u82F_^@$2&71gfW2{I=_#d3zUr&=?j0Pl$gcqVm{PT89HCm|{V?yN>|7?o8)I zU?cA31j|3d>|6F=*5$4zyDo8N??GM$GL%KZA~;hzHK(}%Qa=W~ycehF z9N0JN&c5VUT_2hE+wrOs>w!tum3(M;K<9@s#_66qP~JTsgsJaK_}jB@DBgJIFe@&cPAQxYDbg?Zj}lO9RGtl{jGUZ2?mm|o zr_4;_`qD_$6-+3ahIxvE(&Irj#O+{r@tV2yYTxg>@2l^=0eoF~no0fjkr(RU)YSP# zCx(J|nSBm#JOj-3yX9pbJ6$25Vj9~cH9(&BmjO^A8s0G(y~D3B(=@slPRnK{M_=xl zWOpEE$G^#-KNDl2yrzV{CE5f&T)f1&le6zzkHVXO#6yQUy)*S64M~(%7)ohG_L06G z*nM!8t{*Za0npISqSRiWL9=8z?;`u+^zd2?Rg*yRg#-D{wa)uRr{YSNnJjiR8^5L7 zPJd)eH1>Uv{CU-8D1*M7H_DofoYM0-{99@~QGN`5k?t&@?4v|veTBBeG0 z&pupAmhKMujT!1ajhvr@L{!|2IC>Q$;}{JKfD*zTJO{MJlC#|~cUC~X;=!Z?6v*-o zDBL4EkQ;?RVHFE~;+zk6dGOJ9k!@wi?w0*6tq3(SuwEFXyb}9HMavd3oM-DTaC{pN z$EN1~B-uki%mc@-E}qw&q7I`D6G<8_+9>vc`DBSMnokO=f|oDt`}8^sGT{F*?wFtD zFpYG>3s3%71z{lP$z4J2FiHc67h^LM`|bEB^eW^>=<6jUXg zvOKUt8YeMdKlz>c?Qlp+PU1i98DcDBHnlRPamzSD5dv0IKLAs1TA{dkroHdz95O;) zu<-OJ-QT69_ra2OO<(91uirc-ju-O;B%oAJvu6``J&tKG<+hSBClzuhz9&?aBNB@4 zBTJ>c^eXNf>Vnqx%MA4TAv{a3h*RR*fTS_1&FBpeJ> zFf}2^^_dXi>vNR~CN6v*;kBpK_}GApE56eNnK)7Nh~*1~ZBD^Nk>5}Un;%jjWY}WO zQLSgC{-BZZeJ-5D$&L&#pd3=Aq}>p%zg6%dtRvtCRx{FNOL7StHWsHG1<*A#-rMWC zy_?5It?rJxrBjR2=aI-bZ z&Bqj?8?4Au={?R2^9aNPu*Nfh5#)+!lF!dbvsaL%!hmQS=k?65T+ zifF*PI)`aHt)r1dD>qT;rE7owzZSrQZRw|YpC%;k@JA-c?Q^sPyRGGH znzpb%dT^g9Gj<2nWd#0KHfuZdVw?WQscCob=J8CN`cdY3D zIxGQa0^ojw!g`qJ%RLaFLP(DRoAc@U+b*N2k0_Nb}iRzWutx zOuw%}{2b!mBjfgQBCNxhkf;%F#FJaYWx`-CmL|$7TA!ozHiwWsbI)0>05wi_xf zx1R%t?*j`+DRlh4(#R|(^{^xsEQYg@wt8o8O@sA4wnZsTMevY4FjWV|xeJvPi;BHX zV-2+F2>)Rj!wOuuJ~C`K&S#nB7kQ|ixLjmTdyq+Uj zH}r<$=YQ&u4!5t%iOEfeDa3WI75i_LVulPl8-7s~#n(XuN5)}CaRT(@W86r^Mx~Gy zAVi4qUZT<86kFj-)6+Lt*i~Whg2~Ps{^f=H~h^X z#t&`OY2h=&5sbiPG+foK{%X7v52(9YfjjwDx#%=gEAs!`3!sxnpSh(Jdk% zduGmLH$~T_be&^O@>Ltbl;&b|d3`Uk^N+?=PHvV*RIev+rVn~xusNrcVBKWQDpgu0 zj{QrwF9}Uoo$g#&o*)%CWO&~1q!xRlF_fA?N@0v(A}+(+;{<szkQ#pSvyQk)eW?XXxEcc?6=8kiG$V?VLl7g-+Oh(I zd1KR-i+e2I^wV?kNce`UjTgOsTJWZ4)5#GBt+;Q-?o_Gs&1?

Q>3+LGStxj09H^CjFvuUWw^P8PzX23c(uG=OK0E#di#LRS95FgoIOjg zS#)w4X!{%}q0=`zmaI=UUuCp=ZeRTra8TIVnYUsVmt*nHJ>oNhB;Tzy<2r3Md) zlQ~c9^rhD(Zzf*DbtVmUL3~4yYadcX&?K%|wkeKkMNFagb28l^R&$yOV4#%V7K! z83tHp^|xr3E>M`a_1{Yn&kK;YfF3Nr7bXT|`2Q1OW{v|<^$%bGRCfk|rRK_E@Invw ztAp8pO3Y&Em{H{H0*%qr58?>KZ%XNb)b8}b5QF+rudl^4`snG4_Z+6~l8U)0Inu(4 zejpIM0uq_MuIKfQdHd>{qF4jX?&4%A;;FD~PZaNy?KLlp6lm(pGpj;eeZK{`!zo&M zL{x=KT>8vx0yD=-#+3n7piCr=$&OuJ2L}g%Mz^58zVOO#jESmJURPJB7Uo3d!^t^R z!uq_%E)u!XoZUK-eS3~KnRJHgx?Wj5Y#7D>41%O^oRw!5rtvG=n*f9O_ECdR)&->$ z1;7juuSQ7mlsnoA{RLB8vrs{oj+{x&+SwUT)JaWDe8n$E5b``Q?MF}&(iiQY6L|j~ z*5ehQ!Hxi>dehc07MTvz#X??QLdVOa`Ohl( zIv7n;i=08TIFz{&M8PcihIxL;=_*)3MQ(%XjWg zcL56}iX96jGO`OL-J0KB1miSrr$?lQe~(jY?!E*v>*akdH_EuCD$n#X@#uI#h-sNp zs#KvWgSLNrL~!#L3b_WNN3Jw)jU5Lsy~69o-*7;?0zgN+yuHkR44tX3d-zG4hHnW% zBW^G}=mPs)*t-lBXii|3g4~#3l#>nn^00b>))NAc*1g+i?+htu$a`;ZogN0-XDe3> zzP+2-&{`XIRPv0vGu^Gi<&|Dc&pVqxFq!k#>kTwaDofd>-V=od&XP9#=ZUL{H*|d! z_gJ?26&@tgi`}>>__3^Dx^<~|f)ivn)(qnK?kCJcjM(uLo}Ip|LCE(c)}L0mc2BQa z-R%%=_jS?=JP;9|H>rXNuDhCKin0)=)9zfIqLx{%JwDwX2;$3+y3R$RCS2`!mf@t1 zbj{zEo6@?mU85&H`(LRu)a}dg?=@k;eiGt&5Zp5w+X*Vmp7z-#%gpu-PW?69QHdFo zcz`)g?lKWq+}XJmDDqB82b`Jn6Ds@8OaAU1Es}44U?LJ1&(b17z6S zD^TA2$hya}xQzXb%OK4dmiYw(mg$9Oz}J)zP#n;uf`!b_i**<| zylwiuhMzs=X2GM1`{X9<+Csn4ydXca=~-*dyNa@$oa!`l4`lv@E%Cehv90LYrC6Nz zWNy|64xgJY;YFXJIaE{RqG@JS3%sWXX!T#&NkpY&rTw0+Z!8rM5@}Oh^d`bNKS>9t zrioAEH~bsg@;5QX)s)Wq%No|h0yJai#X8m5Qji@{%7*Q~cIC3Enp9D)hl#$cHw;+# z$L5c0esR5){it5fV8b~~T!m()GN6Hn<3%Q`4(39DC^%UHiz|kJhK7iSjwUmMzi-J} z+PKudyJLxbmqi+4++8vwpQ(LOUe^Vvtlaps4pkVx&McgFi{6lt*Cw z#OWVBYb5NOXt>3@Hp6>M`ud&k3jR#yhzW>wbzsg&9)cJ0R@3db+_!m%y`5RL+%Ve& zvcky9iyqHP=D;h4zr4Mw-zr5$Rpy#sinTN-Z(Y)9DU!rKMZ!Oq-GHu!Ev~mM`rGhy zhst=;0)Z3exjSJzPXflE|D7*#lCd4R!JdQM$fxL{i_%fC=^odsb1Qzub7pd&U;oM{ z+(K?1zx*|Hm*f%l!t+0{zGvK(jp-RkHv9U%9d4IKni`cNJ2lbsJqaoHn5p4q*Q4`2 zS}F0EslF+ld-J;#B2?KM%2(zI9}O7&W>5I7hiF|AH*SjJNk{5%X2MXvArK4y z28t(!zD;ynr<$WEOj@eo4WJmOcc$w>6>md7UOubNc^UnTg-a z6ZX9{t&{6p0VcmIzJ8s8(el!G5$}M(t;cl9Wvlx7-Krl!j4h+|OwKF37f5xZiierm zP_?6T^P^_tEBd)Z&+u$%`RnVK*Cg~~7gGanx2OCc+cezEWA@%l&$PGv#$LWE(xFsPH_evVxlIH5xspvfpse{1rC7bA3YF2(F!|Aedp`Ls)uxP-A+0 zfmzOvDvRx612IvZ^ln3Ol500_0h4kh=B1-< z+o#xi!D7dgzg4akg#VH-!qiRJnYyo(FT>cf^U0^4se!bj6S_l!#>jzvxCfVew)-D3 z^GRioTYKTECg-mLq){7}9R_`)ANb3zzl1?TuTKOd~S_YU_L`%hOl3P@l zTwB|}ARHy12Mphj0UiyM&3O!Nz7f)nhv?5t&!eYjjH3TQ*c!ZS;_@u>n$WY@2)`S$ zz7J^^z4!#NPbis4wNf3hv-*&13L$@diGXYPj}>r5%y+Kn!+);GCau9&dxwQ464=Gi zAQ*>+?1H#J#nXu?>QRf6T|OTJ$Cg`KY}0AQ6nC%R?nDfpjnyp1UUA%9N^b_1y|_n> zKi7K-hZN$*vgTX)Pjke~DSOkNpGgt>gR$Gl`v*ese|&C=YtHYuo)H_y+4wYrA>KDg zs_K!jiSp#{@BWQnx${t8TV_({9xQ07CAb}0lnsQM2L|8Bd&oMyws*BnhE^0exO~Bx z)^f6lC+t|@!vq_vOn=N7jZiDZfAD;A<&V99^3pA{OSAE(9>rHKbblm!XGsv)Z5XGJ zQfa>iR5W7d*5sq_CF9Ov^iD&&RJD(Piywwrgm_ynFP~kZVm9z9%kQ#Rv%0X1DdS>~4q&xS_VmhdsP!tZemRPf+c(S{g6vwCVi^ZN1lG&W&ZfH1*O0J; zirLFjuxBa)fL3a|a2 zKZ8RSP`mkZ@@@zX(O;?TV3X zZltDVvM0@ByrZuKs)|7lM-YZ)4c^B~Kuat;TaTtPsTzxZ*jv4@;_~`RWp2|pLBi9t-^S)PytapasuGHeb%NM` z2SyAk{qzRk7$l$vuU->;kv8Xu(kNLS{4*R8wO#loIVo2~W&B2DbbspT35{PXq1u>w zlKcL@D3EKv8Djg>jY|iFnK37S#?!F2(o|%=cX{toDB}E9kKW4;d2V zO9l{MWIG^VQJfYfSnrg`{QejP_?+M*g(oCM1&`q6b2|@xNNAS(<}mdfWEk`?2~@eZ zZ_zgwoa4~w%6ECB3H+)0+pw6nQox5tOsW6i@nMkuS&&lNEi~qjU{pQFoB7k7j_N`R z6LyWZezNL`hb4qE98rtI&E+BF<*u|EL#`6oLeF-Qk0)+@E#!m7xE7YYwjP7Q2$?cX zGm|i{Da2SiT>6|bdUZ);n4o<(T^Mw*P?yZ%)tssr^IrLIS&<=GGDIt)tmS-n!U;_d z41F9B1|L_EEEW|B45n`mmy<^EHJA6wegcMlh}CK%c5MV>fq|qq-iQ{bXmavZ+q95E zyC6B4j-2N<(eyKCO)-m?^q6fbjLGC{tlQgFlF^9yULa5hJ>0^4XrwwGiEDY!%4^!QC+MCTv<*Ucb>hVwx&g|{^*O9~*2Tfd2v+#jWz zWfNI=A(1v@ZkgEG^9sA5YAGmH$Cy*Zy!cgUv#`$BMLiq5SaVfV%MYeS+8QWtBV%nh zd!$_bhJU41~Q`xOuG%rzVK|#&(75V89==bjsN2OlaSw1jF1#c}* z&HKSeASbnq19DQ6cjd4PB|vfqd<~-bA2~BwRW>zSya-Cg@Uu&K?`c11Ew!C^!YDUp zFSf>jV9{Ag!4GSk)pLfFuWUcJ^!Uwt9B5+d^}kraBh_B1 z;U_NLod_Q7G=-jn?|c%)hYnC>-Lutl^v5OGQ2!6C=t6UQG5o05!B@WG@VGkrk==Y% z27wk6Vk@R6e#El0`MU)6S6+)nyJD9r_KijA+1BpXAvHDsZq!lORRRL}T1xl*kC53Q zhhp-`?pg+KyHwfsj&*(@@hf%0FVa+zkxRI!42W*DTtk@Mp^}TrM^7@>-@qs%e?VZvOVtTXt`EO%eRY5DVohSl6PRx zj3e{@qnGQ9(aAqoZIr&ef5FW5J7;T*?Az8Z0PY^v7(KD}Juph^tgjdr*_~FlH2LDv zNpD@%pZRn3yngwcQ|HrP9@AG=jfJ>z%snDY_E><_|Ey|E4q>a8sYhUZK`YiItU%Y4xM5~*ae2;Cb^GF5q4-z2%;JV8{x)8%e zU+TJ|92vXX zk2Na6JdlmyWT#+u<8<8xx?+#nms=%Yq!D9oOj*375FF+io#=c@=a=3na z7avNUc<5u2=?=28(-%((z@HtCL`C4h05qbKR4J#3U zD495}2g>|L;%(1sVCXI6)>0^{MP7u$XZ@UjJvy28;LL0Op^sF8)_6O>{RBPMVO|D} z6$2=x3z;9HBlrwRIHEuP^tWGks(T1S1K6)y>*TXD@$MhMEIeNQtuTBEVxZE<29ad7tQn*e|pv(23p%j@Hu9ZI%e*U$+YOvFmLXGxmtHe5txvX z(B{BT)Du$xn*2?6=9~3P^u$)lt9JX+xYSZ1$Z+`am4+z(_pfy?VnH)Otu4w|b;7-; zXtNreirM>mj#y5#v@z)prX(K9xPBbL-q5OiPm#j#eRLd(5cM?4eZIT7cL$qb@tUmV zg0;iclvPqnb!AP{B@il~alJyIl>>|K#$0T=-LBKjBIo^<*OluWPaKHhhCUEt_@>o5 zSh}aVQ5`;|n;kOFA=Bs`nfXo_70AvA9vl2$pfq6v_y`_=kC+Fz2qWOTCadi^E$)lZ z@nx(F&t34KMEH`e5pUtI7S!~xnu@>dCh@29GU3`G%@ z8aG$&R$RzBV{3zwBP-gmdLH3;>|W~^Zc;UzE-^-OctbQj8c=8h!G6En^)gS)X=H|! z%X#qoTDxZ+^V}{ME10Ot1_{hr(a6>|;ql}}6(O3cqLv#7fyj4gkmd->JXc!g9mM6a z4^Gpx>zSYiHYf$aXZ@@>$nl_e$Bh?ZjFOG$cJW@0K(%%DLy@K%mfp;^NV)Yz0@zF5 zVlaO(m^WXZujbN&Vdcd;eNbFdX!W|n1V!P-(xl_;AgyERPD%XEGb3Cc7tZ>A(~l(1 z;t0hC|Mk=Dai+%Ihn{aAQx|n6ZrD0S#T#?zka+7VrzbJLiKgg&J@o_@513OVXzrXc z$=v)R5l&HlyF8a4P5+{y(8Wm{yUCp%waSa0gnQ1bn@{oIqlqeBX3GQk5_deG7G%Ov9wnXZ|10dmjR}b5MM};b3>i_I`WR=DSyt+zA zOw@doq7^YBef90vuTc4zb$6JiGM~V4*jycmG*SVJXhM)zm3)GimoVN(N|7zTy)pvj zvdm>QaRMjoTegT$0yr8&FS~_6;9L?PQG~6oY(GdByPNTA@T^@>b;X&F`S`@ zQ@Af6v}=_YlDouc?)gq124NKz4E>SHy4FwTvQCd_K6Qq1sI<*v41OKhjMg|ExlUxC%SCHQ*FL3tNL7-pq{ouvly|U)Mof0 z;}P|?>KL3Oxo;kGs9}h$(G!`;xyMgglU-!vS})wcNQ&LoOj>~PyN*63L9j^jeLT9D z$?>JcY@=}fPU#%uwQZy2wq_l*6niwSJr@Hirbd8?c|o8>j@|3#ccX?)s*RouoB$mX z4bUMfjUIQ@+6vws58@vLOHT&Az@SFM0acStgWBt>iDwa0P)g&%-^$bSA4W|t~G~NaJ-Nzds;QFB`x=YEQPTw5^r%^7F7mKT^db+H-rBaYSZY3 zRCqJ=OFC|^WvjW>CJrtl{f25eBQa>{o2ANvpZ{MAApN4iDTAt$G8j5Z(6|5s<~O5X zD?sW4{jQhcK1ctAB{I@^F0KLKgt(-2gdXUYDoKPN&6m!e+p#b5>DbT zPgH0yF0ZrX$h2+Os9st;bC#>ZOXYdg3X^=PaGlN?nup_qcRN+VF&{>BaIqsIT6C7$ zXxok!+$&ifT~*`XiWFE<8%0HuyCfnW);&XtLv`1&8Uit9&CV|ecULjGy;~s3uxTl z>giyUE@{cg)V?Ii9+NE7uGsRr?;r$@iY%gr85nB?T&%EJ004>D0@q5Mx$vqH2I=~A`nztJ_kn=ie=*P2+mU@?{ z@L0zCEjtchnSy?rYJA2A;ujeZx`4l)C`JAJi38w2PO?49?zs2p+mz{yzf=uo!-PP+mK< zP~3y;Qik5Ap~WlZqn~aopsLGBDr|3vW{s{bIojSaM|NHP=G)H|*?L>a$Tag9xK*V? zgJbLJq%Kx?Qb=2RA6h4pl#4VsJ3m|WL5ZZv4MELgJdeoVPT-!c>j7bhmM;~bm-m}( zljN`d^}BBzjBqYRu<2dLNJ9(eJopmeYI~>0`O)g5S98)6H&-KiSIbxHYCVGQG9+cr zcmJ$snlf$gaAn ztRJW>8%$!_$)1{DBu5pWB0>mP_cu^_TGqAk;I+odqUt&(2;5z8;Z zq9*M;fj&V6n53S@zh~@z>lKdhDP~#?zdSK!87^oUmC?v!4em5=K~Ea`Tn!295P(tL zyoA7G=%!FCbW zzN;pv4D#mAVdhEz*?fueo%c*L77#+%)y~4Liy43_+A-iG4gvDrPllgXI7zg)Y-v*2 zP#d`P_$2AC+Nu|ZGIl=sWtKdVsXWkM0LoTv%D{M=@~rW5A`f!_l4BN3j2e2w|ah`3MrEtJgS#=p6?9i zrg*kQf)<`ON-B9Zz4Ve$@{)LYZEa;DoGjot|2i~9+xW>-4GCr}u;%M_ar7ZKXRL&C z(BIg@IG71a7s$R-`rNwVU%FQwqNG@yFZE_D_4Z{Z7onLgrnjV1vyXz2!<9Ws84}7@ z{|vV-W^dwN88>6U>%DpoKop_>0p7Qc0K{|t4j4lQU<`K#A(jvjRv?fl9H!Sz1+wqY z;b17@sZ-Kr^oPIPvwwOW{tan8HrJh77pac2>f}*tPGx#T}&sBuQpm&$#R}4ABfO+kf#S zK#&<%(%d*Ll2>!IZ^En(eTcr_-3!1<1j&%4et@IkzDufu8aZV6e#(oQbMoa=`NhnC ze5Ud{@M%$`RZ*rO=!|L$LH2yW9GZw{8T=z@4(%~lk=WzYm>Jp!DvUE0e-uWOSU^b6 z2J=kW+t{tqyhVo($Y)b^qIX|HMY`DY4k@#XVrfhqGtvoJUDCBmRCon2TpJ z+i*?@DRAS2PhT2t>kS|K(P&7k&vAdOlo>xm+DjRSe#(RyksVO#tVgip`9Tw-!KJZu zJM5kg0ViEAY!hG9&FUZY7z2UgqvQ4HKSP!njlDnOo}h9D4hoj*q1OO2K2{5_UVwhJ zo?#iL1p?Z-JE=7ETQo;qe-_;Loi1vU4G0`>3*J%v7d~(`?SUXyRUFdjvM;_|c zsqFUtOP^c&VDYH#w<=tRChCbs3O1OE2D#%l{+c!&>GKWYlYsQ0)eYV-8KF2BmDW4* zMBkS?Sr?+=KQG0ihv%|06opQ5{3crmcnus53jD*_U9i*P`2VBot;3@HzAsQf8YCp8 zK^i2aTe?dTkq+t3p}SiUX%LidkQ_RtTR<4PVP@!#`{L*OyZ5;~j69Ej&HL`N_g;Ig zb@S28`j`1^9IBzY-4qrYJoe$xoh$n5Exqga;LTe;$k z7iq~6xF%$%0x+@pi{oH(=hNk9h9a(|hhG1J%BOhgFuDJ<;PrHC`0E$Q9~F8i|2-4c zQ<#y#Y(47n0GoWaSKyaBDwyqSPRS^5Ui$%+|Hln##5ob_nT~9~@26#M&#&00TnnQ= zw3vj7i0BHV8(S=u#1GnXSg7d13cAazBPD-%ry3&US#T5HZSfVo{&RCSW+eUMVcCGq z_cBWOJ4=|OKL#+pHfJW62Ry1`u3ePsmz{DN5wzCbOSu%J?P2E~fB?z_T;*KOFYz?v z2DFWAFIKhT`QoaG|2#b%29P4{lA1?xz#_M4RW8%TjaRHpbmt5yj?ZDPc(&3F|f7zsx-%eDfe4j0VfWds^uu9 zsUX-e>=OoU?}eLzrIlw|-kOQ_NA0VFod8u{+BLQgL zr_c(KTQa8fAui#Gai1!KRn8SdzqOi;h<>lfdS%k^F*)`zsn6z%-0khoF;$LB`J?ci zqg^h?EU`FSYVzX$Ny`APnTfHmwVJl$3mGMYIn)~q0D}$bi^Iw+wbz64+mv^@)<&RH zwKVk#0w3z8h;!=@amV0kD1JQJ$0O2|@vs7RlJ|ogK!&C(gN)1m{QYb%T0M9?VKcas z-eL+=?~3`iL>9AT9+&~jM?Nv-IZ+v><>lN*kN45@ebc?;*}nBy4I6kZ&Z!gii&pVH z`?$-mL~21rXs=QV57doT^fPdVT^zz`sRnUZ0?UOEauBPykBhX^~TgK?zoR5 zqI)$ayai77GRGWM`3M8N=mu@|W}UYfBBV6_4}=Rr;x_@uBD_TxU_o&V?~u?oy{OPu z+;CtF0F<%%SO3f)0I&KQc^IwT!I65!K=&4ft3{ZYzbC$t8 zh}#T)su(SpLFtXn0ortTRMxuj9fNq!cI_H#$17*KOD!ixKzPXj_EkT?;E&G)DvdUP zvwr6GSOYCMqVnMGT0OVAsTy>iH4fityIi(3c7pT4l{}#%EPwcajIeVM z`Na?OvgnLQTS?g?B8*Xq3|&poOrOT=X2@B}i-fd^F&8lF5T~kT&vUQd%K-O~{Dt_i zSCpUNO5Bn5SXBgb0}%cW_8?&PqW;`BE&=acss)5qBm1v+$ITf35db)>aBVD*at9l!ZG{7$J@Rp}*IMCs7uK6{Pm=uE>qkhif&j_kO^;Ai#q(3pBx7j+JnqlD@UV_qaq~C;Y>FtcQN1SmPZ-zsKfBLI+7-mfu>au{^zN!~$1trbU4;OM zG6LHwllL)p&Tm#WiCaV+eqHed7w~1PN_%6>{PlY`ec&81*D~b2eZT^<>BsftXL{;I zWGQZNVl+vBHjwRx#3=%_fig=|ebdl=!&=hVsop2K+OpWs+LOwM!O-tDdp2gXkg?LD z?AW!}dv^vbvJ*pq=LMZ4$&E0{Q|sXM8(6Q_7M#&>PY%VBPUilW;KJt6Z|xm?UzDDm4%||JKi~{(>NQT@JZnZR>H*vK>Wn_W}q#`&4}phAoiMZm;dr<+VtOHds~Z7$b;Y{}*GoLS1d&#vQ!0pk=t^^1}3 zq5+%1^-aGj#m)lRuOEbJ_-imG2bJZW^%4S7;HXd;=uaw&!|khoz-cQHkR~E6Chh7| zN3~Yw?f8O6b*BL?6%i=M#FP;NaS;^U+A-pmU3;sQVx9T>tJiAtizx4McV@9-8|}I9 z=Z)E`g9eI6bnAW?Gmw84pB|HH$?j8$%zCv@k-Zdsek`{`QD}JMQxUpV(j6;PlOgt$ zs+yN~3EP9`moTraH>yvrBw=s#*Qo;%;6O(Us+FY|Eg#w(bw@pRuc1Zkk3H&uwo2${ zNV^p8XpOSC!8kV;lCF>>&Z~4-Uw506ym6jHxj!J#@e5wVx}`WlPJaj)`Tu34Vw<}q z!KnIE%z%`X2U2op>qy0rr-@j2q|gUmSx{)klV)H>4_4|NBl1%vk7IBoiCI?5w;;DF zkm&{yv;W*38^9oW;iki)!hllWcOs0!(M#pRCMY+?Y%hNmv?P~e!4Qgzdr;Z zv4w`wnHlNALaKF_=9g42E!^BQb%7FX(CvbE#6@erF8SEbr<3{33{ z=QSVzYW(%ZHq>vNC3BpogTlnlDPeRPuqSBEp7M!G%{&8$BY;2hdKbbP%A67kCeK6$ zgBZJD`_AuIrCpQ6{owGr);FHJXK$=8Pp!P+?rLU2`h2%Y+J(mS(QA;YYt-fDk$vP`i`3E ztsl?>MPWrIj_l;{6U^m4^yM(~rGrc&xLw5}Kjn(P**Oz6p`V(!8~P%g$^U_VS2zfa zt3X+{q#AX0af(n)w9j%W919GQve^doygnQPc_8|GEyzBt`VTaO-^l(T;)18+Fb+ zoCO4RXN1;#k*Z$FisqmDl0>z;EeexjiJ@XPRy=|iRN?6<=#??hJ zc@N^@x88d=5tD2m*3Q$c$y(hX*gF8>EPp)RP=_vk&;>e1AO9{ZO|W__zI-eh+^ z@;~DUPz$6Y2Y$lpoO$0HnDMy7zd3=-lASKg0PfR|_Kojmi?qU`kC-Rx!eCXZS|TXg zC;^95Xe^9GXs$hUyj*3T*S@)l9KNMpo_p^5ozASGG~JEqac+h@%f@K?M|*^9HczSp zlQq=fk_Kn_G|$m?RIoGss~jNH!S+yMU=qG#`w7cE$KQ^Ft;jw{p#8>ieEs5}Sv02r z2oQREpZSPYmJ)mNtp&*udlliVJq3-xjJm_;qrHF~pO&{(OAbH7F4jTeLJBV~0DHlS zI4K~(abS4GXukl!=RRX4@NhS@fCuUIzZf-vYk(N>9TM*P8_r-K8QkKR(*@6&?V%66 zJC$82N+1`vxbtK85!NKy{Zqjr3li@)_Q=lh#m*jbzyl6sqL8aAi?#Up$-U7PZ0|M~ zzl;dJ3jB$e@1<{~V>^Et?a-JB`1BJc0#4*zn)L^FMB+z%KZgP4C?iBb9m#8_3cqPU zTA|FN(M9q96ZafvVg=H7^4D8)V4PDv%_v^<9zGlQTnj}&BcY#wh`j8>Z}>v~avxlc z@{CXh6%JlI9De`QDwO}Krw!iTV=_~ zNvF69u2KB`Pbic^KW>$KJx?M^?^9E>d94pS+J`e%2NkJ0ELTP0^Yp<#uFrgd`i zxZ5BTi~BzN+LqM76caA+n6U$8!u#~>>Ao@V6Yk}O)=?%1iHB%^!3D=pAokwVz+tT` zk3AADz-D_!_;Q{Ga|biG5i^%q$M3T{It0Yr)U^k3K(u=Ka<>P{>Il`E=3Q=aihq2# zRUZ0uqR^zy^RIm=Ayn9(S8pzgz1pn-(>X z6gSZYOhdp_m!WwJt#dr1eMhDYg@bZq0~IDAa z2k|asfv?Yx0o<2|;qfu`UE+IV8@&LVlCN(88JV{-jFI^eAI47^b9&6ug4ySO6q_mT zfQ7#f4=#|SY(-&l_NRF2i$V~lAP?buT`KijmDJD zGcic)^XFW3)mkT_Qww&3JBP%;@ksqjRO*o~DYrfqPmD6Kzd-6x^=ZVMwmB~x)jwEJ zasM`|H9W5Z0cSoLG?h0ZT8IoWbx3tc(Ztg8cLiI`R(cMW{WjoP_D7B}MQO?rF=UMc z$*Yd2jC&_vzlr%QxD>_#5dnrW0K+Aw9A*p&aa20sxR^vF`Y&6@R=G|#(XYNHi_hVl z@Q3o}*)|U1TznDrPdm%Q=VCnywkG{oyKt+oVFyir1b{?XH_-1V_$1wU38R`k9_0gu zu+rrLD zC3cY4=a)3VpCGdD|Fcqw35l+hx!N)`PD``BT&Ky+-gtK?j_3n-`0m^@kX02S>nKnf z>jP`4-5X-s9hBc29QgVE5^>R~o_hznaP0hE7@#7_vKBYifJ4HvgnYgMS5m`PItC6$ zu+>obtDPwNmRv%cx6lKwFEF#A(5HAT%_$p!NH|>KQwaj&*{|7F4W559H_Ld32cU-f z3zr`#PkjXFg$GuJPM|t>xI@^J#^1>6U9H!%R?a>C(hpJkJ*Vi!1nf!RKT6Wj3&2F9 z_@tlf?{SaoP0fY3?00%>wLILxk!8XI9N2S6rJm$U8Ixs`(0byi85{hACliw=W&gAA z0!wxa?tC@pP;-2?NVPH`WMm?@%Jxhlte7GLzqeHmZ_Ijr4nz!MKYtrW9D-$Ff@xr~ zPNE)S57<5iz)iuHEWtiv(O-P(5k}iy{(xTiB^4!n_>6OFf_Ariye|BmmuwFP(V+)! zVggzT)!w=R`BdNSDvHZsVM__yQ?q<>SoQ-B%cl_iO&fW+G-}`B%k$Cme7RBY{Vy>b zKeRIv2@hK^Tvm55K3qA6tL_0R!Xq)Mso+F=fp^IvX^0jV$uv@4WjS7b%l`$^oWT>QaUeX*Q%tt^b<*irU1;iz~9lb^nJF>g7BL3eFVVZ#JpqshVUmlEVWM&aM>tf|vD3xB=5f(g7T$K`PmsF~*iBoQ8`B|JxxzSd|`q zChM2%1ljkyyh@oGEjf=JHkYCB46i%Yd>37YVrOx#&Y9cw|Llfa!!eK;hQ4?(l zw08u-dRp(S*`H0>GVeMjEp&eL|0|OwR0$D3I#fEZqJui%Zo8R>=(*=XM*rk7H)9cXid)XWR^>d!za$K`@<_(W z-sl=?ivV~kv=S&`z8gTI0s@pnj1hQ%Lf1Z{c}%9Q=!%@C z-so!X8d>t0L`l0AH#EKn5FP-z8r9di8)i4TgsLg83Zx6+!SDM&QH(Ktas^qWFItFgt(>I50qS0vI0D z*k!>nEyQG+darDH?7H55S=mi+;;XmD3^gLYbtk>Y-_M` z*m_<-B8uZ2tfC+Eoh9O7iP0<_own@EXE)!)v@n;vOPV39C3oWMx{4{;9)uBifgp#K z^~p0g)ykC7Egk(&=FVHQl`JVUE7Pi-M&3J^2B{zYH2qSRXB6z+L-#IFprKcmKR|OJ0wx2`+FW)&9^&cmh2X&nr)UJSZ;RjM=V}3sHA`5i0D!j9}7 zH+E4q#70&JlVwC0N_hG?ydAML&u(m>h|83nDcITq38SMd+8aEc#En3=LP6VYv@XA z531n(_7ni7(-`|ryX3E1j0c1uiBAJ-_c_)a9|;{foTv{NZ^U*dD;kG-2W5G zLgxWcLk?`;IY>nYV941-xg6G%5LWM2T>9PY1ExhI|Tf`qO?);>FMx7-cCL5puTho?o$ysji za`eB}j3}X4(#x3rqv~=Aqj?z$fRiB5#A1>>^*NSB1HwzLWxsu#t3DiZw~Q)xJStO{ z*x8}>Giv#_@#?kQf6YXpCkK^=FXsG5IzU=b9EShF0SUNP-@c3+z7V9g1#$h_w@AiT zmeQ&j1gD6Vso|r!Q}B@hul;$^3W6<>eyvw}hH6xS|i7eG3;1%LnQG zW?w;^OPWXLH_S#=2}%Py!cK*LQMlekL*kDnwaILm(nMKb@I?MC{tW1M%Q`_rxTJc4 zpwi_1!rT@0C_&3D0*X!^&2=SC?K8ihI0<=580C(y1m@+vO}}>bqz{cWcPR?MZ|Hz* z0MwybK+pI$=X)>$b7Va*M{)xnaRBqTpJhZREMhMG&X6hp%X!DBDgg@lA&QR8oo4Vu zqERt31(9ao#%yv?ws$&+HUIQN!6GbZiLrXN{uVGv&88x4^-X;RgeY^mHksXH-`=jj zPW8@3_HOWJAUyV;g2|p*TNT)$cya5%)}8kq3A`!<2?Np`sUo{2gwP%VBTLiIX~2OE z-@np*Q>kr#X>MYka+_c=NOJM9y1A)#sAs_oI5+FDP6nt)&N(wf=*|;>AwlMvkwADL zWYMvo8Bk@UY*-GIdEA~x{tY0nZFRIM@ATG?sxqgs_a-xpItDV=&EU_Lp*h>Ypg1Ul zYuk)K#y$);Zau0hr~S7WAJQ#5CanY6 zayp6B@zQc$-OUoc`4RG24posdli3F+{fi`qXNOGi^7%gv0$?}+v-dgRFbE+6ru}t` zf7{$LfW1ZJ3CKXM0QvHMLZg*{Iq@S`ra;q|ihGy%0`ifY+qCn`6nB41@v-AgQG|m^ z8iA0FO>EHMMiUgNXW;{2HuB8=^BQL%KBOOznu$PYpL%3{Xh$_X;&9kLq#Qi$R9J9| z&;g+s?L8P`PuEyAzB}7A1$#u105s&x+{*Z&%6-+sgoGePbvb9^Wn{Oc-aoEX(w+Q#2nLC8*MVj*g^?stvigzWO^JH;=$# z8xSX!8J8!Ng)J+%)F1~;iAnYw08dk3=aW)dyz5f*^10oc^@KN*4VowDpB6t05qxHy z?Stx2|G_a>4=Y9mTp@*KKg%YX&2rZqUZ=jg>jO2-3FLab9N<+*NT|N6OQ?~O1a3Nr zp5VX6gP*V>wAd4*<@DfODMHO~8mc6PGpG?TyywvVvyc79mA&S5o#S&p0-z-TFAZ`5 z&7X9MjN*76yT#7ILiHP_u-dc37h*}DyvSfV*x1|~aLzqngN0Bmmhf8Jv+exd!?s~> zHs?SuN8IU$2NJ1M#p&_js>}3_43uChU#bOaI zr}r0`Lon)+qA34=9ntxicm9u(>T5&})0>bvjwwn9`8jM~aoh%b9=^uTj)yh%-Xuj{ zUQ{0+L9Z)3KsrK5E9_dE#828AX-8U4w`+K(E*nYmlWIwHm*rRJ6{I92Cm1h32=Fw} zh9(Mss44h#Adp$07!NGN5MW74mxY7%_~!3xkr+W)k`^ZhtrnuDIxD?1`vGPKaAflAB;1h!$Fu1I1<=?9`27%#Hn2ZiiiRu5Q9NL7*=^9$h(| zX2s!27mh2PC_SER_^=G~mnkax#lB|4-|52t`yFHNJN{ma&OtYfZw@EFvf z!X>9}Z`*M$Sw$`}BlrbrR=*l%+x-@{;qgUSw7u%UG6GHGcR~h4Vd6heDKHIrP4)dp z)d1r+P%Z%D$~~|J-0az4U?yNzmSj~doTXgG z7G_P(T+wYV=#Zq57sjSb0fAUw#A0u8X)qaaK2YNjQX?anfL_vmM9E;uFCKQn623{e z&c?ZRxq|+F_L-0qX1<{_C|_fQu}cJj-ggNe`{(id`ruy6ceC9S5~_ z(0OKAVb=cH<1wv@qRhh~{g9b7mqGS5@$cMR$%i}a&3nQb1=2#_8*=%Jzp|l@D+fsl zFPH|tgM7F*A;Q>R$&k%&+mtoJg$5|BUh?IKiZU`4UHgz3c5KihRtO|JqRYX@yXNHk zFz>{VS%Hai47wy2WQ=AsMIj_rJJ@=$e?@HBf;{@Zxt*t(4tji7F^}t_i zylmyCF*b@f9$t+2N)g1u%U{c7xYW}uWmX0uz(-VPJr%qbG2cF_-fvjB+kCy-64W=# zXLoogH7(*A6nmRMwej#{U^n4nohviMM$+nj`#vJgITMepbp;PNU)8VLTLAb|CsZI9 zPq57-Y!aXQz7)i>1f{_Cn3E5~QsgYh$q1+TdDisDVvi z<(F_mkJ~wc_hZOS+oXI?~vTLY5YhP)H15?3ym{m;+MqnV8WuTH~SWXx+mT>E+3KJ8{ znOf12jn&2J01>4;h@bi0z5E&Na))RTFA2Xe`3-g_J!v2=^L#o`8J`cg2XfKv1hO=# zUi3G_cF+Af%*&-C)M>nhfQtMRB1tbQHlONah)J0H$5<#1>zePY?90aPX$5cZePK0z zE&Y*-d?V*=`c#rVyy}Cfb!THdhQY-tSGIie#bwflHg5F7sK{^fxk=IrY;?sb2ngni za#FCacmd20q6>A$kr@LjYYQqQ&jJzgIjUO-HD5Wv%$>!k96$oUO}CT^_8SzqB6FP3 z-ZiKMEVfMRFkP<3X%vjZLS&A9Bs%IuP(3P+=iQinIfrkUWN|LE}>Whrw0D} z$%BEeZd_q|#+Z_g^`D9&7W`W~ z1VX--1qYBeN0b=1RBm8qkOwSf_t?Fh*XT+Z}wg-|O(&cbl z!#eLrh|g$hgTu{-MnL|% zO{>Xw$D9O0AaP|(z@t5*`xB#CPV(c5#+lgJk;)Ru8vDAI^lW=Ig^XJH4>n>1JKhpDHHpmG06_JtJ$Ovf&(Mf18KO(RQ#fBE4 zwP^UH>@VD*h7Yss28W_`In#@sbEdIopjw<}lCr@;qesPvs~(@p%m=4ol{#bQR*@{9 zRK8xc`>C4i`!7X~_*$+7<`2h!*A$t(1jfEz{GBzR%Wv3^=}T0BQ8(LjrgYED|NgRw zEcsTDR7Q}r_iz*WoAz9FQ%gML^NSV--n!w}DID5d9ofBQX3wB7CHXbW+y43u9)6&# zXqK^W%8Z0%or(oU9wwkT3x_~<&bgN$%`LB&MgfqbMz&w6)@djd+IBK6TdI22qD*?W z#kDQbxuEf)R_C_vXdsGZX}o`p*sYbosQ+^|5g73;kBo1tMA&r?t()@1$H1r+oE2%A z%3ol%Z|}7b!7KvAf7%o*-On~?y`{;P+jGJW`8yz-tf@!Cc__WEi;bA9WLpFleQcOHQ zlh$HKUg%o$N(hAIaCU?nXAHnqR=U1}Y=QJ6!}ijP`OumPe4-*Fg-Oal$+M)e2HbG4 z2wD&I#e{Vb0pi=YRW#o}a_K9+(mPwL+YKwd%^j{VYi&&caw{(9WwGh~xKfBN{>NH2 zpm}0>J5XDL<~7$G1}C_+mj~W%A(&J|?#L@>Np^qy@@aQ{G6q@n1lOeXYhWbP2Ejr^ zg5HGLkr2^ ze`jq6Wk?*|(bOi?VjXIHtSH7jhT~w^TVZo0GxdrH)0Y#xX}^6 z9JKP`@xZg=MW@f=PNFuFw%Zba|2s-56W zK^HJaXCj14G>0k3v1%s_@5=QN{-xu2cn{YaE8*G#BqB@rE$mKZc4$MJr`3>@>gBry zA%S)6MX%yFn-Dr|uSQhqWtpd+8O8qv@L3212w)e?=Fk0XnT1k#{F)MGDb3o!Z#U^R z*zr1*1*Tr2aox{!6lApf5wSf=6%I(CJPRU%VXK)$hF6766FGvLW;e`&tm{saz~{Qw z0yXjKE+cZE=m1{TVlR*`wa*pOo}&PPHq&GDJi8~Q5^OP;=FKZ+9U?*@l9jx+zS7gw zsMONXG<>*Kk`1CkM@PLQjqSrbfOg$)$mZdq5lhW=ek$h-U|WkG7zNdTeAfYDouY-(X_C~B4*#}aR8`ENj2 zL19Tf(zgC@D-(6y;gnHn_EZzkHhG7YTj)6V5j8c?)M__Khy0OPDyH_NfEqQ#GV@JgANaxz+$21Tw4Fq68r$UH-O{jXR$W zkWtW}F4$NX09Wdii*HL>H~Sijs`f7?U0x(vuX=cr6$rDv8xD_FUii?fwWI1(@==3R z^37RBm!(J~qX53DgOs*mWvAguST(ml{@%l+*`g+7ti%E*i$ip5XITcqK#1A3as2(A zkayOF(Ze0>1B}U$ma5F3(;<`w{pj}_(OTb94~ub?)vg}{P2gVuN8Wtt`su}*^TMq^ z0F`Cb{~=0z{Mjc!wg2s@L!Ix1YFxh8Yz{nKYb#xZTcGBVzIgE8q@p_+HcOXhv2wUG zvBa_MEB*lamHoL7w=a<<#v2TFVI}u@!%y&LXlQtxPRgG$wGfjuhC0CSv?3c~WJ0pWO#kPCS2-1w4uSr$&xh~IKrZT5#8UxgqK zZ5UllC!7|Xhw?1YT1rbxq3=bK<74&y_)KvQrvqqY9Ex1NttumL@;mbhJQX_w2;v!l zAfDd1MWgZM`BVUIMH^5 zgYy*AX8k)5q;#JUrZip+r#x9{qM>qClC<45&YQLn!AKm*^DDI(HDUf}H#@=v3-=Mo zE%HM*?dN)=K4@RautfO!@!V{@@_RKmf2L9*9LuZBKqdm@s;BCP`bh>48T)yHvHRBU zrN6A^(RjcOLX}ZlY}t+l?M##9uOw#7CPALK7@p~3W=xl`_2i?b#pfO45fT9xLf_{2 z*@foVe%w=@y8c7JK(lgJOCz_wq~r16n0bnvX;Ws-{!ieE9nY)YmY?j-a|JD;z4CnB z618W1Gv9zs(3Bgsk-SN-bhAgSP+wORv`WrEZP<|(q4UbZGch?)*iAAiFfR?M%1#x} zn-ki7Qb-cw#~OY^c-6*a3u3P{X0Kem6+TL>k`^2RYiP=Nnm=mW{Zh; z;d$=tx0X4O?1s;>EE}`Y^$SzN$2V3X=UDW&qJCI$@cwi771i) z<(zz~T>=4uQ#t5M1{A$8=!*+xa-YFf?3nk(vYK?tv$J9^JMY^suGe4AWbh`G&~0VU zSU#PxEWnZ1_#)>|`l|P1e$Zt*n05tGNMU!*oID3m$^$xP9&>aM`bi%1$yz^aUq*gt zL}~yw!V$6S(KlE32rwjtF1R@aH6R$~rf=>f&dF3;ghj%s4Y)-EO){>|E<_s$ZasI< zRwCx6KP3<6RH6H)4X=Ty{bMWILK*CH6E4^7*i9AxT_+4&`-KZRiH&i6Gic+10}=_E z?uKA{5KI8bsc0 zgVH30a%{WLtx4lces3~RY|*7CL&`+a_`-a|K*YRDl#U;=jAAs;4A-Oa**ⅈPR+%%b=@g#Uz5R#pS_&&MF$LiivtYo*$Hc~ z3$rFL&w|+ea|EypE-ZXZ3&N4cs9zWlUK`ASp0Nt)k5zQqx(&!A%3Wg<@$^AkF5J61 zWmtlMIp9SO)lUfRPj?a^gfzV355JtZ-*`_i;;9k@nW8?JqTU|!D4ZwoE&VwidcYfc z(16_HI*NxP*lN4MJ+K3llmCGa10LY|F$)i3<(L@0OTESAt`5H={D)&piLgb8*R=4( zG}_hNr9^PPuIo5;?D^V_6?GYCx4~++ffxs+R6$6`+5_40?6zR zS5GiQp(8k`IJ!MDT;XliCzRFA=rETmVtOl9dTZ$58fO1`N%v``s7swDS>+3q=W*WsJn`Vor`3=@Kh)^#JX1g!&ZNS= zC}|Qkkl`&C0N<{dq;-0Cr>{L)nASTU%x{z~(O#|A+?U>yQxM$|6A>K;1W*s=wg;X3 zHXijjC9zyHf&@DHj3@c$d?Ul8JI(|dd$xV6f7$FuQYkfAdr{0E4&ZYj1ZG4}=;Emu z3Z=hiE7i39Uks@KivdI!Srk3qY!P&G+iaZCl%;3V1eRpN=vN4jcjAw7x>%rR?t{vT zFGXy23QpBbmJU?rw8hWXL9sC8a0n7-rz?IfSEwL_GfM_yOcn=lZ~mY-Z`nA#81r!D zj5#=V0)r)qlfpso#=Adqe%*sz6`#%ovZ=j5p>GEshZ8v z$m@6zQStOJ04Y;sRt;_=g~8a>Fg>2V)%<$w?nx%p$Tyy6iJ2K$+FJN=`VcdsR#%R< zKFrDn%QpFAHIMMz%xU(_#2+az*qAM2Q_95{2{>YeIW%8mizx;PJcH>QhJ8bDu)Crs z8JCaZZdUJ@|L64D_v#u9-2NhRdUbPQpH}$EeFeAU>c!*zTu0!c1H8$sU8nb{HbocI z7C_}*>30T3{$ma&8SRM*41X48?zRCPq!jZ?zh52EWlo~3?X9nnCM_G9(# zA@j{)GSfGgecM1|Vm}Zvut>Gq{KZcDwsO?)<36Kt+G4sPrteA%8hlJV3Ery7Cs+{? z{M%3{A%`5KJK6W+cJ@~I7& zRD)dwU(eiYNyV=^>|*myX3*yEb@MYSVJQEt1zVssA82R5o?{N60~`y88QjwjHRCYC3m!$H?b2bx*jETh?*QZ~nh zN8M{A{(xR!di?v|C5+BNLZ|bx>X)PDvS~?dfZyY*O-%XAV_tg2+E&%4%joFx)q1>s z%4Bzqp_mIARf&=#$IHo7A9I zM&7+NkZyEgCRj*Av72R=X@YdB?0;Bz_xTJAYzi&d$gpXiE%RuI4Aq-Y zCRo_vHEO*5Y2T$>BWgPo)YpI@4S`tFG9fk7hu&Y(J|-ARI#J(GjRWI}%SJrIEDl+L z&*#JYo1zKt44yqDn{H!~*$AMDm=OI}Nw_v46u>J7Dx>&EIa4SMX@Q~)1mXbZ;}8He zugw@YVi+$-#HMs6%0AC%N;Dd ztI}k}No7r~Fl7TsgRP~wo)d<&xi{{xkZ`pf33V^bMBPlQsvwj+aF?qZ+&1W5I(x`l zaQ~`DS1*`Z8WY>;oAambIWE#}YEJDt_e6WW^!6JW1w}7sz`5-m%;@1|hW}Y_eMG{? zqqboZTJ#F)L5`1vcd(v>FN1tLBKi|>TO}}%n=@2dnLxcii=Ey!ba^nloflfN-`R%% z^8i{1M17un<~ahA${kljH2l(DXDY`82@W4!b?DD`K1Ssp@#CE)|-R?K$9m>ZsPqbSmAAiwfHp%{(QDW@NGN&`YBkFo@d0Ha=h15zl*I7#Z!zE z4V>^s#IV0RgQQQ%EauL`c6Bl5BOLWOk5|R<$^32Q&8*hXJ7O05S5#_9DR7$Qfu@8N7`&;(rKwOT4gsbLF zf|UyvQqJ?C3kq1?&e5kWsBbkIsOp|VkkNRTg9Lv?uWR)Woqo%oE8I!*p=AW^!m3vU zly+D1zQwpXLly+yvNMLKdV`g^I_wlU8|P)I$AhDb@(!F|hXhBqC&;bsCyZu!?;d`1 z(74aH`aGQcMQsmYnEG`Aa7+Jw5PUwu8`wm~*#J-^4$u^iK$7?-1smat^?I&OBwg@I zclwCz95b(E9HWFclh@UAzH(mee(QL@F%Xs%S(SP>zm#f{G2UN%IrZjZYMj;aGMxAB z?)GKmKzXtrJCj-Wz`rF7oqK);S|ZFh6*q7k-ugmay!(ANCH(F zq7~ zJQ`v3uzRN|;M!ixx4r`$(-OWG7eTtL8)!v3(9kC2Ut`g z=6TkUSNhY7{+n(+Z4V%h*`jkPKoRryVI^>&B@Me<)%C+kujo+SfKWM2<~ zNXRd~Q^qVcJe85SRA=W>^f?TkzhSlK3x-8Nf%4@GzyRJd=l!JiY+$1x)j&720DcG2 z-@Q^)W%@ut4Jdjl(|-e$Ce90UL*oCp*q_9JZ1$%{i&p*AXd$712GR!{4-Oz5e>EJS z)BdIGH8m#u1nR8i7i$SVNM{H=t2MW8NKWoy$x*`i=1K2afqYG2qj?keZD8YG~I2O0nN7~?Q@B<~P6yD9r{RONYy(A(4 z4&yRu!9856$&H(UnZdz$1{B$N^O0+}&OwE{YUt{bpYv6L4iEnr7wD9b?Zv}s9hFML zS8g6{xufRqpc1<88cEfeE*r-UXa!1sgQlsUX_i0Uw-i|+EqCC{H5kJ$)z~8Qqj*Ay zMpVDz;be&_H>Y~gX4^l&7g>TF^*Y`Fe1GzrKbL_59MsLK6qKIt{JMEN?!hERw%RD| z?zto-)E$PG4>{Rl%=dm=25}wkD6=8c6CVulK~X(ueQ)GD8pAj$+Tc}^=5=Y!G+-J z^kqSnnxXkDYt!wuB5cqc?Se#neMy;yIlScWG0_{r+aoNB4nr}azJHXjo?ctJuA>`Q zd=+e2!e!CJlseqxZMnzm28|l6{s<%APnQqU_uTYT*1O&t8@n)qSU-UJ(6n6lRRbFF zz6?8+bewS$xQ=_?9&TCUuh=z?M#4?>%j0-mt1ls7xivJ)qoqb5yhTs`zhSCrO?JZZ zEujkG@C)Ai&#!U;cH<{&0zEdt)tOr28cbLPTieOL5TR;7)PINUjTc5P7f6E zpZ-W?Cr5#m-R1tK^jqM7^UUy)V!X{%>4xBs;dt<{X1#mqp3|zH>CiUZDx=`FvPbFO z&H#U8bfgy@zT_!g58-14vVv!5uv_Pky zcR3&cM}hfH@^jZb*YuKk<6Nlu z;S?$N%hmW+K779pNvYFy5Eptb{S@YFF!W%?x;=C?Q1`qWY*`v$hbH$rHC#y zeO$#mZnv7gJ)VW!GJo7Rn%NSN@WLvzUSE;8Ve?1^uDNqh+gPXhw=iTj+11#7_5|}o zfib-T7^Zeis~0^cJ5rGii0&?r7tsMdqd_Dnn&1t!~5 zvp?5+t4KNs2!%#fJxa$?U`R&GfL&BFZ z#sgB+*wOpa%sw7zcY*puf{y!X^!Iogf+7nO+-dRde1c7jQ~{Sb>*6iCuE{38d01ClB+5 zgNz0Ha}fAB(cGJ10PeuAoIn?A8}K_?+jKmqc@Z6VA4eN-SX&K~G+wp1`#Ir23?4$3 zmm4_=%(vG`;ES|kQsi3DK9-;3;URw;Zi|VrvwKCJ*+W9Wy%@lUclg~7pkMhur_2-< z4Yl^T*ukcw6Is(Id|JY8?Ca7MpXc(qu|ZG4&o0aCfs_!XzUqchY4%CPFW2xc8O$tQ zrH;mU1~?YxIbBZlw>ds0@}LJt<>{QG*fw4O6m&dIS`+`Yj@+?Vz7-OllWSK3u46dx z|A@Cndr@k?byh-n-QDUj=Gf{c9A6`)^owuuzgy75iZG_qlx!vLIq15OxR;h5@bxJl z$LiS$(_+ot^|Zm!K5=;ZRCb>j3{-FdxQYp6PH%A#aVj%Istqqp1`_Yz%LJCKd?PSg zOwq1tZ?a=n_9K0$?`3@nsIc8;Hs9*48N!?N*P|dFVmK z1bjso4B?02U9nzKCftN}D+cO5YLKPo%z=;E7+0gK*Al9~6ANyY?-^Zf3*uqn)u%hb zAI~uFmizm2*`fpG^$g3QLmGT*nH@ymT}f|cvRr4GY!Yh>{oGxF~ zHBvIr?(t0-t>IJGE#Pgnyo}j#!x>|+qXf`@#G1p7)4SqZ7JO8Ho;!pd@q=Z{M%?gY z6H~Hc?xfMTAW&rZhgL5JBc8O@fYtEAQ?EW}ivhCXmsH#IzMed>(L*a0AF@DbG^NSu zBc1aSq4O)Qn;v^9FL#YNdq%SS=}t6F95w$RqTT{3%J2Ig9zwc7QaS}CrKC#~1wmSd zMo>D398yB*5~M=~2?>P(h8`LTMYN zDxS>G+8Xp-dY+T`O5%f38^u32X3>+G#irdm4I9JZx6WYRN9_aXQhbyAEzeG$o8^+hSy9x|GcGu9``X57vJ=rytpV ziyNUcpxpW#By!@e1`LES%a50>B>H&Vx99q(TiuzOi|`ApY4{oP=^eRsgyk-jHbHi2lJz`Lp0Yd%XJNUf@u>Hp&l#c!mLhT$Gcq9bD zt^qbC_q?)Pbn7xh(1VGjCzei|j70exRp)OTA||f>i!&izH)aCoEcQ1IcAc4# z2D`Sv;yq33rt3i~&sWN>lx~u>J{^8f#AgNe3Pv*JO0ov?X!a@I zoqv6C;v(^JXT4q*KPvFgi;*FfqV5F55eS<1nM-|41Q7RzBEMqd5_2%f5&<{hAPi=J zk$B@cG-H*W#Rt}2Hu|Av|4YSR*A(2Gm7&F%%`V#Bw}$^A`gv*XwIf7-e^CA+OKHV= zqu{ltAu5wW+02Ze4qk`zy$cf!iP}ltdR*nSlQeFU@@gI(gDOl<4@$9 z-6N-4Nb{yebTzttw^mT`xmkC@jZ4mRLLV>a``cEsX7hF5oFTb$q#{uPB#-WiNDNOH z1(_R#v84+Sz*0zE1=r^pqT=%5p2SPnr#D~o=aN7T2bG`Z@fqp=f7+<$w!p9J&p#s0VFPF~$gwjk zpqKQJrK9ZJpM^nA1<#sjvpa`( z(`=S5-czl0JxUxmRwUqpqg3Ns|Xeir&t2n>S(lOoV&)lkTZOy6u$1ip~V#B-g z5nF!_6Q?`(L)LPFWC*=v2v6pluwFUORKq&ohVEV9yk2Kj6ej7P`Ut$&v>$M0!JHT$PhXPu!k3Xu+g zZ5);1jE;)htUeg_O}^}9p>;2d!rWw+9ddy88Mqsn$B5TRB=-co+>Us>&}2_z><(Yf z;KRBq3f22t7xS#lcNq=#$3|}jPWALp*OS(k7V=$Z?9jnp1y~ob zbNW9#7)!E;O6qHHx)TBS_us2Ke^lu|D;X>fB%P4qA{*Dc2Lx1Q_%&9FU>y`WVN?2kL+NI=4L7}Sp6PX_1d7#SvTWirk zVB>KayST8<_*I)DQSxKSj2Qur>gZk51|#tWQ@+&wg&#!V4ibtz@mg*5CjPhfuj6Ph+M7cl^tQB^HkJ*>~v;!i?ZiI;bR3>k3!>lT&M(l$D%nz_5s-5Nna zXvsX1yt>b774RCZ130=AwekX-(PJEeX8$mIHph$>81xU&%dubL^U=M0C$>27VKAA*pL zE{>h`ZNWCNvX?)5#(iiBb`X2mOM7bPn&uF=eQc(`F*H7MdY05aBzQj3$DGFhGcZGi zvp;xy+`^K+crHzTq}9_?Zk<+tZN`rZFA(1IO0r{i#{QTUsj9+S|K_TeTX$o?KLp-C z({r|SC1x~x^PF`XFL*YEDHqfMM?8`IyhPqD#Vv-Yc=O&R@?3T8lB_#XcZqlgpT2Xw zdP4Z~tED4Jr`|n&3u6F^ZJsL4x%9)phTTYq@3yv=L3OlDsN}G>Tzk*36g5VFQnDRL_iJ$S$*sxV7*ctDuqJj}ADpFtP z|4<+a*_fF+yE?d2F7r#y%e72VAopa?TBWDaks&$mF2QTeeQspj+1|&GSI|Vi9iLxO zgg>%e=!(>m`*qujcylJC=yck=Q5s|e)({J3MVntd@Q!HHgUK6e8>-obAU7Udcz zTS9~T&&JoyrovkSnXA2w-jyxFj1k&Rh7uz3#TJ$W<9k&lV3J5aww4&5NtF+P!M-D!Z$eHOmk^G5AbQA?*%z%ifg6( zZj9R!pKjRF_r^4dc@H-GQ;4@dyfxNTAvJ;Tw$}^!_V?JUco$A&{bF5j-SGO5dnV|b z7I(bY;0ECxS>@d#Nv%=*O(;f42jF#!o4X@`r~{sB^Pb@Yd!g44aKS0N4faP651APc zvZkMCHd<`!p8BT<`j_HO8t7lCNQO;Voc7>UrE@3K%a=jat!o`>j^gN1UH7hIadVslI_H9 zcg>HfN{TvtlXvX8t%P9$pD=lqG)8`f5Q{k_1E^s){howf+%RTSX2`^5G$FxyT~jA| ztM{LG`Hot_VUSG=PY0K~bj!k9eyB=p{&&~`M9wu(% z#4%$C zKuN#_oqz?Pr`QvgiqJF<8W|MPmTvvH%@2JU5S*CrY`6JnH&3!AJgk}W@zlXPcdy;j z`Wd4Pf9Cfu;rS|Uo?WdzMST7^MzYsKe4KL_-hj!bEK4-s-+h*tRa$2n;^!m z>vBKb-j*y4<-$XP&IW`)+%S8;^cl?by?EMk$^dkzRY9&0HGLf&nvIB%;30f9oy384 z%f?Db$DX2snRF1@GAfK${(q_$X`FTYDV*q$Z*jBjvoJtC0(+mnQlDS5?OC`8E!Nyh@;S$(yd+A?2+s01TEoM7};M-z2#S` zr>XE(UE&AR&xFA#Ntg9)8A2VL7@NzRjpkgZvJ{bL7I$*d)W!8d1Wqjv6rfZcKLQEh zlzC;X6I$)Er|8$8i%JUy!+p}&?vts^jamP9~7#Lv!@VY|7({CmTc7Vgzv_e z5mKKAy3<}eMfEdv-m67?H#ocyP7iPW{MM(m%l2;FEE4S;aO9OJMsvUK|8%2xHHzPg zuC`XA`QL^%*)Zx_7nywL9Gea^aye3Czo*#^fW_ZW@XX?4e9Fk1ESu#&i=Q@y{=*8u zh4lna4kn$n=s}cd`@QH~gpb5(5HZB<#wrv57UScgTfG4h#?3`}A2?h>5>tC~xE5xRDu4-X8irRzC9y3Rw_Hq2V& zhO$EYP|MDZd*znPo3o(5Ms+CV=7s|@fk&%0w2n)J1Abgd;018tr959Eox?_9qS)LZiYDT<+1J z@qz;?5&4(DUw~}ts8;~^nXEd}v`>MSTL(6Rs!Tf0dH`L4(#RIuCo9>V3Sy^mq zoH3~yaC!IdM5)A9n_%5Uh9kicMGWDPo!@QRt`IY)rY9)=@p6=z0YQgTTx_K~RWztQ zb-k_EJr8#c{;1B7l}%*r$Q2cmPFKLEsN=PbPObcE*dAE@dj872(VpqNSCq&L+#I9R zDx<(?&o@H~sd~9n&%%4j?5Qg}BfwO5U$^yresa8;06%!EaryJlWp!Go_4GF4B{GK# zM=Zr%?5ujGpO-B;$rLio-Q{_oy7jJK7TEBj?Esn6RqGMKw{B zYz%dlM5}51TdRdRl*)|155XgbIyd$ zogU4y*mr9&vBPcEd=jtc3hok~9Q7GRubXDxUUKnPradY>$_n&mw~yNQK`vT9Q42ro z77Ec=4=lDFp7zD`-~e!9Fx4buT?Go>BXyl9m4i23R52drc!I&K7L`oJ1cDz{DW190 zgC47l&U|MGLFtW{lw|s{Tdhu;Ud$*9NoF-s&xd`{rTgP7>2W*`LZPJ%HnNR}oHTKS zZw;4)raY7lknbU5ycHI9o?pIPa_fhn-<3K)?S9}kL9ITtn4>1gRp6J+^ShPTyn2dTQd7~MS8deJ;=6s zO}9yNJ13@^I1%q5?*^~;I>3c6R@Q=n zBDMJMLk|MuwSK(9LMQjw&}=jiKDvMZH$0Fh)WrLzetgh*c|LU{QhcCw79XGYe(n2h ziYxh`PkP>U=WM)-pl%Of!BOxpKfAm-gJSK%*CJj?6qWdi?ejl6#I|;5`4WscYa`u2 zyn8;(xh1jzTH}08BJ}|bOY?5c>3kst^YB?9EFD`-%HQP@#1*Fxw zc#oc+L`l)?PyWXJNr;6U?uhD>UW>Xc<(8xnBfFlYHs|}KXo5I2{y(Wk*Aw@5L z;f6rg>OZp~6CDd&)p9tz@`#G`up-C!aG1=a1{ZoJJHhc97e|+y$^DY-4EGyXv90_| zF}Ym5%OtDvC%a(%MwyQPi)arXe|O<_d%-n^cK$YMamT>0^?YD!+|~E^4sKf@wNX^D z*gg{XpXcym#5mjtfGxNx*G+$Jb8c;3L{}nTj~8UpA2DNNYY*Gdh%+Qvux;Mv;Fshb zCWS;`ZGV_Cnmo4Py^X50?D_d7i(=`EnhvR>Go7#q>`BblR&Qq=N8)p^ZHGQ62YV<}KJl}+=0r}p9pZY6Bdc}rSu!jux~bBn$`Vi##S%8^005y+pHDh$=K ztjh}RE^|ppP$H>*7O<`}8Y~Iniujbc&Dyje6VVzaY7TvDXz zlzS$_y`;7we9hf@b-T11&AZ9iW!U^6U|l4K^(K?~`wGTAyx_Ov@;5`?WUXuiPztuS zWqoqKvgYK7-dUt`xu6hC`xTn=Kj+OHdmtji8a@0iVz$J4nh?-<%fDO^reU*ylsq{f zb1U~gmkFBxu6UyRzA-A5S!fI<%O_wpGNi8V;g^7X7ry!g^UztDzuOMq3(KGLhp3lI zLxS%_`y5UEUVGG4V0N+HjXK@3Ll*NL53M$xGTJ{_Fo7}n?9A*(BOUI$`ilU90wcxR zu1LGo$C-mr95Pfci>@9w9#Dwu=95@+V!e_L-2U?OkYEpelGkjv%fucwcMKfPug^sN z-jq`QpJ!+P!IvD-m44pmAY;Bo;%zeYdC?h1vFoN{`$(AhwMGBnmgqgzZ`d66SR&lf zQ3i@l4q0LongbNlGb#XVfqrP&l#l3-P5nAfDLoNZ_73boBwGHGXfhIxsypu+aM}d!GJt$+(5Bl0 zL4Xt1eCt!_?MB*J$4Os-l3>rSaL=*u><>(z%ZQ8pxiYmtxBSeg<1TGgCZDBitDzSw z!lZ+|MKXA2mP6wObMi8~&&r5Ul8gjZt4ok{-1X@J50RR`{(=0UPDRZ~M03ReEtruh zelj_c?B?(Tj7wh)V%02#m+Qn$&VAnY#s@FzvJ2IKJqKYMjKyJ{!`2uz46Y=`YuW)P z9wX@VN^1WpYuLkOLZtVn)?XMC!D>KG0=gh2@ljM`?pBp1H@UX`{1TH;4}JVhU}hjI zG0?F1mi5}a;@&-yL2XI#Oo&Cm5gFPPUbGe%v7!t#ScO|Bcgqi<`*@YEi=@zoOFJ7* z9KOFO3R2R!XDrRn$ecfZ|I7(Vy0o5P%_?gSdu8Fb|M-x1tQ4KJ$y(|gr!DC96HWQ! zwyBJQp>oB_j@4KU5^o9N>xep{9E zbb?z8j>TTf;tgbXoP72{WQFSB;>-?ovw2%P2WEG;%$3V^{dRwoF2~e1?ma?qqrBfd zJk+`IppgCIDxQh{)?Ohmhsr3)iaS5xh&z*PTR^ z0^!xS4?oqq4NF2jTA-)B>l%|w_S2mfLd`x~LGtdI#SR2(KY@l*ZN-&bShG(52DW_# z1kJ_mLJ>dI{M;kAcQsQSHOmt`oA|zDniC(nr)T!%OmoNM|A}nxii*hUoiu+U)T0T< z!r%xT9Qcb_S{$1&SSHTPB97bOSg?XRrCSR~1k%ZP_WScA6FSG>JojRFM?KeB|LWX9 zIA1ho3imk0s#eDw4ajz>JIwnpUp_4fpnE%JmV6EziOV$rOiD`_9)9XG3e4&}Hrww# z)l`f89c;PnhcmB~8#g{Uo)hM?Y?)_U$0RHwWA>%Ni+A8KsL1tNgI*^M! zV{1KR$*}zi_8!_0qFjmpw%gn*7s^LOtvJ*sIQIOPkcvC|v{x3?@>2 z1qre0s`hw4pY_zEcNi+_*?U7JrTH(X{ND;LrF$fYAH4JW%ub2le;N}N#-#*VI0U5+ zkI4h!Ib=39W9QZ(X(9c_=LWgv%Z&~=7l#9wfR-X~bXOjIGAfB_)5Uyj#Cho^Eq^c- z90Q5nQ5HDb7#Zi8obQG0DHd0L{hQ%x4mP)iE~PPy4+$&7)ptQp_#!OxkiPPlq9M)2 z_*g+l`#-Pbg>bPZrmA51f1b|>QmVLtj-a8gasAQOH5k^x$%vGcV;MoK8&nXB#W=K^ z6J+KKNvaQ%ARuv1!hM)TU@BQvuNyohuqa$;L@S}NdBjZb!|VbbY%^W{iOlv~-iPhn zh*m$-KYU$csA4|%Z8tsr60Mes*z=iLc$u>~$c%vG19uSFl# z9TxIFdk^vKCDlI$X;FTkSxOTYO=uGk0VOLUrf~+iQ8e+n-#OBVhq>v-KADGnxV`ac z*UHBOE2KTYQ{i@{yzh-p3zyNIq)%4ve{Ba6>Ip48E|f=i-0Oqq4v%|f9;p`D(m$A8 zM7s(@CI>`R{#gnKhu?eVb*^eZ?}LfYev*L70tKEwp|A+`RJTh6tHjQ&Eu<*y8TdNu z(EzPmhp@LpYTx~<)g~{f?09r3U7Ks(x zbCx%kR5Uey&QD>{dw$%fjZ}?hbjnJSRyyS12U!+MGvm-Zj}tyDr!f!F>DA3*n+176 z-WFJU6h$G)0e)BPLQ+CWr_Nd^35AEasZqNwTSBC4xz3ktj)mht2(R0(6M`yP2PjJ1l>ujPsHZqbl~*gQOIC8#x9A!pS8=gEhY)_i&0bMUpUt9Y){HQ+oa2`=5BdY6>`}t$V!slORZ?1&z>xps6 zf2;ZRi+@G6`~AEI?9$s%zceT@y*Xzy`2{8wFO#4XZO%4%p!#daC@(T<`<@FLGd!hv zrtXhyRS+k3h^>a&q#=(zWsC7c2PJ+<~?6xlSkF zf7O-xf10ZK{FwW*#as&iUJ)l+u0w>CTpM%aqDf6k>NBdIuCcL!{E zu%rB2PV7E;~+Z}`HQqn*&7 z*7Erq9O^XfOt9bmn8&Pnf4d{bZ#E# zd$af_2j6cjh!=CxbLH!~=Ob{MTh3+Qn@x|hnrCmmE;P{}k}mZ_l+g?$y2rT-v`Tpw zmyj;^O==Yk1ce)FC-E68~TwD}7 z`S{!5;=m?e5W8ag*sdXZ0(Jup@^nL5K(f?IMYT z2!D4HH$h6zGz6ZBJfd=aAs8iuX2FL1d{6cB{kS>8REtUQ`>BcC6Ws2V9 zRqO<td33{GFCz)_^1k^5uYv5sS7gPBB%<+6gSy|V5Tq}NVA)oIQa^vQ zC%geg3ImBZ6HqN#dzw_r@J>~sSz6zfA{HguHK>y7^k(x3gstSo zcfmk19U1>C9$JQSzs8M23+p9DzmxIBzM?G_0m@O{tqtj;ukRg8o!&&wPlvg-#(PRc z+uZkn9!4Af|NC=fmpvhiv!%eBPI0%KhJ$)Zdp%6A-QuZj{0|& zxcT+>pc;-%+?v|FYWhEI`z;rDasM8HtB8{$&s=X(gfA<+Ae}NJncCD6c;LWD;+ILS zGG{|Oxf*He7WP%Q`Z4jl#(Ir^3$p`qekrgEsLe%m)=Twg$7}-9iK$sVlUWZRe_6g8 z%5*Pvw)4ps@e^-`ZJyGtc@vaN!UFTp1@XP-26%2DCt3PBcn=nuVzHXC}-%j{G%{~oy-CV>ECkPIApk%lXXmDqGG zwT_BvRjrz0uP5I1deB9Xj)8f_%LUkdw^x2t8J|=}#3#52;foYqk$CJzD>ca&Q;q8R zUT2UTRR%;vW1t`H)_2D3<6d8q`y&KX9t4vIn7?JJDKhKC&(%Chwobl6YD3;R>IMc1 z56{AL%DDva8nG6Hu53tJu6*z#tJ>dKzp*(8H@~j9{ucVo81?Hlorf5fYCBo~_s$fJ z*mZ36h?zQ=v>v!|=-M^drlHosHppc)NClG4d>0!cs7bT8Qcq3X@4V3<-aI6feo&(J z%W_F^HTD>Mgd;Z6))!D)juy-V$ay$B!0>u)SFopF+k=FQ zpR~xhQ%c9P(y_t~4m_fI=<%zPGhgWa0rdvNJscY?|6F$eRNGuA@S@G%Reay?2_Pts z*3LZ(wCXlS&Au>kauggyZ`~Q_e|y8$sOdZaP<(Ju$1x*~x^C>Ue>pu7-Y9X>oqJyH zEK}K>js?c;SQjIa9|s92WSFV0j^fq#j|w^Y-V%NMprmszMT0Tv_KnU0qR7Jix5F-` z@e5ZddV{f_M#ksIC-dv6Zs!khtvS0|yoc{GTZthbKqlq}49Xk>-z_Rh%3oMiZc6t% z+%78{KlXcxh$c97$VFx_3AN4_E{&YeW#n4ptu?q)zJDzxGMohaSQQv`y%Voeux?WhtS-{|?saVz|m?0e3MRP1UwrCTIV zI2bluq*itw-?BKHWZewR;USn{LB{O-c&vX8TYHv{F-7ELj>W9?BRu@QRqt!Os!sgY z?3#w$r>e1&GqVnlzz~_p(_W##aPKdso!?Ji4y3mK3y;Neb$H3e2X*Mgh8yFaH5hS* zU9AN|_s-(woEP-ZjtXroTnIszT-C7Ly4K7LS_tCv(FdHFr8_l$&rOz(zV4$a|QZOd(ZzSHNOqX=&#;~RtP2GIgU zGb$$0^m*lqV1{k7+4IU@gE<&q`74_qEddrh@YNnvmVFfaFD%HUGe;^V@QKtngt{mN zKU$2$B6E8|-KC7=Kb;gcu1gzF%zXc{F%irLC?U!(Q}&)13T);pn3#{Y3UXPt_E7`( zF*7($UO2?Rz;c{#c)RkkYggbe)j5c85sCp7=v4{dG`fDemasB}AHB)29wwMQk}Bzd?I1~(s=r}BU#JU#p8>! z1EC+wu;s3g(RIQiWRclS5C3lv#kujT*j)V*ZmMn!#JmKAziH2xn412Pa~rrjzSB~w<9PeSZ%-s5OhOc7=( z2@3_I1?^K|;RuJDe|OfUp3&F{nhSr?c@#Qlp}%X(4BwOR3)-I^SDyI0h{ZK;Z=sa` zh10znt=o~U+J z_wN`lCHAiF{hqCG4caHXI`n7FlhlKI5dN?76_qT#`OdQLpDR3S;GQ5&7XlH(B~lVR zYfyl2cwwhhN)le)l}7D4gUT!}Bp2RHuBIa*=`izYG>I#xA;?#z(H{x?arOC>wF(Y8 zqJ1{wll6`-V|-4BTZ%R#WBfet@=)MC?4pD1@gd86Swb(&N~DM zWW`q`6>DwI+9j;nu|@HEPrbYWgz=XyK~YQB`?`udS9@Y%bJ>`lYK*?GB)cemQPUAD zAQ|}YrvF(+6;J?$1>d#9b;xP^G|hOY!}a!8%a=9I!EMf>5tGU@qXZ=pdv@Mzyw9Rq z=6%Fpe(i~mXY<`+#6DqxKs+ID5EbLIasIx{A^zlSydw{>e5$z0bNml8*eqV5WyHgg z=P<)zgyG+#BAc(A%fvv$)v0vNrB@%ZxuI&qe?TX+@Z%4^XH)Ga-ay~VpHrdhKPDF^ zL6>w1_iLVGyw{!80z?0LiI}L3#>Ivwo;wX1wBPcbEmHsK%*=pha)5sO9WJTig})DP z^IksB(N>n4N}avuKTUJ@9i~wkJ4YWoZi7 z9t*f!M31h&nhBy%;h#ONc|sAq+oGVYTX+83oodK{-+Y-FM%hG3hj#`|&;HZ4C}r;P zYz(tO0yM1}Ti0>bbQ$nw_$Una7H8K2gV8c)gWoh72`dtpUnmGy}4v`_QWaZY93!G~4 z{pf#;MA0Q~Nh96St;bYdhPy2WUbi56I?8315>hoKs z;oW01Ll1OP_kLX6c@|Gj*`^!zV7!TbK_rx5;+P?5z$W{!|9 zqPb5J*!7W@A4$G^99tO6$gT7XX>%@7le|$cKnXd#JZM?iQ=bq2Ip1)SsjL%%e(84f zN=Y%$kzkHjfWnh`_^4#@rHLr%&`(C$euspS$p)nV!Me4p)`Pjxu=4%>(a6uQ=uLxy z+ji_KfKSzFpBpBDsSA$jT_Te#9Pyj{OMPIgNK%B7Y8NAV7j=EHdyRK}K7ake37)eo zF0Q)HqOkQ}y_g*b3M-7f8lWPB{)yrN-N7ZZNM9lJTx!DITa3abXuvs(Z_>3)wneg% z;!J#dTPC;kNWZXTj*-dJ%e%G9-ID%m^P4BE!!7w zN|%%@&neTy=QK9oZqTF>_GS+*O$&9E(E03dEfDr`lm^^KnIADNOnhKE8TDOtJl}a+ zg>lOTZusKnR7lmRRoT+3=eVueJTf6beFsqJ?DqdjT5KXdm~BX}iNpz?+Lu#L&6XJJ4}>%!AOSb-l*43?YXdN@bp zS@q{bEoZJN8~M-w(*m@Gch0vZYc>Zwp;p}{*Ru5AcGm^A2Ez2)s+t=F5MUM7)>bSH zFFOSIYWkWkX`GMF@5_!5~O?=vMsLwYZmGS!NwO90;Je(`;FD|yzO!n%W_IzLT zR1+XgLrrPpuP4<0AtX`S!yznBFO5qbYh&gEY9rtLV2L5AUvxw8RCw*U6HG!GBr=V} zXPBST?2iP^2{&HXPeQmp|7mpNFJF+%MK5inYAh!4Ewsmwk5@!wg4r0Ys7@*LjKW;U zTEBl}9h?(e=No#fNV>vRm8amYi$1B3!@2tWRs0u~r>l8R%!<9%-yd(xQ8-gS6|sKL{J2*Nq|E)>kjEgu z(f~dTaDQE1Dj>h2k|1X}<6#PHE_R6Gd-P=OctJ=qi2Plfv)@ge+4-Mbgueyow2zMz z`{)+njkx23furjikd$VEUlc9UU($39)?lTEu&7G6*U{{>}~|6AT%{65rIP(J(iV(wLoW=h}u8jjtk0G};CjAEt2 zD@_P5Z|gofkQudHMCj;jM@cAcfq2YEqfZmfzqG&UaP#|XLrB5bo>cE}KKLTr;XYHDp89( zr1G^HLc4k~(biB+u{>N7)Cq#h8_6r1aZ75%mJPJEF%| zXHRvG{mtdyWwgBB>&``eeeSF7iWPk8se!E7oAXqO8@CKe5idMk6|P~aNt=~H)W>8> zUP!hS{fTO6sbeyV>p@ML2a%g-M8?X|jSEn!Cd)+fDgb>|!Y zyKEl$SL6L9))Z>naf5BfJ$XScq=U+|gUZJ>9?-uBO}-*J0xy{5^c9e){i|=g=bB+R z5EW)$rml8M)4*YgsVR5rNWT4{+W5m)`U7;_4s}PNkHrrWc z6y~re8`q)w;oEL?w+mpaJ_coTPDic?W6(>nP;+z7kn?D$*REgGK+KYB?CS&&gWHdl zOHK0w;alQ%byUk~vd(Gaaaz1-Hu2Jk&~a6>4*U|z@lj7MFhg?s`&wVmTHnOX6)bLa zUo(79dl)NzI>OypUBa;I%96!pKE}eQ@^9>SbKpoQK$huXSRfkvqveofM6<)q61 z*rhu`!Dif8LDKkzpV}F=}d;P?a+3q*Ap z8$aVld-hIY2~batWx91 zSpf6{)L@{HBBOS5GKEmxl7RSQeKq~|@i**cw(S(}Bp@k}i6OtKdLY58X+J8>$1K(2 z>zmWPFr}H3PS@*2oz8Xp5;FZ!_D3}p@_)gvWlgof*wxb}(HUo^d!&3cdbd;$jEo<% zrx{iubHPGSn<}j7x4l(pVy7=aLh8?AMibH&DCvjN;u_)J-nP}z(;7PTovD4hEI^}w z>p@F7t^CBUs4Q6LXF}GT@~o>sjtzu$#S1y6{zgMtj;{%&7a1w`{wfb*!N~8X|Fr_$ zXRRa1`3KZ>dFs~5a7yo|1~K~n-fsO+?2z8KVW7`|Q~exYv)|QAN@(`m|E2P`%93j?BhnvE zJl8$6Fd-*JDd?@bOn=&K&T)m-q`^P4-$f90E3Mk|HL$VCh=p{RjOR5!BQ)eorMS2> z^~uc%Xu9nWy*d5$qj^O^HY<~}MMsUmw3eVK|Fn(clke8$cW_#o=6_y&mj730?`|Cm z7n8;i0L(|{ggz_z@B0W)Ufhqk;a+TP@OjP&;PN*yGu<&wjR>vb9F#e!f@-Uo)WJ+O z&r2^1!*G-5vmwUl|asf7(SHfteu6C#5 zW1ju}oIBhA!8h^83s_KpKGc?DAM1^Dh#JTB#}7Y9pCuQr2kDlBBuPo6;I^y zO2ls%GHQC9(^WdlC}8*}n$&u(lqJ!4Lf|@Mg9vA?986Zh4DAPo%2WO6@Mq`?XEF?m zzz~A*(WA&rfL2vSh2lU__VKN8%c^mrcBNwoT@#^O}lqX~Td1Rh`W3?2wbTWa{`W$RBFXhcnG_&-PXZR~qgtZ=CNc zYl|P=sc3;c;VZp)K60xfsO96uWOP)<;$xP^(jdZWxFfF%x9#7*@y`6nSHLauOiO-Z8Ur? z?gegERZ)^V4@6S#>Z{6V+T!CUYtMWbv%b3M~;&3+ut0<`TCU=ovf+!ptn4cRJ< z5ZW(ru{eNs0rNDoCHFQbcU;DY3s5+uv%I05J?%uR9l8iEtsJ+kGlk9m()w5(_slrV zvGjVb0~C;Sb{9U?DIIAi1z;0Gz;^L;`%#cdlQNhKFSN!7Ns&M%rg}N3VC}}-317DS z2G|eWjZvF^jNWMV{1mh60O@-RUFCm;ITpXR#5tse@nX;QreJH1u;=^<-PlRAOzTX8 ze{r!D4&uf&mbkh~C@A(hT$$cGORa}E&qvWyb+|}+m}9;9-fHjyK^80dV=9~-T&-|( zw+nO{)R@3tg~&JoL_o)MEs`^v1>1|F^xs&De|u;^Dz*Wkawm5$z`4;I7y43NDJhYT zxo6TomjIb$CV2-lrrFyn4=IPM>A*L08TykBkA?LbaW^?U$dd9ZTrK6o%%-S2vDtn9 zJJDhde++3h{8>1mxky^1haLH`50&y~5)&TcZgiVNo3myuyMjc_;S9-Jm73iTW<+?} z$90zdfk+u-aY@4Rqm=eG-P}S|W!If;9LS0u-jzRj;_2W(#(7z|p5S8p@;u0+3KkA6 zJeK&anye#^l~iK|N>fW&qKX{JlvIBa%+Js$2mz-&j{mK8`n1@r z9AbFRgeiDf1iKaw`qFQmEd2>@eSfpvL0oi2`XEcAZ55=}*-f{o9^Lqu6yf+K<}&O8 ztaOsc%4Q-gdPJV&5b3~TIJ_G??W7`jvhxX5Qo@<|jDjdjK9ZG8y7FA}#STb^&dIHP z&TU-=;A6@rF6xNP%O$9|i&Fykz65 z~6$;_-skl|*UA8I7u98_* zp5;ozK!wzPx+y6tOzPGLV3guODCeuYP`k-&SusNyxz`>j{!wIk@S^iF$m`732)wt_ z$+wrX_dE_KGR{weY8PKuetR`sR~8SdJpHD{ZQI%A(V4E%lCvGVuZG=bJ=pmEt(WH# zjUN8kY3q3RpNmheezOetfFDmQ>6UUTf%CgEnw}ZmcKVV$0uP$-p$k0}usa(Flmz2K z66*WPox$E*+W`!Fc=p5<AJ!+Ru%fB6nSS^a+l7X@rsu-7gDM$cb^S)EcdiS#C&CuYxw-@-&)^#}*~2(a zOP9dznY^Sf$J+W-A~3m;9B55c@ben7qTr`2M4VxoHLJb`mnS;>`~*SA_&&KHNL?bd zZ*4e~wAgM)Fu|_Zh8CaChb}KrXt>bV?^Cu0Yt(n<2RdF$1`(cgkwKWbTgb!P`pg~v zoV_@0HhZ17#dqH5rB9*|ZM_T0NnL-~2*;60E(F7f-=~c0`hK~eJy7e$1r&0$VIHCi zoQbzV2QjF&{D{oT+C5|GU%_}^29{n0^4&% zuI-MA%I<`P1B(`>paU14${G*Zla+%$`i;_y=iWQdD9GuShrL>-Ijt+>-Y(irDtyPF z)-I;x)&bv&3fufRy{_yZ+PM3b{8>RPh{5OxOTc7}9RSido3KciJb3qwiQ&vQz38P58aYfL+OD<1g3^d_3CwDru@8)@>8A--85# zk;?v9)-=SUr8c&0yGrWp`nMrp3>mwm1epHh`1{U^4N&NJ@I^mH>*AATCVBc-tq2o%!i$2TzB`@@|NH++Mr4cZsE|!o_6Q++Z;}xi3D>5CkR3vH z_Re-~A!Lth-HYsX?Y(}l+volLdDI{8x5n-DIeSYq7US;a zdW^=a3E@XQ#wRcK&-jeF7ERMbaKukxEosliH291Az1}3dtyJ`bIS@Wxag&^nweY&2 zm)erSjXi&WmbM@0$C$l}&F}LJqf(wdWMJ969;S7- zRb6DhF(VGg^D&bQJ{i_pV(uos*cD%-uARy_gsxmQXRzX4Uz;kNGc&br7Bo^lV+TnP zNemTmD%x~#88kz&fmp@qKy-n+5Gfsr0)<3g_EZ=RYf+cK zgw|I+6!+T&*0jzjiAG#>%A%1I8#bwd-9QNXZxu-`;+_lB3JRxoIq~RdYm52NcK@xs z-PP^2+XThAYd>R6HcYervf4pTTVUwWW@uE0%>(E?y#w1ga6li(_Jam^jr)9Mv2CYNVdl)g;7x=zC+1WvoyhGk4P^2v zmJeeRoKJer@S#s99UKu9D}IdgPzx8PFFkv>=jV;VwdsRk<4qJrMP&+qjUsEZ!c`WlhNq?O{w&`^QUl_&AVQHLCE|>ga(M=?a{ofVPTy)kLWqOGQUPjMwJ%l z@bay-E!FMK&AAV|(QVRD&0dLwt!ZSAb`(&duc_eYX0Ul2B;+o6$w6*24M;@6GAcOe zp4t3Q4WrBQ2z3xX4(oXf{8Q@GM+7&Acd#k}6f=PB#qX&{OXjnv-w^Xr?b#QlGBQC_ z#acX*4s>_vz6Dw*#x%HKOs(Jf8hD*>WEn-Dd6L)?#5vkr__O9MAu^9$Ae|esD`6^Q zcTMW*ZF$nsnRN?(z*z?uT$n}%?RJU9K_2W6+x&hDwn|=zRIy>Gj1KdAB)}J1Zg5@r z5a_$XH&9UP9CXjpuRqVpeWR}QSa|DLmmmUotb9haoG;>|{gY5?n;;nuU0kTqhyM`> z^d%*;1dWsik^-P2?5-jEJ5AwtnoyNm4##{Y7Pt2HCEC;k6CDX$T6!H5osag3t!>VU z?^cycZCdaLrr&Jv@+H0MJNM8MESm2by=q81@OVclw4z{MD|DP}sIC3h(Q40!JunqP ztG&G>@;%DGHUywtM-!rsvq)vCi4jJ zJC$gCdGwda2LQi8^W-`2tchr4Fbu;SZs8*^SNU?qePO~b<+)|~4E6mD!C+=Z){CZS zzNy6c%uPqx8b;q`Ce4GyjAw>4kVB3V#>1XOVx8*0&l*@|5+C8_Xew;dzUXA~l03f) zKxxoQvF|9Jkyz*urCD2jwYQzyuHGF;qnh4=0pdAG3PHG$eJ`Rasi%JO-pxt3<+l)9 z)*StV1XN&tFXhyn%-jLUAuYarR#5R1$g4%PK4pESv6D@BYz*W3vNwdxg_gmBK2a~FU ztp%&xCAsCzNo_~$jDJ+m=AFM^8|JaHZ5yb9BWF=&v?hGh;V~4m?mH z&=JesNo(#Sas#V_O3=2y5^rJ{(0xnP2wf2-F#t2jN5KEOgYDOw5beyX@%Zzvzmisg zwG)80*6gKC=}S?e7zP^b=X=5)7p_>DbBKaxc13wOu-&i}Kg2z0)YokEC}PMa3iA zcOk9@!Qx)GcRKQRIZDRqUQ#MQzTMIo)tZXM$|$KFg|kdA#2rkxv%bfjTn!GX5)3VTehbl>i8qAR|FmjdIm zPYOPFg$aLNd3T?4e!e_FlWb0{(!4cg?XFBz(O+H%Nn}@yIwxpv0}JEOF7~Jgq(YA0 z(D4vEi6PR}3wI0y$PbC2+q@P~)8C#=UVVf-$a?f{4Y#U9Ew8Y(M7In*3181U=0FQr z0XH|oo*5?&ze>g5#`TaVW>WJ-8)c6hSkawsJt=w_UbCFE+lrkZnv(~|t*DgzZ!7t~ z-?8eHA*p#yE#7CpD`rw+D1ONwtNF3Y+vTT`s@1#!B7jh;b}AV!w&j5>HSMr4vG}u{ zADA!9(&YXgALU+PK%S&v@)IO4&V(%hM}Dk#3*o}#W_{0vuf_Y~$?V37o7ep@nJJ&< zzZFRJ@`#7%>TDqcn2_(Tn;1^6^NanQFT$?9Q-c=_vu89HCu^^&_3fmo#3ETYKJiNf zBKN+<)GL1R9LnEXM84F{QTuPdOHuhX-Y5HenS2)3Vo*(>LGHZ%7vhMxAJn~=?^QaC zjdLlG&fZ6Qe&MsWWAAufqRz?~^T+bd8AL68JKH$N>+}tI&X-igQfRkU!7W|gD4`D( zQ@?^gE|p!s6cNW9;(tKF%|s#TyFD;l%pkPd;db&q*|_ws%BY#{U3lihMD|4<-Cq{` zQGvD?JzqaMe($md_sOB-w|A5^()>=nA5F<;$^S^C;HZ$zA4g-)Ef=LOaGTC>eZZCB z{dbr8jI&qmoqw451S$75y_v__l?q=87-Pfw!!sQ%*CD`9koaGSxOy)uL8g-Sv@nq( zkjJ#o9qsN;CEdvvPn#f^c+H=O88-SM`xfrUxR6x_mq zan|8q!wwv^*zx2Oox$y`pqj&4hBypao76vGYt+PMu+&LWsWJ60Q75%li?T~^NzqX~ zUQm?v<`EwcpIVnVJggF$L@27}eZk24^1+WmJ{a@#tc-$SCp(F4fxD6F*l)D|jHlG> zjsSuPvV?DSd8qKs*YE#&0n*d6^S=*rJopD2E90ROly5a@6l9J7TTqQg_5YOlf!aHO z@vCHjfCD5d+7%1x;sF$5q_vxR%9J23JLxiR8d0ke*f|O{u&JB*exKepVl09kF;$ba18yGbOIbcfJn|?!l!=-GEeJKlo79 zA|yaHM7t;G#%7TjiC?zpBQIx=PJ4I_*2E@u%Bf@4EqH#vG zNM5QPx9^mR4ZcgzW{av`<(+&)qQ^xfFsquUqWYXif};H(A{%rU6$*7A-3@+KD@)5x zPw>;F`!)MJcKp*$u_+?`JE8pjzR**!dkqZJ+U0ER%PQ}LO+A^)!BXD-jn*;(J@-H^ zWm=ze@`?>s`d7x9=2k#IMQ~%c%LQ({>0H&vHpc@%byf2#0#K%@vMK^4QpY=wVs}%E z$OL4>Y#D8MM^iJ_$vHEqAKZo%*uN*JwV?pz{&M|R*dz`1uayqM<11FCn|-P!*NFfP zlBDi-_d{bRM_tZe4wdho;F3^v3kh`&T0S4+yX!gX+36NB(J2sz=OieiWzCOy@U>k&iZj6;Gws zjktfYwq-_^*+|g*^+cyZ6W4*hn$TfmpUmPoO+zYiX(O&u)MLQC+1&=M{>=Xw;q#JT zXfeADMD;%lB!p68(Fhv*PP!gtanx9QNe{XGd0opJGv|MHKk)WSyE^n@P4G@~hv{fN zD5x!UC#N*lFgz!ztAwl`(<8r!#ar&>P77i_v21d#q*bFHQGG%ipudva`5dvrYEaLl z`FrkEo*{K5HFb5B2l!F+mmNF%CzwGK>>0WcmWM7@Cy>wLI$BDU5b4f( z?9Wcc9-|c}EK@_I0Mn6z8T1BqY{2R_i}bd4g2io=009uweF<H&!#}*0e$LFo7)KV6-q=VxJG7E=(6K3D|wg7?4GaT1+EUE~qT86WKJ zK-OGF$#_o<)lecr_dALpn`ew@eEE~5WLR1rJL}y;#yubkXR5~Da(j|g@is~#z}qeR zRrv)LhSUzXfA~@f$hsRQM&42N`w`3Tlu1;)#Ihe>ehx}m;7yR@cxBFfNgBAPeCaC@ zh1$+@E}Da{Td3nN;meVS^%iu$6};1&Heo7@_PJlWz;YY|47j2@L#f)MR_bwB0oZO> zt7_AM5Xtp^b?UdncImz-Sc?el^{CpAVR8t}O&9RCrUQa8-QapC-^PAsxSqe2o9D%z z7WZu zx3ns$nLii=uiFVh+r4cRzl!Q#n|~0Iesj*-Yi0i$Va!D}8rOvWlbl;|Qu@ECa4S8w z_qi(h6#z|f)yjaGI{9tu;`!*6AnBf-sA{>AqQ{8PzGW5N{u}X*DT@Lmd64p@-UHD``+UgO7I^`-SX;NQIPi9a9Kc=zi1vm->tfOfVZ>w7$nn-Yk5vTcbVy= zDq1KzB{m!3RSHq_EieeYYaj{ZSe4y-R$T^TiA6p-De3mzO`z zOa^=Uzjs0&e7lN|Lf_7s&);)7CccmHc&(tr^8o0L|GONP4upj_h2)x1+cy>q{gjFy zpMtE22>&9glYne#M1^6-g-Rkffi{{_m|Jb{-^>Q5x4>|{Xa7})z%Lzt(GpA?hYZcF zdOM_9xIX#}v}KIMUAGv1?ApGgRPMvce@9IN;ThUd@K1O985T0U*t=KFlu(J<{+e0r={UoozN$+Y#XeO z{coWXV71*@~D4jtJULDgV_~IiMW}z8f;kuk@IpurSkDS3_4I--^IWN4EY46LlX`T*=Pn zTcJFyuAn4|KPGDmtV?eUBmrvXM$y(3`?6cK&Pd&L61xv4O40jV&)-dq7z3eR0C2j#`mC59VnJLEanmR>QQE#cRIbuejxOXqG`Vg{{-{0;Tt3!7|BcB5_`I7CI^|Vwnz36zsbaz8Y&}F9Lr<6n z3GAPmk?-1$M~u_qxTdzD4vJF%fp+RUph~pxa@ZD|-9AL$AeLe*e09?W zQqfX|E(?z46k(H>w*(RmrPO;K7%OGhehVNN-{}DIdC!3RRM1u$GS<8hJwD>KVBs=FbCV#o4RBR$KJ5_KgM5Jozv_x&(JYLXvbF&Q3~_L9NyyT`qfl zqo}_FO{;4=Cl=QmJTlTmw=vXp2mrTWzsXx%EEn@~Wz*4&{Pv%L!-bV2lH0fX`)d=F z*xXNIS>pv>s!h})UEZ@tjvuks)R4W%+r-aHi7-jv;hFCkGKV}JZCcwCzU$!cBpI|k zF8jJt?$npdqe&I_R(TD5$BOP{^?S2R(=>R75GK;iJOlP#g!Gi+Hts@i+#EH#hY>Y^ zTVNy2kp)^zRfHQfBYbxS;zXlp40;!;X9EzIyvtvr5BRL%5h|3z+E`6Wx7swZ!4K7v z;~qEA{2hgV5wU3C8F@G!?y#vAN#Ay|Mm1}nLaf|<6Y0Vhk(MJMI}LwyCnmAOXnra)z!4Ya*@?Z*j@s5xtA0x|6-9b?HWL-A0A9LohqrOv$m& z)oHf^NeStlJRKjYpr2K98AC^X>WE;jqa~-9O*9NLO4U2Z(QWeHJY&F(VP4AHIsDywC~;q0$Ht#fwEe z3x2!;H;{_B?d~2YEcQog)D0pvXlAP5Z?;X7F6q@6codNx+%^10HH08A(C;oG?M>(> zapJpa-5}WlplsG`vi(@~s=n`l`p~)+hKJqIUqtu8iE%B+T=Yuids+_$R_Crn0cg^5 zBmgxjTTqW`%$yF`8o4FL+@gq{5AH%o_aG46!Ie1x8yo=P1v2S!EJ%)WFT`Vh54+Fy z>w$FHWx&Gf7wZsLwO`>n~CC3czdTQl?#-5mGIf)c6Tf+a5HKRM9 z{ta%=0hJpOKvrWsa46y)TGtK-ZIl*ZrcK`ly}}BHxWDB{hsX$3dyZ_ihw=X#LR`k+ zYtjF?Z|wGaa07ux^x$i}eDdXHk}o243SOMl6cw3)3DA zwy-HtMWt_9?DcTP7PKd=+PufRK2Y1q78(h>_G94sbEre$O=Ggxpc9OJRVO?XRnUX` z`t0y;ZG@pWeFuQllaeno=|(44GYf%3n*$pEqW7r|DIR_Z>ptvwKDtfj_VjO{-Ljs%RS+@*MB`@@|y5V7594&7YN?cVf@RA-az zUAE|Zy)Y>raB)U~<|1fuy6`(N)#(T)7ef=HXiB!+8NtrAq3vrQgq@UcZQ$7wr0NeKSo_Vi#$*V9q=UgmuT;-yu{1O|6afm@;-8Vvjoww ziflS*nVzeuu^V(ueGi8bc6Zmj?yGTm@HmDXvlW;4feSWs2$JDJ^rwKHQE|lRoLYPl zhx_24zJR24zqwW4Di73|$xJCt7jrm$$~``emcNM9FoHuiACH?zbH8Vo>_vs?X^H-B zDgoSXfeSoTaacJfJmJ>5JHqI<1>M2>i1%hhd`zK5M!(XGUumz3q-W4p13; zv%^KVfcneHLd`!G-SX|-V~w&hiW9rnB??rYjKMw2QET9l18%We{8!C$-?q%-1 z&_`9xB=EyOg^kdoZu12Cc-#F?3r}A4LDt z67-mo(+tKp?6eojlno6+b+_unHTtA?HvBhqsQ?e99hxCTfJ8}$3l&CCI6)wgul640 zMbokn+E8bqUJd*OM@13hq~Vt)Fij*P58p7>fwHE*Xl!PbsZ1~Id0cXu>FCDv0D$r@;!gV66&)N);ba}&u3NTcfNd|k z>4^EnWxbPXX*o_&Jh%X*)n>>kf@DrUZvQ7fAr z+V1izIip#6%Ez}foca5!2$?+|^?Gc2O6Sc4?zRVDqCAV^6 zi%?GF-~fBM;{a+UN~x;WZhJ2dk6~I*lV_^7Idei8KIXa@DYo7_CrhN#Z#VCMX<8wE z)q5MWF#UUiBz4j0COMmlS>B{n`m4aEFv4S}-wx5@)M+NP2&(UT<=U1lDlR&ffw zpMyG3(p_xG)<+5_VLC=9VG?^14R*Vdx~>9yVgt-ILU+d<=2;VZmTKq>`d_qJ;B{s9 zN`KHTvIyoVtJuL();*Mnf5A`xMvtROJWr}_h7Q+ll`?{PKW%h`bY#ZqyEyljz5-6R_fP{3>qTLGF$Kn#@jfDx} zdgC76vsJu~d%2@__tW{01b+6M`i7kxu?h|qt)=-r7M)S?q`TQ@*sxyFmK4uBUpF`t zV#;kK446)Q!CXy`yb}MlxR>9Qa~d&-0YORqrctfEm+*LvfaL)wd9&7Ggvojfm6I)? z_Bno~99|S?c@7qJIt#U-wsGAl9sM%P_oIPY;o~LEz4#ZP_*Fy-EF{0g*p&yOxE zaa{lEzsa1us)mU z*w3xpdEodW?BvAuYDuHh8}^lOyf03v4>$S!%`{DDp@om;k=Fadl%%+pKmOd1a;rC1 z0-F^zE7oT|68H+35Fp(<-Dm+Vmb|?ce(VUX^sY-eMvY81HKjP$p4suDJ*yvi8*294 z%cu&PZ{pXYw%}~MN%KyQ>5QiF{rbA2u9H(`t_|DG^&BzY8iPMyaZOEd7K5lzOQ{pL z${I@F?H0Uq-{Z%`MDzrFQE9d30pVfo##pEy+RsRktBb^I@YoJqxIBs-LhQ+@sFc}x zSyylQbGt7b3Od>N;Uxw*3(?1OuWi2>xVEt1uukU>IUw1`2EhR`Ndgc8i7y*5)e|nN9aLAAC>FB_t1)3Mozrc(Mz|4 zvaG<*WtyT5RRXCIO1hf6?25rO^j!HeLcsVWPUC8<7&!EvmS)C|Rjq~!>9m*fp#y|+ zA=qEnkk==+x7lfNU*wJR_?blrq0o`V>);s#I{n#tjwdU-`ZPiu0zt`y3)x{YIzex&K3 zy4>xCW|Go>$vv2iF#d_%q%}2XyS%vKT=Hz1w7+j6zNG%h(p6zBOfLvCZ;nc8EI zGG*5q`|E1TuXaxHd{pE8e~Pv@`$UrmvN4+seU=S+F0Q^uz>6l+{5p>hjU-m)XFn!8 z&gyiezB~I{UD5Fja^pDd-Y}dmM7B=O+76RvFzuw&#+nsF8R42ZI0xNA<|Bk;;~1w#@k2; ziabtxwDrXK~QyBRBiAsY<0o*Mv*j zG!L1Q#L{?yNKL9(QWH8f&eSqvQRB-QXHivb-suQ8E&GevluYNLoLOGbZ$GkTZe1EV_ zAm*e10Vv~ocBtY);S_idwmb6gYylkIMpOfYb7sdmt5WVANA?kssV>#?+OXiO=iJqW zm(kehC`URx`vreNPmdK=px@Oc!{E2$WLW6)-kGt6mNL0P$@l8w;{9i815EU4>wlMf zes*a@qDq+w4r>dWB{HvQzq9{9~H$Rdc^ z5xPbu;da*UDo-ozlamd{Hw-;DNzCbN{Fqjy>u7Skh!0JPti?kDYDI_sM%ZO`(v(LX zr6ks$-GxBZWpQzq>N=vd$ zO&6cln)23W&hRWnbjIHqUzOmF(=e~E>eT3|q2O%V{rW1<_p$i32Dp=6u+hjqt4U`w zFOsbRs=nUUzG9qp5yB6j%xIo#<_1_5F=o5Z+LGAAT324&Fm={{)BmTBA;REbS_;ee zDJ-|LiF2GDn=Ru>_r;1lmgG|mmN#NP$(uqMFFt{bsF{G09Lft+3=o$K)AEFMcvVx%N%<+7E5oKuur1q@pn!>rO{%*8L$q%r-QV@mej3%N2B` z3C`5#C{SnhHdT!UuYsLC$ANWbf?`B@kfHE}(NS$8^VgpHR+4JGBGWXk=Su;{+uQ1v zmL}3s&&perBO=_+k9N3vd48#DMbepTHnBBFd?b?MjN-J-{`$N zbvs=xKMRMh494fuHLebe8}FQ48Q)TUe|G&b7zb7;eph)Zxj^vliU0;Az&PVNvlr&k8-MMOexk1m?d_h5Nr)1-XcCnOQf zhi!8T0-pYI;)s5)iwH8iUef3Eu-g3Rd?ttXw3BlMP^4JW&97TN@AuM{w-GFnC+o|U zgo$I#h*3nb+4W`d^==+JIv&LYTsVRxufgA6E>4R*IoVW$N#k;kY^x_J{g0#+xMJP8 zsf43%71TA(kI;7s*&5&shhwzb{fj9ko{o3jou)Wvn;s+KCC~LjHdZKwFsCI&@;uB2 z0~e7mwD-Nf7R(_N=n|?f8_D&JbuaWNb%dVgb-o`=qDGabBx}IUB)x}F#zM9EZT?rO z%r|}9;5SG-Lq&9sT`$+lwRCMPvQ+K=A+w4SD6cDy9OTOPvu@s6Wt0C|lC$J|61ci% zJ9_1RT`zVI&%|5v$(dj~9v26@tH1owiOmvGV$DNwh`xm<=f(8rl`e$PJq(DsP?bkE z1<8K!IPiMRVQjo8gr*P=hE@4{ryP$-{9ucjZ$lC_~Cg`_e%ok965=9=DlNYFi7t6#e0&;kaalbDRzV%{_7NdX!Uv;gB%fdw!RL{* z7(0)>O{-dIt331wIgvp|H1!=^-}3W!`}<}=H3j1QU>e3Ac#N90-9bh=L;XI%*asu< zHwYACu4E0pFF%or*9(;>)(93k`e`V0i#KtCR4FNVmJHD|;NE|=R_zkPuDBoc5O09H zr-ekff$@j7R`y7y$l0rR0ui&iqifqZDvL&9!I>*X*@nI@2hCqtlC&2~-c|eh8Z_?& z&IcL#9p5P-NN3$VA^vWr-Irr;S0@@%i7~;!uJ)aaefEm=q5gD}wb`S>74~eq20tz2 zYbCxfg_i~pse%N(%0Zpl+A4ivQecJNOiKhs<+;Sp!Cf7BMdF{5<-MWX74~&B@e9Au zxyAH+mHEkst5lJvjS5ZT^*i;oHG;O_3d^Ge#S1itGOC7(d-OQ&4Wdyz@4zgI zoto3}s{Q>S?NHK!xYZT?$_m_VZ{!E+i;fNESC+x8_%fM;$u{#hJJky>Wadoj%j_RM zRbti>y&h1X`F?WeO8g^&M=PU(ag+BUX|404a!eUyfG>a<3%TqN;jvxw#1d#a7G#XM z9Z^q$Lf@F{gOe1%)BC1@abULFhru%X;< z8f!~Vi|wpddGgT=Yrr5F0Vn}N)`p9H-OQUdlvHb8t*K;blPn!p>P=U@rJ+&y#@a&K zB}>YDyU+>0cx7S1dVFkqYqpSeHON{XW>+@2*_igcZdhBL#Ot86cXw3jV<&NV`wIYFEGZL~ppWcl#=lZ3W-sdq$yO zGNHKG)u8H?%t=d97!eJ%8v1J@Y}g0@a&+IWIVx9Km|+{iL$d(VQs`>e->Y7ii@#?; zLKUA7>Xd{=Yt$<40Gj!>+=PErX15ZLlBCtRahl^^uNW4;GW2xO4^11$VwlVs*B6euT5XA3J5KfN zGbI|B&sVc=N0ciur~0nOoR{_!ZP|Z9pGWV={kifZ0yhX`{%sZ1MxoAI^q>8e(o+0! z3ZuPWcuefR+w}^d*!>@)cpN2c{Jc3Un?lRsokfDVyB`=i8_!%6qa3aspF5cO>n)JP zvmose*m7>8m3DRBgFoSz5cadiDNH5hq9TgO+aN!ovOSQ`A>JzWC5I0o3F@c-9SSf4 z5m?;qVps0n_W`rhsllPfmZQLYDDUMopg8qUm=oNN&Z}NkY&1#Iiw)(}&IxObSaO@y zm*LM%vH+*m)Wn(4G%FV}O1s0-h2(KRwk7HDSPG+dX-Zz(u%JSQ9(bPs94 zFL*m#M3P!%1A6n$Kq6gFO|o9^;+Ud_w{>>50eR6Uz#9>P5I)eN;n6TrC`!h@_(@Ns z*6(n!Q)2D;5s9X9bPYiSDg7oDUozMDc9RBZKS8PKt4gnkCmzn4NVFrSNbY)k{-0Y4 z!P=j(@@cjsTEGAf{FuAhb9c`D4iqHt*8Z1X!%+u6G&jySZO{~xh4ymjksCW=GWtZ! ziG!)WXu zJbEP@J7i-vTYAjnzU%SN`)4sEzRWplo0At1O!M{2HUzZE*yOjCFTxbcy_-jC*N24? zS6elL?e7#v80K1X2O{NDMTW~TaT>@A=R8efdhR!P`5Kz}xaqC)!xJY{pGwwakX54? zdcFSqe$9V!1clLO_tUV_aw1t3PABelqssqb;&GX}3&8IIw_bYpBLZgR`&YX<f>kVKAQc#8e5eAb5N&BO72JwHvcnZGA8ltOv3M`(Q8xH_(;TC}R> zpLo|2UheDsMlLn|yIwcTD#&Bl7fTRYWW=aadZ8eg{gcV2 z<Ug{LNyDJAW&L>AX~ z-r=qHQ_zW_D|tfZS>};JTI@nQ zY&CV?kAxYWpc$PsXzXc@Jq_zq@D|z!6cP>oVPE&F)2-MNPD7djNol*>V9}GYv*E;j z=Ix6Ua+)>HjmtkH$$wj})h&xG6el>r7P+?;LI=}Jl{BC#Rr;UG)q1a3;A7?duSqB?;Cp5P#{t1>^QX=rx=0UWNBA$a0@?-`b2+=_mHa1jArpLhLZJd|nZ^7zT_Ia?=sP%E@dy-%;p~7M|^HqAfh1utk!%J|7E-!>mj?0 zZ0cncL(I)tJB227aOQH~qT!#)x-{>7$SfD_z_p*hbAChkV1S)HNM7wFAW|B*o)2kI zlC2T?>H5B^2BYAHip}BZC>F1W-{#mOzJM|WX@ci^P{;mRag&6xS=1BSQ2Teh#ltC; zHE-*#Gh6(9v=U2a;S~>?u(1A0UY_P|x1(8yJk`U^g31d#kvX2bh&lnA{d~wRWGmr^ zm9FCMzwAX=l0*(jDaX-=ita5SkU#=W@=1G_;W9rt8*LT@Ahn;Da6M`TD?U>})IkL4P{H+F)R;Ac*kNuX zRv2eZsHb7!vUM>2Pq3mubEw0l=vb+EV0}tKq8^i-lYRcAedO%7VU~2HF57maee^P5 zxIqFT@APNG|9UyjV9-c^cIZpLg#Gc(_E5cEWMOl2`CTn$%eA;cC;R>Du%3sQxE`3I zx8L7xjN9z2HV5?_2k;@-KqvzTA>~*F-HCKQ0l;yJ1jR*!kHn{Z_SF(+>!tivi>F#! zrxoIYyCs^WF!7OqNmJ(Ta3J5UP8BP(Hvv^Ma$_!^4&BQ5Mt!k((eG)^9+g$A0--0Z z0k>{;v&4|?el1Cz-)*$clpQK$XKY$rXGwcYXFONG4^DuFN=f zq$0Zs@3xOz)5Nc(pAr{;BSDsG6){Dq>A6x-W}NcV_EFH3=vZd$oY<2xxYp2_avzEB z=^jD85<`&!qS7^yOEej z@Bq|P^f38s3dZ-b4QJK+p@smGUaPUzC^Su>nSm;JdcaI`Gsk}AQXWrz9cv+tcJAhj zzRY^eURbl~vqo<(^3xDXJVGdo-$4u?^iS#}%PB!d!jI86ov&bnIu|~s<8Umf_{!^k zh2VN5=G)@sQ|VH6`}>?o=aiDo=O8-&^1YSeUY<6DW*&$@xl!z;Us)vm z0R1j~)3c(^&i)8JJvb9ykl|xRfSL{w;}_>@lHM|H^Bw6O&W|#UYFEeLGg-*A1e_Mf z`@zj(lAwsiqH><9UshK3c(cMotiY&tg_Bmr5%a19Fb#`XA+Vd%Yn_NWBR)^r6&JiBzTUg;3+<@^M-P?a!1Wj*0D?*etqi{&rPib_{lF) zQply1^iakpfH_!0N>fRs`^0=EO{D`BmL;EoiEtv!DFWyY_%5enviHesSLp zI2U-qmcWmRJ_L(}J|d1MkP{ilHP~{NcT@(8pWNSl65}JBI1Ntk>Oy4c!1Ep<%NWQg zn`F12r62sw3B|d&IZnkoI&#Er^uI(6s92Snq)+6T&FYFcyp7Cjk`_1VFDyIRL``N* zOoVgOR96P8AFJ4~_RXb8LkTkRKE64$ z0v*luV&~95w{|W;&qVBYNmzH*Nc;0^90;qjutF=Wg7Njj3*ag2Xh4XcZ(zt5uY#t8 z9HXYC>tMqFs80v+cEs^L+|$F}@DR7xiOi^=P69+dECZY|QTtSoQr=TgiIqIv0eH8d zq(qt}>cnBjSs>}<<|W*+!NWl13$=PfOwQvZPkR@cM{|Ek?&3sThlMyaU&2wq4Zw z{o|z@*dRw4yYF?wNcPE(*S#Ny<99;*Z)R`ixO{BWDa^d&<#{reL+`AgciIu%$@i?# zKX#AG4aNp}MUeo=D-4OG#)tkA)J`{GS9LUDXw$<_qiuJv&AHI{1r+2!vQ=YR0`}ce z1E#WOA{yy;@Iz!8+M<92)?7L;B8ZukW}w4dDgNtnFR#{hZ{*YQ)*C(0VG{E~2HHh& zFMR5t>Cejr=VM~1nNxVs!>NMoCh4+tQQe`rE6_MHXPP!tGIOAmQ>R;u6++~;8Ba;X ze*e(^)hn5Y@N3g;#(Td!(@_DTK5bh<4kLTLT=bxV<&Eo^7zs>z2-H>qYIaA0@E(vo zj5HBxNBjL)7r9IZYJqs zsy6P}wN~*+`ib=w;aXZVA(sDHve>f~?V2B42*JlrZdi>BAfje?RC&VbYt2S6qh8UyIua1caQ-!r!|Lv^Qv>LY(rtwM^E%j1 zTM5h~~FQS@3o-)^qJ0do&*rIq$XVW_CTkzI8y?ntG0PJx8d{m`KnSj3ogZl1gq`jX`e) zwsJ!RmRyb554y-Fl~v46-2)~A;`C9Cfr#GO8jlD;`V&-p$|RrchTmJ6FuV~N`sQnt*DQnpKpi;JrvMIx(gk-g`| zb&Z7V>~Y;|yViBhdu{*s_4)q(_tEF^s6LObbKd7QpU>y(bqW?F(K4@Yxmmr2_xqwR zZ?^MAq+yMk&x&#Ahew%)j!*CMP}UGa8=9gmy8Nw3xaV5D4obmk$Z+BL{785VM*xq4 zd5J$%rX!>b-Y=;I`%w9o)bFiPSv{%`uP{3ra2JVK2lfk^`nV3Tgc{>w4A5pc^0it% zj<`Cv+<3%w?tV2l&-`^Hez05;yIsMv`)U@`%TW;ZjS}M^AJD3T4)$d84IF(Y*X_55pwtm0?vQD-pju^dK!_YayVEQ{^(#etcG& zdJdtse#(xO&N(HPg>YNy*3sc#%S*PotaMQ1`2`YliI4Z!E&vrGffkPcH@?2W5{Whi zFAAq=bsTwr<9iVns5CQoN@8@(ya=-GfyB?e_F&t!>Fk(P=@uzTY-ZTCEd)$T=3i>< z+fv7BDF7mhb_Cm|zDrQAP1NjAC;`0b8WFr&GEKZ%_r39$#v+o2-=ga*jP;>+P$M0ML_T*iRpr?Q~13*-`VBL3kS63hG z-rOw`4)<(s{&7dPovmPYMTKvrS+Lb~pM;oL^8Kz#w^?IJNz>t2XW(CZV~xSH!JuEC z+#M%|?JDF&o6J4o9QHClH`JXAj+Z^NBjK*G+2*+e3 zNzn?J&elZMyy&%CB7lM)3OG~c>SroL(;a+2Ka35-(GVCi2#)S>GC2s3-X0B-^}ikJNAcI?)(zWE_T0Ub>UoNYouo6BSy{LwzgI8vrr8@9L(x z*JFax`<2512@0(s9WJBx9;y|6+R`@JziMy$s{C4*_K4F+_jpT(Km{s&sE+RGr3lNg zaEs$)98e_!a43Z58F?-vWgh;+exYSZi-%GKNd(|VRU0I^MeQ$Sx!bn3qcKtJOOwPZZqmJ4| z$1XS#c}%IVyU&6{yQ9p^Dm$-oW+fTR6LGIB#+k|r8o2lvjuh(yuCu+;86lhV?@u_b zy>PA{Vo-t`-i(X-AtE#?@-TiY@sOg&-OnfwO|jRH^^w>WnCsI$qDHgsbNcL4p9ME# zf&sX#WuHT+GJFa{?HST2Zc4EMQpQ*KvhH9ty65$K#Ok+aQrlftm>66h-7|BMM%LFb zMhG)dL2;?`4zx@6v$r=41SQW9CM%c%H}rExuY&sFNbTa>DvhF)oA$$W&wg1{zdoDA zGyx3f#|k$bxT>*UjmeOMJ!*da%vNt+b(44ysS|J}vPi23KB#3tXauN)ZB1+&97kXt zT#xKQqRMkiOGCCQ;#@Qvj1sndn~YCbIdSJF)gqZLIFHA{w*ecp|v)pVGBb8>QOvTV7YEwt(1@#1yAi##4 z{kFrxjDi_nJ3K!D-AU;jXJPZ#CpUw0v4J9#k?3szVT%s{=9&$XU@ zlVO$q@~4&Z834B5)@?C14HW$LV2b%vvOHisKiiqZnIzJ7LGS>4>?v6mePax>e@`KG4@eHy`W3SN!!)a>zTWnVMY+t~Lua1n7LWy}AKF_;$x`e& z$v9U}WSxr%JTqtG6h1=iZ5@sVjKF%&p!b!amn(aP3R`QDeSO&-`*c&z?P-b@NvSYz zyY^0t)8JrJ-7nCAwXn&wJMi8flh*$IokNIzpn7Mz6-)L?d&RKrKPPNricNSPDk~GYgUP5@%+SB zep2^xviHksABkuhQ_$IlTYag>sm0R1c?9~APA)IH9jv)WatTx^l)Fc0m#A2rQh9Tn zCU%L9svG*t3oqNd13DJf#pVN?zyAENdfB%22MiODQa_#15b|4fb@-85+Ld5czPgZW zQJzaJRqprNlKXZ|veuPbBA&O32rrA0o5Tl1f=ALojZn<@4FNZ*MR}D!&kHje3@IqA z8svz-6<)5G)*~(b%P{GA-rKkz2GEkycTv+;kDdA=>&a!q5(Xw{A(w_3>6!+FNL%C@ zGx@k+nX(Fw6iD5E6?dM73ScqLAp11{;{yU$)iRtJH_tm+w_<7H?b$afe8H+8p9w@g zR@_(z0qYx2krnGHWn)9;d4uXb{atU7mCZ^}soPyT*AJu*1n>D5^=8(NBAF4r>F@3) z0LhVVxBb@QoOk_1#t!QdhvwTOhoGBEmlD?AULG_ z#PXONLpU`iZT>Fz{^kLcRxaeqXlmtFhLML@uZhKck8)G5)o{Z1<-aIvINreOwFUtO zn^Hu`CjZ&r+b&Evn)0)arzUc0>SfzwO>3CX^u{d`|G9kU`!vsg|Fl1_x3c56>-B{X z&QzuFro@x~Yu`Y_0-ld0;Ml@|xbx_>qnIlh*qpnHK14mj>Y`?jK-jI7_@l_E_`$s> z38|{|jM*nZ$`-jhJo{K>pSoYBMOlU1lxlc#`#rX7+9$-#O#wQ&d1}RtZ%FFk?r6eB z((o`r{eVjKdxZoj-9_ZllBFRgv3KR1VxGyjTzy^>lC)v>({bmTSgW7l6{~eAtH1Js zBNWeu2PI1T;?VGE`Mp0)mK;I9Dx!m#U4o85QYwMc7NRMoJ}#us#`nNtD}a8>t9b5E9%B=y$o$-jvJ|-BXSs-BN2x7F_-f5AeVSz~t#BvXp+(XH9 z3yoYOhoK^O*qrCi{dQeI6Dhx^RdQfC+>(VsiN7x+ctlgLUCMZHpeXr*g!Hgi~Us7aBTX&Pg=(vE;E(sUJdIE z>g*gQo|X7s_Hg3cvs_jtFoYlx<44DFX_94tzdyoPu9FaS?;nBWRg91W9_~W(aG)Ao zTMOG>u`2G9e!dk9YO^hs;iPZ14zy_&1=-{?ja$v0@p6_9#qWmxsBxDK{j=|A;rxp= zF&}Z6BA?cI*#Bi6G$S{8&!A{GHEJeN1e>JPZ(sk50vzVEVINJwiB;RNbBh*q} z$FH{a&T|AEfmSZb1IS{*7ob_nNa=-||Fbb#!kf-aaYkI1pO|q*gGe2d$KNlmN$TKP zG&A}oiOzHggt&%8`n{9lP8-f^>0;QqEA(}TI zkry~j!uu6j0%YJAg7Yg_dZS2^4h)sXEcia_cIQPx(WK+0UGBs10LysBoXpYfQ@qJsKdn|vw z&GIz(6kgPRqJ4GE9!)Gpfy)4T#IJz%6al_7^?_!{y-xtW_mJ_3x98SERVC3BtB|9q zSe^5@A>TqTKP<-?T|C(5z1{A`u1c@Rn&mjE=BT{87TzhlLwbi{mN$yb5V=Z@}`^-<8t*{iI7!dPV?^L;foo?wPuTM?eSQVmTWM7vKfhIS1O#Qi|Np0qM1$EL+F;-u zEmnZ`l21-DWZhjNx@VjJY4;j4*%qpq<0;cv{pY)Ld+2e)$hMaBK8gDEIKt^?6K>CN z>DZ4zWo}>bQ@$>&avJU+61@dEuNZ;h2^?Lue6;~+;Z20uH?OK};v1ixm-Th{Vg`Cj zeaE#?2XXOkwLcR^!HWCifu2M>e?~@=Pheb|O3}d8YsEFRbf6C!i-Uv3m|30yc>wHH zbhD>X-~gQMeewv*{CQGIVJn-39Y!=t4!n(J3AT-T1PNu6{=Us_)F*4$EH|?pjIsdp zQu@zwoBvE-5nvyKBY^S-$i_%IEEj0f-X=Sbd%0q zU7g_TbjxTs(zaJ;qUKg=t=M$4XL(b4MQ?Q7=J1i&zy#Bp+u&(mUBtI|dW}@=_OXD_ zz<9y^C3S*Xe{rqKpAH<< z5P)dDw|_pU7iNcrReQS%k!JQSe}jyGwoHWk6eL4mwCNmCntZg7&m`f8jx0CYSz`JE zXsy7fU0iU~;X2G4P8YwL-*xf9;PmwW6_gJL4bsTz7nk2^u6q~r6*6m3S9 z7JP82L2gV496M0y2DYQdHfUK?H*9PXG|5Ba1Cgt-_b;a8-S}c8ejai@X|*!OZB}hg z0uZ0D^rEp0H*E-MR0S+O10U-|EE1d}6*w_Z?c&03f65drZ8ytlDsYhiMKg_QCQ_DN zP7LUZMfGe981_wUQ;7RJN1>YbW8*+U42Z$ELsn>KH1A*mNG*t|+c2Qgv$Cf~)*Z!w zb!GLNx0I8!89)pEoP$5Nb9;e{ft$w-X7xhMxLgvx{Hay-FD~Bj4iMx*P>DYU4){lK z9b=0N%y|YtiE9)Lgv_pcyDpNZ)lYg>y9QXwm=wvryH7V43!fL@rLC9U<++C*0hk$l zE=#ezq6bPbfG__q>DZG?L6klY*5&3!*5QGu{3r$S5*DwPvW{j|btP>T`z0TOh!#iq zb4OWwv#3ptg?uAriphGH?Z!SqYyrwx+Sh6U`6dCFsvH>83fjI?u1r1gH=W4}M%d5V z*XnM=tgvl(0ih6e+?qc>*hV7L-k?Y{bzye)i2z%n^L_B*`ol+o()#cU1Wk<>y+8nt zIs+vC2KaxaHkD>0eF1*fcCtXMhxC`#Gx)wcvRl17XCFj}EdmAm==D}Y9s5u)Z@6^G zE>qp_lzEP?4aWbe8+>bei`s#byYWsc#uV28E!_WmZ17|&Jro|$5rXd>qJk&dR=Zy80;KFg zU`Ps7F~<;?+ND_#u4psXRi}W(L!B%GlK z4K6tE`GqpGR$6LRLLz+JSP^x`@Z$)CtCVeGwaEN3py@@|M78k!=X6`MXwg5lGj1x=M5wXlaE3tZv;OzW;M zR$psZ5Dad#1W!EiwOx+-=?EoyVJOki%WWaIugdB6D;EIpJ-do20fQ&GEX4?uMiCI! zWnIOP`obKK>>Rv0fq2YUyde6hWS*_2dHZK_&}UmFRbAM@6G}85nBsuWcM`xTqMPu4 z8kDC=X~OdbHFMFGvv1lP&nzAZVIi~LS#ND`o0ccw`mH+w6P(X+7Y5z=xzRdcn&XFg zb^`MejK{Zkz{lWh4U06($(cw6qu1+{;uo;eLhdI*aRs!;^0;*%d3sZ6{dO>LNT;?t zw8MY~>X$4iH5>~-$@Uvug(xj16#-e!^-J^L+?~);U-|T2*xZS#q10bWo;Uj)1FejE zA4>mfcs+7;1H1exP~}kCt9y^mL6b@rtWXGR0{h}!q;zHzxE8r2tehgyHYo#Lb76-i zb-i?Epwo=RYiDqNw8;4}&2;;cryU1Tk z&=v|xT0L+t6LK7kcadn9!5mr$qDlD!0T%mZ#H86{r^MjvTq8NQZ+|Nxq4($e@IOgYo(AvGm;Rw$oG zfq%IEGmjWxC*%OnyZ|6#anr5Es?(oAJAH^Qf#5|d0~65K&$2@@OtbgOe*Z~O)E46C z@T{EpbAch6N93ILIv^LJ(W~MB58vdT-~mIq=l%rI41h-E0SyBfdE+L(82P)V4RDIR z?`4#uTJln<4B6D-RZ)Sn%vLZTYCEr^gY)k3nsS>T_Z2>DK#;)G9B=f+VaF2~_*XD3 z;8P3+l8}hy*dEZ9aPM&|A@H>5ecpPOn^ap6<#mhQo>OKnr6pDIqZv zWu4ICIee2j=<8E7?K=#EL!==Kri9~zy~brc=~9>+>x;uAdGHv)?A>Zgs2{MbH_|P{ z)gLn4kTajv%oz8heka?hK9G$_jl(Xh@BbSDhtxn642g+3;8{T6+3e$!%U$noWKW|eOa4+Z!!=xJ;J6|;pSTB`wTIXU7 zTR!T(oVb(fcQp*ZwSj4gc(eORUY3}gu=Uy)+~@E zpc?$fxxYbVU1u?{brQIJ8^{%I%m^Hl$Z z^KM3-^j*1$qBG3GVqwHrAQ;j@P&(glZ)jAba-XOlI0nC#yX^A&stFAz;=%Y~NDVai zF9i5UAKa=eJ&EC7%B_~ybZxy|pS4!rrSny~CC=Ip7R;NXU}0)a4^l+<)Lp@} zQCR+Y8ovX@f+8Q0gyjhyH`CZWP0EShZJKYE_y8o1e_w=GNoM@1_C9YJAJ;(_4h+PC zx9(=)$1<#0f|o)<{iQ-tj%@mNy};VbKi-G%LuE|l?K>|A){O^gdBYM-fn#V4Y8>c! zfHXUXww<7xUorKgR(|5DIF}LtK-X}n>Res6WVnHVl;yO95_nUh`n~a|$O@Y#x}WAUtI|C-MCF6(F?x zB6#%=5JpwFU;IY9J}?Ul?pPZvXQ6UJH4Gqg=Wx{FZyqJ#eSyIl907_tx!36?M6=sM z2~O0mHj!m_HI&zWrj?XrRYH6wb3agF77f&V$3?13)8k zz3PT}WtLJPF}{Uou{}Fmc&~al+F2TU^d(n3h53gFUq=;}$IS;dJeXwV6B{~IKy42K=(|g0V1_+t3@(jESOSG(M1kjY_+%TZ`X8<@ zdlcoZS`~Kmmwea^q;rU<30S5^}Z0(mB6ZVi(TyNQVY z#L7tn`T8JOLkH$n(#{W)yfkCELi4~Ic);EOpUu@GS+`%RW=@oC0_5xeb%Bc`(1`zwimYbaA0=FaUEm1{#?uOUjyrTqy>Ew|?#Zo~6f@>|@ZVK{riw zbtz=X-rm0Xg&0s|r<;CI%gp1bQv=D+88jOc+o9fCzjWjl`Uou6{~!IdS9;{)T}yOx zlb9cN7j+jtR{gKFzRk0I~*)JL>OuIfDNx*eriMlW*uQ#}P&k zEqrM@1(kdNkESmU zW4m{}mOYXqr#*LP;<_3AHu#P~)vt++#ZagxvOL-}C+NsT-V1~Up)*LX}Dm%GWC6E48<_73E%KxkpAqh8(y z1Gy5Qlez>R;pSio7AH6cPXpJ0X)#D;3u51|I+e*flR{*Tx_J>w=WVU2bJceWwube2 zhWJWnzGu*;U4?}vjXDRhYv!jI|y-#jjxEdKB&UQdt+6{ea|01 zblLqbo1mKAL%pot90e=S3M39QKWOA6bFTE#j`Z!{r`!f621**`VAh)a$@=KU?Md$d z==iuomT!gFF1>QV(ZU;gFQ=A$lpjBMZuP`lM*Yy|R`RNMU&J=b{Cj!6&N}h~Yp~E8 z=d#J$KfT`v?2LX%s`gUuG_TD5E37FjA*(e%038aj=DuV3WdU!Gbg=R?j(mArhNbe| zKRVyU^JkAig!=xa<_*bVbtJ;F3>*lUg>L{|HUTDD3M$}IbYXO-;!ZcG@zYEn-rm{* z1rk5$hDZBf=QJ}P+o!0#iHWTy*5Fw`Vxxq7kI{S?G%C1QIR|mukhVl{mY;J^te;c- z1zJ-%nQzEgwA7m(8+*!sF{?)D7~<$QHFy+YDn5LyYQ}-~&AaPP?9syr(PG#?k>o4d zok-NX)(Gf#P}QqE5Y@hO$@m`zfGiif!uQ-LL*{Xo7|Nj|km zNt=rJvNxZn(7oZF(9pOAl)ZLAXFp`Vivb#8KL$2H9T*1A2uFpKhzoT?7XWB1D=1FNt!}; zxVOjIsYvyXA1Dyx*?N?hiV=zd^*!sBxOeu(VjUyl9(&W+eYm<%&q&HYi{OhL{6*f1 z$tB9)zNhNB?@p-tz`Q(P6P>Bj_h7sM`{)sa#eQ;ArE^j92!rqWisDmUV^T$fmXO@m zI3?*CiUPN_)z;L^i;Q%Ge+SqU`Xz@tZ+z?5+2E z-#kUv=Pw$asoth>B3ql930?C}PrIhFR@XPxA>WpP>~n{997#j{SAv80Mz5?VD2)A+ zSbR+wvY{LU9p-TmH;1 zv9TeY{hNRD{8)$lG5j3cO{PI zLOeZnf_H}YyeVKD4!hO-EH0LNus0hT)t7fwJuec6$$p-@cJI$OgLngSQ}PM*19%03 zM2{Pn$)z95j#ZfXKP>=w!r)C&Plt|?Zm^Y?r~D=>T=!6$Tn=$dU+D;p_g4F6p!x8l zcFP;+(6s)?#m4p*e}-kI9rwz@ZQiu*8xn3$KS z1oih}IuhRI@^AbD>(^ToCI)KpE-QbMFOam@I|>p|6koHg_PczR^h><)WtT!$cx>?= ztM3bmL0;6`$|fe~e*87HS%#m8z9Ce1?|Guz@CN|qr#}_K3@)5{3f9=*@16lX{cn8m zc>H7Uo_Rit<#F%?{jX64-?*>UqGDEspI}jwlNXfDWVE{-XoN$CUY16jf+?jkSYbyi z>dnyG&tUZW+VA(Eu=MiI{c0{<3CP!5!xfzXQcnTZS_jC>Ll}F&(@;&ZQsyfgf8482 zd|iiakn2^bq&ufYNwF2oTdD4l`M>G067e}etiIzlb} zjO{~Ni38veat5$f3y?Ya0F@>h%;Kv8>0jszqnDbu?p^THR3Db}_Ao6s-+kEUmOCDN z^Wrl38y}PkN_`NoaUmdaXjXJ zX^BGtmgZ&ELU9*3?dA;lET{(OZg>b&%Gc4KrTCyHTeZ%bOptm4UX8p52+6%o^?vko}@xt)9iFk z3b0^igu(`O5M#d;WA2@4-_I$u7hC(55<2%WzPqU}3y zI(Veau;ZH&!9B%2y#kOW2NJ3iH&E0|^?P%YT<`HCu@(;snmI!zQL9w}($KZTQe6)N<07(nwVw z5s8814f9vLz0BEYqhFnSnE(Hb&asj54vOBY_+B3wBn(W`&9-?iK(z6my zvysTQxt#4Fl^6J(2!;yHv$P}}M?_;pX5y%MAT3A7g9u0R5cMV|ntAy=78d5>x}XFS zP$^L%7ma@M?ZE@Tcf036@IPF6%01&Jo!>OnC$B}ZrG4#(%+w{ZPPiU`xY0@yw|00yCKzn zKoV#_Mw#E?OOmlTQ$tN6f3`s(v6KQwzXC+vD40Cpa7Cm!1fwrovhD$m`dr4DO971+ zJtx|P<>ITIicLBck%{B^rO(b@Q5?~bVbifz4dnPPumX*G|6ECf_Bd=GhRZ8#>~!0W zD31S=00vQ8qmc_i(xB3+JTINh;P_LXgs*LQK7&VAVlf=wCM>%wsd+(^@FYdWtN~H8 z+|18N=`Ui`e{|3tOAu+k%kNEbn$J*LzbJJ>dw-5}`R<>TJ?z^sKJP%h;=91Y%UM`&Z>#4GjbeU!WfxdjRFGUVx&){3>vW+oq)K`jS*{pyj!XSeZ?81^+#YU)@Y; zIiXIEPJWv!W#)KpO<3x-D)!|4!@gT%_H&CHn_CT8{arf?A5;>tINDw__n%nYBT!;q z{q|{Y<{Ruu^^J2UW=D1we(jBSXryNqrO<^vv9i65FYY+v>j`4F*Tf<+!EUT*wX_kZ z>dzkVDwz=)g$;)v`De56i3tL+OnL`E3}`^p@Zy}&zqC*WZDgLg`RvV-b&K{J&Bj*R z0GDffe)eN(yljS&KPxWYWqUF9_2#HqOL<8zGxX2v@M$^=>V|QJoX-gaGJ>DiwF*3M+ifXYZ&8e@S8}T^0M%hJ{xUJj!ryYXA>sTyn zOv+|iAzw7m=T;|SxA}hKF}hO2B25pj@c#Jarf+4^*ZeU%=!>32it~d$D;2+B(TB4n zt6;$1Uao(BD`=6YwWtRaU9v}`wG9J+YI-N|vPxU?#ztt~b{S$E9&LCkD682K#~i+WnrNbg&5 zVU$JQYIpjJcg=Rqr#e~!gBBZ<&Op%4Tfc=n>q5s7k91zxRn~^-HB@5Wi2lV^2)ewS zh(V2nbPgr`oAG5k-cspi(kG@4{z+NqzomTeMeU|Wkyq+&o{MLMxRbqKe+e4YG5}a` zBAEY}uOow!nHgkc!4-iZ3LFVy6p`YL?g#7_q2LlS8usq8EzsrI+nX4hjC9Qn^}R=F zri^oQ&FRUU>*_~Gg1*m|k`DblxrkAti+0$Z#}z)-Rhen3_gJP#)eqsqO-5{fgXE{z z!6X-4@y*2P2R&42YgdLIyp;Gs&#h?iQW-Z1za-4@d8F?5^pH^~8{@;&%|Ew5k=k(Q z`@LOLM)ie=&Tp9`L=MJ6sZzE%yR4<1Bu3QM@$CXdr~e3$ zJ|L0@1(NcKskAD8Z#3ng*k|-(j+zdmev=ytnDffkX5|8~-!Ul$UO3egr2h$V#nL|$0DXOgu7i)(g8 z2#s{+K7XWBuNSx?^6*O1DI;aw=IIwNS9Pk+CnrBqsoZ0_kn>!-nf=A(2{9pN#G}wt z$6I2fMs5w~=-un&hf)8Cs`_kXw@$el6+Oamae*@0NS@CCG{qd8oNn?}QNa8bRP1)# zM|~9B_2&CXJ2~l8pzv;f7 z-#zWw$BVUjX!MmHe4LIZLM@K>VT#VJ6ytF_+s}gBELk?u%`XF+rx=@wfp$)s0vuVW z5BY`?5iOkIkN*gr0Oo!9bXOcEOHQEyZu@x_IRabzlUM!P?Os+ES6f>c@zAK~;mWtX zY%UbV$qz|8C3MlBd76Q(`{Vdx!4nUpELvDB%kKPU^ba4bHmJXUZwxH|9Q5!jylpfV zlI?7$FL2qfE_esc6)4o-pVPXBZCc6Xxu66T1xM;%_wmHS{1Y**C$e$faTxpNmrRU)EPizt{FJDBT#Wu~;Eh!N_X6rK z&dodazTJg!&+Jp;_b6^=`={0?PDa52S@rDfR=bPkR=OJSa|HP8!wM+9^3ZKoYUZCj?cEY(8}Cwv|{6o zgZC2Ox3Dwp*sBsfS^vhgqrSs?cgjHxRCT?jYiKT$wCpS}IV!Q(C3TB^M!gwQOs?k% zqD>wFXVyLW8#uG{2@*cy=ZD{XBs^vK?4pWy@9D)wvOUn3#DKut?{r=0yRei+A(9g0 zHa`V6A=-WJo!UM9IsNqK2J<>cM`CYirF4<4@z7%@VNhdJ;w0m$WwO@SNk@rQYjN)- zQ5ve-SmL%Q)>*4D_{5X7=-Rh#yyxb-OXis*Q8%D67K7_GmZ9GGfRe#|t%{Pe@ljgs z2@sJO?nM#QX~+O*Xnp!;>RTdzm2_V#cANY2-rU4vtXNiYSeMPet<1CKt;UJKW2$r^(vY9DkSz>{gfqup_YqKjQZ z{Oxs8(G+L3ixwH>u4^8L(M6XtD*-#}*1h)8)j2y4PM!~ERj9~#Bb!!QTK0M~3GRbk zdyu&OD)q^>%R+sMI%%X|_f^?;RhkC#nWZD6!oXo0-+U#bVUbnhY4@yJ%AY|sDkt4` z|15euJF0Uy80UsiCJk_L`t}31n7hq-=@NJKIlD!^8Sl$L7@~hUDS|Uz+b!Q5yT7I1 zc7c3P>}Tshda3`>64-#KuvtP}dtBsx-8CT}&+^Rv9|qQJb2$pdFLU9U?u#EUit1HE zq7nllSDtsd<<9jVf_%3yt}Q+j5qt6QlFMgKXwXYPQh&@~w<@;5FG8@n4BC-*0M^(o z_}YQ3%y;_=FtU7=rUNS)09hPU4oGW$S{9Z#-S=qZb~=onw1uDNwD%!LzRIc}ss)m=Wxp;T+# zo~|aSa?_OFCh_ZOI&!bQxt#PdDDmRLNk(8aiDvJLAqAVD7uOFXG^TyMW8AD9^n_zH zv$l6Ng?$uTZWc?*X1CQHEh#|+voZEsK5jHBuWXeI6!LkaJ)KjYX>RUL7UrTiW#mtH zpuQH4F<5Rc4j{*cl@{vMW^ajKX?oD`@)X#cUc;XH=x`+~sB2`v*uoz0r#mN4F2KK> z|A4_(NYQFR^y~jsVYD z`F^;sG&C~W%;5eY8>=p|3oC6j$RoUg|A&|RUQNXEEL}_E5b`ffsjK19RSl1=N}i1C zxRZjF2aQ_bcPjtRSXifc?&iP-0+KRq0fy~!T6DqJ|N{~`yzuvqu_ z(WW_8aJBW6a{J@vja2Ngn7WZLPa#MDiyPU^#!n+k%C6eOcK@~n_FJ*t_AaX!F|Rsr z?_!T|p$FCGz`(%2=H^1uGX13p$3ygql|38FHI4z(3}CrrCzwQD690`4x?9GBnF4AL zG^qXKV*qLf-Vh@^gqcr^1S%Fs>qq->9&>*_RaKQ_%N5yQ>6o8$=p0j`mzC(ui+qut zYQ!xPBP?+GxZuvf^ehhNA#%gf?v<@BQ=qNL4Y-}7H=^UcdP`Rx3aN1|jWRc>3%cXQ zdN%d$uA!~S$jEMEGY!QJVuKasTmQ(0=R@6VnYbE>1W}=|XJN0Qy}LC$?hm%#p2At; z9tk(!_+Dj58z_J0>wgWZyb*zSpd53)0I;q=hS7FE%oRZev=$|{bztTzos&4Xwx>ga z6f3_TyvFCKYZ{;+#Hy==?VmlFZvGfP7U@D&EG!VbL^Y|?15|Evnr8RD5|8p0&{WbE}g2lo4PS>Po+j#StoE?m1ZV3g&b!Yf94)Si1 zVK~?4^nvKijUvE)Fs{G(JJjCvK)##_6Cs+uG))xpaZ9;T^gTlOZ?s9q*2{X$8yW7) z_I}q?*c9Z2lJj%}lwY20xI~N+o(FNWzI+5glLGcGbw0~ue+k-0uf57E{VeE{%HZ`C zh?d5DPKG8*LwT15@G^Ig11y6@+F6&*k9OcnNHm&(_AUi9Ior-vGP%8-1Lrb?I}^M^ zjjwf6=i}}fcx$Gd9O0N`sv%_(^3q65{Sj!`lWa2$E2-pf4-6f1mID;Cva*y-O+}im zRs$LnD)(AA13by^d1MhjrQjCAIyg)64ZUX@IL+~W5%#OxxRI>)mfmx-4+S|`6qnB- zT}6^bJMga-sPvEqC}8yj&?*?fC4+2Tus36|Hhh>_iLSiAo=8y z2saUVLCIU}=?Sj$B9cC_2?=j~!8SPG?*Isddw>B*KS>w32>&Y@+w|X&0+d6${X21S zW+8B*v@xs++3_AzVZ62yI58w{h;x~01gmFeG@VR48?5w0**<>&L)f~H#8M+8e^kht zysEjDXq_AOLynOEs7Q#{zY?a+ zz5@2jINI3<=AodSCU1kAcg{p@z9SWA{Zf!y1cwNjHPEv`X5X6&-^TDpx9^DB1a{l5 z+nM3?cG{mdP59{r>T7D+k|wnU*)n(EKi2)}uxR!O@iW~^HD=m}qGa?lB>RD({+~hB z^JB@|Pn?l8+pjj?Wk)d>wZ(&w6V7%5XWq{isGKs9vs1}*{v@E_!)UI~{SF_*8BT%c zt=uc)p(#;e(g$KhvydSS86%F-Uvak=$_2E@EQoxJ{c|Hebni)oXq%54OZ-D*x~!*4tHx$jjmrYnaC+Itn?Mi)Nf z+&lqP9`df2z#?;{GET%}IH0lEEwkas$(B&&2|~61J+W$AdW0YTLoYy*)INm|l%;Bo zb4dfu2QMfeD&ILHCV)?nrYLYx+S2QA&4K^Lr*yNEfZZrAG2J3-$@6v2rm5O{I<*wO z@LD}5$Hpia^`@g}!ucD*J8UmO|6vL>`;i65YZ8+tMhBQrYJ!Fy1+-&zDB8Lm8Kpq`gFUegA6-%Z&m-$bx# zW0U&_1unrz!V~Tw(WqW=;J@`rM*URekFjy$fOM6a-N7Y*-D0e^{Je15AB5aDQ^g?n zQ*x7sB0vr62>wn8{A0yai*PsywuSWG>bpBu0$y%LpyHqfI>^h;jiOPc>U;E*Gbp+) z$RDo>+8CPrlK27B=?<1He=K=Ou_04VfOR?8E`li;xE6SOQU5LsznJBMkZ?hk0O}S} za~{!`yc2f0Laz6fa}Q;MGG6$;TVg~zIcM+^lwYfE8D95}mu8==OrU*^ZV4@ZLm9LR z9!nn{*?9{zHjvGa-rgtp_$W{a4-QU&mZ4ATRtk&M%ArF)0TjYQ7%khr+ic~OeG~%A zA_H%cmdIB3BtmubL*`8J1Ovy3&SiBys?*gDQK_z znnN(Vi$~5#G0FybyKmQUDNYzV@2)f0W)(bYeBI~hPRd~5m+mu1^&HeCT|cT6J=XP; zRy0`t-LGSX8JqxDo*;*6uUfu#`m>FV`#`O&uf@Y4e(P=tNOM4(%W-R$6RHIo)7zi~ zs}-i@I$;oUL43g0kw|#6&QFv@rHNfTd-a}OZ~Pw#5$ygLi)oc?UXBRW3lAJirG^K* zd0Gga(WPG{o{TVu6B-r|El>}m0_c1rQKtPE# z<;-^;kXOJ@F#r~jg4>hbkYzYw5>@5Ed|FpT^xaW^DUy0q+9QH0Sbvj6#CuRI`t$^07xmH;yOpEHn0I%Iow!Ll` zU7lX{Z)} z+$*?{08BJL%u6A!db@WdQr>!HM%zF2tpR|B21Xse+bp|D-y_&a4OP;~ymdwwy<=OX z$o4gDGS#0UjDp%1s3pe0USd5(pPVYHwtBaYg1Mgj-ef}EdXOV1(S%N)$iT>@^yyhj z%~X0@Kj9SZ0B@O4W@mh%4b`-iW!@bn?KcU(>}bj<3S$A?BE}y$I6C^kuiPIWwAG_x z*WuJ_9B-ukxdQD-8OcL3Vg;5bF~)eOsywZ##J^jq&s&6ric^bA5D!c)A=#QaUrerw zS>BrR#1y+)IPv-%)hz7m7K*RV7%%53?Azc2KOxrIC=x7o(tO!rZ*MsP2jotWloJ$m zFCXV|mkCj{m%9u+5@^1)nLvG-98ba*7#h;b%7Je%xg!Nx>y6TR0_FmC-rkQMwb+)F zUX_sTO2J+-1yBz76;OX^Zr-+cV6P#Y7dJ56HzmAU@y0`Ao(IPQ-pAm(dd&UOzai?M zYhPdfpB5lE-DUg^fNg>5L6VQrogXs^l#wSn9>X9iK zB_w{TUmumXa!odZJQu=lyJN{LY#!p_VO$?mR0wdIoYQkhppEW~w-l>jUq*bnw+R}K zw*wlRs=I+`3>Y6rpPyk#G&|;2cifB>lrbdH>_;m=FOO{z9$WOJAt|gV=lhO1pG~U` z0ON)jsm{GGpZRuA%9WpAA7K!9@tZU6RS^+$fw`@9Wsrhxd|oNd&wr?(s|hYEyqmZl zEAx~Btk(U((J}_s3H@u=r}Kd8&~3nD6$=UsT#ej@rw?^i;>^Livj1L(uTEju+t} z(!SC8Qn}^t4s^?0#Rw!Aolf@yj3PG4jD)A(b=+Fz=Qp^npHTJ`6b9sKF{AI)%pS1C zDxnBvZIdFDELle+iLzzilbxX~gR!;XRkBp} zeaXHI*^L<_WZ!o)h_M^%jAbytqxa|g`1SC3^iP@RJkL4zeV^;TuIrY7GMV}5CM96BY^^mE8$F_ zI}#t+H8>d-DLMHcI3U25+A}1rs5KKUGYa%u04E=O4>)h$^GjNM%mhpesA*5c$KvS1 z_=y4|)2`lr1_%{EVcrb|s(sz2SQgx4WL*zY{0E)avN~$XM0E=gX z!PXg#KxJ{Oh0Mx`vik1QQ9IR-&HzLJBZJpR;Hh~)_fdQOlPb8p3OXhnk5ut>ymh?} zf9Oyyj`*k`J=yZ)e?`**cm*zZ#Z)r!KDAs&b*?sQeR$m~`|r_Kiov4B-dHp$dnumPc>rvU z+za|rXMVgkuUabwY(P3uP)#UAzH#IB`j*J^1MJAvn~R|pi50n$N!?;|eqoA_`l7{^ zWA#~$&HOfcHav+`AaFyFMuujUauV|QA626iok33>J9$1#B~&ud=Gq>E7gHk)e(n_@ z)WWKPFhu-+mDV^4js!9NTU6WJ@`3*@>p5j1Xfq~ZRzMje7zgoJV`&|Opd5Cy*r z8&9sXx{=s*5+A_-q16rblO#ZDzHs+nvotXDR2G`kRq-#$v?x_p?}$EBSyg*tU+}Zg zUBNnZktXKqja2>HsrnDmd`<7dB<kMRgxFBoUD;M9Cc|8-B)zRolMyByF)hN0Tp0e>pi#@`F4dQWY&g*(ea;T zkI9e_Q0hP}H>EYrgROyS#`5?aNn0+YeM2cj)~;XgpM_4Do$z}tp)#*gLOnW-RMz^LL~lxYR!UEyxt4aOJX zq)cnTCXN8f8vHN#BL_x$A94(5LM#{nrnPI#dt3X}jjrT5lr)E!mNyXA0w5dcf2!m> z_xqcFA{Q`sr@5fz*Qn31QRgZgZSJ;nzULs2nur2xSkyu#`P8KsfcV3i8{x)oL(Hiv z20@`9f5gM1LJWj#NW0sJr$nHVM2@X zem-#(Bvgq!Cy#eZ5CxC(s?O}i`NUtk@ogWs)`|qmtMYnr`4u|+PUf~(g58t=(yNlh zQNqO7Bu7g}>l|S%dc|*NCPdofpj`2q1oBRf^Q+Hc-JX#NaoP!#`l}Y>{H@gWhFlvZ zAx*ik(We(SIH<8W=0T#T{~5T|?!THAR0{6^9()>&CR;9u;D+`?;nC_(hWb)oA`pse z&Z=^54ud4|^b0+u;0@0f3-UBvGY;)&&w21U+Y@JRJKd?{FgAcp1R7GjWIv|y99`1dO`j@SZevHpQUX`A-0coH?XVerZ4y*si;e|ZQs5l?Ua;`{d9EWNpc{zDE zH`;@5R@Zv(JOjgeong1%wwv2QNIeCCttD0{=}-kiFKkgi1Dlqw;hgOJ@f7_r%u6G( zew}RTm#hz95FpC}c>n>bf@nY*s~aA!CWX6?@t7NJ1>Cs_X+VQ=vLr^tL z`Jv_wB<5<+dAjVk0IUZa1?Tm2+H^IBzJW=5Y`(ndmmer?Q`01!z0;NN__@}C4toTsSyRQ?RZZkll&%GU`&%N|cFOY$$PWaE% z`q2dfi5bNGR-c>TGHwM}i~2SIT@3DWTXiZ<+Ye$mVL(h97dk0gIQzl0 zRx#25@1DdQLp8T#=ey)mKQ)t}@dWXENS{oA9k z!HEscoV8Lx{dwzzm=hk{#%*fcnR4U${qHt7FAcrYLz?yOPemqw~3YK z0P}#PS)RfCLhh9TO8j@LcZ_gy5Lm-p(1Qbad|dp*|JKu5F*qIc$tGsObqEmeL5=u# zneLq=Wixg>DSqe}8ld~BIQ-j!C-0S5!`q9)E>rGywJp*o`TV5eSbd7=C1mf>|9XyM ze-4^gx_BDDzr`jSNx5n7r@RPy>s{gJp>;AF@}jW;>_vFTXTss1YvswhPH(cPQb8kS zS|iwUaddN*<1$xoV!&ahgoMPilz`a-V6tiHw-Ch6ozTlUek;5DVkARDugM9os7Ar9`)Gb=$1XQ^aP)gA>|R0V+d{HrVII^atHnv26DFeG<02!*KC@ga2j6Ww#7 zx>$*L{VI$+d-yF7qp%s$!494);BYyLnDc_b!2Ik9>XVtn^CT^(|``6nl6Z;;rb{iMan&v|Tk zlytc-Ny?c^=HoRwlxxO{$8C?R4-{4k!#k4YulKIevJ?y*?2oU9!nCr58T0}iU;Ts(s! z0sh*cUlaYTc?dg{v7VCL3+R|0l)}ER!pVMbCP{my68>PJAc9GOE^#$=u;XoB_w5mv z+&IA_B^^rMEQhpXy~Rbya#&&?SWpOHMJp(-J#wI>f19aSF#}W6#-Mc_`6KN2@e4mT zzRP??%0I~RdE(#s^l>OM3U}c_?N7Z{4X_u^#2DPoj_t-2vYY#;eto*6T+A+F(o0Sa zQ2oPcM_qr)@qO^Z1}I~af)Y1v2kQ6a38{{nA}0a|lJNh4iLm|?MryR{?(7KH>m0JaEuBo9==0ub7-{da&l=pXn=aiy-8% z3*TY>v=~3D!ku&hQdi*j_HJ)t2Nls1`qX%>B}hT;;vxxL$A9T04f%}LPn$xJ$&n>`RVb}$}iB{uJvVuKu|Nq1y>vR zD(Bff*6NQ#TPSO(ceu*xb2)uBudr5@86B?HeHd5+KJ)O0|MCFjjF{wl?y@e-*8q@T zBb`tEXgjbhhu?Vm`BSxCk8D;~+h)EQd%M#elN0pZn(<4N9Dgka5NJRVapouRLphqR z7}-Hh9X|(vm`AjuJ? z33ml?SpTHPeF(6iy-)1pD3;BV6zPP)uWg_5&0;~7%Ledo8Zx3IrL5AdeqkQaT|RTr zH$3t2G#l|Ja>jd;>1Mx)ZMAQIhI>2|8zNjJ1dq6GbAPLcJsbHD3v;4zg?e@ZC>X{z z*F2QPhK4ci*v~_cBy~f8HyClt;|l7^>NOj&j8z5mvF#)n=%7L(q{VvyQmCoocXZ@K zBttbHatV9mCQ|*gStZ7)0zY45qv3GudA-v}p(1Wz=YSFwag6(TycKIDEn1VaJYrTWs$V6Q(N{uC+rD692R^EripnMJW7m?QDTO@M zc9+e$=WI~ZIQfX3D+z?U2EWO@5>T*n<=t(31Zn&_2F<8RMeA*^$jHm+R~c4@(EiZe zZ#_Tbo()Sq3-+tMYYz{43$4#8@J7fcAqID_$YL0SpMFi4ombx5;Fl;SNhn$cJ~)HV zU^`XYxVwZne2ZSna+R#>0?%4f<$j}o^&(HHZLNQg&WG3TH?yD!XO}J{Wv*FL#0JMmWTd)_imXnjT zni}8?L5?fl;6nkHTJ5gj-?LO;4w8YG7N$s-9*H*DUZFeQ+&zb<_eivL{BhX5l3uh{ zD;^AX*0gccjT=7uDCD1etH?^5`FW3RQsD=kMn^Bg;AQ`_*i)=M3skljM}xSjvDHX` z1h4l@O-q+a0WctrlU~Xo^!0k#m~WYiS0KQF$Bn#@V>d<}9K)7}%9O6>&j)7(0>R+tIoHkRT0%}k zrlbCkTaBsk-}EU{ab*?c>i=6HGI)4EsFK%w<%#j%emY)!bvn70 zBv}Ye)w}OF!j(V^Is97y$&dIXaPkl(`P0!J+}UV z!S)JeXP6ZmZ(1<>xc}*Cs`Y}A<=s^-FgJYK;Y@CCd$S{;qUBPStYmmxIJxz1vqi_d zO}&u+h?>!zEDV`LCJq1%{>efBtF$t9UUaKnOGW}^rlXyxUtjw4VY1c;IdxdhE*XS3 zMZ`WiJWucx5nNt4mKsLm0R7v2>2EW4M9*ZhzHqAk-F7$0233$)pP3)!k6Br;gQ9!X zm(lKL$Or>4t3Howt-TkeR82PaH-auyxK<^qJ)Si9(`a-P0m#%(>=D^L;A+oZQ-PLY zV^|uB-OWWxY7rd=0PWytI=I-(ICn)oS%7wOGKsu_Gxyi(1aBVsPxbXr zdn~PrUrVGJSBKj9;Bu3I(Dvg0aODqmo*w{hrs3@WZn*S6kiLDZ7XwZ2Gbjb~UHO^v z(B?|;y#E#&kZeB18#c4WTrxM%cCs{_>5Taz-IM6zIJ8CI6D23|v$lBe@3Ukmx?GL( znhKN&@*Y;+93|S7LftT+k=h@&G7{Z^2fr;L8-}eZ*z`jr-n&wF6y z3fpU!Xm9PT37x9d0=7w0TRPR8u0VuM>c+xIr#6^p6Y08!zeki>U+#BAp4aChq@)=3 z9sUYtW0NQ^sm^nsZ$reRhHx>xfSzJNsvD~K!WL`bath)~M~zcp{XCX5T#VK3DgDG9 z0spe@rrVJCuT3H*NuUkg8okdBIduM@JceQYF)vatlGI&Z?wEy$sMO{*TH|Py; z0l)<&NB_M7z&dfn-vXD}kcy|EDygh;Z!&#z3ut3x^2%;xqm}M>c(#bu@n=1jEp)$y z6zM@O{*A6s>6Y`UF3WJ;O&$|Jnnl(}*%Km}kt|J-M&IrqO%JIyzrs^Y&_qV)EDdC` z$yEPwAYGvu+Mahq{@(J280ie0=J>)6=deFYl>zR$-315d5OQpzTI;=G-^CCHeRG%H zrLSvKXFLw4R{)dWBRcVQVVg4!0=8R&gHYSt&PLMYq@Rd`0w2?kPHZsnnSliIhlLZ$ z7`&zulA}Q@oS;vDxSqe}Lb*D};Pt_@ByJjhbn)*K^l883$=Sn7SUBLlGlDzN!0<0b zxNo;x4%vN9bAhEk#o^QPzU@JDM`EqN+iW9pclTBY#5Cw}sRIN*S@C3}5Mik8K#>p948;b(E~Rcpf&% zz=kii0@qQO{_>JWC7TeYwaWzm(f(btUQ%yh?bNLUYU((<1LM870Xn$^>cPW~>so(E$Q#P7WTuhg^E42EKm{gv~W=9F6k?kV_yt z0g?fRRshVH+YlbdII2W)zPJhofYt+IsX5F9iLb19n%Y?;iTFtOKcX5TO-5p@#;TfZ zDH33-iJ&#wId0t+xO7)JGyUf}`B+6Vx(DiA|C8tX*GPZTz@03kSGs6|WIc2$(i^Dx zSoM_^q6-zZCOQNit}IS$dfn!U?q_5o0>a=1Jr8K#0S*NJKiW%iS>r3Gsf@Lb3H2L4 zUfs-y@5^LOPL=o71k77n|0B8}!BO>}#J@w>a64$n?|1o4*tW!hXV@gzKgGhR>P==X z72BMc*ceaQ6v4S@W{?-I*lm*7!DP>X3kSz+E9JfFA5lj=j?G|GHz5J2?A)^h+NLF$ zPXPB*DfoI{yG)$8frwfmynJ2e+klF6&~mD{?|jNe){N-rV;+!0^&MbQ0P$`>e_>KyQ&KmshZJ8Y$5vXZS0R0n~^L5lsy zeGj~bU9VQAyVR&fD1^GW)n4AGpEi^aU21}9>+Ub}3|Mbe@cwz#AS74_=6nbwEhN%OjF z%+!(UClo#ExU+&if!DUCM9+TO~l2}t}d ztvY4_&WrN}vnMQlf7hTN>!@VIuZnAe2?QEj6FyQR#okuVSC*H`40oN5|5lO+S)7E= z_dzZ~;S{ee$*4NM>pei#iC8$_%ED*p^9av1)85bL16e6tc6y}1SmrT zvCpg}6Xo8ooO+Y)qnXfb03isC@TcUd0gU`QXQHUU8MVYu)gVRX_tTMv@os!=qUWuj zgjAs6xpUs>oiVf&l6h3!{UXfNp;lj*JJtqV)R=l6LUxVJjI@Olv6}{e?hW>}_?f1S z9kPv5_3ThVa+S$*m#38A4Hehh-^}_5RTU|p(3Q$6Hq1KGx515JE6>22B1Zez_F~xKq9=PeYs>* zyfIh87T~HEzfuLpL!WM5h;=xg>|Bi0OO?y>)wdmU+dag(u#Tx0P4Aha=u}op|YB0dLs; zM8yOAi<)!gME&&1Q^WehMaMpyIO4osV%nISO)*?j5510fE^@m;q93cK&_WFLZ z&fxkNs;-6_mZrNTO8?oq%6(~XtQHfHj(*-(;gKb5u799uO+O`SmD&C!Ou!#*X1ea5 zvG*#7YSX1q_CXdgN040OyG}W#+>R1?NjwHbbFgHd$wK-M zt={j20CWRvbV$jgl8F@Fk+zEjM%sU?Jb|m3=t^n8lGH&v?~Kg2GXidlP**}2y}TXw z%=VnmTJ((cb59L~<4Z?QZ_`@YoTd<30iUi$8nm=mnm)j}ce)WH6(!Y%L$)bWXpNjy zo}$G`${NK>W#6|nf0quDW+=ndQj=+l`5#6lqB6rxeWfePCbE4 zRJ`xM-IC$5n=poW{D91f+Gzh0%%_T7_x-V|ka~_gdWxl!k+eeS3CJbD<@HvA1VshB zp8GhJ|8<3L&5Ql}P3&zpWtFYxGrtu)0tQ$o2IteNz!Q1@{$$ue=9eZgcH~LfbMBS? zygXbmP<=6fyNM?%7=$=t0z;k=%&X^(jz$E{(`PjQo7gI%Nc9=l!^)6ZcOpt@SV7F`5m zH;3d_bqyB>hoG7`?VH*3Z>pyIK0+hw`7$-F)1)u;Z>ib3uLK+mb{zuAG(iPvceHqo zRa*vXVSae5##-+&QPVNh1(e7D?xWgWSt>Oz_nsMNFpT+tibh@PIV;e#o!4^X&#a5= z3LUr#`I?t6j5sQa9LqNLd>(R}FuDo+X={qmh^1iLgFA^1l51Erb`v~|f%F$Rv_|j;f9PmK!l%-Ux^XBcL>t*3N z`G$a3BGGfYE(Sf~ zk7Gc)Hv(j*yG_i8K0=GlK*X-qG9w2ntd5i=w=SM^LJO%%a_6Y5CgXUIgjMl(225MZ z!GUtTjWefuWyLMA+A3pP^UEW^cgL29j%CUdXAN*YoHj6TUMF^wM?7pji?XG_OJLJ* zdFKXQ^Z}+0TQ|>q+gU@6o0)-8b#AS*a{RZVQ<7c&*n)vb@*KkL000MFU^~%zTmyg) zjzz^MN3k%fs2I$aGPoH&K3LWVv@VHG&1%^CP%Y-iq0J+}hu@ogpCMS_P~&Yp<3#%8 zW{klU5#Z3_tx#Lf-SqUx{*aa^o{5}dCVAbr2jMZ@^2Q|VC&I|$U3smEEJqaC7ZRAW z;Y70$e0)q*QB~#W=eIDNPd`%ZSW?wGlLxt4O$ZsUD^CZnlBiI^X{HE<7ES6&0Gm0$ zJNj^kS)x7lW%_=zP`t9*%+sgzp~gmrT}#8A**|OeQ?E?cRTQ4E-ocJpUw)u;4QLJ- z7N-qTapdV>Sl8VZlt^?yk4bSFAXlW*#}Z=X*g=nZvst%aD-*QaxhnSXe87>RhC9OJ zdAR+27~Fb(8ASuUk058*JjH@0N^TVHRb&+@j&0R(>bKN<8bCOx6iLDJt;L{ljO=Y-4pX)jFjJB z%;b(RKk_jW0TM}rsIC|-Gly3K_Yw=lbsP>KCZbL&fGh|MmK7|36-W;f&u?b3GEZ`q zbgZZY@>Un1Q{DyjIm+i~*{4|8?Qp;)r=q0X8R08)^g8ljGRW}6xS_Z^#x%emD4Wzo zxT4%kR%<8+A)&Q$sBB6qn(P$5qCOxSkk#|}`phH9DWOFL=J$`=5z+ZCvkOqQKI1Pm zes`{hhK>4_@mfP0T429nPOa5A!j|a^vy7+hn(kL0(SN%-<9D6v#}xbBr#Ihq%GyVe zDc3LYUDHUZ)4ksKVW9@OU}jv<9*^jJA4>Qr6~ZHJ$;?4CxUVRtIn`kp4Qj1ZN*s&OEF%NJBF+E$*Z(}%$8zU@A$E1uYQMSzhh8623AvL- z=FG;PR|qk=hVs!Zci{>!bo1jZx2Of&lgAz`q-D}BLIsabO{?M$1Uw%J?*F_ zs9s480Y1<)kcVe=P+@KkU|d}x51~>Z`1vKc|IdR@ZFWhR&5LDfxrr7H1!z=;c#Zx; z6aRbAueW_Kc*FJ8>-VvISWa_IOuOIe*Mjf0u5GXQuK)!9nhI}F*_AKoZxM+mXOrx* z{tPB4==`{q3PcYOV8hH}xfa3zn#vZEf|*ra!s$*cU*qOB2j|Q%k26+xPc6`=K2CA| zeA|B~&BvdTz9oh;tj@dZmA60EI28 z;4>(zsQ+!WPsiQ~Ox}Ej#xD)_HOe1NtgC>@otMrXM0eqd`cQ8p=c4DqP%Fzf&vSY< z9*9F4q_|`n!T65XTI@A-qJYqbnPb?)Gw8{G+Kc0FK^oJ&>OT#M`=Fx_T;;;;er`Ou zFnO)<_uD~3Go~E3SZ2eBj_(EjMXmMag$i|tf$-P9iny?~kz0Is-pmCu(;(*B=I6|( zA|;cxgiTt0Y&hweuBU#JOcX*%JTM7Gy(*xAaD0|yXu#B&Ar;emE0NYe4YMA^)9Rm+ zxlz*h@CD)2!1mfA8YS|*Sf2F4wD%h){cLgkM>ke%2*THK1w~zG&|yEm7TLCMRG6Tpj(Ly}ZM6q}k;m3;(Zi zCQgv&AJXWcI7CF2aF`si0hu(XtGOHFpGi{(Mn!55Cd}4*ehkS|6zH+2f`iFnq>6w~ zDu1F5dC4t-(k*xz8IRbu-q#u1wdUSW%|7zau{wDfH{&V4m8Xr4 znC+H}Ma8$o}w(D#3x&g4A`Q&^YCl7FScsG?3zh0m2emCD8Q7}V(LXgvRn)7M)pn|MMEMZCT zpE=E|%oabNdXbgd`IbUMZ?wNIV<>F#i5sOYxPEHx#m*TJ6at~h_Su~UX%yqV8QaG8 zdrlb-v*GNL(D?-KD39&c2c|yD1|f=#AvIBz!)cgZn|f&(#nV&U%_Bn;4B9Vet1&?m z*1d@HnhC6)S|4JXlFBx4d%CvvJa`?ki+e8|acPVfyoqcR_6^+QIJSyNGh@L$qt@w1 z+{Y;1j;Tv`e3<-&YH7MOAzw;X{#Heo-ZPha@v(we;w5-70^f-TVgslODWP?uLpD61 zaTkxC7e*p(diWpI$mabDyHWGhfF*#u@Qid>Ch6wG2Vf3h_aB{14$hzoNnlZj$)WDP z5Pk`liSc$ZsrOn}Dk^djE4e;;g{&Wj-??|8azyl@f-57$LiO;9u6z!(XN0bW#E}zmuoKia#q7x!_+|c2x%_A7_Evc!o1uFf)+h+EJC(iU8kr);cXR2se zE7Nq2)^`HqX_w}DPx|uYu^iqmTu;)^&qF*<1B%k!;Q%x5-W@eF320=AN(a0#so(2T zc6PcXzsCiE$hi46AO>uD6B~ruOTE@A-^Tyqr&rZ3$ubO~9BB+nZ#c8?)elbw1>c4| zDS`Y0+vfkPV#A3EOJq$X3Sorp9vA<4t(=+Q@+A-NYu$AQM`Wn*_kMIlAuc#j4(sa1 zoQ8;C2Y*7JZ!jbgCPa``UN;t&$7_#?*j#>XG>-zS$w3>my&qD_DJ%N+s{obJio z+B|P->IsSrt3nAh`S7OYz^nPzeEKs=%S*y_v8zO%bC{SH`t>;8v-*^&^@FY}etwp9 z8N0>E9O8Z~d`E+_MxVTY82;0cbPt%8HtP&X@G#)a+FG9%p3;joF&V~A`Tg*N9)!zc zes!e)3rQO25k{0ZRi9Mg$WVBpL_Ql%lgrMwAZRtjVySgG2TvU+(;RQZF!)$@IGv0L zl{B?R%kRH6{?OCr>M>BocSkex(y`H-m0v4~f2gp7PRYX35Zd^gJD8 z8b zH61!JsD=K&Oc|(ZL`(N?w~0a^!jDT(qA)O|j@ZjDvlC%hp&#mhv%v(LY?*wSaMven zYF+DAna7&Qu!*0`asS)=WyI6|F%d#;1)uiG^F3D=Uh4nzQ9G|NJ3BVIi_L5VIEksA z@rqR#<;=QkhAMJ@Wl96xPdWVR+PDIy4^X?LMCN2F$HVKRK0EzrlCt~!UJGW%1#hAT zZEpzVvhud4)toF3mfP#efDBU%X1EG$s;mmsvUGou(77(5mwvnvKf0M-2o7-R=A-tW z1mM>72a?IU0og-bpYZNNW_uT2KpIG+t&k)~$}yGluZw;=jpS$9pCw++gY~Za6q-QRx)6GzL+Dhir?~ z_c?xC70v?_+&2SojQa`w{r5Pjpe)3`1 zcx0O`HN=A7T_$=aj-S+J-jJ!cuCY8GupcBb&#q>+60jUdJr$5nrAsvoa`p5zwnj@< zJ-Lf)L2rzNAyxm~((e+cx}|ncmq9%0+(!?5Ue$S^!)#0Smp%Xeze;_)01uxpq?_gy;K;Ky?3&Hio zC1Ri!6>&f0C-c`5 z4X76)HXZcw`MyVlpk&71OUsXD&&+b`j%=|*M>8ph>r6|(b&|LCWyhbY>-r+qC32>Y zEFZgVHzNWRE&Ty6Yw}YdJm?H!R<$jQ)s&2^AN>4oNfI+l##0Dx47ulQUM+)Cs+Ey` z2Rw1$MEw1C0vDZ!vRI}D92{fQSKtw*gPGg({GQx>SuE>|xP}4oB1io1NSi5dQ*RBA z0p_C>P6x_g#XiTnJC4r*JuNQ8?|cKdkyY0Le7&y76fMVxL`!(;^9Fc_17qcDurmzl zV(;Mqi?qAKHQf^@P(33R2Cgz0h=G>mX{r+y5YeL1UdL6k>EkaiGmBfaW&W7eOgiFKw8reHJfdFoqqsS77t1ysH)X& zUmlE@@_pXQ#C_X)EjqEvV|ns4uza!K6G=^`;qh!q5xA-71!|?4o~Y$b-(aH>2V@K@ z`D^!cWSr?Qt8NXWm3#QFbT;~d&x(3dzTVvT6fHT4s#5) z&AjkN6USO{6%X>8=-@9sB1oiLe(P(E86&Sn|FvHqH=tV1AW#EVl&)=WYaHd-(k|wu zyndZjOTgBD)B*dovZl@qxy%p?WwBp_JPd~TvgKf^b7g;R0EZ!Ps0+R>!38)RjbAnJ z9sZobX7+0_vP4sDb2$@J9c=rC7XCvs(~z2{hrq(FE)gIv2oN1j_z^~(!c=VKHODJN zA7YCeKk=Z9f9}p3yS}Uy$(@M^4SU#|yhRU4V9Sk2I!G>UK={iZAz;Nx)lm zsIKo=WrmEX-Yex27oDo;==H#;8>t8fWDIA;w_;L=SEgPfU*hylH>9z{MhDmHH3~k^ z6&!FCyfS5kJex)E1*SLA5oaaMbsEeM_eq4`KaTg|0fXyMxuPIz$LH#Lflu$YLX)8QlvtaHxf#rLzbUQ9B+=Zk=3x5qR;?TT2G!%~nRgOVJ-1iK>fpLXq0X6zA=fn0 zRH>B=UOQN^|1Ra7{Z4-J5I#&b_yJYYDD!!;Z{jrvRhEMr{Ik18C_R@;&urF zrZ4$`9+Uf_HzVvfXw=%6o2JC|Meg>DHyX-7M62 z{j!Q37`ng>eDv@!w)cQQzVRO8EGT(6NrRH|uRPCA7^TYHP+eX<)3&gE+28!(+yF-I z{!x=TgWaA1inL}w-15Ya$vP>~d}xH7pzjgUp?@n%JzLFegqgk|?~cKcEf{zs>0d@4 zSa~WKIX8Pt_dWlRKwv6LvSuRG0;Y_poao?p)wC>9Bsh+zz;;0)gZA-9s#un7|@SDGS4#tRj zZ+Q#VZ6(cZ3xGO*bck~+yFd%03d|$hhqca zo0g=5D1Xqnf?R~BCTR=Dig+J^2q^Bp5hy(|!J%nt^_!8wEzan4Mo4hnhDm{W^AyuA72?b>4gp(f$G23+;q@UVkqBbkJ)K9rB} zm5&%6eqdy#Dp&#Xy_x(~P!|A+hv}7MZD~`pT;Dfuo>LA&w-3nm-Y?8tHWd&zxq8Qq zmXx{xN^mYE?e2dKRo=@|T5^&Sc{?Id-Dwq(4i;g*{76c4PSi0z$D@F*Lgm9HizH(< zOsJ(+9clILxdL6#1_d`rg|deZ))k)vceCAdJz0<}U2EsCoI2U!*}oh8`dLC0i`S+y zD`*fy+Xc|}#5*o-lU1eHTm-UA9-8b(YgA(RYZCEK@8&qZnH?Ah$k!xny<7fhqe7oZ zSSov#r6ws5;BWsJ>N7h;`;s;-a5)UCN2V0Ox5g-gz?PQF8S4d$tU$} z4)$~J##qzXJl$ER2E;S+@;pmRx=E3+sZWAz^mZ05>hh`j+9Q%krq%WSMsVK>H8p&N1NBfo{9=^IdC7)@D#7}#K1NECxK#ci3&cbuAK z;cWMHeGxCBf)CiN_EjR|H(`_wPOl?-ZyDpL<5_m?7+S7^45@R`7Fyha@edh>{R^wV z0=Kh9}M^`lK&1!sMvC!Ifb?r*|w;s7KI8{sk33+Fmz^*MU zNO=%KZ#FMeX?~6_`WS!bj%^Q}7k{QyJ3t()z9+IZ&|6y8ksf{m@L=_$!xrT-H3jZ} z8|{?JN@8`M*92o($L-Xdy`A4Gc(hrUFNMK*RoKtSXXUh`!~?)01Pcg>{;Zt1Gfdyp zwm@9o3Nt>9MENfif6I&V-xwD>owGlxyxMyY>edvKK^J16p`a!7fd+It8`95sj)Y7c zj3@Or*~F&Y7YsoaJ#>G+gv|;AY2kg*eCvO=bpN&!`G_R3c+)3i?V~L*BP)F;V22z^ z=9w9p7_=#n4}iv$Rdh%2`*819rzvj*P{#A3Vp&{(#+rS)|=qI-&+o!zYWHd z8+tcECd&Rk0acBHc&FW6SZY98@e+!GGUCQPy^D(;_wPzRQk zpJ&`aqhCytOzk*HlSv3jeBG5qCubBW3)iOWvFF;OYF*qOZbzAoPBU$k+v|~>ti>%eZo4?%Q(u><9xTTQsy(2QdsM;rUPk(d zX;$Y_#};8Fx(bC}^mr$kqD4Anuur5_pW2|>Pk{=!tgz5ikq>?>&_*XF=+Afl_qK|E zZfuN?Lf<;ax#yXoAzzxlil1or6&G;+!SjNCm$LMjU+4nT25TKo*qfdv^p~I zA%yj8P*ev#y2~b7-;Ao>91KT}SJz9o(3DTzYP0`HBO*Mk7I7BcTx$cg~IB0DYLNCcRkn;5Xu;2c?z^087S zdrAs&3D4GNHrBjHqJ1qoX2OHMM2K)ud?667kNkIDhE01iy#D#@XavrBJat?-mxakB zN1@$UN|F0h{(8r@pEVXYNuC0G1Cr-3gipaB`o$NQh0Z z_55)EyFF$1YB!B%Rd#D_=Ckte2wuINmN><-?FmduZ24ZlDjx!VIlr;0QrJb>^u-ti zl4wDpR**Y&=zlaMdPyFnFj~$xxQw|pL~or0+yC?++EjU%^7{)#GwM7c5$g_OGow1V6BtLC%^ch0Eh%g zuXFtG3+_4^mWs4}9zgYI{6q$~#K%wcc1{M@qJA+jc;)m<9R+~Ro)cc-xM+t;SGp7u zzCK7y97u>4lC7JGW~T#VAsljpe;Yl^+Zn$0ABf>pt?V>rmwMPStgH^0pg-bSATY^8Ym*d25KBN;zG>+g0AuN6*Vy9J=$NG9I0)XrPwWH1;$qp#$^d zKHXB245xYVt=fBRm6^lFdZ%)X&$lVIW4U)|VC!-mwE_LtilW46?o_|5=~czH-EPcw za7+rfo&v#rue@$ZWwXwL2z-$>#c+7 z!Kk+pr;sc5-qtJWi?;PieXAx*k-JP7xOxv1rT_I$mC}rv|C{o3)NE>f*$ZIy&@sL;}1tc5|{TzK)My9=FSL&n{e%GN_bZ4KfVjR8q@j zY*d8Yqnirgj99pdn6<4OPZMdwJbBpKt$QnHc*kWuT(DFRcc8~d(70LYD-_?pv`{ZP zT(GtJN$#Mv9$_X^Yc*bmG6kD}A%L{g`587fLk3cO?8%Owu@8^(Kv(4`HP#=6ANKGT z=_t400jk3PgyV<6h~(nxG_<|x??Z>M)1W&ISIEDqQv4^u8|62S?A38e*Op-%ahBKmU9)=7&N<4jjib*dY?L z`(>Lz&a^fK9?~qpGV$(pAS9g`aS#P`Lij*Dl?%rYO|`r2s6-vMc1x(!_;AsMh zYl`h!1XYj6;TSKLFRWZ0-bLfU44ni&(|taxdpIIz?l%4v8R!k%TaD!2z7Z z-a)uVx4?xdpXFN45)56#r#)P-O7g1xeblMZr&%k_MWqH|g7#l#Lm2HS!qm91mXx@P zYVqG6mrwlY4`vXB-jfF=zqh4Q9-A{eIQw_Hc%BUhq9~8$)pGemckQvl(xZ39-H{ks zXigY|)j++m@%w{gkdUN)l1nR$P`@ecI zR(ckn^W{1FPfm^>`6tz3jh`j1h<+}YS0?$7!!3}Nnr?ymn28T&B8ECuZLl!ur#wq9 zP5Bj}W|l~#b9b52Sx(^@c-8vC`hAwtc%JLaG8s~PW~)XxQ+KzcoP%%KL~ifgmjo4; zp+k)4+nX^16%TE()Fn`o5G2l8!yNhkU7+?-i+b^R-`KVKo*Y0-ale(R4u0k}0#dO) zmvsdrz!pZS^3(S2B6BJ|@hW^0S9k*%}#PrD$~kHPK1=nC4|^9sZQ0bA#MkeEmw zPP#;>)InZ8GU{&Fff@8AZ|ZglIW4;Q|E!;@XbjZg50UY3b5cf;Ge3V+Yi&tLq>(Ox zW`FI=YQ@Mu;2b$#9H!|k5WinjSTK_9;BS6{F9k|kur7VkhLWE)redyX%*`md`pe}V zYMZ2Rb8qcA41BEKtfxp?u^;#`QO@mUg+)b4c)tJ6(tA@EFqIo-lgbTXr~emXqyLAs z1$G2|ca-)&mJ5^J#`d!#WE0l7H5WSNyxj}|zN*))?>i=k>(Ao1b*}W6%Lv2p;FT)m z4ok@qssBBthm7))*&v;l&g>CqtIS4Rpa(BG^P+Cv;X0qsH(Xc~q>SI%Pw?%gY%vAs zh(;#&EJU~2@E%9E-R3%fr=)8JKlC3rhhEbEN7Q%6Q~iJOUlkRh5Jgc*l8myq28xWb zx01d0xLisSLS>abviBa>HM8TAam{;;tb1+ux?C>5mpK{#-QWBF0OHmgV%v6VJ5CKRh2tGuig7g%cc2?woIU9*8=>@t-3?&4c@!okPDmk8rzQj{FoP3C(_EDHD1O9}qCCCze?1rIR(;QB z!5B#2CT7I*K%w9LPRsK{n!fW3CQnfGtKl|>j~*YB65$i@0(}A5N#o54c{3agyE>H* zJ1U^@C65G6jH3)(rlUv%CjlGIm6X{a;3W1~iP21CJn7`Os5|vpbd3>098IcY3wV(8e z3D!-~%+9J`@=?E&85gcQ0$ViFCc4}kg;0!9VoD%mp_q-KZu1}#eZZEL?@``7*1o{+ z8!`e;bYCI$vFhkv-Mwua^rePS8W3(Ue&Inq0yq%dem|`Pj@w_-(sgc`pvkqRhXq8t z!PK`?``wk}Tw@)FdLALA3Iv2II&@r#p7$ zJCfJaMk{^XN1=oJuc}i(xg@(JL+^?~QiT(R9wU@l5c^MGs5j~y5I@dUt0T_z$L&cc zern*sbiG)yTvERMy}>0G0bFy6ahPJh9V=xi;{V~7;$4=xE+EhBjs=p4OW11WnzL{& z-;v*M2|$bJbOK^F=Xb1k#P%){77GyDzB1a=b}kZmc`F1yQ%qBd<_YoRjs%Wz;qe^S zmUoJwM3z`JtAc#c@12toe!jG9D!DrhgF8>jh+yC2W=XiDTvw`4NKI)+_# z?G&6aoWLVUv?GNwP|Ag4Ms;-|gZ;Z1O*5@%6Kadx zZ{S_+f_4MYWR=Cp(NDLbNp)%}jTAT$V7y9<2AEvORPQ&g4!x*^TNH?`iS)1yA9BZM zwbbiFMP(ALfTm>v*1)9|?uz>nTJ286>(kuoUWT+Z<@Bss8tV7w+HArXE#I`D#X-=1 zGt$QhmX>L>TDZun@i5tU!?fg(oyL&f-pF_M>O$*m*!oiU+u_}X;4qvE?KJMEw!hqG#9eN}^yzV)F{4y^Bhkn~;ar$aP5)p5Plz34)jm}r z!RI`8dli?Fa_-5gQmJeYLqq(`MdU+QbVc=a>$GPxgu40qt=Flbz^<2S%vV=a*LIKE z5AGD=nf;=Emfl_0XsBIO_8?`sjHdU}1E7dbSE-BL$3T_xa zaKn`4(&z9cC59?M=K&^cGA0cQ>C)8Dqc&EI)K9>oJP+$&8I~o=hZ~bE&`Y0or^uqi zO}^gpq#+sJLBFhRn>p`V9dEvViCW0-78vC{kAIajH%0)=Ba(m4 zGK`(ob0OW)^P-ISuUWU;f%|wXX;bu$}tbTfW)4X zUFz3%)=neBWAMH<^u-1`OaUhDvUP2=6XX>DZ7(gEJ>suW0Y!p!dUMQrppN)u;U2~JV6YI3V8>PT zq+VRFrjj}l%sr{>HpLU7+l=ewz78}UVk6TJ)>i#%1x(iP>nD_DUpWYTfiK&SpPn`I z8Skw*LG`4+YP8sG7uanJvp7BNDp^5Q*{HOUVu9g~ss>78Fk`yUl zBXeo>h#6sX_pHBizu-T#R7_6sOrA;W%~Xu8~^LTUX^Ax1P7#%2ux6-v)+A zYa59yKNACk=Qir0&_?_eT~P^JV)pbP`zyhj5%hE{A#2gq$GG88-m2+J!7>>H>dWf7 zfzw%kdi-Dt@5I!Z8g9Fh%Kemxz3>9~jL3Lz|HR#Nn|$Dm<cykc ze|ZlCYfXcNJFRO~=DDXHbto!&ZE!Q0itO5nF+5;q+c}WIu7!4O2yAGq0%+6R+^ycv z;;~9E&H@4YR4#5(UAqZA`gq7q*E_^8z3YLD^vpWi_uo%p{j%|+ZQHX7wqqb0t-Xl1 zSa8(Ge=ngP5T+DPnPeGGuK$F#_B5&#V`MuKF3azC&?O0o9pf#tNu+!!Qp)0OzqXj=YSm~~RVKsMMQ zA0ZGSaDeGWRlx-B$Q9$<8m${YM@IQ8dNsVwwe3_pP8*b|WZE{WJ#otf1DP~Ul+6)_Ww7zn$>tX;c8VqWhX? za(^!&hv#sQMF$lFu534j2&Ek+)`*CAAybW|>%+l##R^=jjK&4fh9b!SAJ@!3gZ$aY z|LEH=P_Hw>sc20(*bw@iwxuWj-#snpGiKM@$cr3{K}Gda6Euz0DSn4Hwim6V6Eal^ z{CW03kr~FQ_>l%IkG9|loBU0@qeS>5bRgxaI_tgH3np1^L%f#prA0f@qhoS@e@>#Q zJZILc(J`x9;*Ip2NM@5>=%3iZZb=<5gaSH{en$LhV;7U7x=Qq4qDW~%N9McyBOrMN zPPbn1Awy;qX=T=QXCX_Qi(tBoSPff-`Fdl$DQiHxV|Iq)37yL~#>w z3ZhICLM?Yte1}2V>LG0*mCj?ccJ^}yEw(@>anAh|f6cys;09%Xt5D~B(qW-JO7;P% zDllZR^SgjP{kV|{aXnG$%54AMNhW=nj;%N8{{3Pb8yf@=sz7Gwzz)i}%e?96_-Ye_ z;G#^vI*XeL1FUVQ=`d3I? zwPC*}g2YS-$?f{87l}A8Jlvha4C3cKW*&x3wL+(56bCHhZBN2bxki8*U9tFiXlv=M z*5p8_H0$yr5h1iyxFyal$2kc^&@4LZ+T~bK+AFL1%Vx%U_rxHN4yOuF(6Rl7Et@$` zU2d!qpr_YCGVC1oLT5js^`_HCF(`9(rC$9SbH5>#_KsSRB^=jpqT$5Eyx!XeLb}-k z?MXgdL-SLURq{B+_l~3JVa1Z?sy2H5>ur(FB^8s66PkBoPjZWIl$}C4)c-u>ZYpL& zGq>x}U(E_P(!v3UEuzb$=5lE&MUA=B6&;0TM&~;)C-{?-bn=S2v#UTtazJ*5X>VP> zy6em}R&)Q|7bk3dA&h+B0!+1s1H;(GN(Hjz9L()JVVQpky}h`4NlERce9%-&56ak} zzw2r&{?n5~=`$DvpNJBx)=Tn${D}BTa?*D?O?0)v8KlraQGWQN@}yS-8L%rvYeLdH zaPrGap3lU7zpm?D1RFvymU;GhY<#`F_MMg2$A5BZX`#D}%2IUnCWZYR0AREn!DO*P z)CokpLzErBP8bB;dmk$<@oP@_OsSd2hes4p&fztFXzle6qj;z$IHHO9k#cuZP*y{Uum6 zUeV-_FEIo;$?#*rKd(K{f86imhsdw}l#>UQW5+0k_P)8^m^L(nJ)}t0*S^{8pE0X*Fo15P@2p0 z;9u9#%UDgi`Esy6k)K+ds+56_PzYH(^ih4`AakxPQ|2d&ntNVNP9Au)(h>!+&bfpi z(*tX87uwYb2k7+Q;qs34->AbK(9@sgT&c^3tFVlJeTBlQ`T3lkGC7KP`4Ct0m*-*D z~X;O2aa%!7{8cH5f>P*jl3)G}wbnD=+ zZ;_^?XSlDHd^KwW$~d~B$~BEU8haWFnK~1`F+1K1eM`d5^C}Kc6JkHfz}^&cC%-(f zGVRtRfPpUgEwD3?VYU0LBc?DSADI*sRaIT~a6i`Ww@*-6eR2V>8x9gmtASS?_m zm%olPGe?uA59k3N1N45+5i*wuYoG33D?V!K>qp=5L9j2l`XozA6~!$Eg4{mJI9koh z1B)-pmjhLZFSQc%q;XB!f`TqO)l>%?(2z4@8laRiYCUKtGg#_3Xkvq@!8C0DD0F3X z>w&=(>Y#?)SAK+A=6BqhLR@CMKwmbtei%&ft=MTr=&zQ)1}7_@#mh#h!Z5Mc=3{kr z7b*W1t^k|dP}J~~kj)&y9-x}%yd_fes$cGyvx@HpPt1#4sPBsvdA+>NHqB9TuZu?# z=`m=)Wj$m|i~BxDTT63r38Dc_b|@kNb#11p|K``Z&?3f9>{WmrJ{qoESNDgTt`U4k zCP(t3J0oqqOw|#+(>kjIrFH?1PG=sYcfq75PtbiN$ReY=t_a$$205vCrR08y!aq2i zNMcTnwJ1v$#qO0CPaDPEuBxIUAjCZL>+0&!$G{;DQ7>1PJ@V8*%(3L|wcR`k(q;;{ za7ceE5)%^DwTwX#L3q>YT=Nv%p+67*|FkUM=_-9k^4*LQx>`PY5WlTGf$o%(Q)^2l(G|bYky<@B^WO?s0tt`A@iH zgOhr4{uwi-n@(ecnKw0C(emVr%N>A)Xn*kbSN-b4&uv(;@=~@gKzyBpvle1x#YOU( z_8xiQEC#a!Bd_^ML%#tfw1>NL>ccuVh?$Egt(OWz^0PqAqGDcx99q}WH$9^U+F(N2 zc>G@4KUsvoP#S;+tobj1q`qj(+xwG(7xQRAdw1bNMeoOViTeH(CmxqoLk;!0)xq5p zn6V|z!@bu<>@r#h(9CSTf-^~>h;tC@q{ZwzWZ;(fQWt8duz_64qDR8g^Xm3lb*XsG zIQn5@avzhcF3|byumobINe7`A&9Pr@k6qLPcC(Z&Kv?ZyH}kg6R;3oN?f8he`{hJ( ztQG7dz^!mu3V7Oq&`?pt9ZOoGkAcf+4o=FzQs2w@7~4h;*9w|jXFohUd-CYbcX9*@ zQEW6saQdGQ{>>lfg2<248Osz!)*X1%5$D3WV>rxVS*Ki>n`F!Ih!Ld_Dvp zU4waL>ZJ>wd(o9N-I-HaUu`nkdcmwD^Jpxpf}_>Y`BZCOpo{ve)ndR9|K|&E1e+yZ zNMQnX;LfA-Y5|K?2S`}njQ!kgUwN&!<6Jl5O~y*}+;aJeAirbv zr1t^?%_x>svSLZ7s2GI4{!kt_Yuxcd2Y>aT2BjV&&4&E^xJ6rYUtyy@K&S&Jb{5Jd z-3gU+ktuomh#iV1ofJufor8>By|y!}b~{9YrVt9NtLr8A?_SvX@ScLaSA?o639wSw zFjc=pSXlVVs!N&nYL%=fEBET@eZ_PV=~LHZzIh2wJKvN zJ*=r!?K?U`v9y&U6Nn?^{K%Kdn*?2Vd^2oq**YF$L4QQf@Pve=BE8A z=iFPm&(*f7?hzuD1*;~nq_`C!spWXv5GP$@k6!fKi^MaK zG=^F067$ySZ@;3MXKvLQg55;ONj;Kg_W=Td702irxbYE7)MdX^aQJIVH0!p0)Q>1? z#_s=11KVr#0+mFp-SaQ7QH?4B=QG(m0ThtW%irN8i?I?#)x+z^2>Z(CKSsZw>fK71 zW+c?qHTv-N*VPA(lpaGMql;VKl>xd5m~TMW@-rL2?=~(~XqGVh zt3Z_N0DSjj++%Gya(Fdm(E3>s-zC11Ley#sph&JvFczuw=j&I^ zdXGIHJ`enJcBFZU(x^_Q`F32r)p}3rbKa|;tr2+&-OkY+bTYb|jiEs6>lyjcTMA(1 zz~JP5AmS{fRG)Z z;76L+)Li!w!zoPZJ>PTzP``HtpPwa>rqRU>zGZA|Ox%1Fhi7SZ+~9M;vuSD63zusc^W=OmZ zkdy!2pQ`&pHXTvNO>_fdbDi#G~vRG#9x|UE_80<{k9fRyM(`?@_*9~&^ zT3B_zbswxpU=MH}U;&Mwn-B`85HLk$_$-vp`4)iCqSz4rN*w-2+JknadN`|ApU#Ud z$7>*`0M8~^{4M43i4#vU{Cgt0;SsTC4%e?W#j+D2Vh5g%D5WQDF54b>=(F6E} zC%fzSj{IG|1cIi#M^hKq<3M>{ytIOgIX)}UHNVBwa0hB`v_GB|CKq&v7k6_CAtR~) zfwYgkjy@yraDkYJx^e-ccGBZJl=t&(?(?nc>k1{$y()RG+v(hBoJh;pa5{r{hb_Z^ zg6@HcR1SSV>?J;d3@43D52Dk;%tZft=v)pVsIlHs0Xssu^z{4b1sCAW4pQ9%iIaTj zO!IbzDh%j?0dog5P(TmGyA?sDO$l-41Y+}(0E*i;W#eaE@6QoZ4%qWhAZ8Czd$xY; zp4a>Cg?a-ml6bv^zHiTZ(ystM>+m1NUt<-=q()<-ly=05 zWy%$9EgQR5pY(5Oj2&M2$|+_OdX?=~jgwOjze)9`0Khqm>UgI3zz#4%PL3Pk3BM0a zpKn!_uRqU>tpc$+t5h(`w$z)R`%TcloFs0G%`jDe60X8`rr~<14O-r2RRj_U=esY! z;!h?lsoiDflU2>V^d{uvWvhJmHh{$(i4rr;`<`Am7v8jAxFMeIPAN4; z*_-`7z*S!)KWwtX!k^_w7n6O0;Lcn6h=hNaj5SsSP#+)7hSOUYv2= z*Q%ef8^2`Eoxu(`-THFC=}wxPFT30yINdxyc7r02^shIw#r69xWo@tWBwZV-cw=0@ zQ`zitVOeXRXaIQ!3UT~TjR@&IPer}qK(~%Tl}dhgeq7t)IK`aik`E%zE+~OYFCN(! zf1XTH-QPd!=>aQuZjugkA`qTlFok=mD_!TMfYgS9aS|XofB=sMGs4ry3K-?KSpSRb zXkaXB-{}y(Ue!A1@3HE6uh0;{T2nUv^^`&QzigeQHBDrj&;*YqQdrZjRIZI1s|r?lZ2Q3dqDy}G+B=Ik$#s?N4+8yJ3_KPEi;qGp^EmHNiGXkqBGxLs4d49#gy0$^qYfu4quC zePxdO_OWETsYFGV>A*S1BfsA-0?i79ndAXrwu+&tn$xj=3DXnq>_dTT^32NINkf#g7Z2{*LrFdz^tG^4Sn*0 zd%fY`*Cr?REdf?s!#RbBbx5h*6<%-`#5-`FW8@8-=mJulrh0yLx3`lh;P$)NcyL_d zWr}f`vPoD<#s7Hbz47egZFvC=28+9~MzQ(%1vxndeZM`C>*I-ti6$GQ$wtcb+7H>G zY}=lEW%N*J%8f^@L7UH<%mwa#Iuq*tjPdIw3{pax;nLSja&da{iyQu_-k4X}J5nA- zhiaD_Fd^OF(FmY^Mw-tbJrKq4D%HY$`}D+5Hf++}H5zQkFjTp^5;Q_Z_F1T+4~@`9 z)ibzqlT=Z7h{wh+JMHO!3ah6|>ZD4)a4M!8sHC7u@)?~+U)UfT^rvN}ZO>C)R=-V@ zN$Fi693UG9I{G6`WS|Dc%96Uc4?Jl3wUf4kz=;gGLSMBtzD&6bkU~Bt{4&c%RDS04 zaT|&`?hR>&ySL{p4a(_IwuUa^17VkKBzU!>(-%L;?Pa00?d}c<8cWq|6IGL!0WXF9z}>&SQ%RLXf(@yWU-yZB2x7kj zS@0&u9?1adH|teu+~2oKEvO6h)yo0<$j^ZX4MPF?%0vVR;wF;* z%0O_%g@ntAl?3e1r^YJhu$AV|tuh5#iw+;GhHJ1wAhDcd#!_njsWv%CQM~mCsy+64 z1yC-;O|Jb}*63~Qyc4xH9kA3Weqa z8+EaG;654SnZZ}W_%5d7sFQ;!!T7EZtiD94KrTQD3>?MC+P`!5di`Pp#-6wrCE>x? z$m%)KeAW{PyCL6sT#5PPzy#p;Yyd3BHXFGDNJgJ1FN}GfM#00zz@MFuHVv)NfBr0= zU+_EfN0ulS78%<4huFc4$LK{EhN(qBbMp8pSnAOtndt6a>%N1;c4QxQDy80w?-en# zD7}Y;?J7K@g#>PI3RP4mk&eEh1$PEJwWQ+XA6g1fjByTorCXw?sbsc&iAeX#n*GZc zyl>0Uy+6iJzfP7J$!aE=7GxbYimIyNM-J;Dfs4!+=o!}eqt_S{gi|2M$&F){^%pw+ zO$X1`be-b-{B5n}?KTiMGgHE!wx9E28GWHTA2?F>&Xi61Dwsb2v1XTW+LDP+6llmy z>MW?^w7R^qT7omMj8e-xb}ua^1|l>#AJwJMy6t#TQz&-q%)_b7G&lzaVU0cj1Y#smV7dH$$8g z;+_w+TsjZT{)OS-_xi?qqh5=-K=49}wa@_jWx2)S2yX~9^i*C6 z<`Dj|kZYda#s&YOL9AH#FRYZs_O>@G1u$w6a)BHB?qs=P*R4?@rUAf((K!(6>#0`6 z$LBlGwPP#q5Um+Dg|M9J-g-}7yN3#Aoc&LXFO>G>+Wsk0?ko0d$(^uRS6_F?l8J7G}~S{?#v zCII<(GxoXUguw%U)D~2@7gSgRF1``j=C4t-bkf2n)NQd~D_O;9JuV$&tW!3h_tr}k zq9qWpa^%AtTbhvY6k>O~O2Q9Q>w)|fCF6F#;Zw=)G}s``p`eve$=kJOaO39M?$wXZ zUSwmV@dwcJf%EN*5?t6T+n#XadRGTT2CCs`!aErdcBKznr$=ti7(*fitVIcX2iS;? z;p0TP?&KGjWxLl#C)8m-wM^Cf*2A|!2nU_q2j*@Zf-LQ)?M~X~!L+Q|Z%ofRu%2W+ zXcRMDYVop&9ogL0-y=Qm-O_a zE>e5gV#>;+Wx{QVLYFLgRRlC2Mo;n4W@n_>FpzilL3~UFDKqLT~9>d`FxcW3ReoH@?wy_E&jg@amGDvPuV*-K9dX{*kC5jL<}x zz-M+ohz<)Du2ErE$EVkMv<2_%GdTrGqX26ZiCU!;uCPk9bX4l<&20Q_J4{_%m`7Ak zwOPw?dQK^O=I?|-mCq~}!H=XGq`M@21|Dvgz37~FbAo-kd&i?c+a8l1jq&J!%ju&yHY3@`OX>Nva+>VMa zp}#;t%-JHUN>vS9=(cSe;fPjnnzt}54?NqP%2w>|lz{&qdkI^7(x7#)BjyH{<)gOI zzwK1*?BB9_xtY#Y0w=@JP*9=3sB|FgA270-1roSGGq1Hvo5ktm1V?Mj$5n-YeqV+O z=1j4$RPA@{zh8Q)&JoWWuZxP0|NF3z__~D-Tu~>hBYK$XOzM#SJ@~u*w3Kc3`*V=y zBWpZW!V?vH!>^ID74ch1E72@?5;iH$$>O&O^^Lqum}u2E?!xjV(EVV1O-eXl%v3T5 z$#2Z#-A`D7ZhKGp&bRZ_g}*rb=znS3GiCFaKA^(`vlUWx&BYNRzazo%v%ZtwNTXZ` zdr9yRt$xM2Oh00#P(>I@O}ae;6pl}8;j-tvQCHKQv|6zd#%m}?-bq%SzroRz$j}Do zS9Nh;eC77E4v?gdM;BN5BS6HoC&|s?BleZczS4u_pBA!sJ|_djtU$`DRO$R=!_icE z8PaAw$lzk=KK7aPxMi%#e2eQdq0-Ref@1m%o|KV}WFc;#=u2i+IWF*gqYp*lhqIPQA@)dPEC-t3M*fH2o zsT{NxT65B2{~5I8qgt_0J6rW&A#@1P0Usj2q4a|#U^I6UVmMn&O7b92wZ)YJBv z+jHz8wp=G*%Vcn;8mZ3XM|?L`XY^#$LiYpwC9UW&(Ur6){rk~Yvw`;nAGksCXVtky zB%x0-E5vR;*N@V@8lbUmq;}-~ivOyDX)1wa%MP?P3oYi`Sq!Xy3gduJJ;Y4n#Re5? z+k)##gqtRbpp?oavw_~i_-YiymQUV zhR=LW7~>t_l$0zhlB*}31s^I9X%dB`0kMM^UH9xA=L|m6O_svW^T){si_9bYgoTWy zzXp#D4m+E4s;jad6_m%PN6WTOTfFfV>uI6#w;1~kI1$Levp&)|;Ii(;e7g5VEe04G zyqe(1@0I+MUb>#_XUsrP0}QxqLERW3BKq(rDmyIX?OgZIqmqE*s#|4xK{}MY8J^4b zv!NAdunL<2W+ z+6V4`a{AUj|Ei{e&`1O<#!MKtk=m?GnWec?o?(xVYL3%G%i4SwR&6{gM*`$hdC-9b zP=Y)J1=fHD-t7lKmCeDi%mn;xKFbAPtS>q4i~80Xf*lxp4jRH9HBWZ*&~h-I5%}Fr zvF`d|LrzO}2GwC$!VChi&g$OF_D=ef&`_{2>o?Cl_7)_9Ah5q?I=%ZQnjHczvEUc~ ziv~eg*0H;veh z&NY@R65F`v>ig=)dVj{!RoPS>%<)$+pTsJdS(ml4e(@2fmc>cF`qE55bcMIg61KMK z4u*I^(jKmHN7*io`fH-TxIrt2#s#i^Y#js`bza6&r{P4^v_x7VQovL)J!QmazkKEW z(%Eli`J<@Ds#n4@$rq~f&7oB%4zwE7gbR8U^!5d*dTH9TTEnXr!@qunn%BdKDWcWk zVyRXY66EzEBtdthv1qX6U43yV4|?=T7aRQKzOjv9=XVX4P){$=yVOX;s8LF1oZt+e_iJgclfM&2*} z6;9P4HSxs22w?IMFj8!i^_+L+n-5uA!tp=*OZe>wEE}=1)i{0MMVF05)L~%`o~_qo)RFC61Uc5>ODw&pxWv*72LL+)JHA1;cPJ` zBSXmhVz>Ju)opC>zf$aeN2U&StGl%`C=AI2{H6I`B6EQeCB;si5x=pxSe9u3{&~0Cj?a^({XL7RfQ2lRWSQ|QqMg7l7E7S@_i}T?Kv$nW^c80r8B6bJsacM)_jxRN>8~-BrMnf9oxJrj+WahR7)pI5wim9?P3 zO@Gr^ftbmPfOkn$liujsibIxAdrpuXZXJ>Qjjn@M3O*{5m-`R~iMsd~)jfuk2K_?B{_+f_e8-880Gu=1hw%TYr8D6_lwBDPVpCDpQ)7?8qya>br~#CJN-xIxrI$DFgR z-kY4we*ZqRjMxw5m6}w)Vo*BtCrcM=c1HGS&iIS2hCD})se8}e9|AwAFj!+jiw|3~ zAe#Jd)1_VGe8NY)Cqo(KnW$6snmVe?mdgeD9p6A;^m$B8+;*y2rq@u)g5Qq(G|n;j-S~PK8N_G^j8C z(*j&~nDEAFx8DH;6Alzi1*@UzeV;z&27xIW!%@>>c(!i3b^w?H8HEes(6lS{bDlZw ztE6cBNL|$}C(+D?-YjUR>5%X7>^GG2f}5nYn|4t6kn8gvco<8g|B6=2zfl+q8Idoq z15{yDcwnfg$!|%?05dUKgK}I(Px%e*cx62BKkVb0_7^NT-kbOOyE9r{mF?iFeChqK zxTjrg2jjHsC;5YPgjtOTKD&m(Y! zkpO9uD{;J7?R&hJC;IBDf_iMq(-_uO)F@6M|DeK&tyI!&;G&1~2Y7g<-lnwZ8pX4d zeFVDh?WXnPxf5UZ8%~lF-31FrT3m|gB2~Ug|8O6CKC4dC;U(;YqX{;jl=I_b=Rf-C z?o{pE3=qCox#ns5|3y9FvXp*0@~RTc-(!;Dbc2}Y_TfSmNM`q?5ab>eTD|Lq@4tvq z-(04Jq^bA%E;CN{uFpDtUz+QQ99OwJ2~uS53kTknDO!@r(M?@U8$s3%1e@}zC(%k$ zx1Z-}slAi;A&yO`;o6XKm34%-)ZV&QTRd}l`1zZG9~yv?737Uk3`k{)z#y0B*dx4M zF#GRV57^(|=d(yqEc|Zt0Mmc3ZGH0EylvV4VwxS;A!$qrEfmf5zsG1ctzNOh1G3hM zJYrMRP44OfMx?eBkf|w1h8-VnTZEl$7|%QfVQNKwngDi9tF7w?)BN!&8x7m#9ZDg+ zlE)L%Hhd*TD8K8&)`bxXoMGqHld^Q^A#`m-81B5f+E&WiRkgj(uj7#gco7OhnfvnR zag|(y+>O>040p7Izkl8lMyQ9@3zLE#Z6bSms)Kuliu72)H2%dRY|pFpBSa$rBwH9K zE=tM7B{yksG(6@XULg2y=Dpuhu}J2S@NeknwJikcVM0c}d@Wo&j0#w3h@MQ{gQOXe zd4*V$n#{4RM*9tS9R2e$hgcT6mr|q}htRrs0^eZKH=qvBpr& zf9Jj8*|R<1-I7=83xfLFD$DXuh-Q3f>yP_~=d_%%+Z>K~jk7t$5> z-1x>r^jvV2gw1Obiu+}~?q9MUYU32JuJHP~EHY7}+gs0apaX%tpN8Dks{TwC3M1R^eCt3}bNYsmBTQRONDIzqc5{}-_F_qS0sg&CUg z)s6z!@1woJjCHxs(q4s`eK|WzzV6WP#X-CpmKQs3zcxQL#UA=jZB{`yH@K;AR)6K6hZg)A&$rY}knj&IG2TJ^zQH z0UxOhqi-LXb4IEfb4T8B8f-`vzEvS}JX`Lzbe|(}+hTmChRvV#_%!s8P9^;C)}J)a zq7f{T!X2oQ`QLgS+pg#=%G-g0lpD)JaLJIe-(`SY`vNd(l^k_!@O(5$?sz4YCWYnR zB}j?l4Z?eH>1Ef1{HM)adK8nT|? z{6i|yUeEG0*4REBc7Io!+Ix}yD^iCl%GPrGFvWbu%;#NMe?->l>44>*QD4L$;t&GO z7$v>K6NEQ{JtB(E&JyN=nWtxo$B$?6CR~#$Y+Nsj zGAUdHM@^8_3~9dl{!!E^SQMyijT@`edr_jpBP*z{Z4Rt*Q~A5q6CsGq!OyaLZ=X*} z*(85o9$+ikm6KrZ%@r{+nSKp>V6sz10XgR>SM(!j8V>Gp>$~w=hm7A-s)an1r8IMx ze8o#rqME*O0}QtD^1zi~#k4eyD~Wr8;l?R+z(4VKi#vZ>?QXPEl^YKBWIc9kUqr~o zgbk7T?RLP!;;(gySkuN5XFtQ)kV#4WX2P4IWP=U=YrFiH8|ZFluqM`J6cs;Gn1IG! zsOoWs!o=Cb915Hk-qnw?R0?`30w@t_oH+&VLJvpw!<9vF<2EO7Qm z9j6D!y1t;Hgv(VQ-iyG6K+Oz3E8Y7%G{npp|5}8e)JpB9Tsz56*1u3>{kd0V7@p*~ zGH{i)&sYq4ReLgd?)o`zdL|N~eLZ%AuhYt)BjZ_2+!PY_Itn zW4}s1Yl`l&weSNlEdAms$SC8#YX}mvumV0uRuEsp59yK+CFBa2oW*4-$`}80bUDr- z(~#9DX*3IUY(8k`S<+Vk^?x~yi{gf`etY$fd7(iT7<~8$@i^ckvG90UHfVX4$&MR~ zYaQ&%FMiYoT*!h+l!3PGr-~vEi~_u^HH3C(xRB7=(x1mpYhIucU?UGczfYw*hH^Ci zmL_)Zq{YARorafNI(MOX4nA-&)uJ(+cXSm)l{5#Q5-+YtUbH*yyS5-p9%}l1H@08p z+o+hP0p`WZ;+g}w4HL8gn&a60~kd{&-0!e`Rm;L5Usn?WQ}6?`a-uIzMChhe-E^Xc%M2U z6PRauxiDRUq=B|zNRNofA3JarL71a=&l168z&N5eVJ+CywxA*aiQ=HWjOjer?jh6xS(KB4+S3$L4KAPE?d>|>A=Gl6$H>3TPK zOZbzYW#Mu3ayoaSi^j>x3Ef0VObZE2x|^~9i) zNzW_D)cdg>?C%sHclocd|Aj7S0)FL0n`ABMC0fuQz91JXjvCERW>Fh;QHV{K$On@{ zS(M(T3ySXW&d2nT6-zZKPC|2Ox#H^8w}_)T?pmXILMzxP})t%FlL=-(1-!=Z*^Jem<1xP)Y+_}5Cu2lC$~o_;U{`QXS=ba zN5hk)eoq!@Io96gng9b0Q9CBYdfAp|-So&vnb41hqqUlfiO{$C^>h&N>n-aD5bEr& zuE*WRMYL0zK^-vDulQ$B{lh%n^E^H<{I3TdM)f+;&!3)EFxLXg6#mFtPhQ(E>VE7a zPu!exkda|RVgie&^LYU(W4Yw@?& zz;ua}Q4ObhTg$PLPRa0+P}rX*QeNEOce$>&L5=I98mZDf{EZYu`1HxwFg$^5??n$T zB-X?t<6$NKJLu2-sS;eevGh(8Bcc*nUDE|3b<9|Se~cMIBX}AXIOe|p1nkZBLA#NL zWlG+@=VVh)EYfzdF*}@B3gE}imC3bAW!{RjadRGlL)`W5q^G*wxT=r-CtPn|f2Xh% zN9@ZROAdd-&o+DY@jVrh9=jE_wDo)NnQ-O-Jtr8SV*8q>*zX5w{PG3*dshtsO#?C0 z{ZOB3g)$=ovmOX*KUW?uvB0(orc}1o7RDh}IBXWsvg0=U#b(wqArl*Na+I!tk7jH4 zAMOje-{o+H^#>yFNB52he9`y#`{+UEFvIll7?~G4W}-bhuUT270ua#jy~v5`Uc2QL z{luZI#MEBry1)HPtkp_Dj|VA?n4nDhgd|v>0h~T6rym>KeSSJI5ruEl2N^Bc4Jprt z?@uAZzj(Rb{2O5abbgSL^v?W!z|aF%bd8AxF06sK{r|ttg)YPwn_!07N|^igw6J4e zJ+DjsDJJy&Y;3H|UWokwWDLH(@0D+tPfV!U`G~w6t+KStBn@%*y27pBMF`omWf^5R2IV4T-6;=voj0^_EeOI|wS(-(xO34w=^VuRFmY#qe+M3E8>JqeMs;GMb?|+-pNXwuEdW90Fv-TSNO-=MM1CEYfze;mS^x=Vr2H zKIUvP`ENz|JReo$MM+cg*o)h=D-wZ9Xs*YlHma`*f;3*qAD$Lcva@bg47>;|3XtGX z!jy1FU?5fU@Go0Y>{Y{`=(nPe{+mZZ?x_od9MiwXaqeho?dh(JNus~HRS}Q#CqLRr zj6Tei?}s`*%73%x9~EI;IQ-bEwYJpxzQuv~7BQa`->`qQ@cwSsRV@HP#f=L2bIc=a0evYude!o(p`-fCO~!$Ghc_LrqTju~Y+cJ&dg zK!~K{P;bGfN8TN^`a}nqf<_lQ;t)PHVVm7|^A&`p&&AYPheP+qAjGblPyaS6KE-E2 zH4HUb5l;M;pz{a0el^?Wn}6a5mixt5x)+Z`S|_gKogjmf$T^>rmTNNKBWG-R5{tbo zv>#=b&4iR5h>2`ul+^D2GsO{lDIC2gJAeTr!)8-~NILmzgPEky3A$8wzH47kw-)8+caaH{dK+f;>rLS6=W|PTE zJ2}B|QlWs9Q0X?3>QQ90v5NeMH$56HK}GGvtDwC0aFlA4SmQCJJG3eCDJ7e-8?R7e zkP;5pTfo(afVLt{6sj15A*SDazmB}q@EXo}c(pCzs-N@~Y+}#iKLZedDwsr&&B%WY z8e0yZYkv_oJsoT7vdcF^?hd_OpnyiW!fY8oYbuP;o1 zm9i(Zq>ub2%V(B(9SQGw!7yoq#?u7dBfOT4k6A68f^QI6jN8L7E8d0h75eAAIBTJHS$)C0QaoI2J7tLfpwsFF zCb6Yt`F%G>OPwU#KyAlrxNSd#IcfZ~tHx{XLsFheqmLP>!AtNbvqvITy+vS}g$I|- zhZGTiD$ey5($4q?9oixw=zyFTNB^o4N2&yqo?7 z3SM#tfSA$`ZD{?t`XKAklSx*E>RjEPz%{%;jv*ekB^eOe!sBCUoo^lGXunpt_>xWj z>>lgOji*YCo-ux&oP6Db@AE$BaH#XmCYcKJb|e9TUhz^-*OI>`0BBEw-IFIdLhH)a z%8s&bSXbBvyaTtg7u-sAkV^pM&?dDXmFZwbO1ZL}tKV~*cpaVfSu)R3d^Q}xb^Hp< zN_CX!0u~>m)>#z@#y9s9YH&M%5tlUY4|QB{IC-F6flF{jg>A*y2O@MSJk_)(@a2rc z=hpL+;Ays@r(paW-lK;AL?=K@xE>HBvqOd;>-*aU<4pep11XO_=X1(mEqkD|jmsCg z=6qdt(X3)X%ya4I7sF<}RCN%*xWPhJbvr+3A^l3^3%}+aCfi$=R*T~Z*vo!qBdzC- zCajsIO_s>x5ez(UwUFN*RQus@;3Mm%LSon2_sMdv) zjQcxXoReD$qaPCrI)zn-<7_U>zrQG-$GMXLBD8|tr~oAQgaMeK8U!_*=aCcz%v|C0 z6l1aTggEB%QXU2yca{Rzuy4Sc?|((m>+>DL<`?0#!|}$ak)~XPiLfkvu~hdzA!Qw6 z;FkbB4h$$eKtFHGoc+R}aeTL>>)ZUh;P=DSRbm?H#4$Gg0}cCv3){(Egi!WPsJ1`f zYl!o00Ir6Iq)2y2Z@`EnaymVWNA- za>wX#!=@J=c+f5ozkzP>foeP2XKWdE?&b)wFziN$Y>g{Zz}xS?MqM(B#PDv#gd!qe zy0)fS;lDANUwSt2|A#Qg-&C0`E)GQ=YP0QNYFTUUtx@M@U-dJMwuL!>4x);recPmx z+i3Ssj}75T9_@r$}& z^GYrC3@cM`y-*MH2Z|Snj#Ad;a5S-*JpYx`yUd_@?;88X1kHJQ>%|m)V{_*V-uxqQ zrPVr!W*~0jb$GVkRg^XP>S(A45;$cn{EN_rs~o*`s+CjT`ss0wM{o$-8puGs&3K*x zj3~H9tsY09$=jucAgS-56zc4{^K>%oLKg&^FGnj@)U0Jaf6jW~1o#?2X^sQ|P=nq7 zncVv`v+rlJb{ThFMSlf@n)cHNSLSzy`FuZgM$4B+C;`nKWKc#!doRHka0jz1gLR^N zg;M@vJ3CAPYF(KBLn=j2h`&k+E94Uw2*x=Bj565+tfz=pLZpuF?XkS?m$(gGxJO*L z4fzXOE^wB@ysZPgt#ifUbBOGO>+#pAOSqZJ17v~7De9d>`Rgi)aI3?|dAASYY@ZC< z(f*x-ls;D0`D9VU<&Qd$i0b3-8&EOegVmL9=3K1sV|z`^G9c2vlSodT;j{eIbpUJ_ zREG-09-Yx7P=`Sv+2G|Bh*v5>2?IQ*9(Gxq_JR#2bF{LW`|pd70;)i+xuCqO!i{&pGa-S+ntMF>K|) zpx=xCd`*)%dg-9aZ{tafb+$lr{pt6vICxEJ`M&P+5OACI_?6J)M4~m2#664PeQyMy znC_vx3>)e3@rq{_^|w0ve|$Hz=1$n2Ut@86r%`z0tu@k$(Sl*KGe z_-X=*xQUlYj+U0FFW`CaY_0wsXh^DnsT6g!vH2$3*srC)<>vE!Yg;CkXHCUl@uoeY zyEzhRV{5b8@%?C{nnJ^C_Qmw;YsnJH1~dIlsw*A>AKx196<3LXA~%EfJNQoOQuXv= z$jAW^#^3;o@NjeWvp1ZxMsns%lz~UE^+fN0qm|{XH6u;COs#C4sJ2+ZB_$oGbp<7> zwO7Yq6xiN#ycuFkbIsZM@Zo&!RhVg4H_F<7r~8|x?titBYK79)t(+z-XSO3_K3pl%vm@Fm=e z{&oZ0I_}p^mvXC~<&F)}z@VPgo7m7(I_-h}jZCOS4PAVCUFuPVd&uFDN=WGX7asVu zuYZZ!CC`(-mMS?VjI-nGmP-eNWv}6Rt!41Tz$r#qZLg&4z4CFV40-tIBtIrPfvWKE z$JYk)h-K~V)X#DC7QQfH-&|=q*8NU80L$LksAT`XbLw&qGlOJcvWxiJ_2vp)k|>t2iq288{?Zxp%3VY;rHW*n7)fh;Q0%nD&oMjk6$FM zvOeC0f70+68eICi)3LGy=2w{@s9Xqm2BO#UJlZk>!dc6IF23CS=MSxR0^4{_>#1tJ z6MII}zYjbMW;WH=Ra7g>N)65NC(gKUWavpFYmFi>Rgq3Xd{=|7j1@>w#4C83x=W%4 z;exzskO0&yTpp? zG`?7y%tA0|b&7@k`LOh$o+<0#tbIaWgTIwjgN!Tt*G(?*{QeDtDY`i^OXQ~%QB6LybJO(Em0=* zW!@iov^Zg7Y#~|hiJ1Ff_d)(uDf@6^vv5CRqkki{pJQVpPvRvTYd$;@Skb?7ZmHFj3D9Gs)B^8rwN9hh!!tZC!PeC z`5`WMwfyNfogW5P8FujuRKXX$9D1U^)4CS*d6JDEWQ`XbQTGW8x$v@-t!LzyzLooA zJ$RxVA|*a(H3Dt7eBC@xQg|wKHN2f-O*(>Ma02WTjlbrhecnr95q&kK<<#q0LxZzN zQda0eL0)@@7$nF26TcIkXQf*1LDpUMm$(HY9<{#q z0bq|AU^gsP5bHr=g34)Nyy02~)w8ftj;+J-tyXB$P0YTp-Z0Bbkx%~8eN+yJXn}m+ zKE&Kr@S8j%hvbS9Yf=JpQXR?;^hJbibIRin!STGA<9`l2VsR<9Y#_+prhny;8@R{J z(f1i3LratMvDQA%gSDdf^6R+t!P=qzFVzJ%H#MBTiJOfqM~Snodzk)IlYW=AHEsrq z#nPVj?mHw2j*5x2<$q^aPUp4uGBZ89RJ_4F;2IK5h+bvha2e=XP9lRpVBrwX5_;-n zdAefq%t!E5Q$_4MSRlBFeersL>AUra99sn$jh~`65?0T9VwCq!4VWHss{{25pg{s{ zh#A5L^uR)UY|ChmitBHo4!h1~hOGzeh?TDXwY9?zsSAE$>kv$D-J{HzE9G`RL9QED z`zV$ZM1n~M7~b!zy}?V*s;!9{cZBQ0aT?|4n|_weEI?%$?)}j!83IAZk(x6Q$0N}~ z4VJ=wb@ipyC~ZSt9&Yt?HFC1WnE*tCnKrd{Bi$L2=3fsC_DJtP0v@s8>D71Kr7Q`9IED zoEqy3c$IAMT)0=*Rl$VEGh7D|_NsD3uZ>#r}(g ztq@7mW}I!kIB0M5YE{Mc3ePwzaBK!O6&Bf+sv&|jV=ack)%TdGpe`>Aq}d1$EIp#^ zGhOG*jq%4^q;x|Za_r!2I0Rn`eCXomE?frnF|)7&5AdzHcN_mv9^Lq@UvZs1MKH|} z-~UBQB6X~>vE26Va9g4^U<@E-=v{i${>p{Z0}Eh!WpHMypfjwMe6xhFOSltXa9!F7Au2Z2Y;QI;wvpz+hff=WtwXG=SlHJ_ zyuw2ATErU^EYx;{pH zmewR_@S?qTsM#M{1?1h+QwW;ZgA(`PuWjWIy~o&5R*8=R`J>JHOV$E<N47} z$$aTQB4x{NEc!H2Ts{E&9>5PTkybQQL9S+#G{1MYoAE+3a~yvi@M)&rdRynbVDe^; z26#%PrOp*ioY*5DNM!DOfP2C@KxTS}WfTbU*fsWf7dK`tP58bRe3~h1 z?kWS)r{)orqR;GrZnk!QV$Z}&Z9RPhKkaLC1uoC3GSU}!a^h~RsbhqvJ4>T03 zO>{TV1AJKfs!6UxO9E!MELcXB4DOWJPHyhFfN)S#jjn;4?=tJ?5kxwlM8YLJUr} zW$a;oMfUs4B9CHq=K2F$FAf?kAGF91>;}}xz%4;#+_e+Rl|~gW(_9(#^&vxrG@IK{ zLEgU72xz?k<50>Q`_1x!Mr&>-F*q#fIPg&!#Soj;!l6IZZT-ZG;#LYh|HI!QGIhBa zs(3z~qr(<%zbkF*SA79zzF(9oWVgdKBUG{;yEoOr-6zcM7W>_!!D5)^`<|sRqO2Y( zkk!A|#b})}vpp{8q`L{KM}a1PnXIwHY5zCXcazv-dU@f}hduM5jp?WEW*}m+B)ZIv zt9sH@F%m3}lszZtsAeFa3Y=uhj?#-_?=Tqm(PR4`T)~)P>zo7I!*YX00k6GGZIHD@ zRtX)iTs1SDaf$}U7rE!ZJo15ffS+kcxHR_e!N%`~(==?E(6_w#DCy}fHhr1dz~7q; z_6@S;%-MRF?eVY3x$$LoJm;hpGo?aGo+P9!Ki4+I|6eAz*?-#7+iiO5ge*Pb(y#yY zv~+!307{7?vW(=Z+N;2x=J_j=<0~z&u+Ti)24uEJpUhzCn*x@t?IEDr^9%D(WSuFz zJVTx=L4`I$8}y4FcG9wJmnXPj!W*|lw=-Lq+N{^mUx2%pu4Ex&Tqw_GWAhWXt1I4( z8Z>@!|Dc;>S>4)Pdz617AAvhP#yN_9MuN;#HY9J(skJ#E*S1txE+2i$u)g+i8w3flvqLw|w#I zXy-??EN-tjmX?N75ytwSPaiifC+#hzaW*TNy*A+c;gI_nX0!h8kSL3!Id94$&9{Vvz0hlmy6^GH%Ftf?!#DzAU zZFf8PEuA}1-$##Zy=SbMdT2TJdRJ*j_mk;nf79jlCw&MZ+AX=OvF<5(3VO1XmyVS6 zzn}iA!3dWHC)=l1RJu zi01pw$_soruKMFXwaobaJ|kJEk2#AhXFK7~h(Q4WU`J6cyR#EYZ~oSqJ=1crQJArc zoZcWtVuikO@PM{>$bxv*`A&O=JOZGY%b<~uzN>h|M>0wS*#A|GMey|hCM0dNAObJ| z78Rgd|9V%mfF1P>cmhf%51dPHN~j*YVe{9xDv3d+K7&YLmX({pCil5l!c*{qFuJ7* z3|C!(eU};$ezoy8cGldtzR3twa_S z!I0m#58cK%WUU4Y7_WI%{?{|gM!#^*_tTc&$kb1hH>*dwsmS^v{cFKNAU8zK8<8~i zsZ}8x#qrW*8Fvn;d7Z}{zj(P>ba{l8roTDpIbp%km$fW2*Qz|CWXCxfYy=(Zg(R}~ zyrYM151Zf?+h8>n#b4Gj@B2fE_0#T;tSdH)U@}1iR1pq*;F0ZcRghvKeReZ5`7`tS z?k6)F@SHc3N>eo5Tubpzw8vzw#b(eOfVwhp>Z}T6*YJz@iKF?6Ie{#f*`V&^MK!U> z8N=NGO}-MkMK#~&XMgVpD$^i>3p=tt-m14ZPvpjFT~v-1I4jkgJo1BAA!EyO--E^p zpu|InF($w*S^ex)&sGe(qBFtq_gdC@5Q}>$_8z`$gtK&I5#tKR*#uy->aUgyxc`2P z^>U&f$2WUa+mPW(@qA)|dCZd)@4vv@tq(H4@SQjiI#&b+?Q?VK&Z_+U()0q z1IR%Ejpqjf3z7FzWL}WTl7%WQpD5n$ztmwd&7G#XV`-9YX|fZ%vnTIkCKS&;p|h&+ z9oo+!SFv+M3OGQ4-cwh?nz?2}L|-EXmA~db;v*YPOpYaH@2VWf%!Mppysv~zexdDr zn_@-7+vez`O$Jmnkx9EnZPe-E2SVrx2%%9#y{#Puoqde&3*Tqg1QTo6-U!@`;|E#f z`vTBg8EIn~C`o)>7fOKnK-1Pl16nw~^{@$!wH_PwLKsYaN`*b2*7)r3^WDUD>cC>^ z1mRCw*Y_){V`FUi^AE{ODy)>}k-WtD3)A`=Ukbj{ph}*k9>g7vKER zvr$I5jTmDy$ViKwijMPVZ`MFidunFtwxnjD@-{`zpR6lr4o$!x@PlY%_!(uoH!e)1 zPz|e-E=p5!-=*w;(Z{OMYdl%f?I;U1NtMXd2jzQg?O!l=Vd&|fGILhRZ`i%&iQ-^Z@nXqoG5UzvA(L;JbS&$c3)J z2OpF)_oCkgvB!zwH&O46W9C~oq^1<%TJW+t9LMa+CR}_v}<+35$F!W zjV%u)l4fYQ%bc@VMk)KX&va5pXf;sj3l%EiJz2ocO1)fs7`Km9xKTLWH8b9#x45F9Smc8_1si&2hEs<}lIgQBHu{}eE0Q~q&Omn#CNWSOzJ~5XWdrEipERId7lvZfusxK9v!LN-S9=n9>|E5byIP@bc?;*m`g zCvN6#fUiBz=M%N~(#(lr59fEeutiz6BJM5fhd0*h~l@zclFG z&G(r*H(`}+pI*PMCop(7jjHyay3xAo$^<}1ibv_rd{Y7h?){y}kZU?o=6?8J7J#Lb zHxx4w_HjkK3jZ4iJ>nK8`qu#DEC9On+G@;>7Rig~2&raSp zjnLMv+k{gLG7zjj+242IG7+OhqEHvAfO9@3bKXLD*gm+e(=X`a&-96aYuY#Hh z)7_!0=Y4LLGd^xPod93*UXQWyNZTXG!&;C3;G#L*)nqfws07kH&rvsu0yE>*G0r5H z(S3lh7`XMXn^$K3vk|I3+kTaYW8VQ937=RQLq766HV{ZUGRFBvlb&S5Ce>8sL9r3$Hx-1aCPzB<4~9#2y4rvA@PGYiErfnT~BDgest1*`pSV%KJgG zg*K28qDKp4Ghe><_My*qBKv)OL&G=w08*;c@Iw-^qTdn>dro z*!}HRZ_TZwe7+scigIe>$ydJ)BBIUiedVJ2sdW}cn@~qdvD9AIry+w2k%hHv4oouV zj4e-um3M5#uIy)eA8Wxb0LCa6OMaZo1RBOo=VP+7M8}2k2KQK8-ygT$`JHfw4QCJS zuIe&MvtzBfIy&Ht8b2s;`bG-C8_u6o_%X`!JIYhNNM^$3m^9qZUn!1`i?T*q_?m1x zm_9;gqcG*?c{$gNfy~x?wUZy?sWt2Vc-HC>wbis-xxAZj$qQM+>N7J*-JhB7>Njuv zQI&n&hysY#=Gm>SO7Dpg`i#4f9cnSXJcfA#{p3y9(c0ipr5rEE+l`IgztFJ*u74p< zS99wfMg$0;D8uvJY15Q^d<$~+%1h!b-)vFrw|MW+OSHzXTHkH0P)*JB7?uZd*AZVp z9X&6mG*`t6QmAzoEHpPPBdXbc{#`;m&1V0&wJENfzV~!(C!@u3YB*}@rI5~BzNdpT zwV;cD4B8wz9D!Q0bM5=(-`q}yP`LfRwdO=aAXb5KF!}8cPEaR!4)1>AEeH5-3GNcNVmZ>S=_+{w{M{9UI!&c-BYRHX68VA~l z2ZP;U-G~aK2o0i9^a$gcL`$`jBg?J^(3E&&M4XM6T%R>EkmMfXc9sWOh0FzVt8v*7WnUGkU{_GSq1H|NRdZ!kUH|NTd*q3eNEN%)y}^56${@CZ)qR$Fc;5LE9QpgT z`rYh@{1{^r6ski1*~eYj#f=5_`>&g3B>3h%-h@j?DOA%AHflXLniyy){V|x_hj5lF zC>@*0FmEkbADcWZ_Rn&jq)iRI`b7G!Ts8e#|ZH+HtX3uQAoF?FD)<39Xi<=b(bZnhBJ`zjr+BH!oFpJ*BaMM3Yk7q_oEwo1yEp1gmJ zK{l4VmCg>!BFa5n?B$EG!u|a0dG6hP#H(T}5C1y*O0Ke#toEX30Ek%SSt)NFjhytx zl5S!(jqWSU2LYVUZRpodg!c#QRs|SbwnN(aV+Pywn6I0Sr_QWCpI(@E{XK&Bkx|#YhYU!`k&(N&gR33| z46mD{AO8J)M*y%62DvhmuMI>Yb84j@6`;Q|_pM0yd0;Ce;HTG|Mg=y<(3|E7+G{4k zCXKc=>mhNks?H_9eWsgY5OOqqAr=yIabw4WLxmKtN595KNd@^$BL+tr=2y*Oxgl#` z^Jzy5-*XqXSBOuGIHro5PI?Czqf~yfhJL5t9jBcH&Wn+2ohbaj|9euuD|gn|!V?V; zTTDcE4=>p&&%X=xf-BZP8fj|&R!UGhSnUmN%!eW52Rj-mtUhMxwK4spQCI)(PJ|rV zHeL&{Ea}3630XxU9!$s{eN|Au2%Oi{?lRxBKUo{14N1w~Ic?F}3uPZ^CeO4|Tn#1Z zpm1sDCqYU-{P};I(c!%4g;Ny#O2Kf26ZI`vg6XPWTsp(wj$E1E9P}Qls zy_4PNx$(rm?aDiAPB-xErS2+jM-HZtl>?q%F;^R8fecxR-1|uvufeIKy;@jv zE9b~Jme7?AYm*E3Q9=t+vUq*|cs%m_-&V4AC}>#+tY6~iyhpSlK16gOP&vmroV|NZ-Skvq<Z%dXpCSOvS!?z>6RDrX>K{kui%m4 zT8k)7!a&Tb(N`84ok&7-5eBg3+Ul?R!2ky6F7p+_K?2z3^*MIkC zdmbr2n9YjY*+kRGk9UqQPJ0U547S($E$@?BHNG^wIE=FqwBeifM&vmg%>^!Z)M4z+ zQ(LAcUDl`HJkbgZJ1)7UnmOTnU!4PEHP#tgS#gwm0VM9;}8Lxd?MEZCtuDdU_QqU;kbTx+2NOXJs0ukk9ZcofW5hS2qZyos)R3R;R zZS{mO1-y+RSKLo_*Ne{^Z^X$T4K)7qcgy30Xm_8IRMkRHPaDI@`}}TokC-F7w^UyKd)?9;B8O5dGx^;F zJ*Me+c3G4_St0XYQfdN3-*AzT^RWqC!a*nxepKGGc;s{$E1%>rW!Nnjw*NZxG!jN1 zr%E3O{@-AUxl`DWr+g*#y1&-PqLe9_;t{p?*9n=uJ!zkylrcUfvS2q9#Yg+Fvbg-P zYrBX66Z1_}^u^m~3u&sIO_Z`mnmHDQrRS_&0gn{!3MiqEIVaI9Ai0pGa`Q9l${tm_ zd2cmt`gb|jNK2u|PzFx7E{4yfP5Rf4wxI&7-%~NtFK$gYrE#u1dnnI=vgE7ABJNfM zZAiM5qeVC>=c+#}S}796cl~fYH|NeK`KO3$3eO|bX1M>YXT!-p{Sp3DvSiWZQB>uC zN16~D!Ak{DAGq~idKJL?2xyKr$<;}_m6{)^Tk)-713HC+Y0xXA+Ks**b-Tu~ViE#U2vYoQi8;irCb)#&8`^D3@inojbo2M6X}H2E z2?^&At(cKsL%R;-;;gAP8t}vBO(!bheLM;E{$7?y52p;Q@>Uub{3GkjrSrAxdFl|4 zCnYo1psJYo^VAZu+gMsVqmjt&3eRG2zL0tAsI8;6&l;Pqg67CD;Jl&V_JCXc#P&(F zgG(@I_{_S|p;(=RZ0nQi~Hay{R1X%YF$rwF}rtk9}3Qqm^ z*(df-RYx|pMrsHckx%9Z57;MCSnEG@J34%bOX7Bj8AX5Tb`G_DCc+j^}?$dNh2@?KZ(V9WIdjnQfrlz>=idZ-CLK3NyDf-Wsse; z=c+$iy$rQuPnN2F3WQs~1&M64Rvk9!e1r#PxJPxd)VphC)eVIm_b@+EQj94s_B-1> zvk7fkRS=yJr9z3xmu|Z$_O5H8H$%gMR4&$k zh%qCBbNz6P=5Xu;%b%Q464-aRPaVHiE>0*n$;hfxrU(%aeuB^Yvxv7S65c`&x!EBr z{OWt(`GSf>jxx(oj;SGPQ_Qa$qeIjtcO?n7u&n9yb3=*jrWAEuhFU}Mn2SuYMuj?daE_6!0oH$L55{% zer6_8D#ZEMF}^^a*xAfRhYEP!1<=W9C0TD_t#4~u_^nSlX_YctIDuIQ&X$Uic2=qE zS%bSqZYLqFRyIaMTQ)L)u!AR3$6a1GWhqw8gaT?8RkL2>=W96^8u<3bX^w2YP(J?N zt9+I{&=*eH?a0IzVgX@geL9Ih_z5mcukSB*cQ2&U4yKi=kotSNHZ_ba=Y0P9xA72Y zEJ2@Z-DGcgy%uQ|_Pvjn!*o_e5P z8K01IdP2e(X*b9QE40K)pV+m|_3map6Uzrt)dm{kqgj^tC*n85U+Qk(O0d(tb4Lc%iHOWQ_2rCBI9g5rEmaR_YpH&+`U zCum}LJq^(X<&YI+gi#r|C8g4Ob5MF)XYV>o(Rt{xU=|a`4R0-h<2fweKB=2?k^ra6 z9?Th#v>X1{zk93#RtrQn+e@~&zHlBjU7Ry9tka&%y>9M3UkWPzoWxIqu)0bvOjq(9SHRfW6%E- z7ym$$6V70*6Bj2q`QblLHIjTdv87AztRKr1%3}~AOedY8I_b~V-#nc>4l1}H9vt`^ zb^&aGQ`y5qt4m%;(@u6@`kj_c=CKR&$AXQYleB*#9|BgHZ=_y*^;LiAMDXfCP2PxO zaT2Y;BYJ2+UyS|g;rO^iN8fWbob%ZG*`^&T?XnwhM}tGer7G=`!zM0{l3NW0*4-*r4)gx9vO=3w8daX0qAO&xGMQn%)N4eh zG=z6ZemUe2>X*<`)kMKOgN4o3BLY6)d(l)zw)Y z_+17aH!xpo6F$^FAt#t;f%iiv??fRlNu(3|lWoWM+?rw1_}U+rs+R|>dU=m}#|)?W z8V;}xu6GjDF-Z6G+x`eqii)N0cKQ4GS$U)BnX~R2j9j89Y+Z*M9?4$tH0=y9_ z`o-7zX@`7F?cXtuH>1isv-8USHF& z+IhBmPP$?jvhM}y4+pU4=5w=wGTObR8B<^P=9>`i4hPhcYr8rB46C>TkIsZ$>3?k2 zCN^%*jX*pl<>#;rlF)^KlYxu=VQ0y*(zWd8uafTZ(+aG~bF`FKmma0cmFZDz5RMj4 zMPN4m?hW`mm%WdfGT@Q6yrSV>E@oD-;TSVB$pLJooLz(jWc2rw>XGhW%I?vIJ<-pp z5oJt@A?fBu4pm&#poNKt`>CCLEGa=T4?tBA zXLP8_>Ef^6=`X(im8*MOu?B_ZJh3iOmawzTdShG$aU#4%dKnD~_iql}BbBwZ0?zc- z?VCNzv7smPT>>e+QZVnK_v#qBy^qm96qhwpR;{b=IcPd?7uZ=~DRB1rzJS3{4<;L6xzsKdNWapWy@-sXsd9ku+ZC;&_EIHk~`uG|CCUUpIkl zS299RVm4eB(w3S3zAE(W*y7Yv{vxVpc{Oru0Ddu|DHZ6e_}**s_+7mn(*qWx>Rz6h z_tf7a{k)D7A&{H02BE456Wki|^6y*GT7+VIV0rq}|M2_*zXF{WkzlV}@duI_Q|ebY z56PP26##O%;m-&XelA8_j$42<>*xJVxOd)qZK|EK#D~ErrF-h@StUR9IQ1@G9F$yR zX(Ha)A7EbNMaP0f@#;@vaW^5p&h^iIZ|}$@S@F)Il>w0nG8qNd@EWXPM%A$W^f>C^ zbhmmX&urvd&9SrQwd#?i7to(b%fC{DQZ`%U=!^O&68{=wg^)3#^v?m75d`M`Of~E1 z-O7W5;glGHb=1Soc&)Da9eMYGK)G2fW9nhr!#YMl!odPIkPQhE{icUJ{MC5kN- zwd~*8{H(6$Q4bw&v6(4%Tz#raNFI>5%atMICZ2V;O%j35DhQvaiY5E^@HHoPdO+4H zBF3ib|JY9%3poT&3;p&cuE96fR$?|<7GmU(uYNu8po&pPXnmv40>sqw9J>d!VH-Ky zlz|eNg9I-p8vu|zU>R)!AUFI<+wWWvSJA=ZF6*v~Ta8nkIWcPI2BLItZ82jPyc1_kW{6W&`_1JxoFK?z=D zj8r86K8ZQNfdEQDdgTbZ%_IZzSzFH98n~dG; zH!-u>u_zQWL3{A}Q;k#~jTkyVgxMSIr%9l&T<^Z;NemY6=5JGy6Tl-&kmf`$iEs~Y zaE;#1ymnA`8POXTGphNV6`QwgP_>L3SgQB+zsUY!((&CmpGfV7)HW0rT@w2t2l*}X z&@lOQodz?+(b7;(4&D5gO<~TFl{qGj2t)3WY==)?x z+MFd3W1)0-fc6nbV?s{1pRsKz0BGj-cm|o?H9RC-UR(F=CNH+RA~-KMC0={^8Yy*0 ze#UK9;|G}F4U^jbahJg$8I0s_A=&GJIho880W#x5vZ74j6GJeHG^4-s!J5IHeDwDS z@>S@A7aMN2Do&BTv8>y;Hu;|kYmxDb=H11&pJgHc>O;c7Z%sxj)CbXS9TV*^f_nwE z^=QlTl{?Vca}vh=Us575{z~dymocD|R z64Yi%&!Y{Pc9qYpuRPj^lV zA&Kcl#ytQfoMaD;4AU8YyJ{S z=yL@iUO^0!j5R4ou~}&f|9rqA5zTnz_~Of*Ni-Yf?f$%gL3v`a&_en&tFLs0(B8W15`4+Ce980>>z@su2^RD9FH$`97gb5SD%S&tumq}$oK9(8?H zPiBpSk~(sI;cThxmJy^iFOM~x4#06C=od(fzdk&q=DwUN*ArbcH*d7#NM&|9u4hJ< z*QvedB_Dx-{N@;a_?sLk{GHX1oY*|Cr-<9x!(b__)~4k*c2!|tYGLwN#Y^F=gPX4- z*9I;_V65T~G)i)1p-<;%Y)1Zm@3SNaJ~}QX*}OX*EW_HEdXx5WN96Jx(>;!!P#WDCRb1xUs$fT|)ZFK>q9W)vY*4f>9Q_654JJ3D+@#zN{ca4QM60 z$gq!L!ON!>_a~Yi?dQ^Ye5lxq;8(&?Yo1C%hmMaU^H>J#CrJj=a|PhMzS`BVth%tZ zc05Pw4*C`*26SD$)6LqS*8#B?B-puKy31$`z-KN3ST6s5ET%jKE&ntGkkmEYVr|%Z zaXW=Wgg&=GR038JD`6~YQfO9`3 z%sIH^;hE2p>Ue0Nu)}x16!hBHwY4ke^xMSnsG63%giE%A#N_osS$kXSKu+xTgpCN> z_(0`s>B*@{U9N9SiBb8n;)(+A)u1a1PHRvlF5;@P1>0Kt2Q*FDkB_qvq@L33I~dXA zCddAbgvb2r>YPBu<^H-E9oHt&9DWCuQrI37o53u?&s1~h%v&xksBip>h1yv7Nfpuu z>_AV9;J!v-EH5V{TjAk{>YFLe(E_B)5knaWgi059z;Ao28Wa@qcmMX`yK~4GMF!ag zwIKw~`PFyGG`=R4yW+z(4NR9z8yvY#7;Y~>;0Y||8hiT~WyP;H+U`QX|T3WMs3{L-Fml=&_4 z|A_kPs3^QA-le-F1xXR9@HP8Z0x2)v2wgz0lxW#&+V zhOKS5RuU=lz&v>KmTovE!xJZ!ilM${L>>lrmr+bm;j~vZ$G=^ioOaCkt?qbtMv@fZ zaiG|vM59^cZnf+o5XamUI&0IigkpZtJyDd9t)Vflft#QOCuLppB{#5SfV9Z)QFLkX z@THIL{3{8Y-Y;OY+CDLM2n^0c zZ9`q~{PM_x7BZq0RWl@$#!DVvgiWi(Cb3fM*5G+~4(|dqGBXg;h_0q}o&4i(BKzhy zJfg{u*U=NsrZdp8S-JhyCLq|#OYuBikvZpnUe(KV#dM~4} zn0hR*Kp^lIsB;$9>%RXFrHiMW`r6*8hEP6i5}w0)t#pn4Mgx-3uaK}Onf++6&^wM; zQSe^0waDuq7ncVPJiCLIwPI2$nUP#Hgp&%!u z8~#K%$HDjf(Tr*LI7wh@4##g(LP^lR{8aGuiTeQV*1&}G`q@LVOcOtZo#+ZMRd#2p z(2$$F83>4m9s+xO!EK7vOW1QO&aHQO|2TU%L=8;Zqag&5*GzxBo89*06yRjDF~AMl z^Hv;osN2c+@E}{EO3aR+tnc>G@HMyN)JJ$-J_+!%I^5g;{xlM{O62usmLFZ&@DT*w zjuv5xkHoD@T$a<)A-CblQ)7TT^KltSv0b#Q19$6+&dGexQ`#XDw0JYYeyDOj?~Ch% ziZ3u2wlW5C7-QG<#j0hVSA8MP`)dt=h@c?_@rmtWN2Lxs?s$CEFC;7W9gO+g^7~V^ zx)sCC`uh;*zU(Ntij8D33pc+od9tNr75~JdFA8*x+0VGWQB*x*pa94qAn?1D-y`Hm zrm@+#7?|iZJrJbUYJk{UYCvT8gz&wy(jQDFCi3XfK43VR?Na7U;_|Ut`J$tOY3x#k z0IHLL^CM}PP%?xE!wRD3u4o+~F3o4^J@ZdY{G(0^f_*uoo~8M{x@Z-PV3*)QN7sZS zin)ECVI{j@^ld?botjSbN4vfiN=c=vc`5(@dksZt^I9IhORD?kU0j(!KvW4O&l=6? z{J9Z#lvQrZo-G;|1g@eJ$P{wEg7T{novm~}eNw^n+9SmW5~4|8P;W#Vm6d^>OA+Dt zH_GAw8SBZh`Z!9C4d1HVAuT9SpYba_ZFwKOc=Y@^AARNo8_tU;rkiFWGg8H&6*rz8m=>QDJL9%7wNe$#s8u>m;yvRZ98U5x#bM7 zB>JTMC=RT&Mq)7*Q77!2NJcCi$RQvTLf%w<=I~3$YdFn}%q}qq`~4DoSA)Hlfcc<98x92z zd^UZ~OC!rPl6s-Z^T3gm@FnZj(O`!1Quhg-z_Thoi1^#w7ylty*b>E4f(K8-d+I>D zNKYO->;Tr(q|#1TfwX@O`2@5$vT^WWGK^FULEE4~3HE(8L)R>T^0K)c^&^GD&rm8y z@)_zHJd(S(K6xqXLBIWRL&--N9<0BVArWB_dtz$u1wZu_kTi^&^A7+R9o@G(tCWD) z%UXU5pot$sEb08>-qyFMK)7=i1e!&?2n#0vg^d(teQG0h6k(Z-3M4|GRE>^XOD}>|0?z}QL*0~%}vSl+!w?+K51E-amjCJb~si*A{d2=LzX7U=57C z>mGUAcfn!dub9*AO#v!{)+9s=kmb*Ot~p7aa9N|v6(=qEPYm3p*o9ss!kwT1N%rHL zJ0g0?+SAS0B;n*qFmtzyFRgFg4~3scf@(!twZL)%Y(raKr)TN1&`$Mw>g$zhXYd)+ zRcDPOomxBzu$q6lIYP>_hjFhJNc0`a5Du~1@HkUr6_AV^HacP*)KMUKjnJ-Dwkg-& zI`R__{YP}9Yj5W;AiTbe<4}uBc01S9>c}pD*=vF`o`W~=NvRai-wy_S!DH2Sac4L6 zl9Zz&f2D-`BPN2%M41-5#!FFi96xJp8$As zK&iTI#xc{Gm}C~6d_{$*VEIe5-7m%DdkC==V2wfiuyK1|Ub&n74ox)p8f}J$T&;%j zQ-uWGaZ-Ll!o%j;l&KxFpBui24+mt2VMPLPI*6a56TxMrPn;PSWLWIZB8w&aZI`u5`tpBOs9479TxS$u*L z<`3(3Z5|CYnw+E~)e%N^eImBmka0Q+>V;217!WUVmxB+1$(w?&rPe2G5!n}n z)rr;iBegKq zZu-o4C4oW_cHaMc5~&S1IO8?TR*?nKnYM50xow~p)&&nnPUY5kW)#{dqN{5PyB06i zV>;x4>y*~4h4_SDqe0A^oKjJpGgVSe2EJp4vvtURm=JvSCwfdnG>Y}*o zYm}&}Gv42LZ`7$R88f+f(sj8&@+kyK+#&wI1w)WQ%qrwPt;9G#k#bc>hKF^OQfDoA7cly0XeoiDhS3&i2N2^am)t$gf^JQpv}#shRO3me<#bn)d+9P z;L1EBQooL(oPGI|{D{c!Fsc49y}C?p4_@8T6hp;_#F&#DBS`FStacOLAq|&O-jVl$ zjv(7nRcTHo+3^r4c8Lidv%N5{VHF`J2SU8GB?yk1UgCE339i5!^8iR-vaUQJ5`Q6n z6kgZ*I$(9?(qCN~>Y_}&$p(gwzCt6Rs4*Bff(6(ag}SWsNt@89?W`_@^sH7(RS-HT zZqYgM`GhVjBF#>5RuEI8?~%Xm(1-S+LNFoef4Tt4fed#hYm?sV(D$VzISAz@R#jSM z{u7ybtL0;)A1!oX#{3sf4?3yZPjKB)*nr)OeYss|mWQimbI6sNH}a?B4N8{aYm~5S zOs`4W6SsQOu`X>HN4A%=E?%@ABAiLc?WaJU)|eNkzJ+nZzBqThI;zJW-$$ovn+Tr} zAv=l&Y5BDA0aBH0^@7o=%b2U-CiJ|%QM?PT2PnIQz^dJXQ?Ztb_eip-pN!`JmwRGJ zX_pf)EX~-^07PWG1_`2pW@vqpXVL~`T%#wg$E@IK$9@rz9CQnK{~G0a=I$j}LjCTs z;8&)tn4X?>9Vg${{^;|-Q*18%an-`dDGP()wfbNFvNMnGSZdUbw%a-rqxU=hy5>!WNn_|K^R*~3>fEG6=e{!~*6G`j;#jts6hiyWc zGOyeTrQ0|0s5Y(L^OvBDEJx>RFhU*e}1YsWH1|!gE#;t=P z20hWOq4D3-D3{-fobIm!z>H=b@vBs|?$h#6d0P6YGbi^$j6y#QcpeF^zrvE<9j%cB zl$?fC>9&7%!nrmg5Jqdn6~(@wf-O5j*Pab}giSD^^SwH1Y2Po2L~=Rs;noy;75Fq` zo(YfqG6}Z*IcAWTl25ah*8|^mA?$S>Pj#D4T{I66I6@Ejg{bNT0k@9)iAiRKl2(xj z`;$h3P@KBm)qkv5G}+zRj;Wt@&T zGSb&aai=#$$;d&tuUh5OAa#9n@?>YR_^wfsF&GOB=#(Jg*5afZ)nzFRtu`NwV}0vo zm4{X#cXv}W841xrmDp=irPkcYLKa$A-=aMA$&5G6&oM+uq%K?iPyrW~&HsFBqnJbSSGFCqrjVVQ= z9YmOKo5))c;h5OXc@O|f_C)Pf%3d>a!ip1)|)ZR9LeY%QfAANf2Wfx!~jAP$+aSdaL{51Pt3IY=3ba194b$F)DMPCnEf=(w2kG7EBmFuk>90I(_}jck{~#I z&883sHy}?(P@#ikKMYEeikD_A$kiN=LR5bF!fYCm=*}_ikM1{2xV2_4bC*Ux;N&vP z3&@hwbkwwWV#FueqR?qU+Z=5nf($jA;o8=YNi1Jm{K$Vuro$X}W<-7*Mh~QI7L~zj zdCzbl=d+_tMy3+J`iy=zR$aRb>3+mm7(VNV-=tb<=gxdVMhf$EH9C2S2lIGq99gWQ zVHwU>H%2at``}t`n0SQdS|1@3N7?LdQ+^ux=P=8o(Cam>#Dv?M%58VXYf+K=#8PmK(4BXyo&Cz8FXhzGBj;ml)mSLeDr0P+l$1^Y*P0xKH4; zs6RV0DR=T=DsLrabG z=S1QmHb3p#m^OOb;$p%#q_G2lWGv(J6YbtGa$};|dzi}NxQ-YZdDFiof%MQ;BA%rN zUpPVthDiI(Y%22Jw~A#G3~uk~7-2Pcgg5}$xD7m8!9_GAOqd8YLCKB}dqC4&yCeRk zt=WtkHn$04GhbxY>RQ;+8XC%BSFihaYv3aoT#g2l(4G31LTzhiz;1vH_qFqBO!!J@ z!zqy8-T#eBDFGi_3@WlLOu;z9Q|N_pmgh_t_!__k&80^tJ~{QlUGF*<|HlbW00(?6 zZ;ElqcZLfg40_d?ZBa6TY+f^V!w^wCQv8R$s^mN5J@IZl2hjX~L7zo9< zL@0na-!yL^eAag>*St08OR+XGkDKsX6Q-ANcyVd_!36aa<>vqHRqtaZ3Sw+zKfJyu zY88i)tFXdxZ|kxrwr5QX_R;HQZApkE!7&Fu2|@u4-NQUeWJEIcCmJDsgX+;@<#U_b zBkF-BO~uNdfn!TPL1srJ2GB>4oRAOf=#fGTl)ZXaTuxzx}q#cOLjD6mJ&HR!Ny~oci9c5c-kcgE1R6 zy&%+k3O(j1>2K$&1Yw9c$c1M@W$xe}1W)Fx5#iKN5R@yJ$~%(6hIa5Jymi+x$;9YK z!Iud)+a^}fpW^4@XqvTP;%G;2G8?oAyOB}uiTAnQ`kV`dJgJcPx^dp{0}i*C^0+Xu z1ufOG#6Udnda8&?+s3$)CnZ>zN%^&{+!Bq#gabq(+7BI&`X>oCX|Y?v-xI6wsPel8 z$6UWsnGVH3OH{4hcAu#Jw8$b#l+CzRjvm;d;~UjbAR;f4+KPf5+g$K0m@4)`QJ^Yp zO`YR_0vM~bL_H)hPLzJH;t8RRfc9v)#s2F4go&C{K`!IMK0ty?mvmYhxWa_FVv0P& ztuDj>unUg^!sHFb)NYT?iKLnOh_WfcXw<`>@piXqbd)5{n|5Wp{D(21+czfN;${qJsoOg{g{t8m z&!Q-GfSHajr5ihKU^B>)b;8-@ATqZjRWVB6gF9{Iz>~!cULjLLc@v=UN+bHXbjR?_22!s9|C7s`ZI~mc!(q`Mydtq1+`5K`!Oh zw(NSt&PdxQ&EtKFToPIL&kh8MaW_XRmDKwqO$k^V||Eco5W zOShS9JxZn`gW|7CC;UFxvzL11dq55NNwe=(3AtM(csyZ8WA=tw<=-x0ga*&v?(Ni% z?1MjMeD}xp*(OQZWgXk+aov1zz~x-S!-7Z@XLTTg%@{bjOa;CP?@~JuB;}w`U6*EK ze#{3!M$*glBob{?zn-S8<;iPZ?{8zlKh~8El$p%&2`;fmVPahNUs%THr^SsmH~%cq zF7W7Tvw1<{`P7(3?Kl5UhbI+6%8Mah+Z{`uE6b*<3oCwYcAj{rM0sDG@^j%*MH9@5Up`ZYNVB6bEA8+}X z9sB9WTTTiti9GwQPcSx%ErA4v22#fxLsAcJ$%HwAHZUg5T4|Ht2uF_TJuR@ZtHX(Q z$+B&a$!-t_st<=$08#_8H{xDT&>$qvDpgRFXimh2ay;OO>Q*1F zy>0_g(bnIIh?}-y$0^fZUy)>?2Sj&$hfdtNy4*i>!B4^5=f&RH?a}N?kYbA{kweVE zIf&+Ki|yPel7O_RMfj5f5lfR~7L%+H_jJ5P;5+UoUpml)X4dJC2AQBD4o9wm;r6%Z zla6)C{Zp_CL(c7`#aq}-9OJc2wY5V0D>CFz@~*~V>`%jog}_1r14dNV=|iAUjND ziP*f~^T=myboz`d5+OpdbCAVH`E{mz3w~eBX;SH4SUa%h)Y#baz5d1;8idx}WsZeW ze;`CbY$HrL{j%BLvIF=w7;RB$ubeF4uGfiv9b5UDkM53Gc|^h5^2q`dR4-!YtZ_h_ z;AVMpT9z@@w}OLTDzq-6Xz#CqCYqO78M8&u@)=VdQG49X)4*wfPo6zlF4ldLlXbIP zd0M;FQnU|ugYTX_xqp4!6?ckq3_z9m>>iGFw}!URsU0%lH%#v+(u2O7gWR~^CR;`5 zBN|=Z8HLl|$^#d9vUJo(8GiI#f8W?Q8^%@vX#LQ`k$pc*C@iLk4B{jpf&(R?#eeSj z_~j)(-IRWTKhBl$v+PQI*^KB(Y3G*Y<9FB7rDzBGo$z6NEOgrFUgK7OQQFa{9qOLl z{$wtn|7EQBIOwS_y6-Y|%e5|i?3QHKY<9G4szNWzFQdgokn-J0ii20d2VeE5Ev#Zf ze{4__)5tB#yx${a^A+G$=cfZW!7v13obZ`syC~o!_GTZpWOF+D4!(=1{IN4WV1S(K zF4{f0PTk0`S43{HjC>E9l568?-ZviBKe zf@S+-wxV5;ZJpr&hC)XIE~N2`K@c2A5q%7}K2Y$f)311~d(%uhW<4_Ysxh>}E1Z%} z^)MDojKI^=!h zMxFl%-)T{4cBFN-1uw$U`{2ISF7$OO;DDL$$5=bp(1J7%a} zuGcoUA60uvhNV%)l||knsmt^PrxlaYV!{vzO!4-c$fybya{B)#!< z+A{6hUHKXktC4Si)uLLR|Jtmra!_^g=P)KK{=F^6RDFTx=Lg~tx1oOd<|yFQ*cQg> zL$Q~Hj=m?OqyRDTGSUwNvZX3YF&5W~q93HcgCKkZ8uPWAJX{xmO=gBx96x%`=GE}O z6^ssS63#@Mab5u>k1f>^ZaV?L@&Y@{o;NrvX@G6Y#=ofr+L5v@sridDub0qo(+-n& z4mkV`F35ZTKmrNQORAr}d0yGAayjXr?-1Dh=Dsm6mK*EX631dFc0*jKj{%Jcq5RS_ z;k?k%{EEs0Yj?i+)A#zSDp`xKL1OZt+B|e9R|ZfYh~~D4?`|NR16$AbNcChTkU(AV zBoJ(tDj*m_tjVsh56eJHbt|?H8x8JOxFam*78P)-o$_kG|K03Ivj&9p$o5+Aj{i`{ zT%nE*c$UFH@4HCq99vRnQ3;4u(W!12P}b}OgiBaYgX)>kO}n7ufn_Hc{N1tNA)D>X zfA|*-;rxBx!V2mQAhgLMv$ z1@#GB9{*C}&Rk2s7Y2P=yfK=S&FK_pf0?~>SCTa5`xwpk0piql>SDK4rj4c(-gSLl zvHJ+1aS%wVC9t_Y^0;nf-a%{0-7E8CaBgYIQQFXf=1{8Gc(+b`D}!&+aqcdj2t z=jXRK7q5LU;yLx#N}Q7NExISZs1U4Ca6#&#zli(`!v-bA|K1E@)#14k!P{e6VQ#Qz zr>DLZ)Osl8JH|OgA`XTDsait*4Kaf`sb_uEy7JvRzHH_mh#&2t{s;|Td>1Un|DTtL zHsiQ!+G|%^T~{5q!`FY_#*>w#_x=sFZCMxqrLI)UtGII<8_{GPNOu_QB|bo8;w~h? z+WN844&tr);xC&``DyFwv?^dhe90p9{HYUtnsvQpKE|v7s&ILp(4SM}ZzimEy}Elf z_vbHNYul^MzZd>_Z&r9H*uaPiLF+Ew$WDL28z&5jpFE#0%K^mAw^hmn$IN#cR}hJg zRy6DvY^iSpFeFi{DLU>Li=h@T3T-%O?Azi$7yu#~!}uL)VK-5Y2B5vm{C~j=oL2%{ zIqv^~zd?2|LAt5;Tm}Aod3Wroq3g(7;qX?kJ+|@8MGi8p(#@8 zH3kV}xDR^J^+voTI)0cv{J7={&F};?8l|SQl4VNJ1K?P>qx?ROeYx|kX zea&8j3}b#)Zg5(p*4xx*c8tK4T++6s4ICRE9>#tP zw+ku`Mgc|8pEal2>)V~LW>5_Hb~_@yPKYf5fxq~6M%&t&E}9GLGmO(;3z*~wrRe9X z*9>kUjiY#SaG0}y>k`)%p$0W%`HL)xhXG*o9J{BkwDpC56DER@a&b+pb#;R{{Q2$F ziu~pJ>6LpWw5GX4CtQh=2+Oy=E=lcC7%0R{`&|!OK9zi>=1Rc_7{(lnhxbxz(XyrY z(pO>Hwh~%9?*#J6M}5fKMu1*B2qmQ^B-6WY(6CL}QvWiEBVTc*=&~6=r!G4RhU;Ky zQ=VqtS}U5Ua=m?Q7*W?<{2hohO1G{N0?m+JA{l{wUG?aiE~*{y5ftRwcAnXeGEg#X zelXrLire8Bz|>9zCEY>LS7HM&vjzf58(l`$0eF58TfX^#BG^Y)7-`$`qxy{_TjnET z`@-S;RWVm<)#)iaN4IZkDkPq$dQpL~g!+0*4^}fzQ2e(RUF@0^R6^@YW7ljS#P#ml zxBe40Zta8Z(^Zonu7t`G5L?!V|oj&^agRHEJ5MD4cZQSqdL(av{WDsmg+x3^4xKQI=0 z=b7$fhT#Q^2agE*0J(WbZ-Di6lVd?YG3grQ8K$k_^>WGb;zpffm;u51Q?*sUj zXKqi}rAqkY`t%|8j7mx8{T20|#L%PB9FW6Wn4{7s)X6Xcb-+?$tU+%*s>(77&aRwm`9ug93Leu}kN2 zFlJ79oTupN6SaY#K`_%Np_fHO#Gx0IBzN_fFq4sQF=iG%A|v8)sUMRQ^S?4ZZ1Mf{ zKP3?#Wyh*;$V5^k+w6&q27OA}p=YiZ&rmNWU!iT_gh%k6q5sN1#Kq0RPWMU9C z^>PB5v9!qen{Nc$<|P+43ta2j2r4!DxVdSj*L=X8t8!MnY1izo%k(YR6{v5`8du%9 z7>xCwD|gj~vc~*kk$m;Sk3z5|S`MoPwCdgjoFT57VxGRH{x=Tqd&d9iSwt@D%NlNz zpFQRhXQHZ&Pdy!qVf8s@)7M!)fBv*}{4j}t`wpd-xUz|=)C5@>)zq*Hybr>}y{AA7 zhe>OG_J|an=?l)AAFyr#{H9xy7_;s6$D`a|Xj( zA|oPx$DPLRth!>dcRR3Kworqu>GWobfb@-tmh`=$=(m;QQ3ZswpVw zN{f>0STCn@7rR5CpY|t*#nXkk70FZQlXH)n zxjs8ma(_-M6TSC=+m=*INZ_y9WDnk~E?3M<|4Ti+A7Rtg5AeIp>vP+nQ(Y{a zQ8^LVh7MoR4s0z)(jp?Z4h;{Ad8L$@SV}e6^2oAUT*>@0TpN9^cwH_!6HYRR{^+wV z!{oWP2E~NQ$h7vIi6=%ofIQ{o_yU8T-q+6#Os&<#dENM)b~vmUd6W}0Z_RJROgMr) z+Uef(LE}AeZfVZgSZs+2-KUjm!<#+VC^5*i$V5lC4>8fUgg6dg7%iyZuV#*JzH;b8 zui<>dX~E*h+#Lq>bn|`C9C|cqcQ1BvO z`}}wgg&Q{g`s1KY!%8h`QMPQ@r0eUbmdkhE#dqenhd-m~TkOJQ9a&g%$Ev2Z{65CY z=%$9uj(&-r*RmwXM0<#Fy=86FA+mHEIC&a@Xw7+!nPN}%PR9zW*+z?eM-Mis_)-+L zy=C5bW!-Nz_8k^L7rE6FU75nIk8C?*v**Ga@G7?Zt^oiOeajx4N5VW-wZ_s`Ss?9Av2a-## z@xkwMfBn^FdP)3sOFu?QNqJNjK?Z2}3Z4!);$G7avf!j-WZUy4u7@Wzm*)>YMHE*z zW)T0|UL!f$*w$&jD(0+eY}T(Acosg~`RpTA@383zJlx$LY}xVL#lM2QP}hReJhN2c z;?k&XXoK0^-xJR0oX`;Y8ry3t_#}6=;E|ot*|R9LQsYCCzxOFvSxQ~S+sZD)p&m-m zSVTP@#-f5kKau-NH249WQ2@*ht3=gG>F&WUn1&}p_(ho4;k*IoL#Y8~7M9EVyASHS-{UDL#Hdgxz7l;JCETXrnbr61 z)UJv+jgl?T!#eeU%Y9RIwPn$GwKa=h&O$lf%9iN*O!eB0{K9^HXXe6we`jVwLL2)! zOdmoj)QpyKRbxOu$)vXsi~aTgaRGSv1)nSEzNXo#AW?oc1MAYCHO#tot^ZCSIu%A}v2i<~H#pmkqv^E`o=-XE;6E zol#Iw!0FXQjrKTso=%Ma%Q!7)3YvFK5!7eP%H5o>3m1#y-uxQnAeUst?!u7PVf9P6 zQ}fvS`#v#dn0os-1N)Albh!h)Ew}PuQy>{i-=&^GNwMG&mv%gn{XTtpLbYO zA9|HMc$jCghlw}+o@Nt#KjE;Z-Civc_k$iTbQZB=(d`lsLadFBO_g-kfSEU_=(X>s z7>g>S3Z|4jXm9!srg%Pcl|~&DCLKX_{P*W6@brK?&{8Tv|yO4U&x|H!tus z=CWfG*y3P!@i-41q~>BS1T)d>C{pAC*V#ge0?KXli%(s^MYI(-J`tEq`-Kjfgn zU!dF4(xc3|u;JGDj3(y3r^*uB6fWKI<_7Bl!|Sg&`Vb>*)~?}<6wlaUv9r;KxQ5l9 zmQHrBTx%88yR!d&p^m;~c-IHLy!#rZ#9__51i^6MqnCjZv8?Jor6gDwi;o@@y#i{( zP9~~`6SKl(bHBC&N#YHqpQ6NH35)(w`t@{<9B(z{fx}S6>UD>VVi!C2M^Y_G%f7U; zt`{@92ej38lfUd&^oBkETHUWz;i9>}#dYyuJX)pE8FkZo#Ss-`=ZRRA4mhhu2vwJs z8sb*0&LX+rB`1ANwxVIhb11?9)>`65Tf@@jP@nU7B=!@6*UhtTdJ=|4xyfYOB2I+= zBPigs) zA+29Ud0TJMw8!Jh#Ea2)3ho~1I=W4fQQ|OYSy|@Bo;_x?N@ZzOP`M^)>riI=Fqx@I z$MJc>^>7ZSq0c35?~;Gp8+!4d3_<)NME2$Knv}&sxZleISumRRJPzlrvD2lBd8L<; z=;*sM$~n=f!v46=)aSsb2q!6762&dbjH;F@J53(!TH7ss;MMFs^n_{<;ehnR8Ge_x6)cj)@$ zpH;?U`Q|7%f)-7FF+a4!A@{ctZUq(0QK9H$#GgS!l@jLYWl0|0A%w)7dwtnlTKe7C z@YjBLTy^!Si*im2_rZ1)g$A2|uuyPy$^FI$9{-L9Pqy&f9$5d=6)y;D!9ufs%Km-8 z#`9YgC(9gjvYnSM^O$oNU2U@5U{aO&+|J>3bkPnc=$*}Q5LXia*xca;X{@aZQ*WSWdm;YCNs~KJkeZ6W zcoqa!5PA577w0U@L{Be-h3>o2t4=v5N|Pf@OxeKRZ5ilN+{%qv-DS%oMiIUNL!wG* z*zMl&6aS;;8+R+-EM?Z_(2r7au~gEmFXV)iyT(dAzG@E#zhC30VP)0kV2$Tcuyp=Y z`GYCxd6HW?J@{{LJk~k=Z#%9Cy&2IMUPv#)IBExU^WKPnIL4OZhYjhdRx-ah=cQ_h zwKQ+I{~&iuHJ(utb7B*sIm@Gsji-4!%n6~ARWyc+ z-#7adIN<#7QtgS48vf_XJ?%)4hu{VUIyA_OENArn<#bu>@+mLF%JIUtbKVd4DM|l~ zGqCGbTU2hp`Iamsf_7BBF?h#vh*xZl&ySUr?hAsGw7d=4P#rNjc$|$VcK5Wod_U%)ABdsWgwGDkjR8Qv0LjTv~Rt6Q; z!|{Zo@82_&dE2h}r|h4sb~P+@o@ODE{+a!$#1v?|2c`~%7IPjB4w{@Z2Hcu_SL>-^ zNaHM<;9Ych5%B2=b_*TJon`CB8ICi7r;iatEW%}2{S%9+)j!zJi}+eQN-TqcuMO@u z%y=&s#FX9kG@I^l%H-FG(OSh~eX%7u8JV*>xs7=vw90t8y0(NhepHQB_+dm?P@mPA zS@fnz?Q?qvCP8VUvT>r#kHgo#;ZYxXszIzTGsisl%|eBjfbEkZVG29gB6ux66jETqDOt|(e* zH7@#cBE^rt^#*H;+6ofSqrFnKoJW&_m#QRlTD4aY^ipX?o@rY5xO@=7_ps0oh_DYE z9=rDawHoxxEO!9Uepo~MQl%kx2&q<{QL`1|+0u!z^>Pn!tSTaHKUd-xT2DI^d3(x=RMtsY< zeCTA0D$Brg-e2~_7z1eru0=r?GOVzyJMH!%UhkeJ{!j zd#a#wS9<8TWg$qug%-DDbP_T(*f7%zJ$f83IlxyocW~0`k8~@FWd;TgncwxcH!7}( zLQV=th!*|hCu5ROPIjxRZQW|L==3nqW3RCPY_1!mb5i_UY6{BtG2o|h9f+>7;cv8L zT6lZC>TT!pF}?3c4uXC@EW>OE zzkgc$-0BJBr#xIdU}siD#F05+aAh0G-P(L}o$2H$nUm*66)0sl!x8SYL{TJO>3xa2pMLU?lncZVZp*OLae zHQsUmOlWjHx1Ypt`T_2a)}zVQ+8A2p&b?(=w-m8u^L<14!;$#vM%#K$2lexyQeiie_`6Y4D~67I-0#RCOi4qlH!d_MbOP*^ ze>CVF+}GqB#ed;1Eoqt;cpSxUFYqc^k@1A}r2LVc19noICIZ4U`rZ2=X^1Hi8Tpik zVnje+v!!)Ui#V)mFa{VNiFvRkPr}~`CsG;Dn4Xj?864P7R7XZ^Z7nZ6;=~SyUx{1O zUv0$DeNW5i-r63wc03sQVR?}0oABb1fcq78jm^GYhfnhGyTild&3cBOPq;^FZ&n`{ zFM70(W7B{(@3-2d`tLtk<92cp@RYPdCMwJW-S@)2KAAC3tPg0lZ^FE%G@Uctp}u%( z<+=RT6c$;0pT7?-3eq`3|5S3Vu4UHZjlW5{n1oOCkFRiwThL@kF<)(c=v~VEBj@<(;Hgi88uF4@AJG`yW6MmMt=Z)^M_Jw_1OSE7j(M5vglQ)t%Nc=YwgtOZMt^Tk28_ zqpvs5aN)Cj<-v#oJAT_>kY#yhX>7t7r|{qXue#hDbqybCf<4D)yl;L1&q_v*eYfZ9 zU-`w~4F9r|Boxd2XGVhE4CSwFyd^vX58MftEYcmDQ>@Tlf3pKK>R`FNfY$ur(3G$YA}P%JH1!QP9txOAoB9L5b)}y$Ggn{d^`NV$%9?SP#Sl8ic;& zS`RI4%QCvudGc8a{f2nl#{Eb1$)WKZ-MQFbg|T6~Bp_ys=v?8?jE$kc6!kXhSvbbu zNHTyxc*E)8`}>-@SfhpyxR`G$#6E+d$)Sk6R%M`X1NrzjmAuxsT(%qZc2(A%K+g4QOS=$YTYq51Qb8+i%ZtdQK~m;SsoW|dy;;yTMs zlji7)P`xL6rX_d9Ga->7gIsNA23_ah`n^M&)pd;#1>K4e>Go~6&cDZUdU|i;@xZGb z&bUYR&ehla=Pa3#>8I>15nj%)?9z69=M(&p7@=Y{ibJWpNA&l~2HHezzU(c^>>0)) zM1Jwq;W2+dIP6I}>}ERZVEAN*h678fN;;u?-E(xODbBS)# z*H|65dZw>zM}XZdCNKiWk|pIA5Q(cUvH5kczve+3!}DBR=pa7y^df8XcE4_ZbaW?t z&;kwe_vARb?RLj!{V^ST)C~-0lChy!`m1;$sI8(eXs`4yPJEx41eLbBs#sZ&&;28e z5Aht%>e_v*u{`^S+hH-F80skTwfNi%-~CXSc0d~I$361{m;cQ3nRDhndWtT1cgb6N zajIyvYD1$~E7bY2!+s#N9D@|o{s*^(pA7>DNx6F~ae~-8t$+Ue*J}|vYX7OrsLL zy4;N_(w-PwOD24P*p&=LH29{Ccae?EDFS~r>a6p%s}b4z@)+mg=Qv#zAQ)Aqv!hW^ zsQ=HSd~2Ae&?>RlCoq$CN0(}#3%Et3Zb(fUa#w58i)Re!A{WGk*1E7^14ehT%SPwL z3pYbTPwGmB-I-k0j-BIn#Buw^Sv%sW%UZatPQzr0RN;l3lMnjKR_C1=@s1DCaJJ(d zE92Y{wxDr1rI5gmemof0O_V#fPt5pq&(Dj{Ri_s0FAA~9(>M$mL%wx&KhYs#&}M$2 zXOX+p75et7jBO{vVLm=gQFGHZrKKzhgR57*B!_N3KZ`AWOnL3?KO{PT3pE;i=T`SK zJFhz~c8aRb2S%!hR+HP#lo&8pH0}`Y+8(=x;RgxS6${=DRg_3e;ZX^9%*&^zs0dRv z>(LgBEq5cXcB3-c=C(-TKK?y`B8g{zlRp`(Loa2>If7TZxJP}A5a6U4u)c-z{AEr5 z**9`QmdEzLlg79^X@$D9>HRS{m4?35^1jQ~^eI3;jxI~cDJw0L^U6G*?SMkygoLO_ zByqHB)=Ql@_r1lZn=2m<9?(?vgOz>gYQJ2#+ zLvU8$vy6=4)z{rBPPeqKQs{?=i5>Q=VQ6jsfIYu<3)7SEdpAm69` zW)M}fzFaqdh`5+ushR)s`|V2I{Ibi85W!UAvtCrl`2E=~kbC_lqo$d4^gzd6`#!X(k>aAAS5jqVcSrLWsttQLpMdJy(UNW#{AoL+86QZ8t1E~l()Jq3eHUEP&WPiiC@+GT|CWW4-bGHj_ z-H!BY5=RFM7YDSiYZ#^YZ5c7`nUwt6Sj*gOk{9jkr8^M$n zBH?fq^f+(dKoc)D7RimO>kz3Xi~bJjrT z+v?7@^)^%0p`4S|=KN?k>c!xb!Wt5z_r{V^j@LE23$LH2_(moLrwI%oAWcV`N@k`w zI$$ftCpE^LN=6HqKFRhxqKBoa{Thpsagoi7BBGg;c+f<%%I2v!H0ZDx6KU?q!ij|e z9}EZ6tUEO_5w9w*HyO62q^}uhproNiffdAbNSoamg(va;>3wcK zgNEOyl}lzF{W)l_KJIgKZ|v*+aFp~4$;y=QtJdKD8Uo2~;|iQDpd4KL{#ohc@sQ%V zq{F}DCI35vG3RIua}&P$?T=mO1$&;a{k(9jZ#|&3r@@E^x9(^AyXtmZ@Db>;1^*TR zWmBmveiJY;o&nVSvm|30hCW+(^Mruh3Do}-r1+@)K9@LAQ2WfiDISA`g6hG$k7Ra7 zy8V@dT$~Iz4{2V{|BCeBQ~&8}ZabFknZvs%O!j|h`s%2t+OBW9yF*e01SCYdQ=|mx zPU-IMMnK?3N?N4589D_Ck?s-!sTp$U@8Wsa=NehSAG+q8GkgDP@5?4lGs5!dWL(Wy zHogFUf@ntz$qRl0Kr@26-9V2h`~Z4>_H3N2+erhdoK~`O$wuuWo7aPO4LL9r^>QSC zUR@m*)vzO^*4-3Dedu3%;#4$ZIG)o%Byy4T`Fr*VU`*<}@xg+IcUN?G1$pRZDmO*T z!9s6YiEd8jov-2k(SeJOl1Ou3Mb>aKj{JF!5PrpUWU@&>$i@us0Aqnzfy$oM|c zpTH}M@zHRdH)G7j=bk%bj5|Y_J8NwD(UHI3rn$$adFHCAd=ah50>S1aI%{DC&;PBA zzpyDeqXSBT7Y*_N+iW-~YTp<#My$;U7byuU#w!Q(PJ>+Z&KE~9WB)TKu($|*mDZ=A z@)S{5f4%hI8Lo!l&1w&+yQ1(9vK^_BB$kp)kp|>i}_G4()H##pt%|jt+Kc zK}posiTE;KK8j{#EHxxynR?lxg445ulN>msO<6wy#P6#YwY=G5&yv({$B(>#Cmeip z%++jCQm&>+T3#p}i51S&$?8;5j-{o=5O>k7_TeRpl%$S7H8^Ap`ar$wx;sK~oFEon zK0ErZUuTjG+FPf(z~+x8dxt6#N64cB=8mPFEGODX6rkPw0f1sUseSt+&ry!1YXE z>3vbil;M;aQV79UakbXlVhh&Swfy)I>CG~0uZ-HIPOO@2FAvZx3+cV9FwDEu=WvTvZ%rA*y_y-HH3=+;VfQl6U8ygs{uPcHJbQ7RGHa*e%7pxzI zj$*IvVI<;o+5K<(S6%e&be^pzv0}LBDPyqw&RP~orPN*JGQq2@m6rAJ(P!AT!VTp8 zwMwBKE){Tgq4VS9U+%M{Vc6a#a%D9dY@{Twx979B9%fiblK2CKNgxc>t?lrEtF-<& z5f5Qm%BeF^0>R~W(;~nJhIB_OARirlDOOF7@fij2S7{(!rgDt+6_Di>do6bmZXzl1tZL2 zdyyRmI5(U3xOyR#NFUsTD>Rays6grEQ+2VU#cV*nRPLDTrtwO;_)Ugb$sQ^-=hHaP$P|LV&iqx*QXd+JoZPZPXQaSA9HECyV5r zCptK)j}Z)qB2yUK_Vl@2ZO-`9Eblw7KH!snKD+Te+&CBXdpp_t&!eEYBzS!rYx!uC zuYX)*IV+1v3Ks{d3!#=UqL#n=L@7cOhoT#|$sGgQsB%x{>dH?_+0Wn}ZLS~U=)JAo7l+rM~)vT~Vs^)WOurqmn@wSfBN-MFOp_Q;M~YtYd@5XoPawzv0j zd8D1_hFPV(ox9W5*N2`wK+*5u+pjn{IcEF>xnc@2(k*VOe$l_H%}`OWZj8TrZ*2vu zXjyl-G4*O|%fagiynLgoM=EM)Jbb^?*S*_NA4c6EHRd<~^)f+s_}(v3pGr!~oBV3* zt$ECMUIh|e*#qwS`Y?YbvoSeyxJxU9!=lDpRXtKqEm{5Q!H|`JAQ`oh3?p=UYT$`k z%=X@(5)u+>ePGU(V@sV{eXz8na?YzdyoedG8Q_}885CGw|GmmW6~8@c5){6EcWQ*9 zf3TbRP+@lR;R%ImJ__!}D5m|~g&mC>a79AAv7_c)Z>NY2MZM7w!dG`RYdjsK2+W$D zCi_WVV5Ur==&?l5>KRK;md)!9bEYj~f#zU0j8H3#?&{gRaUAwFx)zG_&kDot3U=yo zrcGk%PAdHd=NmDB+s&13G{X;Hj9$IcY_n42l8WE49diM~iDUmi3-CLIRHzrDs9m6k zQ#w+N{O!u0YPcY16{=77o;j*5i7cv}T4y?-oGh!h_nkZNt}xX#RU^YzMTi#rDz?Rp zV@-dZL{;?VG~5QN0whNmSK@Is^5GywQ(y!Fg7U279LqQz!0q zzuX3D_oOsUF0oZ~UL#EOc%4ClPdK+=eX9w~L&Ma<8#zCB=&_K#2_H%yd$d8PY9xk! zZ!rdSTp&Nir^J}fy*;IuW^EVkn)lE;5CLiI!idn=pYXWZw#0<3L^1SWiN&blKta#v5t|4C!9~0v*S1uUp@=#k_y(XZBxKNotEWxw904 zJ`UCwx21|~Q2h0AZ{oj9O$`CXLjAff3b20J*$<`u0thRCucMM5#C;4W;u0-dYsiyW zN(gcG=kb0oay%UUCcPVeACy2=Q&PAsgs}_NYqUzp(3|g)So@zYelyr6??E9U9`I>F zd|t<5db-u;Sh;_~-JAyUrh3i`1M+V{J~ap&&QQNU6E7)9Bk4~^l1jSOx6lQ_0^CC2 zWGyvh+Pn7bk02b^C< zrgwQ=4schmv=`lG=`!|)TruFnja)JkT1DG5p=(GB$1#Dvc9?lNdyzE}a^EcFdNqBp zlfu!ly&nI{a(yKu9*fG8`DtIrbj(#_!KdxxHlCPZi8gPo4gFa#(cU2-%v$x?yW$%i z6mM4!0mnzf43gIk6XGLOx7F>ZXB2KHvO+)1?8Bxc(n^`K;b=9|3Vlng;d7GUPD&F^ zj{)C1!iJxvuhZwu;&=S04+Hsi9r*gg&)_K5x%Gyut_cJuv0vRRT|5m)C5tHCo#N#B zER4eC6#u@vVaV}AHx}Vtx5d1A1E2Wc$df|a4i-|FdXHfFot?-jOq)~v=u~e-1fy$E zJBzqX-nLxgnVTs;iY{uVAfEJ}HcRnjGK`5w(UaqeV!P311mavQ2=(aqIZVr-LDDR0 zkeS&{;nzXRDh|>Z6H*EeWS%$-H0WeQ`IiY!HGfwJw&YvDCOYatMbeTW?mvNz+)x!w zBOG^Pnbq+fg^YB%!O99Hw20emz-#xD~^^>*?b+B5ju2CP#*32UoB+?@JR#~AK@>e?8M!zN@ZM~cpyW5}dF0XI} zE(Qz)sb0kuZVV+HsA)Bo-dkH+<+F~SNxUYJ3w-FtN*N&`iWN*5VUm@Kn6-j27{Y1@hE9mi%N=UuzR(}kK(XajCK1C&M&oH%Tek&`KO-ezzc_3QU4dV{0$ zzZp}`j$cV?(I+2e>LCTR{xlhZC=41to6b^NA%n3;_f0{~nxqPYA(lA6tg}p!3~*nE zw$je-BRg;=@c8HB`Q{G^(4$z#|J!@zP=(AsttJwU@Wz?^BtyMhrsWk~bpEIs>QUqv zyBSNsQ2y0ae~*CrHTRebglA#(EBvLNWC7;$uQqQJqKNZLwVxu1lOopm9vkr`XFo># zb;40XzE+wt*GFz@Pnt!ya<$BM&YPy3jIqDSv`Xuzzlo|%AaR=I zE?-cNlnt2AuXzcCnt6ju9-62{has0>=iWe2a^I4#OEahU_bEcv zb{jI3vp^msW(eE6%WbLcpKqJsICFqkA-Tj@jX5U~d+UiGV*)@`I8AqkA>)5Oj#WCF zF*de2D|C>A2i-GrA$YVp*mz&kQz&gcd}!SWBt-aB<-}Syp}ZD@ z?RU960v!@#eMmDBgA1crjd=gIyA7joobDt&W1;lIV7A>m0+aywCF?fc5H zziuEhFbs@+Qo5x1qrTvq^LhC2?13(>y|)c=GqRwG@guEx3%2uD@yLSQ=g5^P6BC7X%=XP(O+XvbWO&kKY&T?F3*&(OHflhrz)uA0WCJRW z@8>M7n-lt(!!Vq@FJ5h2yJsCUUr1(+awM$MCgR=V?G;f$UvfNyRe2Ci9*A9oR=Ncq zO?`@gPC<8?qV!&m-~9$--)p|dBRXE&tjmJsP2g=lc8U~0Ci~Mo;SOZ*qevY)4)pk` zkoWR_&~Z59+~vN0OXld-zjG{onrxroT4H{UBMB!XGUBy8+y108`}W(Fjz@yd92!sc zF&2=kkq1!`vmn}^N=gdF8lTTze@Va6<^s)jY;xSplP?BbipQQ^1ARl$F&Cv2)siO( zw`}Ac$fYzl^MkFXLmR);^t9T*QHhC~ zJ~RHp=_)aXBK4z)r$iSItL~U>jT7xytPSt8$|B(@r^935=OZ3a0q`}W0QlX*yu>}? z<8bgJ`D);?Xiykg4Z35H$>6X>QwD4}Nxa8|D=<1ut#zX-d5^5CJ%||JzyP`rAvbH8 zduRi1dH}LJx%ux1(tdk5Q)hxp^%|-os~LpjNvHCZ!EvR;?xp{*|K`*ed^0O{TP4R2 zViFNMO$6fYKASze*(Sz9;KKF^d+jKsM0`nZP#EcvhZ2;js+pC83v&7QK9|e_&h1~gUp!zj(%p2wr9HiF)<85uv3j@QpAr-Mf%6T zNf_xD=KL&}BqF~S zuIdG}sEI~850OJh6!1BQmV*BzHu@4O?Ls{qW!(Lls0J6#aa3`&g7|!ac2>lkrns41 z(=Baj)Ez%s@tv84=d~Nst13B?%3P(A>5RPW{u@6E-sx#{%6|oA<#DsKT9wt+TfO)G zf`NZIq7rGsnQWu!uZZ;x`n`2H(=|zg(}2Byv+C_4NCUk!zzg`Q&qIX+hv&4w<`$=) zTuS8$uKxmXAdV-NDq32w^@j&kqLDsqidfRFiSK=13L|yCb49LNMlfLkAqX#(@cEJP zxlf}ARb))$e+V|g~Tqc3>0+XMff(Ht}H~VEGfu+@b zyCHTr-+f2gcK1Lm6JEgmaJ0-0zoHAqut#mz{qpY|$^&w8qCVd{;SggQe{YOrAmtW@ zTa@0~D1HA8UrwvQa3)z-zXhHlkScx|_nGtWE2B+gE9u6|;x(0CnAIj41r=IKu4kU@ z33?&16I(188gX7z=rcHKY4Lb%zjn*)D=_1)FMGwHeRr3BUn-AH9~V-Nz>KXKOuoSh zvz7)~68wJ~dZwqG5dqqOtz`Juuhy-YJCAa%)gd7|2m9f&UmCOa^#)y~Awzsq$*S_% zW!7hKD7L;Eyd59PL zsKu)G+|tQZS<}>sVDj(TohFWqiZzwq&C^MlKgeGD9uW-9 zE_-i!wh`DkcAyVwevN3Wmv}BK`|W6$4jlTl(rMx3Po%^~|Nwe+v1nmQia8KEa5? z85520I}|m2!)NqE#LDf!iMRB1$3DSa6^+)jDdWSxDubqb*;JU}D;^X$p2QNXR0#bW zJ?y;@eZcC|IfG;$IF{Ve>aIoqwS*E9PINfOk%MgnPl z7S>J!rp(@*krx4PR&Zq^b*$HuM(BZk8J*{`_8#2eq?77xiJ((LQBLc$w{JlU=pZA* zYsR{kx0LZVc%9ty=MNJz%MfAG{8hx9C1WU^^L@zE-?=&MMsF0;20gQ;B~w5h_$x?L zHg|?esFN}H1(fpC@>u|?yJ@O`LyJrVR_xY(+B1MQTl;6ejRr5k1BO)jr85;#SpN=H z1UFMfz5~FP7kR01?v=9%v1*NlyA;qiXnZJM4CzgfbDaU~SQ24fW&izxg5_E3>$Zrb zw|=Iq)@EIJjR{}n4pw=9HPJnnq^bb$+-}Pvj4$?R}wk$?pohir$JUt8jie2&PKzJI2dZk z4@J561wKomxrCaPpY7bGj>Hhnj$@BGr8$wu#KMH(RP=LQz8XRwUtl+Xa%y#3IwM^A zz^>Z@q{n+M#PBsuwoZaq;p>{OaNIQ7xMx%#FpbKQXC9|GEDve;EZkG-nz5!=PS2}o zl`90e496{)9m>ApX8sijkxk}JY~J^( zwpJ~%J2E#2iRu~;+i_r$hWvC0o3t9L(-wI4_Y`$*-DfxO)8hqQ3`>(v+n8ko{5H)V zj-MBVVjo_OrMLvzXG|$SiJTC0boJ*?rPhFb1Ni+b3=|~j^}VjX;lRLv;1@FTg7VqD zM+4&mHH?DKm*%|8shHXoq}tiI;Omslb$?AfHg>Du4%S-WiI@T!vRm6T=Ak@>XU5U2 z7~r3wprl;X_{NnU?vXzF^Yuf}j{elGQcBFjgeuO}RiOYu$TwG&X9}7M_ym4 zs0LEY_Qh`RZnl{}J_>s0Mnn+=0Zvbfq{vixr4As)C5 z4~@$F??dHOD6L`cOf~;7389&uWJLiiNJnGa?_!ZD@0LjYMIEg)2t^EVu4&?{;^S|^ z1~k=si`#ZcIZ(m{Mcke_f69#*(ao%0e2yGQak$@?I%2y*?H^?+Y~=C?Vi_P@XAp36 zEa$VzIUcw*LgFOh_i1OAK(iDom}3L;b8)jF;Ee8cu%H7bFo=$Stg+w)0P8KK%&KNg zCF|#%aL-v|Fj8?=A@J+(Sz$#H%`0R4zv+dIa(X~w& zg}_r55v4H#^-N|)_nC02vgzhXU`8cByxosbZwZnSbdou5#$BIi^s>C0SUM7U&E}*k zpmkvttJng;+(q7-oPiRVEEhbiiylTDGIJqLJ%?QIhkl)FD!wRuM*K*HGwq{lQ*=(yX!{7bmBJ%Xk~5M zEKE-WMd~DG4U3>F3%GGNgR5cLm)Q#DPYkg%j^0!LXj4D%Hgj$KI6?7!}d_(_t-g@1j@ETek^- zsX^wm?|nBC5RlDWG2sX5k-gTC<|_c<4h!QV3Il8S(~^JLnNCI9MX!SRi=nOznEGN| z`f0i?<0{O=TbL)6P<139&Vth@` z6wdB{qxA2z%KrBdkADhvVvA&ot2L-n_|{0Svp6}nMPx;m9)i9Td^slU<#@1=L@Pc3 zE@OVV3q)-1@Sn7f4*A#WbaE6$S%Lf?gR{L3PFztFCMyE@oQgzS)CWC7?SH*=>_t{y z9Sz=p+%v7jE6wG{$hIdH>iE5ep5aI;bV*w!rpEgcgIa3UD8dFqw@Lbl!lwMQ_skzT z`8WNQmTy{GinX7HLu#`Hw9vxWzeR33mh+=QY$fhA3+uN~=n9L9sWy+vcVAP(_G67j z_4S7PcRWeX_V{vAT`ibnA`=8TFTHylN|n_X>El4DmFu32<;r{2LGn8&t+Etu=0w_C z#k6*8AH9E_VfCD6b-oN?NL!#bd2FMz7lGq8!t?x)a|`FfWBWpb#pP;5WA#3K({lyB zFCOH(c^5kI_9Ai>5*uUpbNhl;aKq^3a~9Q&vBi1QhBRZrGo-zL|N8d!d4E_n=<4Y` zDg2 zOFkIF%9TV1uCIs4Tt|85VAA@->1rUDQ!;JP1u)DLf*t4qlUCpT*5CGPIq^c4s!rKA zet-_gvvBx;4FkMprg3fGitP@a2Y$gf5B|LvU&_N+fd<>UZwj)NkYwy_NKm^gh!|9#NsW*@9T|{p#G`f~?Arnj$}oiZ@b{Kd2eHRYak2I$ZLlz$dGs=bWlZh(QYFhz?Ov{i5cmlwkT_0MjQ zlEp?T^EO!cWN{DUSfjzoU)5_%d*qNu4hrm`HWANx%V+@qYwGko%7roE3JuxDQ|;xm1yZA95KJMl7XGOeAh@ZVFhjtiG2(Hy#29%+vN24P%&qtc7^Z2r(ij z(yth^o9XdN&s^PfsydpA6{J;BmLic8JQ_6W&!yPo@*^q+>iz}STHlk%(819S_w#-$ zA|7}}&c*EV;bSH)QBZI>-FATrhr=JdPhHzdGos4Kj(n&qF_8oJ-%K8>40aYCG?#I&xgAL1`uGT+FK zL5OMtj&a?Ku|#t0e}uCstZ}U_RwQDfc!ph`)YMZ|g~kF6tr1NMD0Giojvywl?GT_H zPYG<~bokHtbOI$3;}{RSAVLt&4!E0;^Js(<;@Equt~i4E+sD(L7666enjq@e#yU9!Qb;i`w)9n;g}H^a8lX;9H0x1Mxq!Pppk zt7K-m(}_=KoHn)tyJ$c?zy7-Cvh?e?vDb`Wn)M9%IpDWRNmm>3)@KU4SnoI9Te`zf z_eBA1k+I4P^d5LE6d*x85Z%A}B0;I5=Q#$Fc!v)nOcSeDP4~>RyuFj{mb&D9numBf z*WntFl>BLHTI_aHm@otH@AnQ)qF1e=fn~919?GiS6rqP|yH`axM&J?=X7(AaR zX^;J|EAfD5p~3s(=j){aW8jN^xu?p+;#FW&^@O{W_oJKof4s{H4)<4L5XF?w&!k@4 z0f-=|X zsNMH29tSzNv2?;VQk3$B83gj&z{nP%mhszoy2pNJ@!o9!6#bwWiz^QWA+oO{gYPe2 zCth3@R&?U#I99m`9exa!->qGQM&nELm~?eTShhn8!|G&-g0F9g)_m{zzVT)jCekGg zyY5HR!65i+BImjXb&2Dg>#~~cI360s*P_SeIX~&&0Zb}C|BGj?4!>Z<^Kf-eJ03r& zqC8AF*+P%PKg5zFuBR@Qn}qO}mrsD;#lvt6$2gGfL3Xp%Kty-AnqM7B-#@?k5`<;f4~DMY|jcO4+g+ToLNTwFx3}$t^7p&4wn8GlG#%sV5E~}sS~P;-<<-- zD;bQKl=p+Jp1<_%{Evsj%xm(hZ$T%^ycYV(5!RU|Yg90%x z8tGamI9~B?fY6bL!ja<YG%d+@6$#}C!)0VBD4q@2amPen`;N(} zsWtxpEWqUC^W;*8w=b%e%nbZRKn!DfaEM5@NS%oY^X~C*)!Us~FN+h-vf23pGi*&n z{Xbb>uC!4d74MTVhv6}Sg(Oesm4%E25%2HT?U4403dI*EVjmTz{E5z)I)1K5%%rel z=3)}i=bA(m8jPi8Mzh5toQh5QCdd~lH~4e?EVJC1-4l!&Vph{Rl6DV#m1S?Q;Wf^) z=ONfpBN9wpSm|hz;Zoa7GG9nbTph{qr26Vy)yvi2 zK#+R(F=;@~kT$nBbP4OQ!s{@0kRnH``5WR1D~huGe>T(g@d9bIUf0ZQD!|?(R2MQM zcV^?qibT2pn>V(kw_l zx9i z6E=?fs#SfkA-hJMC8&!Zrc#&b&@Ngb&!=h!bBB+_Ia*%N$}2usZRhBf z^v)aM`n-mO6%=25`kRuFj$J{C+QIwsZm$ve5J4!xcNhA7+du91ci#`jKf%Gc@DT@j z3k%}!-*!TkRb~Fs_d1oQqJr+&uUeDM_2!%s{Bm<{ocd)= z-j6gBuI-AN?oi=yqXCU;pX55;Ns-O?ln4++2Wr|@I~3!1RI&A|>Yk_m0*6&AJA3}( z=9TOsPs`O#$B*f6THOcGSMP|-3sKUfS^uedq%DS|s?4_X)qVE(gtD=}g7qa(>Z_fX zOa#)MQtsqf=>WbrECK;-bdJj_482-fZ+xsrJMkV0n13{?OY%B%nt4C z2gl#Oul@WDY+iXVB?z}5rl87`b@r!LeYS$1_954rMY{p>5k6?$dV45@W}NgbPl^8Q zMg&1Lh>sPVtHfF*>{ZwOYq4(w*w8U^?ZAx)HNc>YsW zCgwCEJdl3Qg9~wnchG9iUPyaHCKwhzRHdl&Dt$w>2j*uT@mRGgEz)rk@JcJAb@d*t z$dP#-z8`oK&exeWN|zr*aP$7>5rZJ9`?ZJRj2Z2XV+^~Zh!e3kWo=n=FO^CM*zzeD zP1=e5fzTVa=4A3pW=%GhyHe%9V6aS}yQTN|gXYqSU~CNQNu1D1XHI{9KY7kYhW^!7 z?>SLl-Iz$xJA|k&b9H1Gn+=J=rIuK}?4(%FY)hq^217(rh|0>{3Ob8ua1&JO z$sNz+2v8P|@D`2|zgZMcv4(|SMV`6{;v{GzgJ4tqAktv-l`Zhrd`|!HkdYIiD*%VM zY}(qiSr@$2^t2*@m&V~MO8MxmYhX0k3GsIMd)QXlrK3(#_XlPg7)ayFgI7cn{h=&k zB>%1FN7VAKcyDIsz`6nPii5w>DIwRzAIG>lO%zP|sbELf(=NJa)Nfd>F~bl%W0@kd zbI5%9330}1zCROa*&jABQQ35`$NegA6l#@DXQXuriq~f*(=ekBTYNvgRwVls zEj>x%4>uzOT|>RW?tAESyK*+yOK1Up?*8Ax{|*+O&>tgcyF9|~aC$NwZ32uauYjt5 zqgWm-Z;F}<@a$%@U;G;+JATj=ny=GRB>j)=#V54qY!&5d>guuWH+}%tSbDA+UeD=l z8U&jt&FtaYi2LC9rMA&uaq-=AV$=G^HR2Y~Ba9No7B3hPJeOh>)p!|=xyE;Hi^gra zC#hz%A~F11Zw>;A7oRx^>5Jckx39d;z-W%NSt$gb=2q$tA@XGbeJ)a)t@ro{1bVxz$&n*Vr$SFbUP$rtF&3%4Q`K5uKa#6D|`~ z8(Ug{0Wl&9*~-_hC}`F<8=?0x1kVOn_YD>H*_qENoJU*xiNEtxtLBP_kB*LdoA6TL z>>ck*dB4YJdKb2SGF(MHzX|jCux1_LfYW(J+YbTyOBkQZA;E1$J@rTg0 zX8x~&3(>8t=2m7rN1i)>FK%Ha?DMeOn(heWl2`EivVcQxkvh^iQ@8PKx3648gX>Y> zT^kFq97*R=?mN^i`1;DHO?m(GQ9tJfGZUFWv}YB-0YMwWorxO0UW&`3%QrD8L@0=k z2^XbhQT&WqR(kJ~=7(dT?MnT|m|oq3Az*woFrOrRm2SF13triY7oO`W znqv^f`Z4JEyd7VFh0LYAj7l+6*cT{yMSaDI!X1XX{SDWoi`55jUL3omJBBI{plB{Q z>KeXVGvXqP-(CuTy8!ib{r4-hvid#9YaSzoB7hJF)`_+g@;OLWi8-7;$C{BvpPbng2reFJ>5=)l*!YN5fy3 z5DZfrs=eH~71d@1ieJr8EcJG*$m@v3!R%4p`VBUqtvi7M63|}QoY6Y*)=dQCt!4UK z1)$H&$s!M7nR<6_x3uCSu9|bZ1M=atk1jCLTpYa3hme50DZ`0BG~5m9c%BYXU9p#B zXzgV)@NlWSfCEnc&NjykkINqn9xaWM*Xl;rAg=1J<>z@QXxtePyE$Luy7i~b2-62_ z_aYivNcFdoaHGPiPRb7;L{ad}31O02Q0`nzLn5LI+~$_+%;0bN&k%zOfgVGbd!}em z=O{JS+lf_l zJX+bwF5}W!|FeP!L$E{TML*5-`ssB52K=5fp)>e|R$E(JO-Bb`$CK~e?;d?vrhuT@ z_?pjAJpiK1k@(a5q~zIlxl3Pa?`?zOtD36q;JeMFJv-Z>6Q@EXTIw&BQ3 z#YiM;gB6PNJ*cIZ(9v#w?Ch&bbZNnPeeC$^^9NP_h4I>bojOA0wL!=`;^^`>0^Tes zM&-5a{p*^e6o0@SFYJ^~VH)%OvUzb^@ZsfVtv-0gbt$>=fZcKE5D|5qqrUK6E*`#a zgmngvaEfpg*SUP*zpdZ9_8psqmjUbU^niLz(=N4=rdcs4{cb!}GroxdwBfSEOP z@t*~bwg^)80i_AAL2s2xN9!f=v!;tur~ME`BR@VFHbgAcZ&6MP>{b}q+X`1N=P8Y& z82%2o789GLiI4AXH57OF&r2qEJ#u>MFmVzStwnn(bKr*q>UXy$!SWor-A>(8x;T^3Z@Gm8qSu4ZKK98`$ckKe zAy;D+;Ry`w5`OyrAksj{0-v2i$4T)oNdD<0bZ(Q_33bh0VWQ_=s}=IUPJqaXsTX~~VO5l&zpD*y{pqQlR( zw?NSNtLHg}+PuyB%Y(R!%EmZ7;Fpa``3KfA$_Hm8D_L=q8lbb?MpE9%65e{@`GQ{lTXc zkRiMi6ik?0vNsdhv&?zlFddd)3O5ooz)Nn8Q4>t@+#Li@fnnz(cZK_xxj)$gBT1;l z0Kr28HYjt&eN(2}9FJ&lymvEuO+!>mCd(Rb{{CeK6PG-9eysSs{zc!*iTE2R^KwL^ zOq|vuSx0~Iv!K>Ugp|ni3pNLv7@x@ORE;|Hv;ce})CKU#g?UOT>(&rl^vk{1`MkDt zat;2F?=Mq<-tY6Z@dE0(wFd$_#Qn=44JGUB;1>w5F{x&Jc75J(wDgzxA>cyzVQ0A} zUya1H+JjkmP@n}WJ4g73K! z6SfVv4ze;*94ZO@t4o>lw`!TZOY}{2Xy4Hp-~u1;v=m(%9dP@LuFNMEFffYG+I(cT zWz{k};#=6cqj!i-w(iNE_6DJF|1v5ceKFHXgA9Ix?D;CBaj)EeG0`-A#hEYt;!&p7 z4a=M5gYEC_hD+f)QPFUpxLRdys{Z#i)-KgeXio7RkY9AARXzIj5s|O1y+&5fuk)vc zU(?bh#kXD^`p#YH85=}DDZR`@Kqw}Pm1U&x`LfJdzIK1>TKZT!##@*K$mBC2FOn9g zl^_07LgcfgstA(yfi#Be!SOm4+ZlT2roN7^Dss;4jkI)^S7f={D|!8g=ZrAHb&nL)=!W!H;LJ08or$qjFTnGm>~cM|y+X zo39C*PQFjK&awd+!J(Q8FuuwO)m}*RryeV>CacsUB!)clI)xiyuOE=KX~Wq1!Z}I1 zePl8gdXC9&G{;z+JroyaeZNCXKNy5yj!F{LnpVF3slA2Ud8tT#a`d#Tk4*x{Grigk z=l_2c^%F|g+m514!q@fsK36>G9s`ihrtD{ESJOW`)%IUbN0BR`j=Ys?HIR<^uW1$7 zQ4p>5?V#y88ql|e^@i^5Ke5w!&-&n}H^O0?=lJg=$YSN|_Ah#^c&r0CcgW+JWn~A= zMz%v)!4ex0uPv1J_VzRG=ZfEoi%EeS|2|K&x9?6=mgm~P&+zEP2AO{28mgeZ%QxG_ zm67=g?b*S>U|pASOks?|o4BbmN>LveR>7N-oxh?=lZ#W>B6R);*P6OEeBDaicv23YQ~}{gW=bv%WQI zx5V=pc+K{Z7ks^2kN5j;d_`aE30H2vNzJ+;vP^i0~>e;M6mo2vNkr7R5uB#n_! zaPYcD|A{JnynsB`Ozm$v9fVOEeU>GJ>EayZ3i%905ymqI(_tfYHKlzzc^Mk%z(yby z^2aIEvQavNGK?Up_?c6j?^M$RPU;stAHHTJ6*p`CH+U%jp;3JBfEiCg=#N7|1LgsH zl^R=kW{j3bg%<9~{`Wa$y_|9{LGygZ@UG{>VgJUJhi0h!_yjG8E9K|{k))=b3VQIv zaP)H%E8_g{U)O>vGCu8VBvk!0qTOXXXiKl{z(<7{j_S(7qBfpwSS}8kH4|@l<5-^{ z=w(QSpbTCd=;c^6>ARlJ*lM=@Ick*N7s?@RJ-;T8iRjPB%%ca)uz<-cqIbC$Tvm}=vXr__2!Cc;L71+=Jhuf~F+Hkit<+iN8h=>nQ@as*|x z{=^!ovdrb%Ru{Ky;cU$H%Qss$3!-yKW#orZ7Or=~qVWw?d^WY@kGr1*j5=~&LVPCm z{{7m^c?BJdVWk$qB;tLROBvM!kU>nG#+w_n)y9T4%urJTUOG>YATgfE>M!5>R4P9K zO$izt=t?MI*qQv=@>LwsgVz~Z>ySSj z;6G+gwdogOqA6_=ROG8k7Ek5ZcTwVbi_MYm)(Tz<7vZh$+j!j2n1r*kld*ie3^M&k z8j;Vnqt-+sv;3D`Sy#BOz>~}-Oax$b<>^5PV{6Qd{x#)MM|_0WV4_;Honmi|n&L1h z2@wR-jJ}bF^fW8iV3@K$?BnfPnC*b$-f_H3tY+(aPF@cgQpMWldOQ4UdM@Scnn{A}eN2p39&ooj&(I2Oy^7Y3 zp~=tpju+7*rIUlWcM{|)s>a#GL;N6n=qBt;7U`P6_R{ZA}f zwG*E8o0saGE+TH*{F!}rUXWApgI@&ViD+}) zbH{r+q82JT_HFy4LcrdIG%y2rg%;ILYyo(g4Y^jCtg?LCNst8O=+U|5B^v=5qT`oL zIy4AxiB1Jn&KlY2)3`;@&phycQ(Qbf$nu)z3r0Cien19o2P+0W9hmgsc`s|$lXN-o z(%4|@#YwNKnYlh4G*U(Mjr7~HA5c^Hh=p}cTvqOap@2qm-Vt796DF_z=G8y;^J zT-6+L+@fSusCm(p&99}UsJS@-xl`a}0QbAEp*18S;Scu9Pysnu{BTm?O_9+d;)doU zA_oW8bE1S7Vvo=+r#CZ}I{9<9P4KOA%)6_d3cZ{bBhc#Y%KsSLz55ThSUPk&VYc+m zzAK>Jt*kF-sEJ>!JTvLhF~U`2{mn(cs1inR8XU*D1^^-?mDbQc+xxn9M z?kvJt)G&`dK5c;y&SU9#2MfjV1t&Sn57s{3>bb9*~&Na4| ziD)MjLzSzNXxYO53IA_5CNc7=KUmLO#smDO#`vX1S7kZU&z~QVT@;A&hVVw?Z>BF_eK6jh+b&V7(A;x!oban=;v!QA_2E4eQSVu(HATP$+Y#O(ux*-} znil3Ebl}}%muLpOp~9ug&ib`5gMxq&DGl`@+tf200CR^O1_r?F_kz&iRx5h&3G|x3 zX72bh?l7cdt-4ua;7yPip!-aK66eWq+P%`^(@GP{K}TT0yWBL@c`Fa8BHq!6pT+|9 z3zRcxR4Ny}9&QBGAqX}4pWCCq3G05l&!qD;PkVjr<)t{htu^(3kAni);Z~|4)TO~j)Z@JKUpngn6!d~GJD!}uJoyht<-wm>4 z3pYc)lT|r_4NK#gH6QDAT{pL^TfHu@7?be@eybmxKRp$C%b%x3y@@8OZBOJsTCg81 zG~OO^D)gK1(xf$ZGJ-D82ylerjTT z93yAa*w$I1pJ0Np-tp0!!#m+uo}QH6bxKVKzLBeV4Lq*g`xf)GqOxzu`X3Vc#g$($ z7S=PyF%HSUh5dm&kB}~C+$P0(!5Ih>S~<=_8cRHtE152+tHVr4P|17t^Z)Vm)lpS$ z-Pbf+8l=W|Sy!m@`^ygVyJar+KNb8<~+(h=9p3 z^pi^sKu$p9eb&y~{LpWCFBIvNr$O(qeuGmuZ6icME-%1B9JM~CZNJ8wl_8to!!p#i z)d;ROWYq}E=R}LGNds;j-R=cGq1snAF7|-?F(XPM@8Ga`VIjzp#fzXxyj-xx2kPd3O(!CYoS>Bb_h~t@J`q7zQKlk@Dj+3{Ef7&Y2VyWll2Eezd>4B1 zYJ&dBWlO;Ke%_PsND!+}XM|RR|4>Iyv0dDY5%6Rcv63D6=LWT3dj|7`+^OUHAAWNH z1~@YDGWzq+5)B1!=PRzBWrQ^)Id4B>3Yvn}17Zzg4C=1ogSq2+me7_WJ_gM%#LWTx z_`!9(S&9fS813w>)f8}%tubx+b>>R?u(BSn*B$d|awh~MaSqyZpN-B#pk5?@fSdga znBPAB9|$IZIGz)2&X#^BTP+{g7{VL0d`pD_7sK61snDqtDJD+CvXQ*5>ph{1m1fkk zd0(%oS0#{W*tuv|mtEG5iQFuhqh;~*J9FPaBG&Z(v;gA1v@K_Tww4n?&ySlbH&+k3 zjYN3hzzYuon&PY{Eals`;TzIAy&y$n@0emn?I&6p1QS15LGb(U24)e({pYRyMX{v} z@N(2j96gMAFUa;S>EF1cFotge+y1PFm>y#;I^ovqVO5ao?TaUCnOj0OLa=09v)Yr0^?=Q zvUgOG)S*A=5@OI~sc$wD4{na~(HwM`1>5c2_0f`!MF;muXR7wh`)0P%Os%OG6zjcx zmpldh&r;_`kHY9i|N2w9=6 zEyDwiqFl#NV1H)Wa;D5JE`l6)nZMr)3BE55;Vk5V49%JkhOMx}DS9T6cH*yS%Lmf( z^b65hOy*TrFqomvA@uI(E+;F@V@50XwE=hVGt(J2oFbnMI60x+X(}p`~TF2A6)e+W;bibI{YX1 zhBptb8}NtB)*s0}h4*iI069Mx!6dFjWxjOXJ=qJLwv`Yf4-+K{1};YGIdeyQN!)H{ zqn{OuI#UUFeLc7nU51NAHE?0=%M>DBD6ts4ls7u^5oie{j>4JguqXfd1>pP8&rv!-CCL5J`A) z^j0a#ueX+4fGnaVss`9^D#(ES6`^cwT%Q~1Exj|v3wj!M#1ys zf~Zd%=NqYugFNgf@>9#omP))ps7?UaO{kAZg2wk|a{<^v^W5@+HNW#|03u79(=Q2L}Ed zRvx1yi0!g#$SZ4uxBNRwQ2dGT^q!rID>!a_7A34lH)C;TB|!4=aojoJ6@EB4MpKg^ z@P-*EAwA;wU2&GQ&)@oWh+ z8Za;c*65;`%9}1VB-}Gg6nrx}(Kkx=oIkaAa3cE8ygt0j`-{~7)A7AAFW$>zv-$a@ zaJq`n>J`{FK)LgesSmQl_w?{BEy9?eE`93>*%l8wvTv zyr5G7dIfXY*;tu8k27x=R^#`xRU|M5EQB$nf}_BKE0>7yzc+Yr=yxiF@39jZ8~VO* zt&tIKo$P*PjkQdgjM2ReJGF7dXgkI-mYf>_qzU){-q-WQ0Adag*M&{q?h)~8l~?b; z+NL+P2RUc@Px~47QMyDmal6>wLY+ic$ZZ413OrhYC zp4y(eYNeHfWqH+bAidHaE?_v2;cgW`uH6DD#mc6)FUhxZS1r2C$7bwQ@($%`A;10I z6UD`f-uoUrBz)*6G8butb3P?HI2X;qh0aeU0tZC(M~PqRN<W)_%2<)8jP>_wbNJpENtVH}L%13050TBj4zB(uKT! zeBJL)f<-Qg_j;JcYfV>I+TgP!6+MtUm^A1B!ZdGiPb_2^X>H^qJq##{=Hn_1i6B_*hb zW9Sz#*6FKe4WDGT+nsJ|Tl)6=fSACWZH$q^z-*;mN+K^ylb?^~#+3O7|1864t-lt>#oJS% zgu2PTXCF6QAv$CcYOev8nB(V_NN7t`ih54x?TlXIaA>VLVH+$U#zMqsJR6$clI`zx z1Dql^uZVrC5qg?h;^-zPru_XLk3V|*?(?Pdd>pJQz$Ei%NGMS*>AKC6RgdYoTEhW2 zNcA_Y{QeD8oWvHLS`So;vQI}h%c4&&uC6cHmz1P*Iseue%WUMPT%>UH+r0|`(ud)N zVG3V+gdPu(j&B!yStMXD81ysY#+Z+5oFN?Yt$483d`CzT8lQTyEUw3-pxK1liH1_Mp9nZv%_suUtTORdZ%u-AsBW-KBK~TTu`zBj76o@hG&#AUP&+AW7F^G%l zq~2~DhkC#q`?p4O5B9Y$Tz3F0cjPKd?SWsj9kY45@3GwiYjfWjr24MD`FzQIjWr2< zW?!;YZ~|R%7APXtw{L{ncT4@WRY!aK#Q{gFdQvXa)^{XB9O}` zNffy8>EG$o=^&2Bv+Fal5k;fiOu8TaN**j`Bo%Zc9gU1MOoKmSar2>OO!tVyTp7e& zc)3(OYsQH;;PEij$2~RwwvcV_1-TV;H4F8^C-Aa&%>)k~?q&g52g4L+oq@7;l?DOYIY9y3yN6#T#D z@^jbm@9$cS4n=L4?zDvLb;nBlZUcn9hoM-PSHt9%-w!qlzyV*G@(2C(f3cz@-qDiF z8T|Mgh~i?BO5DUY#hm1Rdwx;O_ z07q0$;EmsH&17)aR9%g`>iaC*es@R0#l^+3WVk(d6!GWlo|V57fub6bcA{$M;wN@X zpHZMXnpNC;x9;681|G-lMSW)1HK~-wK9OY(GzIEO<1{?1~X2z1w6{%UVszlQN z%Dmah1@xK;)yn%O#&oa?hIPFmnI*faoaY1CVg>ivBijV|)JgT>72cqJ66{GsB(rK= zewBq!3=6rGg#$ZQO^#39i65ZU%K0u6X-INt0#*fEUbyk;v)jk>GyGbv8Ru&(KAc%p8!!+&^+Q ze@n}jI~%vA)7w9A*y!{H-(6^rNG<;K`Dw3W*V?AD{fehC9W!*Zx>o`XCs9y7zOs@n zwycbK*VXHSjL%=N!G7y9Qy_ypES6MU@#7og2GFR=?_;jy*Z5h4s3E5rMMazNmHf?Q zEzNEFja0{Rd3|@~35*v&LWm>P83HeZ@e`0VHRNGvDkDP+DI-71^~PvsR?x~$OwLdb z`TX-FccPKUwIocg-1{q0F};4;P7akMR9sIT)be>&Vv#BB@zU*hy`s()irW~7&EK>2 z882h`rn~~1_#bROY^cY^SoDAfvSnqiv$zKRUoK8FD{#aR;FrFl_AKQGK&xQ5b+f{@ zvhKouphdXZjQTIwJc42Ys8O@$O#>LaavyA4u0WT4JY%`!eZh4!mp{$TR90^4U<=oA zdnhzj{LuP9vA+k00PCLh1M>v{Rm?q{i1FP>uId_cYl{9GyOrfJY*wz3&1khOvvU(@rM z&UqdYN*(`A6X6ozSPWSGze~Cm?21m!i0oSyG3H)as=-fovr{3`50tIE!QByA@_^vQ zJyOD`o{Ib5vwRWNe>QXkNlEd^Y97=^wg-^EKm!^8A+0|ZD&8*)nDAPdnb<*7g+}v6 z1c?MJ3I|1QxC-$Nco2292GWF*azLQ0?O%>i%*CbSrw(cO{>%GK$p z2RT{77syJUuxlA#zg_5VW1lGgx?AE1q|WNyn_bqVn0qywmXdPq%cJ!Xa$e9eSTC1k%=531|}+H_oUECflS%#`l-D=ppQ zerPI4Oz5gQ!|Gm!S-Z5Fh2_rpu|QnQ%bne2h@lkfYFo}p%}DW2<6G|rA>N|Hg$rbu zVP@cr+QU=)wOGNi#gQ z>j1a?Z*#9YTp-#wGTvkRQ%~8**l)s@r39)EH4gh#y3;l|oWxh5hSm+OL@)dN9xl+z zMLizMW7@Xs}fc6Lssrx?WX~;lgAsP(Qz?r@OZi zeUO&Q-`e!+d2oL_&$p{Z*mwWmpy7uye;Tll*8sh)Ma#R(ove1J;Q{FByK^VkX4iFt z%^YE(_-4O#xVI{V_*;e{juC1lkSD(beT{~~>tkU^Oe6gdvXcbQusJC_R74R`Ptxa| z{w$nGDGmWEQ%^*dFr&PVf;VF|ZuqZeC!vn3$#zh+0c||x_#;pn-2KgF;UZOKl z-(1q*S2(t|uU89swDqEqj5GKn^t3g#b{u`cyIMyfVc;34)`ZiYsd8^gXrQOZQ6)AB zw|bhl)zl8DWNe5YWO$z2N-OkWZ&h+K$p+K~U^V5C4Dd9CM2?T$oW0kBR#htQD>txm zyHh&CP}6e$pj{q?UbmbdeTP8Rr)y%`$iyF)8lN8!X)U)Y6$ad~u|heqa1Mj#tvl^m z3_GXqv8rmDlP37Fkc_h17eW-mgvV+?XjZ3|#}y)vWttW6D5Qv|5wDo-0wTd_o5ZbV z4RSCmTX@P7Xj)o;BEc)D;LLl9n#WS&f4zQpNZ^p)4FzC;&iXMhoSwa7rgukJLpAT+ zB*nwi&Z4{M&Ew55QXyr&PnaLm26%rvFW6SEL_y1vg##eadx#fWj*UG!2|@VJ zD}#VrQ?pWkSl2jc9ZVI@oK&w>(cRwr#OwaTqWb!f8u;FM%VmBU)AN3MyA*Dv=I4(G zrO@+@O;rYXAPeiGNPnmtvY;LFs1@3NV@Sa9Z5(UuVtC$^H+`ty!){%e#MT69{V$yQ`t?oRqHZ<5m! z!vmtFoj~ra$@kYu1$wZoD(vonfkD3ghP@-YN64o&6ZPTXvCV@QZn zTlAXOcJg`17fsK$z9dTv(b?CbGZBNTmP&lxsLWD`q7;b&NbM1Sdf0$c4{R@`Sk(lT zW&~PZWEx9Q$Vm-}$i=MY_UkqL@LufjpSa}jQ2cwc6NSM*j9z{qz(-KU<@BU(4(ifw z9(j$svuC$Hk=ujByN^m&{3adRSA)8MosBEq1^EgT3CBWYolUPEJ+t%~OmITO2P0_Y zPj9_-jP--YcKS+^S#eO_x4*F!7-42ccLz*9wtPHW)4q~d>--0X`K*I!OZeiqUQD-v zANq^&ZtuzGp>UD)iODiJX1t&?2>CwyW3|xE$&H*2YuhSM-H#H*kMgVrkg8%KhAWsW z6hIdY2CoyrKY9nRvpm0@i`qBslb9#r_R#s9)AOm+f5sUKN*} z7BjQSPPzvXBHr>c6f7sxXAh3^PJ|Kt`2n5oXk`O@@>f`v7)G*G7xBNLd2{H}CX+*} zN1q&rvMy2#D}u`YW*=TZq)?&&bXaHc?ZcPXM3|fFQQCa&wUvEVLCRrInJiGj&1!N5 znL>Ax7jjkEiA&L7g|-%{BK6b#j+wu> zt!&>4>0x|!j@4B;XR*cSA<-CoU>&vk_k`qu^ux>p557Wn4Hz$+A92}mgJ!T=1i-k| z3g4l~m&%<9%aJM{3>B_|?~>N*#WGa#a{`3nZ{H@`o|ukQ^S?IY5F7~)beE$0P8#)7 z@*V*}#tmxrZhZCMH=y*%gxEo=zrhQLpc7zBXN=ed`HuN@0G`2E z)V&ytt^=fxM*VB^qDC!(M510S4f;mVQtG z`8KTO1yT@rU0?{18;v^m!JN>3kj|Jg9O$d9*o~erbI^v~=;*G>d8NA^UjIWhU{DYw zJ^yomgNI7GYb$GPg^Yf8Xe3K?2;`QSfvmSyZw5AgE&8C%k3i&4lu1sJU_OF+bRiOM zI9%aBFb(pSXblL%Re60rgYur*Az;dgZC6)TW4IJ}!iC3wP3EUDpE?-VdH3pG_}%>K zL}o1;`B>$oXFEMUs)2wf`t#FlRszAE_6+Z-afd;dsDTi2jiWsRA4gv<2+L8Ib-ifc z-Ev!6kngcb{bSHdKnk5xY{_40@lcEperj7Z-42RChZKok*HpBrHyISN$Xb6)SA3@Q=RK zv+PXcNMf`eI^{h=kX+JGAUgc<9`L5Q)qRNS5XEN1GYV&-YCoOKK^eBs^U;4`vsYr= z=o3+OPg0fHzCMig5~2XM1%N&T4l)$gsUv*Le%L^opdes5dC)`Q+a3rcogqCo%xj0> zh-1^dM>O^ zGdVG`*qS!y0)z|qzY$$t0&)S}e$uE@mDeH=91_Mi1~hf0z`>=p--bci55&eb{gu! zhU8X8p`%9hy#y42Wt2t#tb>-u+OLT`ho)kS6u`h3j4Recgxdcsx4^E=KctPqf$H0k z1-ZH8@HNSWom(3ELY>;$PFyOac6>#r;?c-9arTo}qCt}l%H z{(}pxh;4tDM<7bt5qi&f8tUiK^RU?*jsBkR%#F6iF0^Q=j6*vWktG*3Fo8w4EmZAf z5rCF|)$TKm`L^7Xlek2S(PVaLvP%#*cJus{iAQq4ee1yHL!h$$4cWepLE^a06pAda zXy;2HYYSR7L|l#Y5fsOUibNiERFbQ<{?d^VM#umq4+2OJ+0%t!c*m4Ibqx!FQUUiX zDq<}$2AJ4rWK1t~;>%V)S}8x4lKT3xW*)t!5AI|}%WX%O$w469+Qv@CM-m<(hfC5& zqqXr%a%2GDHdZ(=CRse;Uq++JY=Q~x&rKKiKoJ8KJ0hE&YU?qDuZb|Teg%+|hj7w|4A z|4Vyr2M+X{fqtAdj#VhZeU5S~nsSMk{xZnBpFLCGwKsbz2Eq;9*)+n}F!XC8?^Ifs z2GO57V;+^imFz(e+ySpe3asfFg@$+tE}?uPMT>YCtH6Pyl@m_8!+sb(vvQQ}^0J)@ zli4(d0{;&Pp_?%B%AvQftskqMkXQUEK+M3=4etAzg)E!;`(qsx^St?+c%ZYYK=B(3 z^vya(UESveSn09_RxmKA;{KC%P+>kx!3zv-J8SN~=O3xk#Gu9w?4nE(B1e!E->nrO zQliyio+*W2f%E6w8LfJOgfl^2_eW{D>ptPEoia&gRb!p_ke1ZGG_*dLV9-rt;WyY~ zU;>8f4Ot+tmS6wvi%N-n^eab$Nut)>emZ9d%F)>cv(}j$J$& zC^c%W9CGlQhLM22=H=fsU#Jy;T@UhJ9=l8(>KFe5b7xf)I4*_PQwn`8#z5q)m4QT% zK`@9%bqesfu^nypmbfSJr{QjD#>09tU-zcH4fS z8|$g!j^_$uy)q=sC`6v9*A~(4JqLYxgcV?(E6dHO)Vu%+l}xML)yi5rM5zl_d^Z|aN~9!ynt0Xz60Opz3row;ZxoIEfJeA{x=cv4c37m_P9yr8WxFC&Srv%7&8M^}1lwo-%O$A*yB7rb{X4Nw;) zKQeLu5i{|SWz?_{q_FA0=d8ASFS}RzHHaM?>%z=pCk$~Mz?DQ>c`GJWar zgynwxb~RJLCsx!#!*y_wWH27L4Vf9m{#vN8C|4>4Ashj>^G=#ASD}fsib0a{@8U;4 z+9232IfTi-Q7P$JvI?eDX|A>wHf>;+lSUcXLGW}s(x77`=&?I(%e4VDZgm}f$XsDnhStJZAAOD+|W0O zAA*)oPob4Z-mgdESXzf8f%34E$I#bOh6-yNW5B1R zfrU`tTW-NWISR35N-9_ifjnP~3``>#9}uLazV(NwYoM=t;CAWcGF3blHyVjVyOw`O zjDVFp z44k?g(zJwVNCW%A1bT+S%jJQWAQa{*^nss?^Y7<=m7^WHS^y(~6*JJqMbmF9X31`d z!FEMHp1BGSp;=_Lrq9d-1^U98;?5FUtu+DQ%w*Zmz6JZDYPbr$9|z_OBx1 z09ELeS&d%y?7`Yg5$T3$}kX9RPO6DFP0lLdIOR^SQ@hESbsU|*8U z>6ajP#B?E~luD|ZyXeJhzfUE7pQFGUV*7>@OR{TQCt{LCkyd9*yb+Ac z*WWUn;%RbP+VGc;%09&M&P=ZtAY)N+yuYbP7eUN8UTZlaAVK4k(m3*h+_Uj=1~oM` z1&)e(9X8VX`M$u36A;2g1OI6~uEQHz%}r*fjw;_0S(o?Bog>Bb^U$TuUuYY2LRg`< zgu2Wm0~CqpU0-;MKw+L!(1yWkwKH^nS87gSQ1|bqEStE~fx#SLsjoABOBaUq=I(aH z6|7a#?AAgybrwgx!*qE$vGm{9rWixHameza%tr@u4t3prZmHRqVBDK}1XydiefCPP zET10~#^_V%cx1$xW?EePMPe+K&+~f*q3JW0OlE6(@Gp%z&H1td$rz1|nABluiLK z`wB7>3!8Gdnp4{y92bWW9?b2V0c=AK+}iHCs2$W5p+A34*VD~!=HtR^&88Asp5*xD zaHT$qBA~LqN6SOBwr1G)j!B#KMPHrAq$mA;C10c&)`xKna~*Wdi~{pE9*@$~_EVds zzsB0}C%YDx*kKmes9+8cB{cqPWQ(l*^?}E%Ht(hTc3b4w2Uk5)PU5ww-Y>XtqjyL^ zUocmuTQD*Yuu{gQYJ+m;lPDjGH%bJ|u2w1l4n~9+)(m>^jN_Dl3{`W9j(7l9x&qgi0uWq$b zg1aNf?i-AK)193OLR%u_KFSCyFX=BcTyrs|O~XzsAb;@WIC&Q`3Nzu1_r;a*ZK(sK z$F51ht3p?Af>d|JbL8hQMy)b3G;8q|O`k%WH{iU|Lq}4ST zLWL^a4BHwiL%#+Z{z`V2AiA2`4C=zf0Ki!I%g}pNM;S8;;lZ{@{r;yTB^9lu6Yvy{$Lg8fx0~;bGdwR%5QxE8E@M z>zbrf!HX94*+$>rM_XjhprAqpAX!I%Z#7`SIO^%`-g}zSKvuNGQ$KSfdSF^4>J;eq448+t%nN}^hvZR{(e!? ztj-~Dp@e-RU2UNOkv>|35fN0lEz_vr%lsfN`ugie;s0C^Qo z9!_W(+mht_{E`w&FpcB|IWkk?U-CHS-J`nNZFCP3b;m}tw9`~#%~T2?lwt{O{`jsg zxcR!c+25T9-S5R#ELvWn9{;dRtKfJ{Vg|O|Xn7}vQpe^}Iass`G~%zC7xf)4FBtf2 z?T^1}pEzyg4G}tQ&*2Dx2rwP3B$cZMmi~gw>HrYYZ5pZd+Dsb&n+s8{07U$a3!wNp1581YHn0DpN{k+ku7I)S{If4Gk%V&A zM|8oRZ3SbFJ7@2{t23l1$&ixm_V4BO-0#mR8nFhhSLPlVwK!l_w|0;)06~+6JkdD| z=7&$p6MPdqFgkBIgTJ!uwwaeoN?C>SzZ~$gbM^>Mgdj8IyQ*~U@tY|nwWJ84du61O2ygWj;iToHa2t^ zVGK-kt|q6L5}J4#(_imm7oAs1H?JltnhR(^ZDh3OQiPulOaFR6tF3T`42zW{ynSmS3u5a5>S#@OmA!&S-+ zB-;M&M8E4Vu);U|yTA9&f&Z%Fa{Z2ix>yR`lR}jXo#D?I|J$jifY2n|w{nK|2*6j; zNbyZG+@$W9<4+$pI*D+w4m^b#xQwy`SK)6#%Pn)b%vkkZaizvmiGhA$5i1}MpLUrb zV{*?j5K~0ao$lCoj5X8a2a{C>JivPXU%qj(NHIS~<~ClzNR@1N?H7(MX(M(pU~ z@O;lM3Lifc&0L-gL6zcGs>OoS)aVzPx9J?vf){9BjQirk-_IMOt-$sMIK#`dobaQ& z&(^EO*3bf7hM)%_ev5yCmP6MIwWs&G-A#5_1_ZB;M8I5c3(-OYYM+D%xjNMR(U zct%fvaT^4YGfJ`1caz8L?53R^^h98j^D$H3juXl5es2O{!iU(tjsLtM_vF5pE7Q1R zHlhR`;e~p=W>uyAS;COWhzLiT1bOLM5`M>O#uaVQGxFKe!rRIS2UZ=Txg->Q&82k7 zXWxAfPTr}l>zjkdh`LYdht`2=$t~eVBUd6=o18k-xr1F^VBekQ3%7GxZV=v2(#fQQ zh9W4AMa39pp)L5Q;;+!tRwsAuTQ!>(LFmE59}?UxaFv=TyW(NI)eH_6(&2^=j0|UR z7XkzMh=?-%(nRa;U6*lSYH%>mEAJ?)Rr&rvLc#JqDAuaYzocCiC#qf>J=AKL-Lhz` zn@K5zp=E|oInNo!wwu$PH7s6NRwwx&4}lN}DD1qEWrN)LBE@(bU?h-N;DhsmbFZb8 zrL@$hnQdiZ2_b9*)sOA#)y>j5Dy^lZV_`u{FXt=jVrAFMOXyHWKRt%KASq^TT?3)H zo|F`KA2gXKiipO){x2D#f40>Nr>+~hs-nf?*gR?2otijm>h3cNyuseuAFfrlv?Fj9 zqeGVhejq#`0rPWCvA*f3O&opEf^VP292{S$dGbFUtgfvZL$E*;y4iaoqSkFr7-g-{P%`z_mW`q_H}&@RBCv`f z3mC9wIxGDeNAurK3`LJNubldOD(oZ{9yjSsZ+FKIrNe z02ltOjSB+`PYgzJV}TnWjqaJCM{EG>RG|tlYQ)exF93z=ef=0sN*+uj4<)}R(rj76 z+i^^`|NH))`Y|P1I=cv-?VEyNgF4$cSnU^UL+!A-5C_bIZ32HNn)(eG;N-s>0#XN} z({heJJ^G%$803CwMXAL8s-4v`z_9KgNV`KweDC{QfrT=mDO0JJW4p!+rZ`NM?NN8& z?&MA`+P5{4@H$=17YWkL*3cSASmXR5wm_ZX;qpGqVQ(s8Rysx9tScj&gJLa1Fi7C_xw6ybXK`0pth zRx@pG4B$LmteK2K^_IDMU0<$Y`ADb^FTcR)@5S1)z>j4352!DACI(I;npR1oTKQc~ z5T{!~o$6%R#+91b<}$#*>~~KCO3=p);T^9`>u4hf8O3@~$6ejj415quOAj3~4O_Me z8M2d=jY1Ya`ZT`xp8H2>GpB6qn#!tg*4d3!mS2c@&?BGgdm^`zD{`S!CE9dBU-Z@G zwk+4B!wrt7MSH*4l^CAdre#n=rZU2|E*k%02?S+I_s>m8MZ0A0@ls0~Qf!yyB zmX*Jox?%G#eA8{Y*Seh6KMsY1o|kBsHXn=<1Mf_5M?W-y+(bEqdnd5SE|MW4S2?tU z)wzRZ;y4{uknpZD(gLh5+?j-wk<(ZKXL3xSf@(PH6P_fMorDkP8`kW zbx1_MG}cbU@S7pNhIK^H_L$&+)!XZJ*Y|z)%^5!9anwVgq2YDnhic^}olX ztI)mNA`^>lZf1!ofzr1VoTs(~xg*`=thwo%9U@^MKDbqb>07Tl{ahQq4)bdO-X9=uMQB~np zrXUNQR`(Idq0TkqbMr-00bSzwmLLhV6t_iPN7T~}+arG2#Hj_*-!UWRx7rQ6s< zu6}$CL!An9Q6Uik=?VCk_(`<+eD-TZ@{)OS7qcFj4Q$mFR;JW z@8(Y5_RbqI!6)YGdmmZt|Gcw{WgE<$Z_ ziK7MdJsI@T)F~ysHfZs{gjT4I>%ERHb#?S2$(-gq&$ffDLp|1PCUp=+vv_2I_^{~HOLUgEg zl{o;tE?bHoUXp7!fIq>sWl&B#xtuQf z{`-Wtv{ieH0U!oXs6Jp#5!Cz#z-BUUpG_VRN%;HiZ{5bHi@h5b)%R^bb#**#m_rj7 z*zbed{PX4leKeNz&COU;c%jzKqwnxrl{dsBQ9m^@F>usAIibgNKAV*;O{#*el$|Ed zWIx*$Kg3obzw)SVjoADY4dbuM6d-L3W8_B^Ck0nc)0LetVcU@1F@V@+zz;FOn zMbtHPIo#5s;?XcM^^sw{bnsQ&TXC52q4@3Ni4{zBq>_tOYMc-7|BU|{~uHr0t`ILF6PZNEPou!cNfukd$H zKJF84sF_&7tB)hoZ1~f_3J3>J|HoAe!{2Q7QNf%mQvf{_8=} z6;W^hPYbYh6HuV75HBZzE2a={{FsW1^8p>GYS6)(`6ouxxWptr^wm#mdHH<0exIUi z&|OpXp|tc9CGpTnjxTj;FQ9ajW@oCZ+heXrGX`4b?oMwJz!tGU4{BH#K92FQk^&WR z7AL-(uB~oSUvCV>6>cGKk%0O9VJs6DfltVS8|4jj(Z~YLwF->Tl*xmJbs*3H6`e+@F%e&c6GQ#_1mQ(s~9lk}gk+`t!8T;sB+*PyMDHFE8-%SHxI5t!O=Q>|T za+ZpZPXaB~cl4nI!E5mZvTJe?5EF}6<~F>V3dA%6sZP34+<7aT;N-vmCQsI~qI^pr zr*9ULnQYTOgI9S#r{;=5u)BbtdDP3w*m^}K;6+pBFZ|_ zBZn|zwu3xT3FV*+<=|8JE|c6ZBpMoF+-g|I`Cl-6I7Kn0c8s*4&C~Drvu;2#LsdO= zxMq=$A77k^0pceZF`+mx?;7fEj>bzKLq(+i^yT?>3cb{lb2N)DbCw^}Xg5DAgnjrC z^H%($3L>9{f#Az6mIMkCj6I);g4O2Ne_raPrByYz!$!>qm(OU8;169t&A(1yDE(w- zHqjDlaq=x!;#QgM7qEI$BalFO+wNTi7IxsOIr4x&R>p)R9J+kz(OR8))d+L?sIe{G z*1{vHCUk9Q`n{~^7pF$7a*{()17Zh+E81mfTwTJ%f-d+NNp@i82LTmAW`*5)*Ke-{ zRX?^QF*btE?yDzy z`v*oC$rVI4qJVA8PQm1>N(8ZQkfgsH>U=O&?Jyo*k%FS!0~}I2*lfONd&Sl9*w_J| zvdf#+lE)3^^idjnhOE&>#eY7jb}-tdiA2TorPw~G{P9o5A*4-l2C9=p1YT@%02D$r4gwrK)T zS%fp_FI|je(sau_#o=-H|6}j1qoV${H{d}KM39s&X+;_Yq!pwjq@)`~q`MiAZUF&l zr8}ghV;H5o8A>{bZr+3U{?@zhy??xaz5jjBa;a-Xm^q(w_I~!>&wh5;Tb!VZl$5Z8K*nBd}LL)HVz1!cGRqqOszdK-oKNviPYSE%#kSgjOvs~K-GFUlej62V z_Djod>%z&-ViqX35i3zB?e1mB3cI1l1C=eqT}G9G1m|`e1s*Mk2G9I!gXy?7?_gB4 zhLfR}6Vp`sFQsj(zd0Py`5wE8I*&WH8_^_u&;M^yo!p7cQ1}ix$mZnL7<#K*Y%T)&71^-L@OYq(q-BEw$4s` zbG3Z*ux+;lOv_P9dvR}D?BmdHuzBQmM?LxBCScywXZh_pbB@?X7^q-s8P5dZ^TR>!5ZB- ztj46o3zOQ%>>MrQFZF|@<&cX=lSWO&s1(fU84-V$Iz`kX-yA#CS*_;r&Wm)I_ zysL2Rm0tRn+(y|h;x@GY=w~1fbzk3-*X!5*6h^N@1!v_E-iqW}%Q(nURiBvY(TW`ee<3{*Fn}trm-&GwrA}0gMsizO zIqM_xylz(lxKi0M67P<|r7Pjh<$4g%i2kah-3oFqnuqSua!;TmgppE4HCkAy?uvdQ zdbKBqWNrBG!WIJ{){!EeUFYbcwYE6#W0kAwh+Zps2sPC^h;5gHlyfdeuI=T3c!=36 zNi{M@K`KEZAub`I%+nMZhC7AoV9q!Q77&UE1!t_tnrFtA=9%*rAaxWfkU0dX3Ov-) z*smV>`!M8>6TQyAwZ;vVzOF2HQyIS342Gyu^@a+WW6|P0;UvATHe~fJWm-Z0e#5_& z)5YdkKFuFp%~^J<{sU{XMyTB{GPw!Az4sem%$I;ROh_et%UNNc@dZHtUf|`%E~aPQt$8)XSDfp~KH- zzJwaJoS+dp!SRRR>0^jXRt2C~voHd|g4>=6x&m@-OqX45(!3N% zWE;t^hR5`H_ZM!?w_GsXXKmGHtxbtzG1K)M!^J$W*cLID>&JT8*_J?zeHT>8xk_h; zyFt5a%kYHHXvCr3qIHCb6x0l(D1Hl9Wx~og_~Yopf)R12EMYBaJQ&kP{@4G3{C|V* zWxaS^k5py7B}`PPwcl#@ziR?|!V8YqoNK1PV*Dk!?*c&cHb(SDS*s$G=6vE?6g(>Po1E%j+fKVHTvz|-j?U*#O$|y!Oi$+r zj;~~;q_F%Iai7%PG|9^`(q9wzcl6y23?`v!og8mwq7PX4#j;_XtXXzs*gbM6 z=+7SVFg*V;8Uq6(l}ZfG9Rky6NlCue6qdfm5-uY6{4rsJBh?EvnWw=?(&v!(5 z?d5UzX077}0|-4VGLm(f+ONFGu$F*~$<4MHGztXq1Di*|oyNhECbz%CmddnyK)xs- z_oghTS(=WnikJV{i}-h0Di^3`>tL!4FR$7MWx)4qQ#1Lc6VGs4rvV4IoUE(V)%`~! zW()%@BU)QI8mpAZpZjOn9I^!DMemDFCCsC20x}EG8v^k5UKtO_5?C^|H_g>Zavw?6 zdX<htT9C*qI@)YGyyVat9n4l7`g$^xoE2cH`iDcc)yy`^J=9V#l4*#=>7YwKS}37{)~?8e$p051bozld#e_YmR|@?J-ZSiz+a|MU%|RH-c*zl2)EA+!8@5P zhoo7y-e87p_KA9n=DkPMcd?n&>-9+J<0QDCfi*@EhM$kulJIq+JF%i#sOP-k;8z)M!EJJx4Y0BZIg8pw15 zFI3tu95qVWXid!?G~oHv9Dp1#7d2$U%2L}6d2S!W+M#I=9Ji4X}m_& zr}JV54WBK&RKnWI(Rh^ykg2474{ef+vA57c|E8`>lA!EM?x>4F{t`AHvqBxs37q-N z_S72uI7~p9Q zP&{&%_F0$y+?FWTzDpP;p5%><#z%{ZV#N8v)!iqMcr-^_ZG{zOS5mie{J|M*uZZ76 zEK~@%ftp)*R6zy-jVOi=cU2;vuf4kCRDMWdfl}u;EBkBU#bhA&MJd}nCPzEbbQ{*V za);A~)rO*Eb}J{p`CY%+sauT}eDxwZAO$G+OxXVn3>z*jCb^o5b->bm-ryUb)0ts# zVa3*~07k3sVfeYFdt3|>VxJtfedH?StniC{M@FI)Ip05b{buhOm>GqC4}A}DLDOP6 zwsImXnHB%urDCz|6zDzor3v+0cioW6r?7%`c~6;sU)GSF0_2FbJvD75mf8^Z#;PeD)g)=KbEwQ1S-Xi z&%K76=0eW`LYx8Cj??8{S*b2Tgj2v!Cn|HOfcl*0!J$@_cMUpW99it5p2XaJe0~z*lw#YY<$+l zFv~@8&8<*WxT6mqx}EhZBxkuk)Fch!{0fn7)aGHMe%}3FC8KQKK`}%i3p~phv7nl4 z(>wPpCEUFU^Q%$5l|L973l%JF4np${dXQ`M5L1)jg(l$(%_Wox!Y+yH6;rf!9bB$4 z*A;bsd%A*q*bcE{oFjTLhKPIa@* zr3V-gFIlzr$cTxK5e)lF6+8yPrs&0``?;LawV=yX8Dl6rTe70Oj=GiFoNCac{kHQ&zES*eq?M1KmdLj85_eXR5_`+#Bik2Pt5akWOG1MQPIEsn1J4E}UwAV+ijS zXGgiL2R%%HD+0U6hySi!(0O~L+{+gtda?MF)h*8H2O}Lzg0c7Yt!>GxC8g|&EfSkJ zE0?ib`CiTHWceg}=<3_2zO`&qne0hCy_m8Oo1H(k&I0w^qgxiX;cNHgB?zVpMhQm= z0_*Y#wgP{iofYjyva*cq&{en!tv=rPM*d_Hqw`b8^^X z=z3r^U0)v3-&Bi3JH#=S4sr`NV$G4b90uZz!{4V)=FLBL9ONf{>hroZCIAegmT%)b z(ggLRpP;8}UY84-yJc0Xr|hofn%D;3*BZJFo@7^7sIO9J@uNY%aCqb~j=X&MQ}Sj3 zu_zOGWT7yqc(^B<*rHvNm@KDB4UTHbf8HygaG}*s4d8&VGwQ|TAU@u0NVX(aFVT6N z%;hyGAH$HcX>TG#36pwr_A+P{!N$6aW>?kxz=>G3JV(~%H*+mTQCqt5s6Q=8*nq6o zW3_M5*2V?jOh(et_M_#;TMZy(Byc9RHC;IEph_e+tDLM>*D&oml}x zm6f}B44<9wsenf9(UtXp>Bt*1@AG1LGuj1)or1`~_XVprQ9x4FH6 z%?jaxCp;h!ZNAy_(rtFbstD`8Yrq^Qw*cR54jNvNtk5~b@syN|>snVqJR9CTq9c!J zGd2Dk3Mh01Tz{;FHs|d$%NKE%y-Hp%o0Mstd1yXguh{Y|c}ub(l}y&2<}R!=tFnB4 zRz`MYE5wb_=kz1o<$QW?HMb&|;mhv(ov@BQ*r~86)yAiGOV&=cbqEf@qxS;BLV*>x z$@>C{0aLSI$!e{F&TOOQcbl5rDAP57qU94bqBh#Z^bLXT4aaBG; z_Y2Ogm(-3oCH0$*;?fuU^p#!0CnfkHC_S@~Nz9J^rH~9&e#CXzRR?qsK<0Eyb@=Fd z5Aau5OWb)PWf@{_i}J*88(dd=)|#kBaJvi#mNa(tVYgwb_~Vq5GmswxE%f(54UKi9 zA+*<$dyzzg<2L8sdCUhUycm}YV55u3OVNX0pzKovB+PbC%o;#U$8UY_^B!JpEEvY>oxmlKxkpw5l{^>)|u-hv_J zw-vXIJQJwPDz)>S*6?xsm-F@0Cwu+r-oL<($3;y28?fa2(b~N8ufSKKMcM6Z_bFH5 zqx`Lss9qk)rftw@kiheY4Wx+?OE&)XzK$0-!>Z%^A3|nUpNYSbFg|(I#Ua-*wbU|WP(bg_tR%3@I0fh z9atg$aReOfFe;Su1_JBo!Df$28}R(D8N)ClM3v_v$Q^kGEA@^jErkX=vsr=N*GW#E zn9!6~RjnW&W}q9w&VAa9fr*86z#0ykp_Hrq8&qE!vf)WR&hgCMY!uv-tMDlzbZA@(92Wu>-}w9&`bJD;Judzg+;QC zEk9o#mjYczxE#?I;`VGuyOZwsy}b8m4RvvHH=5g?kH|%oB_>0QZ<3o--O~s&qnM`6 z)VJaEWn2Q@j~#Vp=SGwPGJ~6%0Sc4~qO#F0*XnC81!4U#$&FV#LYJXSWmL`0RIPAB7^ToWLr`G|Feox;!N`6t1b^vzc9C3|5_ufii`TxFSzVExJD*t<}@BykOJcqm;kAIXL5d1LG`S9?gb2w-8 zzQ(UGT@EwTWR&;CIasp9wVk-o%yZ0L1Bs_I#3C=WPi zj4W48@*Lfq>sYuLO0G}MYBp14Ry+g~Ce>n|SJqjcjz(K+9&C|XKU*7|`_nes^!Bp* zH;Sj=Oa$S!!UsF;FzOw|va_aLfy7xxP!`@jSOteT^S=&o!MES~)dLR)0VJ*hTHXs& zFo(6hTAs+n6tPn&Z%N6zFBcAA<~=C;wZ0kBF{S$UR5<0a6)TY)H%r)i9M{Z;x4mn; zkDj@b)AdI#v>ATNvw2ZqLAv;hG1yl*I9|U+-{2Ae?qsa|cu`pUyDZxuPXc0#(b4tu zH@2=D6;EENVM&SfjT@*5O|;&citj_HXxeXf9p`DpngY{z#5$HpVxPnNS=krnZZ0*j zkB)%07b<8%$=LF@9@w-yK2=T;@qP%%q!9gG!_6|S1>78{?ZMS7#+tQ7aZ=w0p#OFW z!#eHn7k%v^On|wxlR7Q%%solyl0aE~b7Q0Jcr1Pq35G}RxoWF{;ywNo<@MACX`v)! z`=R}d)e?+$qQR=?jA)ly#6m*78!meYb(?2P!wc3kDSE9L9AE8HWgjAmFQp0VGc0t)}O|p58HmcHw|U664za8Q>xl4n|3U29B-)J`pUJoJb0$y7`gi>`NjaOQT39vqj#};0#+g*`{iY<>f#~4$Ur_u5 zq-<*s1*uBX$X?aM{Yq^RU?|#EjxcHD{7x*GcKe4+*I5YX$k`;Xl*G9(`|*KW{rvQb zb?2$$dEY3QlneY`rP(B#Zubz;_bq1(Y;^iXLh#BUivfiX$wRkjsSH=vWsg(q5fZ6Y*ecw;+47$m;>z~itFfdU(s7V z-oJaN_G%4tN7(z*PBkCp`mThT1(s=@D=r&)eLXjECyJrBTXw%5+xIxk}NptZRIH7FLB9dz+ooum~5;RR3$0&%lIuhdN9 z$%@zY+s7GaJ|~I-Nyx8-;SM&{Is=v*ea05g(CE&HIwiP>|H850JVC%-S_YI-zF$AS z@R;6!4wlqnHb6apJXjQ*M{a)0Msu<(;4=x^Tu!^AthlxEKs@Hr6gsGn{dygHmQI7C zCf*|Svs2w_fPHi-ZBW2}9BIfmd4#rK}pQ^!Ml zbD{45p@S9IZe0upp0eB>EAO_k_kJ;0tAk6ES(=#&E^AkEJP?@q%PDooc3V=iq9haWe8zW1v_=?&tkmpn9d8i|oy_YiEBh5g-baLLMEJewJZ)2m+#o6F^D%j&;rcO5s16D0<8zCZTIOWINFz(JgKuPUkDu`SOHXioV1 z$<-=Ik8@NEsp=~;%1Ht0ivlT((><%-YH~0#K+Mjs{F`M0EXknR2A(ogH>C(PeJ77G zTPg~C=e<51YG}$GpEY4!r{;u@=wGS`sLk#r=kallCgV4WoYs#%Yniymw3J@I+a@iDY|E2!dQ9P<|Tyrt)v3#=_xz zpxAC2@Yz(x_~!j<6*?UJC={uPCK5~()Ae~htM7j@LIQ~%5K8e#j&mBmbLFJLeoGiV z1@4UB-{?ZE6;u*rWBdW#1i%Bs>0S89B^}f1N_kUN>cI@~Z=JWC64D14&4VIdhxcxk z!#b`X-Gz9b4J&M&qRL?U`j+&CvV;AU%)GSdx}e8hC?j`0WHXtPyjYDr0h&#t;#by4dHVI(uYQqFFg>Bw&oMlhyD zS7Xw0R+amKu;Dp8=}_=;Uxq*YQsgfzpqmQPYm{XxGAZ1JZ3%RdC9y`DpX~?c?}5!m43QKo(|9iKvFfKJnzQ^UqHGmVtch zmj*g<{;s>A`4iBY^gIFCY;LYG!AbtLD!seV6cEibc>NoKRy+^`7s3CPYzGhzcmjXQvQ0tT zm0U+6Lu-jJ#fI$A>CohNE#O7^y%#EOj%-Lvfq`L>j=n{TwVsA z>hz)okS97#?zC*zjfPVtcRf)(v4(I`XpYQoPXB%d0|{YH3h*8N?m(BufGPCqm6|-5 zI0^49hX=o(feO9tksj7MWR#-gi0iYwbt3vz>pD%HN zTWBD4E3s`ngsBy&pJfH)1#d797U{&*NG|{cRfFG~(hy-g-8pj(~ zO&+PX;#1>$LRku=dsuh<_XXh{J3!<3c47SB-_q-)Gq9UVNolG_#xnl#+z0aoycLDk5c>Vr7^rgbzV%rI0`3Apt&m&Txcf z4Rf~;?d8I6Y-%>ENAUxl9;($i2y`l%vz`0!gPQ~H%}JEhzaehkSJKlQV=#}7GlbG< z3$SiMAtu3A3N%H1+`jtDHnYlKe-p>>qVfpnC0vC(ocP3RhoPC;i+EoD5o%n3B<~9rC#2{ylPm#342pivs@L6_YX%D7_ATR2wuFnFTgKKM zIZY>f8>^~{{VQnchMKTQIKWgVt|dFI`0vAZt8cq{ZfS4#B@g4}8kHQi_0Auj+ z07+0vV&#!|JzTYI5>GihZ~4Uhwj5oVo#XfRJ;lICno}@?%4ZF;MuTc(4>f;s@7-n%(5rc- zwsEzHtd{y(!HR=mL@V3CT>y+^?-N(@o6W(8X+@TFiP=~x<-k&bR2vVqS<8jlUmXb^ zj*f0eoWI}^KMn_V?hEc%`2naUq&VwzE(xJn=g3KlEnRTk9#U=f!q%q?>u(=!#XWj- zw}zHO=>>K3gY`2uK$rhg78zlBXQ)%9v;7lA)@6_3CtH_gw@9tjIz0T*N5D*3)J{bO z2R{T@@tBfqO(F=MiahO_67;-o3u{DgMENP~!sWt0a@#huXHn3*V{0l*e2XeRq)XDJ zA-}?mpDf6OJi}KO_Q@Pe_;Ys75Y)u6x*N72IcZ^nDHBZ)IQosBwLQ9SckInmWj zy6YAJvM+oL;(eSotT^=l<-b_?(VL!-fDf4PY@P}`-j+!+>z(J^71`e_s1|F)no6Cq zWDCA?wkGL**Tbwy=2B-aj(`Z*7W|!c1M)oB5FuHKxSG4m)GGv!zxj<7CX^kSrNH z4F3QK3f@K2%vsAo27_ZJ3ZHeR?`pnrzQ4oy3_Txgx@PV`XtlGKXxhff8CKYzZs1aW zzUF&1cw%ci>dhhQ!i4yFxcIX~`C~w+cEBA(Y-|83B9@R4IY@JjH#=+aN>Wm18sWOs z%MaT57D;d+YDtNcmlWC~lV>S+ocoGz4v8M=D5bG6TN^w%kPmgJt>U_#KA=LH?;6ff zQ|b&`c))WO4ILIB$cpoirgZO#C37LKzb8~J(_?keu3v0mN`oc>X}+}Sr9oV*YyD!1w1Ic+`B52@BG zW=y4jL;Y#?sVW>j4_m2CI{~A!TR0Y*cQ@p4%K{&F=asNKo`u_xEK?x8)l`*{Dj;^3 zx5^N&Vx8m@=xHm*NKSdvE?&pUMD08nM87dOB(xu~4Y@YU9_$)Tir|zLs@n#5s`)j6Yp#i)U1Q zeoXQ)JG@nwcK;)v#mw)S>Kd!$V zg$})low5M6A(7%n&QRSjDo~25nn<(UHn+Nc5L~?6KaDSbou2-5S+$-XB|j2!?I zUfiYN&=m2ASicgag6BE~V zu2~e*MJt*xQ7!FpX>k5n6_%EE+cH5+zpo#{LZAN@qBFKJ@wyy6J6@wm4&532y+)NB zK6xkCOsS8f<7xr9Hc`O^`^0fh16z|{(CZgE=9Tt}DD}k3FD?naJ$K>#Y#kk2o|R+c zQcICj_DWa~7M0=kutCl`-5qmCi%XH(u*1;FSSFYxveNmI*;VP4(v3Lf^Rk;LvE-!0 zkf;1Mt0J^s?#_II9v6!Y=pY;=zz(N;|LPE?+9EL&cI;LtHvbYHJzPru~IGs%%DP4q`J zM%L8?g;$X3=dISEcDB2Sh5#fCc8L-+3S{a@6w||_O7;4ub1P~%*waL)WMhgh1hpn7 zCrD*uB$INUR^M!p+>mc?!!vWLnWUtpO*<H{5 zo}fV{2}v$XLRe$H3(=NCX+3jO!#Ejg zdtnfGM+8om6O}XLX%T{aEn~?2>y>SMwAV4gfh#gDG{5E;^&+!2!-8P}L;62g-!j~# zeiVM%G1^XnO zQ0THYD=T{mbZcYdbYZiUc+25vEcJ96dNy9`y{gYjBKOSln=zIFiGh25)_9}clDnfb zf@A$FB)RpYM{s1S)3yojzdoT3t89^y|9xr6Aj1FJr8O}`Cg&hM zCT-_K@CPB?pPSKh;${p6*P`}UC-mbk%rQa<^nvbOB2Rss2shr>e3jsS_4|3rR#T1GmOG9rOpk7fPqZqtFH zZoPYUmdTwj!|lGlYrFk4o|^*7r)iLuF%|Rv0tKfkq?E_?Y(G7nyA*RK)U$wLoZ{=( zzUg?$j$}BlWE@pL{|vBNwL|=u5rjqY!@*JYG@XqL<@*ZQ5ILDV3dq}Pl{Fn7Ylk;* zcKwU*e#j{-5;?&Y4(}5qPxq_tm`Kcra1nEpJQLM*c53UVCl3u(r}tl!QyoQ9Ki4UH z%`HmFrIqoZi1}b#W;j?TD$U8>g;)xmj(>ni)>H47;t;RBmkYfVdY1r~&!Py`8e-_= z`^sckmg`$lOs8;gw@fJ<(w$8utbk6jzzh~`3!rny6tds_J zA{~0H)zj1S#ZlhJUS^nA^n4B1Z5otbmgZai$olU2^nM#k(*wpBUUyZ0|M;xP^>gSG`};&dzfsA1sQXD;8xxH&LVZtGy;BY4oC)xKkcLzP!!$B1ZM;eYsbEIZ{5p zvW&I5XesR>3%^{OBH5SIbWp_y5VuP(-?!s7+N*92x`>GP8}Oq2*J)weP!iC11G0AOJN`TI_R!GHtvIE zD>1u$$v;~NIclL*rf!kDhJNZp4qMsu9wt!LYgnU%YQ-SW`4-ehp{IA%N@$?re9<^< z_Rq}AaQRg+UyJ7vuDkjMo&%FK2d`g~^xD zF2}brG-N-syUsT0+A=;P{R5CD%C0O&-)On-NoEP@98@z86XGwm_j`Y@yF}ToEZ=*- z{^b|AAQflh3=HPvb)_ZJLtZ?_=3MO|C`Iyl$*id#EuNe_3|*N<_hIY&#LCx|-h|Xf zROcs7YHE5O2i=%p;C7tFGQZvC=WoVaidF6RY>ZG-S0}Q8-drHtX|5h0S60QD_RK*~ zU$A0gL5M8v?6}yW`*w(9U=;+Q*DnKk?ilhEd|92+jp;a1q6|+exHKsD9us=l-CvvM zV$6Pni2%2ypO+6-HA zMT{?UG~c}4n$}AifYs9&yoCo6*g+rT-kt@k?z_D)3`55b(JKY}E>B=j5CMvNCB@L{ z@+WfK16sPx(bqE8-VeE+|0pNCqv`vGU#s4=mW`d7UBR3A>F9DA1d?s^f|#PX>PhnA zV0wf76Z<-brdo%Z`4efsD5(s_%;&`#F${KFnjVxwW7JC~CWGVSB*Vk1cH0}HPElt! z*Zp(wFb=)Y*j&X)GSWPO@#b3M;o&n>C6Y9#D7o`akF6BM^1V`;!@mIZeqmvLq{D>^ zEUqceMSvzbHA>9!LC5Cy1-)#{v#93E21-@8I|x}x-m!Ccm&{%^b{Mc485jMmtevIS zPSQ(}Ndi+-q`-Td7?@oBL_i^r?^dBgCNA#>oI3X{i-m;2!R-M}NNWQ20)mm0k%P#P zwRM`{-|LB|hn)$V)CbV(Lo?*Y!RnGF9GRyA56r-{x53$%fJk=G_?abOgqA+A)*h{j z-VsUShotl66jaVG%V%l={|0bi85JK)Z%e*zi~V&PeF{NgNr7pZzI*S?Zlj}TWi_IfuwwE`9fVvr z8{Ky6mvyH!H>bl5SJqBWu>9jp#=7^k*(^EFYAPiiUcUyT*s8W8T)Yo9og#QdM5t&Q zZt82@kK`Io7hezBE&6}se}kWsn~P;_J2)_ax5^=$z7P({dzdV;=4E}eQ+sC1yF#oX zn!VOHpean69=cSYyaa4hMpMqIS#F;+VYE%7t%Ows><1ZXQqu1W>WAFVYw-Bdr4~C| zWG+u$=Nh{`kNEkl;RI5q{}CNhR&@_rYF$58{yMv=?g?nlqN6j0PVbzadF+;2q~wEL z-lh=^Q7VO!m5M?|6>Dmw*_j_hln7T4DZq`LR@TT2mK35^p}6;DR?L7Gqa)i0S;n%F&g#Y=wQ$`9N&+J***;lNZ54)Z! ztE$E>gy-=RKfRND^t?8Qg`}TmMz5@YSS4+y?uFN&!_@_UpRSx0jRL)Bj$7` zeX9yKWKO7_PB3bH4KpnhiqWBw?s<4d$-_@rmzI1sz3Eb76jP*wsVLj;g{=Rjck{^D zvlfl;PIWBv$*<664V6LQPp7&2#Uim$@*WYJDdS*ag&|$UZr;f&^#9o&o~h+B_(dt? z%2`lYXw20w>pE^d7XoC4%q2=12NhFAseo>K@N|teY;o}=n26TVbai3epH}@fg>eUOw12SsrP%!6m)oQLHmrXH6Ao2FtnkFM9 zcL_bT7h`u?)h}+Zzs=5J2lV-P)1oYb(BS}SYs@4_69M-_u75J2nwzcMIa6tf|2ZWv zF;lj2p&ahAbJ#geg^_6zwMY!Va-lQdgGBh@AkueLkohL5=&qt9%g1J z9U`j47F%c4>lt5T;irz%i5%^BF}wBmO3FvP;y&k$`5pbqB)j-xOh{+USXv@0qW-Oy zSZMTS197)>y2s_}-AA}Dtog!<2{ycweE7xhmc0qH|LJ|A-_oO(e1^Grw^mdy?S7Bs2Z-viVT7 z)&vA2P#2w-V28E%$ zFU$?wIsq@ZpmC|URGFnp_^*J2vq=rA2CCM{uxCxmwpkmN4`+Lpw6Ubt_!D+PIFO=z;({lg9zMGuuR(o@y}cO5=6J`JR|~ zY4LkC8_@v9x5E)kh>!hr&kI|pt^HeXdJVuhWwYl^J1I4r^>BOLS->f*8H!i0qrE6E z?U7t;yiZO-f5kc zkw&KzvE$14$<5z*9=IMNBUt+C$ElNoKuECTH=Yb9gDj6IsgXGIRBI=zEa~(x0ehyQ z<>g@A(WUv5Ej0!`14(WTSJg_J?xWcdM?2A>D|pRYahk`W;{3^jZ*iQ&6j~?@3ClIZ zdYKf4NlD4|tLD=5iYfSl^m-NS4(EN>yvyvBmp6)qkeBPKjB{LoMzO7}qqEd}ePjT? z@;F&M=obt79kTe6K9io_?raH&RKscDzJ3@>9U-xHMU5gKEiCw5J0WvUn=8EyR&~1U z`rb#Q*k%&hQ$4vIkYtHEKLkCGgN1i*OUG1b{?q)@{K%<-8J;Lr>(|}g$mD5}r)j~B zDN-{O)KMPoOM^{?PnujT4Ms-4tXgdAvWHB~j2oSgol_w-R;QLScY^F(9^}?aOX_;; zJr2x$zjVQj^J<&;-Wuu~!3{KsIAfRKy{6R7iR9Lj_?6S-=2N?wopTn^CTEdO=G;*C z+063t)4htP$OSWv#l34UyOq;&@Jtz;N34AZFo@pq6k&V^VF$|N00n5liM(CT*-l~ z5d8a974{K`!@(1s?zf3J!Fw!|m)!fY9<4sz7JhdEjdjAfA}J*;1eU$aUIx`>Pms&4 z!TCQffaE6njwdy~9rEw3Di8TxJ32{Jte`MBEQVKCP$1xa`ey4RV&eHb#)NLzZ`Irk z@HA>YRuy&6E-St!v0T5dxyHcFxM}q}y$Yh~h|ZK=x;(=wcbRK?kiyk6{{H>@jNDuy zn~S=G)l750U0R4G$MSvmT=SfSi_BfB=^932OkDY%BGR4f>XPUXS6&ecsPnNV?+Ee9 z=3Gk1yK z#eJ#2pL&*Hmmad2D+PgAl59Ru_ZA{8iPZB3N2br2GD>wDzPNJLclu{4;%iD8`}t8L zDsCpobT(Wdmj%4n-spPn$WwlpuCOC~uY*7T{@KQar4tEm4J;1v-ChZ`I>08RM#2MvqUl#-FLvA6gfcxUd70l3Z7zNn8C26qUVp|f*VK>oH1VrWumR$d z<$7P&W9yg0{?X#T{fxT+`3bO|md@$>fHMT|NTDf5{QeL4P*9`;l z;o=r@$!-a8ReK3L`kIu;c7F8wb+=tjJ@bz9Nk?5Q6_T05Aap}`?yP0lzt)WyU`cbmAkx&xdNhG?cqv*jQj&Mu`}jHJ9sPhp z_C!hR4s(_}g!}yAhBLWnkXjB!aS44v>` zjkS1}VQuwn#?+fB<3>MAy3f1D&RH;~&m!tVm}{hdU%S8=KIx!-{62hzr7XQ{@U8^}0PMDz|V-dnJkoU{a{ z3T4)1Gd4BY(Z|Qfj~!0!?CfZ2>IPR=H&XBl8P-!!QA8AKl&)Bb+5h>Vd;KRC+e|XM zKnIT=@Zy0KmTzvvqdKEMKgYvz5>+1W~49tRmXUk z7fF2l5=d!&JsWc{adBBFzaIC)Kpuyn&XE>AJZ654G_>WEGF!zuPNpIYpBdSpC_;Io z)uc=kJn^H-m!ifx&g1?&m$Tt+K(&Ne3MGi03815+-#<2=sB>uFz*BvAEUuiK%Q2P>KR z@}=6^n(hWTRbGNh;glD?{9*$Iq_& zOY!2IUgUU&AI=hxO%;uO{EA!WwBJ}zn0mcqBi9Rc+0OZdpa1*m58FSed~vE)QMic> zGjml&IMNjAbTsMnrfO0sfY`Kyz;DE>LmikaaFJaE(h zwc^Yw#>yRT6D1TYvlmCz96MoMX^*>&Lm`Z{X4gawo(E|kipNkA+rT_Dl zU%~&prGIwmpR@Fzx8k20_m5rr$5j5~Q2ued|AmYG0Vn_9rT-69Ie$~(vid@0-0Zp~ z-3a{;ImW$DK zx6J=Ol$Za5s|o%WSL6K;uJ->QT+Q&mxSIBVb^!B#oW(zH>7QNt=PdnCB>T^e`^PT* zcM9SkQ~8gn{Kr)OV=DhUHTn;P`~MwPiZgniE(9r;>No!C?!GurpQ^Hew*_E1%#v@p z@Yx_JF=#w(>-tUf_4OMr_q*$?|DBj7I5=BP&rMBkM0Qeu7mtNjKo(wH9Z+7uAB?&# zvrgq!)7AD>=~r83gFoJNQ#zqtl%hW%@35+wjaO+tp0dcy%3{Ev`d4r%zQ5CO(06(` ztkgZ~ezHTAn_@2)DQK*;2O}})C{Qmn9?W=!TnM7+Tup~kzkBzt&e|f~EE2pGHFf>O z=3*2`i?`88o^rV>a`B71k&%%u^y)}UWHW?0EjaF}Mvk7vXo33S_B6kR+4e*^{Z8F# zTBTp!;^N}zV3fDo!o~kX-dDy|wYG0!pJOK?Ws8D>h)9D42oloLB1(5RCQ7TAq=M2Z z-6$$bN_R-trhBttt_A13^Z(5|ALrZf;oxDz-fKPUjw|kGEv49-yN2rGV(J>_=jY7} z)@-_3=(a6PzdBqdrY_I+NnJ#U3vIG)g%6Kq@3$AnuitL`e0RK3^x$`YPQ%-iy=6&v zOJ4u1sPGl>rWFno@eaiwR;C#@_y7KI#cHI*KICtq{H2AV%52+Fi`0ebp`uV>&(7ah zcEmmB;4*2Usg98L9jJ~d`r%Dio!9%~I;%VN8I_u!^9reWpSNeVF6Us0$7l1G1@QB| zI80A(IxZ0x7nk!!4QFY&Oz1@!?eEY#PgPdNt7rFDeY#HXx;Rem*6s6?7IasPQ~B<; zjqY4tuMgkIQ@+t0j+nl9wajxrybkPP%bk)vtr7W7v-jUwfE;ecc(nt3Hp5SQ%L0ma ziPG=FnL8|wJrRnntmrL=5#~&uVaLV>i)ooKk?$M!t36A#6c-l{#R80f*>vz_Ogo+} zZQkY0r9+}$kyGFIzSWM<^$AkvYPFKv%D|iQwSL%JGa{JFR3k;d`h?AJ!?^VsHa50! z$pC6nb9%yaj&ze&S`OWEuPC{QABaUP$tIz>ODPB@k@AFS{7%s~_dVK+bK~r~<$-p~ zlv(ZR!P+D&)zi6i&s62*r>5z%GcvfdtOj-)H>J4aE&4LZ#mYH$<~j4d0qll#v2Xco zO-h6Kxawk+{U)*&7Z>%~a_j@`I^E5y#F&I^n8qo2>ZxHlx4DefN37j zNdEFtieZS$g8q5Ky3;IuM(ue5w44SnCq8y1(A#%EPqG@QiVfViYkVYoRHUyws5*Wd z1Mhj0j6ZIh+g*PhfAj6<^P{%ezAC8(-#WQa_3&Zf6R8Lm=;CXim)g5`@9<2U zSYwj5s6>dMzzL~98d&&VVtyw+wM?li;M{$$v*n&=&FFY=l9{u#0T<37 zFsQ>seSP9o(-r3_h$WB)B>32~-ktuYp3)LaaPLdbawW+3?cptvv z_6_b^$aqD2LU&J(aJ~zrbBR3ai-^(fSzI1UDq{4ENyy7m!@HV{*QuJ`rNkmwh~F!& z-MnQ>7h&B!+#$$4)VG@Zjdy*5f_ZFahy&)e>c7FdKB&BH&U&y~ito%1--DX*HcRt; zMVJi=c}2M{E`EEYC6gUjHleSa* z<=uI`--jHg2lwfQINJ~ffcCuJjdkjZ6-dw9Eg9zQCM_8>cv{72)wI|q$5fM6-uSG+ z=!~(iTf#JQ9h8SBuJ<-9m(asiyCzCVp)-5f@)s=vt?QKa>zC$=gnnRs0$y3RxsXZy zZMlw*6XxeIwv<@7y`738R3DC8`JdO{{YK3~OwEy$ zs!X;wtm^*d7k2#(E9Yn1>Tt;}1cvy5TcmBl2*?an+>+YC`h^mjD=XXMY;j;rBh5&;#jeYn-C?RfmNfs1DP(w0Vd)zUhg0P|eRymF ztLmE33PJK|Vlk3+%A%{t{uhjC6LM!%6ir7pQw?6cPIkTD z@8>9^t_S&SM@ox>@jJzKT323Z*!R4$L&5GuC-6du>R68!?hxV^@uJy9G>JOw`?yd9 zL(?WsF`h6#Uzkt)ViHAlY)bum&xt#vz~UC8fN%DXA3s)Rn2|3+IUrWpL)%y2!bt9H zo4TO4y=EE~C8Iyov(t;C{AsFTeQ#Efcype!V~b^lz^Q4ZTuKwRU9y?p&l~<+(ut+@ zLYgJ0{25WB6>zZHyMMnfXG?BELyErKR(kHUNs}lndjuS3Vkd6!ca~K2oQeqCjUr#6 zA_T|UGV_Dow>MV?{b@Wzop`K>#vnH+Ekv0zX_eoxQZkPf((~DqtLe$;Fmdu3j;2;* zQhG#9-fZru0$&TmE_1BL58?gldwm6FZb}66XA%eEFj>YGhO!szH1R9;arW#n%EGi~ zU$7(V5OL&e8Qi3l>du9sg!Z02O)Q1<%|u8?(i7TOgEYNe$Nfqa;1t7G2XvGa@4B@$ z@+PFDoJak6YZGT!AAcbKuV*Pp=O6DcJ?t#ysPHw6-@TC#`YvqMeW^OBI3YU!Uv7itq+_8oLxG{4=aZvK5A zyJ=g_%Y{bW5QeTIUtcW#4^*Ywo!{Kek@XQdCTPUOzjS*l!hiWOMevJ-DktlVn=a3o zX6M=pyP!0QAe@V9^X57|Gw@LcQ)(-#cx(2Zc3*j(V9^pXQhTi9OQuPfh}Qv*6UJr~ zl)>^#T#jx;;UMy18JTR+TC5Qh8+)43q5lK-XwIY!U$^mU1CW=xv>I8}sFil3xwEo^ zh+KE;p*rENAKtcx%M93&`ccf!WN77)^>&z*oJs%YJlm@D#}Ms4qrWxV zHpQ@>)rWuL=gHHjy@L2`e`Hw?b)qERr9 z?H?bVJr-JR+Zi5i+{UalgtW0DHE}x33?C3$p06m0JEM|va^nt0`W=FEw^AKXA^q>K z+a#i_tem-k&)+XBEL_``er~WXj!sF#{%*0{W+GwJ+Z+t(t!rdB9RyddQKDmMlBJ<( zkoIWtJ|(qX0T+ymt?87N6cwp$Tg*kpb5Rs45fSuOFC7b??C@oY&j|fmPjCKh7XhXE z8p_GLfydAuG%J$o<5b_==xg+Q^JYJ(Db-U>isv}5%`goD*NZ40 zL?7~G%X?ZIqg3=@!zm#}&Q2+L>m&5d_;mGh0ZklGAXaPqf*zrQrzWSH!5b<^j3r%%%_k{y9nILDBy6FJVOdY zuOe0$Fk?$+9(lwQ1G))GNR+wJ<)zX7`UK6II90AMAs=;y0j3vbM-Sqml0Ab$^S`7G zhD)vT8J!oV#142YYp&b4^%}XyjVZ**B0abmlTp&)PUF$&+UDcm_bWM8L}#F$$_Cpc z;REfupNsD1Ik*xRk%E@P(TyQ}4X-%S&1m>+j51X&UAnZ0G%c4AZJb0Z{TOacmKzi+ zPuj9&OBgz>dyvv|qS+Dc+iOTY%gQ}}v4@Soq~GME1@=+Mv%dJw34F1WfKddtSePNv zfu<-Cv?j@*HrkFdUEeiP!sfef2me`|okLTK{+=BIQ#WF7CLIZv4q+r3`eZpD8}V~V z|MLX26h(S;K0WI5l(;-@TMz6;$a*7pg;9PvM);iO#_VvaF|~d?Gt1{z+LZ7Lj5vz? z_sq%3Nil59@aAu2L^?esFwrNC${UWh<(^N`3@-(mef>K-cR3!g@G6i&m_m%A`Jc!8 zf8etiSQKNQ8pday=yL6Q`jkAHFGRHGE{a0!rA-WbiKINOo^@WQJn#VSq+>fZ(#nU3 zk4cfn$98pkviZzU_7$Nmy%@K?;L_dm9u|T__6~z5a%>gZ1jR>Wd}$i`TdF7ROsnc7=w90^>@12P%PY^tWVMssU%P zTXg??3uY3lnJ-A7ySktD3M;Jh@qP^&z!C}N7%&6=nFj4~q2)=TN=*HUSDe|hd2?q< zwUlQ&WyChgX@0^EbUF<6ywSut9RT?|m>Y!{U%TB~`pz63Q_*hCGFNSs9Mi__^fYqe z67GfD`A&BYxy+Yn{s0?@t_k3=u_xGcK|CReq27Q1RH7yzSZL%Un!_AtM=H^cX?fVH zjY&*FRW=BN2|hR}B8@uHP0P4<65Ie+=Fp#V8&ZFmuMe8zN+*aNRzk@{%6Z$6 znm(zw1Gezbwpc3jurw23i{KLCxwtu%a$`O)a3y#c4Y%1XT!$k|OSAb!M0@`F=s*vkgmLpE3WkVgE;lmJ7yB=a**E^GP#rHf-nZf1g2_X`apaVt4n9 z^5)}Bh4%!-hDs-M3$E*`7RUV2wUx{k7DBu+P>cjTt(0_l~jx6 z=}E9Af(vwkd`K(DfX{d_@Lh<{nJ8}M4NFWsOI$J$oVTrEh|w>g+~jgz7M;?!yR?6J ziIH`0Di9r>U>II+mR!faY$BjJGfCeksCWf^T^m_;1G799z0yuNbV{EB-YPn_<3sKG zf^206-)-#5cC5w*^~o-D?CaUD2XrN>z`1u4T>8iK@?yoZ*NYb~*7Fs6`!55*=kQqhAd4*C^xzSngED+*$qZT+%CAchLAT-o;>-pxUKQR?Qc(0 zLP$@aqQ!|ox!OGv*^9+vMgGu%B>id%#&$DvETWED!r&)LZ$ngR(i+^{WcXb><0dL9 z1BvhtU?FFsAbkX3CCE}$L}3|R^U{ZO2V(npd0X?J}Y`_#M8 z`=m0$1S%i^5ZXnL0feUUZ+oO`^z>X8rUp)>MsJ;HPBRXWZO$;)&RJd}ziJBu1V@Q@ zd(LX9%+!VGI8jrAjW0q%4z@2Z&B_g;)s)SB+`5W(D{lD&1v*>%^9?E8+l z$efenAOA+%I9tq;;0012p&kGY>J_W=*&?aCD==uq4WHpaTd2rL<4b>@KV7GKDwSwo zJ_0ihpp8T!vM>Zd%I1u`W~=e-jkH&M)CWa{ef#!(_jO(D@)~j+x|PFwuGJ?OD?hh5 zS+Qp%{C0)VvQtxYi0f3?!JhX4Ee@z;vcVDz<2`TIo8-;+(p#nID(5;_6Vl$PX##Bm zsu&KpAg*rW$KsT?+CEWJE1eXLIif}>PDNorUUYomO!e1%oXO4Y z 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 z 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 z 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

#Wf!B$ zsuu9D_`}ey6i*1`UF2d)k|Oq0K-aJ<2@s~CfuhXv!7Sd+#VV>$FRoG;R+KYlllMMrFvHM;TZ?4jF2@sszNu_|VqhfMtQ7ppWQ3 z0WwHeJ4!M*IJVYqLfO8&j(=kA0l$K69qoMfz4-~NdNWpQgA#D=am~Zdxc=Eg4hT#f zPVRM$ET51n?TcyVS9vW~#JyGO0t3AuEuawFL5uW-AlABDIl$%euP1WI8NKQIP=<34D|;12>~9W#4h z)w|OH@n+xjr2tGZXsc%ysi%ynOR6+OGZZEBpg%ePw=I+#x=wJcEP+ z7#dL)6vBPJwZ=JRAe^9VWnrRMO}tD=yOC`CxJ)0%5i~EIEr~VN*K+I)ISgojq|ebw zViMGp7+MVC{V4ly;mH({8+xoSMNeDD0>MGbjc+FHGXx7zehWC1nNrnpveZ94#j7;} z43Z}u&=hr5^kN+Fm+xyB(@;U?Wq!daP&t)%Q!#ui@-#lyeCtSFcB%*S{H#zZtUVP> zXig&>g*JtgK49e&$ljSfYKw6w=Xiv|7p8#EEd>|b^>wMilrq;s)fA7C)D)NANUh>J zDSj}?!wjPwkwr96Rt$%&BBrVugqsv zyJm-7Jx_X?cbT_yD{e?BY~zelHtB=6uRBzy$Iv`8>5%!Ti(LBZ*DmMroY&3L;a?lW z5`J5_-s~4pB8AnoOYwAN+}!>-u|81(uM~kVzvkc(@&yoA-%tYxxSvy79iw~_3(z2> zq7-Z;pnK%lGXG>KFLFzz`X|Ay%rv~Ufo0E!GrXDoDaEmeISB#c#N77J0K97+QgYb`M%Wy>qHsDcgOi-E3EbA8nY8MZ4kQ?TB^Ib9@VCo?UQlHt{2WsVE$^l8zj_mRv7LA;W-+8me!i_u{ zSuf}|0FRJtxC3LJeQNZ+z&C2a=d#j*xrY?jS(p4)8Vnn1INK#Ch;H5u`MfGfk*X+% z55TWr9p|^T&9ZPGA`|ovwKtLmw`H5k24QtEPr*F38nbDXT{!1j*0282OGFpDYJ)&T zLDO!BQ>6pO0hailD9SPn7-2k+F;`rhOXwVj1`j%ue`0!gP3n9bDcKSJd{2S_sJ#J}!)X2$T) zDa2&(w@tF)haU(!_x5^4?fpJ<_rnKK&$#?jL&a&AG~}*b8&0jt@0#3k|C;K${Vv%T zETXr{LpyxWNbHVR0ObfCZ}3kr%EVlx^F`PIAL?%)`v)%CrfbW!mz4X{GpJ#1y@?aG z%Od_8R0eSrnIg{*l5$^H9xxvHo|$&5ZSoJHE+Azb)cZcTfY3qZXq&5{ezG2*9<24` z_isiO*Ul<$a!8%(sdcSif>&%TKOCJ*{c3x_j^;Y+)Mavu5Yir&o-J50lQp9z^i+&j zeWnoO8_|-}kNU6up`hzgfD>r}xgF(%DgMtG8k>{tguN>!^}uvcARgCG!xLIf_Unl} zjuGNbSO(p*B3sGO57Vrn?(#^2XQSeU@X|oP_K6bGL7y`%{o4s~HbUH5CvcU&kAcgl z2rgg4Qo16!+wrXwQ0$nB?q9A(Qf>`5@Unjgtx4efOK$R>0tS3y`(+CC)(M{CX4a%0 zIb;#W68^Q7EST8DL!0pl%P5QK*`ks+5HX83K3)G8s^)*^hXyi1Ag3s)AjddJwx3f( z?XbOM9~{OO6_Uo>J9NUrm%bz=xdckS{wjnYb7*k8P;~Ce!8SKYFbSx&$~9|idCQl0 z)@KETL239tOgyxzA_2HtlKK$BJHt(tO2v;#$hnD=_IVl}!>U}1B;qrl;!thAd6(5tXq1Xue{MuqV;9ZF%b3CZe_NF$xx

|oIqSPv3a!=H5C1hF4i!7y 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

    YZlk1p~wg^Q|QHqF)E$&NT7jrtGT|a;R zEScyx5v5uq(f-;Vyy*_upPO;Z@$q{*H5{`Q97?S}m$ZXp=7mKClSDKlH=oXTj7&tr zzqBnZ>?FvavV&-sovl4}{9aBrFuR~2gwDY04pxvgiEyvAl~(x9k6%f39kI*2KJlMF z*TOPQP!U<$U9;Lor?2XQiS5?X+nxD!WM8QwrLZUUuYR~;k;A|Gqwxua-Q9chJtu-n zK6{Uxrz)w`JX~3noBH1*C-ra#PthA<8Zgh~>589!%V*n{aWk?J863U7L=JiQXsL=O zR%*8~KT}HRAsj?QE!;&2hTFII<23oU-CABN88LRYY+ndxndnlqod`` zRz-EmA_gitqE-;EyCn-(zHP|M-^U%`OiB&FgJh-?FGP)DVV6%%dVH?g9W5X2l^ned zRaW@^a$XqWwxTerUFEwuB-F3|RLy3f)>B$^D2a~?)=Id268i)z#`-rM&!V& zzff0taj3s=>}7MXZ_Lx5j1b?d-)b)ch!49JJZyeJ;oB!lMTH55^j2lmYb2b7id~8h z_V_|kL+Pll)-YXf+;L9NY~9IN5&D&zGF9GTW-@Zj1I68*G=21(Jt}C(t)ivX<3p|R zpavbB4PtcXg8P}d*PD@L`I(vQ2Axj96aD>fww>Mh_KrbPSw$;l{JGC(VdUXN_N&&g z&j%8)A|=dy?_BYWcoyp0#ynyyi3F41)^BJ}djm-xn050j#{Xq2Zxd zQ*%+?`}0+`Xj2CC)Jq+GYN(<6T~{V4TKiq=7(i6Q0AFj%bF4Ipmw=zLh=LQeIG`Y(R$=5tR2`Rlt)%L2~3Xd5ckCou> z?{#od!P|{V;N`MX2-{h3Z&bLfWYO@Z;6cFRFM4c^3%8Vr1KT7NuME1D%YK@b`tuZB z=XrVRq9vDdeT`ndIL+kHspI?~KOP|Q3wZRrmO;?w=A7EM2KUOfOOsYzg%eMaggV=3pDa*)AX06wlb7(DOJcXD!rx!?_lc-H4kScHcF zwy>;pL;|IM?&RQ^bokDyFwdT-Wn0D8{;yw0&2Ydd#UV|&?sM2Z*6UCvDOO|{fuDj3 zOA)4J<{YbxqpLY-3n2dYB}L;!7S3X4w+tvYDv6&?$rM_55&#QKs&VaEEvv9ww9}?* z1VgXP5Sd6@9}b0r+k)g_aP-nvz{$ketgKBwub)N9SwkR@jCG2Xmwt#C6QiVv@wk zz++TQG@sD0?HDZR{XJSeZT>x{5XtMXW~QvHpr|OhyEQ{fIqQb4rC!%6ln`<)NWXbt zJHcfU=KtmtS+RDM$;}`W(+hP_&P&)C$iBu3CMku7050LGjs)N_mg`H!p`aWJqd zM6++A#w`u~_PEtuQBl#_;w{%+sn+K5#8kPhiPaixIm}|T`sRwzgJ)ai`VQ0c!p7)b z{TKQS#qZC1oPp#sM?9WbP>*BvUaQiz^0xK`BLRIriD+t+l`Cz~f<4aQZEoJIG~&RK zFbB13jvb5@-GPhS?Gksn-nT2P^r0_?3KtQX<<(+Bg@%Sd7&QF~!d!6ZEZ1ga*s8Ib zw<42;WoVt~kDC-f_Mm5c2MVoo0K!*}MNu(Ssb)O##P3Udd{B)WRt6u2Swi;G2nYxS z6)msU&?Js6ls_S;y8rlMDtJ!H*BPv;%Bi755d(uVAvY;yKmS08)6n1`t&NQhV0xoM z2-`i?THL90KtG+`!5-r%aZRj8BJwX@ki9~6b}D$;8}CL%67?~C?n0K@mg0cR4tzZ) z{e?bBaiio#kCdvU+G#q7Z%l{8%4SxCq?;8yg1q=;l^$=km^d}c>g{0ba{A*5NXOWq zVgcMm%?j)oPw@rFC9sdKN(xgK!500ZaDBojT=Fl-#$F_Yo09h0w(R`f3MRDRUPVXe zhhmjOH0rPxmnu^9e_1i+aicSs6EEsfL5jzL`tdwmZ+>#aZZLXfW$x3&wzH#}8*j2V zMtgg*HlAKx#BDcZxXQ^q-^yCA-|6>D6`gA!iNi0nJ2yc=N=HC+_Ct)^*E(Dpezp{yxQ#@9b5KR;Bz#tl_CQG+fpJmMlDNhVa`yOYFm z%N(qzj-uLEzZO%DX1D08VbWN^lbw@&SbA-3?YEw=jcX@zW@ee`-@iMz@XV3~uL8sT zNf=VkWlZ5>+KWm~EE`9Wd?^w?I>K$dcC4(*C=+aX`)j~wbFKJ7LmkD`!r-8kR zyQlYVm*GiMdm3@oAR@@`X$=+XzhJU@Ya9OY zvCyY16^_F-o`pd@J&n!S_nULldnBmCR)^^3bZ#ZmGluOdD>WaDA*ibKWO(VC&bZBP zKEt-m0oKmC(}OHv$MTJlRkoV%LnVs?Lo}kOq#(1nGv|xPoVJUFGo5!mlg|Pzw+lwCFNX3k<+WGj1_O>MEnzzEs((0jzk!Xeo=5LhD$Zt<2E0{oHJx z=57ILIxaCJiC;`K<`pxfzLBUwpD!p4z9(l)05Yy}^iaX`0b`_Pc-Wmkq^O|KTmw5W z8DCm?)xQ;-Q(G%BNob%N}=U`1C4d2TZE_NDPx!_I) zq#_lsz>Yj=59!r5OmXk(-*)zLJyv~`?1pXdYlbhhwz^|}HN2MyARw2R1A~@P!lA5* z2|?2Oh-+#dkM{ua{q>|R)p1Tz{IhWz45Jkz%O>i&F&V~)1WR@w0(=v{rb3;^2}8O zSy@@aK%(7K9i7cPDnJQ?BO_aS=p=sj(Zddwn^aVdgDZwh1O)i|QwZMH*6y5zUIc?s zspk~vGgcA6i>u$<J`JYaQ2jocq5DK>otzjhvV?&E zt37y7@m;%jWgbC$omt#lZo$)Xa_;yX zP@cHy)!IuTCER#%)w&1-+){1Em4+`9pye$r0rk}gDVEqirbXvm)YJVnJcO(J3cK6gMAdV$#v5oXyP28ljfrb4B`OD5V8h0Ijtt zzbI-Wn<}?Fj@FL>z##mv2}w9`xuf|*3=AoJZm8zuv^ESEzzSwb9X;^b$s&Bb-iX-hBj_jSkb&{1ztWTBQz&hdKsb3M zv&s}%YwWk-@5+{5J$rWP(xqGB*og{0p$CE)+P#euVg+LfvJjS$%Gcg&ljVXSpX0MD zOTfdR+)7`Mtqr`_@JdN?Oom#9(nVrgr3c>6LR_&eyYPTk4s>av8#=uk`6VHKtPTqK zCIa#%!9PFT$$JDYQ6NjX1&TesgG)F#nEk3HHZQ+%mcG%<2z~d1 z;rdqsVD~fc{;I^p$ITsLo+2J=EW5=4)|V6?i?`>Xm1C9O*BVE`NpTmmL8;xn<~N{^ zL^%zswAnf{CRD~tJRQ9HK9@Wl9cj%kVR|hrMGKbK4Yense1;TqG3!rEvCg9SEnJ;8 z%i(;>;1o=psEk-amz@@!z-phPkHcU$b2~Up5%Iw_`VS+_?ZDogCQnVHG{y|S5E~^rLxk_{86vo5Ma!BTEu)VvbJZWm0X! zeyJAHJFnM7cOBK$HR!S*8wt8!-IQ`VY`CIz8d6M%r<|wqUYq@eA{qR=W$1Ga&|L(f z10tBh5)u-wawmwV+CmnLt-Uab%7$x|EQtw;XfRyL@PsF>LsofeeXj&@({>UQk+VGV zq`sznL0Zr&qkY~HXYb6@+KNhtr%G|rR>|!dYedJia*GSM1g%yWv)5Gi)sj9#q21zY z&|OEm>E*_jCwh=#+JY}SeZ81GsvgOjep3jK_Mad{^E-DOUyrBalPBK2$tV440aqB& zetv$v;6c686{cC=x8%HY$78MTWB@-IO0gDAo#%yrwz0iKlPm_HfL{DANx^rq?MF#)o_W9jYApPxk*$;d9@!zDTGRd?kYV+?W)qhKXuDxQ}gf2x&s5l`kJiK+EFG~1gPEJAC6XhPC70ZMV)u+A`ZLKqd>x^K9 zF=)ilsOai5BaYl=8wac$VD9b)_`LzvsW7b+aRxwAqetVt77wz_gx@ih_GLF&!oy`{ zWaQ-7cdf^0d!$^hCkzQMczYiq)A`4J$~ntybPZWyTDmm)eog#>QDLL)o7p^fgTmjD z_Bz3QQW!r1(^C;=+lL-s zt$?YM!?a{kQIIcIN(o*ct9T}BI-iCqW0G=nOF3b~>`V|^dw{_hU#+=@Kd^mz^l`yr z!s+@7LkRvzASF0=#bRW?OVN@+R|s`8w@4Co`~ulrMr&Jc1>{g;AGGpR4#H z(MS>EJzjoZGT{p=n?#XlMs$EoGI+?dd+^1Sh?0_dc=M}bMqmFGgp>JX(S8?{m1iZM zIx5OxbIS>CwHlkPcP>%<2!~edopeDnN_Ut!fp2b(*4Q?Kh~I&*kvd%KV7b8emb)GO zE7Q&gKT(d9vK?m(ryjDE6%xkxA)c{kp$oQ>a0kid!=s#72*gr{rId2(`W$(_^W(|< zTWV@*xao#9GC9VfBEDDTAk1`_o>s$+#P=yPVUZ3uStux<+34$oLDkRLqjZGGV;_SN z$01#buqzY7w#|zvFj~-$nb@~#W@eU_S1JJV5<~~z6*EdxvXZ&M#x|xW z=vitR6L*;c2lWqQyYLCEv0W-#qlrYFB(d9(arN|6D(WyTbvW8mHePMG*;{L4?htZT zGvB0u93}7Y&qz^8*eSblU@y*Tbw& zGlPLrek7h;7g(*O*g=lz7Q*cC;9ze#GPe?J5JMy^&HbI@LOdyL^RvoY zcC8^}x+bs}$9-+5d>geROIsgL*2{Cub;eMnf_rmR)^8*O_;*c^3 z8|Pod0rK7#y|oS|wS-M>cxp~gAPrq?U+wF829`={HR`r^6?YF)41}Uax&8gaARTH? zo;1};rPDorVP&;8S!%vZW)5ePGLMk{3U!Br&~UC~WVjY@G`X6Y#cs0Hy-r^xd|6S~ z4UC3}U@NKmIbWipsdB9>jFFhxQ_=OMZs5+%H39O5&)3gJp<1h3@DWx(E&SID9K3X2TvAqO8JVo<6&0yC zk@RvzyINc3hm8hrg6o9LX_fS!$<1wN)T3u$ z2!8kOUEto^xQRqbNnH0>T~Gz=Xcgq7>XvpgZb!8>ck9>8a!4N?y6==>Wjyu?97-S; zLS5&x3VUY0xWlHdtp~I~clZoRq1WJxitIZVXPC2(h&`l75{&_$gXY>5QgLg;VNM@ z!lTkh*Ts60g4R06l_ruELDso_w0hWKPTSi1Erv0A61#f$=hnM{b#1Grq1PbpADB}) zK@m8%QX>$x`8!|_+0;XfCX19ipj$zIh$1|pXplQz&5 z6z;TcGb#UbX&-Zg_qs9V?v|)==|$%*{!0`Pp6+0B_h%p`2?T!r+0jdtDZd{;V&BcDh0y@NlOn*u$p^fn$>rEQrDI3wmBxVoa{xETsR{5`jKH_P81%Lp`mny zeMmjJJ+|7n>R?T^G2DZ$NT#bCu}pjBH)LEX?8?4 zG&CZ+=4p>4t*g9aS?E3Ko6c-myZYg>&O6*mcq{X$ z0{u8)BNi(D4I`1(7Yncwn&R>S0t#lp!ld(C>|5RHsA^pC952jL&Cz#%c#JUc*v=`L z=OeHs6+~OI39`-C^!1gGnN(F(ulV6HH0$_h1O3`67&6FyeqL^)5f)QG#}|-+PWo|;9KzifQ;5mnecgS(${41q>l?+P+?rQ}tOjoAKgT^vR-e7s zwVUnSFZ7?PESa47=jD8fjE7t>Fy;`N)zmJUi{}rMidmRQnmfJzdvSW{O2VjQ|&_UH3iksh_X`k+DjR4I|F7fI6@Xs&ufsR`?cImIF{JWw2-FE-m zF#dH;{{Q()8?fOj=pg4WK}eI`)kxWO8C7kI+d{bX3YA~2kNbvoUvUiw8l?&i220mV ze>2VrYj{fb2xmfdRVMJxm6taz-mrDMzNF(CH`hIac4>Hk?c9*)x+=hjhg_!m-%h8@ z+5hcfQoZ}%E`ZGc_KN;~%)hGe@ULwC6~*6m^RFcSpLFUyX$tedSb%>&;IDrDD~Z4Q z^{*r#fA#BMQT#vY*T28?SEv4!#9y8IR}z19>VG8hSEv3J#a~15uO$8&ihm{X*HHYA zB>ozTe?{@vQ2Z;2zlP#pN&Npd6tIRY<&@UBxw$W2zG&mzH>Mjri%9Cef{u88LBXA- zMOe zPy_-&%=+veWHLm>52f;iBMgIz^{_ZIJhW);E7 zT92)!{c@YJRxs~J(`B$LQ5Xg2pp{d`Kqr`p%SwN47wDm9&??lsCVlu8;7tWHv$9UM zk65L==*h^)PAqo8ouU@H5>bN%x~SdtG1N!$ljDesy`mW}FK;*yX*eo^^<*dnNzI`Y3a+%MjWA$; zOxSl=A1#yi?yAF?2LTb|HfEX}7Q2&hOTFnh!u}R+z9WtmbQFt<0t{#?+yvFSy}dnL zW;K+6EiW#?DH5JdV$hg^pKGdq6aRf|&s{!f|(Ze-#xdG^|7BI{gu|Z`lmX;o`W-iPIF)n-RPN zeSCBXc-YO+_^A^kEHXVkcThN7`ofJH@2-A7`|^9p_GF&wcTRg7PPX^*tjRQBiS`9pos5%yuTQWo^Oxo zi@f=)cIZ=7$(Hwxnqb|Uf%U^ScpIEp(*9!NN6b!sQkKAvJ9(~`4Jn|2fYLwT ze&P8hslQ(xpeX5;0+EG}{V$4n?G-;8{QMoDFLFQwL8ggXmeN4BN;=czRE3@4UA@YC zW8Qm*hj|L|_j5H15*P&Eeh15OrLYF0`taey^2OcEI71&DYIcR6I2X+#g95O|7Wc%G zeD`|MOH0eqGOM_9>yfl6pF_pEquoT;^-#LD05_frdmB<-|IyVL8GEVMBCMOrVO?o`*%T#pQKm1ZxSBF914HUnMs0dmOZoAuE zyLQcUt4nz2_Y1z|-x)7-45rGgw7L=mU&L@}Y`XJx{2$idJD%$P{~y<$XfLa-hEh_I zlU=#WB|>Hhm9kgXu_@BkK$Gkwdu4Ab6(ysN8Rwvk9D5vctnd9r_4)ih@6Yd_@9o>| z*4330=k*+q$K!s#Kkm=x2@uf8wxIT!JlU^Nm#mY&VZ(;@&zW^8dMWBjT8*_UH|%|u zq@5j)r{LCEH6NcWEDqcvSt8bE^)O*7+H`*U{QT72kdNgSsySAd?0!_A7^jlMoyK|t zd)N;s%E_r<>t~V&bn}_31PU%PmtG>jc=2NI!Grw+t0%Kt+$cq^laB)fy9bNH-I%gC zF~<0ZJuK_;yOmVufkL*F4@n#a5)9YZT#DjDUYib_Zyk1RZ-UJzshL9>3g6)QgfyLM-Dm<_(o311X4s@{IosQUP&OP5T(X2gX# zc5ZbYe7)>zx}l%XVkg{){SOw~0qilx`545ZpMUz?e7tay4@n%sQt)}FILk7GP5r+T9TbdS^!I}?#p z(kH^>GI)Z~O_4!zuS5Rjl9YeAxp3$`2eU7`#f9o!>Vju6p%vu1%}$S-RXxET|L};n zC(OD399%XzXBve7~M(`M}E!EGR4v@MN$>XLA-qFf<3w-RTBZF?II>t#RSMaIanl@JjY zneza3y?jl0aLRb!ym_MtqzQgP$hR7aK6Y)$d(w548l+hNP%=`3V{1SBZG%6x;0ZFYTM z)$r|&L0!ZIPltU?yDG=8S9Af#LEyJjHZx0n{``6SfaPrQ4Fq?zq$~5sr$E6*y7WVM z=b!IWiEgMx>U|L?XlUSUAtOrePelIVppz)!(!Zz4LcP7A=uy2*?~flwM0E2ihK<_o z*Ckof#7j6D7A;(u#u)1lruy@13mH~&VkQhFhRb#y)KT<3J0GPYW^+!X;RnLzU!T^I z`}L{ic%oSh&t{AGRpOecm3 zziz?#@9%w7u&>oJjLr$zhq(eX)w<74>Pb&W+~QWA815)+QR2RjU_hzvO2{s7{t`;2 z#YLYD7Il>n8JoR7XIv{=$wBnkJzU=MZOLvlV@`C1r%TKN+=PB@$hB;d^b1Mr**o}> znV5{vR$_C15f!y>$Bq*KOLa)&qoWkX1dN`o>q5GLkFMK9huL_i`S()4s^R*QCp<{_ z;|!UPUx*pU8NDs^#>V?S@zvEzN6i|lO?$4^8-}|^TNX{cPu{d<&9i0P4zFamas?zM zb&2eKwM;MZ{9)8fC6sL^)alx1Cl;X!oqS}A{+4b(zC_(ccDWKOpqchJAR#${U6wi4WXWLE>owJW3=kN| z%%)0B4VL6}_-n6bpl~~0b^X0Gt&*r-?cX;bGr#cyG_cOqy;gkj+8 zTF##xs}L%xt1Xak@abs;=B%j}cPQ1wsqpgHwTCTPwaH;L*T;S4Q2G6op8Aw~$?y!>|gEz8u(BwdHLCGSd0 zgMEo5!!-$XN{nAgik>l*+m3!5=4Vs?_We6TPH!t+C0hP) zh?!gDr4sMB3%S|jAi`3zH?ngh(3>q_1}fg&Sva804&q~ z=3G&?sT^JRX~u;~bxXV>iRMtERQ%mntOj|7Q#1Xa2Y;DR^Dii-d$5#9e<8+U zVW>tf4WolMWFPI>cjU;IN!AW!BrKt%&3l!O`$^5@P)6?SH|;DXY#jGD3eWYyC(8J< zo1bIN0(~9-iWLrywCkxesf}0jO*FLAaz^q|dwKD-S=E5=;Gk7Sh=>ZXMcV3nlrLY7 z`H%vd3Z1iyW@ntG3&{gC?iI|Hn-0X{5#!xwXPkPHvI%6dd(R#d?8G1m=Pc%EcO-uF zhZd=UsdU%TAD=~CnHf4snAdGmZUug#)-4gzw=yoiUPwvx@L+KT^ou_i=`CjiNT-Jj zk&aGF`1twNo2C?YesO7W9S=oWFwjWQ%8c(GZ{k?8bZJmnT9H}fkpQP03xFyDaqA=j z@X~38`Pw7733w=PEgTaxs0!<=mHfRn9;RifHnfWS`i2Gu@fby(%S76xM5Tz6%+6p- zA=@9-W=U(eZHosdOu(}@2JyzYfK7hQC#OVM_&>_sdF!t;c!n9#2j&ds4n;TZVU^k5LF! z1qY4k`m0pBMoGbCps!*68HPlP=Zg#y%nM<7`&6K3*(nvQ#HK(IV@72rE+zQdInq;ONbTacik zZ2DxIKJQ(dFt+_t!(xJO3yrK*lgm{x#AV{L7NW@!(C;mK4o)M>DZfMg}H+A zo=>QwmxvQ_5_+?-E!!-aBxL3EmDS^is~Xs=W~{v z>=mRqAuk|A1Cw&Y-De!JKey4bHNFsxBaByAxK1fSCB~OBUJq0`sfB| zMBU;T~45NF98DH{=3$jDOe>Qi6CV@i)`K}BBBZI z64#CF_wGXF)Q8lH2XmG9<(prC*%*1IOShVQZ9n*qR92VHxmwa zo0%~5OXi)h9k2+Y8Y9EwQZZpK>X=WV1m@o6dU?ooBXi zZP^lQ-SKfN9XL^;Di!DhcW4FJXQo{(H^J#>g{n4V^%fhQiOfINcbbfEpM>M#QeR)+ zI^e3+3>5vdfk)mg!$g(xxF>?}NKem94ve25<+gxn*pBsT=6_Afrp3=rbxBFm_mY{z zK~JVA9U-usO8Hb&0Qj2C+|%LR%PF%&FLug&PIGmt>U z(@ul5@z-a4z2LSpU3xiC`33s-_sjfu1s1)2Bd?_uL@*#}*Z23fu3WL=S{%D#JW^u3 zMv6u3?9cChqK?Ba*hLrq4mtwZB^Nx_Z!!}GlP)KEC%a@-QO^<0yOZ@fMo6$DksZR#! z#;-gUN=`2lV zx`KiRpQ^#edrbg*D4y(+Ka|-;A^?l$629c@lnsyVpOXe5r-=QquXLs(K+m@I)dFd1 zRh1%;?f3~98st97ckkY9r2~|FOkZZ%^%yyub(>I`(f~kP38}tIM#hi37PZt!R6W~5 z2fVqyL*zqh(tOw)Dwz)(p0t&ID3KYshAE({Dc#TyfP$3)AUiwVV(|JWsywls0_tsS zFXu%*dhh!BvvC__zM;#!R_`(Yt2z9mif5*nlOu{h+~*1@NLPMPczAecRd@<&Baht^ zS9Qzkv5^s#n=3bBheVxua-cME;V8$(eadf@O$M(}O5$|p@T7dnH zCbfJN(bqYJhGCBHU#`u&^5G$Kz;l3O%2EGO*>xW}iJfmAh|`0CYh3e$(z)i9veML75@=vCG5 z%u?2ETTHH9yQYv*Y*@ujAqhUMaMp2h%JXL9GKp0T6;+Ffh)_uBV^t6Lyhva!;+IFW z4`-9u@EPAi1Yh}KnOy(T`rroq<0#k3vF_>!={tUY0Tl)#ws%D=0F$FF#|dObrFl6E z5>N$-!IfBoJ|pZ#PsrqILj~~)VCPq3S}pY)$hUbWXe(Y=#Ht65Y2{uV7gZcj)xH7Q;og< z(Vw3Hs&P<%3Hqq|;-9rxd_97>^M<=T>=JghY)pHXp_^%faO=9cizYfbq?0bcyTgaN z*CByg@ui=d-$$%6gyO;w-FodrwyQ6hqRWVJ62Ed6iDZ$n*PNjeL=!cbLRvCF&DS7y zDZ!tC2V$W^=Ya;Qui zq^(Dh<{Hk2@JErR?v6tc(ho8RDLajRmf6U`(bHi;)vx7!{d2b9=eN5|1VNt(^nxHU zalWteI(BR{Z%jLd{pLLhNixHA(jJ{BMV&m`bKvSn?dYljEo=j4+Z!}- zGmvXg|{eYW$0{Jx5Jy2CaE>Dd>7JK+v|)!FE1FO6vCXwLXpB34dwG ziqOypwc;yQtkA4H2fS)GK%*+T_vdz{xln$h<2G0FU8|p+@E^a&E%9|w=`CW}rq6Sy zx+|tY7Jy~g`j7kjl_n%>0aQlyWxSgObf*Sp!$_84CUuE%7-Me1iQ)DSkG2UK+{0J8 zzi@mjyv^B^Dp2(E&FHHeghDwj@_P2E`SYS=%a)?Xpy2lHk3uHiyqF4Z5#{h&phEXMm+;DF|0|@sIoQ#@3nxDoLCWM8*x>MY4t={^uk7PwOCJ?(vu3Rp{V2pFS zA8}5moK3BgoJ@?MJwLTdVxs+#Jl=k`RCM~4Trh3 z3mj4p>J^0~O{`zHZWIcUNI@qsfkH)XhOvqSE+L$2g487Ih`B-}AVeAPx%ix%W793O z)8V4_y+%LXIM6dh?GH|V@Zdp2Z0ufXSM&u}va^%p74=e?UnQJIV*|u~&nOGRYpei5 ztX{r-#Szk~l`Fqs$Vbh;3i&0E1Ksx!&9{b-M!Vs5+4Ah9NBVL^Jb>l&nk-nbAV|u+ z=#uB*nKWoBRi%jxwc_XigvaFaP~C^cW4(8>Mt*zz`N88 zbEjVv-@W@(Fv-&1;WCpE_GvNdFPJymfL$qOl+!mRCZ-38@XSB|RHIa7*!O9ff6e&N zCV?JN4XCboqk->AHa2yn$Xb9O2upJKt%ANAdZz~=6NZYB6%4DwY7yO;Xo4ZtoJ8pQ zkKnqDvwq^k{}PChYFDqLJGILH#d*%EAje5T4rG`7`O5YH;5cO6(FU#dhPrvR zV`}{`7@CN>JU5b-3!LlMN5az}R?u=F)&g$g$p+AK7q9PhO zcR;VPH;J7{aZa`z_Pu*oB~CfYny#PomflBwxMAzo?sp2-;nx=};{&Eh-n3~`G@3We z*vOD^h*iNBgZ?jWujh>izar#?@)3x5vfy=P!=ec#OFwyec^Lr=(7$FTU|t54rBF(l z_`X`mE|ekUN}|b<+&M6iB4X2d#qk^NUQF~qs1r{VYCIOeng;Y3q{1iy9ibM|>ym<@ zZC{`_Zd7m4g91^-slEPp4ZXr6lBGYfyHr6|HkC7fXk7LophjXg%}EaO=+S%7(G^f^ zR8TC4J@}(#b|xFLqPZy9#3Y`OInfN>cj!>{G<)j;brJjX=bx5v&Ki(W*Ps@?8r(xC z6pZ1sQ&m72L=z53dZ4%^(z0mJZ%WaM+arGkXPW4=%QTbm@zW<;hm^(-U4U4X)@RdM zn)ybH`k{4uQ^+Ycwl|zD)<8f;LYaoDh|F~(rRiEMq&ZO}l%k*CR-vlab|@Xgwn3x! z+=UAva4KAJ)NyesIDK!+1FF45=Ws{4zrHW`Xig*1=`gKJJY1va%20c9Q0FVO5*b(- zh<*Yk6%iAM--L20XVVX&gu98-HVCb49%a8Y+8#yiRp-X@!|*4DiLl)O!|I_p||V# z^oj~-4&PY=q*Broi|ld7ug#S|`g*GfQKhrH8el?D&}+gK!AUy#b+$I+KHyi3_Z*f+ z(A52dPe9&HLf^irn_+WD%{Me$(5yQpTROOKfg=Q%iJAKM56~zqPj#DSI=V<$o7v1W znwi_I#QCt}l7<`k^neh+BmBpA@7iSqnC9(-kHpi~8RO(6VFT%Nyt7##8QX}Cjz(HR=OabQ&&Yu3h5o!33Y}^* z`n$Sfo;}+xKz<|^BH^r#5-n82A!I}>FOO}zgqxdN&|!V=jzwG`3K|LONdyeIA_6+1 z0-6Cf6p4U{sUvrtWg%Gq)5H3<$XY~#qkoRP1*=E=zyB@={f;whOf&iN;x^GBLE4su zd|gP0SRyS%UxLUp$?63T*9sv%`j5L1f;=QkA|uB*71?$_#BxQ0rfa&f8r-T~uu&v+ z)9?5hJYd}$@<_wFcj1zi$Lw?vxI{lC*TrE1%?bu$P1{#7@W}2`VF%H2zWR?Or%worXe3m9`7|@+KP-_!+%lSX`rNY9M2exT*MaSA~=RA3uefvwJ1T)Hwq?A>> zpPHVoMdCV8FSP1C^6_(AI1=Ez4_H~nlz9@E0cxd;uzc4kOdk{7IRb>1o1)Rx_RcqP z?LCgUB8_{X4K+r_$LnEk>KJeznH}%~l{13D!T&o76QP1bp-l^OR6Mpa!$JcsxXv_*}vyZ0&|-Pt&Kq6cW>XGrx|Witw(7G z2h~j0Ouc-H^0J|pu`3QPx0S0_m0O?H%dzgbgMM`~m^iw2(nS`fyhIldvJ1u91(pH- z9nVRcp?L$naf75_JZ2C45kfV9j?b~ln9p{$JO%$is^}dI!bJOQ6+Dfyqk$NM8bh=f z(Zy8)@P2OJ+i)p|S4c>e$942UM+i{c2m67>!|pRKNXZq+by#uc2QK#E#zlL%ZSP&}1ZDp|r{R2*|E|8oYqj0>G31>Fy+ zp^X`?RTAS@_7~$GO>C;j1Es|?Ow;VHvBlPA&I1J_zTNfBUMtqCW|?UMq>%rXkqNHD z!i>IMujr7=f#x8wbU9m7=X@6)9o=10vs3A9?M*$OPMW2!uSj~TW4h6eclU0>z7egD zK)vR4Rs+{mmGb}%si65oxUP`cw9(kka7h?~5?T{|mV-;gdRM7aMFqjGLC%AHb%2SG zxEU7Gdw>Jvd-_AZh1Bon15Y`do7qKNPH&g>4ADErWi$qIZEA{eC^dl}i z`qY-3p;>{C!H!ZnS8Ry|9IhFIpxuKlWSd|hBTE4wGINshPN0gCCp20PF zk!gyeqgp<|=zl3H{)XPe^*dj*A8c>v9G3Idfm~7UbH5&Ca(h#cINTUO#w4y0JO8u3 z(^4=g*4b1^7{+4Q+Gr|{oRD!W#b61Ym6D1ujRo-0?Ju*NPuv#j^Q`~k)`Mtmslz8A zTqB@c5R2H^Mps{uzcu~hufi%+gJ!En`6CmXBU{KXVBh1@Ey&r1d<(aNDe&qYAD>Kd zt|{OM0)JqSeCtrKxkYqatj+Koy1j2h)RYJT0eoG6{9PL@t9mrVSkcgTm#8ngx}6uv z))*39kdX01VAQmu8c=LA!2E!?&U96UXBSika1;=IBI&Z}8WqL3bCIW`>j#>$t41r9 z0LEra&2U0S1k|k_e0KcwX>Y_*zd_e&_16xtAxdQZ*QP`%OwJFqHUqS#T9@;)l@8?f zB%7tI=j2R;10m2CooOXlEGx&h^{0JIO|pI&+(=l(h;&s8E31(E%+vw)g=GVYG#bAw zV8_U1-v0THu~quKTE%j!Ev?bGU44PQy`p3>$^cBAA@mc>9wA+gx=+SPfNG!+1R|#l z5!DaQ6WxA3GQ!@oBklu`7sHx#+V@7<)CS+uckj9}N2D6ad$DN$5Iw2aP~!y(25&&* ziz3=B9m^JDP_Q%2pz4jo#E0O$ua)e?c_pWo~5XmxZ@8Hab-s-OppOo6)e|yQ)8KWW^ zQw`DsxqbWi0pHv{zT9n$^vy)wVr5`UXj@d4>K!?9gs^u|QXyqY48B_Q-}apWrzWu= z$C1Z0;K4de;(Y)1tr3jM-d}y@`g+=iKv!|7!6hro;YUETM%TYbRvFC;!aoyJKk9w| z{u;s$N)%^c6a6i-s8^%-O-J<|IYBN`dH(l`CwtGGL>J5(EluBvXFHvDpLzU}Gaq&3 z&W3&8-dVVG#e};ZDY*Iy6AJx@ut+wC)%T81i^`1DC2CUoj@q0Ah-IJ&Wdh8~#1xGp z>l#5&Cwv$vmefp)S_Ngv4(;|hJS2iKn?uUF{of8z2r*^1$GCt>Rnhxyvyq2w6H;(? zfhE|Dw-$s>)n~`AAE<{$83Tb4AB{8${F`YC_3nw&cz@r?@lFfz*LW88g}=$JN3$nq zlg+S+uTGJRW4U;$%fv9ZPU%OG0#&qH{E|9WCU8!IYvMg07rW0mRMn#zvu3uoUS#xB z#k57neDu2Naet>~B?p>>V*NQKeMbxXfUN7$4?SB7k8Rt9**c?N(yQ3K|KUEQ53OvA zq?97&$3q78^c>A3?BIh*-Cz=Mxfx*wymN6&;>>uJin8)3+)sg(Z9m@H>jBZ#VuIsQ z(QprF#i5x`f>i|CC5Rq--UwF$D-Cfrc7ilUNN^(d-`=ix!mnL-m)d?1y7VlwzS!Dq zrpGcPOG}J&=iWVH7BNq|WZ^3jMX!?(4nRsb@@uK$5p0f?BE_EVfoh2jgioog{749n zP$nB{F$pmsRa&%1_wQe1zQ1u$C+}FM0h%qMwm+T$Z8X%9%)hojxJab0Xge7_+{ror zYx_9Fg+z!88nH^Rtv@{q{=rqaVk$gXys(0=9-_YnxPjcQ&CO;HA3f5UVcOSW8u@K{ z!CgeeKZ#}E_Vvx;BwRq7#jgGG00ryJ9Lpnm)W`i3Z=`^9cfY#6$bEJSGw?OfE}<3r=tc}iplboV}3v_+4gO#1c;NH|$BhbuT7V+t+cpq6Fw6 zm2>23SZM8u4v(FL9{}i5z7#9)99siMh5BE_b0-6Lub)1#{7{ke6Rda zhJGJB6B)>R#qQke*Xui_V8>}+Dj@lAiK#;vh}MVynF2+qu=#KqG;lbCDq6V#wk z5u5k6iHM)ZFrMGTb66&l)zuNjnGgSirq-n;THHf_$e1LxfkwQzfn!02mMnxx@F;FC{Gew%ElRsjS=Kq z5hl@O^>wfU!lS-__|fc;lV*0zNid4Ju@cg)aUp6GL89uJurT8CXJrVGI<9ZLR`^?* z|BOKgLz;iruD4O#pOSI!s;x1bpt>Gm;8lC@*QqoKsoz5zWCOi=0D1+ESl%)V9P4Pt zC1XRdq+f$0#JLUF@}hMxi<2pgh5TP5gl2_4AqUXRum>%jl1DXhEp{YCc^mK<=|h zG2RrfCpF=MLXZd8E?3wo46$XKgi}WMd9WygFd;Vefs6e0QR2og^VThY9|gQqZjkOc zRf@h0f4!}3OU2%uJEdVvEb1oOUIky}FyBO1OoOllA=QQC6$4v(Yrz98C-GEg;CAa* zdQTRdc8y^~J7MmZ!{%R`7P%yvf%HHJu;kYK{{B;M9-w9%@E*5jiB5aN7kGnhc9pt) zyUiWaUT6Xv??=+vmTI$y_s-O+T!>S zkF8hmXY5NmkUHr?436+w)iZM(hMtEJ(9V?*0+uhgGVukg+h&3oB-->n6`gjq2m<*Y z1Iwo0182$Q5V5Z;+b=RE%`UNvuv4ZICUNH(*mwfD*KC(1=+EmLOVSHZ+n?{yCQM-H zX9nb-&?QW^1WvR~H2VCU5bgrRthwhcnp56$N(RdeT67Z7Y39h=)1|eDE5e1@tecJm z$_Kto>5-lD=R)hxt{=_9Oe4t8MeDS9=mQySf%QS_?T^6;d9u50;@_cp2^N_2b6 zQXz>1)`6n*P)}P?QX9>j=y5T&^qPGogv;sx$*s!^9f68)sg~qTa27&I$P-e8B(@r- zrjm`T!Xy-`F4>>VZ7fJ`fW30ZXuyj*8}|oEPW|!lSd)HSisA_o<1E?WK z_1~|i9L9DbjO-RweX_`Nr+#;y3mR_2>`0)kc9~zysFYsQv}hTd5rDpTUM+{8&L!be z2nBJlTL$X3AT-QUy3Mh>>tI}&4fG`%WMCs0_!tgp7(4Ri=Hnje8su(p&9}DANT%S? zgFk{AuWq~-EV1E6^LMQ9@W_bZ^aBp=7nqA}qPDUA2Q)8>N`eUD+<`+<05q+uSFSYF z>N$1qhHc?}RPJ9pcd7vbO1lF2C{V*;zC)Vfpra*Z7w5;JDNzQ^0T8hYpO*Xwf zuq8x8Pz~~Bg(n^#&2Y_>25w$;`n}Q!h6(RHukEuKJq0)P7WhkyJXFZy*ox0HgrVg#J3zW@-Zy@)!4Zg>peW61M zj{C$w%`k!mD-VXWtS(59F@#D)7$9^79R@EFrnyGl@<)U%%jw84sE&L~!M)%n2%m$(L;=pFe;0Zl!)Aa3^m6&DTN( zs6~QD>#84`t56aYP6_RiKRcymM`@)FWnOW_=G8y z=vU0G91w84c44O%A@bvFjW-jDKhcUMB8eX9C#ejnq`LtUR(FR*$h-$^d+{$yD2C3t zDwt?!UKY&B1fR*Ohqf3+saKCve%C>9w7HAAEiu`f4qv5!ZViqKAs7pxw3x!HLs;m+ z36juL6>&NK`V#_5=t|j|qZZBQ(Z)+JNCwUUb5^$3u3Sr4tc_ivRdDMV!n+Mdq2Vtz zHqc@zQVOCF5~Pp7^WSkW5wcV)(ghwR3{Gmh>7h~{g%+6RuM!8yP`c7xY{D(g(s|5m8i>u zFn}wQ=y)_0I%!3mylIPbLmYHuS}h!7kg2y8cDH{VIzv2u)uJk`mlv-a7XpX)SDpO1 z?bnH&`{7G|=FO3)TsdMxU?)!xmauE;HqCn*wl|sjgDMhed90rr+>z<4U{JM+5N{z* zP_4eE>>`ZaCAZi~5{^y5gyxE;{D%qU?3V&jH;uRXB$@~74rmVZ+qbN60Sj^kfW@r)`31%gKkv%(NdHKA&cf?G0D^D zV5%0mOqeAF=$W?^=^!NQVZtQNhJj-K1Lc^oxT%5`-}Lt8Ln{)Dm*_kY%`rkJ1X%aC z@rT<9ML)xZWwWASEU)6*Xmr~F=456k=dU5N$v_2s@a=h`s9K!|MZ zoeFFchrkOubm@lE=#L24pJU+yS-Em0Q>=6nZR8C&Yc|MV1n^u93T88`pA&_D9vw_3 zrp2zmxlzBT295tFo1Ecjqu>hvKE_}G(Lg$Qu+laWHGvQ9IuvoXKg<0~C_Djv5VG<; zdOUrpN43GL1#S#!TjZWXf9Es0FRSMq%;4XIcEV$8a1dr+bUo{!nn)bcgBZntsU{vh z3hqDwUe$P2Swsc}yP}s4NkY_probY%V-t^^cXR7_i+erlt%c)ot{_2v@c*;~j(!lc zC_?{B-n4GrbMO&E=YAwI;?yBb^usNgj~{O!PF)cle&Xa8rW6KnSpsum8VDd{d4KX4horOU z7V>Fb_V-c6Z^9wIP*S%F8axfV<0fc?b6bSIiflNU_v8R-OSO`mqGCNbS(~SYm0&me zh|o4$8QF2{T%xM@XfgXt7@>*QN@G|){!5%$T+QzDA|}QZ1%illh_3|vk@(r_86Dw( zr(}fBPVs8H?t&ECn0D3M320#W?f4&cv~>%x;K%(U_J{F2YZ?R$_6@d48AW}@nNKjKhfIhV*S&fqymMcKeSYkl<$ zk4vZ)C8k9CJm;FeUsAXHA>D|ROZ>c!6{$mMBD$8gz37M#&b9!tkDB1E#L-+F24sql zOpfCiFdxpFD7klql3`M}SPDQ=2jL|JZKSU~>^EJehDz_;zMYz&7N>j)Yd+erjgW*1 zn|wCSpc;M&I79f#i^*xj@Uakn0&gZxs-+(l_#Jz5V!OKT$JG7mi9}iL#`(sF;o*8& zoiIIr#-Z2@6kY;P#Fm5{M!^LX-AZq7I1h^;(a{kd1Ft0x!wEml{o4O%^`rCcD)iXTalOha)_WS(YvRb(~0c^-xn7=y_`w4Q=Oz5!3`{ zXyzOz%_~#6a%X2IiJ&5itU}@L?c(AWVBA%LtR%y|*8v?h)=bQ60=yRgjbHub#?C4? z7s=WQt>ZHxDIu~<;A+y!G7E&l8B!#Lp96GA0gkh4GSBX~7!#&~y@b3h2QXsKK+Pr& z;X!*GJZI>r;>Rt4Z0;y6k!?9jviTl<+nwH&oie`d+PYua%cJ;bW7^2ux$`%z(T|@# zjRhDc5h!c2JxFElJD^0bATsm(8nMv6GMsv zB{yl#NhRbm{Oq3@0}$Vhp@`aNqHAIbs3DTqkEEFiEn^znh;Y=y&%F_fIvQYcM0r69 zAiyUOo70s-&_=?6>CGfg+#$3aul&KPEbY2D>GK7dknpBf-2?GJ1TN=sALhN&Z-F#r0=4=h-X^%PLf{dcdk)6L?wS zG&&z9p2?A;iBGFE2CB5rgxE}AAeW>+;IK9N3%nDq;B)qwX#MwKb8$O#t?(Ic=!lmToe+oR#^ zI@V|?Nnifz_h}r@c}&f6{@;7|YS0B_We`jX+5?94%733cPTi#(-rBTs>CZObX=$^o*{pW{zgn&w`5eLwfX2*+X`H=-Y|Jx6B6Q0>Pr%-uFqf!t` z5Kb?eYq;YY2O+0XBObdY?Uo2pH87tim}?FAaC7@{_8c$#c?*Y95O%v#F7n@h-?*U2V(!g73Z6ksBMht%GW0d1aJvL?a6U5GV``tE zpbCn@Tt+KY441^R|9RfQA~=tgiBSPE>r8{+`Xj%p*E>eU?Sa&TDq@>;g7RGcSE|pUyzeK)0Ohy}Vlf z%)hU{_w^?<6*&RhO&Mr4vkvs<;=U?=gbzq2Q@h+kf zI4hud>S}iRfBP<>RwRHzn#;)9|NZ;A?f-u^{F+VwH?#CN_24tznBvKS4A&peo31*% zXPUk3TX)j(;!If6ZWfk7ua35B*>cBMjo$O89^6s$o;_FRghR;I(Td@k@k$0cPv@jj zD0lC*{KYjpG@I@77Yn`4IxyW$x0BF1pU8YV@}1YVZB$l9k8DcMitHL$*_4&}V878- zv6R}R5cTX~K23W$-2}0%lz;N1OQ@mre}~*ySgN(SWEAstZjc(YhTlEE{5e)WJ$2I4 z-M+_vCSaD~ZhG$0%%Ejym5F$X=<`r+i)%cSr@4AwHXmFt`1tzzM5)5qk)KbScK=kM z|C{ct#+!^UPsbM!ynd<TtVgZhNZh8$Sp={IJYXN>cAC_Vyj)dezW@2dk9Yn#tuHk~;-*sG zx=*!)?n{2>V)O3uWc8`te&SvBTf-jkGdoo_AB$9}C(pzL^E_l>vFvW}H}JET4te%r zQ`GgL!3)PngJw!BG}f>M$mm-Htl1{OPR_>?6k0h{_pMX9RXG*iw7Zo>*KO$3bPUg| zYGAK=$FjHIofyM+kF5TFJmpbfh{IIyDnoYLgDHEp{r%HK_^)Ig4R8E%*j zGUn`5b}adLlU`aGwZeU;mjQW3&?&6YSW#13W!!OLIqSZpxDneNjzY1j#rp2a+$VJN zudLUx2x!gu@#$gH?u@r}E-y+R$dhTFb-OVE7aWjD; z0ogOrPnFsXNdw!Q`ltTQ%i~KqF*zwSI{0~dY*WYjwUp}C<0ng`_xY>_dAz8cYGk^Q z+L0EOd(&JZsOd{dcjA#?{}(T=?0Rx#aZKc~1$t}HItsogvw zFg;xv^u+e?3)jgD%+ZJrXP2+dgYTB2hH__3j@&uL$ac zRU22@Eh+HaLI(q3*AUFheHs0(H%sejm->OrCK>tCk<`#_J^iYNHw+wEJlxm(T&m@{ zJ=cI$edydYMJCeQ3YB8$Y z;(SkYJAS4b8q%J!fzhAS>i2E<=p>XK6`0E}5kytCzZ)k1ljr(? z)nC1R{G$_M15EiGe1xR3s~0gGPYlOUeq<@zL9737Maz^jbk5{$*I@9tF=O)Y8X!94Y6>VLzxTxe-fd}bO zMU&$tdYfSseZ3i9#^&JlEFRl01(6R~kp)-=H)BOky%fvA7R+-TaI5{^^TjTZ-}#aSY7-`8r*WpqW9DfjuXd! zEk^GSOBR+fX`Zo}AE6dJH>hn7iR&T*Rx;(Fz{$|~o}Ha|_Gf>!v%X3= z==Wt;y@~vQg%k$x_e-&#$!BTmjq%)^4ntFoN;mV!N#5`ClpKAK0cWKfG$zL$UQ5f0zDxJzNQ zv&1;UE!Z&*+ctT>ztk)qLn=#dId5unidNmkMc&n{b3iLdubDQH`7$Z$NkQWMrJdKO z4^hR$pVIpdMmvh_U%kUpJ(0UK`lR#A!wXoJFWO`}Q>s(QB6P=!Jh`@ij2k~%>43kj z`LKQM_flrwl}f6){wZ2&QK%)|ap>Q;2;0)G^?717^$+eFZ(-9|#&Z17+MlP_tm!sX$tM zDUZB4U;0*G4j=KPY+hQ;$nZp3=jQCA*)P}Abu}x>_f)Y8-R!2lE>*Q8uN}2lsFtQB zYDwHf09@2x$g)Nl0l@O?=yI|%dt3kD&)$BCj#ae+E>fiCmiHzFQTxx$-W-zF*%$gl z(KI$ex-c$h^+LGHkKK4hn({bKY91S{-+tZFVZ{l{ar5Se+-p212BvR{v{!7fWQjeP zNXhRmN%ooPuKTNjRaVp{P5buWFX%(2;YnGkK_9IfMKpBDj&X8djCA}$L$&Ms#O?;+ zkB@Zqiqbt|GMuq&%Xy-mm+^RhYcBC187{_;{kSpW-TTEX+dnOLoZNg@oP}}OiR_Fi z--Ic@tm(hUf)?-Of^7OaS(Rh|uz!*2NzYJO{;M{VlEMZOp7K6T|6$3usXT9{(M+eyeC#{#7B=zQnDbNEPx2%7rQkFtgaBlCM^RUKW_Pj6w9Pnwyw)NHLG^Q(qJ&(GBB zL4FeU8G2ontGhefPnOenY++L^wH>(l*N;B7rG;D<*5LUsO8iSaKlY3VZ|boT-c97b zjc;#0)40GLwIEsTDUB-Wm0#$2k?bHYF*IEF#-z4%Y}a?uW=bRdp?HcQH$}|Qckd&C zAN^mvlPeEuxc1gIUiD$OEx&RHtB`y#j}&tJ8ONoU<2@lSNzKSSI$j0in>+85Sh`$= zireg0@V_4IzxaGvz9^Q%^CBr;#63Ejo?6Q&i00{Q4iSr8(C>65eaUpYVK`r?0=+qK zMfzu7W=Pj*=G8T-GbcsY*00iEq*b+X)at0p z(Ba^T=h5mUy89mM`KZ9e?x6J#cpT1 zruQ^|ck)wj_NaL7V(X6U){PUw>h0!%@(Mg|qe`xYT%vZvO7BWXM_&lJxhRnb1Tu3) z4Qtjf=3UGtbvcjx^3bv5!sSjppZbGH%THLUr*Xe|e`BQKG0V2DfU~@`sYR7L+xrCM zhn6a_Qu3QTt+GjLdfAH3MD!Q-AJhon_VC^*+Z*?X1y`3;_mtks%*jpayWBDUi07<; z(XmkFBk$cX5xQ?|Eqni}X03T|Ynj18DWFQ16*olD%VwLU*?rY@KsI?<8;#&Ff{Y3A6ynQy&o-|c)LjHJp!e`h-| zxV@TH$gi7b#2f9H?|GkWeu>pl@LiL;=t%I#J$cOs7wxdVn)L&_>)ohDwM<{)Ge*mE zN5*2S-QB(25%HxKXDiFo%wo>0eC$#L>#S33c8jRWkb`Jwjh@@&bGK27DWcvyxst=g zm37^Wcm0~NF)0kJL}6T}k`^|5|Mqqr?eo$!7LUPa?31!s)myY? zs|3=g>5R(CoG;y1YQK|s_qTX)h*?m>aCs7^hKx*yS#_CJcF{Ohj`>+JB|#}tZ~MLF z?j_~RohO@U;{jJzYuzc?!(J2iH!ZK&u-;mI!+R^t2YKF5`*${TiB~MnC!23hur!ESf0*%N-Pv%l)qh3D z$we+=TA4)9^#P=(e^Qn?^)=jQ8@K&<=$^3pa?;WD&&EWH-Q*Wj76{$#ruC%{7FzOM z8#SsZeXCw4G}t7?mzr~7{b@VwSkxA!BEcGmY;0b()U% zG1pS^J#R|(@_v@(I+HDHP=sr zO4&1QdPOhBXRKt{xsx+eMQ8t-VinlY+h-}yu#kv$BvqyC7&x9};#^_w+LV(#uvuV# z0-Y>z^5x5|*PmU|FUw!(0#^3uWgI% zxn>`$K`{*uDmPPemCsVDNwKVoMS?XV-+J#PYWE^rZqFsls$tXnTc3z9CRSTZi+N11 z9kbUmU<=5r|8Kaq=-@eB9*-o7=_T}tPU_R})Rc@IcJ7s>wIw(xDwq`WG zU+TQSd3I{G$Mz{!(%P{x0qdnnGS&GaZmS)aSzP5fdLY#Iz>i16hqL7xH*>67R_eWY z%D3WKYwTF=m5A%xF9wlVw)ZY4=ij|ZwmP=4m!=lKb}+2mEKZ4UKex{@X3z=!ZQeyr z)~Zqyy%A|Qzpj@{yZPKgAgO2UOP-U;3fGa|wY&9uEwk30FhAD)Oixj$WYOyr4NVgE zLh%(gF}0IjD==hs4EYg;tV;~pw2Xsgjr{0EsnY_C*PqKd%#zq_rT8}`6^)bItx~=X z{k!s}HGl+9lfT!9v{)6hY+S9a|vDLVy@2_oZ%4*F|(q^Au)o*KUxbG4Ea$>#i6Up%d z!mTo11%*C0wRD%!0-?q`^b2qvaTc{$|BxNQVm1gyG^jeai3b4+fP(p&a6={R0Xo!*^wjo9V(8ygVt~|X+fQTWYzOY5El?*uulO=sMvz>-n&G2%)|tT!+L}q z3wzn6kFU@XG|)}w7AGaAnY5J0_gfk++$;rOcNmG6rJ>agh6G*w-qO>%I5<$~>eI6o z9ARRH0UR?uCw|hb!~$I`M%Iu@U>5Jqvq5{dMjhgQ5|($3N_Id@amONL)>6f|)E| zi`Qrlm;(9;fk@y;oZN|GV#M$R)nA8N5+#xLk0>KRA`L}Pd1Q>qNVqWGxIBiGg*Ki7 zP;shMd=x1BWfzH3Ooc5MgDlvi^{HcL+nT6}^C3(AvcRi0){8aabq}xNy3+M4*iF0L z#VQ=)af(v?RwOB!ctVs16a$i6pE~@cPmA~Z;OF-k z=8S8e)b?wY*S5z2$`e}VJL%3zohLs0R7iY0&$o}ZcRW$ZLEZ<0E^dZy1`93oeVmGk zkUoy8l0CXHKor@V+&sXk<-nrR%m7_As+ZSkej&1=7(}~A@_F&?CFzNnfN+A=X0{$% z;9ipXjAH^`MhKyAwu-``Bgs1yVPpTw9n8cC4|u?--T-%tG=3BLUpN}Qk3g3{!MMmc zeFT4YRbJTmn414qwGGYfuMLRr+v#xwJPwWVySrIHH7L5MyV-h^GuGn|26HR=U(!;! zpI*lVT=xx`S8;5AP`C^w_Y7?QS+mEF-!BOJ4lO_Psj-_IWrl10Ts0Y(_OBG7+39Sn zV8nrxC*g6K^g^1#JK|5vwedh!uMu!8A@uU69&jZ58wp2=`D?c%|C-c{dh0q;>3%#? zi4th*XvHRmW>R(HABO>JD6dfBuywH$kp`x?R796}>^-1C-!7{~K8^^T1k% zzDDt)g9&&gS}f+(=d`!eq$e`WK#lYXZc6U}S~)`eKggwbTpn&4cTd1AKu)kd?z`Rb z6Gqro=^S_=LCo@gzM=PKV!-84-JEu+_)P6ln=Hu@l~a1rr68-)!>t@D*j6^X8b|TN zk4#5VmfRC_m(;Joq5Q|phSLaCe8Nv1DgiK5G zhq`;eS3BnMnVs5npbIbQ>^b>hME9!kXa)9YaToUPzeAxUyJ-nYfWnEtgg#-K-c>Rr z^u$c0$Zf!>qPHP+R@Jcs8vgUhRS!{d{?^ABA-c_7)&B}j>7`&@!lZ{ywNa>St{3?~ zeC0B1v(fMsiAbLvh5%`)7hhZxxpQ2+6IHyE;}PeiB%f3g-%>l05bwQJ-Yl(fJ*!3>2K{g}9k4fI(NxhBXQv-My401@fr4)M4`m zdsDh0yx{kd`Hhd?VCs{}bn$?0;M2_qmS+K(q*`z>HMl+$MY?w)_-?`av5Aut^Tw`7 zCEoRV%J}|}997(_+EcJodPTuH^O%rj@y2HJ-@fG0$cZBMRkKTc#62hkrg*O!H-(>& z33tJn9N=-@DwCoex&9!p{~ePmu~AOc4bo45!TsCl1DTF4?b@Tw`3OT{{`s}7D^>tr zvoB}+++6>vjW{*{byG(4CiKd6&cdnWzSF)f;=W6l?_d|v!_#qdsl_Ix>fo=qtX!5= zW)$na)=dtX{`!72AzkYn#T*w97?%NAln6#tfOEa;C>b$UAsqiP1QLIa(9RjKMwcVP zOG#x(q|zLUbL&z(d3dVXM|XWlllZp`Q!ZzVvlIrqAi7X0%64T*oh&&P#pC^bzx0i4-2ga9eA2sXjABo#m5V87j!LuG-vmlfu3hU1Kv!rNK}M8$y6 z+n3-QFUb1gZ5-xz!2$O@F&5OJhSaqAG<%$LwT_&{n>;t@?MG3GLT{$C)xL-(->lTS zcDN37EhHLEg#5V9HG(~b0DK>aI76p%Bk144WkjUAtlALlm+cPJ&(2uRcK|D(W2Uu#)@q1w9NeuOSRH6}+pK18&m9j>E?@#~%ey1sAI7Pv_v|i(o8)&U*A+iTlRVmU{Ig~2 zxe#bfOs*waB~|CFi-I^u1&c=)DJ@0_;Gh0nVwl{6e_@?9n({PAIDB z$or$nPRfG;pf9Z{C&Lr?Ru0h(`CbPpe~kyU5a?UZ6h#%Rd^*M%b)-e)<+O6YcjbW` ztF6&W$4}1a6FW||%g=QjHkJ;DUxOeLjvxW*T%ad(?TC5Kz|mkJvq+6aM%*Chcp8NP zL)C198;&(N*T-yXCn~id`!*pTW1P(*AmuHvH3*>KX#|`2Kodt~4Zs&)5h2P@tXT6w zxos;PxNu?9T{TIebU@>Lt}9((yL+iQ8OE(B*#$c$-|OUM^S@y_qBk^WZwkpcZQHff zYfof-pPyg#BkZ8>Krr^@iezUf>MKh5kMqd`_py(1O!LTB{4C{EDO_)TMX^rN()WlX zZr2tcSX;?@xF|r4>X8C493QT_6)79Xp^mzl>!-Ts1!=8yKpN_oZC5np2wFg}m7>I; zYb_4YM`fIn_#UdGZz*cY$PC8851rE){{k=LBh5{32q3M7Ru1@Q^d?U4f%Lxnzw`#R zKKL{LMG@@bzrl5a{|-5zqdl+w{HK~wYOz;SN)WW2^H&j9q+PPiH+Bi-*Q>OT)DVbZ zg+FZ}4%Ye!t{0j+$(jQfKFFr0?nR5toe`)Al*u8i5wd^*ErBqlLGKDqBed8wMHd}t^qU<1uKY`8D7M`4*;%5Nzys~! zeqIoG(O3JXu7ahnb|Nmkfb~hj{<$wOv2=T~7B)}4bL&?Nqqy9LSV*NJQ1%0yJ&l*$ zBW}3PR3^ZRCf6MjdW*kQ0227)ZO`$7z8rQ>AfLTTx=!9%eK-#q){$9tZ$K2V- zR2f_GQ&&rFbkM_IExwrnk;$2zp#kl)f1j`UCvU(T!O+0W>eOsD6Y8iZdEs^*9FK9? z|NX>XE|?_cRZvU$>oy6}15d5*lxCnr6w%Go>0JYpd!F*bnc2tsnOpnO+WEE8Bs*i9 zf*;nJVZtddUeaf7f~g)|3h~LVNLmU|ac>6EFY_ zTL!~bh(x>4%;URsV|?RtV=Bj9{3%XmZ>~?TIw~3&PDkQimXtWv)zbvu{e;;wEv&l) zxIhI`*SiM2n<*9Ba?-SJ8r3NJQbS=f4MI%)7 zl;7Z{*9S=z`F8F<$XgK&8~SXfwqyYna3oc)7sC&HjueBDni+}&wg;SM^$R1;(0vHF z&v2mIr~27M{U%w^;tY{5`4KSyxd)k6u+(ZzIISt4#Sp@g8<{9DwhPTTj-)Zm7L|L( zChH}aQ^^l(w`Xz1i092b+$Eby8j3^3H3dw;WWX=asI(;Z88vVS?Vg*Q8=+MShO-oO zO-~;Fun`3(c@~s@IaF-D4C$7P>z4q+p|1LSX}#r914g?ZZk>``c@d|w^-cW2Vd`>n zN2gSIMFH*|Ff{WWBJm#)h@k7p(F%Y|^g!8r+-ZDTT2P}fVaAN4j}WL)p$64FZ$QgE zsg3YlZK@sV5j!Tdd zUHd><2Wn|vRw0A;C$a#w#N%tWp8E=@ffC)96|X~@zC7m@%;dAnOPdeU=AhSazyNtPh4u|f=hZT>oYx>EA{TO6a_bFX;%5%D4ovglf7LOw(nM} z{}%bq?TY3At!{`F`!#4lvQQk})$c(cg_`uX(`y{ zJ8m{n?xK|)U(r3LC2#v1dY|;;e8~M{W1Lln7S2DUA_=lKoL}IC|B)0<_uTS*%R>4+ zC(L9oM;(g)>TTU~(;5ZW)TmgTnRW71>++9NWzK*=e}adh&T+3k2SxF~U@tt6@|hBb z^7o7u;?j}>48M(xu^e_YcG+_ObY|H6!2V0Zn+$s=6~M%=dI=$Zq`VDir@hn4MvJdl#?*B*e#W z+I)f&`i0?n-#-PglpuWjwYbH@to!IU#0w=61pURRaMYxe{Q7plU}D3T7yZ5L-z|{_ zW2U8Qu+YZ1@L0asY4t$UJnw4jq~6EmY}#ZNavwzdPqsQczem(!u6yabI;EV;zv3?1 z0CB1zJ-`oIdyTkU{9lAHPp7fJ^`m;eW+Ul=_!tb}H>P{?X-;C_{q9wfgt(C*MmE!l z0zq%>NH2&()6Dhh_w#G-U)ejw3XYad*ERqCN3u|KBgp#8X@y7i9?SJWojFHwFR+i8 zpCq{CYpuP7J?r6&H@B+&{Z7TxQhpLE80RGNJ;HDBQ^wqXdyEsFxR#U_hKy(3{`2i>2hGz9Cl;=>G7C^fF zDiR`0=mY6e`m!<^r#cy3G?vek^S8^dfk(`-bR)5%IPB!D0Sv?M%2Bkc%u^)Uv%?$6 zz+1xg2gN))o^%w0VrVQ_QM;=bLCfI{cnDx*7boEM*X{uH z4)l4A@qF3*SkPB}l~>kW@#EC7S2hG$soS3^mL%yv)NJ{RE&JvW8~OuBdXP@zC^bR7 zIY22#Jm9&5V@>gM5bEu)@U*4VjshFYhQD)g6ZCb*TsqHBa=A;t-HHF>i$IGneDaI3 zAq}F09&oO7F1EPBCc|%umcUWfGSfgL>Q!I7+{LyY5e?qe5@AruRL0`(2c;yU>FpJc zJqhqOY1Y%f*JT#1GW#(5Ozpm-Tc3k|GKxTH=yxSXnB7u-3@E#QkPJVNg<>w1@HtxFkbpzfB~*h`tNE+J zGt;fV`xl{dxQ6AI*ksI1n`CYlLME^D@ER@=pp%ZQ4SnMv>ifm6<*;iZ;O@)pe9Yg{ z%`c<%Yda{bXy}VF6*ooT$nRv9=Tz5DHF>}A1W~X*Xn}RTjy%xZ!zA}XWCE9>@IZOo zBecFQR* zadUWRFw`QeOT*m-ENu$4&;RmDt930a1mc1C!agjZOacDcbF18uqjYOX?VDr5vapPm z+}tyYnv%9)k#VM{I!KLi(_c`czgt1joK|ccMncHYJESL z6%b*^<^>fU?qbk5@ae=o0)9DAHQu*JJEm=SK-MgOkb}(AyJDY_QBOAHHU|Of!0cPf zoI~lFv294BgI;4C%vwZ6bN)Meg*lmH_fGjGQ@o)f1wD}uxPWZW@I?~awCcPw8qg4z zWH#mu0KZmJn;}wPd(1K|_e>@UPc-7DU6@VjW5H1hdnKfjM~2|B?{;NBbJ#qmlhF^i zE^`J3_5HlSVmegX+w2K12MabDx}{HJ5WQsd69-Ij=d&n}NHo3LP8 zGG5U79S@+LxQ(x9U&%+`XFvbX3jlD>b8A$*LV=~O@7$Y1m>vsj+0 z%l+W*N3Nl(KcNBVXhqpCC@5N!#0xAoU*siH_^xg4(;H*)JI!A#Fushg6eTs60l((o z`CpM9)S7SAz9~LDDIS$U?Yhz}Z3mr}nyp31nAz#p3G*4-_wK2Xn`jkhw21p?wEPk- zDcS}+e9Hp-&zqu%9)TQ9RB*q3hr-WI+U_oL=K?&AGk~K16Gq%Z8&x%691d&dGqnmZ zM0~0lOk*JOQ==f zuxrn_btG_wcZNsWwcv-dtQz#IGIF$7Mt4#+a5#4xqP}yFa?-ndwzlIo{KVOaE6N!yC z*_mIN!x;LXCjx)!Wn_Jhex@5}898-Pb%lmC9zzy8em`CjR-M@K`mKT<&vM6^jy9@wHzL8`%!)$#sg7G*OyPXrq^x?rxNz zMZJM*x{mAK_#6@j&Uyoxr_}q2{UbO=A@I`(|Lr#~krhDaerI$b@?3hF_PS1ZfOcS} z-eqd{k$%Ge70r-3=cqrT;0eO?O#jaUh!kgN{Rs0kO~Ve|k|S8h0I6D`UF!9U0ajSV zJF*t>i|T8l&wdDV%x?f=9RpfpLEdE#Z8g;M`O)CipwLNjyv6qQm({|qu&~i+1m&VM zT>QaV(xQ_&o34}lmJnuadu6pI<)wU?ET+LAG`s1tj{e=y>EPC>{4%gpsGB#vNyK+> zyq-YQ@3W#q@3u6EF&l{Ncv27wFY$f^lA@sD(|mW z9^_aBQpj0Q^u{Z+EAvpQuu*F8P-?Kzs6g3D-I)xJ=RfjAIO>G<`p`XU)SABMYxF+0 zTA#m0dDf;iohwQA<&!O#kXzAdTYgSh$NLU5b`~|&)lgt&WA@X%g~4w zAB&C{>?of0pM*9gZS6Y28Jz$vHS7aQm=QBLmH?>uAX}h>Dk?5=UgV`qVO;G<7Z1y{ ziw|lvKkyXJ|MlY<@26P9Xw;V z0(V~BR?4EMMqg}Sg%CgUzCJ&L^79MT00u7 z4{4;Ciik*YQT_pJR@XAQS;yU6<6T8Ro6>o~4F;c=3B81Wn2fEzFg-f>~nQ z{+v-R&!SV8tA4RkyE9|a^V*zlE6&?geFVbQ8?Ns30%?&(7YCT_&*mMcQ!?sW{`0sv zK4Nq_`(Ww%&Sp{qB=V<^eDRmm&C$;d6Hm%a#~a^ec~)D7AZ@FU8Bq zR3wEceLa&;z_n=(gPuIjNQ>DBphrBZV&&)?4z)z|8ER{In`o@E*FC=MgFF`W|GnlN>2CFn{qCad9RwE8iVpuU91veT z#_X)z*}elR{SSOu<73B^vS2fUfH!vOUx@XEGJFX=Whhum#YtZ(xCz&po0Ap| zbWt$!K8$4$(I0`gAae9eH#Y2I<>CRKi#V_1Wm)s#4$U7|XRwdIzg~mBO3zBw_PqA1 ztn22F9A)P8zM`!#z~BL(i^&=Pn~$NH{AD3cigz(Wwe1ceOGmah)y*PaN`(h^Rm-z3 z+OpS=vXdV4#upkpp{74_Tcj~~^Jd{fq^mgeIcw9L@#JP?aFyaKm4ZbJ+0vtf) zz#M?sFI~VW;?9%{4!n3fWvQk62p#{s|KG3Dbx+Rvp#-LjRZIOt>GdvMBf0oko|7Bu z3%ZB;w4vkR0#s9rzNsGs)M`|DThISQoB7)S26eowG6Ur!_BVe%gv3NF+*nZr?4|AO zcus`rxV6E_#X#%x{fS1wh$V5rH=2xCvgZxdwx6%x_Pkfxi)y}AkU`*k?MIFmdEo4Y zA;H@UjSkwtV1^SGiv54)*VH&*u?x+`T82WCG0t_*a#Xny`#CNjM)%FI7g~X*mC+2F zZdV?tn=w%fo=XyO{d{f@_>-F4Pq5eScwT?dL(~C-XI*IDS12n%*y+LL;b=1Y6Gc;+ zNol#jO5F96)U84fleyuQHAZZhZ`tP02^CTQs?5(8TVGbUpymg7&6y2h;BnBOAdFjE zm+#k;y;0l;t+y(&0D#e+PT!iP^{oDl9PnN`D(TJi+KFme+tAlNP|@+Bb03@w4QQd5 z`s*oWLBP9uPwhfiO9Jl=?o^klMHj2>>6E~N{#OnwP*4lm3ChK>UJKdd1-NJw)MR}c zXVuA)Dg2L{`p3fT#5$9Isa`MKXy>s198z$qdmtTmeP+Whe}|M5NZ6?FP`BHJtt>Ai zXbQHYCd|%I#1KoS-xpPajV!D`#D%sU&h~Xta2J&&Im}IFN*Ziowt>&cB^D_4qkCCM zNa)|ic1zQ5h!Hr!MhMD`(Qp18c(ud|_{j{9xgm}NHWnUz6;rXl&uKmZ6WbT`{v1!= zpM)aL&zDJ7*nUBTJW@}OFZX(9(YbH3JcI!v{;qJ=%f9oJ>FNl`wIzvl&(?TGk_Y^u z!A{ax>cH&4syBNflxlEeEQ;**ubg?ZSN+1o3`Mg#ngVH`o;_b94tR=3n2p5v7f3qQ z>)+Egao=jRgc-WSAA*P*L}=XLckTclZ>wSI3B%w4a*}co98|hw$S@^y{2Dp>N4tNy!|^z1pD%wXv^%w{y!c?^iOHRZSU>#~j4LIN}xJ z>|gdi1;jg$2>sTEh??0W*VezxWd9jJ_S>2)C;2Vpx5B00j3P4uCpWPN%fwH)jb0)v zr)T7Rt1}kTG6eISl0W2GEs!Wy#_wE(M@8aAe%LgogiZ@$l5RsoKn_o-q?(#ldlB?@ zn#em{9$t4X<7Vmf_>E7RKUM~~UA72)Si`!1SL5X5jYnGZiszGQS)kHyl9pHmu~*Gk z-`SPEIU>GDN|ngxOaxpr(exz@oWKx(MW3b!+OT@PV;#1!r(G7Xk0vT9aS(PLw6D#; z+*rSpg&o;k{SCVC5sp>p1fZYCIx0pC>puBoYG!+6C;9g>1uQD+gpKBn23v&@&W;sk zDBFBJ{9Bx{IIy;|@tL)&zA8kK3Hl|#HTVIVP5F>4sQa{boXvY3;ZngO*>9e@@}9bO zo?*3p=?%J8%zog#v{xkCuvHiAX$48_YhqM!y>X6)s+5`KGF1W0v-qW{Hrw3g!VfR8 zgh@Y6q{7#<_BE-?3Nl>KtM{KHL&$<&1Ab#OLa6W;!0Ao8;|MFLQPg>JAWhb;?A@}D zawvC9x;VB}D07c>7g+1>Fl+xVV;V0*C$tc7!CY$^T9SpekC=QjvtbV;lWqAqsEA-|wJztfZFtXcC|37zF-^)&p(ha%Z zq(9;V)3u?EX~o6%{*LeD#r4H!jl8F2FSK{gkPp16B2N7XO$%eO%F0=I_ z3&#M-|92Y9T91$aX!mctF>c_f0Z9PnDsZ=kfZeITn0IJz6Y0U=%Tl8R&hA(iy_gbg zRg>Y`T-;$U{S-mY&*WMt+VW_aW;m()&!<6~xl!L7ULWT&c|-*VVp_Op-DfQ}e4L67 zmJ~1ZlQtQJ7FDJX_yYvL90wN^cYAJ_-m(5pMX3p5V4g<;ojieTIUu`v)=l|Y7Hw4w zda2L6Gs6U$<`yIxXwFwtKz`R(oVLJjT3$(d%lFQN=6=iNFTp}0`*@D>N)prLW8L{x z;+Lw5V{P6utH`T$^hV*=9gs!Ia4h)i1MXiYg)szkZVOjNoee0#8jeX-$zP$+=e)t)64cHQ* zi~)W4oDqb>3Em!t*?Lp_$?H`ynxav&yw0>mdCGlEC#6 z;Fc2DUnVS^AHM&qF3Xl19bNx1RpfUwD%yXD{+rCvu9M*~SiHUrCZ1%Q&&gHpu(@

    7Tw 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


    $(@I4)$Gm{pHOxH`oNn|+ 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

    Ycsm&Wa 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 Date: Tue, 9 Feb 2021 15:00:24 -0700 Subject: [PATCH 37/93] Added EOF restructring to array --- ...grid_PCP_obsERA_obsOnly_WeatherRegime.conf | 2 +- ush/drivers/WeatherRegime.py | 35 ++++++++++++++----- ush/drivers/WeatherRegime_driver.py | 16 ++++----- 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf index 86e6c93bfc..e4bba90fca 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf +++ b/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf @@ -2,7 +2,7 @@ [config] # Steps to Run #OBS_STEPS = ELBOW+PLOTELBOW+EOF+PLOTTEOF+KMEANS+PLOTKMEANS -OBS_STEPS = EOF +OBS_STEPS = EOF+PLOTEOF+KMEANS+PLOTKMEANS # time looping - options are INIT, VALID, RETRO, and REALTIME LOOP_BY = VALID diff --git a/ush/drivers/WeatherRegime.py b/ush/drivers/WeatherRegime.py index 03982e5516..ed79477193 100644 --- a/ush/drivers/WeatherRegime.py +++ b/ush/drivers/WeatherRegime.py @@ -116,23 +116,23 @@ def Calc_EOF(self,eofin): def reconstruct_heights(self,eof,pc,reshape_arr): rssize = len(reshape_arr) + eofshape = eof.shape + eosize = len(eofshape) #reconstruction. If NUMPCS=nt, then a1=a0 - eofs=np.reshape(eof,(self.NUMPCS,reshape_arr[rssize-2]*reshape_arr[rssize-1])) + eofs=np.reshape(eof,(self.NUMPCS,eofshape[eosize-2]*eofshape[eosize-1])) a1=np.matmul(pc,eofs) - a1 = np.reshape(a1,reshape_arr) + #a1 = np.reshape(a1,reshape_arr) return a1 - def run_K_means(self,a1,arr_shape): + def run_K_means(self,a1,yr,arr_shape): arrdims = len(arr_shape) k=KMeans(n_clusters=self.wrnum, random_state=0, n_jobs=-1) - #a,a1 = self.weights_detrend(lat,lon,a) - #fit the K-means algorithm to the data f=k.fit(a1) @@ -141,11 +141,9 @@ def run_K_means(self,a1,arr_shape): #Obtain cluster labels for each day [Reshape to Year,day] wr = f.labels_ - #wr = np.reshape(wr,[len(a[:,0,0,0]),len(a[0,:,0,0])]) wr = np.reshape(wr,arr_shape[0:arrdims-2]) yf = np.reshape(y,[self.wrnum,arr_shape[arrdims-2],arr_shape[arrdims-1]]) # reshape cluster anomalies to latlon - #yf = np.reshape(y,[self.wrnum,len(lat),len(lon)]) # reshape cluster anomalies to latlon #Get frequency of occurence for each cluster perc=np.zeros(self.wrnum) @@ -170,8 +168,27 @@ def run_K_means(self,a1,arr_shape): input = input[::-1] #Save Label data [YR,DAY] - np.save('WR_LABELS',wrc) - print(wr.shape) + #if os.path.isfile(outfile+'.nc'): + # os.remove(outfile+'.nc') + #nc = nc4.Dataset(outfile, 'w') + #nc.createDimension('year', arr_shape[0]) + #nc.createDimension('day', arr_shape[1]) + + #ncyr = nc.createVariable('time','i',('year')) + #nc.variables['time'].long_name = "time" + #nc.variables['time'].standard_name = "time" + #nc.variables['time'].units = "years" + + #ncnum = nc.createVariable('wrnum','i',('year','day'),fill_value=-9999.0) + #nc.variables['wrnum'].long_name = "weather_regime_number" + #nc.variables['wrnum'].standard_name = "weather_regime_number" + #nc.variables['wrnum'].units = "unitless" + + #ncyr[:,:] = yr + #ncnum[:,:] = wrc + #nc.close() + + #np.save('WR_LABELS',wrc) return input, self.wrnum, perc diff --git a/ush/drivers/WeatherRegime_driver.py b/ush/drivers/WeatherRegime_driver.py index 63249620d5..ca487ef5bc 100755 --- a/ush/drivers/WeatherRegime_driver.py +++ b/ush/drivers/WeatherRegime_driver.py @@ -82,22 +82,22 @@ def main(): obs_infiles, yr_obs = find_input_files(elbow_config, use_init, 'OBS_WR_TEMPLATE') obs_invar = config.getstr('WeatherRegime','OBS_WR_VAR','') z500_obs,lats_obs,lons_obs,year_obs = read_nc_met(obs_infiles,yr_obs,obs_invar) - z500_detrend_obs,z500_detrend_3d_obs = steps_obs.weights_detrend(lats_obs,lons_obs,z500_obs) + z500_detrend_obs,z500_detrend_2d_obs = steps_obs.weights_detrend(lats_obs,lons_obs,z500_obs) if ("ELBOW" in steps_list_fcst) or ("EOF" in steps_list_fcst) or("KMEANS" in steps_list_fcst): fcst_infiles,yr_fcst = find_input_files(elbow_config, use_init, 'FCST_WR_TEMPLATE') fcst_invar = config.getstr('WeatherRegime','FCST_WR_VAR','') z500_fcst,lats_fcst,lons_fcst,year_fcst = read_nc_met(fcst_infiles,yr_fcst,fcst_invar) - z500_detrend_fcst,z500_detrend_3d_fcst = steps_fcst.weights_detrend(lats_fcst,lons_fcst,z500_fcst) + z500_detrend_fcst,z500_detrend_2d_fcst = steps_fcst.weights_detrend(lats_fcst,lons_fcst,z500_fcst) if ("ELBOW" in steps_list_obs): print('Running Obs Elbow') - K_obs,d_obs,mi_obs,line_obs,curve_obs = steps_obs.run_elbow(z500_detrend_3d_obs) + K_obs,d_obs,mi_obs,line_obs,curve_obs = steps_obs.run_elbow(z500_detrend_2d_obs) if ("ELBOW" in steps_list_fcst): print('Running Forecast Elbow') - K_fcst,d_fcst,mi_fcst,line_fcst,curve_fcst = steps_fcst.run_elbow(z500_detrend_3d_fcst) + K_fcst,d_fcst,mi_fcst,line_fcst,curve_fcst = steps_fcst.run_elbow(z500_detrend_2d_fcst) if ("PLOTELBOW" in steps_list_obs): if not ("ELBOW" in steps_list_obs): @@ -119,12 +119,12 @@ def main(): if ("EOF" in steps_list_obs): print('Running Obs EOF') eof_obs,pc_obs,wrnum_obs,variance_fractions_obs = steps_obs.Calc_EOF(z500_obs) - z500_detrend_3d_obs = steps_obs.reconstruct_heights(eof_obs,pc_obs,z500_obs.shape) + z500_detrend_2d_obs = steps_obs.reconstruct_heights(eof_obs,pc_obs,z500_detrend_2d_obs.shape) if ("EOF" in steps_list_fcst): print('Running Forecast EOF') eof_fcst,pc_fcst,wrnum_fcst,variance_fractions_fcst = steps_fcst.Calc_EOF(z500_fcst) - z500_detrend_3d_fcst = steps_fcst.reconstruct_heights(eof_fcst,pc_fcst,z500_fcst.shape) + z500_detrend_2d_fcst = steps_fcst.reconstruct_heights(eof_fcst,pc_fcst,z500_detrend_2d_fcst.shape) if ("PLOTEOF" in steps_list_obs): if not ("EOF" in steps_list_obs): @@ -147,11 +147,11 @@ def main(): if ("KMEANS" in steps_list_obs): print('Running Obs K Means') - kmeans_obs,wrnum_obs,perc_obs = steps_obs.run_K_means(z500_detrend_3d_obs,z500_obs.shape) + kmeans_obs,wrnum_obs,perc_obs = steps_obs.run_K_means(z500_detrend_2d_obs,year_obs,z500_obs.shape) if ("KMEANS" in steps_list_fcst): print('Running Forecast K Means') - kmeans_fcst,wrnum_fcst,perc_fcst = steps_fcst.run_K_means(z500_detrend_3d_fcst,z500_fcst.shape) + kmeans_fcst,wrnum_fcst,perc_fcst = steps_fcst.run_K_means(z500_detrend_2d_fcst,year_fcst,z500_fcst.shape) if ("PLOTKMEANS" in steps_list_obs): if not ("KMEANS" in steps_list_obs): From 5a6c343a612bd12ff233c416cc0d8f6d35e51a0e Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Wed, 10 Feb 2021 11:54:24 -0700 Subject: [PATCH 38/93] Updated location of Blocking driver scripts --- .../UserScript_fcstGFS_obsERA_Blocking.conf | 2 +- .../Blocking.py | 1 + .../Blocking_WeatherRegime_util.py | 1 + .../Blocking_driver.py | 1 + .../Regrid_PCP_fcstGFS_obsERA_Blocking.conf | 4 +- .../UserScript_obsERA_obsOnly_Blocking.conf | 2 +- .../Blocking.py | 0 .../Blocking_WeatherRegime_util.py | 132 ++++++++++++++++++ .../Blocking_driver.py | 14 +- .../Regrid_PCP_obsERA_obsOnly_Blocking.conf | 23 +-- 10 files changed, 160 insertions(+), 20 deletions(-) create mode 120000 parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking.py create mode 120000 parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_WeatherRegime_util.py create mode 120000 parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_driver.py rename parm/use_cases/model_applications/s2s/{ => UserScript_fcstGFS_obsERA_Blocking}/Regrid_PCP_fcstGFS_obsERA_Blocking.conf (99%) rename {ush/drivers => parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking}/Blocking.py (100%) create mode 100644 parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_WeatherRegime_util.py rename {ush/drivers => parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking}/Blocking_driver.py (97%) rename parm/use_cases/model_applications/s2s/{ => UserScript_obsERA_obsOnly_Blocking}/Regrid_PCP_obsERA_obsOnly_Blocking.conf (90%) diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf index 09fccf2ecd..a29d637a45 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf @@ -53,4 +53,4 @@ USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE USER_SCRIPT_INPUT_TEMPLATE = init_{init?fmt=%Y%m%d%H%M%S}_valid_{valid?fmt=%Y%m%d%H%M%S}_lead_{lead?fmt=%3H}.{custom} USER_SCRIPT_INPUT_DIR = {METPLUS_BASE}/internal_tests/data/user_script -USER_SCRIPT_COMMAND = {METPLUS_BASE}/ush/drivers/Blocking_driver.py {METPLUS_BASE}/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf dir.INPUT_BASE={INPUT_BASE} dir.OUTPUT_BASE={OUTPUT_BASE} dir.MET_INSTALL_DIR={MET_INSTALL_DIR} +USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_driver.py {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Regrid_PCP_fcstGFS_obsERA_Blocking.conf dir.INPUT_BASE={INPUT_BASE} dir.OUTPUT_BASE={OUTPUT_BASE} dir.MET_INSTALL_DIR={MET_INSTALL_DIR} diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking.py b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking.py new file mode 120000 index 0000000000..29f05d48e0 --- /dev/null +++ b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking.py @@ -0,0 +1 @@ +../UserScript_obsERA_obsOnly_Blocking/Blocking.py \ No newline at end of file diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_WeatherRegime_util.py b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_WeatherRegime_util.py new file mode 120000 index 0000000000..7839a88078 --- /dev/null +++ b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_WeatherRegime_util.py @@ -0,0 +1 @@ +../UserScript_obsERA_obsOnly_Blocking/Blocking_WeatherRegime_util.py \ No newline at end of file diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_driver.py b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_driver.py new file mode 120000 index 0000000000..b0aed794fd --- /dev/null +++ b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_driver.py @@ -0,0 +1 @@ +../UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py \ No newline at end of file diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Regrid_PCP_fcstGFS_obsERA_Blocking.conf similarity index 99% rename from parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf rename to parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Regrid_PCP_fcstGFS_obsERA_Blocking.conf index 9ed692b69d..3ace9c66ba 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_fcstGFS_obsERA_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Regrid_PCP_fcstGFS_obsERA_Blocking.conf @@ -412,7 +412,7 @@ OBS_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/ERA/Daily/Z500_daily_{valid?f FCST_BLOCKING_VAR = Z500_NA_MEAN OBS_BLOCKING_VAR = Z500 -# Plots +# Plots Output Dir BLOCKING_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/plots/ #CBL plot title and name @@ -421,7 +421,7 @@ OBS_CBL_PLOT_OUTPUT_NAME = ERA_CBL_avg # IBL plot title and name IBL_PLOT_TITLE = DJF Instantaneous Blocked Longitude -IBL_PLOT_OUTPUT_NAME = IBL_Freq_DJF +IBL_PLOT_OUTPUT_NAME = FV3_ERA_IBL_Freq_DJF IBL_PLOT_OBS_LABEL = ERA Reanalysis IBL_PLOT_FCST_LABEL = GEFS diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf index ca2291bf6e..9d2b796c24 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf @@ -53,4 +53,4 @@ USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE USER_SCRIPT_INPUT_TEMPLATE = init_{init?fmt=%Y%m%d%H%M%S}_valid_{valid?fmt=%Y%m%d%H%M%S}_lead_{lead?fmt=%3H}.{custom} USER_SCRIPT_INPUT_DIR = {METPLUS_BASE}/internal_tests/data/user_script -USER_SCRIPT_COMMAND = {METPLUS_BASE}/ush/drivers/Blocking_driver.py {METPLUS_BASE}/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf dir.INPUT_BASE={INPUT_BASE} dir.OUTPUT_BASE={OUTPUT_BASE} dir.MET_INSTALL_DIR={MET_INSTALL_DIR} +USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking.conf dir.INPUT_BASE={INPUT_BASE} dir.OUTPUT_BASE={OUTPUT_BASE} dir.MET_INSTALL_DIR={MET_INSTALL_DIR} diff --git a/ush/drivers/Blocking.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py similarity index 100% rename from ush/drivers/Blocking.py rename to parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_WeatherRegime_util.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_WeatherRegime_util.py new file mode 100644 index 0000000000..442c334283 --- /dev/null +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_WeatherRegime_util.py @@ -0,0 +1,132 @@ +import os +import netCDF4 +import numpy as np +from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence +from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub + +def parse_steps(config_list): + + steps_config_part_fcst = [s for s in config_list if "FCST_STEPS" in s] + steps_list_fcst = [] + + steps_config_part_obs = [s for s in config_list if "OBS_STEPS" in s] + steps_list_obs = [] + + # Setup the Steps + if steps_config_part_fcst: + steps_param_fcst = steps_config_part_fcst[0].split("=")[1] + steps_list_fcst = steps_param_fcst.split("+") + config_list.remove(steps_config_part_fcst[0]) + if steps_config_part_obs: + steps_param_obs = steps_config_part_obs[0].split("=")[1] + steps_list_obs = steps_param_obs.split("+") + config_list.remove(steps_config_part_obs[0]) + + config = pre_run_setup(config_list) + if not steps_config_part_fcst: + steps_param_fcst = config.getstr('config','FCST_STEPS','') + steps_list_fcst = steps_param_fcst.split("+") + if not steps_config_part_obs: + steps_param_obs = config.getstr('config','OBS_STEPS','') + steps_list_obs = steps_param_obs.split("+") + + return steps_list_fcst, steps_list_obs, config_list + + +def find_input_files(inconfig, use_init, intemplate, secondtemplate=''): + loop_time, end_time, time_interval = get_start_end_interval_times(inconfig) + skip_times = get_skip_times(inconfig) + + start_mth = loop_time.strftime('%m') + template = inconfig.getraw('config',intemplate) + if secondtemplate: + template2 = inconfig.getraw('config',secondtemplate) + file_list2 = [] + + file_list = [] + yr_list = [] + if use_init: + timname = 'init' + else: + timname = 'valid' + input_dict = {} + input_dict['loop_by'] = timname + pmth = start_mth + while loop_time <= end_time: + lead_seq = get_lead_sequence(inconfig) + for ls in lead_seq: + new_time = loop_time + ls + input_dict[timname] = loop_time + input_dict['lead'] = ls + + outtimestuff = ti_calculate(input_dict) + if skip_time(outtimestuff, skip_times): + continue + cmth = outtimestuff['valid'].strftime('%m') + filepath = do_string_sub(template, **outtimestuff) + if secondtemplate: + filepath2 = do_string_sub(template2, **outtimestuff) + if os.path.exists(filepath) and os.path.exists(filepath2): + file_list.append(filepath) + file_list2.append(filepath2) + else: + file_list.append('') + file_list2.append('') + else: + if os.path.exists(filepath): + file_list.append(filepath) + else: + file_list.append('') + + if (int(cmth) == int(start_mth)) and (int(pmth) != int(start_mth)): + yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) + pmth = cmth + + loop_time += time_interval + + if secondtemplate: + file_list = [file_list,file_list2] + yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) + + return file_list, yr_list + +def read_nc_met(infiles,yrlist,invar): + + print("Reading in Data") + + #Find the first non empty file name so I can get the variable sizes + locin = next(sub for sub in infiles if sub) + indata = netCDF4.Dataset(locin) + lats = indata.variables['lat'][:] + lons = indata.variables['lon'][:] + invar_arr = indata.variables[invar][:] + indata.close() + + var_3d = np.empty([len(infiles),len(invar_arr[:,0]),len(invar_arr[0,:])]) + + for i in range(0,len(infiles)): + + #Read in the data + if infiles[i]: + indata = netCDF4.Dataset(infiles[i]) + new_invar = indata.variables[invar][:] + init_time_str = indata.variables[invar].getncattr('init_time') + valid_time_str = indata.variables[invar].getncattr('valid_time') + indata.close() + else: + new_invar = np.empty((1,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) + new_invar[:] = np.nan + var_3d[i,:,:] = new_invar + + yr = np.array(yrlist) + if len(var_3d[:,0,0])%float(len(yrlist)) != 0: + lowval = int(len(var_3d[:,0,0])/float(len(yrlist))) + newarrlen = (lowval+1) * float(len(yrlist)) + arrexp = int(newarrlen - len(var_3d[:,0,0])) + arrfill = np.empty((arrexp,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) + arrfill[:] = np.nan + var_3d = np.append(var_3d,arrfill,axis=0) + sdim = len(var_3d[:,0,0])/float(len(yrlist)) + var_4d = np.reshape(var_3d,[len(yrlist),int(sdim),len(var_3d[0,:,0]),len(var_3d[0,0,:])]) + + return var_4d,lats,lons,yr diff --git a/ush/drivers/Blocking_driver.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py similarity index 97% rename from ush/drivers/Blocking_driver.py rename to parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py index 3fcdb2f25a..51e58e0a3e 100755 --- a/ush/drivers/Blocking_driver.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py @@ -6,18 +6,20 @@ import netCDF4 import re -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), - os.pardir,os.pardir))) -sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy/metplotpy/blocking_s2s") -sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy_feature_33/metplotpy/blocking_s2s") +mp_fpath = os.path.abspath(__file__) +mp_fpath_split = str.split(mp_fpath,os.path.sep) +mp_loc_ind = mp_fpath_split.index('METplus') + +sys.path.insert(0,os.path.sep.join(mp_fpath_split[0:mp_loc_ind+1])) +sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy") from Blocking import BlockingCalculation from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub from ush.master_metplus import get_config_inputs_from_command_line from metplus.wrappers import PCPCombineWrapper from metplus.wrappers import RegridDataPlaneWrapper -import plot_blocking as pb -from CBL_plot import create_cbl_plot +from metplotpy.blocking_s2s import plot_blocking as pb +from metplotpy.contributed.blocking_s2s.CBL_plot import create_cbl_plot from Blocking_WeatherRegime_util import find_input_files, parse_steps def main(): diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking.conf similarity index 90% rename from parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf rename to parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking.conf index 9aeb89c687..44affe8bec 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking.conf @@ -67,7 +67,7 @@ CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST OBS_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds627.0/ei.oper.an.pl -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Regrid [filename_templates] # format of filenames @@ -114,8 +114,8 @@ OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/daily +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Regrid +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Daily # Input ERA Interim OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc @@ -164,8 +164,8 @@ OBS_PCP_COMBINE_DERIVE_LOOKBACK = 120 CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/daily -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Rmean5d +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Daily +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Rmean5d # format of filenames # Input ERA Interim @@ -198,14 +198,14 @@ OBS_PCP_COMBINE_RUN = {OBS_RUN} # Options are ADD, SUM, SUBTRACT, and DERIVE OBS_PCP_COMBINE_METHOD = USER_DEFINED -OBS_PCP_COMBINE_COMMAND = -subtract {OBS_PCP_COMBINE_INPUT_DIR}/daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc {OBS_PCP_COMBINE_INPUT_DIR}/Rmean5d/Z500_5daymean_{valid?fmt=%Y%m%d}_NH.nc -field 'name="Z500"; level="(*,*)";' +OBS_PCP_COMBINE_COMMAND = -subtract {OBS_PCP_COMBINE_INPUT_DIR}/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc {OBS_PCP_COMBINE_INPUT_DIR}/Rmean5d/Z500_5daymean_{valid?fmt=%Y%m%d}_NH.nc -field 'name="Z500"; level="(*,*)";' # location of configuration files used by MET applications CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Anomaly +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Anomaly OBS_PCP_COMBINE_INPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d}_NH.nc OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc @@ -216,13 +216,13 @@ OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc VALID_INCREMENT = 86400 # Directory for the Z500 anomaly data to read in to the blocking python code -OBS_BLOCKING_ANOMALY_TEMPLATE = {OUTPUT_BASE}/s2s/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc +OBS_BLOCKING_ANOMALY_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc # Variable Name for the Z500 anomaly data to read in to the blocking python code OBS_BLOCKING_ANOMALY_VAR = Z500_ANA # Directory for the Z500 data to read in to the blocking python code -OBS_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc # Variable for the Z500 data OBS_BLOCKING_VAR = Z500 @@ -256,6 +256,9 @@ OBS_BLOCK_TRAVEL = 45 # Pelly-Hoskins Method OBS_BLOCK_METHOD = PH +# Plots +BLOCKING_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/plots/ + #CBL plot title and name OBS_CBL_PLOT_MTHSTR = DJF OBS_CBL_PLOT_OUTPUT_NAME = ERA_CBL_avg From 9440d9601f47d77051abf58261aa0b2cd87f5696 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Thu, 11 Feb 2021 15:30:14 -0700 Subject: [PATCH 39/93] Added output file option for weather regime driver --- .../Blocking_WeatherRegime_util.py | 8 +- .../Blocking_driver.py | 14 +- ...erScript_obsERA_obsOnly_WeatherRegime.conf | 2 +- .../Blocking_WeatherRegime_util.py | 138 ++++++++++++++++++ ...grid_PCP_obsERA_obsOnly_WeatherRegime.conf | 15 +- .../WeatherRegime.py | 82 ++++++++--- .../WeatherRegime_driver.py | 22 ++- ush/drivers/Blocking_WeatherRegime_util.py | 8 +- 8 files changed, 250 insertions(+), 39 deletions(-) create mode 100644 parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/Blocking_WeatherRegime_util.py rename parm/use_cases/model_applications/s2s/{ => UserScript_obsERA_obsOnly_WeatherRegime}/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf (91%) rename {ush/drivers => parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime}/WeatherRegime.py (65%) rename {ush/drivers => parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime}/WeatherRegime_driver.py (89%) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_WeatherRegime_util.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_WeatherRegime_util.py index 442c334283..bbf633bad0 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_WeatherRegime_util.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_WeatherRegime_util.py @@ -45,6 +45,9 @@ def find_input_files(inconfig, use_init, intemplate, secondtemplate=''): file_list = [] yr_list = [] + mth_list = [] + day_list = [] + yr_full_list = [] if use_init: timname = 'init' else: @@ -64,6 +67,9 @@ def find_input_files(inconfig, use_init, intemplate, secondtemplate=''): continue cmth = outtimestuff['valid'].strftime('%m') filepath = do_string_sub(template, **outtimestuff) + mth_list.append(cmth) + day_list.append(outtimestuff['valid'].strftime('%d')) + yr_full_list.append(outtimestuff['valid'].strftime('%Y')) if secondtemplate: filepath2 = do_string_sub(template2, **outtimestuff) if os.path.exists(filepath) and os.path.exists(filepath2): @@ -88,7 +94,7 @@ def find_input_files(inconfig, use_init, intemplate, secondtemplate=''): file_list = [file_list,file_list2] yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) - return file_list, yr_list + return file_list, yr_list, mth_list, day_list, yr_full_list def read_nc_met(infiles,yrlist,invar): diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py index 51e58e0a3e..4bd31f95ee 100755 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py @@ -11,7 +11,7 @@ mp_loc_ind = mp_fpath_split.index('METplus') sys.path.insert(0,os.path.sep.join(mp_fpath_split[0:mp_loc_ind+1])) -sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy") +sys.path.insert(0, os.path.sep.join(mp_fpath_split[0:mp_loc_ind])+"/METplotpy") from Blocking import BlockingCalculation from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub @@ -123,13 +123,13 @@ def main(): if ("CBL" in steps_list_obs): print('Computing Obs CBLs') - obs_infiles, yr_obs = find_input_files(cbl_config, use_init, 'OBS_BLOCKING_ANOMALY_TEMPLATE') + obs_infiles,yr_obs,mth_obs,day_obs,yr_full_obs = find_input_files(cbl_config, use_init, 'OBS_BLOCKING_ANOMALY_TEMPLATE') cbls_obs,lats_obs,lons_obs,yr_obs,mhweight_obs = steps_obs.run_CBL(obs_infiles,yr_obs) if ("CBL" in steps_list_fcst) and not use_cbl_obs: # Add in step to use obs for CBLS print('Computing Forecast CBLs') - fcst_infiles,yr_fcst = find_input_files(cbl_config, use_init, 'FCST_BLOCKING_ANOMALY_TEMPLATE') + fcst_infiles,yr_fcst,mth_fcst,day_fcst,yr_full_fcst = find_input_files(cbl_config, use_init, 'FCST_BLOCKING_ANOMALY_TEMPLATE') cbls_fcst,lats_fcst,lons_fcst,yr_fcst,mhweight_fcst = steps_fcst.run_CBL(fcst_infiles,yr_fcst) elif ("CBL" in steps_list_fcst) and use_cbl_obs: if not ("CBL" in steps_list_obs): @@ -171,24 +171,26 @@ def main(): if not ("CBL" in steps_list_obs): raise Exception('Must run observed CBLs before running IBLs.') print('Computing Obs IBLs') - obs_infiles, yr_obs = find_input_files(ibl_config, use_init, 'OBS_BLOCKING_TEMPLATE') + obs_infiles,yr_obs,mth_obs,day_obs,yr_full_obs = find_input_files(ibl_config, use_init, 'OBS_BLOCKING_TEMPLATE') ibls_obs = steps_obs.run_Calc_IBL(cbls_obs,obs_infiles,yr_obs) daynum_obs = np.arange(0,len(ibls_obs[0,:,0]),1) elif ("IBL" in steps_list_fcst) and not ("IBL" in steps_list_obs): if (not "CBL" in steps_list_fcst): raise Exception('Must run forecast CBLs or use observed CBLs before running IBLs.') print('Computing Forecast IBLs') - fcst_infiles, yr_fcst = find_input_files(ibl_config, use_init, 'FCST_BLOCKING_TEMPLATE') + fcst_infiles,yr_fcst,mth_fcst,day_fcst,yr_full_fcst = find_input_files(ibl_config, use_init, 'FCST_BLOCKING_TEMPLATE') ibls_fcst = steps_fcst.run_Calc_IBL(cbls_fcst,fcst_infiles,yr_fcst) daynum_fcst = np.arange(0,len(ibls_fcst[0,:,0]),1) elif ("IBL" in steps_list_obs) and ("IBL" in steps_list_fcst): if not ("CBL" in steps_list_obs) and not ("CBL" in steps_list_fcst): raise Exception('Must run observed and forecast CBLs before running IBLs.') - both_infiles, yr_obs = find_input_files(ibl_config, use_init, 'OBS_BLOCKING_TEMPLATE', + both_infiles,yr_obs,mth_obs,day_obs = find_input_files(ibl_config, use_init, 'OBS_BLOCKING_TEMPLATE', secondtemplate='FCST_BLOCKING_TEMPLATE') obs_infiles = both_infiles[0] fcst_infiles = both_infiles[1] yr_fcst = yr_obs + mth_fcst = mth_obs + day_fcst = day_obs print('Computing Obs IBLs') ibls_obs = steps_obs.run_Calc_IBL(cbls_obs,obs_infiles,yr_obs) daynum_obs = np.arange(0,len(ibls_obs[0,:,0]),1) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf index 9c1048445e..8deffbef62 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf @@ -53,4 +53,4 @@ USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE USER_SCRIPT_INPUT_TEMPLATE = init_{init?fmt=%Y%m%d%H%M%S}_valid_{valid?fmt=%Y%m%d%H%M%S}_lead_{lead?fmt=%3H}.{custom} USER_SCRIPT_INPUT_DIR = {METPLUS_BASE}/internal_tests/data/user_script -USER_SCRIPT_COMMAND = {METPLUS_BASE}/ush/drivers/WeatherRegime_driver.py {METPLUS_BASE}/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf dir.INPUT_BASE={INPUT_BASE} dir.OUTPUT_BASE={OUTPUT_BASE} dir.MET_INSTALL_DIR={MET_INSTALL_DIR} +USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf dir.INPUT_BASE={INPUT_BASE} dir.OUTPUT_BASE={OUTPUT_BASE} dir.MET_INSTALL_DIR={MET_INSTALL_DIR} diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/Blocking_WeatherRegime_util.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/Blocking_WeatherRegime_util.py new file mode 100644 index 0000000000..bbf633bad0 --- /dev/null +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/Blocking_WeatherRegime_util.py @@ -0,0 +1,138 @@ +import os +import netCDF4 +import numpy as np +from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence +from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub + +def parse_steps(config_list): + + steps_config_part_fcst = [s for s in config_list if "FCST_STEPS" in s] + steps_list_fcst = [] + + steps_config_part_obs = [s for s in config_list if "OBS_STEPS" in s] + steps_list_obs = [] + + # Setup the Steps + if steps_config_part_fcst: + steps_param_fcst = steps_config_part_fcst[0].split("=")[1] + steps_list_fcst = steps_param_fcst.split("+") + config_list.remove(steps_config_part_fcst[0]) + if steps_config_part_obs: + steps_param_obs = steps_config_part_obs[0].split("=")[1] + steps_list_obs = steps_param_obs.split("+") + config_list.remove(steps_config_part_obs[0]) + + config = pre_run_setup(config_list) + if not steps_config_part_fcst: + steps_param_fcst = config.getstr('config','FCST_STEPS','') + steps_list_fcst = steps_param_fcst.split("+") + if not steps_config_part_obs: + steps_param_obs = config.getstr('config','OBS_STEPS','') + steps_list_obs = steps_param_obs.split("+") + + return steps_list_fcst, steps_list_obs, config_list + + +def find_input_files(inconfig, use_init, intemplate, secondtemplate=''): + loop_time, end_time, time_interval = get_start_end_interval_times(inconfig) + skip_times = get_skip_times(inconfig) + + start_mth = loop_time.strftime('%m') + template = inconfig.getraw('config',intemplate) + if secondtemplate: + template2 = inconfig.getraw('config',secondtemplate) + file_list2 = [] + + file_list = [] + yr_list = [] + mth_list = [] + day_list = [] + yr_full_list = [] + if use_init: + timname = 'init' + else: + timname = 'valid' + input_dict = {} + input_dict['loop_by'] = timname + pmth = start_mth + while loop_time <= end_time: + lead_seq = get_lead_sequence(inconfig) + for ls in lead_seq: + new_time = loop_time + ls + input_dict[timname] = loop_time + input_dict['lead'] = ls + + outtimestuff = ti_calculate(input_dict) + if skip_time(outtimestuff, skip_times): + continue + cmth = outtimestuff['valid'].strftime('%m') + filepath = do_string_sub(template, **outtimestuff) + mth_list.append(cmth) + day_list.append(outtimestuff['valid'].strftime('%d')) + yr_full_list.append(outtimestuff['valid'].strftime('%Y')) + if secondtemplate: + filepath2 = do_string_sub(template2, **outtimestuff) + if os.path.exists(filepath) and os.path.exists(filepath2): + file_list.append(filepath) + file_list2.append(filepath2) + else: + file_list.append('') + file_list2.append('') + else: + if os.path.exists(filepath): + file_list.append(filepath) + else: + file_list.append('') + + if (int(cmth) == int(start_mth)) and (int(pmth) != int(start_mth)): + yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) + pmth = cmth + + loop_time += time_interval + + if secondtemplate: + file_list = [file_list,file_list2] + yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) + + return file_list, yr_list, mth_list, day_list, yr_full_list + +def read_nc_met(infiles,yrlist,invar): + + print("Reading in Data") + + #Find the first non empty file name so I can get the variable sizes + locin = next(sub for sub in infiles if sub) + indata = netCDF4.Dataset(locin) + lats = indata.variables['lat'][:] + lons = indata.variables['lon'][:] + invar_arr = indata.variables[invar][:] + indata.close() + + var_3d = np.empty([len(infiles),len(invar_arr[:,0]),len(invar_arr[0,:])]) + + for i in range(0,len(infiles)): + + #Read in the data + if infiles[i]: + indata = netCDF4.Dataset(infiles[i]) + new_invar = indata.variables[invar][:] + init_time_str = indata.variables[invar].getncattr('init_time') + valid_time_str = indata.variables[invar].getncattr('valid_time') + indata.close() + else: + new_invar = np.empty((1,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) + new_invar[:] = np.nan + var_3d[i,:,:] = new_invar + + yr = np.array(yrlist) + if len(var_3d[:,0,0])%float(len(yrlist)) != 0: + lowval = int(len(var_3d[:,0,0])/float(len(yrlist))) + newarrlen = (lowval+1) * float(len(yrlist)) + arrexp = int(newarrlen - len(var_3d[:,0,0])) + arrfill = np.empty((arrexp,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) + arrfill[:] = np.nan + var_3d = np.append(var_3d,arrfill,axis=0) + sdim = len(var_3d[:,0,0])/float(len(yrlist)) + var_4d = np.reshape(var_3d,[len(yrlist),int(sdim),len(var_3d[0,:,0]),len(var_3d[0,0,:])]) + + return var_4d,lats,lons,yr diff --git a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf similarity index 91% rename from parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf rename to parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf index e4bba90fca..4d8645ed5a 100644 --- a/parm/use_cases/model_applications/s2s/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf @@ -1,8 +1,8 @@ # Blocking METplus Configuration [config] # Steps to Run -#OBS_STEPS = ELBOW+PLOTELBOW+EOF+PLOTTEOF+KMEANS+PLOTKMEANS -OBS_STEPS = EOF+PLOTEOF+KMEANS+PLOTKMEANS +#OBS_STEPS = REGRID+TIMEAVE+ELBOW+PLOTELBOW+EOF+PLOTTEOF+KMEANS+PLOTKMEANS +OBS_STEPS = ELBOW+PLOTELBOW+EOF+PLOTTEOF+KMEANS+PLOTKMEANS # time looping - options are INIT, VALID, RETRO, and REALTIME LOOP_BY = VALID @@ -146,6 +146,17 @@ OBS_NUM_CLUSTERS = 20 # Number of principal components OBS_NUM_PCS = 10 +# Type of Output File for weather regime classification +# options are text or netcdf +#OBS_WR_OUTPUT_FILE_TYPE = text +OBS_WR_OUTPUT_FILE_TYPE = netcdf + +# Name of obs output file +OBS_WR_OUTPUT_FILE = obs_weather_regime_class + +# Weather Regime output file directory +WR_OUTPUT_FILE_DIR = {OUTPUT_BASE}/s2s/WeatherRegime + # Plot output dir WR_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/WeatherRegime/plots/ diff --git a/ush/drivers/WeatherRegime.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime.py similarity index 65% rename from ush/drivers/WeatherRegime.py rename to parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime.py index ed79477193..b317fc681c 100644 --- a/ush/drivers/WeatherRegime.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime.py @@ -3,6 +3,7 @@ from pylab import * from sklearn.cluster import KMeans import scipy +import netCDF4 as nc4 from scipy import stats,signal from numpy import ones,vstack from numpy.linalg import lstsq @@ -19,6 +20,9 @@ def __init__(self,config,label): self.wrnum = config.getint('WeatherRegime',label+'_WR_NUMBER',6) self.numi = config.getint('WeatherRegime',label+'_NUM_CLUSTERS',20) self.NUMPCS = config.getint('WeatherRegime',label+'_NUM_PCS',10) + self.wr_outfile_type = config.getstr('WeatherRegime',label+'_WR_OUTPUT_FILE_TYPE','text') + self.wr_outfile_dir = config.getstr('WeatherRegime','WR_OUTPUT_FILE_DIR','') + self.wr_outfile = config.getstr('WeatherRegime',label+'_WR_OUTPUT_FILE',label+'_WeatherRegime') def get_cluster_fraction(self, m, label): @@ -127,7 +131,7 @@ def reconstruct_heights(self,eof,pc,reshape_arr): return a1 - def run_K_means(self,a1,yr,arr_shape): + def run_K_means(self,a1,yr,mth,day,arr_shape): arrdims = len(arr_shape) @@ -168,27 +172,65 @@ def run_K_means(self,a1,yr,arr_shape): input = input[::-1] #Save Label data [YR,DAY] - #if os.path.isfile(outfile+'.nc'): - # os.remove(outfile+'.nc') - #nc = nc4.Dataset(outfile, 'w') - #nc.createDimension('year', arr_shape[0]) - #nc.createDimension('day', arr_shape[1]) - - #ncyr = nc.createVariable('time','i',('year')) - #nc.variables['time'].long_name = "time" - #nc.variables['time'].standard_name = "time" - #nc.variables['time'].units = "years" + # Make some conversions first + wrc_shape = wrc.shape + yr_1d = np.array(yr) + mth_1d = np.array(mth) + day_1d = np.array(day) + wrc_1d = np.reshape(wrc,len(mth)) + + # netcdf file + if self.wr_outfile_type=='netcdf': + wr_full_outfile = self.wr_outfile_dir+'/'+self.wr_outfile+'.nc' + + if os.path.isfile(wr_full_outfile): + os.remove(wr_full_outfile) + + # Create CF compliant time unit + rdate = datetime.datetime(int(yr_1d[0]),int(mth_1d[0]),int(day_1d[0]),0,0,0) + cf_diffdays = np.zeros(len(yr_1d)) + ymd_arr = np.empty(len(yr_1d)) + for dd in range(len(yr_1d)): + loopdate = datetime.datetime(int(yr_1d[dd]),int(mth_1d[dd]),int(day_1d[dd]),0,0,0) + cf_diffdays[dd] = (loopdate - rdate).days + ymd_arr[dd] = yr_1d[dd]+mth_1d[dd]+day_1d[dd] + + nc = nc4.Dataset(wr_full_outfile, 'w') + nc.createDimension('time', len(mth)) + nc.Conventions = "CF-1.7" + nc.title = "Weather Regime Classification" + nc.institution = "NCAR DTCenter" + nc.source = "Weather Regime METplus use-case" + + ncti = nc.createVariable('time','d',('time')) + nc.variables['time'].long_name = "time" + nc.variables['time'].standard_name = "time" + nc.variables['time'].units = "days since "+rdate.strftime('%Y-%m-%d %H:%M:%S') + nc.variables['time'].calendar = "gregorian" + + ncdate = nc.createVariable('date','i',('time')) + nc.variables['date'].long_name = "date YYYYMMDD" - #ncnum = nc.createVariable('wrnum','i',('year','day'),fill_value=-9999.0) - #nc.variables['wrnum'].long_name = "weather_regime_number" - #nc.variables['wrnum'].standard_name = "weather_regime_number" - #nc.variables['wrnum'].units = "unitless" + ncnum = nc.createVariable('wrnum','i',('time'),fill_value=-9999.0) + nc.variables['wrnum'].long_name = "weather_regime_number" - #ncyr[:,:] = yr - #ncnum[:,:] = wrc - #nc.close() + ncti[:] = cf_diffdays + ncdate[:] = ymd_arr + ncnum[:] = wrc_1d + nc.close() - #np.save('WR_LABELS',wrc) + # text file + if self.wr_outfile_type=='text': + wr_full_outfile = self.wr_outfile_dir+'/'+self.wr_outfile+'.txt' - return input, self.wrnum, perc + if os.path.isfile(wr_full_outfile): + os.remove(wr_full_outfile) + + otdata = np.array([yr_1d, mth_1d, day_1d, wrc_1d]) + otdata = otdata.T + + with open(wr_full_outfile, 'w+') as datafile_id: + np.savetxt(datafile_id, otdata, fmt=['%6s','%3s','%4s','%6s'], header='Year Month Day WeatherRegime') + + return input, self.wrnum, perc diff --git a/ush/drivers/WeatherRegime_driver.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py similarity index 89% rename from ush/drivers/WeatherRegime_driver.py rename to parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py index ca487ef5bc..0189d01924 100755 --- a/ush/drivers/WeatherRegime_driver.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py @@ -6,16 +6,22 @@ import netCDF4 import re -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), - os.pardir,os.pardir))) -sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy_feature_74/metplotpy/contributed/weather_regime") +mp_fpath = os.path.abspath(__file__) +mp_fpath_split = str.split(mp_fpath,os.path.sep) +mp_loc_ind = mp_fpath_split.index('METplus') + +sys.path.insert(0,os.path.sep.join(mp_fpath_split[0:mp_loc_ind+1])) +sys.path.insert(0, os.path.sep.join(mp_fpath_split[0:mp_loc_ind])+"/METplotpy_feature_74") +#sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), +# os.pardir,os.pardir))) +#sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy_feature_74/metplotpy/contributed/weather_regime") from WeatherRegime import WeatherRegimeCalculation from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub, getlist from ush.master_metplus import get_config_inputs_from_command_line from metplus.wrappers import PCPCombineWrapper from metplus.wrappers import RegridDataPlaneWrapper -import plot_weather_regime as pwr +from metplotpy.contributed.weather_regime import plot_weather_regime as pwr from Blocking_WeatherRegime_util import find_input_files, parse_steps, read_nc_met def main(): @@ -79,13 +85,13 @@ def main(): if ("ELBOW" in steps_list_obs) or ("EOF" in steps_list_obs) or ("KMEANS" in steps_list_obs): - obs_infiles, yr_obs = find_input_files(elbow_config, use_init, 'OBS_WR_TEMPLATE') + obs_infiles,yr_obs,mth_obs,day_obs,yr_full_obs = find_input_files(elbow_config, use_init, 'OBS_WR_TEMPLATE') obs_invar = config.getstr('WeatherRegime','OBS_WR_VAR','') z500_obs,lats_obs,lons_obs,year_obs = read_nc_met(obs_infiles,yr_obs,obs_invar) z500_detrend_obs,z500_detrend_2d_obs = steps_obs.weights_detrend(lats_obs,lons_obs,z500_obs) if ("ELBOW" in steps_list_fcst) or ("EOF" in steps_list_fcst) or("KMEANS" in steps_list_fcst): - fcst_infiles,yr_fcst = find_input_files(elbow_config, use_init, 'FCST_WR_TEMPLATE') + fcst_infiles,yr_fcst, mth_fcst,day_fcst,yr_full_fcst = find_input_files(elbow_config, use_init, 'FCST_WR_TEMPLATE') fcst_invar = config.getstr('WeatherRegime','FCST_WR_VAR','') z500_fcst,lats_fcst,lons_fcst,year_fcst = read_nc_met(fcst_infiles,yr_fcst,fcst_invar) z500_detrend_fcst,z500_detrend_2d_fcst = steps_fcst.weights_detrend(lats_fcst,lons_fcst,z500_fcst) @@ -147,11 +153,11 @@ def main(): if ("KMEANS" in steps_list_obs): print('Running Obs K Means') - kmeans_obs,wrnum_obs,perc_obs = steps_obs.run_K_means(z500_detrend_2d_obs,year_obs,z500_obs.shape) + kmeans_obs,wrnum_obs,perc_obs = steps_obs.run_K_means(z500_detrend_2d_obs,yr_full_obs,mth_obs,day_obs,z500_obs.shape) if ("KMEANS" in steps_list_fcst): print('Running Forecast K Means') - kmeans_fcst,wrnum_fcst,perc_fcst = steps_fcst.run_K_means(z500_detrend_2d_fcst,year_fcst,z500_fcst.shape) + kmeans_fcst,wrnum_fcst,perc_fcst = steps_fcst.run_K_means(z500_detrend_2d_fcst,yr_full_fcst,mth_fcst,day_fcst,z500_fcst.shape) if ("PLOTKMEANS" in steps_list_obs): if not ("KMEANS" in steps_list_obs): diff --git a/ush/drivers/Blocking_WeatherRegime_util.py b/ush/drivers/Blocking_WeatherRegime_util.py index 442c334283..bbf633bad0 100644 --- a/ush/drivers/Blocking_WeatherRegime_util.py +++ b/ush/drivers/Blocking_WeatherRegime_util.py @@ -45,6 +45,9 @@ def find_input_files(inconfig, use_init, intemplate, secondtemplate=''): file_list = [] yr_list = [] + mth_list = [] + day_list = [] + yr_full_list = [] if use_init: timname = 'init' else: @@ -64,6 +67,9 @@ def find_input_files(inconfig, use_init, intemplate, secondtemplate=''): continue cmth = outtimestuff['valid'].strftime('%m') filepath = do_string_sub(template, **outtimestuff) + mth_list.append(cmth) + day_list.append(outtimestuff['valid'].strftime('%d')) + yr_full_list.append(outtimestuff['valid'].strftime('%Y')) if secondtemplate: filepath2 = do_string_sub(template2, **outtimestuff) if os.path.exists(filepath) and os.path.exists(filepath2): @@ -88,7 +94,7 @@ def find_input_files(inconfig, use_init, intemplate, secondtemplate=''): file_list = [file_list,file_list2] yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) - return file_list, yr_list + return file_list, yr_list, mth_list, day_list, yr_full_list def read_nc_met(infiles,yrlist,invar): From 76eb4eb493fe7f3b6bfcc0c331889b26ebb6168e Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Thu, 11 Feb 2021 15:32:19 -0700 Subject: [PATCH 40/93] cleanup of drivers directory --- ush/drivers/Blocking_WeatherRegime_util.py | 138 --------------------- 1 file changed, 138 deletions(-) delete mode 100644 ush/drivers/Blocking_WeatherRegime_util.py diff --git a/ush/drivers/Blocking_WeatherRegime_util.py b/ush/drivers/Blocking_WeatherRegime_util.py deleted file mode 100644 index bbf633bad0..0000000000 --- a/ush/drivers/Blocking_WeatherRegime_util.py +++ /dev/null @@ -1,138 +0,0 @@ -import os -import netCDF4 -import numpy as np -from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence -from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub - -def parse_steps(config_list): - - steps_config_part_fcst = [s for s in config_list if "FCST_STEPS" in s] - steps_list_fcst = [] - - steps_config_part_obs = [s for s in config_list if "OBS_STEPS" in s] - steps_list_obs = [] - - # Setup the Steps - if steps_config_part_fcst: - steps_param_fcst = steps_config_part_fcst[0].split("=")[1] - steps_list_fcst = steps_param_fcst.split("+") - config_list.remove(steps_config_part_fcst[0]) - if steps_config_part_obs: - steps_param_obs = steps_config_part_obs[0].split("=")[1] - steps_list_obs = steps_param_obs.split("+") - config_list.remove(steps_config_part_obs[0]) - - config = pre_run_setup(config_list) - if not steps_config_part_fcst: - steps_param_fcst = config.getstr('config','FCST_STEPS','') - steps_list_fcst = steps_param_fcst.split("+") - if not steps_config_part_obs: - steps_param_obs = config.getstr('config','OBS_STEPS','') - steps_list_obs = steps_param_obs.split("+") - - return steps_list_fcst, steps_list_obs, config_list - - -def find_input_files(inconfig, use_init, intemplate, secondtemplate=''): - loop_time, end_time, time_interval = get_start_end_interval_times(inconfig) - skip_times = get_skip_times(inconfig) - - start_mth = loop_time.strftime('%m') - template = inconfig.getraw('config',intemplate) - if secondtemplate: - template2 = inconfig.getraw('config',secondtemplate) - file_list2 = [] - - file_list = [] - yr_list = [] - mth_list = [] - day_list = [] - yr_full_list = [] - if use_init: - timname = 'init' - else: - timname = 'valid' - input_dict = {} - input_dict['loop_by'] = timname - pmth = start_mth - while loop_time <= end_time: - lead_seq = get_lead_sequence(inconfig) - for ls in lead_seq: - new_time = loop_time + ls - input_dict[timname] = loop_time - input_dict['lead'] = ls - - outtimestuff = ti_calculate(input_dict) - if skip_time(outtimestuff, skip_times): - continue - cmth = outtimestuff['valid'].strftime('%m') - filepath = do_string_sub(template, **outtimestuff) - mth_list.append(cmth) - day_list.append(outtimestuff['valid'].strftime('%d')) - yr_full_list.append(outtimestuff['valid'].strftime('%Y')) - if secondtemplate: - filepath2 = do_string_sub(template2, **outtimestuff) - if os.path.exists(filepath) and os.path.exists(filepath2): - file_list.append(filepath) - file_list2.append(filepath2) - else: - file_list.append('') - file_list2.append('') - else: - if os.path.exists(filepath): - file_list.append(filepath) - else: - file_list.append('') - - if (int(cmth) == int(start_mth)) and (int(pmth) != int(start_mth)): - yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) - pmth = cmth - - loop_time += time_interval - - if secondtemplate: - file_list = [file_list,file_list2] - yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) - - return file_list, yr_list, mth_list, day_list, yr_full_list - -def read_nc_met(infiles,yrlist,invar): - - print("Reading in Data") - - #Find the first non empty file name so I can get the variable sizes - locin = next(sub for sub in infiles if sub) - indata = netCDF4.Dataset(locin) - lats = indata.variables['lat'][:] - lons = indata.variables['lon'][:] - invar_arr = indata.variables[invar][:] - indata.close() - - var_3d = np.empty([len(infiles),len(invar_arr[:,0]),len(invar_arr[0,:])]) - - for i in range(0,len(infiles)): - - #Read in the data - if infiles[i]: - indata = netCDF4.Dataset(infiles[i]) - new_invar = indata.variables[invar][:] - init_time_str = indata.variables[invar].getncattr('init_time') - valid_time_str = indata.variables[invar].getncattr('valid_time') - indata.close() - else: - new_invar = np.empty((1,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) - new_invar[:] = np.nan - var_3d[i,:,:] = new_invar - - yr = np.array(yrlist) - if len(var_3d[:,0,0])%float(len(yrlist)) != 0: - lowval = int(len(var_3d[:,0,0])/float(len(yrlist))) - newarrlen = (lowval+1) * float(len(yrlist)) - arrexp = int(newarrlen - len(var_3d[:,0,0])) - arrfill = np.empty((arrexp,len(var_3d[0,:,0]),len(var_3d[0,0,:])),dtype=np.float) - arrfill[:] = np.nan - var_3d = np.append(var_3d,arrfill,axis=0) - sdim = len(var_3d[:,0,0])/float(len(yrlist)) - var_4d = np.reshape(var_3d,[len(yrlist),int(sdim),len(var_3d[0,:,0]),len(var_3d[0,0,:])]) - - return var_4d,lats,lons,yr From 008441065ee62ec95440c7152de0969fe2a619b6 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Thu, 11 Feb 2021 15:48:42 -0700 Subject: [PATCH 41/93] Cleaned up UserScript Files --- .../UserScript_fcstGFS_obsERA_Blocking.conf | 16 +++++++--------- .../Regrid_PCP_fcstGFS_obsERA_Blocking.conf | 2 +- .../UserScript_obsERA_obsOnly_Blocking.conf | 16 +++++++--------- ...serScript_obsERA_obsOnly_WeatherRegime.conf | 18 ++++++++---------- 4 files changed, 23 insertions(+), 29 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf index a29d637a45..22984e6780 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf @@ -5,7 +5,8 @@ # List of applications to run - only UserScript for this case PROCESS_LIST = UserScript - +# !!Note, time looping variables are not set here for this use case +# they are set in the case configuration file # time looping - options are INIT, VALID, RETRO, and REALTIME # If set to INIT or RETRO: # INIT_TIME_FMT, INIT_BEG, INIT_END, and INIT_INCREMENT must also be set @@ -17,22 +18,22 @@ LOOP_BY = VALID # %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. # see www.strftime.org for more information # %Y%m%d%H expands to YYYYMMDDHH -VALID_TIME_FMT = %Y%m%d%H%M%S +VALID_TIME_FMT = %Y%m%d%H # Start time for METplus run - must match VALID_TIME_FMT -VALID_BEG = 20141031093015 +VALID_BEG = 2016010100 # End time for METplus run - must match VALID_TIME_FMT -VALID_END = 20141101093015 +VALID_END = 2018010100 # Increment between METplus runs (in seconds if no units are specified) # Must be >= 60 seconds -VALID_INCREMENT = 12H +VALID_INCREMENT = 86400 # List of forecast leads to process for each run time (init or valid) # In hours if units are not specified # If unset, defaults to 0 (don't loop through forecast leads) -LEAD_SEQ = 0H, 12H, 24H, 120H +LEAD_SEQ = 0 # Order of loops to process data - Options are times, processes # Not relevant if only one item is in the PROCESS_LIST @@ -50,7 +51,4 @@ USER_SCRIPT_CUSTOM_LOOP_LIST = nc USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE -USER_SCRIPT_INPUT_TEMPLATE = init_{init?fmt=%Y%m%d%H%M%S}_valid_{valid?fmt=%Y%m%d%H%M%S}_lead_{lead?fmt=%3H}.{custom} -USER_SCRIPT_INPUT_DIR = {METPLUS_BASE}/internal_tests/data/user_script - USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_driver.py {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Regrid_PCP_fcstGFS_obsERA_Blocking.conf dir.INPUT_BASE={INPUT_BASE} dir.OUTPUT_BASE={OUTPUT_BASE} dir.MET_INSTALL_DIR={MET_INSTALL_DIR} diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Regrid_PCP_fcstGFS_obsERA_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Regrid_PCP_fcstGFS_obsERA_Blocking.conf index 3ace9c66ba..eea7af1387 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Regrid_PCP_fcstGFS_obsERA_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Regrid_PCP_fcstGFS_obsERA_Blocking.conf @@ -1,7 +1,7 @@ # Blocking METplus Configuration [config] # Obs or Forecast -#FCST_STEPS = CBL+IBL+PLOTIBL +#FCST_STEPS = REGRID+TIMEAVE+CBL+IBL+PLOTIBL #OBS_STEPS = REGRID+TIMEAVE+RUNMEAN+ANOMALY+CBL+IBL+PLOTIBL FCST_STEPS = CBL+IBL+PLOTIBL OBS_STEPS = CBL+IBL+PLOTIBL diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf index 9d2b796c24..3829374f6f 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf @@ -5,7 +5,8 @@ # List of applications to run - only UserScript for this case PROCESS_LIST = UserScript - +# !!Note, time looping variables are not set here for this use case +# they are set in the case configuration file # time looping - options are INIT, VALID, RETRO, and REALTIME # If set to INIT or RETRO: # INIT_TIME_FMT, INIT_BEG, INIT_END, and INIT_INCREMENT must also be set @@ -17,22 +18,22 @@ LOOP_BY = VALID # %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. # see www.strftime.org for more information # %Y%m%d%H expands to YYYYMMDDHH -VALID_TIME_FMT = %Y%m%d%H%M%S +VALID_TIME_FMT = %Y%m%d%H # Start time for METplus run - must match VALID_TIME_FMT -VALID_BEG = 20141031093015 +VALID_BEG = 1979120100 # End time for METplus run - must match VALID_TIME_FMT -VALID_END = 20141101093015 +VALID_END = 2017022800 # Increment between METplus runs (in seconds if no units are specified) # Must be >= 60 seconds -VALID_INCREMENT = 12H +VALID_INCREMENT = 86400 # List of forecast leads to process for each run time (init or valid) # In hours if units are not specified # If unset, defaults to 0 (don't loop through forecast leads) -LEAD_SEQ = 0H, 12H, 24H, 120H +LEAD_SEQ = 0 # Order of loops to process data - Options are times, processes # Not relevant if only one item is in the PROCESS_LIST @@ -50,7 +51,4 @@ USER_SCRIPT_CUSTOM_LOOP_LIST = nc USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE -USER_SCRIPT_INPUT_TEMPLATE = init_{init?fmt=%Y%m%d%H%M%S}_valid_{valid?fmt=%Y%m%d%H%M%S}_lead_{lead?fmt=%3H}.{custom} -USER_SCRIPT_INPUT_DIR = {METPLUS_BASE}/internal_tests/data/user_script - USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking.conf dir.INPUT_BASE={INPUT_BASE} dir.OUTPUT_BASE={OUTPUT_BASE} dir.MET_INSTALL_DIR={MET_INSTALL_DIR} diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf index 8deffbef62..68e230ebcc 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf @@ -1,11 +1,12 @@ -# UserScript wrapper example +# UserScript wrapper for Weather Regime Analysis [config] # List of applications to run - only UserScript for this case PROCESS_LIST = UserScript - +# !!Note, time looping variables are not set here for this use case +# they are set in the case configuration file # time looping - options are INIT, VALID, RETRO, and REALTIME # If set to INIT or RETRO: # INIT_TIME_FMT, INIT_BEG, INIT_END, and INIT_INCREMENT must also be set @@ -17,22 +18,22 @@ LOOP_BY = VALID # %Y = 4 digit year, %m = 2 digit month, %d = 2 digit day, etc. # see www.strftime.org for more information # %Y%m%d%H expands to YYYYMMDDHH -VALID_TIME_FMT = %Y%m%d%H%M%S +VALID_TIME_FMT = %Y%m%d%H # Start time for METplus run - must match VALID_TIME_FMT -VALID_BEG = 20141031093015 +VALID_BEG = 1979120100 # End time for METplus run - must match VALID_TIME_FMT -VALID_END = 20141101093015 +VALID_END = 2017022800 # Increment between METplus runs (in seconds if no units are specified) # Must be >= 60 seconds -VALID_INCREMENT = 12H +VALID_INCREMENT = 86400 # List of forecast leads to process for each run time (init or valid) # In hours if units are not specified # If unset, defaults to 0 (don't loop through forecast leads) -LEAD_SEQ = 0H, 12H, 24H, 120H +LEAD_SEQ = 0 # Order of loops to process data - Options are times, processes # Not relevant if only one item is in the PROCESS_LIST @@ -50,7 +51,4 @@ USER_SCRIPT_CUSTOM_LOOP_LIST = nc USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE -USER_SCRIPT_INPUT_TEMPLATE = init_{init?fmt=%Y%m%d%H%M%S}_valid_{valid?fmt=%Y%m%d%H%M%S}_lead_{lead?fmt=%3H}.{custom} -USER_SCRIPT_INPUT_DIR = {METPLUS_BASE}/internal_tests/data/user_script - USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf dir.INPUT_BASE={INPUT_BASE} dir.OUTPUT_BASE={OUTPUT_BASE} dir.MET_INSTALL_DIR={MET_INSTALL_DIR} From cdc7b70e0382648c378871b123634e6abef0b4c4 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Thu, 11 Feb 2021 16:07:41 -0700 Subject: [PATCH 42/93] Updated notes --- .../Regrid_PCP_fcstGFS_obsERA_Blocking.conf | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Regrid_PCP_fcstGFS_obsERA_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Regrid_PCP_fcstGFS_obsERA_Blocking.conf index eea7af1387..f2c782bbb6 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Regrid_PCP_fcstGFS_obsERA_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Regrid_PCP_fcstGFS_obsERA_Blocking.conf @@ -1,6 +1,6 @@ # Blocking METplus Configuration [config] -# Obs or Forecast +# Obs and/or Forecast #FCST_STEPS = REGRID+TIMEAVE+CBL+IBL+PLOTIBL #OBS_STEPS = REGRID+TIMEAVE+RUNMEAN+ANOMALY+CBL+IBL+PLOTIBL FCST_STEPS = CBL+IBL+PLOTIBL @@ -344,19 +344,27 @@ LOOP_BY = VALID VALID_TIME_FMT = %Y%m%d%H +# Valid Begin and End Time to use for CBL calculation CBL_VALID_BEG = 1979120100 CBL_VALID_END = 2017022800 +# Valid Begin and End time to use for IBLs, GIBLs, and Blocks VALID_BEG = 2016010100 VALID_END = 2017123100 +# Valid time Increment VALID_INCREMENT = 86400 # list of forecast leads to process LEAD_SEQ = 0 +# Times to skip in the processing... Use only DJF, skip leap day and first/last +# 2 days due to 5 day averaging SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:1201,1202,0227,0228,0229" +# Use the obs climatology for the calculation of CBL data because the forecast +# does not have a long enough data history. Set to False if not wanting to +# use the obs USE_CBL_OBS = True # Number of model grid points used for a moving average @@ -368,7 +376,7 @@ OBS_SMOOTHING_PTS = {FCST_SMOOTHING_PTS} FCST_LAT_DELTA = -5,0,5 OBS_LAT_DELTA = {FCST_LAT_DELTA} -# +# North-South Limits of data FCST_NORTH_SOUTH_LIMITS = 30 OBS_NORTH_SOUTH_LIMITS = {FCST_NORTH_SOUTH_LIMITS} @@ -415,13 +423,14 @@ OBS_BLOCKING_VAR = Z500 # Plots Output Dir BLOCKING_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/plots/ -#CBL plot title and name +#CBL plot title and output namename OBS_CBL_PLOT_MTHSTR = DJF OBS_CBL_PLOT_OUTPUT_NAME = ERA_CBL_avg -# IBL plot title and name +# IBL plot title and output name IBL_PLOT_TITLE = DJF Instantaneous Blocked Longitude IBL_PLOT_OUTPUT_NAME = FV3_ERA_IBL_Freq_DJF +# IBL plot legend for forecast and obs IBL_PLOT_OBS_LABEL = ERA Reanalysis IBL_PLOT_FCST_LABEL = GEFS From 16c71cbc34ba24e5409f279285046fe8be1e3e56 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Mon, 8 Mar 2021 21:52:35 -0700 Subject: [PATCH 43/93] Testing whether data is working --- .../s2s/UserScript_fcstGFS_obsERA_Blocking.py | 9 +- .../s2s/UserScript_obsERA_obsOnly_Blocking.py | 8 +- ...UserScript_obsERA_obsOnly_WeatherRegime.py | 11 +- internal_tests/use_cases/all_use_cases.txt | 3 + .../UserScript_fcstGFS_obsERA_Blocking.conf | 315 +++++++++++++++++- .../Blocking_fcstGFS_obsERA.conf | 115 +++++++ ...rid_PCP_fcstGFS_obsERA_Blocking_orig.conf} | 0 .../UserScript_obsERA_obsOnly_Blocking.conf | 174 +++++++++- .../Blocking_driver.py | 74 ++-- .../Regrid_PCP_obsERA_obsOnly_Blocking.conf | 209 +----------- ...grid_PCP_obsERA_obsOnly_Blocking_orig.conf | 272 +++++++++++++++ ...erScript_obsERA_obsOnly_WeatherRegime.conf | 112 ++++++- ...grid_PCP_obsERA_obsOnly_WeatherRegime.conf | 179 ---------- .../WeatherRegime_driver.py | 36 +- .../WeatherRegime_obsERA_obsOnly.conf | 76 +++++ 15 files changed, 1117 insertions(+), 476 deletions(-) create mode 100644 parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_fcstGFS_obsERA.conf rename parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/{Regrid_PCP_fcstGFS_obsERA_Blocking.conf => Regrid_PCP_fcstGFS_obsERA_Blocking_orig.conf} (100%) create mode 100644 parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking_orig.conf delete mode 100644 parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf create mode 100644 parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_obsERA_obsOnly.conf diff --git a/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py b/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py index ecb1ffe125..0ebed36053 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py +++ b/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py @@ -32,10 +32,13 @@ # (TIMEAVE), computing a running mean (RMEAN), computing anomalies (ANOMALY), computing CBLs # (CBL), plotting CBLs (PLOTCBL), computing IBLs (IBL), plotting IBL frequency (PLOTIBL), # computing GIBLs (GIBL), computing blocks (CALCBLOCKS), and plotting the blocking frequency -# (PLOTBLOCKS). The steps are listed in a .conf file and are formatted as follows: +# (PLOTBLOCKS). Regridding, time averaging, running means, and anomaloies are set up in the +# UserScript .conf file and are formatted as follows: +# PROCESS_LIST = RegridDataPlane(regrid_fcst), RegridDataPlane(regrid_obs), PcpCombine(daily_mean_fcst), PcpCombine(daily_mean_obs), PcpCombine(running_mean_obs), PcpCombine(anomaly_obs), UserScript(script_blocking) # -# FCST_STEPS = REGRID+TIMEAVE+CBL+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS -# OBS_STEPS = REGRID+TIMEAVE+RUNMEAN+ANOMALY+CBL+PLOTCBL+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS +# The other steps are listed in the Blocking .conf file and are formatted as follows: +# FCST_STEPS = CBL+IBL+PLOTIBL +# OBS_STEPS = CBL+PLOTCBL+IBL+PLOTIBL ############################################################################## # METplus Workflow diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py index 845a1e9606..a21e8b3306 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py +++ b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py @@ -32,9 +32,13 @@ # (TIMEAVE), computing a running mean (RMEAN), computing anomalies (ANOMALY), computing CBLs # (CBL), plotting CBLs (PLOTCBL), computing IBLs (IBL), plotting IBL frequency (PLOTIBL), # computing GIBLs (GIBL), computing blocks (CALCBLOCKS), and plotting the blocking frequency -# (PLOTBLOCKS). The steps are listed in a .conf file and are formatted as follows: +# (PLOTBLOCKS). Regridding, time averaging, running means, and anomaloies are set up in the +# UserScript .conf file and are formatted as follows: +# PROCESS_LIST = RegridDataPlane(regrid_obs), PcpCombine(daily_mean_obs), PcpCombine(running_mean_obs), PcpCombine(anomaly_obs), UserScript(script_blocking) +# +# The other steps are listed in the Blocking .conf file and are formatted as follows: +# OBS_STEPS = CBL+PLOTCBL+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS # -# OBS_STEPS = REGRID+TIMEAVE+RUNMEAN+ANOMALY+CBL+PLOTCBL+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS ############################################################################## # METplus Workflow diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py index 5aef866fc2..bb46ad8e1b 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py +++ b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py @@ -13,7 +13,8 @@ # -------------------- # # To perform a weather regime analysis using 500 mb height data. There are 3 -# steps in the weather regime analysis, elbow, EOFs, and K means. +# steps in the weather regime analysis, elbow, EOFs, and K means, and 2 pre- +# processing steps, RegridDataPlane and PcpCombine. ############################################################################## # Datasets @@ -30,9 +31,13 @@ # lists in STEPS_OBS. The possible steps are regridding (REGRID), time averaging # (TIMEAVE), computing the elbow (ELBOW), plotting the elbow (PLOTELBOW), computing # EOFs (EOF), plotting EOFs (PLOTEOF), computing K means (KMEANS), and plotting the -# K means (PLOTKMEANS). The steps are listed in a .conf file and are formatted as follows: +# K means (PLOTKMEANS). Regridding and time averaging are set up in the UserScript +# .conf file and are formatted as follows: +# PROCESS_LIST = RegridDataPlane(regrid_obs), PcpCombine(daily_mean_obs), UserScript(script_wr) # -# OBS_STEPS = REGRID+TIMEAVE+ELBOW+PLOTELBOW+EOF+PLOTEOF+KMEANS+PLOTKMEANS +# The other steps are listed in the weather regime analsysis .conf file +# in the following format: +# OBS_STEPS = ELBOW+PLOTELBOW+EOF+PLOTEOF+KMEANS+PLOTKMEANS ############################################################################## # METplus Workflow diff --git a/internal_tests/use_cases/all_use_cases.txt b/internal_tests/use_cases/all_use_cases.txt index 44c1a63156..82e4fd067f 100644 --- a/internal_tests/use_cases/all_use_cases.txt +++ b/internal_tests/use_cases/all_use_cases.txt @@ -93,6 +93,9 @@ MTD_fcstHRRR-TLE_obsMRMS:: model_applications/precipitation/MTD_fcstHRRR-TLE_obs Category: s2s GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast:: model_applications/s2s/GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast.conf::netCDF4 +UserScript_fcstGFS_obsERA_Blocking:: model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf,user_env_vars.MET_PYTHON_EXE=python3::metplotpy,metcalcpy +UserScript_obsERA_obsOnly_Blocking:: model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf,user_env_vars.MET_PYTHON_EXE=python3::metplotpy,metcalcpy +UserScript_obsERA_obsOnly_WeatherRegime:: model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf,user_env_vars.MET_PYTHON_EXE=python3::metplotpy,metcalcpy Category: space_weather GridStat_fcstGloTEC_obsGloTEC_vx7:: model_applications/space_weather/GridStat_fcstGloTEC_obsGloTEC_vx7.conf diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf index 22984e6780..47ca3bf657 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf @@ -1,12 +1,11 @@ # UserScript wrapper example [config] +# List of applications to run - Pre-Processing and Blocking Script +# PROCESS_LIST = RegridDataPlane(regrid_fcst), RegridDataPlane(regrid_obs), PcpCombine(daily_mean_fcst), PcpCombine(daily_mean_obs), PcpCombine(running_mean_obs), PcpCombine(anomaly_obs), UserScript(script_blocking) +# List of applications to run - Omit Pre-Processing Steps +PROCESS_LIST = UserScript(script_blocking) -# List of applications to run - only UserScript for this case -PROCESS_LIST = UserScript - -# !!Note, time looping variables are not set here for this use case -# they are set in the case configuration file # time looping - options are INIT, VALID, RETRO, and REALTIME # If set to INIT or RETRO: # INIT_TIME_FMT, INIT_BEG, INIT_END, and INIT_INCREMENT must also be set @@ -35,6 +34,9 @@ VALID_INCREMENT = 86400 # If unset, defaults to 0 (don't loop through forecast leads) LEAD_SEQ = 0 +# Only Process DJF +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" + # Order of loops to process data - Options are times, processes # Not relevant if only one item is in the PROCESS_LIST # times = run all wrappers in the PROCESS_LIST for a single run time, then @@ -45,10 +47,307 @@ LEAD_SEQ = 0 # wrappers have been run LOOP_ORDER = processes -# list of strings to loop over for each run time. -# value for each item can be referenced in filename templates with {custom?fmt=%s} +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + + +# Forecast Regridding to 1 degree using regrid_data_plane +[regrid_fcst] +# time looping - options are INIT, VALID, RETRO, and REALTIME +LOOP_BY = INIT + +# Format of INIT_BEG and INIT_END +INIT_TIME_FMT = %Y%m%d%H + +# Start time for METplus run +INIT_BEG = 2016010100 + +# End time for METplus run +INIT_END = 2018010100 + +# Increment between METplus runs in seconds. Must be >= 60 +INIT_INCREMENT = 86400 + +# list of forecast leads to process +LEAD_SEQ = 0, 3, 6, 9, 12, 15, 18, 21, 24 + +# REGRID_DATA_PLANE (Step 1) +# Run regrid_data_plane on forecast data +FCST_REGRID_DATA_PLANE_RUN = True + +# If true, process each field individually and write a file for each +# If false, run once per run time passing in all fields specified +FCST_DATA_PLANE_ONCE_PER_FIELD = False + +# Name of input field to process +FCST_REGRID_DATA_PLANE_VAR1_INPUT_FIELD_NAME = HGT + +# Level of input field to process +FCST_REGRID_DATA_PLANE_VAR1_INPUT_LEVEL = P500 + +# Name of output field to create +FCST_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = Z500 + +# Mask to use for regridding +REGRID_DATA_PLANE_VERIF_GRID = latlon 360 90 89 0 -1.0 1.0 + +# Method to run regrid_data_plane, not setting this will default to NEAREST +REGRID_DATA_PLANE_METHOD = BILIN + +# Regridding width used in regrid_data_plane, not setting this will default to 1 +REGRID_DATA_PLANE_WIDTH = 2 + +# input and output data directories for each application in PROCESS_LIST +FCST_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/p/ral/jntp/GMTB/Phys_Test_FV3GFSv2/POST/suite1/ +FCST_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/FV3GFS/Regrid + +# format of filenames +# Input ERA Interim +FCST_REGRID_DATA_PLANE_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/gfs.t00z.pgrb2.0p25.f{lead?fmt=%HHH} +FCST_REGRID_DATA_PLANE_OUTPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc + + +# Observation Regridding to 1 degree using regrid_data_plane +[regrid_obs] +# time looping - options are INIT, VALID, RETRO, and REALTIME +LOOP_BY = VALID + +# Format of INIT_BEG and INIT_END +VALID_TIME_FMT = %Y%m%d%H + +# Start time for METplus run +VALID_BEG = 1979120100 + +# End time for METplus run +VALID_END = 2017022818 + +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 21600 + +# list of forecast leads to process +LEAD_SEQ = 0 + +# Run regrid_data_plane on forecast data +OBS_REGRID_DATA_PLANE_RUN = True + +# If true, process each field individually and write a file for each +# If false, run once per run time passing in all fields specified +OBS_DATA_PLANE_ONCE_PER_FIELD = False + +# Name of input field to process +OBS_REGRID_DATA_PLANE_VAR1_INPUT_FIELD_NAME = Z + +# Level of input field to process +OBS_REGRID_DATA_PLANE_VAR1_INPUT_LEVEL = P500 + +# Name of output field to create +OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = Z500 + +# Mask to use for regridding +REGRID_DATA_PLANE_VERIF_GRID = latlon 360 90 89 0 -1.0 1.0 + +# Method to run regrid_data_plane, not setting this will default to NEAREST +REGRID_DATA_PLANE_METHOD = BILIN + +# Regridding width used in regrid_data_plane, not setting this will default to 1 +REGRID_DATA_PLANE_WIDTH = 2 + +# input and output data directories for each application in PROCESS_LIST +OBS_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds627.0/ei.oper.an.pl +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Regrid + +# format of filenames +# Input ERA Interim +OBS_REGRID_DATA_PLANE_INPUT_TEMPLATE = {valid?fmt=%Y%m}/ei.oper.an.pl.regn128sc.{valid?fmt=%Y%m%d%H} +OBS_REGRID_DATA_PLANE_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{init?fmt=%Y%m%d%H}_NH.nc + + +# Perform a sum over the daily forecast lead times that have been regridded using pcp_combine +[daily_mean_fcst] +# time looping - options are INIT, VALID, RETRO, and REALTIME +LOOP_BY = INIT + +# Format of INIT_BEG and INIT_END +INIT_TIME_FMT = %Y%m%d%H + +# Start time for METplus run +INIT_BEG = 2016010100 + +# End time for METplus run +INIT_END = 2018010100 + +# Increment between METplus runs in seconds. Must be >= 60 +INIT_INCREMENT = 86400 + +# list of forecast leads to process +LEAD_SEQ = 0 + +# run pcp_combine on obs data +FCST_PCP_COMBINE_RUN = True + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, DERIVE, and USER_DEFINED +FCST_PCP_COMBINE_METHOD = USER_DEFINED + +# User defined pcp_combine command +FCST_PCP_COMBINE_COMMAND = -derive MEAN {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=75600}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=64800}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=54000}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=43200}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=32400}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=21600}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=10800}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc -field 'name="Z500"; level="(*,*)"; convert(x) = x / 9.81; set_attr_valid = "{init?fmt=%Y%m%d_%H%M%S}";' + +# input and output data directories for each application in PROCESS_LIST +FCST_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/FV3GFS/Regrid +FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/FV3GFS/Daily + +# Input ERA Interim +FCST_PCP_COMBINE_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc +FCST_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_daily_{init?fmt=%Y%m%d}_NH.nc + + +# Perform a sum over the 4 daily times that have been regridded using pcp_combine +# 00, 06, 12, 18 UTC +[daily_mean_obs] +# time looping - options are INIT, VALID, RETRO, and REALTIME +LOOP_BY = VALID + +# Format of INIT_BEG and INIT_END +VALID_TIME_FMT = %Y%m%d%H + +# Start time for METplus run +VALID_BEG = 1979120118 + +# End time for METplus run +VALID_END = 2017022818 + +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 86400 + +# run pcp_combine on obs data +OBS_PCP_COMBINE_RUN = True + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, and DERIVE +OBS_PCP_COMBINE_METHOD = DERIVE +OBS_PCP_COMBINE_STAT_LIST = MEAN + +# field name and level of 1 hr accumulation in forecast files +OBS_PCP_COMBINE_INPUT_ACCUMS = 6 +OBS_PCP_COMBINE_INPUT_NAMES = Z500 +OBS_PCP_COMBINE_INPUT_LEVELS = "(*,*)" +OBS_PCP_COMBINE_INPUT_OPTIONS = convert(x) = x / 9.81; set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S?shift=-64800}"; + +# Convert output and set 24 hours as the accumulation +OBS_PCP_COMBINE_OUTPUT_NAME = Z500 +OBS_PCP_COMBINE_OUTPUT_ACCUM = 24 +OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 + +# input and output data directories for each application in PROCESS_LIST +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Regrid +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Daily + +# Input ERA Interim +OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc +OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d?shift=-64800}_NH.nc + + +# Perform a 5 day running mean on the data using pcp_combine +[running_mean_obs] +# time looping - options are INIT, VALID, RETRO, and REALTIME +LOOP_BY = VALID + +# Format of INIT_BEG and INIT_END +VALID_TIME_FMT = %Y%m%d%H + +# Start time for METplus run +VALID_BEG = 1979120100 + +# End time for METplus run +VALID_END = 2017022800 + +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 86400 + +# Add the first/last 2 days to the skip times to compute the running mean +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:1201,1202,0227,0228,0229" + +# run pcp_combine on obs data +OBS_PCP_COMBINE_RUN = TRUE + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, and DERIVE +OBS_PCP_COMBINE_METHOD = DERIVE +OBS_PCP_COMBINE_STAT_LIST = MEAN + +# field name, level and setting time attribute of 1 hr accumulation in forecast files +OBS_PCP_COMBINE_INPUT_ACCUMS = 24 +OBS_PCP_COMBINE_INPUT_NAMES = Z500 +OBS_PCP_COMBINE_INPUT_LEVELS = "(*,*)" +OBS_PCP_COMBINE_INPUT_OPTIONS = set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S?shift=-172800}"; + +# Set output variable name +OBS_PCP_COMBINE_OUTPUT_NAME = Z500 + +# Running mean is 5 days +OBS_PCP_COMBINE_OUTPUT_ACCUM = 120 +OBS_PCP_COMBINE_DERIVE_LOOKBACK = 120 + +# input and output data directories for each application in PROCESS_LIST +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Daily +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Rmean5d + +# format of filenames +# Input ERA Interim +OBS_PCP_COMBINE_INPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_5daymean_{valid?fmt=%Y%m%d?shift=-172800}_NH.nc + + +# Compute anomalies using the daily means and 5 day running mean using pcp_combine +[anomaly_obs] +# time looping - options are INIT, VALID, RETRO, and REALTIME +LOOP_BY = VALID + +# Format of INIT_BEG and INIT_END +VALID_TIME_FMT = %Y%m%d%H + +# Start time for METplus run +VALID_BEG = 1979120100 + +# End time for METplus run +VALID_END = 2017022800 + +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 86400 + +# list of forecast leads to process +LEAD_SEQ = 0 + +# Add the first/last 2 days to the skip times to compute the running mean +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:1201,1202,0227,0228,0229" + +# run pcp_combine on obs data +OBS_PCP_COMBINE_RUN = True + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, DERIVE, and USER_DEFINED +OBS_PCP_COMBINE_METHOD = USER_DEFINED + +# User defined pcp_combine command +OBS_PCP_COMBINE_COMMAND = -subtract {OBS_PCP_COMBINE_INPUT_DIR}/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc {OBS_PCP_COMBINE_INPUT_DIR}/Rmean5d/Z500_5daymean_{valid?fmt=%Y%m%d}_NH.nc -field 'name="Z500"; level="(*,*)";' + +# input and output data directories for each application in PROCESS_LIST +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Anomaly + +# format of filenames +# Input ERA Interim +OBS_PCP_COMBINE_INPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc + + +# Run the Blocking Analysis Script +[script_blocking] +# Blocking script information USER_SCRIPT_CUSTOM_LOOP_LIST = nc +# Run the user script once USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE -USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_driver.py {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Regrid_PCP_fcstGFS_obsERA_Blocking.conf dir.INPUT_BASE={INPUT_BASE} dir.OUTPUT_BASE={OUTPUT_BASE} dir.MET_INSTALL_DIR={MET_INSTALL_DIR} +# Command to run the user script with input configuration file +USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_driver.py {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_fcstGFS_obsERA.conf dir.INPUT_BASE={INPUT_BASE} dir.OUTPUT_BASE={OUTPUT_BASE} dir.MET_INSTALL_DIR={MET_INSTALL_DIR} diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_fcstGFS_obsERA.conf b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_fcstGFS_obsERA.conf new file mode 100644 index 0000000000..a95ef12463 --- /dev/null +++ b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_fcstGFS_obsERA.conf @@ -0,0 +1,115 @@ +# Blocking METplus Configuration +[config] +# Obs and/or Forecast +FCST_STEPS = CBL+IBL+PLOTIBL +OBS_STEPS = CBL+IBL+PLOTIBL + +# time looping - options are INIT, VALID, RETRO, and REALTIME +LOOP_BY = VALID + +# Format of INIT_BEG and INIT_END +VALID_TIME_FMT = %Y%m%d%H + +# Valid Begin and End Time to use for CBL calculation +CBL_VALID_BEG = 1979120100 +CBL_VALID_END = 2017022800 + +# Valid Begin and End time to use for IBLs, GIBLs, and Blocks +VALID_BEG = 2016010100 +VALID_END = 2017123100 + +# Valid time Increment +VALID_INCREMENT = 86400 + +# list of forecast leads to process +LEAD_SEQ = 0 + +# Times to skip in the processing... Use only DJF +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" + +# Options are times, processes +# times = run all items in the PROCESS_LIST for a single initialization +# time, then repeat until all times have been evaluated. +# processes = run each item in the PROCESS_LIST for all times +# specified, then repeat for the next item in the PROCESS_LIST. +LOOP_ORDER = processes + + +# Variables specific to the Blocking analysis +[Blocking] +# Valid Begin and End Time to use for CBL calculation +CBL_VALID_BEG = 1979120100 +CBL_VALID_END = 2017022800 + +# Use the obs climatology for the calculation of CBL data because the forecast +# does not have a long enough data history. Set to False if not wanting to +# use the obs +USE_CBL_OBS = True + +# Directory for the Z500 anomaly data to read in to the blocking python code +OBS_BLOCKING_ANOMALY_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc + +# Variable Name for the Z500 anomaly data to read in to the blocking python code +FCST_BLOCKING_ANOMALY_VAR = Z500_P500 +OBS_BLOCKING_ANOMALY_VAR = Z500_ANA + +# Directory for the Z500 data to read in to the blocking python code +FCST_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/FV3GFS/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc + +# Variable for the Z500 data +FCST_BLOCKING_VAR = Z500_NA_MEAN +OBS_BLOCKING_VAR = Z500 + +# Number of model grid points used for a moving average +# Must be odd +FCST_SMOOTHING_PTS = 9 +OBS_SMOOTHING_PTS = {FCST_SMOOTHING_PTS} + +# Lat Delta +FCST_LAT_DELTA = -5,0,5 +OBS_LAT_DELTA = {FCST_LAT_DELTA} + +# North-South Limits of data +FCST_NORTH_SOUTH_LIMITS = 30 +OBS_NORTH_SOUTH_LIMITS = {FCST_NORTH_SOUTH_LIMITS} + +# Maximum number of grid points between IBLs for everything in between to be included as an IBL +FCST_IBL_DIST = 7 +OBS_IBL_DIST = {FCST_IBL_DIST} + +# Number of grid points in and IBL to make a GIBL +FCST_IBL_IN_GIBL = 15 +OBS_IBL_IN_GIBL = {FCST_IBL_IN_GIBL} + +# Overlap across days for a GIBL +FCST_GIBL_OVERLAP = 10 +OBS_GIBL_OVERLAP = {FCST_GIBL_OVERLAP} + +# Time duration needed for a block +FCST_BLOCK_TIME = 5 +OBS_BLOCK_TIME = {FCST_BLOCK_TIME} + +# Number of grid points a block must travel to terminate +FCST_BLOCK_TRAVEL = 45 +OBS_BLOCK_TRAVEL = {FCST_BLOCK_TRAVEL} + +# Method to compute blocking. Currently, the only option is 'PH' for the +# Pelly-Hoskins Method +FCST_BLOCK_METHOD = PH +OBS_BLOCK_METHOD = {FCST_BLOCK_METHOD} + +# Plots Output Dir +BLOCKING_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/plots/ + +#CBL plot title and output namename +OBS_CBL_PLOT_MTHSTR = DJF +OBS_CBL_PLOT_OUTPUT_NAME = ERA_CBL_avg + +# IBL plot title and output name +IBL_PLOT_TITLE = DJF Instantaneous Blocked Longitude +IBL_PLOT_OUTPUT_NAME = FV3_ERA_IBL_Freq_DJF + +# IBL plot legend for forecast and obs +IBL_PLOT_OBS_LABEL = ERA Reanalysis +IBL_PLOT_FCST_LABEL = GEFS diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Regrid_PCP_fcstGFS_obsERA_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Regrid_PCP_fcstGFS_obsERA_Blocking_orig.conf similarity index 100% rename from parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Regrid_PCP_fcstGFS_obsERA_Blocking.conf rename to parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Regrid_PCP_fcstGFS_obsERA_Blocking_orig.conf diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf index 3829374f6f..9b23aa2402 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf @@ -1,12 +1,11 @@ # UserScript wrapper example [config] +# All steps, including pre-processing: +#PROCESS_LIST = RegridDataPlane(regrid_obs), PcpCombine(daily_mean_obs), PcpCombine(running_mean_obs), PcpCombine(anomaly_obs), UserScript(script_blocking) +# Only Blocking Analysis script for the observations +PROCESS_LIST = UserScript(script_blocking) -# List of applications to run - only UserScript for this case -PROCESS_LIST = UserScript - -# !!Note, time looping variables are not set here for this use case -# they are set in the case configuration file # time looping - options are INIT, VALID, RETRO, and REALTIME # If set to INIT or RETRO: # INIT_TIME_FMT, INIT_BEG, INIT_END, and INIT_INCREMENT must also be set @@ -20,14 +19,13 @@ LOOP_BY = VALID # %Y%m%d%H expands to YYYYMMDDHH VALID_TIME_FMT = %Y%m%d%H -# Start time for METplus run - must match VALID_TIME_FMT +# Start time for METplus run VALID_BEG = 1979120100 -# End time for METplus run - must match VALID_TIME_FMT +# End time for METplus run VALID_END = 2017022800 -# Increment between METplus runs (in seconds if no units are specified) -# Must be >= 60 seconds +# Increment between METplus runs in seconds. Must be >= 60 VALID_INCREMENT = 86400 # List of forecast leads to process for each run time (init or valid) @@ -35,6 +33,9 @@ VALID_INCREMENT = 86400 # If unset, defaults to 0 (don't loop through forecast leads) LEAD_SEQ = 0 +# Only Process DJF +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" + # Order of loops to process data - Options are times, processes # Not relevant if only one item is in the PROCESS_LIST # times = run all wrappers in the PROCESS_LIST for a single run time, then @@ -45,10 +46,165 @@ LEAD_SEQ = 0 # wrappers have been run LOOP_ORDER = processes +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + +# Run the obs data +# A variable set to be used in the pre-processing steps +OBS_RUN = True + + +# Regrid the observations to 1 degree using regrid_data_plane +[regrid_obs] +# End time for METplus run +VALID_END = 2017022818 + +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 21600 + +# Run regrid_data_plane on forecast data +OBS_REGRID_DATA_PLANE_RUN = {OBS_RUN} + +# If true, process each field individually and write a file for each +# If false, run once per run time passing in all fields specified +OBS_DATA_PLANE_ONCE_PER_FIELD = False + +# Name of input field to process +OBS_REGRID_DATA_PLANE_VAR1_INPUT_FIELD_NAME = Z + +# Level of input field to process +OBS_REGRID_DATA_PLANE_VAR1_INPUT_LEVEL = P500 + +# Name of output field to create +OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = Z500 + +# Mask to use for regridding +REGRID_DATA_PLANE_VERIF_GRID = latlon 360 90 89 0 -1.0 1.0 + +# Method to run regrid_data_plane, not setting this will default to NEAREST +REGRID_DATA_PLANE_METHOD = BILIN + +# Regridding width used in regrid_data_plane, not setting this will default to 1 +REGRID_DATA_PLANE_WIDTH = 2 + +# input and output data directories for each application in PROCESS_LIST +OBS_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds627.0/ei.oper.an.pl +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Regrid + +# format of filenames +# Input ERA Interim +OBS_REGRID_DATA_PLANE_INPUT_TEMPLATE = {valid?fmt=%Y%m}/ei.oper.an.pl.regn128sc.{valid?fmt=%Y%m%d%H} +OBS_REGRID_DATA_PLANE_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{init?fmt=%Y%m%d%H}_NH.nc + + +# Perform a sum over the 4 daily times that have been regridded using pcp_combine +# 00, 06, 12, 18 UTC +[daily_mean_obs] +# Start time for METplus run +VALID_BEG = 1979120118 + +# End time for METplus run +VALID_END = 2017022818 + +# run pcp_combine on obs data +OBS_PCP_COMBINE_RUN = {OBS_RUN} + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, DERIVE, and USER_DEFINED +OBS_PCP_COMBINE_METHOD = DERIVE +OBS_PCP_COMBINE_STAT_LIST = MEAN + +# field name and level of 1 hr accumulation in forecast files +OBS_PCP_COMBINE_INPUT_ACCUMS = 6 +OBS_PCP_COMBINE_INPUT_NAMES = Z500 +OBS_PCP_COMBINE_INPUT_LEVELS = "(*,*)" +OBS_PCP_COMBINE_INPUT_OPTIONS = convert(x) = x / 9.81; set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S?shift=-64800}"; + +# Convert output and set 24 hours as the accumulation +OBS_PCP_COMBINE_OUTPUT_ACCUM = 24 +OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 + +# Name output variable Z500 +OBS_PCP_COMBINE_OUTPUT_NAME = Z500 + +# Input and output Data directories for each application in PROCESS_LIST +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Regrid +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Daily + +# Input and Output filename templates, ERA Interim +OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc +OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d?shift=-64800}_NH.nc + + +# Perform a 5 day running mean on the data using pcp_combine +[running_mean_obs] +# Add the first/last 2 days to the skip times to compute the running mean +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:1201,1202,1203,1204,0229" + +# run pcp_combine on obs data +OBS_PCP_COMBINE_RUN = {OBS_RUN} + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, DERIVE, and USER_DEFINED +OBS_PCP_COMBINE_METHOD = DERIVE +OBS_PCP_COMBINE_STAT_LIST = MEAN + +# field name, level and setting time attribute of 1 hr accumulation in forecast files +OBS_PCP_COMBINE_INPUT_ACCUMS = 24 +OBS_PCP_COMBINE_INPUT_NAMES = Z500 +OBS_PCP_COMBINE_INPUT_LEVELS = "(*,*)" +OBS_PCP_COMBINE_INPUT_OPTIONS = set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S?shift=-172800}"; + +# Running mean is 5 days +OBS_PCP_COMBINE_OUTPUT_ACCUM = 120 +OBS_PCP_COMBINE_DERIVE_LOOKBACK = 120 + +# Set output variable name +OBS_PCP_COMBINE_OUTPUT_NAME = Z500 + +# input and output data directories for each application in PROCESS_LIST +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Daily +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Rmean5d + +# format of filenames +# Input ERA Interim +OBS_PCP_COMBINE_INPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_5daymean_{valid?fmt=%Y%m%d?shift=-172800}_NH.nc + + +# Compute anomalies using the daily means and 5 day running mean using pcp_combine +[anomaly_obs] +# Add the first/last 2 days to the skip times to compute the running mean +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:1201,1202,0227,0228,0229" + +# run pcp_combine on obs data +OBS_PCP_COMBINE_RUN = {OBS_RUN} + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, DERIVE, and USER_DEFINED +OBS_PCP_COMBINE_METHOD = USER_DEFINED + +# User defined pcp_combine command +OBS_PCP_COMBINE_COMMAND = -subtract {OBS_PCP_COMBINE_INPUT_DIR}/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc {OBS_PCP_COMBINE_INPUT_DIR}/Rmean5d/Z500_5daymean_{valid?fmt=%Y%m%d}_NH.nc -field 'name="Z500"; level="(*,*)";' + +# input and output data directories for each application in PROCESS_LIST +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Anomaly + +# format of filenames +# Input ERA Interim +OBS_PCP_COMBINE_INPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc + + +# Run the Blocking Analysis Script +[script_blocking] # list of strings to loop over for each run time. # value for each item can be referenced in filename templates with {custom?fmt=%s} USER_SCRIPT_CUSTOM_LOOP_LIST = nc +# Run the user script once USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE +# Command to run the user script with input configuration file USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking.conf dir.INPUT_BASE={INPUT_BASE} dir.OUTPUT_BASE={OUTPUT_BASE} dir.MET_INSTALL_DIR={MET_INSTALL_DIR} diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py index 4bd31f95ee..87a5b8f57b 100755 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 - import sys import os import numpy as np @@ -16,15 +15,16 @@ from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub from ush.master_metplus import get_config_inputs_from_command_line -from metplus.wrappers import PCPCombineWrapper -from metplus.wrappers import RegridDataPlaneWrapper +#from metplus.wrappers import PCPCombineWrapper +#from metplus.wrappers import RegridDataPlaneWrapper from metplotpy.blocking_s2s import plot_blocking as pb from metplotpy.contributed.blocking_s2s.CBL_plot import create_cbl_plot from Blocking_WeatherRegime_util import find_input_files, parse_steps def main(): - all_steps = ["REGRID","TIMEAVE","RUNMEAN","ANOMALY","CBL","PLOTCBL","IBL","PLOTIBL","GIBL","CALCBLOCKS","PLOTBLOCKS"] + #all_steps = ["REGRID","TIMEAVE","RUNMEAN","ANOMALY","CBL","PLOTCBL","IBL","PLOTIBL","GIBL","CALCBLOCKS","PLOTBLOCKS"] + all_steps = ["CBL","PLOTCBL","IBL","PLOTIBL","GIBL","CALCBLOCKS","PLOTBLOCKS"] inconfig_list = get_config_inputs_from_command_line() steps_list_fcst,steps_list_obs,config_list = parse_steps(inconfig_list) @@ -39,48 +39,48 @@ def main(): # Pre-Process Data: ###################################################################### # Regrid - if ("REGRID" in steps_list_obs): - print('Regridding Observations') - regrid_config = config_metplus.replace_config_from_section(config, 'regrid_obs') - RegridDataPlaneWrapper(regrid_config).run_all_times() + #if ("REGRID" in steps_list_obs): + # print('Regridding Observations') + # regrid_config = config_metplus.replace_config_from_section(config, 'regrid_obs') + # RegridDataPlaneWrapper(regrid_config).run_all_times() - if ("REGRID" in steps_list_fcst): - print('Regridding Model') - regrid_config = config_metplus.replace_config_from_section(config, 'regrid_fcst') - RegridDataPlaneWrapper(regrid_config).run_all_times() + #if ("REGRID" in steps_list_fcst): + # print('Regridding Model') + # regrid_config = config_metplus.replace_config_from_section(config, 'regrid_fcst') + # RegridDataPlaneWrapper(regrid_config).run_all_times() #Compute Daily Average - if ("TIMEAVE" in steps_list_obs): - print('Computing Time Averages') - daily_config = config_metplus.replace_config_from_section(config, 'daily_mean_obs') - PCPCombineWrapper(daily_config).run_all_times() + #if ("TIMEAVE" in steps_list_obs): + # print('Computing Time Averages') + # daily_config = config_metplus.replace_config_from_section(config, 'daily_mean_obs') + # PCPCombineWrapper(daily_config).run_all_times() - if ("TIMEAVE" in steps_list_fcst): - print('Computing Time Averages') - daily_config = config_metplus.replace_config_from_section(config, 'daily_mean_fcst') - PCPCombineWrapper(daily_config).run_all_times() + #if ("TIMEAVE" in steps_list_fcst): + # print('Computing Time Averages') + # daily_config = config_metplus.replace_config_from_section(config, 'daily_mean_fcst') + # PCPCombineWrapper(daily_config).run_all_times() #Take a running mean - if ("RUNMEAN" in steps_list_obs): - print('Computing Obs Running means') - rmean_config = config_metplus.replace_config_from_section(config, 'running_mean_obs') - PCPCombineWrapper(rmean_config).run_all_times() + #if ("RUNMEAN" in steps_list_obs): + # print('Computing Obs Running means') + # rmean_config = config_metplus.replace_config_from_section(config, 'running_mean_obs') + # PCPCombineWrapper(rmean_config).run_all_times() - if ("RUNMEAN" in steps_list_fcst): - print('Computing Model Running means') - rmean_config = config_metplus.replace_config_from_section(config, 'running_mean_fcst') - PCPCombineWrapper(rmean_config).run_all_times() + #if ("RUNMEAN" in steps_list_fcst): + # print('Computing Model Running means') + # rmean_config = config_metplus.replace_config_from_section(config, 'running_mean_fcst') + # PCPCombineWrapper(rmean_config).run_all_times() #Compute anomaly - if ("ANOMALY" in steps_list_obs): - print('Computing Obs Anomalies') - anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly_obs') - PCPCombineWrapper(anomaly_config).run_all_times() - - if ("ANOMALY" in steps_list_fcst): - print('Computing Model Anomalies') - anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly_fcst') - PCPCombineWrapper(anomaly_config).run_all_times() + #if ("ANOMALY" in steps_list_obs): + # print('Computing Obs Anomalies') + # anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly_obs') + # PCPCombineWrapper(anomaly_config).run_all_times() + + #if ("ANOMALY" in steps_list_fcst): + # print('Computing Model Anomalies') + # anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly_fcst') + # PCPCombineWrapper(anomaly_config).run_all_times() ###################################################################### diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking.conf index 44affe8bec..01fb3a137b 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking.conf @@ -13,208 +13,31 @@ VALID_TIME_FMT = %Y%m%d%H VALID_BEG = 1979120100 # End time for METplus run -VALID_END = 2017022818 +VALID_END = 2017022800 # list of forecast leads to process LEAD_SEQ = 0 -# Only Process DJF -SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" - -LOOP_ORDER = processes - -OBS_RUN = True - - - -[regrid_obs] -# Increment between METplus runs in seconds. Must be >= 60 -VALID_INCREMENT = 21600 - -# List of applications to run -PROCESS_LIST = RegridDataPlane - -# REGRID_DATA_PLANE (Step 1) -# Run regrid_data_plane on forecast data -OBS_REGRID_DATA_PLANE_RUN = {OBS_RUN} - -# If true, process each field individually and write a file for each -# If false, run once per run time passing in all fields specified -OBS_DATA_PLANE_ONCE_PER_FIELD = False - -# Name of input field to process -OBS_REGRID_DATA_PLANE_VAR1_INPUT_FIELD_NAME = Z - -# Level of input field to process -OBS_REGRID_DATA_PLANE_VAR1_INPUT_LEVEL = P500 - -# Name of output field to create -OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = Z500 - -# Mask to use for regridding -#REGRID_DATA_PLANE_VERIF_GRID = {MASK_DIR}/NH_block_grid.nc -REGRID_DATA_PLANE_VERIF_GRID = latlon 360 90 89 0 -1.0 1.0 - -# Method to run regrid_data_plane, not setting this will default to NEAREST -REGRID_DATA_PLANE_METHOD = BILIN - -# Regridding width used in regrid_data_plane, not setting this will default to 1 -REGRID_DATA_PLANE_WIDTH = 2 - -[dir] -# location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s - -# input and output data directories for each application in PROCESS_LIST -OBS_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds627.0/ei.oper.an.pl -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Regrid - -[filename_templates] -# format of filenames -# Input ERA Interim -OBS_REGRID_DATA_PLANE_INPUT_TEMPLATE = {valid?fmt=%Y%m}/ei.oper.an.pl.regn128sc.{valid?fmt=%Y%m%d%H} -OBS_REGRID_DATA_PLANE_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{init?fmt=%Y%m%d%H}_NH.nc - - - -[daily_mean_obs] -# Start time for METplus run -VALID_BEG = 1979120118 - -# End time for METplus run -VALID_END = 2017022818 - -# Increment between METplus runs in seconds. Must be >= 60 +# Increment between METplus runs (in seconds if no units are specified) +# Must be >= 60 seconds VALID_INCREMENT = 86400 -LOOP_ORDER = processes - -# List of applications to run -PROCESS_LIST = PcpCombine - -# PCP_COMBINE (Step 1) -# run pcp_combine on obs data -OBS_PCP_COMBINE_RUN = {OBS_RUN} - -# method to run pcp_combine on forecast data -# Options are ADD, SUM, SUBTRACT, and DERIVE -OBS_PCP_COMBINE_METHOD = DERIVE -OBS_PCP_COMBINE_STAT_LIST = MEAN - -# field name of 1 hr accumulation in forecast files -OBS_PCP_COMBINE_INPUT_ACCUMS = 6 -OBS_PCP_COMBINE_INPUT_NAMES = Z500 -OBS_PCP_COMBINE_INPUT_LEVELS = "(*,*)" -OBS_PCP_COMBINE_INPUT_OPTIONS = convert(x) = x / 9.81; set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S?shift=-64800}"; -OBS_PCP_COMBINE_OUTPUT_NAME = Z500 -OBS_PCP_COMBINE_OUTPUT_ACCUM = 24 -OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 - -# location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s - -# input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Regrid -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Daily - -# Input ERA Interim -OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc -OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d?shift=-64800}_NH.nc - - - -[running_mean_obs] -# Start time for METplus run -VALID_BEG = 1979120100 - -# End time for METplus run -VALID_END = 2017022800 - -# Increment between METplus runs in seconds. Must be >= 60 -VALID_INCREMENT = 86400 - -SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:1201,1202,1203,1204,0229" - -# Increment between METplus runs in seconds. Must be >= 60 -VALID_INCREMENT = 86400 - -# List of applications to run -PROCESS_LIST = PcpCombine - -# PCP_COMBINE (Step 1) -# run pcp_combine on obs data -OBS_PCP_COMBINE_RUN = {OBS_RUN} - -# method to run pcp_combine on forecast data -# Options are ADD, SUM, SUBTRACT, and DERIVE -OBS_PCP_COMBINE_METHOD = DERIVE -OBS_PCP_COMBINE_STAT_LIST = MEAN - -# field name of 1 hr accumulation in forecast files -OBS_PCP_COMBINE_INPUT_ACCUMS = 24 -OBS_PCP_COMBINE_INPUT_NAMES = Z500 -OBS_PCP_COMBINE_INPUT_LEVELS = "(*,*)" -OBS_PCP_COMBINE_INPUT_OPTIONS = set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S?shift=-172800}"; -OBS_PCP_COMBINE_OUTPUT_NAME = Z500 -# Running mean is 5 days -OBS_PCP_COMBINE_OUTPUT_ACCUM = 120 -OBS_PCP_COMBINE_DERIVE_LOOKBACK = 120 - -# location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s - -# input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Daily -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Rmean5d - -# format of filenames -# Input ERA Interim -OBS_PCP_COMBINE_INPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d}_NH.nc -OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_5daymean_{valid?fmt=%Y%m%d?shift=-172800}_NH.nc - - - -[anomaly_obs] -# Increment between METplus runs in seconds. Must be >= 60 -VALID_INCREMENT = 86400 - -SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:1201,1202,0227,0228,0229" - -# Options are times, processes -# times = run all items in the PROCESS_LIST for a single initialization -# time, then repeat until all times have been evaluated. -# processes = run each item in the PROCESS_LIST for all times -# specified, then repeat for the next item in the PROCESS_LIST. -LOOP_ORDER = processes - -# List of applications to run -PROCESS_LIST = PcpCombine - -# PCP_COMBINE (Step 1) -# run pcp_combine on obs data -OBS_PCP_COMBINE_RUN = {OBS_RUN} - -# method to run pcp_combine on forecast data -# Options are ADD, SUM, SUBTRACT, and DERIVE -OBS_PCP_COMBINE_METHOD = USER_DEFINED - -OBS_PCP_COMBINE_COMMAND = -subtract {OBS_PCP_COMBINE_INPUT_DIR}/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc {OBS_PCP_COMBINE_INPUT_DIR}/Rmean5d/Z500_5daymean_{valid?fmt=%Y%m%d}_NH.nc -field 'name="Z500"; level="(*,*)";' - -# location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s - -# input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Anomaly - -OBS_PCP_COMBINE_INPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d}_NH.nc -OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc +# Only Process DJF +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" +# Order of loops to process data - Options are times, processes +# Not relevant if only one item is in the PROCESS_LIST +# times = run all wrappers in the PROCESS_LIST for a single run time, then +# increment the run time and run all wrappers again until all times have +# been evaluated. +# processes = run the first wrapper in the PROCESS_LIST for all times +# specified, then repeat for the next item in the PROCESS_LIST until all +# wrappers have been run +#LOOP_ORDER = processes +# Variables specific to the blocking analysis [Blocking] -VALID_INCREMENT = 86400 - # Directory for the Z500 anomaly data to read in to the blocking python code OBS_BLOCKING_ANOMALY_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc @@ -256,7 +79,7 @@ OBS_BLOCK_TRAVEL = 45 # Pelly-Hoskins Method OBS_BLOCK_METHOD = PH -# Plots +# Plot Output Directory BLOCKING_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/plots/ #CBL plot title and name diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking_orig.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking_orig.conf new file mode 100644 index 0000000000..58a3edffde --- /dev/null +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking_orig.conf @@ -0,0 +1,272 @@ +# Blocking METplus Configuration +[config] +# Steps to Run +OBS_STEPS = CBL+PLOTCBL+IBL+PLOTIBL+GIBL+CALCBLOCKS+PLOTBLOCKS + +# time looping - options are INIT, VALID, RETRO, and REALTIME +LOOP_BY = VALID + +# Format of INIT_BEG and INIT_END +VALID_TIME_FMT = %Y%m%d%H + +# Start time for METplus run +VALID_BEG = 1979120100 + +# End time for METplus run +VALID_END = 2017022818 + +# list of forecast leads to process +LEAD_SEQ = 0 + +# Only Process DJF +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" + +LOOP_ORDER = processes + +OBS_RUN = True + + + +[regrid_obs] +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 21600 + +# List of applications to run +PROCESS_LIST = RegridDataPlane + +# REGRID_DATA_PLANE (Step 1) +# Run regrid_data_plane on forecast data +OBS_REGRID_DATA_PLANE_RUN = {OBS_RUN} + +# If true, process each field individually and write a file for each +# If false, run once per run time passing in all fields specified +OBS_DATA_PLANE_ONCE_PER_FIELD = False + +# Name of input field to process +OBS_REGRID_DATA_PLANE_VAR1_INPUT_FIELD_NAME = Z + +# Level of input field to process +OBS_REGRID_DATA_PLANE_VAR1_INPUT_LEVEL = P500 + +# Name of output field to create +OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = Z500 + +# Mask to use for regridding +#REGRID_DATA_PLANE_VERIF_GRID = {MASK_DIR}/NH_block_grid.nc +REGRID_DATA_PLANE_VERIF_GRID = latlon 360 90 89 0 -1.0 1.0 + +# Method to run regrid_data_plane, not setting this will default to NEAREST +REGRID_DATA_PLANE_METHOD = BILIN + +# Regridding width used in regrid_data_plane, not setting this will default to 1 +REGRID_DATA_PLANE_WIDTH = 2 + +[dir] +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + +# input and output data directories for each application in PROCESS_LIST +OBS_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds627.0/ei.oper.an.pl +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Regrid + +[filename_templates] +# format of filenames +# Input ERA Interim +OBS_REGRID_DATA_PLANE_INPUT_TEMPLATE = {valid?fmt=%Y%m}/ei.oper.an.pl.regn128sc.{valid?fmt=%Y%m%d%H} +OBS_REGRID_DATA_PLANE_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{init?fmt=%Y%m%d%H}_NH.nc + + + +[daily_mean_obs] +# Start time for METplus run +VALID_BEG = 1979120118 + +# End time for METplus run +VALID_END = 2017022818 + +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 86400 + +LOOP_ORDER = processes + +# List of applications to run +PROCESS_LIST = PcpCombine + +# PCP_COMBINE (Step 1) +# run pcp_combine on obs data +OBS_PCP_COMBINE_RUN = {OBS_RUN} + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, and DERIVE +OBS_PCP_COMBINE_METHOD = DERIVE +OBS_PCP_COMBINE_STAT_LIST = MEAN + +# field name of 1 hr accumulation in forecast files +OBS_PCP_COMBINE_INPUT_ACCUMS = 6 +OBS_PCP_COMBINE_INPUT_NAMES = Z500 +OBS_PCP_COMBINE_INPUT_LEVELS = "(*,*)" +OBS_PCP_COMBINE_INPUT_OPTIONS = convert(x) = x / 9.81; set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S?shift=-64800}"; +OBS_PCP_COMBINE_OUTPUT_NAME = Z500 +OBS_PCP_COMBINE_OUTPUT_ACCUM = 24 +OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 + +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + +# input and output data directories for each application in PROCESS_LIST +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Regrid +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Daily + +# Input ERA Interim +OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc +OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d?shift=-64800}_NH.nc + + + +[running_mean_obs] +# Start time for METplus run +VALID_BEG = 1979120100 + +# End time for METplus run +VALID_END = 2017022800 + +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 86400 + +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:1201,1202,1203,1204,0229" + +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 86400 + +# List of applications to run +PROCESS_LIST = PcpCombine + +# PCP_COMBINE (Step 1) +# run pcp_combine on obs data +OBS_PCP_COMBINE_RUN = {OBS_RUN} + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, and DERIVE +OBS_PCP_COMBINE_METHOD = DERIVE +OBS_PCP_COMBINE_STAT_LIST = MEAN + +# field name of 1 hr accumulation in forecast files +OBS_PCP_COMBINE_INPUT_ACCUMS = 24 +OBS_PCP_COMBINE_INPUT_NAMES = Z500 +OBS_PCP_COMBINE_INPUT_LEVELS = "(*,*)" +OBS_PCP_COMBINE_INPUT_OPTIONS = set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S?shift=-172800}"; +OBS_PCP_COMBINE_OUTPUT_NAME = Z500 +# Running mean is 5 days +OBS_PCP_COMBINE_OUTPUT_ACCUM = 120 +OBS_PCP_COMBINE_DERIVE_LOOKBACK = 120 + +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + +# input and output data directories for each application in PROCESS_LIST +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Daily +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Rmean5d + +# format of filenames +# Input ERA Interim +OBS_PCP_COMBINE_INPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_5daymean_{valid?fmt=%Y%m%d?shift=-172800}_NH.nc + + + +[anomaly_obs] +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 86400 + +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:1201,1202,0227,0228,0229" + +# Options are times, processes +# times = run all items in the PROCESS_LIST for a single initialization +# time, then repeat until all times have been evaluated. +# processes = run each item in the PROCESS_LIST for all times +# specified, then repeat for the next item in the PROCESS_LIST. +LOOP_ORDER = processes + +# List of applications to run +PROCESS_LIST = PcpCombine + +# PCP_COMBINE (Step 4) +# run pcp_combine on obs data +OBS_PCP_COMBINE_RUN = {OBS_RUN} + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, and DERIVE +OBS_PCP_COMBINE_METHOD = USER_DEFINED + +OBS_PCP_COMBINE_COMMAND = -subtract {OBS_PCP_COMBINE_INPUT_DIR}/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc {OBS_PCP_COMBINE_INPUT_DIR}/Rmean5d/Z500_5daymean_{valid?fmt=%Y%m%d}_NH.nc -field 'name="Z500"; level="(*,*)";' + +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + +# input and output data directories for each application in PROCESS_LIST +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Anomaly + +OBS_PCP_COMBINE_INPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc + + + +[Blocking] +VALID_INCREMENT = 86400 + +# Directory for the Z500 anomaly data to read in to the blocking python code +OBS_BLOCKING_ANOMALY_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc + +# Variable Name for the Z500 anomaly data to read in to the blocking python code +OBS_BLOCKING_ANOMALY_VAR = Z500_ANA + +# Directory for the Z500 data to read in to the blocking python code +OBS_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc + +# Variable for the Z500 data +OBS_BLOCKING_VAR = Z500 + +# Number of model grid points used for a moving average +# Must be odd +OBS_SMOOTHING_PTS = 9 + +# Lat Delta +OBS_LAT_DELTA = -5,0,5 + +# Number of grid points for the North-South limits of the block +OBS_NORTH_SOUTH_LIMITS = 30 + +# Maximum number of grid points between IBLs for everything in between to be included as an IBL +OBS_IBL_DIST = 7 + +# Number of grid points in and IBL to make a GIBL +OBS_IBL_IN_GIBL = 15 + +# Overlap across the model timestep for a GIBL +OBS_GIBL_OVERLAP = 10 + +# Time duration needed for a block in the model timestep +OBS_BLOCK_TIME = 5 + +# Number of grid points a block must travel to terminate +OBS_BLOCK_TRAVEL = 45 + +# Method to compute blocking. Currently, the only option is 'PH' for the +# Pelly-Hoskins Method +OBS_BLOCK_METHOD = PH + +# Plots +BLOCKING_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/plots/ + +#CBL plot title and name +OBS_CBL_PLOT_MTHSTR = DJF +OBS_CBL_PLOT_OUTPUT_NAME = ERA_CBL_avg + +# IBL plot title and name +OBS_IBL_PLOT_TITLE = DJF ERA Instantaneous Blocked Longitude +OBS_IBL_PLOT_OUTPUT_NAME = ERA_IBL_Freq_DJF + +# Blocking plot title and name +OBS_BLOCKING_PLOT_TITLE = DJF ERA Blocking Frequency +OBS_BLOCKING_PLOT_OUTPUT_NAME = ERA_Block_Freq_DJF diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf index 68e230ebcc..d415614bfc 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf @@ -1,12 +1,11 @@ # UserScript wrapper for Weather Regime Analysis [config] +# All steps, including pre-processing: +# PROCESS_LIST = RegridDataPlane(regrid_obs), PcpCombine(daily_mean_obs), UserScript(script_wr) +# Weather Regime Analysis only: +PROCESS_LIST = UserScript(script_wr) -# List of applications to run - only UserScript for this case -PROCESS_LIST = UserScript - -# !!Note, time looping variables are not set here for this use case -# they are set in the case configuration file # time looping - options are INIT, VALID, RETRO, and REALTIME # If set to INIT or RETRO: # INIT_TIME_FMT, INIT_BEG, INIT_END, and INIT_INCREMENT must also be set @@ -35,6 +34,9 @@ VALID_INCREMENT = 86400 # If unset, defaults to 0 (don't loop through forecast leads) LEAD_SEQ = 0 +# Only Process DJF +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" + # Order of loops to process data - Options are times, processes # Not relevant if only one item is in the PROCESS_LIST # times = run all wrappers in the PROCESS_LIST for a single run time, then @@ -45,10 +47,104 @@ LEAD_SEQ = 0 # wrappers have been run LOOP_ORDER = processes -# list of strings to loop over for each run time. -# value for each item can be referenced in filename templates with {custom?fmt=%s} +# location of configuration files used by MET applications +CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s + + +# Regridding Pre-Processing Step +[regrid_obs] +# Start time for METplus run - must match VALID_TIME_FMT +VALID_BEG = 1979120100 + +# End time for METplus run - must match VALID_TIME_FMT +VALID_END = 2017022818 + +# Increment between METplus runs in seconds. Must be >= 60 +VALID_INCREMENT = 21600 + +# REGRID_DATA_PLANE (Pre Processing Step 1), currently turned off +# Run regrid_data_plane on forecast data +OBS_REGRID_DATA_PLANE_RUN = True + +# If true, process each field individually and write a file for each +# If false, run once per run time passing in all fields specified +OBS_DATA_PLANE_ONCE_PER_FIELD = False + +# Name of input field to process +OBS_REGRID_DATA_PLANE_VAR1_INPUT_FIELD_NAME = Z + +# Level of input field to process +OBS_REGRID_DATA_PLANE_VAR1_INPUT_LEVEL = P500 + +# Name of output field to create +OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = Z500 + +# Mask to use for regridding +# A 1 degree latitude/longitude grid running 24 to 54 degrees latitude +# and 230 to 300 degrees longitude +REGRID_DATA_PLANE_VERIF_GRID = latlon 71 31 54 230 -1.0 1.0 + +# Method to run regrid_data_plane, not setting this will default to NEAREST +REGRID_DATA_PLANE_METHOD = BILIN + +# Regridding width used in regrid_data_plane, not setting this will default to 1 +REGRID_DATA_PLANE_WIDTH = 2 + +# input and output data directories for each application in PROCESS_LIST +OBS_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds627.0/ei.oper.an.pl +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/WeatherRegime/ERA/Regrid + +# format of filenames +# Input and output ERA Interim +OBS_REGRID_DATA_PLANE_INPUT_TEMPLATE = {valid?fmt=%Y%m}/ei.oper.an.pl.regn128sc.{valid?fmt=%Y%m%d%H} +OBS_REGRID_DATA_PLANE_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{init?fmt=%Y%m%d%H}_NH.nc + + +# Daily Mean Pre-Processing Step +[daily_mean_obs] +# Start time for METplus run +VALID_BEG = 1979120118 + +# End time for METplus run +VALID_END = 2017022818 + +# run pcp_combine on obs data +OBS_PCP_COMBINE_RUN = True + +# method to run pcp_combine on forecast data +# Options are ADD, SUM, SUBTRACT, DERIVE, and USER_DEFINED +OBS_PCP_COMBINE_METHOD = DERIVE +OBS_PCP_COMBINE_STAT_LIST = MEAN + +# field name and level of 1 hr accumulation in forecast files +OBS_PCP_COMBINE_INPUT_ACCUMS = 6 +OBS_PCP_COMBINE_INPUT_NAMES = Z500 +OBS_PCP_COMBINE_INPUT_LEVELS = "(*,*)" +OBS_PCP_COMBINE_INPUT_OPTIONS = convert(x) = x / 9.81; set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S?shift=-64800}"; + +# Convert height and derive mean over 24 hours +OBS_PCP_COMBINE_OUTPUT_ACCUM = 24 +OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 + +# Name output variable Z500 +OBS_PCP_COMBINE_OUTPUT_NAME = Z500 + +# input and output data directories for each application in PROCESS_LIST +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/WeatherRegime/ERA/Regrid +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/WeatherRegime/ERA/Daily + +# Input ERA Interim +OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc +OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d?shift=-64800}_NH.nc + + +# Run the Weather Regime Script +[script_wr] +# User Script Commands USER_SCRIPT_CUSTOM_LOOP_LIST = nc +# Run the user script once USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE -USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf dir.INPUT_BASE={INPUT_BASE} dir.OUTPUT_BASE={OUTPUT_BASE} dir.MET_INSTALL_DIR={MET_INSTALL_DIR} +# Command to run the user script with input configuration file +USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_obsERA_obsOnly.conf dir.INPUT_BASE={INPUT_BASE} dir.OUTPUT_BASE={OUTPUT_BASE} dir.MET_INSTALL_DIR={MET_INSTALL_DIR} diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf deleted file mode 100644 index 4d8645ed5a..0000000000 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf +++ /dev/null @@ -1,179 +0,0 @@ -# Blocking METplus Configuration -[config] -# Steps to Run -#OBS_STEPS = REGRID+TIMEAVE+ELBOW+PLOTELBOW+EOF+PLOTTEOF+KMEANS+PLOTKMEANS -OBS_STEPS = ELBOW+PLOTELBOW+EOF+PLOTTEOF+KMEANS+PLOTKMEANS - -# time looping - options are INIT, VALID, RETRO, and REALTIME -LOOP_BY = VALID - -# Format of INIT_BEG and INIT_END -VALID_TIME_FMT = %Y%m%d%H - -# Start time for METplus run -VALID_BEG = 1979120100 - -# End time for METplus run -VALID_END = 2017022818 - -# list of forecast leads to process -LEAD_SEQ = 0 - -# Only Process DJF -SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" - -LOOP_ORDER = processes - -OBS_RUN = True - - -[regrid_obs] -# Increment between METplus runs in seconds. Must be >= 60 -VALID_INCREMENT = 21600 - -# List of applications to run -PROCESS_LIST = RegridDataPlane - -# REGRID_DATA_PLANE (Step 1) -# Run regrid_data_plane on forecast data -OBS_REGRID_DATA_PLANE_RUN = {OBS_RUN} - -# If true, process each field individually and write a file for each -# If false, run once per run time passing in all fields specified -OBS_DATA_PLANE_ONCE_PER_FIELD = False - -# Name of input field to process -OBS_REGRID_DATA_PLANE_VAR1_INPUT_FIELD_NAME = Z - -# Level of input field to process -OBS_REGRID_DATA_PLANE_VAR1_INPUT_LEVEL = P500 - -# Name of output field to create -OBS_REGRID_DATA_PLANE_VAR1_OUTPUT_FIELD_NAME = Z500 - -# Mask to use for regridding -# a 1 degree latitude/longitude grid running 24 to 54 degrees latitude -# and 230 to 300 degrees longitude -#REGRID_DATA_PLANE_VERIF_GRID = latlon 360 90 89 0 -1.0 1.0 -REGRID_DATA_PLANE_VERIF_GRID = latlon 71 31 54 230 -1.0 1.0 - -# Method to run regrid_data_plane, not setting this will default to NEAREST -REGRID_DATA_PLANE_METHOD = BILIN - -# Regridding width used in regrid_data_plane, not setting this will default to 1 -REGRID_DATA_PLANE_WIDTH = 2 - -[dir] -# location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s - -# input and output data directories for each application in PROCESS_LIST -OBS_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds627.0/ei.oper.an.pl -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/WeatherRegime/ERA/Regrid - -[filename_templates] -# format of filenames -# Input ERA Interim -OBS_REGRID_DATA_PLANE_INPUT_TEMPLATE = {valid?fmt=%Y%m}/ei.oper.an.pl.regn128sc.{valid?fmt=%Y%m%d%H} -OBS_REGRID_DATA_PLANE_OUTPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{init?fmt=%Y%m%d%H}_NH.nc - - -[daily_mean_obs] -# Start time for METplus run -VALID_BEG = 1979120118 - -# End time for METplus run -VALID_END = 2017022818 - -# Increment between METplus runs in seconds. Must be >= 60 -VALID_INCREMENT = 86400 - -LOOP_ORDER = processes - -# List of applications to run -PROCESS_LIST = PcpCombine - -# PCP_COMBINE (Step 1) -# run pcp_combine on obs data -OBS_PCP_COMBINE_RUN = {OBS_RUN} - -# method to run pcp_combine on forecast data -# Options are ADD, SUM, SUBTRACT, and DERIVE -OBS_PCP_COMBINE_METHOD = DERIVE -OBS_PCP_COMBINE_STAT_LIST = MEAN - -# field name of 1 hr accumulation in forecast files -OBS_PCP_COMBINE_INPUT_ACCUMS = 6 -OBS_PCP_COMBINE_INPUT_NAMES = Z500 -OBS_PCP_COMBINE_INPUT_LEVELS = "(*,*)" -OBS_PCP_COMBINE_INPUT_OPTIONS = convert(x) = x / 9.81; set_attr_valid = "{valid?fmt=%Y%m%d_%H%M%S?shift=-64800}"; -OBS_PCP_COMBINE_OUTPUT_NAME = Z500 -OBS_PCP_COMBINE_OUTPUT_ACCUM = 24 -OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 - -# location of configuration files used by MET applications -CONFIG_DIR={PARM_BASE}/use_cases/model_applications/s2s - -# input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/WeatherRegime/ERA/Regrid -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/WeatherRegime/ERA/Daily - -# Input ERA Interim -OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc -OBS_PCP_COMBINE_OUTPUT_TEMPLATE = Z500_daily_{valid?fmt=%Y%m%d?shift=-64800}_NH.nc - - -[WeatherRegime] -VALID_BEG = 1979120100 - -# End time for METplus run -VALID_END = 2017022800 - -VALID_INCREMENT = 86400 - -# Directory for the Z500 data to read in to the blocking python code -OBS_WR_TEMPLATE = {OUTPUT_BASE}/s2s/WeatherRegime/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc - -# Variable for the Z500 data -OBS_WR_VAR = Z500 - -# Weather Regime Number -OBS_WR_NUMBER = 6 - -# Number of clusters -OBS_NUM_CLUSTERS = 20 - -# Number of principal components -OBS_NUM_PCS = 10 - -# Type of Output File for weather regime classification -# options are text or netcdf -#OBS_WR_OUTPUT_FILE_TYPE = text -OBS_WR_OUTPUT_FILE_TYPE = netcdf - -# Name of obs output file -OBS_WR_OUTPUT_FILE = obs_weather_regime_class - -# Weather Regime output file directory -WR_OUTPUT_FILE_DIR = {OUTPUT_BASE}/s2s/WeatherRegime - -# Plot output dir -WR_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/WeatherRegime/plots/ - -# Elbow Plot Title -OBS_ELBOW_PLOT_TITLE = Elbow Method For Optimal k - -# Elbow Plot Output Name -OBS_ELBOW_PLOT_OUTPUT_NAME = obs_elbow - -# EOF plot output name -OBS_EOF_PLOT_OUTPUT_NAME = obs_eof - -# Levels for the EOF contour plots -EOF_PLOT_LEVELS = -50, -45, -40, -35, -30, -25, -20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 - -# Elbow Plot Output Name -OBS_KMEANS_PLOT_OUTPUT_NAME = obs_kmeans - -# Levels for the K Means Contours plots -KMEANS_PLOT_LEVELS = -80, -70, -60, -50, -40, -30, -20, -10, 0, 10, 20, 30, 40, 50, 60, 70, 80 diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py index 0189d01924..a49c9813e3 100755 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 - import sys import os import numpy as np @@ -11,22 +10,17 @@ mp_loc_ind = mp_fpath_split.index('METplus') sys.path.insert(0,os.path.sep.join(mp_fpath_split[0:mp_loc_ind+1])) -sys.path.insert(0, os.path.sep.join(mp_fpath_split[0:mp_loc_ind])+"/METplotpy_feature_74") -#sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), -# os.pardir,os.pardir))) -#sys.path.insert(0, "/glade/u/home/kalb/UIUC/METplotpy_feature_74/metplotpy/contributed/weather_regime") +#sys.path.insert(0, os.path.sep.join(mp_fpath_split[0:mp_loc_ind])+"/METplotpy_feature_74") from WeatherRegime import WeatherRegimeCalculation from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub, getlist from ush.master_metplus import get_config_inputs_from_command_line -from metplus.wrappers import PCPCombineWrapper -from metplus.wrappers import RegridDataPlaneWrapper from metplotpy.contributed.weather_regime import plot_weather_regime as pwr from Blocking_WeatherRegime_util import find_input_files, parse_steps, read_nc_met def main(): - all_steps = ["REGRID","TIMEAVE","ELBOW","PLOTELBOW","EOF","PLOTEOF","KMEANS","PLOTKMEANS"] + all_steps = ["ELBOW","PLOTELBOW","EOF","PLOTEOF","KMEANS","PLOTKMEANS"] inconfig_list = get_config_inputs_from_command_line() steps_list_fcst,steps_list_obs,config_list = parse_steps(inconfig_list) @@ -37,32 +31,6 @@ def main(): print('no data will be processed') - ###################################################################### - # Pre-Process Data: - ###################################################################### - # Regrid - if ("REGRID" in steps_list_obs): - print('Regridding Observations') - regrid_config = config_metplus.replace_config_from_section(config, 'regrid_obs') - RegridDataPlaneWrapper(regrid_config).run_all_times() - - if ("REGRID" in steps_list_fcst): - print('Regridding Model') - regrid_config = config_metplus.replace_config_from_section(config, 'regrid_fcst') - RegridDataPlaneWrapper(regrid_config).run_all_times() - - #Compute Daily Average - if ("TIMEAVE" in steps_list_obs): - print('Computing Daily Averages') - daily_config = config_metplus.replace_config_from_section(config, 'daily_mean_obs') - PCPCombineWrapper(daily_config).run_all_times() - - if ("TIMEAVE" in steps_list_fcst): - print('Computing Daily Averages') - daily_config = config_metplus.replace_config_from_section(config, 'daily_mean_fcst') - PCPCombineWrapper(daily_config).run_all_times() - - ###################################################################### # Blocking Calculation and Plotting ###################################################################### diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_obsERA_obsOnly.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_obsERA_obsOnly.conf new file mode 100644 index 0000000000..2ef66dfeba --- /dev/null +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_obsERA_obsOnly.conf @@ -0,0 +1,76 @@ +# Blocking METplus Configuration +[config] +# Steps to Run +OBS_STEPS = ELBOW+PLOTELBOW+EOF+PLOTEOF+KMEANS+PLOTKMEANS + +# time looping - options are INIT, VALID, RETRO, and REALTIME +LOOP_BY = VALID + +# Format of INIT_BEG and INIT_END +VALID_TIME_FMT = %Y%m%d%H + +# Start time for METplus run +VALID_BEG = 1979120100 + +# End time for METplus run +VALID_END = 2017022800 + +# list of forecast leads to process +LEAD_SEQ = 0 + +# Increment between METplus runs (in seconds if no units are specified) +# Must be >= 60 seconds +VALID_INCREMENT = 86400 + +# Only Process DJF +SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" + +# Order of loops to process data - Options are times, processes +# Not relevant if only one item is in the PROCESS_LIST +# times = run all wrappers in the PROCESS_LIST for a single run time, then +# increment the run time and run all wrappers again until all times have +# been evaluated. +# processes = run the first wrapper in the PROCESS_LIST for all times +# specified, then repeat for the next item in the PROCESS_LIST until all +# wrappers have been run +LOOP_ORDER = processes + + +# Variables Specific to Weather Regime analysis +[WeatherRegime] +# Directory for the Z500 data to read in to the blocking python code +OBS_WR_TEMPLATE = {OUTPUT_BASE}/s2s/WeatherRegime/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc + +# Variable for the Z500 data +OBS_WR_VAR = Z500 + +# Weather Regime Number +OBS_WR_NUMBER = 6 + +# Number of clusters +OBS_NUM_CLUSTERS = 20 + +# Number of principal components +OBS_NUM_PCS = 10 + +# Type, name and directory of Output File for weather regime classification +# Type options are text or netcdf +#OBS_WR_OUTPUT_FILE_TYPE = text +OBS_WR_OUTPUT_FILE_TYPE = netcdf +OBS_WR_OUTPUT_FILE = obs_weather_regime_class +WR_OUTPUT_FILE_DIR = {OUTPUT_BASE}/s2s/WeatherRegime + +# Directory to send output plots +WR_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/WeatherRegime/plots/ + +# Elbow Plot Title and output file name +OBS_ELBOW_PLOT_TITLE = Elbow Method For Optimal k +OBS_ELBOW_PLOT_OUTPUT_NAME = obs_elbow + +# EOF plot output name and contour levels +OBS_EOF_PLOT_OUTPUT_NAME = obs_eof +EOF_PLOT_LEVELS = -50, -45, -40, -35, -30, -25, -20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 + +# K means Plot Output Name and contour levels +OBS_KMEANS_PLOT_OUTPUT_NAME = obs_kmeans +KMEANS_PLOT_LEVELS = -80, -70, -60, -50, -40, -30, -20, -10, 0, 10, 20, 30, 40, 50, 60, 70, 80 From 7bac7d7374d33db53fc0c614d59ea6a5da492de6 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Mon, 8 Mar 2021 22:42:49 -0700 Subject: [PATCH 44/93] Updated all_use_Cases.txt --- internal_tests/use_cases/all_use_cases.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal_tests/use_cases/all_use_cases.txt b/internal_tests/use_cases/all_use_cases.txt index 82e4fd067f..52f15fe9a2 100644 --- a/internal_tests/use_cases/all_use_cases.txt +++ b/internal_tests/use_cases/all_use_cases.txt @@ -93,9 +93,9 @@ MTD_fcstHRRR-TLE_obsMRMS:: model_applications/precipitation/MTD_fcstHRRR-TLE_obs Category: s2s GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast:: model_applications/s2s/GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast.conf::netCDF4 -UserScript_fcstGFS_obsERA_Blocking:: model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf,user_env_vars.MET_PYTHON_EXE=python3::metplotpy,metcalcpy -UserScript_obsERA_obsOnly_Blocking:: model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf,user_env_vars.MET_PYTHON_EXE=python3::metplotpy,metcalcpy -UserScript_obsERA_obsOnly_WeatherRegime:: model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf,user_env_vars.MET_PYTHON_EXE=python3::metplotpy,metcalcpy +UserScript_fcstGFS_obsERA_Blocking:: model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf,user_env_vars.MET_PYTHON_EXE=python3::METplotpy,METcalcpy +UserScript_obsERA_obsOnly_Blocking:: model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf,user_env_vars.MET_PYTHON_EXE=python3::METplotpy,METcalcpy +UserScript_obsERA_obsOnly_WeatherRegime:: model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf,user_env_vars.MET_PYTHON_EXE=python3::METplotpy,METcalcpy Category: space_weather GridStat_fcstGloTEC_obsGloTEC_vx7:: model_applications/space_weather/GridStat_fcstGloTEC_obsGloTEC_vx7.conf From c34e4ab4459b9be0189bd0a53d4a801a720ed5c5 Mon Sep 17 00:00:00 2001 From: George McCabe <23407799+georgemccabe@users.noreply.github.com> Date: Tue, 9 Mar 2021 08:31:24 -0700 Subject: [PATCH 45/93] Remove setting sys path for METplus and METplotpy because they should be in the path if they are installed --- .../Blocking_driver.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py index 87a5b8f57b..50e077b0b3 100755 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py @@ -5,12 +5,12 @@ import netCDF4 import re -mp_fpath = os.path.abspath(__file__) -mp_fpath_split = str.split(mp_fpath,os.path.sep) -mp_loc_ind = mp_fpath_split.index('METplus') +#mp_fpath = os.path.abspath(__file__) +#mp_fpath_split = str.split(mp_fpath,os.path.sep) +#mp_loc_ind = mp_fpath_split.index('METplus') -sys.path.insert(0,os.path.sep.join(mp_fpath_split[0:mp_loc_ind+1])) -sys.path.insert(0, os.path.sep.join(mp_fpath_split[0:mp_loc_ind])+"/METplotpy") +#sys.path.insert(0,os.path.sep.join(mp_fpath_split[0:mp_loc_ind+1])) +#sys.path.insert(0, os.path.sep.join(mp_fpath_split[0:mp_loc_ind])+"/METplotpy") from Blocking import BlockingCalculation from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub From f0ef0d6cab05f12d89bcf540d6ed85df538fecf6 Mon Sep 17 00:00:00 2001 From: George McCabe Date: Tue, 9 Mar 2021 17:29:19 -0700 Subject: [PATCH 46/93] fixed path to blocking_s2s module in metplotpy --- .../s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py index 50e077b0b3..a59fe10d0f 100755 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py @@ -17,7 +17,7 @@ from ush.master_metplus import get_config_inputs_from_command_line #from metplus.wrappers import PCPCombineWrapper #from metplus.wrappers import RegridDataPlaneWrapper -from metplotpy.blocking_s2s import plot_blocking as pb +from metplotpy.contributed.blocking_s2s import plot_blocking as pb from metplotpy.contributed.blocking_s2s.CBL_plot import create_cbl_plot from Blocking_WeatherRegime_util import find_input_files, parse_steps From e37b246640da855e1e3186e55f4c84d72b26bf7c Mon Sep 17 00:00:00 2001 From: George McCabe <23407799+georgemccabe@users.noreply.github.com> Date: Wed, 10 Mar 2021 08:15:24 -0700 Subject: [PATCH 47/93] Try removing MET_PYTHON_EXE because script is not using Python embedding --- internal_tests/use_cases/all_use_cases.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal_tests/use_cases/all_use_cases.txt b/internal_tests/use_cases/all_use_cases.txt index 8982d81c8a..77e40d10a2 100644 --- a/internal_tests/use_cases/all_use_cases.txt +++ b/internal_tests/use_cases/all_use_cases.txt @@ -97,9 +97,9 @@ MTD_fcstHRRR-TLE_obsMRMS:: model_applications/precipitation/MTD_fcstHRRR-TLE_obs Category: s2s GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast:: model_applications/s2s/GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast.conf::netCDF4 -UserScript_fcstGFS_obsERA_Blocking:: model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf,user_env_vars.MET_PYTHON_EXE=python3::METplotpy,METcalcpy -UserScript_obsERA_obsOnly_Blocking:: model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf,user_env_vars.MET_PYTHON_EXE=python3::METplotpy,METcalcpy -UserScript_obsERA_obsOnly_WeatherRegime:: model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf,user_env_vars.MET_PYTHON_EXE=python3::METplotpy,METcalcpy +UserScript_fcstGFS_obsERA_Blocking:: model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf::METplotpy,METcalcpy +UserScript_obsERA_obsOnly_Blocking:: model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf::METplotpy,METcalcpy +UserScript_obsERA_obsOnly_WeatherRegime:: model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf::METplotpy,METcalcpy Category: space_weather GridStat_fcstGloTEC_obsGloTEC_vx7:: model_applications/space_weather/GridStat_fcstGloTEC_obsGloTEC_vx7.conf From 898a5235f4bd981d6ea626c9b42cb27bb483f343 Mon Sep 17 00:00:00 2001 From: George McCabe Date: Wed, 10 Mar 2021 11:01:36 -0700 Subject: [PATCH 48/93] added new dependency for installing metcalcpy --- ci/jobs/get_metcalcpy.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/jobs/get_metcalcpy.sh b/ci/jobs/get_metcalcpy.sh index 204363fbde..192a3b638e 100755 --- a/ci/jobs/get_metcalcpy.sh +++ b/ci/jobs/get_metcalcpy.sh @@ -2,6 +2,7 @@ pip3 install matplotlib pip3 install scipy +pip3 install pingouin basedir=$(dirname "$0") work_dir=$basedir/../.. From 7660390f1ca870b8839ec834be4984e8283fe381 Mon Sep 17 00:00:00 2001 From: George McCabe Date: Wed, 10 Mar 2021 11:01:46 -0700 Subject: [PATCH 49/93] added cartopy dependency for use cases --- internal_tests/use_cases/all_use_cases.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal_tests/use_cases/all_use_cases.txt b/internal_tests/use_cases/all_use_cases.txt index 77e40d10a2..34324d5ef5 100644 --- a/internal_tests/use_cases/all_use_cases.txt +++ b/internal_tests/use_cases/all_use_cases.txt @@ -97,9 +97,9 @@ MTD_fcstHRRR-TLE_obsMRMS:: model_applications/precipitation/MTD_fcstHRRR-TLE_obs Category: s2s GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast:: model_applications/s2s/GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast.conf::netCDF4 -UserScript_fcstGFS_obsERA_Blocking:: model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf::METplotpy,METcalcpy -UserScript_obsERA_obsOnly_Blocking:: model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf::METplotpy,METcalcpy -UserScript_obsERA_obsOnly_WeatherRegime:: model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf::METplotpy,METcalcpy +UserScript_fcstGFS_obsERA_Blocking:: model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf::cartopy,METplotpy,METcalcpy +UserScript_obsERA_obsOnly_Blocking:: model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf::cartopy,METplotpy,METcalcpy +UserScript_obsERA_obsOnly_WeatherRegime:: model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf::cartopy,METplotpy,METcalcpy Category: space_weather GridStat_fcstGloTEC_obsGloTEC_vx7:: model_applications/space_weather/GridStat_fcstGloTEC_obsGloTEC_vx7.conf From b66ac6bb10348bd4c224610a9d6baa350f8a4c2e Mon Sep 17 00:00:00 2001 From: George McCabe Date: Wed, 10 Mar 2021 11:30:47 -0700 Subject: [PATCH 50/93] cleaned up unused code and change to avoid using ush.master_metplus function --- .../Blocking_driver.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py index a59fe10d0f..5685ec95c6 100755 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py @@ -5,18 +5,9 @@ import netCDF4 import re -#mp_fpath = os.path.abspath(__file__) -#mp_fpath_split = str.split(mp_fpath,os.path.sep) -#mp_loc_ind = mp_fpath_split.index('METplus') - -#sys.path.insert(0,os.path.sep.join(mp_fpath_split[0:mp_loc_ind+1])) -#sys.path.insert(0, os.path.sep.join(mp_fpath_split[0:mp_loc_ind])+"/METplotpy") from Blocking import BlockingCalculation from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub -from ush.master_metplus import get_config_inputs_from_command_line -#from metplus.wrappers import PCPCombineWrapper -#from metplus.wrappers import RegridDataPlaneWrapper from metplotpy.contributed.blocking_s2s import plot_blocking as pb from metplotpy.contributed.blocking_s2s.CBL_plot import create_cbl_plot from Blocking_WeatherRegime_util import find_input_files, parse_steps @@ -26,7 +17,7 @@ def main(): #all_steps = ["REGRID","TIMEAVE","RUNMEAN","ANOMALY","CBL","PLOTCBL","IBL","PLOTIBL","GIBL","CALCBLOCKS","PLOTBLOCKS"] all_steps = ["CBL","PLOTCBL","IBL","PLOTIBL","GIBL","CALCBLOCKS","PLOTBLOCKS"] - inconfig_list = get_config_inputs_from_command_line() + inconfig_list = sys.argv[1:] steps_list_fcst,steps_list_obs,config_list = parse_steps(inconfig_list) config = pre_run_setup(config_list) From 3e28ded27a007113aa9a6313bdcd6b7c35fb4b91 Mon Sep 17 00:00:00 2001 From: George McCabe Date: Wed, 10 Mar 2021 11:33:30 -0700 Subject: [PATCH 51/93] updated driver script to avoid using ush file that doesn't exist in metplus package --- .../WeatherRegime_driver.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py index a49c9813e3..54aec78cd9 100755 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py @@ -5,16 +5,9 @@ import netCDF4 import re -mp_fpath = os.path.abspath(__file__) -mp_fpath_split = str.split(mp_fpath,os.path.sep) -mp_loc_ind = mp_fpath_split.index('METplus') - -sys.path.insert(0,os.path.sep.join(mp_fpath_split[0:mp_loc_ind+1])) -#sys.path.insert(0, os.path.sep.join(mp_fpath_split[0:mp_loc_ind])+"/METplotpy_feature_74") from WeatherRegime import WeatherRegimeCalculation from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub, getlist -from ush.master_metplus import get_config_inputs_from_command_line from metplotpy.contributed.weather_regime import plot_weather_regime as pwr from Blocking_WeatherRegime_util import find_input_files, parse_steps, read_nc_met @@ -22,7 +15,7 @@ def main(): all_steps = ["ELBOW","PLOTELBOW","EOF","PLOTEOF","KMEANS","PLOTKMEANS"] - inconfig_list = get_config_inputs_from_command_line() + inconfig_list = sys.argv[1:] steps_list_fcst,steps_list_obs,config_list = parse_steps(inconfig_list) config = pre_run_setup(config_list) From ed3da7a5499f1d41ed1e530730d49c4be5d2c0a5 Mon Sep 17 00:00:00 2001 From: George McCabe Date: Wed, 10 Mar 2021 12:27:02 -0700 Subject: [PATCH 52/93] added scipy as python dependency for use cases --- internal_tests/use_cases/all_use_cases.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal_tests/use_cases/all_use_cases.txt b/internal_tests/use_cases/all_use_cases.txt index 34324d5ef5..ac5029a056 100644 --- a/internal_tests/use_cases/all_use_cases.txt +++ b/internal_tests/use_cases/all_use_cases.txt @@ -97,9 +97,9 @@ MTD_fcstHRRR-TLE_obsMRMS:: model_applications/precipitation/MTD_fcstHRRR-TLE_obs Category: s2s GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast:: model_applications/s2s/GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast.conf::netCDF4 -UserScript_fcstGFS_obsERA_Blocking:: model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf::cartopy,METplotpy,METcalcpy -UserScript_obsERA_obsOnly_Blocking:: model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf::cartopy,METplotpy,METcalcpy -UserScript_obsERA_obsOnly_WeatherRegime:: model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf::cartopy,METplotpy,METcalcpy +UserScript_fcstGFS_obsERA_Blocking:: model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf::cartopy,scipy,METplotpy,METcalcpy +UserScript_obsERA_obsOnly_Blocking:: model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf::cartopy,scipy,METplotpy,METcalcpy +UserScript_obsERA_obsOnly_WeatherRegime:: model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf::cartopy,scipy,METplotpy,METcalcpy Category: space_weather GridStat_fcstGloTEC_obsGloTEC_vx7:: model_applications/space_weather/GridStat_fcstGloTEC_obsGloTEC_vx7.conf From 79b38b71abf43a1e0ea997341ccadd078ed5583b Mon Sep 17 00:00:00 2001 From: CPKalb Date: Thu, 11 Mar 2021 14:24:13 -0700 Subject: [PATCH 53/93] Update Blocking_driver.py cleaned up some unused configs --- .../Blocking_driver.py | 49 ------------------- 1 file changed, 49 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py index 5685ec95c6..a78287847d 100755 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py @@ -14,7 +14,6 @@ def main(): - #all_steps = ["REGRID","TIMEAVE","RUNMEAN","ANOMALY","CBL","PLOTCBL","IBL","PLOTIBL","GIBL","CALCBLOCKS","PLOTBLOCKS"] all_steps = ["CBL","PLOTCBL","IBL","PLOTIBL","GIBL","CALCBLOCKS","PLOTBLOCKS"] inconfig_list = sys.argv[1:] @@ -26,54 +25,6 @@ def main(): print('no data will be processed') - ###################################################################### - # Pre-Process Data: - ###################################################################### - # Regrid - #if ("REGRID" in steps_list_obs): - # print('Regridding Observations') - # regrid_config = config_metplus.replace_config_from_section(config, 'regrid_obs') - # RegridDataPlaneWrapper(regrid_config).run_all_times() - - #if ("REGRID" in steps_list_fcst): - # print('Regridding Model') - # regrid_config = config_metplus.replace_config_from_section(config, 'regrid_fcst') - # RegridDataPlaneWrapper(regrid_config).run_all_times() - - #Compute Daily Average - #if ("TIMEAVE" in steps_list_obs): - # print('Computing Time Averages') - # daily_config = config_metplus.replace_config_from_section(config, 'daily_mean_obs') - # PCPCombineWrapper(daily_config).run_all_times() - - #if ("TIMEAVE" in steps_list_fcst): - # print('Computing Time Averages') - # daily_config = config_metplus.replace_config_from_section(config, 'daily_mean_fcst') - # PCPCombineWrapper(daily_config).run_all_times() - - #Take a running mean - #if ("RUNMEAN" in steps_list_obs): - # print('Computing Obs Running means') - # rmean_config = config_metplus.replace_config_from_section(config, 'running_mean_obs') - # PCPCombineWrapper(rmean_config).run_all_times() - - #if ("RUNMEAN" in steps_list_fcst): - # print('Computing Model Running means') - # rmean_config = config_metplus.replace_config_from_section(config, 'running_mean_fcst') - # PCPCombineWrapper(rmean_config).run_all_times() - - #Compute anomaly - #if ("ANOMALY" in steps_list_obs): - # print('Computing Obs Anomalies') - # anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly_obs') - # PCPCombineWrapper(anomaly_config).run_all_times() - - #if ("ANOMALY" in steps_list_fcst): - # print('Computing Model Anomalies') - # anomaly_config = config_metplus.replace_config_from_section(config, 'anomaly_fcst') - # PCPCombineWrapper(anomaly_config).run_all_times() - - ###################################################################### # Blocking Calculation and Plotting ###################################################################### From 3920acc835ec06f843f396eb20efeb12f5e1d58e Mon Sep 17 00:00:00 2001 From: CPKalb Date: Thu, 11 Mar 2021 14:25:13 -0700 Subject: [PATCH 54/93] Update Blocking.py Cleaned up an unused variable --- .../s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py | 1 - 1 file changed, 1 deletion(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py index 22954dc776..3276b219e4 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py @@ -1,6 +1,5 @@ import os import numpy as np -#import netCDF4 import pandas as pd import datetime import bisect From 46c325f381dd7640f6cce426ed16fd0c51331d4a Mon Sep 17 00:00:00 2001 From: CPKalb Date: Sat, 13 Mar 2021 20:58:53 -0700 Subject: [PATCH 55/93] Update UserScript_obsERA_obsOnly_WeatherRegime.py --- .../s2s/UserScript_obsERA_obsOnly_WeatherRegime.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py index bb46ad8e1b..22c26a1192 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py +++ b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py @@ -12,9 +12,12 @@ # Scientific Objective # -------------------- # -# To perform a weather regime analysis using 500 mb height data. There are 3 -# steps in the weather regime analysis, elbow, EOFs, and K means, and 2 pre- -# processing steps, RegridDataPlane and PcpCombine. +# To perform a weather regime analysis using 500 mb height data. There are 2 pre- +# processing steps, RegridDataPlane and PcpCombine, and 3 steps in the weather regime +# analysis, elbow, EOFs, and K means. Elbow computes the sum of squared distances +# for clusters. It draws a straight line from the sum of squared distance for the +# clusters. his helps determine the optimal cluster number by examining the largest +# difference between the curve and the straight line. The EOFs step is optional. ############################################################################## # Datasets From 98cbaecae3a5812a02d2e89a0a11f6179ee95f6f Mon Sep 17 00:00:00 2001 From: CPKalb Date: Sat, 13 Mar 2021 21:02:39 -0700 Subject: [PATCH 56/93] Update UserScript_obsERA_obsOnly_WeatherRegime.py --- .../s2s/UserScript_obsERA_obsOnly_WeatherRegime.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py index 22c26a1192..687e19b58c 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py +++ b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py @@ -17,7 +17,8 @@ # analysis, elbow, EOFs, and K means. Elbow computes the sum of squared distances # for clusters. It draws a straight line from the sum of squared distance for the # clusters. his helps determine the optimal cluster number by examining the largest -# difference between the curve and the straight line. The EOFs step is optional. +# difference between the curve and the straight line. The EOFs step is optional. It +# computes an empirical orthogonal function analysis ############################################################################## # Datasets From b063194ecf5c4043b5178163d0f58556d6785453 Mon Sep 17 00:00:00 2001 From: CPKalb Date: Sat, 13 Mar 2021 21:18:14 -0700 Subject: [PATCH 57/93] Update UserScript_obsERA_obsOnly_WeatherRegime.py --- .../s2s/UserScript_obsERA_obsOnly_WeatherRegime.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py index 687e19b58c..f3d2ace9a2 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py +++ b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py @@ -14,11 +14,12 @@ # # To perform a weather regime analysis using 500 mb height data. There are 2 pre- # processing steps, RegridDataPlane and PcpCombine, and 3 steps in the weather regime -# analysis, elbow, EOFs, and K means. Elbow computes the sum of squared distances -# for clusters. It draws a straight line from the sum of squared distance for the -# clusters. his helps determine the optimal cluster number by examining the largest -# difference between the curve and the straight line. The EOFs step is optional. It -# computes an empirical orthogonal function analysis +# analysis, elbow, EOFs, and K means. The elbow and K means steps begin with K means +# clustering. Elbow then computes the sum of squared distances for clusters 1- 14 and +# draws a straight line from the sum of squared distance for the clusters. This helps +# determine the optimal cluster number by examining the largest difference between the +# curve and the straight line. The EOFs step is optional. It computes an empirical +# orthogonal function analysis. ############################################################################## # Datasets From 5e3ddd9b683179444dd67dff415c3ecaab50744f Mon Sep 17 00:00:00 2001 From: CPKalb Date: Sat, 13 Mar 2021 21:26:42 -0700 Subject: [PATCH 58/93] Update UserScript_obsERA_obsOnly_WeatherRegime.py --- .../s2s/UserScript_obsERA_obsOnly_WeatherRegime.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py index f3d2ace9a2..f99ea5928a 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py +++ b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py @@ -19,7 +19,8 @@ # draws a straight line from the sum of squared distance for the clusters. This helps # determine the optimal cluster number by examining the largest difference between the # curve and the straight line. The EOFs step is optional. It computes an empirical -# orthogonal function analysis. +# orthogonal function analysis. The K means step uses clustering to compute the +# frequency of occurrernce and anomalies for each cluster. ############################################################################## # Datasets From be23499c3cc8c531e9f542351d4692d07bb0e531 Mon Sep 17 00:00:00 2001 From: CPKalb Date: Tue, 16 Mar 2021 15:22:17 -0600 Subject: [PATCH 59/93] Update UserScript_obsERA_obsOnly_WeatherRegime.conf --- .../s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf index d415614bfc..9e89526751 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf @@ -91,7 +91,7 @@ REGRID_DATA_PLANE_METHOD = BILIN REGRID_DATA_PLANE_WIDTH = 2 # input and output data directories for each application in PROCESS_LIST -OBS_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds627.0/ei.oper.an.pl +OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/ERA/OrigData OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/WeatherRegime/ERA/Regrid # format of filenames From 02d3c86f60525f1a2ab16688a19d7021afb3c911 Mon Sep 17 00:00:00 2001 From: CPKalb Date: Tue, 16 Mar 2021 15:24:36 -0600 Subject: [PATCH 60/93] Update UserScript_obsERA_obsOnly_Blocking.conf Fixed Paths --- .../s2s/UserScript_obsERA_obsOnly_Blocking.conf | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf index 9b23aa2402..bb42459551 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf @@ -88,8 +88,8 @@ REGRID_DATA_PLANE_METHOD = BILIN REGRID_DATA_PLANE_WIDTH = 2 # input and output data directories for each application in PROCESS_LIST -OBS_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds627.0/ei.oper.an.pl -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Regrid +OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s/ERA/OrigData +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/ERA/Regrid # format of filenames # Input ERA Interim @@ -128,8 +128,8 @@ OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 OBS_PCP_COMBINE_OUTPUT_NAME = Z500 # Input and output Data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Regrid -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Daily +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/ERA/Regrid +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/ERA/Daily # Input and Output filename templates, ERA Interim OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc @@ -163,8 +163,8 @@ OBS_PCP_COMBINE_DERIVE_LOOKBACK = 120 OBS_PCP_COMBINE_OUTPUT_NAME = Z500 # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Daily -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Rmean5d +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/ERA/Daily +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/ERA/Rmean5d # format of filenames # Input ERA Interim @@ -188,8 +188,8 @@ OBS_PCP_COMBINE_METHOD = USER_DEFINED OBS_PCP_COMBINE_COMMAND = -subtract {OBS_PCP_COMBINE_INPUT_DIR}/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc {OBS_PCP_COMBINE_INPUT_DIR}/Rmean5d/Z500_5daymean_{valid?fmt=%Y%m%d}_NH.nc -field 'name="Z500"; level="(*,*)";' # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/Anomaly +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/ERA +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/ERA/Anomaly # format of filenames # Input ERA Interim From e5a3220cc08f5c0f2c25c4a453ebe40b59ca9bf4 Mon Sep 17 00:00:00 2001 From: CPKalb Date: Tue, 16 Mar 2021 15:26:36 -0600 Subject: [PATCH 61/93] Update UserScript_obsERA_obsOnly_WeatherRegime.conf --- .../s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf index 9e89526751..a2c4147fd1 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf @@ -91,7 +91,7 @@ REGRID_DATA_PLANE_METHOD = BILIN REGRID_DATA_PLANE_WIDTH = 2 # input and output data directories for each application in PROCESS_LIST -OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/ERA/OrigData +OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s/ERA/OrigData OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/WeatherRegime/ERA/Regrid # format of filenames From 27e06b7430320bcf18bdb4253ff487cfe27ad0a5 Mon Sep 17 00:00:00 2001 From: CPKalb Date: Tue, 16 Mar 2021 15:31:01 -0600 Subject: [PATCH 62/93] Update UserScript_fcstGFS_obsERA_Blocking.conf --- .../UserScript_fcstGFS_obsERA_Blocking.conf | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf index 47ca3bf657..aa3eff30cf 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf @@ -99,7 +99,7 @@ REGRID_DATA_PLANE_WIDTH = 2 # input and output data directories for each application in PROCESS_LIST FCST_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/p/ral/jntp/GMTB/Phys_Test_FV3GFSv2/POST/suite1/ -FCST_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/FV3GFS/Regrid +FCST_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/FV3GFS/Regrid # format of filenames # Input ERA Interim @@ -154,7 +154,7 @@ REGRID_DATA_PLANE_WIDTH = 2 # input and output data directories for each application in PROCESS_LIST OBS_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds627.0/ei.oper.an.pl -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Regrid +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Regrid # format of filenames # Input ERA Interim @@ -193,8 +193,8 @@ FCST_PCP_COMBINE_METHOD = USER_DEFINED FCST_PCP_COMBINE_COMMAND = -derive MEAN {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=75600}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=64800}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=54000}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=43200}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=32400}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=21600}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH?shift=10800}_NH.nc {FCST_PCP_COMBINE_INPUT_DIR}/{init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc -field 'name="Z500"; level="(*,*)"; convert(x) = x / 9.81; set_attr_valid = "{init?fmt=%Y%m%d_%H%M%S}";' # input and output data directories for each application in PROCESS_LIST -FCST_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/FV3GFS/Regrid -FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/FV3GFS/Daily +FCST_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/FV3GFS/Regrid +FCST_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/FV3GFS/Daily # Input ERA Interim FCST_PCP_COMBINE_INPUT_TEMPLATE = {init?fmt=%Y%m%d%H}/Z500_3hourly_{init?fmt=%Y%m%d%H}_{lead?fmt=%HHH}_NH.nc @@ -239,8 +239,8 @@ OBS_PCP_COMBINE_OUTPUT_ACCUM = 24 OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Regrid -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Daily +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Regrid +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily # Input ERA Interim OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc @@ -289,8 +289,8 @@ OBS_PCP_COMBINE_OUTPUT_ACCUM = 120 OBS_PCP_COMBINE_DERIVE_LOOKBACK = 120 # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Daily -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Rmean5d +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Rmean5d # format of filenames # Input ERA Interim @@ -332,8 +332,8 @@ OBS_PCP_COMBINE_METHOD = USER_DEFINED OBS_PCP_COMBINE_COMMAND = -subtract {OBS_PCP_COMBINE_INPUT_DIR}/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc {OBS_PCP_COMBINE_INPUT_DIR}/Rmean5d/Z500_5daymean_{valid?fmt=%Y%m%d}_NH.nc -field 'name="Z500"; level="(*,*)";' # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/ERA/Anomaly +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly # format of filenames # Input ERA Interim From 083c58536aacd5a13cb3c3fdd98b433d3aedc32c Mon Sep 17 00:00:00 2001 From: CPKalb Date: Tue, 16 Mar 2021 15:34:03 -0600 Subject: [PATCH 63/93] Update UserScript_obsERA_obsOnly_Blocking.conf --- .../s2s/UserScript_obsERA_obsOnly_Blocking.conf | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf index bb42459551..8c7db14c49 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf @@ -88,8 +88,8 @@ REGRID_DATA_PLANE_METHOD = BILIN REGRID_DATA_PLANE_WIDTH = 2 # input and output data directories for each application in PROCESS_LIST -OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s/ERA/OrigData -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/ERA/Regrid +OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/OrigData +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Regrid # format of filenames # Input ERA Interim @@ -163,8 +163,8 @@ OBS_PCP_COMBINE_DERIVE_LOOKBACK = 120 OBS_PCP_COMBINE_OUTPUT_NAME = Z500 # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/ERA/Daily -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/ERA/Rmean5d +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/UserScript_fcstGFS_obsERA_Blocking/s2s/ERA/Daily +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/UserScript_fcstGFS_obsERA_Blocking/s2s/ERA/Rmean5d # format of filenames # Input ERA Interim @@ -188,8 +188,8 @@ OBS_PCP_COMBINE_METHOD = USER_DEFINED OBS_PCP_COMBINE_COMMAND = -subtract {OBS_PCP_COMBINE_INPUT_DIR}/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc {OBS_PCP_COMBINE_INPUT_DIR}/Rmean5d/Z500_5daymean_{valid?fmt=%Y%m%d}_NH.nc -field 'name="Z500"; level="(*,*)";' # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/ERA -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/ERA/Anomaly +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly # format of filenames # Input ERA Interim From 0f41bc74a4d0e8f2577d776cefafce86dfcf9fd9 Mon Sep 17 00:00:00 2001 From: CPKalb Date: Tue, 16 Mar 2021 15:51:56 -0600 Subject: [PATCH 64/93] Update UserScript_obsERA_obsOnly_WeatherRegime.conf --- .../s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf index a2c4147fd1..ba76b11a68 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf @@ -91,8 +91,8 @@ REGRID_DATA_PLANE_METHOD = BILIN REGRID_DATA_PLANE_WIDTH = 2 # input and output data directories for each application in PROCESS_LIST -OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s/ERA/OrigData -OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/WeatherRegime/ERA/Regrid +OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ERA/OrigData +OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ERA/Regrid # format of filenames # Input and output ERA Interim @@ -130,8 +130,8 @@ OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 OBS_PCP_COMBINE_OUTPUT_NAME = Z500 # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/WeatherRegime/ERA/Regrid -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/WeatherRegime/ERA/Daily +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ERA/Regrid +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ERA/Daily # Input ERA Interim OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc From ba5ac0281ebf5af63b2e2ffe207d094032082710 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Tue, 16 Mar 2021 16:23:07 -0600 Subject: [PATCH 65/93] Fixed some variable paths --- .../Blocking_fcstGFS_obsERA.conf | 8 ++++---- .../Regrid_PCP_obsERA_obsOnly_Blocking.conf | 6 +++--- .../WeatherRegime_obsERA_obsOnly.conf | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_fcstGFS_obsERA.conf b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_fcstGFS_obsERA.conf index a95ef12463..e1c5579251 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_fcstGFS_obsERA.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_fcstGFS_obsERA.conf @@ -47,15 +47,15 @@ CBL_VALID_END = 2017022800 USE_CBL_OBS = True # Directory for the Z500 anomaly data to read in to the blocking python code -OBS_BLOCKING_ANOMALY_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc +OBS_BLOCKING_ANOMALY_TEMPLATE = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc # Variable Name for the Z500 anomaly data to read in to the blocking python code FCST_BLOCKING_ANOMALY_VAR = Z500_P500 OBS_BLOCKING_ANOMALY_VAR = Z500_ANA # Directory for the Z500 data to read in to the blocking python code -FCST_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/FV3GFS/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc -OBS_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +FCST_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/FV3GFS/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc # Variable for the Z500 data FCST_BLOCKING_VAR = Z500_NA_MEAN @@ -100,7 +100,7 @@ FCST_BLOCK_METHOD = PH OBS_BLOCK_METHOD = {FCST_BLOCK_METHOD} # Plots Output Dir -BLOCKING_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/plots/ +BLOCKING_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/plots/ #CBL plot title and output namename OBS_CBL_PLOT_MTHSTR = DJF diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking.conf index 01fb3a137b..790e2631a9 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking.conf @@ -39,13 +39,13 @@ SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" # Variables specific to the blocking analysis [Blocking] # Directory for the Z500 anomaly data to read in to the blocking python code -OBS_BLOCKING_ANOMALY_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc +OBS_BLOCKING_ANOMALY_TEMPLATE = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc # Variable Name for the Z500 anomaly data to read in to the blocking python code OBS_BLOCKING_ANOMALY_VAR = Z500_ANA # Directory for the Z500 data to read in to the blocking python code -OBS_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc # Variable for the Z500 data OBS_BLOCKING_VAR = Z500 @@ -80,7 +80,7 @@ OBS_BLOCK_TRAVEL = 45 OBS_BLOCK_METHOD = PH # Plot Output Directory -BLOCKING_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/Blocking/plots/ +BLOCKING_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/plots/ #CBL plot title and name OBS_CBL_PLOT_MTHSTR = DJF diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_obsERA_obsOnly.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_obsERA_obsOnly.conf index 2ef66dfeba..d11dcb58f0 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_obsERA_obsOnly.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_obsERA_obsOnly.conf @@ -39,7 +39,7 @@ LOOP_ORDER = processes # Variables Specific to Weather Regime analysis [WeatherRegime] # Directory for the Z500 data to read in to the blocking python code -OBS_WR_TEMPLATE = {OUTPUT_BASE}/s2s/WeatherRegime/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_WR_TEMPLATE = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc # Variable for the Z500 data OBS_WR_VAR = Z500 @@ -58,10 +58,10 @@ OBS_NUM_PCS = 10 #OBS_WR_OUTPUT_FILE_TYPE = text OBS_WR_OUTPUT_FILE_TYPE = netcdf OBS_WR_OUTPUT_FILE = obs_weather_regime_class -WR_OUTPUT_FILE_DIR = {OUTPUT_BASE}/s2s/WeatherRegime +WR_OUTPUT_FILE_DIR = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_WeatherRegime # Directory to send output plots -WR_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/WeatherRegime/plots/ +WR_PLOT_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_WeatherRegime/plots/ # Elbow Plot Title and output file name OBS_ELBOW_PLOT_TITLE = Elbow Method For Optimal k From bd0883ccc252d0d335d0b6112c0aaae14dbf4061 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Tue, 16 Mar 2021 16:41:11 -0600 Subject: [PATCH 66/93] Fixed typo --- .../Blocking_driver.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py index a78287847d..b16b757585 100755 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py @@ -5,6 +5,13 @@ import netCDF4 import re +mp_fpath = os.path.abspath(__file__) +mp_fpath_split = str.split(mp_fpath,os.path.sep) +mp_loc_ind = mp_fpath_split.index('METplus') + +sys.path.insert(0,os.path.sep.join(mp_fpath_split[0:mp_loc_ind+1])) +sys.path.insert(0, os.path.sep.join(mp_fpath_split[0:mp_loc_ind])+"/METplotpy") + from Blocking import BlockingCalculation from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub @@ -65,13 +72,15 @@ def main(): if ("CBL" in steps_list_obs): print('Computing Obs CBLs') - obs_infiles,yr_obs,mth_obs,day_obs,yr_full_obs = find_input_files(cbl_config, use_init, 'OBS_BLOCKING_ANOMALY_TEMPLATE') + obs_infiles,yr_obs,mth_obs,day_obs,yr_full_obs = find_input_files(cbl_config, use_init, + 'OBS_BLOCKING_ANOMALY_TEMPLATE') cbls_obs,lats_obs,lons_obs,yr_obs,mhweight_obs = steps_obs.run_CBL(obs_infiles,yr_obs) if ("CBL" in steps_list_fcst) and not use_cbl_obs: # Add in step to use obs for CBLS print('Computing Forecast CBLs') - fcst_infiles,yr_fcst,mth_fcst,day_fcst,yr_full_fcst = find_input_files(cbl_config, use_init, 'FCST_BLOCKING_ANOMALY_TEMPLATE') + fcst_infiles,yr_fcst,mth_fcst,day_fcst,yr_full_fcst = find_input_files(cbl_config, use_init, + 'FCST_BLOCKING_ANOMALY_TEMPLATE') cbls_fcst,lats_fcst,lons_fcst,yr_fcst,mhweight_fcst = steps_fcst.run_CBL(fcst_infiles,yr_fcst) elif ("CBL" in steps_list_fcst) and use_cbl_obs: if not ("CBL" in steps_list_obs): @@ -120,13 +129,14 @@ def main(): if (not "CBL" in steps_list_fcst): raise Exception('Must run forecast CBLs or use observed CBLs before running IBLs.') print('Computing Forecast IBLs') - fcst_infiles,yr_fcst,mth_fcst,day_fcst,yr_full_fcst = find_input_files(ibl_config, use_init, 'FCST_BLOCKING_TEMPLATE') + fcst_infiles,yr_fcst,mth_fcst,day_fcst,yr_full_fcst = find_input_files(ibl_config, use_init, + 'FCST_BLOCKING_TEMPLATE') ibls_fcst = steps_fcst.run_Calc_IBL(cbls_fcst,fcst_infiles,yr_fcst) daynum_fcst = np.arange(0,len(ibls_fcst[0,:,0]),1) elif ("IBL" in steps_list_obs) and ("IBL" in steps_list_fcst): if not ("CBL" in steps_list_obs) and not ("CBL" in steps_list_fcst): raise Exception('Must run observed and forecast CBLs before running IBLs.') - both_infiles,yr_obs,mth_obs,day_obs = find_input_files(ibl_config, use_init, 'OBS_BLOCKING_TEMPLATE', + both_infiles,yr_obs,mth_obs,day_obs,yr_full_obs = find_input_files(ibl_config, use_init, 'OBS_BLOCKING_TEMPLATE', secondtemplate='FCST_BLOCKING_TEMPLATE') obs_infiles = both_infiles[0] fcst_infiles = both_infiles[1] From 77611212b0b0e941f9ca2a83d084a8ba52c0a499 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Tue, 16 Mar 2021 16:46:52 -0600 Subject: [PATCH 67/93] Updated .conf file name --- .../s2s/UserScript_obsERA_obsOnly_Blocking.conf | 2 +- ...bsERA_obsOnly_Blocking.conf => Blocking_obsERA_obsOnly.conf} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/{Regrid_PCP_obsERA_obsOnly_Blocking.conf => Blocking_obsERA_obsOnly.conf} (100%) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf index 8c7db14c49..c592d7633b 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf @@ -207,4 +207,4 @@ USER_SCRIPT_CUSTOM_LOOP_LIST = nc USER_SCRIPT_RUNTIME_FREQ = RUN_ONCE # Command to run the user script with input configuration file -USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking.conf dir.INPUT_BASE={INPUT_BASE} dir.OUTPUT_BASE={OUTPUT_BASE} dir.MET_INSTALL_DIR={MET_INSTALL_DIR} +USER_SCRIPT_COMMAND = {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py {METPLUS_BASE}/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_obsERA_obsOnly.conf dir.INPUT_BASE={INPUT_BASE} dir.OUTPUT_BASE={OUTPUT_BASE} dir.MET_INSTALL_DIR={MET_INSTALL_DIR} diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_obsERA_obsOnly.conf similarity index 100% rename from parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_Blocking.conf rename to parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_obsERA_obsOnly.conf From ee36af52607fb99737b21f82b969d12b77fa0231 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Tue, 16 Mar 2021 17:22:46 -0600 Subject: [PATCH 68/93] Updated documentation --- .../s2s/UserScript_fcstGFS_obsERA_Blocking.py | 18 +++++++------- .../s2s/UserScript_obsERA_obsOnly_Blocking.py | 19 ++++++++------- ...UserScript_obsERA_obsOnly_WeatherRegime.py | 24 ++++++++++--------- 3 files changed, 34 insertions(+), 27 deletions(-) diff --git a/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py b/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py index 0ebed36053..cb34274883 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py +++ b/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py @@ -28,12 +28,11 @@ # ------------------ # # This use case runs the blocking driver script which runs the steps the user -# lists in STEPS_OBS. The possible steps are regridding (REGRID), time averaging -# (TIMEAVE), computing a running mean (RMEAN), computing anomalies (ANOMALY), computing CBLs -# (CBL), plotting CBLs (PLOTCBL), computing IBLs (IBL), plotting IBL frequency (PLOTIBL), -# computing GIBLs (GIBL), computing blocks (CALCBLOCKS), and plotting the blocking frequency -# (PLOTBLOCKS). Regridding, time averaging, running means, and anomaloies are set up in the -# UserScript .conf file and are formatted as follows: +# lists in STEPS_OBS. The possible steps are regridding, time averaging, computing a running +# mean, computing anomalies, computing CBLs (CBL), plotting CBLs (PLOTCBL), computing IBLs (IBL), +# plotting IBL frequency (PLOTIBL), computing GIBLs (GIBL), computing blocks (CALCBLOCKS), and +# plotting the blocking frequency (PLOTBLOCKS). Regridding, time averaging, running means, and +# anomaloies are set up in the UserScript .conf file and are formatted as follows: # PROCESS_LIST = RegridDataPlane(regrid_fcst), RegridDataPlane(regrid_obs), PcpCombine(daily_mean_fcst), PcpCombine(daily_mean_obs), PcpCombine(running_mean_obs), PcpCombine(anomaly_obs), UserScript(script_blocking) # # The other steps are listed in the Blocking .conf file and are formatted as follows: @@ -44,8 +43,11 @@ # METplus Workflow # ---------------- # -# The regrid_data_plane, pcp_combine, and blocking python code are run for each -# time for the forecast and observations data. This example loops by init time. +# The blocking python code is run for each time for the forecast and observations data. This +# example loops by init time for the model pre-processing, and valid time for the other steps. +# This version is set to only process the blocking steps (CBL, PLOTCBL, IBL, PLOTIBL), omitting +# the regridding, time averaging, running mean, and anomaly pre-processing steps. However, the +# configurations for pre-processing are available for user reference. ############################################################################## # METplus Configuration diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py index a21e8b3306..3691f52972 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py +++ b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py @@ -28,12 +28,12 @@ # ------------------ # # This use case runs the blocking driver script which runs the steps the user -# lists in STEPS_OBS. The possible steps are regridding (REGRID), time averaging -# (TIMEAVE), computing a running mean (RMEAN), computing anomalies (ANOMALY), computing CBLs -# (CBL), plotting CBLs (PLOTCBL), computing IBLs (IBL), plotting IBL frequency (PLOTIBL), -# computing GIBLs (GIBL), computing blocks (CALCBLOCKS), and plotting the blocking frequency -# (PLOTBLOCKS). Regridding, time averaging, running means, and anomaloies are set up in the -# UserScript .conf file and are formatted as follows: +# lists in STEPS_OBS. The possible steps are regridding, time averaging, computing a +# running mean, computing anomalies, computing CBLs (CBL), plotting CBLs (PLOTCBL), +# computing IBLs (IBL), plotting IBL frequency (PLOTIBL), computing GIBLs (GIBL), +# computing blocks (CALCBLOCKS), and plotting the blocking frequency (PLOTBLOCKS). +# Regridding, time averaging, running means, and anomaloies are set up in the UserScript +# .conf file and are formatted as follows: # PROCESS_LIST = RegridDataPlane(regrid_obs), PcpCombine(daily_mean_obs), PcpCombine(running_mean_obs), PcpCombine(anomaly_obs), UserScript(script_blocking) # # The other steps are listed in the Blocking .conf file and are formatted as follows: @@ -44,8 +44,11 @@ # METplus Workflow # ---------------- # -# The regrid_data_plane, pcp_combine, and blocking python code are run for each -# time for the forecast and observations data. This example loops by valid time. +# The blocking python code is run for each time for the forecast and observations +# data. This example loops by valid time. This version is set to only process the blocking +# steps (CBL, PLOTCBL, IBL, PLOTIBL, GIBL, CALCBLOCKS, PLOTBLOCKS), omitting the regridding, +# time averaging, running mean, and anomaly pre-processing steps. However, the configurations +# for pre-processing are available for user reference. ############################################################################## # METplus Configuration diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py index f99ea5928a..4a759e9676 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py +++ b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py @@ -15,10 +15,10 @@ # To perform a weather regime analysis using 500 mb height data. There are 2 pre- # processing steps, RegridDataPlane and PcpCombine, and 3 steps in the weather regime # analysis, elbow, EOFs, and K means. The elbow and K means steps begin with K means -# clustering. Elbow then computes the sum of squared distances for clusters 1- 14 and -# draws a straight line from the sum of squared distance for the clusters. This helps -# determine the optimal cluster number by examining the largest difference between the -# curve and the straight line. The EOFs step is optional. It computes an empirical +# clustering. Elbow then computes the sum of squared distances for clusters 1 - 14 +# and draws a straight line from the sum of squared distance for the clusters. This +# helps determine the optimal cluster number by examining the largest difference between +# the curve and the straight line. The EOFs step is optional. It computes an empirical # orthogonal function analysis. The K means step uses clustering to compute the # frequency of occurrernce and anomalies for each cluster. @@ -34,11 +34,10 @@ # ------------------ # # This use case runs the weather regime driver script which runs the steps the user -# lists in STEPS_OBS. The possible steps are regridding (REGRID), time averaging -# (TIMEAVE), computing the elbow (ELBOW), plotting the elbow (PLOTELBOW), computing -# EOFs (EOF), plotting EOFs (PLOTEOF), computing K means (KMEANS), and plotting the -# K means (PLOTKMEANS). Regridding and time averaging are set up in the UserScript -# .conf file and are formatted as follows: +# lists in STEPS_OBS. The possible steps are regridding, time averaging, computing the +# elbow (ELBOW), plotting the elbow (PLOTELBOW), computing EOFs (EOF), plotting EOFs +# (PLOTEOF), computing K means (KMEANS), and plotting the K means (PLOTKMEANS). Regridding +# and time averaging are set up in the UserScript .conf file and are formatted as follows: # PROCESS_LIST = RegridDataPlane(regrid_obs), PcpCombine(daily_mean_obs), UserScript(script_wr) # # The other steps are listed in the weather regime analsysis .conf file @@ -49,8 +48,11 @@ # METplus Workflow # ---------------- # -# The regrid_data_plane, pcp_combine, and weather regime python code are run for -# each time for the forecast and observations data. This example loops by valid time. +# The weather regime python code is run for each time for the forecast and observations +# data. This example loops by valid time. This version is set to only process the weather +# regime steps (ELBOW, PLOTELBOW, EOF, PLOTEOF, KMEANS, PLOTKMEANS), omitting the REGRID +# and TIMEAVE pre-processing steps. However, the configurations for pre-processing are +# available for user reference. ############################################################################## # METplus Configuration From adf01c67b1a15e6165c2059c0f7922c8f3648679 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Wed, 17 Mar 2021 00:21:37 -0600 Subject: [PATCH 69/93] Added useful error message --- .../Blocking_WeatherRegime_util.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/Blocking_WeatherRegime_util.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/Blocking_WeatherRegime_util.py index bbf633bad0..afaa39ce53 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/Blocking_WeatherRegime_util.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/Blocking_WeatherRegime_util.py @@ -94,6 +94,9 @@ def find_input_files(inconfig, use_init, intemplate, secondtemplate=''): file_list = [file_list,file_list2] yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) + if all('' == fn for fn in file_list): + raise Exception('No input files found as given: '+template) + return file_list, yr_list, mth_list, day_list, yr_full_list def read_nc_met(infiles,yrlist,invar): From 15afd5d958a0edb4fd33e92ba4fc1a2630399abe Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Wed, 17 Mar 2021 11:22:51 -0600 Subject: [PATCH 70/93] Fixed typo in blocking driver --- .../UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py index b16b757585..3636f3455d 100755 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py @@ -5,13 +5,6 @@ import netCDF4 import re -mp_fpath = os.path.abspath(__file__) -mp_fpath_split = str.split(mp_fpath,os.path.sep) -mp_loc_ind = mp_fpath_split.index('METplus') - -sys.path.insert(0,os.path.sep.join(mp_fpath_split[0:mp_loc_ind+1])) -sys.path.insert(0, os.path.sep.join(mp_fpath_split[0:mp_loc_ind])+"/METplotpy") - from Blocking import BlockingCalculation from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub From ced59f30bedf8d4b0a99a0c94e1579e11a5d0261 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Wed, 17 Mar 2021 12:57:02 -0600 Subject: [PATCH 71/93] Testing a ci_overrides file --- internal_tests/use_cases/all_use_cases.txt | 6 +++--- .../Blocking_WeatherRegime_util.py | 3 +++ .../ci_overrides.conf | 11 +++++++++++ .../ci_overrides.conf | 7 +++++++ 4 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/ci_overrides.conf create mode 100644 parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ci_overrides.conf diff --git a/internal_tests/use_cases/all_use_cases.txt b/internal_tests/use_cases/all_use_cases.txt index 6c978bdfac..e7002025a0 100644 --- a/internal_tests/use_cases/all_use_cases.txt +++ b/internal_tests/use_cases/all_use_cases.txt @@ -114,9 +114,9 @@ Category: precipitation Category: s2s 0::GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast:: model_applications/s2s/GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast.conf::netCDF4 -1::UserScript_fcstGFS_obsERA_Blocking:: model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf::cartopy,scipy,METplotpy,METcalcpy,eofs -2::UserScript_obsERA_obsOnly_Blocking:: model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf::cartopy,scipy,METplotpy,METcalcpy,eofs -3::UserScript_obsERA_obsOnly_WeatherRegime:: model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf::cartopy,scipy,METplotpy,METcalcpy,eofs +1::UserScript_fcstGFS_obsERA_Blocking:: model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf::cartopy,scipy,METplotpy,METcalcpy +2::UserScript_obsERA_obsOnly_Blocking:: model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf,model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/ci_overrides.conf::cartopy,scipy,METplotpy,METcalcpy +3::UserScript_obsERA_obsOnly_WeatherRegime:: model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf,model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ci_overrides.conf::cartopy,scipy,METplotpy,METcalcpy,eofs diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_WeatherRegime_util.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_WeatherRegime_util.py index bbf633bad0..afaa39ce53 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_WeatherRegime_util.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_WeatherRegime_util.py @@ -94,6 +94,9 @@ def find_input_files(inconfig, use_init, intemplate, secondtemplate=''): file_list = [file_list,file_list2] yr_list.append(int(outtimestuff['valid'].strftime('%Y'))) + if all('' == fn for fn in file_list): + raise Exception('No input files found as given: '+template) + return file_list, yr_list, mth_list, day_list, yr_full_list def read_nc_met(infiles,yrlist,invar): diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/ci_overrides.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/ci_overrides.conf new file mode 100644 index 0000000000..0bb7cd4b88 --- /dev/null +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/ci_overrides.conf @@ -0,0 +1,11 @@ +[config] +# CI OVERRIDE for model_applications/s2s/Blocking_obsERA_obsOnly.conf +# these settings can overrides the settings in the use case conf so they run in a reasonable amount +# of time in automation + +[Blocking] +# Directory for the Z500 anomaly data to read in to the blocking python code +OBS_BLOCKING_ANOMALY_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc + +# Directory for the Z500 data to read in to the blocking python code +OBS_BLOCKING_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ci_overrides.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ci_overrides.conf new file mode 100644 index 0000000000..1020eaefa7 --- /dev/null +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ci_overrides.conf @@ -0,0 +1,7 @@ +[config] +# CI OVERRIDE for model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTemp.conf +# these settings can overrides the settings in the use case conf so they run in a reasonable amount +# of time in automation + +[WeatherRegime] +OBS_WR_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc From 5dd6d50256592eb309132dc8806e796bbcb0de06 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Wed, 17 Mar 2021 13:35:17 -0600 Subject: [PATCH 72/93] Testing ci_overrides file --- internal_tests/use_cases/all_use_cases.txt | 2 +- .../ci_overrides.conf | 12 ++++++++++++ .../ci_overrides.conf | 6 +++--- .../ci_overrides.conf | 6 +++--- 4 files changed, 19 insertions(+), 7 deletions(-) create mode 100644 parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ci_overrides.conf diff --git a/internal_tests/use_cases/all_use_cases.txt b/internal_tests/use_cases/all_use_cases.txt index e7002025a0..64636656e6 100644 --- a/internal_tests/use_cases/all_use_cases.txt +++ b/internal_tests/use_cases/all_use_cases.txt @@ -114,7 +114,7 @@ Category: precipitation Category: s2s 0::GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast:: model_applications/s2s/GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast.conf::netCDF4 -1::UserScript_fcstGFS_obsERA_Blocking:: model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf::cartopy,scipy,METplotpy,METcalcpy +1::UserScript_fcstGFS_obsERA_Blocking:: model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf,model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ci_overrides.conf::cartopy,scipy,METplotpy,METcalcpy 2::UserScript_obsERA_obsOnly_Blocking:: model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf,model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/ci_overrides.conf::cartopy,scipy,METplotpy,METcalcpy 3::UserScript_obsERA_obsOnly_WeatherRegime:: model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf,model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ci_overrides.conf::cartopy,scipy,METplotpy,METcalcpy,eofs diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ci_overrides.conf b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ci_overrides.conf new file mode 100644 index 0000000000..75f1d11c5e --- /dev/null +++ b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ci_overrides.conf @@ -0,0 +1,12 @@ +[config] +# CI OVERRIDE for model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_fcstGFS_obsERA.conf +# these settings can overrides the settings in the use case conf so that they are able to find the data with the +# pre-processing steps omitted + +[Blocking] +# Directory for the Z500 anomaly data to read in to the blocking python code +OBS_BLOCKING_ANOMALY_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc + +# Directory for the Z500 data to read in to the blocking python code +FCST_BLOCKING_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/FV3GFS/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_BLOCKING_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/ci_overrides.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/ci_overrides.conf index 0bb7cd4b88..bda254ae01 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/ci_overrides.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/ci_overrides.conf @@ -1,7 +1,7 @@ [config] -# CI OVERRIDE for model_applications/s2s/Blocking_obsERA_obsOnly.conf -# these settings can overrides the settings in the use case conf so they run in a reasonable amount -# of time in automation +# CI OVERRIDE for model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_obsERA_obsOnly.conf +# these settings can overrides the settings in the use case conf so that they are able to find the data with the +# pre-processing steps omitted [Blocking] # Directory for the Z500 anomaly data to read in to the blocking python code diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ci_overrides.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ci_overrides.conf index 1020eaefa7..92ef79d812 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ci_overrides.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ci_overrides.conf @@ -1,7 +1,7 @@ [config] -# CI OVERRIDE for model_applications/convection_allowing_models/MODE_fcstFV3_obsGOES_BrightnessTemp.conf -# these settings can overrides the settings in the use case conf so they run in a reasonable amount -# of time in automation +# CI OVERRIDE for model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_obsERA_obsOnly.conf +# these settings can overrides the settings in the use case conf so that they are able to find the data with the +# pre-processing steps omitted [WeatherRegime] OBS_WR_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc From 6f54f67608e23ce82515ec96d4bb89d32eaa3c63 Mon Sep 17 00:00:00 2001 From: CPKalb Date: Wed, 17 Mar 2021 13:46:42 -0600 Subject: [PATCH 73/93] Update main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d6f4f86ed7..0ed1b02a9d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -109,7 +109,7 @@ jobs: - "precipitation:1" - "precipitation:2" - "precipitation:3-8" - - "s2s:0" + - "s2s:0-3" - "space_weather:0-1" - "tc_and_extra_tc:0-2" steps: From 85dba4c0196cb6e611fb5492aab7c94278f1e0e1 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Wed, 17 Mar 2021 14:00:34 -0600 Subject: [PATCH 74/93] Fixed a path --- .../s2s/UserScript_obsERA_obsOnly_Blocking.conf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf index c592d7633b..e0d732c8db 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf @@ -88,7 +88,7 @@ REGRID_DATA_PLANE_METHOD = BILIN REGRID_DATA_PLANE_WIDTH = 2 # input and output data directories for each application in PROCESS_LIST -OBS_REGRID_DATA_PLANE_INPUT_DIR = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/OrigData +OBS_REGRID_DATA_PLANE_INPUT_DIR = /gpfs/fs1/collections/rda/data/ds627.0/ei.oper.an.pl OBS_REGRID_DATA_PLANE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Regrid # format of filenames @@ -128,8 +128,8 @@ OBS_PCP_COMBINE_DERIVE_LOOKBACK = 24 OBS_PCP_COMBINE_OUTPUT_NAME = Z500 # Input and output Data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/ERA/Regrid -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/ERA/Daily +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Regrid +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily # Input and Output filename templates, ERA Interim OBS_PCP_COMBINE_INPUT_TEMPLATE = {valid?fmt=%Y%m%d}/Z500_6hourly_{valid?fmt=%Y%m%d%H}_NH.nc @@ -163,7 +163,7 @@ OBS_PCP_COMBINE_DERIVE_LOOKBACK = 120 OBS_PCP_COMBINE_OUTPUT_NAME = Z500 # input and output data directories for each application in PROCESS_LIST -OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/UserScript_fcstGFS_obsERA_Blocking/s2s/ERA/Daily +OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/UserScript_fcstGFS_obsERA_Blocking/s2s/ERA/Rmean5d # format of filenames From 55b6883a03e9b34aaf919328cc28d94fa41f3979 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Wed, 17 Mar 2021 14:36:40 -0600 Subject: [PATCH 75/93] Updated documentation --- .../s2s/UserScript_obsERA_obsOnly_WeatherRegime.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py index 4a759e9676..f3bb4857e4 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py +++ b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py @@ -62,8 +62,8 @@ # then it loads any configuration files passed to METplus via the command line # i.e. parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py. # The file UserScript_obsERA_obsOnly_WeatherRegime.conf runs the python program, however -# UserScript_obsERA_obsOnly_Blocking/Regrid_PCP_obsERA_obsOnly_WeatherRegime.conf sets the -# variables for all steps of the Weather Regime use case. +# UserScript_obsERA_obsOnly_Blocking/WeatherRegime_obsERA_obsOnly.conf sets the variables +# for all steps of the Weather Regime use case including data paths. # # .. highlight:: bash # .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s From ae50fd1e863fe6975e23ea5f5215c333f2350e69 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Wed, 17 Mar 2021 14:50:12 -0600 Subject: [PATCH 76/93] Updated documentation --- .../s2s/UserScript_fcstGFS_obsERA_Blocking.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py b/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py index cb34274883..b136b77dd6 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py +++ b/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py @@ -57,8 +57,8 @@ # then it loads any configuration files passed to METplus via the command line # i.e. parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py. # The file UserScript_fcstGFS_obsERA_Blocking.conf runs the python program, however -# UserScript_fcstGFS_obsERA_Blocking/Regrid_PCP_fcstGFS_obsERA_Blocking.conf sets the -# variables for all steps of the Blocking use case. +# UserScript_fcstGFS_obsERA_Blocking/Blocking_fcstGFS_obsERA.conf sets the variables +# for all steps of the Blocking use case including data paths. # # .. highlight:: bash # .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s From 01f73c3a31151795b5330f0551377cdcde731144 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Wed, 17 Mar 2021 15:01:16 -0600 Subject: [PATCH 77/93] Path Testing --- internal_tests/use_cases/all_use_cases.txt | 2 +- .../Blocking_obsERA_obsOnly.conf | 6 ++++-- .../ci_overrides.conf | 11 ----------- 3 files changed, 5 insertions(+), 14 deletions(-) delete mode 100644 parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/ci_overrides.conf diff --git a/internal_tests/use_cases/all_use_cases.txt b/internal_tests/use_cases/all_use_cases.txt index 64636656e6..70ba7decdf 100644 --- a/internal_tests/use_cases/all_use_cases.txt +++ b/internal_tests/use_cases/all_use_cases.txt @@ -115,7 +115,7 @@ Category: precipitation Category: s2s 0::GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast:: model_applications/s2s/GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast.conf::netCDF4 1::UserScript_fcstGFS_obsERA_Blocking:: model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf,model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ci_overrides.conf::cartopy,scipy,METplotpy,METcalcpy -2::UserScript_obsERA_obsOnly_Blocking:: model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf,model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/ci_overrides.conf::cartopy,scipy,METplotpy,METcalcpy +2::UserScript_obsERA_obsOnly_Blocking:: model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf::cartopy,scipy,METplotpy,METcalcpy 3::UserScript_obsERA_obsOnly_WeatherRegime:: model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf,model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ci_overrides.conf::cartopy,scipy,METplotpy,METcalcpy,eofs diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_obsERA_obsOnly.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_obsERA_obsOnly.conf index 790e2631a9..910c198f84 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_obsERA_obsOnly.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_obsERA_obsOnly.conf @@ -39,13 +39,15 @@ SKIP_TIMES = "%m:begin_end_incr(3,11,1)", "%m%d:0229" # Variables specific to the blocking analysis [Blocking] # Directory for the Z500 anomaly data to read in to the blocking python code -OBS_BLOCKING_ANOMALY_TEMPLATE = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc +#OBS_BLOCKING_ANOMALY_TEMPLATE = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc +OBS_BLOCKING_ANOMALY_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc # Variable Name for the Z500 anomaly data to read in to the blocking python code OBS_BLOCKING_ANOMALY_VAR = Z500_ANA # Directory for the Z500 data to read in to the blocking python code -OBS_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +#OBS_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_BLOCKING_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc # Variable for the Z500 data OBS_BLOCKING_VAR = Z500 diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/ci_overrides.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/ci_overrides.conf deleted file mode 100644 index bda254ae01..0000000000 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/ci_overrides.conf +++ /dev/null @@ -1,11 +0,0 @@ -[config] -# CI OVERRIDE for model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_obsERA_obsOnly.conf -# these settings can overrides the settings in the use case conf so that they are able to find the data with the -# pre-processing steps omitted - -[Blocking] -# Directory for the Z500 anomaly data to read in to the blocking python code -OBS_BLOCKING_ANOMALY_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc - -# Directory for the Z500 data to read in to the blocking python code -OBS_BLOCKING_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc From 4157bd1535027a0a70ec50c93811bcb1328a60d7 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Wed, 17 Mar 2021 18:19:21 -0600 Subject: [PATCH 78/93] Testing new paths with INPUT_BASE --- internal_tests/use_cases/all_use_cases.txt | 4 ++-- .../Blocking_fcstGFS_obsERA.conf | 6 +++--- .../ci_overrides.conf | 12 ------------ .../UserScript_obsERA_obsOnly_Blocking/Blocking.py | 2 ++ .../WeatherRegime_driver.py | 2 +- .../WeatherRegime_obsERA_obsOnly.conf | 5 +++-- .../ci_overrides.conf | 7 ------- 7 files changed, 11 insertions(+), 27 deletions(-) delete mode 100644 parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ci_overrides.conf delete mode 100644 parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ci_overrides.conf diff --git a/internal_tests/use_cases/all_use_cases.txt b/internal_tests/use_cases/all_use_cases.txt index 70ba7decdf..2dd3c012b0 100644 --- a/internal_tests/use_cases/all_use_cases.txt +++ b/internal_tests/use_cases/all_use_cases.txt @@ -114,9 +114,9 @@ Category: precipitation Category: s2s 0::GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast:: model_applications/s2s/GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast.conf::netCDF4 -1::UserScript_fcstGFS_obsERA_Blocking:: model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf,model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ci_overrides.conf::cartopy,scipy,METplotpy,METcalcpy +1::UserScript_fcstGFS_obsERA_Blocking:: model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf::cartopy,scipy,METplotpy,METcalcpy 2::UserScript_obsERA_obsOnly_Blocking:: model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf::cartopy,scipy,METplotpy,METcalcpy -3::UserScript_obsERA_obsOnly_WeatherRegime:: model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf,model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ci_overrides.conf::cartopy,scipy,METplotpy,METcalcpy,eofs +3::UserScript_obsERA_obsOnly_WeatherRegime:: model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf::cartopy,scipy,METplotpy,METcalcpy,eofs diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_fcstGFS_obsERA.conf b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_fcstGFS_obsERA.conf index e1c5579251..2d0f6cff78 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_fcstGFS_obsERA.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_fcstGFS_obsERA.conf @@ -47,15 +47,15 @@ CBL_VALID_END = 2017022800 USE_CBL_OBS = True # Directory for the Z500 anomaly data to read in to the blocking python code -OBS_BLOCKING_ANOMALY_TEMPLATE = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc +OBS_BLOCKING_ANOMALY_TEMPLATE = {INTPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc # Variable Name for the Z500 anomaly data to read in to the blocking python code FCST_BLOCKING_ANOMALY_VAR = Z500_P500 OBS_BLOCKING_ANOMALY_VAR = Z500_ANA # Directory for the Z500 data to read in to the blocking python code -FCST_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/FV3GFS/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc -OBS_BLOCKING_TEMPLATE = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +FCST_BLOCKING_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/FV3GFS/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_BLOCKING_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc # Variable for the Z500 data FCST_BLOCKING_VAR = Z500_NA_MEAN diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ci_overrides.conf b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ci_overrides.conf deleted file mode 100644 index 75f1d11c5e..0000000000 --- a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ci_overrides.conf +++ /dev/null @@ -1,12 +0,0 @@ -[config] -# CI OVERRIDE for model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_fcstGFS_obsERA.conf -# these settings can overrides the settings in the use case conf so that they are able to find the data with the -# pre-processing steps omitted - -[Blocking] -# Directory for the Z500 anomaly data to read in to the blocking python code -OBS_BLOCKING_ANOMALY_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc - -# Directory for the Z500 data to read in to the blocking python code -FCST_BLOCKING_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/FV3GFS/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc -OBS_BLOCKING_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py index 3276b219e4..300c3d53ca 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py @@ -331,6 +331,8 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,tsin,year): re=[] for hh in np.arange(0,len(noloc),1): re = np.append(re,np.where(locb == noloc[hh])[0]) + print(type(locbtemp)) + print(type(re)) locbtemp = np.delete(locbtemp,re) locb=locbtemp * 1.0 datemp = dAfin[locb.astype(int)] diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py index 54aec78cd9..8da886bd06 100755 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py @@ -8,7 +8,7 @@ from WeatherRegime import WeatherRegimeCalculation from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub, getlist -from metplotpy.contributed.weather_regime import plot_weather_regime as pwr +#from metplotpy.contributed.weather_regime import plot_weather_regime as pwr from Blocking_WeatherRegime_util import find_input_files, parse_steps, read_nc_met def main(): diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_obsERA_obsOnly.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_obsERA_obsOnly.conf index d11dcb58f0..16ac751906 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_obsERA_obsOnly.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_obsERA_obsOnly.conf @@ -1,7 +1,8 @@ # Blocking METplus Configuration [config] # Steps to Run -OBS_STEPS = ELBOW+PLOTELBOW+EOF+PLOTEOF+KMEANS+PLOTKMEANS +#OBS_STEPS = ELBOW+PLOTELBOW+EOF+PLOTEOF+KMEANS+PLOTKMEANS +OBS_STEPS = ELBOW+EOF+KMEANS # time looping - options are INIT, VALID, RETRO, and REALTIME LOOP_BY = VALID @@ -39,7 +40,7 @@ LOOP_ORDER = processes # Variables Specific to Weather Regime analysis [WeatherRegime] # Directory for the Z500 data to read in to the blocking python code -OBS_WR_TEMPLATE = {OUTPUT_BASE}/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc +OBS_WR_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc # Variable for the Z500 data OBS_WR_VAR = Z500 diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ci_overrides.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ci_overrides.conf deleted file mode 100644 index 92ef79d812..0000000000 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ci_overrides.conf +++ /dev/null @@ -1,7 +0,0 @@ -[config] -# CI OVERRIDE for model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_obsERA_obsOnly.conf -# these settings can overrides the settings in the use case conf so that they are able to find the data with the -# pre-processing steps omitted - -[WeatherRegime] -OBS_WR_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/ERA/Daily/Z500_daily_{valid?fmt=%Y%m%d}_NH.nc From 67e46ab0189c68b8d5a48abc40cb2e73121e157c Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Wed, 17 Mar 2021 20:16:34 -0600 Subject: [PATCH 79/93] Fixed typo --- .../Blocking_fcstGFS_obsERA.conf | 2 +- .../s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_fcstGFS_obsERA.conf b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_fcstGFS_obsERA.conf index 2d0f6cff78..cfd11723c5 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_fcstGFS_obsERA.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_fcstGFS_obsERA.conf @@ -47,7 +47,7 @@ CBL_VALID_END = 2017022800 USE_CBL_OBS = True # Directory for the Z500 anomaly data to read in to the blocking python code -OBS_BLOCKING_ANOMALY_TEMPLATE = {INTPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc +OBS_BLOCKING_ANOMALY_TEMPLATE = {INPUT_BASE}/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Anomaly/Z500_anomaly_{valid?fmt=%Y%m%d}_NH.nc # Variable Name for the Z500 anomaly data to read in to the blocking python code FCST_BLOCKING_ANOMALY_VAR = Z500_P500 diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py index 300c3d53ca..3d6bbbb281 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py @@ -331,8 +331,8 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,tsin,year): re=[] for hh in np.arange(0,len(noloc),1): re = np.append(re,np.where(locb == noloc[hh])[0]) - print(type(locbtemp)) - print(type(re)) + print(locbtemp) + print(re) locbtemp = np.delete(locbtemp,re) locb=locbtemp * 1.0 datemp = dAfin[locb.astype(int)] From 368bd0883b8ac8cb83db28f2fc004e79fc9303e8 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Wed, 17 Mar 2021 21:56:13 -0600 Subject: [PATCH 80/93] Fixed typo --- .../s2s/UserScript_obsERA_obsOnly_Blocking.conf | 4 ++-- .../WeatherRegime_obsERA_obsOnly.conf | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf index e0d732c8db..899c8b175c 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf @@ -2,7 +2,7 @@ [config] # All steps, including pre-processing: -#PROCESS_LIST = RegridDataPlane(regrid_obs), PcpCombine(daily_mean_obs), PcpCombine(running_mean_obs), PcpCombine(anomaly_obs), UserScript(script_blocking) +# PROCESS_LIST = RegridDataPlane(regrid_obs), PcpCombine(daily_mean_obs), PcpCombine(running_mean_obs), PcpCombine(anomaly_obs), UserScript(script_blocking) # Only Blocking Analysis script for the observations PROCESS_LIST = UserScript(script_blocking) @@ -164,7 +164,7 @@ OBS_PCP_COMBINE_OUTPUT_NAME = Z500 # input and output data directories for each application in PROCESS_LIST OBS_PCP_COMBINE_INPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Daily -OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/UserScript_fcstGFS_obsERA_Blocking/s2s/ERA/Rmean5d +OBS_PCP_COMBINE_OUTPUT_DIR = {OUTPUT_BASE}/s2s/UserScript_fcstGFS_obsERA_Blocking/ERA/Rmean5d # format of filenames # Input ERA Interim diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_obsERA_obsOnly.conf b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_obsERA_obsOnly.conf index 16ac751906..5ea236ddce 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_obsERA_obsOnly.conf +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_obsERA_obsOnly.conf @@ -1,8 +1,8 @@ # Blocking METplus Configuration [config] # Steps to Run -#OBS_STEPS = ELBOW+PLOTELBOW+EOF+PLOTEOF+KMEANS+PLOTKMEANS -OBS_STEPS = ELBOW+EOF+KMEANS +OBS_STEPS = ELBOW+PLOTELBOW+EOF+PLOTEOF+KMEANS+PLOTKMEANS +#OBS_STEPS = ELBOW+EOF+KMEANS # time looping - options are INIT, VALID, RETRO, and REALTIME LOOP_BY = VALID From 23922f5201c5af79c743dd54d021f7042cc7e06c Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Wed, 17 Mar 2021 22:46:37 -0600 Subject: [PATCH 81/93] Added plotting back in --- .../WeatherRegime_driver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py index 8da886bd06..54aec78cd9 100755 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py @@ -8,7 +8,7 @@ from WeatherRegime import WeatherRegimeCalculation from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence from metplus.util import get_skip_times, skip_time, is_loop_by_init, ti_calculate, do_string_sub, getlist -#from metplotpy.contributed.weather_regime import plot_weather_regime as pwr +from metplotpy.contributed.weather_regime import plot_weather_regime as pwr from Blocking_WeatherRegime_util import find_input_files, parse_steps, read_nc_met def main(): From d95a630075011807c0842016ee4b8948fede67b0 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Wed, 17 Mar 2021 23:32:36 -0600 Subject: [PATCH 82/93] Testing --- .../s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py index 3d6bbbb281..afecc62a6a 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py @@ -328,12 +328,12 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,tsin,year): locb = np.append(locb,np.where((dy==i) & (dd==ll))[0]) ddil=ddil[1:] locbtemp = 1.0*locb - re=[] + ree=[] for hh in np.arange(0,len(noloc),1): - re = np.append(re,np.where(locb == noloc[hh])[0]) + ree = np.append(ree,np.where(locb == noloc[hh])[0]) print(locbtemp) print(re) - locbtemp = np.delete(locbtemp,re) + locbtemp = np.delete(locbtemp,ree) locb=locbtemp * 1.0 datemp = dAfin[locb.astype(int)] blocktemp = [[datemp[0]]] From 6922d3b44971dfe2531f9bee7c2fb98986ad0b7e Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Thu, 18 Mar 2021 00:17:10 -0600 Subject: [PATCH 83/93] Fixed typo --- .../s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py index afecc62a6a..e1285e9381 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py @@ -332,7 +332,7 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,tsin,year): for hh in np.arange(0,len(noloc),1): ree = np.append(ree,np.where(locb == noloc[hh])[0]) print(locbtemp) - print(re) + print(ree) locbtemp = np.delete(locbtemp,ree) locb=locbtemp * 1.0 datemp = dAfin[locb.astype(int)] From c123a0931075d3a14fdea27d889c4abdc9d28f89 Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Thu, 18 Mar 2021 01:10:53 -0600 Subject: [PATCH 84/93] Changing data type --- .../s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py index e1285e9381..d5b3e37bb6 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py @@ -331,8 +331,7 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,tsin,year): ree=[] for hh in np.arange(0,len(noloc),1): ree = np.append(ree,np.where(locb == noloc[hh])[0]) - print(locbtemp) - print(ree) + ree.astype(int) locbtemp = np.delete(locbtemp,ree) locb=locbtemp * 1.0 datemp = dAfin[locb.astype(int)] From d3df73120e20b4fc1113072caf10d94602e1919d Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Thu, 18 Mar 2021 12:15:56 -0600 Subject: [PATCH 85/93] Fixed a bug --- .../s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py index d5b3e37bb6..60505d43da 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py @@ -328,7 +328,7 @@ def run_Calc_Blocks(self,ibl,GIBL,lon,tsin,year): locb = np.append(locb,np.where((dy==i) & (dd==ll))[0]) ddil=ddil[1:] locbtemp = 1.0*locb - ree=[] + ree=np.empty(0,dtype=int) for hh in np.arange(0,len(noloc),1): ree = np.append(ree,np.where(locb == noloc[hh])[0]) ree.astype(int) From 68d83a178eca8ae4bea6892a722bf0446bfcf5d7 Mon Sep 17 00:00:00 2001 From: MET Tools Test Account Date: Mon, 22 Mar 2021 14:28:21 -0600 Subject: [PATCH 86/93] Fixed a warning --- .../UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime.py index b317fc681c..6b06174732 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime.py @@ -58,7 +58,7 @@ def weights_detrend(self,lats,lons,indata): def run_elbow(self,a1): - k=KMeans(n_clusters=self.wrnum, random_state=0, n_jobs=-1) #Initilize cluster centers + k=KMeans(n_clusters=self.wrnum, random_state=0) #Initilize cluster centers #Calculate sum of squared distances for clusters 1-15 kind = np.arange(1,self.numi,1) @@ -126,7 +126,6 @@ def reconstruct_heights(self,eof,pc,reshape_arr): #reconstruction. If NUMPCS=nt, then a1=a0 eofs=np.reshape(eof,(self.NUMPCS,eofshape[eosize-2]*eofshape[eosize-1])) a1=np.matmul(pc,eofs) - #a1 = np.reshape(a1,reshape_arr) return a1 @@ -135,7 +134,7 @@ def run_K_means(self,a1,yr,mth,day,arr_shape): arrdims = len(arr_shape) - k=KMeans(n_clusters=self.wrnum, random_state=0, n_jobs=-1) + k=KMeans(n_clusters=self.wrnum, random_state=0) #fit the K-means algorithm to the data f=k.fit(a1) From f9a6ed41d709b7ba3ba08c82afd44fa80527374c Mon Sep 17 00:00:00 2001 From: CPKalb Date: Tue, 23 Mar 2021 16:29:11 -0600 Subject: [PATCH 87/93] Update UserScript_obsERA_obsOnly_WeatherRegime.py Updated documentation --- .../s2s/UserScript_obsERA_obsOnly_WeatherRegime.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py index f3bb4857e4..17ea4b7297 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py +++ b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py @@ -20,7 +20,8 @@ # helps determine the optimal cluster number by examining the largest difference between # the curve and the straight line. The EOFs step is optional. It computes an empirical # orthogonal function analysis. The K means step uses clustering to compute the -# frequency of occurrernce and anomalies for each cluster. +# frequency of occurrernce and anomalies for each cluster to give the most common +# weather regimes. ############################################################################## # Datasets From ed9ac0a721dc8cd2d98ef331c818694fa54d3e7f Mon Sep 17 00:00:00 2001 From: George McCabe Date: Wed, 24 Mar 2021 06:30:09 -0600 Subject: [PATCH 88/93] added new dependency for metplotpy --- ci/jobs/get_metplotpy.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/jobs/get_metplotpy.sh b/ci/jobs/get_metplotpy.sh index d3f44d0fce..cb79c9faea 100755 --- a/ci/jobs/get_metplotpy.sh +++ b/ci/jobs/get_metplotpy.sh @@ -2,6 +2,7 @@ pip3 install matplotlib pip3 install scipy +pip3 install cmocean basedir=$(dirname "$0") work_dir=$basedir/../.. From 4e86298952a6f9ea3ca88ac2efbd1bdb8cd0bcfc Mon Sep 17 00:00:00 2001 From: George McCabe Date: Wed, 24 Mar 2021 06:31:37 -0600 Subject: [PATCH 89/93] moved new use cases to their own section and added NEW label --- .github/workflows/main.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c082b95cf1..2e06d865ce 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -158,9 +158,10 @@ jobs: - "precipitation:1" - "precipitation:2" - "precipitation:3-8" - - "s2s:0-3" + - "s2s:0" - "space_weather:0-1" - "tc_and_extra_tc:0-2" + - "s2s:1-3:NEW" steps: - uses: actions/download-artifact@v2 with: From 10b7bfa29de55975ab298b8e01f948bbe58056d6 Mon Sep 17 00:00:00 2001 From: George McCabe Date: Wed, 24 Mar 2021 06:59:50 -0600 Subject: [PATCH 90/93] fixed formatting issues in documentation --- .../s2s/UserScript_fcstGFS_obsERA_Blocking.py | 2 +- .../s2s/UserScript_obsERA_obsOnly_Blocking.py | 4 ++-- .../s2s/UserScript_obsERA_obsOnly_WeatherRegime.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py b/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py index b136b77dd6..0b3e2f5e51 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py +++ b/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py @@ -61,7 +61,7 @@ # for all steps of the Blocking use case including data paths. # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf ############################################################################## # MET Configuration diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py index 3691f52972..b33ecf36b0 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py +++ b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py @@ -1,6 +1,6 @@ """ Blocking Calculation: RegridDataPlane, PcpCombine, and Blocking python code -============================================================================ +=========================================================================== model_applications/ s2s/ @@ -62,7 +62,7 @@ # variables for all steps of the Blocking use case. # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf ############################################################################## # MET Configuration diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py index 17ea4b7297..fb8b26100b 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py +++ b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py @@ -1,6 +1,6 @@ """ WeatherRegime Calculation: RegridDataPlane, PcpCombine, and WeatherRegime python code -============================================================================ +===================================================================================== model_applications/ s2s/ @@ -67,7 +67,7 @@ # for all steps of the Weather Regime use case including data paths. # # .. highlight:: bash -# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf ############################################################################## # MET Configuration From 344b54bf3ebc26514ddb1aa8da5a408b4f815e7d Mon Sep 17 00:00:00 2001 From: George McCabe Date: Wed, 24 Mar 2021 07:03:30 -0600 Subject: [PATCH 91/93] removed scipy dependency because it is already obtained for METplotpy and METcalcpy --- internal_tests/use_cases/all_use_cases.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal_tests/use_cases/all_use_cases.txt b/internal_tests/use_cases/all_use_cases.txt index 2dd3c012b0..30e66e9e9f 100644 --- a/internal_tests/use_cases/all_use_cases.txt +++ b/internal_tests/use_cases/all_use_cases.txt @@ -114,9 +114,9 @@ Category: precipitation Category: s2s 0::GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast:: model_applications/s2s/GridStat_SeriesAnalysis_fcstNMME_obsCPC_seasonal_forecast.conf::netCDF4 -1::UserScript_fcstGFS_obsERA_Blocking:: model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf::cartopy,scipy,METplotpy,METcalcpy -2::UserScript_obsERA_obsOnly_Blocking:: model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf::cartopy,scipy,METplotpy,METcalcpy -3::UserScript_obsERA_obsOnly_WeatherRegime:: model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf::cartopy,scipy,METplotpy,METcalcpy,eofs +1::UserScript_fcstGFS_obsERA_Blocking:: model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.conf::cartopy,METplotpy,METcalcpy +2::UserScript_obsERA_obsOnly_Blocking:: model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.conf::cartopy,METplotpy,METcalcpy +3::UserScript_obsERA_obsOnly_WeatherRegime:: model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.conf::cartopy,METplotpy,METcalcpy,eofs From c33c67e58c6ea7bc80fd11b3055141fef891fc3c Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Wed, 24 Mar 2021 17:50:25 -0600 Subject: [PATCH 92/93] Updates to documentation --- .../s2s/UserScript_fcstGFS_obsERA_Blocking.py | 46 ++++++++++++++++++ .../s2s/UserScript_obsERA_obsOnly_Blocking.py | 46 ++++++++++++++++++ ...UserScript_obsERA_obsOnly_WeatherRegime.py | 47 +++++++++++++++++++ 3 files changed, 139 insertions(+) diff --git a/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py b/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py index 0b3e2f5e51..f00f00941d 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py +++ b/docs/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking.py @@ -23,6 +23,26 @@ # * Forecast dataset: GEFS Forecast 500 mb height. # * Observation dataset: ERA Reanlaysis 500 mb height. +############################################################################## +# External Dependencies +# --------------------- +# +# You will need to use a version of Python 3.6+ that has the following packages installed:: +# +# * numpy +# * netCDF4 +# * datetime +# * bisect +# * scipy +# +# If the version of Python used to compile MET did not have these libraries at the time of compilation, you will need to add these packages or create a new Python environment with these packages. +# +# If this is the case, you will need to set the MET_PYTHON_EXE environment variable to the path of the version of Python you want to use. If you want this version of Python to only apply to this use case, set it in the [user_env_vars] section of a METplus configuration file.: +# +# [user_env_vars] +# MET_PYTHON_EXE = /path/to/python/with/required/packages/bin/python +# + ############################################################################## # METplus Components # ------------------ @@ -76,6 +96,32 @@ # parm/use_cases/met_tool_wrapper/PCPCombine/PCPCOmbine_derive.py # parm/use_cases/met_tool_wrapper/PCPCombine/PCPCOmbine_subtract.py +############################################################################## +# Python Scripts +# ---------------- +# +# This use case uses Python scripts to perform the blocking calculation +# +# parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_driver.py: +# This script calls the requested steps in the blocking analysis for a forecast, observation, or both. The possible +# steps are computing CBLs, plotting CBLs, computing IBLs, plotting IBLs, computing GIBLs, computing blocks, and +# plotting blocks. +# +# parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking.py: +# This script runs the requested steps, containing the code for computing CBLs, computing IBLs, computing GIBLs, +# and computing blocks. +# +# parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_WeatherRegime_util.py: +# This script contains functions used by both the blocking anwd weather regime analysis, including the code for +# determining which steps the user wants to run, and finding and reading the input files in the format from the output +# pre-processing steps +# +# .. highlight:: python +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_driver.py +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking.py +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_fcstGFS_obsERA_Blocking/Blocking_WeatherRegime_util.py +# + ############################################################################## # Running METplus # --------------- diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py index b33ecf36b0..53895310c8 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py +++ b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking.py @@ -23,6 +23,26 @@ # * Forecast dataset: None # * Observation dataset: ERA Reanlaysis 500 mb height. +############################################################################## +# External Dependencies +# --------------------- +# +# You will need to use a version of Python 3.6+ that has the following packages installed:: +# +# * numpy +# * netCDF4 +# * datetime +# * bisect +# * scipy +# +# If the version of Python used to compile MET did not have these libraries at the time of compilation, you will need to add these packages or create a new Python environment with these packages. +# +# If this is the case, you will need to set the MET_PYTHON_EXE environment variable to the path of the version of Python you want to use. If you want this version of Python to only apply to this use case, set it in the [user_env_vars] section of a METplus configuration file.: +# +# [user_env_vars] +# MET_PYTHON_EXE = /path/to/python/with/required/packages/bin/python +# + ############################################################################## # METplus Components # ------------------ @@ -77,6 +97,32 @@ # parm/use_cases/met_tool_wrapper/PCPCombine/PCPCOmbine_derive.py # parm/use_cases/met_tool_wrapper/PCPCombine/PCPCOmbine_subtract.py +############################################################################## +# Python Scripts +# ---------------- +# +# This use case uses Python scripts to perform the blocking calculation +# +# parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py: +# This script calls the requested steps in the blocking analysis for a forecast, observation, or both. The possible +# steps are computing CBLs, plotting CBLs, computing IBLs, plotting IBLs, computing GIBLs, computing blocks, and +# plotting blocks. +# +# parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py: +# This script runs the requested steps, containing the code for computing CBLs, computing IBLs, computing GIBLs, +# and computing blocks. +# +# parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_WeatherRegime_util.py: +# This script contains functions used by both the blocking anwd weather regime analysis, including the code for +# determining which steps the user wants to run, and finding and reading the input files in the format from the output +# pre-processing steps +# +# .. highlight:: python +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_WeatherRegime_util.py +# + ############################################################################## # Running METplus # --------------- diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py index fb8b26100b..f7256fb80b 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py +++ b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py @@ -30,6 +30,28 @@ # * Forecast dataset: None # * Observation dataset: ERA Reanlaysis 500 mb height. +############################################################################## +# External Dependencies +# --------------------- +# +# You will need to use a version of Python 3.6+ that has the following packages installed:: +# +# * numpy +# * netCDF4 +# * datetime +# * pylab +# * scipy +# * sklearn +# * eofs +# +# If the version of Python used to compile MET did not have these libraries at the time of compilation, you will need to add these packages or create a new Python environment with these packages. +# +# If this is the case, you will need to set the MET_PYTHON_EXE environment variable to the path of the version of Python you want to use. If you want this version of Python to only apply to this use case, set it in the [user_env_vars] section of a METplus configuration file.: +# +# [user_env_vars] +# MET_PYTHON_EXE = /path/to/python/with/required/packages/bin/python +# + ############################################################################## # METplus Components # ------------------ @@ -81,6 +103,31 @@ # parm/use_cases/met_tool_wrapper/RegridDataPlane/RegridDataPlane.py # parm/use_cases/met_tool_wrapper/PCPCombine/PCPCOmbine_derive.py +############################################################################## +# Python Scripts +# ---------------- +# +# This use case uses Python scripts to perform the blocking calculation +# +# parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py: +# This script calls the requested steps in the blocking analysis for a forecast, observation, or both. The possible +# steps are computing CBLs, plotting CBLs, computing IBLs, plotting IBLs, computing GIBLs, computing blocks, and +# plotting blocks. +# +# parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime.py: +# This script runs the requested steps, containing the code for +# +# parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/Blocking_WeatherRegime_util.py: +# This script contains functions used by both the blocking anwd weather regime analysis, including the code for +# determining which steps the user wants to run, and finding and reading the input files in the format from the output +# pre-processing steps +# +# .. highlight:: python +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime.py +# .. literalinclude:: ../../../../parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/Blocking_WeatherRegime_util.py +# + ############################################################################## # Running METplus # --------------- From 1f32bc84fef4f90ca249cc6fab242036244e711c Mon Sep 17 00:00:00 2001 From: Christina Kalb Date: Thu, 25 Mar 2021 10:20:53 -0600 Subject: [PATCH 93/93] Updates to documentation and cleanup --- .../s2s/UserScript_obsERA_obsOnly_WeatherRegime.py | 6 +++--- .../s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py | 1 - .../UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py | 1 - .../WeatherRegime_driver.py | 1 - 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py index f7256fb80b..1d22815f99 100644 --- a/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py +++ b/docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime.py @@ -111,11 +111,11 @@ # # parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py: # This script calls the requested steps in the blocking analysis for a forecast, observation, or both. The possible -# steps are computing CBLs, plotting CBLs, computing IBLs, plotting IBLs, computing GIBLs, computing blocks, and -# plotting blocks. +# steps are computing the elbow, computing EOFs, and computing weather regimes using k means clustering. # # parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime.py: -# This script runs the requested steps, containing the code for +# This script runs the requested steps, containing the code for computing the bend in the elbow, computing EOFs, and +# computing weather regimes using k means clustering # # parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/Blocking_WeatherRegime_util.py: # This script contains functions used by both the blocking anwd weather regime analysis, including the code for diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py index 60505d43da..e1ca2e3df6 100644 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking.py @@ -1,6 +1,5 @@ import os import numpy as np -import pandas as pd import datetime import bisect from scipy import stats diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py index 3636f3455d..2327554cec 100755 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Blocking/Blocking_driver.py @@ -3,7 +3,6 @@ import os import numpy as np import netCDF4 -import re from Blocking import BlockingCalculation from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py index 54aec78cd9..28814fadf6 100755 --- a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_WeatherRegime/WeatherRegime_driver.py @@ -3,7 +3,6 @@ import os import numpy as np import netCDF4 -import re from WeatherRegime import WeatherRegimeCalculation from metplus.util import pre_run_setup, config_metplus, get_start_end_interval_times, get_lead_sequence