def get_average_of_some_month(year, fm, lm, var, depth, product_n): import numpy as np if fm <= 0 or fm >= 13 or lm <= 0 or lm >= 0: raise Exception('your month value is not valid!') if lm < fm: raise Exception('lm must be greater equal than fm!') xgrid, ygrid, zgrid = subroutine.product_grid_info(var, 'data', product_n) xn, yn, zn = xgrid.size, ygrid.size, zgrid.size pro_name, title_name, bin_dirname = subroutine.product_n_to_name(product_n) nmonth = lm - fm + 1 if depth == 0: each_data = np.zeros((nmonth, yn, xn, zn)) else: each_data = np.zeros((nmonth, yn, xn)) for month in range(fm, lm + 1): i = month - fm if depth == 0: each_data[i, :, :, :] = subroutine.get_data(year, month, var, depth, title_name) else: each_data[i, :, :] = subroutine.get_data(year, month, var, depth, title_name) average_data = np.average(each_data, axis = 0) return average_data
def save_Anomaly_as_npz(fy, ly, var, product_n = 3): a = subroutine.read_meta_data('var') formal_name = subroutine.celldata(a, 'var', var, 'formal_name') dim = subroutine.celldata(a, 'var', var, 'dim') _,title_name,_=subroutine.product_n_to_name(product_n) tmpyear = 2000 for month in range(1,13): _,strmonth=subroutine.strym(2000,month) Clim=subroutine.load_npz('Ave_of_' + formal_name + '_m'+strmonth+'_' + str(fy) + '-' + str(ly) + '_'+title_name) print 'month = ', month start = time.time() for year in range(fy,ly+1): stryear,strmonth=subroutine.strym(year,month) j=year-fy if dim == '3D': data=subroutine.get_data(year,month,var,0,title_name) elif dim == '2D': data=subroutine.get_data(year,month,var,1,title_name) else: raise Exception('your dim is not valid!') Anomaly=data-Clim DIR = subroutine.get_DIR(year, month, formal_name, product_n) subroutine.check_and_make_DIR(DIR) subroutine.save_npz(Anomaly,DIR+'Anomaly_from_Mean_Annual_Cycle_Year'+str(fy)+'-'+str(ly),data_dir_flg='NO') print 'elapsed time:', time.time() - start
def make_climatology_or_interannual_variation_of_a_month(fy, ly, month, var, depth, Ave_or_Std, product_n = 3): if ly < fy: raise Exception('ly must be greater equal than fy!') xgrid, ygrid, zgrid = subroutine.product_grid_info(var, 'data', product_n) xn, yn, zn = xgrid.size, ygrid.size, zgrid.size pro_name, title_name, bin_dirname = subroutine.product_n_to_name(product_n) nyear = ly - fy + 1 if depth == 0: each_data = np.zeros((nyear, yn, xn, zn)) else: each_data = np.zeros((nyear, yn, xn)) for year in range(fy, ly + 1): i = year - fy if depth == 0: each_data[i, :, :, :] = subroutine.get_data(year, month, var, depth, title_name) else: each_data[i, :, :] = subroutine.get_data(year, month, var, depth, title_name) if Ave_or_Std == 'Ave': climatology = np.average(each_data, axis = 0) return climatology elif Ave_or_Std == 'Std': Interannual_variation = np.std(each_data, axis = 0) return Interannual_variation else: raise Exception('your Ave_or_Std argument is not valid!')
def make_data(year,month,product_n=3,dt=0.2): # ESTOC、ORAS4などで、層厚の計算を行うための関数。 # MOAA_GPVだけ、格納されているのが(ポテンシャル水温でなく)通常の水温なので、まずポテンシャル水温への変換が必要 _,title_name,_=subroutine.product_n_to_name(product_n) t=subroutine.get_data(year,month,'t',0,title_name) s=subroutine.get_data(year,month,'s',0,title_name) ILD, MLD, BLT = make_data_from_ts(t, s, product_n, dt) return ILD, MLD, BLT
def get_SUMsalinity(year, month, product_n = 3): # 全球での塩分の総和を求める。 # 単位はkg。 rho0 = 1024.0 # 海水の密度はこれで統一。 _, title_name, _ = product_n_to_name(product_n) s = get_data(year, month, 's', 0, title_name) xgrid, ygrid, zgrid = product_grid_info('w', 'data', product_n) xn = xgrid.size yn = ygrid.size zn = zgrid.size ew_dist = zeros([yn, xn]) ns_dist = zeros([yn, xn]) S = zeros([yn, xn]) for i in range(0, xn): for j in range(0, yn): ew_dist[j, i] = dist_on_sphere([0, ygrid[j]], [1, ygrid[j]]) ns_dist[j, i] = dist_on_sphere([0, ygrid[j] - 0.5], [0, ygrid[j] + 0.5]) if isnan(s[j, i, 0]) == True: S[j, i] = 0.0 else: for k in range(0, zn): if k == 0: dH = zgrid[k] else: dH = zgrid[k] - zgrid[k - 1] if isnan(s[j, i, k]) == False: S[j, i] = S[j, i] + dH * ew_dist[j, i] * ns_dist[j, i] * rho0 * (s[j, i, k]/1000) else: break return sum(S)
def make_data_of_24sigma_t_depth(year, month, var, product_n = 3): _,title_name,_=subroutine.product_n_to_name(product_n) sgmt_d = make_24sigma_t_depth(year, month, product_n) data = subroutine.get_data(year, month, var, 0, title_name) if var == 'u' or var == 'v': data = convert.convert_UVgrid_value_to_Sgrid_value_3D(data) data_of_sgm_t = make_data_of_24sigma_t_depth_from_data(sgmt_d, data, product_n = product_n) return data_of_sgm_t
def cal_ew_ns_dist(year,month,product_n=3): _,title_name,_=product_n_to_name(product_n) xgrid,ygrid,zgrid=product_grid_info('u','data',product_n) u=get_data(year,month,'u',0,title_name) v=get_data(year,month,'v',0,title_name) xn=xgrid.size yn=ygrid.size zn=zgrid.size ew_dist=zeros([yn-1,xn]) ns_dist=zeros([yn-1,xn]) xgrid_for_manual_w=zeros(xn) ygrid_for_manual_w=zeros(yn-1) zgrid_for_manual_w=zeros(zn) for i in range(0,xn): x0=i lon0=xgrid[x0] if i==xn-1: x1=0 lon1=xgrid[x1] xgrid_for_manual_w[i]=average([lon0,lon1+360]) else: x1=i+1 lon1=xgrid[x1] xgrid_for_manual_w[i]=average([lon0,lon1]) for j in range(0,yn-1): y0=j y1=j+1 lat0=ygrid[y0] lat1=ygrid[y1] ygrid_for_manual_w[j]=average([lat0,lat1]) ew_dist[j,i]=dist_on_sphere([lon0,ygrid_for_manual_w[j]],[lon1,ygrid_for_manual_w[j]]) ns_dist[j,i]=dist_on_sphere([xgrid_for_manual_w[i],lat0],[xgrid_for_manual_w[i],lat1]) return ew_dist,ns_dist
def get_water_mass(product_n = 3): _, title_name, _ = product_n_to_name(product_n) s = get_data(2001, 1, 's', 0, title_name) xgrid, ygrid, zgrid = product_grid_info('w', 'data', product_n) xn = xgrid.size yn = ygrid.size zn = zgrid.size ew_dist = zeros([yn, xn]) ns_dist = zeros([yn, xn]) Mass = zeros([yn, xn]) for i in range(0, xn): for j in range(0, yn): ew_dist[j, i] = dist_on_sphere([0, ygrid[j]], [1, ygrid[j]]) ns_dist[j, i] = dist_on_sphere([0, ygrid[j] - 0.5], [0, ygrid[j] + 0.5]) if isnan(s[j, i, 0]) == True: Mass[j, i] = 0.0 else: L = max(where(isnan(s[j, i, :]) == False)[0]) Mass[j, i] = zgrid[L] * ew_dist[j, i] * ns_dist[j, i] return sum(Mass)
def get_SUMsff(year, month, product_n = 3): # 全球での淡水フラックスの総和を求める # 単位はm^3/month。 _, title_name, _ = product_n_to_name(product_n) sff = get_data(year, month, 'sff', 1, title_name) xgrid, ygrid, _ = product_grid_info('t', 'data', product_n) xn = xgrid.size yn = ygrid.size ew_dist = zeros([yn, xn]) ns_dist = zeros([yn, xn]) SFF = zeros([yn, xn]) for i in range(0, xn): for j in range(0, yn): ew_dist[j, i] = dist_on_sphere([0, ygrid[j]], [1, ygrid[j]]) ns_dist[j, i] = dist_on_sphere([0, ygrid[j] - 0.5], [0, ygrid[j] + 0.5]) if isnan(sff[j, i]) == True: SFF[j, i] = 0.0 else: SFF[j, i] = sff[j, i] * ew_dist[j, i] * ns_dist[j, i] return sum(SFF)
def cal_manual_w(year,month,product_n=3, GM = 'N'): _,title_name,_=product_n_to_name(product_n) if GM == 'N': u=get_data(year,month,'u',0,title_name) v=get_data(year,month,'v',0,title_name) elif GM == 'Y': u = get_data(year, month, 'ustar', 0, title_name) v = get_data(year, month, 'vstar', 0, title_name) else: raise Exception('your GM argument is not valid!') xgrid,ygrid,zgrid=product_grid_info('u','data',product_n) xn=xgrid.size yn=ygrid.size zn=zgrid.size manual_w=zeros([yn,xn,zn]) xgrid_for_manual_w=zeros(xn) ygrid_for_manual_w=zeros(yn) zgrid_for_manual_w=zeros(zn) dH=zeros(zn) for k in range(0,zn): if k==0: zgrid_for_manual_w[k]=2*zgrid[k] dH[k]=zgrid_for_manual_w[k] else: zgrid_for_manual_w[k]=2*zgrid[k]-zgrid_for_manual_w[k-1] dH[k]=zgrid_for_manual_w[k]-zgrid_for_manual_w[k-1] for i in range(0,xn): x0=i lon0=xgrid[x0] if i==xn-1: x1=0 lon1=xgrid[x1] xgrid_for_manual_w[i]=average([lon0,lon1+360]) else: x1=i+1 lon1=xgrid[x1] xgrid_for_manual_w[i]=average([lon0,lon1]) for j in range(0,yn): if j == yn - 1: manual_w[j,i,:]=nan ygrid_for_manual_w[j]=average([ygrid[yn - 1],ygrid[yn - 1] + 1]) else: y0=j y1=j + 1 lat0=ygrid[y0] lat1=ygrid[y1] ygrid_for_manual_w[j]=average([lat0,lat1]) ew_dist=dist_on_sphere([lon0,ygrid_for_manual_w[j]],[lon1,ygrid_for_manual_w[j]]) ns_dist=dist_on_sphere([xgrid_for_manual_w[i],lat0],[xgrid_for_manual_w[i],lat1]) for k in range(0,zn): if k==0: manual_w0=0.0 else: manual_w0=manual_w[j,i,k-1] u00=u[y0,x0,k] v00=v[y0,x0,k] u01=u[y1,x0,k] v01=v[y1,x0,k] u10=u[y0,x1,k] v10=v[y0,x1,k] u11=u[y1,x1,k] v11=v[y1,x1,k] if any(isnan(u00, u01, u10, u11)) == False: manual_w[j,i,k]=dH[k]*(((v01+v11)/2.0-(v00+v10)/2.0)/ns_dist +((u10+u11)/2.0-(u00+u01)/2.0)/ew_dist)+manual_w0 else: manual_w[j,i,k]=nan return manual_w,xgrid_for_manual_w,ygrid_for_manual_w,zgrid_for_manual_w
def get_Length_of_Current_Vector(year, month, depthn = 1, product_n = 3): _,title_name,_=subroutine.product_n_to_name(product_n) u = subroutine.get_data(year, month, 'u', depthn, title_name) v = subroutine.get_data(year, month, 'v', depthn, title_name) L = cal_Length_of_Current_Vector(u, v) return L
def make_rho(year, month, product_n = 3): _, title_name, _ = subroutine.product_n_to_name(product_n) t = subroutine.get_data(year, month, 't', 0, title_name) s = subroutine.get_data(year, month, 's', 0, title_name) rho = make_rho_from_ts(t, s, product_n) return rho
def make_20degree_depth(year, month, product_n = 3): _, title_name, _ = subroutine.product_n_to_name(product_n) t = subroutine.get_data(year, month, 't', 0, title_name) data = make_20degree_depth_from_t(t, product_n) return data