================
Pythonによる実行
================

.. note::
    Pythonによる実行は，正式に2025.05より対応しました。

    ``pyemsol`` の実行にはPythonの環境が必要です。Pythonの環境構築は，各自で行ってください。

    Pythonのバージョンによりインストーラも異なりますので，注意してください。

    2025.05のバージョンでは、Python 3.11に対応しています。該当の環境を作成してご利用ください。

Pythonから実行するには，専用モジュール ``pyemsol`` を使用します。

-----------------
インストール方法
-----------------

インストーラ（拡張子 whl）を用意し，Pythonが実行できるプロンプト（Anaconda Prompt等）から以下のコマンドを実行してインストールします。

.. code-block:: console
    :caption: コマンドプロンプトでのインストール例

    C:\> pip install pyemsol-(version)-(environment)-(win/linux).whl

``pyemsol`` は，Pythonのパッケージとしてインストールされます。

^^^^^^^^^^^^^^^^^^
追加の依存パッケージ
^^^^^^^^^^^^^^^^^^
``pyemsol`` を利用するには、追加の依存パッケージが必要です。パッケージをインストールした後、以下のCoパッケージも必ずインストールしてください。
Anacondaやconda環境であれば、以下のコマンドを実行してインストールできます。

.. code-block:: console
    :caption: Condaでの追加パッケージのインストール例

    C:\> conda install -c conda-forge pybind11 pybind11-abi
    C:\> conda install -c conda-forge mkl mkl-include

または、pipを使用して以下のコマンドでインストールできますが，他のパッケージとの依存関係に注意してください。

.. code-block:: console
    :caption: pipでの追加パッケージのインストール例

    C:\> pip install pybind11 mkl mkl-include


インストール後，以下のように ``pyemsol`` をインポートして使用します。
正しく読み込めているかの確認には， ``pyemsol.version()`` を使用します。

.. code-block:: python

    import pyemsol
    print(pyemsol.version())

-----------------
実行方法
-----------------
Pythonから ``pyemsol`` を使用して実行するには，二つの方法があります。

1. EMSolutionと同様に， *input.json* データを引数として ``pyemsol.run`` で実行する。
2. ``pyemsol.initialize`` で初期化し， ``pyemsol.solve`` を複数回実行可能，``pyemsol.finalize`` で終了する。

^^^^^^^^^^^^^^^^^
1. 従来と同じ実行
^^^^^^^^^^^^^^^^^
``pyemsol.run`` を使用して，従来の実行方法と同様に実行します。

``pyemsol.run`` は，Windowsでいうバッチ版 ``EMSolBatch.exe`` をスクリプトで実行する場合とほぼ等価で，以下のように使用します。

.. code-block:: python
    :caption: Python code

    import pyemsol
    # input.json のあるディレクトリ
    current_directory = os.getcwd()
    # or
    # current_directory = "C:/EMSolution/pyemsol_test/"
    # input.json のファイル名
    input_json = "input.json"
    with open(input_json, 'r') as file:
        json_data = json.load(file)

    # 実行。リターン値として output.json が返される
    output = pyemsol.run(json_data, current_directory)

^^^^^^^^^^^^^^^^^
2. 初期化してから複数回実行
^^^^^^^^^^^^^^^^^
``pyemsol.initialize`` を使用して初期化し， ``pyemsol.solve`` を複数回実行することができます。
``pyemsol.finalize`` で終了します。

- ``pyemsol.initialize`` で初期化: :paramdef:`PRE_PROCESSING(1)` , :paramdef:`MAKE_SYSTEM_MATRICES(1)` と， :paramdef:`SOLVE_EQUATION(1)` の前処理を実行します。
- ``pyemsol.solve`` で計算: :paramdef:`SOLVE_EQUATION(1)` の主計算部分と，:paramdef:`POST_PROCESSING(1)` のポストデータ処理部分を実行します。 
- ``pyemsol.finalize`` で終了: 計算終了関連を実行し，終了します。

``pyemsol.solve`` を複数回実行できるようになったことで，計算条件を変更して，複数回計算を行うことができます。
例えば，モータ解析で電流の振幅や位相を変更して，複数回計算を行う場合などに使用します。

以下のように使用します。

.. code-block:: python
    :caption: Python code

    import pyemsol
    # input.json のあるディレクトリ
    current_directory = os.getcwd()
    # or
    # current_directory = "C:/EMSolution/pyemsol_test/"
    # input.json のファイル名
    input_json = "input.json"
    with open(input_json, 'r') as file:
        json_data = json.load(file)

    # 初期化
    pyemsol.initialize(json_data, current_directory)
    # 計算条件の更新
    for i in range(num_case):
        # 計算条件の更新
        # update Time_Function
        # json_data["18_Time_Function"] = new_time_function
        pyemsol.update_Time_Function(json_data)
        # 計算実行, 計算結果の取得
        output = pyemsol.solve()

    # 計算終了
    pyemsol.finalize()

計算条件の変更方法は、以下の二つあります。

- ``pyemsol.update_properties_in_design_domain``: 設計領域のプロパティを変更します。
- ``pyemsol.update_Time_Function``: 時間関数の振幅や位相を変更します。

具体的な使い方は :doc:`/api/examples` と :doc:`/api/showcase` を参照してください。

- :doc:`/tutorials/parameter_servey/parameter_servey`
