Harmonic Vibrational Analysis and Visualization of Normal Modes — frequency()
and hessian()
¶
For further discussion of vibrational and thermochemical analysis, see Sec. Vibrational and Thermochemical Analysis.
frequency()
is the only command most users will ever
need to access directly to perform frequency calculations. Behind
the scenes, frequency()
is a light wrapper over
hessian()
that computes the Hessian then adds a
thermochemical analysis.
-
psi4.
frequency
(name[, molecule, return_wfn, func, mode, dertype, irrep])[source]¶ Function to compute harmonic vibrational frequencies.
Aliases: frequencies(), freq()
Returns: float – Total electronic energy in Hartrees.
Returns: (float,
Wavefunction
) – energy and wavefunction when return_wfn specified.Parameters: - name (string) –
'scf'
||'mp2'
||'ci5'
|| etc.First argument, usually unlabeled. Indicates the computational method to be applied to the system.
- molecule (molecule) –
h2o
|| etc.The target molecule, if not the last molecule defined.
- return_wfn (boolean) –
'on'
|| \(\Rightarrow\)'off'
\(\Leftarrow\)Indicate to additionally return the
Wavefunction
calculation result as the second element (after float energy) of a tuple. Arrays of frequencies and the Hessian can be accessed through the wavefunction. - func (function) –
\(\Rightarrow\)
gradient
\(\Leftarrow\) ||energy
||cbs
Indicates the type of calculation to be performed on the molecule. The default dertype accesses
'gradient'
or'energy'
, while'cbs'
performs a multistage finite difference calculation. If a nested series of python functions is intended (see Function Intercalls), use keywordfreq_func
instead offunc
. - mode (string) –
\(\Rightarrow\)
'continuous'
\(\Leftarrow\) ||'sow'
||'reap'
For a finite difference of energies or gradients frequency, indicates whether the calculations required to complete the frequency are to be run in one file (
'continuous'
) or are to be farmed out in an embarrassingly parallel fashion ('sow'
/'reap'
)/ For the latter, run an initial job with'sow'
and follow instructions in its output file. For maximum flexibility,return_wfn
is always on in'reap'
mode. - dertype (dertype) –
\(\Rightarrow\)
'hessian'
\(\Leftarrow\) ||'gradient'
||'energy'
Indicates whether analytic (if available- they’re not), finite difference of gradients (if available) or finite difference of energies is to be performed.
- irrep (int or string) –
\(\Rightarrow\)
-1
\(\Leftarrow\) ||1
||'b2'
||'App'
|| etc.Indicates which symmetry block (Cotton ordering) of vibrational frequencies to be computed.
1
,'1'
, or'a1'
represents \(a_1\), requesting only the totally symmetric modes.-1
indicates a full frequency calculation.
Note
Analytic hessians are only available for RHF. For all other methods, Frequencies will proceed through finite differences according to availability of gradients or energies.
name calls method scf Hartree–Fock (HF) [manual] Examples: 1 2
>>> # [1] Frequency calculation for all modes through highest available derivatives >>> frequency('ccsd')
1 2 3 4 5
>>> # [2] Frequency calculation for b2 modes through finite difference of gradients >>> # printing lowest mode frequency to screen and Hessian to output >>> E, wfn = frequencies('scf', dertype=1, irrep=4, return_wfn=True) >>> print wfn.frequencies().get(0, 0) >>> wfn.hessian().print_out()
1 2 3 4 5
>>> # [3] Frequency calculation at default conditions and Hessian reuse at STP >>> E, wfn = freq('mp2', return_wfn=True) >>> set t 273.15 >>> set p 100000 >>> thermo(wfn, wfn.frequencies())
1 2 3
>>> # [4] Opt+Freq, skipping the gradient recalc at the start of the Hessian >>> e, wfn = optimize('hf', return_wfn=True) >>> frequencies('hf', ref_gradient=wfn.gradient())
- name (string) –
-
psi4.
hessian
(name[, molecule, return_wfn, func, dertype, irrep])[source]¶ Function complementary to
frequency()
. Computes force constants, deciding analytic, finite difference of gradients, or finite difference of energies.Returns: Matrix
– Total non-mass-weighted electronic Hessian in Hartrees/Bohr/Bohr.Returns: ( Matrix
,Wavefunction
) – Hessian and wavefunction when return_wfn specified.Examples: 1 2
>>> # [1] Frequency calculation without thermochemical analysis >>> hessian('mp3')
1 2 3 4 5 6
>>> # [2] Frequency calc w/o thermo analysis getting the Hessian >>> # in file, core.Matrix, and np.array forms >>> set hessian_write on >>> H, wfn = hessian('ccsd', return_wfn=True) >>> wfn.hessian().print_out() >>> np.array(H)
It’s handy to collect the wavefunction after a frequency
calculation through e, wfn = psi4.frequency(...,
return_wfn=True)
as the frequencies can be accessed through
psi4.core.Wavefunction.frequencies()
, the Hessian through
psi4.core.Wavefunction.hessian()
, and much other computation
info through psi4.core.Wavefunction.frequency_analysis
(note no parentheses). Examples of using this data
structure can be found fd-freq-gradient and
python/vibanalysis. Formatted printing of vibrational
results is available through qcdb.vib.print_vibs()
.
key | description (lbl & comment) | units | data (real/imaginary modes) |
---|---|---|---|
omega | frequency | cm^-1 | nd.array(ndof) complex (real/imag) |
q | normal mode, normalized mass-weighted | a0 u^1/2 | ndarray(ndof, ndof) float |
w | normal mode, un-mass-weighted | a0 | ndarray(ndof, ndof) float |
x | normal mode, normalized un-mass-weighted | a0 | ndarray(ndof, ndof) float |
degeneracy | degree of degeneracy | ndarray(ndof) int | |
TRV | translation/rotation/vibration | ndarray(ndof) str ‘TR’ or ‘V’ or ‘-‘ for partial | |
gamma | irreducible representation | ndarray(ndof) str irrep or None if unclassifiable | |
mu | reduced mass | u | ndarray(ndof) float (+/+) |
k | force constant | mDyne/A | ndarray(ndof) float (+/-) |
DQ0 | RMS deviation v=0 | a0 u^1/2 | ndarray(ndof) float (+/0) |
Qtp0 | Turning point v=0 | a0 u^1/2 | ndarray(ndof) float (+/0) |
Xtp0 | Turning point v=0 | a0 | ndarray(ndof) float (+/0) |
theta_vib | char temp | K | ndarray(ndof) float (+/0) |
Visualization of Normal Modes¶
PSI4 has the ability to export a Molden file that stores information about
the harmonic frequencies and normal modes computed via frequency()
.
This feature can be enabled by setting the option NORMAL_MODES_WRITE to true.
The filename of the Molden file ends in .molden_normal_modes
, and the prefix is
determined by WRITER_FILE_LABEL (if set), or else by the name of the
output file plus the name of the current molecule.
The normal coordinates saved in the Molden file are normalized and are not
mass weighted.
Molden Interface Keywords¶
NORMAL_MODES_WRITE¶
Do write a file containing the normal modes in Molden format? If so, the filename will end in .molden_normal_modes, and the prefix is determined by WRITER_FILE_LABEL (if set), or else by the name of the output file plus the name of the current molecule.
- Type: boolean
- Default: false
WRITER_FILE_LABEL¶
Base filename for text files written by PSI, such as the MOLDEN output file, the Hessian file, the internal coordinate file, etc. Use the add_str_i function to make this string case sensitive.
- Type: string
- Default: No Default