☰
COAWST耦合系统coupling.in参数详解:以Sandy飓风为例
2026/10/10 10:44:30 网站建设 项目流程

干海洋数值模拟这一行,单独跑一个模式不难,难的是把大气、海洋、波浪这几个模型真正“焊”在一起。COAWST(Coupled Ocean-Atmosphere-Wave-Sediment Transport System)就是专门干这个的框架,它把ROMS海洋模式、WRF大气模式和SWAN波浪模式通过MCT耦合器组合成一个整体。而coupling.in这个参数文件,正是整个耦合系统里最容易被忽略、却最关键的一张“数据交换合同”。这篇文章我就结合自己跑COAWST的实际经验,以Sandy飓风为例,把coupling.in逐项拆开讲清楚。

1. COAWST能搞定什么样的场景

1.1 COAWST到底是什么

COAWST是一套完全开源的区域耦合模拟系统,核心组件是三个模型加一个耦合器:

  • ROMS:区域海洋模型,负责海洋动力学,包括海流、温度、盐度、海平面变化。
  • WRF:中尺度大气模型,负责气象场模拟,提供风、气压、温度、湿度、辐射、降水。
  • SWAN:近岸波浪模型,负责波浪生成与传播,给出波高、波周期、波向。
  • MCT:模型耦合工具箱,负责三个模型之间的数据传递和时间同步。

四个组件通过MCT连接成一个并行运行的整体。ROMS和WRF之间交换热量、动量和淡水通量,SWAN和ROMS之间交换波流相互作用量。这样就能把“海气界面上的双向反馈”和“波浪对海洋混合的影响”都刻画出来,这是任何单一模型都做不到的。

1.2 coupling.in在系统中的定位

COAWST运行时,每个子模型都有自己的输入文件:WRF用namelist.wps和namelist.input,ROMS用ocean.in,SWAN用swan.in。这些文件管的是“每个模型内部怎么跑”。而模型之间的数据交换规则,不放在任何一个子模型的输入文件里,而是集中放在coupling.in中。

coupling.in控制的内容包括:

  • 哪些模型需要参与耦合。
  • 模型之间交换哪些物理量。
  • 以什么频率交换一次数据。
  • 不同网格之间怎么把数据从一套网格插值到另一套网格。
  • 耦合诊断输出的方式。

这就像两个部门之间对接:子模型是各自的业务系统,coupling.in是双方约定的接口协议。协议写错了,系统可能完全跑不通;协议写得好不好,直接影响耦合结果的正确性和稳定性。

1.3 为什么用Sandy来当例子

Sandy是2012年10月出现在西北大西洋的一次超强飓风。它从热带气旋一路发展成大尺度温带气旋,路径异常,影响范围极广,在近海造成了显著的风暴增水和极端波浪。这次事件里海气浪相互作用非常突出,特别适合用来演示耦合模式的价值。

在Sandy模拟里,能看到三类典型的海气浪耦合现象:第一,飓风路径下方的海表温度冷却,这个冷尾流会反过来抑制飓风强度,这种反馈只有大气模型和海洋模型同时运行,并且保持双向交换SST和风场的时候才能体现出来;第二,大风驱动下波浪显著增强,波浪场反过来改变海面粗糙度,进而影响风应力的计算;第三,近岸浅水区域波浪破碎、增水和天文潮相互作用,需要波浪模型和海洋模型共享同一个网格,并且实时交换水位和流速。

这些场景单独跑WRF或者单独跑ROMS,都没法完整呈现。而COAWST在Sandy案例里能给出更接近观测的路径和强度变化,追根溯源就在于coupling.in里那几行参数把耦合关系定义对了。

2. coupling.in参数文件的核心设计

2.1 子模型的参与开关

coupling.in里最重要的一组参数是模型参与开关。COAWST允许你灵活组合模型,不一定要三模型全开。

  • 只开WRF和ROMS,做海气双向耦合,这是最常见的配置。
  • 只开ROMS和SWAN,做波流耦合,这时候大气强迫用外部数据代替。
  • 三个全开,完整海气浪耦合,计算量最大,物理过程最完整。

我把三模型全开的Sandy配置叫做“完整耦合方案”,把只开海气两模型的方案叫作“简化耦合方案”。这两种方案在coupling.in里最大的区别是多了一组SWAN和ROMS之间的变量映射。

在真实项目中,这个开关并不是随意设的。比如你关心的是近岸波浪增水对风暴潮的影响,那SWAN必须开;如果你只关心SST冷尾流对飓风路径的影响,先跑海气耦合就够了,后续再叠加波浪。我自己的习惯是:先做一组海气耦合基准实验,确认大气和海洋模型单独跑都没问题之后,再打开SWAN做完整耦合。这样能大幅缩短调试周期。

2.2 耦合变量清单

coupling.in的核心内容是一张变量交换清单,也就是“谁给谁送什么”。我用Sandy案例的典型配置来整理一下,变量流向分两大组。

第一组是WRF和ROMS之间的交换:

方向变量名含义单位
WRF→ROMSUwind10米纬向风分量m/s
WRF→ROMSVwind10米经向风分量m/s
WRF→ROMSPair海面气压Pa
WRF→ROMSTair2米气温K
WRF→ROMSQair2米比湿kg/kg
WRF→ROMSswrad向下短波辐射W/m²
WRF→ROMSlwrad向下长波辐射W/m²
WRF→ROMSrain降水率kg/(m²·s)
ROMS→WRFSST海表温度K

第二组是ROMS和SWAN之间的交换:

方向变量名含义单位
SWAN→ROMSHs有效波高m
SWAN→ROMST01平均波周期s
SWAN→ROMSD01平均波向°
ROMS→SWANzeta自由面高度m
ROMS→SWANu/v垂向平均流速m/s

这里有一个很容易踩的坑:ROMS从SWAN拿到的是波浪参数,但在计算波浪对海洋的效应时,不一定直接用Hs和T01,而是根据这些参数进一步计算波生应力、辐射应力和波浪破碎耗散。也就是说,变量清单只是数据传递的第一层,真正发挥作用的是各模型内部的耦合物理模块。

2.3 耦合频率与时间步长的匹配逻辑

coupling.in里最重要的数值参数是耦合频率,即每间隔多少秒在各模型之间交换一次数据。这个参数直接决定耦合结果的质量。

先说结论:我跑Sandy案例时,耦合频率取600秒,也就是10分钟交换一次。为什么是600秒而不是60秒或者3600秒?这是综合考虑三个模型数值特性后选出来的折中值。

WRF在3km内层网格上的实际时间步长一般是30到90秒,ROMS在5km网格上的时间步长一般是50到100秒,SWAN的积分时间步长可以取到10到20分钟的量级。耦合频率应当大于每个子模型自身的时间步长,同时小于关键物理过程发生显著变化的时间尺度。

海气界面上的关键物理过程有两个时间尺度需要我们关注。第一个是大气边界层的湍流响应时间,一般是几分钟到几十分钟,我们必须保证风场和海表热通量在两次耦合之间变化不能太大。第二个是海洋混合层的热力响应时间,通常是小时到天量级,比耦合频率慢得多,所以耦合频率对海洋来说不太敏感,影响最大的是大气模型。

用600秒做Sandy模拟,实际效果是比较稳的。如果把耦合频率降到120秒,模拟结果变化很小,但计算消耗明显增加,因为每个耦合周期都要做插值计算并重新同步边界数据。如果提到3600秒,则会出现一个可察觉的问题:飓风边界层的风场在1小时内可能发生明显转向,导致ROMS拿到的风应力呈现跳跃式变化,这会激发海洋重力波噪声。

2.4 网格映射与插值方案

COAWST四个模型各自有独立的网格系统,WRF用经纬度网格,ROMS用正交曲线网格,SWAN的网格可以和ROMS一致也可以独立建立。要让这些网格的数据能互相传递,必须做空间插值,而插值方案的选择直接影响耦合过程的守恒性。

MCT通过预先生成的稀疏矩阵完成插值。coupling.in里要指定的关键信息是插值类型。我的经验是,区分“通量变量”和“状态变量”来选插值方法:

  • 风应力、热通量、辐射通量这类通量型变量,必须用保守插值,保证一个网格送出去多少能量,另一个网格收回来多少,不能因为插值凭空多出来或少掉。
  • 温度、气压、风速这类状态型变量,用双线性插值就可以,计算成本低,结果也足够平滑。

一个最常犯的错误是:把风应力当成普通状态量做双线性插值。在Sandy这种强风速梯度场景下,双线性插值会在飓风眼壁附近把风应力峰值抹平,导致海洋侧根本没有接收到正确的动量注入。我见过有人连续调了好几版配置,海洋增水一直偏低,最后发现问题就出在插值类型上。

3. 以Sandy为例:实践配置

3.1 模拟区域与网格设置的准备

以Sandy为例跑COAWST,第一步不是动coupling.in,而是把三个模型的网格设计好。

我当时用WRF三层嵌套,外层27km覆盖西大西洋大部分海域,中间9km覆盖美国和加勒比海之间的过渡区域,内层3km覆盖Sandy登陆前的沿岸海域。ROMS网格采用正交曲线,在近岸加密到约5km,外海约15km。SWAN网格直接嵌套在ROMS网格内,这样波流耦合就不需要额外的网格映射,ROMS提供的流速和自由面高度可以直接在SWAN网格上取用。

网格上容易出问题的不是外层,而是内层边界过度重叠。WRF内层和ROMS区域如果边界走向不一致,插值时容易出现无效网格和极值外推。比较好的做法是让ROMS区域整体落在WRF内层网格的中央区域,四周留出至少5到10个WRF网格点的裕量,这样插值边界处不会因为地形或海陆掩膜差异产生异常值。

做完网格之后,还要做一件很容易被忽略的事:统一海陆掩膜。ROMS和WRF对每一点是陆地还是海洋的判断不一定一致,如果某个点WRF认为是海洋、ROMS认为是陆地,耦合交换时就会得到空值。在Sandy案例里,陆地边缘的点正好是风暴增水最剧烈的区域,这种空格点必须提前修掉,不能等到运行出现NaN再回头查。

3.2 强迫场与初始条件的衔接

COAWST的耦合运行是“内循环长驱直入、外边界靠再分析数据驱动”的模式。也就是说,WRF的外边界和初始场用再分析资料提供,ROMS的侧边界和初始场用海洋再分析或者气候态数据提供,而耦合只是负责内部面上数据交换。

在Sandy模拟里,WRF的侧边界每6小时更新一次,这个由WRF自身的边界文件控制。ROMS的侧边界每6小时更新一次温度盐度流场,由ocean.in的边界输入项控制。这些属于子模型的边界配置,不用写进coupling.in,但决定了耦合过程能不能跑出合理的天气过程。

这里有一个重要的衔接问题:耦合启动时间必须给海洋模型一个热力学和动力学的适应期。如果一开始就用WRF的真实风场猛烈驱动ROMS,初始场的密度和流速结构还没调整好,会产生很强的惯性振荡和虚假重力波。

我的处理办法是,先让几个模型独立跑一段spin-up。WRF从模拟开始时间前12小时启动,ROMS提前3天跑,SWAN提前1天跑,等三个模型的场都进入准平衡状态之后再开启耦合交换,在coupling.in配置里把耦合启动时刻设到spin-up完成的时间点。这样整个Sandy过程模拟的置信度要高很多。

3.3 典型coupling.in配置的参考格式

不同版本的COAWST对coupling.in的写法略有差异,但控制逻辑是一致的。我基于自己常用版本整理了一份Sandy案例的参考配置,各版本之间需要对照官方说明做微调。

配置的核心可以拆成几个逻辑段。第一段定义耦合模式,说明有哪些模型参与以及它们之间的拓扑关系。第二段定义耦合频率,也就是数据交换的时间间隔。第三段定义变量映射,每条映射包含发送模型、接收模型、变量名和插值方式。第四段定义输出控制,决定是否输出耦合诊断量。

以变量映射的写法为例,我实际用的配置大致长这样(注意这是示意格式):

# 大气到海洋:WRF提供强迫场 atm -> ocn : Uwind bilinear atm -> ocn : Vwind bilinear atm -> ocn : Pair bilinear atm -> ocn : Tair bilinear atm -> ocn : Qair bilinear atm -> ocn : swrad conservative atm -> ocn : lwrad conservative atm -> ocn : rain conservative # 海洋到大气:提供海表温度 ocn -> atm : SST bilinear # 波浪到海洋:提供波参数 wav -> ocn : Hs bilinear wav -> ocn : T01 bilinear wav -> ocn : D01 bilinear # 海洋到波浪:提供流场和水位 ocn -> wav : zeta bilinear ocn -> wav : u bilinear ocn -> wav : v bilinear

注意通量变量(辐射、降水)我用conservative,状态变量(风、气压、温度、波高)用bilinear。这个区分是保证耦合运行稳定性的关键。

这里特别提醒一下,如果你的ROMS侧风应力计算是直接在内部根据Uwind和Vwind算的,那就不需要再传一份风应力通量;如果模型配置要求直接传递风应力,那必须用conservative插值。两种方式选一个就行,别混着传,不然热量和动量会出现双算或者漏算。

3.4 运行流程与监控指标

以Sandy为例,完整的COAWST运行流程是:

  1. 用WPS处理再分析资料,生成WRF的初始场和边界场。
  2. 用ROMS自带的工具准备海洋初始场和边界场。
  3. 用SWAN的预处理工具生成网格和水深文件。
  4. 按前述方式准备coupling.in,确认耦合变量和插值类型无冲突。
  5. 启动COAWST,同时运行WRF、ROMS、SWAN三个模型,MCT在每个耦合频率节点同步交换数据。
  6. 运行结束后,分别提取各模型的输出文件进行后处理。

运行过程中我最常盯的监控指标有四个:一是SST的空间分布变化,二是10米风速和有效波高的时间序列,三是ROMS自由面高度的极值,四是三个模型各自的积分时间步有没有频繁增加“挂钟时间”的现象。

Sandy模拟里比较有意思的监控点是飓风路径下方的冷尾流。如果SST冷尾流的量级达到1到3摄氏度,说明耦合的海洋侧响应是正常的;如果几乎看不到冷却,而且ROMS的混合层温度连续几个周期基本不动,大概率是耦合频率设置太长或者风应力插值出了问题。这个现象本身也是验证耦合效果的绝佳指标。

4. 常见问题与排查技巧实录

4.1 模型间数据出现严重噪声或发散

耦合运行最常见的崩溃现象是:ROMS在开始受风场驱动之后,自由面高度快速震荡并最终发散。这个问题的根源多数不是数值格式,而是耦合进来的风应力场含有格点级的尖峰,或者是风应力时间序列在两次耦合之间发生了突变。

排查分三步。第一步,把WRF输出的Uwind和Vwind单独画出来,看接到ROMS之前是否已经出现尖峰;第二步,检查插值权重,确认ROMS网格点是否全部能找到有效的WRF插值源;第三步,检查耦合频率,把600秒降到300秒,如果噪声明显减弱,说明是时间插值太粗。

如果第三步有效,还有一种工程化的处理方式:对ROMS侧风应力计算加一个时间平滑。也就是不要完全用瞬时风场,而是用前后两个耦合时刻的加权平均,让海洋接收到的风应力过渡更平滑。代价是风应力的峰值会略微降低,在Sandy这种强飓风案例里,峰值降低可能会让风暴增水偏低,所以平滑系数要调得很保守。

4.2 海气界面的能量收支不平衡

耦合模式跑完,很多人会检查热量通量,发现大气给海洋的净热通量和海洋侧接收到的净热通量对不上。这通常是插值方案不一致导致的。

海气交换的通量主要有两类:显热通量和潜热通量。在典型配置里,这些通量由ROMS根据WRF提供的Tair、Qair、风速自己算,而不需要WRF直接传热通量。如果配置里让WRF直接把热通量传给ROMS,同时又让ROMS根据Tair和Qair再算一遍,那就会重复计算。

我遇到过一版配置,对swrad和lwrad用了保守插值,但对Tair和Qair用了双线性插值,理论上没有问题。实际操作里问题出在辐射通量上:WRF网格上向下短波辐射在有云区域会有很陡的梯度,保守插值在网格边界处生成了负值,导致ROMS表面热通量计算出现局部异常。处理办法是对插值后的swrad做下限约束,小于0的按0处理。

4.3 波流耦合中出现网格不匹配

ROMS和SWAN网格如果完全一致,插值这一步一般不会出问题。但有些项目为了让波浪计算更稳定,SWAN网格范围比ROMS大,或者网格分辨率不同,这时候波流耦合的插值非常容易出现近岸边界点的空值。

Sandy案例里近岸区水深变化大,SWAN在很浅的网格点上可能没有有效波浪场,插值到ROMS之后,ROMS的波生应力项变成空值,模型直接崩。解决办法是把SWAN网格范围设成和ROMS完全一致,并在SWAN侧把陆地点排除在外,不给ROMS传陆地上的波浪量。

还有一个细节:SWAN的波向单位是“来自方向”,而ROMS里某些参数需要的是“去向方向”,如果定义不匹配,波浪和流的相互作用方向会整个反掉,增水分布看起来会很奇怪,但又不容易看出来是方向反了。我建议在coupling.in的变量映射旁边加注释,把每个变量的方向定义写清楚,排查时会省很多时间。

4.4 并行资源分配失调

COAWST是三个模型并行运行,MCT统一协调,所以并行资源的分配很讲究。WRF的并行开销最大,ROMS其次,SWAN相对小。如果资源分配不合理,三个模型互相等待,总挂钟时间会非常难看。

以Sandy案例为例,我用的一个经验性比例是:WRF占50%核心,ROMS占35%,SWAN占15%。这是一个经验值,需要根据网格规模微调。判断资源分配是否合理的方法是看每个耦合周期内,三个模型各自的计算耗时,谁最慢谁就是瓶颈。

如果SWAN计算很快,但ROMS等SWAN数据等很久,可能是MCT同步等待逻辑导致的。这时候可以通过调整每个模型的子步数比,让它们的计算完成时间错开。具体做法是在耦合频率内,让WRF跑多个大气时间步、ROMS跑多个海洋时间步、SWAN跑一个波浪时间步,尽量让三者的完成时刻对齐。

4.5 输出数据量失控与存储规划

COAWST的耦合诊断输出很方便,能直接输出耦合界面上交换后的二维场,这是排查问题的利器,但也是磁盘杀手。

我在模拟Sandy时开启过全变量输出,每天生成的耦合诊断文件就有十几GB。后来学聪明了,把输出频率从每耦合周期输出一次改成每6小时输出一次,变量也只保留SST、风应力、热通量和波高这四类核心场,磁盘压力瞬间小了一个数量级。

如果你需要诊断某个特定时刻的耦合状态,可以设置一个临时的高频输出窗口,只在Sandy登陆前48小时到登陆后24小时这段时间内输出高频耦合场,其他时间用低频输出配合普通模型输出就足够。

5. 最后再分享一点经验

跑COAWST这种多模型耦合系统,和单模型最大的区别是:你没法把错误简单地归因给某一个模型。任何异常结果都可能是边界场、插值、耦合频率、物理参数共同作用的结果。

我的建议是建立一套“从简到繁”的调试路径。拿到一个新的耦合案例,不要直接上三模型全耦合,而是先跑WRF单向驱动ROMS的非耦合实验,确保单模型场是合理的;再打开海气双向耦合,重点看SST冷尾流和风应力的一致性;最后再打开SWAN做波流耦合,看波浪场的空间分布是否和风场匹配。

这套流程跑下来,如果结果和观测还有偏差,问题往往就不在coupling.in,而是在子模型的物理参数方案或者边界强迫资料上了。coupling.in重要,但它只是耦合系统的一部分。它管的是“数据怎么交换”,至于交换的数据本身准不准,还得靠子模型的质量来保证。把这一层想透了,再复杂的耦合案例也能理出头绪来。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询