beach.toml)この文書は、現行実装(Fortran 実行系)で推奨する設定方法をまとめたものです。
「以前の書き方との互換」は最後に短く載せ、本文は初見向けに現在の推奨仕様だけを先に説明します。
beach 自体が読むのは最終的な beach.toml です。
Python 側の beachx config render を使う場合は、case.toml から preset 合成でこの beach.toml を生成できます。
高水準記法(box_origin / box_size、face_fraction、mesh.groups.* など)は case.toml / preset 側でのみ使い、render 時に通常の数値キーへ解決されます。
case.toml、preset、beachx config / beachx preset、高水準記法の全体像は
beachx config / preset / 高水準記法ガイド を参照してください。
この文書では、render 後の 最終 beach.toml に残るキー を中心に説明します。
beach .../config.toml で明示指定できます。beach.toml を自動で読み込みます。fpm run -- .../config.toml でも同じ設定読込ルールです。key = value とセクション/配列テーブルを使う軽量パーサです。schemas/beach.schema.json に同梱しています。case.toml / preset 用には schemas/beach.case.schema.json と schemas/beach.preset.schema.json もあります。beach.toml の先頭へ #:schema ... コメントを置くと補完・型検証・必須項目チェックが有効になります。beachx config init / beachx config render / beachx preset new / beachx preset save が生成するファイルにも、対応する #:schema ... コメントを自動で付与します。key = value」を受け付けないため、"$schema" = "..." は使わずコメント directive を使ってください。ローカル相対パスの例:
#:schema ../schemas/beach.schema.json
#:schema https://raw.githubusercontent.com/Nkzono99/BEACH/main/schemas/beach.schema.json
beach.toml 自身から見た相対パスです。examples/beach.toml は Raw URL 版を使っています。ローカル未公開の変更を即座に見たい場合は、相対パス版へ切り替えてください。outputs/.../beach.toml のような深い場所で相対パスを使うなら、たとえば ../../schemas/beach.schema.json のように調整してください。まずは reservoir_face(物理流入ベース)を推奨します。
[sim]
dt = 2.0e-8
batch_duration_step = 60000.0
batch_count = 100
max_step = 10000
softening = 1.0e-6
use_box = true
box_min = [0.0, 0.0, 0.0]
box_max = [1.0, 1.0, 10.0]
bc_x_low = "periodic"
bc_x_high = "periodic"
bc_y_low = "periodic"
bc_y_high = "periodic"
bc_z_low = "open"
bc_z_high = "open"
rng_seed = 12345
field_solver = "fmm"
field_bc_mode = "periodic2"
field_periodic_far_correction = "none"
[[particles.species]]
source_mode = "reservoir_face"
number_density_cm3 = 5.0
temperature_ev = 10.0
q_particle = -1.602176634e-19
m_particle = 9.10938356e-31
target_macro_particles_per_batch = 5000
inject_face = "z_high"
pos_low = [0.0, 0.0, 10.0]
pos_high = [1.0, 1.0, 10.0]
drift_velocity = [0.0, 0.0, -4.0e5]
[[particles.species]]
source_mode = "reservoir_face"
number_density_cm3 = 5.0
temperature_ev = 10.0
q_particle = 1.602176634e-19
m_particle = 1.672482821616e-27
target_macro_particles_per_batch = -1
inject_face = "z_high"
pos_low = [0.0, 0.0, 10.0]
pos_high = [1.0, 1.0, 10.0]
drift_velocity = [0.0, 0.0, -4.0e5]
[mesh]
mode = "template"
[[mesh.templates]]
kind = "plane"
enabled = true
size_x = 1.0
size_y = 1.0
nx = 20
ny = 20
center = [0.5, 0.5, 0.02]
[output]
write_files = true
write_mesh_potential = false
dir = "outputs/latest"
history_stride = 1
[sim]| キー | 型 | 既定値 | 説明 |
|---|---|---|---|
dt |
float | 1.0e-9 |
時間刻み [s] |
rng_seed |
int | 12345 |
乱数シード |
batch_count |
int | 1 |
1回の実行で処理するバッチ数 |
batch_duration |
float | 0.0 |
1バッチの物理時間 [s] |
batch_duration_step |
float | 0.0 |
batch_duration = dt * batch_duration_step |
max_step |
int | 400 |
粒子あたり最大ステップ数 |
tol_rel |
float | 1.0e-8 |
相対変化量の監視値(停止条件には未使用) |
q_floor |
float | 1.0e-30 |
rel_change 計算時の分母下限 |
softening |
float | 1.0e-6 |
電場計算の softening 長さ [m] |
field_solver |
string | "auto" |
電場評価方式。direct / treecode / fmm / auto(treecode/fmm/auto では tree_theta/tree_leaf_max を要素数から自動推定し、明示指定があればその値で上書き) |
field_bc_mode |
string | "free" |
場計算の境界モード。free / periodic2。periodic2 は field_solver="fmm" のみ許可し、sim.use_box=true かつ bc_low/high がちょうど2軸で periodic の場合に有効(第三軸は開放)。場評価だけでなく collision / photo_raycast raycast でも periodic image を考慮し、mesh は primitive cell の base element のまま扱う |
field_periodic_image_layers |
int | 1 |
field_bc_mode="periodic2" の近傍画像層数。各周期軸で [-N, N] の有限画像和を計算(N>=0) |
field_periodic_far_correction |
string | "auto" |
periodic2 の遠方補正モード。auto が既定値で、field_solver="fmm" かつ field_bc_mode="periodic2" では内部的に m2l_root_oracle に正規化する。none は遠方補正を無効化する。m2l_root_oracle は build 時だけ exact periodic Ewald residual を oracle として使って root operator へ fit する |
field_periodic_ewald_alpha |
float | 0.0 |
m2l_root_oracle 用の Ewald 分解パラメータ。0.0 のときは box サイズと field_periodic_image_layers から自動決定する |
field_periodic_ewald_layers |
int | 4 |
m2l_root_oracle の build-time exact Ewald oracle における real-space outer shell / reciprocal cutoff 深さ(>=0、far correction 有効時は実質 >=1) |
tree_theta |
float | 0.5 |
treecode/FMM の MAC パラメータ(0 < theta <= 1、field_solver が treecode/fmm/auto で有効。未指定時は自動推定値を使用) |
tree_leaf_max |
int | 16 |
treecode/FMM の葉ノードあたり最大要素数(field_solver が treecode/fmm/auto で有効。未指定時は自動推定値を使用) |
tree_min_nelem |
int | 256 |
field_solver="auto" で treecode へ切替える要素数しきい値 |
b0 |
float[3] | [0,0,0] |
一様磁場 [T] |
reservoir_potential_model |
string | "none" |
none / infinity_barrier |
phi_infty |
float | 0.0 |
無限遠基準電位 [V] |
injection_face_phi_grid_n |
int | 3 |
注入面平均電位の格子分割数 N x N |
raycast_max_bounce |
int | 16 |
photo_raycast レイ追跡の最大反射回数 |
sheath_injection_model |
string | "none" |
none / zhao_auto / zhao_a / zhao_b / zhao_c / floating_no_photo |
sheath_alpha_deg |
float | 60.0 |
Zhao シースの太陽高度角 [deg] |
sheath_photoelectron_ref_density_cm3 |
float | 64.0 |
Zhao シースの基準光電子密度 [cm^-3] |
sheath_reference_coordinate |
float | 未指定 | シース 1D 座標の基準平面位置 [m](軸は共有 inject_face から決定) |
sheath_electron_drift_mode |
string | "normal" |
normal / full |
sheath_ion_drift_mode |
string | "normal" |
normal / full |
use_box |
bool | false |
ボックス境界を有効化 |
box_min |
float[3] | [-1,-1,-1] |
ボックス下限 [m] |
box_max |
float[3] | [1,1,1] |
ボックス上限 [m] |
bc_x_low ほか |
string | "open" |
open / reflect / periodic(open は outflow,escape も可) |
batch_duration の解決ルール:
batch_duration と batch_duration_step の同時指定はエラーです。batch_duration_step 指定時は batch_duration = dt * batch_duration_step に解決します。reservoir_face / photo_raycast を使う場合、解決後の batch_duration > 0 が必須です。sheath_injection_model != "none" は現状 reservoir_potential_model = "none" と組み合わせてください。重要な実行挙動:
batch_count 分だけ進みます。tol_rel は出力監視値であり、現行実装では早期終了条件には使いません。tree_theta / tree_leaf_max の自動推定値:
nelem < 1500: theta = 0.40, leaf_max = 121500 <= nelem < 10000: theta = 0.50, leaf_max = 1610000 <= nelem < 50000: theta = 0.58, leaf_max = 2050000 <= nelem: theta = 0.65, leaf_max = 24field_bc_mode = "periodic2" でも同じ表を使い、追加の periodic2 専用 clamp は行いません。field_bc_mode = "periodic2" の mesh は runtime で collision 用 canonical unwrapped 表現へ平行移動してから ray-triangle 判定します。raw 頂点は periodic 軸で box 外を含んでも構いませんが、triangle を頂点ごとに mod 折り返すことはしません。[[particles.species]][[particles.species]] は 1 件以上必須です。
| キー | 型 | 既定値 | 説明 |
|---|---|---|---|
enabled |
bool | true |
種を有効化 |
source_mode |
string | "volume_seed" |
volume_seed / reservoir_face / photo_raycast |
q_particle |
float | -1.602176634e-19 |
粒子電荷 [C] |
m_particle |
float | 9.10938356e-31 |
粒子質量 [kg] |
pos_low |
float[3] | [-0.4,-0.4,0.2] |
位置下限 [m] |
pos_high |
float[3] | [0.4,0.4,0.5] |
位置上限 [m] |
drift_velocity |
float[3] | [0,0,-8e5] |
ドリフト速度 [m/s] |
temperature_k |
float | 2.0e4 |
温度 [K] |
temperature_ev |
float | 未指定 | 温度 [eV](temperature_k と排他) |
inject_face |
string | 未指定 | x_low/x_high/y_low/y_high/z_low/z_high |
source_mode = "volume_seed"| キー | 型 | 既定値 | 説明 |
|---|---|---|---|
npcls_per_step |
int | 0 |
1バッチに生成するマクロ粒子数 |
w_particle |
float | 1.0 |
マクロ粒子重み |
制約:
npcls_per_step 合計が 1 以上必要です(reservoir_face / photo_raycast を使わない場合)。target_macro_particles_per_batch は使用できません。source_mode = "reservoir_face"| キー | 型 | 説明 |
|---|---|---|
number_density_cm3 / number_density_m3 |
float | 上流密度(どちらか片方必須) |
w_particle |
float | マクロ粒子重み(正値) |
target_macro_particles_per_batch |
int | w_particle 自動解決用(>0 または -1) |
制約:
sim.use_box = true 必須sim.batch_duration > 0 必須inject_face 必須pos_low / pos_high は指定 face 上になければエラーw_particle と target_macro_particles_per_batch は同時指定不可target_macro_particles_per_batch = -1 は species[2] 以降のみ可(species[1] の w_particle を共有)粒子数決定(1種あたり):
n_macro_expected = gamma_in * A * batch_duration / w_particlefloor(residual + n_macro_expected)target_macro_particles_per_batch > 0 のときは、その値になるよう w_particle を自動計算source_mode = "photo_raycast"| キー | 型 | 既定値 | 説明 |
|---|---|---|---|
emit_current_density_a_m2 |
float | 0.0 |
レイ垂直面基準の放出電流密度 [A/m^2] |
rays_per_batch |
int | 0 |
1バッチの発射レイ数 |
deposit_opposite_charge_on_emit |
bool | false |
放出元要素に逆符号電荷を堆積 |
normal_drift_speed |
float | 0.0 |
放出法線方向ドリフト [m/s] |
ray_direction |
float[3] | 未指定時は注入面内向き法線 | レイ方向 |
制約:
sim.use_box = true 必須sim.batch_duration > 0 必須emit_current_density_a_m2 > 0, rays_per_batch > 0 必須inject_face 必須q_particle は非ゼロ、m_particle > 0 必須ray_direction 指定時は正規化可能で、注入面内向き法線への内積が正であることnpcls_per_step / number_density_* / w_particle / target_macro_particles_per_batch は使用不可photo_raycast の重み:
w_hit = J_perp * A_perp * batch_duration / (|q_particle| * rays_per_batch)rays_per_batch 以下になります。field_bc_mode = "periodic2" のとき、periodic image に命中しても放出位置は primary cell に wrap した hit 座標を使います。sim.sheath_injection_modelsim.sheath_injection_model は既存の reservoir_face / photo_raycast species を束ねて、
シースに対応する流束・法線速度 cutoff を上書きする共有設定です。
zhao_auto / zhao_a / zhao_b / zhao_creservoir_face species を solar-wind electronreservoir_face species を ionphoto_raycast species を photoelectronn_swe_inf へ置き換わります。vmin_normal 付きになります。sheath_reference_coordinate を明示した場合は、指定平面から reservoir 境界までの Zhao 局所状態を再構成し、electron reservoir は局所 phi(z) に応じた有効密度と cutoff、ion reservoir は局所密度・局所法線速度・冷たいビーム近似へ更新されます。photo_raycast species は、emit_current_density_a_m2 が Zhao の自由光電子電流へ上書きされ、normal_drift_speed は 0 として扱います。floating_no_photoreservoir_face species の電流釣り合いから負の浮遊電位を解き、electron reservoir species へ cutoff を掛けます。photo_raycast species があっても放出電流は 0 とみなします。注意:
temperature_ev/temperature_k, number_density_*, drift_velocity, m_particle, q_particle といった既存 species パラメータを背景プラズマ条件として再利用します。sheath_reference_coordinate を指定すると、共有 inject_face の法線軸に沿ってその座標を基準平面に使います。たとえば inject_face = "z_high" かつ sheath_reference_coordinate = 0.02 なら、平面 z = 0.02 を z_sheath = 0 とみなします。未指定時は inject_face が指す box 境界面座標を使います。sheath_reference_coordinate を未指定のまま Zhao を使う場合は、従来どおり共有 cutoff ベースの補正のみを適用します。局所 VDF の変形を反映したい場合は基準平面を明示してください。zhao_auto は alpha < 20 deg で C -> A -> B、それ以外では A -> B -> C の順に分枝解を試みます。[mesh]| キー | 型 | 既定値 | 説明 |
|---|---|---|---|
mode |
string | "auto" |
auto / obj / template |
obj_path |
string | "examples/simple_plate.obj" |
OBJ ファイルパス |
obj_scale |
float | 1.0 |
OBJ 読み込み後に適用する一様スケーリング係数 |
obj_rotation |
float[3] | [0, 0, 0] |
OBJ 読み込み後に適用する回転角 [度]。x→y→z の順で外因性 (extrinsic) 回転(Rz·Ry·Rx)を適用 |
obj_offset |
float[3] | [0, 0, 0] |
OBJ 読み込み後に適用する平行移動 [m] |
mode = "auto" のときは obj_path が存在すれば OBJ、なければ template を使います。
OBJ メッシュの変換順序は scale → rotate → offset です: v_new = R(rotation) * (v_old * scale) + offset。
CRLF 改行の OBJ ファイルもサポートしています。面行は f v, f v/vt, f v/vt/vn, f v//vn のいずれの形式にも対応し、四角形以上のポリゴンはファン三角形分割されます。
[[mesh.templates]]共通キー:
enabled (bool)kind (plane / plate_hole / disk / annulus / box / cylinder / sphere)center (float[3])kind ごとの主要キー:
plane: size_x, size_y, nx, nyplate_hole: size_x, size_y, radius, n_theta, n_rdisk: radius, n_theta, n_rannulus: radius, inner_radius, n_theta, n_rbox: size, nx, ny, nzcylinder: radius, height, n_theta, n_z, cap, cap_top, cap_bottomsphere: radius, n_lon, n_lat注意:
[[mesh.templates]] を書いた場合、実際に使うテンプレート数は「定義した件数」で解決されます。[output]| キー | 型 | 既定値 | 説明 |
|---|---|---|---|
write_files |
bool | true |
ファイル出力の有効/無効 |
write_mesh_potential |
bool | false |
要素重心で評価した電位を mesh_potential.csv として出力 |
write_potential_history |
bool | false |
バッチごとの電位履歴を potential_history.csv として出力(history_stride に従う) |
dir |
string | "outputs/latest" |
出力先ディレクトリ |
history_stride |
int | 1 |
charge_history.csv / potential_history.csv の出力間隔(バッチ単位) |
resume |
bool | false |
既存チェックポイントから再開 |
出力ファイル:
summary.txtcharges.csvmesh_potential.csv(write_mesh_potential = true のとき)mesh_triangles.csvmesh_sources.csvcharge_history.csv(history_stride > 0 のとき)potential_history.csv(write_potential_history = true かつ history_stride > 0 のとき)rng_state.txtmacro_residuals.csvmesh_triangles.csv には mesh_id 列が追加され、mesh_sources.csv で mesh_id ごとの元メッシュ種別と要素数を確認できます。
mesh_potential.csv は要素重心での電位 [V] を記録します。自己項は softening > 0 なら 1/softening、そうでなければ面積等価半径近似を使います。periodic2 では explicit image shell に加えて、field_periodic_far_correction が auto または m2l_root_oracle のときは exact Ewald residual も加えます。none では residual を加えません。
potential_history.csv は charge_history.csv と同じ history_stride で要素ごとの電位を記録します。フォーマットは batch,elem_idx,potential_V。history_stride ごとに field_solver%refresh + compute_mesh_potential が実行されるため、有効化すると計算コストが増加します。
MPI実行(world_size > 1)では乱数状態・残差はrank別ファイルになります。
rng_state_rank00000.txt, rng_state_rank00001.txt, ...macro_residuals_rank00000.csv, macro_residuals_rank00001.csv, ...また、summary.txt には mpi_world_size が記録されます。
resume = true の要件:
write_files = true 必須output.dir に summary.txt / charges.csv / rng_state.txt が必要macro_residuals.csv は存在すれば読み込みますMPI実行での追加要件:
summary.txt の mpi_world_size が現在のrank数と一致している必要がありますrng_state_rankNNNNN.txt が必要ですmacro_residuals_rankNNNNN.csv は存在すれば読み込みますv0.3.0 以降は旧キー互換を持たず、旧名は「未知キー」として扱います。[particles] は [[particles.species]] のコンテナとしてのみ使い、[particles] 直下に key = value は書かないでください。