|
LLC4320模式简介 LLC4320是MITgcm 1/48°全球海洋模式,其诞生的直接原因是为即将到来的SWOT任务提供高分辨率的全球海洋模拟。 LLC4320模式在多个方面具有开创性,特别是其高空间分辨率(全球分辨率在 1 到 2 公里之间)、潮汐驱动、高频(每小时)输出,其海面高度信号中包含了内潮、内波、地转平衡等信号。除了在SWOT相关工作取得应用之外,该模式也在海洋亚中尺度、内波等研究方向得到了广泛应用。 9 @- [8 C! p1 c6 @$ N6 a, l
该模式主要特征是: ' ? y' e6 D7 w' ^7 C, Y" _" R
- • 全球覆盖(包含极地)
- • 垂向90层
- • 分辨率1/48°
- • 全球海洋分成13个face,每个face的网格数为4320*4320
- • 时间采样是1小时,总计时间维度9030
- • 共14 个月(2011 年 9 月至 2012 年 11 月)
- • 数据量巨大,PB级别
- • 以MDS自定义二进制数据格式存储,为MITgcm独有
- • 模型网格复杂,为lat-lon-cap (LLC) 曲线网格 ,很难在常规地图投影中可视化。
- s1 i2 ]6 {$ d$ M1 P; T' m; j% ]+ P
在数据发布之初,该数据集存储在高度安全的NASA超级计算机上,只有获得NASA资助的研究人员才能访问。 后来,NASA Ames研究中心创建数据共享网站(https://data.nas.nasa.gov/ecco/),开放了LLC4320数据。任何人都可以通过互联网访问数据。在此网站上,您可以单击下载单个大小40GB的二进制文件。除非您知道如何解码其中的内容,否则这些文件毫无用处。
L! U# A& H( d$ X+ f$ G u X0 m5 p/ z3 o2 _ s
xmitgcm.llcreaderxmitgcm 是一个 python 包,可以将 MITgcm 二进制 MDS 文件读入 xarray 结构。通过 dask,xmitgcm可以实现并行计算。
为了使二进制数据方便利用,Ryan Abernathey等开发了xmitgcm的python包,其中llcreader用于读取这些二进制文件。该模块使用xarray和dask从ECCO数据门户网站在线访问数据,使模式大数据的操作变得轻而易举。
; ]7 ~+ I6 t5 @7 X, n' L' Z; n7 _ 海面温度读取示例
8 n0 A" c* o, t/ `6 z7 v( f以海面温度读取为例,展示其基本操作。用到了如下库: - • xmitgcm: 提供llcreader
- • xarray: 基本数据结构和操作
- • dask: 大数据并行和lazy计算
- • sholoviews: 交互式的图像展示
" O- t) T! [% J; ~# F 1 导入库; ?& D( d) |( E8 _* x/ m# Q
9 N! m m0 k4 r2 U# o* o" l( o
import xmitgcm.llcreader as llcreader9 [2 ~) V7 g+ Y* M# G" m
%matplotlib inline
2 g+ ~1 O( p* K Qimport holoviews as hv/ ~' ~" v$ q" Q' M' c3 F1 `1 x: g
from holoviews.operation.datashader import regrid
8 Y/ b3 s: [- t6 B. Y4 @hv.extension('bokeh')
: o& L$ z M# G+ H8 x+ v3 ~
: P6 g1 R! ]2 e/ Y% b/ M9 K2 Z2 初始化这里我们使用LLC4320模式数据: model = llcreader.ECCOPortalLLC4320Model()
% |/ o" i! f Jmodel根据数据分辨率和来源,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
$ o8 z1 V( y( }' N" @( t; Z 3 海表温度参数设置+ f. D5 D% p" X9 d; Q
# v6 j4 ], ]& l0 I2 |ds_sst = model.get_dataset(varnames=['Theta'], k_levels=[0], type='latlon')- D/ b" n1 x( A5 F$ W4 j7 M
ds_sst这里的Theta是模式中固有的海表温度名称。这一行程序执行的lazy模式,数据并没有存储在本地内存,也不会进行计算。该变量的大小接近10T。 ds_sst.nbytes / 1e129.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')
% W7 P2 X! G# V/ D3 X. E! @0 t
- ?2 Z6 X. d, T; o
4 动态交互可视化
- ?5 i1 D0 Q z6 C L2 Z5 L6 y( o. g" }2 _
dataset = hv.Dataset(ds_sst.Theta.isel(k=0).astype('f4'))4 n( S1 F# z$ @! ]! J
hv_im = (dataset.to(hv.Image, ['i', 'j'], dynamic=True)
5 U2 E: u: u7 V- y& f& v .options(cmap='Magma', width=950, height=600, colorbar=True))2 L2 c5 O1 w% x
: [7 p( [: V- }* i2 U; n2 }+ a
%output holomap='scrubber' fps=3" D9 M- i9 _4 B1 B, L2 x9 q. |
regrid(hv_im, precompute=True)上图是南非Aghulhas Rings,可以看到强大的洋流和丰富的中小尺度涡旋。下图作为对比是LLC2160的结果,和4320的分辨能力比较有一定差距。 # `5 l% Z! t8 q' G# B
涡度计算示例下面展示LLC4320涡度计算步骤。 model = llcreader.ECCOPortalLLC4320Model()' d$ {! b4 |2 I/ [: S) T, |: z8 z
print(model): {0 \' Z) e. L$ u
$ o C$ M. f( Y! c4 q9 i9 _/ x: J
# volecity
4 S8 H" P) T# _7 tds = model.get_dataset(varnames=['U', 'V'], k_levels=[0], type='latlon',+ A; {: J; T) v5 K9 K( S; [$ p
iter_start=model.iter_start,
. U+ u8 r8 F( l0 u. V* ? W iter_stop=(model.iter_start + model.iter_step),; w0 j8 J! j3 a; P: n
read_grid=True)3 B# N/ @: ?, J
8 g! k5 Y: s: A; t& A# Normal gridding
, i& l& M) \. j* s" Z/ q8 dimport xgcm1 [! o. C& h+ R) v- ]% ^3 I
grid = xgcm.Grid(ds, periodic=['X'])
+ |2 H) C9 E- N% ]( S, i) V: ^4 U1 a4 ^5 n% M
# Calculate vorticity
; K, F# G% `$ d. p2 D5 }! Wzeta = (-grid.diff(ds.U * ds.dxC, 'Y', boundary='fill') + grid.diff(ds.V * ds.dyC, 'X'))/ds.rAz2 H& q# r2 [0 {" d
zeta = zeta.squeeze().rename('vorticity').reset_coords(drop=True)
; P# c3 D; M# |; L& j9 L3 X% ]
; c9 `" p. _9 w; G+ b2 i4 P. D: C! ?# load data
. \; k* s' r4 ^$ x% M) Hzeta.load()
) G1 g5 G x( i s' ? U; m
& p/ |+ e+ J3 C, B& U3 v7 ^2 @# Show+ C# l) u0 e0 n: B
dataset = hv.Dataset(zeta)
; R8 c |7 u8 B4 shv_im = (dataset.to(hv.Image, ['i_g', 'j_g'])
. ], f$ ?# G5 ~/ f .options(cmap='RdBu_r', width=950, height=600, colorbar=True, symmetric=True))# \' I: n# i1 x0 H/ Q, b
1 I( O9 _2 ^7 j3 e+ l0 B5 X! Uregrid(hv_im, precompute=True)# [1 [& Z- y' Y# r
扩展:云虽然 ECCO 门户实现了数据自由访问,但它的带宽有限,国内用户往往难以正常访问。虽然它适合交互探索,但如果想实际处理PB级别的数据,它可能无法提供足够的网络支持。 商业云存储(例如 Amazon S3 或 Google Cloud Storage)具备两全其美的优势。它既可公开访问,又具有极大的数据处理能力。 目前大量的地学大数据已经存储于云端,并可以通过Pangeo进行操作,这其中就包含LLC4320模式。 后面我将介绍云计算平台Pangeo。 D( i0 D+ c" M4 q
. J# |1 {: x: V2 S
! ~8 Q+ s# |$ d6 U
+ O# _ W* _: D& u* Y4 A; w
/ f9 U* m5 f6 D9 {- |1 ` H" Z; e, F) g! k: J+ b6 c9 d
|