PythonスクリプトTips

[2018/12/20更新]

Tips

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

EMSOJsonのデータから,ID番号群を取得すると,数値としての小さい順番ではなく,
文字列としての順番で取得されてしまいます(下記例参照).
> I = js["SOURCES"]["CURRENT"]
> list(I.keys())
['1', '10', '2', '20', ...]
数値の小さい順番でID番号群を取得するには,sorted()関数に,```key=int```を引数として指定すれば良い(下記例参照).
> I = js["SOURCES"]["CURRENT"]
> sorted(list(I.keys()), key=int)
['1', '2', '3', ...]

Pythonスクリプト例

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

#------------------------------
#[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反復番号まで取得したい例.

#-------------------------
#[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