feat(all): 物理正确性五重硬门槛、输入文件结构化与 fort.55 错位修复、conv 诊断 DB 化与阶段归因修复、ORELAX 收敛修复与导入工具下线
物理正确性校验体系(common/conv_check.rs +494 行) - 新增 5 类硬门槛:能量守恒(.6)、温度结构(.7)、emflux 积分校验(.emflux,含全 NaN 判失败)、假收敛排查(itek 轨迹首末比)、b 因子合理性(.bfac) - runner 在 TLUSTY 阶段结束后执行全部校验,任一失败判 final_converged=false - GridConfig 新增 8 个可配阈值,经 scheduler→executor→runner 全链路透传 输入文件配置结构化重构(config.rs +1453 行) - TlustyInput 拆为 dot5/nst 分层结构,字段名严格映射 tlusty208.f READ 语句;SynspecInput 重构为 9 个 Fort55Line 子结构体 - 移除 ChainStep.metals 字段,元素集改由 dot5.atoms/ions 显式声明(gen_input5/nst_writer 同步重写为三源融合 / 分层覆盖) - fort.55 修复行结构 bug:补全分子表行(7→9 行),IDSTD 50→0 错位修正(影响全部光谱线强归一化,需重算 SYNSPEC 阶段) conv 诊断 DB 化与阶段归因修复(server) - 单点详情 conv 面板从磁盘 conv.json 改读 DB grid_points.summary_json;grid_points 新增 summary_json/last_elapsed_sec 两列(旧库幂等 ALTER) - record_task_report 阶段归因列加 CASE 守卫 + clear_synspec 对称处理,修复 synspec-only/TLUSTY-only 重跑污染统计 - 新增 summary_merge.rs 点级增量合并,避免重跑覆盖诊断字段 收敛性 ORELAX 修复与 seed_chain 可配(sdB_cno.yaml + node) - nl 阶段加 orelax=0.5、seed_nc 加 orelax=0.3,阻尼中温区 relc 振荡发散 - seed_chain 块可配,executor 优先采用用户配置而非内置默认链 导入工具下线 - 删除 import_results 客户端工具及 Windows 推送脚本;移除 /admin/import_seed 端点 - 改为服务端临时 migrate_conv 端点(扫 conv.json 增量合并入库,迁移后可删) 文档与分析 - 新增 1305 失败点根因分析、fort.14 全 NaN 物理含义分析两份深度文档 - spectrum_correctness_analysis 两次修订标注已修复项;fetch_results.sh 修 trap RETURN 的 set -u 报错
This commit is contained in:
@@ -1,10 +1,10 @@
|
||||
//! 验证「历史种子导入的工作流名」与「正式工作流名」的隔离关系。
|
||||
//!
|
||||
//! 用户意图:import_results 把旧 Python 计算结果导入,标记为已完成,避免重算。
|
||||
//! 用户意图:离线导入工具把旧计算结果导入,标记为已完成,避免重算。
|
||||
//! 关键问题:导入到工作流 A,之后正式启动工作流 B(同名/异名),B 能否看到 A 标记的 converged?
|
||||
|
||||
use common::config::GridConfig;
|
||||
use common::models::GridPointParams;
|
||||
use common::models::{GridPointParams, ModelSummary};
|
||||
use mq::sqlite_queue::SqliteTaskQueue;
|
||||
use server::{db::Database, scheduler::GridScheduler};
|
||||
use std::sync::Arc;
|
||||
@@ -21,6 +21,47 @@ fn make_params() -> GridPointParams {
|
||||
}
|
||||
}
|
||||
|
||||
/// 构造一个收敛的 ModelSummary(result_valid=true, atmosphere_has_nan=false),
|
||||
/// 用 point_name 作权威名。供测试模拟离线导入写入 summary_json。
|
||||
fn make_converged_summary(name: &str, params: &GridPointParams) -> ModelSummary {
|
||||
ModelSummary {
|
||||
name: name.to_string(),
|
||||
params: params.clone(),
|
||||
stages: Vec::new(),
|
||||
result_valid: true,
|
||||
final_max_relc: Some(0.001),
|
||||
final_chmax: Some(0.001),
|
||||
seed: None,
|
||||
atmosphere_has_nan: false,
|
||||
synspec_rc: None,
|
||||
synspec_error: None,
|
||||
synspec_sec: None,
|
||||
elapsed_sec: 0.0,
|
||||
energy_check: None,
|
||||
temp_check: None,
|
||||
emflux_check: None,
|
||||
bfac_check: None,
|
||||
note: None,
|
||||
}
|
||||
}
|
||||
|
||||
/// 测试辅助:模拟离线导入——upsert 点 + 写收敛 summary(等价旧 mark_grid_point_imported)。
|
||||
async fn mark_imported(
|
||||
db: &Database,
|
||||
name: &str,
|
||||
workflow: &str,
|
||||
params: &GridPointParams,
|
||||
method: &str,
|
||||
) {
|
||||
db.upsert_grid_point_named(name, params, 0, workflow)
|
||||
.await
|
||||
.unwrap();
|
||||
let summary = make_converged_summary(name, params);
|
||||
db.upsert_point_summary(name, workflow, &summary, method)
|
||||
.await
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
/// 构造只含一个网格点(t20000_g5.0_he-2_c-4_n-4_o-4)的 config。
|
||||
fn make_grid_cfg() -> GridConfig {
|
||||
let yaml = "grid:\n teff: [20000]\n logg: [5.0]\n loghe: [-2]\n logc: [-4]\n logn: [-4]\n logo: [-4]\n";
|
||||
@@ -49,13 +90,8 @@ async fn test_same_workflow_name_preserves_converged() {
|
||||
let name = "t20000_g5.0_he-2_c-4_n-4_o-4";
|
||||
let p = make_params();
|
||||
|
||||
// 模拟 import_seed:upsert + mark_imported,工作流名 = sdB_cno
|
||||
db.upsert_grid_point_named(name, &p, 0, "sdB_cno")
|
||||
.await
|
||||
.unwrap();
|
||||
db.mark_grid_point_imported(name, "sdB_cno", None, "cold_run")
|
||||
.await
|
||||
.unwrap();
|
||||
// 模拟离线导入:upsert + 写收敛 summary,工作流名 = sdB_cno
|
||||
mark_imported(&db, name, "sdB_cno", &p, "cold_run").await;
|
||||
|
||||
// 之后正式启动同名工作流:initialize_grid(sdB_cno)
|
||||
sched
|
||||
@@ -80,13 +116,8 @@ async fn test_different_workflow_name_causes_recompute() {
|
||||
let name = "t20000_g5.0_he-2_c-4_n-4_o-4";
|
||||
let p = make_params();
|
||||
|
||||
// 模拟 import_seed:导入到 "imported" 工作流
|
||||
db.upsert_grid_point_named(name, &p, 0, "imported")
|
||||
.await
|
||||
.unwrap();
|
||||
db.mark_grid_point_imported(name, "imported", None, "cold_run")
|
||||
.await
|
||||
.unwrap();
|
||||
// 模拟离线导入:导入到 "imported" 工作流
|
||||
mark_imported(&db, name, "imported", &p, "cold_run").await;
|
||||
|
||||
// 之后正式启动 "sdB_cno" 工作流
|
||||
sched
|
||||
@@ -118,13 +149,8 @@ async fn test_mixed_grid_import_then_init_avoids_recompute() {
|
||||
let (db, sched) = setup().await;
|
||||
let p_old = make_params(); // t20000_g5.0_...
|
||||
|
||||
// 模拟 import_seed:旧网格里这个点已收敛,导入到 sdB_cno
|
||||
db.upsert_grid_point_named("t20000_g5.0_he-2_c-4_n-4_o-4", &p_old, 0, "sdB_cno")
|
||||
.await
|
||||
.unwrap();
|
||||
db.mark_grid_point_imported("t20000_g5.0_he-2_c-4_n-4_o-4", "sdB_cno", None, "cold_run")
|
||||
.await
|
||||
.unwrap();
|
||||
// 模拟离线导入:旧网格里这个点已收敛,导入到 sdB_cno
|
||||
mark_imported(&db, "t20000_g5.0_he-2_c-4_n-4_o-4", "sdB_cno", &p_old, "cold_run").await;
|
||||
|
||||
// 正式启动 sdB_cno,config 比旧网格多了一个新点(t25000)
|
||||
let yaml = "grid:\n teff: [20000, 25000]\n logg: [5.0]\n loghe: [-2]\n logc: [-4]\n logn: [-4]\n logo: [-4]\n";
|
||||
@@ -172,13 +198,8 @@ async fn test_precision_diff_import_then_init_preserves_converged() {
|
||||
logo: GridAxisValue::from_value(-4.0),
|
||||
};
|
||||
|
||||
// 模拟 import_results 重写 name 后入库:grid_points.name = canonical(g5.0)
|
||||
db.upsert_grid_point_named(canonical, &p, 0, "sdB_cno")
|
||||
.await
|
||||
.unwrap();
|
||||
db.mark_grid_point_imported(canonical, "sdB_cno", None, "cold_run")
|
||||
.await
|
||||
.unwrap();
|
||||
// 模拟离线导入重写 name 后入库:grid_points.name = canonical(g5.0)
|
||||
mark_imported(&db, canonical, "sdB_cno", &p, "cold_run").await;
|
||||
|
||||
// 启动同名工作流:initialize_grid 用配置 model_name()(=g5.0) 插入
|
||||
let yaml = "grid:\n teff: [20000]\n logg: [5.0]\n loghe: [-2]\n logc: [-4]\n logn: [-4]\n logo: [-4]\n";
|
||||
|
||||
Reference in New Issue
Block a user