comsoil_h.F90
路径
LMDZ.MARS\libf\phymars\comsoil_h.F90
所属目录/模块
libf/phymars — Mars 物理参数化模块
文件定位
comsoil_h 是 Mars GCM 土壤子系统的核心共享状态模块。它定义了土壤层数常数 nsoilmx=57、层深度几何、热惯量、热扩散求解器系数数组、地下 tracer(水汽/冰/吸附水)以及相关控制开关。所有涉及土壤热传导、水循环地下过程、初始场读写和诊断输出的文件都依赖此模块。它本身不包含物理计算逻辑,仅提供数据声明、参数常量和分配/释放子程序。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
comsoil_h |
module | 1 | 土壤共享状态模块 |
nsoilmx |
integer, parameter | 6 | 土壤层数 = 57 |
layer |
real, save, allocatable(:) | 8 | 各层深度(m) |
mlayer |
real, save, allocatable(:) | 9 | 各层中点深度(m) |
inertiedat |
real, save, allocatable(:,:) | 10 | 当前气候土壤热惯量 (ngrid, nsoilmx) |
inertiesoil |
real, save, allocatable(:,:,:) | 11 | 土壤热惯量 (ngrid, nsoilmx, nslope) |
volcapa |
real, save | 12 | 土壤体积热容量 (J/m³/K),从 start 文件 control(35) 读取 |
tsoil |
real, save, allocatable(:,:,:) | 19 | 土壤温度 (K) (ngrid, nsoilmx, nslope) |
mthermdiff |
real, save, allocatable(:,:,:) | 20 | 层中点热扩散系数 (ngrid, 0:nsoilmx-1, nslope) |
thermdiff |
real, save, allocatable(:,:,:) | 21 | 层界面热扩散系数 (ngrid, nsoilmx-1, nslope) |
coefq |
real, save, allocatable(:) | 22 | q_{k+1/2} 系数 (0:nsoilmx-1) |
coefd |
real, save, allocatable(:,:,:) | 23 | d_k 系数 (ngrid, nsoilmx-1, nslope) |
alph |
real, save, allocatable(:,:,:) | 24 | alpha_k 系数 (ngrid, nsoilmx-1, nslope) |
beta |
real, save, allocatable(:,:,:) | 25 | beta_k 系数 (ngrid, nsoilmx-1, nslope) |
flux_geo |
real, save, allocatable(:,:) | 26 | 地热通量 (W/m²) (ngrid, nslope) |
mu |
real, save | 27 | 热扩散求解辅助参数 |
adsorption_soil |
logical, save | 32 | 是否启用吸附过程 |
choice_ads |
real, save | 33 | 吸附等温线选择(3 = 无吸附,见 soilwater.F90) |
ads_const_D |
logical, save | 34 | 是否使用常数扩散系数 |
ads_massive_ice |
logical, save | 35 | 是否有大块地下冰 |
qsoil |
real, save, allocatable(:,:,:,:) | 36 | 地下 tracer (kg/m³ regol) (ngrid, nsoilmx, nqsoil, nslope) |
nqsoil |
integer, parameter | 37 | 地下 tracer 数 = 3 |
igcm_h2o_vap_soil |
integer, parameter | 38 | tracer 索引:土壤水汽 = 1 |
igcm_h2o_ice_soil |
integer, parameter | 39 | tracer 索引:土壤冰 = 2 |
igcm_h2o_vap_ads |
integer, parameter | 40 | tracer 索引:吸附水 = 3 |
porosity_reg |
real, parameter | 41 | 表土孔隙率 = 0.45 |
ini_comsoil_h |
subroutine | 49 | 分配所有土壤数组(ngrid, nslope) |
end_comsoil_h |
subroutine | 73 | 释放所有土壤数组 |
ini_comsoil_h_slope_var |
subroutine | 94 | 仅分配与坡面相关的子集(tsoil, inertiesoil, 热扩散系数, flux_geo, qsoil) |
end_comsoil_h_slope_var |
subroutine | 114 | 释放坡面子集 |
依赖的模块
无。comsoil_h 是纯声明模块,不 use 任何其他模块。
调用的关键例程
comsoil_h 本身不调用外部例程。其分配/释放子程序被以下模块调用:
| 调用方 | 位置 | 用途 |
|---|---|---|
phys_state_var_init_mod.F90 |
行 41 | use comsoil_h, only: ini_comsoil_h, end_comsoil_h — 物理状态变量初始化/释放 |
start2archive.F |
行 25 | use comsoil_h, only: ini_comsoil_h — 初始场转换时分配 |
输入
comsoil_h 是共享状态模块,无传统输入参数。其数据来源:
| 变量 | 写入方 | 说明 |
|---|---|---|
layer, mlayer |
soil_settings.F |
根据 nsoilmx 计算层深度和中点深度 |
inertiedat |
surfini_mod.F90 / lect_start_archive.F |
从 start 文件读取当前气候热惯量 |
inertiesoil |
soil_settings.F / newstart.F |
根据 inertiedat 和气候条件计算 |
volcapa |
tabfi.F / soil_settings.F |
从 start 文件 control(35) 读取或初始化 |
tsoil |
soil.F / phyredem.F90 |
从 start 文件读取或由热扩散求解更新 |
coefq, coefd, alph, beta, mu |
soil.F (firstcall) |
热扩散隐式求解系数,在首次调用时计算 |
flux_geo |
phyetat0_mod.F90 / newstart.F |
从 start 文件读取地热通量 |
qsoil |
vdifc_mod.F / phyredem.F90 |
地下水 tracer,由垂直扩散或重启文件写入 |
adsorption_soil, choice_ads, ads_const_D, ads_massive_ice |
conf_phys.F |
从 callphys.def 读取 |
输出
作为共享状态模块,输出是所有 use comsoil_h 的文件可访问的变量。主要使用点:
| 变量 | 主要使用点 | 用途 |
|---|---|---|
tsoil |
soil.F, vdifc_mod.F, physiq_mod.F |
土壤温度廓线,热扩散求解和地表能量收支 |
inertiesoil |
soil.F, physiq_mod.F |
热惯量,决定土壤热扩散速率 |
qsoil |
soilwater.F90, vdifc_mod.F |
地下水 tracer(水汽/冰/吸附水) |
layer, mlayer |
soil.F, soilwater.F90, vdifc_mod.F, 多个 I/O 文件 |
层深度几何 |
nsoilmx |
几乎所有土壤相关文件 | 层数常数 |
coefq/coefd/alph/beta |
soil.F |
热扩散三对角矩阵系数 |
flux_geo |
soil.F |
底边界地热通量 |
共享状态与副作用
comsoil_h 是纯粹的共享状态容器。所有变量均为 save 属性,部分标记 allocatable。所有可分配数组标记 !$OMP THREADPRIVATE 以支持 OpenMP 并行。
关键副作用:
ini_comsoil_h/ini_comsoil_h_slope_var会分配数组;重复调用会导致内存泄漏(无已分配检查)。end_comsoil_h/end_comsoil_h_slope_var会释放数组;含allocated()保护。volcapa的值来自 start 文件control(35)(在tabfi.F或soil_settings.F中设置),不同模拟可能不同。
核心逻辑
comsoil_h 不含物理计算逻辑,其结构为:
参数声明(行 6, 37–41):
nsoilmx=57定义土壤层数;nqsoil=3定义地下 tracer 数;igcm_h2o_vap_soil/ice/ads定义 tracer 索引;porosity_reg=0.45定义表土孔隙率。土壤层几何(行 8–9):
layer(nsoilmx)和mlayer(0:nsoilmx-1)分别存储层界面深度和层中点深度,由soil_settings.F计算。热性质(行 10–12):
inertiedat(当前气候参考值)和inertiesoil(含坡面变化的实际值)控制热扩散速率;volcapa是体积热容量。热扩散求解器数组(行 19–27):
tsoil是土壤温度;mthermdiff/thermdiff是扩散系数;coefq/coefd/alph/beta/mu是隐式三对角求解系数,在soil.F的 firstcall 中计算。地下 tracer(行 32–43):
qsoil(ngrid,nsoilmx,3,nslope)存储三个 tracer(水汽、冰、吸附水);adsorption_soil/choice_ads/ads_const_D/ads_massive_ice控制吸附行为。分配/释放(行 49–128):四个子程序分别处理全量和坡面子集的分配与释放。
ini_comsoil_h在phys_state_var_init中调用;ini_comsoil_h_slope_var在需要重新分配坡面维度时调用。
伪代码
module comsoil_h:
constant nsoilmx = 57 # 土壤层数
constant nqsoil = 3 # 地下 tracer 数
constant igcm_h2o_vap_soil = 1 # tracer 索引
constant igcm_h2o_ice_soil = 2
constant igcm_h2o_vap_ads = 3
constant porosity_reg = 0.45 # 表土孔隙率
save layer(nsoilmx) # 层深度
save mlayer(0:nsoilmx-1) # 层中点深度
save inertiedat(ngrid,nsoilmx) # 参考热惯量
save inertiesoil(ngrid,nsoilmx,nslope) # 实际热惯量
save volcapa # 体积热容量
save tsoil(ngrid,nsoilmx,nslope) # 土壤温度
save mthermdiff, thermdiff # 热扩散系数
save coefq, coefd, alph, beta, mu # 求解系数
save flux_geo(ngrid,nslope) # 地热通量
save qsoil(ngrid,nsoilmx,nqsoil,nslope) # 地下 tracer
save adsorption_soil, choice_ads, ads_const_D, ads_massive_ice # 控制开关
subroutine ini_comsoil_h(ngrid, nslope):
allocate all soil arrays
subroutine end_comsoil_h:
deallocate all soil arrays (with allocated() guard)
subroutine ini_comsoil_h_slope_var(ngrid, nslope):
allocate slope-dependent subset only
subroutine end_comsoil_h_slope_var:
deallocate slope-dependent subset (with allocated() guard)
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| water-cycle | 提供地下 tracer(qsoil)和吸附控制开关,是 soilwater/vdifc 的数据基础 |
| radiation | 间接:土壤热惯量影响地表温度,进而影响辐射 |
写法特点
- 纯声明模块:不含物理计算逻辑,仅数据声明 + 分配/释放。
!$OMP THREADPRIVATE:所有 save 变量均标记线程私有,支持 OpenMP 并行。- 坡面子集分配:
ini_comsoil_h_slope_var允许在不重新分配layer/mlayer/inertiedat/volcapa/coefq的情况下重新分配坡面相关数组,用于 nslope 变化时。 volcapa的特殊初始化路径:注释说明它从 start 文件control(35)读取(在physdem中),或通过tabfi设置,或在soil_settings.F中初始化。- 固定格式:部分使用大写关键字(
MODULE/SUBROUTINE/END),混合 F77/F90 风格。
复现要点
nsoilmx=57是硬编码常数,改变需要重新编译整个 GCM。porosity_reg=0.45是表土孔隙率,用于 soilwater 吸附计算。choice_ads=3表示无吸附(见 soilwater.F90)。volcapa的值取决于 start 文件,不同初始条件可能不同。layer和mlayer的具体数值由soil_settings.F计算,取决于nsoilmx。
待确认
ini_comsoil_h无allocated()保护,重复调用是否会导致内存泄漏(推断:是,但调用方phys_state_var_init通常只调用一次)。mu变量的用途未在本文件中注释,推断用于热扩散求解器(待确认:需查soil.F)。
相关页面
- soilwater — 地下水吸附-扩散-相变求解器,使用
qsoil、layer、mlayer、choice_ads等 - water-cycle-config — 水循环配置,含
adsorption_soil开关 - water-cycle — 水循环主题页
- soil — 土壤热扩散隐式求解器,Thomas 算法三对角矩阵求解
- soil_settings — 土壤初始化设置,从 startfi.nc 读取层深度/热惯量/温度
- waterice_tifeedback_mod — 水冰热惯量反馈,使用
inertiedat、layer、porosity_reg - iniwritesoil — 土壤诊断 NetCDF 初始化,创建维度和固定字段
- writediagsoil — 土壤诊断 NetCDF 逐时步写入后端