sim-trhepd-rheed ソルバー

sim-trhepd-rheedsim-trhepd-rheed を用いて原子位置 \(x\) から回折 rocking curve を計算し、 実験で得られた rocking curve からの誤差を \(f(x)\) として返す Solver です。

前準備

あらかじめ sim-trhepd-rheed をインストールしておく必要があります。

  1. sim-trhepd-rheed の公式サイトからソースコードをダウンロード

  2. sim-trhepd-rheed/src に移動し、 makebulk.exesurf.exe を作成

py2dmat を実行する前にあらかじめ bulk.exe を実行してバルクデータを作成しておきます。 surf.exepy2dmat から呼び出されます。

入力パラメータ

solver セクションとセクション中のサブセクション config, post, param, reference を利用します。

[solver] セクション

  • generate_rocking_curve

    形式: 真偽値 (default: false)

    説明: RockingCurve_calculated.txt の生成をするかどうか。 RockingCurve_calculated.txt は作業ディレクトリ Log%%%_### の中に保存されます。このオプションが"true"であっても、 remove_work_dir ([post] セクション)が"true"であれば Log%%%_### は削除されてしまうため、注意してください。

[config] セクション(サブセクション)

  • surface_exec_file

    形式: string型 (default: "surf.exe")

    説明: sim-trhepd-rheed の表面反射ソルバー surf.exe へのパス

  • surface_input_file

    形式: string型 (default: "surf.txt")

    説明: 表面構造のインプットファイル。

  • bulk_output_file

    形式: string型 (default: "bulkP.b")

    説明: バルク構造のアウトプットファイル。

  • surface_output_file

    形式: string型 (default: "surf-bulkP.s")

    説明: 表面構造のアウトプットファイル。

  • calculated_first_line

    形式: 整数型 (default: 5)

    説明: surface_output_file ファイル中, D(x) として読み込む最初の行。 なお、最終行は実験データとして読み込んだ行数から自動計算されます。

  • calculated_info_line

    形式: 整数型 (default: 2)

    説明: surface_output_file ファイル中, glancing angle数やbeam数が記してある行番号。

  • cal_number

    形式: 整数型のリスト (設定必須)

    説明: surface_output_file ファイル中, データとして読み出す列番号。複数指定が可能。設定した値は、後述の exp_number ([reference] セクション)の値とリストの長さを一致させる必要があります。

[post] セクション(サブセクション)

実験と計算の「ズレ」の大きさを示し、最小化すべき関数である「目的関数」の定義や、ロッキングカーブを描くためのコンボリューション半値幅などを指定するセクションです。

  • Rfactor_type

    形式: string型。"A"、"A2"または"B"のいずれかをとります。 (default: "A")

    説明: 目的関数値の計算方法の指定。 視写角のインデックスを \(i = 1,2,\dots,m\), ビームのインデックスを \(j = 1,2,\dots,n\) として、 実験・計算のデータをそれぞれ \(u^{(j)}_i\)\(v^{(j)}_i\) で表し、 各ビームの重みを \(w^{(j)}\) と書くとき

    • "A"タイプ:

      \[R = \sqrt{ \sum_{j}^{n} w^{(j)} \sum_{i}^{m} \left(u^{(j)}_{i}-v^{(j)}_{i}\right)^{2} }\]
    • "A2"タイプ:

      \[R^{2} = \sum_{j}^{n} w^{(j)} \sum_{i}^{m} \left(u^{(j)}_{i}-v^{(j)}_{i}\right)^{2}\]
    • "B"タイプ:

      \[R = \frac{\sum_{i}^{m} \left(u^{(1)}_{i}-v^{(1)}_{i}\right)^{2}}{\sum_{i}^{m} \left(u^{(1)}_{i}\right)^{2} + \sum_{i}^{m} (v^{(1)}_{i})^2}\]
      • "B"タイプはデータ列が1つの実験・計算データを用いた実行( \(n=1\) )のみ対応しています。

  • normalization

    形式: string型。"TOTAL"または"MANY_BEAM"のいずれかをとります。 (設定必須)

    説明: 実験・計算のデータベクトルの規格化の方法。

    • "TOTAL"

      • 全体の和で規格化をします。

      • 計算に使用するデータ列が1つのみ適用できる規格化方法であり、 cal_number ([config] セクション)および exp_number ([reference] セクション)で設定したリストの長さが1である必要が有ります。

    • "MANY_BEAM"

      • "MANY_BEAM"はデータ列が2つ以上であるときに利用できる規格化方法です。後述の weight_type によって規格化方法が変わります。

    なお、 normalization="MAX" は廃止となりました。

  • weight_type

    形式: string型または None 。"calc"または"manual"のいずれかを設定する必要があります。 (default: Nonenormalization = "MANY_BEAM" としたとき設定必須)

    説明: 目的関数値を計算するときの、ビームごとの重み \(w^{(j)}\) の計算方法を指定します。 "calc"とした場合、データ列ごとの重み \(w^{(n)}\) は次の式で与えられます。

    \[w^{(j)} = \left(\frac{\sum_{i=1}^m v^{(j)}_{i}}{\sum_{k=1}^n \sum_{i=1}^m v^{(j)}_i} \right)^2\]

    "manual"とした場合、オプション spot_weight を用いることで、ユーザーが重みを指定可能です。

  • spot_weight

    形式: float型のリスト。 (default: [] 、 weight_type = "manual" としたとき設定必須)

    説明: 目的関数値を計算するときの、データ列ごとの重みを設定します。総和が1になるように自動的に規格化されます。

    例えば、[3,2,1]を指定すると、 \(w^{(1)}=1/2, w^{(2)}=1/3, w^{(3)}=1/6\) となります。

  • omega

    形式: 実数型 (default: 0.5)

    説明: コンボリューションの半値幅の指定。

  • remove_work_dir

    形式: 真偽値 (default: false)

    説明: R-factor を読み取った後に作業ディレクトリ Log%%%_### を削除するかどうか。なお、 generate_rocking_curve ([solver] セクション) が"true"であっても、本オプションが"true"ならば Log%%%_### を削除します。

[param] セクション(サブセクション)

  • string_list

    形式: string型のリスト。長さはdimensionの値と一致させます。 (default: ["value_01", "value_02"])

    説明: ソルバーの入力ファイルを作成するための参照用テンプレートファイルで利用するプレースホルダーのリスト。これらの文字列が探索中のパラメータの値に置換されます。

[reference] セクション(サブセクション)

  • path

    形式: string型 (default: experiment.txt)

    説明: 実験データファイルへのパス。

  • reference_first_line

    形式: 整数型

    説明: 実験データファイル中、実験データを読み出す最初の行の番号。省略時は1, すなわち先頭行から読み出します。

  • reference_last_line

    形式: 整数型 (default: 実験データファイルの最後の行の行数)

    説明: 実験データファイル中、実験データを読み出す最後の行の番号。省略時は最終行まで読み出します。

  • exp_number

    形式: 整数型のリスト

    説明: 実験データファイル中、実験データとして読み出す列番号。複数指定が可能。設定した値は、前述の cal_number ([config] セクション)の値とリストの長さを一致させる必要があります。

ソルバー用補助ファイル

入力テンプレートファイル

入力テンプレートファイル template.txtsurf.exe の入力ファイルを作成するためのテンプレートです。 動かすパラメータ(求めたい原子座標などの値)を「 value_* 」などの適当な文字列に置き換えます。 使用する文字列は入力ファイルの [solver] - [param] セクションにある、 string_list で指定します。 以下、テンプレートの例を記載します。

2                                    ,NELMS,  -------- Ge(001)-c4x2
32,1.2,0.15                          ,Ge Z,da1,sap
0.6,0.6,0.6                          ,BH(I),BK(I),BZ(I)
32,1.2,0.15                          ,Ge Z,da1,sap
0.4,0.4,0.4                          ,BH(I),BK(I),BZ(I)
9,4,0,0,2,1.7,-0.5,0.5               ,NSGS,msa,msb,nsa,nsb,dthick,DXS,DYS
8                                    ,NATM
1, 1.0,  value_01,  1.00000,  5.231000   ,IELM(I),ocr(I),X(I),Y(I),Z(I
1, 1.0,  value_02,  1.00000,  4.371000
2, 1.0,  1.50000,  1.50000,  3.596000
2, 1.0,  2.00000,  1.49751,  2.100000
2, 1.0,  1.00000,  1.50000,  2.000000
2, 1.0,  0.00000,  1.00000,  0.849425
2, 1.0,  2.00000,  1.00000,  0.809425
2, 1.0,  1.00997,  1.00000,  0.599425
1,1                                  ,(WDOM,I=1,NDOM)

この場合、 value_01, value_02 が動かすパラメータとなります。

ターゲット参照ファイル

ターゲットにするデータが格納されたファイル experiment.txt を指定します。 第一列に角度、第二列以降に反射強度にコンボリューションを計算した値が入ってます。 以下、ファイルの例を示します。

3.00000e-01 8.17149e-03 1.03057e-05 8.88164e-15 ...
4.00000e-01 1.13871e-02 4.01611e-05 2.23952e-13 ...
5.00000e-01 1.44044e-02 1.29668e-04 4.53633e-12 ...
6.00000e-01 1.68659e-02 3.49471e-04 7.38656e-11 ...
7.00000e-01 1.85375e-02 7.93037e-04 9.67719e-10 ...
8.00000e-01 1.93113e-02 1.52987e-03 1.02117e-08 ...
9.00000e-01 1.92590e-02 2.53448e-03 8.69136e-08 ...
1.00000e+00 1.86780e-02 3.64176e-03 5.97661e-07 ...
1.10000e+00 1.80255e-02 4.57932e-03 3.32760e-06 ...
1.20000e+00 1.77339e-02 5.07634e-03 1.50410e-05 ...
1.30000e+00 1.80264e-02 4.99008e-03 5.53791e-05 ...
...

出力ファイル

sim-trhepd-rheed では、 surf.exe で出力されるファイルが、 ランクの番号が記載されたフォルダ下にある Log%%%%%_##### フォルダに一式出力されます。 %%%%% はアルゴリズムの反復回数 step (例:モンテカルロステップ数)で、 ##### はアルゴリズムにおけるグループの番号 set (例:モンテカルロにおけるレプリカ番号)です。 大規模計算ではこれらのフォルダの数が多くなり、時には計算機のストレージの制限に引っかかることがあります。 そのような場合には、 solver.post.remove_work_dir パラメータを true にして、計算が終了した作業フォルダを削除してください。 以下では、 py2dmat で独自に出力するファイルについて説明します。

stdout

surf.exe が出力する標準出力が記載されています。

以下、出力例です。

bulk-filename (end=e) ? :
bulkP.b
structure-filename (end=e) ? :
surf.txt
output-filename :
surf-bulkP.s

RockingCurve_calculated.txt

generate_rocking_curve ([solver] セクション) が"true"の場合のみ Log%%%%%_##### フォルダに出力されます。

ファイル冒頭、 # で始まる行はヘッダーです。 ヘッダーには探索変数の値、目的関数値 f(x) オプションで指定した Rfactor_type, normalization`,  ``weight_type, cal_number, オプションで指定またはプログラムが計算したデータ列ごとの重み spot_weight, データ部分のどの列に何が記されているか(例: # #0 glanceing_angle など)が記されています。

# が付いていない部分はデータ表記部分になります。1列目は視写角、2列目以降はデータ列ごとに強度が記しています。どのデータ列が記されているかはヘッダーの表記で確認できます。例えば

# #0 glancing_angle
# #1 cal_number=1
# #2 cal_number=2
# #3 cal_number=4

との記載があれば、1列目は視写角、2列目は計算データファイルの1列目に相当する反射強度、3列目は計算データファイルの2列目に相当する反射強度、4列目は計算データファイルの4列目に相当する反射強度が記されていることがわかります。

また、各列の反射強度は各列の総和が1になるように規格化されています。目的関数値(R-factor及びR-factorの二乗)を算出する際は、データ列ごとの重み spot_weight を加味して計算されています。

以下、出力例です。

#value_01 =  0.00000 value_02 =  0.00000
#Rfactor_type = A
#normalization = MANY_BEAM
#weight_type = manual
#fx(x) = 0.03686180462340505
#cal_number = [1, 2, 4, 6, 8]
#spot_weight = [0.933 0.026 0.036 0.003 0.002]
#NOTICE : Intensities are NOT multiplied by spot_weight.
#The intensity I_(spot) for each spot is normalized as in the following equation.
#sum( I_(spot) ) = 1
#
# #0 glancing_angle
# #1 cal_number=1
# #2 cal_number=2
# #3 cal_number=4
# #4 cal_number=6
# #5 cal_number=8
0.30000 1.278160358686800e-02 1.378767858296659e-04 8.396046839668212e-14 1.342648818357391e-30 6.697979700048016e-53
0.40000 1.778953628930054e-02 5.281839702773564e-04 2.108814173486245e-12 2.467220122612354e-28 7.252675318478533e-50
0.50000 2.247181148723425e-02 1.671115124520428e-03 4.250758278908295e-11 3.632860054842994e-26 6.291667506376419e-47
...