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_redmoldiff_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

共享状态与副作用

核心逻辑

  1. firstcall(第 95–227 行):块体注释,仅 firstcall=.false.
  2. 基础系数(第 229–233 行):dijh2co=6.51e-5dijh2n2=6.74e-5dijh2o2=6.97e-5dijh2co2=5.50e-5dijho=1.14e-4(与 moldiffcoeff 相同)。
  3. 按名查 h2/h/o(第 254–258 行):do n=1..nqmxnoms(n)=='h2'→g_h2'h'→g_h'o'→g_o
  4. 填充 dij(第 263–287 行):do n=1..ncompdiff2,按 noms(gcmind(n)) 名字定 dijref(co/n2/o2/co2 → 对应 H2 系数):
    • dijref>0dij(nn,n)=dijref*sqrt(mmol(g_h2)/mmol(gcmind(nn))),对角 1.0,对称。
    • dijref==0dijref=dijhodnh=dijref*sqrt(mmol(g_o)/mmol(gcmind(n)))dij(nn,n)=dnh*sqrt(mmol(g_h)/mmol(gcmind(nn))),对角 1.0,对称。
  5. 可选转储(第 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_redmoldiff_MPF 调用,提供 dij 供高层大气分子扩散求解

写法特点

复现要点

待确认

相关页面