:tocdepth: 1

===================================
PythonスクリプトTips
===================================

.. index::
	single: PythonスクリプトTips

[|today| 更新]

Tips
=============

ID番号を数値でソートする
-------------------------

| EMSOJsonのデータから，ID番号群を取得すると，数値としての小さい順番ではなく，
| 文字列としての順番で取得されてしまいます（下記例参照）．

.. code-block:: python 

	> I = js["SOURCES"]["CURRENT"]
	> list(I.keys())
	['1', '10', '2', '20', ...]

| 数値の小さい順番でID番号群を取得するには，sorted()関数に，```key=int```を引数として指定すれば良い（下記例参照）．

.. code-block:: python 

	> I = js["SOURCES"]["CURRENT"]
	> sorted(list(I.keys()), key=int)
	['1', '2', '3', ...]

Pythonスクリプト例
------------------

とりあえず，行列計算が未収束となったのか判定する例．
変数 **js** にEMSOJsonのデータが収納されているとする．

.. code-block:: python

    #------------------------------
    #[input]
    #  js    : EMSOJson data
    #[return]
    #  True  : 収束 
    #  False : 未収束が1つ以上ある 
    #------------------------------
    def isconverge(js):

        conv = js["ICCG"]["CONVERGE"] # CONVERGEタグのデータ取得
        for step in conv:             # 各ステップのデータ抽出
            for isc in step:          # 各ステップのNR反復毎のデータ抽出 
               if not isc:
                 return False         # 1つでも未収束の場合はFalse
        return True

行列計算が未収束となった計算ステップ番号，NR反復番号まで取得したい例．

.. code-block:: python

    #-------------------------
    #[input]
    #  js        : EMSOJson data
    #[return]
    #  unconvs[] : 未収束のステップ番号およびNR反復番号 
    #-------------------------
    def isconverge(js):

        unconvs = []                         # 未収束のステップ番号およびNR反復番号

        conv = js["ICCG"]["CONVERGE"]        # CONVERGEタグのデータ取得
        for (i,step) in enumerate(conv):     # 各ステップのデータ抽出
            for (j,isc) in enumerate(step):  # 各ステップのNR反復毎のデータ抽出 
                if not isc:
                    unconvs.append([i,j])    # 未収束のステップ番号(i)およびNR反復番号(j)を収納
        return unconvs 
