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 physiqnsoilmx integer 土壤层数(=57)
firstcall physiq logical 首次调用标志(.true. 时只计算系数)
therm_i(ngrid,nsoil,nslope) physiqinertiesoilinertiesoil_tifeedback real J·s⁻¹/²·m⁻²·K⁻¹ 各层热惯量
timestep physiqptimestep 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² 地表扩散热通量

共享状态与副作用

核心逻辑

0. 预处理(firstcalltifeedback 时执行,行 48–140)

0.1 中间层热扩散系数(行 52–67):

0.2 层间热扩散系数(行 84–95):

0.3 三对角矩阵系数(行 98–138):

1. 求解土壤温度(firstcall=.false. 时执行,行 143–160)

第一层(行 146–151):

其他层(行 153–158):从上到下回代

2. 计算 beta 系数(为下一时步预处理,行 163–181)

底层(行 165–170):

其他层(行 173–181):从下到上递推

3. 地表扩散热通量(行 183–207)

伪代码

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 调整热惯量后,本例程用新热惯量重新求解土壤温度
土壤诊断 tsoilwritediagsoil 写入 diagsoil.nc

写法特点

复现要点

待确认

相关页面