albedocaps.F90
快速理解
它做什么: 按 CO₂ 冰状态更新地表短波反照率 psolaralb 和 IR 发射率参考 emisref;被 co2condens 调用(co2condens_mod.F:617)。
基本过程: 裸地 → 多年 CO₂ 冰盖 → 季节性 CO₂ 霜(TES 数据插值或配置值)三层优先级。
关键结果: 坡面反照率和 CO₂ 冰发射率,影响后续短波/长波辐射通量。
路径
LMDZ.MARS\libf\phymars\albedocaps.F90
所属目录/模块
libf\phymars
文件定位
该文件定义 albedocaps_mod 模块,负责在 CO2 凝结主流程中根据地表 CO2 冰状态更新地表短波反照率 psolaralb 和红外发射率参考值 emisref。调用方 co2condens 在每个坡面循环中把当前坡面的 piceco2、perennial_co2ice、psolaralb 传入本例程,随后把返回的 albedo/emissivity 写回坡面数组。
主路径有三层优先级:先用裸地 albedodat/emissiv 初始化;如果 paleoclimate=.true. 且 piceco2_peren>0,用多年 CO2 冰盖反照率和 CO2 冰发射率覆盖;如果当前地表 CO2 霜 piceco2>0,再用 CO2 霜属性覆盖。CO2 霜反照率可来自固定 albedice(icap),也可在 TESicealbedo=.true. 时从 npsc_albedo.nc / spsc_albedo.nc 做 Ls-经纬插值。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
albedocaps_mod |
module | 1 | CO2 冰冠/霜反照率与发射率更新模块 |
max_icecap_albedo |
module variable | 5 | TES 插值反照率的上限,firstcall 时由 max_icecap_albedo 配置键覆盖默认值 |
albedocaps |
subroutine | 10 | 对每个格点按裸地、多年 CO2 冰、当前 CO2 霜顺序设置 psolaralb 与 emisref |
read_TES_icecap_albedo |
subroutine | 141 | 从 datadir 读取南/北半球 TES 极冠反照率 NetCDF 表并广播 |
TES_icecap_albedo |
subroutine | 328 | 对单个格点按 Ls、经度、纬度插值 TES 极冠反照率 |
依赖的模块
| use 模块 | only 列表 | 用途 | 待确认 |
|---|---|---|---|
ioipsl_getin_p_mod |
getin_p |
读取 TESicealbedo、TESice_Ncoef、TESice_Scoef、max_icecap_albedo 配置 |
否 |
geometry_mod |
latitude / latitude, longitude |
albedocaps 用纬度选南北半球;TES_icecap_albedo 用经纬度定位 TES 网格 |
否 |
surfdat_h |
TESicealbedo, TESice_Ncoef, TESice_Scoef, emisice, emissiv, albedice, albedodat, albedo_perennialco2 |
读取/写入地表反照率配置和共享地表参数 | 否 |
paleoclimate_mod |
paleoclimate |
控制多年 CO2 冰盖分支是否生效 | 否 |
datafile_mod |
datadir |
定位 npsc_albedo.nc 与 spsc_albedo.nc |
否 |
netcdf |
nf90_open, NF90_NOWRITE, NF90_NOERR, nf90_strerror, nf90_inq_varid, nf90_get_var, nf90_close |
读取 TES NetCDF 变量 | 否 |
mod_phys_lmdz_para |
is_master |
非 mesoscale 编译下只让 master 进程读取 NetCDF | 否 |
mod_phys_lmdz_transfert_para |
bcast |
非 mesoscale 编译下广播 TES 表和常数 | 否 |
复现风险:TES_icecap_albedo 中 datafile_mod、netcdf、bcast 的 use 在当前例程主体没有实际调用;复现调用图时应以实际 call 为准。
调用的关键例程
| 被调用例程 | 所在模块/文件 | 调用位置 | 作用 |
|---|---|---|---|
getin_p |
ioipsl_getin_p_mod |
79, 86, 91, 97 | 读取 TES 反照率开关、南北半球系数和反照率上限 |
read_TES_icecap_albedo |
本文件 | 100 | firstcall 时加载 TES 网格和南/北半球反照率表 |
TES_icecap_albedo |
本文件 | 129 | TESicealbedo=.true. 且当前格点有 CO2 霜时插值反照率 |
nf90_open / nf90_inq_varid / nf90_get_var / nf90_close |
netcdf |
190-311 | 打开并读取 longitude、latitude、time、albedo 变量 |
abort_physic |
外部错误处理例程 | 196, 209, 218, 228, 237, 268, 282, 292 | TES 文件或变量缺失时中止物理过程 |
bcast |
mod_phys_lmdz_transfert_para |
318-326 | 非 mesoscale 编译下广播 TES 数组和插值常数 |
输入
| 输入 | 来源 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
zls |
co2condens 调用方 |
real scalar | rad | 当前太阳经度,用于 TES 时间维插值 |
ngrid |
调用方 | integer scalar | - | 物理网格列数 |
piceco2(ngrid) |
调用方 | real array | kg/m2 | 当前地表 CO2 冰/霜量;大于 0 时触发 CO2 霜反照率分支 |
piceco2_peren(ngrid) |
调用方 | real array, intent(inout) | kg/m2 | 多年 CO2 冰量;本文件只读取,不修改 |
latitude(ngrid) |
geometry_mod |
real array | rad | 选南北半球和 TES 纬度位置 |
longitude(ngrid) |
geometry_mod |
real array | rad | TES 经度插值位置 |
albedodat(ngrid) |
surfdat_h |
real array | - | 裸地短波反照率 |
emissiv |
surfdat_h |
real scalar | - | 裸地红外发射率 |
albedice(2), emisice(2) |
surfdat_h |
real array | - | 南/北半球 CO2 冰默认反照率与发射率 |
albedo_perennialco2(2) |
surfdat_h |
real array | - | paleoclimate 多年 CO2 冰反照率 |
TESicealbedo, TESice_Ncoef, TESice_Scoef, max_icecap_albedo |
getin_p / surfdat_h / 本模块 |
logical/real | - | TES 极冠反照率开关、南北半球乘数和上限 |
npsc_albedo.nc, spsc_albedo.nc |
datadir |
NetCDF | - | 北/南半球 TES 反照率表 |
输出
| 输出 | 去向 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
psolaralb(ngrid,2) |
调用方 co2condens |
real array, intent(out) | - | 短波反照率两通道;TES 分支把两通道设成同一个插值值 |
emisref(ngrid) |
调用方 co2condens |
real array, intent(out) | - | 地表参考发射率,供后续 co2snow 等过程使用 |
共享状态与副作用
albedocapsfirstcall 会修改surfdat_h中的TESicealbedo、TESice_Ncoef、TESice_Scoef,并设置本模块max_icecap_albedo。firstcall、zls_old、pi、radeg、TES 网格/反照率数组和max_icecap_albedo均为SAVE并THREADPRIVATE。- 读取两个运行时数据文件:
trim(datadir)//"/npsc_albedo.nc"和trim(datadir)//"/spsc_albedo.nc"。 - TES 文件或变量缺失时调用
abort_physic(...,1)中止。 - 多处
write(*,*)输出配置、数据文件和 NetCDF 错误信息。 - 不写源码、不写 restart、不直接改 tracer、温度或质量。
核心逻辑
- 每个线程首次进入
albedocaps时:- 默认
TESicealbedo=.false.,再用getin_p("TESicealbedo",...)覆盖。 - 若启用 TES,读取
TESice_Ncoef和TESice_Scoef,默认均为1.0。 - 读取
max_icecap_albedo,源码默认0.9。 - 调用
read_TES_icecap_albedo读取 TES 经度、纬度、Ls 和反照率表,初始化pi、radeg、zls_old=-999。
- 默认
- 对
ig=1..ngrid:latitude(ig)<0选icap=2(南半球),否则icap=1(北半球,赤道也归北)。- 先设裸地状态:
emisref(ig)=emissiv,psolaralb(ig,:)=albedodat(ig)。 - 若
paleoclimate且piceco2_peren(ig)>0,用albedo_perennialco2(icap)和emisice(icap)覆盖多年 CO2 冰盖状态。 - 若
piceco2(ig)>0,用当前 CO2 霜状态覆盖前面的结果:emisref(ig)=emisice(icap);反照率走 TES 插值或固定albedice(icap)。
read_TES_icecap_albedo:- 非 mesoscale 编译下仅
is_master进程打开 NetCDF。 - 北半球文件读取
longitude、latitude、time、albedo;南半球文件读取latitude、albedo,复用北半球读到的longitude和time。 - 关闭文件后计算
pi=acos(-1.)、radeg=180/pi,再广播所有表和常数。
- 非 mesoscale 编译下仅
TES_icecap_albedo:- 北半球纬度低于 45 deg 或南半球纬度高于 -45 deg 时,不用 TES,直接返回
albedice(icap)。 - 其余位置分别确定纬度、Ls、经度的包围索引;Ls 和经度都支持 0/360 或 -180/180 环绕。
- 先沿时间线性插值得到四个经纬节点值,再做双线性空间插值。
- 按半球乘
TESice_Ncoef或TESice_Scoef,最后用max_icecap_albedo做上限钳制。
- 北半球纬度低于 45 deg 或南半球纬度高于 -45 deg 时,不用 TES,直接返回
伪代码
albedocaps(zls, ngrid, piceco2, piceco2_peren, psolaralb, emisref):
if firstcall:
TESicealbedo = getin("TESicealbedo", default=false)
if TESicealbedo:
TESice_Ncoef = getin("TESice_Ncoef", default=1.0)
TESice_Scoef = getin("TESice_Scoef", default=1.0)
max_icecap_albedo = getin("max_icecap_albedo", default=0.9)
read_TES_icecap_albedo(...)
firstcall = false
for ig in 1..ngrid:
icap = 2 if latitude(ig) < 0 else 1
emisref(ig) = emissiv
psolaralb(ig, :) = albedodat(ig)
if paleoclimate and piceco2_peren(ig) > 0:
psolaralb(ig, :) = albedo_perennialco2(icap)
emisref(ig) = emisice(icap)
if piceco2(ig) > 0:
emisref(ig) = emisice(icap)
if TESicealbedo:
alb = TES_icecap_albedo(zls, ig, icap, ...)
psolaralb(ig, 1) = alb
psolaralb(ig, 2) = alb
else:
psolaralb(ig, :) = albedice(icap)
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| CO2 循环 | co2condens 更新地表 CO2 冰后调用本例程,刷新地表反照率和发射率参考值 |
| 辐射/地表能量收支 | 返回的 psolaralb 影响短波吸收;emisref 影响后续地表发射率处理 |
| 古气候 CO2 冰盖 | paleoclimate 分支允许多年 CO2 冰盖使用独立反照率 |
写法特点
- 自由格式 Fortran 90;含
#ifndef MESOSCALE条件编译。 - firstcall +
SAVE+THREADPRIVATE模式:TES 表每线程保存,非 mesoscale 并行下由 master 读文件后广播。 - TES 表维度硬编码:经度 72、纬度 30、Ls 72;经度步长 5 deg,纬度步长 2 deg,Ls 步长 5 deg。
read_TES_icecap_albedo总是在 firstcall 调用,即使TESicealbedo=.false.。因此即使不使用 TES 插值,当前源码仍要求 TES NetCDF 文件存在。- TES 缺测值注释为
-1,但TES_icecap_albedo没有显式跳过或下限钳制;只在最终结果上限钳到max_icecap_albedo。 piceco2_peren声明为intent(inout),但当前文件只读取,不修改。
复现要点
- 分支覆盖顺序必须保持:裸地初始化 -> paleoclimate 多年 CO2 冰 -> 当前 CO2 霜。当前 CO2 霜优先级最高。
- 半球索引为
latitude<0南半球,否则北半球。 - TES 只用于极区:北纬 >=45 deg、南纬 <=-45 deg;低纬 CO2 霜回退到
albedice(icap)。 - TES 插值按时间先插、空间双线性后插;经度和 Ls 都有环绕处理。
TESice_Ncoef/TESice_Scoef是插值后乘数,之后才应用max_icecap_albedo上限。- 运行时数据依赖
datadir/npsc_albedo.nc与datadir/spsc_albedo.nc,变量名必须包含源码读取的longitude、latitude、time、albedo。
待确认
TESalbn/TESalbs注释说明缺测为-1,当前源码没有缺测保护;复现含缺测区域时需要按源码字面插值还是应回退到albedice,需开发者确认。TESicealbedo=.false.时仍读取 TES 文件是否为有意设计;缺少 TES 文件会在 firstcall 中中止。piceco2_peren的intent(inout)是否为历史遗留;本文件未写该数组。
相关页面
- co2condens:唯一已确认调用方,在 CO2 凝结后按坡面调用本例程。
- co2snow:同一段 CO2 地表后处理链中更新地表发射率的文件页。
- co2-cycle:CO2 循环父级主题页。
- co2-cycle-config:多年 CO2 冰盖反照率配置。
- config-system:
TESicealbedo、TESice_Ncoef、TESice_Scoef、max_icecap_albedo配置项索引。 - surfdat_h:地表共享状态,定义 TES ice albedo 系数、冰/裸地反照率和发射率等参数。
- datafile_mod.md:运行时数据目录。
- paleoclimate_mod.md:古气候开关。