EOM equations are solved using an iterative Davidson procedure. The procedure begins by generating guess vectors (usually, Koopmans-like guess) and then performs series of diagonalizations of the model Hamiltonian (Hbar) in the growing basis of the subspace vectors. The convergence is estimated using finite thresholds. The cost of the calculation is proportional to the number of roots requested (specified by EE_STATES, SF_STATES, etc) and increases for tighter convergence thresholds. In most cases the procedure is robust and converges smoothly with the default parameters. However, a diligent user should be aware of the following pitfalls:
- The procedure may miss a state. This is a relatively rare but possible even. The recommended solutions are (try them in the following order):
- Increase the number of guess vectors (EOM_NGUESS_SINGLES) while keeping the same number of roots.
- Use EOM_PRECONV_SINGLES option to find solutions in the subspace of single excitations and use them as a guess for the full procedure.
- Use tighter convergence (EOM_DAVIDSON_CONVERGENCE); this will increase the number of iterations.
- Increase the number of roots requested; this will increase the number of iterations and the cost.
- Another pitfall is possible loss of symmetry (permutational and spin) due to numeric noise. As a result, the procedure reports completely unphysical solutions with crazy energies. Good news is that they are easy to spot. If such behavior is observed, the entire calculation is suspect and needs to be redone. The red flags signalling potential issues with symmetry loss are:
- large number of iterations;
- sudden appearance of roots with much lower energies;
- ‘complex roots’ warnings.
To troubleshoot such behavior, follow the following steps:
- Increase EOM_DAVIDSON_MAXVECTORS (this always leads to faster and smoother convergence, but requires more disk space).
- Consider reducing the number of roots requested and loosening the convergence threshold.
- Start calculation using a larger number of guess vectors and possibly using preconverge option.
- In the case of core-level states (CVS-EOM), using CVS_EOM_SHIFT keyword provides a stabilizing effect.
We are working on solving this pesky problem in a more general way, so hopefully this post will soon become obsolete!