pSolve batch 控制文件总览

· 预计阅读 61 分钟

编写控制文件是 pSolve 全局解算的重要步骤。这里从源代码层面整理控制文件的结构和语法规范。Leonid 曾经编写过相关说明 solve_guide_03.syn,可以结合阅读。

实际使用时,通常在已有控制文件上修改,不必从头编写。例如,可以参考 gsf2026b 的控制文件,再根据自己的解算需求调整设置。本文对应的源码版本为 psolve-20260812。文中的源码路径均相对于 psolve 目录,例如 progs/solve/batch/ctrlfl.f。

1. batch 控制文件总览

阅读控制文件时,可以把内容分为两类:预处理指令和参数配置。这两类内容不一定各占连续的一块文本,而是由不同的程序处理:CTRLS 先预处理文件、检查实验列表,再调用 CTRLFL 解析配置段。

CTRLS 还负责检查恢复状态、准备全局数据。它返回后,BATCH 保存配置并完成其余准备,随后调用 PRCES 组织各次实验的处理。

flowchart TD
    A["BATCH:初步初始化"] --> B["CTRLS"]
    B --> C["预处理控制文件"]
    C --> D{"实验数据格式"}
    D -->|GVF / GVH| E["CH_DB_GVF:解析并检查数据库"]
    D -->|旧格式| F["CHSUP 等:检查 superfile"]
    E --> G["CTRLFL:解析配置段"]
    F --> G
    G --> H["检查配置、判断恢复状态"]
    H --> I["初始化或恢复全局数据"]
    I --> J["返回 BATCH"]
    J --> K["BATCH:保存配置及其他准备"]
    K --> L["PRCES:组织实验处理"]

2. 预处理指令与 CTRLS

2.1 预处理指令

预处理指令可以省略。它们的识别范围由读取流程决定,不专属于 $SETUP 段。即使某个示例把 DEFINE 放在 $SETUP 标题下面,处理它的仍是 CTRLS,而不是 GSETUP。

写法 识别范围 处理程序与备注
DEFINE <name> <value> 原始文件中第一个 $ARCS 标题之前;去掉行首空格后,以 DEFINE 开头 CTRLS;设置当前进程的环境变量
UNDEFINE <name> 同上,以 UNDEFINE 开头 CTRLS;把变量设为空字符串,不删除变量
@<file> 原始文件中第一个 $ARCS 标题之前;去掉行首空格后,以 @ 开头 CTRLS;直接插入文件内容,不递归预处理
${<name>} 开头的行 原始文件中第一个 $ARCS 标题之前;去掉行首空格后,以 ${ 开头 CTRLS
ARCFILE <file> $ARCS 后的实验列表 旧格式由 CTRLS 处理;GVF/GVH 格式由 CH_DB_GVF 处理
ARCFILE NONE $ARCS 后的实验列表 两条路径都有相关判断,但 GVF/GVH 路径存在不推进读取位置的问题,不能作为正常关闭写法使用

这里有三点需要区分:

  • CTRLS 在原始文件中识别 $ARCS,判断条件是该行从第一列开始的前五个字符为 $ARCS。因此,标题前不要缩进,也不要把“在包含文件中插入 $ARCS”当作原始文件的分界方式。
  • @<file> 在这里表示直接插入文本。被插入文件中的 DEFINE、UNDEFINE、@ 或行首 ${...} 不会再次经过同一套预处理。它与 $ARCS 实验记录中由 GARC 处理的 @<file> 入口不是同一个入口。
  • ARCFILE 是观测实验列表的预处理入口,不是 GARC 逐条解析的实验选项。$ARCS GVF 和 $ARCS GVH 也能引用外部列表,但处理程序和旧格式不同,不能把两条路径的细节混为一谈。

2.2 CTRLS 的处理过程

CTRLS 是 BATCH 进入实际解算前的准备程序。它整理运行参数、控制文件、实验列表和已有运行状态,为后续的 PRCES 做好准备。

1. 准备错误文件,读取运行参数。

程序先调用 RTIMER,再重新建立本次运行使用的错误文件:

PRE_SCR_DIR(1:PRE_SD_LEN)//'ERRF'//PRE_LETRS

通常可将它记作 ERRFxx,其中 xx 是本次运行的标识。随后,程序从共享变量 STRING 中依次取出运行字段:跳过前四个字段,读取进程编号 IND_PROC、进程总数 NUM_PROC,再读取控制文件名 CFNAME。

2. 预处理原始控制文件,生成 .XPND 文件。

假设原始文件为 solution.cnt,程序会把预处理结果写入 solution.cnt.XPND。在正常读取路径中,这一文件都会生成并用于后续读取,不是只有使用 ARCFILE 时才生成。在遇到原始文件中的第一个 $ARCS 标题前,程序逐行处理:

行的形式 处理方式
普通非空行 写入 .XPND,保留原来的行首位置
@<file> 读取该文件,把各行直接写入 .XPND
DEFINE <name> <value> 设置环境变量;指令本身不写入 .XPND
UNDEFINE <name> 将环境变量设为空字符串;指令本身不写入 .XPND
以 ${ 开头的行 尝试展开环境变量,但当前分支未写出结果
空行 跳过

3. 解析实验列表,检查数据库并统计数量。

程序读取 $ARCS 标题行的第二个字段,也就是紧跟 $ARCS 的格式标记。若为 GVF 或 GVH,就进入 CH_DB_GVF;否则进入旧式 superfile 检查路径。

flowchart LR
    A["读取原始文件的实验列表"] --> B{"格式"}
    B -->|"GVF / GVH"| C["CH_DB_GVF:查找数据库入口"]
    B -->|"旧格式"| D["CHSUP 等:检查 superfile"]
    C --> E["写入展开记录并统计实验数"]
    D --> E

GVF/GVH 路径中的主要调用是:

CALL CH_DB_GVF ( VCAT, STRING1, N_SES, N_MIS, IUER )

CH_DB_GVF 读取 VCAT 配置,查找数据库 envelope 文件,并处理实验列表及其中的 ARCFILE <file>。写入 .XPND 的记录以 GVF 开头,包含找到的 envelope 路径及该实验剩余的配置。返回后,N_SES 赋给 NARCS;若 N_MIS > 0,程序退出。旧格式则通过 CHSUP、GET_SUPERFILE_NAME 和 INQUIRE 检查 superfile。这里检查的是实验列表及相应入口文件能否找到,尚未完整读取和验证全部观测内容。

4. 切换到 .XPND,调用 CTRLFL。

完成预处理后,程序保留原始文件名,并把当前读取对象改为展开文件:

CFNAME_ORIGINAL = CFNAME
CFNAME = EXPAND_CTLFILE
TYP = CFOPEN ( CFNAME )

随后调用 CTRLFL。从这一步开始,各配置段解析程序读取的是 .XPND;原始文件名仍用于报告及恢复检查等用途。

5. 检查部分配置组合。

CTRLFL 返回后,CTRLS 继续检查一些跨配置项的限制。例如:

  • 协方差输出在相应路径下要求设置实验中间结果文件目录;针对 CGM 的输出另有条件分支。
  • WEIGHTS MAKE 或 WEIGHTS APPEND 使用 MYWAY 算法时,不能同时设置 NORATE_FLAG YES。

因此,“程序已读懂这一行”与“这些设置能组合使用”是两件事。部分组合检查在配置段解析器内完成,另一些在 CTRLS 中完成。

6. 确定是否恢复中断的运行。

如果 KBIT(PRE_IP(2), INT2(8)) 为真,程序禁止尝试恢复,直接设置 RESTRT=.FALSE.;否则调用 RSTORS 读取并检查已有状态。

变量 作用
RESTRT 是否实际采用恢复运行
IPASS 处理阶段:1 为前向阶段,2 为后向阶段
ARCNUM 恢复所涉及的实验编号
SOLTYP 本次请求的解算类型
SOLTY2 当前处理阶段采用的解算类型

7. 初始化或恢复全局数据。

程序先处理与恢复有关的共享状态,再调用 DISCONT_INIT 初始化测站间断运动和分段位置模型的数据,并清除源位置、站位置和站速度替换文件的初始化标志。只有满足以下条件,才进入这里的 GLO_INIT 和 GLO_RESTORE 路径:

.NOT. TRAIN .AND. SOLTYP .NE. 'I'

GLO_INIT 初始化 GLBMEM,之后根据运行状态选择恢复方式:

条件 调用 读取内容
恢复运行,IPASS=1 GLO_RESTORE(1, ...) 前向处理中保存的 CGMBxx
恢复运行,IPASS=2 且 ARCNUM<=0 GLO_RESTORE(4, ...) 已形成、尚未求逆的 CGMBxx
恢复运行,IPASS=2 且 ARCNUM>=1 GLO_RESTORE(5, ...) 保存求逆结果的 COVFxx
新运行,GLBMEM%L_GPA>0 GLO_RESTORE(3, ...) 指定的输入 CGM

新运行还会检查输出 CGM 是否与已有文件冲突。实际读取的环境变量是 PSOLVE_CGM_DIR;变量为空时,使用程序中的默认目录 CGM_DIR。

GLBSET 的调用位置取决于运行状态:部分恢复情形在全局矩阵初始化前调用 GLBSET(...,1);新运行在末尾调用 GLBSET(...,0)。它参与设置运行状态、报告输出和进度信息,不能概括为“所有路径都在最后调用一次”。相关位置为 progs/solve/batch/ctrls.f:698 和 progs/solve/batch/ctrls.f:865。

3. 参数配置段与 CTRLFL

3.1 配置结构与书写规则

本文使用三个名称描述参数配置部分:

名称 指的是什么 例子
配置段 段标题及其后面的配置内容 整个 $SETUP 段
配置段标题 标记一个配置段开始的名称 $SETUP
配置关键词 段内一项设置的名称 SOLUTION、ARC_FILES

例如:

$SETUP
 SOLUTION  COMPLETE
 ARC_FILES /scr/psolve/sub_matrices

$SETUP 是配置段标题,SOLUTION 和 ARC_FILES 是配置关键词,后面跟取值或参数。这几行共同组成一个配置段。

书写时遵循以下规则:

  • 配置段标题从第一列开始,段内配置行以空格开头。
  • 第一列为 * 的行是注释。CFREAD 也会跳过空行;不要把 # 或 ! 当作所有位置都通用的注释符。
  • 关键词和固定取值按本文列出的大小写书写。各解析器的大小写处理并不完全一致。
  • \ 只在相应解析器支持的列表或子句中用于续行,不是任意位置都有效的通用续行符。

同一段内,相互独立的关键词通常可以调整顺序,但不能一概而论。有些关键词需要使用先前已经读取的设置。例如,$SETUP 中的 WEIGHTS MAKE 在当前 FAST_MODE 不为 NONE、又尚未读取 FAST_COV 时会报错,因此应先写 FAST_MODE、FAST_COV,再写 WEIGHTS。

建议把 $SETUP 放在第一个配置段,因为它设置基本配置并初始化后续程序使用的变量。它不必是文件第一行,前面可以有空行、注释或适用的预处理指令。CTRLFL 没有显式要求 $SETUP 必须排第一,但这不代表所有配置段可以任意换序。CTRLFL 明确检查以下顺序:

  • $FLAGS 在 $CARRY 之前。
  • $FLAGS 和 $CONSTRAINTS 都在 $SUPPRESSION 之前。

另外,应将 $ARCS 放在文件末尾。虽然 CTRLFL 的局部计数逻辑能在遇到下一段标题时停下,但更早的 CTRLS 已把第一个 $ARCS 后的内容交给实验列表处理,不能据此在其后继续安排普通配置段。

下面列出全部配置段。这里的“必需”只表示该配置段必须存在,不表示其中每个关键词都必须出现,也不表示必须开启相应功能。表的顺序便于查阅,不是程序强制的完整顺序。

配置段 中文名称 是否必需 解析入口与源码
$SETUP 基本设置段 是 GSETUP;progs/solve/batch/gsetup.f
$FLAGS 参数估计设置段 是 GFLAGS;progs/solve/batch/gflags.f
$OUTPUT 输出设置段 是 GOUTPT;progs/solve/batch/goutpt.f
$CARRY 参数全局性设置段 是 GCARRY;progs/solve/batch/gcarry.f
$DATA 数据设置段 是 GDATA;progs/solve/batch/gdata.f
$CALIBRATIONS 校准设置段 是 GCALIB;progs/solve/batch/gcalib.f
$PARTIALS 偏导数设置段 否 GPART;progs/solve/batch/gpart.f
$CONTRIBUTIONS 附加改正项设置段 是 GCONT;progs/solve/batch/gcont.f
$MODE_CALIBRATIONS 模式相关校准设置段 否 GMCAL;progs/solve/batch/gmcal.f
$MAPPING 先验模型设置段 是 GMAP;progs/solve/batch/gmap.f
$CONSTRAINTS 约束设置段 是 GCONST;progs/solve/batch/gconst.f
$SUPPRESSION 数据与参数剔除设置段 是 GSUPRS;progs/solve/batch/gsuprs.f
$ARCS 实验列表段 是 CTRLFL 计数并保存位置;后续由 GARC 解析实验记录,见 progs/solve/batch/garc.f

后文用表格列出关键词,用流程图说明读取与分派关系。图中分支表示不同处理路径,不表示必须依次启用所有关键词。表格中的语法符号统一如下:

符号 含义
/ 在列出的写法中选择一项;文件路径中的 / 仍是路径分隔符
[...] 可省略的部分
(...) 将同一位置的备选项分组;括号本身不写入控制文件
<...> 用户填写的参数;尖括号本身不写入控制文件
… 同类条目还可以继续列出
分号 分隔不同写法;分号本身不写入控制文件

“实现异常”表示源码虽然识别该入口,但存在错误或不完整的处理;“不支持”表示程序会明确拒绝。涉及问题的写法不能仅凭解析通过就视为可靠可用。文中带 <...> 的例子用于说明结构,使用前需要替换为实际值。

3.2 SETUP(基本设置段)

$SETUP 设置解算方式、矩阵文件、实验中间结果文件、计算算法和权处理等基本选项,由 GSETUP 解析。它还初始化后续程序需要的变量,因此建议将它放在第一个配置段。GSETUP 先设置初始值,再逐项读取配置;有些关键词直接在本程序中处理,有些交给辅助解析器。读到本段末尾后,程序检查选项是否齐全、组合是否允许,并把下一段标题留给 CTRLFL。下图表示这一处理关系,不表示关键词的书写顺序。

flowchart LR
    A["读取下一个关键词或记录"] --> B{"到达本段末尾?"}
    B -->|否| C{"解析方式"}
    C -->|普通选项| D["GSETUP 直接读取"]
    C -->|复杂结构| E["调用辅助解析器"]
    D --> A
    E --> A
    B -->|是| F["检查配置并放回下一段标题"]
    F --> G["返回 CTRLFL"]

关键词列举如下:

关键词 取值与语法 限制与备注
DEFAULTS YES / NO 保留的兼容入口。
SOLUTION COMPLETE / FORWARD / BACK / GLOBAL_ONLY / INDEPENDENT / SUPPRESSION / SUPPRESS / SUBTRACT SUPPRESS 与 SUPPRESSION 同义;与 FAST_MODE、TRAIN 有组合限制。
CGM <input> [<output>];旧式 <user_tag> <solution_tag> [<output>] 实际预取三个字段,字段用途在段末判断。普通写法使用前两个字段;第三个字段仅供旧式标签分支作为输出。
MERGE_CGM NONE;<input_file> 每次读取一个文件名;多个文件须重复指定关键词。NONE 不清除此前已列出的文件。
ARC_FILES NONE;[SAVE] <directory_or_0> [<directory_or_0> [<directory_or_0>]] 最多三个目录位置;0 表示该位置为空。SAVE NONE 不属于单独的 NONE 分支。环境变量 ARC_STR 可以覆盖本项。
ID <text> 读取本行剩余文本,最多 10 条 ID。首条以 TEST 开头时进入测试解算的存储规则,不能同时使用归档标签。
USER_PROGRAM NONE / NO;<program> [USER_BUFFER <delimited_text>] 缓冲文本使用相同的首尾分隔符,内容长度为 1–80 个字符。程序路径宜写完整。
USER_PARTIALS NONE / NO / <program> 可以重复指定非空程序;不宜把 NO 与程序列表混用来增删条目。
USER_CONSTRAINTS NONE / NO / <program> 不允许重复指定。
ELEVATION_DEPENDENT_NOISE NO;YES <file>;MULTI_GLOBAL <value>;GLOBAL <value> [STATION_FILE <file>] STATION_FILE 仅属于 GLOBAL 分支。数值按定宽实数格式读取,应显式带小数点。
ATMOSPHERE_STOCHASTIC_MODEL NO;<model> STA_PAR <file> 实现异常:模型名称判断与报错中的拼写不一致
GPS_TEC_NOISE NO;YES <file> [NO_IONO_CONTRIB] NO_IONO_CONTRIB 仅属于 YES <file> 分支,不是独立关键词。
SNR_MIN NO;<x> <s> 后一种写法必须提供两个实数,分别对应高、低频段;应显式带小数点。
USER_TAG <tag> 必须与 SOL_TAG 配套出现;属于旧归档接口,不能与 ID TEST 同时使用。
SOL_TAG <tag> 必须与 USER_TAG 配套出现。
FAST_MODE NONE / B3D / B1B3D / DOT_PRODUCT 按前三个字符匹配;受解算类型限制。内部枚举中的 B1D 被段末兼容检查拒绝。
FAST_DBG NONE / APPEARANCE / PRINTOUT / TIMER / MONITOR 按前三个字符匹配。
FAST_COV GLOBAL / LOCAL / SEGMENTED / FULL 按前三个字符匹配;FAST_MODE 不为 NONE 时,必须显式指定。
SOLVE_COMPAT 无可用取值 已停止支持;源码提示改用 EMULATION。
EMULATION 0 / NO / 9612 0 与 NO 关闭旧行为模拟;9612 要求 FAST_MODE NONE。
CRES_COMPAT 无可用取值 已停止支持;源码提示改用 $OUTPUT 中的 CRES_EMULATION。
SUPMET UND / PRE98 / PRE91 / COMB1 / SNGBA / META 五个具体方法名由 SUPMET_SHOW 提供,并采用子串匹配;UND 是另外允许的未指定状态,不是一个具体剔除算法。
QUALCODE_LIMIT <integer> 范围为 1–9,表示数据质量代码下限。
WEIGHTS NO;IN;<mode> <files> [<type>] [ALGORITHM <algorithm>];DEFAULT <files> 各分支的结构和限制见下表。DEFAULT 是特殊兼容入口,不是类型选项;INSERT 应显式给出类型和算法。
SOURCE_WEIGHTS NO;USE <file>;REQUIRE <file> 文件参数属于 USE、REQUIRE 分支。
SAVING_RATE <integer> 范围为 1–1000000,指定前向处理中保存中间 CGM 的实验间隔。
SINGULARITY_CHECK NONE;ACTION <action> SOUMIN <n> STAMIN <n> BASMIN <n> 本关键词必须出现。第二种写法的四个子句全部必需,顺序可调整。
TRAIN YES;NO GLO_PARLIM <integer> INC_PARLIM <integer> YES 分支直接返回,不接容量子句;NO 后两个子句全部必需,顺序可调整。
SORT NO;YES STATIONS <station_order> SOURCES <source_order> YES 后两个子句全部必需,顺序可调整。
WARNING ON / OFF / NO OFF 与 NO 同义;不屏蔽致命错误。
DECIMATION NO / NONE;CREATE <directory> (ASCII / BINARY);(USE / REQUIRE) <directory> <integer> CREATE 必须指定格式;USE、REQUIRE 必须指定整数。当前计算端在记录标记等于该整数时置剔除位,与旧文档“相等时保留”的说明相反。
THEORETICAL_DELAY_FILE DATABASE;IGNORE;(USE / UPDATE) DIRECTORY <directory> [USER_INIT <list>] 无 NO 分支;DATABASE 后不读取数据库名。USER_INIT 的计数实现有问题;计算端还要求环境变量 TPD_USE 为 YES、VERB 或 DEBUG。
EXTERNAL_IONO_PATH_DELAY NO / NONE;(GEN / LOAD / USE) <directory> 目录参数属于后三个分支;与 DTEC_USE 共用目录变量 IONOV_DIR。
DTEC_USE NO / NONE;(APPLY / IMPORT) <directory> 目录参数属于后两个分支;与上一项同时指定时,后读入的目录会覆盖前值。

表中的“必须出现”指解析器明确要求的关键词,不表示其余关键词可以在任意条件下省略。GSETUP 还会根据解算类型、计算方式和文件设置进行组合检查。

复杂子项列举如下:

所属关键词 子项 取值与限制
WEIGHTS <mode> USE / REQUIRE / MAKE / APPEND / INSERT。
WEIGHTS <files> <file>,或 <count> <file1> ... <fileN>;当前上限为 16 个文件。MAKE、APPEND 另行限制为一个输出文件。
WEIGHTS <type> BY_SITE / BY_BASELINE / BY_ARC;省略时,相应分支设为 BY_ARC。
WEIGHTS <algorithm> MYWAY / UPWEI / UPWEI_OPT,或 ELIM <paru_file>;只允许在 MAKE / APPEND / INSERT 下指定。
WEIGHTS 算法默认值 MAKE、APPEND 未给算法时使用 MYWAY;INSERT 没有同样可靠的默认赋值,应显式指定算法。
WEIGHTS 算法与类型 UPWEI、UPWEI_OPT 要求 BY_BASELINE。带 ALGORITHM 时应显式给出类型,避免省略类型路径中的字符串恢复问题。
WEIGHTS DEFAULT 分支 读取文件参数,但内部模式与 IN 相同,跳过后续外部权文件处理;不能据文件名已被读取就认为该文件会生效。
SINGULARITY_CHECK <action> NONE / WARNING / REPARAMETERIZE / STOP / SKIP。
SINGULARITY_CHECK <n> 三个阈值分别取 NO 或非负整数;NO、0 均关闭对应门限。
SORT <station_order> NO / ALPHABET / LONGITUDE。
SORT <source_order> NO / ALPHABET / RIGHT_ASCENSION。

几个常见的组合限制是:GLOBAL_ONLY 要求 TRAIN NO,SUBTRACT 要求 TRAIN YES;全局解算的 FAST_MODE 只接受 NONE / B1B3D,独立解算接受 NONE / B3D / DOT_PRODUCT。快速模式下,WEIGHTS MAKE 应写在 FAST_COV 之后;使用 MYWAY 的 MAKE / APPEND 还要求 TRAIN YES。

GSETUP 读到 CGM 时先取三个字段,等读完整个 $SETUP 段后再确定其用途:

写法 字段的实际解释
CGM <input_file> [<output>] 第一字段为输入文件,第二字段为输出文件或 NONE / SAVE。省略输出时,普通文件路径分支设置为 NONE。
CGM NONE [<output>] 不使用输入 CGM;仍可通过第二字段指定输出。
CGM SAVE [<output>] 不使用输入 CGM,保留 SAVE 控制字;省略第二字段时,输出也设置为 SAVE。
CGM <user_tag> <solution_tag> [<output>] 第一字段恰为两字符、第二字段为 1–8 字符时,进入旧标签分支;此时第三字段才是输出。

因此,CGM 应单独成行,普通写法不要额外追加第三个参数。输入文件宜使用完整路径,避免两字符文件名被误当成旧式标签。SAVE 最终怎样命名和写出文件,由后续处理阶段决定。

SETUP.ARC_FILES 指定各次实验的中间结果文件存放在哪里,并用可选的 SAVE 控制是否在正常后向处理后保留这些文件。这里的 arc 对应一次实验(session)。全局解算的前向处理会生成这些中间结果,后向处理再使用它们,因此本文将 arc files 称为“实验中间结果文件”。例如,gsf2026b 控制文件中有:

$SETUP
  ARC_FILES /scr/psolve/sub_matrices

这表示使用 /scr/psolve/sub_matrices 存放实验中间结果。它没有指定 SAVE,也不列出待处理的实验。另一个容易混淆的入口是 $ARCS 列表处理中的 ARCFILE:它指定外部实验列表文件,由预处理或数据库列表检查程序读取,不是 GARC 的逐实验选项。

3.3 FLAGS(参数估计设置段)

$FLAGS 指定哪些参数需要估计,以及采用哪些分量和时间模型,由 GFLAGS 解析。这里的 YES / NO 通常控制参数估计,不应直接理解为是否使用相应观测;观测选择主要见 $DATA。本段必须出现的关键词有:SOURCES、STATIONS、VELOCITIES、NUTATION、UT1/PM、PRECESSION、RELATIVITY、ATMOSPHERES、CLOCKS、BASELINE_CLOCKS。必需的关键词也可以采用其允许的关闭选项。段内还有两条明确的顺序要求:SOURCES 必须先于 PROPER_MOTIONS,STATIONS 必须先于 VELOCITIES。

flowchart LR
    A["读取下一个关键词或记录"] --> B{"到达本段末尾?"}
    B -->|否| C{"解析方式"}
    C -->|普通选项| D["GFLAGS 直接读取"]
    C -->|模型或例外列表| E["调用辅助解析器"]
    D --> A
    E --> A
    B -->|是| F["检查必需项、历元和解算方式"]
    F --> G["放回下一段标题,返回 CTRLFL"]

关键词列举如下:

关键词 取值与语法 限制与备注
SOURCES (NO / YES / IN) [REF_EPOCH <epoch>] [<source_components>] [<source_selection>] 必需。REF_EPOCH 必须在分量选择之前。-- 分支存在赋值错误;进入 EXCEPT 分支时,全局分量重设为 RD。
PROPER_MOTIONS (NO / YES) [<source_components>] [EXCEPT <source_exceptions>] 可选;必须在 SOURCES 之后。
STATIONS (NO / YES) [REF_EPOCH <epoch>] [<station_components>] [D] [<station_selection>] 必需。各部分按所列顺序读取;不接受 IN。
VELOCITIES (NO / YES) [<station_components>] [EXCEPT <station_exceptions>] 必需;必须在 STATIONS 之后。
HARMONIC_POS NO / NONE;<harmonic_spec>;@<file> 可选。内部字段见下表;固定词为 FREQ。启用时不支持 INDEPENDENT 解算。
SPLINE_POS NO / NONE;<spline_spec>;@<file> 可选。内部字段见下表;启用时不支持 INDEPENDENT 解算。
NUTATION NO / OFFSET / XY_OFFSET 必需。由 GNUT 解析;其旧内部表中的其他名称不能直接视为可用模式。
UT1/PM NO;DEFAULT [MIDDLE / MIDNIGHT];POLYNOMIAL <clauses>;(SEGMENTS_G.RATE / SEGMENTS_ONLY / SINE_STYLE) [<clauses>];特定 WOBBLE 旧式写法 必需。各模式的子项见下表;WOBBLE 只保留一条特定兼容形式。
PRECESSION YES / NO 必需。
RELATIVITY YES / NO 必需。
TIDES NO 兼容占位;其他正常取值会报不支持。
HI_FREQ_EOP NO;YES <file> 可选。源码未严格校验非 YES 输入,不能据此增加可用枚举。
ATMOSPHERES NO / IN / DEFAULT / FORCE;MOST <interval>;AUTO <interval> [EXCEPT NO <station_list>] 必需。间隔以分钟计;只有 AUTO 分支读取例外列表,EXCEPT 后需要 NO。
GRADIENTS YES <interval> [EXCEPT NO <station_list>];NO [<interval>];NO <interval> EXCEPT YES <station_list> 可选。间隔读为整数小时。NO 后直接写 EXCEPT 会被当作数值;例外列表还有实现错误,见后文。
CLOCKS 新式:[MAX_DEGREE <degree_spec>] INTERVALS <interval_spec>;旧式:DEFAULT,或 (FORCE / AUTO / PICK / MOST) <interval> 必需。间隔以分钟计。新旧入口并存;PICK 仅在旧式分支接受,新式 INTERVALS IN 存在实现错误。
AXIS (YES / NO) [EXCEPT <station_list>] 可选;例外列表由 GAXIS 解析。
BASELINE_CLOCKS YES / NO / IN 必需。
ERM NO / NONE;[YES] <erm_spec>;配置中的 @<file> 展开 可选。内部字段见下表;启用时不支持 INDEPENDENT 解算。
HEO NO / NONE;YES REF_EPOCH <epoch>,随后给出记录 可选。后续记录支持 @<file> 展开,不能省略前面的 YES REF_EPOCH <epoch>。启用时不支持 INDEPENDENT 解算。
STRUCTURE_ADMITTANCE NO;(GLOBL / GLOBAL / LOCAL) (YES / NO) [ALL / EXCEPT <source_list>] 可选。ALL 属于第三位置,不与第二位置的 YES / NO 并列。EXCEPT 列表存在实现错误。
IONOSPHERE_SCALE NO / SES / STA / BAS 可选。表中列出完整写法,源码采用前缀匹配。

部分关键词的结构非常复杂。这些复杂关键词的结构性子项属于相应关键词内部,不是 $FLAGS 的独立关键词。

所属关键词或模式 固定词与结构 限制与备注
HARMONIC_POS NAME <name> STATION <station_list> [PHASE <value>] FREQ <value> NNT_CNS_SIGMA <value> NNR_CNS_SIGMA <value> 按此顺序读取;PHASE 可省略。可以重复 NAME 块。实际固定词是 FREQ,不是 FREQUENCY。
SPLINE_POS STATION;DEGREE;NODE <epoch> MULT <integer>;CNS_STA_SIGMA;CNS_VEL_SIGMA;CNS_DER_SIGMA 按站组织记录,NODE … MULT … 可重复。CNS_STA_SIGMA、CNS_VEL_SIGMA 后可给约束起止日期,且各自应另起一行;CNS_DER_SIGMA 带导数阶数和标准差。
UT1/PM POLYNOMIAL OFFSET <components>;RATE <components>;2ND_ORDER <components>;START / END / MIDDLE / MIDNIGHT / NOON;DAYOFTIME_EPOCH <time>;EPOCH <epoch>;BEFORE <epoch>;AFTER <epoch> 分量参数与历元子项分别读取;至少选择一种多项式系数,历元选择不应重复。
UT1/PM SEGMENTS_G.RATE / SEGMENTS_ONLY / SINE_STYLE INTERVAL <value>;PM_RATE_CONSTRAINT <value>;UT_RATE_CONSTRAINT <value>;EOP_FILE (NONE / RESET / APPEND) 三种模式使用共同的子项解析分支。
UT1/PM WOBBLE WOBBLE OFFSET XY RATE -- UT1 OFFSET U RATE U MIDDLE 仅保留这一完整旧串,等价于 DEFAULT MIDDLE。
CLOCKS MAX_DEGREE IN;AUTO (1 / 2) IN 后不接阶数;本分支不接受 MOST。
CLOCKS INTERVALS NO;(FORCE / AUTO / MOST) <interval>;IN 分支 IN 实际仍会尝试读取数值,不宜当作正常的无参数选项。此处不接受 PICK。
ERM DEGREE;SPAN_EST_DAYS;SPAN_CNS_DAYS;DATE_BEG;DATE_END;CNS_DER_SIGMA;CNS_MEAN_SIGMA;CNS_RATE_SIGMA;CNS_TREND_RANGE;CNS_TREND_REF;CNS_MEAN_RTP;CNS_RATE_RTP E1 / E2 / E3 是相关子项中的分量取值。三个分量均须给出 DEGREE、SPAN_EST_DAYS、SPAN_CNS_DAYS,并提供起止日期;不是只写出一组字段即可。
HEO 首行:YES REF_EPOCH <epoch>;后续记录:W、C、U、A、CNS <name> SIGMA <value> 每条记录另起一行。计入开头记录类型后,W 有 13 个词,C / U 有 7 个词,A / CNS 有 4 个词;各开关用 T / F。

HEO 的 CNS 并不是任意增加的可选记录。当前解析器要求 16 个约束名全部出现一次,其名称由三部分组合:HEO_VAL / HEO_ERM、E1E2 / E3、HAR / CROSS / SHIFT / DRIFT。例如 HEO_VAL_E1E2_HAR。应写完整名称,避免子串匹配误认。

3.4 OUTPUT(输出设置段)

$OUTPUT 主要设置解算报告、残差、协方差和 SINEX 等输出。需要留意,少数关键词还会影响计算过程:NORMAL_MATRIX ZERO 会清零法方程,IONOSPHERIC_MODEL 可以启动电离层模型计算和数据库更新,不能把它们都理解为显示格式开关。CTRLFL 调用 GOUTPT 解析本段。多数关键词由 GOUTPT 直接处理,COVARIANCES、CORRELATIONS 和 SINEX 则分别交给专门的解析程序。

flowchart LR
    G["GOUTPT:读取关键词"] --> K{"关键词类型"}
    K -->|"其他关键词"| D["GOUTPT 直接解析"]
    K -->|"COVARIANCES"| C["GTCVR"]
    K -->|"CORRELATIONS"| R["CORRELATIONS_PARSER"]
    K -->|"SINEX"| S["SINEX_PARSER"]
    D --> E{"本段是否结束"}
    C --> E
    R --> E
    S --> E
    E -->|"否"| G
    E -->|"是"| F["检查必需项与组合限制,返回 CTRLFL"]

图中箭头表示解析分派和返回关系,不表示关键词的书写顺序。

关键词列举如下:

关键词 取值与语法 限制与备注
RESET YES / NO 必需。设置报告文件是重写还是追加。
MINIMUM YES / NO 必需。控制报告是否精简;当前应放在 BASELINES 之后,原因见下一行。
POS_ELLIPSES YES / NO 可选。控制站位水平误差椭圆的输出。
BASELINES YES / NO 必需。重复检查误用了 MINIMUM 的出现标志:先写 MINIMUM 会误报重复,真正重复的 BASELINES 又可能漏检。
FORWARD YES / NO / LAST / <nonnegative_integer> 必需。数值不能为负;当数值与 SAVING_RATE 都大于 1 时,两者必须相等。
SCREEN YES / NO 必需。控制报告是否同时输出到终端。
MAPPED_EOP_OUTPUT NO;YES <time> <time> 是日内时刻,可写为小时数、hh_mm_ss.fff 或 hh:mm:ss.fff。小时数应带小数点,如 12.0。
MOD_FILES YES / NO 可选。控制报告是否附加先验 mod 文件。
MINIMIZE_SIGMAS YES / NO 可选。计算使站位形式误差最小的参考历元。
RESIDUALS NO / NONE / FULL;<file_prefix>;另有 SPOOL 入口 NO 转为 NONE;普通名称用于创建 .bin 和 .ndx 文件。SPOOL 的特殊判断写错,会进入文件创建分支,详见表后说明。
COVARIANCES NO;YES <scope> <parameter_group> 必需。不能与 CORRELATIONS 同时启用;启用时不支持 FAST_MODE B1B3D 或 SOLUTION INDEPENDENT。
CORRELATIONS NO;YES <correlation_clauses> 必须提供 FORMAT 和至少一个参数块。CROSS_LOC 虽有解析入口,但段末明确报不支持。
NORMAL_MATRIX NO / YES / ZERO YES 输出法方程矩阵;ZERO 在传统矩阵处理路径中清零观测法方程矩阵及右端向量,会改变计算内容。
STATION_TABLE NO;YES [<yymmdd> [<count>]] 日期按六位 YYMMDD 读取;只有给出日期后才能继续给出数量。
SINEX NO;YES <sinex_clauses> YES 后必须给齐 14 个子句,各出现一次,顺序可换;不能与 TRAIN YES 同用。源码把其他非 YES 首值也按关闭处理,本文只列规范写法 NO。
SEG_OUTPUT YES / NO 可选。控制分段参数结果的输出。
APRIORI_ZENDEL YES / NO 最终的 SEG_STYLE 为 POST2026 时,段末强制设为 YES,会覆盖显式的 NO。
CRES_EMULATION NO / 199804 / 200308 可选。选择历史报告格式;源码采用前缀匹配。
LISTING_OPTIONS SRC_STAT <style>;SEG_STYLE <style>;两项通过续行组合 单项可以独立给出;同时给出两项时,用 \ 续行。取值见下表。
NRD_TABLE YES / NO 解析器会保存开关。
CHI_SQUARE_TABLE YES / NO 解析器会保存开关。
IONOSPHERIC_MODEL NO;<ionospheric_clauses> 非 NO 路径必须按固定顺序给齐子句。DB_UPDATE YES 要求 BIAS_COMPUTE YES,并会修改数据库。

这里的“必需”指关键词必须出现,不是必须启用该功能。例如,即使使用 CORRELATIONS YES,仍需写出 COVARIANCES NO。

RESIDUALS 的 SPOOL 分支写成了 RESFILE(1:4) .EQ. 'SPOOL'。左侧只有四个字符,不可能与五个字符的 SPOOL 相等。因此,GOUTPT 会把它当作普通文件前缀,创建 SPOOL.bin 和 SPOOL.ndx。这不等于后续程序完全不识别 SPOOL,但它确实无法避开本处的文件创建操作。普通前缀对应的已有 .bin 文件也会在解析阶段被删除并重建。

COVARIANCES 的结构较为复杂:

项目 取值与语法
<scope> ALL / BY_ARC / CGM;或 <database> <version>
<parameter_group> STA / NUT / EOP / ALL / SOU

YES 后有两种完整结构:

 COVARIANCES YES (ALL / BY_ARC / CGM) (STA / NUT / EOP / ALL / SOU)
 COVARIANCES YES <database> <version> (STA / NUT / EOP / ALL / SOU)

而CORRELATIONS 也存在复杂的结构性子项:

子项 取值与语法 限制与备注
FORMAT ASCII / BINARY YES 路径必需。
GLO_GLO PARAM_INCLUDE <file> [PARAM_EXCLUDE <file>] 启用该参数块时,必须给出 PARAM_INCLUDE。
GLO_LOC PARAM_INCLUDE <file> [PARAM_EXCLUDE <file>] 必须给出 PARAM_INCLUDE;不能使用 FAST_COV GLOBAL。
LOC_LOC PARAM_INCLUDE <file> [PARAM_EXCLUDE <file>] 必须给出 PARAM_INCLUDE;不能使用 FAST_COV GLOBAL。
CROSS_LOC 涉及 PARAM_INCLUDE、PARAM_EXCLUDE、SES_INCLUDE、SES_EXCLUDE 段末明确报告尚未实现,不作为可用配置。

PARAM_INCLUDE、PARAM_EXCLUDE 从属于相应的参数块;SES_INCLUDE、SES_EXCLUDE 只出现在未实现的 CROSS_LOC 分支中。文件名由同一源码文件中的 CP_CHECK 检查;相对路径以 SAVE_DIR 为起点,不是当前工作目录。

如果要设置SINEX YES,那么必需设置14 个子句,列举如下:

子句 取值与语法
FORMAT_VERSION 2.10 / 2.20
ALLOW_OVERWRITE YES / NO
GLOBAL YES / NO
LOCAL YES / NO
SEGMENTED YES / NO
ESTIMATES YES / NO
COVARIANCES YES / NO
CONSTRAINTS YES / NO
DECOMPOSED_NORMAL_EQUATIONS YES / NO
ACKNOWLEDGMENTS_FILE <existing_file>
COMMENTS_FILE <existing_file>
INCLUDE_PARAM <existing_file>
EXCLUDE_PARAM <existing_file>
OUTPUT_FILE <output_file>

四个输入文件子句都会检查文件是否存在,没有单独的 NONE 豁免分支。这里的 SINEX COVARIANCES 是 SINEX 内部子句,与 $OUTPUT 顶层的 COVARIANCES 不是同一个入口。

LISTING_OPTIONS 决定了SPOOL文件的输出内容和格式,其取值列举如下:

子项 固定取值
SRC_STAT PRE2004 / SHORT / LONG / POST2021 / POST2024
SEG_STYLE PRE2005 / POST2005 / POST2026

两项同时使用时,可以写成:

 LISTING_OPTIONS SRC_STAT POST2024 \
                 SEG_STYLE POST2026

当前 include/glbc4.i:514 将默认分段输出格式设为 POST2026。因此,即使省略 LISTING_OPTIONS,也可能触发 APRIORI_ZENDEL 的强制开启。

IONOSPHERIC_MODEL 需要设置后续子句(即使前面的开关为 NO)。当其值设置为非 NO 时,程序将按下表顺序逐项读取:

顺序 子句 取值与限制
1 COLLECT YES / NO
2 BIAS_COMPUTE YES / NO
3 REGR_COMPUTE YES / NO
4 DB_UPDATE YES / NO;YES 要求 BIAS_COMPUTE YES
5 IONO_INFO_DIR <existing_directory>
6 IONO_DTEC_DIR <existing_directory>
7 IONO_ADDW_DIR <existing_directory>
8 IONO_DEL_DIR <existing_directory>
9 IONO_NOI_DIR <existing_directory>
10 BCL_FIL <existing_file>
11 BRK_FIL <existing_file>
12 GIM_MODE 解析器接受 0 / 1 / 2 / 3;启用偏差计算时不能据此把 0 视为有效计算模式,见下文。
13 GIM_DEG 0 / 1 / 2 / 3
14 GIM_TIM_STEP <real>,读取后的范围为 60.0–90000.0 s;应显式带小数点。
15 GIM_SCALE <real>,读取后的范围为 0.001–5.0;应显式带小数点。
16 GIM_SEED <integer>;小于 1 时改用系统时间生成的值。
17 GIM_VERB 实际只读取一个字符,使用单个数字 0–9;不能按报错文字填写两位数 0–99。

3.5 CARRY(参数全局性设置段)

$CARRY 指定已选参数是多个实验共用的全局参数,还是各次实验分别求解的局部参数。它决定参数的全局或局部属性;是否估计这些参数,由 $FLAGS 设置。CTRLFL 调用 GCARRY 解析本段,并传入 $FLAGS 中的测站分量设置。$FLAGS 必须先于 $CARRY 出现,这一顺序由 CTRLFL 明确检查。

flowchart LR
    G["GCARRY:读取关键词"] --> K{"关键词类型"}
    K -->|"SOURCES"| S["GTLST:读取开关与名称列表"]
    K -->|"STATIONS"| T["GTLST_ST_CA:读取分量与名称列表"]
    K -->|"AXIS"| A["GCARRY:读取 YES / NO"]
    K -->|"TIDES"| X["报错并停止"]
    S --> E{"本段是否结束"}
    T --> E
    A --> E
    E -->|"否"| G
    E -->|"是"| F["检查 SOURCES 和 STATIONS,返回 CTRLFL"]

关键词列举如下:

关键词 取值与语法 限制与备注
SOURCES (YES / NO) [EXCEPT <source_list>] 必需,不允许重复。例外列表由 GTLST 解析。下游 DEPAR 同时将本规则用于已估计的源坐标和源自行。
STATIONS (YES / NO) [<station_components>] [EXCEPT <station_list>] 必需,不允许重复。分量必须与 $FLAGS STATIONS 相容。省略分量后直接写 EXCEPT 时,当前实现没有给 CARCMP 赋继承值。
AXIS YES / NO 可选,不允许重复;省略时初始化为 YES。不支持 EXCEPT。下游按此标志区分轴线偏差参数的全局、局部属性。
TIDES 无可用取值 识别到关键词便报错并停止,TIDES NO 也不能使用。

$CARRY TIDES 与 $FLAGS TIDES 的处理不同;后者保留了 NO 兼容分支。

3.6 DATA(数据设置段)

$DATA 选择参与解算的观测数据,包括源、测站、基线、观测量类型及高度角等筛选条件。它与 $FLAGS 的分工不同:$DATA 选择使用哪些数据,$FLAGS 选择估计哪些参数。CTRLFL 调用 GDATA 解析本段。SOURCES、STATIONS、TYPE 必须出现,其余关键词可选;这八个关键词均不允许重复。

flowchart LR
    G["GDATA:读取关键词"] --> K{"关键词类型"}
    K -->|"SOURCES / STATIONS"| L["GTLST:名称列表"]
    K -->|"ELEVATION"| E["GTELEV:高度角与测站分组"]
    K -->|"WVR_MASK"| W["GTWVM:掩码与测站分组"]
    K -->|"BASELINES"| B["GBASE:基线列表"]
    K -->|"TYPE / NORATE_FLAG / EVERY"| D["GDATA 直接解析"]
    L --> N{"本段是否结束"}
    E --> N
    W --> N
    B --> N
    D --> N
    N -->|"否"| G
    N -->|"是"| F["检查必需项,返回 CTRLFL"]

GBASE 文件头关于调用方和配置段的旧注释不准确,这里按实际调用关系将它归入 $DATA。关键词列举如下:

关键词 取值与语法 限制与备注
SOURCES (YES / NO) [EXCEPT <source_list>] 必需。例外部分是源名列表,由 GTLST 解析。
STATIONS (YES / NO) [EXCEPT <station_list>] 必需。由 GTLST 解析;本段不接受测站分量子项。
TYPE <type_code>;或四种长名称之一 必需。代码表及长名称的处理见下表。
NORATE_FLAG YES / ON / NO / OFF YES 与 ON 等价,NO 与 OFF 等价;取值转为大写后判断。不能对依赖时延率的处理任意开启此项。
ELEVATION <cutoff> [EXCEPT <elevation_groups>] 高度角单位为度;例外部分由“截止高度角+测站列表”组成,可以有多组。
WVR_MASK NO;<octal_mask> [EXCEPT <mask_groups>] 掩码按八进制读取;NO 分支直接返回,不读取例外列表。
EVERY NO;<n> START <m> START 必须出现。内部保存 EVINT=n、EVSTART=MOD(m,n)。应给出正整数 n;源码没有完整检查整数转换和范围,n=0 会进入非法的取余运算。
BASELINES (YES / NO) [EXCEPT <baseline_list>] 不带 EXCEPT 时,GBASE 会将标志重设为 YES,所以单独的 BASELINES NO 和 BASELINES YES 最终相同。

根据include/solve.i:880 中的代码表,TYPE 的取值包含以下 22 个缩写:

GRPRAT  PHSRAT  SNBRAT  GRPONL  PHSONL  SNBONL  RATONL
G_GXS   PX_GXS  PS_GXS  PX_GX   PX_GS   PS_GX   PS_GS   P_PXS
GX      GS      PX      PS      SNG_X   SNG_S   FUSED

GDATA 还单独接受四种长名称,并作如下赋值:

长名称输入 GDATA 写入 DTYPE 的值
GROUP_DELAYS_AND_RATES GDR
GROUP_DELAYS_ONLY GD
PHASE_DELAYS_AND_RATES PDR
PHASE_DELAYS_ONLY PD

3.7 CALIBRATIONS(校准设置段)

$CALIBRATIONS 用于选择和控制校准项,由 CTRLFL 调用 GCALIB 解析。本段同时保留了按校准名称设置的旧式写法,以及 RESET、KEEP、ENABLE、DISABLE 等列表写法。两类写法有组合限制,不能任意混用。本段必须存在,但没有某一个始终必填的关键词;是否完整,要看段末的组合检查。

flowchart LR
    A["$CALIBRATIONS → GCALIB"] --> B{"识别入口"}
    B -->|"AVAILABLE"| C["GETAVL:加载可用校准项"]
    B -->|"USE"| D["GETUSE:读取名称对应关系"]
    B -->|"GROUP"| E["GETGRP:读取组内选择"]
    B -->|"校准名称"| F["GTCALST:读取测站选择"]
    E --> F
    B -->|"其他受支持关键词"| G["GCALIB 直接读取"]
    C --> H["继续读取;段末检查与默认设置"]
    D --> H
    F --> H
    G --> H
    B -->|"OLD_IONOSPHERE"| I["报错:不再支持"]

关键词列举如下:

关键词 取值与语法 限制与备注
ION ON / OFF / DEFAULT 不允许重复;省略时初始化为 DEFAULT。本分支不接受 IN。
OLD_IONOSPHERE 无可用取值 明确报告不再支持。
AVAILABLE [<calibration_list>] 不允许重复。所给名称列表被读取后忽略;实际可用校准项通过 FLYAVL_N 从标准文件加载。
USE <name_1> FOR <name_2> 可以重复;每次读取一对名称,FOR 必须出现;名称中的 _ 转为空格。
GROUP <calibration_list> PICK <choice> [ELSE <choice> …] [STATIONS <station_selection>] 可以重复;每条 GROUP 必须含 PICK。
DEFAULT / IN 独立关键词,无后续取值 两者共享同一入口和重复检查。
RESET YES / NO 不允许重复。KEEP、ENABLE、DISABLE 中至少一个列表非空时,必须显式给出。
KEEP NO / <calibration_name> 可以重复,每次读取一个名称;NO 只表示本条不添加名称,不会清空先前列表;名称中的 _ 转为空格。
ENABLE NO / <calibration_name> 可以重复,每次读取一个名称;NO 不清空先前列表;名称中的 _ 转为空格。
DISABLE NO / <calibration_name> 可以重复,每次读取一个名称;NO 不清空先前列表;名称中的 _ 转为空格。
<calibration_name> (ON / OFF / DEFAULT) [<station_selection>] 名称入口;未匹配固定关键词时进入这一分支。此处接受 DEFAULT,不接受 IN;省略测站选择时按 ALL 记录。

3.8 MAPPING(先验模型设置段)

$MAPPING 用于指定先验参数、模型文件和相关改正设置。CTRLFL 调用 GMAP 解析本段;多数文件参数由 GMAPF 读取,较复杂的结构交给专门的解析程序。

flowchart LR
    A["$MAPPING → GMAP"] --> B{"识别入口"}
    B -->|"多数文件设置"| C["GMAPF:读取文件及从属子句"]
    B -->|"SPLINE_DISPLACEMENTS"| D["PARSE_BSP"]
    B -->|"POSITION_VARIATIONS"| E["GPOSVAR"]
    B -->|"HARMONIC_EOP / ERM"| F["分别调用 GHEO / GERM"]
    B -->|"其他受支持关键词"| G["GMAP 直接处理"]
    C --> H["继续读取;段末检查配置"]
    D --> H
    E --> H
    F --> H
    G --> H
    B -->|"独立 REF_DATE / NUTATION_MODEL"| I["报错并停止"]

图中的“其他受支持关键词”包括 FIX、METRIC_TENSOR、VTD_CONF、EXTERNAL_TRP_DELAY 和 ANTENNA_THERMAL。NUTATION_EXPANSION 也在 GMAP 内处理,但只检查名称,没有据此设置模型变量。

关键词列举如下:

关键词 取值与语法 限制与备注
SOURCES NONE / <file> 由 GMAPF 读取;额外字段的处理见后文。
STATIONS NONE / <file> 由 GMAPF 读取;额外字段的处理见后文。
AXIS_OFFSET NONE / <file> 由 GMAPF 读取。
EARTH_ORIENTATION (NONE / <file>) [<interpolation>] [<zonal_option>] 可选参数按所列顺序读取;取值及省略行为见下表。
HI_FREQ_EOP NONE / <file> 非 NONE 设置不能与启用的 HARMONIC_EOP 同时使用。
PRESSURE_LOADING NONE / <file> 由 GMAPF 读取。
PLATE_MODEL (NONE / <model>) [REF_DATE <date>] [SCALE <factor>] 两个从属子句可交换顺序;日期解析存在异常;FIX 是独立关键词,应另起一行。
REF_DATE 不支持独立使用 独立入口报错并停止;这不等于禁止 PLATE_MODEL 或 VELOCITIES 下的同名子句。
FIX <plate> 独立关键词;读取板块名称的前 4 个字符。
NUTATION_SERIES NONE / <file> 由 GMAPF 读取。
NUTATION_MODEL 无可用取值 明确报错并停止。
NUTATION_EXPANSION NONE / WAHR1980 / IERS1996 / REN2000 / MHB2000 只检查名称;合法分支均执行 CONTINUE,没有据此设置模型变量。
VELOCITIES (NONE / <file>) [REF_DATE <date>] 从属日期允许 NONE;SCALE <factor> 不能作为正常可用子句。
SPLINE_DISPLACEMENTS NONE;或 BSP <file_1> [BSP <file_2> …] 由 PARSE_BSP 处理。建议每行一个 BSP 条目;预读及数组分配存在异常,见本节末尾。
EPISODIC_MOTION NONE / <file> 保留的旧式入口。
PIECE_WISE_STA NONE / <file> 当前解析入口仍存在。
SITPL NONE / <file> NONE 或 none 会恢复预设的 SITPL_FILE。
ECCENTRICITY NONE / <file> 由 GMAPF 读取。
MEAN_GRADIENT NONE / <file> 由 GMAPF 读取。
METRIC_TENSOR NONE / IERS92 / GRS / TOPOCNTR 取值转为大写后检查;不允许重复。
POSITION_VARIATIONS NONE;或 <path> <model> <interpolation> <usage> [WARNING (ON / OFF)] 参数顺序固定;路径随模式表示文件或目录;多模型应放在同一个续行结构中。
HARMONIC_EOP NONE;或 [YES] <file> 非 NONE 路径调用 GHEO 读取文件。
ERM NONE;或 [YES] <file> 非 NONE 路径调用 GERM 读取文件。
VTD_CONF NONE / <file> 不允许重复;文件路径会检查是否存在。
EXTERNAL_TRP_DELAY NO / NONE;或 (USE / REQUIRE) DIRECTORY <directory> DIRECTORY 必须出现;两种启用模式都会检查目录能否打开。
ANTENNA_THERMAL NO / NONE;或 MODEL <model> <file> INSITU <usage_clause> 非关闭路径必须包含 MODEL 和 INSITU;LAGGED 虽能被解析,但下游实现不完整,不能作为正常可用模式。

这里的 <model> 不一定表示一组已在本层检查过的固定取值。例如,PLATE_MODEL 在这层只读取模型字符串,并没有像 METRIC_TENSOR 那样逐一检查名称。部分复杂子句的结构列举如下:

所属关键词 子项 取值与语法 限制与备注
EARTH_ORIENTATION <interpolation> LIN / CUB / SPL 按前三个字符匹配。
EARTH_ORIENTATION <zonal_option> UT1R / UT1S / NO_ZONAL 位于插值方式之后。
EARTH_ORIENTATION 参数顺序 文件或 NONE → 可选插值方式 → 可选 zonal 选项 不能任意交换。
POSITION_VARIATIONS <path> 文件或目录 HARMONIC_MODEL 使用文件;TIME_SERIES 使用目录。
POSITION_VARIATIONS <model> HARMONIC_MODEL / HMD;TIME_SERIES / TSR 每一组为长名称及其缩写。
POSITION_VARIATIONS <interpolation> CLOSE_POINT / CLS;LINEAR / LIN;SPLINE / SPL 每一组为长名称及其缩写。
POSITION_VARIATIONS <usage> REQUIRED / REQ;IF_AVAILABLE / AVL IF_AVAILABLE 不免除顶层路径的存在性检查。
POSITION_VARIATIONS 可选尾部 WARNING ON / OFF 从属于当前条目;省略时采用 SETUP.WARNING。
ANTENNA_THERMAL <model> INSTANT / AVERAGE;另有 LAGGED 解析入口 LAGGED 的下游计算未完整实现,见异常表。
ANTENNA_THERMAL <usage_clause> NO / NONE;USE <file>;REQUIRED <file> 属于 INSITU 子句。

注意两个容易混淆的拼写:EXTERNAL_TRP_DELAY 使用 REQUIRE,ANTENNA_THERMAL … INSITU 使用 REQUIRED。EARTH_ORIENTATION 的省略行为也不完全相同:指定插值方式、但省略 zonal 选项时,程序设为 UT1S;两者都省略时,设为 NO_ZONAL。

在本配置段内存在限制:

  • PLATE_MODEL 与 VELOCITIES 共用状态标志,不能作为两个可叠加的设置同时指定。
  • 非空的 POSITION_VARIATIONS 不能与 SETUP.TRAIN YES 同时使用。
  • 启用的 HI_FREQ_EOP 与 HARMONIC_EOP 互斥。
  • POSITION_VARIATIONS、SPLINE_DISPLACEMENTS、VTD_CONF、EXTERNAL_TRP_DELAY 和 ANTENNA_THERMAL 均有重复指定检查。
  • GMAPF 的普通分支读完主参数后,还会取走一个词并写入 NAME2,例如形成 SRCMAP2、STAMAP2 或 VELMAP2。

3.9 PARTIALS、CONTRIBUTIONS 与 MODE_CALIBRATIONS

这三个配置段的入口较少,因此合并介绍。它们都涉及名称选择,但语法并不相同:SET 是条目前缀,NO、NONE、IN 等是固定控制词,实际偏导项或校准项的名称则由文件或数据库提供。三者需要分开理解。

flowchart LR
    A["CTRLFL"] --> B["$PARTIALS:可选"]
    A --> C["$CONTRIBUTIONS:必需"]
    A --> D["$MODE_CALIBRATIONS:可选"]
    B --> E["GPART"]
    A -.->|"省略本段时仍初始化默认项"| E
    C --> F["GCONT"]
    D --> G["GMCAL"]
    E --> H["可选 SET;名称后可带 ON / OFF"]
    F --> I["可选 SET;固定控制词或名称列表"]
    G --> J["每条必需 SET;固定控制词或名称列表"]

图中的条目均由对应的 GPART、GCONT、GMCAL 直接解析。三者的源文件均位于 progs/solve/batch/。

3.9.1 PARTIALS(偏导数设置段)

本配置段选择要使用的偏导项,可以省略。即使省略,CTRLFL 仍会调用 GPART,加载可用偏导项及默认项。

关键词或入口 取值与语法 限制与备注
SET SET <partial_name> [ON / OFF] SET 可省略,也接受小写 set;省略开关时按 ON 处理。
<partial_name> <partial_name> [ON / OFF] 与带 SET 的形式进入相同处理路径;名称按前 8 个字符匹配,区分大小写。

可用名称和默认项通过 ATMAVL_N 从保存目录下的 partial_calibrations 文件读取。而开关的实际处理为:

写法 对当前选择的影响
<partial_name> ON 找到匹配名称后,将其设为当前选中项。
<partial_name> 与显式 ON 相同;省略开关时,应在名称后结束该行。
<partial_name> OFF 若它不是当前选中项,不改变选择;若它是当前选中的非默认项,恢复默认项;若它是当前选中的默认项,将选择编号设为 0。
多条配置 按读取顺序更新同一个 PART_APPLIED,不是分别维护多个独立开关。

因此,条目顺序可能影响最终结果。另一个需要注意的问题是:名称没有匹配时,当前实现不会报错,而是保留原有选择。拼写错误可能因此被忽略。相关代码在 progs/solve/batch/gpart.f:110;修正时应增加“是否匹配”的检查,并测试已知名称的 ON / OFF、默认项 OFF 和未知名称。

3.9.2 CONTRIBUTIONS(附加改正项设置段)

本段选择要加入的附加改正项,必须存在,并至少提供一个条目。每个条目前的 SET 都可以省略。

关键词或入口 取值与语法 限制与备注
SET 可选的条目前缀 后接固定控制词或改正项名称;也接受小写 set。
NO / NONE [SET] (NO / NONE) 必须作为本段唯一条目;不能与其他控制词或名称混用,也不能重复。
IN / DEFAULT [SET] (IN / DEFAULT) 必须作为本段唯一条目;不能与其他控制词或名称混用,也不能重复。
<contribution_name> [SET] <contribution_name> 可以提供多个名称;名称中的 _ 转为空格;此处不读取 ON / OFF。

多个名称可以写成:

 SET <contribution_name_1>
 SET <contribution_name_2>

解析器也接受同一行上的多个名称,但逐条写出 SET 更便于阅读。名称区分大小写;GCONT 只将名称加入列表,不在这里核验相应改正项是否存在。

3.9.3 MODE_CALIBRATIONS(模式相关校准设置段)

本段选择模式相关校准项,可以省略。一旦出现,就必须至少提供一个条目,而且每个条目都要以 SET 开头。

关键词或入口 取值与语法 限制与备注
SET 必需的条目前缀 每个条目都需要;也接受小写 set。
NO / NONE SET (NO / NONE) 两者都会触发“必须独占本段”的检查;当前实现使用了过宽的 NO 前缀判断。
IN SET IN 必须独占本段;当前实现误用 KNON 标志,但仍会执行独占检查。
<mode_calibration_name> SET <mode_calibration_name> 可以提供多个条目,每个名称前均须写 SET;名称区分大小写,_ 转为空格;不读取 ON / OFF。

例如:

 SET <mode_calibration_name_1>
 SET <mode_calibration_name_2>

DEFAULT 在 GMCAL 中没有专门的控制分支,不能照搬 $CONTRIBUTIONS 中的别名关系。

这里有两处实现问题需要区分:

  • NONE 会命中前面的两字符 NO 比较,因此它能够进入关闭控制分支;单独的 NONE 比较本身无效。问题在于匹配过宽,以 NO 开头的真实名称也可能被误判。
  • IN 分支设置的是 KNON,不是 KIN。独占检查仍会触发,但错误提示可能把 IN 当成 NO / NONE。 修正时应比较完整控制词,并让 IN 使用 KIN 标志。验证时需要覆盖 NO、NONE、IN 各自独立使用、重复、混用,以及以 NO 开头的名称。

这三个配置段的语法区别列举如下:

项目 $PARTIALS $CONTRIBUTIONS $MODE_CALIBRATIONS
配置段必须存在 否 是 否
SET 必须出现 否 否 每个条目都需要
名称后的开关 ON / OFF,省略按 ON 无 无
固定控制词 没有独立的 NO / NONE / IN / DEFAULT 控制分支 NO / NONE / IN / DEFAULT NO / NONE / IN
多个名称的处理 依次更新一个当前选中项 加入名称列表 加入名称列表

3.10 CONSTRAINTS(约束设置段)

$CONSTRAINTS 用于设置参数约束,包括约束强度、参与约束的测站或源,以及例外名单。是否估计这些参数,仍由 $FLAGS 等设置决定。本段必须存在,但没有单独必需的关键词;可以给出具体约束条目,也可以单独写 NONE。CTRLFL 调用 GCONST 解析本段。大部分关键词由 GCONST 直接读取,部分结构交给辅助程序。

flowchart LR
    A["$CONSTRAINTS:GCONST"] --> B{"当前入口"}
    B -->|STATIONS / VELOCITIES| C["GSTAVELCNST"]
    B -->|六类整体约束| D["GYNEXL"]
    B -->|NUVEL_COVAR| E["GNUVCOV"]
    B -->|其他受支持入口| F["GCONST 内部读取"]
    B -->|CLOCK_REF_REQ| X["报错并停止"]
    C --> G["继续读取;段末检查"]
    D --> G
    E --> G
    F --> G

其中,GYNEXL 先拆分整体约束的选项、开关和例外名单,再由 GCONST 检查各项选项。各入口的源码位置见下表。

关键词列举如下:

关键词 取值与语法 限制与备注
EARTH_ORIENTATION IN / NO / YES,后接相应子句 SIGMA、FACTOR、RATES 的顺序和参数数量见下表。IN、不带显式标准差的 YES 等写法,要求此前已设置 EOP 映射文件。
NUTATION NO;YES [[SIGMA] <sigma_1> <sigma_2>] 显式给出标准差时必须有两个;只写 YES 时,要求此前已设置章动映射文件。
ATMOSPHERES IN / DEFAULT / NO;(MOST / WEAKEST) <sigma>;YES <sigma> [EXCEPT <exception_sigma> <station>] WEAKEST 与 MOST 进入同一分支。只有 YES 分支读取例外,且只读取一个例外测站。
GRADIENTS NO;YES <offset_value> <rate_value> YES 后必须给出两个数值;不读取 SIGMA 固定词。
CLOCKS IN / DEFAULT / NO;(MOST / WEAKEST) <sigma>;YES <sigma> [EXCEPT <exception_sigma> <station>] 与 ATMOSPHERES 类似,例外只属于 YES 分支,且只读取一个测站。
CLOCK_REF_REQ 无可用取值 明确报错并停止。报错文字误写为 CLOCK_REQ_REQ,实际识别的关键词仍为 CLOCK_REF_REQ。
BASELINE_CLOCKS NO;YES [[SIGMA] <value>] 可以只写 YES;一旦写出 SIGMA,就必须提供数值。显式标准差的单位为秒。
NO_NET_TRANSLATION NO;YES [<file>] 保留的旧式入口。源码把所有非 YES 首值按关闭处理,本文仍只列规范写法 NO。
SOURCES NO;YES [[SIGMA] <value>] 可以只写 YES;写出 SIGMA 后必须给数值。全局解算中,此开关还会影响自行约束的执行,见本节末的异常表。
PROPER_MOTIONS NO;YES [[SIGMA] <value>] 可以只写 YES;写出 SIGMA 后必须给数值。当前全局计算中的开关判断有误,不能仅凭解析通过认定设置已生效。
STATIONS NO;<xyz_clause> <uen_clause> 除单独的 NO 外,必须同时给出 XYZ、UEN,两者顺序可换。
PIECE_WISE_STA NO;YES [SIGMA] <value> 与 SOURCES 等关键词不同,这里的 YES 后必须给数值。
VELOCITIES NO;<xyz_clause> <uen_clause> 与 STATIONS 使用同一个辅助解析程序,要求同时给出两个坐标系子句。
NUVEL_COVAR NO;YES <plate> [<weight>] [EXCEPT <station_list>] YES 后必须给出板块名称,只取前 4 个字符;权重可省略。
NO_NET_TRANSLATION_POSITION <options> (YES / NO) [EXCEPT <station_list>];单独关闭可写 NO 选项及 ALL / HORIZ 的要求见整体约束表。
NO_NET_ROTATION_POSITION [<options>] (YES / NO) [EXCEPT <station_list>] 支持 GLOBAL、LOCAL,也可以同时给出两者。
NO_NET_TRANSLATION_VELOCITY <options> (YES / NO) [EXCEPT <station_list>];单独关闭可写 NO 支持 GLOBAL,不支持 LOCAL;ALL / HORIZ 的要求见下表。
NO_NET_ROTATION_VELOCITY [<options>] (YES / NO) [EXCEPT <station_list>] 支持 GLOBAL,不支持 LOCAL。
NO_NET_ROTATION_SOURCE [<options>] (YES / NO) [EXCEPT <source_list>] 支持 GLOBAL、LOCAL,也可以同时给出两者。
NO_NET_ROTATION_PROPER_MOTION [<options>] (YES / NO) [EXCEPT <source_list>] 不接受 GLOBAL、LOCAL。标准差换算、权重标志和右端项传递均有实现问题,见本节末的异常表。
STRUCTURE_ADMITTANCE NO;YES SIGMA <value> 规范写法必须包含 SIGMA。当前拼写检查和重复检查不完整,后写的 NO 也不会清除已设数值。
IONOSPHERE_SCALE NO;YES SIGMA <value> 当前取值检查、缺值处理及重复检查不完整,见本节末的异常表。
NONE 独立关键词,无后续取值 应独占本段。它不执行“清空所有约束”;独占检查还存在顺序相关错误。

EARTH_ORIENTATION 的子句结构需要额外注意:

部分 取值与语法 限制与备注
基本分支 IN;NO;YES;YES FACTOR <factor>;YES [SIGMA] <sigma_1> <sigma_2> <sigma_3> 显式标准差必须给齐三个数值。
后续比例因子 FACTOR <factor> 源码在基本分支之后还会检查这一子句,因此它也能跟在显式标准差之后。
尾部速率控制 NO;RATES;RATES [SIGMA] <rate_sigma_1> <rate_sigma_2> <rate_sigma_3> 放在基本设置和比例因子之后;显式速率标准差必须给齐三个数值。

不过,这些部分不能任意排列。例如:

 EARTH_ORIENTATION YES RATES

这行会先进入 YES 分支的标准差读取过程,把 RATES 当成数值而报错。若要关闭速率约束,应在合适的基本设置后直接写尾部 NO,不要写旧说明书中的 RATES NO;后者同样会把 NO 当成数值读取。

STATIONS 与 VELOCITIES 的结构几乎一致。除单独的 NO 外,必须给出 XYZ、UEN 各一次:

子句 取值与语法
<xyz_clause> XYZ NO;或 XYZ (YES / NO) SIGMA <x> <y> <z> [EXCEPT <station_list>]
<uen_clause> UEN NO;或 UEN (YES / NO) SIGMA <u> <e> <n> [EXCEPT <station_list>]

使用时注意:

  • YES 后必须有 SIGMA 和三个数值。
  • NO 可以单独使用,也可以带 SIGMA 和例外名单。
  • 若要在 NO 后使用 EXCEPT,前面仍须给出 SIGMA 和三个数值。
  • XYZ、UEN 的顺序可交换,并支持 \ 续行。

例如,下面只展示语法结构:

 STATIONS XYZ YES SIGMA <x> <y> <z> \
          UEN NO

六类整体约束选项共同结构为:

 <keyword> <options> (YES / NO) [EXCEPT <object_list>]

GYNEXL 先收集 YES / NO 之前的选项,再读取开关和例外名单,最后把选项交回 GCONST 检查。

关键词或入口 分量选项 权重选项 范围选项 数值子项
NO_NET_TRANSLATION_POSITION ALL / HORIZ UNIFORM / WEIGHTED GLOBAL、LOCAL SIGMA <value>;RIGHT_PART <r1> <r2> <r3>
NO_NET_ROTATION_POSITION — UNIFORM / WEIGHTED GLOBAL、LOCAL SIGMA <value>;RIGHT_PART <r1> <r2> <r3>
NO_NET_TRANSLATION_VELOCITY ALL / HORIZ UNIFORM / WEIGHTED GLOBAL SIGMA <value>;RIGHT_PART <r1> <r2> <r3>
NO_NET_ROTATION_VELOCITY — UNIFORM / WEIGHTED GLOBAL SIGMA <value>;RIGHT_PART <r1> <r2> <r3>
NO_NET_ROTATION_SOURCE — UNIFORM / WEIGHTED GLOBAL、LOCAL SIGMA <value>;RIGHT_PART <r1> <r2> <r3>
NO_NET_ROTATION_PROPER_MOTION — UNIFORM / WEIGHTED — SIGMA <value>;RIGHT_PART <r1> <r2> <r3>,但当前实现存在问题

还有以下限制:

  • 启用两类平移约束时,应显式给出 ALL 或 HORIZ。只写 YES 会留下内部标记 ??,不宜作为正常配置示例。
  • 单独关闭时,可以写 <keyword> NO。
  • 支持 GLOBAL、LOCAL 的三个分支可以同时设置两者;两者都未指定时,源码补设 GLOBAL。
  • 开关之前的选项顺序较灵活,但 SIGMA 后的数值、RIGHT_PART 后的三个数值必须紧跟对应固定词。
  • 规范写法应显式给出 YES / NO。虽然解析器在行尾没有开关时会按 YES 处理,但省略开关会使配置不易读懂。
  • RIGHT_PART 使用定宽实数格式读取,数值应显式带小数点。
  • GCONST 传入 M_KEYS=10;结合 GYNEXL 的循环边界,开关之前实际最多容纳 9 个词,固定词和数值都计数。

在本配置段中,NONE 只设置本配置段的控制标志,不会逐项关闭已经设置的约束,也不会清除默认值。例如,GCONST 初始化时将基线时钟约束标志设为:

KBSL_CONST = .TRUE.

因此,不能将下面的配置直接解释为“所有约束均关闭”:

$CONSTRAINTS
 NONE

若要明确关闭某一项,应使用对应的 NO,并确认该关键词没有已知的实现问题。NONE 也不应放在其他约束之后充当“全部取消”;这样写可能通过当前的独占检查,但前面设置的约束仍然保留。

3.11 SUPPRESSION(数据与参数剔除设置段)

$SUPPRESSION 用于进一步限制参与解算的参数,包括分量剔除、测站绑定和部分整体限制。它与 $FLAGS 的作用不同:$FLAGS 决定估计什么,本段则对已有参数设置进一步限制。例如,分量入口中的 YES 表示剔除相应分量,而不是开启估计。CTRLFL 调用 GSUPRS 解析本段,并传入 $FLAGS 中的测站分量和参考测站名称。$FLAGS 和 $CONSTRAINTS 都必须先于 $SUPPRESSION 出现。 本段必须存在,但没有单独必需的关键词;不使用本段设置时,应单独写 NONE。

flowchart LR
    A["$SUPPRESSION:GSUPRS"] --> B{"当前入口"}
    B -->|分量及例外| C["GVELSP / GPROPSP / GSRCSP / GSTASP"]
    B -->|整体选择及例外| D["GVLOSP / GRAOSP / GDCOSP / GORISP"]
    B -->|测站绑定组| E["GVELTIE / GSTATIE"]
    B -->|其他受支持入口| F["GSUPRS 内部读取"]
    B -->|NUTATION / TIDES| X["报错并停止"]
    C --> G["继续读取;段末检查"]
    D --> G
    E --> G
    F --> G

图中合并显示了同类入口的辅助解析程序,各关键词对应的源文件见下表。CHKCMP 是分量解析器内部使用的校验函数,没有在图中展开。段末检查存在遗漏,因此“解析通过”不一定表示配置组合合理。

关键词总表

关键词 取值与语法 限制与备注
VELOCITIES (YES / NO / <uen_components>) [EXCEPT <component_station_groups>] 分量按 UEN 检查;例外部分必须先指定分量,再列测站。
PROPER_MOTIONS (YES / NO / <rd_components>) [EXCEPT <component_source_groups>] 分量按 RD 检查;段末检查遗漏了这个关键词,单独使用会被误判为缺少关键词。
VELOCITY_ORIGIN NO;(YES / NO) <origin_mode> [EXCEPT <station_list>] 只写 YES 不完整,必须给出模式。传入的测站分量串恰为 UEN 时,主入口拒绝非 NO 设置。
VELOCITY_TIE NO;[YES] <station_group> [AND <station_group> …] YES 可省略;AND 分隔不同组。同一测站不能属于不同速度绑定组。
STATION_TIE NO;[YES] <station_group> [AND <station_group> …] YES 可省略。与速度绑定不同,本解析器没有相同的跨组重复检查;后一次组号会覆盖前一次。
NONE 独立关键词,无后续取值 应独占本段;它本身不逐项清零。当前独占检查遗漏了部分入口。
NUTATION 无可用取值 明确报错并停止,NUTATION NO 也不能使用。
PRECESSION 预期为 YES / NO,当前实现异常 YES 进入报错路径;NO 及其他非 YES 输入反而设置 PRESUP=.TRUE.。
RELATIVITY YES / NO 两个分支分别开启、关闭此参数的剔除。
TIDES 无可用取值 明确报错并停止,TIDES NO 也不能使用。
DIRECTION NO;[YES] <station_1> TO <station_2> YES 可省略,TO 必须出现。参考测站位于第二站时,交换两站的代码有误。
SOURCES (YES / NO / <rd_components>) [EXCEPT <component_source_groups>] 例外部分必须先指定分量,再列源名。
RIGHT_ASCENSION (YES / NO) [EXCEPT <source_list>] 例外部分是名称列表,不读取分量子项。
DECLINATION (YES / NO) [EXCEPT <source_list>] 例外部分是名称列表,不读取分量子项。
STATIONS (YES / NO / <station_components>) [EXCEPT <component_station_groups>] 分量与传入的 $FLAGS STATIONS 分量串逐位比较,不是无条件接受所有 XYZ、UEN 组合。
STATION_ORIGIN (YES / NO) [EXCEPT <station_list>] 非 NO 设置要求传入的测站分量串恰为 XYZ。
SUPPRESS_FILE NONE / <existing_file> 属于 $SUPPRESSION。NONE 清空文件名;其他值检查文件是否存在。本入口没有重复检查,也遗漏于段末非空检查。

源坐标和站坐标的分量、模式与列表结构列举如下:

占位符或子项 取值与语法 限制与备注
<uen_components> UEN / UE- / U-N / -EN / U-- / -E- / --N / --- 用于 VELOCITIES,不采用 XYZ 写法。字母表示剔除该分量,短横线表示不剔除。
<rd_components> RD / R- / -D / -- 用于 SOURCES、PROPER_MOTIONS。字母与短横线的含义同上。
<station_components> 与传入测站分量串长度相同;每一位为对应字符或 - 例如传入 XY- 时,规范组合为 XY- / X-- / -Y- / ---。当前校验存在缺陷,见本节末的异常表。
<component_station_groups> <components_1> <station_list_1> [<components_2> <station_list_2> …] EXCEPT 后先给分量;遇到新的分量组合后,后续测站改用这一设置。
<component_source_groups> <rd_components_1> <source_list_1> [<rd_components_2> <source_list_2> …] 同样必须先给分量,再列源名。
<origin_mode> HORIZ_ONLY / VERT_ONLY / BOTH / XYZ;兼容别名 HORIZ HORIZ 在这里等同于 BOTH,不等同于 HORIZ_ONLY。
<station_group> 空格分隔的测站名列表 组间使用 AND,支持 \ 续行。
<station_list>、<source_list> 空格分隔的名称列表 与带分量的例外列表区分;相关解析器支持 \ 续行。

分量例外列表可以写成:

 VELOCITIES NO EXCEPT U-- <station_1> <station_2> \
                      -EN <station_3>

 SOURCES NO EXCEPT R- <source_1> \
                  -D <source_2>

这里先用 NO 设置默认不剔除,再为例外对象指定要剔除的分量;例外分量不是简单地把默认开关取反。

绑定组可以写成:

 VELOCITY_TIE YES <station_1> <station_2> \
              AND <station_3> <station_4>

这两组彼此独立。绑定约束作用于估计的改正量,不能直接理解为让两站的绝对坐标或绝对速度相等。这些示例只展示语法,使用前需要替换占位符。同一测站应避免出现在多个绑定组中。VELOCITY_TIE 会明确拒绝跨组重复;STATION_TIE 则会用后一次组号覆盖前一次,不会合并两个组。

GSUPRS 的段末检查没有覆盖所有入口:

配置情况 当前解析结果
仅写 NONE 通过段末检查。
仅写 PROPER_MOTIONS … 已解析,但仍会报告缺少关键词。
仅写 SUPPRESS_FILE … 已解析,但仍会报告缺少关键词。
仅写 DIRECTION NO 没有设置 KDIR,仍会报告缺少关键词。
NONE 与上述入口组合 可能通过独占检查,因为相应的出现标志被遗漏或没有设置。

因此,更应该将 NONE 规定为独立使用。它表示保留本段初始化后的状态,不是“取消此前所有设置”的命令;也不应利用上述检查遗漏,把它与其他条目混用。

3.12 ARCS(实验列表段)

$ARCS 列出本次解算要处理的实验,以及各次实验的单独设置。这部分的记录结构和选项较多,将另文说明;这里先交代它与前面各段的连接关系。

处理阶段 程序 主要任务
预处理与列表检查 CTRLS;GVF/GVH 路径调用 CH_DB_GVF 读取外部实验列表,查找数据库入口,生成 .XPND
配置段读取 CTRLFL 保存实验列表的读取位置,并统计有效记录数
逐次实验处理 PRCES → ARCSET → GARC 重新定位到实验列表,读取实验记录及其选项

因此,前文的 ARCFILE <file>、$SETUP 中的 ARC_FILES 和实验记录里的选项分属不同用途:ARCFILE 引入实验列表,ARC_FILES 设置实验中间结果文件,而 GARC 负责解析具体实验的选项。

3.13 CTRLFL 的处理过程

CTRLFL 按文件顺序识别配置段,调用相应解析程序,并检查配置段是否重复、缺失或违反部分顺序要求。它接手的文件已经由 CTRLS 预处理,并通过 CFOPEN 打开。

flowchart LR
    A["初始化配置及共享状态"] --> B{"CFREAD:下一条记录"}
    B -->|"配置段标题"| C{"检查标题并分派"}
    C -->|"普通配置段"| D["调用相应解析程序"]
    C -->|"$ARCS"| E["保存位置并计数"]
    D --> B
    E --> B
    B -->|"文件结束"| F["补充默认值并检查必需段"]
    F --> G["返回 CTRLS"]

图中省略了报错终止分支。CFREAD 返回下一条有效记录;在主循环中,这条记录应当是配置段标题。

1. 初始化部分配置和共享状态。

程序先设置几个初始值:

USER_PROG      = ' '
USER_PART_PROG = ' '
KUSER_PART     = .FALSE.
KGLOBONLY      = .FALSE.
USER_BUFF      = 'N'
EOPMID         = 0

随后读取、清零并写回 GLBC3 对应的共享数据区,同时重置若干约束标志和索引。关键调用为:

CALL USE_GLBFIL_3 ( 'OR' )
CALL NOUT ( JGLBC3_BLOCKS*INT2(BLOCK_BYTES), BEGMARK_GLBC3_I2 )
! 此处还重置若干标志和索引。
CALL USE_GLBFIL_3 ( 'WC' )

所以,解析控制文件会修改共享状态,并伴随状态文件的读写。这里也只初始化了一部分变量;其他默认值仍由各段的解析程序设置。

2. 通过 CFREAD 取得配置段标题。

主循环结构为:

LENGTH = CFREAD(STRING)
DO WHILE (.NOT. CFEOF(IDUM))
   ! 检查段标题并调用对应的解析程序。
   LENGTH = CFREAD(STRING)
ENDDO

每次进入循环,CTRLFL 都要求当前记录的第一列为 $,再用 SPLITSTRING 取出段名。

主循环读取段标题,段内配置由被调用的解析程序继续读取。 这些程序通常在遇到下一段标题后,通过 CFUNRD 把标题放回读取缓冲区,使 CTRLFL 的下一次 CFREAD 能取到它。因此,CTRLFL 并不是先读出全部配置行,再逐行分发。

3. 按文件中的顺序调用解析程序。

遇到 $SETUP 就调用 GSETUP,遇到 $FLAGS 就调用 GFLAGS,其他配置段也按同样方式分派。多数分支采用以下结构:

IF ( KFLAGS ) CALL FERR(...)
CALL GFLAGS(...)
KFLAGS = .TRUE.

这里的 KFLAGS 表示“是否已经处理过 $FLAGS 段”,不是某个参数的估计开关。各个段标志主要用于检查重复段,以及在文件末尾检查必需段是否齐全。

源码中各分支的排列顺序不等于实际读取顺序。实际顺序由控制文件决定,程序只对第 3.1 节列出的部分先后关系做了显式检查。

4. 对 ARCS 保存位置并计数。

$ARCS 是特殊分支:CTRLFL 此时不调用 GARC,而是执行下面的读取过程。

CALL CFPOS ( ARCREC )
ITARCS = 0
LENGTH = CFREAD(STRING)

DO WHILE ( STRING(1:1).NE.'$' .AND. .NOT.CFEOF(IDUM) )
   ITARCS = ITARCS + 1
   LENGTH = CFREAD(STRING)
ENDDO

CALL CFUNRD ( LENGTH, STRING )
KARCS = .TRUE.

它保存内部读取位置 ARCREC,统计 CFREAD 返回的实验记录数 ITARCS,并把读取到的下一段标题放回缓冲区。ARCREC 是 CFPOS 与 CFSPOS 使用的内部记录位置,不是字节偏移,也不是实验编号。后续的 PRCES 用它重新定位实验列表。ITARCS 与 CTRLS 中的 NARCS 来源也不同:前者统计展开文件中的有效记录,后者来自前面的实验列表解析和数据库检查。

5. 完成依赖整份文件的设置。

部分值要等整份文件读完才能确定。例如:

IF ( FWDOUT .LT. 0 ) FWDOUT = ITARCS

这对应前文的 OUTPUT.FORWARD LAST:先保存标志,知道实验总数后,再将它换成最后一次实验的编号。若省略 $PARTIALS,程序仍执行:

IF ( .NOT. KPART ) CALL GPART ( KPART )

此时 GPART 初始化可用偏导项及默认选择,但不读取该段配置。$MODE_CALIBRATIONS 没有对应的“缺省时补调用 GMCAL”路径。

6. 检查必需配置段,返回 CTRLS。

文件末尾检查 11 个必需段是否都已出现:$SETUP、$FLAGS、$OUTPUT、$CARRY、$DATA、$CALIBRATIONS、$CONTRIBUTIONS、$MAPPING、$CONSTRAINTS、$SUPPRESSION 和 $ARCS。缺少任意一个都会报错;只有 $PARTIALS 和 $MODE_CALIBRATIONS 可省略。这一检查只确认配置段存在。各段中的关键词、参数数量和组合是否有效,仍由对应解析器及后续检查决定。