#!/bin/bash # ============================================================ # SYNSPEC 执行模板 — 由 new_test.sh 拷为 scripts/run.sh # 规范: docs/testing_workflow_2026_08_11.md §四;references/synspec-inputs.md # 输入: fort.5(stdin) fort.55(控制卡) fort.8(收敛大气) + fort.19/data 软链 # 用法: bash scripts/run.sh [timeout_sec] # 产物: outputs/{name}.spec/.cont/.iden/.lindat + synspec.log # ============================================================ set -uo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" TEST_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" INPUTS="$TEST_DIR/inputs"; RUN="$TEST_DIR/run"; OUTPUTS="$TEST_DIR/outputs" SYNSPEC="/home/fmq/program/tlusty/tl208-s54/dcts/assets/synspec_static" RUNTIME_DATA="/home/fmq/program/tlusty/tl208-s54/dcts/assets/data" TIMEOUT_SEC="${1:-1200}" OUT_NAME="${OUT_NAME:-spectrum}" # 产物名前缀,可环境变量覆盖 # --- 1. 切 run/,清理上轮 --- mkdir -p "$RUN" "$OUTPUTS" cd "$RUN" rm -f fort.* *.spec *.cont *.iden *.lindat *.log *.err # --- 2. 复制输入 --- [ -f "$INPUTS/fort.5" ] || { echo "❌ 缺 inputs/fort.5"; exit 1; } [ -f "$INPUTS/fort.55" ] || { echo "❌ 缺 inputs/fort.55"; exit 1; } [ -f "$INPUTS/fort.8" ] || { echo "❌ 缺 inputs/fort.8 (收敛大气)"; exit 1; } cp "$INPUTS/fort.5" fort.5 cp "$INPUTS/fort.55" fort.55 cp "$INPUTS/fort.8" fort.8 # fort.19 / data: 软链(优先用 inputs 里已有的,否则指 assets) if [ -e "$INPUTS/fort.19" ]; then ln -sfn "$(readlink -f "$INPUTS/fort.19")" fort.19 else ln -sfn "$RUNTIME_DATA/gfATO.dat" fort.19 # 全波段默认 fi ln -sfn "$RUNTIME_DATA" data # --- 3. 执行前自检 --- echo "=== 执行前自检 ===" echo "fort.5 第1行 TEFF/GRAV: $(sed -n '1p' fort.5)" echo "fort.55 第6行 波长范围: $(sed -n '6p' fort.55)" echo "fort.8 行数: $(wc -l < fort.8)" echo "fort.8 NaN/坏行: $(grep -ciE 'nan|inf|\*{3,}' fort.8 || true)" echo "fort.19 -> $(readlink fort.19)" echo "data -> $(readlink data)" echo "" # --- 4. 执行 SYNSPEC --- echo "=== 执行 SYNSPEC (timeout ${TIMEOUT_SEC}s) ===" T0=$(date +%s) set +e timeout "$TIMEOUT_SEC" "$SYNSPEC" < fort.5 > synspec.log 2> synspec.err RC=$? set -e T1=$(date +%s) echo "rc=$RC, elapsed=$((T1-T0))s" # rc=124 = timeout 杀死。SYNSPEC 大线表全波段易超时,产物可能不完整。 if [ "$RC" -eq 124 ]; then echo "⚠⚠ SYNSPEC TIMEOUT (rc=124, 超过 ${TIMEOUT_SEC}s 被 kill —— spec 可能不完整/被截断)" touch "$OUTPUTS/SYNSPEC.TIMEOUT" fi # --- 5. 产物重命名 --- # SYNSPEC: fort.7=spectrum, fort.17=continuum, fort.12=line IDs, fort.11=line data [ -f fort.7 ] && cp fort.7 "$OUTPUTS/${OUT_NAME}.spec" [ -f fort.17 ] && cp fort.17 "$OUTPUTS/${OUT_NAME}.cont" [ -f fort.12 ] && cp fort.12 "$OUTPUTS/${OUT_NAME}.iden" [ -f fort.11 ] && cp fort.11 "$OUTPUTS/${OUT_NAME}.lindat" cp synspec.log "$OUTPUTS/synspec.log" 2>/dev/null || true cp synspec.err "$OUTPUTS/synspec.err" 2>/dev/null || true # --- 6. 立即数值审查 --- echo "" echo "=== 数值审查 ===" SPEC="$OUTPUTS/${OUT_NAME}.spec" if [ -f "$SPEC" ]; then ROWS=$(wc -l < "$SPEC") FIRST=$(head -1 "$SPEC" | awk '{print $1}') LAST=$(tail -1 "$SPEC" | awk '{print $1}') NAN=$(grep -ciE 'nan|inf|\*{3,}' "$SPEC" || true) echo "spec 行数: $ROWS" echo "波长范围: $FIRST - $LAST Å" echo "NaN/Inf/坏行: $NAN $([ "$NAN" = 0 ] && echo '✅' || echo '❌')" else echo "!! 未生成 ${OUT_NAME}.spec(SYNSPEC 失败,rc=$RC)" fi echo "" echo "synspec.log 尾 15 行:" tail -15 "$OUTPUTS/synspec.log" 2>/dev/null || echo "(无 log)"