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
コード例 #2
0
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!')
コード例 #4
0
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
コード例 #5
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)
コード例 #6
0
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
コード例 #7
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
コード例 #8
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)
コード例 #9
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)
コード例 #10
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
コード例 #11
0
ファイル: Shear.py プロジェクト: AnchorBlues/python_for_study
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
コード例 #12
0
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
コード例 #13
0
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