albedocaps.F90
路径
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 等过程使用 |
共享状态与副作用
albedocaps firstcall 会修改 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,再广播所有表和常数。
TES_icecap_albedo:
- 北半球纬度低于 45 deg 或南半球纬度高于 -45 deg 时,不用 TES,直接返回
albedice(icap)。
- 其余位置分别确定纬度、Ls、经度的包围索引;Ls 和经度都支持 0/360 或 -180/180 环绕。
- 先沿时间线性插值得到四个经纬节点值,再做双线性空间插值。
- 按半球乘
TESice_Ncoef 或 TESice_Scoef,最后用 max_icecap_albedo 做上限钳制。
伪代码
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) 是否为历史遗留;本文件未写该数组。
相关页面