inidissip.F90
源码路径
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\inidissip.F90
Mars 运行参与度
必经
gcm.F90(串行,line 424)和 gcm.F(并行,line 442)在初始化阶段都调用 inidissip。leapfrog/leapfrog_p 主循环每 dissip_period 个动力步通过 dissip/dissip_p 使用 inidissip 写入 comdissipn 公共块的结果。
文件定位和职责
inidissip 初始化水平(侧向)耗散的全部参数,包括三个微分算子的特征值、垂直耗散增强剖面和耗散时间尺度。主要工作分为三步:
- 用幂迭代法估算
divgrad、gradiv 和 nxgrarot 三个算子的最大特征值,存入 cdivh、cdivu、crot。
- 根据
planet_type 和 vert_prof_dissip 构造垂直剖面 zvert(l),控制高层大气耗散增强倍数。
- 将
zvert 和 tetagdiv/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 硬编码默认 3,ok_strato 时从 dissip_fac_mid 覆盖)。 |
fac_up |
高层大气耗散增强系数(Mars 硬编码默认 30,ok_strato 时从 dissip_fac_up 覆盖)。 |
startalt |
中高层过渡起始高度(km,硬编码 70)。 |
delta |
中高层过渡宽度(km,硬编码 30,ok_strato 时从 dissip_deltaz 覆盖)。 |
middle |
startalt + delta/2。 |
核心算法:特征值估算(幂迭代)
divgrad 算子(cdivh)
- 生成随机场
zh(ip1jmp1),先用 filtreg 平滑。
- 循环 50 次:调用
divgrad 或 divgrad2(由 lstardis 选择),取最大绝对值 zllm,归一化。
- star 模式:
cdivh = 1/zllm;standard:cdivh = zllm^(-1/niterh)。
gradiv 和 nxgrarot 算子(cdivu, crot)
- 生成随机场
zu(ip1jmp1) 和 zv(ip1jm),分别用 filtreg 平滑。
ii=1 时调用 gradiv/gradiv2,ii=2 时调用 nxgrarot/nxgraro2,循环 50 次取最大绝对值归一化。
- 按 star/standard 模式计算
cdivu 和 crot。
核心算法:垂直耗散剖面
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_mid;ok_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
- 对每层计算
tetaudiv(l) = zvert(l)/tetagdiv,tetaurot(l) = zvert(l)/tetagrot,tetah(l) = zvert(l)/tetatemp。
- 取
tetamin = min(1/tetaudiv, 1/tetaurot, 1/tetah) 的全局最小值。
- 若
dissip_period == 0:dissip_period = INT(tetamin/(2*dtvr*iperiod)) * iperiod,再 MAX(iperiod, dissip_period)。
dtdiss = dissip_period * dtvr。
- 对每层检查
dtdiss * tetaudiv(l) > 1.9 等条件,超过则打印 STOP 警告(不 abort,但提示用户增大时间尺度或 dissip_period)。
Mars 路径分析
Mars 正常运行必经此初始化。串行和并行 GCM 入口都在初始化链中调用:
conf_gcm → ... → inidissip → leapfrog/leapfrog_p
planet_type != "earth" 走其他行星分支。
- Mars
conf_gcm 设置 vert_prof_dissip 默认 1。
ok_strato 由 logic_mod 控制,开启时 Mars 模式 0 额外叠加高层增强。
nogcm.F90 中调用已被注释(!ED18),Mars nogcm 路径不经过。
leapfrog 每 dissip_period 步调用 dissip/dissip_p,使用 comdissipn 公共块中的 cdivh/cdivu/crot/tetaudiv/tetaurot/tetah。
配置开关
| 键名 |
来源 |
默认值 |
影响 |
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 压力标高尺度。 |
复现检查表
待确认项
comdissnew.h 声明了 coefdis 变量,但 inidissip 未使用。其用途需由 dissip/dissip_p 页面确认。
filtreg 调用中的参数 jjp1,1,2,1,.TRUE.,1 的精确含义参见 filtreg-system。
ran1 为外部伪随机数函数,非 Fortran 标准库;其种子管理和实现位置需另行确认。
- Mars
vert_prof_dissip=1 分支中 startalt=70 km、delta=30 km 等硬编码值仅在首次调用时有效(SAVE 语义),多次调用不会重新初始化。
- Earth 分支在 Mars 运行中不经过,仅保留接口兼容说明。
相关页面