ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

天气学诊断实习四 计算垂直速度

2021-11-21 14:30:31  阅读:210  来源: 互联网

标签:诊断 天气学 lat hd 实习 n1 n2 data math


一、实习目的:

熟悉垂直差分在气象中的应用,掌握垂直速度的实际编程计算。

二、实习内容:

编制计算垂直速度程序,并绘制500hPa垂直速度。用第二种修正方案,其中大气层顶的垂直速度可以直接采用0,也可以用绝热法。并且绘制出两个时次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 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
##画图函数
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'位置参数

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'C:\Users\马冠龙\Desktop\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:,:])

#散度计算
for x in a:
    namespace['D%d' % x]=sd(namespace['u_%d' % x],namespace['v_%d' % x],30,160,10,80,2.5)

#垂直速度计算
w_1000=np.zeros((29,53))
w_925=w_1000+0.5*(D1000+D925)*75
w_850=w_925+0.5*(D925+D850)*75
w_700=w_850+0.5*(D850+D700)*150
w_500=w_700+0.5*(D700+D500)*200
w_400=w_500+0.5*(D500+D400)*100
w_300=w_400+0.5*(D400+D300)*100
w_250=w_300+0.5*(D300+D250)*50
w_200=w_250+0.5*(D250+D200)*50
w_150=w_200+0.5*(D200+D150)*50
w_100=w_150+0.5*(D150+D100)*50
##垂直速度修正
M=0.5*11*10
k=2
w_850=w_850-k*(k+1)/2/M*(w_100-0)
k=4
w_500=w_500-k*(k+1)/2/M*(w_100-0)
draw(w_500,30,160,10,80,2.5,'500hPa垂直速度图  2013年5月26日20时')
draw(w_850,30,160,10,80,2.5,'850hPa垂直速度图  2013年5月26日20时')

五、实习结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

标签:诊断,天气学,lat,hd,实习,n1,n2,data,math
来源: https://blog.csdn.net/m0_51153866/article/details/121453241

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有