|
LLC4320模式简介 LLC4320是MITgcm 1/48°全球海洋模式,其诞生的直接原因是为即将到来的SWOT任务提供高分辨率的全球海洋模拟。 LLC4320模式在多个方面具有开创性,特别是其高空间分辨率(全球分辨率在 1 到 2 公里之间)、潮汐驱动、高频(每小时)输出,其海面高度信号中包含了内潮、内波、地转平衡等信号。除了在SWOT相关工作取得应用之外,该模式也在海洋亚中尺度、内波等研究方向得到了广泛应用。
8 c6 g+ ~, S# q; r% j; c* R
该模式主要特征是:
7 |" L- r' F4 C1 G
- • 全球覆盖(包含极地)
- • 垂向90层
- • 分辨率1/48°
- • 全球海洋分成13个face,每个face的网格数为4320*4320
- • 时间采样是1小时,总计时间维度9030
- • 共14 个月(2011 年 9 月至 2012 年 11 月)
- • 数据量巨大,PB级别
- • 以MDS自定义二进制数据格式存储,为MITgcm独有
- • 模型网格复杂,为lat-lon-cap (LLC) 曲线网格 ,很难在常规地图投影中可视化。% d' v- W. G8 G2 u
在数据发布之初,该数据集存储在高度安全的NASA超级计算机上,只有获得NASA资助的研究人员才能访问。 后来,NASA Ames研究中心创建数据共享网站(https://data.nas.nasa.gov/ecco/),开放了LLC4320数据。任何人都可以通过互联网访问数据。在此网站上,您可以单击下载单个大小40GB的二进制文件。除非您知道如何解码其中的内容,否则这些文件毫无用处。& p O' @) N; s5 b
# `; [; U& i, S/ {
xmitgcm.llcreaderxmitgcm 是一个 python 包,可以将 MITgcm 二进制 MDS 文件读入 xarray 结构。通过 dask,xmitgcm可以实现并行计算。
为了使二进制数据方便利用,Ryan Abernathey等开发了xmitgcm的python包,其中llcreader用于读取这些二进制文件。该模块使用xarray和dask从ECCO数据门户网站在线访问数据,使模式大数据的操作变得轻而易举。
. G( _8 D* U- M 海面温度读取示例, V8 q* E& E3 [0 M! z! o' {
以海面温度读取为例,展示其基本操作。用到了如下库: - • xmitgcm: 提供llcreader
- • xarray: 基本数据结构和操作
- • dask: 大数据并行和lazy计算
- • sholoviews: 交互式的图像展示7 m8 V& j: i$ X+ T
1 导入库
0 P* l& ^! l* m' S) k! Z M, _8 m8 p4 d
import xmitgcm.llcreader as llcreader" {3 E" |) H% o7 ^. W8 R
%matplotlib inline
: g, M& P; y# [$ F% Vimport holoviews as hv& J3 w8 V, V+ T+ w% z5 ?0 t J9 B
from holoviews.operation.datashader import regrid
! W5 z7 C4 k1 thv.extension('bokeh')
" f+ h8 ^$ U; r8 ]! P5 N4 @; V5 I* z# K5 h# I3 ?7 _
2 初始化这里我们使用LLC4320模式数据: model = llcreader.ECCOPortalLLC4320Model()
$ |' C4 B2 ?/ M3 \, z2 d7 gmodel根据数据分辨率和来源,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
5 O6 G; \8 V& Q' R: Y, T% ^- W# ?; w 3 海表温度参数设置
" \5 S! m* S% q, q* J& s2 g: {2 g" }2 F; B
ds_sst = model.get_dataset(varnames=['Theta'], k_levels=[0], type='latlon')" B* n" ?5 Z" ^: u
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')
: N5 e- y" H# F- q
6 c& ]2 D$ A2 I 4 动态交互可视化
& L# l* {% R" n3 [
# f& N) O9 y, W0 Fdataset = hv.Dataset(ds_sst.Theta.isel(k=0).astype('f4'))
* a! w2 ?- s9 [! f0 F. nhv_im = (dataset.to(hv.Image, ['i', 'j'], dynamic=True)
8 e1 U0 C, _1 Q6 t( U .options(cmap='Magma', width=950, height=600, colorbar=True))
$ w2 D& R0 c/ `* {4 o: @0 d5 r6 B; |3 R* z0 I0 ~+ d
%output holomap='scrubber' fps=3
% l O( H4 K$ E( W+ a3 w0 _5 qregrid(hv_im, precompute=True)上图是南非Aghulhas Rings,可以看到强大的洋流和丰富的中小尺度涡旋。下图作为对比是LLC2160的结果,和4320的分辨能力比较有一定差距。 % \0 _$ Z; f2 C6 |
涡度计算示例下面展示LLC4320涡度计算步骤。 model = llcreader.ECCOPortalLLC4320Model()5 V2 m' v4 I8 [4 S3 @6 W, M
print(model)
9 M3 N' n. S1 i: U* O, |8 R7 T! f+ q* H; ?1 A W0 `
# volecity
" `! n9 q, j% eds = model.get_dataset(varnames=['U', 'V'], k_levels=[0], type='latlon',
. x1 |3 w/ O6 s iter_start=model.iter_start,$ N9 O" y0 c" I7 E' v% S
iter_stop=(model.iter_start + model.iter_step),
$ [. k" c9 Q& _ read_grid=True)" F7 }, R' o0 B% B
4 r9 G( A6 H1 {6 n$ K# Normal gridding: Y5 V. Y# f( D" F& G# C
import xgcm/ X# t* J# q x1 r [ u& v
grid = xgcm.Grid(ds, periodic=['X'])+ w2 Q1 N/ V( |) {$ `- b& O
- K( \' j H$ I( v" l: {# Calculate vorticity* v5 x* m7 Q }+ E
zeta = (-grid.diff(ds.U * ds.dxC, 'Y', boundary='fill') + grid.diff(ds.V * ds.dyC, 'X'))/ds.rAz, \0 A1 `/ u F+ G0 j( d% G! U
zeta = zeta.squeeze().rename('vorticity').reset_coords(drop=True), {$ I/ m0 h$ o+ n
; b2 b: ~+ F: L3 R$ c# load data
# K ^/ X* i) H; t* tzeta.load()1 `% z* x' w+ U4 L
- S8 c8 S! B* K5 d- y! s+ T4 E, w# Show
. s( E# N! m+ p% [/ ]dataset = hv.Dataset(zeta)" v% \% _+ m3 T, ^, z
hv_im = (dataset.to(hv.Image, ['i_g', 'j_g'])/ N) N; D4 M- x" Y' ]2 ^6 y
.options(cmap='RdBu_r', width=950, height=600, colorbar=True, symmetric=True))
& X: n& G) {& V, H% K R
: |$ w1 t K% p5 b9 G5 e! Eregrid(hv_im, precompute=True)" {' k. s% @5 Y. g) w( D
扩展:云虽然 ECCO 门户实现了数据自由访问,但它的带宽有限,国内用户往往难以正常访问。虽然它适合交互探索,但如果想实际处理PB级别的数据,它可能无法提供足够的网络支持。 商业云存储(例如 Amazon S3 或 Google Cloud Storage)具备两全其美的优势。它既可公开访问,又具有极大的数据处理能力。 目前大量的地学大数据已经存储于云端,并可以通过Pangeo进行操作,这其中就包含LLC4320模式。 后面我将介绍云计算平台Pangeo。
+ n- ~: h% t: Z1 F- i* [9 \* U8 W
, G8 [* \3 b& X/ b1 G! {, a4 Q8 j( u
- d% e( @$ I9 X: T" r7 l
- }7 n. Q) u; H0 N8 c
: B* F& h3 G% C% V x N |