气象大数据

海上风电的 metocean 数据:风、浪、流的耦合、获取与工程对齐

· 南京运梦科技算法团队 · 评审 算法负责人

海上风电的 metocean 数据:风、浪、流的耦合、获取与工程对齐 封面

做陆上风电,气象数据基本只关心一件事——轮毂高度的风。可一旦项目挪到海上,"风"就不再是孤立变量。基础结构要扛波浪的循环荷载、桩基要算海流的拖曳力、施工船舶要看可作业窗口、运维登靠要判涌浪——风、浪、流三者在同一片海域里彼此驱动、相互调制,任何一个单拎出来看都会算错。海洋工程里把这一整套海洋-气象环境数据统称为 metocean(meteorological + oceanographic)。这篇文章不堆术语,而是从工程视角把"海上风电到底需要哪些 metocean 数据、它们为什么必须耦合、从哪里获取、各自边界在哪"讲透,并在最后说清运梦气象 API 在这条链路里能补上哪一段、补不了哪一段。

关键要点

  • 海上风电的 metocean 数据不是"风 + 浪 + 流"三张独立表,而是一套相互耦合的物理系统:风生浪、浪调制海面拖曳、流改变波浪传播,分开取数会丢掉决定荷载的联合分布。
  • 设计阶段真正要的不是均值,而是极值与重现期——50 年一遇有效波高、极端风速、波高-周期联合分布,通常用 Gumbel / GEV 拟合年极值或用 POT(超阈值)方法估算。
  • 数据源分四类:再分析与海浪后报(长序列、空间连续、有系统偏差)、浮标实测(点上准、稀疏且有缺测)、卫星高度计(覆盖广、轨道间隙大)、数值模型现报(WAM/WaveWatch III 等);实践是后报打底 + 实测订正。
  • 风浪流必须按同一时间轴、同一坐标与方向约定对齐:风向是来向、浪向常是去向、流向各家定义不一,方向口径不统一是 metocean 数据工程最隐蔽的坑。
  • 运梦气象 API 提供这套链路里的大气驱动段——轮毂高度风场(u100/v100)与海面 10m 风(uas/vas),历史用 ERA5(产品侧可取 1950 年至今)、预报用德国气象局;波浪与海流属于专门的海洋数据通道,需另行接入。

为什么"风、浪、流"必须耦合看

新手常把三者当成三个独立图层叠在地图上,这是 metocean 分析最常见的认知误区。它们在物理上是一个闭环。

风生浪,但不是瞬时的。 风把动量输入海面,波浪随风区长度(fetch)和持续时间逐步成长,直到达到充分成长状态。这意味着某一时刻的波高,反映的不是此刻的风,而是过去几小时到几十小时、上风向几十到几百公里风场的累积结果。把"当前风速"直接映射到"当前波高"会系统性出错——这也是为什么海浪不能用风的回归公式糊弄,必须用谱模型(如经典的 JONSWAP 谱描述成长中的风浪、PM 谱描述充分成长海况)去刻画能量在频率与方向上的分布。

浪反过来改海面拖曳。 波浪状态决定海面粗糙度,进而改变风向海洋的动量传输系数。年轻的、陡的成长浪比成熟的涌浪更"粗糙",对低空风的拖曳更强。这正是再分析在强风、近岸段对海面风存在系统性偏差的物理根源之一——海面拖曳(Charnock 关系/粗糙度)参数化随波浪状态非线性变化,粗网格模型难以完全刻画。对海上风电的直接后果是:轮毂高度风速的偏差,部分来自波浪耦合没算准。

流叠加在浪上,改变波的传播与荷载。 海流(潮流、风海流、密度流)与波浪同向时拉长波长、反向时使波变陡甚至破碎;它还直接作用在桩基与海缆上产生拖曳力。设计基础结构时,真正决定疲劳与极限荷载的,是风、浪、流的联合工况——比如"极端风速叠加同向涌浪叠加大潮流"这种最不利组合,而不是三者各自的年极值简单相加。

结论很硬:metocean 数据的价值不在单个变量的精度,而在联合分布的可信度。分开三次取数、各自统计,再"拍脑袋"组合,会丢掉相关结构,把设计工况算偏。

海上风电到底需要哪些 metocean 变量

按工程阶段拆,需求差别很大。

资源评估阶段关心的是发电量:轮毂高度(多在 100–150m)的长期风速分布、风切变廓线、湍流强度、主导风向(风玫瑰),以及空气密度(受气压、温度、湿度影响)。这一段以"风"为主,波浪流的角色较弱。

结构设计阶段关心的是荷载与疲劳,metocean 需求陡然变重:

  • 波浪:有效波高(significant wave height, Hs)、谱峰周期(Tp)、平均周期、波向、波高-周期联合散布(scatter diagram),以及极端海况的设计波高与重现期波。
  • 海流:表层与垂向流速剖面、潮流椭圆、余流;近岸还要考虑底床演变。
  • 水位:天文潮、风暴增水、海平面,决定淹没区间与气隙(air gap)。
  • 风:极端风速(如 10 分钟平均的 50 年一遇)、阵风、湍流谱,用于极限与疲劳荷载。

施工与运维阶段关心的是可作业性:未来数天的波高、涌浪、风速窗口,直接决定吊装、登靠、海缆敷设能不能开工。这一段以短期预报为主,对时效远比对长期精度敏感。

极值与重现期:设计真正要的东西

资源评估看均值,结构设计看极值——这是两种完全不同的统计思维。基础结构的安全性由"几十年一遇"的极端工况决定,所以 metocean 报告的核心产出往往是一张张重现期表:50 年一遇有效波高、50 年一遇 10 分钟平均风速、对应的伴随周期等。

经典做法是把长序列后报数据做极值统计。两条主流路线:一是年极值法,取每年最大值序列,用 Gumbel(即 GEV 的 I 型)或广义极值分布 GEV 拟合,外推到目标重现期;二是 POT(Peaks Over Threshold,超阈值)法,设定高阈值取所有超越事件,用广义帕累托分布(GPD)拟合,样本利用率更高、对短序列更友好。两种方法都对序列长度极度敏感——这正是为什么 metocean 分析离不开几十年的长后报,靠几年浮标实测根本撑不起 50 年外推。

需要务实提醒:极值外推的不确定性很大,且高度依赖输入数据的偏差。如果后报本身在强风/大浪段系统性偏低(这在粗网格再分析里很常见),外推出的设计值会偏不安全。所以严肃的 metocean 工作总是"长后报定形态 + 实测定量级 + 偏差订正",而不是直接信任任何单一来源的尾部。

从哪里获取:四类数据源与各自边界

metocean 数据没有"一个最准的源",只有互补的组合。

再分析与海浪后报(hindcast)。 大气再分析(如 ERA5)提供长序列、空间连续、物理一致的风场;其配套的海浪再分析(基于 WAM 等谱模型驱动)提供 Hs、Tp、波向等。优点是覆盖全球、序列可达数十年(ERA5 数据集本身覆盖 1940 年至今),是极值统计和长期气候态的底座。代价是分辨率有限、近岸与强风段有系统偏差,必须订正。

浮标与测波实测。 锚系浮标、测波雷达、坐底式 ADCP(声学多普勒流速剖面仪)给出点上的真值,是订正后报、验证模型的黄金标准。但它贵、稀疏、易缺测,单点几年的序列不足以做长期统计——它的作用是"校准尺子",不是"画全图"。

卫星遥感。 雷达高度计可反演 Hs 和海面风速,散射计反演海面风场,覆盖广、独立于模型。短板是沿轨观测、重访周期长,时间上是离散采样,难以刻画单点的连续时间序列,更适合做空间偏差校验和模型同化。

数值模型现报/预报。 业务化海浪模型(WAM、WaveWatch III、SWAN 等)和耦合的大气-海浪系统,提供未来几天的波浪、海流预报,服务施工与运维窗口决策。其精度取决于驱动风场的质量——又回到了"风浪耦合"这件事上。

工程上的标准套路是:后报打底做长期统计,浮标/卫星做偏差订正与验证,数值预报做短期作业窗口。没有哪一步可以省。

metocean 数据工程最隐蔽的坑:方向与时间轴对齐

把三类数据凑到一起做联合分析,最容易翻车的不是物理,而是口径。三条务必先核对:

  • 方向约定不统一。 风向通常是"来向"(气象习惯,北风=风从北边来=0°),波向有的用来向有的用去向,洋流流向几乎都用"去向"。三者方向定义混用,画出来的联合玫瑰图是错的,算出来的"风浪同向最不利工况"更是错的。接数据第一件事就是逐源确认方向定义并统一到同一约定。
  • 时间轴与时区。 后报多为 UTC,浮标可能是本地时,预报又是另一套发布时刻;中国电力与海工业务常用北京时(UTC+8)。不显式声明时区,整条联合序列会系统性错位几小时,相关结构全乱。
  • 平均口径与采样窗口。 风速有 10 分钟平均、1 小时平均、瞬时阵风之分,波高是单次记录还是 3 小时代表值,混在一起统计会把不同物理量当成同一个量。

这些坑不会让程序报错,只会让设计工况悄悄偏掉——和陆上功率预测里"单位、命名、时区"那几类工程坑同源,但在 metocean 场景下因为涉及多源、多物理量耦合,破坏力更大。

落地:运梦气象 API 在这条链路里补哪一段

把话说清楚:完整的 metocean 数据集包含波浪谱、海流剖面、潮位等海洋专门量,这些属于海洋数据通道,需要专门的海浪后报与海洋观测来源。运梦气象 API 当前稳定提供的,是这条耦合链路里的大气驱动段——也就是驱动整套风浪耦合的源头风场,以及资源评估直接要的轮毂高度风。

具体而言,历史与资源评估用 era5(ERA5 再分析,运梦产品侧可取 1950 年至今的长序列,适合做风场气候态与极值统计的输入);短期作业窗口的风预报用 ger(德国气象局,覆盖未来约 7 天)。最常用的是 100m 风分量(u100/v100,贴近轮毂高度)与地面约 10m 风分量(uas/vas,正是驱动海浪成长的海面风)。

import os
import numpy as np
import requests

API = "https://console.yun-meng.top/api/energy-weather/search/weather/action/downloadSync"
TOKEN = os.environ["YUNMENG_TOKEN"]

payload = {
    "dataSourceId": "era5",                  # 历史/资源评估用 ERA5;短期预报改用 "ger"(德国气象局)
    "lat": 30.5, "lon": 122.5,               # 某近海候选点(示例)
    "stime": "2014-01-01 00:00",
    "etime": "2023-12-31 23:00",             # 10 年长序列,便于极值与季节统计
    "timezone": "8",                          # 必填,东八区;多源联合时务必统一时区
    "fields": ["u100", "v100", "uas", "vas"], # 100m 风(驱动轮毂出力)+ 地面约 10m 风(驱动海浪成长)
}

resp = requests.post(
    API,
    headers={"Authorization": f"Bearer {TOKEN}"},
    json=payload,
    timeout=600,
)
resp.raise_for_status()
result = resp.json()                          # 统一 JSON envelope
if not result.get("success"):
    raise RuntimeError(result.get("msg", "查询失败"))

data = result["data"]
u100 = np.asarray(data["u100"], dtype=float)
v100 = np.asarray(data["v100"], dtype=float)
ws100 = np.hypot(u100, v100)                  # 100m 风速

# 取年极值,作为极值拟合(如 Gumbel/GEV)的输入样本——重现期外推须配合长后报与实测订正
ws_max_annual = ws100.reshape(-1, 24 * 365).max(axis=1)  # 示意:实际应按日历年精确切分
print(f"小时数={len(data['timeList'])}, 年均100m风速={ws100.mean():.2f} m/s")
print(f"逐年最大风速样本={np.round(ws_max_annual, 1)}")

拿到这套风场后,它在 metocean 工作流里的位置是清晰的:它是驱动海浪后报、做风资源极值统计、构造功率预测特征的大气输入,而波高、波向、海流、潮位等海洋量需要从专门的海洋数据源接入,与这里的风场在同一时间轴、统一方向口径下做联合分析。

最后两句务实提醒。其一,再分析风场在开阔远海稳健,但在近岸与强风段存在已知的系统性偏差,做设计极值时务必结合实测做偏差订正,别直接信任尾部——这一点我们在《海上风资源的再分析评估方法与实战》里有更细的展开。其二,metocean 的核心价值在联合分布而非单变量精度,无论数据从哪来,"同一时间轴、统一方向与平均口径"是不可妥协的工程纪律。把风场口径锚定在统一的 ERA5 历史底座上,是让风、浪、流最终能在同一张表里对齐的第一步。