:tocdepth: 1

===================================
EMSOJson(EMSolution Outout Json)
===================================

.. index::
	single: EMSOJson 

 [|today| 更新]

.. only:: html or singlehtml
.. raw:: html

    <div id="show-hide-switch-1" title="表示/非表示切り替え">EMSOJsonとは
	</div>
	<div id="show-hide-target-1">

| EMSolutionの出力ファイル(outputファイル)の中に出力される各種計算値を，JSONフォーマットの別ファイル( **output.json** )として作成する機能です．
| EMSOJsonに対応したバージョンのEMSolutionを使えば，今までと同じようにEMSolutionを実行するだけで，このJSONフォーマットのファイルが作成されます．
| 説明の都合上，出力されるJSONフォーマットのファイル( **output.json** )を， **EMSOJsonデータ** 呼ぶことにします．

.. note::

	EMSOJsonで出力される各種計算値は，有効桁数11桁で出力されます．

| JSONフォーマットは，構造的(階層的)なデータを記載するための汎用的なフォーマットです．
| C++/C#/Pythonなどの各種プログラミング言語で幅広く使われています．
| FirefoxやChromeなどのWebブラウザでも，プラグインを入れることで，JSONフォーマットのファイルを読み込み，階層的なデータを確認することもできます．

.. only:: html or singlehtml
.. raw:: html

    </div><!-- show-hide-target-1 -->


.. only:: html or singlehtml
.. raw:: html

    <div id="show-hide-switch-2" title="表示/非表示切り替え">JSONフォーマットのファイルの読み込み方
	</div>
	<div id="show-hide-target-2">

| JSONフォーマットのファイルは，各種プログラミング言語で簡単にデータを読み込むことができます．
| 例えば，全世界でデータ処理を行うのに幅広く使われているプログラミング言語Pythonを使ってみます．

.. code-block:: Python

	import json # jsonモジュールを読み込み
	
	fin = open("output.json", encoding="utf-8") # output.jsonファイルを指定
	js = json.load(fin) # output.jsonファイルを読み込み

| たったこれだけです．これだけで，JSONフォーマットのEMSOJsonデータを読み込むことができます．
| 読み込んだEMSOJsonデータは，変数jsに代入されています．
| 変数jsの中身を調べてみましょう．

.. code-block:: Python

	>>> js.keys() # js辞書型変数のキーの一覧の取得
	dict_keys(['FORCE_J_B', 'HEAT', 'POWER_SOURCES', 'SOURCES'])

| Pythonでは，読み込んだJSONファイルのデータを，辞書型(Dictionary型)の変数として代入します．
| つまり，変数jsは辞書型の変数ということになります．
| 辞書型の変数は，キーと呼ばれる指示子(本マニュアルではキーではなく **タグ** と呼ぶことにします）を指定すると，それに応じた値を取得することができます．
| 値が，さらに辞書型の変数であることもあり，これによって，構造的なデータを表すことができます．
| Pythonの場合，辞書型の変数に .keys()と付けることで，全てのタグを取得することができます．

| 上記のEMSOJsonデータでは，

* FORCE_J_B
* HEAT
* POWER_SOURCES
* SOURCES

| タグのデータを持ってることになります．

| 但し，.keys()を付けて取得される辞書型変数のキーの一覧のデータのままでは使いにくいです．
| そこで通常は，list()関数を使って，キーの一覧をリスト型にデータ変換します．

.. code-block:: Python

	>>> list(js.keys()) # 辞書型変数のキーの一覧をリストに変換
	['FORCE_J_B', 'HEAT', 'POWER_SOURCES', 'SOURCES']

| さらに， **SOURCES** タグの持つ第2タグの一覧を取得してみましょう．

.. code-block:: Python

	>>> sources = js["SOURCES"] # SOURCESタグのデータの取得
	>>> list(sourcs.keys()) # SOURCEタグの第2タグの一覧の取得
	['AMPLITUDE', 'FLUX', 'VOLTAGE']

| **SOURCES** タグは，下記に示す第2タグのデータを持っていることが分かります．

* AMPLITUDE
* FLUX
* VOLTAGE

.. only:: html or singlehtml
.. raw:: html

    </div><!-- show-hide-target-2 -->


.. only:: html or singlehtml
.. raw:: html

    <div id="show-hide-switch-3" title="表示/非表示切り替え">実際の使い方
	</div>
	<div id="show-hide-target-3">

| 実際にEMSOJsonデータを使う場合は，前もって，必要とするデータが決まっていることが大半です．
| 例えば，

* 回転機のトルクの値を使いたい
* 物性番号毎のジュール損を知りたい

| などです．

| 回転機のトルクならば，電磁力を求めれば良いので， **FORCE_NODAL第1タグ** を使い，ジュール損ならば， **HEAT第1タグ** を使うことになります．
| さらに，それぞれ， **FORCE** や， **JOULE** などの第2タグも必要となります．
| 詳細は，マニュアルの個別の項目をご覧下さい．

| **3番目のタグは物性番号** を表します．物性番号は文字列として（例えば物性番号100は，文字列"100"）使って下さい．
| 特定のデータでは，物性番号以外に，

* TOTAL（総和）
* STATOR（固定部の総和）
* ROTOR（可動部の総和）

| の第3タグも使うことができます．

.. code-block:: Python

	force100 = js["FORCE_NODAL"]["FORCE"]["100"] # 物性番号100の電磁力の取得
	total = js["FORCE_NODAL"]["FORCE"]["TOTAL"] # 電磁力の総和
	stator = js["FORCE_NODAL"]["FORCE"]["STATOR"] # 固定部全体の電磁力
	rotor = js["FORCE_NODAL"]["FORCE"]["ROTOR"] # 可動部全体の電磁力

| ただし，

* 積分空間磁場（B_INTEGタグ）
* 閉曲面をプレート要素以外で定義した場合の鎖交磁束（MAG_FLUXタグ）

| などは3番目のタグを持ちません．
| これはEMSolutionの仕様に基づくものです．

.. only:: html or singlehtml
.. raw:: html

    </div><!-- show-hide-target-3 -->

.. only:: html or singlehtml
.. raw:: html

    <div id="show-hide-switch-4" title="表示/非表示切り替え">取得されるデータ形式
	</div>
	<div id="show-hide-target-4">

| EMSOJsonデータから，タグを使って取得されるデータは，全て **配列** となっています．
| これは，取得されるデータがベクトル値であることではなく， **ステップ番号ぶんのデータ** であることを意味します．

| つまり，静磁場計算のように1ステップの計算と，過渡計算の結果や，AC計算の結果を同じ扱いとするためです．
| 従って，静磁場解析の結果であっても，取得されるデータは個数1個の配列となります．

.. code-block:: Python

	>>> voltage1 = js["SOURCES"]["VOLTAGE"]["1"]	# ソース1の電圧の取得
	>>> voltage1
	[2.79630752556]				# 個数1個の配列

| 積分空間磁場(B_INTEGタグ)や，電磁力(FORCE_NODALタグ)のように，計算値そのものがベクトル値の場合は，取得されるデータは，配列(ベクトル値)の配列となります．

.. code-block:: Python

	>>> force1 = js["FORCE_J_B"]["FORCE"]["1"]	# 物性番号1のローレンツ力の取得
	>>> force1
	[[3365.65502603, 2070.81716324, 0.00150366357714, 0.000613122214318, -0.000841380874604, -0.000719091229351]]
	# 6成分のベクトル(配列)の個数1個の配列(配列の配列)


.. only:: html or singlehtml
.. raw:: html

    </div><!-- show-hide-target-4 -->

.. only:: html or singlehtml
.. raw:: html

    <div id="show-hide-switch-5" title="表示/非表示切り替え">プレーンテキストへの変換
	</div>
	<div id="show-hide-target-5">

| 「JSONフォーマットのデータが使いやすいのは分かるが，今までデータ処理に使っていたプログラムを流用したい」
| などの理由で，プレーンテキストが必要となるケースもあると思います．
| そのようなケースであれば，EMSOJsonデータからプレーンテキストに変換するスクリプトを作成するのも一つの手です．

| 全ての計算値に対応するのも可能ですが，都合上，電磁力のプレーンテキストのみ変換するPythonスクリプトを以下に示します．
| プレーンテキストの出力形式をどのようにするべきかですが，暫定的に，
| 1行目に，総ステップ数と総ブロック数（物性番号 + ROTOR + STATOR + TOTAL）
| 2行目にブロックの名称（物性番号，ROTOR, STATOR, TOTAL）
| 3行目以降に，各ブロック毎に，計算値を1行ずつステップ数ぶんだけ出力
| とすることにします．

.. code-block:: Python

	import json

	fin = open("output.json", encoding="utf-8")
	js = json.load(fin)
	force = js["FORCE_NODAL"]["FORCE"] # 電磁力データを取得
	IDs = list(force.keys()) # ブロック名称を取得
	nsteps = len(force[IDs[0]]) # 総ステップ数を取得
	nvecs = len(force[IDs[0]][0]) # ベクトル成分の個数を取得

	fout = open("force.txt", "w") # 出力ファイル
	fout.write("%d %d\n" % (nsteps, len(IDs))) # 1行目出力

	for ID in IDs: # 2行目出力
	    fout.write(" %s" % ID)
	fout.write("\n")

	for ID in IDs: # 各ブロック毎に
	    for j in range(nsteps): # 各ステップ毎に
	        for k in range(nvecs): # 全てのベクトル成分
	            fout.write(" %18.11e" % (force[ID][j][k]))
	        fout.write("\n")
	fout.close()

| 上記のEMSOJsonデータは，過渡解析の計算結果であり，force[ID]で得られる計算データが，配列(ベクトル)の配列(ステップ)となっていることに注意して下さい．
| j番目のステップ(0ベース)のi番目のベクトル成分(同じく0ベース)は
|   force[ID][j][i]
| となります．

| 上記のPythonスクリプトを実行すると，EMSOJsonデータから抽出した電磁力のデータを，下記のようなプレーンテキストで出力することができます．

.. code-block:: none

	16 7
	 1 2 21 3 ROTOR STATOR TOTAL
	 -4.64331688739e-05 -4.90365956827e-05  0.00000000000e+00  1.47109787048e-07 -1.39299506622e-07 -4.56748885475e-09
	 -4.55550674994e-05 -4.98400075648e-05  0.00000000000e+00  1.49520022694e-07 -1.36665202498e-07 -4.56937932982e-09
	...

| 上記のPythonスクリプトは，任意のMSOJsonデータに適用可能です．
| 他の計算値に対しても，同様のスクリプトを簡単に作成することができます．

.. only:: html or singlehtml
.. raw:: html

    </div><!-- show-hide-target-5 -->
