結晶の次元数
pymatgenのサブモジュールを眺めていたらpymatgen.analysis.dimensionality
という結晶の次元数を調べるモジュールを見つけた。
pymatgen.org
関数の使い方よりもそもそも結晶の次元数とはどのように定義されるか、そしてどのようにそれを計算するかに興味があったので参照されている論文を読んだ。
実装のもとになっている論文
読んだ時のメモを残しておく。
[1] Computational identification of promising thermoelectric materials among known quasi-2D binary compounds https://pubs.rsc.org/en/content/articlelanding/2016/ta/c6ta04121c#!divAbstract
- quasi-2D material の中からZTが高い物質をhigh-throughput計算で探す
- quasi-2D materialの見つけるアルゴリズム: 様々な(hkl)面に安定なスラブを作ってみて表面を作ることができなければバルク、表面を1つ作れればquasi-2D、2つ以上作れればquasi-1D
- 原子間にボンドが存在するかは原子半径から判定する
[2] Data Mining for New Two- and One-Dimensional Weakly Bonded Solids and Lattice-Commensurate Heterostructures. https://www.ncbi.nlm.nih.gov/pubmed/28191965
- 原子間にボンドが存在するかはJMolが使うパラメターで判定する
- 結晶中の原子数最大のクラスターの原子数をmax1とする
- 2x2x2のsupercell中の原子数最大のクラスターの原子数をmax2とする
- log_2(max2/max1)が結晶の実質の次元
[3] Definition of a scoring parameter to identify low-dimensional materials components. https://arxiv.org/pdf/1808.02114.pdf
- 結晶の実質次元を求める既存手法ではunit cellのとり方がまずいときや、隣接しないセル間にボンドがあるときにうまく判定ができなかった。
- crystal netが与えられたとき、あるサイトと同クラスターに属する他のセルの同サイトの集合を考える。ユークリッド空間上でこの集合の張る部分空間のrankをサイトの次元と定義する。
- 上の意味の次元は幅優先探索で求めることができる。
- ボンドを結ぶ基準を連続的に変化させて、ロバストに次元を判定する。
結晶の次元数
[3]による結晶の次元数の定義が一番妥当だと思うし、pymatgen.analysis.dimensionality
の実装は主に[3]がもとになっている。
次元数を求めるアルゴリズムは[3]に擬似コードが載っているのでそれを参照。
擬似コードよりもpymatgen.analysis.dimensionality.get_dimensionality_larsen
の実装を読むほうが分かりやすいかもしれない。
ところで
dimensionとdimensionalityは意味が違うらしい。