|
LLC4320模式简介 LLC4320是MITgcm 1/48°全球海洋模式,其诞生的直接原因是为即将到来的SWOT任务提供高分辨率的全球海洋模拟。 LLC4320模式在多个方面具有开创性,特别是其高空间分辨率(全球分辨率在 1 到 2 公里之间)、潮汐驱动、高频(每小时)输出,其海面高度信号中包含了内潮、内波、地转平衡等信号。除了在SWOT相关工作取得应用之外,该模式也在海洋亚中尺度、内波等研究方向得到了广泛应用。 & N5 I, h3 ?! P, j" r2 `5 q8 i
该模式主要特征是: ( R, ?. O; a7 @! b- s- W* x
- • 全球覆盖(包含极地)
- • 垂向90层
- • 分辨率1/48°
- • 全球海洋分成13个face,每个face的网格数为4320*4320
- • 时间采样是1小时,总计时间维度9030
- • 共14 个月(2011 年 9 月至 2012 年 11 月)
- • 数据量巨大,PB级别
- • 以MDS自定义二进制数据格式存储,为MITgcm独有
- • 模型网格复杂,为lat-lon-cap (LLC) 曲线网格 ,很难在常规地图投影中可视化。
$ h+ d% s3 a3 _) b# d3 Z
在数据发布之初,该数据集存储在高度安全的NASA超级计算机上,只有获得NASA资助的研究人员才能访问。 后来,NASA Ames研究中心创建数据共享网站(https://data.nas.nasa.gov/ecco/),开放了LLC4320数据。任何人都可以通过互联网访问数据。在此网站上,您可以单击下载单个大小40GB的二进制文件。除非您知道如何解码其中的内容,否则这些文件毫无用处。+ A3 }5 \. w% h% x/ E
' d# K; `2 Y% l. v' R; z+ D xmitgcm.llcreaderxmitgcm 是一个 python 包,可以将 MITgcm 二进制 MDS 文件读入 xarray 结构。通过 dask,xmitgcm可以实现并行计算。
为了使二进制数据方便利用,Ryan Abernathey等开发了xmitgcm的python包,其中llcreader用于读取这些二进制文件。该模块使用xarray和dask从ECCO数据门户网站在线访问数据,使模式大数据的操作变得轻而易举。
/ T' v! Y, ^4 @4 O/ a: E 海面温度读取示例
+ j( g3 q9 i2 h4 t以海面温度读取为例,展示其基本操作。用到了如下库: - • xmitgcm: 提供llcreader
- • xarray: 基本数据结构和操作
- • dask: 大数据并行和lazy计算
- • sholoviews: 交互式的图像展示
9 p q3 r1 [6 y4 } 1 导入库
3 A' I6 T3 V3 L" V' h, O I) G+ q' W* }/ v
import xmitgcm.llcreader as llcreader1 @* W' ]1 {! z. n% e
%matplotlib inline2 h. E p U; x3 `9 @/ M: N! D
import holoviews as hv
1 |( g$ `# t5 z. R: X, Hfrom holoviews.operation.datashader import regrid
- k* o+ ^3 Q1 T. D7 h5 T7 _hv.extension('bokeh')
0 Q8 B! C' G* E, b- L: \7 D% l: G5 Y4 P3 f
2 初始化这里我们使用LLC4320模式数据: model = llcreader.ECCOPortalLLC4320Model()& c% f2 O9 r. ^+ S; e
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 Austin4 c) a2 a+ s; k, n/ B/ n( S/ w
3 海表温度参数设置* Q0 X7 e4 ]; q' j- @8 e
0 o5 i* R: Y0 A x5 Z
ds_sst = model.get_dataset(varnames=['Theta'], k_levels=[0], type='latlon')' M9 M9 M0 O K$ ^& O: a. n; 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')0 c$ k0 u, l' \8 V
# D5 a% [( K% Z. U9 u
4 动态交互可视化6 v) v) ^/ q O, B# J5 |: E: y
7 o! ~ d, O, J; t, I6 K
dataset = hv.Dataset(ds_sst.Theta.isel(k=0).astype('f4'))
; f" v7 c5 u& a1 V1 z) Bhv_im = (dataset.to(hv.Image, ['i', 'j'], dynamic=True)
0 l3 \7 L- \) s, R( I7 ?5 u& k .options(cmap='Magma', width=950, height=600, colorbar=True))+ Y$ W0 e; R. m# y( Z5 f
: E' W7 ?" L1 z( k1 i
%output holomap='scrubber' fps=3
9 m6 N S: K5 C4 ]. \1 ]$ [- @regrid(hv_im, precompute=True)上图是南非Aghulhas Rings,可以看到强大的洋流和丰富的中小尺度涡旋。下图作为对比是LLC2160的结果,和4320的分辨能力比较有一定差距。 % c/ e3 o/ F* b: G5 J+ M: k8 e
涡度计算示例下面展示LLC4320涡度计算步骤。 model = llcreader.ECCOPortalLLC4320Model()2 U' f d8 H+ n0 ~
print(model)
: f2 z [& w! R& `8 Z5 O# \, x7 u: \' G/ h; T: P
# volecity
5 h% L" V7 M4 j2 S/ U8 U0 vds = model.get_dataset(varnames=['U', 'V'], k_levels=[0], type='latlon',
' G5 c' A6 G$ Z6 z iter_start=model.iter_start,
+ }7 y& J0 K* N- p! w iter_stop=(model.iter_start + model.iter_step),5 S" L8 h; m/ `$ t2 c0 r
read_grid=True)
1 L! | I2 I% j+ k* ?) T0 X% B" D$ c1 X* N5 A/ n
# Normal gridding
0 d( K8 e/ N. w N4 kimport xgcm# \4 k3 U: l6 S+ W7 v2 C7 O
grid = xgcm.Grid(ds, periodic=['X'])
3 }- v z! H* O+ \( v
$ w* ^8 n4 I: \: \8 {, J# Calculate vorticity' t' P# X+ N1 w6 f* j ^6 A' ?
zeta = (-grid.diff(ds.U * ds.dxC, 'Y', boundary='fill') + grid.diff(ds.V * ds.dyC, 'X'))/ds.rAz+ c& A) y$ [* R: L
zeta = zeta.squeeze().rename('vorticity').reset_coords(drop=True)" W* |: ~9 b' _
) E- R$ m" `5 _ v X% V# r# load data
- E6 f; g- E3 D% N6 izeta.load()0 g) D' Y( V4 _/ i+ a4 `
4 y1 I# m1 x6 O6 ^: h1 g; u K. F3 |' j
# Show" V/ P1 u- e1 F2 q* @# I
dataset = hv.Dataset(zeta)
8 G1 g; C% F& a1 ehv_im = (dataset.to(hv.Image, ['i_g', 'j_g'])" X6 E4 z5 Q4 ~0 ~$ b- N' @
.options(cmap='RdBu_r', width=950, height=600, colorbar=True, symmetric=True))
; z3 v" n t( _/ v
" Q% |8 A+ H1 g% b0 y* Eregrid(hv_im, precompute=True)
; w1 |# o3 ?6 W" F4 d0 e" }: i% Q扩展:云虽然 ECCO 门户实现了数据自由访问,但它的带宽有限,国内用户往往难以正常访问。虽然它适合交互探索,但如果想实际处理PB级别的数据,它可能无法提供足够的网络支持。 商业云存储(例如 Amazon S3 或 Google Cloud Storage)具备两全其美的优势。它既可公开访问,又具有极大的数据处理能力。 目前大量的地学大数据已经存储于云端,并可以通过Pangeo进行操作,这其中就包含LLC4320模式。 后面我将介绍云计算平台Pangeo。
/ C! k! f8 L5 q: H! q2 h5 }6 }* i' m6 Q$ ^$ s$ h! [- I4 A. N
8 u: l# y& G& Q) R$ @
: Y# c; [9 ~) y9 B' @
: {: Y/ R: H/ H+ A0 W+ \
: T9 K G: k8 G3 Z4 P& C3 U |