batch控制文件总览
编写控制文件是 pSolve 全局解算的重要步骤。这里从源代码层面整理控制文件的结构和语法规范。Leonid 曾经编写过相关说明 solve_guide_03.syn,可以结合阅读。
控制文件通常是在已有文件的基础上修改的,不必从头编写。例如,可以使用 gsf2026b 的控制文件,根据自己的解算需求修改其中的设置。
本文用以下三个名称描述控制文件的结构:
- 配置段:段标题及其后面的配置内容,例如整个
$SETUP段。 - 配置段标题:配置段开头的标记,例如
$SETUP。 - 配置关键词:配置段内各项设置的名称,例如
SOLUTION、ARC_FILES。
例如:
$SETUP
SOLUTION COMPLETE
ARC_FILES /scr/psolve/sub_matrices
这里,$SETUP 是配置段标题,SOLUTION 和 ARC_FILES 是配置关键词,关键词后面是取值或参数。这几行共同组成一个配置段。
同一配置段内,相互独立的关键词通常可以调整顺序。但有些设置依赖前面已经读取的内容,不能随意换序。每个关键词后面的参数和子句,也要按规定的顺序书写。例如,在 $SETUP 段中,程序读到 WEIGHTS MAKE 时,如果当前 FAST_MODE 不为 NONE,而且还没有读到 FAST_COV,就会报错。因此,建议先写 FAST_MODE、FAST_COV,再写 WEIGHTS。
第一列为 * 的行是注释行。配置段标题也要从第一列开始写。$SETUP 应放在第一个配置段,因为它会设置基本配置,并初始化后续程序需要的变量。但它不必是文件的第一行,前面可以有空行和注释。需要说明的是,CTRLFL 并没有直接检查 $SETUP 是否排在第一位。
对于其他配置段,CTRLFL 明确检查了以下顺序:
$FLAGS必须在$CARRY之前。$FLAGS和$CONSTRAINTS必须在$SUPPRESSION之前。
控制文件中还可以使用预处理指令。这些指令由 CTRLS 处理,例如插入外部文件的内容、设置环境变量等。处理后的内容写入一个以 .XPND 结尾的文件,再由 CTRLFL 读取并解析各个配置段。
下面是处理过程的总览图。“必需”表示不能省略该配置段;配置段的排列仍要遵守前面的顺序要求。图中所有源文件均位于 psolve/progs/solve/batch/ 目录下。
关于预处理,还需要注意以下几点:
@file、DEFINE、UNDEFINE和行首${VAR}只在CTRLS读取$ARCS之前的内容时处理,不能放在任意位置。@file会把外部文件的内容直接复制到.XPND文件中。如果外部文件中还有这些预处理指令,程序不会继续展开或执行它们。UNDEFINE会把环境变量设为空字符串,不会删除这个环境变量。- 当前源码中的
${VAR}展开有错误:程序用固定的STR(4:)拼接后续内容,没有根据}的位置截取字符串;展开后的内容也没有写入.XPND文件。因此,当前不宜使用这一功能。 ARCFILE用于读取外部实验数据列表。$ARCS GVF和$ARCS GVH由另一段代码处理,不能直接套用ARCFILE的处理方式。
最后,还有两点需要说明。$PARTIALS 可以省略,但省略时 CTRLFL 仍会调用 GPART 设置默认值。对于 $ARCS,CTRLFL 只统计记录数并保存读取位置,之后再由 GARC 逐条解析实验数据记录。