dust_rad_adjust_mod.F90
路径
LMDZ.MARS\libf\phymars\dust_rad_adjust_mod.F90
所属目录/模块
libf\phymars
文件定位
该文件定义尘埃辐射调整系数模块 dust_rad_adjust_mod(146 行),导出例程 compute_dust_rad_adjust,由 dust_scaling(compute_dustscaling,行 79)在 dustscaling_mode==2(GCM v6 风格)时调用。它的职责是计算逐格点的尘埃辐射调整系数 dust_rad_adjust:把每日 14:00(t_scenario_sol)尘埃场景目标柱厚度与 GCM 当前可见光尘埃柱厚度 taudust 之比作为“目标”,在相邻两日 14:00 的目标值(dust_rad_adjust_prev/dust_rad_adjust_next)之间做时间线性插值,从而让辐射传输看到的尘埃光学厚度平滑跟随观测场景,而不强行重缩放尘埃 tracer 质量(区别于 dustscaling_mode==1 的 tauscaling)。
模块保存两个相邻日的调整系数 dust_rad_adjust_prev/dust_rad_adjust_next(restart 经 phyetat0/phyredem 读写),并提供 ini/end_dust_rad_adjust_mod 管理其分配。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
dust_rad_adjust_mod |
module |
1 |
尘埃辐射调整系数模块 |
dust_rad_adjust_prev |
real SAVE ALLOCATABLE(:) |
5 |
当前 t_scenario 时刻算得的调整系数(上一日 14:00 目标),按格点 |
dust_rad_adjust_next |
real SAVE ALLOCATABLE(:) |
7 |
次日 t_scenario 的调整系数(下一日 14:00 目标),按格点 |
compute_dust_rad_adjust |
subroutine |
14 |
计算 dust_rad_adjust(两日目标间时间线性插值) |
ini_dust_rad_adjust_mod |
subroutine |
126 |
分配 dust_rad_adjust_prev/next |
end_dust_rad_adjust_mod |
subroutine |
137 |
释放 dust_rad_adjust_prev/next |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
geometry_mod |
longitude_deg |
由经度算各格点本地时(当前步与上一步) |
否 |
time_phylmdz_mod |
dtphys, daysec |
物理步长与 sol 秒数,算上一步 zday_prevdt |
否 |
dust_param_mod |
odpref, t_scenario_sol |
参考气压 610 Pa;场景厚度精确时刻(14:00,触发目标更新与插值锚点) |
否 |
read_dust_scenario_mod |
read_dust_scenario |
读取次日(zday_scenario_next)场景目标厚度 tau_pref_scenario_next |
否 |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
read_dust_scenario |
read_dust_scenario_mod |
行 80 |
读次日场景尘埃柱厚度(VIS) |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
ngrid, nlayer |
compute_dustscaling |
integer scalar |
- |
水平格点数、垂直层数 |
zday |
compute_dustscaling |
real scalar |
sol |
日期(sol 分数) |
pplev(ngrid,nlayer+1) |
compute_dustscaling |
real |
Pa |
层界面气压(取 pplev(:,1) 表压缩放) |
taudust(ngrid) |
compute_dustscaling |
real |
- |
GCM 可见光尘埃柱厚度(目标比的分母) |
IRtoVIScoef(ngrid) |
compute_dustscaling(源自 aeropacity) |
real |
- |
场景 IR→VIS 换算系数,传给 read_dust_scenario |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
dust_rad_adjust(ngrid) |
compute_dustscaling→缩放 aerosol |
real (OUT) |
- |
尘埃辐射调整系数(时间插值结果) |
dust_rad_adjust_prev/next(ngrid) |
module SAVE;restart phyetat0/phyredem |
real |
- |
相邻两日 14:00 的目标调整系数 |
共享状态与副作用
- module 级
SAVE+THREADPRIVATE:dust_rad_adjust_prev、dust_rad_adjust_next(行 10)。
- 例程内
SAVE+THREADPRIVATE:local_time、local_time_prevdt、zday_scenario、zday_scenario_next、firstcall、tau_pref_scenario_next(行 47-48)。
- firstcall:打印场景精确时刻提示;分配
local_time/local_time_prevdt/tau_pref_scenario_next。
dust_rad_adjust_prev/next 只在“本地时本步跨过 t_scenario_sol(14:00)”时更新(行 86-100):把旧 next 转存为 prev,用当前 taudust 与次日场景算新 next,并对 next 设上限 5。
- 标准输出副作用:firstcall 的提示信息。
ini/end_dust_rad_adjust_mod 由 phys_state_var_init 管理 prev/next 生命周期。
- 注释掉的
tau_pref_scenario(当日场景)相关代码(行 43、61、78-79)保留为历史痕迹。
核心逻辑
- firstcall(行 56-64):打印提示;分配
local_time、local_time_prevdt、tau_pref_scenario_next。
- 算本地时(行 66-75):由
zday+经度算当前步与上一步(zday_prevdt=zday-dtphys/daysec)本地时;zday_scenario=floor(zday)、zday_scenario_next=zday_scenario+1。
- 读次日场景(行 77-82):
read_dust_scenario(zday_scenario_next, IRtoVIScoef, tau_pref_scenario_next)。
- 更新目标(行 84-101):逐格点,若本地时本步跨过
t_scenario_sol:dust_rad_adjust_prev=旧 next;dust_rad_adjust_next=tau_pref_scenario_next*pplev(:,1)/odpref/taudust;next=min(next,5)(防极夜大日变化时 tau 失控)。
- 时间插值(行 103-119):逐格点算权重
weight(本地时距上一日 14:00 的 sol 距离:≥14:00 取 local_time-t_scenario_sol,否则取 (1-t_scenario_sol)+local_time),dust_rad_adjust=prev+weight*(next-prev)。
伪代码
if firstcall:
print 提示; allocate local_time, local_time_prevdt, tau_pref_scenario_next
# 本地时
local_time = f(zday, longitude)
local_time_prevdt = f(zday - dtphys/daysec, longitude)
zday_scenario_next = floor(zday) + 1
# 次日场景目标
tau_pref_scenario_next = read_dust_scenario(zday_scenario_next, IRtoVIScoef)
# 跨 14:00 更新目标
for ig:
if local_time crosses t_scenario_sol this step:
dust_rad_adjust_prev = dust_rad_adjust_next # 旧 next 转 prev
dust_rad_adjust_next = tau_pref_scenario_next*pplev(:,1)/odpref/taudust
dust_rad_adjust_next = min(dust_rad_adjust_next, 5.) # 上限
# 两日目标间线性插值
for ig:
if local_time >= t_scenario_sol: weight = local_time - t_scenario_sol
else: weight = (1-t_scenario_sol) + local_time
dust_rad_adjust = prev + weight*(next - prev)
参与的主题流程
| 主题 |
参与方式 |
| 尘埃循环 |
dustscaling_mode==2(GCM v6)下产出辐射调整系数 dust_rad_adjust,由 compute_dustscaling 用它缩放 aerosol 光学厚度,使辐射看到的尘埃跟随观测场景而不改尘埃质量 |
| 辐射 |
调整系数最终作用在喂给辐射传输的 aerosol 上 |
写法特点
- 自由格式 Fortran 90(
.F90)。
- module 级与例程内大量
SAVE+THREADPRIVATE。
- 与
compute_dtau(注入)相似的“每日 14:00 校准 + 跨日线性插值”模式,但此处用于辐射缩放而非地表注入。
- 硬编码上限
min(next,5.)(注释提到曾用 3.),防极夜大日变化导致 tau 失控。
- 场景目标读次日值(
floor(zday)+1),对应场景 DOD 14:00 测量但存于午夜的约定。
- 注释掉的当日
tau_pref_scenario 逻辑保留为历史痕迹。
end_dust_rad_adjust_mod 用 if(allocated) 幂等释放。
复现要点
- 仅
dustscaling_mode==2 路径使用本例程;compute_dustscaling 还限定每时间步 zday 变化时才调用一次(zday/=zday_prev_call,dust_scaling 行 78)。
- 目标比公式:
dust_rad_adjust_next = tau_pref_scenario_next * pplev(:,1)/odpref / taudust,上限 5。
- 插值权重以上一日 14:00 为锚点,
prev/next 相隔正好 1 sol。
dust_rad_adjust_prev/next 经 phyetat0/phyredem 进 restart,跨步/跨运行保持,由 phys_state_var_init 分配。
- 下游
compute_dustscaling 用 aerosol*dust_rad_adjust 缩放(dust_scaling 行 98-105),不改尘埃 tracer 质量。
待确认
- 无显著证据缺口。源码逻辑、调用链(
compute_dustscaling→本例程,restart 经 phyetat0/phyredem)、odpref/t_scenario_sol 来源均已核验。
相关页面