pSolve 更新记录

· 预计阅读 15 分钟

本文记录 pSolve 的主要版本更新,重点说明功能变化、问题修复及其对实际解算的影响。各版本按从新到旧的顺序排列。

说明:本文所列更新由 DeepSeek 总结、ChatGPT 整理,属于非官方更新记录,并非 pSolve 开发者 Leonid Petrov 博士发布的更新说明。对修改目的和实际影响的推测,会在文中单独说明。

最近记录版本:psolve-20261015 (1.14)
本文更新日期:2026-10-22

20261015

  • 对比版本:20260812(1.13 → 1.14)。

这次更新主要涉及 SINEX 文件输出、相位时延模糊度处理,以及几个配套工具能够处理的数据量。下面的文件路径均以 pSolve 目录为起点。

更新内容

  • 调整|SINEX 文件中的实验和软件信息:实验代号以前通过查询 master 文件获取,现在直接使用 EXP_CODE。软件版本也直接取自 SOLVE_VERSION,不再读取单独的版本日期文件。此外,软件名称由 Calc/Solve 改为 SGDASS,硬件信息中不再固定加上 HP。
    对应文件:progs/solve/adjst/write_sinex.f。
  • 调整|SINEX 程序中的整数类型:记录参数个数的变量由 2 字节整数改为 4 字节整数。调用矩阵缩放程序时,也去掉了将矩阵阶数转换成 2 字节整数的 INT2()。
    对应文件:progs/solve/adjst/write_sinex.f。
  • 调整|射电源名称表的文件位置:生成 SINEX 时,程序现在读取 /apr/sou/source.names。这个路径直接写在代码里;如果文件不存在或无法读取,程序就会报错并停止这次 SINEX 输出。拼接目录和文件名时,也补上了中间的 /。
    对应文件:progs/solve/adjst/write_sinex.f、libs/cutil/get_source_table.f。
  • 调整|PAMB 对过大时延的处理:为避免异常时延导致崩溃,增加了两处处理。一处是在计算整周数时,若其绝对值达到或超过 $10^8$,就将整周数设为零;另一处是在 S 波段的处理分支中,先把时延限制在 −1 ms 到 1 ms 之间,再计算整周模糊度。
    对应文件:progs/solve/pamb/pamb_init.f、progs/solve/pamb/pamb_mares.f。
  • 调整|射电源名称表可以保存更多源:MAX_SOU 从 44444 增至 65000,SINEX 中的名称表也采用这个上限。单次实验相关数组使用的 MAX_SRC 仍为 32752,没有随之增加。
    对应文件:include/solve_i.templ、include/solve.i、progs/solve/adjst/write_sinex.f。
  • 调整|先验 EOP 表的大小:先验 EOP 数组的上限从 7 个数据点改为 5 个,即 MAX_EROT_VALUES 从 7 改为 5。SOCOM 公共块末尾的预留空间相应增加了 48 字节。
    对应文件:include/solve_i.templ、include/solve.i、include/socom.i、include/q_socom.i。
  • 新增|查找两位年份的 master 文件:程序先查找 masterYYYY.txt 或 masterYYYY-int.txt;找不到时,再尝试 masterYY.txt 或 masterYY-int.txt。
    对应文件:libs/cutil/resolve_dbname.f。
  • 调整|电离层断点日期的读取位置:读取断点文件时,日期改从每行的第 55—77 列读取,原来是第 59—81 列。
    对应文件:utils/iono/est_iono_mod.f。
  • 新增|eopkal 在没有数据时退出:测量数小于 1 时,程序会打印提示并退出。不过,这个判断之前已经读取了 FJD_MEAS(1),判断语句还应该移到读取操作之前。
    对应文件:utils/eopkal/eopkal_head.f。
  • 调整|配套工具可以处理更多记录:remove_badeop 能保存的待剔除记录从 8192 条增至 32768 条;spl_find_bcl 和 spl_find_breaks 能读入的文本从 4194304 行增至 6291456 行,方便处理更大的解算输出报告。
    对应文件:utils/procpar/remove_badeop.f、utils/procpar/spl_find_bcl.f、utils/procpar/spl_find_breaks.f。
  • 调整|清理编译文件和调试输出:make clean 现在也会清理 utils/gen_rot_adm 中的编译文件;另外,修正了 prces.f 中的一条调试输出语句。
    对应文件:Makefile.in2、progs/solve/batch/prces.f。
  • 移除|预先编译好的 gen_rot_adm:软件包不再附带 bin/gen_rot_adm。源码仍保留在 utils/gen_rot_adm 中,需要这个工具时可以自行编译。

使用提示

  • 更新后重新配置并完整编译。这次修改了多个公共变量和数组的定义,需要让各个程序都使用新版定义。
  • 生成 SINEX 前,检查 /apr/sou/source.names 是否存在且可读。如果后处理脚本依赖 SINEX 文件名或其中的软件名称,也要检查是否需要修改脚本。
  • 使用电离层断点文件时,检查日期所在的位置。新版程序读取的是第 55—77 列。
  • PAMB 遇到异常时延后能够继续计算,也仍需检查对应观测。新增代码会将部分数值设为零或限制在指定范围内,并没有修正原始观测。
  • PRFIL 的读写长度有一处需要检查。按变量声明计算,射电源名称表扩大后,PRFIL 所需的存储空间增加了约 370000 字节,但读写记录的长度没有同步增加,可能导致部分数据没有完整保存。需要检查 include/prfil.i 及相关读写程序。另外,SOCOM 中部分变量的位置发生了变化,继续使用旧版生成的二进制保存文件前,也需要检查文件格式是否兼容。
  • 两个报告分析工具需要更多内存空间。spl_find_bcl 和 spl_find_breaks 用来存放文本的数组分别从 1 GiB 增至 1.5 GiB。

20260812

  • 对比版本:20260216。

本次主要扩展台站位置时间序列工具,新增 NNR 约束调整工具,并修正台站参考位置和参考历元的换算。

更新内容

  • 调整|B 样条台站位置工具:bsp_plot 更名为 bsp_proc。生成位置时间序列表格时,可以读入 .hps 文件,叠加台站运动的谐波项;输出增加日内 TAI 秒数和 X、Y、Z 方向的位置误差,日期扩展到时分秒。
    对应文件:utils/procpar/bsp_proc.f。
  • 调整|线性台站位置工具:linvel_plot 更名为 linvel_proc。根据位置、速度的误差及其相关性,计算各历元的位置误差,并写入时间序列表格。
    对应文件:utils/procpar/linvel_proc.f。
  • 新增|NNR 约束调整工具:新增 gen_rot_adm,读取 7 次试验解算的对齐结果,计算 NNR 位置、速度约束右端项对地球参考架旋转和旋转速率的影响,生成包含 6×6 矩阵的 .rot 文件。
    对应文件:utils/gen_rot_adm/gen_rot_adm.f。
  • 调整|eop_alignment 约束计算:支持设置 rot_0、rot_1p 等试验条件,也可以读取 .rot 文件,重新计算 NNR 约束右端项;输出补充起止日期和时间跨度,并调整参考历元等信息的格式。
    对应文件:utils/eop_alignment/eop_alignment.f。
  • 修复|参考历元换算:修正 eop_alignment 中半天项的符号,解决参考历元正反转换相差一天的问题。
    对应文件:utils/eop_alignment/eop_alignment.f。
  • 修复|SPE 台站参考位置计算:输出 APS 行时,将历元差除以 365.25,正确地把天换算成年;旧代码除以 86400,会算错台站速度带来的位置变化。
    对应文件:progs/solve/adjst/spe_res.f。
  • 新增|逐条观测的调试输出:设置 SOLVE_DEBUG=SNGL_OUT 后,输出每条观测的时间、台站、射电源、仰角、方位角、时延 O−C、误差及偏导等信息,便于检查具体观测。
    对应文件:progs/solve/proc/loop.f。
  • 修复|仰角输出中的台站名称:OUT_ELEV 改为输出当前观测对应的两个台站名称,修复此前始终使用台站表中前两个名称的问题。
    对应文件:progs/solve/proc/loop.f。
  • 调整|先验射电源星表标签:update_apr_cat 遇到原有的 rfc_ 标签时,替换为新标签;遇到其他说明时,在前面插入新标签,保留后面的内容。同时调整 apriori 标记的列位置。
    对应文件:utils/procpar/update_apr_cat.f。
  • 调整|getpar 射电源数量上限:M_SOU 从 44444 增加到 50000。
    对应文件:include/getpar.i。
  • 调整|依赖要求与构建安装:VTD 最低版本提高到 20260812;构建和安装流程加入 gen_rot_adm,并改用 bsp_proc、linvel_proc。TLE 版本检查改用 SOLVE_TLE_DIR 查找链接库,并补充 BLAS 链接项。
    对应文件:configure、Makefile.in2、utils/procpar/makefile、support/check_tle_version.mak。
  • 新增|台站位置文件格式说明:新增台站位置时间序列的格式文档,并修正文件标识中 Evolution 的拼写。
    对应文件:doc/ste_format.txt、include/solve_i.templ。
  • 调整|电离层模型调试输出:est_iono_mod 在 IVRB=5 时增加原始记录编号,便于回查数据。
    对应文件:utils/iono/est_iono_mod.f。

使用提示

  • 控制文件:本次没有修改 pSolve 控制文件的关键词。eop_alignment 的第 12 个命令行参数可以填写试验名称或 .rot 文件,第 13 个参数用于设置输出详细程度;原来将 0–9 的输出级别放在第 12 位的调用方式仍然保留。
  • 解算结果:当台站速度非零、先验历元与输出历元不同时,时间换算修正会改变 SPE 结果中 APS 行的坐标。如果后续位置时间序列使用了这些坐标,应重新生成相关结果。eop_alignment 的历元修正也可能改变参考架对齐和约束计算结果。
  • 安装与运行:升级前确认 VTD 版本不低于 20260812,并修改脚本中的旧程序名。安装脚本中删除旧 linvel_plot 的文件名存在拼写错误,升级后旧程序可能仍然保留。gen_rot_adm 只汇总试验结果,不会自动完成 7 次解算,需要事先准备完整的 PHI、OME 输出。
  • 输出文件:两个台站位置工具都增加了误差列,bsp_proc 的日期字段也变宽了,按固定列读取的脚本需要同步修改。SNGL_OUT 写入 SOLVE_DIR_DEBUG 指定的目录,未设置时使用 /tmp;其表头中部分列号有误,例如 AZ2 实际位于第 117–124 列,读取时应以 loop.f 中的 FORMAT 386 为准。
  • 位置误差计算:bsp_proc 的位置误差和协方差计算对速度项使用了不同的时间缩放,需要核对后再将误差用于后续加权。另外,不提供 .hps 文件时,台站编号 I_STA2 没有显式初始化,可能误入谐波计算分支,应在读取可选文件前将其设为零。

20260216

  • 对比版本:20251127。

本次主要更新解算输出报告和 getpar 的大气参数文件,增加气象数据导出,并修改台站运动的 B 样条约束及部分全局解算流程。

更新内容

  • 调整|解算输出报告格式:新增 LISTING_OPTIONS SEG_STYLE POST2026,并将其设为默认格式。采用该格式时,程序会自动启用 APRIORI_ZENDEL;钟差、大气参数和 EOP 的输出也相应调整。未估计单次实验的 EOP 时,报告会给出说明。
    对应文件:include/glbc4_i.templ、progs/solve/batch/goutpt.f、progs/solve/adjst/a2jst_plneop.f。
  • 调整|天顶延迟与气象统计输出:新格式的 at 行同时给出先验总天顶延迟、先验湿天顶延迟、估计的改正量和误差。配套的 ATZE 中间文件增加湿天顶延迟,报告的大气统计增加平均气压和平均气温。
    对应文件:progs/solve/cres/secnd.f、progs/solve/adjst/a1jst.f。
  • 调整|getpar 大气参数输出:支持读取 POST2026 格式的解算输出报告。.trp 格式更新为 2.0,分别输出先验总延迟 Apr_tot、先验湿延迟 Apr_wet、改正量 Adj、估计后的总延迟 Tot_est 和误差 Err;.trs 的格式标识更新为 1.1,并保留新增的气象统计信息。
    对应文件:utils/getpar/getpar_parse.f、utils/getpar/getpar.f、include/getpar.i。
  • 新增|观测时刻的气象数据导出:SOLVE_EXPORT 增加 print_meteo 选项,将各台站的观测气压、气温、相对湿度,以及数值天气模型的气压和水汽分压写入 <数据库名>_meteo.info,时间使用 UTC。
    对应文件:progs/solve/proc/loop.f。
  • 调整|TPD 文件中的气象数据:TPD__NDER 从 25 增加到 29,新增四个位置,用于保存基线两端台站的模式气压和水汽分压。读写程序同步更新,从 TPD 文件恢复理论时延时,也能恢复这些气象数据。
    对应文件:include/solve_i.templ、progs/solve/proc/post_vtd.f、progs/solve/proc/tpd_put.f、progs/solve/proc/tpd_get.f。
  • 修复|台站运动的 B 样条约束方程:此前,同一节点区间内的 6 个采样点反复写入同一个约束方程,最终只保留最后一个采样点的系数;现在为各采样点分别建立方程。相关配置的报错信息也增加了台站名称。
    对应文件:progs/solve/norml/spe_cnst.f、progs/solve/batch/parse_spe.f。
  • 调整|仅求全局参数的处理:使用已有全局法方程进行 GLOBAL_ONLY 解算时,增加 SFLAGS 调用,按本次配置设置参数估计标志,并保存相应状态。
    对应文件:progs/solve/batch/prces.f。
  • 调整|用户自定义参数处理:生成 USRG 文件时,参数计数和循环下标改用 INTEGER*4;未启用用户参数时,将用户参数计数清零。相关文件的读取程序不再跳过以 * 开头的行。
    对应文件:progs/solve/norml/create_usrg.f、libs/cutil/parcng.f、progs/solve/batch/prces.f。
  • 修复|模糊度重置:SOLVE_DEBUG=AMB_RESET 现在会同时撤销群延迟和相位延迟中的模糊度改正,并清零两类模糊度计数;此前只处理群延迟。
    对应文件:progs/solve/proc/loop.f。
  • 调整|交互式数据库选择:输入数据库名后统一进行通配匹配,找不到数据库时的提示增加仓库名称;调用端同步传入当前仓库。
    对应文件:progs/solve/getdb/getdb_select.f、progs/solve/getdb/getdb_do.f。
  • 修复|未设置的模型文件名判断:检查台站坐标、源坐标、速度和板块运动模型是否设置时,同时识别空格和空字符(NUL),避免尝试读取未设置的模型文件。
    对应文件:progs/solve/norml/norml_main.f。
  • 修复|电离层数据中的异常数值处理:计算基线两端 GNSS 天顶电离层延迟的相关系数时,若分母过小,将相关系数设为零。dtec_import 读取误差字段中的 ******** 时,改用 9999.999,避免直接将星号作为数值读取。
    对应文件:utils/iono/est_iono_mod.f、utils/iono/dtec_import.f。
  • 修复|电离层工具的参数传递和输出:gen_iono_err_regr 调用 LOAD_IONO_SOLVE 时补传 IONO_EST;写出附加电离层权重文件时,明确从第一条记录读取随机种子。
    对应文件:utils/iono/gen_iono_err_regr.f、utils/iono/wri_add_iono_wei.f。

使用提示

  • 控制文件:未指定 SEG_STYLE 时,现在默认使用 POST2026。需要保留旧输出布局时,可以显式选择 PRE2005 或 POST2005。要输出各段的先验总天顶延迟和湿天顶延迟,还需要设置 SEG_OUTPUT YES。
  • 解算结果:启用 CNS_DER_SIGMA 的台站运动解算会使用更多约束方程,结果可能改变。使用已有全局法方程进行 GLOBAL_ONLY 解算时,也应核对本次配置下的参数选取和估计结果。
  • 安装与运行:建议重新配置并完整编译,使各程序使用一致的公共块和文件格式定义。TPD 和 ATZE 的内容已改变,升级后应重新生成这些中间文件,并配套使用新版 getpar。
  • 输出文件:读取解算输出报告、.trp 和 .trs 的脚本需要检查列位置及字段名称。气象文件写入 SOLVE_EXPORT_DIR 指定的目录,未设置时使用 /tmp;其中气压和水汽分压使用 Pa,气温使用 K,相对湿度按 0–1 输出。
  • B 样条约束容量:spe_cnst.f 增加了约束方程数量,但数组仍只能容纳 131 个方程。每个参与计算的节点区间产生 6 个方程,达到 22 个区间时就会超出容量。使用较多节点的解算前,需要扩大数组并增加边界检查。
  • 先验湿延迟为零的情况:a1jst.f 当前会丢弃湿天顶延迟绝对值小于 $10^{-14}$ 秒的 ATZE 记录。若先验湿延迟为零,可能导致后续插值缺少数据,需要先修正这一筛选条件。
  • 基线结果导出:getpar_parse.f 删除了检查基线是否被排除的查找调用,却仍使用查找结果变量 IP 判断是否输出。存在被排除基线时,.bas 文件可能漏写或误写记录,使用前应恢复这次查找并核对输出。