#!/usr/bin/env bash # ============================================================ # new_test.sh — 脚手架:在 dcts/test/ 下创建规范的四级测试目录 # # 用法: # bash new_test.sh [--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/////{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" <" 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 " echo " python3 $SKILL_DIR/scripts/check_temperature.py $TARGET/outputs/nl.7 --teff " else echo " grep -ciE 'nan|inf|\\*{3,}' $TARGET/outputs/*.spec # 应为 0" fi