subslope_mola.F90

路径

LMDZ.MARS\libf\dynphy_lonlat\phymars\subslope_mola.F90

所属目录/模块

libf/dynphy_lonlat/phymars

文件定位

subslope_mola.F90 定义 subslope_mola_mod,用于在 newstart 修改坡面数量时,根据 MOLA 高程文件重新计算每个 GCM 网格单元内的次网格坡面分布 subslope_dist(ngridmx,nslope)。它读取 datadir/mola64.ncalt 高程场,计算 MOLA 网格上的坡度倾角 theta_mola 和坡向 psi_mola,再按 GCM 网格边界统计每个坡面分箱的面积比例。

定义的符号

符号 类型 行号 作用
subslope_mola_mod module 1 封装 MOLA 坡面统计入口和内部辅助例程。
subslope_mola subroutine 7 对每个 GCM 网格单元调用 MOLA 坡面统计,输出 subslope_dist
mola subroutine 115 读取 mola64.ncalt 高程,调用 getslopes_mola32 生成坡度和坡向数组。
getslopes_mola32 subroutine 239 在 MOLA 经纬网格上用中心差分估计地形梯度,并计算坡度倾角/坡向。
slopes_stat subroutine 367 将一个 GCM 网格框内的 MOLA 坡面点按 crit(theta,psi)def_slope 分箱,得到坡面比例。
crit internal function 559 分箱准则,当前为 theta*cos(psi*pi/180)

依赖的模块

use 模块 only 列表 用途 待确认
geometry_mod boundslon,boundslat 提供每个 GCM 网格单元角点边界,经 north_west/south_east 取统计区域。见 common-dependencies 边界单位由源码注释确认为弧度。
regular_lonlat_mod init_regular_lonlat,east,west,north,south,north_east,north_west,south_west,south_east 提供角点索引常量;本文件实际使用 north_westsouth_east 多个导入符号未直接使用。
datafile_mod datadir 定位 MOLA 数据目录,拼接 trim(datadir)//"/mola64.nc" 无。

include 依赖

include 用途
dimensions.h subslope_mola 中包含;本文件主体未直接使用其中维度常量。
netcdf.inc mola 中包含;提供 NetCDF API 常量和例程。

调用的关键例程

被调用例程 所在模块/文件 调用位置 作用
mola 本文件 subslope_mola.F90:62 读取 MOLA 高程并生成坡度/坡向数组。
slopes_stat 本文件 subslope_mola.F90:82 对单个 GCM 网格框统计坡面分箱比例。
NF_OPEN/NF_INQ_VARID/NF_GET_VAR/NF_CLOSE NetCDF API mola 打开 mola64.nc,读取 alt 短整型高程场并关闭文件。
getslopes_mola32 本文件 subslope_mola.F90:230 从高程网格计算坡度倾角和坡向。

调用方

调用方 调用位置 作用
newstart newstart.F:1818 当用户在 newstart 中修改 nslopengridmx /= 1 时,调用 subslope_mola(ngridmx,nslope_new,def_slope,subslope_dist) 重算坡面面积分布。

输入

输入 来源 类型/维度 单位 含义
ngridmx 调用方 INTEGER grid count GCM 物理/动力网格点数。
nslope 调用方 INTEGER count 坡面分箱数。
def_slope 调用方 REAL(nslope+1) 度或准则单位 坡面分箱边界;分箱准则是 theta*cos(psi*pi/180)
boundslon/boundslat geometry_mod REAL(ngridmx,corner) 弧度 GCM 网格角点,经转换为度后定位 MOLA 子区域。
datadir/mola64.nc 文件系统 NetCDF alt(iim_mola,jjm_mola) m(源码将 int16 转 real) 64 像素/度 MOLA 高程场。

输出

输出 去向 类型/维度 单位 含义
subslope_dist 调用方 / comslope_mod REAL(ngridmx,nslope) fraction 每个 GCM 网格单元中各坡面分箱的比例。
max_crit,max_lon,max_lat 标准输出诊断 REAL 混合 统计到的最大准则绝对值及其 MOLA 经纬位置。

共享状态与副作用

核心逻辑

  1. subslope_mola 中按 64 px/degree 设置 MOLA 网格大小,分配坡度倾角和坡向数组。
  2. 调用 mola(datadir//"/",...) 读取 mola64.ncalt 变量。
  3. mola 将 int16 高程转换为 real topogrid,调用 getslopes_mola32
  4. getslopes_mola32 构造 MOLA 经纬网格,在经向和纬向用中心差分计算地形梯度;经度边界周期处理,极区边界用对跖/半周索引处理。
  5. atan(sqrt(gradx^2+grady^2))*180/pi 得到坡度倾角,用梯度方向推导坡向并规范到 0-360 度。
  6. 对每个 GCM 网格 ig,从 boundslon/boundslat 取西北和东南角,将弧度转为度。
  7. 正常情况下调用 slopes_stat;测试分支 rfz 关闭。
  8. slopes_stat 根据 GCM 经度框是否跨越 0/360 分成普通和跨界两种循环,映射到 MOLA i/j 索引范围。
  9. 对范围内每个 MOLA 点计算 crit=theta*cos(psi*pi/180),落入 def_slope(k) <= crit < def_slope(k+1) 的分箱计数。
  10. 将计数除以统计点数得到比例,并截断到 6 位小数。
  11. subslope_mola 写入 subslope_dist(ig,k);若 nslope==7,用第 4 箱补足总和。

伪代码

allocate theta_mola, psi_mola
read datadir/mola64.nc:alt
topogrid = real(alt)
compute theta_mola, psi_mola from topography gradients

for each GCM cell ig:
    lon1, lat1 = north-west boundary in degrees
    lon2, lat2 = south-east boundary in degrees
    if RFZ test enabled:
        force bin 3 to 1
    else:
        map lon/lat bounds to MOLA index ranges
        for each MOLA point inside the cell:
            val = theta*cos(psi*pi/180)
            increment the bin matching def_slope
        slopes_dist = truncated bin counts / total count
    subslope_dist(ig,:) = slopes_dist

if nslope == 7:
    make bin 4 the residual so all bins sum to 1
print diagnostic max criterion and location
deallocate MOLA arrays

参与的主题流程

主题 参与方式
newstart 坡面数量修改 newstartnslope 分支中重算坡面分布,供后续 restart/start_archive 写出。
坡面物理 生成的 subslope_distcomslope_mod、CO2 凝结、湍流和水循环坡面加权使用。
MOLA 地形数据依赖 直接依赖 datafile_mod 给出的 datadir 和其中的 mola64.nc

写法特点

复现要点

待确认

相关页面