==========================
pyemsol API リファレンス
==========================

このページは、Pythonパッケージ ``pyemsol`` の利用者向け公開APIです。
Pythonから呼び出せる関数でも、eMotorSolutionやEMSOptimizerとの内部連携専用であれば
ここには掲載しません。

利用上の共通事項
------------------

- ``inputJson`` には、組み込みPython型だけで構成したJSON互換の ``dict`` / ``list`` /
  ``str`` / ``bool`` / ``int`` / ``float`` / ``None`` を渡します。NumPy配列・NumPyスカラー・
  タプルは、このAPIの入力として直接渡せません。
- 同一プロセス内で同時に複数の解析を実行することはサポートしません。並列パラメータ
  サーベイには独立したプロセスを使用してください。
- 戻り値が ``bool`` の更新APIでは結果を確認してください。反復解析は必ず ``finalize()`` で、
  外部ステップ解析は ``close()`` または ``with`` 文で終了します。
- 入力データの詳細は :doc:`/handbook/inputControl/input` を参照してください。

APIの選び方
------------

- 1回だけ解析する: ``run(input_json, run_directory)``
- 条件を更新して反復する: ``initialize()`` → 更新API → ``solve()`` → ``finalize()``
- 外部から時刻ごとに与える: ``with CoupledSession(...)`` → ``step()`` の反復

一括解析と反復解析
------------------

.. py:function:: run(inputJson, run_directory) -> dict

   入力を変更せずに1回解析します。``output.json`` 相当の結果を ``dict`` として返します。
   ``run()`` の前後に ``initialize()``、``solve()``、``finalize()`` を組み合わせません。

.. py:function:: initialize(inputJson, run_directory) -> dict

   反復解析の内部状態を初期化し、設計領域がある場合は設計要素情報を返します。
   ``initialize()`` が成功した後は、例外が発生した場合も含めて ``finalize()`` をちょうど1回呼び出します。

.. py:function:: solve() -> dict

   初期化済みの現在条件で解析し、結果を返します。更新APIの後に反復実行できます。

.. py:function:: finalize() -> int

   反復解析を終了し、内部リソースを解放します。現在の正常終了時の戻り値は ``0`` です。

.. code-block:: python

   design_space = pyemsol.initialize(input_json, str(model_dir))
   try:
       # 必要に応じて入力を更新する
       output = pyemsol.solve()
   finally:
       pyemsol.finalize()

反復解析中の更新
----------------

.. py:function:: update_Time_Function(inputJson) -> bool

   ``18_Time_Function`` の既存 ``TIME_ID`` を基準に時間関数を更新します。該当ブロックが
   ない場合は ``False`` を返します。

.. py:function:: update_properties_in_design_domain(inputJson) -> bool

   設計領域として初期化された材料の ``16_Material_Properties`` を更新します。入力には
   入力JSON全体、または ``16_1_3D_Element_Properties`` を含む辞書を渡せます。

実例は :doc:`examples` と :doc:`showcase` を参照してください。

外部 Mesh Morphing 連携
------------------------

外部のmesh morphingツールと連携する ``CoupledSession``、静的体積メッシュ、座標payloadの
入出力仕様と制約は、 :doc:`外部 Mesh Morphing 連携 <external_mesh_morphing>` にまとめています。
スキーマバージョン、座標系、対応モデルの制約を確認してから利用してください。

既存スクリプトとの互換API
--------------------------

以下は既存コードを維持するためのモジュールレベルAPIです。新規コードでは
``CoupledSession`` を使用してください。

- ``prepare_step_calculation(inputJson, run_directory) -> dict``
- ``step_calculation() -> int``
- ``step_calculation(time, delta_time, inputs={}, deformation=None) -> dict``
- ``describe_coupling_ports() -> dict``
- ``describe_deformation() -> dict``
- ``describe_deformation_mesh() -> dict``
- ``close() -> dict``

情報
----

.. py:function:: version() -> dict

   バージョン情報を返します。
