Navigation:

Bugs

Units in SAPT(DFT) output

The output correctly converts to mH and kcal/mol, but does not convert to kJ/mol. To fix this edit the file

  lib/psi4/driver/procrouting/sapt/sapt_util.py

to make the change to constants.hartree2kJmol:

sapt_util.py (fragment)

def print_sapt_var(name, value, short=False, start_spacer="    "):
    """
    Converts the incoming value as hartree to a correctly formatted Psi print format.
    """

    vals = (name, value * 1000, value * constants.hartree2kcalmol, value * constants.hartree2kJmol)
    if short:
        return start_spacer + "%-20s % 15.8f [mEh]" % vals[:2]
    else:
        return start_spacer + "%-20s % 15.8f [mEh] % 15.8f [kcal/mol] % 15.8f [kJ/mol]" % vals

Cannot use GGAs

The SAPT(DFT) module works correctly when the default, PBE0, functional is used. But when this is changed to a GGA like PBE it fails with the error message:

   => Auxiliary Basis Set <=

  Basis Set: ANONYMOUS400E6A7D
    Blend: AUG-CC-PVDZ-JKFIT + MB-SET-RI
    Number of shells: 478
    Number of basis function: 1452
    Number of Cartesian functions: 1697
    Spherical Harmonics?: true
    Max angular momentum: 4


Traceback (most recent call last):
  File "/home/alston/Psi4/install/1.2-gcc/bin/psi4", line 259, in <module>
    exec(content)
  File "<string>", line 71, in <module>
  File "/home/alston/Psi4/install/1.2-gcc/lib//psi4/driver/driver.py", line 460, in energy
    wfn = procedures['energy'][lowername](lowername, molecule=molecule, '''kwargs)
  File "/home/alston/Psi4/install/1.2-gcc/lib//psi4/driver/procrouting/sapt/sapt_proc.py", line 234, in run_sapt_dft
    cache = sapt_jk_terms.build_sapt_jk_cache(wfn_A, wfn_B, sapt_jk, True)
  File "/home/alston/Psi4/install/1.2-gcc/lib//psi4/driver/procrouting/sapt/sapt_jk_terms.py", line 108, in build_sapt_jk_cache
    cache["K_A"] = jk.K()[0].clone()

IndexError: list index out of range

'''* Psi4 encountered an error. Buy a developer more coffee!
'''* Resources and help at github.com/psi4/psi4.

The PBE functional can be selected using:

set {
  scf_type  df
  sapt_dft_functional     PBE
  sapt_dft_do_dHF         False
  sapt_dft_grac_shift_a   0.12589
  sapt_dft_grac_shift_b   0.12589
}

The problem seems to be in Psi4/install/1.2-gcc/lib/psi4/driver/procrouting/sapt/sapt_jk_terms.py:

sapt_jk_terms.py

    # J and K matrices
    jk.C_clear()

    # Normal J/K for Monomer A
    jk.C_left_add(wfn_A.Ca_subset("SO", "OCC"))
    jk.C_right_add(wfn_A.Ca_subset("SO", "OCC"))

    # Normal J/K for Monomer B
    jk.C_left_add(wfn_B.Ca_subset("SO", "OCC"))
    jk.C_right_add(wfn_B.Ca_subset("SO", "OCC"))

    # K_O J/K
    C_O_A = core.Matrix.triplet(
        cache["D_B"], cache["S"], cache["Cocc_A"], False, False, False)
    jk.C_left_add(C_O_A)
    jk.C_right_add(cache["Cocc_A"])

    jk.compute()

    # Clone them as the JK object will overwrite.
    cache["J_A"] = jk.J()[0].clone()
    cache["K_A"] = jk.K()[0].clone()

    cache["J_B"] = jk.J()[1].clone()
    cache["K_B"] = jk.K()[1].clone()

If a GGA is used, then the exchange matrices are not created so the clone operations on jk.K() fail.

Important

15-03-18

This bug has been fixed by Daniel. Version 1.1-938-gfc51d9a (current master on github) works with GGAs.

SAPT(DFT) not possible without Asymptotic correction

Curiously, SAPT(DFT) calculations are not possible without the asymptotic correction. In Psi4/install/1.2-gcc/lib/psi4/driver/procrouting/sapt/sapt_proc.py we have the lines:

sapt_proc.py

    if (sapt_dft_functional != "HF") and ((mon_a_shift == 0.0) or (mon_b_shift == 0.0)):
        raise ValidationError('SAPT(DFT): must set both "SAPT_DFT_GRAC_SHIFT_A" and "B".')

    if (core.get_option('SCF', 'REFERENCE') != 'RHF'):
        raise ValidationError('SAPT(DFT) currently only supports restricted references.')

This needs to be changed as it should be possible to switch off the AC completely.

Testing Psi4

SAPT(DFT)

Currently, Psi4 can perform SAPT(DFT) calculations only with the ALDA kernel. This is the biggest limitation of the code. The following are the features of Psi4 1.2:

Questions to be answered:

Accuracy: PBE0+(GRAC/LB94) + ALDA

Water dimers

Data from molecules/water/induction-damping/2017-ISA-ISApol-noS2/saptdft/aTZ-MC+/PBE0-GRLB/

water2_900

water2_907

Energy

Ref(1)

Psi4(1)

Psi4(2)

Ref(1)

Psi4(1)

Psi4(2)

$E||{(1)}_{\rm elst}$

-160.995

-160.459

-162.198

-28.934

-28.814

-28.317

$E||{(1)}_{\rm exch}$

378.326

376.891

392.954

25.311

24.687

26.413

$E||{(2)}_{\rm IND}$

-44.758

-71.218

-73.479

-4.474

-4.606

-4.654

$E||{(2)}_{\rm ind}$

-217.284

-215.744

-230.843

-11.054

-10.782

-11.348

$E||{(2)}_{\rm ind,exch}$

172.526

144.526

157.364

6.580

6.176

6.693

$E||{(2)}_{\rm DISP}$

-44.617

-36.794

-38.893

-8.521

-7.409

-8.324

$E||{(2)}_{\rm int}$

127.955

108.419

118.383

-16.619

-16.143

-14.882

$\delta||{\rm HF}_{\rm int}$

-56.708

-35.685

-35.685

-2.931

-2.864

-2.864

$E||{(2)}_{\rm int}+\delta||{\rm HF}_{\rm int}$

71.246

72.734

82.698

-19.550

-19.008

-17.747

Q: How does PBE/ALDA fare (Psi4(2))?

Pyridine dimers

Data from: /home/alston/molecules/pyridine/scans/dimers_from_Model3_noS2/Min1-Hb1/aDZMb3-MC+/psi4

Hb1_5 aDZ+Mb3

Energy

Ref(1)

Ref(2)

Psi4-PBE0

Psi4-PBE

$E||{(1)}_{\rm elst}$

-20.5598

-20.5598

-20.9766

-20.8048

$E||{(1)}_{\rm exch}$

28.0175

28.0175

28.5536

31.0925

$E||{(2)}_{\rm IND}$

-3.5901

-3.1628

-3.7196

-3.6984

$E||{(2)}_{\rm ind}$

-8.5829

-7.8752

-8.9282

-9.5670

$E||{(2)}_{\rm ind,exch}$

4.9928

4.7123

5.2085

5.8686

$E||{(2)}_{\rm DISP}$

-16.2333

-15.3627

-14.1152

-15.6091

$E||{(2)}_{\rm int}$

-12.3657

-11.0679

-10.2580

-9.0198

$\delta||{\rm HF}_{\rm int}$

-2.3259

-2.3259

-2.3422

-2.3422

$E||{(2)}_{\rm int}+\delta||{\rm HF}_{\rm int}$

-14.6917

-13.3939

-12.6002

-11.3620

Data from /home/alston/molecules/pyridine/scans/dimers_from_Model3_noS2/Min2-S1/aTZMb3-MC+/psi4

}}} Similar data for the Hb1_5 dimer with the aTZ+Mb3 basis:

Cam-PBE0 : CamCASP PBE0/CS00 ALDA+CHF MC+BS basis Cam-PBE : CamCASP PBE/CS00 ALDA MC+BS basis Psi-PBE0 : Psi4 PBE0/GRAC ALDA DC+BS Psi-PBE : Psi4 PBE/GRAC ALDA DC+BS Psi-Hyb : first-order from Psi-PBE0 and second-order from Psi-PBE

Psi-Cam-FUNC-KER : Psi4 MOs passed to CamCASP with functional FUNC and kernel KER.

kJ/mol elst exch IND2 dHF DISP2 Eint CT2 POL2 Cam-PBE0 -20.45658 27.84655 -3.61371 -2.36352 -17.02206 -15.60932 -0.52554 -3.08817 Psi-PBE0 -20.83304 28.52921 -3.68395 -2.36648 -14.53605 -12.89031 Psi-Cam-PBE0-HYB -20.84369 28.56603 -3.61448 -2.36352 -17.22447 -15.48013 -0.50929 -3.10519 Psi-Cam-PBE0-ALDA -20.84369 28.56603 -3.22050 -2.36352 -15.89760 -13.75929 -0.50848 -2.71203


Psi-PBE0-scaled -20.83304 28.52921 -3.68395 -2.36648 -15.89755 -14.25181 Psi-Cam-PBE0-mix -20.84369 28.56603 -3.61448 -2.36352 -15.89760 -14.15326



Cam-PBE -20.29438 31.92628 -3.44943 -2.36352 -18.02445 -12.20549 -0.51709 -2.93234 Psi-PBE -20.69212 31.03235 -3.65223 -2.36648 -16.07874 -11.75723 Psi-PBE-scaled -20.69212 31.03235 -3.65223 -2.36648 -18.06334 -13.74182 Psi-Cam-PBE-ALDA -20.69365 31.03205 -3.56705 -2.36352 -17.92890 -13.52107 -0.54404 -3.02301


Psi-Hyb -20.83304 28.52921 -3.65223 -2.36648 -16.07874 -14.40128


CCSD(T) augA-Sadlej+Mb3 DC+BS Psi4: -15.84991


}}} Points to note:

How does Psi4 calculate the second-order energies?

$$

$$

<note important> Are CamCASP and Psi4 consistent?

I have now got CamCASP to work with Psi4 1.2 MOs. There were changes needed with the interface and a few other issues.

From the above discussion, we see that we should compare Psi-PBE0-scaled energies to CamCASP calculations computed using the first-order energies and the induction and delta-HF energies taken from Psi-Cam-PBE0-HYB and the second-order dispersion energy from Psi-Cam-PBE0-ALDA. This resulting theory is termed Psi-Cam-PBE0-mix above. And indeed, we see good agreement between the results from the two codes.

There are differences of a tenth of a kJ/mol, but these are due to density-fitting differences and the S||2 approx made by Psi4. }}}

Important

Recommendation:

If we must use Psi4 only, then we should compute the interaction energy using PBE0 (as first-order is good) with scaled exchange-dispersion as shown above.

  • This needs to be tested on different dimers.
  • The error in the dispersion is still present, but is smaller.