计算化学公社

标题: 在VMD中画振动模式 [打印本页]

作者
Author:
Kalinite    时间: 2021-3-19 04:23
标题: 在VMD中画振动模式
本帖最后由 Kalinite 于 2021-3-19 04:31 编辑

GaussView中画振动模式的箭头有点偏细,不是很清晰,想到sob老师曾写过在VMD中显示原子受力的.tcl脚本(http://sobereva.com/568),于是魔改了一发。但是苦于不懂.tcl的语句用法,于是东查查西查查改成了下面这样。现在已经能够处理我自己的Gaussian16的freq输出,只要改开头NoMode为所需查看的振动模式序号,但是对比GaussView中看到的结果发现,这里需要减1(也就是说如果想看第10号模式,应该写9),不是很清楚哪里写错了,还请懂行的大佬指出。
因为最近正好想画几个振动模式的图,一想到这个可能行马上爬起来捣鼓了一下,写的有点烂,实现的方法可能也比较无脑。
  1. set filename xxx.log
  2. set NoMode 0

  3. set counter [expr $NoMode / 3]
  4. set res [expr $NoMode % 3]

  5. #Scale factor of arrow length
  6. set sclfac 20
  7. #Radius of arrow
  8. set rad 0.1
  9. #Color of arrow
  10. set color yellow
  11. #Criterion of drawing arrow
  12. set crit 0.1

  13. # Load atomic forces
  14. set myfile [open $filename r]
  15. while { [gets $myfile line] >=0 } {
  16. if {[string first "Harmonic frequencies" $line] != -1} {
  17. break
  18. }
  19. }
  20. gets $myfile line
  21. gets $myfile line
  22. gets $myfile line
  23. gets $myfile line
  24. gets $myfile line
  25. gets $myfile line
  26. gets $myfile line
  27. gets $myfile line
  28. gets $myfile line;#如果同时算了Raman之类还要额外加一行gets $myfile line,因为会多一行数据
  29. set natm [molinfo top get numatoms]
  30. set nmode [expr $natm * 3 - 6]
  31. set k 0

  32. while { [gets $myfile line] >=0 } {
  33. if {[string first "Atom" $line] != -1} {
  34. set k [expr $k + 1]
  35. }
  36. if {$k >= $counter} {
  37. break
  38. }
  39. }

  40. if {$res != 1} {
  41. for {set i 1} {$i <= $natm} {incr i} {
  42. gets $myfile line
  43. scan $line "%d %d %f %f %f %f %f %f %f %f %f" itmp jtmp fx($i) fy($i) fz($i) dd ee ff gg hh ii
  44. }
  45. }   elseif {$res != 2} {
  46. for {set i 1} {$i <= $natm} {incr i} {
  47. gets $myfile line
  48. scan $line "%d %d %f %f %f %f %f %f %f %f %f" itmp jtmp aa bb cc fx($i) fy($i) fz($i) gg hh ii
  49. }
  50. }   elseif {$res != 0} {
  51. for {set i 1} {$i <= $natm} {incr i} {
  52. gets $myfile line
  53. scan $line "%d %d %f %f %f %f %f %f %f %f %f" itmp jtmp aa bb cc dd ee ff fx($i) fy($i) fz($i)
  54. }
  55. }

  56. close $myfile

  57. set maxf 0
  58. for {set i 1} {$i<=$natm} {incr i} {
  59. set norm [expr sqrt($fx($i)**2+$fy($i)**2+$fz($i)**2)]
  60. if {$norm>$maxf} {set maxf $norm}
  61. }

  62. source drawarrow.tcl
  63. draw delete all
  64. draw color $color
  65. for {set i 1} {$i<=$natm} {incr i} {
  66. set norm [expr sqrt($fx($i)**2+$fy($i)**2+$fz($i)**2)]
  67. if {$norm>[expr $crit*$maxf]} {
  68. drawarrow "serial $i" $fx($i) $fy($i) $fz($i) $sclfac $rad 0
  69. }
  70. }

复制代码




作者
Author:
sobereva    时间: 2021-3-19 07:06
之前我发过
在VMD中绘制Gaussian计算的分子振动矢量的方法
http://sobereva.com/567http://bbs.keinsci.com/thread-19287-1-1.html
作者
Author:
Kalinite    时间: 2021-3-19 10:04
sobereva 发表于 2021-3-19 07:06
之前我发过
在VMD中绘制Gaussian计算的分子振动矢量的方法
http://sobereva.com/567(http://bbs.keinsci ...

太尴尬了,之前没注意到
作者
Author:
Huangff    时间: 2024-11-7 17:11
sobereva 发表于 2021-3-19 07:06
之前我发过
在VMD中绘制Gaussian计算的分子振动矢量的方法
http://sobereva.com/567(http://bbs.keinsci ...

老师,我没有找到帖子中提到的GauNorm.tcl和drawarrow2.tcl两个文件

作者
Author:
sobereva    时间: 2024-11-8 21:22
Huangff 发表于 2024-11-7 17:11
老师,我没有找到帖子中提到的GauNorm.tcl和drawarrow2.tcl两个文件

文章写得没法更清楚
在这里下载笔者编写的绘图脚本和示例文件:http://sobereva.com/attach/567/file.zip



作者
Author:
Huangff    时间: 2024-11-11 21:29
sobereva 发表于 2024-11-8 21:22
文章写得没法更清楚

谢谢老师,是我没有看仔细,提问当天在该文件夹找到了,抱歉耽误您时间




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3