Structure

構造の読み込み

POSCAR, CONTCAR, xxx.vasp, xxx.cif, xxx.xyz, xsf, Gaussianのファイルなどpymatgenが対応しているファイルを読める.

ファイルから読み込み

pymatgen.core module

Structure.from_file(filename, primitive=False, sort=False, merge_tol=0.0)

primitive=Trueにすることでprimitive cellに変形できる.デフォルトはFalse

from pymatgen.core import Structure
filename = 'POSCAR'
#filename = 'si.cif'
#filename = 'hoge.vasp'
struc = Structure.from_file(filename)
#struc = Structure.from_file(filename, primitive=True)    # primitive cellに変形
struc    # jupyterで表示用
[出力]
Structure Summary
Lattice
    abc : 3.865301435804595 3.865301435804595 3.8653014358045947
 angles : 59.99999999999999 59.99999999999999 59.99999999999999
 volume : 40.835239431094536
      A : 0.0 2.733180856587528 2.733180856587528
      B : 2.733180856587528 -0.0 2.733180856587528
      C : 2.733180856587528 2.7331808565875275 0.0
PeriodicSite: Si (0.0000, 0.0000, 0.0000) [-0.0000, 0.0000, 0.0000]
PeriodicSite: Si (1.3666, 1.3666, 1.3666) [0.2500, 0.2500, 0.2500]

文字列から読み込み

pymatgen.core module

Structure.from_str(input_string: str, fmt: Literal['cif', 'poscar', 'cssr', 'json', 'yaml', 'xsf', 'mcsqs'], primitive=False, sort=False, merge_tol=0.0)

プログラム中で構造ファイルを文字列として読み込み,編集加工して出力するときなんかに使う.
fmtでフォーマット指定が必要.

from pymatgen.core import Structure
filename = 'POSCAR'

# ---------- ファイルを文字列で読み込み
with open(filename, 'r') as f:
    struc_str = f.read()
print(struc_str)
[出力]
Si diamond                              
   1.00000000000000     
     0.0000000000000000    2.7331808565875280    2.7331808565875280
     2.7331808565875280   -0.0000000000000000    2.7331808565875280
     2.7331808565875280    2.7331808565875275    0.0000000000000000
   Si
     2
Direct
 -0.0000000000000000  0.0000000000000000  0.0000000000000000
  0.2500000000000000  0.2500000000000000  0.2500000000000000
 
  0.00000000E+00  0.00000000E+00  0.00000000E+00
  0.00000000E+00  0.00000000E+00  0.00000000E+00
# ---------- Structureデータ
struc = Structure.from_str(struc_str, fmt='poscar')

構造書き出し

cif, POSCAR, xsfなど,色々なフォーマットに対応している.

以下ではstruc変数にpymatgenのStructureクラスがインスタンス化してあるものとする.

全フォーマット

pymatgen.core module

Structure.to(fmt: str = None, filename=None, **kwargs)

fmt'cif'を指定すれば内部でfrom pymatgen.io.cif import CifWriterが使われる.
'poscar'ならfrom pymatgen.io.vasp import Poscar

kwargsを指定すれば内部でwriter = CifWriter(self, **kwargs)のように渡してくれる.

filenameを指定すればファイルに書き出し.指定しなければ文字列をリターン.

# ---------- 構造書き出し
struc.to(fmt='poscar', filename='fuga.vasp')
#struc.to(fmt='cif', filename='si.cif')
#struc.to(fmt='cif', filename='sym_si.cif', symprec=0.01)    # 対称性考慮.セルや原子数変わる

文字列をオブジェクトにリターン

str_struc = struc.to(fmt='poscar')
print(str_struc)
[出力]
Si2
1.0
0.000000 2.733181 2.733181
2.733181 -0.000000 2.733181
2.733181 2.733181 0.000000
Si
2
direct
-0.000000 0.000000 0.000000 Si
0.250000 0.250000 0.250000 Si

cif

pymatgen.io.cif module

class CifWriter(struct, symprec=None, write_magmoms=False, significant_figures=8, angle_tolerance=5.0, refine_struct=True)
CifWriter.write_file(filename)

Structure.to()でcifファイルを書き出す時に内部で使用されているクラス.CifWriterを直接使うのはインスタンス化するのが面倒なのでStructure.to()を使えば良い.

symprec=0.01のようにすると,その値を許容範囲として対称性の情報(空間群)を付与したcifファイルを書き出すことができる.セルや原子数が変わるので注意.

# ---------- cifファイル書き出し
from pymatgen.io.cif import CifWriter
cw = CifWriter(struc)
#cw = CifWriter(struc, symprec=0.1)    # 対称性考慮.セルや原子数変わる
cw.write_file('cw_struc.cif')