moldiffcoeff_red.F
路径
LMDZ.MARS\libf\aeronomars\moldiffcoeff_red.F
所属目录/模块
libf\aeronomars
文件定位
moldiffcoeff_red.F 定义 moldiffcoeff_red_mod,提供例程 moldiffcoeff_red,是 moldiffcoeff 的简化变体,按 Nair 1994(pg 131)计算二元分子扩散系数矩阵 dij。与原版区别:gcmind 与物种数 ncompdiff2 由调用方传入(firstcall 的 igcm_* 检查/stop 全注释),h2/h/o 每次按 noms 名字查找,coeffs.dat 写入由 outputcoeffs 参数门控(默认关)。供新的 moldiff_red 与 moldiff_MPF 扩散方案调用。作者 MAC 2002。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
moldiffcoeff_red_mod |
module |
1(END MODULE 302) |
包装简化分子扩散系数计算的模块 |
moldiffcoeff_red |
subroutine |
7(END SUBROUTINE 300) |
按 Nair 1994 算 dij(ncompdiff2,ncompdiff2) |
firstcall |
logical save THREADPRIVATE |
87 |
首次调用标志(当前 firstcall 块体已注释,仅翻转标志) |
outputcoeffs |
logical parameter |
91 |
是否写 coeffs.dat,默认 .false. |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
tracer_mod |
nqmx,noms,mmol |
tracer 总数、名称表、摩尔质量;按名查 h2/h/o 并做质量缩放 |
- |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
open/write/close |
Fortran intrinsic |
291/294/297 |
仅 outputcoeffs=.true. 时写 coeffs.dat(默认关) |
输入
| 输入 |
来源 |
类型/维度 |
含义 |
gcmind(ncompdiff2) |
调用方(moldiff_red/moldiff_MPF) |
integer |
本地索引→GCM tracer 索引映射 |
ncompdiff2 |
调用方 |
integer |
扩散物种数 |
indic(nqmx) |
调用方 |
integer |
声明后未在函数体使用 |
nqmx,noms,mmol |
tracer_mod |
integer/char/real |
tracer 总数、名称、摩尔质量 |
输出
| 输出 |
去向 |
类型/维度 |
含义 |
dij |
调用方 |
real (ncompdiff2,ncompdiff2) |
二元分子扩散系数矩阵,对称,对角 1.0 |
共享状态与副作用
firstcall 为 SAVE + THREADPRIVATE(第 89 行),但 firstcall 块体(igcm_* 检查与 gcmind 填充)全部注释,故首次调用仅翻转 firstcall。
g_h2/g_h/g_o 为局部变量(无 SAVE),每次调用按 noms 重新查找。
coeffs.dat 写入受 outputcoeffs(默认 .false.)门控;默认无文件 I/O。
- 每次调用
print 'moldiffcoeff_red: gh2' 与 'COEFF CALC'。
- 无
stop/abort(原版的 tracer 缺失检查已注释)。
核心逻辑
- firstcall(第 95–227 行):块体注释,仅
firstcall=.false.。
- 基础系数(第 229–233 行):
dijh2co=6.51e-5、dijh2n2=6.74e-5、dijh2o2=6.97e-5、dijh2co2=5.50e-5、dijho=1.14e-4(与 moldiffcoeff 相同)。
- 按名查 h2/h/o(第 254–258 行):
do n=1..nqmx,noms(n)=='h2'→g_h2、'h'→g_h、'o'→g_o。
- 填充
dij(第 263–287 行):do n=1..ncompdiff2,按 noms(gcmind(n)) 名字定 dijref(co/n2/o2/co2 → 对应 H2 系数):
dijref>0:dij(nn,n)=dijref*sqrt(mmol(g_h2)/mmol(gcmind(nn))),对角 1.0,对称。
dijref==0:dijref=dijho;dnh=dijref*sqrt(mmol(g_o)/mmol(gcmind(n)));dij(nn,n)=dnh*sqrt(mmol(g_h)/mmol(gcmind(nn))),对角 1.0,对称。
- 可选转储(第 289–298 行):
if (outputcoeffs) 写 coeffs.dat。
伪代码
moldiffcoeff_red(dij, indic, gcmind, ncompdiff2): # indic unused
if firstcall: firstcall=false # body commented
dijh2co=6.51e-5; dijh2n2=6.74e-5; dijh2o2=6.97e-5; dijh2co2=5.50e-5; dijho=1.14e-4
for n=1..nqmx: # find h2/h/o by name
if noms(n)=='h2': g_h2=n
if noms(n)=='h' : g_h=n
if noms(n)=='o' : g_o=n
for n=1..ncompdiff2:
dijref = 0
if noms(gcmind(n))=='co' : dijref=dijh2co
if noms(gcmind(n))=='n2' : dijref=dijh2n2
if noms(gcmind(n))=='o2' : dijref=dijh2o2
if noms(gcmind(n))=='co2': dijref=dijh2co2
if dijref > 0:
for nn=n..ncompdiff2: dij(nn,n)=dijref*sqrt(mmol(g_h2)/mmol(gcmind(nn)))
if n==nn: dij(nn,n)=1.0
dij(n,nn)=dij(nn,n)
else:
dijref=dijho; dnh=dijref*sqrt(mmol(g_o)/mmol(gcmind(n)))
for nn=n..ncompdiff2: dij(nn,n)=dnh*sqrt(mmol(g_h)/mmol(gcmind(nn)))
if n==nn: dij(nn,n)=1.0
dij(n,nn)=dij(nn,n)
if outputcoeffs: write dij to 'coeffs.dat'
参与的主题流程
| 主题 |
参与方式 |
| 分子扩散(MPF/简化方案) |
moldiff_red、moldiff_MPF 调用,提供 dij 供高层大气分子扩散求解 |
写法特点
- 固定格式
.F(续行第 6 列 &)。
- firstcall 块体(
igcm_* 检查、stop、gcmind 填充)全部注释——物种索引由调用方经 gcmind 传入。
- h2/h/o 每次按
noms 名字查找(非 igcm_*),适配调用方自定义物种集。
- 基础系数与
moldiffcoeff 完全相同(Nair 1994)。
coeffs.dat 写入由 outputcoeffs 参数门控(默认 .false.),改进自原版每次必写。
indic 哑元声明未用;outputcoeffs 为编译期参数。
复现要点
gcmind 与 ncompdiff2 须由调用方正确构造;本例程不做 tracer 存在性校验(原版的 stop 已注释)。
- 依赖
noms 中存在 'h2'/'h'/'o' 名称;缺失则 g_h2/g_h/g_o 保留未定义(疑 0),会导致 mmol 越界——调用方须保证。
dij 与状态无关,每次重算结果恒定。
coeffs.dat 默认不写;调试时设 outputcoeffs=.true.。
待确认
indic 哑元是否为历史接口残留(当前未用)。
- firstcall 块体注释后,
firstcall 标志本身是否仍有意义。
g_h2/g_h/g_o 未找到时(noms 无对应名)的行为未保护,待确认调用方约束。
相关页面