J02 Assembled Transport
从单元方程到全域解
这一层依次连接空间单元、反射边界和场重构。
先求全开放区域的一轮扫描,再固定上一轮分布核对混合反射,
随后运行反射迭代,最后检查完整求解入口。
各测试自行构造小网格,源码位于
tests/012_fluid/J02_neutral_sn_transport_2Drz/source_f90。
步骤 |
测试程序 |
正式调用 |
|---|---|---|
连接内部单元 |
|
|
连接反射入射与出射 |
|
单轮混合扫描 → |
保正与收支 |
|
尖锐入口 → 全域扫描 → 各速度角点和收支 |
完整结果及重复调用 |
|
|
幅值与壁温 |
|
缩放入口后重新求解;低温壁面归一化及错误返回 |
1. 全开放区域:一次扫描连接相邻单元
test_J02_unified_sweep.f90 使用径向边界 [1,2,3]、
轴向边界 [0,1,2],形成 2×2 有效单元。
所有外边界开放,损失为零,求积为 8 个角度、2 个速率区间、上限 4。
低端入射分布对 \(\eta_a>0\) 取 1,其余为零。
执行过程为:
调用
sub_J02_sweep,每个方向按迎风顺序求解相邻单元。用
sub_J02_reconstruct_open_boundary_fluxes将结果积分成边界通量。把通量乘对应面积,再按外法向符号累加为入射和逸出粒子率。
将同一入口改用完整四面数组表示,重复扫描并核对全部分布系数。
零损失下的全域方程是 \(Q_{\rm in}=Q_{\rm out}\)。 内部面的流出与相邻单元流入相互抵消,因而最终只需累加外边界。 要求入射率为正,且
完整入口与紧凑入口结果的最大绝对差也须小于 \(10^{-12}\)。
将高端改为反射壁却省略上一轮分布时,应返回
SN_ERR_REFLECTION_INPUT;
将面类型设为非法值 −1 时,应返回拓扑错误并定位到单元 (1,1)。
实测结果。
核对量 |
计算值 |
参考值 |
误差 |
容差 |
|---|---|---|---|---|
入射粒子率 |
164.1875445 |
出射 164.1875445 |
相对差 1.7311e−16 |
1e−12 |
完整/紧凑分布最大差 |
0 |
0 |
0 |
1e−12 |
缺少壁面状态实际返回 613;非法面类型返回 612,定位单元 (1,1),符合预期。
2. 固定上一轮分布,核对混合反射
test_mixed_reflection_linearity 使用单元
\(r\in[1,2],z\in[0,1]\),径向低端与轴向高端为壁面。
损失频率为 0.2,求积为 8×2。
给定上一轮每个速度的系数
保持这组旧分布和其他输入不变,以漫反射比例 \(d=0,1,0.35\)
各调用一次 sub_J02_sweep。
入射壁面数据对两种反射贡献线性加权,局部输运方程也是线性的,
因此三次扫描结果应满足
全部空间系数的最大绝对误差须不超过 \(3\times10^{-13}\)。 这里固定旧分布,核对的是一轮扫描中壁面数据的组装。
实测结果。
核对量 |
实测误差 |
容差 |
|---|---|---|
混合分布与线性组合的最大差 |
1.3323e−15 |
3e−13 |
3. 部分入口与反射迭代
test_partial_inlet_source_iteration 使用同一单元,但两径向面和高端均反射。
低端只在局部区间 \(\xi\in[-0.5,0.5]\) 开放,其余部分反射。
入射方向的分布为 1,漫反射比例 0.7,损失频率 0.2。
由于 \(r_c=1.5,h_r=0.5\),开口面积占低端完整面的比例为
调用顺序。 sub_J02_solve_source_iteration 在每轮中由旧出射分布构造反射入射,
执行全域扫描,再计算相对变化。测试最多允许 800 轮,收敛阈值为 \(10^{-14}\)。
随后分别调用单元矩与开放边界通量重构。
断言。 要求返回成功、迭代数大于 2、最终变化不超过阈值。 对一次多项式 \(c_0+c_1\xi+c_2\zeta\), 四角非负等价于 \(c_0\ge|c_1|+|c_2|\); 测试对所有速度检查该条件,并核对重构密度非负。
独立收支。 低端数组按完整面面积平均。设完整面积为 \(A\), 该处坐标向入射通量为正、出射通量为负,则
要求 \(|Q_{\rm out}+Q_{\rm loss}-Q_{\rm in}|\le2\times10^{-10}\)。 此外,入射重构值应为 \(\tfrac12\sum_{m:\eta_a>0}w_mv_g\eta_a\), 绝对误差不超过 \(2\times10^{-13}\)。 这一步直接检查部分开口面积是否正确传入重构。
实测结果。
核对量 |
计算值 |
参考值 |
误差 |
容差 |
|---|---|---|---|---|
迭代次数 / 最终相对变化 |
102 / 9.3923e−15 |
相对变化 ≤ 1e−14 |
— |
1e−14 |
流入粒子率 |
193.4288938 |
流出 + 损失 |
— |
— |
流出 / 体损失粒子率 |
90.22111749 / 103.2077763 |
和等于流入 |
4.6469e−12 |
2e−10 |
最小多项式角点值 |
0.01317485452 |
非负 |
— |
≥ 0 |
部分入口通量重构误差 |
0 |
0 |
0 |
2e−13 |
同文件的 test_compact_zlo_inflow 用完整与紧凑数组分别扫描同一入口,
检查分布及开放通量的一致性,容差 \(2\times10^{-13}\)。
test_reflection_errors 则检查比例 1.1 和最大迭代轮数 1 的指定错误码。
实测结果。
核对量 |
实测误差 |
容差 |
|---|---|---|
完整/紧凑分布最大差 |
0 |
2e−13 |
两类开放通量最大差之和 |
0 |
2e−13 |
4. 尖锐入口下的保正和全域守恒
test_J02_positivity.f90 在 \([1,2]\times[0,1]\) 上建立 8×8 网格,
外边界开放,8 个角方向、单一速率 1。
低端只在第 4、5 个径向单元对入射方向设置分布 1,其余位置为零。
这样入口边缘具有明显的不连续变化。
分别以路程损失系数 \(\sigma=0\) 和 \(10\) 执行扫描。 局部过程在出现负角点时使用满足首行收支方程的常数解。 扫描后逐速度、逐单元检查四角非负,再独立累加边界和体积分:
这里单一速率为 1;每个方向的共同速度权重在相对误差中抵消。 每个方向的相对收支误差须小于 \(10^{-12}\), 零入射方向的分母使用 \(10^{-30}\) 防止除零。 该测试同时核对入口陡变后的非负性与粒子数量守恒。
实测结果。
损失系数 |
所有速度和单元的最小角点值 |
各速度相对收支误差的最大值 |
收支容差 |
|---|---|---|---|
σ = 0 |
0 |
5.8023e−16 |
1e−12 |
σ = 10 |
0 |
3.8682e−16 |
1e−12 |
5. 完整入口是否返回完整且对应本次调用的结果
test_J02_transport_entry.f90 通过 sub_J02_solve_transport
依次运行下列情况:
输入 |
执行 |
断言 |
|---|---|---|
全开放单元、零入口、零损失 |
完整求解与重构 |
成功且收敛;密度已分配并为零,出射为零 |
单元部分入口、其余反射,比例 0.7、零损失 |
完整入口;另逐步调用反射迭代和三类重构 |
分布、密度、入射和出射数组最大差 ≤ \(10^{-12}\);相对粒子收支 < \(10^{-8}\) |
同一入口改为紧凑数组 |
再次求解 |
密度最大差 ≤ \(10^{-12}\) |
将迭代上限降至 2 |
再次调用同一结果对象 |
返回未收敛;收敛标记为假,密度数组未分配 |
2×2 全开放网格、非零低端入口 |
分别使用完整和紧凑表示 |
两类内部面数组存在,轴向输运非零;密度、径向和轴向通量差均 ≤ \(10^{-12}\) |
入口遗漏、两种表示同时给出、区间只给一个端点 |
分别调用完整入口 |
返回指定输入错误 |
成功调用之后紧接失败调用,能够检查结果对象是否清除了上一次的重构场。
实测结果。
核对量 |
计算值 |
参考值 |
误差 |
容差 |
|---|---|---|---|---|
零输入:最大密度 / 出射通量 |
0 / 0 |
0 / 0 |
0 |
精确零场 |
反射主入口与逐步组装:四类数组最大差 |
0 / 0 / 0 / 0 |
0 |
0 |
1e−12 |
反射主入口粒子收支 |
4.9240e−10 |
0 |
4.9240e−10 |
1e−8 |
紧凑反射入口密度最大差 |
0 |
0 |
0 |
1e−12 |
2×2 网格:密度 / 径向通量 / 轴向通量最大差 |
0 / 0 / 0 |
0 |
0 |
1e−12 |
完整反射求解使用 137 轮,最终变化 8.7634e−11,小于 1e−10。 上限改为 2 后实际返回 615(未收敛),收敛标记和密度分配状态均为 F。
6. 入口幅值与低温壁面
test_J02_review_regressions.f90 对第 3 项的部分入口单元使用
\(a=1,10^{-20},10^{20}\) 三个入射幅值。
线性输运和反射归一化应给出 \(\psi(a)=a\psi(1)\)。
每次重新迭代并重构,要求
收敛迭代数相差至多 1,且相对粒子收支误差小于 \(10^{-8}\)。 实测结果。
入口幅值 |
迭代数 |
缩放分布相对误差 |
相对粒子收支误差 |
|---|---|---|---|
1 |
73 |
0 |
1.9246e−10 |
1e−20 |
73 |
3.6595e−16 |
1.9246e−10 |
1e20 |
73 |
2.7446e−16 |
1.9246e−10 |
零输入另核对零场固定点。
随后将壁温降到该速度网格无法表示热分布的范围。
壁面形状构造必须返回 SN_ERR_WALL_NORMALIZATION,
错误消息应提示检查 velocity grid。
完整壁面和部分入口剩余壁面的零归一化分母都要报错;
纯镜面扫描则应成功,因为其返回速度由镜面映射直接确定。
实测错误状态。 低温 Maxwell 形状返回 617,与 SN_ERR_WALL_NORMALIZATION 一致;
错误消息包含 velocity grid。纯镜面调用返回成功。
执行与结果
bash tests/012_fluid/J02_neutral_sn_transport_2Drz/run.sh
上述各程序在 2026-10-06 通过。日志按程序名保存到 build。
正向计算检查数值误差与收支,错误用例检查约定的返回码和失败输出。
接下来在并行页使用相同公共求解过程,改变线程和空间分区重新核对结果。
Assembled calculations
The tests connect local equations through upwind sweeps, then reflection iteration, positivity recovery and complete field reconstruction.
test_J02_unified_sweep: a 2×2 open grid, eight angles, two speeds up to 4, unit incoming shape at z-low and zero loss. Reconstruct boundary rates after a sweep; relative number imbalance and full/compact distribution difference must be below 1e-12. Invalid wall state and face type return specific errors. Measured: incoming/outgoing rates 164.1875444763250 / 164.1875444763249; relative imbalance 1.7311e-16; full/compact maximum difference 0.test_mixed_reflection_linearity: hold the previous distribution fixed and sweep a reflecting cell with diffuse fractions 0, 1 and 0.35. Check \(\psi_{0.35}=0.65\psi_0+0.35\psi_1\) within 3e-13. Measured: maximum coefficient difference 1.3323e-15, below 3e-13.test_partial_inlet_source_iteration: one annular cell, three reflecting faces, lower inlet interval [-0.5,0.5], diffuse fraction 0.7 and loss frequency 0.2. Up to 800 iterations must reach relative change 1e-14. Verify nonnegative corners/density, half-area inlet reconstruction within 2e-13 and absolute particle imbalance at most 2e-10. Measured: 102 iterations, final change 9.3923e-15. Incoming, outgoing and loss rates were 193.4288938266637, 90.22111748850800 and 103.2077763381511; imbalance 4.6469e-12. Minimum corner value 0.0131748545.test_J02_positivity: an 8×8 open grid, one speed 1, eight directions, and only two lower inlet cells populated. Run absorption 0 and 10. All polynomial corners must be nonnegative; independently summed directional boundary escape plus volume loss must equal injection within relative 1e-12. Measured: minimum corner 0 in both cases; maximum directional relative imbalances 5.8023e-16 (zero loss) and 3.8682e-16 (loss 10).test_J02_transport_entry: zero input, reflecting partial inlet, full/compact representations, nonzero multicell internal fluxes and repeated calls after failure. Fields agree with explicit iteration/reconstruction within 1e-12. Failed solves must clear the previous density; missing or ambiguous input reports errors. Measured: 137 reflecting iterations, change 8.7634e-11, relative imbalance 4.9240e-10. All assembled/full/compact field differences were zero. Iteration-limit code 615 left both convergence and density-allocation flags false.test_J02_review_regressions: amplitudes 1, 1e-20 and 1e20 give normalized fields within 1e-8, iteration counts within one and relative balance below 1e-8. Zero input gives a zero fixed point. Underresolved thermal walls report normalization errors with a velocity-grid hint; pure-specular transport remains valid.Measured: all amplitudes required 73 iterations; rescaled field errors were 0, 3.6595e-16 and 2.7446e-16. Relative imbalances were at most 1.9247e-10. Underresolved-wall error code was 617, as expected.
Independent balance
For the partial reflecting cell, the inlet and escape share the lower open area:
The flux arrays are normalized by the complete face area; the open fraction is already present in reconstructed values.
bash tests/012_fluid/J02_neutral_sn_transport_2Drz/run.sh
All programs passed on 2026-10-06. Logs are under build.