LLC4320模式简介 LLC4320是MITgcm 1/48°全球海洋模式,其诞生的直接原因是为即将到来的SWOT任务提供高分辨率的全球海洋模拟。 LLC4320模式在多个方面具有开创性,特别是其高空间分辨率(全球分辨率在 1 到 2 公里之间)、潮汐驱动、高频(每小时)输出,其海面高度信号中包含了内潮、内波、地转平衡等信号。除了在SWOT相关工作取得应用之外,该模式也在海洋亚中尺度、内波等研究方向得到了广泛应用。
/ O$ Z6 D8 e2 D1 }5 [2 _
该模式主要特征是: ' Z8 t& G0 X5 D0 m5 N& ?; u
- • 全球覆盖(包含极地)
- • 垂向90层
- • 分辨率1/48°
- • 全球海洋分成13个face,每个face的网格数为4320*4320
- • 时间采样是1小时,总计时间维度9030
- • 共14 个月(2011 年 9 月至 2012 年 11 月)
- • 数据量巨大,PB级别
- • 以MDS自定义二进制数据格式存储,为MITgcm独有
- • 模型网格复杂,为lat-lon-cap (LLC) 曲线网格 ,很难在常规地图投影中可视化。7 K# `* W8 _+ Q9 P" l& p$ H
在数据发布之初,该数据集存储在高度安全的NASA超级计算机上,只有获得NASA资助的研究人员才能访问。 后来,NASA Ames研究中心创建数据共享网站(https://data.nas.nasa.gov/ecco/),开放了LLC4320数据。任何人都可以通过互联网访问数据。在此网站上,您可以单击下载单个大小40GB的二进制文件。除非您知道如何解码其中的内容,否则这些文件毫无用处。3 V) S: \ R$ c
s) M7 p4 j1 j7 a0 [. b( H
xmitgcm.llcreaderxmitgcm 是一个 python 包,可以将 MITgcm 二进制 MDS 文件读入 xarray 结构。通过 dask,xmitgcm可以实现并行计算。
为了使二进制数据方便利用,Ryan Abernathey等开发了xmitgcm的python包,其中llcreader用于读取这些二进制文件。该模块使用xarray和dask从ECCO数据门户网站在线访问数据,使模式大数据的操作变得轻而易举。 ! R! J6 n* A4 o3 y
海面温度读取示例4 x9 ?( N' N, Q3 \3 y
以海面温度读取为例,展示其基本操作。用到了如下库: - • xmitgcm: 提供llcreader
- • xarray: 基本数据结构和操作
- • dask: 大数据并行和lazy计算
- • sholoviews: 交互式的图像展示! l+ N0 `, }, h0 A6 ]& S: o3 a
1 导入库
* U N2 e+ E; M# ?; {8 W' ^# s$ K. U8 y% s
import xmitgcm.llcreader as llcreader
: D0 _- V ]1 P: |& i& {8 \%matplotlib inline( D. S% A% j, a
import holoviews as hv2 u5 b4 ^. m2 s* Q- F
from holoviews.operation.datashader import regrid
9 K$ n: D3 T+ o8 shv.extension('bokeh')
5 A0 b7 y1 _7 g4 M' j. X) e6 J8 v) t2 @4 B! X' d
2 初始化这里我们使用LLC4320模式数据: model = llcreader.ECCOPortalLLC4320Model()5 `8 L- P, Y1 V
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 Austin2 l/ z4 e. I0 W1 Z* T3 q" n& l/ A
3 海表温度参数设置6 o8 L# u4 [- j6 A/ J5 h5 p
8 a. Q1 k( t! h: s; G: ~
ds_sst = model.get_dataset(varnames=['Theta'], k_levels=[0], type='latlon')1 n5 z3 `4 {* G' |8 l) x. \. y
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')$ c1 s; m5 U8 e# y8 Y- f' a4 _7 @
6 v# t4 s- i( [( ]( Q9 z1 a
4 动态交互可视化, E& t0 o$ P9 _. Y
2 U3 j4 ?( c. v/ Q' E$ l+ Sdataset = hv.Dataset(ds_sst.Theta.isel(k=0).astype('f4')): L' F# R$ b/ ~3 P. }" g* s" M* n
hv_im = (dataset.to(hv.Image, ['i', 'j'], dynamic=True)0 M! X& z$ [& Y/ Y/ e4 l
.options(cmap='Magma', width=950, height=600, colorbar=True))) ~ y( W+ ]" w3 X! F r: I
$ t& k+ j# G: K$ }% N: z
%output holomap='scrubber' fps=3
: Y$ _ j6 @7 M: D6 O6 L- cregrid(hv_im, precompute=True)上图是南非Aghulhas Rings,可以看到强大的洋流和丰富的中小尺度涡旋。下图作为对比是LLC2160的结果,和4320的分辨能力比较有一定差距。 & ~1 x: _4 ^; k5 g
涡度计算示例下面展示LLC4320涡度计算步骤。 model = llcreader.ECCOPortalLLC4320Model()
2 S- ]" }- u1 z. [print(model)
/ R, R* A8 C* |6 Z$ J+ f
9 A0 F4 T4 G: X5 O8 ]) m# volecity
0 k$ c: v I8 n9 \: I( Nds = model.get_dataset(varnames=['U', 'V'], k_levels=[0], type='latlon',
1 G- ]& p0 V* K) ~& { m' e iter_start=model.iter_start,
( F7 M9 G( c& \# L- K- t iter_stop=(model.iter_start + model.iter_step),
, M. @. b( ]4 ? read_grid=True)) j% c- L' u( _. ^/ o# J0 Q. s
+ v5 Y3 T* G6 e6 P7 f# |) \5 @! T
# Normal gridding
2 y; n: M& H8 a7 F# g3 Jimport xgcm ^) O4 R% ^& ^. M
grid = xgcm.Grid(ds, periodic=['X'])8 V$ \$ \$ C' W' N H% f/ ~
. e$ t# D; v i; a9 R) u3 P# Calculate vorticity
) Y, V5 ~; I) x. K' B, k, _zeta = (-grid.diff(ds.U * ds.dxC, 'Y', boundary='fill') + grid.diff(ds.V * ds.dyC, 'X'))/ds.rAz# p+ ^& _9 Q2 w4 @
zeta = zeta.squeeze().rename('vorticity').reset_coords(drop=True)
6 g% E& e! \' W5 E/ j+ y7 Z3 s: Y. e# M9 N
# load data. W4 q) v9 H$ v: L& J
zeta.load()& c/ U- V$ M" y1 g: _8 ^
$ T4 r( \; ~9 J3 G0 f8 D# Show
4 V8 p8 j3 D5 U0 n6 Ndataset = hv.Dataset(zeta): w( G8 R. K+ S1 c p8 y
hv_im = (dataset.to(hv.Image, ['i_g', 'j_g'])1 H7 ~, e* v- a o$ B
.options(cmap='RdBu_r', width=950, height=600, colorbar=True, symmetric=True))$ Q* z8 r$ s. W+ ^" U# L7 ^
3 m/ W y% b6 H2 ^0 x
regrid(hv_im, precompute=True)" @) u/ r8 V1 ?; u! v7 _! ?
扩展:云虽然 ECCO 门户实现了数据自由访问,但它的带宽有限,国内用户往往难以正常访问。虽然它适合交互探索,但如果想实际处理PB级别的数据,它可能无法提供足够的网络支持。 商业云存储(例如 Amazon S3 或 Google Cloud Storage)具备两全其美的优势。它既可公开访问,又具有极大的数据处理能力。 目前大量的地学大数据已经存储于云端,并可以通过Pangeo进行操作,这其中就包含LLC4320模式。 后面我将介绍云计算平台Pangeo。 & ? n: I2 o$ j
$ R* B& {8 m' }( W* Z7 ^3 `
. Q2 ~# H. L" L m
( e4 l1 a% L( ]2 i$ e( x( V2 H; g1 ?1 c$ w' @ t
% k+ S! A0 P2 s' Q t, T
|