计算化学公社

标题: 基于fch中的Hessian矩阵计算振动频率的简单程序Hess2freq [打印本页]

作者
Author:
sobereva    时间: 2016-5-27 07:30
标题: 基于fch中的Hessian矩阵计算振动频率的简单程序Hess2freq
基于fch中的Hessian矩阵计算振动频率的简单程序Hess2freq
Hess2freq: A simple program to calculate vibrational frequencies based on Hessian matrix in fch

文/Sobereva @北京科音  2016-May-27


写了个教学目的的程序Hess2freq,可以读取fch中的Hessian矩阵来计算谐振频率和正则坐标。给了非常易读的源代码,而且文档里把用到的公式和原理都详细介绍了,对想了解振动分析原理和细节的人应该会很有益。

下载地址: http://sobereva.com/soft/Hess2freq.rar


输出例子:
Hess2freq: Load Hessian from .fch file and then compute harmonic frequencies
Programmed by Sobereva (Sobereva@sina.com)
Release date: 2016-May-27

The number of atoms:     4
The number of vibrational modes:     6
Atomic masses:
   12.000000    1.007825    1.007825   15.994915

************ Force constant matrix (i.e mass-weighted Hessian) ************
             1             2             3             4             5      
     1  0.918452D-01  0.427913D-01  0.170607D-05  0.235189D-01 -0.105091D-02
     2  0.427913D-01  0.504781D-02 -0.520948D-05 -0.159298D-01 -0.181706D-01
     3  0.170607D-05 -0.520948D-05  0.534475D-02 -0.499779D-05 -0.157484D-05
     4  0.235189D-01 -0.159298D-01 -0.499779D-05  0.332464D-02 -0.708577D-02
     5 -0.105091D-02 -0.181706D-01 -0.157484D-05 -0.708577D-02  0.510611D-01
     6 -0.192394D-04  0.167567D-04  0.216766D-02  0.189037D-04 -0.886049D-06
     7 -0.852345D-01 -0.332194D-01  0.279538D-04 -0.285394D-01 -0.259396D-02
     8 -0.478064D-01  0.343795D-01  0.187013D-04  0.414582D-01 -0.178675D-01
     9  0.506723D-04  0.711252D-05 -0.114972D-01 -0.112089D-05  0.343570D-05
    10 -0.640613D-01 -0.247270D-01 -0.724008D-05 -0.140419D-01  0.334003D-02
    11 -0.248003D-01 -0.844094D-02  0.213252D-06  0.516973D-02  0.740654D-02
    12 -0.936792D-05 -0.147931D-05 -0.228756D-02 -0.134884D-06  0.724064D-06
             6             7             8             9            10      
     1 -0.192394D-04 -0.852345D-01 -0.478064D-01  0.506723D-04 -0.640613D-01
     2  0.167567D-04 -0.332194D-01  0.343795D-01  0.711252D-05 -0.247270D-01
     3  0.216766D-02  0.279538D-04  0.187013D-04 -0.114972D-01 -0.724008D-05
     4  0.189037D-04 -0.285394D-01  0.414582D-01 -0.112089D-05 -0.140419D-01
     5 -0.886049D-06 -0.259396D-02 -0.178675D-01  0.343570D-05  0.334003D-02
     6  0.865363D-03  0.273490D-04 -0.423721D-04 -0.466045D-02  0.505424D-05
     7  0.273490D-04  0.336434D+00  0.848079D-01 -0.147836D-03 -0.345946D-02
     8 -0.423721D-04  0.848079D-01 -0.715275D-01 -0.133212D-04  0.971329D-02
     9 -0.466045D-02 -0.147836D-03 -0.133212D-04  0.247107D-01 -0.649994D-05
    10  0.505424D-05 -0.345946D-02  0.971329D-02 -0.649994D-05  0.598807D-01
    11 -0.365557D-05  0.813642D-02 -0.733868D-02 -0.367918D-05  0.181410D-01
    12 -0.924923D-03  0.603159D-05 -0.221842D-05  0.492551D-02  0.663398D-05
            11            12      
     1 -0.248003D-01 -0.936792D-05
     2 -0.844094D-02 -0.147931D-05
     3  0.213252D-06 -0.228756D-02
     4  0.516973D-02 -0.134884D-06
     5  0.740654D-02  0.724064D-06
     6 -0.365557D-05 -0.924923D-03
     7  0.813642D-02  0.603159D-05
     8 -0.733868D-02 -0.221842D-05
     9 -0.367918D-05  0.492551D-02
    10  0.181410D-01  0.663398D-05
    11  0.729420D-02  0.165643D-05
    12  0.165643D-05  0.977187D-03
Diagonalization passed

************ Normal coordinates (columns) ************
             1             2             3             4             5      
     1    0.0666        0.0130        0.0000        0.0513        0.4179   
     2   -0.1089        0.1194       -0.0000       -0.0833        0.1751   
     3   -0.0000        0.0001        0.1312       -0.0000        0.0001   
     4   -0.3936       -0.9639        0.0004       -0.1564        0.1945   
     5    0.0303       -0.0534        0.0001        0.9406       -0.2801   
     6    0.0004        0.0001        0.1834        0.0000       -0.0000   
     7   -0.1713        0.0346       -0.0005        0.0914        0.7221   
     8    0.8931       -0.2116       -0.0001       -0.2670        0.0714   
     9   -0.0001       -0.0004       -0.9730        0.0000       -0.0002   
    10   -0.0144        0.0488       -0.0000       -0.0344       -0.3713   
    11    0.0235       -0.0729        0.0000        0.0200       -0.1182   
    12    0.0000       -0.0000       -0.0487       -0.0000       -0.0000   
             6      
     1   -0.1015   
     2   -0.0311   
     3    0.0000   
     4   -0.0689   
     5   -0.0080   
     6    0.0001   
     7    0.9710   
     8    0.2015   
     9   -0.0005   
    10    0.0193   
    11    0.0111   
    12    0.0000   

The frequencies (cm-1) corresponding to overall translation and rotation:
    -0.00997     0.01937    -0.05532   -12.87321   -15.76915   -19.42877
Harmonic vibrational frequencies:
Mode    1:   -0.56590E+14 Hz    -1887.64948 cm-1
Mode    2:    0.23453E+14 Hz      782.31259 cm-1
Mode    3:    0.27533E+14 Hz      918.38630 cm-1
Mode    4:    0.38543E+14 Hz     1285.65606 cm-1
Mode    5:    0.58055E+14 Hz     1936.50274 cm-1
Mode    6:    0.96313E+14 Hz     3212.64652 cm-1


作者
Author:
我本是个娃娃    时间: 2016-5-27 08:49
沙发
作者
Author:
978142355    时间: 2016-5-27 10:16
大赞sob老师。问一个问题,Lapack库在windows上是如何配置到VS2010中的?看了许多教程,都未成功,因为自己一直编写小程序从来没用什么数学库,借此机会问问老师这个该如何配置?我在网站上下载了windows版本的lapack库,打开文件夹里面好多的东西,不知道哪些应该放在VS中,求老师指点。(PS:没有看到*.lib文件,只找到了include文件夹,所以不知该如何是好)
作者
Author:
jliang    时间: 2016-5-27 10:18
Sob老师的物理功底真深!相比之下让学物理的人都感到惭愧!
作者
Author:
sobereva    时间: 2016-5-27 16:12
978142355 发表于 2016-5-27 10:16
大赞sob老师。问一个问题,Lapack库在windows上是如何配置到VS2010中的?看了许多教程,都未成功,因为自己 ...


blas库在CVF/ivf下的使用:
新建一个工程,类型选静态库。把blas库所有.f都添加进source file里,然后build,就得到了.lib文件。

lapack在CVF/ivf下的使用
把lapack压缩包内的SRC内的.f都加入工程,把INSTALL里的辅助子程序slamch.f和dlamch.f加入子程序。把BLAS库文件加入工程。build即可。

blas在linux下编译:
解压后,把make.inc里面编译器改成自己的。然后make即可。

lapack在linux下编译:
解压后,把make.inc.example改名为make.inc,把FORTRAN、LOADER都改为ifort,把OPTS改成-O3,把BLASLIB改成blas.a的路径。然后make即可。
作者
Author:
978142355    时间: 2016-5-27 20:11
sobereva 发表于 2016-5-27 16:12
blas库在CVF/ivf下的使用:
新建一个工程,类型选静态库。把blas库所有.f都添加进source file里,然后 ...

大赞sob老师,谢谢,十分感谢,总能在这里找到十分正确又细致的答案,向sob学习,向sob看齐。
作者
Author:
让你变成回忆    时间: 2017-9-11 19:39
sob老师,您好!
目前在学习Fortran编程,正在跟着您写的Hess2freq程序练习。
练习过程中发现您的程序中 loclabel子程序部分自己不怎么理得清关系,您可以简单说一下是怎么在某个文件中找到我要的label的呢?
谢谢sob老师。
作者
Author:
sobereva    时间: 2017-9-11 20:29
让你变成回忆 发表于 2017-9-11 19:39
sob老师,您好!
目前在学习Fortran编程,正在跟着您写的Hess2freq程序练习。
练习过程中发现您的程序中  ...


loclabel就是定位到含有某一串字符的那一行的子程序
从文本文件中读取信息的时候,得先定位到合适的位置,才能开始读取,loclabel就是用来干这个的。每一部分数据输出之前肯定会有一些提示字符能用来定位。
作者
Author:
让你变成回忆    时间: 2017-9-11 20:51
sobereva 发表于 2017-9-11 20:29
loclabel就是定位到含有某一串字符的那一行的子程序
从文本文件中读取信息的时候,得先定位到合适的位 ...

subroutine loclabel(fileid,label,ifound,irewind)
integer fileid,ierror
integer,optional :: ifound,irewind
character*200 c200
CHARACTER(LEN=*) label
if ((.not.present(irewind)).or.(present(irewind).and.irewind==1)) rewind(fileid)
do while(.true.)
         read(fileid,"(a)",iostat=ierror) c200
        if (index(c200,label)/=0) then
                backspace(fileid)
                if (present(ifound)) ifound=1 !Found result
                return
        end if
        if (ierror/=0) exit
end do
if (present(ifound)) ifound=0
end subroutine
这是sob老师您写的代码,我有几个不明白的地方,恳请您提示下:
1、这里面 ifound、irewind意义是什么,为什么不能直接通过index找到某个特定字符就行。
2、另外我发现,由于具体的字符出现的位置不同,您在主程序中写的也不同。比如 需要原子数的时候,您的程序中并没有read一个空行,我看fchk文件这是由于原子数就出现在查找字符串(原子数)的同一行,但导入质量矩阵等其他的时候,有一个read的空行,是由于这在fchk文件中换行了的原因吗?

因为最近一直在跟着sob老师您写的程序练习编程(如Hess2freq,optDFTW等),这部分内容不是很了解,所以冒昧请教您。 感谢~
作者
Author:
sobereva    时间: 2017-9-11 21:00
让你变成回忆 发表于 2017-9-11 20:51
subroutine loclabel(fileid,label,ifound,irewind)
integer fileid,ierror
integer,optional :: ifoun ...

ifound判断有没有找到相应字符串,irewind用来决定是否做rewind。loclabel不是为了hess2freq专门写的,而是我写的各种程序中都会用到的一个子程序,比较通用。

loclabel将读取位置定位到含有某个字符串的行,如果要读的数据就在那一行,就不需要先read一下跳到下一行。
作者
Author:
让你变成回忆    时间: 2017-9-11 21:02
sobereva 发表于 2017-9-11 21:00
ifound判断有没有找到相应字符串,irewind用来决定是否做rewind。loclabel不是为了hess2freq专门写的,而 ...

对,我就是看您的很多程序中都有这样一样loclabel的子程序,所以想了解清楚点一下具体的过程。

大致懂了。

感谢sob老师的回答。谢谢~
作者
Author:
让你变成回忆    时间: 2018-4-20 20:53
让你变成回忆 发表于 2017-9-11 21:02
对,我就是看您的很多程序中都有这样一样loclabel的子程序,所以想了解清楚点一下具体的过程。

大致懂 ...

sob老师您好,再次请教您编程问题:
在您的程序中用到了showmatgau这个子程序。为什么不单独列成子程序来使用呢?而是在主程序中加入contains 后面接该子程序。
我尝试把这个子程序单独作为模板来使用,因为我觉得这样输出矩阵超级方便。但是我把这部分内容单独写为一个子程序,然后再去调用,就会出现问题,而向您那样放入主程序中,并在之前加入contains,就没有任何问题。
翻阅了一些书籍,没有找到相关的内容。恳求您再次解答。谢谢sob老师。
作者
Author:
sobereva    时间: 2018-4-21 07:57
让你变成回忆 发表于 2018-4-20 20:53
sob老师您好,再次请教您编程问题:
在您的程序中用到了showmatgau这个子程序。为什么不单独列成子程序 ...


只是为了当前这个小程序方便才这样写。

showmatgau本是Multiwfn程序里的子程序,是独立的。
作者
Author:
tiandikuoyuan    时间: 2021-7-24 21:37
老师,请问软件输出的Normal coordinates与Gaussian 输出文件中的normal coordinates是否是完全一致的呀,我发现部分数据正负相反,有些数据一致;比如说示例文件ethanol.out中                     19                     20                     21
                      A                      A                      A
Frequencies --   3276.7816              3289.0510              4114.6169
Red. masses --      1.1023                 1.1047                 1.0669
Frc consts  --      6.9734                 7.0412                10.6423
IR Inten    --     48.8354                53.7301                41.2114
Raman Activ --     63.3543                47.1572                95.0383
Depolar (P) --      0.7457                 0.7500                 0.3130
Depolar (U) --      0.8544                 0.8571                 0.4767
  Atom  AN      X      Y      Z        X      Y      Z        X      Y      Z
     1   6    -0.06  -0.07   0.00     0.00   0.00   0.09     0.00   0.00   0.00
     2   1     0.01   0.26  -0.39     0.03   0.41  -0.56     0.00   0.00   0.00
     3   1     0.64   0.36   0.00     0.00   0.00   0.01     0.00   0.00   0.00
     4   1     0.01   0.26   0.39    -0.03  -0.41  -0.56     0.00   0.00   0.00
     5   6     0.00  -0.01   0.00     0.00   0.00   0.02     0.00   0.00   0.00
     6   1     0.00   0.03  -0.04     0.00   0.06  -0.09     0.00   0.00   0.00
     7   1     0.00   0.03   0.04     0.00  -0.06  -0.09     0.00   0.00   0.00
     8   8     0.00   0.00   0.00     0.00   0.00   0.00     0.05  -0.04   0.00
     9   1     0.00   0.00   0.00     0.00   0.00   0.00    -0.79   0.61   0.00


Hess2freq软件输出的数据如下:
         19            20          21
1    -0.0553       -0.0000      0.0000
2    -0.0742       -0.0000     -0.0003
3     0.0000       -0.0926     -0.0000
4     0.0100       -0.0300      0.0003
5     0.2638       -0.4114     -0.0002
6    -0.3889        0.5599      0.0002
7     0.6428        0.0000      0.0012
8     0.3618        0.0000      0.0011
9     0.0000       -0.0144     -0.0000
10     0.0100        0.0300      0.0003
11     0.2638        0.4114     -0.0002
12     0.3889        0.5599     -0.0002
13    -0.0011       -0.0000      0.0005
14    -0.0061       -0.0000      0.0019
15     0.0000       -0.0156      0.0000
16     0.0012       -0.0002      0.0026
17     0.0307       -0.0635      0.0004
18    -0.0420        0.0883      0.0007
19     0.0012        0.0002      0.0026
20     0.0307        0.0635      0.0004
21     0.0420        0.0883     -0.0007
22     0.0004        0.0000     -0.0506
23     0.0003       -0.0000      0.0371
24    -0.0000        0.0003     -0.0000
25    -0.0001       -0.0000      0.7910
26     0.0013        0.0000     -0.6086
27     0.0000        0.0006      0.0000


我想通过这个软件将fchk文件转换成orca可识别的hess文件,发现三个文件中Normal coordinates都不完全一致,请问下是哪里存在问题吗?
Gaussian 水的数据:
                      1                      2                      3
                     A1                     A1                     B2
Frequencies --   1616.6354              3787.5994              3892.8460
Red. masses --      1.0838                 1.0441                 1.0826
Frc consts  --      1.6689                 8.8250                 9.6661
IR Inten    --     80.7528                 4.4711                44.1094
  Atom  AN      X      Y      Z        X      Y      Z        X      Y      Z
     1   8    -0.00  -0.00  -0.07     0.00   0.00   0.05    -0.00  -0.07   0.00
     2   1     0.00   0.42   0.57     0.00   0.59  -0.39     0.00   0.56  -0.43
     3   1     0.00  -0.42   0.57    -0.00  -0.59  -0.39     0.00   0.56   0.43


Hess2freq软件输出的数据如下:
************ Normal coordinates (columns) ************
             1             2             3
     1   -0.0000       -0.0000        0.0000
     2    0.0000       -0.0000       -0.0706
     3   -0.0712       -0.0492        0.0000
     4   -0.0000       -0.0000       -0.0000
     5    0.4220       -0.5886        0.5605
     6    0.5651        0.3903       -0.4282
     7    0.0000        0.0000       -0.0000
     8   -0.4220        0.5886        0.5605
     9    0.5651        0.3903        0.4282

orca 计算得到的out文件:
------------
NORMAL MODES
------------
These modes are the Cartesian displacements weighted by the diagonal matrix
M(i,i)=1/sqrt(m[i]) where m[i] is the mass of the displaced atom
Thus, these vectors are normalized but *not* orthogonal
                  6          7          8   
      0       0.000000   0.000000   0.000000
      1       0.000000   0.000000  -0.070639
      2       0.071235   0.049153   0.000000
      3       0.000000   0.000000   0.000000
      4      -0.421752   0.588752   0.560593
      5      -0.565321  -0.390079  -0.428068
      6       0.000000   0.000000   0.000000
      7       0.421752  -0.588754   0.560591
      8      -0.565321  -0.390080   0.428067


作者
Author:
wzkchem5    时间: 2021-7-24 21:50
tiandikuoyuan 发表于 2021-7-24 14:37
老师,请问软件输出的Normal coordinates与Gaussian 输出文件中的normal coordinates是否是完全一致的呀, ...

normal coordinates只有方向是有物理意义的,把整个normal coordinate矢量取负号,不改变任何物理可观测量。即使都是高斯做的计算,你把结构稍微扰动一下再做opt+freq,normal coordinate符号也会有变化。
作者
Author:
tiandikuoyuan    时间: 2021-7-25 10:23
wzkchem5 发表于 2021-7-24 21:50
normal coordinates只有方向是有物理意义的,把整个normal coordinate矢量取负号,不改变任何物理可观测 ...

明白了,谢谢
作者
Author:
Kalinite    时间: 2022-6-8 16:57
sob老师您好!
说明文档中提到:“Gaussian输出最终的振动频率前,会先从3N个频率中自动判断出整体平动和转动模式来,然后将它们对力常数矩阵的贡献投影掉使得振动频率更精确。”这里是如何判断整体平动转动模式的呢,是否也是和这个程序中一样去掉最小的六个。另外这里的投影可以给一下具体的数学表达吗?最近在做一些工作,想把一些笛卡尔坐标系下的矢量转换到内坐标下,对如何删除平动转动自由度感到很是困惑。

作者
Author:
wzkchem5    时间: 2022-6-8 18:08
Kalinite 发表于 2022-6-8 09:57
sob老师您好!
说明文档中提到:“Gaussian输出最终的振动频率前,会先从3N个频率中自动判断出整体平动和 ...

我不知道sob老师的做法是什么,但是一般量化程序的做法并不是对角化以后去掉最小的6个频率,而是先推导出平动和转动模式的解析形式,再把这些模式从Hessian里投影掉,然后对角化剩下的3N-6维的Hessian。这样的好处是假如有振动频率极其小的振动模式,不至于误把这个振动扔掉。
作者
Author:
Kalinite    时间: 2022-6-8 20:49
wzkchem5 发表于 2022-6-8 18:08
我不知道sob老师的做法是什么,但是一般量化程序的做法并不是对角化以后去掉最小的6个频率,而是先推导出 ...

请问您有关于“推导出平动和转动模式的解析形式”这方面的资料吗
作者
Author:
wzkchem5    时间: 2022-6-8 20:56
Kalinite 发表于 2022-6-8 13:49
请问您有关于“推导出平动和转动模式的解析形式”这方面的资料吗

没有,这个就是经典力学的内容,找一本力学教材看看刚体平动和转动的简正模怎么算就知道了
作者
Author:
sobereva    时间: 2022-6-9 07:38
Kalinite 发表于 2022-6-8 20:49
请问您有关于“推导出平动和转动模式的解析形式”这方面的资料吗

Gaussian有个官方文档Vibrational Analysis in Gaussian,里面有细节
作者
Author:
WaterMirror    时间: 2022-6-9 08:24
Gaussian官方文档Vibrational Analysis in Gaussian
作者
Author:
Kalinite    时间: 2022-6-9 13:27
感谢大家的帮助!
作者
Author:
王二葛    时间: 2022-6-10 11:41
推荐 ajz34 的讲解和代码
  1. 频率分析 (1):从 fchk 文件得到分子频率与简正模式
  2. https://ajz34.readthedocs.io/zh_CN/latest/QC_Notes/Freq_Series/freq_1.html
复制代码

另推荐他写的 python 实现双杂化泛函梯度教程,其中的量化入门部分很友好
  1. xDH 在 Python 下实现的简易教程
  2. https://py-xdh.readthedocs.io/
复制代码

作者
Author:
风起~    时间: 2022-6-10 11:49
王二葛 发表于 2022-6-10 11:41
推荐 ajz34 的讲解和代码

另推荐他写的 python 实现双杂化泛函梯度教程,其中的量化入门部分很友好

谢谢




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