comslope_mod.F90

路径

LMDZ.MARS\libf\phymars\comslope_mod.F90

所属目录/模块

libf/phymars

文件定位

次网格坡面(subgrid slope)参数化共享状态模块。定义坡面统计分布、坡度边界、天空可视比例等共享变量,并提供初始化、释放和网格平均计算子程序。用于 Mars PCM 的次网格坡面微气候参数化方案。

定义的符号

符号 类型 行号 作用
comslope_mod module 1 次网格坡面参数化共享模块
nslope module variable 15 坡面数量(统计 bin 数)
iflat module variable 16 平坦坡面对应的 islope 索引
def_slope module variable 17 坡面统计边界数组(度)
def_slope_mean module variable 18 每个 bin 的平均坡度(度)
sky_slope module variable 19 每个坡面可见天空比例
subslope_dist module variable 20 坡面在网格中的分布比例
major_slope module variable 21 占据网格大部分面积的次坡面索引
ini_comslope_h subroutine 28 初始化分配坡面数组
end_comslope_h subroutine 45 释放坡面数组
compute_meshgridavg subroutine 59 计算坡面属性的网格平均值

依赖的模块

use 模块 only 列表 用途 待确认
comcstfi_h pi 圆周率常数(角度转弧度)

调用的关键例程

被调用例程 所在模块/文件 调用位置 作用
(无外部调用) 本模块为共享状态容器,不调用外部例程

输入

输入 来源 类型/维度 单位 含义
ngrid 调用方 integer 物理网格点数量
nslope_in 调用方 integer 坡面 bin 数量(初始化参数)
nq 调用方 integer tracer 数量
albedo_slope(ngrid,2,nslope) 调用方 real array 各坡面的反照率(2 波段)
emis_slope(ngrid,nslope) 调用方 real array 各坡面的发射率
tsurf_slope(ngrid,nslope) 调用方 real array K 各坡面的地表温度
qsurf_slope(ngrid,nq,nslope) 调用方 real array kg/m² (sloped) 各坡面的地表 tracer 含量

输出

输出 去向 类型/维度 单位 含义
albedo_meshavg(ngrid,2) 调用方 real array 网格平均反照率
emis_meshavg(ngrid) 调用方 real array 网格平均发射率
tsurf_meshavg(ngrid) 调用方 real array K 网格平均地表温度
qsurf_meshavg(ngrid,nq) 调用方 real array kg/m² (flat) 网格平均地表 tracer 含量

共享状态与副作用

核心逻辑

  1. 初始化ini_comslope_h,行 28-41):

    • 接收 ngridnslope_in
    • 分配 5 个数组:def_slopedef_slope_meansky_slopesubslope_distmajor_slope
  2. 释放end_comslope_h,行 45-55):

    • 检查每个数组是否已分配,若已分配则释放
  3. 网格平均计算compute_meshgridavg,行 59-105):

    • 快速路径(行 84-88):若 nslope==1,直接赋值(无次网格)
    • 一般路径(行 89-103):
      • 反照率:albedo_meshavg += albedo_slope * subslope_dist
      • tracer:qsurf_meshavg += qsurf_slope * subslope_dist / cos(slope_angle)(坡面→水平投影转换)
      • 发射率:emis_meshavg += emis_slope * subslope_dist
      • 温度:tsurf_meshavg += emis_slope * tsurf_slope^4 * subslope_dist(Stefan-Boltzmann 加权)
      • 最终温度:tsurf_meshavg = (tsurf_meshavg / emis_meshavg)^0.25

伪代码

! 初始化
SUBROUTINE ini_comslope_h(ngrid, nslope_in)
  分配 def_slope(nslope_in+1)
  分配 def_slope_mean(nslope_in)
  分配 sky_slope(nslope_in)
  分配 subslope_dist(ngrid, nslope_in)
  分配 major_slope(ngrid)

! 释放
SUBROUTINE end_comslope_h
  释放所有已分配数组

! 网格平均
SUBROUTINE compute_meshgridavg(ngrid, nq, albedo_slope, emis_slope, tsurf_slope, qsurf_slope, ...)
  IF nslope == 1 THEN
    直接赋值(无次网格)
  ELSE
    DO ig = 1, ngrid
      DO islope = 1, nslope
        albedo_meshavg += albedo_slope * subslope_dist
        qsurf_meshavg += qsurf_slope * subslope_dist / cos(slope_angle)  ! 坡面→水平投影
        emis_meshavg += emis_slope * subslope_dist
        tsurf_meshavg += emis_slope * tsurf_slope^4 * subslope_dist  ! Stefan-Boltzmann 加权
      END DO
      tsurf_meshavg = (tsurf_meshavg / emis_meshavg)^0.25  ! 反推平均温度
    END DO
  END IF

参与的主题流程

主题 参与方式
水循环 坡面微气候影响地表水冰交换(vdifc 调用)
CO2 循环 坡面温度影响 CO2 凝结/升华(co2condens 调用)
辐射计算 坡面反照率和发射率影响辐射收支

写法特点

复现要点

已确认初始化与使用链

文件 位置 作用
phys_state_var_init_mod.F90 行 64, 191-193 使用 ini_comslope_h / end_comslope_h,按 ngrid,nslope 分配 comslope_mod 数组
physiq_mod.F 行 131-134, 628-634 physiq 引入坡面共享变量,并把 def_slopedef_slope_meansubslope_dist 传给 phyetat0 读取初始状态
phyetat0_mod.F90 行 153-185 从 start 文件读取 def_slopesubslope_dist;无 start 文件且 nslope==1 时设默认值
phyetat0_mod.F90 行 192-203 用相邻边界平均得到 def_slope_mean,并逐网格归一化 subslope_dist
phyetat0_mod.F90 行 206-215 选出每个网格占比最大的 major_slope
physiq_mod.F 行 636-649 def_slope_mean 计算 sky_slope,并选出绝对坡度最小的 iflat
physiq_mod.F 行 857, 1617, 2567 调用 compute_meshgridavg 把坡面态汇总到网格平均态
physiq_mod.F 行 1199-1282 坡面辐射修正使用 def_slope_meansky_slope
vdifc_mod.F 行 286-287, 437-454, 653, 684, 783 使用 major_slope 选择主坡面温度、地表 tracer 与交换系数

待确认

相关页面