|
LLC4320模式简介 LLC4320是MITgcm 1/48°全球海洋模式,其诞生的直接原因是为即将到来的SWOT任务提供高分辨率的全球海洋模拟。 LLC4320模式在多个方面具有开创性,特别是其高空间分辨率(全球分辨率在 1 到 2 公里之间)、潮汐驱动、高频(每小时)输出,其海面高度信号中包含了内潮、内波、地转平衡等信号。除了在SWOT相关工作取得应用之外,该模式也在海洋亚中尺度、内波等研究方向得到了广泛应用。 ' \3 i# N9 f _* o
该模式主要特征是:
/ g8 W4 |6 e+ G' |# P) q
- • 全球覆盖(包含极地)
- • 垂向90层
- • 分辨率1/48°
- • 全球海洋分成13个face,每个face的网格数为4320*4320
- • 时间采样是1小时,总计时间维度9030
- • 共14 个月(2011 年 9 月至 2012 年 11 月)
- • 数据量巨大,PB级别
- • 以MDS自定义二进制数据格式存储,为MITgcm独有
- • 模型网格复杂,为lat-lon-cap (LLC) 曲线网格 ,很难在常规地图投影中可视化。( I# N' V5 }6 K4 X; n
在数据发布之初,该数据集存储在高度安全的NASA超级计算机上,只有获得NASA资助的研究人员才能访问。 后来,NASA Ames研究中心创建数据共享网站(https://data.nas.nasa.gov/ecco/),开放了LLC4320数据。任何人都可以通过互联网访问数据。在此网站上,您可以单击下载单个大小40GB的二进制文件。除非您知道如何解码其中的内容,否则这些文件毫无用处。( q2 y7 v% L% q+ E& Z' N E
g: M8 R6 W) J/ _ S9 u7 G
xmitgcm.llcreaderxmitgcm 是一个 python 包,可以将 MITgcm 二进制 MDS 文件读入 xarray 结构。通过 dask,xmitgcm可以实现并行计算。
为了使二进制数据方便利用,Ryan Abernathey等开发了xmitgcm的python包,其中llcreader用于读取这些二进制文件。该模块使用xarray和dask从ECCO数据门户网站在线访问数据,使模式大数据的操作变得轻而易举。 / r, X. L. d$ P' l7 M
海面温度读取示例
" h5 d1 ?: P$ I( m" g1 \$ x以海面温度读取为例,展示其基本操作。用到了如下库: - • xmitgcm: 提供llcreader
- • xarray: 基本数据结构和操作
- • dask: 大数据并行和lazy计算
- • sholoviews: 交互式的图像展示3 G) B1 b7 d) {! t1 k
1 导入库
( a+ U7 s) M3 y5 x# \& v# @8 {4 v9 e4 M7 |' w& A8 x& m
import xmitgcm.llcreader as llcreader
b# d1 f; C7 O- k) N3 K%matplotlib inline
/ ~: q3 ^5 ?* w9 f' ^& e0 Bimport holoviews as hv7 }! ?0 X6 S& T. Z, `9 W( |
from holoviews.operation.datashader import regrid
7 |0 [: F0 y8 p5 P. b1 ?1 nhv.extension('bokeh')4 r+ t9 T" m1 C5 \9 j% X
$ n9 f5 c. \! [+ M0 C$ ^, e
2 初始化这里我们使用LLC4320模式数据: model = llcreader.ECCOPortalLLC4320Model()" V: ~ R; B1 z1 n, @* y$ k' i& q
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
/ F2 R6 H9 P5 o7 R( P5 q6 s 3 海表温度参数设置( b+ G( r5 \3 G( s8 D2 {
v: U8 ^7 Q4 W8 ?$ K5 ids_sst = model.get_dataset(varnames=['Theta'], k_levels=[0], type='latlon')! D& `1 ^) |1 J T* r+ B
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')
6 u3 j- P: x, E z5 y+ y
5 X5 S- B: `% g/ P- |4 t
4 动态交互可视化0 h7 ?: S, @& n ]& F0 h
9 }, ^9 c* _0 Adataset = hv.Dataset(ds_sst.Theta.isel(k=0).astype('f4'))5 H6 @ H5 i8 t2 K1 y" E
hv_im = (dataset.to(hv.Image, ['i', 'j'], dynamic=True)
. Y; `5 }& o0 O .options(cmap='Magma', width=950, height=600, colorbar=True))
. I! s) O$ G1 e' G3 J1 C' q9 c
# r+ ?. l. b$ N& d# b' V/ t8 @- q%output holomap='scrubber' fps=3
; Y; r0 N# L0 z P, M5 h5 `0 nregrid(hv_im, precompute=True)上图是南非Aghulhas Rings,可以看到强大的洋流和丰富的中小尺度涡旋。下图作为对比是LLC2160的结果,和4320的分辨能力比较有一定差距。
& m8 A4 [3 b# Z5 Q涡度计算示例下面展示LLC4320涡度计算步骤。 model = llcreader.ECCOPortalLLC4320Model()
. \7 Q* X) |( |print(model)4 H& P# p0 ~( f
1 O! m q C2 A0 J
# volecity
6 F1 p2 {8 h2 V% W$ M |% Zds = model.get_dataset(varnames=['U', 'V'], k_levels=[0], type='latlon',* y, {7 z5 _% `$ M9 ]' o ?
iter_start=model.iter_start,
7 a: ?0 r! w& Y iter_stop=(model.iter_start + model.iter_step),
& }6 g. T# N, U; d) b. k* P read_grid=True)
! u& J" M* C/ k' O; S* {: C$ B2 `: c# [% Q/ m
# Normal gridding
8 n* r# c5 f0 { U) m" Iimport xgcm
% {" B2 q' l$ p- ~+ B6 l3 f* Ygrid = xgcm.Grid(ds, periodic=['X'])
$ O) \: S! [* Q( w3 q5 n( r5 [9 T7 a% \9 X0 _7 [. X
# Calculate vorticity
4 e" f- K; Q" H+ |8 c0 u' |+ Zzeta = (-grid.diff(ds.U * ds.dxC, 'Y', boundary='fill') + grid.diff(ds.V * ds.dyC, 'X'))/ds.rAz+ b& Y$ f K9 X, u
zeta = zeta.squeeze().rename('vorticity').reset_coords(drop=True)
5 _* R4 c2 W# x6 U y# q0 B* X1 O; j. w# F6 i" y% v
# load data' o; Y+ g9 ?( c" K
zeta.load()
8 t8 B! k N, h t5 ^: y0 J! g1 w
( U6 z$ v U3 M2 m- T a+ L2 G9 E# Show
* g9 P. n! }% B2 L5 `# t/ Ydataset = hv.Dataset(zeta)9 h# R0 {) I, k% _7 z
hv_im = (dataset.to(hv.Image, ['i_g', 'j_g'])3 z" I* p& s: V' l3 F4 x
.options(cmap='RdBu_r', width=950, height=600, colorbar=True, symmetric=True))1 U+ i5 D7 H* P7 H6 r% a1 M: M. a4 Y r
( ^% ?2 e8 _# ^6 q. P
regrid(hv_im, precompute=True)
$ g* `- W; K% d* O% Y' V h9 Z扩展:云虽然 ECCO 门户实现了数据自由访问,但它的带宽有限,国内用户往往难以正常访问。虽然它适合交互探索,但如果想实际处理PB级别的数据,它可能无法提供足够的网络支持。 商业云存储(例如 Amazon S3 或 Google Cloud Storage)具备两全其美的优势。它既可公开访问,又具有极大的数据处理能力。 目前大量的地学大数据已经存储于云端,并可以通过Pangeo进行操作,这其中就包含LLC4320模式。 后面我将介绍云计算平台Pangeo。
5 G" u, w/ w; |# Y) e
; r5 K8 Y) m" ^2 D# D0 k' N
, b, j* V2 S: m3 e( J# x
' d2 e% s: W' H* f5 A& i. {) [; H0 G9 Q e1 E! O: `6 D
' r( i. R6 @4 _! q) x |