:tocdepth: 1

.. role:: bred

=============================================
configファイルを使った既定値の変更
=============================================

.. index::
	single: configファイル

[|today| 更新]

| **EMYフォーマット** では，幾つかの設定値には **既定値** があり，これらの設定値では値を設定しない時は，**既定値** を使ったems入力ファイルが生成されます．
| 例えば，**iccgタグ** の **ICCG_CONV** ラベルに値を設定しないと，**既定値** の **1e-6** の値が用いられて，ems入力ファイルが生成されます． 

| **EMYフォーマット** の **既定値** の値は，**EMSolution** の(当時の)ハンドブックに記載された値を元に決められましたが，計算モデルによっては適切な値でないこともあります．
| そこで，下記に示す特定の設定値に関しては，configファイルを生成し，

- **--config** コマンド引数でconfigファイル（**.yml** を拡張子とする任意の名前のファイル）を指定して **emy** コマンドを実行する
- 特定のディレクトリに，**.emy.config.yml** というファイル名（ファイル名は固定）のconfigファイル保存する

のいずれかを行うことで，**既定値** を変更することができます．

| configファイルで変更されるのは **既定値** です．**既定値** を変更しても，**EMY** ファイルの各設定値に値を入力すれば，そちらが優先して反映されます．
| **既定値** は，あくまで， 設定項目に値が入力されない時に代用される値であることに注意して下さい．

configファイルの記述方法
===========================

| configファイルに，各設定値の **既定値** の変更後の値を記述するのは，**EMYフォーマット** で各ラベルの値を記述するのと，**ほぼ** 同じです． 
| 但し，configファイルは **YAMLフォーマット** のファイルなので，階層構造のラベル/タグは，**半角スペース2文字以上でインデントする必要** があります（**EMYフォーマット** では，インデントしなくても良い）．
| 例えば，上記の **ICCG_CONV** ラベルの **既定値** を **1e-8** に変更するケースでは，


.. code-block:: YAML

  iccg:
    ICCG_CONV: 1e-8

| として下さい．
| これを，下記のように，**ICCG_CONV** ラベルをインデントなしで記述するのはダメです．

.. code-block:: YAML

  iccg:
  ICCG_CONV: 1e-8


| さらに，**DIV_FACTOR** ラベルおよび，**DIV_ITERATION** ラベルの **既定値** も変更するケースでは，下記のようになります．

.. code-block:: YAML

  iccg:
    ICCG_CONV: 1e-8
    DIV_FACTOR: 10
    DIV_ITERATION: 20

configファイルの保存ディレクトリ
============================================================

| configファイルは，**emy** コマンドを実行する際に，**--config** コマンド引数を使えば, 読み込むconfigファイルを直接指定することができます．
| **--config** コマンド引数を指定しないと，下記の手順に従って，該当するディレクトリに，configファイル（ファイル名: **.emy.config.yml** ）を探し，configファイルがある場合は，それを読み込みます．

1. カレントディレクトリ（**emy** コマンドを実行しているディレクトリ）
2. ホームディレクトリ（環境変数 **HOME** で定義されているディレクトリ）
3. **emy** 実行ファイルのあるディレクトリ

| 但し，上位のディレクトリで, **.emy.config.yml** ファイルが見つかった時点で，configファイルを読み込み，それ以降のディレクトリのconfigファイルは読み込みません．
| 例えば，カレントディレクトリと，ホームディレクトリの両方にconfigファイルが保存されていたとしても，ホームディレクトリに保存されたconfigファイルは読み込まれません． 

既定値の変更が可能な設定値の一覧
================================================

| 既定値の変更が可能な設定値の一覧は，下記のようになります．


.. csv-table:: 既定値の変更が可能な設定値 
	:header: タグ, ラベル, 設定例, 説明
	:widths: 2, 3, 4, 7

	:doc:`potoption<potoption>`, "**REGULARIZATION**", "| potoption:
	|  REGULARIZATION: 1", "コイルに流れる電流の算出に正則化を施します"
	:doc:`potoption<potoption>`, "**LINE_SEARCH**", "| potoption:
	|  LINE_SEARCH: 1", "非線形解析で減速係数を自動算出します"
	:doc:`iccg<iccg>`, "**ICCG_CONV**", "| iccg:
	|  ICCG_CONV: 1e-8", "ICCG法の収束判定値"
	:doc:`iccg<iccg>`, "**DIV_FACTOR**", "| iccg:
	|  DIV_FACTOR: 10", "反復計算が発散したとみなす倍数"
	:doc:`iccg<iccg>`, "**DIV_ITERATION**", "| iccg:
	|  DIV_ITERATION: 20", "反復計算が発散したとみなす連続回数"
	:doc:`nonlin<nonlin>`, "**INIT_OPTION**", "| nonlin:
	|  INIT_OPTION = 1", "ステップ計算で初期値をゼロクリア"
	:doc:`nonlin<nonlin>`, "**CHECK_B**", "| nonlin:
	|  CHECK_B: -0.01", "非線形解析の収束判定を最大磁場変化量で判定"
	:doc:`inputfile<inputfile>`, "**INPUT_MESH_FILE**", "| inputfile:
	|  INPUT_MESH_FILE: 2", "入力ファイルのフォーマット形式"
	:doc:`inputfile<inputfile>`, "**UNIT**", "| inputfile:
	|  UNIT: 1", "節点座標の座標系"
	:doc:`outputfile<outputfile>`, "**POST_DATA_FILE**", "| outputfile:
	|  POST_DATA_FILE: 2", "出力ファイルのフォーマット形式"
	:doc:`outputfile<outputfile>`, "**WIDE**", "| outputfile:
	|  WIDE: 1", "出力ファイルの数値の有効桁数"
	:doc:`geometry<geometry>`, "**GEOMETRY**", "| geometry:
	|  GEOMETRY: 4", "解析領域の次元"
	:doc:`geometry<geometry>`, "**DELTA_Z**", "| geometry:
	|  DELTA_Z: 0.1", "二次元並進対称のZ軸方向長さ"
	:doc:`geometry<geometry>`, "**DELTA_THETA**", "| geometry:
	|  DELTA_THETA: 1", "軸対称の角度方向の要素の角度"
	:doc:`bc<bc>`, "**DISTANCE_JUDGE**", "| bc:
	|  DISTANCE_JUDGE: 1e-6", "節点が面および線上にあるか判定する距離"
	:ref:`elmcur<elmcur>`, :bred:`OPTION`, "| source:
	|  elmcur:
	|    OPTION: 1", "要素に流れる電流の与え方"

| :bred:`elmcurタグのOPTIONラベルは，configファイルのみ有効なラベルです`
| :bred:`EMYファイルのelmcurタグにOPTIONラベルは存在しません`

オススメの既定値変更の例
================================================

1. ICCGの収束関連
----------------------------

| **EMSolution** は，入力ファイルの設定項目が間違った計算を行ったケースを想定し，ICCG法の収束状況が一定の範囲内に収まらないと，ICCG法が発散したと判定し，計算を中断してしまいます．
| これでは，(元々)収束性の悪い計算モデルでは，最後まで計算を続行せず，計算が中断してしまう危険があります．

| これに対し，ICCG法が発散したと判定する範囲を広げることで，最後まで計算を続行することができます．
| 以下に示す例では，ICCG法が発散したと判定する範囲を広げるための既定値変更の例です．
| なお，ICCG法の収束そのものは，**ICCG_CONV** ラベルで設定した値で判定されますので，ICCG法が発散したと判定する範囲を広げても，計算結果の精度が悪くなることはありません．
| (加えて，収束性が悪くない計算モデルでは，従来と全く同じ収束となります）

.. code-block:: YAML

  iccg:
    DIV_FACTOR: 10
    DIV_ITERATION: 20

2. 非線形の収束関連
----------------------------

| **EMSolution** は，非線形の収束判定に残差の値を使ってきた歴史があります．
| しかしながら，非線形の収束判定は，残差ではなく最大磁場変化量で判定すべきです．
| 特に，**CHECK_B** ラベルに，最大磁場変化量の判定値を設定する場合は，負の値を設定しなくてはならないことを忘れやすいので，configファイルに，**CHECK_B** ラベルの既定値を設定しておくことをオススメします．
| ついでに，非線形が収束しにくい計算モデルには，**LINE_SEARCH** ラベルをオンしておくと，減速係数を自動算出するので，効果があります．

| 以下に示す例では，非線形計算において，収束判定に最大磁場変化量(0.01[T])を用い，減速係数を自動算出することを **既定値** とするconfigファイルの設定です．

.. code-block:: YAML

  potoption:
    LINE_SEARCH: 1
  nonlin:
    CHECK_B: -0.01

3. 入出力ファイルのフォーマット関連
-------------------------------------

| **emy** では，入出力ファイルのフォーマットの既定値は，**Neutral** フォーマットとなっています．
| しかしながら，**Femap** をお持ちでないユーザの方は，例えば，**ATLAS** フォーマットがメインとなる方もいらっしゃるでしょう．
| そのようなユーザの方は，configファイルで，入出力ファイルのフォーマットの **既定値** を変更することをオススメします．
| また，読み込むメッシュファイルの単位が [mm]単位がメインの場合に，よく **UNIT** 設定項目を設定し忘れるミスも，configファイルで，**UNIT** ラベルの **既定値** を変更することで回避できます．

| 以下に示す例では，入出力ファイルのフォーマットが **ATLAS** フォーマットで，読み込むメッシュファイルの座標の単位が [mm]単位のケースの，**既定値** の例です．

.. code-block:: YAML

  inputfile:
    INPUT_MESH_FILE: 2
    UNIT: 1
  outputfile:
    POST_DATA_FILE: 2

4. 二次元解析の引伸し量(回転角)関連
----------------------------------------

| **EMSolution** では，二次元解析であっても，三次元メッシュに拡張して，三次元問題として解析を行う仕様となっています．
| その場合，特別な理由がなければ，

- **DELTA_Z** ラベルを使ったZ軸方向長さ（引伸し量）
- **DELTA_THETA** ラベルを使った要素の角度（回転角）

| は，決まった量を **規定値** として，configファイルで定義しておけば，再設定する手間が省けます．

| 以下に示す例では，**GEOMETRY** ラベルが **1** の時（二次元並進対称)は，引伸し量が **1** [m]，**GEOMETRY** ラベルが **2** および **3** の時（二次元軸対称および軸対称三次元）は，回転角が **1** [deg]とするケースの，**既定値** の例です．

.. code-block:: YAML

  geometry:
    DELTA_Z: 1
    DELTA_THETA: 1


