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/tauy、alphax/alphay、transx/transy、pxo/pyo。logic_mod 的 fxyhypb/ysinus 决定 inigeom 使用哪一类水平映射。
Zoom 控制参数
| 状态 | 来源/写入者 | 作用 |
|---|---|---|
clon, clat |
Mars defrun_new 从 run.def 读,默认 63/0 |
zoom 中心经纬度,单位为度。 |
grossismx, grossismy |
defrun_new 从 run.def 读,默认 1/1 |
经向/纬向放大系数;小于 1 会触发警告。 |
alphax, alphay |
defrun_new 派生 1 - 1/grossism* |
非双曲 fxy 分支的正弦扰动幅度。 |
dzoomx, dzoomy |
defrun_new 从 run.def 读,默认 0/0 |
双曲 zoom 区域的经纬范围。 |
taux, tauy |
defrun_new 从 run.def 读,默认 2/2 |
双曲 zoom 陡峭度。 |
fxyhypb |
defrun_new 从 run.def 读,默认 .false. |
.true. 时进入 fxhyp/fyhyp 双曲映射。 |
ysinus |
Mars defrun_new 中强制 .false. |
COMMON 保留 sinus(latitude) 旧分支;Mars 标准路径不会启用。 |
transx, transy, pxo, pyo |
inigeom 计算/写回 |
非双曲正弦扰动分支的平移和相位参数。 |
Mars defrun_new 还有两个门控:
- 若
grossismx==1且grossismy==1,代码把fxyhypb强制设为.false.,普通无 zoom 路径走非双曲 regular 分支。 - 若存在 zoom 而
fxyhypb=.false.,Mars 版本会停止并要求在run.def中设置fxyhypb;因此 Mars 实用 zoom 路径应按双曲映射复现。
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*=1,alpha*=0。 |
Mars 无 zoom 标准路径可达。 |
fxyhypb |
fyhyp 和 fxhyp |
双曲 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/2,rlatu(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/dX、cv=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 面积加权会依赖 aire 和 g。 |
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*180、longitude=rlonv/pi*180,以及 cu/cv/aire 等 metric 字段。读取或复现 start_archive.nc 时,不能只看 controle 表;坐标和 metric 数组本身也是几何约定的一部分。
Mars 工具链使用点
| 使用点 | 调用/字段 | 关系 |
|---|---|---|
COMMON 串行 gcm.F90 |
CALL inigeom 后 CALL 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 结果。 |
复现清单
- 记录当前编译维度
iim/jjm/llm与dimensions.h/paramet.h。 - 从
run.def或 archive/start 控制恢复clon/clat/grossismx/grossismy/dzoomx/dzoomy/taux/tauy/fxyhypb。 - 按 Mars
defrun_new门控修正:无 zoom 时fxyhypb=.false.;有 zoom 时要求fxyhypb=.true.;ysinus=.false.。 - 执行
iniconst后再执行inigeom,因为rad/g/omeg/pi等常量参与面积和 Coriolis 计算。 - 确认
rlonu/rlonv周期端点、rlatu两极、aire/cu/cv与 archive 或 restart 中保存的值。 - 跨网格重建时,把
datareadnc/lect_start_archive的水平插值结果视为依赖当前rlonu/rlatv/rlonv/rlatu的派生结果,不应与旧网格逐点比较。
风险和待确认
fxy.F和fxysinus.F的 include 文件位于libf/grid,构建系统如何传递 include path 需由构建页或实际编译命令确认。fext和constang的物理单位没有在inigeom.F内完整说明;本页只记录源码公式,具体动力方程含义需结合使用算子解释。- Mars
defrun_new在非初始化校验分支使用局部/历史变量名和fxyhypbb拼写,本文只把它作为“run.def 与 start/control 必须一致”的校验路径,不把变量名等同于最终logic_mod%fxyhypb。