inigeom zoom/map 几何约定

范围

COMMON 源码:

LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\inigeom.F
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\serre_mod.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\fxy.F
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\fxysinus.F
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\comgeom.h
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\comgeom2.h
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\grid\fxy_new.h
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\grid\fxy_sin.h

Mars 侧使用依据:

LMDZ.MARS\libf\dynphy_lonlat\phymars\defrun_new.F
LMDZ.MARS\libf\dynphy_lonlat\phymars\newstart.F
LMDZ.MARS\libf\dynphy_lonlat\phymars\start2archive.F
LMDZ.MARS\libf\dynphy_lonlat\phymars\ini_archive.F
LMDZ.MARS\libf\dynphy_lonlat\phymars\datareadnc.F

本页不是 inigeom.F 的单文件页。单文件 inventory、数组清单和逐步面积计算见 dyn3d_common/inigeom。这里记录从 Mars 配置、zoom 参数、水平映射到 archive/header/physics 使用之间的约定。

总体链路

run.def 或 start/archive control
  -> Mars defrun_new
  -> COMMON logic_mod + serre_mod
  -> inigeom
  -> comgeom2.h 几何数组
  -> COMMON gcm/gcm_p iniphysiq
  -> Mars newstart/start2archive iniphysiq
  -> Mars ini_archive 写 start_archive.nc header/geometry
  -> Mars datareadnc/lect_start_archive 水平插值和守恒换算

serre_mod.F90 只保存 zoom 和映射辅助状态:clon/clat/grossismx/grossismy/dzoomx/dzoomy/taux/tauyalphax/alphaytransx/transypxo/pyologic_modfxyhypb/ysinus 决定 inigeom 使用哪一类水平映射。

Zoom 控制参数

状态 来源/写入者 作用
clon, clat Mars defrun_newrun.def 读,默认 63/0 zoom 中心经纬度,单位为度。
grossismx, grossismy defrun_newrun.def 读,默认 1/1 经向/纬向放大系数;小于 1 会触发警告。
alphax, alphay defrun_new 派生 1 - 1/grossism* 非双曲 fxy 分支的正弦扰动幅度。
dzoomx, dzoomy defrun_newrun.def 读,默认 0/0 双曲 zoom 区域的经纬范围。
taux, tauy defrun_newrun.def 读,默认 2/2 双曲 zoom 陡峭度。
fxyhypb defrun_newrun.def 读,默认 .false. .true. 时进入 fxhyp/fyhyp 双曲映射。
ysinus Mars defrun_new 中强制 .false. COMMON 保留 sinus(latitude) 旧分支;Mars 标准路径不会启用。
transx, transy, pxo, pyo inigeom 计算/写回 非双曲正弦扰动分支的平移和相位参数。

Mars defrun_new 还有两个门控:

inigeom 分支

条件 调用 输出含义 Mars 可达性
.not.fxyhypb .and. ysinus fxysinus,包含 libf/grid/fxy_sin.h 纬度由 asin 型公式构造,regular longitude。 Mars defrun_new 强制 ysinus=.false.,标准路径不可达。
.not.fxyhypb .and. .not.ysinus inigeom 先 Newton 迭代 transx/transy,再调用 fxy,包含 libf/grid/fxy_new.h 经/纬向使用带 alphax/alphay 的正弦扰动映射;无 zoom 时 grossism*=1alpha*=0 Mars 无 zoom 标准路径可达。
fxyhypb fyhypfxhyp 双曲 zoom 映射;helper 会检查放大、范围、陡峭度和中心顺序条件。 Mars zoom 标准路径。

fxy_new.h 中的非双曲函数可按下列关系复现:

fx = ripx + transx + alphax*sin(ripx + transx - pxo) - pi
fxprim = 2*pi/iim * (1 + alphax*cos(ripx + transx - pxo))
fy = (bigy + transy + alphay*sin(bigy + transy - pyo))/2 - pi/2
fyprim = pi/jjm * (1 + alphay*cos(bigy + transy - pyo))

fxy_sin.h 的纬度分支使用 fy=asin(1+2*((1-rj)/jjm)) 和相应导数。该 include 位于 libf/grid,不是 dyn3d_common 本目录;复核构建或 include path 时要按源码树实际位置确认。

几何输出约定

输出 维度/网格 使用方 复现要点
rlonu, rlonv U/V 经度,rad iniphysiq, ini_archive, datareadnc, archive 插值链 iip1 端点复制第 1 点形成周期闭合。
rlatu, rlatv U/V 纬度,rad iniphysiq, ini_archive, datareadnc, newstart 经纬选择 rlatu(1)=pi/2rlatu(jjp1)=-pi/2,数组由北向南递减。
xprimu/xprimv/yprimu/yprimv 映射导数 面积和 metric 计算 极点 yprimu 置 0。
aire, aireu, airev, aireij1..4 scalar/U/V/四分面积 动力算子、iniphysiq, ini_archive, newstart/start2archive 质量换算 源码先算四分 cell,再汇总 scalar/U/V/Z 点面积。
cu, cv, cuv, cvu C-grid metric 动力算子、iniphysiq, ini_archive 近似读法为 cu=rad*cos(lat)*dx/dXcv=rad*dy/dY;源码用四分 metric 汇总。
alpha1..4 四分面积权重 插值/差分权重 aireij* / aire 派生。
unsaire*, unscu2, unscv2, *gam* 逆面积、逆 metric 和耗散幂权重 动力微分和耗散算子 niter==2 时对应 gamdi_* 为 0,否则 coefdis/(niter-2)
airesurg aire/g 质量/压力换算 Mars lect_start_archive/newstart/start2archive 中总质量、CO2 ice 或 pressure 面积加权会依赖 aireg
fext V/Z 点 Coriolis extensive force 旋度/位势涡度相关算子 源码计算 airez*sin(rlatv)*2*omeg,物理单位需结合动力方程解释。
constang angular momentum helper 守恒诊断 源码为 rad*omeg*cu*cos(rlatu),两极置 0。
apoln, apols 两极面积和 极点处理和守恒诊断 通过 SSUM(iim, aire(...)) 对北/南极行求和。

面积和 metric 的可复现读法:

1. 先从所选水平映射得到 rlon/rlat 和映射导数。
2. 对每个 scalar cell 计算四个 quarter-cell 面积和 quarter metric。
3. 周期复制 iip1 端点。
4. 汇总 scalar、U、V、Z 网格面积。
5. 派生 alpha 权重、逆面积、耗散 gamma 权重和 metric 比值。
6. 两极特殊处理,最后计算 fext 和 constang。

Mars archive/header 使用

ini_archive.F 把 zoom 与几何写入 start_archive.nc header:

tab_cntrl 下标 含义
19 clon
20 clat
21 grossismx
22 grossismy
23 fxyhypb 标志,.true. 写 1,.false. 写 0
24 dzoomx
25 dzoomy
26 非双曲分支下的 ysinus 标志

同一例程还定义并写出 rlonu/rlatu/rlonv/rlatv,再写面向显示的 latitude=rlatu/pi*180longitude=rlonv/pi*180,以及 cu/cv/aire 等 metric 字段。读取或复现 start_archive.nc 时,不能只看 controle 表;坐标和 metric 数组本身也是几何约定的一部分。

Mars 工具链使用点

使用点 调用/字段 关系
COMMON 串行 gcm.F90 CALL inigeomCALL iniphysiq(... rlatu, rlatv, rlonu, rlonv, aire, cu, cv, ...) 标准 3D run 中 physics 初始化拿到动力几何。
COMMON 并行 gcm.F 同样在 inigeom 后把几何传给 iniphysiq 并行入口共享同一 COMMON 几何约定。
Mars newstart.F defrun_new -> iniconst -> inigeom -> iniphysiq 从 archive 或 start 重建时,先按当前 run.def/control 重建几何,再进行 surface/archive 变量投影和 restart 写出。
Mars start2archive.F dynetat0/phyetat0 后再次 defrun_new(.FALSE.) -> inigeom -> iniphysiq 将当前 start/startfi 合成 archive 前,确保 COMMON 几何与物理初始化状态一致。
Mars ini_archive.F tab_cntrl(19:26)、坐标、cu/cv/aire archive header 保存 zoom 控制和实际几何数组。
Mars datareadnc.F grid_noro1(... rlonv, rlatu, ...)avg_horiz(... rlonv, rlatu, ...)interp_horiz(... rlonu, rlatv) surface.nc 的地形、热惯量等字段按当前几何边界重采样到动力网格。
Mars newstart.F 局部选择和质量换算 使用 rlatu/rlonv 选取格点,使用 aire 汇总 ps 和 surface CO2 ice 用户交互或 archive 重建中,格点定位和总量守恒都依赖 inigeom 结果。

复现清单

  1. 记录当前编译维度 iim/jjm/llmdimensions.h/paramet.h
  2. run.def 或 archive/start 控制恢复 clon/clat/grossismx/grossismy/dzoomx/dzoomy/taux/tauy/fxyhypb
  3. 按 Mars defrun_new 门控修正:无 zoom 时 fxyhypb=.false.;有 zoom 时要求 fxyhypb=.true.ysinus=.false.
  4. 执行 iniconst 后再执行 inigeom,因为 rad/g/omeg/pi 等常量参与面积和 Coriolis 计算。
  5. 确认 rlonu/rlonv 周期端点、rlatu 两极、aire/cu/cv 与 archive 或 restart 中保存的值。
  6. 跨网格重建时,把 datareadnc/lect_start_archive 的水平插值结果视为依赖当前 rlonu/rlatv/rlonv/rlatu 的派生结果,不应与旧网格逐点比较。

风险和待确认

相关页面