天气学诊断实习五 计算水汽平流、水汽通量、水汽通量散度
一、实习目的:熟悉水汽平流、水汽通量、水汽通量散度的实际编程计算。二、实习内容:编制计算水汽平流、水汽通量、水汽通量散度的程序,并且绘制出两个时次25日20时,26日20时的水汽平流、水汽通量、水汽通量散度分布(850hPa,500hPa)三、代码实现# -*- coding: utf-8 -*-import numpy as npimport pandas as pdimport mathimp
·
一、实习目的:
熟悉水汽平流、水汽通量、水汽通量散度的实际编程计算。
二、实习内容:
编制计算水汽平流、水汽通量、水汽通量散度的程序,并且绘制出两个时次25日20时,26日20时的水汽平流、水汽通量、水汽通量散度分布(850hPa,500hPa)
三、算法原理
水汽通量:
水汽通量散度:
四、代码实现
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
import math
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import cartopy.mpl.ticker as cticker
from pylab import * #支持中文
mpl.rcParams['font.sans-serif'] = ['SimHei']
##角度转弧度
def hd(x):
a=math.pi/180*x
return a
##micaps读数据函数
def micaps(a):
data=np.zeros((29,53))
for i in range(0,29):
data[i,0:10]=a[i*6,0:10]
data[i,10:20]=a[i*6+1,0:10]
data[i,20:30]=a[i*6+2,0:10]
data[i,30:40]=a[i*6+3,0:10]
data[i,40:50]=a[i*6+4,0:10]
data[i,50:53]=a[i*6+5,0:3]
return data
##平流函数
def pl(T,u,v,leftlon, rightlon, lowerlat, upperlat,f):
a=6371000
b=hd(f)
n1=len(u[:,0])-1
n2=len(u[0,:])-1
N=int((upperlat-lowerlat)/f+1)
lat=np.linspace(lowerlat, upperlat,N)
lat= lat[::-1]
data=np.zeros((29,53))
##四边差分
for i in range(1,n1):
for j in range (1,n2):
data[0,j]=u[0,j]*(T[0,j+1]-T[0,j-1])/(math.cos(hd(lat[0]))*b*a)+v[0,j]*(T[1,j]-T[0,j])/(a*b)
data[n1,j]=u[n1,j]*(T[n1,j+1]-T[n1,j-1])/(math.cos(hd(lat[n1]))*b*a)+v[n1,j]*(T[n1-1,j]-T[n1,j])/(a*b)
data[i,0]=u[i,0]*(T[i,1]-T[i,0])/(math.cos(hd(lat[i]))*b*a)+v[i,0]*(T[i+1,j]-T[i-1,j])/(a*b)
data[i,n2]=u[i,n2]*(T[i,n2-1]-T[0,n2])/(math.cos(hd(lat[i]))*b*a)+v[i,n2]*(T[i+1,n2]-T[i-1,n2])/(a*b)
##中间部分差分
for i in range(1,n1):
for j in range (1,n2):
data[i,j]=u[i,j]*(T[i,j+1]-T[i,j-1])/(math.cos(hd(lat[i]))*b*a)+v[i,j]*(T[i+1,j]-T[i-1,j])/(a*b)
##四角差分
data[0,0]=u[0,0]*(T[0,1]-T[0,0])/(math.cos(hd(lat[0]))*b*a)+v[0,0]*(T[1,0]-T[0,0])/(a*b)
data[0,n2]=u[0,n2]*(T[0,n2-1]-T[0,n2])/(math.cos(hd(lat[0]))*b*a)+v[0,n2]*(T[1,n2]-T[0,n2])/(a*b)
data[n1,0]=u[n1,0]*(T[n1,1]-T[n1,0])/(math.cos(hd(lat[n1]))*b*a)+v[n1,0]*(T[n1-1,0]-T[n1,0])/(a*b)
data[n1,n2]=u[n1,n2]*(T[n1,n2-1]-T[n1,n2])/(math.cos(hd(lat[n1]))*b*a)+v[n1,n2]*(T[n1-1,n2]-T[n1,n2])/(a*b)
return data
##画图函数
def draw(data,leftlon, rightlon, lowerlat, upperlat,a,name):
lon=np.arange(leftlon, rightlon+0.01,a)
lat=np.arange(lowerlat, upperlat+0.01,a)
data=data[::-1, :]##坐标反转
#建立画布
proj = ccrs.PlateCarree() # 设置投影
fig, f2_ax1 = plt.subplots(figsize=(15,15), subplot_kw=dict(projection=proj))
leftlon, rightlon, lowerlat, upperlat = (leftlon, rightlon, lowerlat, upperlat)
#绘制
data1=f2_ax1.contourf(lon,lat,data)
# data2=f2_ax1.contour(lon,lat,data,colors='k', linewidths=1, linestyles='solid',levels=np.linspace(-32,60,23))
# plt.clabel(data2,fontsize=10,colors='r',fmt='%.2f')
#在画布的绝对坐标建立子图
f2_ax1.set_extent([leftlon, rightlon, lowerlat, upperlat], crs=ccrs.PlateCarree())
#海岸线,50m精度
f2_ax1.add_feature(cfeature.COASTLINE.with_scale('50m'))
#湖泊数据
f2_ax1.add_feature(cfeature.LAKES, alpha=0.5)
#以下6条语句是定义地理坐标标签格式
f2_ax1.set_xticks(np.arange(leftlon,rightlon+10,10), crs=ccrs.PlateCarree())
f2_ax1.set_yticks(np.arange(lowerlat,upperlat+10,10), crs=ccrs.PlateCarree())
lon_formatter = cticker.LongitudeFormatter()
lat_formatter = cticker.LatitudeFormatter()
f2_ax1.xaxis.set_major_formatter(lon_formatter)
f2_ax1.yaxis.set_major_formatter(lat_formatter)
f2_ax1.set_title(name,loc='center',fontsize =20)
# shrink 控制 colorbar 长度,pad 控制colorbar和图的距离
plt.rcParams['axes.unicode_minus'] = False##负号显示问题
plt.colorbar(data1, shrink=0.3, pad=0.02)#orientation='horizontal'位置参数
def draw2(u,v,leftlon, rightlon, lowerlat, upperlat,a,name):
lon=np.arange(leftlon, rightlon+0.01,a)
lat=np.arange(lowerlat, upperlat+0.01,a)
x=np.zeros((29,53))
y=np.zeros((29,53))
u=u[::-1, :]##坐标反转
v=v[::-1, :]
for i in range(0,29):
x[i,:]=lon
for i in range(0,53):
y[:,i]=lat
#建立画布
proj = ccrs.PlateCarree() # 设置投影
fig, f2_ax1 = plt.subplots(figsize=(15,15), subplot_kw=dict(projection=proj))
leftlon, rightlon, lowerlat, upperlat = (leftlon, rightlon, lowerlat, upperlat)
#在画布的绝对坐标建立子图
f2_ax1.set_extent([leftlon, rightlon, lowerlat, upperlat], crs=ccrs.PlateCarree())
#海岸线,50m精度
f2_ax1.add_feature(cfeature.COASTLINE.with_scale('50m'))
#湖泊数据
f2_ax1.add_feature(cfeature.LAKES, alpha=0.5)
#以下6条语句是定义地理坐标标签格式
f2_ax1.set_xticks(np.arange(leftlon,rightlon+10,10), crs=ccrs.PlateCarree())
f2_ax1.set_yticks(np.arange(lowerlat,upperlat+10,10), crs=ccrs.PlateCarree())
lon_formatter = cticker.LongitudeFormatter()
lat_formatter = cticker.LatitudeFormatter()
f2_ax1.xaxis.set_major_formatter(lon_formatter)
f2_ax1.yaxis.set_major_formatter(lat_formatter)
f2_ax1.set_title(name,loc='center',fontsize =20)
#绘制
data1=f2_ax1.quiver(x,y,u,v,transform=proj,scale=120)
return x
#水汽通量散度函数
def sd(u,v,leftlon, rightlon, lowerlat, upperlat,f):
a=6371000
b=hd(f)
n1=len(u[:,0])-1
n2=len(u[0,:])-1
N=int((upperlat-lowerlat)/f+1)
lat=np.linspace(lowerlat, upperlat,N)
lat= lat[::-1]
data=np.zeros((29,53))
##四边差分
for i in range(1,n1):
for j in range (1,n2):
data[0,j]=(1/2/a)*((u[1,j+1]-u[0,j-1])/(math.cos(hd(lat[0]))*b)+(v[1,j]-v[0,j])/b-2*v[0,j]*math.tan(hd(lat[0])))
data[n1,j]=(1/2/a)*((u[n1,j+1]-u[n1,j-1])/(math.cos(hd(lat[n1]))*b)+(v[n1-1,j]-v[n1,j])/b-2*v[n1,j]*math.tan(hd(lat[n1])))
data[i,0]=(1/2/a)*((u[i,1]-u[i,0])/(math.cos(hd(lat[i]))*b)+(v[i+1,1]-v[i-1,0])/b-2*v[i,0]*math.tan(hd(lat[i])))
data[i,n2]=(1/2/a)*((u[i,n2-1]-u[i,n2])/(math.cos(hd(lat[i]))*b)+(v[i+1,n2]-v[i-1,n2])/b-2*v[i,n2]*math.tan(hd(lat[i])))
##中间部分差分
for i in range(1,n1):
for j in range (1,n2):
data[i,j]=(1/2/a)*((u[i,j+1]-u[i,j-1])/(math.cos(hd(lat[i]))*b)+(v[i+1,j]-v[i-1,j])/b-2*v[i,j]*math.tan(hd(lat[i])))
##四角差分
data[0,0]=(1/2/a)*((u[0,1]-u[0,0])/(math.cos(hd(lat[0]))*b)+(v[1,0]-v[0,0])/b-2*v[0,0]*math.tan(hd(lat[0])))
data[0,n2]=(1/2/a)*((u[0,n2-1]-u[0,n2])/(math.cos(hd(lat[0]))*b)+(v[0,n2-1]-v[0,n2])/b-2*v[0,n2]*math.tan(hd(lat[0])))
data[n1,0]=(1/2/a)*((u[n1,1]-u[n1,0])/(math.cos(hd(lat[n1]))*b)+(v[n1-1,0]-v[n1,0])/b-2*v[n1,0]*math.tan(hd(lat[n1])))
data[n1,n2]=(1/2/a)*((u[n1-1,n2]-u[n1,n2])/(math.cos(hd(lat[n1]))*b)+(v[n1-1,n2]-v[n1,n2])/b-2*v[n1,n1]*math.tan(hd(lat[n1])))
return data
namespace = globals()
a=[1000,925,850,700,500,400,300,250,200,150,100]
#读数据
for x in a:
namespace['uv_%d' % x] = pd.read_table(r'E:\实习\天气学诊断\micaps 11层\micaps 11层\uv\%d\13052620.000'%(x),header=None,skiprows=3,sep='\s+')
namespace['uv_%d' % x] = np.array(namespace['uv_%d' % x])
namespace['u_%d' % x]=micaps(namespace['uv_%d' % x][0:174,:])
namespace['v_%d' % x]=micaps(namespace['uv_%d' % x][174:,:])
namespace['a_%d' % x] = pd.read_table(r'E:\实习\天气学诊断\micaps 11层\micaps 11层\temper\%d\13052620.000'%(x),header=None,skiprows=4,sep='\s+')
namespace['a_%d' % x] = np.array(namespace['a_%d' % x])
namespace['a_%d' % x]=micaps(namespace['a_%d' % x])
namespace['b_%d' % x] = pd.read_table(r'E:\实习\天气学诊断\micaps 11层\micaps 11层\t-td\%d\13052620.000'%(x),header=None,skiprows=4,sep='\s+')
namespace['b_%d' % x] = np.array(namespace['b_%d' % x])
namespace['b_%d' % x]=micaps(namespace['b_%d' % x])
namespace['td_%d' % x]=namespace['a_%d' % x]-namespace['b_%d' % x]
##水汽平流计算
for x in a:
namespace['e_%d' % x]=np.zeros((29,53))
##比湿计算
for i in range (0,29):
for j in range(0,53):
namespace['e_%d' % x][i,j]=6.1078*math.exp(17.26*namespace['td_%d' % x][i,j]/(273.16+namespace['td_%d' % x][i,j]-35.86))
namespace['q_%d' % x]=622*namespace['e_%d' % x]/(x-0.378*namespace['e_%d' % x])
##平流计算
namespace['qpl_%d' % x]=pl(namespace['q_%d' % x],namespace['u_%d' % x],namespace['v_%d' % x],30,160,10,80,2.5)
##水汽平流画图
draw(qpl_500,30,160,10,80,2.5,'500hPa水汽平流图 2013年5月26日20时')
draw(qpl_850,30,160,10,80,2.5,'850hPa水汽平流图 2013年5月26日20时')
##水汽通量的计算
qtl_500_u=1/9.8*u_500*q_500
qtl_500_v=1/9.8*v_500*q_500
qtl_850_u=1/9.8*u_850*q_850
qtl_850_v=1/9.8*v_850*q_850
#水汽通量画图
x=draw2(qtl_500_u,qtl_500_v,30,160,10,80,2.5,'500hPa水汽通量矢量图 2013年5月26日20时')
##水汽通量散度的计算
qtlsd_500=sd(qtl_500_u,qtl_500_v,30,160,10,80,2.5)
qtlsd_850=sd(qtl_850_u,qtl_850_v,30,160,10,80,2.5)
##水汽通量散度画图
draw(qtlsd_500,30,160,10,80,2.5,'500hPa水汽通量散度图 2013年5月26日20时')
draw(qtlsd_850,30,160,10,80,2.5,'850hPa水汽通量散度图 2013年5月26日20时')
五、实习结果
更多推荐
已为社区贡献5条内容
所有评论(0)