|||
如果手动进行 VASP 与 Siesta 之间的坐标转换,面临两个较麻烦的手续:
(1)VASP 的 POSCAR 中,每个原子坐标后面一般没有元素的标识(1,2 ...)
(2)Siesta 的 fdf 文件中,各个原子未必是按照元素次序排列的。并且还需要统计各个元素分别有多少个原子。
为了提高效率,我就写两个 Python 小程序以便在 Linux 下进行转换。
pos2fdf.py
#!/usr/bin/env python
# www.kanhaoxue.com
f = open('POSCAR', 'r')
for i in range(5):
f.readline()
line = f.readline().strip()
if line.split()[0].isdigit():
elementDetails = line.split()
else:
line = f.readline().strip()
elementDetails = line.split()
f.readline()
i = 1
print '%block AtomicCoordinatesAndAtomicSpecies'
for element in elementDetails:
for j in range(int(element)):
line = f.readline().strip()
coorDetails = line.split()
print '{0: >20}'.format(coorDetails[0][0:20]), '{0: >20}'.format(coorDetails[1][0:20]), '{0: >20}'.format(coorDetails[2][0:20]), i, j+1
i += 1
f.close()
print '%endblock AtomicCoordinatesAndAtomicSpecies'
这个程序可以读取当前目录下的 POSCAR,输出相应 Siesta 需要的 fdf 文件的原子坐标部分。由于 Siesta 的输入 fdf 文件还包括很多其他内容,我们并不能产生完整的 fdf 文件。既然 VASP 是按照元素次序排列原子的,我们这里生成的 Siesta 原子坐标也是按照元素次序的,并且还标注了每个原子是该元素的第几个原子。
程序考虑到了老版 VASP 的 POSCAR, 有些时候并不写元素名。例如
Na Cl
4 4
在有些 4.x 版本的 VASP 里只是写成
4 4
对于这种情况也能正确读取。
fdf2pos.py
#!/usr/bin/env python
# www.kanhaoxue.com
atomCount = speciesCount = latticeConstant = 1
numberOfAtoms = [0, 0, 0, 0, 0, 0]
coordinateStr = ['', '', '', '', '', '']
sysName = 'Siesta'
f = open('in.fdf', 'r')
for line in f:
if 'SYSTEMNAME' in line.upper():
sysName = line.split()[1].strip()
if 'NUMBEROFATOMS' in line.upper():
atomCount = int(line.split()[1].strip())
if 'NUMBEROFSPECIES' in line.upper():
speciesCount = int(line.split()[1].strip())
if 'LATTICECONSTANT' in line.upper():
latticeConstant = line.split()[1].strip()
print sysName
print latticeConstant
f.seek(0,0)
line = f.readline()
while not 'LATTICEVECTORS' in line.upper():
line = f.readline()
for i in range(3):
line = f.readline().strip()
latticeDetails = line.split()
print '{0: >20}'.format(latticeDetails[0][0:20]), '{0: >20}'.format(latticeDetails[1][0:20]), '{0: >20}'.format(latticeDetails[2][0:20])
f.seek(0,0)
line = f.readline()
while not 'CHEMICAL_SPECIES_LABEL' in line.upper():
line = f.readline()
for i in range(speciesCount):
line = f.readline().strip()
print line.split()[2].strip(),
f.seek(0,0)
line = f.readline()
while not 'ATOMICCOORDINATESANDATOMICSPECIES' in line.upper():
line = f.readline()
for i in range(atomCount):
line = f.readline().strip()
coorDetails = line.split()
speciesIndex = int(coorDetails[3])-1
coordinateStr[speciesIndex] += '{0: >20}'.format(coorDetails[0][0:20])
coordinateStr[speciesIndex] += ' '
coordinateStr[speciesIndex] += '{0: >20}'.format(coorDetails[1][0:20])
coordinateStr[speciesIndex] += ' '
coordinateStr[speciesIndex] += '{0: >20}'.format(coorDetails[2][0:20])
coordinateStr[speciesIndex] += ' '
coordinateStr[speciesIndex] += '{0: >5}'.format(coorDetails[3][0:20])
coordinateStr[speciesIndex] += 'n'
numberOfAtoms[speciesIndex] += 1
for i in range(speciesCount):
print numberOfAtoms[i],
print 'Direct'
for i in range(speciesCount):
print coordinateStr[i],
f.close()
把 Siesta 的 fdf 输入文件(这里假定文件名叫 in.fdf)转换为 VASP 的 POSCAR 要麻烦一些。这里我们假定 Siesta 的原子坐标必须是按照 Fractional 的格式来的,但各个原子的坐标不必要按照元素次序排列。
程序输出到屏幕终端。如果想存为 POSCAR 只需要敲
> fdf2pos.py > POSCAR
如果想存为 CONTCAR 则需要敲
> fdf2pos.py > CONTCAR
* 注:这两个 py 文件保存之后,还需要给予执行的权限:
> chmod 555 pos2fdf.py
> chmod 555 fdf2pos.py
然后再移动到 PATH 所包含的可执行文件目录下
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-10-20 02:22
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社