クロスアビリティ Winmostarサポートチームです。
0. はじめに
結晶系の第一原理計算を実施する場合、事前に対象となる結晶の対称性を把握する必要がある。また、計算セルをPrimitiveセルへと変換しなければならない。しかしながら、比較的に大きなユニットセルを有する結晶においては、空間群を特定してPrimitiveセルを抽出することは容易ではない。少なくとも、手作業ではまず不可能である。本記事では、任意の結晶について、その対称性および空間群に関する処理を遂行するライブラリー"spglib"を紹介する。
1. spglib
spglibはBSDライセンスにて、以下のURLからダウンロードできる。
当該ライブラリーのコンパイルおよびインストール方法については、このURLを参照のこと。この記事では、spglibライブラリーの使い方について解説する。C言語、Fortran、Python、Rubyのインターフェースが用意されているが、ここではC言語を対象とする。
2. 空間群の特定
結晶の対称性を解析して、その空間群を特定するには、spglibのspg_get_datasetを使用する。サンプルコードは、以下の通り。spg_get_dtasetにてSpglibDatasetを取得を取得した後、これをSpglibSpacegroupTypeに変換。そこから、空間群のテーブル番号および対称性記号を取得している。入力データのlatticeは格子ベクトル、positionは計算セル内の原子座標、typeは原子種類を識別する番号、natomは原子の総数、symprecは対称性判定の閾値である。
void find_spacegroup(double lattice[3][3], double position[][3], int[] type, int natom, double symprec)
{
SpglibDataset* dataset;
dataset = spg_get_dataset(lattice, position, type, natom, symprec);
SpglibSpacegroupType spgtype;
spgtype = spg_get_spacegroup_type(dataset->hall_number);
printf("Table Number => %d\n", spgtype.number);
printf("International => %s\n", spgtype.international);
printf("Hall symbol => %s\n", spgtype.hall_symbol);
printf("Schoenflies => %s\n", spgtype.schoenflies);
spg_free_dataset(dataset);
}
3. Primitiveセルへの変換
計算セルをPrimitiveセルに変換する場合には、spg_standardize_cellを使用する。サンプルコードは、以下の通り。spg_standardize_cellの戻り値は、Primitiveセル内の原子数である。入力データは任意の計算セルに対する値である。Conventionalセルやスーパーセルを入力データとすることができる。lattice、position、typeはPrimitiveセルの値に上書きされる。
void convert_to_primitive(double lattice[3][3], double position[][3], int[] type, int natom, double symprec)
{
int nprim;
nprim = spg_standardize_cell(lattice, position, type, natom, 1, 0, symprec);
}
逆に、PrimitiveセルをConventionalセルに変換する場合には、以下のコードである。このとき、原子数が増大する可能性があるため、positionおよびtypeの配列次元はnprimの4倍とする必要がある。
void convert_to_conventional(double lattice[3][3], double position[][3], int[] type, int nprim, double symprec)
{
int natom;
natom = spg_standardize_cell(lattice, position, type, nprim, 0, 0, symprec);
}