薛堪豪的个人博客分享 http://blog.sciencenet.cn/u/bfax 兴趣:凝聚态物理,电化学

博文

VASP 与 Siesta 晶体结构格式互换

已有 5330 次阅读 2014-6-28 00:58 |个人分类:计算机|系统分类:科研笔记| VASP, 原子坐标, siesta, 格式转换, 第一性原理计算

如果手动进行 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(),

print

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

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 所包含的可执行文件目录下



https://wap.sciencenet.cn/blog-365047-807216.html

上一篇:出版社是如何处理论文图片的?
下一篇:Gromacs 有机溶剂模拟 学习笔记(一)
收藏 IP: 79.81.200.*| 热度|

1 Vetaren11

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-19 23:35

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部