inidissip.F90

源码路径

LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\inidissip.F90

Mars 运行参与度

必经

gcm.F90(串行,line 424)和 gcm.F(并行,line 442)在初始化阶段都调用 inidissipleapfrog/leapfrog_p 主循环每 dissip_period 个动力步通过 dissip/dissip_p 使用 inidissip 写入 comdissipn 公共块的结果。

文件定位和职责

inidissip 初始化水平(侧向)耗散的全部参数,包括三个微分算子的特征值、垂直耗散增强剖面和耗散时间尺度。主要工作分为三步:

  1. 用幂迭代法估算 divgradgradivnxgrarot 三个算子的最大特征值,存入 cdivhcdivucrot
  2. 根据 planet_typevert_prof_dissip 构造垂直剖面 zvert(l),控制高层大气耗散增强倍数。
  3. zverttetagdiv/tetagrot/tetatemp 组合成每层耗散时间尺度 tetaudiv/tetaurot/tetah,自动计算 dissip_period(若 dissip_period=0),并检查显式 Euler 稳定性。

module/subroutine/function 符号清单

符号 类型 说明
inidissip subroutine 耗散初始化主例程。
ran1 function(外部) 伪随机数生成器,用于幂迭代初始扰动。
minmax subroutine(外部) 数组最小/最大值。

输入参数

参数 类型 来源 说明
lstardis LOGICAL, INTENT(in) comdissnew / conf_gcm 选择 *2 系列算子(.TRUE.)或标准算子。默认 .TRUE.
nitergdiv INTEGER, INTENT(in) comdissnew / conf_gcm gradiv 迭代次数。默认 1
nitergrot INTEGER, INTENT(in) comdissnew / conf_gcm nxgrarot 迭代次数。默认 2
niterh INTEGER, INTENT(in) comdissnew / conf_gcm divgrad 迭代次数。默认 2
tetagdiv REAL, INTENT(in) comdissnew / conf_gcm 散度梯度耗散时间尺度(秒)。默认 7200.
tetagrot REAL, INTENT(in) comdissnew / conf_gcm 旋度旋度耗散时间尺度(秒)。默认 7200.
tetatemp REAL, INTENT(in) comdissnew / conf_gcm 位温拉普拉斯耗散时间尺度(秒)。默认 7200.
vert_prof_dissip INTEGER, INTENT(in) comdissnew / conf_gcm 垂直剖面控制。Mars 默认 1

所有参数通过 COMMON/comdissnew/conf_gcm 填充后传入。

USE 依赖

模块 使用符号 说明
control_mod dissip_period, iperiod, planet_type 耗散周期、动力步周期、行星类型分支。
comvert_mod preff, presnivs, scaleheight, pseudoalt 参考压力、层中压力、标高和伪高度。
comconst_mod dtvr, dtdiss, rad, pi, dissip_zref, dissip_deltaz, dissip_factz, dissip_fac_mid, dissip_fac_up, dissip_pupstart, dissip_hdelta 动力步长、耗散时间、行星半径、垂直剖面参数。
logic_mod ok_strato 是否启用平流层增强耗散。

Include 文件

文件 提供内容
dimensions.h iim, jjm, llm, ndm(构建时由 makdim 生成)。
paramet.h iip1, jjp1, ip1jmp1, ip1jm 等派生网格维度。
comdissipn.h COMMON/comdissipn/tetaudiv(llm), tetaurot(llm), tetah(llm), cdivu, crot, cdivh
iniprint.h COMMON/comprint/lunout(输出单元号),prt_level(打印级别)。实际位于 libf/misc/

被调用方

例程 说明
filtreg 滤波,用于幂迭代前平滑随机场。详见 filtreg-system
divgrad / divgrad2 梯度散度算子(标准/star 版本),由 lstardis 选择。
gradiv / gradiv2 散度梯度算子(标准/star 版本),由 lstardis 选择。
nxgrarot / nxgraro2 旋度梯度算子(标准/star 版本),由 lstardis 选择。
minmax 数组最小/最大值辅助。
ran1 伪随机数生成器。
abort_gcm 异常终止。

上述算子族详见 差分算子总览

调用方

调用位置 说明
dyn3d/gcm.F90 line 424 串行 GCM 初始化链。
dyn3dpar/gcm.F line 442 并行 GCM 初始化链。
MARS phymars/nogcm.F90 line 415 已注释!ED18),Mars nogcm 不再调用。

输出状态(comdissipn.h)

变量 类型 说明
cdivh REAL divgrad 算子特征值的倒数(star)或幂。由 dissip/dissip_p/top_bound/top_bound_p 使用。
cdivu REAL gradiv 算子特征值的倒数(star)或幂。
crot REAL nxgrarot 算子特征值的倒数(star)或幂。
tetaudiv(llm) REAL 散度耗散时间尺度垂直剖面,zvert(l)/tetagdiv
tetaurot(llm) REAL 旋度耗散时间尺度垂直剖面,zvert(l)/tetagrot
tetah(llm) REAL 温度耗散时间尺度垂直剖面,zvert(l)/tetatemp

comdissipn.h 使用方清单:dissip.F, dissip_p.F, top_bound.F, top_bound_p.F, divgrad.F/2.F, gradiv.F/2.F, nxgrarot.F/nxgraro2.F 及其 _p 变体。

输出状态(comconst_mod)

变量 类型 说明
dtdiss REAL 耗散施加的实际时间(秒),dissip_period * dtvr

输出状态(control_mod)

变量 类型 说明
dissip_period INTEGER 耗散调用周期(动力步数)。若输入为 0 则由本例程自动计算。

SAVE 变量

变量 说明
firstcall .TRUE. 仅首次调用时初始化 Mars vert_prof_dissip=1 分支参数。
fac_mid 中低层大气耗散增强系数(Mars 硬编码默认 3ok_strato 时从 dissip_fac_mid 覆盖)。
fac_up 高层大气耗散增强系数(Mars 硬编码默认 30ok_strato 时从 dissip_fac_up 覆盖)。
startalt 中高层过渡起始高度(km,硬编码 70)。
delta 中高层过渡宽度(km,硬编码 30ok_strato 时从 dissip_deltaz 覆盖)。
middle startalt + delta/2

核心算法:特征值估算(幂迭代)

divgrad 算子(cdivh

  1. 生成随机场 zh(ip1jmp1),先用 filtreg 平滑。
  2. 循环 50 次:调用 divgraddivgrad2(由 lstardis 选择),取最大绝对值 zllm,归一化。
  3. star 模式:cdivh = 1/zllm;standard:cdivh = zllm^(-1/niterh)

gradiv 和 nxgrarot 算子(cdivu, crot

  1. 生成随机场 zu(ip1jmp1)zv(ip1jm),分别用 filtreg 平滑。
  2. ii=1 时调用 gradiv/gradiv2ii=2 时调用 nxgrarot/nxgraro2,循环 50 次取最大绝对值归一化。
  3. 按 star/standard 模式计算 cdivucrot

核心算法:垂直耗散剖面

vert_prof_dissip 分支逻辑

行星 模式 公式 说明
Earth 0 zvert(l) = 2 - 1/(1 + zz^2)zz = 1 - preff/presnivs(l) 压力有理函数。
Earth 1 zvert(l) = 1 + (tanh((pseudoz - zref)/deltaz) + 1)/2 * (factz - 1) tanh 伪高度剖面。
其他行星 0 zvert(l) = dissip_fac_mid - (dissip_fac_mid - 1)/(1 + zz^2) 使用 comconst_mod 中的 dissip_fac_midok_strato 时叠加高层增强。
其他行星 1 低层使用 fac_mid,中高层用 tanh 过渡到 fac_up Mars 默认。使用 SAVE 变量,首次调用初始化。

Mars 其他行星模式 0 的 ok_strato 高层增强公式:

Pup = dissip_pupstart * exp(-0.5 * dissip_deltaz / dissip_hdelta)
zvert(l) *= 1 + (dissip_fac_up/dissip_fac_mid - 1) * (1 - 0.5*(1 + tanh(-6/dissip_deltaz * (-dissip_hdelta*ln(presnivs(l)/Pup)))))

Mars 其他行星模式 1 公式:

zvert(l) = fac_mid - (fac_mid - 1)/(1 + zz^2)
zvert(l) *= 1 + (fac_up/fac_mid - 1) * (1 - 0.5*(1 + tanh(-6/delta * (scaleheight*(-ln(presnivs(l)/preff)) - middle))))

核心算法:耗散时间尺度和 dissip_period

  1. 对每层计算 tetaudiv(l) = zvert(l)/tetagdivtetaurot(l) = zvert(l)/tetagrottetah(l) = zvert(l)/tetatemp
  2. tetamin = min(1/tetaudiv, 1/tetaurot, 1/tetah) 的全局最小值。
  3. dissip_period == 0dissip_period = INT(tetamin/(2*dtvr*iperiod)) * iperiod,再 MAX(iperiod, dissip_period)
  4. dtdiss = dissip_period * dtvr
  5. 对每层检查 dtdiss * tetaudiv(l) > 1.9 等条件,超过则打印 STOP 警告(不 abort,但提示用户增大时间尺度或 dissip_period)。

Mars 路径分析

Mars 正常运行必经此初始化。串行和并行 GCM 入口都在初始化链中调用:

conf_gcm → ... → inidissipleapfrog/leapfrog_p

配置开关

键名 来源 默认值 影响
lstardis run.def via getin .TRUE. 选择 star 或 standard 算子系列。
nitergdiv run.def via getin 1 gradiv 迭代次数。
nitergrot run.def via getin 2 nxgrarot 迭代次数。
niterh run.def via getin 2 divgrad 迭代次数。
tetagdiv run.def via getin 7200. 散度梯度耗散时间尺度(秒)。
tetagrot run.def via getin 7200. 旋度旋度耗散时间尺度(秒)。
tetatemp run.def via getin 7200. 温度拉普拉斯耗散时间尺度(秒)。
vert_prof_dissip run.def via getin Mars: 1 垂直剖面选择。
dissip_period run.def via getin 0(自动) 耗散施加周期(动力步数),0 触发自动计算。
ok_strato run.def via getin 依赖配置 开启平流层增强耗散。
dissip_fac_mid comconst_mod conf_gcm 读取 模式 0 中低层增强系数。
dissip_fac_up comconst_mod conf_gcm 读取 高层增强系数。
dissip_deltaz comconst_mod conf_gcm 读取 过渡区宽度。
dissip_pupstart comconst_mod conf_gcm 读取 模式 0 高层增强起始压力。
dissip_hdelta comconst_mod conf_gcm 读取 模式 0 压力标高尺度。

复现检查表

待确认项

相关页面