Dear Psi4 Experts,

I have been teaching a Computational Chemistry class using Psi4 (and hope to move couple of examples to Psi4Education soon) this quarter and for the most part it has worked out well. One topic that we are focusing more deeply is the efficiency of different geometry optimization methods, and in this context I was trying to probe the benefits of the ‘cart_hess_read true’ setting for efficiency (e.g. using a DF-MP2 Hessian for CCSD optimizations).

Let’s consider the case of a simple diatomic, CO (req near 1.1). I am intentionally (for teaching purposes) starting the geometry optimization at the region (r = 1.35) where second derivative is small but still positive (the inflection point is near 1.45) and SCF converges well. When I set ‘cart_hess_read false’ and ‘full_hess_every 0’, the minimization succeeds. With Newton-Raphson, the first step overshoots as expected, with RFO not so much and then BFGS corrects. All good!

But if I read in the previously computed Hessian from the disk with ‘cart_hess_read true’ (at the same HF level and at the same geometry), minimization fails as it oscillates back and forth around the minimum. The first step that will be taken is the Newton-Raphson step, this makes sense. But in the next step, the same wrong Hessian will be used again from the disk (unless I force Hessian recalculation with ‘full_hess_every 1’).

I am not sure if the Hessian never gets updated by BFGS here, or if it gets updated and then ignored because I have specified ‘cart_hess_read true’. The ‘full_hess_every -1’ or ‘full_hess_every 0’ does not seem to make difference. I feel that I am missing something and I admit I am not quite following what is happening in driver.py regarding this logic. Below is a pertinent input:

```
# understanding Hessian utilization in optimization
# Psi4 1.6a1 with oneMKL and libinit2.7 (5-4-3-6-5-4)
memory 2 GB
molecule {
0 1
C 0.000000 0.000000 0.000000
O 1.350000 0.000000 0.000000
}
set globals {
basis aug-cc-pvtz
scf_type df
}
set scf {
df_scf_guess true
e_convergence 1e-10
}
set hessian_write true
psi4.print_out("\n ~~~ HESSIAN at the HF/aug-cc-pVTZ level ~~~\n")
e_avtz, wfn_avtz = psi4.frequencies('scf', return_wfn=True)
set scf {
guess = read
}
set optking {
step_type nr
cart_hess_read true
print_opt_params true
print_trajectory_xyz_file true
full_hess_every -1
}
psi4.print_out("\n ~~~ OPTIMIZATION at the HF/aug-cc-pVTZ level ~~~\n")
optimize('scf')
```

So, my question is: is there a good way to read in a not-so-great Hessian computed beforehand at not-so-great geometry with the hope that it will accelerate the convergence if the search is started from that same not-so-great geometry (assuming that the Hessian is positive and large enough not to squish the atoms totally together in the first step.

P.S. This is with Psi4 1.6a1.dev155 as well as with older versions.

Thank you,

Kalju