69 lines
4.3 KiB
Markdown
69 lines
4.3 KiB
Markdown
# DCTS 物理计算与流程设计 (Physics Pipeline Design)
|
||
|
||
> 本文档详细阐述 DCTS 核心物理计算引擎的设计原理、4 阶段 TLUSTY/SYNSPEC 计算链,以及冷启动与种子步进(Seed Stepping)发散回退机制。
|
||
|
||
---
|
||
|
||
## 1. 物理计算链原理
|
||
|
||
TLUSTY 通过**完全线性化 (Complete Linearization)** 方法求解恒星大气结构的 NLTE(非局部热力学平衡)统计平衡方程与辐射转移方程。由于线性化的收敛半径有限,若初始猜想(初猜)偏离真解较远,迭代极易发生数值发散。
|
||
|
||
DCTS 将单点计算划分为 **4 个渐进物理阶段**:
|
||
|
||
```mermaid
|
||
flowchart LR
|
||
Stage1["1. LTE 灰大气\n(lte / tlusty)\n解析灰色初猜"] --> Stage2["2. NLTE 连续谱\n(nc / tlusty)\n收敛电离平衡"]
|
||
Stage2 --> Stage3["3. NLTE 完整谱线\n(nl / tlusty)\n包含线跃迁求解"]
|
||
Stage3 --> Stage4["4. 合成光谱\n(synspec)\n输出 .spec / .cont"]
|
||
```
|
||
|
||
### 各阶段物理配置与功能明细
|
||
|
||
| 阶段 | 执行程序 | 物理含义 | 关键参数 | 典型迭代/耗时 |
|
||
| :--- | :--- | :--- | :--- | :--- |
|
||
| **1. LTE 灰大气 (lte)** | `tlusty.exe` | 解析灰色不透明度求解温度结构,无需种子,提供合理起点。 | `T T` 模式 | 0 次迭代 / 1-3 秒 |
|
||
| **2. NLTE 连续谱 (nc)** | `tlusty.exe` | 切换到 NLTE,忽略束缚-束缚线跃迁(`ilvlin=0`),收敛基础电离平衡。 | `F F`, `ilvlin=0` | 10 次迭代 / 1-5 分钟 |
|
||
| **3. NLTE 完整谱线 (nl)** | `tlusty.exe` | 引入全部线跃迁(`ilvlin=100`),求解包含非平衡辐射场的大气结构。 | `F F`, `ilvlin=100` | 15-30 次迭代 / 5-20 分钟 |
|
||
| **4. 合成光谱 (synspec)** | `synspec.exe` | 基于阶段 3 收敛的大气结构(`.7` 文件),计算高分辨率合成光谱。 | `INPOP=35` | 3-10 秒 |
|
||
|
||
---
|
||
|
||
## 2. 冷启动链 vs 种子步进链 (Seed-Stepping Fallback)
|
||
|
||
在极端高有效温度(如 $T_{\text{eff}} \ge 50,000\text{ K}$)、极低氦丰度或强金属线空白区,从 LTE 灰大气直接启动的**冷启动链 (DEFAULT_CHAIN)** 容易发散。
|
||
|
||
针对这一问题,DCTS 引入了**动态种子步进机制 (Seed Stepping Chain)**:
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
Start([开始计算指定网格点]) --> ExecCold[执行冷启动链 lte -> nc -> nl]
|
||
ExecCold --> CheckCold{nl 阶段物理收敛?}
|
||
|
||
CheckCold -- "是 (Success)" --> RunSyn1[运行 Synspec 生成光谱] --> Save1[保存结果 & 汇报成功]
|
||
CheckCold -- "否 (Diverging)" --> IsolCold[清理并隔离冷启动失败现场]
|
||
|
||
IsolCold --> FindSeed[在种子库搜索最近邻已收敛 .7 种子]
|
||
FindSeed --> HasSeed{找到合规邻居种子?}
|
||
|
||
HasSeed -- "是" --> ExecSeed[启动种子步进链 seed_nc -> nl\nLTGRAY=F 热启动]
|
||
ExecSeed --> CheckSeed{nl 阶段物理收敛?}
|
||
|
||
CheckSeed -- "是 (Success)" --> RunSyn2[运行 Synspec 生成光谱] --> Save2[标记 seed_step_used=true & 汇报成功]
|
||
CheckSeed -- "否 (Failed)" --> MarkFail[标记任务彻底失败]
|
||
|
||
HasSeed -- "否" --> MarkFail
|
||
```
|
||
|
||
### 种子匹配策略 (Seed Finding Algorithm)
|
||
|
||
`common::seed_finder` 模块彻底摆脱了早期对文件系统进行同步阻塞遍历式查档的高耗延迟做法,改为经由 Master 服务端 SQLite 内存快照索表直接执行多级筛选,并使用标准化欧氏距离(Euclidean Distance)查找最佳热起邻格起点:
|
||
|
||
$$d(p_1, p_2) = \sqrt{ \sum_{i} w_i \left( \frac{x_{1,i} - x_{2,i}}{\sigma_i} \right)^2 }$$
|
||
|
||
优先匹配有效温度 $T_{\text{eff}}$ 和表面重力 $\log g$ 变化最小的已收敛 `.7` 大气结构作为 `fort.8` 热启动输入,跳过容易发散的灰大气阶段。
|
||
|
||
> [!NOTE]
|
||
> **物理现场溯源说明**:为了服务于严谨的天文理论算理复盘,Node 端的沙盒演算文件夹(`data/work/task_{uuid}`)及其中所产生成的全部迭代物理日志与 Fortran 临时数表不会触发自动入侵清除,为发生极端大气参数无解突断时的推导验证提供了长期完整的痕迹。
|
||
>
|
||
> **严谨声明校验**:在 `GridConfig` 的加载引擎中引入了非合规键位阻断(Denying Unknown Fields),有效杜绝了用户在定义参数和扩展选项(如 `niter`, `itek_fallback`, `template`, `fort55`, `linelist`)由于错拼被静默忽略而导致不可预测迭代的行为。
|