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 make_data_of_24sigma_t_depth_from_data(sgmt_d, data, product_n = 3): xgrid,ygrid,zgrid=subroutine.product_grid_info('t','data',product_n) xn=xgrid.size yn=ygrid.size data_of_sgm_t=np.zeros([yn,xn]) for i in range(0, xn): for j in range(0, yn): if np.isnan(data[j, i, 0]) == False: dpro = data[j, i, :] if sgmt_d[j, i] <= zgrid[0]: # 24シグマt等密度面が5メートルより浅かった時、 # 海面に於ける値を採用 data_of_sgm_t[j, i] = dpro[0] else: n1 = min(np.where(zgrid > sgmt_d[j, i])[0]) - 1 n2 = n1 + 1 z1 = zgrid[n1] z2 = zgrid[n2] d1 = dpro[n1] d2 = dpro[n2] alpha = (z2 - sgmt_d[j, i]) / (z2 - z1) data_of_sgm_t[j, i] = alpha * d1 + (1 - alpha) * d2 else: data_of_sgm_t[j, i] = np.nan return data_of_sgm_t
def make_24sigma_t_depth_from_rho(rho, product_n = 3): xgrid,ygrid,zgrid=subroutine.product_grid_info('t','data',product_n) xn=xgrid.size yn=ygrid.size data=np.zeros([yn,xn]) for i in range(0, xn): for j in range(0, yn): if np.isnan(rho[j, i, 0]) == False: rhopro = rho[j, i, :] if np.where(rhopro > 1024.0)[0].size == 0: # 全層で密度が1024より小さかった時 # 海底までの深さを等密度面の深さとする n1=max(np.where(np.isnan(rhopro) == False)[0]) z1=zgrid[n1] data[j, i]=round(z1, 0) elif rhopro[0] >= 1024.0: # 海面の密度が1024よりも大きかった時 # 等密度面はゼロメートルであるとする。 data[j, i] = 0.0 else: n1 = min(np.where(rhopro > 1024.0)[0]) - 1 n2 = n1 + 1 z1 = zgrid[n1] z2 = zgrid[n2] rho1 = rhopro[n1] rho2 = rhopro[n2] D = z2 - z1 dz=(1024.0 - rho1)/(rho2 - rho1)*D data[j, i] = round(z1 + dz, 0) else: data[j, i] = np.nan return data
def make_data_from_ts(t, s, product_n = 3, dt = 0.2): _,title_name,_=subroutine.product_n_to_name(product_n) xgrid,ygrid,zgrid=subroutine.product_grid_info('t','data',product_n) # MOAA_GPVだけ、格納されているのが(ポテンシャル水温でなく)通常の水温なので、まずポテンシャル水温への変換が必要 if title_name=='MOAA_GPV': theta=np.zeros((t.shape[0],t.shape[1],t.shape[2])) for m in range(0,zgrid.size): theta[:,:,m]=density.poT(t[:,:,m],s[:,:,m],zgrid[m]) t=theta t[np.where(abs(t)== inf)]=nan rho=density.rho(t,s,0) rho[np.where(abs(rho)== inf)]=nan xn=xgrid.size yn=ygrid.size ILD=np.zeros([yn,xn]) MLD=np.zeros([yn,xn]) BLT=np.zeros([yn,xn]) for i in range(0,xn): for j in range(0,yn): if np.isnan(t[j,i,0]) == False: tpro=t[j,i,:] rhopro=rho[j,i,:] spro = s[j, i, :] ILD[j, i], MLD[j, i], BLT[j, i] = make_data_from_profile(tpro, spro, rhopro, zgrid, dt) else: ILD[j,i]=nan MLD[j,i]=nan BLT[j, i] = nan return ILD,MLD,BLT
def draw_12month_cycle(cb_min, cb_max, product_n = 3, Ave_or_Std = 'Ave', interval = 15): xgrid, ygrid, zgrid = subroutine.product_grid_info('t', 'data', product_n) xlim = [40, 110] ylim = [-20, 30] fy = 1990 ly = 2011 Data = np.zeros((12, ygrid.size, xgrid.size)) for i in range(0, 12): month = i + 1 # データの取得 each_data = np.zeros((ygrid.size, xgrid.size, ly - fy + 1)) for year in range(fy, ly + 1): k = year - fy each_data[:, :, k] = load_data_of_npz(year, month, product_n = product_n, data_type = 0) if Ave_or_Std == 'Ave': Data[i, :, :] = np.average(each_data, axis = 2) elif Ave_or_Std == 'Std': Data[i, :, :] = np.std(each_data, axis = 2) else: raise Exception('your Ave_or_Std argument is not valid!') plta = quick.draw_12month_cycle_with_map(Data, ygrid, xgrid, cb_min, cb_max, xlim = xlim, ylim = ylim, \ clabel = Ave_or_Std + " of T20 Depth(m)", interval = interval)
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 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_20degree_depth_from_t(t, product_n = 3): xgrid,ygrid,zgrid=subroutine.product_grid_info('t','data',product_n) xn=xgrid.size yn=ygrid.size data=np.zeros([yn,xn]) for i in range(0, xn): for j in range(0, yn): if np.isnan(t[j, i, 0]) == False: tpro = t[j, i, :] data[j, i] = make_data_from_profile(tpro, zgrid) else: data[j, i] = np.nan return data
def make_rho_from_ts(t,s, product_n = 3): xgrid,ygrid,zgrid=subroutine.product_grid_info('t','data',product_n) _, title_name, _ = subroutine.product_n_to_name(product_n) # MOAA_GPVだけ、格納されているのが(ポテンシャル水温でなく)通常の水温なので、まずポテンシャル水温への変換が必要 if title_name=='MOAA_GPV': theta=zeros((t.shape[0],t.shape[1],t.shape[2])) for m in range(0,zgrid.size): theta[:,:,m]=density.poT(t[:,:,m],s[:,:,m],zgrid[m]) t=theta t[where(abs(t)== inf)]=nan rho = density.rho(t, s, 0) rho[np.where(np.abs(rho) == sp.inf)] = np.nan return rho
def cal_diffusion_of_variable(S, kappa, product_n): # kappaは水平拡散係数。 # 海洋ではkappa=500(m^2/s)程度としている文献多し。 Mt = 60 * 60 * 24 * 30 xgrid, ygrid, zgrid = subroutine.product_grid_info('s', 'data', product_n) yn = S.shape[0] xn = S.shape[1] zn = S.shape[2] ns_dist = subroutine.dist_on_sphere([0.0, - 0.5], [0.0, 0.5]) Diff = np.zeros((yn, xn, zn)) for j in range(yn): if j == 0 or j == yn - 1: Diff[j, :, :] = np.nan else: y0 = j - 1 y1 = j y2 = j + 1 lat1 = ygrid[y1] ew_dist = subroutine.dist_on_sphere([0.0, lat1], [1.0, lat1]) for i in range(xn): x1 = i if i == 0: x0 = xn - 1 else: x0 = i - 1 if i == xn - 1: x2 = 0 else: x2 = i + 1 S01 = S[y1, x0, :] S10 = S[y0, x1, :] S11 = S[y1, x1, :] S21 = S[y1, x2, :] S12 = S[y2, x1, :] Diff[j, i, :] = Mt * kappa * (S21 - 2.0 * S11 + S01) / (ew_dist)**2 + \ Mt * kappa * (S12 - 2.0 * S11 + S10) / (ns_dist)**2 return Diff
def make_climatology_or_interannual_variation_of_all_month_and_depth(fy, ly, var, Ave_or_Std, product_n = 3): xgrid, ygrid, zgrid = subroutine.product_grid_info(var, 'data', product_n) a=subroutine.read_meta_data('var') d=subroutine.celldata(a,'var',var,'dim') if d == '2D': data_allmonth = np.zeros((ygrid.size, xgrid.size, 12)) depth_d = 1 elif d == '3D': data_allmonth = np.zeros((ygrid.size, xgrid.size, zgrid.size, 12)) depth_d = 0 else: raise Exception('data dimension is not valid!') for month in range(1, 13): data = make_climatology_or_interannual_variation_of_a_month(fy, ly, month, var, depth_d, Ave_or_Std, product_n) if data.ndim == 3: data_allmonth[:, :, :, month - 1] = data[:, :, :] elif data.ndim == 2: data_allmonth[:, :, month - 1] = data[:, :] return data_allmonth
def draw_12month_cycle(cb_min, cb_max, depthn1 = 1, depthn2 = 4, product_n = 3, interval = 15): _,title_name,_=subroutine.product_n_to_name(product_n) xgrid, ygrid, zgrid = subroutine.product_grid_info('u', 'data', product_n) xlim = [40, 110] ylim = [-20, 30] fy = 1990 ly = 2011 Data = np.zeros((12, ygrid.size, xgrid.size)) for i in range(0, 12): month = i + 1 # データの取得 _, strmonth = subroutine.strym(2000, month) u = CI.load_climatology_or_interannual_variation_as_npz(fy, ly, month, 'u', 'Ave', product_n = product_n) v = CI.load_climatology_or_interannual_variation_as_npz(fy, ly, month, 'v', 'Ave', product_n = product_n) data1 = cal_Length_of_Current_Vector(u[:, :, depthn1 - 1], v[:, :, depthn1 - 1]) data2 = cal_Length_of_Current_Vector(u[:, :, depthn2 - 1], v[:, :, depthn2 - 1]) Data[i, :, :] = data1 - data2 plta = quick.draw_12month_cycle_with_map(Data, ygrid, xgrid, cb_min, cb_max, xlim = xlim, ylim = ylim, \ clabel = "Vertical Shear of Current(m/s) " + str(zgrid[depthn1 - 1]) + 'm - ' + str(zgrid[depthn2 - 1]) + 'm',\ interval = interval, my_color = 0)
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_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 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 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 cal_GM_diffusion(S, ustar, vstar): # GM velocityを用いてGM拡散項を計算 # 増田さんいわく、この項を入れなくても収支は閉じるということだが、 # GM項がどれくらいの大きさなのかを見ておくのは悪くないと思ったので計算してみる。 product_n = 3 Mt = 60 * 60 * 24 * 30 xgrid, ygrid, zgrid = product_grid_info("t", "data", product_n) xn = xgrid.size yn = ygrid.size zn = zgrid.size ZonalFlux = zeros((yn, xn, zn)) MeridFlux = zeros((yn, xn, zn)) ns_dist = dist_on_sphere([0.0, -0.5], [0.0, 0.5]) for j in range(0, yn): if j % 10 == 0: print "j= %3i" % j if j == 0 or j == yn - 1: ZonalFlux[j, :, :] = nan MeridFlux[j, :, :] = nan else: y0 = j - 1 y1 = j y2 = j + 1 lat1 = ygrid[y1] ew_dist = dist_on_sphere([0.0, lat1], [1.0, lat1]) for i in range(0, xn): x1 = i lon1 = xgrid[x1] if i == 0: x0 = xn - 1 x2 = i + 1 elif i == xn - 1: x0 = i - 1 x2 = xn - 1 else: x0 = i - 1 x2 = i + 1 if isnan(S[j, i, 0]) == True: ZonalFlux[j, i, :] = nan MeridFlux[j, i, :] = nan else: for k in range(0, zn): S00 = S[y0, x0, k] S01 = S[y1, x0, k] S10 = S[y0, x1, k] S11 = S[y1, x1, k] ustar01 = ustar[y1, x0, k] ustar11 = ustar[y1, x1, k] ustar21 = ustar[y1, x2, k] vstar10 = vstar[y0, x1, k] vstar11 = vstar[y1, x1, k] vstar12 = vstar[y2, x1, k] if isnan(S11) == True: ZonalFlux[j, i, k:] = nan MeridFlux[j, i, k:] = nan break else: ZonalFlux[j, i, k] = cal_a_GM_Flux(S00, S01, S10, S11, ustar01, ustar11, ustar21, ew_dist) MeridFlux[j, i, k] = cal_a_GM_Flux(S00, S10, S01, S11, vstar10, vstar11, vstar12, ns_dist) return ZonalFlux, MeridFlux
def cal_Hor_and_Ver_Flux(s, u, v, w): product_n = 3 Mt = 60 * 60 * 24 * 30 xgrid, ygrid, zgrid = product_grid_info('t', 'data', product_n) xn = xgrid.size yn = ygrid.size zn = zgrid.size s[where(abs(s) == inf)] = nan u[where(abs(u) == inf)] = nan v[where(abs(v) == inf)] = nan w[where(abs(w) == inf)] = nan ZonalFlux = zeros((yn, xn, zn), dtype = float64) MeridFlux = zeros((yn, xn, zn), dtype = float64) VertcFlux = zeros((yn, xn, zn), dtype = float64) ns_dist = dist_on_sphere([0.0, - 0.5], [0.0, 0.5]) for j in range(0, yn): if j % 10 == 0: print 'j= %3i' % j if j == 0 or j == yn - 1: ZonalFlux[j, :, :] = nan MeridFlux[j, :, :] = nan VertcFlux[j, :, :] = nan else: y0 = j - 1 y1 = j y2 = j + 1 lat1 = ygrid[y1] ew_dist = dist_on_sphere([0.0, lat1], [1.0, lat1]) for i in range(0, xn): x1 = i lon1 = xgrid[x1] if i == 0: x0 = xn - 1 x2 = i + 1 elif i == xn - 1: x0 = i - 1 x2 = xn - 1 else: x0 = i - 1 x2 = i + 1 u00 = u[y0, x0, :] v00 = v[y0, x0, :] s00 = s[y0, x0, :] s01 = s[y1, x0, :] s10 = s[y0, x1, :] s11 = s[y1, x1, :] ZonalFlux[j, i, :] = cal_a_Flux(u00, s00, s01, s10, s11, ew_dist) MeridFlux[j, i, :] = cal_a_Flux(v00, s00, s10, s01, s11, ns_dist) for k in range(0, zn): # VertcFlux if k != zn - 1: dz = zgrid[k + 1] - zgrid[k] VertcFlux[:, :, k] = w[:, :, k] * (s[:, :, k + 1] - s[:, :, k])/dz * Mt else: VertcFlux[:, :, k] = nan # VertcFlux VertcFlux = convert.convert_Sgrid_value_to_UVgrid_value_3D(VertcFlux) return ZonalFlux, MeridFlux, VertcFlux
def cal_Hor_and_Ver_Flux(s, u, v, w, ID): Method_doc = Budget_at_Global_Ocean.Method[ID].Method_doc Hadv_func = getattr(Using_jit, 'cal_a_HFlux' + Method_doc) Vadv_func = getattr(Using_jit, 'cal_a_VFlux' + Method_doc) product_n = 3 xgrid, ygrid, zgrid = subroutine.product_grid_info('t', 'data', product_n) xn = xgrid.size yn = ygrid.size zn = zgrid.size s[np.where(abs(s) == np.inf)] = np.nan u[np.where(abs(u) == np.inf)] = np.nan v[np.where(abs(v) == np.inf)] = np.nan w[np.where(abs(w) == np.inf)] = np.nan ZonalFlux = np.zeros((yn, xn, zn)) MeridFlux = np.zeros((yn, xn, zn)) VertcFlux = np.zeros((yn, xn, zn)) ns_dist = subroutine.dist_on_sphere([0.0, - 0.5], [0.0, 0.5]) for j in range(0, yn): if j == 0 or j == yn - 1: ZonalFlux[j, :, :] = np.nan MeridFlux[j, :, :] = np.nan VertcFlux[j, :, :] = np.nan else: y0 = j - 1 y1 = j y2 = j + 1 lat1 = ygrid[y1] ew_dist = subroutine.dist_on_sphere([0.0, lat1], [1.0, lat1]) for i in range(0, xn): x1 = i lon1 = xgrid[x1] if i == 0: x0 = xn - 1 x2 = i + 1 elif i == xn - 1: x0 = i - 1 x2 = xn - 1 else: x0 = i - 1 x2 = i + 1 u00 = u[y0, x0, :] u01 = u[y1, x0, :] u10 = u[y0, x1, :] u11 = u[y1, x1, :] v00 = v[y0, x0, :] v01 = v[y1, x0, :] v10 = v[y0, x1, :] v11 = v[y1, x1, :] s01 = s[y1, x0, :] s10 = s[y0, x1, :] s11 = s[y1, x1, :] s21 = s[y1, x2, :] s12 = s[y2, x1, :] ZonalFlux[j, i, :] = Hadv_func(u00, u01, u10, u11, s01, s11, s21, ew_dist) MeridFlux[j, i, :] = Hadv_func(v00, v10, v01, v11, s10, s11, s12, ns_dist) VertcFlux[j, i, :] = Vadv_func(w[j, i, :], s[j, i, :]) Flux = np.array([ZonalFlux, MeridFlux, VertcFlux]) return Flux