tklib機能解析プログラム: template_tklib.py

プログラムの動作

template_tklib.py は、tklib および pymatgen ライブラリを利用して結晶構造の多角的な解析を行うPythonプログラムです。CIF(Crystallographic Information File)形式の結晶構造データを受け取り、以下の主要な機能を提供します。

  • CIFファイルの読み込みと基本情報の表示: tklib.tkCIF を使用してCIFファイルを解析し、構造の概要情報を出力します。

  • 結晶構造情報の詳細解析と密度計算: tklib.tkCrystal オブジェクトを用いて格子定数、サイト情報、および質量密度・原子密度を計算し、その妥当性を検証します。

  • 原子情報取得のテスト: tklib.tkAtomType を使用して、特定の元素の原子量や半径などの物理化学的情報を取得する機能のデモンストレーションを行います。

  • Pymatgen連携による単位格子変換と密度検証: tkCrystal オブジェクトを pymatgen.core.Structure に変換し、pymatgen の機能を利用して原始格子(Primitive Cell)への変換を行い、変換前後で密度の一貫性を検証します。

  • BVS(結合価数和)計算: tkProg_Root 環境変数で指定されたデータベースを用いて、結晶内の各原子サイトの結合価数和を計算し、出力します。これにより、原子の酸化状態や結合の妥当性を評価できます。

  • RDF(動径分布関数)/RCN(累積配位数)計算とデータ出力: 結晶構造内の原子間距離の統計情報を収集し、特定の原子種を中心とした動径分布関数 (RDF) および累積配位数 (RCN) を計算します。さらに、指定された配位数閾値に基づくCN (Coordination Number) ベースのRDF/RCNも計算します。

  • Ewald法によるマデルングポテンシャル計算: 単位格子内の指定された原子サイトにおけるマデルングポテンシャルをEwald法を用いて計算します。これはイオン結晶における格子エネルギー評価の基礎となります。

  • 構造因子 (\(F_{hkl}\)) と原子散乱因子の計算: 特定のX線波長とミラー指数 (\(hkl\)) に対する原子散乱因子と結晶構造因子を計算し、X線回折シミュレーションの基礎データを提供します。

  • Pymatgenで対称化されたCIFファイルの出力: pymatgen を用いて結晶構造を対称化し、その結果を新しいCIFファイルとして保存します。これにより、元のCIFファイルで十分に記述されていなかった対称性を明示できます。

このプログラムは、結晶構造の解析と理解を深めるための包括的なツールとして機能し、材料科学、固体物理学、結晶学などの分野の研究者に有用です。

原理

本プログラムで利用されている主な物理式、数式、およびアルゴリズムは以下の通りです。

結合価数和 (BVS)

結合価数和は、経験的なモデルに基づいて、各原子の結合価数を原子間距離から推定し、それらの和を取ることで原子の形式電荷(酸化状態)を評価する手法です。 結合価数 \(s_{ij}\) は以下の式で計算されます。

\[s_{ij} = \exp\left(\frac{r_0 - d_{ij}}{B}\right)\]

ここで、\(d_{ij}\) は結合している原子 \(i\)\(j\) の間の距離、\(r_0\) は基準結合距離(結合価数1に相当する距離)、\(B\) は経験的な定数です。\(r_0\)\(B\) の値は、データベースから取得されます。 各原子サイトのBVSは、そのサイトに結合している全ての原子との結合価数の和として計算されます。

\[V_i = \sum_j s_{ij}\]

動径分布関数 (RDF) / 累積配位数 (RCN)

動径分布関数 \(g(r)\) は、ある原子を中心としたときに、距離 \(r\) の位置に他の原子が存在する確率を示す関数です。離散的なヒストグラムとして、ある中心原子から特定の距離範囲内に存在する原子の数をカウントし、その数を距離のビン幅で割ることで、単位距離あたりの原子数密度を求めます。 本プログラムでは、これを原子種タイプ別に計算します。

累積配位数 (RCN) は、動径分布関数を距離 \(r\) について積分したものです。これは、ある中心原子から距離 \(r\) 以内に存在する原子の総数を表します。

\[RCN(r) = \int_0^r \rho(r') dr'\]

ここで \(\rho(r')\) は距離 \(r'\) における原子数密度(RDFを正規化したもの)です。

Ewald法によるマデルングポテンシャル

Ewald法は、周期的な結晶構造における長距離クーロン相互作用の和を効率的に計算するための手法です。無限に広がるクーロン相互作用の和は単純に収束しないため、それを実空間での短距離相互作用と逆空間での長距離相互作用の和に分離し、それぞれが速やかに収束するように変換します。 単位格子中のサイト \(i\) におけるマデルングポテンシャル \(V_i\) は、以下の3つの項の和で表されます。

\[V_i = V_{\text{real}} + V_{\text{reciprocal}} + V_{\text{self}}\]

これらの項は、それぞれ以下のように定義されます。

  • 実空間項 (\(V_{\text{real}}\)): $\(V_{\text{real}} = \sum_{j, \mathbf{n} \ne (i, \mathbf{0})} \frac{q_j \cdot \mathrm{erfc}(\alpha r_{ij})}{r_{ij}}\)\( ここで \)q_j\( はサイト \)j\( の電荷、\)r_{ij}\( はサイト \)i\( とサイト \)j\( の周期像との距離、\)\alpha\( はEwaldパラメータ(実空間と逆空間の分離の度合いを調整するパラメータ)、\)\mathrm{erfc}(x)$ は相補誤差関数です。この項は短距離の相互作用を表現します。

  • 逆空間項 (\(V_{\text{reciprocal}}\)): $\(V_{\text{reciprocal}} = \frac{1}{\pi V} \sum_{\mathbf{G} \ne \mathbf{0}} \frac{e^{-\pi^2 |\mathbf{G}|^2 / \alpha^2}}{|\mathbf{G}|^2} \sum_j q_j \cos(\mathbf{G} \cdot (\mathbf{r}_i - \mathbf{r}_j))\)\( ここで \)V\( は単位格子の体積、\)\mathbf{G}\( は逆格子ベクトル、\)\mathbf{r}_i\( と \)\mathbf{r}_j\( はそれぞれサイト \)i\( と \)j$ の位置ベクトルです。この項は長距離の周期的な相互作用をフーリエ級数として表現します。

  • 自己項 (\(V_{\text{self}}\)): $\(V_{\text{self}} = -q_i \frac{2\alpha}{\sqrt{\pi}}\)\( この項は、実空間項に含まれる無限大の自己相互作用(\)r_{ii} \to 0$ の項)を打ち消すための補正項です。

最終的なマデルングポテンシャルは、これらの和にクーロン定数 \(K_e = e / (4 \pi \epsilon_0)\) を乗じた値となります。

構造因子 (\(F_{hkl}\))

X線回折において、結晶格子からの回折X線の振幅と位相を記述するのが構造因子 \(F_{hkl}\) です。これはミラー指数 (\(hkl\)) で指定される格子面による回折の強さに寄与します。

\[F_{hkl} = \sum_j f_j e^{2\pi i (h x_j + k y_j + l z_j)}\]

ここで、\(f_j\) は単位格子内の \(j\) 番目の原子の原子散乱因子、\(x_j, y_j, z_j\) はその原子の単位格子内での分率座標です。原子散乱因子 \(f_j\) は原子の種類と散乱ベクトル \(s = \sin\theta/\lambda\) に依存します。 原子散乱因子は一般に複素数であり、\(f_j = f_0(s) + f_j' + i f_j''\) と表されます。ここで \(f_0(s)\) は通常の散乱因子、\(f_j'\)\(f_j''\) は異常散乱因子です。

必要な非標準ライブラリとインストール方法

このプログラムを実行するには、以下の非標準Pythonライブラリが必要です。

  1. numpy: 数値計算のための基盤ライブラリ。

  2. scipy: 科学技術計算ライブラリ。特に scipy.special.erfc がEwald法で利用されます。

  3. tklib: 結晶構造解析のためのカスタムライブラリ。

  4. pymatgen: 材料科学のための強力なPythonライブラリ。

これらのライブラリは pip を使ってインストールできます(tklib 以外)。

pip install numpy scipy pymatgen

tklib はカスタムライブラリであり、通常 pip ではインストールできません。プログラムの冒頭に記載されているように、tklib のPythonモジュールがあるディレクトリを sys.path に追加する必要があります。

tklib の設定例: 例えば、tklibd:/git/tkProg/tklib/python にインストールされている場合、プログラム内で次のようにパスを追加する必要があります(または、環境変数 PYTHONPATH を設定します)。

import sys
sys.path.append("d:/git/tkProg/tklib/python")
# あるいは、tklibのトップディレクトリ(tkfileなどが格納されているディレクトリ)を直接追加
# 例:sys.path.append("path/to/tklib/python_modules")

また、BVS計算機能を利用する場合、環境変数 tkProg_Root が設定されており、そのパス内にBVSデータベースファイル (tkProg_Root/tkdb/Databases/bvparm2020.cif) が存在する必要があります。

必要な入力ファイル

プログラムは以下の入力ファイルを必要とします。

  1. CIFファイル:

    • ファイル形式: Crystallographic Information File (CIF)

    • データ構造: 結晶の格子定数、空間群情報、原子サイトの座標(分率座標または直交座標)、原子種、占有率、(オプションで)電荷情報などが記述されている標準的なCIF形式。

    • 期待されるファイル: コマンドライン引数として指定される結晶構造情報ファイル。例: ZnO.cif

  2. BVSパラメータファイル:

    • ファイル形式: CIF形式に類似したテキストファイル。

    • データ構造: 各原子ペア間の結合価数計算に必要なパラメータ (\(r_0\), \(B\)) が記述されています。プログラムは _valence_param_details ブロックを読み込みます。

    • 期待されるファイル: bvparm2020.cif

    • パス: 環境変数 tkProg_Root で指定されたルートディレクトリ内の tkdb/Databases/ サブディレクトリに存在する必要があります。例: $tkProg_Root/tkdb/Databases/bvparm2020.cif

生成される出力ファイル

プログラムの実行により、以下のファイルが生成される可能性があります。

  1. 対称化されたCIFファイル:

    • ファイル名: [元のCIFファイル名]_symmetrized.cif

      • 例: 入力ファイルが example.cif の場合、example_symmetrized.cif

    • 内容: Pymatgenライブラリによって対称化(非等価サイトの数などを最小化)された結晶構造情報がCIF形式で記述されます。格子定数、空間群、対称操作、非等価原子サイトの座標と占有率などが含まれます。元のCIFファイルと比較して、より標準的で簡潔な対称性記述を持つことがあります。

コマンドラインでの使用例 (Usage)

プログラムの基本的な実行コマンドと引数は以下の通りです。

python template_tklib.py [cif_file]
  • cif_file: 解析対象となるCIFファイルのパスを指定します。この引数はオプションであり、指定されない場合はデフォルトで ZnO.cif が使用されます。

引数の説明

  • cif_file (位置引数, オプション):

    • 型: 文字列

    • デフォルト値: "ZnO.cif"

    • 説明: 解析を行う結晶構造情報ファイル(CIF形式)のパスを指定します。

コマンドラインでの具体的な使用例

プログラムをデフォルトの ZnO.cif ファイルに対して実行する場合、以下のコマンドを使用します。

python template_tklib.py

または、特定のCIFファイル(例: my_crystal.cif)を指定して実行する場合、以下のコマンドを使用します。

python template_tklib.py my_crystal.cif

実行結果の説明

上記のコマンドを実行すると、ターミナル(またはコマンドプロンプト)に、以下のような出力が順次表示されます。

  1. tklib のパス設定エラー: tklibsys.path に正しく設定されていない場合、エラーメッセージが表示されプログラムが終了します。

  2. pymatgen のインストールエラー: pymatgen がインストールされていない場合、エラーメッセージが表示されプログラムが終了します。

  3. CIFファイル読み込み:

    • 指定されたCIFファイルのパス。

    • tkCIFData.Print() メソッドによるCIFデータの概要。

    • tkCrystal オブジェクトの取得状況。

  4. tkCrystal 構造情報と密度:

    • tkCrystal.PrintInf() による詳細な構造情報(格子、サイト、対称操作など)。

    • 計算された質量密度 (g/cm³) と原子密度 (atoms/cm³)。

    • 計算された密度の妥当性検証結果。

  5. Pymatgen連携による単位格子変換と密度検証:

    • tkCrystal から pymatgen.core.Structure への変換成功メッセージ。

    • 元のPymatgen構造と原始格子に変換されたPymatgen構造の密度 (原子密度および質量密度)。

    • 変換前後での密度の一貫性チェック結果。

  6. BVS(結合価数和)計算:

    • 環境変数 tkProg_Root の設定状況(設定されていない場合は警告)。

    • BVSパラメータファイルの読み込み状況。

    • 各非対称サイトについて、近傍原子との距離、BVSパラメータ (\(r_0\), \(B\))、計算された結合価数 (\(s_{ij}\))、および最終的な結合価数和 (BVS)。

  7. RDF/RCN 計算とデータ出力:

    • 各非対称サイトを中心とした個別のRDF計算の進捗。

    • 原子種タイプごとの平均RDF (RDFs) と累積配位数 (RCNs) の計算結果の概要。

    • CN (配位数) ベースのRDF (CNRDFs) と累積配位数 (CNRCNs) の計算結果の概要。

    • 例として、Znサイトの最初の非ゼロRCNやCN 4以上の最大累積数などが表示されます。

  8. Ewald法によるマデルングポテンシャル計算:

    • ターゲットサイトの原子名と電荷。

    • Ewaldパラメータ、カットオフ距離などの設定情報。

    • 実空間項 (UC1)、逆空間項 (UC2)、自己項 (UC3) の各計算結果。

    • 最終的なマデルングポテンシャル(ジュールと電子ボルト単位)とマデルング定数。

  9. 構造因子(Fhkl)と原子散乱因子の計算:

    • 指定されたX線源(例: CuKa1)と波長、ターゲットのミラー指数 (\(hkl\))。

    • 計算された面間隔 \(d_{hkl}\)、散乱ベクトル \(s\)、回折角 \(2\theta\)

    • 各原子種タイプに対する原子散乱因子 (\(f(s)\), \(f'\), \(f''\)) と複合散乱因子。

    • 指定された \(hkl\) に対する結晶構造因子 (\(F_{hkl}\)) の複素数値と絶対値。

  10. Pymatgen対称化後の結果を tkFile でCIF出力:

    • Pymatgenによる対称化の成功メッセージと、検出された空間群情報。

    • 生成される対称化されたCIFファイルのパス(例: ZnO_symmetrized.cif)。

    • ファイル書き込みの成功メッセージ。

  11. tkAtomType による原子情報テスト:

    • テスト対象の元素(例: Au)の原子量、共有結合半径、イオン半径などの情報。

プログラムの実行が完了すると、「--- 全ての機能の実行を完了しました。 ---」というメッセージが表示され、指定されたCIFファイルと同じディレクトリに [元のファイル名]_symmetrized.cif というファイルが生成されます。