LLC4320模式简介 LLC4320是MITgcm 1/48°全球海洋模式,其诞生的直接原因是为即将到来的SWOT任务提供高分辨率的全球海洋模拟。 LLC4320模式在多个方面具有开创性,特别是其高空间分辨率(全球分辨率在 1 到 2 公里之间)、潮汐驱动、高频(每小时)输出,其海面高度信号中包含了内潮、内波、地转平衡等信号。除了在SWOT相关工作取得应用之外,该模式也在海洋亚中尺度、内波等研究方向得到了广泛应用。 $ l* c* n! Q, j, z( U: Y, q v
该模式主要特征是: ! ^; ]6 u- z/ J4 \; K) N
- • 全球覆盖(包含极地)
- • 垂向90层
- • 分辨率1/48°
- • 全球海洋分成13个face,每个face的网格数为4320*4320
- • 时间采样是1小时,总计时间维度9030
- • 共14 个月(2011 年 9 月至 2012 年 11 月)
- • 数据量巨大,PB级别
- • 以MDS自定义二进制数据格式存储,为MITgcm独有
- • 模型网格复杂,为lat-lon-cap (LLC) 曲线网格 ,很难在常规地图投影中可视化。
8 w9 D* Z% Y6 ?9 U
在数据发布之初,该数据集存储在高度安全的NASA超级计算机上,只有获得NASA资助的研究人员才能访问。 后来,NASA Ames研究中心创建数据共享网站(https://data.nas.nasa.gov/ecco/),开放了LLC4320数据。任何人都可以通过互联网访问数据。在此网站上,您可以单击下载单个大小40GB的二进制文件。除非您知道如何解码其中的内容,否则这些文件毫无用处。/ L! \& E/ Q' U: `3 O
0 N2 M; [3 z1 p e* } xmitgcm.llcreaderxmitgcm 是一个 python 包,可以将 MITgcm 二进制 MDS 文件读入 xarray 结构。通过 dask,xmitgcm可以实现并行计算。
为了使二进制数据方便利用,Ryan Abernathey等开发了xmitgcm的python包,其中llcreader用于读取这些二进制文件。该模块使用xarray和dask从ECCO数据门户网站在线访问数据,使模式大数据的操作变得轻而易举。 ) \( U' ~/ u8 n$ r. z/ l O+ [5 C
海面温度读取示例8 F' l4 X( f6 w9 O4 u, n" ^
以海面温度读取为例,展示其基本操作。用到了如下库: - • xmitgcm: 提供llcreader
- • xarray: 基本数据结构和操作
- • dask: 大数据并行和lazy计算
- • sholoviews: 交互式的图像展示
1 Z' o2 ~. k: t9 R: \+ n. }" Q( `4 c. d 1 导入库
9 F' r# q# k4 W5 c. x1 i h- |% J. v5 N5 A
import xmitgcm.llcreader as llcreader
# N2 f1 n3 P! c: f( d3 Y/ e%matplotlib inline3 n% S5 Y* z1 b' f
import holoviews as hv d; k& F8 n" E# ]3 {1 h
from holoviews.operation.datashader import regrid
! U( P* {( o! W8 B7 F' _$ t, _; Phv.extension('bokeh')2 F4 H9 H, ^, c
" B( o- W8 v" x6 o: h2 初始化这里我们使用LLC4320模式数据: model = llcreader.ECCOPortalLLC4320Model()$ t2 U2 z) ]( ~/ _" H: R! B
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 l2 G# a7 N8 }. |0 Z6 J% F1 e* L z
3 海表温度参数设置% w' i/ i; [9 A
# v; s6 S" E; t6 h% N
ds_sst = model.get_dataset(varnames=['Theta'], k_levels=[0], type='latlon')
% h$ j8 t" }0 S/ c2 pds_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')
" ?; U4 I; s) O8 A5 m4 i" I
% r# s2 g8 L3 v3 z" ~7 e
4 动态交互可视化: K. E B* }7 q7 m
7 b- r7 R" p b) y1 Y3 O( Gdataset = hv.Dataset(ds_sst.Theta.isel(k=0).astype('f4'))2 b; K& M" N# L
hv_im = (dataset.to(hv.Image, ['i', 'j'], dynamic=True)6 J+ s% U- O: S& w5 ^' Q
.options(cmap='Magma', width=950, height=600, colorbar=True))% d; Z: K/ j" [
, W* o' x9 d7 }) Y%output holomap='scrubber' fps=3, A& T6 ?8 ~7 r1 Z. {* I
regrid(hv_im, precompute=True)上图是南非Aghulhas Rings,可以看到强大的洋流和丰富的中小尺度涡旋。下图作为对比是LLC2160的结果,和4320的分辨能力比较有一定差距。 1 R* W+ p& `8 R8 d' I
涡度计算示例下面展示LLC4320涡度计算步骤。 model = llcreader.ECCOPortalLLC4320Model()
* H0 R$ J& A& A$ A- U7 Bprint(model). B; [3 P- d* b
2 C4 s3 A) r. x% ?/ D, ]# volecity: k2 I8 w7 J- L% ^" v
ds = model.get_dataset(varnames=['U', 'V'], k_levels=[0], type='latlon',
, z- B7 i5 D: r( S& V0 g iter_start=model.iter_start,& e7 R& U! d( _; s+ N$ V
iter_stop=(model.iter_start + model.iter_step),
0 y1 L1 J) w8 K5 ~' M read_grid=True)
3 G2 {4 [! D N1 n) \2 x! q& {, v7 R* w
# Normal gridding" X: ^; z. H0 [9 ^7 Z' J: c, c
import xgcm' ]3 _. a& J& R: Y. z; B
grid = xgcm.Grid(ds, periodic=['X'])
3 D5 v: t/ U' ]3 \% l0 r! k- Y8 A: p h% I5 y
# Calculate vorticity/ s- g) I: z9 P% c6 x6 X
zeta = (-grid.diff(ds.U * ds.dxC, 'Y', boundary='fill') + grid.diff(ds.V * ds.dyC, 'X'))/ds.rAz( z X& a) e7 w+ e+ `. z$ R0 \
zeta = zeta.squeeze().rename('vorticity').reset_coords(drop=True)
2 c) n/ q3 y+ y/ g9 V S- h) U) P \% U$ @
# load data, Z) O! T# P5 t8 H" b v7 R- P* P
zeta.load()
" O# a1 m% P% I f' y& ]6 W: `
, B* W0 }: T5 Y$ F9 D" H& v# Show
' C/ a* o( _0 m L& C2 |# h0 Fdataset = hv.Dataset(zeta)
2 ?, E; ^' P4 X+ c0 A* a$ Shv_im = (dataset.to(hv.Image, ['i_g', 'j_g'])7 N7 y- ]5 t. ?9 d" s/ {' p8 V
.options(cmap='RdBu_r', width=950, height=600, colorbar=True, symmetric=True))1 t8 j* H& G" g d' N* E
- o- Z( J4 \! Q* i, v0 {, c! |, @
regrid(hv_im, precompute=True)5 q; J# z. y1 [
扩展:云虽然 ECCO 门户实现了数据自由访问,但它的带宽有限,国内用户往往难以正常访问。虽然它适合交互探索,但如果想实际处理PB级别的数据,它可能无法提供足够的网络支持。 商业云存储(例如 Amazon S3 或 Google Cloud Storage)具备两全其美的优势。它既可公开访问,又具有极大的数据处理能力。 目前大量的地学大数据已经存储于云端,并可以通过Pangeo进行操作,这其中就包含LLC4320模式。 后面我将介绍云计算平台Pangeo。 % Y4 x7 y0 u; {/ C* a
, ]0 a* M" B8 \3 Z7 O: F/ y! V7 M B# t5 N6 T, p* ?
' i/ r: b2 Y& Y) J1 V4 z
" \* C* m: g9 ?( `
! ]& D9 O' h) S: V1 g( c
|