|
LLC4320模式简介 LLC4320是MITgcm 1/48°全球海洋模式,其诞生的直接原因是为即将到来的SWOT任务提供高分辨率的全球海洋模拟。 LLC4320模式在多个方面具有开创性,特别是其高空间分辨率(全球分辨率在 1 到 2 公里之间)、潮汐驱动、高频(每小时)输出,其海面高度信号中包含了内潮、内波、地转平衡等信号。除了在SWOT相关工作取得应用之外,该模式也在海洋亚中尺度、内波等研究方向得到了广泛应用。
4 k m$ u' V V; a: \
该模式主要特征是:
: [6 s# {0 ~ a y
- • 全球覆盖(包含极地)
- • 垂向90层
- • 分辨率1/48°
- • 全球海洋分成13个face,每个face的网格数为4320*4320
- • 时间采样是1小时,总计时间维度9030
- • 共14 个月(2011 年 9 月至 2012 年 11 月)
- • 数据量巨大,PB级别
- • 以MDS自定义二进制数据格式存储,为MITgcm独有
- • 模型网格复杂,为lat-lon-cap (LLC) 曲线网格 ,很难在常规地图投影中可视化。1 U( F# s' S o0 V
在数据发布之初,该数据集存储在高度安全的NASA超级计算机上,只有获得NASA资助的研究人员才能访问。 后来,NASA Ames研究中心创建数据共享网站(https://data.nas.nasa.gov/ecco/),开放了LLC4320数据。任何人都可以通过互联网访问数据。在此网站上,您可以单击下载单个大小40GB的二进制文件。除非您知道如何解码其中的内容,否则这些文件毫无用处。& d! R0 j, F5 z" M# g0 d
# m G4 v7 U1 G) M6 w/ z xmitgcm.llcreaderxmitgcm 是一个 python 包,可以将 MITgcm 二进制 MDS 文件读入 xarray 结构。通过 dask,xmitgcm可以实现并行计算。
为了使二进制数据方便利用,Ryan Abernathey等开发了xmitgcm的python包,其中llcreader用于读取这些二进制文件。该模块使用xarray和dask从ECCO数据门户网站在线访问数据,使模式大数据的操作变得轻而易举。 5 c4 s3 _! N& p! Q2 h
海面温度读取示例7 H' U# B7 Y% m2 i. a7 Y
以海面温度读取为例,展示其基本操作。用到了如下库: - • xmitgcm: 提供llcreader
- • xarray: 基本数据结构和操作
- • dask: 大数据并行和lazy计算
- • sholoviews: 交互式的图像展示' f) y( c2 v* }% h) W! u# Q
1 导入库
7 a& E5 U4 ^0 Z3 Q
1 l. _1 k1 b, Z3 e) Qimport xmitgcm.llcreader as llcreader6 I* }6 [6 M( o' J, \% w: v
%matplotlib inline {) _4 F" a/ n4 O" A# h
import holoviews as hv
7 g' T3 y1 V2 T! J' E8 y! Qfrom holoviews.operation.datashader import regrid' P" h$ b) n- L/ C5 `3 v
hv.extension('bokeh')9 j O8 R. h3 O. X. F7 K; S
5 K! d7 V4 j3 G. X6 F
2 初始化这里我们使用LLC4320模式数据: model = llcreader.ECCOPortalLLC4320Model()
" o4 T3 ~+ r d7 B2 zmodel根据数据分辨率和来源,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 @$ t; Q' O8 I 3 海表温度参数设置
2 K; \3 K0 ?5 A% a$ r* W7 A
4 M! ?5 u5 B# Q1 P- {/ c: x8 [6 y' uds_sst = model.get_dataset(varnames=['Theta'], k_levels=[0], type='latlon')2 i# ^$ w7 d- e/ {% E' 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')
( N1 x' h$ [& [8 ?
/ x$ C6 c4 U: `7 T, ` 4 动态交互可视化) `4 a5 V4 s+ m5 @+ ? c
* I4 P! a; k8 D0 M7 Cdataset = hv.Dataset(ds_sst.Theta.isel(k=0).astype('f4'))8 i; q4 k7 J6 Y! \6 l
hv_im = (dataset.to(hv.Image, ['i', 'j'], dynamic=True)
1 d) F- z, y* E- b, q' Q .options(cmap='Magma', width=950, height=600, colorbar=True)) i' Y- a: |: M$ }
* f; f; l& `; v- a2 G
%output holomap='scrubber' fps=3
" ]; o; W0 _- z" c2 j# U# xregrid(hv_im, precompute=True)上图是南非Aghulhas Rings,可以看到强大的洋流和丰富的中小尺度涡旋。下图作为对比是LLC2160的结果,和4320的分辨能力比较有一定差距。 - t6 a- J0 F. j
涡度计算示例下面展示LLC4320涡度计算步骤。 model = llcreader.ECCOPortalLLC4320Model(), r! j# R3 B# _* q0 v6 Y' H7 ]
print(model)! I5 A& ]0 R( r
; X3 E5 f% z1 ~- P. ~# volecity
' u: t3 n* T; O, |3 Y( a$ T; Wds = model.get_dataset(varnames=['U', 'V'], k_levels=[0], type='latlon',7 I1 _' w5 v) s+ `- ?1 c( M
iter_start=model.iter_start,
: D& F" h( _* I# L0 y% ]3 ^' s2 ~ iter_stop=(model.iter_start + model.iter_step),0 G% L& |# U9 A2 O) W0 b( \1 R
read_grid=True)+ ?1 ]# M* p6 ~5 i" S5 C/ {
+ B% [, h; ?) O8 }( z% k5 `
# Normal gridding
0 z! |8 H3 o3 C5 Eimport xgcm9 S1 N0 o9 |7 X$ @5 z& D
grid = xgcm.Grid(ds, periodic=['X'])( @+ V' E, i9 o$ d3 p. E2 }
" _. N$ Y% V& Q* t7 R# o# Calculate vorticity9 u) \8 W1 Z, M: o
zeta = (-grid.diff(ds.U * ds.dxC, 'Y', boundary='fill') + grid.diff(ds.V * ds.dyC, 'X'))/ds.rAz
7 a' D, I4 T1 T( A! Nzeta = zeta.squeeze().rename('vorticity').reset_coords(drop=True). A- U( k. Q ~* r: H
9 I. h$ [0 l* d3 q
# load data
7 m$ u6 g2 H! F0 J- L& f3 Uzeta.load()
6 K" t0 Y! H$ v& R% o; o& E& w
" l6 J" J1 m% L d0 o# Show
% E7 f5 X- M/ o9 | Xdataset = hv.Dataset(zeta)# o1 c% m: _- \0 c* W6 `6 e
hv_im = (dataset.to(hv.Image, ['i_g', 'j_g']), m0 p, I& {4 {0 q
.options(cmap='RdBu_r', width=950, height=600, colorbar=True, symmetric=True))
% n5 t. O/ I0 e+ W3 R* {- g& c7 `" k
regrid(hv_im, precompute=True)7 |$ s0 ]" h) I4 _4 `
扩展:云虽然 ECCO 门户实现了数据自由访问,但它的带宽有限,国内用户往往难以正常访问。虽然它适合交互探索,但如果想实际处理PB级别的数据,它可能无法提供足够的网络支持。 商业云存储(例如 Amazon S3 或 Google Cloud Storage)具备两全其美的优势。它既可公开访问,又具有极大的数据处理能力。 目前大量的地学大数据已经存储于云端,并可以通过Pangeo进行操作,这其中就包含LLC4320模式。 后面我将介绍云计算平台Pangeo。 2 P9 \4 y5 ]6 |
2 s( k/ Q. P! t+ E" C
- I2 W& I: y( `
& o# W+ } G3 T' p" |9 t9 [
8 Q- l; ~* w l
; W' M" L0 K- M |