callphysiq_mod.F90
路径
LMDZ.MARS\libf\dynphy_lonlat\phymars\callphysiq_mod.F90
所属目录/模块
libf/dynphy_lonlat/phymars
文件定位
lon-lat GCM 动力-物理耦合适配器。callphysiq_mod 模块封装唯一入口 call_physiq,在动力核心与 physiq_mod 之间传递状态数组和 tendency;首次调用时验证 planet_type=="mars",随后将动力核心传入的 OMP 并行数组按 physiq 参数列表转发,并把物理 tendency 回写动力侧。
当前源码树中的直接调用方位于 LMDZ.COMMON-6.3:串行 calfis 和并行 calfis_p 都在 CPP_PHYS 分支内按 nsplit_phys 调用 call_physiq。MARS 本文件是行星物理包提供给 COMMON 动力核心的适配层。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
callphysiq_mod |
module |
4 |
动力-物理接口模块,封装 call_physiq |
call_physiq |
subroutine |
10 |
接收动力核心状态、调用 physiq、返回 tendency |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
control_mod |
planet_type |
首次调用时校验行星类型为 "mars" |
|
mod_grid_phy_lmdz |
nbp_lon, nbp_lat |
为 pducov 参数提供维度(nbp_lon+1, nbp_lat) |
|
physiq_mod |
physiq |
Mars 物理参数化主调度例程 |
|
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
abort_gcm |
公共工具(待确认模块) |
行 62 |
planet_type 非 "mars" 时中止运行 |
physiq |
physiq_mod |
行 69-89 |
将动力状态转发给 Mars 物理包,接收 tendency |
直接调用本例程的位置:
| 调用方 |
源码位置 |
调用条件与作用 |
calfis |
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dynphy_lonlat\calfis.F:699 |
串行 lon-lat 路径;在 CPP_PHYS 下按 nsplit_phys 转发物理列状态。 |
calfis_p |
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dynphy_lonlat\calfis_p.F:946 |
MPI/OpenMP 并行 lon-lat 路径;转发当前物理列切片并接收 tendency。 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
klon |
动力核心 |
INTEGER |
— |
局地大气柱数 |
llm |
动力核心 |
INTEGER |
— |
大气层数 |
nqtot |
动力核心 |
INTEGER |
— |
示踪剂个数 |
tname |
动力核心 |
CHARACTER(len=*) (nqtot) |
— |
示踪剂名称 |
debut_split |
动力核心 |
LOGICAL |
— |
是否为物理过程首次调用 |
lafin_split |
动力核心 |
LOGICAL |
— |
是否为物理过程末次调用 |
jD_cur |
动力核心 |
REAL |
day |
儒略日 |
jH_cur_split |
动力核心 |
REAL |
day |
儒略小时(日分数) |
zdt_split |
动力核心 |
REAL |
s |
物理过程时间步长 |
zplev_omp |
动力核心 |
REAL (klon,llm+1) |
Pa |
层间气压 |
zplay_omp |
动力核心 |
REAL (klon,llm) |
Pa |
中层气压 |
zpk_omp |
动力核心 |
REAL (klon,llm) |
— |
气压相关参数 |
zphi_omp |
动力核心 |
REAL (klon,llm) |
m²/s² |
中层位势 |
zphis_omp |
动力核心 |
REAL (klon) |
m²/s² |
地表位势 |
presnivs_omp |
动力核心 |
REAL (llm) |
Pa |
各层近似气压 |
zufi_omp |
动力核心 |
REAL (klon,llm) |
m/s |
纬向风 |
zvfi_omp |
动力核心 |
REAL (klon,llm) |
m/s |
经向风 |
zrfi_omp |
动力核心 |
REAL (klon,llm) |
s⁻¹ |
相对涡度 |
ztfi_omp |
动力核心 |
REAL (klon,llm) |
K |
温度 |
zqfi_omp |
动力核心 |
REAL (klon,llm,nqtot) |
*/kg |
示踪剂混合比 |
flxwfi_omp |
动力核心 |
REAL (klon,llm) |
kg/s |
下界面垂直质量通量 |
pducov |
动力核心 |
REAL (nbp_lon+1,nbp_lat,llm) |
— |
动力倾向(ucov) |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
zdufi_omp |
动力核心 |
REAL (klon,llm) |
*/s |
纬向风 tendency |
zdvfi_omp |
动力核心 |
REAL (klon,llm) |
*/s |
经向风 tendency |
zdtfi_omp |
动力核心 |
REAL (klon,llm) |
*/s |
温度 tendency |
zdqfi_omp |
动力核心 |
REAL (klon,llm,nqtot) |
*/s |
示踪剂 tendency |
zdpsrf_omp |
动力核心 |
REAL (klon) |
*/s |
地表气压 tendency |
共享状态与副作用
firstcall(LOGICAL, SAVE, THREADPRIVATE):每线程私有标志,首次调用后置 .false.;OpenMP 并行区各线程独立跟踪。
- 无文件 I/O、无 common block、无模块级全局变量写入。
核心逻辑
- 首次调用校验:
IF (firstcall) 时检查 planet_type 是否为 "mars",不是则调用 abort_gcm 中止,然后将 firstcall 置为 .false.。
- 转发物理调用:
call_physiq 接收 27 个形参,向 physiq 传递其中 21 个。未转发的是 tname、zpk_omp、zphis_omp、presnivs_omp、zrfi_omp 和 pducov;jD_cur、jH_cur_split 分别明确映射为 physiq 的 pday、ptime。
伪代码
SUBROUTINE call_physiq(状态参数..., tendency参数...)
USE control_mod → planet_type
USE physiq_mod → physiq
IF firstcall THEN
IF planet_type ≠ "mars" THEN abort
firstcall ← .false.
ENDIF
CALL physiq(klon, llm, nqtot, debut_split, lafin_split,
jD_cur, jH_cur_split, zdt_split,
zplev_omp, zplay_omp, zphi_omp,
zufi_omp, zvfi_omp, ztfi_omp, zqfi_omp,
flxwfi_omp,
zdufi_omp, zdvfi_omp, zdtfi_omp, zdqfi_omp, zdpsrf_omp)
END SUBROUTINE
参与的主题流程
| 主题 |
参与方式 |
| 动力-物理接口 |
作为 COMMON calfis/calfis_p 到 MARS physiq 的行星侧适配点;串、并行路径都通过本入口。 |
写法特点
- OpenMP 线程私有:
firstcall 使用 SAVE + !$OMP THREADPRIVATE 声明,确保并行区各线程独立执行首次校验。
- 参数过滤:27 个入口形参中有 6 个只服务 COMMON 动力侧或接口兼容,不进入
physiq;其余 21 个按位置映射到 MARS 物理主调度器。
- Free-form F90:使用
& 续行和 INTENT(IN/OUT) 声明,与 dynphy_lonlat 中部分 fixed-form 文件不同。
复现要点
- 需要
control_mod 中 planet_type 已设置为 "mars",否则首次调用即中止。
- 需要
physiq_mod 已初始化(通过 iniphysiq_mod)。
pducov 维度依赖 mod_grid_phy_lmdz 中的 nbp_lon 和 nbp_lat。
待确认
abort_gcm 所在模块未在此文件中显式 USE,可能通过隐式接口或链接单元提供。
相关页面