A case that works
In my answer to Restarting an FCI calculation in PySCF, I provided a folder full of input and output files that demonstrates saving (as a numpy
array) a CI vector from a converged CISD calculation with a certain convergence tolerance, and using it as the starting point for a CISD calculation with a tighter convergence tolerance, can lead to convergence with the tighter convergence tolerance in fewer total Davidson iterations.
In particular, this is what it looks like when not using the above-described restrat procedure (I've removed the e
vectors that you would see in my original answer in order to make the max|de|
column more clear; and I've removed all lines that don't start with davidson
so that it's easier to see how max|de|
progresses):
davidson 0 3 |r|= 2.82 max|de|= 0.967 lindep= 0.321
davidson 1 6 |r|= 1.67 max|de|= -0.374 lindep= 0.795
davidson 2 9 |r|= 0.119 max|de|= -0.1 lindep= 0.935
davidson 3 12 |r|= 0.0309 max|de|= -0.00137 lindep= 0.798
davidson 4 15 |r|= 0.015 max|de|= -9.09e-05 lindep= 0.838
davidson 5 18 |r|= 0.00676 max|de|= -4.81e-05 lindep= 0.839
davidson 6 3 |r|= 0.00676 max|de|= -2e-15 lindep= 1
davidson 7 6 |r|= 0.00341 max|de|= -6.44e-06 lindep= 0.808
davidson 8 9 |r|= 0.00545 max|de|= -5.05e-06 lindep= 0.519
davidson 9 12 |r|= 0.0266 max|de|= -8.54e-05 lindep= 0.797
davidson 10 14 |r|= 0.0367 max|de|= -0.000247 lindep= 0.769
davidson 11 16 |r|= 0.0169 max|de|= -0.00023 lindep= 0.745
davidson 12 3 |r|= 0.0169 max|de|= 3.33e-15 lindep= 0.857
davidson 13 5 |r|= 0.0155 max|de|= -5.47e-05 lindep= 0.521
davidson 14 7 |r|= 0.0199 max|de|= -5e-05 lindep= 0.54
davidson 15 9 |r|= 0.0072 max|de|= -5.41e-05 lindep= 0.868
davidson 16 11 |r|= 0.00248 max|de|= -8.5e-06 lindep= 0.946
davidson 17 12 |r|= 0.00141 max|de|= -1.45e-06 lindep= 0.805
davidson 18 13 |r|= 0.00467 max|de|= -4.16e-06 lindep= 0.954
davidson 19 14 |r|= 0.0131 max|de|= -2.79e-05 lindep= 0.916
davidson 20 15 |r|= 0.0129 max|de|= -0.000103 lindep= 0.938
davidson 21 16 |r|= 0.00397 max|de|= -2.14e-05 lindep= 0.879
davidson 22 3 |r|= 0.00397 max|de|= 5.03e-12 lindep= 0.995
davidson 23 4 |r|= 0.00169 max|de|= -1.86e-06 lindep= 0.818
davidson 24 6 |r|= 0.000331 max|de|= -2.66e-07 lindep= 0.92
davidson 25 8 |r|= 9.6e-05 max|de|= -1.48e-08 lindep= 0.892
davidson 26 9 |r|= 4.79e-05 max|de|= -1.45e-09 lindep= 0.775
davidson 27 10 |r|= 9.55e-05 max|de|= -7.29e-10 lindep= 0.446
davidson 28 11 |r|= 0.00012 max|de|= -1.91e-09 lindep= 0.607
davidson 29 13 |r|= 0.000161 max|de|= -8.3e-09 lindep= 0.9
davidson 30 15 |r|= 0.000134 max|de|= -7.21e-09 lindep= 0.894
davidson 31 17 |r|= 9.8e-05 max|de|= -4.61e-09 lindep= 0.838
davidson 32 3 |r|= 9.79e-05 max|de|= 9.03e-09 lindep= 0.999
davidson 33 4 |r|= 9.76e-05 max|de|= -2.65e-09 lindep= 0.835
davidson 34 5 |r|= 6.05e-05 max|de|= -2.83e-09 lindep= 0.913
davidson 35 6 |r|= 3.02e-05 max|de|= -1e-09 lindep= 0.738
converged 36 7 |r|= 2.1e-05 max|de|= -1.36e-10
RCISD converged
This is what it looks like when I do the above with conv_tol=1e-5
instead of conv_tol=1e-9
(notice that until the davidson 16
line, the max|de|
values are almost identical to the above case):
davidson 0 3 |r|= 2.82 max|de|= 0.967 lindep= 0.321
davidson 1 6 |r|= 1.67 max|de|= -0.374 lindep= 0.795
davidson 2 9 |r|= 0.119 max|de|= -0.1 lindep= 0.935
davidson 3 12 |r|= 0.0309 max|de|= -0.00137 lindep= 0.798
davidson 4 15 |r|= 0.015 max|de|= -9.09e-05 lindep= 0.838
davidson 5 18 |r|= 0.00676 max|de|= -4.81e-05 lindep= 0.839
davidson 6 3 |r|= 0.00676 max|de|= -2e-15 lindep= 1
davidson 7 5 |r|= 0.00344 max|de|= -6.42e-06 lindep= 0.808
davidson 8 7 |r|= 0.00543 max|de|= -5.02e-06 lindep= 0.738
davidson 9 9 |r|= 0.0262 max|de|= -8.09e-05 lindep= 0.577
davidson 10 11 |r|= 0.0347 max|de|= -0.000254 lindep= 0.775
davidson 11 13 |r|= 0.0214 max|de|= -0.000281 lindep= 0.888
davidson 12 15 |r|= 0.0152 max|de|= -0.000131 lindep= 0.815
davidson 13 16 |r|= 0.0217 max|de|= -0.000125 lindep= 0.84
davidson 14 3 |r|= 0.0217 max|de|= 6e-15 lindep= 0.988
davidson 15 4 |r|= 0.00936 max|de|= -5.92e-05 lindep= 0.804
davidson 16 5 |r|= 0.00678 max|de|= -2.44e-05 lindep= 0.867
davidson 17 6 |r|= 0.00551 max|de|= -1.57e-05 lindep= 0.691
davidson 18 7 |r|= 0.00339 max|de|= -3.89e-06 lindep= 0.443
converged 19 8 |r|= 0.00132 max|de|= -8.5e-07
RCISD converged
This is what it looks like when restarting from the result directly above, and switching conv_tol
back to 1e-9
:
davidson 0 3 |r|= 0.00132 max|de|= 0.805 lindep= 0.816
davidson 1 6 |r|= 0.000962 max|de|= -2.48e-07 lindep= 0.506
davidson 2 9 |r|= 0.000859 max|de|= -1.32e-07 lindep= 0.63
davidson 3 11 |r|= 0.00165 max|de|= -3.75e-07 lindep= 0.796
davidson 4 13 |r|= 0.00418 max|de|= -3.88e-06 lindep= 0.939
davidson 5 14 |r|= 0.00519 max|de|= -1.15e-05 lindep= 0.892
davidson 6 15 |r|= 0.00117 max|de|= -4.14e-06 lindep= 0.914
davidson 7 16 |r|= 0.00041 max|de|= -1.66e-07 lindep= 0.775
davidson 8 3 |r|= 0.00041 max|de|= 9.11e-11 lindep= 0.999
davidson 9 4 |r|= 0.000371 max|de|= -3.54e-08 lindep= 0.692
davidson 10 5 |r|= 0.000219 max|de|= -4.39e-08 lindep= 0.929
davidson 11 6 |r|= 7.38e-05 max|de|= -7.99e-09 lindep= 0.781
converged 12 7 |r|= 3.04e-05 max|de|= -7.2e-10
RCISD converged
A case that does not work
The following input file:
#!/usr/bin/env python
# Author: Nike Dattani, [email protected]
import numpy as np
import pyscf
from pyscf.gto.basis import parse_gaussian
from pyscf import gto, scf, ao2mo, fci, ci
mol = pyscf.M(
atom = 'H 0 0 0; H 0 0 1.4011',
unit = 'bohr',
basis = {
'H' : parse_gaussian.load('/home/nike/AI_ENERGIES/H/av6z.gbs', 'H')
},
charge = 0,
spin = 0,
verbose = 9,
symmetry = True,
symmetry_subgroup = 'Dooh',
)
#####################
## Hartree-Fock:
#####################
mf = mol.RHF().set(conv_tol=1e-10,max_cycle=999,direct_scf_tol=1e-14,chkfile = 'a6z.chk')
#mf.init_guess='atom'
#mf.init_guess='a10z.chk'
mf.kernel()
#####################
## post-Hartree-Fock:
#####################
mci = ci.CISD(mf).set(conv_tol=1e-5,max_cycle=999,nroots=27)
#mci.direct = True
e, civec = mci.kernel()
#e, civec = mci.kernel(ci0=np.load('civec.npy'))
np.save('civec.npy', civec)
#####################
## END OF INPUT
#####################
gives the following output (again with the e
vectors removed and alignment adjustments so that the output is easier to raed):
davidson 0 27 |r|= 0.306 max|de|= 1.28 lindep= 0.317
davidson 1 54 |r|= 0.228 max|de|= -0.0578 lindep= 0.237
davidson 2 81 |r|= 0.361 max|de|= -0.041 lindep= 0.656
davidson 3 27 |r|= 0.361 max|de|= -1.16e-09 lindep= 0.723
davidson 4 54 |r|= 0.353 max|de|= -0.0399 lindep= 0.333
davidson 5 81 |r|= 0.332 max|de|= -0.0695 lindep= 0.355
davidson 6 27 |r|= 0.332 max|de|= -2.87e-08 lindep= 0.474
davidson 7 36 |r|= 0.251 max|de|= -0.0333 lindep= 0.362
davidson 8 43 |r|= 0.133 max|de|= -0.0115 lindep= 0.707
davidson 9 49 |r|= 0.0693 max|de|= -0.00816 lindep= 0.855
davidson 10 51 |r|= 0.0425 max|de|= -0.00192 lindep= 0.734
davidson 11 53 |r|= 0.0214 max|de|= -0.000329 lindep= 0.813
davidson 12 55 |r|= 0.0119 max|de|= -0.000104 lindep= 0.792
davidson 13 57 |r|= 0.00687 max|de|= -3.89e-05 lindep= 0.69
davidson 14 58 |r|= 0.00315 max|de|= -1.09e-05 lindep= 0.791
converged 15 59 |r|= 0.00244 max|de|= -2.53e-06
RCISD converged
When I "restart" this calculation with a smaller conv_tol
value and using the civec.npy
file from the previous calculation:
mci = ci.CISD(mf).set(conv_tol=1e-6,max_cycle=999,nroots=28)
e, civec = mci.kernel(ci0=np.load('civec.npy'))
I get results that are significantly worse:
davidson 0 27 |r|= 0.00244 max|de|= 1.02 lindep= 0.809
davidson 1 54 |r|= 3.26 max|de|= -0.0404 lindep= 0.694
davidson 2 66 |r|= 0.523 max|de|= -0.953 lindep= 0.278
davidson 3 28 |r|= 0.48 max|de|= -0.0422 lindep= 0.198
davidson 4 34 |r|= 0.178 max|de|= -0.032 lindep= 0.111
davidson 5 40 |r|= 1.07 max|de|= 0.11 lindep= 0.0356
davidson 6 46 |r|= 0.224 max|de|= -0.148 lindep= 0.00736
davidson 7 52 |r|= 1.55 max|de|= 0.614 lindep= 0.00343
davidson 8 59 |r|= 0.383 max|de|= -0.481 lindep= 0.000585
davidson 9 66 |r|= 1.43 max|de|= 0.481 lindep= 0.000675
davidson 10 28 |r|= 1.26 max|de|= 0.0416 lindep= 0.225
davidson 11 38 |r|= 0.183 max|de|= -0.0698 lindep= 0.0414
davidson 12 47 |r|= 1.3 max|de|= 0.76 lindep= 0.0137
davidson 13 57 |r|= 0.506 max|de|= -0.775 lindep= 0.00197
davidson 14 67 |r|= 0.335 max|de|= -0.0292 lindep= 0.00103
davidson 15 28 |r|= 0.213 max|de|= 0.055 lindep= 0.138
davidson 16 38 |r|= 0.72 max|de|= -0.0243 lindep= 0.0141
davidson 17 49 |r|= 0.286 max|de|= -0.184 lindep= 0.00154
davidson 18 60 |r|= 0.274 max|de|= -0.00263 lindep= 0.00017
davidson 19 71 |r|= 0.815 max|de|= 0.308 lindep= 7.68e-05
davidson 20 28 |r|= 0.815 max|de|= 0.0582 lindep= 0.128
davidson 21 41 |r|= 0.813 max|de|= -0.206 lindep= 0.0214
davidson 22 55 |r|= 1.17 max|de|= 0.165 lindep= 0.00475
davidson 23 70 |r|= 1.23 max|de|= -0.415 lindep= 0.00107
davidson 24 28 |r|= 1.3 max|de|= 0.0979 lindep= 0.123
davidson 25 44 |r|= 1.09 max|de|= -0.403 lindep= 0.00725
davidson 26 60 |r|= 1.24 max|de|= 0.401 lindep= 0.000936
davidson 27 77 |r|= 1.22 max|de|= -0.669 lindep= 0.00155
davidson 28 28 |r|= 1.22 max|de|= 0.291 lindep= 0.143
davidson 29 46 |r|= 1.51 max|de|= -0.406 lindep= 0.00606
davidson 30 66 |r|= 0.774 max|de|= -0.409 lindep= 0.0109
davidson 31 28 |r|= 0.628 max|de|= 0.122 lindep= 0.118
davidson 32 49 |r|= 0.73 max|de|= -0.107 lindep= 0.0052
davidson 33 71 |r|= 0.944 max|de|= 0.227 lindep= 0.000678
davidson 34 28 |r|= 0.955 max|de|= 0.181 lindep= 0.126
davidson 35 50 |r|= 0.907 max|de|= -0.216 lindep= 0.00234
davidson 36 68 |r|= 0.534 max|de|= -0.145 lindep= 0.000781
davidson 37 28 |r|= 0.391 max|de|= 0.0416 lindep= 0.0934
davidson 38 51 |r|= 0.896 max|de|= 0.0729 lindep= 0.00274
davidson 39 72 |r|= 1.05 max|de|= 0.261 lindep= 0.000494
davidson 40 28 |r|= 1.04 max|de|= -0.145 lindep= 0.132
davidson 41 54 |r|= 0.872 max|de|= -0.328 lindep= 0.00481
davidson 42 72 |r|= 1.2 max|de|= 0.265 lindep= 0.000577
davidson 43 28 |r|= 1.2 max|de|= 0.113 lindep= 0.123
davidson 44 56 |r|= 0.926 max|de|= -0.246 lindep= 0.00102
davidson 45 74 |r|= 0.515 max|de|= -0.244 lindep= 0.000294
davidson 46 28 |r|= 0.323 max|de|= 0.0482 lindep= 0.156
davidson 47 54 |r|= 0.15 max|de|= -0.0714 lindep= 0.0188
davidson 48 71 |r|= 0.39 max|de|= 0.00182 lindep= 0.00268
davidson 49 28 |r|= 0.398 max|de|= 0.0692 lindep= 0.123
davidson 50 54 |r|= 0.682 max|de|= -0.0383 lindep= 0.00184
davidson 51 66 |r|= 0.535 max|de|= -0.121 lindep= 0.000584
davidson 52 28 |r|= 0.522 max|de|= 0.0788 lindep= 0.217
davidson 53 52 |r|= 0.477 max|de|= -0.0799 lindep= 0.0475
davidson 54 65 |r|= 0.282 max|de|= -0.0426 lindep= 0.00548
davidson 55 75 |r|= 0.313 max|de|= -0.0138 lindep= 0.00125
davidson 56 28 |r|= 0.286 max|de|= 0.078 lindep= 0.183
davidson 57 50 |r|= 0.773 max|de|= -0.0439 lindep= 0.00725
davidson 58 65 |r|= 0.511 max|de|= -0.13 lindep= 0.00639
davidson 59 80 |r|= 0.561 max|de|= -0.0389 lindep= 0.00332
davidson 60 28 |r|= 0.436 max|de|= 0.139 lindep= 0.226
davidson 61 53 |r|= 0.7 max|de|= -0.0786 lindep= 0.295
davidson 62 70 |r|= 0.467 max|de|= -0.112 lindep= 0.0113
davidson 63 28 |r|= 0.411 max|de|= 0.131 lindep= 0.231
davidson 64 53 |r|= 0.593 max|de|= -0.0579 lindep= 0.06
davidson 65 71 |r|= 0.579 max|de|= -0.0811 lindep= 0.0167
davidson 66 28 |r|= 0.41 max|de|= 0.156 lindep= 0.221
davidson 67 56 |r|= 0.561 max|de|= -0.0616 lindep= 0.0926
davidson 68 76 |r|= 0.521 max|de|= -0.0812 lindep= 0.0288
It continued like that until the calculation job timed out after davidson 608
:
davidson 601 56 |r|= 0.419 max|de|= -0.0211 lindep= 0.0172
davidson 602 83 |r|= 0.37 max|de|= -0.13 lindep= 0.0116
davidson 603 28 |r|= 0.306 max|de|= 0.0743 lindep= 0.224
davidson 604 56 |r|= 0.402 max|de|= -0.0317 lindep= 0.0255
davidson 605 79 |r|= 0.35 max|de|= -0.0622 lindep= 0.0292
davidson 606 28 |r|= 0.271 max|de|= 0.0528 lindep= 0.222
davidson 607 56 |r|= 0.427 max|de|= -0.0196 lindep= 0.0186
davidson 608 81 |r|= 0.405 max|de|= -0.0856 lindep= 0.0531
It's good to see that the |r|
values match:
converged 15 59 |r|= 0.00244 max|de|= -2.53e-06
davidson 0 27 |r|= 0.00244 max|de|= 1.02 lindep= 0.809
However, the max|de|
value for the davidson 0
in the "restarted" calculation is closer to what we had at the beginning of the first calculation:
davidson 0 27 |r|= 0.306 max|de|= 1.28 lindep= 0.317
In the "restarted" calculation, the |r|
value gets bad at davidson 1
and the max|de|
and lindep
values go bad very soon after.
Question
Why is the restart not working in the second case, like it did for the first case?