[数据处理] 高分辨率海洋模式LLC4320的在线读取

[复制链接]
LLC4320模式简介
LLC4320是MITgcm 1/48°全球海洋模式,其诞生的直接原因是为即将到来的SWOT任务提供高分辨率的全球海洋模拟。
LLC4320模式在多个方面具有开创性,特别是其高空间分辨率(全球分辨率在 1 到 2 公里之间)、潮汐驱动、高频(每小时)输出,其海面高度信号中包含了内潮、内波、地转平衡等信号。除了在SWOT相关工作取得应用之外,该模式也在海洋亚中尺度、内波等研究方向得到了广泛应用。

$ h& y! Q" t- w
该模式主要特征是:
- k6 n7 @' I3 V9 |1 J& b! o
  • • 全球覆盖(包含极地)
  • • 垂向90层
  • • 分辨率1/48°
  • • 全球海洋分成13个face,每个face的网格数为4320*4320
  • • 时间采样是1小时,总计时间维度9030
  • • 共14 个月(2011 年 9 月至 2012 年 11 月)
  • • 数据量巨大,PB级别
  • • 以MDS自定义二进制数据格式存储,为MITgcm独有
  • • 模型网格复杂,为lat-lon-cap (LLC) 曲线网格 ,很难在常规地图投影中可视化。
    : n) a. U: E) F2 H. R- _7 ~
在数据发布之初,该数据集存储在高度安全的NASA超级计算机上,只有获得NASA资助的研究人员才能访问。
后来,NASA Ames研究中心创建数据共享网站(https://data.nas.nasa.gov/ecco/),开放了LLC4320数据。任何人都可以通过互联网访问数据。在此网站上,您可以单击下载单个大小40GB的二进制文件。除非您知道如何解码其中的内容,否则这些文件毫无用处。" R- j( _4 S/ a, `3 S% Q" i* f1 K
. x' ~9 u5 w$ |
xmitgcm.llcreader
xmitgcm 是一个 python 包,可以将 MITgcm 二进制 MDS 文件读入 xarray 结构。通过 dask,xmitgcm可以实现并行计算。
为了使二进制数据方便利用,Ryan Abernathey等开发了xmitgcm的python包,其中llcreader用于读取这些二进制文件。该模块使用xarray和dask从ECCO数据门户网站在线访问数据,使模式大数据的操作变得轻而易举。

" a& q8 O2 N4 b" _6 _$ o5 ]
海面温度读取示例
3 F9 P: w/ w# O, q- U0 b
以海面温度读取为例,展示其基本操作。用到了如下库:
  • • xmitgcm: 提供llcreader
  • • xarray: 基本数据结构和操作
  • • dask: 大数据并行和lazy计算
  • • sholoviews: 交互式的图像展示5 c; T# B: Z& |3 [3 f: ~, e
1 导入库  i) w* t1 _6 Y( N9 [  U

; p$ T* n2 a3 @8 E! `# a- Z; Fimport xmitgcm.llcreader as llcreader6 I) s. A# p3 f( G. T
%matplotlib inline- u+ Y9 `3 o6 m1 ~' L: b' X
import holoviews as hv
# ?0 X$ Z3 W  a# s0 E6 [from holoviews.operation.datashader import regrid
- B7 r4 H& `5 d. l' m' e: uhv.extension('bokeh')/ k; \0 s. |! h9 Z- l* S- O

" I6 l4 u, D9 O8 @8 [0 U2 初始化
这里我们使用LLC4320模式数据:
model = llcreader.ECCOPortalLLC4320Model()
. e$ z& z; X4 x# a% Imodel
根据数据分辨率和来源,llcreader 可用模块有:
  • • llcreader.ECCOPortalLLC2160Model: LLC2160 accessed via ECCO data portal
  • • llcreader.ECCOPortal LLC4320Model: LLC4320 accessed via ECCO data portal
  • • llcreader.PleiadesLLC2160Model: LLC2160 accessed on Pleaides filesystem
  • • llcreader.PleiadesLLC4320Model: LLC4320 accessed on Pleaides filesystem
  • • llcreader.CRIOSPortalASTE270Model: ASTE Release 1 accessed via AWS
  • • llcreader.SverdrupASTE270Model: ASTE Release 1 accessed on Sverdrup filesystem at UT Austin
    3 q5 ?( O5 [. a0 r2 g: [9 a
3 海表温度参数设置& [) W6 B+ I9 R9 V5 k% S; N% @, s
( j. a) o1 A" h- j
ds_sst = model.get_dataset(varnames=['Theta'], k_levels=[0], type='latlon')- e2 @5 U! Y- v+ ?
ds_sst
这里的Theta是模式中固有的海表温度名称。这一行程序执行的lazy模式,数据并没有存储在本地内存,也不会进行计算。该变量的大小接近10T。
ds_sst.nbytes / 1e12
9.257148163328
如果想查看其他变量的名称:
print(model.varnames)
['Eta', 'KPPhbl', 'oceFWflx', 'oceQnet', 'oceQsw', 'oceSflux', 'oceTAUX', 'oceTAUY', 'PhiBot', 'Salt', 'SIarea', 'SIheff', 'SIhsalt', 'SIhsnow', 'SIuice', 'SIvice', 'Theta', 'U', 'V', 'W']
比如Eta表示海面高度,U,V,W为速度。
get_dataset模块的全部参数设置为
get_dataset(varnames=None, iter_start=None, iter_stop=None, iter_step=None, iters=None, k_levels=None, k_chunksize=1, type='faces', read_grid=True, grid_vars_to_coords=True)
常见操作有:
  • • ds = model.get_dataset(varnames=['Eta'])
  • • ds = model.get_dataset(varnames=['Salt', 'Theta'], k_levels=[1, 10, 40])
  • • ds = model.get_dataset(varnames=['Theta'], k_levels=[0], type='latlon')8 u8 C$ H% [! `

4 o+ B5 F9 Z+ |8 Q
4 动态交互可视化
! o3 n# Z( A+ l
1 e& U: P5 d: O# Y5 t9 U* Zdataset = hv.Dataset(ds_sst.Theta.isel(k=0).astype('f4'))0 f9 O7 ~2 F) l5 ^# C# W) Q
hv_im = (dataset.to(hv.Image, ['i', 'j'], dynamic=True)
' Z8 s- n: R/ a8 ]                .options(cmap='Magma', width=950, height=600, colorbar=True))
5 d2 X* X2 o! W: }; f( N; O+ ]
- i0 R# Z9 ?' s, |%output holomap='scrubber' fps=3
8 @  J/ H3 f. Z# B# |regrid(hv_im, precompute=True)
7ca3975121480df2c8e004e3ecf82fa6.png
上图是南非Aghulhas Rings,可以看到强大的洋流和丰富的中小尺度涡旋。下图作为对比是LLC2160的结果,和4320的分辨能力比较有一定差距。
6a8b2f33b629a2e32c271099e848aa52.png
! v$ p0 d; n( y' m) R  j3 q2 P" @
涡度计算示例
下面展示LLC4320涡度计算步骤。
model = llcreader.ECCOPortalLLC4320Model()
1 f- C5 w' g5 ?$ v! W* ]print(model)
, L' x: P- _2 H) a  {6 V2 J- E/ A& H! b2 l; y
# volecity, h5 E  K7 B0 w% Z7 c. n
ds = model.get_dataset(varnames=['U', 'V'], k_levels=[0], type='latlon',- V' k) z2 G/ M: |
                        iter_start=model.iter_start,
7 N9 a5 W0 ?! E                        iter_stop=(model.iter_start + model.iter_step),- F: n. z7 O. M1 u5 G+ V" z  @( y# Y
                        read_grid=True): T% h5 g1 G& X/ r( r& W
- N8 U4 c6 E3 M" o1 ~
# Normal gridding
" r4 E7 V& U. b! cimport xgcm
1 Y0 i7 w- x7 e2 tgrid = xgcm.Grid(ds, periodic=['X'])( G" e8 E0 x/ S5 r6 s/ j& v* \
$ W1 P+ |' x! g
# Calculate vorticity. W# Y  z" G5 P2 @1 f
zeta = (-grid.diff(ds.U * ds.dxC, 'Y', boundary='fill') + grid.diff(ds.V * ds.dyC, 'X'))/ds.rAz8 N! e* g6 R- f4 C
zeta = zeta.squeeze().rename('vorticity').reset_coords(drop=True)
( j5 {0 V# P/ z! e1 z) c# K- F% q: z- C+ e. S" U/ N
# load data
6 c/ F5 P) u: X% V6 Wzeta.load()
1 W( s! D6 Q% @' X3 x6 Y# Z
2 c+ \% W1 C4 u+ j* M$ m% J, ~! k# Show
6 _. A8 z1 p9 q3 F$ kdataset = hv.Dataset(zeta)
  }. O+ E3 B6 @; t& N+ Fhv_im = (dataset.to(hv.Image, ['i_g', 'j_g']), h! _1 E; v2 [. }
                .options(cmap='RdBu_r', width=950, height=600, colorbar=True, symmetric=True))6 o+ ]" M" E0 `

4 _& U9 m: O$ J9 v& U% M6 gregrid(hv_im, precompute=True)
a8d95631898b00ae438b81361120c11a.png

+ a8 `* p; a7 G1 k# N5 a; V* F扩展:云
虽然 ECCO 门户实现了数据自由访问,但它的带宽有限,国内用户往往难以正常访问。虽然它适合交互探索,但如果想实际处理PB级别的数据,它可能无法提供足够的网络支持。
商业云存储(例如 Amazon S3 或 Google Cloud Storage)具备两全其美的优势。它既可公开访问,又具有极大的数据处理能力。
目前大量的地学大数据已经存储于云端,并可以通过Pangeo进行操作,这其中就包含LLC4320模式。
后面我将介绍云计算平台Pangeo。

/ a0 y5 \: w$ i* }' m& E+ U; ^* @- y8 w3 R& ]7 t

+ H" ^$ h$ M: P, f9 Z: w) I2 @( K2 H9 i% @* v2 T8 Y! o; s0 z. ^

; z1 u# f4 I# m, @7 n* T3 t: S8 @. @  D! }- p* u" H% _
回复

举报 使用道具

相关帖子

全部回帖
暂无回帖,快来参与回复吧
懒得打字?点击右侧快捷回复 【吾爱海洋论坛发文有奖】
您需要登录后才可以回帖 登录 | 立即注册
半座山
活跃在2025-1-26
快速回复 返回顶部 返回列表