|
LLC4320模式简介 LLC4320是MITgcm 1/48°全球海洋模式,其诞生的直接原因是为即将到来的SWOT任务提供高分辨率的全球海洋模拟。 LLC4320模式在多个方面具有开创性,特别是其高空间分辨率(全球分辨率在 1 到 2 公里之间)、潮汐驱动、高频(每小时)输出,其海面高度信号中包含了内潮、内波、地转平衡等信号。除了在SWOT相关工作取得应用之外,该模式也在海洋亚中尺度、内波等研究方向得到了广泛应用。 3 a3 ?- @8 P* J6 l: w1 _/ V' q
该模式主要特征是:
# t+ l! D. v" i* Y- j* V0 |( G0 P9 F
- • 全球覆盖(包含极地)
- • 垂向90层
- • 分辨率1/48°
- • 全球海洋分成13个face,每个face的网格数为4320*4320
- • 时间采样是1小时,总计时间维度9030
- • 共14 个月(2011 年 9 月至 2012 年 11 月)
- • 数据量巨大,PB级别
- • 以MDS自定义二进制数据格式存储,为MITgcm独有
- • 模型网格复杂,为lat-lon-cap (LLC) 曲线网格 ,很难在常规地图投影中可视化。
6 [% S# E; U! g* ~
在数据发布之初,该数据集存储在高度安全的NASA超级计算机上,只有获得NASA资助的研究人员才能访问。 后来,NASA Ames研究中心创建数据共享网站(https://data.nas.nasa.gov/ecco/),开放了LLC4320数据。任何人都可以通过互联网访问数据。在此网站上,您可以单击下载单个大小40GB的二进制文件。除非您知道如何解码其中的内容,否则这些文件毫无用处。
4 n% H0 d2 ~; A M3 R- l' O 8 u$ u, E3 J/ o& t
xmitgcm.llcreaderxmitgcm 是一个 python 包,可以将 MITgcm 二进制 MDS 文件读入 xarray 结构。通过 dask,xmitgcm可以实现并行计算。
为了使二进制数据方便利用,Ryan Abernathey等开发了xmitgcm的python包,其中llcreader用于读取这些二进制文件。该模块使用xarray和dask从ECCO数据门户网站在线访问数据,使模式大数据的操作变得轻而易举。 * l$ T/ k9 _" @: w
海面温度读取示例. z! F. a0 B+ N+ n6 g& P' P
以海面温度读取为例,展示其基本操作。用到了如下库: - • xmitgcm: 提供llcreader
- • xarray: 基本数据结构和操作
- • dask: 大数据并行和lazy计算
- • sholoviews: 交互式的图像展示. t2 O* i# u- r$ B
1 导入库
& ^. x2 N7 u7 ?
1 b! { Z( X* Q% O$ Pimport xmitgcm.llcreader as llcreader
, p1 T! P- ]( l) C |' T%matplotlib inline, T& X0 S. A5 d% M* ~6 i) G8 I
import holoviews as hv+ m9 h$ ]' R* I" s3 U8 u
from holoviews.operation.datashader import regrid# n% M: h+ S1 h7 @5 k
hv.extension('bokeh')) V! }* }. f5 V* i
0 ]$ T" e( ?/ R$ ~; D2 L/ f, [+ @1 P0 |
2 初始化这里我们使用LLC4320模式数据: model = llcreader.ECCOPortalLLC4320Model()
' n" a- o0 r. I Tmodel根据数据分辨率和来源,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 @# a0 P( r# q9 e6 m! F6 [
3 海表温度参数设置$ S' p2 ?/ E$ ^3 Z
1 n3 T! N7 r6 k: p- o [- l
ds_sst = model.get_dataset(varnames=['Theta'], k_levels=[0], type='latlon')
F/ X) Q1 ^; ^' E) V6 L1 g* l3 jds_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')
1 W# n, r9 m; Z3 m6 x( c F
0 S3 }/ g0 X8 N8 O1 m( L
4 动态交互可视化
+ R; s4 y% q% v j% D3 n7 X9 a9 W+ e' w! m$ L+ P6 L
dataset = hv.Dataset(ds_sst.Theta.isel(k=0).astype('f4'))
) T0 a9 t" d5 ~2 W3 R5 Jhv_im = (dataset.to(hv.Image, ['i', 'j'], dynamic=True)3 a/ \" A+ r& u3 P, d
.options(cmap='Magma', width=950, height=600, colorbar=True))! Q( b- j. K) V E' E! N
; u6 }* r" Z2 X1 a7 u%output holomap='scrubber' fps=3
) R3 N# o2 Z8 ^' a3 `5 L7 N. S! wregrid(hv_im, precompute=True)上图是南非Aghulhas Rings,可以看到强大的洋流和丰富的中小尺度涡旋。下图作为对比是LLC2160的结果,和4320的分辨能力比较有一定差距。 . c3 ]' h0 }6 |' k, u
涡度计算示例下面展示LLC4320涡度计算步骤。 model = llcreader.ECCOPortalLLC4320Model()
: o6 I4 M# z7 u4 Gprint(model)! |8 K- @( _7 W7 x G# t1 T
% |# _3 I; k8 z3 _! ?. r. O
# volecity' ?$ L7 y3 P& i* T2 U T
ds = model.get_dataset(varnames=['U', 'V'], k_levels=[0], type='latlon',
! {( w& c8 _9 A3 T& Z iter_start=model.iter_start,2 J% W p" c q7 `' W* Q
iter_stop=(model.iter_start + model.iter_step),/ `9 h8 m" Z. M ?7 T6 ?
read_grid=True)
6 M5 V, C: y* g: i: \- h
* z0 R: E3 q- d$ p# Normal gridding {' O9 u' f1 I( C# A! v6 O3 l0 l
import xgcm
* x; w N% G1 z% S& agrid = xgcm.Grid(ds, periodic=['X'])
1 ?, J. U6 k+ Y( t0 [( p0 K$ W) R5 i
# Calculate vorticity) f, v3 b' O# H4 g/ G" O' e/ ?
zeta = (-grid.diff(ds.U * ds.dxC, 'Y', boundary='fill') + grid.diff(ds.V * ds.dyC, 'X'))/ds.rAz
, {1 p- Q/ R/ ^3 O, u, i+ nzeta = zeta.squeeze().rename('vorticity').reset_coords(drop=True)
! z! v! U5 G, ?( ^( D9 L1 Z/ e
7 T8 @, s! I$ _8 `5 N+ g# load data
, x2 {2 X. \8 c6 q3 J' Y4 w; Qzeta.load()
" n n' w; x; c$ q7 l. l" Q, D' e& b
# Show4 g7 ]1 O8 v; {0 D( i
dataset = hv.Dataset(zeta)+ _8 Q9 o6 m+ t1 j9 b
hv_im = (dataset.to(hv.Image, ['i_g', 'j_g'])
' n2 t. e0 D! N0 L. G- ]6 { .options(cmap='RdBu_r', width=950, height=600, colorbar=True, symmetric=True))
2 t5 q7 U7 v' M7 i3 T' x$ ]( V3 h
regrid(hv_im, precompute=True)
1 u# b, n% e& g& j扩展:云虽然 ECCO 门户实现了数据自由访问,但它的带宽有限,国内用户往往难以正常访问。虽然它适合交互探索,但如果想实际处理PB级别的数据,它可能无法提供足够的网络支持。 商业云存储(例如 Amazon S3 或 Google Cloud Storage)具备两全其美的优势。它既可公开访问,又具有极大的数据处理能力。 目前大量的地学大数据已经存储于云端,并可以通过Pangeo进行操作,这其中就包含LLC4320模式。 后面我将介绍云计算平台Pangeo。
: A+ l' d' C* G$ p7 @0 U- a9 f
- f' E8 [/ ]9 \0 R4 ~4 H0 h" k0 r+ |: d( L
1 ]& C: n% m0 X" z% M" V
' Z. p" o7 f6 r. |0 j" d" {7 }3 i' w$ @" J" M( }+ k
|