计算化学公社

 找回密码 Forget password
 注册 Register
Views: 17580|回复 Reply: 9
打印 Print 上一主题 Last thread 下一主题 Next thread

[VASP] Raman+VASP计算的Python脚本运行出现问题

[复制链接 Copy URL]

99

帖子

0

威望

1390

eV
积分
1489

Level 4 (黑子)

PIG

最近在尝试用vasp计算Raman光谱,在https://github.com/raman-sc/VASP#installation 找到个python程序,按照说明运行时出现个问题 ,不知道是什么原因?求Python大神们解答,不过运行他自带的例子就没有问题。
python代码如下
  1. #!/usr/bin/env python
  2. #
  3. # vasp_raman.py v. 0.6.0
  4. #
  5. # Raman off-resonant activity calculator
  6. # using VASP as a back-end.
  7. #
  8. # Contributors: Alexandr Fonari (Georgia Tech)
  9. # Shannon Stauffer (UT Austin)
  10. #
  11. # URL: http://raman-sc.github.io
  12. #
  13. # MIT license, 2013 - 2016
  14. #


  15. import re
  16. import sys


  17. def MAT_m_VEC(m, v):
  18.     p = [ 0.0 for i in range(len(v)) ]
  19.     for i in range(len(m)):
  20.         assert len(v) == len(m[i]), 'Length of the matrix row is not equal to the length of the vector'
  21.         p[i] = sum( [ m[i][j]*v[j] for j in range(len(v)) ] )
  22.     return p


  23. def T(m):
  24.     p = [[ m[i][j] for i in range(len( m[j] )) ] for j in range(len( m )) ]
  25.     return p


  26. def parse_poscar(poscar_fh):
  27.     # modified subroutine from phonopy 1.8.3 (New BSD license)
  28.     #
  29.     poscar_fh.seek(0) # just in case
  30.     lines = poscar_fh.readlines()
  31.     #
  32.     scale = float(lines[1])
  33.     if scale < 0.0:
  34.         print "[parse_poscar]: ERROR negative scale not implemented."
  35.         sys.exit(1)
  36.     #
  37.     b = []
  38.     for i in range(2, 5):
  39.         b.append([float(x)*scale for x in lines[i].split()[:3]])
  40.     #
  41.     vol = b[0][0]*b[1][1]*b[2][2] + b[1][0]*b[2][1]*b[0][2] + b[2][0]*b[0][1]*b[1][2] - \
  42.           b[0][2]*b[1][1]*b[2][0] - b[2][1]*b[1][2]*b[0][0] - b[2][2]*b[0][1]*b[1][0]
  43.     #
  44.     try:
  45.         num_atoms = [int(x) for x in lines[5].split()]
  46.         line_at = 6
  47.     except ValueError:
  48.         symbols = [x for x in lines[5].split()]
  49.         num_atoms = [int(x) for x in lines[6].split()]
  50.         line_at = 7
  51.     nat = sum(num_atoms)
  52.     #
  53.     if lines[line_at][0].lower() == 's':
  54.         line_at += 1
  55.     #
  56.     if (lines[line_at][0].lower() == 'c' or lines[line_at][0].lower() == 'k'):
  57.         is_scaled = False
  58.     else:
  59.         is_scaled = True
  60.     #
  61.     line_at += 1
  62.     #
  63.     positions = []
  64.     for i in range(line_at, line_at + nat):
  65.         pos = [float(x) for x in lines[i].split()[:3]]
  66.         #
  67.         if is_scaled:
  68.             pos = MAT_m_VEC(T(b), pos)
  69.         #
  70.         positions.append(pos)
  71.     #
  72.     poscar_header = ''.join(lines[1:line_at-1]) # will add title and 'Cartesian' later
  73.     return nat, vol, b, positions, poscar_header


  74. def parse_env_params(params):
  75.     tmp = params.strip().split('_')
  76.     if len(tmp) != 4:
  77.         print "[parse_env_params]: ERROR there should be exactly four parameters"
  78.         sys.exit(1)
  79.     #
  80.     [first, last, nderiv, step_size] = [int(tmp[0]), int(tmp[1]), int(tmp[2]), float(tmp[3])]
  81.     #
  82.     return first, last, nderiv, step_size


  83. #### subs for the output from VTST tools
  84. def parse_freqdat(freqdat_fh, nat):
  85.     freqdat_fh.seek(0) # just in case
  86.     #
  87.     eigvals = [ 0.0 for i in range(nat*3) ]
  88.     #
  89.     for i in range(nat*3): # all frequencies should be supplied, regardless of requested to calculate
  90.         tmp = freqdat_fh.readline().split()
  91.         eigvals[i] = float(tmp[0])
  92.     #
  93.     return eigvals
  94. #
  95. def parse_modesdat(modesdat_fh, nat):
  96.     from math import sqrt
  97.     modesdat_fh.seek(0) # just in case
  98.     #
  99.     eigvecs = [ 0.0 for i in range(nat*3) ]
  100.     norms =   [ 0.0 for i in range(nat*3) ]
  101.     #
  102.     for i in range(nat*3): # all frequencies should be supplied, regardless of requested to calculate
  103.         eigvec = []
  104.         for j in range(nat):
  105.             tmp = modesdat_fh.readline().split()
  106.             eigvec.append([ float(tmp[x]) for x in range(3) ])
  107.         #
  108.         modesdat_fh.readline().split() # empty line
  109.         eigvecs[i] = eigvec
  110.         norms[i] = sqrt( sum( [abs(x)**2 for sublist in eigvec for x in sublist] ) )
  111.     #
  112.     return eigvecs, norms
  113. #### end subs for VTST
  114. #
  115. def get_modes_from_OUTCAR(outcar_fh, nat):
  116.     from math import sqrt
  117.     eigvals = [ 0.0 for i in range(nat*3) ]
  118.     eigvecs = [ 0.0 for i in range(nat*3) ]
  119.     norms   = [ 0.0 for i in range(nat*3) ]
  120.     #
  121.     outcar_fh.seek(0) # just in case
  122.     while True:
  123.         line = outcar_fh.readline()
  124.         if not line:
  125.             break
  126.         #
  127.         if "Eigenvectors after division by SQRT(mass)" in line:
  128.             outcar_fh.readline() # empty line
  129.             outcar_fh.readline() # Eigenvectors and eigenvalues of the dynamical matrix
  130.             outcar_fh.readline() # ----------------------------------------------------
  131.             outcar_fh.readline() # empty line
  132.             #
  133.             for i in range(nat*3): # all frequencies should be supplied, regardless of those requested to calculate
  134.                 outcar_fh.readline() # empty line
  135.                 p = re.search(r'^\s*(\d+).+?([\.\d]+) cm-1', outcar_fh.readline())
  136.                 eigvals[i] = float(p.group(2))
  137.                 #
  138.                 outcar_fh.readline() # X         Y         Z           dx          dy          dz
  139.                 eigvec = []
  140.                 #
  141.                 for j in range(nat):
  142.                     tmp = outcar_fh.readline().split()
  143.                     #
  144.                     eigvec.append([ float(tmp[x]) for x in range(3,6) ])
  145.                     #
  146.                 eigvecs[i] = eigvec
  147.                 norms[i] = sqrt( sum( [abs(x)**2 for sublist in eigvec for x in sublist] ) )
  148.             #
  149.             return eigvals, eigvecs, norms
  150.         #
  151.     print "[get_modes_from_OUTCAR]: ERROR Couldn't find 'Eigenvectors after division by SQRT(mass)' in OUTCAR. Use 'NWRITE=3' in INCAR. Exiting..."
  152.     sys.exit(1)
  153. #
  154. def get_epsilon_from_OUTCAR(outcar_fh):
  155.     epsilon = []
  156.     #
  157.     outcar_fh.seek(0) # just in case
  158.     while True:
  159.         line = outcar_fh.readline()
  160.         if not line:
  161.             break
  162.         #
  163.         if "MACROSCOPIC STATIC DIELECTRIC TENSOR" in line:
  164.             outcar_fh.readline()
  165.             epsilon.append([float(x) for x in outcar_fh.readline().split()])
  166.             epsilon.append([float(x) for x in outcar_fh.readline().split()])
  167.             epsilon.append([float(x) for x in outcar_fh.readline().split()])
  168.             return epsilon
  169.     #
  170.     raise RuntimeError("[get_epsilon_from_OUTCAR]: ERROR Couldn't find dielectric tensor in OUTCAR")
  171.     return 1
  172. #
  173. if __name__ == '__main__':
  174.     from math import pi
  175.     from shutil import move
  176.     import os
  177.     import datetime
  178.     import time
  179.     #import argparse
  180.     import optparse
  181.     #
  182.     print ""
  183.     print "    Raman off-resonant activity calculator,"
  184.     print "    using VASP as a back-end."
  185.     print ""
  186.     print "    Contributors: Alexandr Fonari  (Georgia Tech)"
  187.     print "                  Shannon Stauffer (UT Austin)"
  188.     print "    MIT License, 2013"
  189.     print "    URL: http://raman-sc.github.io"
  190.     print "    Started at: "+datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
  191.     print ""
  192.     #
  193.     description  = "Before run, set environment variables:\n"
  194.     description += "    VASP_RAMAN_RUN='mpirun vasp'\n"
  195.     description += "    VASP_RAMAN_PARAMS='[first-mode]_[last-mode]_[nderiv]_[step-size]'\n\n"
  196.     description += "bash one-liner is:\n"
  197.     description += "VASP_RAMAN_RUN='mpirun vasp' VASP_RAMAN_PARAMS='1_2_2_0.01' python vasp_raman.py"
  198.     #
  199.     parser = optparse.OptionParser(description=description)
  200.     parser.add_option('-g', '--gen', help='Generate POSCAR only', action='store_true')
  201.     parser.add_option('-u', '--use_poscar', help='Use provided POSCAR in the folder, USE WITH CAUTION!!', action='store_true')
  202.     (options, args) = parser.parse_args()
  203.     #args = vars(parser.parse_args())
  204.     args = vars(options)
  205.     #
  206.     VASP_RAMAN_RUN = os.environ.get('VASP_RAMAN_RUN')
  207.     if VASP_RAMAN_RUN == None:
  208.         print "[__main__]: ERROR Set environment variable 'VASP_RAMAN_RUN'"
  209.         print ""
  210.         parser.print_help()
  211.         sys.exit(1)
  212.     print "[__main__]: VASP_RAMAN_RUN='"+VASP_RAMAN_RUN+"'"
  213.     #
  214.     VASP_RAMAN_PARAMS = os.environ.get('VASP_RAMAN_PARAMS')
  215.     if VASP_RAMAN_PARAMS == None:
  216.         print "[__main__]: ERROR Set environment variable 'VASP_RAMAN_PARAMS'"
  217.         print ""
  218.         parser.print_help()
  219.         sys.exit(1)
  220.     print "[__main__]: VASP_RAMAN_PARAMS='"+VASP_RAMAN_PARAMS+"'"
  221.     #
  222.     first, last, nderiv, step_size = parse_env_params(VASP_RAMAN_PARAMS)
  223.     assert first >= 1,    '[__main__]: First mode should be equal or larger than 1'
  224.     assert last >= first, '[__main__]: Last mode should be equal or larger than first mode'
  225.     if args['gen']: assert last == first, "[__main__]: '-gen' mode -> only generation for the one mode makes sense"
  226.     assert nderiv == 2,   '[__main__]: At this time, nderiv = 2 is the only supported'
  227.     disps = [-1, 1]      # hardcoded for
  228.     coeffs = [-0.5, 0.5] # three point stencil (nderiv=2)
  229.     #
  230.     try:
  231.         poscar_fh = open('POSCAR.phon', 'r')
  232.     except IOError:
  233.         print "[__main__]: ERROR Couldn't open input file POSCAR.phon, exiting...\n"
  234.         sys.exit(1)
  235.     #
  236.     # nat, vol, b, poscar_header = parse_poscar_header(poscar_fh)
  237.     nat, vol, b, pos, poscar_header = parse_poscar(poscar_fh)
  238.     print pos
  239.     #print poscar_header
  240.     #sys.exit(0)
  241.     #
  242.     # either use modes from vtst tools or VASP
  243.     if os.path.isfile('freq.dat') and os.path.isfile('modes_sqrt_amu.dat'):
  244.         try:
  245.             freqdat_fh = open('freq.dat', 'r')
  246.         except IOError:
  247.             print "[__main__]: ERROR Couldn't open freq.dat, exiting...\n"
  248.             sys.exit(1)
  249.         #
  250.         eigvals = parse_freqdat(freqdat_fh, nat)
  251.         freqdat_fh.close()
  252.         #
  253.         try:
  254.             modes_fh = open('modes_sqrt_amu.dat' , 'r')
  255.         except IOError:
  256.             print "[__main__]: ERROR Couldn't open modes_sqrt_amu.dat, exiting...\n"
  257.             sys.exit(1)
  258.         #
  259.         eigvecs, norms = parse_modesdat(modes_fh, nat)
  260.         modes_fh.close()
  261.     #
  262.     elif os.path.isfile('OUTCAR.phon'):
  263.         try:
  264.             outcar_fh = open('OUTCAR.phon', 'r')
  265.         except IOError:
  266.             print "[__main__]: ERROR Couldn't open OUTCAR.phon, exiting...\n"
  267.             sys.exit(1)
  268.         #
  269.         eigvals, eigvecs, norms = get_modes_from_OUTCAR(outcar_fh, nat)
  270.         outcar_fh.close()
  271.     #
  272.     else:
  273.         print "[__main__]: Neither OUTCAR.phon nor freq.dat/modes_sqrt_amu.dat were found, nothing to do, exiting..."
  274.         sys.exit(1)
  275.     #
  276.     output_fh = open('vasp_raman.dat', 'w')
  277.     output_fh.write("# mode    freq(cm-1)    alpha    beta2    activity\n")
  278.     for i in range(first-1, last):
  279.         eigval = eigvals[i]
  280.         eigvec = eigvecs[i]
  281.         norm = norms[i]
  282.         #
  283.         print ""
  284.         print "[__main__]: Mode #%i: frequency %10.7f cm-1; norm: %10.7f" % ( i+1, eigval, norm )
  285.         #
  286.         ra = [[0.0 for x in range(3)] for y in range(3)]
  287.         for j in range(len(disps)):
  288.             disp_filename = 'OUTCAR.%04d.%+d.out' % (i+1, disps[j])
  289.             #
  290.             try:
  291.                 outcar_fh = open(disp_filename, 'r')
  292.                 print "[__main__]: File "+disp_filename+" exists, parsing..."
  293.             except IOError:
  294.                 if args['use_poscar'] != True:
  295.                     print "[__main__]: File "+disp_filename+" not found, preparing displaced POSCAR"
  296.                     poscar_fh = open('POSCAR', 'w')
  297.                     poscar_fh.write("%s %4.1e \n" % (disp_filename, step_size))
  298.                     poscar_fh.write(poscar_header)
  299.                     poscar_fh.write("Cartesian\n")
  300.                     #
  301.                     for k in range(nat):
  302.                         pos_disp = [ pos[k][l] + eigvec[k][l]*step_size*disps[j]/norm for l in range(3)]
  303.                         poscar_fh.write( '%15.10f %15.10f %15.10f\n' % (pos_disp[0], pos_disp[1], pos_disp[2]) )
  304.                         #print '%10.6f %10.6f %10.6f %10.6f %10.6f %10.6f' % (pos[k][0], pos[k][1], pos[k][2], dis[k][0], dis[k][1], dis[k][2])
  305.                     poscar_fh.close()
  306.                 else:
  307.                     print "[__main__]: Using provided POSCAR"
  308.                 #
  309.                 if args['gen']: # only generate POSCARs
  310.                     poscar_fn = 'POSCAR.%+d.out' % disps[j]
  311.                     move('POSCAR', poscar_fn)
  312.                     print "[__main__]: '-gen' mode -> "+poscar_fn+" with displaced atoms have been generated"
  313.                     #
  314.                     if j+1 == len(disps): # last iteration for the current displacements list
  315.                         print "[__main__]: '-gen' mode -> POSCAR files with displaced atoms have been generated, exiting now"
  316.                         sys.exit(0)
  317.                 else: # run VASP here
  318.                     print "[__main__]: Running VASP..."
  319.                     os.system(VASP_RAMAN_RUN)
  320.                     try:
  321.                         move('OUTCAR', disp_filename)
  322.                     except IOError:
  323.                         print "[__main__]: ERROR Couldn't find OUTCAR file, exiting..."
  324.                         sys.exit(1)
  325.                     #
  326.                     outcar_fh = open(disp_filename, 'r')
  327.             #
  328.             try:
  329.                 eps = get_epsilon_from_OUTCAR(outcar_fh)
  330.                 outcar_fh.close()
  331.             except Exception, err:
  332.                 print err
  333.                 print "[__main__]: Moving "+disp_filename+" back to 'OUTCAR' and exiting..."
  334.                 move(disp_filename, 'OUTCAR')
  335.                 sys.exit(1)
  336.             #
  337.             for m in range(3):
  338.                 for n in range(3):
  339.                     ra[m][n]   += eps[m][n] * coeffs[j]/step_size * norm * vol/(4.0*pi)
  340.             #units: A^2/amu^1/2 =         dimless   * 1/A         * 1/amu^1/2  * A^3
  341.         #
  342.         alpha = (ra[0][0] + ra[1][1] + ra[2][2])/3.0
  343.         beta2 = ( (ra[0][0] - ra[1][1])**2 + (ra[0][0] - ra[2][2])**2 + (ra[1][1] - ra[2][2])**2 + 6.0 * (ra[0][1]**2 + ra[0][2]**2 + ra[1][2]**2) )/2.0
  344.         print ""
  345.         print "! %4i  freq: %10.5f  alpha: %10.7f  beta2: %10.7f  activity: %10.7f " % (i+1, eigval, alpha, beta2, 45.0*alpha**2 + 7.0*beta2)
  346.         output_fh.write("%03i  %10.5f  %10.7f  %10.7f  %10.7f\n" % (i+1, eigval, alpha, beta2, 45.0*alpha**2 + 7.0*beta2))
  347.         output_fh.flush()
  348.     #
  349.     output_fh.close()
复制代码


103

帖子

5

威望

1022

eV
积分
1225

Level 4 (黑子)

2#
发表于 Post on 2017-12-6 23:20:45 | 只看该作者 Only view this author
还不如去github上issues里给作者反馈错误

99

帖子

0

威望

1390

eV
积分
1489

Level 4 (黑子)

PIG

3#
 楼主 Author| 发表于 Post on 2017-12-6 23:59:01 | 只看该作者 Only view this author
sky 发表于 2017-12-6 23:20
还不如去github上issues里给作者反馈错误

写邮件了

4

帖子

0

威望

49

eV
积分
53

Level 2 能力者

4#
发表于 Post on 2018-1-27 12:38:00 | 只看该作者 Only view this author
我用了楼主所下载的那个程序,运行没有问题,就是计算有点慢。建议查看自己前面几步计算是否有错误,我最初用的时候也会报错,后面修改INCAR里面的一些参数,仔细核对以后是没有问题的。

2

帖子

0

威望

25

eV
积分
27

Level 2 能力者

5#
发表于 Post on 2018-1-30 16:56:42 | 只看该作者 Only view this author
你好,我最近在看vasp计算Raman,试着算了 https://github.com/raman-sc/VASP里面  Sibulk-VASP 例子,根据自己的情况,修改了 里面 Raman.sub 的 export VASP_RAMAN_RUN='aprun -B /u/afonari/vasp.5.3.2/vasp.5.3/vasp &> job.out' 和 python /u/afonari/vasp_raman.py > vasp_raman.out, qsub Raman.sub,根据 README.md,qsub Raman.sub 之后计算完后,应该生成很多 OUTCAR.000* 和  vasp_raman.dat, 但是我并不能得到这些文件。刚开始接触这方面,可能犯了很傻的错误,可否指教我一下?非常感谢!

99

帖子

0

威望

1390

eV
积分
1489

Level 4 (黑子)

PIG

6#
 楼主 Author| 发表于 Post on 2018-2-8 16:23:38 | 只看该作者 Only view this author
exwhite 发表于 2018-1-30 16:56
你好,我最近在看vasp计算Raman,试着算了 https://github.com/raman-sc/VASP里面  Sibulk-VASP 例子,根据 ...

这个。。我是自己的服务器做的,,可能是aprun那里调用问题,看看路径啊,命令啥的有没问题。不过你看看有没有一个OUTCAR生成,或者OSZICAr生成,是不是报错了啥的

2

帖子

0

威望

25

eV
积分
27

Level 2 能力者

7#
发表于 Post on 2018-2-26 20:28:24 | 只看该作者 Only view this author
muxijiao 发表于 2018-2-8 16:23
这个。。我是自己的服务器做的,,可能是aprun那里调用问题,看看路径啊,命令啥的有没问题。不过你看看 ...

嗯,好的。谢谢~~~

30

帖子

0

威望

360

eV
积分
390

Level 3 能力者

8#
发表于 Post on 2019-8-19 22:19:16 | 只看该作者 Only view this author
楼主好,请问下,VASP可否计算拉曼张量呀?从而计算拉曼强度?还是直接用vasp计算拉曼就行了呀?

25

帖子

0

威望

590

eV
积分
615

Level 4 (黑子)

9#
发表于 Post on 2020-11-5 17:17:28 | 只看该作者 Only view this author
你好,请问有vasp_raman的Python库吗

115

帖子

0

威望

1359

eV
积分
1474

Level 4 (黑子)

10#
发表于 Post on 2021-9-6 11:49:35 | 只看该作者 Only view this author
exwhite 发表于 2018-1-30 16:56
**** 作者被禁止或删除 内容自动屏蔽 ****

你好,我在论坛上看见您在计算raman谱的时候没有出险OUTCAR.001等一系列文件,后来是怎么解决的呢。

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2026-2-19 07:37 , Processed in 0.218772 second(s), 29 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list