|
LLC4320模式简介 LLC4320是MITgcm 1/48°全球海洋模式,其诞生的直接原因是为即将到来的SWOT任务提供高分辨率的全球海洋模拟。 LLC4320模式在多个方面具有开创性,特别是其高空间分辨率(全球分辨率在 1 到 2 公里之间)、潮汐驱动、高频(每小时)输出,其海面高度信号中包含了内潮、内波、地转平衡等信号。除了在SWOT相关工作取得应用之外,该模式也在海洋亚中尺度、内波等研究方向得到了广泛应用。
) r7 I- K N( o! r* D" ^) ^
该模式主要特征是: ' l# l$ \5 ?/ D" n; |
- • 全球覆盖(包含极地)
- • 垂向90层
- • 分辨率1/48°
- • 全球海洋分成13个face,每个face的网格数为4320*4320
- • 时间采样是1小时,总计时间维度9030
- • 共14 个月(2011 年 9 月至 2012 年 11 月)
- • 数据量巨大,PB级别
- • 以MDS自定义二进制数据格式存储,为MITgcm独有
- • 模型网格复杂,为lat-lon-cap (LLC) 曲线网格 ,很难在常规地图投影中可视化。$ H! D9 }$ |8 f, C" ~
在数据发布之初,该数据集存储在高度安全的NASA超级计算机上,只有获得NASA资助的研究人员才能访问。 后来,NASA Ames研究中心创建数据共享网站(https://data.nas.nasa.gov/ecco/),开放了LLC4320数据。任何人都可以通过互联网访问数据。在此网站上,您可以单击下载单个大小40GB的二进制文件。除非您知道如何解码其中的内容,否则这些文件毫无用处。5 N4 y3 M2 L- s; s
1 n/ H% d- m# Q: J6 s# }6 m
xmitgcm.llcreaderxmitgcm 是一个 python 包,可以将 MITgcm 二进制 MDS 文件读入 xarray 结构。通过 dask,xmitgcm可以实现并行计算。
为了使二进制数据方便利用,Ryan Abernathey等开发了xmitgcm的python包,其中llcreader用于读取这些二进制文件。该模块使用xarray和dask从ECCO数据门户网站在线访问数据,使模式大数据的操作变得轻而易举。 $ x2 r& b! L6 L5 h d" H( Q
海面温度读取示例$ U9 f7 g# Z. ?. g
以海面温度读取为例,展示其基本操作。用到了如下库: - • xmitgcm: 提供llcreader
- • xarray: 基本数据结构和操作
- • dask: 大数据并行和lazy计算
- • sholoviews: 交互式的图像展示2 i; H. J/ N2 E) U: g
1 导入库! c* A! b! \: L( o& \4 R6 P4 ~
9 q7 w X- n8 C5 C
import xmitgcm.llcreader as llcreader, q! N2 M/ `# _. Q& S* m! E
%matplotlib inline9 s* E( a. ?3 Y' K
import holoviews as hv
& d8 ]" `, A5 }" w& ofrom holoviews.operation.datashader import regrid
) D6 S' ^' v \& ~, i+ ~! Dhv.extension('bokeh')6 s" l& W) B) G, G/ x: D* q
. U+ @. u5 _* @' S0 W
2 初始化这里我们使用LLC4320模式数据: model = llcreader.ECCOPortalLLC4320Model()! m& t, s5 ]/ w& b* y
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' O8 M+ m0 S1 k, K5 `* C5 m4 o/ i
3 海表温度参数设置
0 ~1 e+ \, K3 z$ j) p; u/ D
. M2 m" r2 K s9 \9 Xds_sst = model.get_dataset(varnames=['Theta'], k_levels=[0], type='latlon')- ^% b3 W, M4 p; R8 f$ J& k/ G. n
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')
8 t) b7 k! i9 A! y" E0 y4 b: m- x
! G) @, o5 t8 R# k1 U. n 4 动态交互可视化! `5 l& R+ b2 i
2 r' ]$ a5 R- B8 R$ H2 i edataset = hv.Dataset(ds_sst.Theta.isel(k=0).astype('f4'))
3 X& ?; s* a9 V( N3 x# whv_im = (dataset.to(hv.Image, ['i', 'j'], dynamic=True)
: R* K$ L$ J+ S5 M, ?. u .options(cmap='Magma', width=950, height=600, colorbar=True))& ^0 w e9 |8 _4 L: A# E
' K9 c2 U3 a: C8 y* V%output holomap='scrubber' fps=3' C `6 g6 `/ Z l/ H1 _
regrid(hv_im, precompute=True)上图是南非Aghulhas Rings,可以看到强大的洋流和丰富的中小尺度涡旋。下图作为对比是LLC2160的结果,和4320的分辨能力比较有一定差距。
) u7 G" t' l" V0 ?! |. S( n# S涡度计算示例下面展示LLC4320涡度计算步骤。 model = llcreader.ECCOPortalLLC4320Model()
& i- C1 l% \0 aprint(model). @. C, h( S. w7 Q* T4 x7 H, ^
! L( Q3 Z3 U5 w! W9 ~' ^, @# volecity
, [8 v: y, l$ @: M) Jds = model.get_dataset(varnames=['U', 'V'], k_levels=[0], type='latlon',
h, Y/ S" P* b3 N5 e9 c iter_start=model.iter_start,6 r9 ^) Q% @# s1 f2 V* W/ Z, c3 a9 L) |
iter_stop=(model.iter_start + model.iter_step),
: ^2 x, O; w: H* ?( ?0 b4 r read_grid=True)4 K% u/ I3 O, q1 j
. O' s" ]6 A+ p$ \+ z
# Normal gridding2 b; Z- n% T- V/ y4 O
import xgcm' D6 g' M9 Q+ P- Y! o- z. P1 Z+ C2 b
grid = xgcm.Grid(ds, periodic=['X'])
4 w2 |( I: M4 F0 |8 v9 r; G7 R5 r" r' ?. p! }# J4 z
# Calculate vorticity. i! G7 m' x4 {# r8 ?* ^# L
zeta = (-grid.diff(ds.U * ds.dxC, 'Y', boundary='fill') + grid.diff(ds.V * ds.dyC, 'X'))/ds.rAz# ]) S' G$ J3 j& u# ?: i4 y& k
zeta = zeta.squeeze().rename('vorticity').reset_coords(drop=True)* C" j7 ?8 Q9 }2 g( ^7 M
) _& r$ d! W! G0 o4 _) k: ~# load data
& s0 o6 p4 @/ f, F- x: g# _- Azeta.load()
5 R. l; z% t+ e
6 b0 o- Z- Z7 Y: v9 G# Show* |- ]% L6 ?; _: x5 D
dataset = hv.Dataset(zeta)
% L, A/ Z/ }. T6 W- |- _hv_im = (dataset.to(hv.Image, ['i_g', 'j_g'])/ z8 [, q! \% _$ j; f: ]9 e9 ?
.options(cmap='RdBu_r', width=950, height=600, colorbar=True, symmetric=True))) h& s6 _' Q8 [( E- c3 j: u
- W& t+ t( z4 K l( D n* I$ j" pregrid(hv_im, precompute=True)
5 r: [5 o7 l+ f扩展:云虽然 ECCO 门户实现了数据自由访问,但它的带宽有限,国内用户往往难以正常访问。虽然它适合交互探索,但如果想实际处理PB级别的数据,它可能无法提供足够的网络支持。 商业云存储(例如 Amazon S3 或 Google Cloud Storage)具备两全其美的优势。它既可公开访问,又具有极大的数据处理能力。 目前大量的地学大数据已经存储于云端,并可以通过Pangeo进行操作,这其中就包含LLC4320模式。 后面我将介绍云计算平台Pangeo。 " _" F- a6 p! O$ z+ ]. \) _0 H
9 g ~5 Y; v8 N$ {. G
' P K! e) c6 o+ z) Y8 b4 c/ O2 `4 d$ G; B4 b* ~8 K, [/ \3 a
1 S1 f( z4 O- {, w: N5 y; \/ { `$ G+ k/ R
|