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 内建 acoscossindot_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 physiqtituscap 分支中把 icecover 赋给该字段,并乘以 10000. 后交给后续 CO2 凝结路径。

共享状态与副作用

geticecover_mod 不定义保存型 module 变量,不读写文件,不打印日志,也不直接读取配置。它的副作用限于写入 icecover(:) 实参。

共享状态发生在调用侧:tituscapcallkeys_mod 中的 logical, save 变量,并声明为 OpenMP THREADPRIVATEconf_phys.F 默认将其设为 .false.,再从 callphys.def 风格配置读取。physiq_mod.F 只在 IF (tituscap) 分支中调用本模块。

核心逻辑

  1. geticecover 先把整个 icecover(:) 清零。
  2. 对每个网格点 ig=1,ngrid,调用 isitice(ls,lontab(ig),lattab(ig))
  3. isitice 对中低纬做快速跳过:-40 < lat < 40 时不调用任何边界函数,保持 0.
  4. lat<=-40. 时,计算南极冠边界 splatcrocus(ls,lon);若网格纬度更靠南,即 lat <= splatcrocus,返回 1.
  5. lat>=40. 时,计算北极冠边界 nplatcrocus(ls,lon);若网格纬度更靠北,即 lat >= nplatcrocus,返回 1.
  6. nplatcrocus 用 40 项 gen1/gen2 谐波、3 组 TES 年系数和 3 个常数项计算 3 条边界线,再取平均。
  7. 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 地表/极冠支撑文件。

写法特点

复现要点

待确认

相关页面