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!')
예제 #7
0
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
예제 #10
0
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
예제 #12
0
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)
예제 #13
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
예제 #14
0
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)
예제 #15
0
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)
예제 #16
0
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
예제 #17
0
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
예제 #19
0
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