- 积分
- 1965
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2014-4-13
- 最后登录
- 1970-1-1

|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 柿子柿子柿子 于 2023-2-17 11:39 编辑
根据国家气候中心的环流指数说明文档中的副高指数相关说明自己写了一个计算副高指数的ncl程序。
因为需要计算格点代表的面积有多大,就单独了一个估算“方方正正”的经纬度廓起来的方法。
(有点受不了这个还要自己敲空格的“添加代码文字”……)
- function calcSphericalArea(in, is, iw, ie, isDeg)
- begin
- ; 计算球面微元面积
- ; in 北界纬度
- ; is 南界纬度
- ; iw 西界经度
- ; ie 东界经度
- ; isdeg 输入的经纬度单位是否为°
- if (isDeg) then
- n = in * get_d2r("double")
- s = is * get_d2r("double")
- e = ie * get_d2r("double")
- w = iw * get_d2r("double")
- else
- n = in
- s = is
- e = ie
- w = iw
- end if
- R = 6378
- if ((n*s) .lt. 0) then
- ; 南北界分到赤道两边去了
- s = abs(s)
- return (R^2) * (e-w) * ( sin(n) + sin(s) )
- else
- ; 南北界都在赤道的同一边
- if (n .lt. 0) then
- ; 南北界都在南半球
- tmp = s
- s = abs(n)
- n = abs(tmp)
- delete(tmp)
- end if
- return (R^2) * (e-w) * ( sin(n) - sin(s) )
- end if
复制代码 然后因为我想偷懒一次性计算完一列(经向)的格点所代表的面积,而我用的数据又是等经纬度间隔的,就又有了下面这个函数。
当然,这个只适用于规规整整的等经纬度的网格,如果不是的话这里需要修改一下。
- function getNSBoundary(x)
- begin
- ; 获取南北边界
- ; return (0,:) 北界, (1,:) 南界
- ns = new((/2, dimsizes(x)/), float, 999999)
- n = dimsizes(x)
- ; 计算北界
- do i = 0, n-2
- ns(0,i) = (x(i) + x(i+1)) / 2
- end do
- ns(0,n-1) = x(n-1)
- ; 南界
- ns(1,0) = x(0)
- ns(1,1:n-1) = ns(0,0:n-2)
- return ns
- end
复制代码 下面就是计算副高指数了……
这几个指数在计算完之后和气候中心直接提供的指数对比我发现太大了,就进行了缩放。
- function calcSHI(hgt, u, area)
- begin
- ; 计算副高指数:面积指数AI、强度指数II、脊线位置RPI、北界位置NBPI
- ; hgt、u的经纬度单调递增
- ; 返回值:(/NBPI, RPI, AI, II/)
- missing = 999999.
- ; 面积指数AI
- tmp = where(hgt .ge. 5880, 1, 0)
- nt = dimsizes(tmp)
- AI = 0.D
- do i = 0, nt(1)-1
- AI = AI + sum(area * tmp(:,i))
- end do
- delete([/tmp, nt/])
- AI = AI / 2e5
- ; 强度指数II
- tmp = where(hgt .ge. 5880, hgt - 5870, 0)
- nt = dimsizes(tmp)
- II = 0.D
- do i = 0, nt(1)-1
- II = II + sum(area * tmp(:,i))
- end do
- delete([/tmp, nt/])
- II = II / 2e6
- ; 脊线位置RPI
- lon = u&lon
- nx = dimsizes(lon)
- tmp = new(nx, float, missing)
- do i = 0, nx-1
- point = 0.
- npoint = 0
- tu = u(:,i)
- tlat = tu&$tu!0$
- do j = 1, dimsizes(tu)-1
- if (tu(j) .gt. 0 .and. tu(j-1) .lt. 0) then
- a = (tu(j) - tu(j-1)) / (tlat(j) - tlat(j-1))
- b = tu(j) - a * tlat(j)
- point = point - b / a
- npoint = npoint + 1
- delete([/a, b/])
- end if
- end do
- if (npoint .gt. 0) then
- tmp(i) = point / npoint
- end if
- delete([/tu, tlat, point, npoint/])
- end do
- if(all(ismissing(tmp))) then
- RPI = missing
- else
- RPI = avg(tmp)
- end if
- delete(tmp)
- ; 北界位置NBPI
- tmp = new(nx, float, missing)
- do i = 0, nx-1
- th = hgt(:,i)
- tlat = th&$th!0$
- do j = 0, dimsizes(th)-2
- if ( (th(j) .ge. 5880) .and. (th(j+1) .lt. 5880) ) then
- a = (th(j+1) - th(j)) / (tlat(j+1) - tlat(j))
- b = th(j) - a * tlat(j)
- tmp(i) = (5880 - b) / a
- delete([/a, b/])
- end if
- end do
- delete([/th, tlat/])
- end do
- if(all(ismissing(tmp))) then
- NBPI = missing
- else
- NBPI = avg(tmp)
- end if
- delete([/tmp, lon ,nx/])
-
- ret = new(4, double, missing)
- ret = (/NBPI, RPI, AI, II/)
- return ret
- end
复制代码 现在才是main的部分================================================
hgtflip = lonFlip(hgt)
uflip = lonFlip(u)
; 计算经向格点面积
lat = hgt&lat
tmp = getNSBoundary(lat)
area = new(dimsizes(lat), double, 999999)
do i = 0, dimsizes(lat)-1
area(i) = calcSphericalArea(tmp(0,i), tmp(1,i), 0., 2.5, True)
end do
delete(tmp)
time = hgt&$hgt!0$
nt = dimsizes(time)
missing = 999999
table = new((/nt, 47/), double, 999999.)
do i = 0, nt-1
; 时间
date = cd_calendar(time(i), 0)
table(i,0) = date(0,0)
table(i,1) = date(0,1)
; 北半球副高
table(i,2:5) = calcSHI(hgt(i,:,:), u(i,:,:), area)
; 北非大西洋北美副高
table(i,6:9) = calcSHI(hgtflip(i,:,{-110:60}), uflip(i,:,{-110:60}), area)
; 北非副高
table(i,10:13) = calcSHI(hgtflip(i,:,{-20:60}), uflip(i,:,{-20:60}), area)
; 北美大西洋副高
table(i,14:17) = calcSHI(hgtflip(i,:,{-110:-20}), uflip(i,:,{-110:-20}), area)
; 北美副高
table(i,18:21) = calcSHI(hgtflip(i,:,{-110:-60}), uflip(i,:,{-110:-60}), area)
; 北大西洋副高
table(i,22:25) = calcSHI(hgtflip(i,:,{-55:-25}), uflip(i,:,{-55:-25}), area)
; 东太平洋副高
table(i,26:29) = calcSHI(hgtflip(i,:,{-175:-115}), uflip(i,:,{-175:-115}), area)
; 南海副高
table(i,30:33) = calcSHI(hgt(i,:,{100:120}), u(i,:,{100:120}), area)
; 北太平洋副高
table(i,34:37) = calcSHI(hgt(i,:,{110:245}), u(i,:,{110:245}), area)
; ; 西太平洋副高
tmp = calcSHI(hgt(i,:,{100:150}), u(i,:,{110:150}), area)
table(i,38:39) = tmp(0:1)
delete(tmp)
tmp = calcSHI(hgt(i,:,{100:180}), u(i,:,{110:180}), area)
table(i,40:41) = tmp(2:3)
delete(tmp)
; ; 西太平洋副高西伸脊点
table(i,42) = calcSHWRPI(hgt(i,:,{90:180}))
; ; 印度副高
table(i,43:46) = calcSHI(hgt(i,:,{65:95}), u(i,:,{65:95}), area)
; print(table(i,0:1))
end do
; 输出
lines = new(nt, string)
do i = 0, nt-1
lines(i) = str_concat(sprintf("%10.2f", table(i,:)))
end do
asciiwrite("SHI.txt", lines)
end
================================================
前面有提到指数进行缩放的事情,我拿出来的结果和提供的指数进行了相关分析,出来的P值有0的也有量级为E-36甚至更小的。
虽然相关性通过了检验,但心里还是有点点打鼓……
|
|