moldiffcoeff.F

路径

LMDZ.MARS\libf\aeronomars\moldiffcoeff.F

所属目录/模块

libf\aeronomars

文件定位

moldiffcoeff.F 定义 moldiffcoeff_mod,提供例程 moldiffcoeff,按 Nair 1994(pg 131)计算 14 种高层大气物种之间的二元分子扩散系数矩阵 dij(14,14)。首次调用时从 tracer_mod::igcm_* 识别 GCM tracer 索引(缺任一则 stop),随后用 H2-X 与 H-O 基础系数按 sqrt(mmol) 质量缩放填充对称矩阵(对角 1.0)。该例程由 moldiff(分子扩散主模块)调用。作者 MAC 2002。

定义的符号

符号 类型 行号 作用
moldiffcoeff_mod module 1(END MODULE 227) 包装分子扩散系数计算的模块
moldiffcoeff subroutine 7(END SUBROUTINE 225) 计算 dij(14,14) 二元分子扩散系数矩阵
i_co..i_o integer parameters 39–52 本地物种索引 1–14(O 必须为末位,高层主导)
g_co2 等 14 个 integer save THREADPRIVATE 55–68 GCM tracer 索引缓存,firstcall 从 igcm_* 设值
gcmind(14) integer save THREADPRIVATE 73 本地索引→GCM 索引映射
firstcall logical save THREADPRIVATE 76 首次调用标志

依赖的模块

use 模块 only 列表 用途 待确认
tracer_mod igcm_co2/co/o/o1d/o2/o3/h/h2/oh/ho2/h2o2/n2/ar/h2o_vap,mmol 取 GCM tracer 索引与摩尔质量,做存在性校验与质量缩放 -

调用的关键例程

被调用例程 所在模块/文件 调用位置 作用
open/write/close Fortran intrinsic 198/220/223 每次调用写诊断文件 coeffs.dat(unit 56)
stop Fortran intrinsic 86 等 firstcall 缺 tracer 时硬中止(非 abort_physic

输入

输入 来源 类型 含义
igcm_*(14 个) tracer_mod integer GCM tracer 索引;firstcall 校验非 0
mmol tracer_mod real array tracer 摩尔质量,用于 sqrt 质量缩放

输出

输出 去向 类型/维度 含义
dij moldiff.F:118 调用方 real (14,14) 二元分子扩散系数矩阵,对称,对角 1.0
coeffs.dat 文件 - 每次调用覆写的 dij 诊断转储

共享状态与副作用

核心逻辑

  1. firstcall(第 81–176 行):从 igcm_* 设 14 个 g_*,每个校验非 0 否则 stop;填 gcmind(i_*)=g_*firstcall=.false.
  2. 基础系数(第 179–195 行):dij(h2,co)=6.51e-5(h2,n2)=6.74e-5(h2,o2)=6.97e-5(h2,co2)=5.50e-5;其余 dij(h2,*)=0dij(h,o)=0.000114(第 195 行;第 194 行注释保留旧值 0.0000144)。
  3. 质量缩放填充(第 197–216 行):open(56,'coeffs.dat')do n=1..14
    • dij(h2,n)>0dij(nn,n)=dij(h2,n)*sqrt(mmol(h2)/mmol(gcmind(nn)))nn=n..14),对角置 1.0,对称。
    • dij(h2,n)==0dnh=dij(h,o)*sqrt(mmol(o)/mmol(gcmind(n)))dij(nn,n)=dnh*sqrt(mmol(h)/mmol(gcmind(nn))),对角 1.0,对称。
  4. 转储(第 218–223 行):写 dij(n,nn) 到 unit 56;close(56)

伪代码

moldiffcoeff(dij):
  if firstcall:
    g_* = igcm_* for 14 species; stop if any == 0
    gcmind(i_*) = g_*
    firstcall = false
  # base coefficients (Nair 94)
  dij(h2,co)=6.51e-5; dij(h2,n2)=6.74e-5; dij(h2,o2)=6.97e-5; dij(h2,co2)=5.50e-5
  dij(h2, others)=0
  dij(h,o)=0.000114
  open(56,'coeffs.dat'); print 'COEFF CALC'
  for n=1..14:
    if dij(h2,n) > 0:
      for nn=n..14: dij(nn,n)=dij(h2,n)*sqrt(mmol(h2)/mmol(gcmind(nn)))
                    if n==nn: dij(nn,n)=1.0
                    dij(n,nn)=dij(nn,n)
    else:
      dnh=dij(h,o)*sqrt(mmol(o)/mmol(gcmind(n)))
      for nn=n..14: dij(nn,n)=dnh*sqrt(mmol(h)/mmol(gcmind(nn)))
                    if n==nn: dij(nn,n)=1.0
                    dij(n,nn)=dij(nn,n)
  write dij to unit 56; close(56)

参与的主题流程

主题 参与方式
分子扩散 moldiff 调用,提供 dij 供高层大气分子扩散求解

写法特点

复现要点

待确认

相关页面