dust_windstress_lift.F90
路径
LMDZ.MARS\libf\phymars\dust_windstress_lift.F90
所属目录/模块
libf\phymars
文件定位
该文件定义风应力起尘(dust lifting by surface winds)模块 dust_windstress_lift_mod(168 行),导出例程 dust_windstress_lift,由 vdifc(行 881,地表交换段,lifting 路径)调用。它的职责是:根据近地面摩擦速度是否超过起尘阈值,按 White (1979) / Marticorena 公式计算水平尘埃通量 fhoriz,再乘以各 tracer 的起尘效率 alpha_lift 得到地表向第一层中点的尘埃通量 dqslift(起尘时为负,表示从地表注入大气)。
模块保存起尘方案号 windstress_lift_scheme(默认 0,旧方案;当前仅支持 0)和起尘应力阈值 stress_seuil。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
dust_windstress_lift_mod |
module |
1 |
风应力起尘模块 |
windstress_lift_scheme |
integer SAVE |
5 |
起尘方案号,默认 0(旧方案),当前仅支持 0 |
dust_windstress_lift |
subroutine |
12 |
按摩擦速度阈值算水平通量并转为地表尘埃通量 dqslift |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
tracer_mod(非 MESOSCALE) |
alpha_lift, radius |
各 tracer 起尘效率系数、粒径 |
否 |
tracer_mod(MESOSCALE) |
alpha_lift, radius, igcm_dust_mass, igcm_dust_number, ref_r0, r3n_q |
额外用于 MESOSCALE 下从 stress.def 重设起尘系数 |
否 |
comcstfi_h |
g |
重力加速度(水平通量公式分母) |
否 |
ioipsl_getin_p_mod |
getin_p |
firstcall 读取 windstress_lift_scheme |
否 |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
getin_p |
ioipsl_getin_p_mod |
行 89 |
读取 windstress_lift_scheme 配置键 |
abort_physic |
(phymars 公共中止例程) |
行 95 |
windstress_lift_scheme/=0 时致命中止 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
ngrid, nlay, nq |
vdifc |
integer scalar |
- |
格点数、层数、tracer 数 |
rho(ngrid) |
vdifc |
real |
kg/m³ |
地表空气密度 |
pcdh_true(ngrid) |
vdifc |
real |
- |
拖曳系数 Cd |
pcdh(ngrid) |
vdifc |
real |
m/s |
Cd·|V|(摩擦速度计算用) |
co2ice(ngrid) |
vdifc(pqsurf_tmp(:,igcm_co2)) |
real |
kg/m² |
地表 CO2 冰;>0 时该点不起尘 |
alpha_lift(nq) |
tracer_mod |
real |
- |
各 tracer 起尘效率系数 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
dqslift(ngrid,nq) |
vdifc(pdqsdif_tmp)→地表交换/tracer 注入 |
real (OUT) |
通量单位 |
地表向第一层中点的尘埃通量(起尘时<0) |
共享状态与副作用
- module 级
SAVE+THREADPRIVATE:windstress_lift_scheme(行 8)。
- 例程内
SAVE+THREADPRIVATE:stress_seuil(默认 0.0225 N/m²)、firstcall(行 53、56)。
- firstcall:
getin_p("windstress_lift_scheme")(默认 0);非 0 则 abort_physic。
- MESOSCALE 编译下额外尝试读
stress.def,并就地改 alpha_lift(igcm_dust_mass/igcm_dust_number)(改 tracer_mod 共享状态)。
- 标准输出副作用:MESOSCALE 下打印用户阈值;非法 scheme 打印错误。
- 不写普通文件(非 MESOSCALE)。
核心逻辑
- MESOSCALE 块(行 60-84,仅宏开启):尝试读
stress.def 得 ulim/alpha,重设 stress_seuil=0.02*ulim² 与 alpha_lift。
- firstcall(行 86-99):
getin_p 读 windstress_lift_scheme(默认 0);非 0 则中止。
- 方案 0(行 102-164):
- 水平通量(行 108-140):逐格点初始化
fhoriz=0;若 co2ice>0 跳过(极冠/霜覆盖不起尘);算阈值摩擦速度 ust=sqrt(stress_seuil/rho) 与实际摩擦速度 us=pcdh/sqrt(pcdh_true);若 us>ust,按 White(1979) fhoriz=2.61*(rho/g)*(us-ust)*(us+ust)²。
- 垂直通量(行 146-162):对每个 tracer
dqslift(:,iq)=-alpha_lift(iq)*fhoriz(负号表示向大气注入)。
伪代码
#ifdef MESOSCALE: 读 stress.def 重设 stress_seuil, alpha_lift
if firstcall:
getin windstress_lift_scheme (default 0)
if scheme != 0: abort_physic
if windstress_lift_scheme == 0:
for ig:
fhoriz(ig) = 0
if co2ice(ig) > 0: skip # 冰/霜覆盖不起尘
ust = sqrt(stress_seuil/rho(ig)) # 阈值摩擦速度
us = pcdh(ig)/sqrt(pcdh_true(ig)) # 实际摩擦速度
if us > ust:
fhoriz(ig) = 2.61*(rho/g)*(us-ust)*(us+ust)^2 # White 1979
for iq, ig:
dqslift(ig,iq) = -alpha_lift(iq)*fhoriz(ig)
参与的主题流程
| 主题 |
参与方式 |
| 尘埃循环 |
实现风应力起尘源项:把超阈值近地风转为地表尘埃注入通量 dqslift,是尘埃循环的源端,经 vdifc 注入大气 |
写法特点
- 自由格式 Fortran 90(
.F90)。
- module 级与例程内均用
SAVE+THREADPRIVATE。
goto 99 跳过冰覆盖点(固定格式遗留风格);大段注释掉的硬编码地理屏蔽(Olympus/Arsia/极冠等)保留为历史痕迹。
- 硬编码常数:
stress_seuil=0.0225、White 公式系数 2.61、MESOSCALE 的 0.02。
windstress_lift_scheme 当前仅 0 合法,非 0 直接 abort_physic(预留扩展)。
- MESOSCALE 与非 MESOSCALE 用不同
use 列表与 stress.def 逻辑。
复现要点
- 由
vdifc(行 881)在 lifting 路径调用;实参 co2ice 来自 pqsurf_tmp(:,igcm_co2)。
- 起尘判据:
us>ust,ust=sqrt(stress_seuil/rho),us=pcdh/sqrt(pcdh_true);stress_seuil=0.0225 N/m²(非 MESOSCALE 默认)。
- 水平通量 White(1979):
fhoriz=2.61*(rho/g)*(us-ust)*(us+ust)²。
- 地表通量:
dqslift(:,iq)=-alpha_lift(iq)*fhoriz,负号表示向大气注入;alpha_lift 来自 tracer_mod(initracer 设定)。
co2ice>0 的格点不起尘(霜/极冠覆盖)。
windstress_lift_scheme 默认 0;非 0 中止(当前无其它方案)。
待确认
- 非 MESOSCALE 编译下
radius(use tracer_mod, only: alpha_lift, radius)在方案 0 可见逻辑中未见直接使用,疑为与 MESOSCALE 分支共用 import 列表的遗留;推断不影响非 MESOSCALE 结果,复现时可忽略。
相关页面