deposition.F
快速理解
它做什么: 名义上计算化学物种干沉降;按阻力相似法算空气动力学/准层流阻力和沉降速度。
基本过程: 算 ra/rb/vd/loss → 打印 Viking-1 诊断。当前对 zycol 的更新被注释掉。
关键结果: 诊断量 ra/rb/vd/loss;当前不修改 zycol。
路径
LMDZ.MARS\libf\aeronomars\deposition.F
所属目录/模块
libf\aeronomars
文件定位
deposition.F 定义 deposition_mod,提供例程 deposition,名义上计算化学物种(甲烷)的干沉降。它按阻力相似法计算空气动力学阻力 ra、准层流阻力 rb、沉降速度 vd 与损失率 loss,并打印 Viking-1 网格点的诊断。
重要:当前源码中干沉降对成分的实际更新被注释掉(第 147 行),第 128-129 行的 6 小时测试 loss/vd 赋值也是注释行,不会覆盖第 124 行的 loss=vd/deltaz;冰覆盖守卫同样被注释(第 73 行)。 因此例程在当前状态下会计算 ra/rb/vd/loss 与诊断量,但不修改 zycol,仅在被 depos 开关启用、且 ig==ig_vl1 时打印诊断。该例程由 calchim_mod 在 if (depos) 下逐列调用。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
deposition_mod |
module | 1(END MODULE 183) |
包装干沉降例程的模块 |
deposition |
subroutine | 7(END SUBROUTINE 181) |
计算(并当前仅诊断)化学物种干沉降 |
依赖的模块
| use 模块 | only 列表 | 用途 | 待确认 |
|---|---|---|---|
surfdat_h |
z0 |
地表粗糙度,用于摩擦速度与阻力 | - |
conc_mod |
rnew |
比气体常数,用于密度 rho=p/(rnew*T) |
- |
调用的关键例程
| 被调用例程 | 所在模块/文件 | 调用位置 | 作用 |
|---|---|---|---|
| 无外部例程 | - | - | 仅用 Fortran intrinsics(sqrt/log/exp) |
输入
参数均未声明 intent(第 23–37 行),按变量名注释为输入:
| 输入 | 来源 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
ngrid,nlayer,nq |
calchim_mod |
integer | - | 列数、层数、tracer 数 |
ig |
calchim_mod 循环 |
integer | - | 当前网格点索引 |
ig_vl1 |
calchim_mod |
integer | - | Viking-1 网格点,用于诊断打印 |
pplay,pplev |
calchim_mod |
real (ngrid,nlayer[,+1]) |
Pa | 层中/界面气压 |
zzlay,zzlev |
calchim_mod |
real (ngrid,nlayer[,+1]) |
m | 层中/界面高度 |
zu,zv,zt |
calchim_mod |
real (ngrid,nlayer) |
m/s, m/s, K | 风分量与温度 |
zycol |
calchim_mod |
real (nlayer,nq) |
vmr | 成分体积混合比(更新语句被注释,实际不改) |
ptimestep |
calchim_mod |
real | s | 物理时间步 |
co2ice |
calchim_mod |
real (ngrid) |
kg/m² | CO2 冰地表量(仅在注释守卫中引用,活跃代码未用) |
z0 |
surfdat_h |
real (ngrid) |
m | 地表粗糙度 |
rnew |
conc_mod |
real (ngrid,nlayer) |
J/kg/K | 比气体常数 |
输出
| 输出 | 去向 | 类型/维度 | 含义 |
|---|---|---|---|
(名义)zycol(1,iq) |
calchim_mod |
real | 第 1 层甲烷体积混合比衰减更新——当前被注释,不输出 |
| 诊断打印 | 标准输出 | - | ig==ig_vl1 时打印 z0/deltaz/vd/ra/rb/rho/... 等 |
共享状态与副作用
- 不读写模块级共享数组;不修改
surfdat_h/conc_mod变量。 zycol哑元无intent,理论上可写,但唯一写语句(第 147 行)被注释,故实际不修改传入成分。- 标准输出副作用:当
ig==ig_vl1时打印约 25 行诊断(第 149–177 行)。 - 无文件 I/O、无
abort、无getin。 - 无
SAVE/THREADPRIVATE变量(常量用DATA:karman=0.4、prandtl=0.72、mu0=14.8e-6、p0=1e5)。
核心逻辑
- 风与摩擦速度(第 77–81 行):
ubar=sqrt(zu²+zv²);ustar=ubar*karman/log(zzlay(ig,1)/z0(ig))。 - 空气动力学阻力(第 85 行):
ra=1/(karman*ustar)*log(zzlay(ig,1)/z0(ig))。 - CH4 分子扩散率(第 90 行,Massman 1998):
d=0.1952*(p0/pplay(ig,1))*(zt(ig,1)/273.15)**1.81。 - Sutherland 动力粘度(第 95–96 行):
mu=mu0*(293.15+240)/(zt+240)*(zt/293.15)**(3/2)。 - 密度与运动粘度(第 100、104 行):
rho=pplay/(rnew*zt);nu=mu/rho*1e4(cm²/s)。 - Schmidt 数与准层流阻力(第 108、112 行):
schmidt=nu/d;源码字面为rb=(2/(karman*ustar))*(schmidt/prandtl)**2./3.,即先平方再除以 3。 - 沉降速度与损失率(第 116、120、124 行):
vd=1/(ra+rb);deltaz=zzlev(ig,2)-zzlev(ig,1);loss=vd/deltaz。 - 【关键】测试行被注释(第 128–129 行):
c loss=1./(3600.*6.)与c vd=loss*deltaz均为注释,不执行;活跃损失率仍是第 124 行loss=vd/deltaz。 - 诊断量(第 131–139 行):
nuch4=sqrt(8*8.31*zt/(pi*16e-3))(CH4 热速度);tau=6*3600;gravity=3.7;dp=pplev(ig,1)-pplev(ig,2);cd=(karman/log(zzlay/z0))²;gam=(4/nuch4)*dp/(tau*gravity*rho-1/(cd*ubar))(仅打印,不应用)。 - 【关键】甲烷更新被注释(第 143、147 行):
iq=12;c zycol(1,iq)=zycol(1,iq)*exp(-loss*ptimestep)——更新语句被注释。 - 诊断打印(第 149–177 行):
ig==ig_vl1时打印各量。
伪代码
deposition(ngrid,nlayer,nq,ig,ig_vl1,pplay,pplev,zzlay,zzlev,zu,zv,zt,zycol,ptimestep,co2ice):
# NB: the ice-uncovered guard (watercaptag/co2ice) is commented out -> runs always
ubar = sqrt(zu(ig,1)**2 + zv(ig,1)**2)
ustar = ubar*karman/log(zzlay(ig,1)/z0(ig))
ra = log(zzlay(ig,1)/z0(ig))/(karman*ustar)
d = 0.1952*(p0/pplay(ig,1))*(zt(ig,1)/273.15)**1.81 # CH4 diffusivity
mu = mu0*(293.15+240)/(zt(ig,1)+240)*(zt(ig,1)/293.15)**1.5
rho = pplay(ig,1)/(rnew(ig,1)*zt(ig,1))
nu = mu/rho*1e4
schmidt = nu/d
rb = (2/(karman*ustar))*((schmidt/prandtl)**2)/3
vd = 1/(ra+rb)
deltaz = zzlev(ig,2)-zzlev(ig,1)
loss = vd/deltaz
# commented test lines in source, inactive:
# loss = 1/(3600*6)
# vd = loss*deltaz
nuch4 = sqrt(8*8.31*zt(ig,1)/(pi*16e-3))
tau=6*3600; gravity=3.7; dp=pplev(ig,1)-pplev(ig,2)
cd=(karman/log(zzlay(ig,1)/z0(ig)))**2
gam=(4/nuch4)*dp/(tau*gravity*rho - 1/(cd*ubar)) # diagnostic only
iq=12 # methane
# zycol(1,iq) = zycol(1,iq)*exp(-loss*ptimestep) # COMMENTED OUT -> no update
if ig == ig_vl1: print diagnostics
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| 光化学 / 干沉降 | calchim_mod 在 if (depos) 下逐列调用;当前 depos 默认 .false.,且即使启用也不修改成分(更新被注释) |
写法特点
- 固定格式
.F(续行第 6 列&/$)。 - 冰覆盖守卫被注释(第 73、179 行):原
if ((.not.watercaptag(ig)).and.(co2ice(ig).eq.0.))被关闭,例程对所有格点执行。 - 6 小时测试赋值被注释(第 128–129 行):
loss=1/(3600*6)与vd=loss*deltaz不执行;活跃代码保留ra/rb/schmidt/vd/loss计算结果。 - 成分更新被注释(第 147 行):
zycol(1,iq)=...不执行,例程不改变成分。 - 硬编码常数:
gravity=3.7(未用comcstfi_h:g)、iq=12(甲烷 tracer 索引硬编码)、karman=0.4、prandtl=0.72、mu0=14.8e-6、p0=1e5、tau=6*3600。 - 哑元无
intent声明;co2ice仅在注释守卫中引用(活跃代码未用);gam计算后仅打印。 - 诊断量
nuch4/tau/gravity/dp/cd/gam不进入任何成分更新。
复现要点
depos开关默认.false.(calchim_mod第 250 行),干沉降默认不调用。- 即使
depos=true,当前源码也不修改zycol(更新注释),但会按阻力相似法计算vd与loss=vd/deltaz;第 128–129 行 6 h 测试赋值是注释,不参与复现。 - 若要恢复实际成分干沉降,需取消第 147 行更新注释,并视需要恢复第 73 行冰覆盖守卫;这些改动属于源码修改,不在本 wiki 页面范围。
iq=12假定甲烷 tracer 在第 12 位;tracer 顺序变化会导致错索引。gravity=3.7为火星 g 硬编码,与comcstfi_h:g解耦。
待确认
- 干沉降更新与冰覆盖守卫被注释,是临时调试状态还是有意停用——待开发者确认设计意图。
iq=12甲烷 tracer 索引是否与当前tracer_mod顺序一致(待calchim_mod/tracer_mod文件页确认)。gam量的物理含义与是否曾用于更新成分(当前仅打印)。
相关页面
- aeronomars/index:
aeronomars目录总览,本文件在其“加热与传导”分类下(实为干沉降)。 - surfdat_h:提供地表粗糙度
z0。 - conc_mod:提供比气体常数
rnew。 - calchim_mod:调用方文件页,含
depos开关与ig_vl1设置(第 797 行赋值被注释)。 - tracer_mod.md:确认甲烷 tracer 索引。