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) | m³ | 单个 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)) 转成该步成核概率 |
共享状态与副作用
- 无 common block,不写文件,无诊断打印。
- 读取
microphys_h的 SAVE/THREADPRIVATE 变量rad_cldco2(只读)及若干 PARAMETER 常数。 - 本例程内部无 SAVE 变量、无 firstcall;纯函数式(给定输入即给定输出,除依赖
rad_cldco2当前值外)。 fshapeco2为纯函数。
核心逻辑
mtetalocal = dble(teta):接触参数转双精度。- 计算环境量:
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):临界胚所含分子数。
fshapeco2simple = (2+m)(1-m)²/4:平表面(CCN 半径 ≫ 临界半径)极限下的接触因子。- 遍历
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*):
yeah = sqrt(1 - 2*cost*rap + rap²)(即 φ)。- 三项相加再乘 1/2,得到经典异质成核几何因子 f(m,x)(Pruppacher & Klett 形式)。
伪代码
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 之间的转移 |
写法特点
- 自由格式 Fortran(
.F90),续行用行尾&。 - 主要算术用
DOUBLE PRECISION;temp、teta为REAL输入,内部用dble()提升。 - 硬编码数值:
1e-10(空核阈值)、3000.*rstar(平面近似阈值)、deltaf钳制区间[-100,100]、fshapeco2simple的/4与fshapeco2末尾0.5。 - 物理常数(
sigco2、desorpco2、nusco2、surfdifco2等)全部来自microphys_h的 PARAMETER,本文件不重复定义。 deltaf钳到-100即视作成核率为 0,是防exp下溢的数值保护;钳到+100防上溢但仍按公式算。- 接触参数
teta由调用方按基底种类传入(CO2 基底 0.95 vs 水冰基底mteta),本例程不区分。
复现要点
- 临界半径公式要求
sat>1,否则log(sat)<=0使rstar非物理;调用方需保证仅在过饱和列调用(核验:improvedco2clouds在satu相关分支内调用)。 - 三类基底(尘埃/流星尘/水冰)共用本例程,差异只在传入的
n_ccn分布和teta;复现时勿把 CO2 接触参数误用于水冰基底。 vo2co2在调用方用随温度变的 CO2 冰密度算出(m0co2/rho_ice_co2T),不是常数。rad_cldco2是 THREADPRIVATE 的 bin 半径数组,由 CO2 云方案初始化(见 co2cloud_mod / microphys_h),本例程只读取。- 成核率单位与“每核每秒”一致;调用方再乘
microtimestep经泊松概率转成本步成核数。 - 注意
deltaf == -100.的相等判断是浮点比较,但由于上一行用min(max(...),100.d0)钳制,下限恰好取到字面值-100.,比较成立;复现需保持同样钳制+比较写法。
待确认
n_ccn各 bin 的精确单位(数浓度 vs 每 bin 绝对数):本文件只作线性权重;需结合improvedco2clouds_mod的n_aer构造确认。2*desorpco2 - surfdifco2这一组合(Keese 1989 形式)中各项符号约定的物理出处,注释只给了数值来源(Bachnar 2016)。
相关页面
- improvedco2clouds_mod:CO2 云微物理核心,本例程唯一调用方。
- co2cloud_mod:CO2 云总调度。
- co2-saturation-helpers:CO2 饱和/凝结温度,提供过饱和度上下文。
- density_co2_ice:CO2 冰密度,
vo2co2计算的输入。 - CO2 循环父级主题页。
- microphys_h:定义本例程全部物理常数与
rad_cldco2。