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