iRICの計算結果の属性名を任意の文字列の名前にする・日本語にする方法

# はじめに

従来までもiRICでは格子・セルの属性についてはNays2DHのオブジェクトブラウザーのように日本語で表示できていました。
![2024-01-15_16h17_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/bc97498b-6751-5346-559e-261d24fbfbe8.png)

ただし、出力された計算結果については英語表記となっており、私のように英語が苦手な人は苦しんでいたかもしれません。
![2024-01-15_16h38_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/6c22ac56-9b36-f4fc-756a-c71196494336.png)

今回はiRIC v4のアップデートにより計算結果の属性名を自由に定義・日本語で表示できるようになったのでその方法を整理します。

# 作業の前に
今回の作業ではソルバーの情報を定義している`definition.xml`と、翻訳のための辞書ファイル`translation_ja_JP.ts`を使用します。
これらのフォルダは`IRICROOT\solvers`(IRICROOTはiRICをインストールしているフォルダ)の各ソルバーのフォルダの中に格納されています。

作業をする際には念のためバックアップをとっておくことをおすすめします。

# 計算結果のスカラーを任意の名前にする方法

## 設定方法・基礎知識
計算結果の属性名を任意のcaptionで設定するには`definition.xml`の`GridRelatedCondition`要素にとして子要素`output`を追加します。

```xml:例
<GridRelatedCondition>
    <Output name="depth" caption="Depth(m)">
			<Definition valueType="real" position="node" />
    </Output>
</GridRelatedCondition>
```

`output`要素は属性として`name`と`caption`を持ちます。

**name**
* 値は文字列
* ソルバーのコード内で計算結果を出力する際に指定された属性名を指定します。

**caption**
* 値は文字列
* iRIC上で表示したい文字列を指定します。

また、`output`は子要素として`Definition`を持ちます。
`Definition`は計算結果を定義するため`valueType`と`position`を属性として持ちます。

**valueType**
* 値は文字列
* 計算結果の型を定義します。整数`integer`、実数`real`があります。

**position**
* 値は文字列
* 計算結果の位置を定義します。格子点`node`、セル`cell`があります。

## 実際にやってるみる
では実際にNays2DHの計算結果の属性名に任意のcaptionを設定してみます。

### definition.xmlをひらく
インストール済みのソルバーの場合、`IRICROOT\solvers`(IRICROOTはiRICをインストールしているフォルダ)の当該フォルダの中に`definition.xml`が入っています。
今回はNays2DHですが、デフォルトの設定でインストールした場合、`C:\Users\ユーザー名\iRIC_v4\solvers\iRICsolvers_v4_Nays2DH`にあるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/2d80dbe7-f1fa-623a-3f89-e850c196cde7.png)

`definition.xml`をみつけたらお好きなテキストエディタで開いてください。
すると以下のような内容になっていると思います。
※`<CalculationCondition>`の子要素がとても多いので今回は省略して記載しています。

<details><summary>definition.xml</summary><div>

```xml:
<?xml version="1.0" encoding="UTF-8"?>
<SolverDefinition 
	xmlns="www.iric.net/SolverDefinition/1.0"
	name="Nays2DH" 
	caption="Nays2DH iRIC.4x 1.0 64bit" 
	version="1.6.008"
	copyright="Yasuyuki SHIMIZU and Hiroshi TAKEBAYASHI"
	release="2022.7.13"
	homepage="http://i-ric.org"
	executable="Nays2DH.exe"
	iterationtype="time"
	gridtype="structured2d"
>
	<CalculationCondition>   
	</CalculationCondition>
	<GridRelatedCondition>
			<!-- RMCD changed Bed Elevation to Elevation for consistency in MD_SWMS -->
		<Item name="Elevation" caption="Elevation (m)">
			<Definition position="node" valueType="real" default="max" />
		</Item>
		<Item name="Elevation_zb" caption="Elevation of fixed bed (m)">
			<Definition position="node" valueType="real" default="max" />
		</Item>
		<Item name="Obstacle" caption="Obstacle">
			<Definition position="cell" valueType="integer" default="0" option="true">
				<Enumerations>
					<Enumeration value="0" caption="Normal cell" />
					<Enumeration value="1" caption="Obstacle" />
				</Enumerations>
			</Definition>
		</Item>
		<Item name="Fix_movable" caption="Fixed or Movable Bed">
			<Definition position="cell" valueType="integer" default="0" option="true">
				<Enumerations>
					<Enumeration value="0" caption="Movable bed" />
					<Enumeration value="1" caption="Fixed bed" />
				</Enumerations>
			</Definition>
		</Item>
		<Item name="vege_density" caption="Density of Vegetation (m-1)">
			<Definition position="cell" valueType="real" default="0">
			</Definition>
		</Item>
		<Item name="vege_height" caption="Height of Vegetation (m)">
			<Definition position="cell" valueType="real" default="0">
			</Definition>
		</Item>
		<Item name="roughness_cell" caption="Manning&apos;s roughness coefficient">
			<Definition position="cell" valueType="real" default="0.03">
			</Definition>
		</Item>
		<Item name="mix_cell" caption="Grain size distribution">
			<Definition position="cell" valueType="integer" default="0" option="true">
				<Enumerations>
					<Enumeration value="0" caption="Region 1" />
					<Enumeration value="1" caption="Region 2" />
					<Enumeration value="2" caption="Region 3" />
					<Enumeration value="3" caption="Region 4" />
					<Enumeration value="4" caption="Region 5" />
					<Enumeration value="5" caption="Region 6" />
					<Enumeration value="6" caption="Region 7" />
					<Enumeration value="7" caption="Region 8" />
					<Enumeration value="8" caption="Region 9" />
					<Enumeration value="9" caption="Region 10" />
				</Enumerations>
			</Definition>
		</Item>
		<Item name="grainsize_distribution" caption="GrainSizeDistribution">
			<Definition position="node" valueType="functional" option="true">
				<Parameter valueType="integer" caption="Size Class" />
				<Value valueType="real" caption="Ratio" />
			</Definition>
		</Item>
	</GridRelatedCondition>
</SolverDefinition>
```

</div></details>

### 属性名を定義する。(definition.xmlへの定義の追記)
上記の`definition.xml`を開いたら`<GridRelatedCondition>`と`<GridRelatedCondition />`に挟まれている部分に子要素として計算結果を定義していきます。

試しにDepthを定義してみます。

#### `output`の属性について
##### name
* `name`はソルバーで計算結果を出力する際に指定された名前です。今回は`Depth(m)`を指定します。
    この`name`について水深等のスカラー量に関しては、属性名を既に`definition.xml`で定義されていない場合は**iRICの可視化ウィンドウのオブジェクトブラウザに表示されている名前で問題ないと思います**が、しっかり確認したい場合はソースコードでどのように指定されているか確認しましょう。
    流速等のベクトル量については[後述する注意](#注意点　流速等のベクトル量の定義について)をよく読んで下さい。
    
    ![2024-01-16_13h41_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/5aa020b7-c5eb-18d6-484d-ce57666e8a1b.png)


    Nays2DHのソースコードは以下で公開されています。

https://github.com/iRICsolvers/v4_Nays2DH

ソースコードを確認すると水深の出力部分は以下のようになっているので、実数値で格子点に`Depth(m)`という名前で出力していることが確認できます。
```fortran:Nays2DH.f90
CALL cg_iRIC_Write_Sol_Node_Real(fid,"Depth(m)",HData1,IER)
```
##### caption
* `caption`はiRIC上で表示したい任意の属性名を記入します。今回はわかりやすく`Depth_test(m)`と指定します。
    ※ここで`caption`に日本語を指定すると文字化けするのでやめましょう。

#### `Definition`の属性について
* `valueType`は計算結果の型です。今回の`Depth(m)`は実数値なので`real`とします。
* `position`は計算結果の位置です。今回は格子点の持つ値なので`node`を指定します。

#### 記載例

ここまでをまとめると`Depth(m)`を定義するための要素は以下のようになります。
```xml
<Output name="Depth(m)" caption="Depth_テスト(m)">
    <Definition valueType="real" position="node" />
</Output>
```

これを以下のように`definition.xml`の`GridRelatedCondition`の子要素として追加してあげます。

```xml:definition.xml
<?xml version="1.0" encoding="UTF-8"?>
<SolverDefinition 
	xmlns="www.iric.net/SolverDefinition/1.0"
	name="Nays2DH" 
	caption="Nays2DH iRIC.4x 1.0 64bit" 
	version="1.6.008"
	copyright="Yasuyuki SHIMIZU and Hiroshi TAKEBAYASHI"
	release="2022.7.13"
	homepage="http://i-ric.org"
	executable="Nays2DH.exe"
	iterationtype="time"
	gridtype="structured2d"
>
	<CalculationCondition>   
	</CalculationCondition>
	<GridRelatedCondition>
			<!-- RMCD changed Bed Elevation to Elevation for consistency in MD_SWMS -->
		<Item name="Elevation" caption="Elevation (m)">
			<Definition position="node" valueType="real" default="max" />
		</Item>
	～長いので省略～
		<Item name="grainsize_distribution" caption="GrainSizeDistribution">
			<Definition position="node" valueType="functional" option="true">
				<Parameter valueType="integer" caption="Size Class" />
				<Value valueType="real" caption="Ratio" />
			</Definition>
		</Item>
    ～↓ここから～        
        <Output name="Depth(m)" caption="Depth_test(m)">
			<Definition valueType="real" position="node" />
        </Output>
    ～↑ここまでを追加～
	</GridRelatedCondition>
</SolverDefinition>
```

この状態で保存してNays2DHのプロジェクトを開くと、指定したcaptionで表示されていることが確認できます。
![2024-01-16_13h48_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/ee3cee37-000a-99ef-e97f-8aa6d4c24c3d.png)

# 計算結果の属性名を日本語にする方法
## 設定方法・基本知識
日本語化は[計算結果のスカラーを任意の名前にする方法](#計算結果のスカラーを任意の名前にする方法)で定義した`caption`に対して辞書ファイル（`translation_ja_JP.ts`）で翻訳を指定してあげることで日本語化できます。
`definition.xml`で計算結果の属性名を定義せずに辞書ファイルに翻訳を記載しても日本語化はできません。

そのため、日本語化だけしたい場合でも[計算結果のスカラーを任意の名前にする方法](#計算結果のスカラーを任意の名前にする方法)を参考に`definition.xml`に計算結果のスカラーを定義してください。この場合は`caption`は`name`と同じで問題ありません。

辞書ファイルについては公式マニュアルをご覧ください。

https://iric-solver-dev-manual.readthedocs.io/ja/v4_jp/02/04_dictionary.html

## 実際にやってみる
属性名の定義と同様にNays2DHの`Depth(m)`を日本語化してみます。

`definition.xml`での属性名の定義は済ませておいてください。

### 辞書ファイルの更新or作成
Nays2DHの場合既に辞書ファイルがインストールされていると思いますが、`definition.xml`に新しく定義した属性名の要素が含まれていないので辞書ファイルを更新します。

1. iRICの起動
    iRICを開いてスタートページを閉じます。
    ![2024-01-16_14h13_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/494bc987-8ce9-3d7d-8799-1f3a31641669.png)

1. `定義ファイルの翻訳辞書 更新ウィザード`をひらいて`次へ`を押します。
    ツールバーの`オプション`-->`辞書ファイルの作成・更新`からひらけます。
    ![2024-01-16_14h15_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/386af3f8-47b1-a36e-198c-e61d205d13db.png)

1. 対象プログラムに`Nays2DH`、言語に`Japanese`を選択して`次へ`を押します。
    ![2024-01-16_14h19_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/f310b21d-312f-bac7-78ea-62f9253fa719.png)

1. 結果を確認して`完了`を押します。
    出力先は覚えておきましょう。
    ![2024-01-16_14h21_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/d783212d-b97d-253d-d55e-50b92a059d95.png)

## 辞書ファイルに翻訳を追記する。
先ほど更新or作成した辞書ファイルに翻訳を追記していきます。
`定義ファイルの翻訳辞書 更新ウィザード`のダイアログや公式マニュアルではQt Linguistを使用して編集すると書いていますが、辞書ファイルもただのxmlファイルなのでテキストエディタで編集できます。

辞書ファイルを開くと`definition.xml`で定義した属性名(`Depth_test(m)`)が追加されていることを確認できます。
翻訳は元文の`source`に対して`translation`に翻訳後の文章を追記するだけです。

```xml:translation_ja_JP.ts
<?xml version="1.0" encoding="UTF-8"?>
<TS version="2.0" language="ja_JP">
    <!--これは iRIC で使用する辞書ファイルです。
<translation> と </translation> の間に、翻訳後の文字列を追記してください。
-->
    <context>
        <message>
            <source>Nays2DH iRIC.4x 1.0 64bit</source>
            <translation></translation>
        </message>
    ～～～長いので省略～～～
        <message>
            <source>GrainSizeDistribution</source>
            <translation>河床材料粒度分布</translation>
        </message>
        <message>
            <source>Size Class</source>
            <translation></translation>
        </message>
        <message>
            <source>Ratio</source>
            <translation></translation>
        </message>
    ～↓ここから～
        <message>
            <source>Depth_test(m)</source>
            <translation>水深_テスト(m)</translation>    ←ここに翻訳後の文章を追記
        </message>
    ～↑ここまでが追加されている～
    </context>
</TS>

```

追記してiRICでNays2DHのプロジェクトを開くと、以下のように日本語に翻訳されれた属性名が表示されています。
![2024-01-16_14h34_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/e8e5c4a2-a33d-a25b-01dd-2f13d368a53e.png)

# 注意点　流速等のベクトル量の定義について

`definition.xml`に計算結果のスカラーを定義する際の`name`は基本的にデフォルトで表示されているオブジェクトブラウザー上の名前でいいと前述していますが、流速等のベクトル量については注意が必要です。

Nays2DHの場合オブジェクトブラウザー上で流速は`Velocity(ms-1)(magnitude)`と書かれています。
![2024-01-16_15h20_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/d664829b-47f1-d6f5-316b-d32c2f1cda66.png)

しかし、ソースコードを見てみると以下のように`Velocity(ms-1)X`と`Velocity(ms-1)Y`とX方向の流速とY方向の流速に分けて出力しています。

```fortran:Nays2DH.f90
CALL cg_iRIC_Write_Sol_Node_Real(fid,"Velocity(ms-1)X",UData1,IER)
CALL cg_iRIC_Write_Sol_Node_Real(fid,"Velocity(ms-1)Y",VData1,IER)
```
参考

https://iric-solver-dev-manual.readthedocs.io/ja/v4_jp/06/02/12_output_result.html#iriclib-output-result


`name`にはソルバーで出力する際の名前を指定しなければいけないので、`definition.xml`でもこの名前で定義する必要があります。
**（X軸方向の定義のみでcaptionの指定と翻訳はできます。）**

```xml:definition.xml追記の例
<Output name="velocity(ms-1)X" caption="Velocity(ms-1)_hogehogeX">
    <Definition valueType="real" position="node" />
</Output>
<Output name="velocity(ms-1)Y" caption="Velocity(ms-1)_hogehogeY">
    <Definition valueType="real" position="node" />
</Output>
```

```xml:translation_ja_JP.ts追記の例
<message>
    <source>Velocity(ms-1)_hogehogeX</source>
    <translation>流速テストX</translation>
</message>
<message>
    <source>Velocity(ms-1)_hogehogeY</source>
    <translation>流速テストY</translation>
</message>
```

また、この時の`caption`についても最後に`X`と`Y`をつける必要があります。
Nays2DHは二次元のソルバーなので`X`,`Y`ですが、三次元のソルバーの場合は`X`,`Y`,`X`それぞれの方向があります。

:::note
逆にベクトル量以外の属性のcaptionの末尾には大文字の`X`,`Y`,`Z`は使用しないでください。小文字の`x`,`y`,`z`は使用できます。
:::