geticecover.F90
快速理解
它做什么: 用 Titus/TES 极冠边界经度-季节谐波估算格点是否在 CO₂ 季节极冠内。被 physiq 在 tituscap 时调用(physiq_mod.F:2301)。
基本过程: 输入经度/纬度/Ls → 逐点调 isitice → 输出 0 或 1。
关键结果: icecover 掩膜,覆盖 qsurf(:,igcm_co2) 供 CO₂ 凝结使用。
路径
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 组年份;本页按数组维度和循环次数描述,不额外推断年份含义。