一.数据获取
二.对风场数据的预处理
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)
结果如下: