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.nc 的 alt 高程场,计算 MOLA 网格上的坡度倾角 theta_mola 和坡向 psi_mola,再按 GCM 网格边界统计每个坡面分箱的面积比例。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
subslope_mola_mod |
module |
1 |
封装 MOLA 坡面统计入口和内部辅助例程。 |
subslope_mola |
subroutine |
7 |
对每个 GCM 网格单元调用 MOLA 坡面统计,输出 subslope_dist。 |
mola |
subroutine |
115 |
读取 mola64.nc 的 alt 高程,调用 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_west、south_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 中修改 nslope 且 ngridmx /= 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 经纬位置。 |
共享状态与副作用
- 读取
datadir/mola64.nc;打开或读取失败时打印错误并 stop。
- 分配两个大数组
theta_mola(iim_mola,jjm_mola) 和 psi_mola(iim_mola,jjm_mola),其中 resol=64,jjm_mola=180*64,iim_mola=2*jjm_mola。
subslope_mola 结束前释放 theta_mola/psi_mola。
- 当
rfz=.false. 时走正常 MOLA 统计;源码保留 rfz 特殊测试分支但常量关闭。
- 若
nslope==7,将第 4 个分箱重设为 1-sum(other bins),用于修正截断后的总和。
核心逻辑
- 在
subslope_mola 中按 64 px/degree 设置 MOLA 网格大小,分配坡度倾角和坡向数组。
- 调用
mola(datadir//"/",...) 读取 mola64.nc 的 alt 变量。
mola 将 int16 高程转换为 real topogrid,调用 getslopes_mola32。
getslopes_mola32 构造 MOLA 经纬网格,在经向和纬向用中心差分计算地形梯度;经度边界周期处理,极区边界用对跖/半周索引处理。
- 用
atan(sqrt(gradx^2+grady^2))*180/pi 得到坡度倾角,用梯度方向推导坡向并规范到 0-360 度。
- 对每个 GCM 网格
ig,从 boundslon/boundslat 取西北和东南角,将弧度转为度。
- 正常情况下调用
slopes_stat;测试分支 rfz 关闭。
slopes_stat 根据 GCM 经度框是否跨越 0/360 分成普通和跨界两种循环,映射到 MOLA i/j 索引范围。
- 对范围内每个 MOLA 点计算
crit=theta*cos(psi*pi/180),落入 def_slope(k) <= crit < def_slope(k+1) 的分箱计数。
- 将计数除以统计点数得到比例,并截断到 6 位小数。
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 坡面数量修改 |
在 newstart 的 nslope 分支中重算坡面分布,供后续 restart/start_archive 写出。 |
| 坡面物理 |
生成的 subslope_dist 被 comslope_mod、CO2 凝结、湍流和水循环坡面加权使用。 |
| MOLA 地形数据依赖 |
直接依赖 datafile_mod 给出的 datadir 和其中的 mola64.nc。 |
写法特点
- 模块内私有辅助例程没有显式
PRIVATE/PUBLIC 限定,默认公开。
- MOLA 网格分辨率在
subslope_mola 和 slopes_stat 中都硬编码为 64。
slopes_stat 将比例截断到 6 位小数;nslope==7 时再用中间分箱补残差。
crit 当前使用有符号坡向投影 theta*cos(psi*pi/180),不是单纯坡度倾角。
复现要点
- 运行前必须有
datadir/mola64.nc,且变量名必须为 alt。
boundslon/boundslat 必须已经由几何初始化填好,并以弧度存储。
def_slope 应覆盖 crit 的可能范围;否则会出现 “some slopes within the square are out of criteria” 警告。
ngridmx==1 的 1D 路径在 newstart 中不会调用本例程。
待确认
regular_lonlat_mod 中多个导入方向常量未使用,是否为旧版本残留。
- 极区边界差分的对跖索引公式是否只针对全球规则 MOLA 网格。
crit=theta*cos(psi*pi/180) 的物理解释需结合坡面辐射/坡向约定确认。
- 当
nb_slopes==0 时源码没有显式保护,理论上会除零;是否由网格边界和 MOLA 分辨率保证至少一个点。
相关页面