geticecover.F90
路径
LMDZ.MARS\libf\phymars\geticecover.F90
所属目录 / 模块
libf\phymars
文件定位
geticecover.F90 定义 geticecover_mod,用 Titus/TES 极冠边界的经度-季节谐波系数估算给定物理网格点是否位于南北 CO2 季节性极冠内。主入口 geticecover 接收每个网格点的经度、纬度和太阳经度 Ls,逐点调用内部函数 isitice,输出 icecover(ig)=0. 或 1.。
在当前源码搜索中,唯一外部调用点位于 physiq_mod.F 的 CO2 凝结段:当 tituscap 为真时,physiq 在调用 co2condens 之前用 geticecover 覆盖 qsurf_tmp(:,igcm_co2),随后乘以 10000.。因此这个文件不是一般水冰覆盖诊断,而是可选的 Titus 观测 CO2 季节极冠掩膜入口。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
geticecover_mod |
module |
1 |
包含极冠边界判定入口和内部谐波拟合函数。 |
geticecover |
subroutine |
7 |
遍历 ngrid 个网格点,把 isitice(ls,lon,lat) 的 0/1 判定写入 icecover(:)。 |
isitice |
real function |
26 |
按纬度带选择是否调用南/北极冠边界函数,并返回该点是否在极冠侧。 |
nplatcrocus |
real function |
43 |
用北半球 40 项谐波和 3 个 TES 年系数估算北极冠边界纬度。 |
splatcrocus |
real function |
176 |
用南半球 60 项谐波和 2 个 TES 年系数估算南极冠边界纬度。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
| 无 |
- |
文件没有 use 语句;只使用 Fortran 内建 acos、cos、sin、dot_product。 |
否 |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
isitice |
geticecover.F90 |
geticecover 第 22 行 |
对单个经纬度点返回 0/1 冰盖覆盖标记。 |
splatcrocus |
geticecover.F90 |
isitice 第 36 行 |
南纬 lat<=-40. 时计算南极冠边界。 |
nplatcrocus |
geticecover.F90 |
isitice 第 39 行 |
北纬 lat>=40. 时计算北极冠边界。 |
geticecover |
physiq_mod.F |
第 2301 行 |
tituscap 为真时,用观测极冠掩膜覆盖 CO2 地表储量临时场。 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
ngrid |
调用方 |
INTEGER |
grid point count |
本次物理列数。 |
ls |
调用方;physiq 中为 180.*zls/pi |
REAL |
degree |
太阳经度,源码内部再乘 acos(-1.)/180. 转弧度。 |
lontab(:) |
调用方;physiq 中为 180.*longitude/pi |
REAL(ngrid) |
degree east |
每个网格点经度。 |
lattab(:) |
调用方;physiq 中为 180.*latitude/pi |
REAL(ngrid) |
degree |
每个网格点纬度。 |
tituscap |
callkeys_mod / conf_phys.F |
logical switch |
- |
默认 .false.;conf_phys.F 通过 getin_p("tituscap",tituscap) 从配置读取,控制 physiq 是否调用本模块。 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
icecover(:) |
调用方 |
REAL(ngrid) |
binary mask |
0. 表示不在极冠掩膜内,1. 表示在极冠掩膜内。 |
qsurf_tmp(:,igcm_co2) |
physiq_mod.F 调用后处理 |
REAL(ngrid) |
model surface tracer storage scale |
physiq 在 tituscap 分支中把 icecover 赋给该字段,并乘以 10000. 后交给后续 CO2 凝结路径。 |
共享状态与副作用
geticecover_mod 不定义保存型 module 变量,不读写文件,不打印日志,也不直接读取配置。它的副作用限于写入 icecover(:) 实参。
共享状态发生在调用侧:tituscap 是 callkeys_mod 中的 logical, save 变量,并声明为 OpenMP THREADPRIVATE;conf_phys.F 默认将其设为 .false.,再从 callphys.def 风格配置读取。physiq_mod.F 只在 IF (tituscap) 分支中调用本模块。
核心逻辑
geticecover 先把整个 icecover(:) 清零。
- 对每个网格点
ig=1,ngrid,调用 isitice(ls,lontab(ig),lattab(ig))。
isitice 对中低纬做快速跳过:-40 < lat < 40 时不调用任何边界函数,保持 0.。
- 当
lat<=-40. 时,计算南极冠边界 splatcrocus(ls,lon);若网格纬度更靠南,即 lat <= splatcrocus,返回 1.。
- 当
lat>=40. 时,计算北极冠边界 nplatcrocus(ls,lon);若网格纬度更靠北,即 lat >= nplatcrocus,返回 1.。
nplatcrocus 用 40 项 gen1/gen2 谐波、3 组 TES 年系数和 3 个常数项计算 3 条边界线,再取平均。
splatcrocus 用 60 项 gen1/gen2 谐波、2 组 TES 年系数和 2 个常数项计算 2 条边界线,再取平均。
伪代码
icecover[:] = 0
for each grid point ig:
if latitude <= -40:
south_edge = splatcrocus(ls, longitude)
if latitude <= south_edge:
icecover[ig] = 1
else if latitude >= 40:
north_edge = nplatcrocus(ls, longitude)
if latitude >= north_edge:
icecover[ig] = 1
else:
icecover[ig] = 0
in physiq, when tituscap is true:
geticecover(..., qsurf_tmp[:, igcm_co2])
qsurf_tmp[:, igcm_co2] *= 10000
参与的主题流程
| 主题 |
参与方式 |
| CO2 循环 |
在 tituscap 可选分支中,用 Titus/TES 观测极冠边界覆盖 CO2 地表冰临时场,再进入 co2condens 前处理。 |
| physiq CO2 调用点 |
physiq 第 11 段 CO2 凝结前置步骤;该页已记录 tituscap -> geticecover -> qsurf_tmp(co2) 的顺序。 |
| phymars 核心物理模块目录 |
属于 libf\phymars 的 CO2 地表/极冠支撑文件。 |
写法特点
- 文件没有
private 语句,因此 module 内的 geticecover、isitice、nplatcrocus、splatcrocus 在 Fortran 默认规则下都是 public;当前外部只搜索到 geticecover 被 physiq_mod.F 使用。
- 北半球和南半球边界函数都把
Ls 和经度转换为弧度后,按 cos(quan) 与 sin(quan) 对硬编码 TES 系数做 DOT_PRODUCT。
- 源码注释保留了 T.N. Titus 2005 LPSC 摘要的引用说明,并标注 A. Spiga 在 2011 年做了适配。
- 两个边界函数中都有被注释掉的
[-90,90] 钳制逻辑;当前实际运行不钳制,isitice 直接用未钳制边界比较。
- 文件尾部有一个完整但被注释掉的
PROGRAM main 测试片段,用固定纬度列表和 Ls=0..360 的步进打印掩膜。
复现要点
- 传入
ls、lon、lat 必须是度;physiq_mod.F 已从弧度转为度后再调用。若直接用弧度调用,谐波相位会错误。
- 中低纬
-40 < lat < 40 永远返回 0.,不会计算边界函数。
- 北半球判定方向是
lat >= nplatcrocus;南半球判定方向是 lat <= splatcrocus。
tituscap 默认关闭;复现 physiq 主流程中的本模块效果时必须确认配置确实把 tituscap 设为真。
physiq 调用后把 0/1 掩膜乘以 10000.,这一步不在 geticecover 内部。单独复现文件页逻辑时不要把 icecover 误解成最终 qsurf_tmp 量级。
- 复现风险:南/北边界函数注释中都写有边界钳制代码,但当前源码没有启用;若重新实现时擅自钳制到
[-90,90],极区边界判定可能和原模型不同。
待确认
qsurf_tmp(:,igcm_co2) * 10000. 的物理单位或经验量级没有在本文件中说明;本页只记录 physiq_mod.F 的字面调用后处理。
- Titus 系数表注释中南、北函数都写 “TES year 1”,但北半球实际平均 3 组年份、南半球实际平均 2 组年份;本页按数组维度和循环次数描述,不额外推断年份含义。
相关页面