爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 29540|回复: 21

[其他] 计算副高指数

[复制链接]

新浪微博达人勋

发表于 2020-6-18 00:00:38 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 柿子柿子柿子 于 2023-2-17 11:39 编辑

根据国家气候中心的环流指数说明文档中的副高指数相关说明自己写了一个计算副高指数的ncl程序。

因为需要计算格点代表的面积有多大,就单独了一个估算“方方正正”的经纬度廓起来的方法。
(有点受不了这个还要自己敲空格的“添加代码文字”……)
  1. function calcSphericalArea(in, is, iw, ie, isDeg)
  2. begin

  3.     ; 计算球面微元面积
  4.     ; in    北界纬度
  5.     ; is    南界纬度
  6.     ; iw    西界经度
  7.     ; ie    东界经度
  8.     ; isdeg 输入的经纬度单位是否为°

  9.     if (isDeg) then
  10.   n = in * get_d2r("double")
  11.   s = is * get_d2r("double")
  12.   e = ie * get_d2r("double")
  13.   w = iw * get_d2r("double")
  14. else
  15.   n = in
  16.   s = is
  17.   e = ie
  18.   w = iw
  19.     end if

  20.     R = 6378

  21.     if ((n*s) .lt. 0) then
  22.   ; 南北界分到赤道两边去了
  23.   s = abs(s)
  24.   return (R^2) * (e-w) * ( sin(n) + sin(s) )
  25.     else
  26.   ; 南北界都在赤道的同一边
  27.   if (n .lt. 0) then
  28.     ; 南北界都在南半球
  29.     tmp = s
  30.     s = abs(n)
  31.     n = abs(tmp)
  32.     delete(tmp)
  33.   end if
  34.   return (R^2) * (e-w) * ( sin(n) - sin(s) )
  35. end if
复制代码
然后因为我想偷懒一次性计算完一列(经向)的格点所代表的面积,而我用的数据又是等经纬度间隔的,就又有了下面这个函数。
当然,这个只适用于规规整整的等经纬度的网格,如果不是的话这里需要修改一下。
  1. function getNSBoundary(x)
  2. begin
  3.   ; 获取南北边界
  4.   ; return (0,:) 北界, (1,:) 南界
  5.   ns = new((/2, dimsizes(x)/), float, 999999)
  6.   n = dimsizes(x)
  7.   ; 计算北界
  8.   do i = 0, n-2
  9.     ns(0,i) = (x(i) + x(i+1)) / 2
  10.   end do
  11.   ns(0,n-1) = x(n-1)
  12.   ; 南界
  13.   ns(1,0) = x(0)
  14.   ns(1,1:n-1) = ns(0,0:n-2)
  15.   return ns
  16. end
复制代码
下面就是计算副高指数了……
这几个指数在计算完之后和气候中心直接提供的指数对比我发现太大了,就进行了缩放。
  1. function calcSHI(hgt, u, area)
  2. begin
  3.   ; 计算副高指数:面积指数AI、强度指数II、脊线位置RPI、北界位置NBPI
  4.   ; hgt、u的经纬度单调递增
  5.   ; 返回值:(/NBPI, RPI, AI, II/)

  6.   missing = 999999.

  7.   ; 面积指数AI
  8.   tmp = where(hgt .ge. 5880, 1, 0)
  9.   nt = dimsizes(tmp)
  10.   AI = 0.D
  11.   do i = 0, nt(1)-1
  12.     AI = AI + sum(area * tmp(:,i))
  13.   end do
  14.   delete([/tmp, nt/])
  15.   AI = AI / 2e5
  16.   ; 强度指数II
  17.   tmp = where(hgt .ge. 5880, hgt - 5870, 0)
  18.   nt = dimsizes(tmp)
  19.   II = 0.D
  20.   do i = 0, nt(1)-1
  21.     II = II + sum(area * tmp(:,i))
  22.   end do
  23.   delete([/tmp, nt/])
  24.   II = II / 2e6
  25.   ; 脊线位置RPI
  26.   lon = u&lon
  27.   nx = dimsizes(lon)
  28.   tmp = new(nx, float, missing)
  29.   do i = 0, nx-1
  30.     point  = 0.
  31.     npoint = 0
  32.     tu   = u(:,i)
  33.     tlat = tu&$tu!0$
  34.     do j = 1, dimsizes(tu)-1
  35.       if (tu(j) .gt. 0 .and. tu(j-1) .lt. 0) then
  36.         a = (tu(j) - tu(j-1)) / (tlat(j) - tlat(j-1))
  37.         b = tu(j) - a * tlat(j)
  38.         point = point - b / a
  39.         npoint = npoint + 1
  40.         delete([/a, b/])
  41.       end if
  42.     end do
  43.     if (npoint .gt. 0) then
  44.       tmp(i) = point / npoint
  45.     end if
  46.     delete([/tu, tlat, point, npoint/])
  47.   end do
  48.   if(all(ismissing(tmp))) then
  49.     RPI = missing
  50.   else
  51.     RPI = avg(tmp)
  52.   end if
  53.   delete(tmp)
  54.     ; 北界位置NBPI
  55.   tmp = new(nx, float, missing)
  56.   do i = 0, nx-1
  57.     th = hgt(:,i)
  58.     tlat = th&$th!0$
  59.     do j = 0, dimsizes(th)-2
  60.       if ( (th(j) .ge. 5880) .and. (th(j+1) .lt. 5880) ) then
  61.         a = (th(j+1) - th(j)) / (tlat(j+1) - tlat(j))
  62.         b = th(j) - a * tlat(j)
  63.         tmp(i) = (5880 - b) / a
  64.         delete([/a, b/])
  65.       end if
  66.     end do
  67.     delete([/th, tlat/])
  68.   end do
  69.   if(all(ismissing(tmp))) then
  70.     NBPI = missing
  71.   else
  72.     NBPI = avg(tmp)
  73.   end if
  74.   delete([/tmp, lon ,nx/])

  75.   ret = new(4, double, missing)
  76.   ret = (/NBPI, RPI, AI, II/)
  77.   return ret

  78. 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甚至更小的。
虽然相关性通过了检验,但心里还是有点点打鼓……

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2020-7-30 19:51:03 | 显示全部楼层
非常感谢楼主分享代码,另外我所看到的面积指数好像只是单纯的乘上cos纬度就可以了,计算就简单了很多
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-12-2 16:29:59 | 显示全部楼层
尘埃 发表于 2020-7-30 19:51
非常感谢楼主分享代码,另外我所看到的面积指数好像只是单纯的乘上cos纬度就可以了,计算就简单了很多

我计算面积指数用的是乘上cos纬度,但是算出来结果相比气候中心面积指数偏大,请问您知道可能的原因吗?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-1-24 11:47:40 | 显示全部楼层
计算面积有论文专门给了个公式
王盘兴, 赵辉, 任律, 等.闭合气压系统中心位置指数的计算方案[ J] .大气科学学报, 2010, 33(5):520-526.
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-4-17 15:53:00 | 显示全部楼层
请问楼主疑问解决了吗?这个程序算出的副高指数可信吗?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-4-25 12:07:18 | 显示全部楼层
请问楼主计算副高脊线平均位置用的定义是什么呀?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-4-26 19:35:10 | 显示全部楼层
wsx 发表于 2021-4-17 15:53
请问楼主疑问解决了吗?这个程序算出的副高指数可信吗?

有点想不起来当时和国家气候中心所给的数据相比较的相关性的具体系数了,只隐约记得是个超过0.9的系数
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-5-31 16:36:45 | 显示全部楼层
你好,你这个主程序的部分怎么写的呀?为啥我看到的不全呢
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-5-31 16:39:49 | 显示全部楼层
而且格点数据你不用管进行线性插值的吗?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-9-9 09:46:15 | 显示全部楼层
我用楼主的程序计算了副高面积、强度,这两个指数和国家气候中心给的相关性基本在0.9以上,但副高脊线计算出来的相关性很低,
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表