leapfrog 耗散、sponge 和守恒修正
输入范围
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d\leapfrog.F
LMDZ.MARS\libf\dynphy_lonlat\phymars\leapfrog_nogcm.F
Mars 运行参与度:条件经过。COMMON 完整 GCM 路径按 dissip_period 和 apdiss 执行耗散;MARS nogcm 变体去掉 apdiss 和完整耗散段。
apdiss 门控
完整 leapfrog.F 中 apdiss 在每次 label 2 开始时先置 .FALSE.,再按时间步设置:
purmats:MOD(itau,dissip_period)==0且非 forward。- 非
purmats:MOD(itau+1,dissip_period)==0且非 forward。 - 若
llm==1或dissip_period==0,强制.FALSE.。
nogcm 源码注释明确删除 apdiss,没有耗散调用。
耗散调用顺序
当 apdiss 为真:
- 若
callsponge,先调用sponge(ucov,vcov,teta,ps,dtdiss,mode_sponge)。 covcont和enercin计算耗散前动能ecin0。tpot2t得到温度temp。dissip(vcov,ucov,teta,p,dvdis,dudis,dtetadis)计算耗散增量。ucov=ucov+dudis,vcov=vcov+dvdis。dudis/dvdis除以dtdiss,转成(m/s)/stendency。
conservative dissipation
dissip_conservative 是 SAVE 逻辑量,默认 .true.。启用时,耗散后重新计算动能 ecin,把动能损失转成热力修正:
dtec=(ecin0-ecin)/cpdet(temp)。temp=temp+dtec。t2tpot把温度修正转回ztetaec。- 用
ztetaec更新teta的相关 tendency/状态。
这段保证小尺度风场耗散掉的动能以热力形式回到系统,减少能量不守恒。
pressure 和极点处理
完整 GCM 在耗散相关段前已经刷新过 p/masse。耗散段末尾还有一段极点 pressure 处理代码被 if (1 == 0) 包住,不会执行;因此当前活跃路径不做该段极点平均。
nogcm 差异
MARS phymars/leapfrog_nogcm.F:
- 不
USE logic_mod中的apdiss。 - 不按
dissip_period设置耗散门。 - 不调用
sponge、dissip、covcont、enercin。 - 保留
dudis/dvdis/dtetadis数组和comdissnew.hinclude,主要是接口/输出兼容。
复现要点
- 耗散只在非 forward 步可能发生;复现单步时必须知道当前
forward/leapf/purmats状态。 sponge在dissip前执行,因此顶层阻尼会改变进入水平耗散的状态。dudis/dvdis在加到风场后才除以dtdiss,用于后续诊断/输出时是 tendency。
待确认
- conservative dissipation 对
dtetadis的完整写回细节需要在dissip.F文件页或 主页面中逐行确认。