構造の読み込み
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')