import numpy as np
"""
VASPのCHGCARファイルを読み込むモジュール。
概要:
VASP (Vienna Ab initio Simulation Package) で生成されたCHGCARファイルから、
構造情報と電荷密度データを解析・抽出するための機能を提供する。
詳細説明:
このモジュールは、CHGCARファイルの複雑な構造を解析し、タイトル、スケール因子、
格子ベクトル、原子情報、原子座標、格子分割数、そして3次元電荷密度データといった
主要な情報をPythonのデータ構造(辞書とネストされたリスト)として利用可能にする。
電荷密度データはFortran順でファイルに格納されているため、読み込み時に適切に処理される。
関連リンク:
:doc:read_chgcar_format
"""
[ドキュメント]
def read_chgcar(filename):
"""
VASPのCHGCARファイルを読み込み、ヘッダー情報と電荷密度データを抽出する。
概要:
指定されたCHGCARファイルから、構造に関するメタデータと3次元の電荷密度データを解析して返す。
詳細説明:
ファイルから以下の情報を順に読み込む:
1. タイトル行
2. スケール因子 (float)
3. 格子ベクトル (3x3行列、各行はfloat)
4. 原子種 (文字列のリスト)
5. 各原子種の原子数 (整数のリスト)
6. 座標の種類 ('Direct' または 'Cartesian' など)
7. 各原子の座標 (総原子数分の3次元ベクトル)
8. 格子分割数 (NX, NY, NZ; 3つの整数)
9. 電荷密度データ (NX * NY * NZ個のfloat値)
読み込んだ電荷密度データは、Fortran順にNumpy配列にリシェイプされた後、
Pythonのネストされたリスト `P[ix][iy][iz]` 形式に変換される。
データのサイズが想定と異なる場合はValueErrorを発生させる。
:param filename: str
読み込むCHGCARファイルのパス。
:returns: tuple
- info (dict): CHGCARファイルのヘッダー情報を含む辞書。
主なキー: 'title', 'scale', 'lattice', 'atoms', 'numbers',
'coord_type', 'coords', 'grid'。
- P (list): 電荷密度データを格納した3次元のネストされたリスト P[ix][iy][iz]。
各要素は浮動小数点数。
"""
info = {}
with open(filename, 'r') as f:
# 1. タイトル
info['title'] = f.readline().strip()
# 2. スケール因子
info['scale'] = float(f.readline().strip())
# 3-5. 格子ベクトル
lattice = []
for _ in range(3):
lattice.append([float(x) for x in f.readline().split()])
info['lattice'] = np.array(lattice)
# 6. 原子種
info['atoms'] = f.readline().split()
# 7. 原子数
info['numbers'] = [int(x) for x in f.readline().split()]
# 8. 座標の種類
l = f.readline()
info['coord_type'] = l.strip()
# 9. 原子座標
natoms = sum(info['numbers'])
coords = []
for _ in range(natoms):
l = f.readline()
coords.append([float(x) for x in l.split()[:3]])
info['coords'] = np.array(coords)
# 格子分割数
while True:
l = f.readline()
if l.strip() != '':
break
nx, ny, nz = [int(x) for x in l.split()]
info['grid'] = (nx, ny, nz)
# 体積データ読み込み
ngrid = nx * ny * nz
data = []
while len(data) < ngrid:
line = f.readline()
if not line:
break
data.extend([float(x) for x in line.split()])
if len(data) != ngrid:
raise ValueError("CHGCAR data size mismatch")
# P[ix][iy][iz] に変換(ネストリスト)
arr = np.array(data).reshape((nx, ny, nz), order='F') # Fortran順
P = [[[arr[i, j, k] for k in range(nz)]
for j in range(ny)]
for i in range(nx)]
return info, P
[ドキュメント]
def main(infile):
"""
指定されたCHGCARファイルを読み込み、そのタイトル、格子分割数、および特定の電荷密度を表示する。
概要:
`read_chgcar` 関数を利用してCHGCARファイルを解析し、主要な情報を標準出力に出力する。
詳細説明:
1. `read_chgcar` 関数を呼び出して、CHGCARファイルから情報と電荷密度データを取得する。
2. 取得した情報の中から、ファイルのタイトル、電荷密度の格子分割数 (NX, NY, NZ)、
そして、格子点 (ix=0, iy=0, iz=0) における電荷密度値の3点を表示する。
これは、ファイル読み込みが正しく行われたことを確認するための簡単なテストとしても機能する。
:param infile: str
読み込むCHGCARファイルのパス。
:returns: None
何も返さない。
"""
info, P = read_chgcar(infile)
print(info['title'])
print(info['grid'])
print(P[0][0][0]) # (ix=0, iy=0, iz=0) の電荷密度
if __name__ == '__main__':
main('CHGCAR')