comgeomfi_h.F90

路径

LMDZ.MARS\libf\phymars\comgeomfi_h.F90

所属目录/模块

libf\phymars

文件定位

comgeomfi_h.F90 定义 comgeomfi_h,是 phymars 中保存物理网格经纬度三角函数的共享几何缓存模块。它不保存原始 longitudelatitudecell_area,而是在初始化后由调用方传入物理网格经纬度数组,并把每个格点的 sin(lat)cos(lat)sin(lon)cos(lon) 缓存在 sinlat/coslat/sinlon/coslon 中。

这个模块的复现意义在于:太阳天顶角、近红外 CO2 吸收、尘埃顶高经验式和 1D Coriolis 参数都读取这些缓存值。若只重建了 geometry_mod 的经纬度而没有执行 ini_fillgeom,下游物理仍会读到未填充的 comgeomfi_h 数组。

定义的符号

符号 类型 行号 作用
comgeomfi_h module 2 保存物理网格经纬度三角函数缓存
sinlon real allocatable save module variable 6 每个物理格点经度的正弦
coslon real allocatable save module variable 7 每个物理格点经度的余弦
sinlat real allocatable save module variable 8 每个物理格点纬度的正弦
coslat real allocatable save module variable 9 每个物理格点纬度的余弦
ini_comgeomfi_h subroutine 15 ngrid 分配四个几何缓存数组
end_comgeomfi_h subroutine 28 若数组已分配则逐个释放
ini_fillgeom subroutine 39 用传入的纬度、经度数组填充四个三角函数缓存

依赖的模块

use 模块 only 列表 用途 待确认
- 本模块没有 use 依赖 -

调用的关键例程

被调用例程 所在模块/文件 调用位置 作用
sin Fortran intrinsic comgeomfi_h.F90 行 47、49 计算纬度和经度正弦
cos Fortran intrinsic comgeomfi_h.F90 行 48、50 计算纬度和经度余弦

输入

输入 来源 类型/维度 单位 含义
ngrid phys_state_var_initini_fillgeom 调用方 integer scalar - 物理网格列数,也是四个缓存数组长度
plat(ngrid) GCM: geometry_mod::latitude;1D: init_testphys1d_mod 本地 latitude real array rad 每个物理格点纬度
plon(ngrid) GCM: geometry_mod::longitude;1D: init_testphys1d_mod 本地 longitude real array rad 每个物理格点经度
parea(ngrid) GCM: geometry_mod::cell_area;1D: (/1.0/) real array m2,1D 为占位值 传入接口保留的网格面积;本文件源码没有读取该参数

输出

输出 去向 类型/维度 单位 含义
sinlat(ngrid) physiq_mod.Fnirco2abs.Faeropacity_mod.F、1D 初始化 real allocatable save array - sin(latitude) 缓存
coslat(ngrid) physiq_mod.Fnirco2abs.F real allocatable save array - cos(latitude) 缓存
sinlon(ngrid) physiq_mod.Fnirco2abs.F real allocatable save array - sin(longitude) 缓存
coslon(ngrid) physiq_mod.Fnirco2abs.F real allocatable save array - cos(longitude) 缓存

共享状态与副作用

核心逻辑

  1. phys_state_var_init_mod.F90 行 40 导入 ini_comgeomfi_h,end_comgeomfi_h,行 135-137 先调用 end_comgeomfi_h,再以当前 ngrid 调用 ini_comgeomfi_h(ngrid) 分配缓存。
  2. GCM lon-lat 初始化路径 dynphy_lonlat/phymars/iniphysiq_mod.F90 行 20 导入 ini_fillgeom,行 21-23 从 geometry_mod 读取 cell_arealongitudelatitude,行 75 在 phys_state_var_init(...) 后调用 ini_fillgeom(klon_omp,latitude,longitude,cell_area)
  3. 1D 路径 dyn1d/init_testphys1d_mod.F90 行 415、417 先把纬度和经度从度转换为弧度,行 430 调用 phys_state_var_init(...) 分配状态,行 431 调用 ini_fillgeom(1,latitude,longitude,(/1.0/)) 填充单列缓存。
  4. ini_fillgeomig=1..ngrid 循环,依次写入 sinlat(ig)=sin(plat(ig))coslat(ig)=cos(plat(ig))sinlon(ig)=sin(plon(ig))coslon(ig)=cos(plon(ig))
  5. 下游 physiq_mod.F 行 1017、nirco2abs.F 行 216 把这四个数组传给 solangsolang.F 行 101-104 用 psilat/pcolat/pcolon/psilon 组合太阳几何并输出 pmu0
  6. aeropacity_mod.F 行 353 单独读取 sinlat,用 60. -22.*sinlat(ig)**2 设置 topdust0 的纬向依赖。
  7. 1D 初始化行 607 读取 sinlat(1),计算 ptif = 2.*omeg*sinlat(1)

伪代码

module comgeomfi_h:
    keep threadprivate arrays:
        sinlon, coslon, sinlat, coslat

ini_comgeomfi_h(ngrid):
    allocate sinlat(ngrid)
    allocate coslat(ngrid)
    allocate sinlon(ngrid)
    allocate coslon(ngrid)

end_comgeomfi_h:
    if each array is allocated:
        deallocate it

ini_fillgeom(ngrid, plat, plon, parea):
    for ig from 1 to ngrid:
        sinlat(ig) = sin(plat(ig))
        coslat(ig) = cos(plat(ig))
        sinlon(ig) = sin(plon(ig))
        coslon(ig) = cos(plon(ig))

参与的主题流程

主题 参与方式
物理状态初始化 phys_state_var_init 分配/重分配四个几何缓存数组
动力-物理初始化 iniphysiq_modgeometry_mod 取得物理网格经纬度并调用 ini_fillgeom
1D testphys 1D 初始化把用户纬度/经度转弧度后填充单列缓存,并用 sinlat(1) 计算 Coriolis 参数
太阳几何 / 辐射 physiq_modnirco2abs 将四个缓存数组传入 solang 计算太阳天顶角余弦和日照比例
尘埃光学厚度 aeropacity_modsinlat 的纬向依赖设置 topdust0

写法特点

复现要点

待确认

相关页面