beachx config / preset / 高水準記法ガイドこの文書は、case.toml から beach.toml を生成する preset 合成レイヤ の使い方をまとめたものです。
beach が読むのは最終的な beach.toml だけです。case.toml と preset TOML です。case.toml / preset でだけ使え、beachx config render が数値キーへ展開します。beach.toml 自体のキー仕様は Fortran パラメータファイル仕様 を参照してください。
| ファイル / 置き場 | 役割 | 通常の編集対象 |
|---|---|---|
case.toml |
1 つの計算ケースを定義する入口。use_presets と override を持つ |
はい |
preset (sim/..., mesh/... など) |
再利用可能な設定断片 | はい |
beach.toml |
beach が直接読む最終設定 |
いいえ。通常は生成物 |
~/.config/beachx/cases/*.toml |
beachx config save で保存する case 雛形 |
必要に応じて |
基本の流れは次です。
beachx config init で case.toml を作るcase.toml と必要な preset を編集するbeachx config validate で合成前提を確認するbeachx config render で beach.toml を生成するbeach beach.toml で実行するmkdir run_periodic2
cd run_periodic2
beachx config init
$EDITOR case.toml
beachx config validate
beachx config render
beach beach.toml
beachx config init の既定値は、次の built-in preset を組み合わせた case.toml を作ります。
sim/periodic2_fmmspecies/solarwind_electronspecies/solarwind_ionmesh/plane_basicoutput/standardサンプルは examples/periodic2_basic/case.toml にあります。
case.toml の構造case.toml は次の 4 要素だけを持つ設計です。
schema_versiontitleuse_presetsoverride例:
#:schema https://raw.githubusercontent.com/Nkzono99/BEACH/main/schemas/beach.case.schema.json
schema_version = 1
title = "Periodic2 base case"
use_presets = [
"sim/periodic2_fmm",
"species/solarwind_electron",
"species/solarwind_ion",
"mesh/plane_basic",
"output/standard",
]
[override.output]
dir = "outputs/periodic2_debug"
[override.sim]
batch_count = 10
override 以下は最終 beach.toml の構造に対応します。たとえば次のように書けます。
[override.sim][[override.particles.species]][override.mesh][[override.mesh.templates]][override.output]合成順序は常に次です。
use_presets を上から順に適用override を最後に適用merge の意味は次のとおりです。
particles.species と mesh.templates は array-of-tables として append しますmesh.groups.<name> は preset 間で同名定義を許しませんoverride.mesh.groups.<name> による最終上書きは許可しますつまり、species や template は preset を足し合わせる使い方に向いています。一方で sim.box_min や output.dir のような単一値は後から置き換わります。
id による要素単位の上書きparticles.species や mesh.templates は通常 append ですが、各要素に id を付けると、同じ id を持つ要素同士を deep merge できます。これにより、preset で定義した template や species の一部パラメータだけを case.toml の override で書き換えられます。
preset 側で id を付与します。
# mesh/plane_basic.toml
[[mesh.templates]]
id = "main_plane"
kind = "plane"
size_mode = "box_fraction"
size_frac = [1.0, 1.0]
placement_mode = "box_anchor"
anchor = "z_low_face_center"
offset_frac = [0.0, 0.0, 0.02]
nx = 20
ny = 20
case.toml の override で同じ id を指定すると、一致する要素に deep merge されます。
# case.toml
[[override.mesh.templates]]
id = "main_plane"
nx = 40
ny = 40
この場合、nx と ny だけが上書きされ、残りのキー(kind, size_mode, size_frac など)は preset の値がそのまま残ります。結果の template 数も 1 のままです。
[[particles.species]] でも同様に使えます。
# species/solarwind_electron.toml
[[particles.species]]
id = "electron"
source_mode = "reservoir_face"
q_particle = -1.602176634e-19
m_particle = 9.10938356e-31
target_macro_particles_per_batch = 5000
# case.toml
[[override.particles.species]]
id = "electron"
target_macro_particles_per_batch = 10000
ルール:
id はオプションです。付けない要素は従来どおり append されますid は非空文字列でなければなりませんid が重複するとエラーになりますid が base のどの要素とも一致しない場合は新規要素として append されますid は render 後の beach.toml からは除去されます(Fortran 側には渡りません)beachx config コマンドinit新しい case.toml を作ります。
beachx config init
beachx config init --title "Close-pack debug"
beachx config init --preset sim/periodic2_fmm --preset output/standard
保存済み雛形から始めることもできます。
beachx config init --from baseline_periodic2
validatecase.toml を読み、preset 解決・高水準記法展開・最終 beach.toml 制約まで含めて検証します。
beachx config validate
rendercase.toml を最終 beach.toml へ変換します。
beachx config render
beachx config render --stdout
beachx config render custom_case.toml --output out/beach.toml
diff2 つの case あるいは rendered config の差を比較します。
beachx config diff left.toml right.toml
beachx config diff --rendered case_a.toml case_b.toml
--rendered を付けると、preset 展開後の最終差分を見られます。
save / list-saved現在の case.toml を再利用用に保存できます。
beachx config save baseline_periodic2
beachx config list-saved
beachx config init --from baseline_periodic2
保存先は ~/.config/beachx/cases/ です。
同名 preset は次の優先順位で解決されます。
case.toml または現在位置から見て最も近い .beachx/presets/.beachx/presets/.beachx/presets/~/.config/beachx/presets/たとえば sim/periodic2_fmm は次のいずれかから探されます。
./.beachx/presets/sim/periodic2_fmm.toml../.beachx/presets/sim/periodic2_fmm.toml../../.beachx/presets/sim/periodic2_fmm.toml~/.config/beachx/presets/sim/periodic2_fmm.tomlbeach/config/presets/sim/periodic2_fmm.toml複数の project-local preset が見つかった場合は、最短パスになるもの、つまり最も近い親ディレクトリ側の preset が使われます。
sim/..., species/..., mesh/..., output/... を基本カテゴリにします. や .. を含むパス、絶対パス、.toml 付き指定は使えませんpreset は beach.toml とほぼ同じ構造の TOML 断片です。ただしトップレベルは必要な table だけを書きます。
例:
#:schema https://raw.githubusercontent.com/Nkzono99/BEACH/main/schemas/beach.preset.schema.json
[mesh]
mode = "template"
[[mesh.templates]]
kind = "plane"
size_x = 1.0
size_y = 1.0
nx = 20
ny = 20
center = [0.5, 0.5, 0.02]
schema_version / use_presets / override / base_case のような case.toml 用キーは preset では使えません。
beachx preset コマンド新規作成:
beachx preset new sim/lab/periodic2_fast
beachx preset new sim/lab/periodic2_fast --from sim/periodic2_fmm
beachx preset new output/project/debug --local
~/.config/beachx/presets/--local を付けると ./.beachx/presets/--from で複製して使う運用を想定しています一覧・表示・パス確認:
beachx preset list
beachx preset show sim/lab/periodic2_fast
beachx preset path sim/lab/periodic2_fast
beachx preset validate sim/lab/periodic2_fast
編集:
beachx preset edit sim/lab/periodic2_fast
$VISUAL または $EDITOR で user/project-local preset を開きます。built-in preset は read-only 扱いです。
抽出保存:
beachx preset save sim/lab/current_run --section sim
beachx preset save species/lab/ion --section species --index 2 --rendered
beachx preset save mesh/lab/plate --section mesh.templates --index 1
--section sim|mesh|output|species|mesh.templatesspecies と mesh.templates は --index が必須です--rendered を付けると入力を beach.toml として扱いますcase.toml と preset だけですbeach.toml には最終的な数値キーだけを残しますbeach は高水準記法を解釈しません[sim]: box 基準指定[override.sim]
box_origin = [0.0, 0.0, 0.0]
box_size = [1.0, 1.0, 10.0]
これは render 時に次へ展開されます。
[sim]
box_min = [0.0, 0.0, 0.0]
box_max = [1.0, 1.0, 10.0]
同じ fragment の中で box_origin と box_min、または box_size と box_max を同時に書くことはできません。
[[particles.species]]: face 上の相対注入領域reservoir_face / photo_raycast では、面上の矩形領域を uv で相対指定できます。
[[override.particles.species]]
source_mode = "reservoir_face"
inject_face = "z_high"
inject_region_mode = "face_fraction"
uv_low = [0.25, 0.25]
uv_high = [0.75, 0.50]
これは inject face 上の [0,1] x [0,1] 座標として解釈され、render 時に pos_low / pos_high へ変換されます。
制約:
inject_region_mode は reservoir_face / photo_raycast でのみ使用可能ですface_fraction では uv_low / uv_high が必要ですuv_* は各成分が [0,1] に入っている必要がありますuv_low <= uv_high が必要ですface_fraction と pos_low / pos_high の併用はできません[[mesh.templates]]: anchor + offsetdirect template では、center を直接書かずに box 基準配置できます。
[[override.mesh.templates]]
kind = "plane"
placement_mode = "box_anchor"
anchor = "z_low_face_center"
offset = [0.0, 0.0, 0.02]
size_mode = "box_fraction"
size_frac = [1.0, 0.5]
nx = 40
ny = 20
利用できる anchor は次です。
box_centerx_low_face_centerx_high_face_centery_low_face_centery_high_face_centerz_low_face_centerz_high_face_centeroffset は実長さ、offset_frac は box サイズ比率です。同時指定はできません。
size_mode = "box_fraction"box 追従の寸法指定は、現在次の shape でサポートしています。
plane, plane_hole, plate_hole: size_frac = [fx, fy]box: size_frac = [fx, fy, fz]sphere: size_frac = f から radius = f * min(box_size)cylinder: size_frac = [fr, fh]disk と annulus は現状 size_mode = "box_fraction" 非対応です。
mesh.groups.*: 複数 template をまとめて配置複数 template を 1 つの group として定義し、group 単位で平行移動と一様スケーリングをかけられます。
[override.mesh.groups.cavity_unit]
placement_mode = "box_anchor"
anchor = "box_center"
scale_from = "box_x"
scale_factor = 0.25
[[override.mesh.templates]]
group = "cavity_unit"
kind = "plane"
center_local = [0.0, 0.0, -1.0]
size_x = 4.0
size_y = 2.0
nx = 8
ny = 4
group で使えるキー:
placement_modeanchoroffsetoffset_fracscalescale_fromscale_factorscale_from の候補:
box_xbox_ybox_zbox_min_xybox_max_xybox_min_xyzbox_max_xyzgrouped template では center_local を使い、render 時に center へ変換します。group に属する template では center や個別 placement_mode は使えません。
最終 beach.toml に残るのは既存の低水準キーだけです。
box_min, box_maxpos_low, pos_highcentersize_x, size_y, sizeradius, inner_radius, height高水準キーと id は render 後に消し込まれます。
生成されるファイルには次の schema directive が付きます。
case.toml → beach.case.schema.jsonbeach.preset.schema.jsonbeach.toml → beach.schema.jsonVS Code の Even Better TOML / Taplo では、この #:schema ... により補完と検証が効きます。
まず次を順に確認してください。
.toml を付けていないかcase.toml の親方向に .beachx/presets/ があるか~/.config/beachx/presets/ に保存したつもりの preset があるかbuilt-in preset は package 同梱物なので、直接編集せず複製して使います。
beachx preset new sim/lab/periodic2_fast --from sim/periodic2_fmm
beachx preset edit sim/lab/periodic2_fast
beach.toml に高水準キーを書いてはいけないのかはい。beach.toml は最終正規形に保つ方針です。高水準記法は case.toml / preset で使い、render で数値へ解決してください。