LLC4320模式简介 LLC4320是MITgcm 1/48°全球海洋模式,其诞生的直接原因是为即将到来的SWOT任务提供高分辨率的全球海洋模拟。 LLC4320模式在多个方面具有开创性,特别是其高空间分辨率(全球分辨率在 1 到 2 公里之间)、潮汐驱动、高频(每小时)输出,其海面高度信号中包含了内潮、内波、地转平衡等信号。除了在SWOT相关工作取得应用之外,该模式也在海洋亚中尺度、内波等研究方向得到了广泛应用。 9 p4 B. r: a0 @
该模式主要特征是:
- Z; j- j7 ?: Q
- • 全球覆盖(包含极地)
- • 垂向90层
- • 分辨率1/48°
- • 全球海洋分成13个face,每个face的网格数为4320*4320
- • 时间采样是1小时,总计时间维度9030
- • 共14 个月(2011 年 9 月至 2012 年 11 月)
- • 数据量巨大,PB级别
- • 以MDS自定义二进制数据格式存储,为MITgcm独有
- • 模型网格复杂,为lat-lon-cap (LLC) 曲线网格 ,很难在常规地图投影中可视化。
$ b1 ^/ f( W1 I8 I
在数据发布之初,该数据集存储在高度安全的NASA超级计算机上,只有获得NASA资助的研究人员才能访问。 后来,NASA Ames研究中心创建数据共享网站(https://data.nas.nasa.gov/ecco/),开放了LLC4320数据。任何人都可以通过互联网访问数据。在此网站上,您可以单击下载单个大小40GB的二进制文件。除非您知道如何解码其中的内容,否则这些文件毫无用处。% g! m9 j, X2 g4 C1 `( D
* P* I. I- |2 C, H: v) L
xmitgcm.llcreaderxmitgcm 是一个 python 包,可以将 MITgcm 二进制 MDS 文件读入 xarray 结构。通过 dask,xmitgcm可以实现并行计算。
为了使二进制数据方便利用,Ryan Abernathey等开发了xmitgcm的python包,其中llcreader用于读取这些二进制文件。该模块使用xarray和dask从ECCO数据门户网站在线访问数据,使模式大数据的操作变得轻而易举。 5 F, O- }; V6 H/ I& ]. J) H
海面温度读取示例) H y7 z0 j2 B4 Y: s8 p
以海面温度读取为例,展示其基本操作。用到了如下库: - • xmitgcm: 提供llcreader
- • xarray: 基本数据结构和操作
- • dask: 大数据并行和lazy计算
- • sholoviews: 交互式的图像展示; a9 W( o u0 o( a4 s
1 导入库
4 O. T7 n- |$ J7 `: `" v/ B" G
! s; `! D1 z3 F* F2 c8 k. timport xmitgcm.llcreader as llcreader0 [; H8 \1 T7 m9 M4 s% Y$ H* `
%matplotlib inline' A; G) C( x. ]+ t
import holoviews as hv
& ]8 M! q- \( H1 b yfrom holoviews.operation.datashader import regrid. O. E, D' H# g$ C
hv.extension('bokeh')
: Q# f) U5 W$ U R L6 U7 [' N6 N% ]
3 n/ l4 b( Y# X2 }6 ]2 初始化这里我们使用LLC4320模式数据: model = llcreader.ECCOPortalLLC4320Model()/ R2 b0 U3 l: S% s$ e& c% A5 U
model根据数据分辨率和来源,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' F3 \( |! e" I. Y7 k
3 海表温度参数设置
4 A+ h3 T, B [3 u6 y! \; K. E( m+ c2 V3 e* f. c( B
ds_sst = model.get_dataset(varnames=['Theta'], k_levels=[0], type='latlon')" B8 V4 W7 c- k) W, O7 p1 |6 c" ]
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')
) ]: C7 S4 v4 F! w4 a" a' x7 a( D
4 d+ ~4 L1 M n3 | 4 动态交互可视化/ }: l8 |6 G% |% w$ c' N; l. ]
) C" K5 y! w) I) V
dataset = hv.Dataset(ds_sst.Theta.isel(k=0).astype('f4'))
7 E. e% B, m" x4 @6 ihv_im = (dataset.to(hv.Image, ['i', 'j'], dynamic=True)
* `2 ]2 k6 U: T0 \3 q" p4 [' N! d .options(cmap='Magma', width=950, height=600, colorbar=True))
& \. K+ l$ T* H/ I& P# ~6 @3 E- E; P4 e! T
%output holomap='scrubber' fps=3
& p4 }0 y' H* R7 _regrid(hv_im, precompute=True)上图是南非Aghulhas Rings,可以看到强大的洋流和丰富的中小尺度涡旋。下图作为对比是LLC2160的结果,和4320的分辨能力比较有一定差距。 9 q0 R1 b9 q0 C0 g/ j- v
涡度计算示例下面展示LLC4320涡度计算步骤。 model = llcreader.ECCOPortalLLC4320Model()" G% r! @1 ~% C' o- c
print(model): i' k7 c% t) [/ u
1 R/ j, p* ^& k4 a! U9 C, r
# volecity8 g8 I, g, z7 B, H. ?
ds = model.get_dataset(varnames=['U', 'V'], k_levels=[0], type='latlon',* Q9 `1 q+ _ H6 [9 G. a7 ]/ M
iter_start=model.iter_start,
. J% [4 X0 T m( a0 z8 Z" { iter_stop=(model.iter_start + model.iter_step),. S; G/ K- A1 D$ W/ ^! s/ c0 j
read_grid=True)
' q; l1 O4 f) P, @% l2 I; r- c
/ a O) P- ^& [3 y! |% n5 Z, |1 ]# Normal gridding% r0 C7 D5 K1 ?5 q) j- I5 w
import xgcm
% u. ?% Q" ?. o" |0 vgrid = xgcm.Grid(ds, periodic=['X'])
4 \- z8 o2 p Z h: H) p K9 B8 ]! Z/ h' O7 L: `
# Calculate vorticity% s3 g. i [3 G0 a9 p3 w) i+ [- E
zeta = (-grid.diff(ds.U * ds.dxC, 'Y', boundary='fill') + grid.diff(ds.V * ds.dyC, 'X'))/ds.rAz7 e& f1 z9 G+ p/ |
zeta = zeta.squeeze().rename('vorticity').reset_coords(drop=True)
- Z) Z; a8 i! ~8 U$ Q8 a1 y/ }
5 W1 ?! b5 a: K9 | p$ W. H# load data
$ ?% g k/ }7 w' z5 p$ Mzeta.load()
; z: B. ?* D8 }8 g/ h2 H. ^% r6 y8 J" R. w' n3 k1 _
# Show
) h( r6 T, ~: a5 S" ]6 M( n( Cdataset = hv.Dataset(zeta)
# o3 C& Z/ b1 }4 u% C# Phv_im = (dataset.to(hv.Image, ['i_g', 'j_g'])! @1 ^+ F3 t% F8 N
.options(cmap='RdBu_r', width=950, height=600, colorbar=True, symmetric=True))3 ]- @1 X* m" `/ y3 { j% k) M: Q7 b
, Q6 A$ q. D: g/ V
regrid(hv_im, precompute=True)9 o) {! V( P. e6 t; y8 [
扩展:云虽然 ECCO 门户实现了数据自由访问,但它的带宽有限,国内用户往往难以正常访问。虽然它适合交互探索,但如果想实际处理PB级别的数据,它可能无法提供足够的网络支持。 商业云存储(例如 Amazon S3 或 Google Cloud Storage)具备两全其美的优势。它既可公开访问,又具有极大的数据处理能力。 目前大量的地学大数据已经存储于云端,并可以通过Pangeo进行操作,这其中就包含LLC4320模式。 后面我将介绍云计算平台Pangeo。 ! t& X, [' I* q3 k% C
9 _: J/ L. c" h0 Y( c& h3 U& N
2 h z! D* g! I, Y7 `. O/ ~
$ k) I, \" w% ~. T
' R& Q' N8 ]8 l7 g0 ?' V7 \! p$ _6 u1 c
|