io モジュール

TOML 設定ファイルの読み込みと CSV 出力を担当する。


モジュール構成

io/
├── mod.rs     — サブモジュールの公開宣言
├── input.rs   — TOML 設定ファイルのデシリアライズ・検証
└── output.rs  — CSV 出力・サマリー表示

input.rs — 設定ファイル

FlameConfig::from_file(path)

TOML ファイルを読み込み、値の検証を行って FlameConfig を返す。 検証エラーは anyhow::Error として返る。

設定構造体

[mechanism]

フィールドデフォルト説明
fileString機構ファイルのパス
formatString"cantera_yaml"ファイル形式(現在 cantera_yaml のみ有効)

[flame]

未燃組成は 当量比モード直接指定モード のいずれか一方を使用する。 両方同時に指定するとバリデーションエラーになる。

フィールドデフォルト説明
pressuref64101325.0圧力 [Pa]
t_unburnedf64未燃混合気温度 [K](必須)
domain_lengthf640.02計算領域長さ [m]
fuel{String → f64}燃料モル分率マップ(当量比モード)
oxidizer{String → f64}酸化剤モル分率マップ(当量比モード)
equivalence_ratiof64当量比 φ(当量比モード)
composition{String → f64}未燃混合気モル分率(直接指定モード)

[grid]

フィールドデフォルト説明
initial_pointsusize20初期格子点数(≥ 2)
max_pointsusize500最大格子点数(≥ initial_points)
gradf640.05GRAD 精細化基準(0 < grad ≤ 1)
curvf640.10CURV 精細化基準(0 < curv ≤ 1)
ratiof642.0隣接セル幅の最大比

[solver]

フィールドデフォルト説明
atolf641e-9Newton 絶対収束許容値
rtolf641e-6Newton 相対収束許容値
max_newton_iterusize50Newton 最大反復回数
time_stepsusize100疑似過渡継続のステップ数
dt_initialf641e-7疑似過渡継続の初期タイムステップ [s]
su_initial_guessf64?火炎速度初期推定 [m/s](省略時 0.4 m/s)
initial_profileString?CSV 初期プロファイルのパス(省略時はシグモイド初期推定)

[output]

フィールドデフォルト説明
fileString"flame_solution.csv"出力 CSV ファイルのパス

バリデーション規則

条件エラーメッセージに含む語
pressure > 0pressure
t_unburned > 0t_unburned
domain_length > 0domain_length
compositionfuel/oxidizer/equivalence_ratio の同時指定は不可
当量比モード選択時は fuel, oxidizer, equivalence_ratio 全て必須
equivalence_ratio > 0equivalence_ratio
initial_points >= 2initial_points
max_points >= initial_pointsmax_points
0 < grad ≤ 1grad
0 < curv ≤ 1curv
atol > 0atol
rtol > 0rtol

TOML 例 — 当量比モード

[mechanism]
file = "data/h2o2.yaml"

[flame]
pressure = 101325.0
t_unburned = 300.0
domain_length = 0.02
equivalence_ratio = 1.0

[flame.fuel]
H2 = 1.0

[flame.oxidizer]
O2 = 0.21
N2 = 0.79

[grid]
initial_points = 20
max_points = 500
grad = 0.05
curv = 0.10
ratio = 2.0

[solver]
atol = 1.0e-9
rtol = 1.0e-6
max_newton_iter = 50
time_steps = 100
dt_initial = 1.0e-7
su_initial_guess = 2.0        # 省略可: デフォルト 0.4 m/s
# initial_profile = "data/cantera_h2air_initial.csv"  # 省略時はシグモイド初期推定

[output]
file = "flame_solution.csv"

TOML 例 — 直接組成指定モード

[flame]
t_unburned = 300.0
composition = { H2 = 0.3, O2 = 0.15, N2 = 0.55 }

テスト (5 テスト、全 PASS)

テスト名検証内容
test_valid_composition_mode直接指定モードが正常にパースされること
test_valid_equivalence_ratio_mode当量比モードが正常にパースされること
test_negative_pressure_rejectedpressure < 0 でエラーになること
test_zero_equivalence_ratio_rejectedequivalence_ratio = 0 でエラーになること
test_composition_and_phi_together_rejected両モード同時指定でエラーになること
test_negative_domain_length_rejecteddomain_length < 0 でエラーになること

output.rs — CSV 出力

write_csv(path, x, mech, grid, pressure)

収束解ベクトル x を CSV ファイルに書き出す。

列構成 (計 6 + 2K 列、K = 化学種数):

列名単位内容
z [m]m格子点座標
T [K]K温度
M [kg/m2/s]kg/(m²·s)質量流束(全行同一値)
u [m/s]m/s流速 u = M / ρ
rho [kg/m3]kg/m³密度(理想気体則)
hrr [W/m3]W/m³熱発生率 HRR = −Σk ωk·hk
X_<name> × Kモル分率 Xk = (Yk/Wk) / Σ(Yj/Wj)
Y_<name> × K質量分率 Yk

M [kg/m2/s] 列は initial_guess_from_csv が読み込む列と同一のフォーマットであるため、 本ソルバーの出力 CSV をそのまま次の計算(当量比スイープ等)の initial_profile として使用できる。

数値フォーマット: z, M, u, rho, hrr, Xk, Yk{:.6e}T{:.4}

標準出力にサマリーを表示する。

---------------------------------------------------
  Laminar flame speed Su = X.XXXX m/s
  Max temperature       = XXXX.X K
  Grid points           = XXX
  Mass flux M           = X.XXXXe-X kg/(m²·s)
---------------------------------------------------
  • Su = M / ρ(j=0) — 左境界の密度を使って質量流束から火炎速度に換算

テスト (2 テスト、全 PASS)

テスト名検証内容
test_mole_fractions_pure_n2純 N2 プロファイルで X_N2 = 1.0、ΣXk = 1.0、HRR ≈ 0
test_write_csv_column_countwrite_csv が 6 + 2K 列の CSV を生成すること