albedocaps.F90

路径

LMDZ.MARS\libf\phymars\albedocaps.F90

所属目录/模块

libf\phymars

文件定位

该文件定义 albedocaps_mod 模块,负责在 CO2 凝结主流程中根据地表 CO2 冰状态更新地表短波反照率 psolaralb 和红外发射率参考值 emisref。调用方 co2condens 在每个坡面循环中把当前坡面的 piceco2perennial_co2icepsolaralb 传入本例程,随后把返回的 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 霜顺序设置 psolaralbemisref
read_TES_icecap_albedo subroutine 141 datadir 读取南/北半球 TES 极冠反照率 NetCDF 表并广播
TES_icecap_albedo subroutine 328 对单个格点按 Ls、经度、纬度插值 TES 极冠反照率

依赖的模块

use 模块 only 列表 用途 待确认
ioipsl_getin_p_mod getin_p 读取 TESicealbedoTESice_NcoefTESice_Scoefmax_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.ncspsc_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_albedodatafile_modnetcdfbcastuse 在当前例程主体没有实际调用;复现调用图时应以实际 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 打开并读取 longitudelatitudetimealbedo 变量
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 等过程使用

共享状态与副作用

核心逻辑

  1. 每个线程首次进入 albedocaps 时:
    • 默认 TESicealbedo=.false.,再用 getin_p("TESicealbedo",...) 覆盖。
    • 若启用 TES,读取 TESice_NcoefTESice_Scoef,默认均为 1.0
    • 读取 max_icecap_albedo,源码默认 0.9
    • 调用 read_TES_icecap_albedo 读取 TES 经度、纬度、Ls 和反照率表,初始化 piradegzls_old=-999
  2. ig=1..ngrid
    • latitude(ig)<0icap=2(南半球),否则 icap=1(北半球,赤道也归北)。
    • 先设裸地状态:emisref(ig)=emissivpsolaralb(ig,:)=albedodat(ig)
    • paleoclimatepiceco2_peren(ig)>0,用 albedo_perennialco2(icap)emisice(icap) 覆盖多年 CO2 冰盖状态。
    • piceco2(ig)>0,用当前 CO2 霜状态覆盖前面的结果:emisref(ig)=emisice(icap);反照率走 TES 插值或固定 albedice(icap)
  3. read_TES_icecap_albedo
    • 非 mesoscale 编译下仅 is_master 进程打开 NetCDF。
    • 北半球文件读取 longitudelatitudetimealbedo;南半球文件读取 latitudealbedo,复用北半球读到的 longitudetime
    • 关闭文件后计算 pi=acos(-1.)radeg=180/pi,再广播所有表和常数。
  4. TES_icecap_albedo
    • 北半球纬度低于 45 deg 或南半球纬度高于 -45 deg 时,不用 TES,直接返回 albedice(icap)
    • 其余位置分别确定纬度、Ls、经度的包围索引;Ls 和经度都支持 0/360 或 -180/180 环绕。
    • 先沿时间线性插值得到四个经纬节点值,再做双线性空间插值。
    • 按半球乘 TESice_NcoefTESice_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 冰盖使用独立反照率

写法特点

复现要点

待确认

相关页面