收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流QQ群:835383472

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

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

# y% L; g5 U; c( T8 o
该模式主要特征是:

6 H) q* \$ K0 D: l5 x
  • • 全球覆盖(包含极地)
  • • 垂向90层
  • • 分辨率1/48°
  • • 全球海洋分成13个face,每个face的网格数为4320*4320
  • • 时间采样是1小时,总计时间维度9030
  • • 共14 个月(2011 年 9 月至 2012 年 11 月)
  • • 数据量巨大,PB级别
  • • 以MDS自定义二进制数据格式存储,为MITgcm独有
  • • 模型网格复杂,为lat-lon-cap (LLC) 曲线网格 ,很难在常规地图投影中可视化。. ^( L4 m0 m6 G# U* |( H' }* T/ h; i
在数据发布之初,该数据集存储在高度安全的NASA超级计算机上,只有获得NASA资助的研究人员才能访问。
后来,NASA Ames研究中心创建数据共享网站(https://data.nas.nasa.gov/ecco/),开放了LLC4320数据。任何人都可以通过互联网访问数据。在此网站上,您可以单击下载单个大小40GB的二进制文件。除非您知道如何解码其中的内容,否则这些文件毫无用处。
  u# e8 K+ N. V# u* M5 z) j2 y" w& e
% C+ m* d2 X) Z0 L' [" g7 Y
xmitgcm.llcreader
xmitgcm 是一个 python 包,可以将 MITgcm 二进制 MDS 文件读入 xarray 结构。通过 dask,xmitgcm可以实现并行计算。
为了使二进制数据方便利用,Ryan Abernathey等开发了xmitgcm的python包,其中llcreader用于读取这些二进制文件。该模块使用xarray和dask从ECCO数据门户网站在线访问数据,使模式大数据的操作变得轻而易举。

" y  k' ^8 Z1 i" W% c
海面温度读取示例( |! x3 n" l9 w. h! \% ^, l
以海面温度读取为例,展示其基本操作。用到了如下库:
  • • xmitgcm: 提供llcreader
  • • xarray: 基本数据结构和操作
  • • dask: 大数据并行和lazy计算
  • • sholoviews: 交互式的图像展示3 o8 O. v/ H0 O) E" S' \1 R
1 导入库
0 O* j9 N, n* W5 k/ S- k
4 |1 k7 C8 {1 M7 M, o6 {2 }0 Mimport xmitgcm.llcreader as llcreader
7 G% Y( h" T8 n' D& W/ R  ?% M# `* e%matplotlib inline
8 F$ a- p- k" s6 N/ F3 X# uimport holoviews as hv+ U4 @4 R$ _% L# [3 v; b- _, G
from holoviews.operation.datashader import regrid, D' I( A# @$ ?/ A
hv.extension('bokeh'). c5 R" B) q5 Z$ f* A. C" k

, l4 {9 m9 X- t3 U2 初始化
这里我们使用LLC4320模式数据:
model = llcreader.ECCOPortalLLC4320Model()
4 G, V! y) e) P( Q0 Wmodel
根据数据分辨率和来源,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 Austin6 \5 Z& [& d" a# A9 i
3 海表温度参数设置. e$ C4 O! R6 [; n

/ \  n' w" u* Y  ?5 d& v7 O* ids_sst = model.get_dataset(varnames=['Theta'], k_levels=[0], type='latlon')
+ S- A9 i6 f% `1 d/ R7 X/ mds_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')
    . d  O$ l2 ]& B0 F
. c9 c: x+ m: D2 ~
4 动态交互可视化
+ G6 E7 ?# e0 n$ x  X5 y  x5 x1 {& \) ~; S" g
dataset = hv.Dataset(ds_sst.Theta.isel(k=0).astype('f4'))" r- \: e9 I3 f6 G8 S
hv_im = (dataset.to(hv.Image, ['i', 'j'], dynamic=True)/ d& i3 L* z% _8 _: Q' b
                .options(cmap='Magma', width=950, height=600, colorbar=True))3 Z2 p3 l+ d, q0 x
* M* U; u' I& @3 Y3 L
%output holomap='scrubber' fps=3
; g- b; _5 r& R  t- @( w8 C4 P6 Bregrid(hv_im, precompute=True)
7ca3975121480df2c8e004e3ecf82fa6.png
上图是南非Aghulhas Rings,可以看到强大的洋流和丰富的中小尺度涡旋。下图作为对比是LLC2160的结果,和4320的分辨能力比较有一定差距。
6a8b2f33b629a2e32c271099e848aa52.png

- B0 H" g; ?# l3 S# {涡度计算示例
下面展示LLC4320涡度计算步骤。
model = llcreader.ECCOPortalLLC4320Model()/ Q) n+ M% I4 f5 k
print(model)7 h5 F' j  J! e/ N" ]5 t

' Z3 D, }( V$ l# volecity/ m2 d( }/ H( h' L5 P
ds = model.get_dataset(varnames=['U', 'V'], k_levels=[0], type='latlon',
7 m3 T& t! |+ r+ Z( c                        iter_start=model.iter_start,: V- i7 J  o( `2 e
                        iter_stop=(model.iter_start + model.iter_step),
; ^7 k- P: ]3 y- s$ D+ f; G+ H                        read_grid=True)' H6 R! c/ g' J& r: E9 i

9 G0 K8 M# I" |/ l3 j* u) ]% j' F# Normal gridding
( ^5 O3 v) N5 d. ximport xgcm
* j+ D; x* Q0 x! r8 f% |grid = xgcm.Grid(ds, periodic=['X'])
+ \& S8 M# b. ~/ z- \1 z# c1 i
% J$ A0 V/ c2 R& R7 ]3 Y, g( F# Calculate vorticity
5 \; y) a: W- z8 l2 ~# Wzeta = (-grid.diff(ds.U * ds.dxC, 'Y', boundary='fill') + grid.diff(ds.V * ds.dyC, 'X'))/ds.rAz4 M6 y8 L% X( a: r
zeta = zeta.squeeze().rename('vorticity').reset_coords(drop=True)3 Y; p: W% c0 x+ q( X0 s3 @
: q6 l& B. {' o: n# s/ r8 B( S
# load data
( I5 \& T2 w" F! l1 ]& u8 v. szeta.load()
& r" d5 p% t- L  t1 \/ i7 @7 z5 e
; y5 M9 W+ i& u( j: ~# Show
% B* B' P/ W: C* \) h) @8 D8 h# n& W- sdataset = hv.Dataset(zeta)! g6 ~) W, n0 a- ~2 Z$ H; }! L
hv_im = (dataset.to(hv.Image, ['i_g', 'j_g'])
, y% J  H% f5 z% |2 o5 y$ T; ^                .options(cmap='RdBu_r', width=950, height=600, colorbar=True, symmetric=True))
) V8 S4 k. P; \$ Z7 S5 J
# P0 `/ O! z/ R8 b. Bregrid(hv_im, precompute=True)
a8d95631898b00ae438b81361120c11a.png

0 i2 w# \6 f( H% x6 q/ |) O扩展:云
虽然 ECCO 门户实现了数据自由访问,但它的带宽有限,国内用户往往难以正常访问。虽然它适合交互探索,但如果想实际处理PB级别的数据,它可能无法提供足够的网络支持。
商业云存储(例如 Amazon S3 或 Google Cloud Storage)具备两全其美的优势。它既可公开访问,又具有极大的数据处理能力。
目前大量的地学大数据已经存储于云端,并可以通过Pangeo进行操作,这其中就包含LLC4320模式。
后面我将介绍云计算平台Pangeo。
$ @- Q2 c' z; `0 T3 ?
/ u0 K/ A: p' e. i, W

6 v7 a) s$ _9 @/ [  e/ v" c* Y  V7 j# I
* X9 O& u1 j; h9 J7 y/ \

! Z7 u+ E6 I5 x5 R
回复

举报 使用道具

相关帖子

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