soil.F
路径
LMDZ.MARS\libf\phymars\soil.F
所属目录/模块
libf/phymars
文件定位
soil.F 是火星土壤热扩散求解器。它使用隐式一阶格式(三对角矩阵)求解土壤各层温度,是地表能量收支的核心组件。由 physiq_mod 在每个物理时步调用,返回土壤温度廓线 tsoil、地表热容量 capcal 和地表扩散热通量 fluxgrd。
首次调用(firstcall=.true.)时只计算扩散系数和三对角矩阵系数,不更新温度;后续调用(firstcall=.false.)执行实际求解。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
soil_mod |
module | 1 | 包裹 soil 子程序的模块 |
soil |
subroutine | 7 | 土壤热扩散隐式求解主例程 |
依赖的模块
| use 模块 | only 列表 | 用途 | 待确认 |
|---|---|---|---|
comsoil_h |
layer, mlayer, volcapa, mthermdiff, thermdiff, coefq, coefd, alph, beta, mu, flux_geo |
土壤层几何、热容量、扩散系数和三对角矩阵系数 | |
surfdat_h |
watercaptag, inert_h2o_ice |
永久冰标记和水冰热惯量 | |
comslope_mod |
nslope |
坡面 bin 数量 | |
callkeys_mod |
surfaceice_tifeedback, poreice_tifeedback |
热惯量反馈开关 |
调用的关键例程
| 被调用例程 | 所在模块/文件 | 调用位置 | 作用 |
|---|
本模块不调用其他子程序。纯数值求解,无外部调用。
输入
| 输入 | 来源 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
ngrid |
physiq |
integer | — | 水平网格点数 |
nsoil |
physiq(nsoilmx) |
integer | — | 土壤层数(=57) |
firstcall |
physiq |
logical | — | 首次调用标志(.true. 时只计算系数) |
therm_i(ngrid,nsoil,nslope) |
physiq(inertiesoil 或 inertiesoil_tifeedback) |
real | J·s⁻¹/²·m⁻²·K⁻¹ | 各层热惯量 |
timestep |
physiq(ptimestep) |
real | s | 物理时步 |
tsurf(ngrid,nslope) |
physiq |
real | K | 地表温度 |
输出
| 输出 | 去向 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
tsoil(ngrid,nsoil,nslope) |
physiq |
real | K | 土壤各层中间温度 |
capcal(ngrid,nslope) |
physiq |
real | J/m²/K | 地表热容量 |
fluxgrd(ngrid,nslope) |
physiq |
real | W/m² | 地表扩散热通量 |
共享状态与副作用
- 读写
comsoil_hmodule 变量:- 写入:
mthermdiff(中间层扩散系数)、thermdiff(层间扩散系数)、coefq/coefd/alph/beta/mu(三对角矩阵系数) - 读取:
layer/mlayer(层深度几何)、volcapa(体积热容量)、flux_geo(底边界地热通量) - 这些写入在
firstcall或tifeedback时发生,后续时步复用
- 写入:
watercaptag分支:永久冰区域使用固定的inert_h2o_ice热惯量替代输入值
核心逻辑
0. 预处理(firstcall 或 tifeedback 时执行,行 48–140)
0.1 中间层热扩散系数(行 52–67):
watercaptag(ig)=.true.:永久冰区域,mthermdiff = inert_h2o_ice² / volcapa- 否则:
mthermdiff = therm_i² / volcapa(热惯量平方除以体积热容量) #ifdef MESOSCALE:额外限制最大热惯量不超过inert_h2o_ice
0.2 层间热扩散系数(行 84–95):
thermdiff(ig,ik,islope)在layer(ik)界面上做线性插值:按mlayer(ik-1)和mlayer(ik)的距离加权平均上下两层的mthermdiff
0.3 三对角矩阵系数(行 98–138):
mu = mlayer(0) / (mlayer(1) - mlayer(0))(地表到第一层中间的距离比)coefq(0) = volcapa * layer(1) / timestep(第一层热容量/时步)coefq(ik) = volcapa * (layer(ik+1)-layer(ik)) / timestep(其他层)coefd(ig,ik,islope) = thermdiff(ig,ik) / (mlayer(ik)-mlayer(ik-1))(扩散系数/层间距)alph:从底层向上递推的消去系数(Thomas 算法的前向消去)capcal:地表有效热容量(含alph修正)
1. 求解土壤温度(firstcall=.false. 时执行,行 143–160)
第一层(行 146–151):
tsoil(ig,1) = (tsurf + mu*beta(1)*thermdiff(1)/mthermdiff(0)) / (1+mu*(1-alph(1))*thermdiff(1)/mthermdiff(0))
其他层(行 153–158):从上到下回代
tsoil(ig,ik+1) = alph(ig,ik) * tsoil(ig,ik) + beta(ig,ik)
2. 计算 beta 系数(为下一时步预处理,行 163–181)
底层(行 165–170):
beta(nsoil-1) = (coefq(nsoil-1)*tsoil(nsoil) + flux_geo) / (coefq(nsoil-1)+coefd(nsoil-1))
其他层(行 173–181):从下到上递推
3. 地表扩散热通量(行 183–207)
fluxgrd由两部分组成:扩散项Fstar和热容量修正项FsFstar = (thermdiff(1)/(mlayer(1)-mlayer(0))) * (beta(1) + (alph(1)-1)*tsoil(1))Fs = (capcal/timestep) * (tsoil(1)*(1+mu*(1-alph(1))*thermdiff(1)/mthermdiff(0)) - tsurf - mu*beta(1)*thermdiff(1)/mthermdiff(0))fluxgrd = Fstar + Fs
伪代码
if firstcall or tifeedback:
! 0.1 中间层扩散系数
for each (ig, islope):
if watercaptag: mthermdiff = inert_h2o_ice²/volcapa
else: mthermdiff = therm_i²/volcapa
! 0.2 层间扩散系数(线性插值)
thermdiff(ik) = weighted_avg(mthermdiff(ik-1), mthermdiff(ik))
! 0.3 三对角系数
mu = mlayer(0)/(mlayer(1)-mlayer(0))
coefq(0) = volcapa*layer(1)/timestep
coefq(ik) = volcapa*(layer(ik+1)-layer(ik))/timestep
coefd(ik) = thermdiff(ik)/(mlayer(ik)-mlayer(ik-1))
alph(nsoil-1) = coefd(nsoil-1)/(coefq(nsoil-1)+coefd(nsoil-1))
for ik = nsoil-2..1: ! 从底层向上消去
alph(ik) = coefd(ik)/(coefq(ik)+coefd(ik+1)*(1-alph(ik+1))+coefd(ik))
capcal = ... ! 含 alph 修正的地表有效热容量
if not firstcall:
! 求解温度(Thomas 算法回代)
tsoil(1) = (tsurf + mu*beta(1)*thermdiff(1)/mthermdiff(0)) / (1+mu*(1-alph(1))*...)
for ik = 1..nsoil-1:
tsoil(ik+1) = alph(ik)*tsoil(ik) + beta(ik)
! 更新 beta(为下一时步)
beta(nsoil-1) = (coefq*tsoil(nsoil)+flux_geo)/(coefq+coefd)
for ik = nsoil-2..1: ! 从底层向上
beta(ik) = (coefq*tsoil(ik+1)+coefd*beta(ik+1))/(coefq+coefd*(1-alph)+coefd)
! 地表热通量
Fstar = diffusion_term
Fs = capacity_correction
fluxgrd = Fstar + Fs
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| 地表能量收支 | 提供 capcal(地表热容量)和 fluxgrd(地表扩散热通量)给 vdifc 的地表能量平衡求解 |
| 水循环 | waterice_tifeedback 调整热惯量后,本例程用新热惯量重新求解土壤温度 |
| 土壤诊断 | tsoil 被 writediagsoil 写入 diagsoil.nc |
写法特点
- 固定格式 Fortran:使用
c列注释(行 29)、DO/ENDDO大写、列对齐。 - 隐式三对角求解:Thomas 算法,系数在
firstcall时预计算并存储在comsoil_h中,后续时步复用。 watercaptag分支:永久冰区域使用固定水冰热惯量,不随气候演化。#ifdef MESOSCALE:中尺度模式下额外限制最大热惯量(行 69–81)。firstcall双重用途:既用于初始化,也用于tifeedback时重新计算系数。nslope循环:所有计算都在islope循环中,支持多 bin 坡面。
复现要点
comsoil_h中的layer/mlayer/volcapa由soil_settings.F设置,coefq/coefd/alph/beta/mu在本文件firstcall时计算。flux_geo(底边界地热通量)通常设为 0,由comsoil_h提供。- 热惯量可以是常数(
inertiesoil)或随水冰反馈变化(inertiesoil_tifeedback),由surfaceice_tifeedback/poreice_tifeedback开关控制。 timestep是 GCM 物理时步,决定隐式格式的稳定性。
待确认
- 行 69–81
#ifdef MESOSCALE限制最大热惯量为inert_h2o_ice(待确认:是否因中尺度模式没有watercaptag机制)。 - 行 186–197 注释掉的旧代码(待确认:是否为历史遗留的调试代码)。
mu的物理含义:mlayer(0)/(mlayer(1)-mlayer(0)),即地表到第一层中间深度与第一层厚度的比值(待确认:mlayer(0)是否为 0 或极小值)。
相关页面
- comsoil_h — 土壤共享参数文件,提供层几何、热容量、扩散系数和求解系数
- soil_settings — 设置
layer/mlayer/volcapa等土壤参数 - waterice_tifeedback_mod — 水冰热惯量反馈,调整
inertiesoil_tifeedback - iniwritesoil — 土壤诊断 NetCDF 初始化
- writediagsoil — 土壤诊断输出,写入
tsoil等地下剖面字段 - water-cycle — 水循环主题页