コード例 #1
0
ファイル: Ekman.py プロジェクト: AnchorBlues/python_for_study
def cal_Ue_or_Ve(year, month, product_n, Ue_or_Ve, nu):
	taux = D.get_data(year, month, 'taux', 1, product_n)
	tauy = D.get_data(year, month, 'tauy', 1, product_n)
	xgrid, ygrid, zgrid = D.get_grid_value('taux', product_n)

	if Ue_or_Ve == 'Ue':
		Ue, _ = cal_EkmanCurrent_from_tau(taux, tauy, ygrid, nu)
	elif Ue_or_Ve == 'Ve':
		_, Ue = cal_EkmanCurrent_from_tau(taux, tauy, ygrid, nu)
	else:
		raise ValueError('your Ue_or_Ve argument is not valid!')

	Ue = convert.convert_Sgrid_value_to_UVgrid_value_3D(Ue)
	a = np.zeros((ygrid.size, xgrid.size, zgrid.size - M)) * np.nan # 鉛直にuやvと同じだけ層を作ってやる
	Ue = np.c_[Ue, a]
	return Ue
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_dSdt(ps, ns):
	dS = ns - ps
	dS[where(abs(dS) == inf)] = nan
	dS = convert.convert_Sgrid_value_to_UVgrid_value_3D(dS)
	return dS