Files
DCTS/.agents/skills/tlusty-synspec-test/scripts/new_test.sh
T
fmq b058e66722 feat(all): NaN 伪收敛否决与 nl_tight 能量回退、emflux 检验 4π 修正、nst 行宽与种子边界修复、gfATO 谱线表接通与网格加密 9216 点、阶段分项统计与跳板机部署
物理修复(400 失败点归因,见 docs/failed400_nan_pseudo_convergence_2026_08_17.md):
- runner: 阶段 converged 后复查 fort.7,含 NaN/Inf 即否决(fort.9 全零伪收敛,
  曾致 261 点误跳过 nl_direct 回退);否决阶段不产出种子,阻断污染传播
- runner: nl_tight 回退——仅能量边际失败时以 CHMAX 收紧 10× 从自身模型续迭代,
  残差降幅 ~10×;execute_tlusty_stage 抽取供主链与回退共用
- conv_check: fort.14 为 Eddington 通量 Hλ,积分需乘 4π 再比 σTeff⁴
  (旧版 ratio 稳定 0.0796=1/4π,全点系统性假阳性)+ 回归测试
- nst_writer: 单行超 80 字符被 TLUSTY 静默截断,IFALI/JALI/TRAD 等从未生效;
  按 75 字符自动换行
- seed_finder: Teff 容忍度改含边界 <=,相邻 5000K 档恢复互为种子 + 回归测试

谱线表与网格:
- 默认线表 gfVIS99 → gfATO(全波段 18-23000Å),TaskSpec.linelist 支持工作流
  级覆盖,节点按需下载(进程互斥锁防并发重复下载 238MB)
- sdB_cno Teff 加密至 5000K 步长,432 → 9216 点;tlusty/synspec 静态二进制更新

统计与部署:
- grid 汇总改按 tlusty_status/synspec_status 分项计数,新增 tlusty_failed/
  synspec_failed/synspec_pending,前端详情页双视图适配
- deploy/fetch_results 支持跳板机 ProxyJump 与 SSH 主连接复用,fetch 新增 --force;
- Docker 构建支持 CARGO_MIRROR/USE_MIRRORS 国内镜像参数;移除 tools/ 拷贝
- 新增 tlusty-synspec-test skill 与 6 篇根因分析/验证文档
2026-08-17 23:55:26 +08:00

122 lines
4.3 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# ============================================================
# new_test.sh — 脚手架:在 dcts/test/ 下创建规范的四级测试目录
#
# 用法:
# bash new_test.sh <test_id> <type> <grid> <content> [--chain cold|seed|synspec]
#
# 示例:
# bash new_test.sh 20260813_my_div conv t60000_g5.0_he-2_cold baseline --chain cold
# bash new_test.sh 20260813_seed conv t55000_g5.0_he-2_seed doubleoff --chain seed
# bash new_test.sh 20260813_spec synspec t50000_g5.0_cno gfato_100_20000 --chain synspec
#
# 创建:
# dcts/test/<test_id>/<type>/<grid>/<content>/{inputs,scripts,run,outputs}
# scripts/run.sh <- 从 assets/run_{chain}_chain.sh 拷贝
# README.md <- 骨架
# ============================================================
set -euo pipefail
# --- 自定位 skill 目录(脚本在 scripts/ 下,skill 根是父目录)---
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SKILL_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
ASSETS="$SKILL_DIR/assets"
# --- 找 dcts 根(含 assets/tlusty_static 的目录)---
# 优先用环境变量;否则从 skill 目录向上找第一个含 assets/tlusty_static 的祖先
DCTS_ROOT="${DCTS_ROOT:-}"
if [ -z "$DCTS_ROOT" ]; then
cur="$SCRIPT_DIR"
while [ "$cur" != "/" ]; do
if [ -f "$cur/assets/tlusty_static" ]; then DCTS_ROOT="$cur"; break; fi
cur="$(dirname "$cur")"
done
fi
TEST_ROOT="$DCTS_ROOT/test"
if [ -z "$DCTS_ROOT" ] || [ ! -f "$DCTS_ROOT/assets/tlusty_static" ]; then
echo "❌ 未找到 dcts 根(含 assets/tlusty_static 的目录)。用 DCTS_ROOT=... 环境变量指定。" >&2
exit 1
fi
# --- 解析参数 ---
if [ $# -lt 4 ]; then
sed -n '3,20p' "$0" | sed 's/^# \{0,1\}//' >&2
exit 1
fi
TEST_ID="$1"; TYPE="$2"; GRID="$3"; CONTENT="$4"; shift 4
CHAIN="cold"
while [ $# -gt 0 ]; do
case "$1" in
--chain) CHAIN="$2"; shift 2;;
*) echo "未知参数: $1" >&2; exit 1;;
esac
done
case "$CHAIN" in
cold) RUN_TEMPLATE="$ASSETS/run_cold_chain.sh"; STAGES="lte → nc → nl";;
seed) RUN_TEMPLATE="$ASSETS/run_seed_chain.sh"; STAGES="seed_nc → nl";;
synspec) RUN_TEMPLATE="$ASSETS/run_synspec.sh"; STAGES="SYNSPEC";;
*) echo "❌ --chain 必须是 cold|seed|synspec,收到: $CHAIN" >&2; exit 1;;
esac
# --- 创建四级目录 ---
TARGET="$TEST_ROOT/$TEST_ID/$TYPE/$GRID/$CONTENT"
if [ -e "$TARGET" ]; then
echo "❌ 目录已存在: $TARGET" >&2
exit 1
fi
mkdir -p "$TARGET/inputs" "$TARGET/scripts" "$TARGET/run" "$TARGET/outputs"
# --- 拷 run.sh 模板 ---
cp "$RUN_TEMPLATE" "$TARGET/scripts/run.sh"
chmod +x "$TARGET/scripts/run.sh"
# --- 建 data 软链到 run/TLUSTY/SYNSPEC 都要)---
ln -sfn "$DCTS_ROOT/assets/data" "$TARGET/run/data"
# --- README 骨架 ---
cat > "$TARGET/README.md" <<EOF
# $TEST_ID / $TYPE / $GRID / $CONTENT
## 目的
TODO: 一句话说清这次测试想验证什么。
## 配置
- 二进制: $DCTS_ROOT/assets/$([ "$CHAIN" = synspec ] && echo synspec || echo tlusty)_static
- 网格: $GRID
- 链: $STAGES
- 变体: TODO(与 baseline 不同的关键参数,如 ITEK/IACC/DPSILG/ORELAX/NITER
## 输入
TODO: inputs/ 生成方式(代码生成 / 模板修改,留 diff);关键参数。
- [ ] 见 references/directory-convention.md 的执行前检查清单
## 执行
- 命令: cd "$TARGET" && bash scripts/run.sh
- 各阶段: TODO
## 结果
TODO: 见 outputs/RESULT.md(用 assets/result_template.md
## 审查结论
- 数值: TODOmax_relc 是否达标;STOP/雪崩?)
- 物理: TODO(温度结构三项:表层<3×Teff、各深度∈[10,1e8]、无 NaN
- 结论: TODO
EOF
echo "✅ 已创建测试目录: $TARGET"
echo " 链类型: $CHAIN ($STAGES)"
echo ""
echo "下一步:"
echo " 1. 把输入文件放进 $TARGET/inputs/"
echo " 2. 执行前校验(TLUSTY 链):"
echo " python3 $SKILL_DIR/scripts/check_inputs.py $TARGET/inputs --chain $CHAIN --teff <Teff>"
echo " 3. 跑: cd $TARGET && bash scripts/run.sh"
echo " 4. 事后审查:"
if [ "$CHAIN" != "synspec" ]; then
echo " python3 $SKILL_DIR/scripts/check_fort9.py $TARGET/outputs/nl.9 --teff <Teff>"
echo " python3 $SKILL_DIR/scripts/check_temperature.py $TARGET/outputs/nl.7 --teff <Teff>"
else
echo " grep -ciE 'nan|inf|\\*{3,}' $TARGET/outputs/*.spec # 应为 0"
fi