nucleaco2.F90

路径

LMDZ.MARS\libf\phymars\nucleaco2.F90

所属目录/模块

libf\phymars

文件定位

该文件定义 nucleaco2_mod 模块,含一个 subroutine nucleaco2 和一个 module 级辅助 function fshapeco2。职责是:在给定 CO2 分压、温度、过饱和度和一组 CCN(凝结核)尺度分布的前提下,按经典异质成核理论计算 CO2 冰在固体基底上的异质成核率 nucrate(nbinco2_cld)(每个 CCN 尺度 bin 一个速率)。

文件头注释说明:算法来自 Pruppacher & Klett (1978) 水冰在固体基底成核的公式,由 Keese (JGR, 1989) 细化;水冰版本由 F. Montmessin 编写、J.-B. Madeleine 移植到 LMD/GCM(2011-10)、A. Spiga 优化(2012-02);CO2 版本由 C. Listowski 与 J. Audouard 在水冰版本基础上改写(2016-2017)。

注意(核验自调用方):本例程对“成核基底种类”不可知,由调用方通过形参 teta(接触参数 m=cosθ)和 n_ccn(核分布)区分。improvedco2clouds_mod.F90 用同一例程对三类基底各调用一次:尘埃 CCN、流星尘 CCN(均传 mtetaco2=0.95),以及 H2O 冰 CCN(传水的接触参数 mteta)。见“调用的关键例程 / 输入”。

定义的符号

符号 类型 行号 作用
nucleaco2_mod module 1 容器模块
nucleaco2 subroutine 5 计算各 CCN bin 的 CO2 冰异质成核率
fshapeco2 function (double precision) 91 计算接触因子 f(m,x),曲率有限时降低成核能垒

依赖的模块

use 模块 only 列表 用途 待确认
comcstfi_h pi 圆周率,用于体积/面积几何因子
microphys_h nbinco2_cld CO2 成核 bin 数(=100,microphys_h.F90:67
microphys_h rad_cldco2 各 bin CCN 半径(m),SAVE/THREADPRIVATE(microphys_h.F90:94
microphys_h desorpco2 CO2 分子在基底上的脱附活化能(J/分子,=3.07e-20,Bachnar 2016)(:73
microphys_h m0co2 单个 CO2 分子质量(kg,= mco2/nav)(:83
microphys_h kbz 玻尔兹曼常数(1.381e-23 J/K)(:19
microphys_h nusco2 CO2 分子跳跃频率(s⁻¹,=2.9e+12)(:77
microphys_h sigco2 冰/汽表面张力(J·m⁻²,=0.08)(:69
microphys_h surfdifco2 CO2 分子表面扩散活化能(J/分子,= desorpco2/10)(:81

说明:fshapeco2 函数本身不 use 任何模块,仅做纯算术。

调用的关键例程

被调用例程 所在模块/文件 调用位置 作用
fshapeco2 本文件 module 级 function nucleaco2.F90:70 当 CCN 半径与临界胚半径之比有限(rad_cldco2(i) <= 3000*rstar)时计算接触因子;比值很大时直接用平表面近似 fshapeco2simple
log, sqrt, exp, min, max, dble Fortran 内建 多处 算术

本例程不调用其他源文件中的例程。

调用方(核验):

调用方 位置 传入的 n_ccn / teta
improvedco2clouds_mod.F90 :382 尘埃 CCN n_aer / mtetaco2=0.95
improvedco2clouds_mod.F90 :413 流星尘 CCN n_aer_meteor / mtetaco2=0.95
improvedco2clouds_mod.F90 :460 H2O 冰 CCN n_aer_h2oice / mteta(水接触参数)

输入

输入 来源 类型/维度 单位 含义
pco2 调用方 double, intent(in) Pa CO2 分压(调用方传 dble(pco2)
temp 调用方 real, intent(in) K 温度(调用方传 zt(ig,l)
sat 调用方 double, intent(in) CO2 过饱和比 S(>1 时成核,公式含 log(sat)
n_ccn(nbinco2_cld) 调用方 double, intent(in) 个/?(数浓度分布) 各尺度 bin 的 CCN 数(尘埃/流星尘/水冰),见复现风险
vo2co2 调用方 double, intent(in) 单个 CO2 冰“分子体积”,调用方算为 m0co2/rho_ice_co2T(随温度变的 CO2 冰密度)(improvedco2clouds_mod.F90:346
teta 调用方 real, intent(in) 接触参数 m=cos(θ);尘埃/流星传 mtetaco2=0.95,水冰传 mteta

复现风险:n_ccn 的物理单位取决于调用方在各 bin 中放入的量(核验 improvedco2clouds_mod.F90 中由对数正态分布积分得到的数浓度 n_aer),本例程只把它作为线性权重乘进 nucrate,不做归一化。复现需保证 n_ccn 的定义与调用方一致。

输出

输出 去向 类型/维度 单位 含义
nucrate(nbinco2_cld) 调用方 double, intent(out) s⁻¹(每核成核速率) 各 bin 的成核率;调用方用 Proba = 1 - exp(-microtimestep*rate(i)) 转成该步成核概率

共享状态与副作用

核心逻辑

  1. mtetalocal = dble(teta):接触参数转双精度。
  2. 计算环境量:
    • nco2 = pco2/(kbz*temp):CO2 分子数密度(个/m³,理想气体)。
    • rstar = 2*sigco2*vo2co2/(kbz*temp*log(sat)):临界胚半径(Kelvin/开尔文成核半径,m)。log(sat) 要求 sat>1
    • gstar = 4π*rstar³/(3*vo2co2):临界胚所含分子数。
  3. fshapeco2simple = (2+m)(1-m)²/4:平表面(CCN 半径 ≫ 临界半径)极限下的接触因子。
  4. 遍历 i = 1..nbinco2_cld
    • n_ccn(i) < 1e-10:该 bin 无核,nucrate(i)=0,跳过。
    • 否则:
      • 选接触因子 zefshapeco2:若 rad_cldco2(i) > 3000*rstar(核远大于临界胚,近似平面)用 fshapeco2simple,否则调 fshapeco2(m, rad_cldco2(i)/rstar) 算曲率修正。
      • fistar = (4/3)π*sigco2*rstar²*zefshapeco2:形成临界胚的活化能(J)。
      • deltaf = (2*desorpco2 - surfdifco2 - fistar)/(kbz*temp),并钳制到 [-100, 100]
      • deltaf == -100(被钳到下限,指数极小):nucrate(i)=0
      • 否则按经典成核率公式: nucrate(i) = sqrt(fistar/(3π*kbz*temp*gstar²)) * kbz*temp*rstar²*4π * (nco2*rad_cldco2(i))² / (zefshapeco2*nusco2*m0co2) * exp(deltaf)

fshapeco2(cost, rap)(cost=m, rap=r_CCN/r*):

伪代码

subroutine nucleaco2(pco2, temp, sat, n_ccn, nucrate, vo2co2, teta):
    m   = dble(teta)
    nco2  = pco2 / (kbz*temp)
    rstar = 2*sigco2*vo2co2 / (kbz*temp*log(sat))
    gstar = 4*pi*rstar^3 / (3*vo2co2)
    fsimple = (2+m)*(1-m)^2 / 4

    for i in 1..nbinco2_cld:
        if n_ccn(i) < 1e-10:
            nucrate(i) = 0
        else:
            if rad_cldco2(i) > 3000*rstar:
                fshape = fsimple                      # 平面近似
            else:
                fshape = fshapeco2(m, rad_cldco2(i)/rstar)

            fistar = (4/3)*pi*sigco2*rstar^2*fshape
            deltaf = (2*desorpco2 - surfdifco2 - fistar)/(kbz*temp)
            deltaf = clamp(deltaf, -100, 100)

            if deltaf == -100:
                nucrate(i) = 0
            else:
                nucrate(i) = sqrt(fistar/(3*pi*kbz*temp*gstar^2))
                           * kbz*temp*rstar^2*4*pi
                           * (nco2*rad_cldco2(i))^2
                           / (fshape*nusco2*m0co2)
                           * exp(deltaf)

function fshapeco2(cost, rap):           # f(m,x) 几何因子
    phi  = sqrt(1 - 2*cost*rap + rap^2)
    A    = 1 + ((1-cost*rap)/phi)^3
    y    = (rap-cost)/phi
    B    = rap^3*(2 - 3*y + y^3)
    C    = 3*cost*rap^2*(y-1)
    return 0.5*(A + B + C)

参与的主题流程

主题 参与方式
CO2 循环 / CO2 云微物理 CO2 冰云成核的核心动力学:被 improvedco2clouds 对尘埃、流星尘、水冰三类 CCN 分别调用,决定 CO2 冰晶在何处、以多快速率成核,进而驱动 CCNCO2 tracer 与尘/水 tracer 之间的转移

写法特点

复现要点

待确认

相关页面