guide 配置与初始化约定

guide_init 是 nudging(松弛逼近)子系统的唯一入口,负责读取全部配置参数、打开 NetCDF 文件确定垂直层数、分配所有工作数组并加载第一个时间片。串行版 guide_moddyn3d/guide_mod.F90)和并行版 guide_p_moddyn3dpar/guide_p_mod.F90)共享几乎相同的参数集合,但并行版额外支持 guide_plevs 三级压力坐标系选择,并在数组分配和索引上适配域分解。

调用链

ok_guidelogic_mod 中的全局逻辑开关,由 conf_gcm 通过 getin('ok_guide',ok_guide)run.def 读取,默认 .FALSE.。在 当前源码中,leapfrog / leapfrog_pguide_main(itau,ucov,vcov,teta,q,masse,ps) 的活动调用位于 #ifdef CPP_IOIPSLplanet_type=="earth" 的分支内;guide_main 内部首次执行时通过 first flag 调用 guide_init。Mars/generic 行星在 gcm.F90 / gcm.F 初始化阶段额外使用 relaxetat0("relax.nc") 做独立松弛,与 guide 模块无耦合。

guide_init 参数读取

guide_init 调用 ini_getparam("nudging_parameters_out.txt") 打开参数文件(仅串行版显式传文件名;并行版依赖 getparam 默认行为),然后通过 getpar 读取以下参数组:

变量开关

guide_u(默认 .TRUE.)、guide_v.TRUE.)、guide_T.TRUE.)、guide_P.TRUE.)、guide_Q.TRUE.)分别控制 u/v/T/Ps/Q 是否参与 nudging。guide_hr.TRUE.)表示输入文件为相对湿度(%),需乘以饱和比湿转换;guide_teta.FALSE.)表示输入为位温而非温度,跳过 Exner 函数除法。

时间常数

每个变量有一对 tau_min_X / tau_max_X(单位:天),默认 0.02 / 10.0。tau2alpha 将这对松弛时间转为逐网格点系数 alpha,具体映射取决于 guide_reg / guide_add 模式和 zoom 网格面积比。factt = dtvr * iperiod / daysec 将动力步长转换为天分数,作为 tau2alpha 的缩放因子。

区域与边界层控制

guide_reg.FALSE.)启用区域 nudging,由 lat_min_g / lat_max_g(-90/90)、lon_min_g / lon_max_g(-180/180)定义矩形域,tau_lat / tau_lon(均 5.0)控制 tanh 软化边界的宽度。guide_BL.TRUE.)允许边界层内 nudging;关闭时 alpha_pcor(l)tanh((0.85 - presnivs/preff)/0.05) 在约 85% 参考气压处衰减高层系数。

频率与 I/O

iguide_read(4)控制读取频率:正值 = 每天读 N 次,负值 = 每 N 天读一次,零 = 只读一次(iguide_read=0 时时间插值冻结在 tau=1)。iguide_int(4)控制垂直插值频率,编码规则同 iguide_savguide_sav.FALSE.)启用 guide_ins.nc 输出,iguide_sav(4)为写出频率。

垂直坐标与文件结构

guide_modele.FALSE.,仅串行版直接声明;并行版通过 guide_plevs 间接映射)指示使用混合坐标 ap + bp*ps 读取 apbp.nc。并行版新增 guide_plevs(0):0 = 纯气压层(LEVEL/PRESSURE 维,读 apnc 后乘 100 转 Pa,bpnc=0);1 = 混合层(等同串行 guide_modele=.TRUE.,读 AP/BP);2 = 逐格点气压(读 P.nc 中 PRES 变量,pnat1/pnat2 三维场)。guide_invertp.TRUE.)和 guide_inverty.TRUE.)控制垂直和南北反转。guide_2D.FALSE.)切换到经度-气压 2D 文件读取模式(guide_read2D 只读 1 列然后沿 iip1 广播)。ini_anal.FALSE.)使初始状态直接等于分析场。

nlevnc 确定与文件探测

guide_init 在参数读取后打开第一个可用 NetCDF 文件以查询 LEVEL 或 PRESSURE 维的长度 nlevnc。探测顺序:混合层时 apbp.nc → 否则按 guide_uguide_vguide_Tguide_Q 优先级尝试打开对应变量的 .nc 文件。并行版在 guide_plevs=2 时优先尝试 P.nc

数组分配与维度

所有 alpha 系数数组无条件分配:alpha_u(ip1jmp1)alpha_v(ip1jm)alpha_T(iip1,jjp1)alpha_Q(iip1,jjp1)alpha_P(ip1jmp1)alpha_pcor(llm)。三维 nudging 场仅在对应 guide_X=.TRUE. 时分配,每个变量分配两对:Xnat1/Xnat2(nlevnc 层原始场,维度 (iip1,jjp1,nlevnc)(iip1,jjm,nlevnc) 对 v)和 Xgui1/Xgui2(模型层插值后场,维度 (ip1jmp1,llm)(ip1jm,llm) 对 v)。并行版在 guide_plevs=2 时额外分配 pnat1/pnat2(iip1,jjp1,nlevnc) 存储逐格点气压层。

串并行差异

特性 串行 guide_mod 并行 guide_p_mod
垂直坐标选择 guide_modele 逻辑开关 guide_plevs 整数 0/1/2(兼容 guide_modele
3D 气压场 pnat1/pnat2guide_plevs=2
域分解 全局 (iip1,jjp1) 局部 (jjb_u:jje_u) / (jjb_v:jje_v)
guide_addfield 全局循环 ijb_u:ije_uijb_v:ije_v
guide_zonave 全局 j 循环 局部 jjb_v:jje_v
guide_interp halo 无需 Register_SwapFieldHallo + SendRequest/WaitRequestpextpsnat/pnat
guide_out 直接写 gather_field 后仅 mpi_rank==0
Exner 函数 exner_hyb_m / exner_milieu_m exner_hyb_p_m / exner_milieu_p_m
压力/质量算子 pression / massdair / massbar pression_p / massdair_p / massbar_p
并行边界索引 ijb_u/ije_u/jjb_u/jje_u + pole_sud 缩减 v 边界

Mars 运行参与度

Mars 运行只把本模块作为接口兼容和配置边界。leapfrog_pguide_main 调用同样在 CPP_IOIPSL + planet_type=="earth" 分支;generic 行星的 ok_guide 路径包含 relaxetat0("relax.nc") 和 inline attenua u-wind nudging,均不等同于本模块的 NetCDF guide 输入链。

依赖表

模块 用途
getparam ini_getparam / getpar / fin_getparam 参数读取
control_mod day_step, iperiod
serre_mod grossismx, grossismy, clon, clat(zoom 参数)
comconst_mod dtvr, daysec, pi, cpp, kappa
comvert_mod ap, bp, preff, presnivs, pressure_exner
pres2lev_mod pres2lev 垂直插值
exner_hyb_m / exner_hyb_p_m Exner 函数(混合坐标)
exner_milieu_m / exner_milieu_p_m Exner 函数(层中心)
Write_Field / Write_Field_p 诊断输出
netcdf / netcdf95 NetCDF 文件 I/O
parallel_lmdz(仅并行版) ij_begin, ij_end, jj_begin, jj_end, pole_sud, mpi_rank
mod_hallo / Bands(仅并行版) Register_SwapFieldHallo, SendRequest, WaitRequest
dimensions.h / paramet.h / comgeom.h / comgeom2.h / netcdf.inc 维度和几何常量

相关页面