I am interested in using SAPT to obtain the interaction energy of a dimer in the presence of a large number (10^5) of point charges representing water molecules. My scientific question requires investigating this system in the presence of a particular molecular mechanics water model, so using EFP to represent the waters is not an option for me. I am using the EXTERN keyword as described in the manual here. However, the impact of the point charges on the time performance is much greater than I expected. Here is the time required for a SAPT0/jun-cc-pvdz calculation on a dimer system containing 296 electrons (850 basis functions) as a function of the number of point charges:
# charges | Time (min)
------------------------
0 | 111.6
9 | 131.3
99 | 133.1
999 | 148.0
9999 | 250.3
68592 | 867.7
I am running these calculations via my local computing cluster on a node with 2 Intel Xeon E5-2695 v2 processors using 24 cores and 124 GB memory. I have seen similar performance using smaller systems, using computing nodes with larger memory (up to 248 GB), and using other methods in Psi4 such as DFT. Looking at the times for the individual modules, the additional time is accrued in the SCF calculations and not in the SAPT0 module. Is this poor time scaling expected for external point charges? Can you recommend any options I can use in Psi4 to reduce their impact on the time performance?
This is what the input file looks like for 9 point charges:
# sSAPT0 energy
memory 124 gb
molecule dimer {
0 1
ATOM_1 x y z
...
ATOM_33 x y z
--
0 1
ATOM_34 x y z
...
ATOM_66 x y z
units angstrom
}
set {
basis jun-cc-pvdz
scf_type DF
freeze_core True
}
MM_charges = QMMM()
MM_charges.extern.addCharge(0.0033955, 0.322, 5.900, 11.195)
MM_charges.extern.addCharge(0.0033955, -0.893, 5.287, 11.359)
MM_charges.extern.addCharge(-0.0067910, -0.415, 5.900, 11.460)
MM_charges.extern.addCharge(0.0033955, 2.140, 8.134, 2.601)
MM_charges.extern.addCharge(0.0033955, 3.159, 8.858, 3.164)
MM_charges.extern.addCharge(-0.0067910, 2.709, 8.217, 3.133)
MM_charges.extern.addCharge(0.0033955, 5.947, -0.727, 3.885)
MM_charges.extern.addCharge(0.0033955, 7.240, -0.639, 4.333)
MM_charges.extern.addCharge(-0.0067910, 6.689, -0.489, 3.796)
psi4.set_global_option_python('EXTERN', MM_charges.extern)
energy('sapt0')