解析ジョブのフローと結果ストア
解析ジョブのフロー
analysis_runを呼び、job_idを受け取る(この時点でジョブはRunningとしてバックグラウンド実行される)analysis_status(job_id)をDone/FailedになるまでポーリングするDoneの場合、analysis_statusのresult_refにサマリ JSON が入っている。さらに詳細な明細(節点変位・部材内力など)が必要ならresult_getを呼ぶ
// 1. analysis_run(kind="LinearStatic") の返り値
{ "job_id": "job-0" }
// 2. analysis_status(job_id="job-0") の返り値(Done になった時点)
{
"id": "job-0",
"kind": "LinearStatic",
"status": {
"Done": {
"result_ref": "{\"kind\":\"LinearStatic\",\"case\":1,\"n_nodes\":2,\"n_member_force_rows\":3,\"max_abs_disp\":1.23,\"store\":{\"case\":1,\"kinds\":[\"NodalDisp\",\"MemberForce\"]}}"
}
}
}
// 3. result_get(case=1, kind="NodalDisp") の返り値
{ "case": 1, "kind": "NodalDisp", "rows": [ { "node_id": 1, "ux": 0.0, "uy": 0.0, "uz": 1.23, "rx": 0.0, "ry": 0.0, "rz": 0.0 } ], "truncated": false }
Eigen ジョブの結果は結果ストアに case=0 として格納されます(実荷重ケース番号との衝突を避けるための固定値)。result_get(case=0, kind="Modal") で取得します。
実装参照:ジョブの登録・実行・状態は sepika_mcp::server::SepikaServer::{analysis_run, analysis_status}(crates/sepika-mcp/src/server.rs)が、結果の取得は sepika_mcp::persist::result_get_json(crates/sepika-mcp/src/persist.rs)が担います。
結果ストアのスキーマ
result_get の kind に指定できる 4 種のスキーマは以下のとおりです(すべて Arrow の UInt32/UInt64/Float64 列で構成されます)。
NodalDisp
| 列名 | 型 |
|---|---|
node_id | UInt32 |
ux, uy, uz | Float64 |
rx, ry, rz | Float64 |
MemberForce
| 列名 | 型 | 備考 |
|---|---|---|
elem_id | UInt32 | |
pos | Float64 | 評価位置(0..1 の正規化座標) |
n, qy, qz, mx, my, mz | Float64 | 部材内力(軸力・せん断・ねじり・曲げ) |
Modal
| 列名 | 型 |
|---|---|
mode | UInt32 |
period | Float64 |
omega2 | Float64 |
part_x, part_y, part_z | Float64 |
eff_x, eff_y, eff_z | Float64 |
TimeHistory
| 列名 | 型 |
|---|---|
step | UInt64 |
time | Float64 |
node_id | UInt32 |
ux, uy, uz | Float64 |
rx, ry, rz | Float64 |
result_get が 1 回に返す行数の上限は 10,000 行です。超過分は切り詰められ、応答の truncated が true になります。
実装参照:スキーマは sepika_io::results::{nodal_disp_schema, member_force_schema, modal_schema, time_history_schema}(crates/sepika-io/src/results/schema.rs)が定め、結果の書き込みは sepika_mcp::persist::persist_job_outcome(crates/sepika-mcp/src/persist.rs)が行います。