NCL环流合成图的绘制(一)——基于ERA5 10m风场数据处理

一.数据获取

二.对风场数据的预处理

1.风场数据是否需要计算距平值?

如果只针对某一特定时间的风场,则不需要计算异常,需要的是直接表现出当时的风场演变

如果绘制特定某几个年份的环流合成图,则突出这几个年份的异常,需要计算风场距平值后再合成。(参考南信大施宁老师编著书中的内容气象出版社-章节详情 (qxcbs.com)——厄尔尼诺年环流合成图)

2.如何计算风场距平值?

应该与本研究对其他变量的处理方法一致(如SST)

在这里我采用三十年中心气候态方法(NOAA),这样如果我要计算1958-2022年的风场距平,我就需要得到1943-2022年的原始风场数据。

3.对于ERA5风场数据的处理

在此遇到的问题:

(1)数据精度太高,读取时内存占用大,NCL无法顺利读取并完成计算:

①只截取需要的数据经纬度范围(需要全面考虑后续方法得到的结果是否会受到经纬度的影响)

我只考虑以热带太平洋为中心,向两侧延伸的印度洋和大西洋作为边界,因此纬度范围{-30:30},经度范围是{30:360}。(注意,这时名义中点为国际日界线180度经线。如果数据经度格式为{-180:180},可采用LonFlip函数进行更改。)

此时仍然显示内存不够。

②考虑到ERA5空间分辨率较高(0.25°*0.25°),可以跳读(:,::4,::4)

但是对960*721*1441这样庞大的数据体来说,跳读效率很低耗时久。

两个方法共同改进后效果仍不理想,从代码的角度说,我决定采取切片式读取

;;;;;open the file
    f = addfile("./data/era5/10mwind.nc", "r")

;;;;;get U&V data
   ;u
    u01 = f->u10(0:159,{-30:30},{30:360})
    u02 = f->u10(160:319,{-30:30},{30:360})
    u03 = f->u10(320:479,{-30:30},{30:360})
    u04 = f->u10(480:639,{-30:30},{30:360})
    u05 = f->u10(640:799,{-30:30},{30:360})
    u06 = f->u10(800:959,{-30:30},{30:360})

    u1 = u01(:,::4,::4)
    u2 = u02(:,::4,::4)
    u3 = u03(:,::4,::4)
    u4 = u04(:,::4,::4)
    u5 = u05(:,::4,::4)
    u6 = u06(:,::4,::4)

    nlat = dimsizes(u1&latitude)
    nlon = dimsizes(u1&longitude)
    u = new((/960, nlat, nlon/),float)
    u(0:159,:,:) = u1
    u(160:319,:,:) = u2
    u(320:479,:,:) = u3
    u(480:639,:,:) = u4
    u(640:799,:,:) = u5
    u(800:959,:,:) = u6

    copy_VarMeta(u1(0,:,:), u(0,:,:))
    copy_VarMeta(f->u10(:,0,0), u(:,0,0))
    printVarSummary(u)
③用不到的变量和数据及时delete释放内存
delete([/u01,u02,u03,u04,u05,u06,u1,u2,u3,u4,u5,u6/])

(2)对数据计算距平值并截取,得到(65*12,nlat, nlon)的数据后,想要将它写入nc文件

经过对输出nc文件及变量printVarSummary,我发现缺失了coordinates,推测是没有详细写入绑定信息中的坐标变量。但是原始变量中的coordinates有六个,这也是有关era5数据不明白的点。

Variable: uwind_ano
Type: float
Total Size: 62805600 bytes
            15701400 values
Number of Dimensions: 3
Dimensions and sizes:   [date | 780] x [latitude | 61] x [longitude | 330]
Coordinates:
            date: [19580101..20221201]
            latitude: [ -30..  30]
            longitude: [  30.. 359]

Number Of Attributes: 38
  anomaly_op_ncl :      Anomalies from Annual Cycle: calcMonAnomTLL: contributed.ncl
  date :        19430101
  longitude :      0
  latitude :      90
  GRIB_paramId :        165
  GRIB_dataType :       an
  GRIB_numberOfPoints : 1038240
  GRIB_typeOfLevel :    surface
  GRIB_stepUnits :      1
  GRIB_stepType :       avgua
  GRIB_gridType :       regular_ll
  GRIB_uvRelativeToGrid :       0
  GRIB_NV :     0
  GRIB_Nx :     1440
  GRIB_Ny :     721
  GRIB_cfName : unknown
  GRIB_cfVarName :      u10
  GRIB_gridDefinitionDescription :      Latitude/Longitude Grid
  GRIB_iDirectionIncrementInDegrees :   0.25
  GRIB_iScansNegatively :       0
  GRIB_jDirectionIncrementInDegrees :   0.25
  GRIB_jPointsAreConsecutive :  0
  GRIB_jScansPositively :       0
  GRIB_latitudeOfFirstGridPointInDegrees :        90
  GRIB_latitudeOfLastGridPointInDegrees :        -90
  GRIB_longitudeOfFirstGridPointInDegrees :        0
  GRIB_longitudeOfLastGridPointInDegrees :      359.75
  GRIB_missingValue :   3.402823466385289e+38
  GRIB_name :   10 metre U wind component
  GRIB_shortName :      10u
  GRIB_totalNumber :    0
  GRIB_units :  m s**-1
  long_name :   uwind anomalies
  units :       m s**-1
  standard_name :       unknown
  GRIB_surface :           0
  coordinates : number date latitude longitude expver
  _FillValue :  nan
Variable: u
Type: float
Total Size: 62805600 bytes
            15701400 values
Number of Dimensions: 3
Dimensions and sizes:   [date | 780] x [latitude | 61] x [longitude | 330]
Coordinates:
Number Of Attributes: 38
  anomaly_op_ncl :      Anomalies from Annual Cycle: calcMonAnomTLL: contributed.ncl
  date :        19430101
  longitude :      0
  latitude :      90
  GRIB_paramId :         165
  GRIB_dataType :       an
  GRIB_numberOfPoints : 1038240
  GRIB_typeOfLevel :    surface
  GRIB_stepUnits :         1
  GRIB_stepType :       avgua
  GRIB_gridType :       regular_ll
  GRIB_uvRelativeToGrid :          0
  GRIB_NV :        0
  GRIB_Nx :     1440
  GRIB_Ny :      721
  GRIB_cfName : unknown
  GRIB_cfVarName :      u10
  GRIB_gridDefinitionDescription :      Latitude/Longitude Grid
  GRIB_iDirectionIncrementInDegrees :   0.25
  GRIB_iScansNegatively :          0
  GRIB_jDirectionIncrementInDegrees :   0.25
  GRIB_jPointsAreConsecutive :     0
  GRIB_jScansPositively :          0
  GRIB_latitudeOfFirstGridPointInDegrees :        90
  GRIB_latitudeOfLastGridPointInDegrees :        -90
  GRIB_longitudeOfFirstGridPointInDegrees :        0
  GRIB_longitudeOfLastGridPointInDegrees :      359.75
  GRIB_missingValue :   3.402823466385289e+38
  GRIB_name :   10 metre U wind component
  GRIB_shortName :      10u
  GRIB_totalNumber :       0
  GRIB_units :  m s**-1
  long_name :   uwind anomalies
  units :       m s**-1
  standard_name :       unknown
  GRIB_surface :           0
  coordinates : number date latitude longitude expver
  _FillValue :  nan
 

解决方法:

①重新对变量属性进行定义并输出
    uwind_ano = (/ua_clm(rec_s:rec_e,:,:)/)
    copy_VarCoords(ua_clm(0,:,:), uwind_ano(0,:,:))

   
   ;new coordinates 
    f = addfile("./ssta.nc", "r")
    ssta = f->ssta

    uwind_ano!0 = "time"
    uwind_ano&time = ssta&time

    uwind_ano@units = "m*s**-1"
    uwind_ano@long_name = "10 metre U wind component anomalies"
    uwind_ano@standard_name = "10 metre U wind component anomalies"
    uwind_ano@coordinates = (/"time","latitude","longitude"/)
    uwind_ano@_FillValue = -1e+30
    uwind_ano@missing_value = -1e+30

    printVarSummary(uwind_ano)

结果如下:

三.利用SST数据绘制环流合成图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值