So you optimized your molecule, you found all real frequencies, you’re done! right? Well, maybe not. When molecules are well-behaved you probably can either use a restricted or an unrestricted method to find the optimized wavefunction and derive as many properties as you want from it; this occurs for most organic molecules and to some extent to main group elements with little to no radical character. But from time to time, it just so occurs that the wavefunction stemming from your calculation is not the most appropriate to describe your electronic structure. This analysis allows you to quickly check for the wavefunction stability regarding various constraints like allowing a restricted wavefunction to become unrestricted, or allowing orbitals to become complex. In fact, vibrational analysis are only valid if the wavefunction is stable.
Molecules with a biradical character yield instabilities from restricted calculations, also molecules with a triplet nature can show instabilities when calculated at the singlet multiplicity, finally molecules with a multireference character show these instabilities. Therefore, it is important to check the stability of our calculated wavefunctions to fully understand the nature of our molecules.
Let’s take the textbook example of O2, we already know it’s a triplet in the ground state but for the sake of demonstration pretend it’s just another unknown molecule.
I ran a CCSD(T)/aug-cc-pVTZ optimization for the singlet state:
%chk=o2_sing.chk
#p opt ccsd(t)/aug-cc-pvtz freq=noraman
title
0 1
O
O 1 b1
b1 1.2100
By the way, you need to use a Z-matrix with no more than 50 variables in order for the optimization to carry, otherwise you get the error below, and they need to be variables, it doesn’t work if you place values directly in the Z-matrix.
************************************************ ** ERROR IN INITNF. NUMBER OF VARIABLES ( 0) ** ** INCORRECT (SHOULD BE BETWEEN 1 AND 50) ** ************************************************
From this calculation we get a single real frequency, which could lead us to believe we’re done and ready to calculate further properties. But let’s check the stability of the obtained wavefunction in a second calculation reading it from the checkpoint (we can also make a two step job with the –Link1– option):
%chk=o2_sing.chk #p geom=allcheck stable guess=read ccsd(t)/aug-cc-pvtz
Be careful NOT to use the stable keyword in your first job, otherwise you’ll analyze the stability of the guess (which is the Harris guess in Gaussian16 by default) and not the final optimized wavefunction.
The output for the wavefunction stability looks as follows:
***********************************************************************
Stability analysis using <AA,BB:AA,BB> singles matrix:
***********************************************************************
1PDM for each excited state written to RWF 633
Ground to excited state transition densities written to RWF 633
Eigenvectors of the stability matrix:
Excited state symmetry could not be determined.
Eigenvector 1: Triplet-?Sym Eigenvalue=-0.1434007 <S**2>=2.000
7 -> 9 0.67311
7 -> 16 -0.16817
Excited state symmetry could not be determined.
Eigenvector 2: Triplet-?Sym Eigenvalue=-0.1130283 <S**2>=2.000
8 -> 9 0.67626
8 -> 16 -0.15201
Excited state symmetry could not be determined.
Eigenvector 3: Singlet-?Sym Eigenvalue= 0.0000259 <S**2>=0.000
8 -> 9 0.68638
8 -> 16 -0.13611
Excited state symmetry could not be determined.
Eigenvector 4: Triplet-?Sym Eigenvalue= 0.0778065 <S**2>=2.000
6 -> 9 0.63124
6 -> 16 -0.14471
7 -> 18 -0.21927
Excited state symmetry could not be determined.
Eigenvector 5: Singlet-?Sym Eigenvalue= 0.2344834 <S**2>=0.000
6 -> 9 0.64723
6 -> 16 -0.13339
7 -> 18 -0.19466
Excited state symmetry could not be determined.
Eigenvector 6: Singlet-?Sym Eigenvalue= 0.2612342 <S**2>=0.000
6 -> 17 -0.10327
6 -> 18 0.26839
7 -> 9 0.59483
7 -> 16 -0.10098
8 -> 13 0.13453
The wavefunction has an RHF -> UHF instability.
As we can see, the first section shows a couple of transitions with negative energy to a triplet, which has no physical meaning, but it hints to the possibility of having a triplet wavefunction more stable than the singlet one being analyzed, however further calculations are required to confirm it. The final message reads: “There is a RHF -> UHF instability”, from which, at this point, we can conclude that the restricted version of the employed method is not the best option for the molecule at hand. From here we can take a few directions: changing the multiplicity state to a triplet, or using a Restricted Open shell (RO) method, which keeps as many electrons paired as possible. Keeping the multiplicity state but changing to an unrestricted method makes no difference. So, let’s repeat the process for O2, but lets change the multiplicity state to a triplet from a singlet (for comparison, the following input is divided in two jobs in one file).
%chk=o2_trip.chk
%nprocshared=12
#p opt ccsd(t)/aug-cc-pvtz freq=noraman
title
0 3
O
O 1 b1
b1 1.2100
--Link1--
%chk=o2_trip.chk
#p geom=allcheck guess=read stable ccsd(t)/aug-cc-pvtz
Now, in the output we get the following information in the stability section
***********************************************************************
Stability analysis using <AA,BB:AA,BB> singles matrix:
***********************************************************************
1PDM for each excited state written to RWF 633
Ground to excited state transition densities written to RWF 633
Eigenvectors of the stability matrix:
Excited state symmetry could not be determined.
Eigenvector 1: 3.026-?Sym Eigenvalue= 0.0219147 <S**2>=2.039
6B -> 8B -0.63956
6B -> 16B 0.27195
7B -> 9B 0.63956
7B -> 15B -0.27195
Excited state symmetry could not be determined.
Eigenvector 2: 3.026-?Sym Eigenvalue= 0.0219147 <S**2>=2.039
6B -> 9B 0.63956
6B -> 15B -0.27195
7B -> 8B 0.63956
7B -> 16B -0.27195
Eigenvector 3: 3.063-SGU Eigenvalue= 0.1798098 <S**2>=2.096
7A -> 17A -0.12571
7A -> 18A 0.30869
7A -> 32A -0.11437
8A -> 12A 0.11528
8A -> 29A 0.11204
9A -> 13A 0.11528
9A -> 30A 0.11204
5B -> 18B 0.14816
6B -> 8B 0.56463
6B -> 16B -0.22315
7B -> 9B 0.56463
7B -> 15B -0.22315
The wavefunction is stable under the perturbations considered.
We see that now the resulting wavefunction is stable! Now the energy for the triplet calculation is 55.81 kcal/mol lower than for the singlet state.
Sometimes, using guess=mix is required to find broken symmetry solutions for biradical molecules, because the SCF in Gaussian will try to land a restricted or unrestricted guess from the start. There are several options in the use of the stable keyword but perhaps the most useful is guess=opt which reoptimizes the wavefunction if an instability is found.

Florent Louis pointed out to me that for HNO, which has a perfectly obvious Lewis electron dot structure that obeys the octet rule, the spin-restricted singlet is not the most stable wavefunction. Instead, it needs a spin-unrestricted wavefunction. While I used to (have my students) routinely check wavefunction stability for radicals and TSs, we now check with everything.
I think it’s a good practice, and easy to carry too, specially when you know very little about your molecule and start exploring it.
Thanks for your comment
Hi Joaquin, first of all, congratulations for the blog which I read quite often.
I have a puzzling WF stability problem with a [YbL3]3- complex (multiplicity 2) where L is a chelate ligand. I am doing DFT calculations with Stuttgart basis set + ECP for Yb. The thing is that, depending on the functional, the WF is either stable or not. Even stranger, when it is NOT stable, the stable=opt calcualiton produces a weird output:
———————-
Eigenvector 1: 2.003-?Sym Eigenvalue=-0.0321849
=0.753The wavefunction has an internal instability.
[…]
Eigenvector 1: 2.002-?Sym Eigenvalue= 0.0005408
=0.752The wavefunction is stable under the perturbations considered.
———————-
Do you have any hint on what’s going on here?
Thanks,
Rino Pescitelli
Hi Rino,
Thank you for your kind words about the blog, I’m glad you find it useful.
Getting different results from different functionals is absolutely normal, in the end the wavefunction you obtain corresponds to the electron density, which in turn was obtained so as to minimize the energy under a given functional, so nothing strange there.
Now, using stable=opt will try to optimize the wavefunction if it turns out to be unstable. So, on the first part of your calculation it finds an instability (look the sign of the eigenvalue, it’s negative indicating that the perturbation leads to a lower energy, think of it as an electronic transition to a lower level than the ground state); but in the second part the sign is positive, meaning the new wavefunction is a low energy solution.
I hope this helps!
HI Joaquin, thank you for your reply. The question is, how can identify the stable WF found above to start from it for, say, a TD calculation?
Sorry, the comment above is partially strikethrough, I don’t know the reason!