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/pbc/tdscf/kuhf.py CHANGED
@@ -17,41 +17,250 @@
17
17
  #
18
18
 
19
19
  from functools import reduce
20
- import numpy
20
+ import numpy as np
21
21
  from pyscf import lib
22
22
  from pyscf.lib import logger
23
23
  from pyscf.tdscf import uhf
24
+ from pyscf.tdscf._lr_eig import eigh as lr_eigh, eig as lr_eig
24
25
  from pyscf.pbc import scf
25
- from pyscf.pbc.tdscf.krhf import KTDBase, _get_e_ia, purify_krlyov_heff
26
- from pyscf.pbc.lib.kpts_helper import gamma_point
26
+ from pyscf.pbc.tdscf.krhf import KTDBase, _get_e_ia
27
+ from pyscf.pbc.lib.kpts_helper import is_gamma_point, get_kconserv_ria, conj_mapping
27
28
  from pyscf.pbc.scf import _response_functions # noqa
28
29
  from pyscf import __config__
29
30
 
30
31
  REAL_EIG_THRESHOLD = getattr(__config__, 'pbc_tdscf_uhf_TDDFT_pick_eig_threshold', 1e-3)
31
32
 
33
+ def get_ab(mf, kshift=0):
34
+ r'''A and B matrices for TDDFT response function.
35
+
36
+ A[i,a,j,b] = \delta_{ab}\delta_{ij}(E_a - E_i) + (ai||jb)
37
+ B[i,a,j,b] = (ai||bj)
38
+
39
+ Ref: Chem Phys Lett, 256, 454
40
+
41
+ Kwargs:
42
+ kshift : integer
43
+ The index of the k-point that represents the transition between
44
+ k-points in the excitation coefficients.
45
+ '''
46
+ cell = mf.cell
47
+ mo_energy = scf.addons.mo_energy_with_exxdiv_none(mf)
48
+ mo_a, mo_b = mo = np.asarray(mf.mo_coeff)
49
+ mo_occ = np.asarray(mf.mo_occ)
50
+ kpts = mf.kpts
51
+ nkpts, nao, nmo = mo_a.shape
52
+ noccs = np.count_nonzero(mo_occ!=0, axis=2)
53
+ nocc = noccs[0,0]
54
+ nvir = nmo - nocc
55
+ assert np.all(noccs == nocc)
56
+ nocc_a = nocc_b = nocc
57
+ nvir_a = nvir_b = nvir
58
+ orbo_a = mo_a[:,:,:nocc]
59
+ orbo_b = mo_b[:,:,:nocc]
60
+ orbv_a = mo_a[:,:,nocc:]
61
+ orbv_b = mo_b[:,:,nocc:]
62
+
63
+ kconserv = get_kconserv_ria(cell, kpts)[kshift]
64
+ e_ia_a = np.asarray(_get_e_ia(mo_energy[0], mo_occ[0], kconserv)).astype(mo.dtype)
65
+ e_ia_b = np.asarray(_get_e_ia(mo_energy[1], mo_occ[1], kconserv)).astype(mo.dtype)
66
+ a_aa = np.diag(e_ia_a.ravel()).reshape(nkpts,nocc_a,nvir_a,nkpts,nocc_a,nvir_a)
67
+ a_bb = np.diag(e_ia_b.ravel()).reshape(nkpts,nocc_b,nvir_b,nkpts,nocc_b,nvir_b)
68
+ a_ab = np.zeros((nkpts,nocc_a,nvir_a,nkpts,nocc_b,nvir_b), dtype=a_aa.dtype)
69
+ b_aa = np.zeros_like(a_aa)
70
+ b_bb = np.zeros_like(a_bb)
71
+ b_ab = np.zeros_like(a_ab)
72
+ a = (a_aa, a_ab, a_bb)
73
+ b = (b_aa, b_ab, b_bb)
74
+ weight = 1./nkpts
75
+
76
+ def add_hf_(a, b, hyb=1):
77
+ eri_aa = mf.with_df.ao2mo_7d([mo_a,orbo_a,mo_a,mo_a], kpts)
78
+ eri_ab = mf.with_df.ao2mo_7d([mo_a,orbo_a,mo_b,mo_b], kpts)
79
+ eri_bb = mf.with_df.ao2mo_7d([mo_b,orbo_b,mo_b,mo_b], kpts)
80
+ eri_aa *= weight
81
+ eri_ab *= weight
82
+ eri_bb *= weight
83
+ eri_aa.reshape(nkpts,nkpts,nkpts,nmo,nocc_a,nmo,nmo)
84
+ eri_ab.reshape(nkpts,nkpts,nkpts,nmo,nocc_a,nmo,nmo)
85
+ eri_bb.reshape(nkpts,nkpts,nkpts,nmo,nocc_b,nmo,nmo)
86
+ a_aa, a_ab, a_bb = a
87
+ b_aa, b_ab, b_bb = b
88
+
89
+ for ki, ka in enumerate(kconserv):
90
+ for kj, kb in enumerate(kconserv):
91
+ a_aa[ki,:,:,kj] += np.einsum('aijb->iajb', eri_aa[ka,ki,kj,nocc_a:,:,:nocc_a,nocc_a:])
92
+ a_aa[ki,:,:,kj] -= np.einsum('jiab->iajb', eri_aa[kj,ki,ka,:nocc_a,:,nocc_a:,nocc_a:]) * hyb
93
+ a_bb[ki,:,:,kj] += np.einsum('aijb->iajb', eri_bb[ka,ki,kj,nocc_b:,:,:nocc_b,nocc_b:])
94
+ a_bb[ki,:,:,kj] -= np.einsum('jiab->iajb', eri_bb[kj,ki,ka,:nocc_b,:,nocc_b:,nocc_b:]) * hyb
95
+ a_ab[ki,:,:,kj] += np.einsum('aijb->iajb', eri_ab[ka,ki,kj,nocc_a:,:,:nocc_b,nocc_b:])
96
+
97
+ for kb, kj in enumerate(kconserv):
98
+ b_aa[ki,:,:,kj] += np.einsum('aibj->iajb', eri_aa[ka,ki,kb,nocc_a:,:,nocc_a:,:nocc_a])
99
+ b_aa[ki,:,:,kj] -= np.einsum('ajbi->iajb', eri_aa[ka,kj,kb,nocc_a:,:,nocc_a:,:nocc_a]) * hyb
100
+ b_bb[ki,:,:,kj] += np.einsum('aibj->iajb', eri_bb[ka,ki,kb,nocc_b:,:,nocc_b:,:nocc_b])
101
+ b_bb[ki,:,:,kj] -= np.einsum('ajbi->iajb', eri_bb[ka,kj,kb,nocc_b:,:,nocc_b:,:nocc_b]) * hyb
102
+ b_ab[ki,:,:,kj] += np.einsum('aibj->iajb', eri_ab[ka,ki,kb,nocc_a:,:,nocc_b:,:nocc_b])
103
+
104
+ if isinstance(mf, scf.hf.KohnShamDFT):
105
+ ni = mf._numint
106
+ omega, alpha, hyb = ni.rsh_and_hybrid_coeff(mf.xc, cell.spin)
107
+
108
+ add_hf_(a, b, hyb)
109
+ if omega != 0: # For RSH
110
+ raise NotImplementedError
111
+
112
+ xctype = ni._xc_type(mf.xc)
113
+ dm0 = mf.make_rdm1(mo, mo_occ)
114
+ make_rho = ni._gen_rho_evaluator(cell, dm0, hermi=1, with_lapl=False)[0]
115
+ mem_now = lib.current_memory()[0]
116
+ max_memory = max(2000, mf.max_memory*.8-mem_now)
117
+ cmap = conj_mapping(cell, kpts)
118
+
119
+ if xctype == 'LDA':
120
+ ao_deriv = 0
121
+ for ao, _, mask, weight, coords \
122
+ in ni.block_loop(cell, mf.grids, nao, ao_deriv, kpts, None, max_memory):
123
+ rho0a = make_rho(0, ao, mask, xctype)
124
+ rho0b = make_rho(1, ao, mask, xctype)
125
+ rho = (rho0a, rho0b)
126
+ fxc = ni.eval_xc_eff(mf.xc, rho, deriv=2, xctype=xctype)[2]
127
+ wfxc = fxc[0,0] * weight
128
+
129
+ rho_o_a = lib.einsum('krp,kpi->kri', ao, orbo_a)
130
+ rho_v_a = lib.einsum('krp,kpi->kri', ao, orbv_a)
131
+ rho_o_b = lib.einsum('krp,kpi->kri', ao, orbo_b)
132
+ rho_v_b = lib.einsum('krp,kpi->kri', ao, orbv_b)
133
+ rho_ov_a = np.einsum('kri,kra->kria', rho_o_a, rho_v_a)
134
+ rho_ov_b = np.einsum('kri,kra->kria', rho_o_b, rho_v_b)
135
+ rho_vo_a = rho_ov_a.conj()[cmap]
136
+ rho_vo_b = rho_ov_b.conj()[cmap]
137
+ w_vo_aa = np.einsum('kria,r->kria', rho_vo_a, wfxc[0,0]) * (1/nkpts)
138
+ w_vo_ab = np.einsum('kria,r->kria', rho_vo_a, wfxc[0,1]) * (1/nkpts)
139
+ w_vo_bb = np.einsum('kria,r->kria', rho_vo_b, wfxc[1,1]) * (1/nkpts)
140
+
141
+ a_aa += lib.einsum('kria,lrjb->kialjb', w_vo_aa, rho_ov_a)
142
+ b_aa += lib.einsum('kria,lrjb->kialjb', w_vo_aa, rho_vo_a)
143
+
144
+ a_ab += lib.einsum('kria,lrjb->kialjb', w_vo_ab, rho_ov_b)
145
+ b_ab += lib.einsum('kria,lrjb->kialjb', w_vo_ab, rho_vo_b)
146
+
147
+ a_bb += lib.einsum('kria,lrjb->kialjb', w_vo_bb, rho_ov_b)
148
+ b_bb += lib.einsum('kria,lrjb->kialjb', w_vo_bb, rho_vo_b)
149
+
150
+ elif xctype == 'GGA':
151
+ ao_deriv = 1
152
+ for ao, _, mask, weight, coords \
153
+ in ni.block_loop(cell, mf.grids, nao, ao_deriv, kpts, None, max_memory):
154
+ rho0a = make_rho(0, ao, mask, xctype)
155
+ rho0b = make_rho(1, ao, mask, xctype)
156
+ rho = (rho0a, rho0b)
157
+ fxc = ni.eval_xc_eff(mf.xc, rho, deriv=2, xctype=xctype)[2]
158
+ wfxc = fxc * weight
159
+
160
+ rho_o_a = lib.einsum('kxrp,kpi->kxri', ao, orbo_a)
161
+ rho_v_a = lib.einsum('kxrp,kpi->kxri', ao, orbv_a)
162
+ rho_o_b = lib.einsum('kxrp,kpi->kxri', ao, orbo_b)
163
+ rho_v_b = lib.einsum('kxrp,kpi->kxri', ao, orbv_b)
164
+ rho_ov_a = np.einsum('kxri,kra->kxria', rho_o_a, rho_v_a[:,0])
165
+ rho_ov_b = np.einsum('kxri,kra->kxria', rho_o_b, rho_v_b[:,0])
166
+ rho_ov_a[:,1:4] += np.einsum('kri,kxra->kxria', rho_o_a[:,0], rho_v_a[:,1:4])
167
+ rho_ov_b[:,1:4] += np.einsum('kri,kxra->kxria', rho_o_b[:,0], rho_v_b[:,1:4])
168
+ rho_vo_a = rho_ov_a.conj()[cmap]
169
+ rho_vo_b = rho_ov_b.conj()[cmap]
170
+ w_vo_aa = np.einsum('xyr,kxria->kyria', wfxc[0,:,0], rho_vo_a) * (1/nkpts)
171
+ w_vo_ab = np.einsum('xyr,kxria->kyria', wfxc[0,:,1], rho_vo_a) * (1/nkpts)
172
+ w_vo_bb = np.einsum('xyr,kxria->kyria', wfxc[1,:,1], rho_vo_b) * (1/nkpts)
173
+
174
+ a_aa += lib.einsum('kxria,lxrjb->kialjb', w_vo_aa, rho_ov_a)
175
+ b_aa += lib.einsum('kxria,lxrjb->kialjb', w_vo_aa, rho_vo_a)
176
+
177
+ a_ab += lib.einsum('kxria,lxrjb->kialjb', w_vo_ab, rho_ov_b)
178
+ b_ab += lib.einsum('kxria,lxrjb->kialjb', w_vo_ab, rho_vo_b)
179
+
180
+ a_bb += lib.einsum('kxria,lxrjb->kialjb', w_vo_bb, rho_ov_b)
181
+ b_bb += lib.einsum('kxria,lxrjb->kialjb', w_vo_bb, rho_vo_b)
182
+
183
+ elif xctype == 'HF':
184
+ pass
185
+
186
+ elif xctype == 'NLC':
187
+ raise NotImplementedError('NLC')
188
+
189
+ elif xctype == 'MGGA':
190
+ ao_deriv = 1
191
+ for ao, _, mask, weight, coords \
192
+ in ni.block_loop(cell, mf.grids, nao, ao_deriv, kpts, None, max_memory):
193
+ rho0a = make_rho(0, ao, mask, xctype)
194
+ rho0b = make_rho(1, ao, mask, xctype)
195
+ rho = (rho0a, rho0b)
196
+ fxc = ni.eval_xc_eff(mf.xc, rho, deriv=2, xctype=xctype)[2]
197
+ wfxc = fxc * weight
198
+
199
+ rho_o_a = lib.einsum('kxrp,kpi->kxri', ao, orbo_a)
200
+ rho_o_b = lib.einsum('kxrp,kpi->kxri', ao, orbo_b)
201
+ rho_v_a = lib.einsum('kxrp,kpi->kxri', ao, orbv_a)
202
+ rho_v_b = lib.einsum('kxrp,kpi->kxri', ao, orbv_b)
203
+ rho_ov_a = np.einsum('kxri,kra->kxria', rho_o_a, rho_v_a[:,0])
204
+ rho_ov_b = np.einsum('kxri,kra->kxria', rho_o_b, rho_v_b[:,0])
205
+ rho_ov_a[:,1:4] += np.einsum('ri,xra->xria', rho_o_a[:,0], rho_v_a[:,1:4])
206
+ rho_ov_b[:,1:4] += np.einsum('ri,xra->xria', rho_o_b[:,0], rho_v_b[:,1:4])
207
+ tau_ov_a = np.einsum('kxri,kxra->kria', rho_o_a[:,1:4], rho_v_a[:,1:4]) * .5
208
+ tau_ov_b = np.einsum('kxri,kxra->kria', rho_o_b[:,1:4], rho_v_b[:,1:4]) * .5
209
+ rho_ov_a = np.vstack([rho_ov_a, tau_ov_a[:,np.newaxis]])
210
+ rho_ov_b = np.vstack([rho_ov_b, tau_ov_b[:,np.newaxis]])
211
+ rho_vo_a = rho_ov_a.conj()[cmap]
212
+ rho_vo_b = rho_ov_b.conj()[cmap]
213
+ w_vo_aa = np.einsum('xyr,kxria->kyria', wfxc[0,:,0], rho_vo_a) * (1/nkpts)
214
+ w_vo_ab = np.einsum('xyr,kxria->kyria', wfxc[0,:,1], rho_vo_a) * (1/nkpts)
215
+ w_vo_bb = np.einsum('xyr,kxria->kyria', wfxc[1,:,1], rho_vo_b) * (1/nkpts)
216
+
217
+ a_aa += lib.einsum('kxria,lxrjb->kilajb', w_vo_aa, rho_ov_a)
218
+ b_aa += lib.einsum('kxria,lxrjb->kilajb', w_vo_aa, rho_vo_a)
219
+
220
+ a_ab += lib.einsum('kxria,lxrjb->kilajb', w_vo_ab, rho_ov_b)
221
+ b_ab += lib.einsum('kxria,lxrjb->kilajb', w_vo_ab, rho_vo_b)
222
+
223
+ a_bb += lib.einsum('kxria,lxrjb->kilajb', w_vo_bb, rho_ov_b)
224
+ b_bb += lib.einsum('kxria,lxrjb->kilajb', w_vo_bb, rho_vo_b)
225
+ else:
226
+ add_hf_(a, b)
227
+
228
+ return a, b
229
+
32
230
  class TDA(KTDBase):
33
- conv_tol = getattr(__config__, 'pbc_tdscf_rhf_TDA_conv_tol', 1e-6)
34
231
 
35
- def gen_vind(self, mf, kshift):
36
- '''Compute Ax'''
37
- kconserv = self.kconserv[kshift]
232
+ def get_ab(self, mf=None, kshift=0):
233
+ if mf is None: mf = self._scf
234
+ return get_ab(mf, kshift)
235
+
236
+ def gen_vind(self, mf, kshift=0):
237
+ '''Compute Ax
238
+
239
+ Kwargs:
240
+ kshift : integer
241
+ The index of the k-point that represents the transition between
242
+ k-points in the excitation coefficients.
243
+ '''
244
+ kconserv = get_kconserv_ria(mf.cell, mf.kpts)[kshift]
245
+
38
246
  mo_coeff = mf.mo_coeff
39
247
  mo_occ = mf.mo_occ
40
248
  nkpts = len(mo_occ[0])
41
249
  nao, nmo = mo_coeff[0][0].shape
42
- occidxa = [numpy.where(mo_occ[0][k]> 0)[0] for k in range(nkpts)]
43
- occidxb = [numpy.where(mo_occ[1][k]> 0)[0] for k in range(nkpts)]
44
- viridxa = [numpy.where(mo_occ[0][k]==0)[0] for k in range(nkpts)]
45
- viridxb = [numpy.where(mo_occ[1][k]==0)[0] for k in range(nkpts)]
250
+ occidxa = [mo_occ[0][k]> 0 for k in range(nkpts)]
251
+ occidxb = [mo_occ[1][k]> 0 for k in range(nkpts)]
252
+ viridxa = [mo_occ[0][k]==0 for k in range(nkpts)]
253
+ viridxb = [mo_occ[1][k]==0 for k in range(nkpts)]
46
254
  orboa = [mo_coeff[0][k][:,occidxa[k]] for k in range(nkpts)]
47
255
  orbob = [mo_coeff[1][k][:,occidxb[k]] for k in range(nkpts)]
48
- orbva = [mo_coeff[0][kconserv[k]][:,viridxa[kconserv[k]]] for k in range(nkpts)]
49
- orbvb = [mo_coeff[1][kconserv[k]][:,viridxb[kconserv[k]]] for k in range(nkpts)]
256
+ orbva = [mo_coeff[0][k][:,viridxa[k]] for k in range(nkpts)]
257
+ orbvb = [mo_coeff[1][k][:,viridxb[k]] for k in range(nkpts)]
258
+ dtype = np.result_type(*mo_coeff[0])
50
259
 
51
260
  moe = scf.addons.mo_energy_with_exxdiv_none(mf)
52
261
  e_ia_a = _get_e_ia(moe[0], mo_occ[0], kconserv)
53
262
  e_ia_b = _get_e_ia(moe[1], mo_occ[1], kconserv)
54
- hdiag = numpy.hstack([x.ravel() for x in (e_ia_a + e_ia_b)])
263
+ hdiag = np.hstack([x.ravel() for x in (e_ia_a + e_ia_b)])
55
264
 
56
265
  mem_now = lib.current_memory()[0]
57
266
  max_memory = max(2000, self.max_memory*.8-mem_now)
@@ -60,32 +269,31 @@ class TDA(KTDBase):
60
269
  def vind(zs):
61
270
  nz = len(zs)
62
271
  zs = [_unpack(z, mo_occ, kconserv) for z in zs]
63
- dmov = numpy.empty((2,nz,nkpts,nao,nao), dtype=numpy.complex128)
272
+ dms = np.empty((2,nz,nkpts,nao,nao), dtype=dtype)
64
273
  for i in range(nz):
65
274
  dm1a, dm1b = zs[i]
66
- for k in range(nkpts):
67
- dmov[0,i,k] = reduce(numpy.dot, (orboa[k], dm1a[k], orbva[k].conj().T))
68
- dmov[1,i,k] = reduce(numpy.dot, (orbob[k], dm1b[k], orbvb[k].conj().T))
275
+ for k, kp in enumerate(kconserv):
276
+ dms[0,i,kp] = lib.einsum('ov,pv,qo->pq', dm1a[k], orbva[kp], orboa[k].conj())
277
+ dms[1,i,kp] = lib.einsum('ov,pv,qo->pq', dm1b[k], orbvb[kp], orbob[k].conj())
69
278
 
70
279
  with lib.temporary_env(mf, exxdiv=None):
71
- dmov = dmov.reshape(2,nz,nkpts,nao,nao)
72
- v1ao = vresp(dmov, kshift)
280
+ v1ao = vresp(dms, kshift)
73
281
  v1ao = v1ao.reshape(2,nz,nkpts,nao,nao)
74
282
 
75
283
  v1s = []
76
284
  for i in range(nz):
77
285
  dm1a, dm1b = zs[i]
78
- v1as = []
79
- v1bs = []
80
- for k in range(nkpts):
81
- v1a = reduce(numpy.dot, (orboa[k].conj().T, v1ao[0,i,k], orbva[k]))
82
- v1b = reduce(numpy.dot, (orbob[k].conj().T, v1ao[1,i,k], orbvb[k]))
286
+ v1as = [None] * nkpts
287
+ v1bs = [None] * nkpts
288
+ for k, kp in enumerate(kconserv):
289
+ v1a = lib.einsum('pq,qo,pv->ov', v1ao[0,i,kp], orboa[k], orbva[kp].conj())
290
+ v1b = lib.einsum('pq,qo,pv->ov', v1ao[1,i,kp], orbob[k], orbvb[kp].conj())
83
291
  v1a += e_ia_a[k] * dm1a[k]
84
292
  v1b += e_ia_b[k] * dm1b[k]
85
- v1as.append(v1a.ravel())
86
- v1bs.append(v1b.ravel())
87
- v1s.append( numpy.concatenate(v1as + v1bs) )
88
- return lib.asarray(v1s).reshape(nz,-1)
293
+ v1as[k] = v1a.ravel()
294
+ v1bs[k] = v1b.ravel()
295
+ v1s.append( np.concatenate(v1as + v1bs) )
296
+ return np.stack(v1s)
89
297
 
90
298
  return vind, hdiag
91
299
 
@@ -94,18 +302,18 @@ class TDA(KTDBase):
94
302
 
95
303
  mo_energy = mf.mo_energy
96
304
  mo_occ = mf.mo_occ
97
- kconserv = self.kconserv[kshift]
305
+ kconserv = get_kconserv_ria(mf.cell, mf.kpts)[kshift]
98
306
  e_ia_a = _get_e_ia(mo_energy[0], mo_occ[0], kconserv)
99
307
  e_ia_b = _get_e_ia(mo_energy[1], mo_occ[1], kconserv)
100
- e_ia = numpy.hstack([x.ravel() for x in (e_ia_a + e_ia_b)])
308
+ e_ia = np.hstack([x.ravel() for x in (e_ia_a + e_ia_b)])
101
309
 
102
310
  nov = e_ia.size
103
311
  nstates = min(nstates, nov)
104
- e_threshold = numpy.sort(e_ia)[nstates-1]
312
+ e_threshold = np.partition(e_ia, nstates-1)[nstates-1]
105
313
  e_threshold += self.deg_eia_thresh
106
314
 
107
- idx = numpy.where(e_ia <= e_threshold)[0]
108
- x0 = numpy.zeros((idx.size, nov))
315
+ idx = np.where(e_ia <= e_threshold)[0]
316
+ x0 = np.zeros((idx.size, nov))
109
317
  for i, j in enumerate(idx):
110
318
  x0[i, j] = 1 # Koopmans' excitations
111
319
  return x0
@@ -123,18 +331,16 @@ class TDA(KTDBase):
123
331
  mo_occ = mf.mo_occ
124
332
 
125
333
  def pickeig(w, v, nroots, envs):
126
- idx = numpy.where(w > self.positive_eig_threshold)[0]
334
+ idx = np.where(w > self.positive_eig_threshold)[0]
127
335
  return w[idx], v[:,idx], idx
128
336
 
129
337
  log = logger.Logger(self.stdout, self.verbose)
130
- precision = self.cell.precision * 1e-2
131
- hermi = 1
132
338
 
133
339
  self.converged = []
134
340
  self.e = []
135
341
  self.xy = []
136
342
  for i,kshift in enumerate(self.kshift_lst):
137
- kconserv = self.kconserv[kshift]
343
+ kconserv = get_kconserv_ria(mf.cell, mf.kpts)[kshift]
138
344
 
139
345
  vind, hdiag = self.gen_vind(self._scf, kshift)
140
346
  precond = self.get_precond(hdiag)
@@ -144,15 +350,10 @@ class TDA(KTDBase):
144
350
  else:
145
351
  x0k = x0[i]
146
352
 
147
- converged, e, x1 = \
148
- lib.davidson1(vind, x0k, precond,
149
- tol=self.conv_tol,
150
- max_cycle=self.max_cycle,
151
- nroots=self.nstates,
152
- lindep=self.lindep,
153
- max_space=self.max_space, pick=pickeig,
154
- fill_heff=purify_krlyov_heff(precision, hermi, log),
155
- verbose=self.verbose)
353
+ converged, e, x1 = lr_eigh(
354
+ vind, x0k, precond, tol_residual=self.conv_tol, lindep=self.lindep,
355
+ nroots=self.nstates, pick=pickeig, max_cycle=self.max_cycle,
356
+ max_memory=self.max_memory, verbose=log)
156
357
  self.converged.append( converged )
157
358
  self.e.append( e )
158
359
  self.xy.append( [(_unpack(xi, mo_occ, kconserv), # (X_alpha, X_beta)
@@ -165,30 +366,34 @@ class TDA(KTDBase):
165
366
  CIS = KTDA = TDA
166
367
 
167
368
 
168
- class TDHF(TDA):
169
- def gen_vind(self, mf, kshift):
170
- kconserv = self.kconserv[kshift]
369
+ class TDHF(KTDBase):
370
+
371
+ get_ab = TDA.get_ab
372
+
373
+ def gen_vind(self, mf, kshift=0):
374
+ assert kshift == 0
375
+
171
376
  mo_coeff = mf.mo_coeff
172
377
  mo_occ = mf.mo_occ
173
378
  nkpts = len(mo_occ[0])
174
379
  nao, nmo = mo_coeff[0][0].shape
175
- occidxa = [numpy.where(mo_occ[0][k]> 0)[0] for k in range(nkpts)]
176
- occidxb = [numpy.where(mo_occ[1][k]> 0)[0] for k in range(nkpts)]
177
- viridxa = [numpy.where(mo_occ[0][k]==0)[0] for k in range(nkpts)]
178
- viridxb = [numpy.where(mo_occ[1][k]==0)[0] for k in range(nkpts)]
380
+ occidxa = [mo_occ[0][k]> 0 for k in range(nkpts)]
381
+ occidxb = [mo_occ[1][k]> 0 for k in range(nkpts)]
382
+ viridxa = [mo_occ[0][k]==0 for k in range(nkpts)]
383
+ viridxb = [mo_occ[1][k]==0 for k in range(nkpts)]
179
384
  orboa = [mo_coeff[0][k][:,occidxa[k]] for k in range(nkpts)]
180
385
  orbob = [mo_coeff[1][k][:,occidxb[k]] for k in range(nkpts)]
181
- orbva = [mo_coeff[0][kconserv[k]][:,viridxa[kconserv[k]]] for k in range(nkpts)]
182
- orbvb = [mo_coeff[1][kconserv[k]][:,viridxb[kconserv[k]]] for k in range(nkpts)]
386
+ orbva = [mo_coeff[0][k][:,viridxa[k]] for k in range(nkpts)]
387
+ orbvb = [mo_coeff[1][k][:,viridxb[k]] for k in range(nkpts)]
388
+ dtype = np.result_type(*mo_coeff[0])
183
389
 
390
+ kconserv = np.arange(nkpts)
184
391
  moe = scf.addons.mo_energy_with_exxdiv_none(mf)
185
392
  e_ia_a = _get_e_ia(moe[0], mo_occ[0], kconserv)
186
393
  e_ia_b = _get_e_ia(moe[1], mo_occ[1], kconserv)
187
- hdiag = numpy.hstack([x.ravel() for x in (e_ia_a + e_ia_b)])
188
- hdiag = numpy.hstack((hdiag, -hdiag))
189
- tot_x_a = sum(x.size for x in e_ia_a)
190
- tot_x_b = sum(x.size for x in e_ia_b)
191
- tot_x = tot_x_a + tot_x_b
394
+ hdiag = np.hstack([x.ravel() for x in (e_ia_a + e_ia_b)])
395
+ tot_x = hdiag.size
396
+ hdiag = np.hstack((hdiag, -hdiag))
192
397
 
193
398
  mem_now = lib.current_memory()[0]
194
399
  max_memory = max(2000, self.max_memory*.8-mem_now)
@@ -198,53 +403,52 @@ class TDHF(TDA):
198
403
  nz = len(xys)
199
404
  x1s = [_unpack(x[:tot_x], mo_occ, kconserv) for x in xys]
200
405
  y1s = [_unpack(x[tot_x:], mo_occ, kconserv) for x in xys]
201
- dmov = numpy.empty((2,nz,nkpts,nao,nao), dtype=numpy.complex128)
406
+ dms = np.empty((2,nz,nkpts,nao,nao), dtype=dtype)
202
407
  for i in range(nz):
203
408
  xa, xb = x1s[i]
204
409
  ya, yb = y1s[i]
205
410
  for k in range(nkpts):
206
- dmx = reduce(numpy.dot, (orboa[k], xa[k] , orbva[k].conj().T))
207
- dmy = reduce(numpy.dot, (orbva[k], ya[k].T, orboa[k].conj().T))
208
- dmov[0,i,k] = dmx + dmy # AX + BY
209
- dmx = reduce(numpy.dot, (orbob[k], xb[k] , orbvb[k].conj().T))
210
- dmy = reduce(numpy.dot, (orbvb[k], yb[k].T, orbob[k].conj().T))
211
- dmov[1,i,k] = dmx + dmy # AX + BY
411
+ dms[0,i,k] = lib.einsum('ov,pv,qo->pq', xa[k], orbva[k], orboa[k].conj())
412
+ dms[1,i,k] = lib.einsum('ov,pv,qo->pq', xb[k], orbvb[k], orbob[k].conj())
413
+ dms[0,i,k] += lib.einsum('ov,qv,po->pq', ya[k], orbva[k].conj(), orboa[k])
414
+ dms[1,i,k] += lib.einsum('ov,qv,po->pq', yb[k], orbvb[k].conj(), orbob[k])
212
415
 
213
416
  with lib.temporary_env(mf, exxdiv=None):
214
- dmov = dmov.reshape(2,nz,nkpts,nao,nao)
215
- v1ao = vresp(dmov, kshift)
417
+ v1ao = vresp(dms, kshift)
216
418
  v1ao = v1ao.reshape(2,nz,nkpts,nao,nao)
217
419
 
218
420
  v1s = []
219
421
  for i in range(nz):
220
422
  xa, xb = x1s[i]
221
423
  ya, yb = y1s[i]
222
- v1xsa = []
223
- v1xsb = []
224
- v1ysa = []
225
- v1ysb = []
424
+ v1xsa = [0] * nkpts
425
+ v1xsb = [0] * nkpts
426
+ v1ysa = [0] * nkpts
427
+ v1ysb = [0] * nkpts
226
428
  for k in range(nkpts):
227
- v1xa = reduce(numpy.dot, (orboa[k].conj().T, v1ao[0,i,k], orbva[k]))
228
- v1xb = reduce(numpy.dot, (orbob[k].conj().T, v1ao[1,i,k], orbvb[k]))
229
- v1ya = reduce(numpy.dot, (orbva[k].conj().T, v1ao[0,i,k], orboa[k])).T
230
- v1yb = reduce(numpy.dot, (orbvb[k].conj().T, v1ao[1,i,k], orbob[k])).T
231
- v1xa+= e_ia_a[k] * xa[k]
232
- v1xb+= e_ia_b[k] * xb[k]
233
- v1ya+= e_ia_a[k] * ya[k]
234
- v1yb+= e_ia_b[k] * yb[k]
235
- v1xsa.append(v1xa.ravel())
236
- v1xsb.append(v1xb.ravel())
237
- v1ysa.append(-v1ya.ravel())
238
- v1ysb.append(-v1yb.ravel())
239
- v1s.append( numpy.concatenate(v1xsa + v1xsb + v1ysa + v1ysb) )
240
- return numpy.hstack(v1s).reshape(nz,-1)
429
+ v1xa = lib.einsum('pq,qo,pv->ov', v1ao[0,i,k], orboa[k], orbva[k].conj())
430
+ v1xb = lib.einsum('pq,qo,pv->ov', v1ao[1,i,k], orbob[k], orbvb[k].conj())
431
+ v1ya = lib.einsum('pq,po,qv->ov', v1ao[0,i,k], orboa[k].conj(), orbva[k])
432
+ v1yb = lib.einsum('pq,po,qv->ov', v1ao[1,i,k], orbob[k].conj(), orbvb[k])
433
+ v1xa += e_ia_a[k] * xa[k]
434
+ v1xb += e_ia_b[k] * xb[k]
435
+ v1ya += e_ia_a[k] * ya[k]
436
+ v1yb += e_ia_b[k] * yb[k]
437
+ v1xsa[k] += v1xa.ravel()
438
+ v1xsb[k] += v1xb.ravel()
439
+ v1ysa[k] -= v1ya.ravel()
440
+ v1ysb[k] -= v1yb.ravel()
441
+ v1s.append( np.concatenate(v1xsa + v1xsb + v1ysa + v1ysb) )
442
+ return np.stack(v1s)
241
443
 
242
444
  return vind, hdiag
243
445
 
244
446
  def init_guess(self, mf, kshift, nstates=None, wfnsym=None):
245
447
  x0 = TDA.init_guess(self, mf, kshift, nstates)
246
- y0 = numpy.zeros_like(x0)
247
- return numpy.asarray(numpy.block([[x0, y0], [y0, x0.conj()]]))
448
+ y0 = np.zeros_like(x0)
449
+ return np.hstack([x0, y0])
450
+
451
+ get_precond = uhf.TDHF.get_precond
248
452
 
249
453
  def kernel(self, x0=None):
250
454
  '''TDHF diagonalization with non-Hermitian eigenvalue solver
@@ -258,23 +462,23 @@ class TDHF(TDA):
258
462
  mf = self._scf
259
463
  mo_occ = mf.mo_occ
260
464
 
261
- real_system = (gamma_point(self._scf.kpts) and
262
- self._scf.mo_coeff[0][0].dtype == numpy.double)
465
+ real_system = (is_gamma_point(self._scf.kpts) and
466
+ self._scf.mo_coeff[0][0].dtype == np.double)
467
+
468
+ if any(k != 0 for k in self.kshift_lst):
469
+ raise RuntimeError('kshift != 0 for TDHF')
263
470
 
264
471
  # We only need positive eigenvalues
265
472
  def pickeig(w, v, nroots, envs):
266
- realidx = numpy.where((abs(w.imag) < REAL_EIG_THRESHOLD) &
473
+ realidx = np.where((abs(w.imag) < REAL_EIG_THRESHOLD) &
267
474
  (w.real > self.positive_eig_threshold))[0]
268
475
  return lib.linalg_helper._eigs_cmplx2real(w, v, realidx, real_system)
269
476
 
270
- log = logger.Logger(self.stdout, self.verbose)
271
- precision = self.cell.precision * 1e-2
272
-
273
477
  self.converged = []
274
478
  self.e = []
275
479
  self.xy = []
276
480
  for i,kshift in enumerate(self.kshift_lst):
277
- kconserv = self.kconserv[kshift]
481
+ kconserv = get_kconserv_ria(mf.cell, mf.kpts)[kshift]
278
482
 
279
483
  vind, hdiag = self.gen_vind(self._scf, kshift)
280
484
  precond = self.get_precond(hdiag)
@@ -284,15 +488,10 @@ class TDHF(TDA):
284
488
  else:
285
489
  x0k = x0[i]
286
490
 
287
- converged, w, x1 = \
288
- lib.davidson_nosym1(vind, x0k, precond,
289
- tol=self.conv_tol,
290
- max_cycle=self.max_cycle,
291
- nroots=self.nstates,
292
- lindep=self.lindep,
293
- max_space=self.max_space, pick=pickeig,
294
- fill_heff=purify_krlyov_heff(precision, 0, log),
295
- verbose=self.verbose)
491
+ converged, w, x1 = lr_eig(
492
+ vind, x0k, precond, tol_residual=self.conv_tol, lindep=self.lindep,
493
+ nroots=self.nstates, pick=pickeig, max_cycle=self.max_cycle,
494
+ max_memory=self.max_memory, verbose=log)
296
495
  self.converged.append( converged )
297
496
 
298
497
  e = []
@@ -300,13 +499,14 @@ class TDHF(TDA):
300
499
  for i, z in enumerate(x1):
301
500
  xs, ys = z.reshape(2,-1)
302
501
  norm = lib.norm(xs)**2 - lib.norm(ys)**2
303
- if norm > 0:
304
- norm = 1/numpy.sqrt(norm)
305
- xs *= norm
306
- ys *= norm
307
- e.append(w[i])
308
- xy.append((_unpack(xs, mo_occ, kconserv), _unpack(ys, mo_occ, kconserv)))
309
- self.e.append( numpy.array(e) )
502
+ if norm < 0:
503
+ log.warn('TDDFT amplitudes |X| smaller than |Y|')
504
+ norm = abs(norm)**-.5
505
+ xs *= norm
506
+ ys *= norm
507
+ e.append(w[i])
508
+ xy.append((_unpack(xs, mo_occ, kconserv), _unpack(ys, mo_occ, kconserv)))
509
+ self.e.append( np.array(e) )
310
510
  self.xy.append( xy )
311
511
 
312
512
  log.timer(self.__class__.__name__, *cpu0)
@@ -318,17 +518,17 @@ def _unpack(vo, mo_occ, kconserv):
318
518
  za = []
319
519
  zb = []
320
520
  p1 = 0
521
+ no_a_kpts = [np.count_nonzero(occ) for occ in mo_occ[0]]
522
+ no_b_kpts = [np.count_nonzero(occ) for occ in mo_occ[1]]
321
523
  for k, occ in enumerate(mo_occ[0]):
322
- no = numpy.count_nonzero(occ > 0)
323
- no1 = numpy.count_nonzero(mo_occ[0][kconserv[k]] > 0)
324
- nv = occ.size - no1
524
+ no = no_a_kpts[k]
525
+ nv = occ.size - no_a_kpts[kconserv[k]]
325
526
  p0, p1 = p1, p1 + no * nv
326
527
  za.append(vo[p0:p1].reshape(no,nv))
327
528
 
328
529
  for k, occ in enumerate(mo_occ[1]):
329
- no = numpy.count_nonzero(occ > 0)
330
- no1 = numpy.count_nonzero(mo_occ[1][kconserv[k]] > 0)
331
- nv = occ.size - no1
530
+ no = no_b_kpts[k]
531
+ nv = occ.size - no_b_kpts[kconserv[k]]
332
532
  p0, p1 = p1, p1 + no * nv
333
533
  zb.append(vo[p0:p1].reshape(no,nv))
334
534
  return za, zb
@@ -336,55 +536,3 @@ def _unpack(vo, mo_occ, kconserv):
336
536
 
337
537
  scf.kuhf.KUHF.TDA = lib.class_as_method(KTDA)
338
538
  scf.kuhf.KUHF.TDHF = lib.class_as_method(KTDHF)
339
-
340
-
341
- if __name__ == '__main__':
342
- from pyscf.pbc import gto
343
- from pyscf.pbc import scf
344
- from pyscf.pbc import df
345
- cell = gto.Cell()
346
- cell.unit = 'B'
347
- cell.atom = '''
348
- C 0. 0. 0.
349
- C 1.68506879 1.68506879 1.68506879
350
- '''
351
- cell.a = '''
352
- 0. 3.37013758 3.37013758
353
- 3.37013758 0. 3.37013758
354
- 3.37013758 3.37013758 0.
355
- '''
356
-
357
- cell.basis = 'gth-szv'
358
- cell.pseudo = 'gth-pade'
359
- cell.mesh = [37]*3
360
- cell.build()
361
- mf = scf.KUHF(cell, cell.make_kpts([2,1,1])).set(exxdiv=None)
362
- # mf.with_df = df.DF(cell, cell.make_kpts([2,1,1]))
363
- # mf.with_df.auxbasis = 'weigend'
364
- # mf.with_df._cderi = 'eri3d-df.h5'
365
- # mf.with_df.build(with_j3c=False)
366
- mf.run()
367
-
368
- td = TDA(mf)
369
- td.verbose = 5
370
- td.nstates = 5
371
- print(td.kernel()[0][0] * 27.2114)
372
-
373
- td = TDHF(mf)
374
- td.verbose = 5
375
- td.nstates = 5
376
- print(td.kernel()[0][0] * 27.2114)
377
-
378
- cell.spin = 2
379
- mf = scf.KUHF(cell, cell.make_kpts([2,1,1])).set(exxdiv=None)
380
- mf.run()
381
-
382
- td = TDA(mf)
383
- td.verbose = 5
384
- td.nstates = 5
385
- print(td.kernel()[0][0] * 27.2114)
386
-
387
- td = TDHF(mf)
388
- td.verbose = 5
389
- td.nstates = 5
390
- print(td.kernel()[0][0] * 27.2114)