surfacearea.F
路径
LMDZ.MARS\libf\aeronomars\surfacearea.F
所属目录/模块
libf/aeronomars
文件定位
气溶胶(尘埃与水冰)表面积计算模块;为光化学异相反应提供单位体积可用的尘/冰颗粒总表面积 surfdust/surfice(m2/m3)。由 physiq_mod 在 photochem 路径中、calchim 之前调用。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
surfacearea_mod |
module |
1 |
包装 surfacearea 子例程 |
surfacearea |
subroutine |
7 |
按微物理/简单云两种方案计算尘/冰表面积,并输出诊断 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
tracer_mod |
nuice_sed, igcm_dust_number, igcm_ccn_number, varian, ccn_factor |
冰核 sedimentation 参数、尘/CCN tracer 索引、尘粒径方差和 CCN 缩放因子 |
无 |
conc_mod |
rnew |
各网格层气体常数,用于理想气体密度 |
无 |
comcstfi_h |
pi |
圆周率常量 |
无 |
wstats_mod |
wstats |
统计日诊断累加 |
无 |
write_output_mod |
write_output |
可选 XIOS / diagfi 输出 |
无 |
callkeys_mod |
microphys |
微物理方案开关,决定分支 |
无 |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
wstats |
wstats_mod |
行 124, 126 |
累加 surfdust/surfice 统计日诊断(micron2/cm3) |
write_output |
write_output_mod |
行 129, 131 |
可选 XIOS / diagfi 字段输出 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
ngrid |
调用方 |
integer |
— |
水平网格点数 |
nlay |
调用方 |
integer |
— |
垂直层数 |
naerkind |
调用方 |
integer |
— |
气溶胶种类数 |
ptimestep |
调用方 |
real |
s |
物理时间步 |
pplay |
调用方 |
real (ngrid,nlay) |
Pa |
中层气压 |
pzlay |
调用方 |
real (ngrid,nlay) |
m |
中层高度 |
pt |
调用方 |
real (ngrid,nlay) |
K |
中层温度 |
pq |
调用方 |
real (ngrid,nlay,nq) |
kg/kg |
示踪物混合比 |
pdq |
调用方 |
real (ngrid,nlay,nq) |
kg/kg·s |
物理倾向 |
rdust |
调用方 |
real (ngrid,nlay) |
m |
尘埃几何平均半径 |
rice |
调用方 |
real (ngrid,nlay) |
m |
冰质量平均半径 |
tau |
调用方 |
real (ngrid,naerkind) |
— |
柱尘埃光学厚度 |
tauscaling |
调用方 |
real (ngrid) |
— |
尘量换算因子 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
surfdust |
calchim(经 physiq_mod) |
real (ngrid,nlay) |
m2/m3 |
尘埃颗粒总表面积密度 |
surfice |
calchim(经 physiq_mod) |
real (ngrid,nlay) |
m2/m3 |
水冰颗粒总表面积密度 |
共享状态与副作用
factor_dust, factor_ice(real, save):对数正态分布质量平均半径到总表面积的换算因子,firstcall 时由 varian/nuice_sed 计算后保持不变。
firstcall(logical, save):初始化标志,firstcall 后置 .false.。
- 以上三个变量标记为
$OMP THREADPRIVATE。
- 诊断输出:
wstats 累加 surfdust/surfice(单位 micron2/cm3),write_output 可选写出。
核心逻辑
firstcall 初始化(行 69-77):由 tracer_mod::varian 和 nuice_sed 计算对数正态分布表面积放大因子 factor_dust = exp(0.5*(log(varian))^2) 和 factor_ice = exp(0.5*(log(sqrt(log(nuice_sed+1))))^2),打印后关闭标志。
微物理分支(microphys = .true.,行 79-97):逐格逐层按理想气体求密度 rho = pplay/(rnew*pt),用 pq + pdq*ptimestep 更新尘/冰数密度,乘 factor * rho * tauscaling * 4πr² 得表面积。
简单云分支(microphys = .false.,行 98-120):用经验廓线 rdusttyp = max(0.8μm * exp(-z/18km), 1nm) 和 ccntyp = 1.3e8 * max(tau1, 0.001)/0.1 * exp(-z/10km) / ccn_factor 估算典型半径和数密度;按 rice > rdust 判定冰/尘主导,分别给出 surfdust 和 surfice(冰不存在时置零)。
诊断输出(行 122-132):乘 1e6 换算为 micron2/cm3,调 wstats 和 write_output。
伪代码
if firstcall:
sigma_dust = varian
sigma_ice = sqrt(log(nuice_sed + 1))
factor_dust = exp(0.5 * log(sigma_dust)^2)
factor_ice = exp(0.5 * log(sigma_ice)^2)
firstcall = false
if microphys:
for each (ig, l):
rho = pplay / (rnew * pt)
dustnd = pq(dust_number) + pdq(dust_number) * dt
icend = pq(ccn_number) + pdq(ccn_number) * dt
surfdust = factor_dust * dustnd * rho * tauscaling * 4π * rdust²
surfice = factor_ice * icend * rho * tauscaling * 4π * rice²
else:
for each (ig, l):
rho = pplay / (rnew * pt)
rdusttyp = max(0.8e-6 * exp(-z/18000), 1e-9)
ccntyp = 1.3e8 * max(tau(:,1), 0.001) / 0.1 * exp(-z/10000) / ccn_factor
if rice > rdust:
surfdust = factor_dust * ccntyp * (ccn_factor - 1) * rho * 4π * rdusttyp²
surfice = factor_ice * ccntyp * rho * 4π * rice²
else:
surfdust = factor_dust * ccntyp * ccn_factor * rho * 4π * rdusttyp²
surfice = 0
wstats("surfdust", surfdust * 1e6)
wstats("surfice", surfice * 1e6)
write_output("surfdust", surfdust * 1e6)
write_output("surfice", surfice * 1e6)
参与的主题流程
| 主题 |
参与方式 |
| 光化学 |
为 photochemistry_mod 异相反应提供尘/冰表面积;physiq_mod 在 calchim 之前调用 |
| 尘埃循环 |
消费尘埃粒径、光学厚度和数密度 tracer 计算表面积 |
| 水循环 |
消费冰粒径和 CCN 数密度 tracer 计算冰表面积 |
写法特点
- 固定格式 Fortran(
.F),续行符 $。
factor_dust/factor_ice/firstcall 标记 save + THREADPRIVATE。
- 对数正态分布表面积放大因子来自
exp(0.5 * σ²),其中 σ = log(geometric_std)。
- 简单云分支经验常数:
0.8 μm 地表尘半径、18 km 标高、1.3e8 #/kg 地表 CCN、10 km 标高。
surfdust/surfice 内部单位 m2/m3,诊断乘 1e6 换算为 micron2/cm3。
rice > rdust 判定用于区分冰主导与尘主导层,冰不存在时 surfice 置零。
复现要点
- 需要
tracer_mod 中 igcm_dust_number、igcm_ccn_number、nuice_sed、varian、ccn_factor 已正确初始化。
conc_mod::rnew 需为各层有效气体常数。
callkeys_mod::microphys 决定微物理/简单云分支。
- 输入
rdust/rice/tau/tauscaling 由 physiq_mod 在调用前准备。
calchim 内部把 surfdust/surfice(m2/m3)乘 1e-2 转为 cm2/cm3 后供异相反应使用。
- firstcall 因子只依赖
varian 和 nuice_sed,不依赖格点或层。
待确认
tauscaling 的物理含义和来源(可能由 aeropacity_mod 或 suaer 提供)。
- 简单云分支经验常数
0.8 μm / 18 km / 1.3e8 / 10 km 的文献出处。
ccn_factor 的具体取值范围和对简单云分支的影响。
相关页面