|
LLC4320模式简介 LLC4320是MITgcm 1/48°全球海洋模式,其诞生的直接原因是为即将到来的SWOT任务提供高分辨率的全球海洋模拟。 LLC4320模式在多个方面具有开创性,特别是其高空间分辨率(全球分辨率在 1 到 2 公里之间)、潮汐驱动、高频(每小时)输出,其海面高度信号中包含了内潮、内波、地转平衡等信号。除了在SWOT相关工作取得应用之外,该模式也在海洋亚中尺度、内波等研究方向得到了广泛应用。
6 ~; @; k, }& A3 Z; O
该模式主要特征是:
9 W* w7 Q: A# {2 y- c% U
- • 全球覆盖(包含极地)
- • 垂向90层
- • 分辨率1/48°
- • 全球海洋分成13个face,每个face的网格数为4320*4320
- • 时间采样是1小时,总计时间维度9030
- • 共14 个月(2011 年 9 月至 2012 年 11 月)
- • 数据量巨大,PB级别
- • 以MDS自定义二进制数据格式存储,为MITgcm独有
- • 模型网格复杂,为lat-lon-cap (LLC) 曲线网格 ,很难在常规地图投影中可视化。( A% N; e, M5 f3 [
在数据发布之初,该数据集存储在高度安全的NASA超级计算机上,只有获得NASA资助的研究人员才能访问。 后来,NASA Ames研究中心创建数据共享网站(https://data.nas.nasa.gov/ecco/),开放了LLC4320数据。任何人都可以通过互联网访问数据。在此网站上,您可以单击下载单个大小40GB的二进制文件。除非您知道如何解码其中的内容,否则这些文件毫无用处。( k" z, l$ J1 r# x: P
! z1 @; G! W' `# B" l
xmitgcm.llcreaderxmitgcm 是一个 python 包,可以将 MITgcm 二进制 MDS 文件读入 xarray 结构。通过 dask,xmitgcm可以实现并行计算。
为了使二进制数据方便利用,Ryan Abernathey等开发了xmitgcm的python包,其中llcreader用于读取这些二进制文件。该模块使用xarray和dask从ECCO数据门户网站在线访问数据,使模式大数据的操作变得轻而易举。
4 ^, B" o, M% A, B' K 海面温度读取示例: ~5 C) u. e {' m: }3 \3 v Z9 w) s
以海面温度读取为例,展示其基本操作。用到了如下库: - • xmitgcm: 提供llcreader
- • xarray: 基本数据结构和操作
- • dask: 大数据并行和lazy计算
- • sholoviews: 交互式的图像展示
; O1 h) ~6 v# a) b0 H- J 1 导入库7 x8 j3 i* z; \3 C9 y- \
5 W* S2 ^. |: ^0 rimport xmitgcm.llcreader as llcreader; z1 N, D' P" f: ^: w5 ]8 v9 |
%matplotlib inline
$ v5 Z2 ~3 G$ j& _; G- [! G; w5 ]import holoviews as hv
2 |: s, ]" u# vfrom holoviews.operation.datashader import regrid$ f' D; J7 B6 H* Q6 y' i( j! J7 ~
hv.extension('bokeh')" J/ t( u1 n% i
& O' P! G' E0 ?! j* H
2 初始化这里我们使用LLC4320模式数据: model = llcreader.ECCOPortalLLC4320Model()
8 I# S4 n( \& H; {/ {; _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
. ^2 B4 k0 ^* }( W2 V- k* P3 j 3 海表温度参数设置
2 Q" ?" P+ W* S5 |! P g: S
! k9 J- P/ \7 V! w, P0 P. k8 cds_sst = model.get_dataset(varnames=['Theta'], k_levels=[0], type='latlon')
4 L/ c3 j8 K$ K7 M8 `- rds_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 v5 B5 p/ W. C
1 A# K: S* Z! h 4 动态交互可视化2 v' w7 b7 [# s% w! N: B/ j. @1 x
2 A3 h" ^) q Xdataset = hv.Dataset(ds_sst.Theta.isel(k=0).astype('f4'))9 G+ q& t3 a- z- C5 P3 z% ?; [; V
hv_im = (dataset.to(hv.Image, ['i', 'j'], dynamic=True)
2 I5 _( K! X: J/ c .options(cmap='Magma', width=950, height=600, colorbar=True))2 I& Y4 J2 z: l1 o
& V+ K& R) f, K- X
%output holomap='scrubber' fps=39 n; Q" ]5 a" n: ^
regrid(hv_im, precompute=True)上图是南非Aghulhas Rings,可以看到强大的洋流和丰富的中小尺度涡旋。下图作为对比是LLC2160的结果,和4320的分辨能力比较有一定差距。
! _) C( u" b( U# X' Y1 I2 y涡度计算示例下面展示LLC4320涡度计算步骤。 model = llcreader.ECCOPortalLLC4320Model()
6 u0 Y& @2 g9 ^# oprint(model): u. J! q k0 p; }6 }
* o' Y% d3 ?( U: c. x
# volecity
# x6 _: Z) O; N7 G' ids = model.get_dataset(varnames=['U', 'V'], k_levels=[0], type='latlon'," ^4 a! U6 Z& Y$ T
iter_start=model.iter_start,) j& b+ x( X2 S' f1 k& o+ H2 N
iter_stop=(model.iter_start + model.iter_step),3 q1 Z" `2 F* \9 T* G: L' n" M- d4 U
read_grid=True)
, F# a1 U: x( P& n' U0 {+ s$ {: s! H$ Q
# Normal gridding5 D2 `- N4 q9 s, V$ m# X( l; f
import xgcm
% ~7 M* |2 s3 s6 Agrid = xgcm.Grid(ds, periodic=['X'])
' o- }4 m; V' C: R( k. {
/ z4 T6 e$ {$ L# Calculate vorticity$ c9 t$ a+ ]% a" V' d4 G3 A5 h
zeta = (-grid.diff(ds.U * ds.dxC, 'Y', boundary='fill') + grid.diff(ds.V * ds.dyC, 'X'))/ds.rAz8 C! k9 B4 f2 G, G
zeta = zeta.squeeze().rename('vorticity').reset_coords(drop=True)4 ~# G; N* z" z% D2 [# N! y4 c
, b' M0 g$ B/ k1 Z8 J) b7 s5 x0 Y
# load data
5 d' a& R# d, c+ t8 l4 xzeta.load()
Z2 W) D8 F" n8 H; z. n, m3 C/ J) d- \8 a" L: ^
# Show
. R) T N( J$ r' a# Hdataset = hv.Dataset(zeta)
3 n- [$ u* R/ z8 q" ^5 shv_im = (dataset.to(hv.Image, ['i_g', 'j_g'])8 ]% U0 z2 q9 B* H7 n
.options(cmap='RdBu_r', width=950, height=600, colorbar=True, symmetric=True))
, L, k" U* ~' B$ ~/ l
+ P+ | j5 m" t1 W4 s4 _ }regrid(hv_im, precompute=True)
& {% @) U6 E9 ~# t' B扩展:云虽然 ECCO 门户实现了数据自由访问,但它的带宽有限,国内用户往往难以正常访问。虽然它适合交互探索,但如果想实际处理PB级别的数据,它可能无法提供足够的网络支持。 商业云存储(例如 Amazon S3 或 Google Cloud Storage)具备两全其美的优势。它既可公开访问,又具有极大的数据处理能力。 目前大量的地学大数据已经存储于云端,并可以通过Pangeo进行操作,这其中就包含LLC4320模式。 后面我将介绍云计算平台Pangeo。 - S) _* G5 ? Y2 v, g' X6 C; S
6 }8 |' d$ j- S$ R/ L
; e; @+ q) I1 U2 U+ K7 Y! W0 ~6 _" Y5 e; v) N O' y$ z2 x
7 U. R; u8 S. S' i* s" v& } _+ g$ [/ W+ T7 S! ~1 `) m
|