0%

FIO海洋模式的云计算

将全球海洋模式数据存储于云端,并进行云计算是一项几乎不可能的任务。当前全球高分辨率模式数据的空间分辨率可到1/48°,时间分辨率为1小时,考虑深度分层,其数据量可以说是非常巨大,如一年LLC4320数据接近3P。

当前气象海洋云计算的先驱Pangeo已转码了ECCOv4r3低分模式全水深数据和LLC4320高分模式的表层数据,这两种模式均为全球海洋模式。近期,为推动云计算和开放共享,Pangeo物理海洋小组转码了8组海洋模式数据,并存储于云端,和Pangeo云计算无缝衔接。这其中包括FIO-COM海洋模式(First Institute of Oceanography Coupled Ocean Model)。这一批模式数据,主要集中在4个SWOT高度计定标对比区,具有丰富的亚中尺度信号,是研究海洋动力学的优秀数据集合。

关于这批数据的介绍可见:

相关论文:T. Uchida et al., “Cloud-based framework for inter-comparing submesoscale-permitting realistic ocean models,” Geosci. Model Dev., vol. 15, no. 14, pp. 5829–5856, Jul. 2022, doi: 10.5194/gmd-15-5829-2022.

Pangeo Forge

云计算依赖规范化的数据格式,为降低Pangeo社区的数据维护成本,特别提出了众包概念的Pangeo Forge。全世界任何人可以使用Pangeo Forge将开放模式产品转化为Zarr格式,形成统一规范的云数据,存储到云端,这其中的流量和计算费用已由Pangeo所获基金支付。

关于FIO-COM等模式数据的转码和存储,已经由上述论文作者完成。

读取

上述论文给了代码库地址,读者可以在GitHub找到该库,并fork到Pangeo。

8套海洋模式数据的元数据已经被归档,注意文件夹中有一个catalog.yaml文件,里面保存模式信息,如

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
FIO-COM32:
description: FIO-COM32
parameters: # User parameters
region:
description: region
type: str
default: "1"
allowed: ["1", "2", "3", "4"]
datatype:
description: '"surface_hourly", "surface_flux_hourly", or "interior_daily"'
type: str
default: "surface_hourly"
allowed: ["surface_hourly", "surface_flux_hourly", "interior_daily"]
season:
description: Feb, Mar, Apr ("fma") or Aug, Sep, Oct ("aso")
type: str
default: "fma"
allowed: ["fma", "aso"]
driver: zarr
args:
urlpath: 's3://Pangeo/pangeo-forge/swot_adac/FIO-COM32/Region0{{ region }}/{{ datatype }}/{{ season }}.zarr'
consolidated: True
storage_options:
anon: True
client_kwargs:
endpoint_url: 'https://ncsa.osn.xsede.org'

这些信息给出了云端的FIO模式数据描述,比如共有四个区域(参考论文图片1),数据集中在春秋季节,数据时间采样主要为一小时。

因为数据稍微复杂,作者编写了validate_catalog模块,可以实现快速读取:

1
2
3
from validate_catalog import all_params
params_dict, cat = all_params()
params_dict.keys()

有一种模式由于版权问题,未存储云端。

dict_keys([‘GIGATL’, ‘HYCOM25’, ‘HYCOM50’, ‘eNATL60’, ‘FESOM’, ‘ORCA36’, ‘FIO-COM32’])

FIO

读取FIO模式:

1
2
3
item = "FIO-COM32"
params = params_dict[item][0]
print(item, params)

这样我们选择了湾流区域的春季数据:

FIO-COM32 {‘region’: ‘1’, ‘datatype’: ‘surface_hourly’, ‘season’: ‘fma’}

将数据通过lazy模式读入,这批数据时间是2018-2-1至2018-5-1,参数包含海表温盐流和SSH:

1
2
3
%%time
print(item, params)
ds = cat[item](**params).to_dask()

载入一个时间点的温度,中尺度现象清晰可见:

1
ds.surface_temp.sel(time='2018-05-01T10:00:00.000000000').plot(size=10)

流场:

1
ds.usurf.sel(time='2018-05-01T10:00:00.000000000').plot(size=10)

KE动能

下面算一算春季这块海域的平均动能,云计算耗时仅2s:

1
2
3
%%time
EKE = 0.5*(ds.usurf**2 + ds.usurf**2).mean('time')
EKE.load()

计算平均海面高度,耗时1s:

1
2
3
%%time
meanSSH = ds.eta_t.mean('time')
meanSSH.load()

绘图:

1
2
3
4
5
import matplotlib.pyplot as plt
import numpy as np
plt.figure(figsize=(8,5))
np.log10(EKE).plot.contourf(vmin=-4.5, vmax=1.5, levels=30,cmap='RdBu_r')
meanSSH.plot.contour(levels=30, linewidths=0.75)

锋面

通过温度场,分析这里的锋面(fronts)。主要使用滤波技巧,首先滑动平均,然后减去这个空间平均场,得到亚中尺度的温度变化信息:

1
2
3
4
lwindow = 40
sst_ls = (ds.surface_temp.rolling(yt_ocean=lwindow, center=True).mean()
).rolling(xt_ocean=lwindow, center=True).mean();
sst_ss = ds.surface_temp - sst_ls

绘图对比,可见湾流特征清晰,锋面信息丰富,里面蕴含的科学还等待您的挖掘:

1
2
3
4
5
6
7
8
9
10
11
12
13
plt.figure(figsize=(14,4))
plt.subplot(131)
ds.surface_temp.isel(time=0).plot(vmin=-1, vmax=30, cmap='RdBu_r')
plt.title('Temp Field')

plt.subplot(132)
sst_ls.isel(time=0).plot(vmin=-1, vmax=30, cmap='RdBu_r')
plt.title('Large Scale')

plt.subplot(133)
sst_ss.isel(time=0).plot(vmin=-2, vmax=2, cmap='RdBu_r')
plt.title('Small Scale')
plt.tight_layout()

小结

  • 介绍了FIO海洋模式的读取和云计算
  • 云端计算还是一如既往的方便快捷
  • 介绍了一点物理海洋的知识:KE和锋面

下节重磅推出

  • 云端运行ROMS