pyscf 2.6.2__py3-none-macosx_11_0_arm64.whl → 2.8.0__py3-none-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. pyscf/__init__.py +2 -2
  2. pyscf/adc/__init__.py +3 -8
  3. pyscf/adc/dfadc.py +22 -6
  4. pyscf/adc/radc.py +106 -15
  5. pyscf/adc/radc_amplitudes.py +7 -1
  6. pyscf/adc/radc_ao2mo.py +4 -2
  7. pyscf/adc/radc_ea.py +524 -8
  8. pyscf/adc/radc_ip.py +492 -60
  9. pyscf/adc/radc_ip_cvs.py +4 -2
  10. pyscf/adc/uadc.py +116 -27
  11. pyscf/adc/uadc_amplitudes.py +215 -20
  12. pyscf/adc/uadc_ao2mo.py +30 -9
  13. pyscf/adc/uadc_ea.py +34 -44
  14. pyscf/adc/uadc_ip.py +9 -4
  15. pyscf/adc/uadc_ip_cvs.py +4 -1
  16. pyscf/agf2/__init__.py +2 -2
  17. pyscf/agf2/aux_space.py +1 -1
  18. pyscf/agf2/chkfile.py +1 -1
  19. pyscf/ao2mo/__init__.py +13 -2
  20. pyscf/ao2mo/_ao2mo.py +10 -1
  21. pyscf/ao2mo/incore.py +3 -0
  22. pyscf/ao2mo/nrr_outcore.py +2 -2
  23. pyscf/ao2mo/outcore.py +9 -7
  24. pyscf/ao2mo/r_outcore.py +2 -2
  25. pyscf/cc/__init__.py +21 -3
  26. pyscf/cc/bccd.py +0 -46
  27. pyscf/cc/ccsd.py +29 -13
  28. pyscf/cc/ccsd_rdm.py +6 -1
  29. pyscf/cc/gccsd.py +2 -2
  30. pyscf/cc/uccsd.py +7 -7
  31. pyscf/cc/uccsd_rdm.py +2 -2
  32. pyscf/data/elements.py +1 -1
  33. pyscf/df/__init__.py +2 -1
  34. pyscf/df/addons.py +79 -51
  35. pyscf/df/autoaux.py +195 -0
  36. pyscf/df/df.py +5 -1
  37. pyscf/df/df_jk.py +27 -25
  38. pyscf/df/grad/casscf.py +0 -41
  39. pyscf/df/grad/rhf.py +31 -1
  40. pyscf/df/hessian/rhf.py +2 -10
  41. pyscf/df/hessian/rks.py +1 -7
  42. pyscf/df/hessian/uhf.py +3 -13
  43. pyscf/df/hessian/uks.py +1 -8
  44. pyscf/df/incore.py +18 -6
  45. pyscf/df/outcore.py +6 -6
  46. pyscf/dft/dks.py +1 -1
  47. pyscf/dft/gks.py +25 -21
  48. pyscf/dft/libxc.py +91 -645
  49. pyscf/dft/numint.py +40 -19
  50. pyscf/dft/radi.py +48 -7
  51. pyscf/dft/rks.py +29 -25
  52. pyscf/dft/roks.py +7 -1
  53. pyscf/dft/uks.py +34 -25
  54. pyscf/dft/xc_deriv.py +1 -1
  55. pyscf/dft/xcfun.py +53 -2
  56. pyscf/eph/eph_fd.py +1 -1
  57. pyscf/eph/rhf.py +6 -36
  58. pyscf/eph/rks.py +0 -4
  59. pyscf/eph/uhf.py +1 -7
  60. pyscf/eph/uks.py +1 -7
  61. pyscf/fci/addons.py +117 -2
  62. pyscf/fci/cistring.py +1 -1
  63. pyscf/fci/direct_nosym.py +3 -3
  64. pyscf/fci/direct_spin0_symm.py +22 -43
  65. pyscf/fci/direct_spin1.py +65 -10
  66. pyscf/fci/direct_spin1_symm.py +49 -14
  67. pyscf/fci/direct_uhf.py +4 -4
  68. pyscf/fci/selected_ci_symm.py +1 -1
  69. pyscf/grad/ccsd.py +3 -7
  70. pyscf/grad/ccsd_slow.py +2 -3
  71. pyscf/grad/lagrange.py +11 -3
  72. pyscf/grad/mp2.py +13 -4
  73. pyscf/grad/sacasscf.py +1 -1
  74. pyscf/grad/tdrks.py +1 -1
  75. pyscf/grad/uccsd.py +3 -7
  76. pyscf/grad/ump2.py +2 -4
  77. pyscf/gto/basis/__init__.py +17 -4
  78. pyscf/gto/basis/bse.py +68 -15
  79. pyscf/gto/basis/def2-mtzvp.dat +4719 -0
  80. pyscf/gto/basis/def2-mtzvpp.dat +4739 -0
  81. pyscf/gto/basis/dyall-basis/__init__.py +0 -0
  82. pyscf/gto/basis/dyall-basis/dyall_2zp.py +6492 -0
  83. pyscf/gto/basis/dyall-basis/dyall_3zp.py +8343 -0
  84. pyscf/gto/basis/dyall-basis/dyall_4zp.py +10055 -0
  85. pyscf/gto/basis/dyall-basis/dyall_aae2z.py +1818 -0
  86. pyscf/gto/basis/dyall-basis/dyall_aae3z.py +2521 -0
  87. pyscf/gto/basis/dyall-basis/dyall_aae4z.py +3351 -0
  88. pyscf/gto/basis/dyall-basis/dyall_acv2z.py +1790 -0
  89. pyscf/gto/basis/dyall-basis/dyall_acv3z.py +2417 -0
  90. pyscf/gto/basis/dyall-basis/dyall_acv4z.py +3085 -0
  91. pyscf/gto/basis/dyall-basis/dyall_ae2z.py +6619 -0
  92. pyscf/gto/basis/dyall-basis/dyall_ae3z.py +9027 -0
  93. pyscf/gto/basis/dyall-basis/dyall_ae4z.py +11839 -0
  94. pyscf/gto/basis/dyall-basis/dyall_av2z.py +1742 -0
  95. pyscf/gto/basis/dyall-basis/dyall_av3z.py +2318 -0
  96. pyscf/gto/basis/dyall-basis/dyall_av4z.py +2905 -0
  97. pyscf/gto/basis/dyall-basis/dyall_cv2z.py +6558 -0
  98. pyscf/gto/basis/dyall-basis/dyall_cv3z.py +8767 -0
  99. pyscf/gto/basis/dyall-basis/dyall_cv4z.py +11098 -0
  100. pyscf/gto/basis/dyall-basis/dyall_v2z.py +6472 -0
  101. pyscf/gto/basis/dyall-basis/dyall_v3z.py +8539 -0
  102. pyscf/gto/basis/dyall-basis/dyall_v4z.py +10658 -0
  103. pyscf/gto/basis/ma-def2-qzvp.dat +5959 -0
  104. pyscf/gto/basis/ma-def2-qzvpp.dat +6195 -0
  105. pyscf/gto/basis/ma-def2-svp.dat +3504 -0
  106. pyscf/gto/basis/ma-def2-svpp.dat +3504 -0
  107. pyscf/gto/basis/ma-def2-tzvp.dat +4347 -0
  108. pyscf/gto/basis/ma-def2-tzvpp.dat +4549 -0
  109. pyscf/gto/basis/parse_cp2k.py +8 -7
  110. pyscf/gto/basis/parse_cp2k_pp.py +1 -1
  111. pyscf/gto/basis/parse_nwchem.py +26 -11
  112. pyscf/gto/basis/parse_nwchem_ecp.py +2 -1
  113. pyscf/gto/basis/sap_grasp_large.dat +2438 -0
  114. pyscf/gto/basis/sap_grasp_small.dat +1434 -0
  115. pyscf/gto/eval_gto.py +1 -1
  116. pyscf/gto/ft_ao.py +6 -6
  117. pyscf/gto/mole.py +123 -71
  118. pyscf/gto/moleintor.py +1 -1
  119. pyscf/gw/gw_ac.py +2 -2
  120. pyscf/gw/gw_cd.py +2 -2
  121. pyscf/gw/rpa.py +135 -246
  122. pyscf/gw/ugw_ac.py +2 -2
  123. pyscf/gw/urpa.py +80 -131
  124. pyscf/hessian/rhf.py +30 -128
  125. pyscf/hessian/rks.py +1 -6
  126. pyscf/hessian/uhf.py +28 -138
  127. pyscf/hessian/uks.py +1 -8
  128. pyscf/lib/CMakeLists.txt +6 -2
  129. pyscf/lib/ao2mo/nr_ao2mo.c +1 -1
  130. pyscf/lib/ao2mo/nrr_ao2mo.c +1 -1
  131. pyscf/lib/ao2mo/r_ao2mo.c +1 -1
  132. pyscf/lib/cc/ccsd_pack.c +1 -1
  133. pyscf/lib/cc/ccsd_t.c +6 -6
  134. pyscf/lib/cc/uccsd_t.c +4 -4
  135. pyscf/lib/config.h +0 -1
  136. pyscf/lib/config.h.in +0 -1
  137. pyscf/lib/deps/include/XCFun/XCFunExport.h +1 -0
  138. pyscf/lib/deps/include/xc.h +28 -18
  139. pyscf/lib/deps/include/xc_funcs.h +50 -2
  140. pyscf/lib/deps/include/xc_version.h +3 -3
  141. pyscf/lib/deps/lib/libcint.6.dylib +0 -0
  142. pyscf/lib/deps/lib/{libxc.12.dylib → libxc.15.dylib} +0 -0
  143. pyscf/lib/deps/lib/libxcfun.2.dylib +0 -0
  144. pyscf/lib/dft/grid_common.c +1 -1
  145. pyscf/lib/dft/libxc_itrf.c +10 -7
  146. pyscf/lib/dft/nr_numint_sparse.c +3 -3
  147. pyscf/lib/dft/xcfun_itrf.c +1 -1
  148. pyscf/lib/diis.py +2 -2
  149. pyscf/lib/exceptions.py +6 -0
  150. pyscf/lib/gto/fill_grids_int2c.c +11 -9
  151. pyscf/lib/gto/fill_int2e.c +7 -5
  152. pyscf/lib/gto/fill_r_4c.c +1 -1
  153. pyscf/lib/gto/ft_ao.c +1 -1
  154. pyscf/lib/gto/ft_ao.h +1 -1
  155. pyscf/lib/gto/gto.h +2 -2
  156. pyscf/lib/gto/nr_ecp.c +3 -2
  157. pyscf/lib/libagf2.dylib +0 -0
  158. pyscf/lib/libao2mo.dylib +0 -0
  159. pyscf/lib/libcc.dylib +0 -0
  160. pyscf/lib/libcgto.dylib +0 -0
  161. pyscf/lib/libcvhf.dylib +0 -0
  162. pyscf/lib/libdft.dylib +0 -0
  163. pyscf/lib/libfci.dylib +0 -0
  164. pyscf/lib/libmcscf.dylib +0 -0
  165. pyscf/lib/libmp.dylib +0 -0
  166. pyscf/lib/libnp_helper.dylib +0 -0
  167. pyscf/lib/libpbc.dylib +0 -0
  168. pyscf/lib/libri.dylib +0 -0
  169. pyscf/lib/libxc_itrf.dylib +0 -0
  170. pyscf/lib/libxcfun_itrf.dylib +0 -0
  171. pyscf/lib/linalg_helper.py +117 -198
  172. pyscf/lib/logger.py +2 -1
  173. pyscf/lib/mcscf/fci_contract.c +10 -3
  174. pyscf/lib/misc.py +63 -22
  175. pyscf/lib/mp/CMakeLists.txt +22 -0
  176. pyscf/lib/mp/mp2.c +518 -0
  177. pyscf/lib/mp/mp2.h +44 -0
  178. pyscf/lib/np_helper/CMakeLists.txt +1 -1
  179. pyscf/lib/np_helper/imatcopy.c +360 -0
  180. pyscf/lib/np_helper/np_helper.c +94 -0
  181. pyscf/lib/np_helper/np_helper.h +26 -0
  182. pyscf/lib/numpy_helper.py +195 -11
  183. pyscf/lib/pbc/nr_direct.c +2 -7
  184. pyscf/lib/pbc/nr_ecp.c +10 -3
  185. pyscf/lib/pbc/pbc.h +1 -1
  186. pyscf/lib/vhf/fblas.h +3 -0
  187. pyscf/lib/vhf/nr_sgx_direct.c +8 -6
  188. pyscf/lib/vhf/nr_sr_vhf.c +8 -12
  189. pyscf/lib/vhf/optimizer.c +2 -2
  190. pyscf/lib/vhf/rkb_screen.c +139 -0
  191. pyscf/lo/iao.py +1 -1
  192. pyscf/lo/ibo.py +3 -3
  193. pyscf/lo/pipek_jacobi.py +1 -1
  194. pyscf/mcscf/__init__.py +2 -2
  195. pyscf/mcscf/addons.py +3 -3
  196. pyscf/mcscf/apc.py +2 -2
  197. pyscf/mcscf/casci.py +13 -7
  198. pyscf/mcscf/chkfile.py +69 -41
  199. pyscf/mcscf/dmet_cas.py +2 -2
  200. pyscf/mcscf/mc1step.py +72 -44
  201. pyscf/mcscf/newton_casscf.py +5 -5
  202. pyscf/mcscf/ucasci.py +1 -1
  203. pyscf/mcscf/umc1step.py +49 -28
  204. pyscf/md/integrators.py +3 -3
  205. pyscf/mp/__init__.py +1 -0
  206. pyscf/mp/dfmp2.py +498 -59
  207. pyscf/mp/dfmp2_native.py +11 -1
  208. pyscf/mp/dfmp2_slow.py +133 -0
  209. pyscf/mp/dfump2.py +672 -0
  210. pyscf/mp/dfump2_native.py +9 -0
  211. pyscf/mp/dfump2_slow.py +161 -0
  212. pyscf/mp/gmp2.py +6 -47
  213. pyscf/mp/mp2.py +25 -10
  214. pyscf/mp/ump2.py +30 -24
  215. pyscf/pbc/adc/kadc_rhf.py +1 -1
  216. pyscf/pbc/adc/kadc_rhf_amplitudes.py +2 -2
  217. pyscf/pbc/ao2mo/eris.py +1 -1
  218. pyscf/pbc/cc/kccsd_rhf.py +3 -3
  219. pyscf/pbc/cc/kccsd_t_rhf.py +2 -2
  220. pyscf/pbc/ci/kcis_rhf.py +2 -2
  221. pyscf/pbc/df/aft.py +8 -9
  222. pyscf/pbc/df/aft_ao2mo.py +1 -1
  223. pyscf/pbc/df/df.py +85 -12
  224. pyscf/pbc/df/df_jk.py +6 -2
  225. pyscf/pbc/df/fft.py +9 -5
  226. pyscf/pbc/df/fft_ao2mo.py +4 -0
  227. pyscf/pbc/df/fft_jk.py +18 -10
  228. pyscf/pbc/df/ft_ao.py +4 -3
  229. pyscf/pbc/df/gdf_builder.py +5 -4
  230. pyscf/pbc/df/incore.py +2 -2
  231. pyscf/pbc/df/mdf.py +6 -3
  232. pyscf/pbc/df/mdf_jk.py +2 -1
  233. pyscf/pbc/df/outcore.py +10 -10
  234. pyscf/pbc/df/rsdf.py +2 -2
  235. pyscf/pbc/df/rsdf_builder.py +13 -8
  236. pyscf/pbc/df/rsdf_helper.py +6 -6
  237. pyscf/pbc/df/rsdf_jk.py +2 -1
  238. pyscf/pbc/dft/cdft.py +5 -5
  239. pyscf/pbc/dft/gen_grid.py +3 -2
  240. pyscf/pbc/dft/gks.py +14 -3
  241. pyscf/pbc/dft/kgks.py +15 -4
  242. pyscf/pbc/dft/krks.py +28 -10
  243. pyscf/pbc/dft/krks_ksymm.py +21 -9
  244. pyscf/pbc/dft/krkspu.py +1 -30
  245. pyscf/pbc/dft/krkspu_ksymm.py +0 -30
  246. pyscf/pbc/dft/kuks.py +30 -13
  247. pyscf/pbc/dft/kuks_ksymm.py +22 -10
  248. pyscf/pbc/dft/kukspu.py +0 -27
  249. pyscf/pbc/dft/kukspu_ksymm.py +0 -30
  250. pyscf/pbc/dft/multigrid/multigrid.py +36 -33
  251. pyscf/pbc/dft/multigrid/multigrid_pair.py +7 -2
  252. pyscf/pbc/dft/multigrid/pp.py +1 -1
  253. pyscf/pbc/dft/numint.py +56 -31
  254. pyscf/pbc/dft/rks.py +16 -24
  255. pyscf/pbc/dft/uks.py +21 -4
  256. pyscf/pbc/eph/eph_fd.py +1 -1
  257. pyscf/pbc/geomopt/geometric_solver.py +1 -1
  258. pyscf/pbc/gto/_pbcintor.py +1 -0
  259. pyscf/pbc/gto/cell.py +194 -23
  260. pyscf/pbc/gto/ecp.py +12 -12
  261. pyscf/pbc/gto/eval_gto.py +3 -3
  262. pyscf/pbc/gto/neighborlist.py +4 -1
  263. pyscf/pbc/gto/pseudo/pp.py +1 -1
  264. pyscf/pbc/gw/krgw_ac.py +4 -4
  265. pyscf/pbc/gw/krgw_cd.py +4 -4
  266. pyscf/pbc/gw/kugw_ac.py +3 -3
  267. pyscf/pbc/lib/kpts_helper.py +4 -3
  268. pyscf/pbc/lib/linalg_helper.py +1 -1
  269. pyscf/pbc/mp/kmp2.py +1 -1
  270. pyscf/pbc/mpitools/mpi.py +1 -1
  271. pyscf/pbc/scf/_response_functions.py +141 -34
  272. pyscf/pbc/scf/addons.py +15 -11
  273. pyscf/pbc/scf/cphf.py +1 -1
  274. pyscf/pbc/scf/ghf.py +1 -1
  275. pyscf/pbc/scf/hf.py +21 -32
  276. pyscf/pbc/scf/kghf.py +33 -29
  277. pyscf/pbc/scf/khf.py +103 -29
  278. pyscf/pbc/scf/khf_ksymm.py +15 -1
  279. pyscf/pbc/scf/krohf.py +5 -7
  280. pyscf/pbc/scf/kuhf.py +54 -23
  281. pyscf/pbc/scf/kuhf_ksymm.py +1 -1
  282. pyscf/pbc/scf/rsjk.py +14 -10
  283. pyscf/pbc/scf/scfint.py +1 -1
  284. pyscf/pbc/scf/stability.py +27 -15
  285. pyscf/pbc/scf/uhf.py +3 -1
  286. pyscf/pbc/symm/symmetry.py +2 -2
  287. pyscf/pbc/tdscf/krhf.py +238 -154
  288. pyscf/pbc/tdscf/krks.py +1 -45
  289. pyscf/pbc/tdscf/kuhf.py +319 -171
  290. pyscf/pbc/tdscf/kuks.py +0 -56
  291. pyscf/pbc/tdscf/rhf.py +116 -3
  292. pyscf/pbc/tdscf/rks.py +2 -1
  293. pyscf/pbc/tdscf/uhf.py +214 -1
  294. pyscf/pbc/tdscf/uks.py +2 -1
  295. pyscf/pbc/tools/k2gamma.py +20 -6
  296. pyscf/pbc/tools/lattice.py +3 -3
  297. pyscf/pbc/tools/pbc.py +111 -91
  298. pyscf/pbc/tools/pyscf_ase.py +0 -1
  299. pyscf/pbc/tools/pywannier90.py +1 -1
  300. pyscf/qmmm/mm_mole.py +1 -1
  301. pyscf/scf/_response_functions.py +87 -46
  302. pyscf/scf/_vhf.py +15 -10
  303. pyscf/scf/addons.py +29 -15
  304. pyscf/scf/cphf.py +14 -52
  305. pyscf/scf/dhf.py +121 -38
  306. pyscf/scf/dispersion.py +10 -9
  307. pyscf/scf/ghf.py +25 -13
  308. pyscf/scf/ghf_symm.py +2 -2
  309. pyscf/scf/hf.py +262 -30
  310. pyscf/scf/rohf.py +37 -5
  311. pyscf/scf/stability.py +142 -112
  312. pyscf/scf/ucphf.py +21 -16
  313. pyscf/scf/uhf.py +104 -61
  314. pyscf/sgx/sgx.py +1 -1
  315. pyscf/sgx/sgx_jk.py +4 -4
  316. pyscf/solvent/__init__.py +2 -2
  317. pyscf/solvent/_attach_solvent.py +2 -0
  318. pyscf/solvent/_ddcosmo_tdscf_grad.py +1 -1
  319. pyscf/solvent/cosmors.py +366 -0
  320. pyscf/solvent/ddcosmo.py +1 -1
  321. pyscf/solvent/pcm.py +4 -4
  322. pyscf/solvent/pol_embed.py +1 -1
  323. pyscf/solvent/smd.py +5 -3
  324. pyscf/soscf/ciah.py +3 -11
  325. pyscf/soscf/newton_ah.py +5 -2
  326. pyscf/symm/__init__.py +1 -1
  327. pyscf/symm/addons.py +5 -5
  328. pyscf/symm/geom.py +1 -5
  329. pyscf/tdscf/_lr_eig.py +1002 -0
  330. pyscf/tdscf/dhf.py +84 -87
  331. pyscf/tdscf/dks.py +0 -4
  332. pyscf/tdscf/ghf.py +139 -127
  333. pyscf/tdscf/gks.py +27 -25
  334. pyscf/tdscf/rhf.py +194 -147
  335. pyscf/tdscf/rks.py +26 -22
  336. pyscf/tdscf/uhf.py +166 -118
  337. pyscf/tdscf/uks.py +32 -31
  338. pyscf/tools/fcidump.py +3 -0
  339. pyscf/tools/qcschema.py +265 -0
  340. pyscf/x2c/sfx2c1e.py +1 -1
  341. pyscf/x2c/tdscf.py +41 -41
  342. pyscf/x2c/x2c.py +15 -11
  343. {pyscf-2.6.2.dist-info → pyscf-2.8.0.dist-info}/METADATA +39 -36
  344. {pyscf-2.6.2.dist-info → pyscf-2.8.0.dist-info}/NOTICE +14 -1
  345. {pyscf-2.6.2.dist-info → pyscf-2.8.0.dist-info}/RECORD +348 -316
  346. {pyscf-2.6.2.dist-info → pyscf-2.8.0.dist-info}/WHEEL +1 -1
  347. pyscf/dft/gen_libxc_param.py +0 -35
  348. pyscf/dft/gen_xcfun_param.py +0 -209
  349. pyscf/pbc/tdscf/kproxy.py +0 -189
  350. pyscf/pbc/tdscf/kproxy_supercell.py +0 -664
  351. pyscf/pbc/tdscf/krhf_slow.py +0 -300
  352. pyscf/pbc/tdscf/krhf_slow_gamma.py +0 -175
  353. pyscf/pbc/tdscf/krhf_slow_supercell.py +0 -250
  354. pyscf/pbc/tdscf/proxy.py +0 -39
  355. pyscf/pbc/tdscf/rhf_slow.py +0 -35
  356. pyscf/tdscf/common_slow.py +0 -799
  357. pyscf/tdscf/proxy.py +0 -258
  358. pyscf/tdscf/rhf_slow.py +0 -181
  359. {pyscf-2.6.2.dist-info → pyscf-2.8.0.dist-info}/LICENSE +0 -0
  360. {pyscf-2.6.2.dist-info → pyscf-2.8.0.dist-info}/top_level.txt +0 -0
pyscf/dft/numint.py CHANGED
@@ -176,9 +176,9 @@ def eval_rho(mol, ao, dm, non0tab=None, xctype='LDA', hermi=0,
176
176
  if hermi:
177
177
  rho[1:4] *= 2 # *2 for + einsum('pi,ij,pj->p', ao[i], dm, ao[0])
178
178
  else:
179
+ c1 = _dot_ao_dm(mol, ao[0], dm.conj().T, non0tab, shls_slice, ao_loc)
179
180
  for i in range(1, 4):
180
- c1 = _dot_ao_dm(mol, ao[i], dm, non0tab, shls_slice, ao_loc)
181
- rho[i] += _contract_rho(c1, ao[0])
181
+ rho[i] += _contract_rho(c1, ao[i])
182
182
  else: # meta-GGA
183
183
  if with_lapl:
184
184
  # rho[4] = \nabla^2 rho, rho[5] = 1/2 |nabla f|^2
@@ -312,14 +312,14 @@ def eval_rho1(mol, ao, dm, screen_index=None, xctype='LDA', hermi=0,
312
312
 
313
313
  rho[tau_idx] = 0
314
314
  for i in range(1, 4):
315
- c1 = _dot_ao_dm_sparse(ao[i], dm.T, nbins, screen_index, pair_mask, ao_loc)
315
+ c1 = _dot_ao_dm_sparse(ao[i], dm, nbins, screen_index, pair_mask, ao_loc)
316
316
  rho[tau_idx] += _contract_rho_sparse(ao[i], c1, screen_index, ao_loc)
317
317
 
318
318
  rho[i] = _contract_rho_sparse(ao[i], c0, screen_index, ao_loc)
319
319
  if hermi:
320
320
  rho[i] *= 2
321
321
  else:
322
- rho[i] += _contract_rho_sparse(c1, ao[0], screen_index, ao_loc)
322
+ rho[i] += _contract_rho_sparse(ao[0], c1, screen_index, ao_loc)
323
323
 
324
324
  # tau = 1/2 (\nabla f)^2
325
325
  rho[tau_idx] *= .5
@@ -812,9 +812,8 @@ def _tau_dot(mol, bra, ket, wv, mask, shls_slice, ao_loc):
812
812
  mat += _dot_ao_ao(mol, bra[3], aow, mask, shls_slice, ao_loc)
813
813
  return mat
814
814
 
815
- def _sparse_enough(screen_index):
815
+ def _sparse_enough(screen_index, threshold=0.5):
816
816
  # TODO: improve the turnover threshold
817
- threshold = 0.5
818
817
  return numpy.count_nonzero(screen_index) < screen_index.size * threshold
819
818
 
820
819
  def _dot_ao_ao_dense(ao1, ao2, wv, out=None):
@@ -831,13 +830,8 @@ def _dot_ao_ao_dense(ao1, ao2, wv, out=None):
831
830
  return lib.ddot(ao1.T, ao2, 1, out, 1)
832
831
  else:
833
832
  assert wv.dtype == numpy.double
834
- libdft.VXCdot_aow_ao_dense(
835
- out.ctypes.data_as(ctypes.c_void_p),
836
- ao1.ctypes.data_as(ctypes.c_void_p),
837
- ao2.ctypes.data_as(ctypes.c_void_p),
838
- wv.ctypes.data_as(ctypes.c_void_p),
839
- ctypes.c_int(nao), ctypes.c_int(ngrids))
840
- return out
833
+ ao1 = _scale_ao(ao1, wv.ravel())
834
+ return lib.ddot(ao1.T, ao2, 1, out, 1)
841
835
 
842
836
  def _dot_ao_ao_sparse(ao1, ao2, wv, nbins, screen_index, pair_mask, ao_loc,
843
837
  hermi=0, out=None):
@@ -2633,7 +2627,7 @@ def get_rho(ni, mol, dm, grids, max_memory=2000):
2633
2627
  class LibXCMixin:
2634
2628
  libxc = libxc
2635
2629
 
2636
- omega = None # RSH paramter
2630
+ omega = None # RSH parameter
2637
2631
 
2638
2632
  ####################
2639
2633
  # Overwrite following functions to use custom XC functional
@@ -2654,6 +2648,10 @@ class LibXCMixin:
2654
2648
  return self.libxc.eval_xc(xc_code, rho, spin, relativity, deriv,
2655
2649
  omega, verbose)
2656
2650
 
2651
+ def eval_xc1(self, xc_code, rho, spin=0, deriv=1, omega=None):
2652
+ if omega is None: omega = self.omega
2653
+ return self.libxc.eval_xc1(xc_code, rho, spin, deriv, omega)
2654
+
2657
2655
  def eval_xc_eff(self, xc_code, rho, deriv=1, omega=None, xctype=None,
2658
2656
  verbose=None):
2659
2657
  r'''Returns the derivative tensor against the density parameters
@@ -2693,12 +2691,12 @@ class LibXCMixin:
2693
2691
  else:
2694
2692
  spin = 0
2695
2693
 
2696
- out = self.libxc.eval_xc1(xc_code, rho, spin, deriv, omega)
2694
+ out = self.eval_xc1(xc_code, rho, spin, deriv, omega)
2697
2695
  evfk = [out[0]]
2698
2696
  for order in range(1, deriv+1):
2699
2697
  evfk.append(xc_deriv.transform_xc(rho, out, xctype, spin, order))
2700
2698
  if deriv < 3:
2701
- # The return has at least [e, v, f, k] terms
2699
+ # Returns at least [e, v, f, k] terms
2702
2700
  evfk.extend([None] * (3 - deriv))
2703
2701
  return evfk
2704
2702
 
@@ -2719,9 +2717,12 @@ class LibXCMixin:
2719
2717
  '''
2720
2718
  omega, alpha, beta = self.rsh_coeff(xc_code)
2721
2719
  if self.omega is not None:
2720
+ if omega == 0 and self.omega != 0:
2721
+ raise RuntimeError(f'Not support assigning omega={self.omega}. '
2722
+ f'{xc_code} is not a RSH functional')
2722
2723
  omega = self.omega
2723
2724
 
2724
- if abs(omega) > 1e-10:
2725
+ if omega != 0:
2725
2726
  hyb = alpha + beta
2726
2727
  else:
2727
2728
  hyb = self.hybrid_coeff(xc_code, spin)
@@ -2852,12 +2853,32 @@ class NumInt(lib.StreamObject, LibXCMixin):
2852
2853
  pair_mask = ovlp_cond < -numpy.log(self.cutoff)
2853
2854
  pair_mask = numpy.asarray(pair_mask, dtype=numpy.uint8)
2854
2855
 
2856
+ if (mo_occ is not None) and (grids is not None):
2857
+ # eval_rho2 is more efficient unless we have a very large system
2858
+ # for which the pair_mask is significantly sparser than the
2859
+ # ratio of occupied to total molecular orbitals. So we use this ratio
2860
+ # to switch between eval_rho1 and eval_rho2.
2861
+ mo_ao_sparsity = max(0.5 * numpy.sum(mo_occ) / nao, 1e-8)
2862
+ wts = mol.ao_loc_nr()
2863
+ wts = (wts[1:] - wts[:-1]) / wts[-1]
2864
+ rho1_rho2_ratio = numpy.dot(wts, pair_mask).dot(wts) / mo_ao_sparsity
2865
+ else:
2866
+ rho1_rho2_ratio = 0.0
2867
+
2855
2868
  def make_rho(idm, ao, sindex, xctype):
2856
- if sindex is not None and grids is not None:
2869
+ has_screening = sindex is not None and grids is not None
2870
+ has_mo = mo_coeff is not None
2871
+ if xctype == "GGA":
2872
+ # GGA has to do more contractions using rho2 compared to rho1,
2873
+ # so the threshold for switching to rho1 is less strict.
2874
+ is_sparse = rho1_rho2_ratio < 4
2875
+ else:
2876
+ is_sparse = rho1_rho2_ratio < 1
2877
+ if has_screening and (not has_mo or is_sparse):
2857
2878
  return self.eval_rho1(mol, ao, dms[idm], sindex, xctype, hermi,
2858
2879
  with_lapl, cutoff=self.cutoff,
2859
2880
  ao_cutoff=grids.cutoff, pair_mask=pair_mask)
2860
- elif mo_coeff is not None:
2881
+ elif has_mo:
2861
2882
  return self.eval_rho2(mol, ao, mo_coeff[idm], mo_occ[idm],
2862
2883
  sindex, xctype, with_lapl)
2863
2884
  else:
pyscf/dft/radi.py CHANGED
@@ -21,10 +21,20 @@
21
21
  import numpy
22
22
  from pyscf.data import radii
23
23
  from pyscf.data.elements import charge as elements_proton
24
+ from pyscf import __config__
24
25
 
25
26
  BRAGG_RADII = radii.BRAGG
26
27
  COVALENT_RADII = radii.COVALENT
27
28
 
29
+ # The effective atomic radius in Treutler's original paper (JCP 102, 346) was
30
+ # omitted in PySCF versions 2.6 and earlier. This can cause discrepancies in the
31
+ # numerical grids when compared to other software (See issue #2178 for details).
32
+ # Note that using the atom-specific radius may slightly alter the results of
33
+ # numerical integration, potentially leading to differences of ~ 1e-6 per atom
34
+ # in total energy.
35
+ # Disable this flag to make DFT grids consistent with old PySCF versions.
36
+ ATOM_SPECIFIC_TREUTLER_GRIDS = getattr(__config__, 'ATOM_SPECIFIC_TREUTLER_GRIDS', True)
37
+
28
38
  # P.M.W. Gill, B.G. Johnson, J.A. Pople, Chem. Phys. Letters 209 (1993) 506-512
29
39
  SG1RADII = numpy.array((
30
40
  0,
@@ -37,14 +47,21 @@ SG1RADII = numpy.array((
37
47
  def murray(n, *args, **kwargs):
38
48
  raise RuntimeError('Not implemented')
39
49
 
40
- # Gauss-Chebyshev of the first kind, and the transformed interval [0,\infty)
41
50
  def becke(n, charge, *args, **kwargs):
42
51
  '''Becke, JCP 88, 2547 (1988); DOI:10.1063/1.454033'''
43
52
  if charge == 1:
44
53
  rm = BRAGG_RADII[charge]
45
54
  else:
46
55
  rm = BRAGG_RADII[charge] * .5
47
- t, w = numpy.polynomial.chebyshev.chebgauss(n)
56
+
57
+ # Points and weights for Gauss-Chebyshev quadrature points of the second kind
58
+ # The weights are adjusted to integrate a function on the interval [-1, 1] with uniform weighting
59
+ # instead of weighted by sqrt(1 - t^2) = sin(i pi / (n+1)).
60
+ i = numpy.arange(n) + 1
61
+ t = numpy.cos(i * numpy.pi / (n + 1))
62
+ w = numpy.pi / (n + 1) * numpy.sin(i * numpy.pi / (n + 1))
63
+
64
+ # Change of variables to map the domain to [0, inf)
48
65
  r = (1+t)/(1-t) * rm
49
66
  w *= 2/(1-t)**2 * rm
50
67
  return r, w
@@ -95,15 +112,41 @@ def gauss_chebyshev(n, *args, **kwargs):
95
112
  dr = fac * numpy.sin(x1)**4 * ln2/(1+xi)
96
113
  return r, dr
97
114
 
98
-
99
- def treutler_ahlrichs(n, *args, **kwargs):
115
+ # Individually optimized Treutler/Ahlrichs radius parameter.
116
+ # H - Kr are taken from the original paper JCP 102, 346 (1995)
117
+ # Other elements are copied from Psi4 source code
118
+ _treutler_ahlrichs_xi = [1.0, # Ghost
119
+ 0.8, 0.9, # 1s
120
+ 1.8, 1.4, 1.3, 1.1, 0.9, 0.9, 0.9, 0.9, # 2s2p
121
+ 1.4, 1.3, 1.3, 1.2, 1.1, 1.0, 1.0, 1.0, # 3s3p
122
+ 1.5, 1.4, # 4s
123
+ 1.3, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.1, 1.1, 1.1, # 3d
124
+ 1.1, 1.0, 0.9, 0.9, 0.9, 0.9, # 4p
125
+ 2.000, 1.700, # 5s
126
+ 1.500, 1.500, 1.350, 1.350, 1.250, 1.200, 1.250, 1.300, 1.500, 1.500, # 4d
127
+ 1.300, 1.200, 1.200, 1.150, 1.150, 1.150, # 5p
128
+ 2.500, 2.200, # 6s
129
+ 2.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, # La, Ce-Eu
130
+ 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, # Gd, Tb-Lu
131
+ 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, # 5d
132
+ 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, # 6p
133
+ 2.500, 2.100, # 7s
134
+ 3.685, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500,
135
+ 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500, 1.500,
136
+ ] # noqa: E124
137
+
138
+ def treutler_ahlrichs(n, chg, *args, **kwargs):
100
139
  '''
101
140
  Treutler-Ahlrichs [JCP 102, 346 (1995); DOI:10.1063/1.469408] (M4) radial grids
102
141
  '''
142
+ if ATOM_SPECIFIC_TREUTLER_GRIDS:
143
+ xi = _treutler_ahlrichs_xi[chg]
144
+ else:
145
+ xi = 1.
103
146
  r = numpy.empty(n)
104
147
  dr = numpy.empty(n)
105
148
  step = numpy.pi / (n+1)
106
- ln2 = 1 / numpy.log(2)
149
+ ln2 = xi / numpy.log(2)
107
150
  for i in range(n):
108
151
  x = numpy.cos((i+1)*step)
109
152
  r [i] = -ln2*(1+x)**.6 * numpy.log((1-x)/2)
@@ -113,8 +156,6 @@ def treutler_ahlrichs(n, *args, **kwargs):
113
156
  treutler = treutler_ahlrichs
114
157
 
115
158
 
116
-
117
-
118
159
  def becke_atomic_radii_adjust(mol, atomic_radii):
119
160
  '''Becke atomic radii adjust function'''
120
161
  # Becke atomic size adjustment. J. Chem. Phys. 88, 2547
pyscf/dft/rks.py CHANGED
@@ -92,36 +92,40 @@ def get_veff(ks, mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1):
92
92
  logger.debug(ks, 'nelec with nlc grids = %s', n)
93
93
  t0 = logger.timer(ks, 'vxc', *t0)
94
94
 
95
+ incremental_jk = (ks._eri is None and ks.direct_scf and
96
+ getattr(vhf_last, 'vj', None) is not None)
97
+ if incremental_jk:
98
+ _dm = numpy.asarray(dm) - numpy.asarray(dm_last)
99
+ else:
100
+ _dm = dm
95
101
  if not ni.libxc.is_hybrid_xc(ks.xc):
96
102
  vk = None
97
- if (ks._eri is None and ks.direct_scf and
98
- getattr(vhf_last, 'vj', None) is not None):
99
- ddm = numpy.asarray(dm) - numpy.asarray(dm_last)
100
- vj = ks.get_j(mol, ddm, hermi)
103
+ vj = ks.get_j(mol, _dm, hermi)
104
+ if incremental_jk:
101
105
  vj += vhf_last.vj
102
- else:
103
- vj = ks.get_j(mol, dm, hermi)
104
106
  vxc += vj
105
107
  else:
106
108
  omega, alpha, hyb = ni.rsh_and_hybrid_coeff(ks.xc, spin=mol.spin)
107
- if (ks._eri is None and ks.direct_scf and
108
- getattr(vhf_last, 'vk', None) is not None):
109
- ddm = numpy.asarray(dm) - numpy.asarray(dm_last)
110
- vj, vk = ks.get_jk(mol, ddm, hermi)
109
+ if omega == 0:
110
+ vj, vk = ks.get_jk(mol, _dm, hermi)
111
+ vk *= hyb
112
+ elif alpha == 0: # LR=0, only SR exchange
113
+ vj = ks.get_j(mol, _dm, hermi)
114
+ vk = ks.get_k(mol, _dm, hermi, omega=-omega)
115
+ vk *= hyb
116
+ elif hyb == 0: # SR=0, only LR exchange
117
+ vj = ks.get_j(mol, _dm, hermi)
118
+ vk = ks.get_k(mol, _dm, hermi, omega=omega)
119
+ vk *= alpha
120
+ else: # SR and LR exchange with different ratios
121
+ vj, vk = ks.get_jk(mol, _dm, hermi)
111
122
  vk *= hyb
112
- if omega != 0: # For range separated Coulomb
113
- vklr = ks.get_k(mol, ddm, hermi, omega=omega)
114
- vklr *= (alpha - hyb)
115
- vk += vklr
123
+ vklr = ks.get_k(mol, _dm, hermi, omega=omega)
124
+ vklr *= (alpha - hyb)
125
+ vk += vklr
126
+ if incremental_jk:
116
127
  vj += vhf_last.vj
117
128
  vk += vhf_last.vk
118
- else:
119
- vj, vk = ks.get_jk(mol, dm, hermi)
120
- vk *= hyb
121
- if omega != 0:
122
- vklr = ks.get_k(mol, dm, hermi, omega=omega)
123
- vklr *= (alpha - hyb)
124
- vk += vklr
125
129
  vxc += vj - vk * .5
126
130
 
127
131
  if ground_state:
@@ -228,7 +232,7 @@ def energy_elec(ks, dm=None, h1e=None, vhf=None):
228
232
  ks : an instance of DFT class
229
233
 
230
234
  dm : 2D ndarray
231
- one-partical density matrix
235
+ one-particle density matrix
232
236
  h1e : 2D ndarray
233
237
  Core hamiltonian
234
238
 
@@ -322,6 +326,9 @@ class KohnShamDFT:
322
326
 
323
327
  _keys = {'xc', 'nlc', 'grids', 'disp', 'nlcgrids', 'small_rho_cutoff'}
324
328
 
329
+ # Use rho to filter grids
330
+ small_rho_cutoff = getattr(__config__, 'dft_rks_RKS_small_rho_cutoff', 1e-7)
331
+
325
332
  def __init__(self, xc='LDA,VWN'):
326
333
  # By default, self.nlc = '' and self.disp = None
327
334
  self.xc = xc
@@ -333,9 +340,6 @@ class KohnShamDFT:
333
340
  self.nlcgrids = gen_grid.Grids(self.mol)
334
341
  self.nlcgrids.level = getattr(
335
342
  __config__, 'dft_rks_RKS_nlcgrids_level', self.nlcgrids.level)
336
- # Use rho to filter grids
337
- self.small_rho_cutoff = getattr(
338
- __config__, 'dft_rks_RKS_small_rho_cutoff', 1e-7)
339
343
  ##################################################
340
344
  # don't modify the following attributes, they are not input options
341
345
  self._numint = numint.NumInt()
pyscf/dft/roks.py CHANGED
@@ -30,12 +30,18 @@ from pyscf.dft import uks
30
30
 
31
31
  @lib.with_doc(uks.get_veff.__doc__)
32
32
  def get_veff(ks, mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1):
33
- if getattr(dm, 'mo_coeff', None) is not None:
33
+ if dm is None:
34
+ dm = ks.make_rdm1()
35
+ elif getattr(dm, 'mo_coeff', None) is not None:
34
36
  mo_coeff = dm.mo_coeff
35
37
  mo_occ_a = (dm.mo_occ > 0).astype(numpy.double)
36
38
  mo_occ_b = (dm.mo_occ ==2).astype(numpy.double)
39
+ if dm.ndim == 2: # RHF DM
40
+ dm = numpy.repeat(dm[None]*.5, 2, axis=0)
37
41
  dm = lib.tag_array(dm, mo_coeff=(mo_coeff,mo_coeff),
38
42
  mo_occ=(mo_occ_a,mo_occ_b))
43
+ elif dm.ndim == 2: # RHF DM
44
+ dm = numpy.repeat(dm[None]*.5, 2, axis=0)
39
45
  return uks.get_veff(ks, mol, dm, dm_last, vhf_last, hermi)
40
46
 
41
47
 
pyscf/dft/uks.py CHANGED
@@ -36,7 +36,8 @@ def get_veff(ks, mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1):
36
36
  if not isinstance(dm, numpy.ndarray):
37
37
  dm = numpy.asarray(dm)
38
38
  if dm.ndim == 2: # RHF DM
39
- dm = numpy.asarray((dm*.5,dm*.5))
39
+ logger.warn(ks, 'Incompatible dm dimension. Treat dm as RHF density matrix.')
40
+ dm = numpy.repeat(dm[None]*.5, 2, axis=0)
40
41
  ks.initialize_grids(mol, dm)
41
42
 
42
43
  t0 = (logger.process_clock(), logger.perf_counter())
@@ -63,37 +64,44 @@ def get_veff(ks, mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1):
63
64
  logger.debug(ks, 'nelec with nlc grids = %s', n)
64
65
  t0 = logger.timer(ks, 'vxc', *t0)
65
66
 
67
+ incremental_jk = (ks._eri is None and ks.direct_scf and
68
+ getattr(vhf_last, 'vj', None) is not None)
69
+ if incremental_jk:
70
+ dm_last = numpy.asarray(dm_last)
71
+ dm = numpy.asarray(dm)
72
+ assert dm_last.ndim == 0 or dm_last.ndim == dm.ndim
73
+ _dm = dm - dm_last
74
+ else:
75
+ _dm = dm
66
76
  if not ni.libxc.is_hybrid_xc(ks.xc):
67
77
  vk = None
68
- if (ks._eri is None and ks.direct_scf and
69
- getattr(vhf_last, 'vj', None) is not None):
70
- ddm = numpy.asarray(dm) - numpy.asarray(dm_last)
71
- vj = ks.get_j(mol, ddm[0]+ddm[1], hermi)
78
+ vj = ks.get_j(mol, _dm[0]+_dm[1], hermi)
79
+ if incremental_jk:
72
80
  vj += vhf_last.vj
73
- else:
74
- vj = ks.get_j(mol, dm[0]+dm[1], hermi)
75
81
  vxc += vj
76
82
  else:
77
83
  omega, alpha, hyb = ni.rsh_and_hybrid_coeff(ks.xc, spin=mol.spin)
78
- if (ks._eri is None and ks.direct_scf and
79
- getattr(vhf_last, 'vk', None) is not None):
80
- ddm = numpy.asarray(dm) - numpy.asarray(dm_last)
81
- vj, vk = ks.get_jk(mol, ddm, hermi)
84
+ if omega == 0:
85
+ vj, vk = ks.get_jk(mol, _dm, hermi)
82
86
  vk *= hyb
83
- if omega != 0:
84
- vklr = ks.get_k(mol, ddm, hermi, omega)
85
- vklr *= (alpha - hyb)
86
- vk += vklr
87
- vj = vj[0] + vj[1] + vhf_last.vj
88
- vk += vhf_last.vk
89
- else:
90
- vj, vk = ks.get_jk(mol, dm, hermi)
91
- vj = vj[0] + vj[1]
87
+ elif alpha == 0: # LR=0, only SR exchange
88
+ vj = ks.get_j(mol, _dm, hermi)
89
+ vk = ks.get_k(mol, _dm, hermi, omega=-omega)
90
+ vk *= hyb
91
+ elif hyb == 0: # SR=0, only LR exchange
92
+ vj = ks.get_j(mol, _dm, hermi)
93
+ vk = ks.get_k(mol, _dm, hermi, omega=omega)
94
+ vk *= alpha
95
+ else: # SR and LR exchange with different ratios
96
+ vj, vk = ks.get_jk(mol, _dm, hermi)
92
97
  vk *= hyb
93
- if omega != 0:
94
- vklr = ks.get_k(mol, dm, hermi, omega)
95
- vklr *= (alpha - hyb)
96
- vk += vklr
98
+ vklr = ks.get_k(mol, _dm, hermi, omega=omega)
99
+ vklr *= (alpha - hyb)
100
+ vk += vklr
101
+ vj = vj[0] + vj[1]
102
+ if incremental_jk:
103
+ vj += vhf_last.vj
104
+ vk += vhf_last.vk
97
105
  vxc += vj - vk
98
106
 
99
107
  if ground_state:
@@ -178,7 +186,8 @@ class UKS(rks.KohnShamDFT, uhf.UHF):
178
186
  ground_state = (isinstance(dm, numpy.ndarray)
179
187
  and dm.ndim == 3 and dm.shape[0] == 2)
180
188
  if ground_state:
181
- super().initialize_grids(mol, dm[0]+dm[1])
189
+ dm = numpy.asarray(dm[0] + dm[1])
190
+ super().initialize_grids(mol, dm)
182
191
  else:
183
192
  super().initialize_grids(mol)
184
193
  return self
pyscf/dft/xc_deriv.py CHANGED
@@ -455,7 +455,7 @@ def _stack_fggg(fggg, axis=0, rho=None):
455
455
  @lru_cache(100)
456
456
  def _product_uniq_indices(nvars, order):
457
457
  '''
458
- Indexing the symmetry unique elements in cartensian product
458
+ Indexing the symmetry unique elements in cartesian product
459
459
  '''
460
460
  # n = 0
461
461
  # for i range(nvars):
pyscf/dft/xcfun.py CHANGED
@@ -36,10 +36,61 @@ _itrf = lib.load_library('libxcfun_itrf')
36
36
  _itrf.xcfun_splash.restype = ctypes.c_char_p
37
37
  _itrf.xcfun_version.restype = ctypes.c_char_p
38
38
  _itrf.XCFUN_eval_xc.restype = ctypes.c_int
39
+ _itrf.xcfun_enumerate_parameters.restype = ctypes.c_char_p
40
+ _itrf.XCFUN_xc_type.restype = ctypes.c_int
41
+ _itrf.xcfun_describe_short.restype = ctypes.c_char_p
42
+ _itrf.xcfun_describe_short.argtype = [ctypes.c_char_p]
43
+ _itrf.xcfun_describe_long.restype = ctypes.c_char_p
44
+ _itrf.xcfun_describe_long.argtype = [ctypes.c_char_p]
39
45
 
40
46
  __version__ = _itrf.xcfun_version().decode("UTF-8")
41
47
  __reference__ = _itrf.xcfun_splash().decode("UTF-8")
42
48
 
49
+ def print_XC_CODES():
50
+ '''
51
+ Dump the built-in xcfun XC_CODES in a readable format.
52
+ '''
53
+ lda_ids = []
54
+ gga_ids = []
55
+ mgga_ids = []
56
+ xc_codes = {}
57
+
58
+ print('XC = XC_CODES = {')
59
+ for i in range(78):
60
+ name = _itrf.xcfun_enumerate_parameters(ctypes.c_int(i))
61
+ sdescr = _itrf.xcfun_describe_short(name)
62
+ #ldescr = _itrf.xcfun_describe_long(ctypes.c_int(i))
63
+ if sdescr is not None:
64
+ name = name.decode('UTF-8')
65
+ key = f"'{name}'"
66
+ sdescr = sdescr.decode('UTF-8')
67
+ print(f'{key:<16s}: {i:2d}, #{sdescr}')
68
+ xc_codes[name] = i
69
+
70
+ fntype = _itrf.XCFUN_xc_type(ctypes.c_int(i))
71
+ if fntype == 0:
72
+ lda_ids.append(i)
73
+ elif fntype == 1:
74
+ gga_ids.append(i)
75
+ elif fntype == 2:
76
+ mgga_ids.append(i)
77
+
78
+ alias = {
79
+ 'SLATER': 'SLATERX',
80
+ 'LDA' : 'SLATERX',
81
+ 'VWN' : 'VWN5C',
82
+ 'VWN5' : 'VWN5C',
83
+ 'B88' : 'BECKEX',
84
+ 'LYP' : 'LYPC',
85
+ }
86
+ for k, v in alias.items():
87
+ key = f"'{k}'"
88
+ print(f'{key:<16s}: {xc_codes[v]:2d}, # {v}')
89
+ print('}')
90
+ print('LDA_IDS = %s' % lda_ids)
91
+ print('GGA_IDS = %s' % gga_ids)
92
+ print('MGGA_IDS = %s' % mgga_ids)
93
+
43
94
  XC = XC_CODES = {
44
95
  'SLATERX' : 0, #Slater LDA exchange
45
96
  'PW86X' : 1, #PW86 exchange
@@ -449,7 +500,7 @@ def parse_xc(description):
449
500
  fac, key = token.split('*')
450
501
  if fac[0].isalpha():
451
502
  fac, key = key, fac
452
- fac = sign * float(fac.replace('_', '-'))
503
+ fac = sign * float(fac.replace('E_', 'E-'))
453
504
  else:
454
505
  fac, key = sign, token
455
506
 
@@ -833,7 +884,7 @@ XC_D0000003 = 119
833
884
 
834
885
  def eval_xc(xc_code, rho, spin=0, relativity=0, deriv=1, omega=None, verbose=None):
835
886
  r'''Interface to call xcfun library to evaluate XC functional, potential
836
- and functional derivatives. Return deriviates following libxc convention.
887
+ and functional derivatives. Return derivatives following libxc convention.
837
888
 
838
889
  See also :func:`pyscf.dft.libxc.eval_xc`
839
890
  '''
pyscf/eph/eph_fd.py CHANGED
@@ -101,7 +101,7 @@ def kernel(mf, disp=1e-4, mo_rep=False, cutoff_frequency=CUTOFF_FREQUENCY, keep_
101
101
  omega, vec = get_mode(mf, cutoff_frequency, keep_imag_frequency)
102
102
  mass = mol.atom_mass_list() * MP_ME
103
103
  vec = rhf_eph._freq_mass_weighted_vec(vec, omega, mass)
104
- mols_a, mols_b = gen_moles(mol, disp/2.0) # generate a bunch of molecules with disp/2 on each cartesion coord
104
+ mols_a, mols_b = gen_moles(mol, disp/2.0) # generate a bunch of molecules with disp/2 on each cartesian coord
105
105
  mfset = run_mfs(mf, mols_a, mols_b) # run mean field calculations on all these molecules
106
106
  vmat = get_vmat(mf, mfset, disp) # extracting <p|dV|q>/dR
107
107
  if mo_rep:
pyscf/eph/rhf.py CHANGED
@@ -23,7 +23,7 @@ Analytical electron-phonon matrix for restricted hartree fock
23
23
  import numpy as np
24
24
  import scipy.linalg
25
25
  from pyscf.hessian import rhf
26
- from pyscf.lib import logger, chkfile
26
+ from pyscf.lib import logger
27
27
  from pyscf.scf._response_functions import _gen_rhf_response
28
28
  from pyscf import __config__
29
29
  from pyscf.data.nist import HARTREE2WAVENUMBER, MP_ME
@@ -37,16 +37,16 @@ def kernel(ephobj, mo_energy=None, mo_coeff=None, mo_occ=None, mo_rep=False):
37
37
  if mo_coeff is None: mo_coeff = ephobj.base.mo_coeff
38
38
  if mo_occ is None: mo_occ = ephobj.base.mo_occ
39
39
 
40
- # chkfile is used to pass first orbitals from hessian methods to eph methods
41
- # TODO: Remove the dependence to chfile and return first orbitals from a function
42
- assert ephobj.chkfile is not None, 'chkfile is required to save first order orbitals'
40
+ h1ao = ephobj.make_h1(mo_coeff, mo_occ)
41
+ mo1, mo_e1 = ephobj.solve_mo1(mo_energy, mo_coeff, mo_occ, h1ao)
43
42
 
44
- de = ephobj.hess_elec(mo_energy, mo_coeff, mo_occ)
43
+ de = ephobj.hess_elec(mo_energy, mo_coeff, mo_occ,
44
+ mo1=mo1, mo_e1=mo_e1, h1ao=h1ao)
45
45
  ephobj.de = de + ephobj.hess_nuc(ephobj.mol)
46
46
 
47
47
  omega, vec = ephobj.get_mode(ephobj.mol, ephobj.de)
48
48
  ephobj.omega, ephobj.vec = omega, vec
49
- ephobj.eph = ephobj.get_eph(ephobj.chkfile, omega, vec, mo_rep)
49
+ ephobj.eph = ephobj.get_eph(mo1, omega, vec, mo_rep)
50
50
  return ephobj.eph, ephobj.omega
51
51
 
52
52
  def solve_hmat(mol, hmat, cutoff_frequency=CUTOFF_FREQUENCY,
@@ -143,10 +143,6 @@ def _freq_mass_weighted_vec(vec, omega, mass):
143
143
  return vec
144
144
 
145
145
  def get_eph(ephobj, mo1, omega, vec, mo_rep):
146
- if isinstance(mo1, str):
147
- mo1 = chkfile.load(mo1, 'scf_mo1')
148
- mo1 = {int(k): mo1[k] for k in mo1}
149
-
150
146
  mol = ephobj.mol
151
147
  mf = ephobj.base
152
148
  vnuc_deriv = ephobj.vnuc_generator(mol)
@@ -209,29 +205,3 @@ class EPH(rhf.Hessian):
209
205
  get_eph = get_eph
210
206
  vnuc_generator = vnuc_generator
211
207
  kernel = kernel
212
-
213
- if __name__ == '__main__':
214
- from pyscf import gto, scf
215
-
216
- mol = gto.M()
217
- mol.atom = [['O', [0.000000000000, -0.000000000775, 0.923671924285]],
218
- ['H', [-0.000000000000, -1.432564848017, 2.125164039823]],
219
- ['H', [0.000000000000, 1.432564848792, 2.125164035930]]]
220
- mol.unit = 'Bohr'
221
- mol.basis = 'sto3g'
222
- mol.verbose=4
223
- mol.build() # this is a pre-computed relaxed geometry
224
-
225
- mf = scf.RHF(mol)
226
- mf.conv_tol = 1e-16
227
- mf.conv_tol_grad = 1e-10
228
- mf.kernel()
229
-
230
- myeph = EPH(mf)
231
-
232
- grad = mf.nuc_grad_method().kernel()
233
- print("Force on the atoms/au:")
234
- print(grad)
235
-
236
- eph, omega = myeph.kernel(mo_rep=True)
237
- print(np.amax(eph))
pyscf/eph/rks.py CHANGED
@@ -100,10 +100,6 @@ def _get_vxc_deriv1(hessobj, mo_coeff, mo_occ, max_memory):
100
100
  return vmat
101
101
 
102
102
  def get_eph(ephobj, mo1, omega, vec, mo_rep):
103
- if isinstance(mo1, str):
104
- mo1 = lib.chkfile.load(mo1, 'scf_mo1')
105
- mo1 = {int(k): mo1[k] for k in mo1}
106
-
107
103
  mol = ephobj.mol
108
104
  mf = ephobj.base
109
105
  ni = mf._numint
pyscf/eph/uhf.py CHANGED
@@ -54,18 +54,12 @@ def uhf_deriv_generator(mf, mo_coeff, mo_occ):
54
54
  return fx
55
55
 
56
56
  def get_eph(ephobj, mo1, omega, vec, mo_rep):
57
- if isinstance(mo1, str):
58
- mo1 = lib.chkfile.load(mo1, 'scf_mo1')
59
- mo1a = mo1['0']
60
- mo1b = mo1['1']
61
- mo1a = {int(k): mo1a[k] for k in mo1a}
62
- mo1b = {int(k): mo1b[k] for k in mo1b}
63
-
64
57
  mol = ephobj.mol
65
58
  mf = ephobj.base
66
59
  vnuc_deriv = ephobj.vnuc_generator(mol)
67
60
  aoslices = mol.aoslice_by_atom()
68
61
 
62
+ mo1a, mo1b = mo1
69
63
  mo_coeff, mo_occ = mf.mo_coeff, mf.mo_occ
70
64
  vind = uhf_deriv_generator(mf, mf.mo_coeff, mf.mo_occ)
71
65
  nao, nmo = mo_coeff[0].shape
pyscf/eph/uks.py CHANGED
@@ -124,13 +124,6 @@ def _get_vxc_deriv1(hessobj, mo_coeff, mo_occ, max_memory):
124
124
  return vmata, vmatb
125
125
 
126
126
  def get_eph(ephobj, mo1, omega, vec, mo_rep):
127
- if isinstance(mo1, str):
128
- mo1 = lib.chkfile.load(mo1, 'scf_mo1')
129
- mo1a = mo1['0']
130
- mo1b = mo1['1']
131
- mo1a = {int(k): mo1a[k] for k in mo1a}
132
- mo1b = {int(k): mo1b[k] for k in mo1b}
133
-
134
127
  mol = ephobj.mol
135
128
  mf = ephobj.base
136
129
  ni = mf._numint
@@ -141,6 +134,7 @@ def get_eph(ephobj, mo1, omega, vec, mo_rep):
141
134
  vnuc_deriv = ephobj.vnuc_generator(mol)
142
135
  aoslices = mol.aoslice_by_atom()
143
136
 
137
+ mo1a, mo1b = mo1
144
138
  mo_coeff, mo_occ = mf.mo_coeff, mf.mo_occ
145
139
  vind = uhf_deriv_generator(mf, mf.mo_coeff, mf.mo_occ)
146
140
  mem_now = lib.current_memory()[0]