pSolve batch 控制文件总览
编写控制文件是 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 可省略。这一检查只确认配置段存在。各段中的关键词、参数数量和组合是否有效,仍由对应解析器及后续检查决定。