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/tdscf/uks.py CHANGED
@@ -21,9 +21,8 @@ import numpy
21
21
  from pyscf import symm
22
22
  from pyscf import lib
23
23
  from pyscf.lib import logger
24
- from pyscf.tdscf import uhf
25
- from pyscf.scf import uhf_symm
26
- from pyscf.data import nist
24
+ from pyscf.tdscf import uhf, rhf
25
+ from pyscf.tdscf._lr_eig import eigh as lr_eigh
27
26
  from pyscf.dft.rks import KohnShamDFT
28
27
  from pyscf import __config__
29
28
 
@@ -46,6 +45,7 @@ class CasidaTDDFT(TDDFT, TDA):
46
45
  '''
47
46
 
48
47
  init_guess = TDA.init_guess
48
+ get_precond = TDA.get_precond
49
49
 
50
50
  def gen_vind(self, mf=None):
51
51
  if mf is None:
@@ -74,13 +74,9 @@ class CasidaTDDFT(TDDFT, TDA):
74
74
  if wfnsym is not None and mol.symmetry:
75
75
  if isinstance(wfnsym, str):
76
76
  wfnsym = symm.irrep_name2id(mol.groupname, wfnsym)
77
- orbsyma, orbsymb = uhf_symm.get_orbsym(mol, mo_coeff)
78
77
  wfnsym = wfnsym % 10 # convert to D2h subgroup
79
- orbsyma_in_d2h = numpy.asarray(orbsyma) % 10
80
- orbsymb_in_d2h = numpy.asarray(orbsymb) % 10
81
- sym_forbida = (orbsyma_in_d2h[occidxa,None] ^ orbsyma_in_d2h[viridxa]) != wfnsym
82
- sym_forbidb = (orbsymb_in_d2h[occidxb,None] ^ orbsymb_in_d2h[viridxb]) != wfnsym
83
- sym_forbid = numpy.hstack((sym_forbida.ravel(), sym_forbidb.ravel()))
78
+ x_sym_a, x_sym_b = uhf._get_x_sym_table(mf)
79
+ sym_forbid = numpy.append(x_sym_a.ravel(), x_sym_b.ravel()) != wfnsym
84
80
 
85
81
  e_ia_a = (mo_energy[0][viridxa,None] - mo_energy[0][occidxa]).T
86
82
  e_ia_b = (mo_energy[1][viridxb,None] - mo_energy[1][occidxb]).T
@@ -102,15 +98,15 @@ class CasidaTDDFT(TDDFT, TDA):
102
98
 
103
99
  dmsa = (zs[:,:nocca*nvira] * d_ia[:nocca*nvira]).reshape(nz,nocca,nvira)
104
100
  dmsb = (zs[:,nocca*nvira:] * d_ia[nocca*nvira:]).reshape(nz,noccb,nvirb)
105
- dmsa = lib.einsum('xov,po,qv->xpq', dmsa, orboa, orbva.conj())
106
- dmsb = lib.einsum('xov,po,qv->xpq', dmsb, orbob, orbvb.conj())
107
- dmsa = dmsa + dmsa.conj().transpose(0,2,1)
108
- dmsb = dmsb + dmsb.conj().transpose(0,2,1)
101
+ dmsa = lib.einsum('xov,pv,qo->xpq', dmsa, orbva, orboa)
102
+ dmsb = lib.einsum('xov,pv,qo->xpq', dmsb, orbvb, orbob)
103
+ dmsa = dmsa + dmsa.transpose(0,2,1)
104
+ dmsb = dmsb + dmsb.transpose(0,2,1)
109
105
 
110
106
  v1ao = vresp(numpy.asarray((dmsa,dmsb)))
111
107
 
112
- v1a = lib.einsum('xpq,po,qv->xov', v1ao[0], orboa.conj(), orbva)
113
- v1b = lib.einsum('xpq,po,qv->xov', v1ao[1], orbob.conj(), orbvb)
108
+ v1a = lib.einsum('xpq,qo,pv->xov', v1ao[0], orboa, orbva)
109
+ v1b = lib.einsum('xpq,qo,pv->xov', v1ao[1], orbob, orbvb)
114
110
 
115
111
  hx = numpy.hstack((v1a.reshape(nz,-1), v1b.reshape(nz,-1)))
116
112
  hx += ed_ia * zs
@@ -123,6 +119,7 @@ class CasidaTDDFT(TDDFT, TDA):
123
119
  '''TDDFT diagonalization solver
124
120
  '''
125
121
  cpu0 = (logger.process_clock(), logger.perf_counter())
122
+ mol = self.mol
126
123
  mf = self._scf
127
124
  if mf._numint.libxc.is_hybrid_xc(mf.xc):
128
125
  raise RuntimeError('%s cannot be used with hybrid functional'
@@ -142,16 +139,19 @@ class CasidaTDDFT(TDDFT, TDA):
142
139
  idx = numpy.where(w > self.positive_eig_threshold)[0]
143
140
  return w[idx], v[:,idx], idx
144
141
 
142
+ x0sym = None
145
143
  if x0 is None:
146
- x0 = self.init_guess(self._scf, self.nstates)
147
-
148
- self.converged, w2, x1 = \
149
- lib.davidson1(vind, x0, precond,
150
- tol=self.conv_tol,
151
- nroots=nstates, lindep=self.lindep,
152
- max_cycle=self.max_cycle,
153
- max_space=self.max_space, pick=pickeig,
154
- verbose=log)
144
+ x0, x0sym = self.init_guess(
145
+ self._scf, self.nstates, return_symmetry=True)
146
+ elif mol.symmetry:
147
+ x_sym_a, x_sym_b = uhf._get_x_sym_table(self._scf)
148
+ x_sym = numpy.append(x_sym_a.ravel(), x_sym_b.ravel())
149
+ x0sym = [rhf._guess_wfnsym_id(self, x_sym, x) for x in x0]
150
+
151
+ self.converged, w2, x1 = lr_eigh(
152
+ vind, x0, precond, tol_residual=self.conv_tol, lindep=self.lindep,
153
+ nroots=nstates, x0sym=x0sym, pick=pickeig, max_cycle=self.max_cycle,
154
+ max_memory=self.max_memory, verbose=log)
155
155
 
156
156
  mo_energy = self._scf.mo_energy
157
157
  mo_occ = self._scf.mo_occ
@@ -179,13 +179,14 @@ class CasidaTDDFT(TDDFT, TDA):
179
179
  x = (zp + zm) * .5
180
180
  y = (zp - zm) * .5
181
181
  norm = lib.norm(x)**2 - lib.norm(y)**2
182
- if norm > 0:
183
- norm = 1/numpy.sqrt(norm)
184
- e.append(w)
185
- xy.append(((x[:nocca*nvira].reshape(nocca,nvira) * norm, # X_alpha
186
- x[nocca*nvira:].reshape(noccb,nvirb) * norm), # X_beta
187
- (y[:nocca*nvira].reshape(nocca,nvira) * norm, # Y_alpha
188
- y[nocca*nvira:].reshape(noccb,nvirb) * norm)))# Y_beta
182
+ if norm < 0:
183
+ log.warn('TDDFT amplitudes |X| smaller than |Y|')
184
+ norm = abs(norm)**-.5
185
+ e.append(w)
186
+ xy.append(((x[:nocca*nvira].reshape(nocca,nvira) * norm, # X_alpha
187
+ x[nocca*nvira:].reshape(noccb,nvirb) * norm), # X_beta
188
+ (y[:nocca*nvira].reshape(nocca,nvira) * norm, # Y_alpha
189
+ y[nocca*nvira:].reshape(noccb,nvirb) * norm)))# Y_beta
189
190
  self.e = numpy.array(e)
190
191
  self.xy = xy
191
192
 
pyscf/tools/fcidump.py CHANGED
@@ -372,6 +372,9 @@ def to_scf(filename, molpro_orbsym=MOLPRO_ORBSYM, mf=None, **kwargs):
372
372
  mf.get_hcore = lambda *args: h1
373
373
  mf.get_ovlp = lambda *args: numpy.eye(norb)
374
374
  mf._eri = ctx['H2']
375
+ intor_symmetric = mf.mol.intor_symmetric
376
+ mf.mol.intor_symmetric = lambda intor, **kwargs: numpy.eye(norb) \
377
+ if intor == 'int1e_ovlp' else intor_symmetric(intor, **kwargs)
375
378
 
376
379
  return mf
377
380
 
@@ -0,0 +1,265 @@
1
+ '''
2
+ This lib loads results that are in a QCSchema format json.
3
+ Funcs below can recreate the mol and scf objects from the info in the json.
4
+ '''
5
+ import json
6
+ import numpy as np
7
+ import pyscf
8
+ from pyscf.lib.parameters import BOHR
9
+
10
+ def load_qcschema_json( file_name ):
11
+ '''
12
+ Does: loads qcschema format json into a dictionary
13
+ Input:
14
+ file_name: qcschema format json file
15
+
16
+ Returns: dict in qcschema format
17
+ '''
18
+ # load qcschema output json file
19
+ data = None
20
+ with open(file_name,'r') as f:
21
+ data = json.load(f)
22
+ return data
23
+
24
+ def load_qcschema_go_final_json( file_name ):
25
+ '''
26
+ Does: loads qcschema format geometry optimization json
27
+ and returns only the optimized 'final' geometry
28
+ qcschema info as a dictionary.
29
+
30
+ Input:
31
+ file_name: qcschema format json file
32
+
33
+ Returns: dict in qcschema format
34
+ '''
35
+ # load qcschema GO output json file
36
+ # and return last 'trajectory' point's entries
37
+ # (this is the optimized molecule)
38
+ data = None
39
+ temp = None
40
+ with open(file_name,'r') as f:
41
+ temp = json.load(f)
42
+ data = temp["trajectory"][-1]
43
+ return data
44
+
45
+ def load_qcschema_molecule(qcschema_dict, to_Angstrom=False, xyz=False, mol_select=1, step=0):
46
+ '''
47
+ Does: Loads molecule from qcschema format dict.
48
+ Molecule may be single point molecule or from a geometry optimization/trajectory.
49
+
50
+ Input:
51
+ syms: atom symbols (qcschema format)
52
+ coords: x y z coordinates (in qcschema format)
53
+ mol_select: specifies which molecule to load from qcschema format results.
54
+ Default loads 'molecule' from qcschema.
55
+ Geometry optimizations or trajectories have mutliple geometries saved in the schema.
56
+ mol_select = 1 (default) molecule from standard qcschema format
57
+ = 2 initial_molecule in GO or traj qcschema
58
+ = 3 final_molecule in GO or traj qcschema
59
+ = 4 a specific step in the GO or traj qcschema, specify with 'step' arg.
60
+ step: for geometry optimization or trajectory, which have multiple molecules in a qcschema output.
61
+ This specifies which step to load the molecule from.
62
+ to_Angstrom (optional): convert coordinates to Angstrom (default is Bohr)
63
+ xyz (optional): controls output (see below)
64
+
65
+ Returns:
66
+ xyz=False (default): 'atom x y z' format string
67
+ xyz=True: output a string in xyz file format
68
+ i.e. first line is number of atoms.
69
+ '''
70
+ if(mol_select == 1):
71
+ syms = np.array(qcschema_dict["molecule"]["symbols"])
72
+ geo = np.array(qcschema_dict["molecule"]["geometry"])
73
+ elif(mol_select == 2):
74
+ syms = np.array(qcschema_dict["initial_molecule"]["symbols"])
75
+ geo = np.array(qcschema_dict["initial_molecule"]["geometry"])
76
+ elif(mol_select == 3):
77
+ syms = np.array(qcschema_dict["final_molecule"]["symbols"])
78
+ geo = np.array(qcschema_dict["final_molecule"]["geometry"])
79
+ elif(mol_select == 4):
80
+ # for geometry or md, can load a specific geometry
81
+ syms = np.array(qcschema_dict["trajectory"][step]["molecule"]["symbols"])
82
+ geo = np.array(qcschema_dict["trajectory"][step]["molecule"]["geometry"])
83
+
84
+ if(to_Angstrom):
85
+ # convert Bohr to Angstrom
86
+ geo = geo*BOHR
87
+
88
+ NAtoms = len(syms)
89
+ geo = np.reshape(geo, (NAtoms,3))
90
+
91
+ PySCF_atoms = list(zip(syms, geo))
92
+
93
+ # Return as string or return as xyz-format string (i.e. top is NAtoms,blankline)
94
+ if(xyz):
95
+ bldstr = f'{NAtoms}\n\n'
96
+ for element, coordinates in PySCF_atoms:
97
+ bldstr += f'{element} {coordinates[0]}, {coordinates[1]}, {coordinates[2]}\n'
98
+ PySCF_atoms = bldstr
99
+ return PySCF_atoms
100
+
101
+ def load_qcschema_hessian(qcschema_dict):
102
+ '''
103
+ Does: loads hessian from qcschema format dictionary
104
+ Input:
105
+ qcschema_dict
106
+
107
+ Returns: hessian with format (N,N,3,3)
108
+ '''
109
+ # qcschema_dict: pass in dict that has the qcschema output json loaded into it
110
+
111
+ # load qcschema hessian
112
+ qc_h = []
113
+ qc_h = qcschema_dict["return_result"]
114
+
115
+ # Get Number of atoms N
116
+ syms = np.array(qcschema_dict["molecule"]["symbols"])
117
+ NAtom = len(syms)
118
+
119
+ # reshape from (3N)**2 array to (N,N,3,3)
120
+ hessian = np.array(qc_h).reshape(NAtom,NAtom,3,3)
121
+ return hessian
122
+
123
+ def load_qcschema_scf_info(qcschema_dict):
124
+ '''
125
+ Does: loads scf info from qcschema format dictionary
126
+ Input:
127
+ qcschema_dict
128
+
129
+ Returns:
130
+ scf_dict: contains the relevent scf info only
131
+ '''
132
+
133
+ # Restricted wfn has schema scf_occupations_a occ of 1 or 0.
134
+ # Need to double if rhf/rks/rohf
135
+ method = qcschema_dict["keywords"]["scf"]["method"]
136
+ if(method == 'rks' or method == 'roks' or method == 'rhf' or method == 'rohf'):
137
+ OccFactor = 2.0
138
+ have_beta = False
139
+ elif(method == 'uks' or method == 'uhf'):
140
+ OccFactor = 1.0
141
+ have_beta = True
142
+ elif(method == 'gks' or method == 'ghf'):
143
+ OccFactor = 1.0
144
+ have_beta = False
145
+ else:
146
+ raise RuntimeError('qcschema: cannot determine method..exit')
147
+ return
148
+
149
+ # need to reshape MO coefficients for PySCF shape.
150
+ nao = qcschema_dict["properties"]["calcinfo_nbasis"]
151
+ # nmo info often missing
152
+ try:
153
+ nmo = qcschema_dict["properties"]["calcinfo_nmo"]
154
+ except KeyError:
155
+ # key not provided..so we make an assumption
156
+ # note: assumes nmo=nao which isn't the case if linear dependencies etc.
157
+ # ..so may give error when reading coeffs
158
+ nmo = nao
159
+ assert nmo == nao
160
+
161
+ # get the 4 things that PySCF wants
162
+ # ...remembering to reshape coeffs and scale occupancies.
163
+ e_tot = float( qcschema_dict["properties"]["return_energy"] )
164
+ mo_coeff = np.reshape(qcschema_dict["wavefunction"]["scf_orbitals_a"],(nao,nmo))
165
+ mo_occ = np.array( qcschema_dict["wavefunction"]["scf_occupations_a"] )*OccFactor
166
+ mo_energy = np.array( qcschema_dict["wavefunction"]["scf_eigenvalues_a"] )
167
+ if(have_beta):
168
+ # for each useful piece of info we need to combine alpha and beta into 2d array, with alpha first
169
+ # MO occupations
170
+ mo_occ_beta = qcschema_dict["wavefunction"]["scf_occupations_b"]
171
+ mo_occ = np.vstack( (mo_occ, mo_occ_beta) )
172
+ # MO coefficients
173
+ mo_coeff_beta = np.reshape(qcschema_dict["wavefunction"]["scf_orbitals_b"],(nao,nmo))
174
+ mo_coeff = np.vstack( (mo_coeff,mo_coeff_beta))
175
+ mo_coeff = np.reshape(mo_coeff,(2,nao,nmo))
176
+ # MO energies
177
+ mo_energy_beta = np.array( qcschema_dict["wavefunction"]["scf_eigenvalues_b"] )
178
+ mo_energy = np.vstack( (mo_energy, mo_energy_beta) )
179
+ # etot obviously doesn't need manipulation
180
+
181
+ # convert to dictionary for PySCF
182
+ scf_dic = {'e_tot' : e_tot,
183
+ 'mo_energy': mo_energy,
184
+ 'mo_occ' : mo_occ,
185
+ 'mo_coeff' : mo_coeff}
186
+
187
+ return scf_dic
188
+
189
+
190
+ def recreate_mol_obj(qcschema_dict,to_Angstrom=False):
191
+ '''
192
+ Does: recreates mol object from qcschema format dictionary
193
+ Input:
194
+ qcschema_dict
195
+ to_Angstrom: optional bool to convert geometry to Angstrom (default is Bohr)
196
+
197
+ Returns: mol object
198
+ '''
199
+
200
+ ## Mol info: ##
201
+ PySCF_charge = int( qcschema_dict["molecule"]["molecular_charge"] )
202
+ # PySCF 'spin' is number of unpaired electrons, it will be mult-1
203
+ PySCF_spin = int( qcschema_dict["molecule"]["molecular_multiplicity"] ) - 1
204
+ PySCF_basis = str( qcschema_dict["model"]["basis"] )
205
+
206
+ # Cartesian/Pure basis
207
+ PySCF_cart = bool( qcschema_dict["keywords"]["basisSet"]["cartesian"] )
208
+
209
+ # Get molecular structure.
210
+ PySCF_atoms = load_qcschema_molecule(qcschema_dict, to_Angstrom,False)
211
+
212
+ # Unit Bohr or Angstrom. QCSchema default is Bohr but can change here.
213
+ if(to_Angstrom):
214
+ units='A'
215
+ else:
216
+ units='B'
217
+
218
+ ## Create mol ##
219
+ mol = pyscf.gto.Mole(atom=PySCF_atoms,basis=PySCF_basis,ecp=PySCF_basis,
220
+ charge=PySCF_charge,spin=PySCF_spin,cart=PySCF_cart,unit=units)
221
+ mol.build(False,False)
222
+
223
+ return mol
224
+
225
+ def recreate_scf_obj(qcschema_dict,mol):
226
+ '''
227
+ Does: recreates scf object from qcschema format dictionary
228
+ Input:
229
+ qcschema_dict
230
+ mol object
231
+
232
+ Returns: scf object
233
+ '''
234
+ # load info from qcschema needed for scf obj
235
+ scf_dict = load_qcschema_scf_info(qcschema_dict)
236
+
237
+ # create scf object
238
+ method = qcschema_dict["keywords"]["scf"]["method"]
239
+ if(method =='rks'):
240
+ ks = mol.RKS()
241
+ elif(method =='uks'):
242
+ ks = mol.UKS()
243
+ elif(method =='rhf'):
244
+ ks = mol.RHF()
245
+ elif(method =='uhf'):
246
+ ks = mol.UHF()
247
+ elif(method =='gks'):
248
+ ks = mol.GKS()
249
+ elif(method =='ghf'):
250
+ ks = mol.GHF()
251
+ else:
252
+ raise RuntimeError('qcschema: cannot determine method..exit')
253
+ return
254
+
255
+ # get functional
256
+ if(method == 'rks' or method == 'uks' or method == 'gks'):
257
+ functional = qcschema_dict["keywords"]["xcFunctional"]["name"]
258
+ ks.xc = functional
259
+
260
+ # Load 4 key pieces of info we got from json into SCF object
261
+ ks.mo_coeff = scf_dict["mo_coeff"]
262
+ ks.mo_energy = scf_dict["mo_energy"]
263
+ ks.mo_occ = scf_dict["mo_occ"]
264
+ ks.e_tot = scf_dict["e_tot"]
265
+ return ks
pyscf/x2c/sfx2c1e.py CHANGED
@@ -117,7 +117,7 @@ class SFX2C1E_SCF(x2c._X2C_SCF):
117
117
  log = logger.new_logger(mol, verbose)
118
118
 
119
119
  if not (isinstance(dm, numpy.ndarray) and dm.ndim == 2):
120
- # UHF denisty matrices
120
+ # UHF density matrices
121
121
  dm = dm[0] + dm[1]
122
122
 
123
123
  if isinstance(self, ghf.GHF):
pyscf/x2c/tdscf.py CHANGED
@@ -38,8 +38,8 @@ gen_tda_hop = gen_tda_operation
38
38
  def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):
39
39
  r'''A and B matrices for TDDFT response function.
40
40
 
41
- A[i,a,j,b] = \delta_{ab}\delta_{ij}(E_a - E_i) + (ia||bj)
42
- B[i,a,j,b] = (ia||jb)
41
+ A[i,a,j,b] = \delta_{ab}\delta_{ij}(E_a - E_i) + (ai||jb)
42
+ B[i,a,j,b] = (ai||bj)
43
43
  '''
44
44
  if mo_energy is None: mo_energy = mf.mo_energy
45
45
  if mo_coeff is None: mo_coeff = mf.mo_coeff
@@ -56,7 +56,7 @@ def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):
56
56
  nmo = nocc + nvir
57
57
  mo = numpy.hstack((orbo, orbv))
58
58
 
59
- e_ia = lib.direct_sum('a-i->ia', mo_energy[viridx], mo_energy[occidx])
59
+ e_ia = mo_energy[viridx] - mo_energy[occidx,None]
60
60
  a = numpy.diag(e_ia.ravel()).reshape(nocc,nvir,nocc,nvir)
61
61
  b = numpy.zeros_like(a)
62
62
 
@@ -64,10 +64,10 @@ def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):
64
64
  eri_mo = ao2mo.kernel(mol, [orbo, mo, mo, mo], intor='int2e_spinor')
65
65
  eri_mo = eri_mo.reshape(nocc,nmo,nmo,nmo)
66
66
 
67
- a = a + numpy.einsum('iabj->iajb', eri_mo[:nocc,nocc:,nocc:,:nocc])
68
- a = a - numpy.einsum('ijba->iajb', eri_mo[:nocc,:nocc,nocc:,nocc:]) * hyb
69
- b = b + numpy.einsum('iajb->iajb', eri_mo[:nocc,nocc:,:nocc,nocc:])
70
- b = b - numpy.einsum('jaib->iajb', eri_mo[:nocc,nocc:,:nocc,nocc:]) * hyb
67
+ a = a + numpy.einsum('iabj->iajb', eri_mo[:nocc,nocc:,nocc:,:nocc].conj())
68
+ a = a - numpy.einsum('ijba->iajb', eri_mo[:nocc,:nocc,nocc:,nocc:].conj()) * hyb
69
+ b = b + numpy.einsum('iajb->iajb', eri_mo[:nocc,nocc:,:nocc,nocc:].conj())
70
+ b = b - numpy.einsum('jaib->iajb', eri_mo[:nocc,nocc:,:nocc,nocc:].conj()) * hyb
71
71
  return a, b
72
72
 
73
73
  if isinstance(mf, dft.KohnShamDFT):
@@ -123,9 +123,9 @@ def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):
123
123
  rho_ov_bb = numpy.einsum('ri,ra->ria', mo_ob.conj(), mo_vb)
124
124
  rho_ov = ud2tm(rho_ov_aa, rho_ov_ab, rho_ov_ba, rho_ov_bb)
125
125
  rho_vo = rho_ov.conj()
126
- w_ov = numpy.einsum('tsr,tria->sria', wfxc, rho_ov)
127
- a += lib.einsum('sria,srjb->iajb', w_ov, rho_vo)
128
- b += lib.einsum('sria,srjb->iajb', w_ov, rho_ov)
126
+ w_vo = numpy.einsum('tsr,tria->sria', wfxc, rho_vo)
127
+ a += lib.einsum('sria,srjb->iajb', w_vo, rho_ov)
128
+ b += lib.einsum('sria,srjb->iajb', w_vo, rho_vo)
129
129
  elif ni.collinear[0] == 'c':
130
130
  rho = ni.eval_rho(mol, ao, dm0, mask, xctype, hermi=1)
131
131
  fxc = ni.eval_xc_eff(mf.xc, rho, deriv=2)[2]
@@ -135,13 +135,13 @@ def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):
135
135
  rho_ov_b = numpy.einsum('ri,ra->ria', mo_ob.conj(), mo_vb)
136
136
  rho_vo_a = rho_ov_a.conj()
137
137
  rho_vo_b = rho_ov_b.conj()
138
- w_ov = wv_a[:,:,None,None] * rho_ov_a
139
- w_ov += wv_b[:,:,None,None] * rho_ov_b
140
- wa_ov, wb_ov = w_ov
141
- a += lib.einsum('ria,rjb->iajb', wa_ov, rho_vo_a)
142
- a += lib.einsum('ria,rjb->iajb', wb_ov, rho_vo_b)
143
- b += lib.einsum('ria,rjb->iajb', wa_ov, rho_ov_a)
144
- b += lib.einsum('ria,rjb->iajb', wb_ov, rho_ov_b)
138
+ w_vo = wv_a[:,:,None,None] * rho_vo_a
139
+ w_vo += wv_b[:,:,None,None] * rho_vo_b
140
+ wa_vo, wb_vo = w_vo
141
+ a += lib.einsum('ria,rjb->iajb', wa_vo, rho_ov_a)
142
+ a += lib.einsum('ria,rjb->iajb', wb_vo, rho_ov_b)
143
+ b += lib.einsum('ria,rjb->iajb', wa_vo, rho_vo_a)
144
+ b += lib.einsum('ria,rjb->iajb', wb_vo, rho_vo_b)
145
145
  else:
146
146
  raise NotImplementedError(ni.collinear)
147
147
 
@@ -166,9 +166,9 @@ def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):
166
166
  rho_ov_bb[1:4] += numpy.einsum('xri,ra->xria', mo_ob[1:4].conj(), mo_vb[0])
167
167
  rho_ov = ud2tm(rho_ov_aa, rho_ov_ab, rho_ov_ba, rho_ov_bb)
168
168
  rho_vo = rho_ov.conj()
169
- w_ov = numpy.einsum('txsyr,txria->syria', wfxc, rho_ov)
170
- a += lib.einsum('syria,syrjb->iajb', w_ov, rho_vo)
171
- b += lib.einsum('syria,syrjb->iajb', w_ov, rho_ov)
169
+ w_vo = numpy.einsum('txsyr,txria->syria', wfxc, rho_vo)
170
+ a += lib.einsum('syria,syrjb->iajb', w_vo, rho_ov)
171
+ b += lib.einsum('syria,syrjb->iajb', w_vo, rho_vo)
172
172
  elif ni.collinear[0] == 'c':
173
173
  rho = ni.eval_rho(mol, ao, dm0, mask, xctype, hermi=1)
174
174
  fxc = ni.eval_xc_eff(mf.xc, rho, deriv=2)[2]
@@ -180,13 +180,13 @@ def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):
180
180
  rho_ov_b[1:4] += numpy.einsum('ri,xra->xria', mo_ob[0].conj(), mo_vb[1:4])
181
181
  rho_vo_a = rho_ov_a.conj()
182
182
  rho_vo_b = rho_ov_b.conj()
183
- w_ov = numpy.einsum('xsyr,xria->syria', wv_a, rho_ov_a)
184
- w_ov += numpy.einsum('xsyr,xria->syria', wv_b, rho_ov_b)
185
- wa_ov, wb_ov = w_ov
186
- a += lib.einsum('xria,xrjb->iajb', wa_ov, rho_vo_a)
187
- a += lib.einsum('xria,xrjb->iajb', wb_ov, rho_vo_b)
188
- b += lib.einsum('xria,xrjb->iajb', wa_ov, rho_ov_a)
189
- b += lib.einsum('xria,xrjb->iajb', wb_ov, rho_ov_b)
183
+ w_vo = numpy.einsum('xsyr,xria->syria', wv_a, rho_vo_a)
184
+ w_vo += numpy.einsum('xsyr,xria->syria', wv_b, rho_vo_b)
185
+ wa_vo, wb_vo = w_vo
186
+ a += lib.einsum('xria,xrjb->iajb', wa_vo, rho_ov_a)
187
+ a += lib.einsum('xria,xrjb->iajb', wb_vo, rho_ov_b)
188
+ b += lib.einsum('xria,xrjb->iajb', wa_vo, rho_vo_a)
189
+ b += lib.einsum('xria,xrjb->iajb', wb_vo, rho_vo_b)
190
190
  else:
191
191
  raise NotImplementedError(ni.collinear)
192
192
 
@@ -225,9 +225,9 @@ def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):
225
225
  rho_ov_bb = numpy.vstack([rho_ov_bb, tau_ov_bb[numpy.newaxis]])
226
226
  rho_ov = ud2tm(rho_ov_aa, rho_ov_ab, rho_ov_ba, rho_ov_bb)
227
227
  rho_vo = rho_ov.conj()
228
- w_ov = numpy.einsum('txsyr,txria->syria', wfxc, rho_ov)
229
- a += lib.einsum('syria,syrjb->iajb', w_ov, rho_vo)
230
- b += lib.einsum('syria,syrjb->iajb', w_ov, rho_ov)
228
+ w_vo = numpy.einsum('txsyr,txria->syria', wfxc, rho_vo)
229
+ a += lib.einsum('syria,syrjb->iajb', w_vo, rho_ov)
230
+ b += lib.einsum('syria,syrjb->iajb', w_vo, rho_vo)
231
231
  elif ni.collinear[0] == 'c':
232
232
  rho = ni.eval_rho(mol, ao, dm0, mask, xctype, hermi=1, with_lapl=False)
233
233
  fxc = ni.eval_xc_eff(mf.xc, rho, deriv=2)[2]
@@ -243,13 +243,13 @@ def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):
243
243
  rho_ov_b = numpy.vstack([rho_ov_b, tau_ov_b[numpy.newaxis]])
244
244
  rho_vo_a = rho_ov_a.conj()
245
245
  rho_vo_b = rho_ov_b.conj()
246
- w_ov = numpy.einsum('xsyr,xria->syria', wv_a, rho_ov_a)
247
- w_ov += numpy.einsum('xsyr,xria->syria', wv_b, rho_ov_b)
248
- wa_ov, wb_ov = w_ov
249
- a += lib.einsum('xria,xrjb->iajb', wa_ov, rho_vo_a)
250
- a += lib.einsum('xria,xrjb->iajb', wb_ov, rho_vo_b)
251
- b += lib.einsum('xria,xrjb->iajb', wa_ov, rho_ov_a)
252
- b += lib.einsum('xria,xrjb->iajb', wb_ov, rho_ov_b)
246
+ w_vo = numpy.einsum('xsyr,xria->syria', wv_a, rho_vo_a)
247
+ w_vo += numpy.einsum('xsyr,xria->syria', wv_b, rho_vo_b)
248
+ wa_vo, wb_vo = w_vo
249
+ a += lib.einsum('xria,xrjb->iajb', wa_vo, rho_ov_a)
250
+ a += lib.einsum('xria,xrjb->iajb', wb_vo, rho_ov_b)
251
+ b += lib.einsum('xria,xrjb->iajb', wa_vo, rho_vo_a)
252
+ b += lib.einsum('xria,xrjb->iajb', wb_vo, rho_vo_b)
253
253
  else:
254
254
  raise NotImplementedError(ni.collinear)
255
255
 
@@ -290,9 +290,9 @@ class TDA(TDBase, ghf.TDA):
290
290
  mf = self._scf
291
291
  return gen_tda_hop(mf)
292
292
 
293
- def init_guess(self, mf, nstates=None, wfnsym=None):
293
+ def init_guess(self, mf, nstates=None, wfnsym=None, return_symmetry=False):
294
294
  assert self.wfnsym is None
295
- return ghf.TDA.init_guess(self, mf, nstates, None)
295
+ return ghf.TDA.init_guess(self, mf, nstates, None, return_symmetry)
296
296
 
297
297
  kernel = ghf.TDA.kernel
298
298
 
@@ -313,9 +313,9 @@ class TDHF(TDBase, ghf.TDHF):
313
313
  mf = self._scf
314
314
  return gen_tdhf_operation(mf)
315
315
 
316
- def init_guess(self, mf, nstates=None, wfnsym=None):
316
+ def init_guess(self, mf, nstates=None, wfnsym=None, return_symmetry=False):
317
317
  assert self.wfnsym is None
318
- return ghf.TDHF.init_guess(self, mf, nstates, None)
318
+ return ghf.TDHF.init_guess(self, mf, nstates, None, return_symmetry)
319
319
 
320
320
  kernel = ghf.TDHF.kernel
321
321
 
pyscf/x2c/x2c.py CHANGED
@@ -577,7 +577,7 @@ class SCF(hf.SCF):
577
577
  log = logger.new_logger(mol, verbose)
578
578
 
579
579
  if not (isinstance(dm, numpy.ndarray) and dm.ndim == 2):
580
- # UHF denisty matrices
580
+ # UHF density matrices
581
581
  dm = dm[0] + dm[1]
582
582
 
583
583
  with mol.with_common_orig((0,0,0)):
@@ -774,17 +774,22 @@ class X2C1E_GSCF(_X2C_SCF):
774
774
  charges = mol.atom_charges()
775
775
  coords = mol.atom_coords()
776
776
  nucl_dip = numpy.einsum('i,ix->x', charges, coords)
777
- with mol.with_common_orig(nucl_dip):
778
- r = mol.intor_symmetric('int1e_r')
779
- ao_dip = numpy.array([_block_diag(x) for x in r])
777
+ with mol.with_common_orig((0,0,0)):
780
778
  if picture_change:
781
779
  xmol = self.with_x2c.get_xmol()[0]
782
780
  nao = xmol.nao
783
- prp = xmol.intor_symmetric('int1e_sprsp').reshape(3,4,nao,nao)[:,0]
784
- prp = numpy.array([_block_diag(x) for x in prp])
785
- ao_dip = self.with_x2c.picture_change((ao_dip, prp))
781
+ r = xmol.intor_symmetric('int1e_r')
782
+ r = numpy.array([_block_diag(x) for x in r])
783
+ c1 = 0.5/lib.param.LIGHT_SPEED
784
+ prp = xmol.intor_symmetric('int1e_sprsp').reshape(3,4,nao,nao)
785
+ prp = numpy.array([_sigma_dot(x*c1**2) for x in prp])
786
+ ao_dip = self.with_x2c.picture_change((r, prp))
787
+ else:
788
+ r = mol.intor_symmetric('int1e_r')
789
+ ao_dip = numpy.array([_block_diag(x) for x in r])
786
790
 
787
- mol_dip = -numpy.einsum('xij,ji->x', ao_dip, dm).real
791
+ el_dip = numpy.einsum('xij,ji->x', ao_dip, dm).real
792
+ mol_dip = nucl_dip - el_dip
788
793
 
789
794
  if unit.upper() == 'DEBYE':
790
795
  mol_dip *= nist.AU2DEBYE
@@ -810,8 +815,7 @@ class X2C1E_GSCF(_X2C_SCF):
810
815
 
811
816
  def _uncontract_mol(mol, xuncontract=None, exp_drop=0.2):
812
817
  '''mol._basis + uncontracted steep functions'''
813
- pmol, contr_coeff = mol.decontract_basis(atoms=xuncontract)
814
- contr_coeff = scipy.linalg.block_diag(*contr_coeff)
818
+ pmol, contr_coeff = mol.decontract_basis(atoms=xuncontract, aggregate=True)
815
819
  return pmol, contr_coeff
816
820
 
817
821
 
@@ -953,7 +957,7 @@ def _x2c1e_get_hcore(t, v, w, s, c):
953
957
 
954
958
  w, u = numpy.linalg.eigh(reduce(numpy.dot, (cl.T.conj(), s, cl)))
955
959
  idx = w > 1e-14
956
- # Adopt (2) here becuase X is not appeared in Eq (2).
960
+ # Adopt (2) here because X is not appeared in Eq (2).
957
961
  # R[A] = u w^{1/2} u^+, so R[A]^{-1} A^+ S in Eq (2) is
958
962
  r = reduce(numpy.dot, (u[:,idx]/numpy.sqrt(w[idx]), u[:,idx].T.conj(),
959
963
  cl.T.conj(), s))