0%

LLCreader开源程序读取LLC4320模式数据

LLC4320模式简介

LLC4320是MITgcm 1/48°模式资料,其直接的诞生原因是帮助海洋学家为即将到来的SWOT任务将以前所未有的分辨率观察海洋表面。

该模拟在几个方面具有开创性,特别是其高空间分辨率(全球覆盖范围在 1 到 2 公里之间)、综合潮汐驱动和高频(每小时)输出,其海面高度信号中包含了内潮、内波、地转平衡等信号。除了在SWOT相关模拟工作取得应用之外,该模式也在海洋亚中尺度方向得到了很多应用,

该模式主要特征是:

  • 全球覆盖(包含极地)
  • 垂向90层
  • 分辨率1/48°
  • 全球海洋分成13个face。每个face的网格数为4320*4320.
  • 时间采样是小时,总计时间维度9030
  • 共14 个月(2011 年 9 月至 2012 年 11 月)
  • 数据量巨大,PB级别
  • 以MDS自定义二进制数据格式存储,为MITgcm独有
  • 模型网格复杂,为lat-lon-cap (LLC) 曲线网格 ,很难在常规地图投影中可视化。

在数据发布之初,该数据集位于高度安全的NASA超级计算机上,只有获得NASA资助的研究人员才能访问。

后来,NASA Ames研究中心创建数据共享网站(https://data.nas.nasa.gov/ecco/),开放了LLC4320数据。
任何人都可以通过该门户通过互联网访问数据。在此网站上,您可以单击以下载单个大小40GB的二进制文件。但是,除非您知道如何解码其中的内容,否则这些文件毫无用处。

xmitgcm.llcreader

xmitgcm 是一个 python 包,用于将 MITgcm 二进制 MDS 文件读入 xarray 数据结构。 通过将数据存储在 dask 数组中,xmitgcm 可以实现并行计算。

代码库: https://github.com/MITgcm/xmitgcm
文档: https://xmitgcm.readthedocs.io/en/latest/
博客: https://medium.com/pangeo/petabytes-of-ocean-data-part-1-nasa-ecco-data-portal-81e3c5e077be

为了使二进制数据方便利用,Ryan Abernathey等开发了xmitgcm的python包,其中llcreader用于读取这些二进制文件。该模块使用xarray和dask从ECCO数据门户网站在线访问数据,使模式大数据的操作变得轻而易举。

海面温度读取示例

以海面高度读取为例,展示其基本操作。用到了如下库:

  • xmitgcm: 提供llcreader
  • xarray: 基本数据结构和操作
  • dask: 大数据并行和lazy计算
  • sholoviews: 交互式的图像展示

1导入库

1
2
3
4
5
import xmitgcm.llcreader as llcreader
%matplotlib inline
import holoviews as hv
from holoviews.operation.datashader import regrid
hv.extension('bokeh')

初始化

这里我们使用LLC4320模式数据:

1
2
model = llcreader.ECCOPortalLLC4320Model()
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

海表温度

1
2
ds_sst = model.get_dataset(varnames=['Theta'], k_levels=[0], type='latlon')
ds_sst

这里的Theta是模式中固有的海表温度名称。这一行程序执行的lazy模式,数据并没有存储在本地内存,也不会进行计算。该变量的大小接近10T。

1
ds_sst.nbytes / 1e12

9.257148163328

如果想查看其他变量的名称:

1
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’)

参考:https://xmitgcm.readthedocs.io/en/latest/llcreader.html#xmitgcm.llcreader.BaseLLCModel.get_dataset

动态交互可视化

1
2
3
4
5
6
dataset = hv.Dataset(ds_sst.Theta.isel(k=0).astype('f4'))
hv_im = (dataset.to(hv.Image, ['i', 'j'], dynamic=True)
.options(cmap='Magma', width=950, height=600, colorbar=True))

%output holomap='scrubber' fps=3
regrid(hv_im, precompute=True)

上图是南非南部海域的LLC4320 SST,可以看到强大的洋流和丰富的中小尺度涡旋。

上图作为对比是LLC2160的结果,和4320比较有一定差距。

涡度计算示例

下面展示LLC4320涡度计算步骤。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
model = llcreader.ECCOPortalLLC4320Model()
print(model)

# volecity
ds = model.get_dataset(varnames=['U', 'V'], k_levels=[0], type='latlon',
iter_start=model.iter_start,
iter_stop=(model.iter_start + model.iter_step),
read_grid=True)


# Normal gridding
import xgcm
grid = xgcm.Grid(ds, periodic=['X'])

# Calculate vorticity
zeta = (-grid.diff(ds.U * ds.dxC, 'Y', boundary='fill') + grid.diff(ds.V * ds.dyC, 'X'))/ds.rAz
zeta = zeta.squeeze().rename('vorticity').reset_coords(drop=True)

# load data
zeta.load()

# Show
dataset = hv.Dataset(zeta)
hv_im = (dataset.to(hv.Image, ['i_g', 'j_g'])
.options(cmap='RdBu_r', width=950, height=600, colorbar=True, symmetric=True))

regrid(hv_im, precompute=True)

扩展:云

虽然 ECCO 数据门户实现了数据自由访问,但它的带宽有限,国内用户往往正常加载。虽然它适合像交互式探索,但是如果想实际处理PB的数据,它可能无法提供必要的网络流量。

商业云存储(例如 Amazon S3 或 Google Cloud Storage)可以提供两全其美的优势。它既可公开访问,又具有极大的数据处理能力。

后面我将介绍云计算平台Pangeo,目前大量的地学大数据已经存储于云端,并可以通过Pangeo进行操作,这其中就包含LLC4320模式。