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/adc/uadc_ea.py CHANGED
@@ -12,7 +12,10 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  #
15
- # Author: Samragni Banerjee <samragnibanerjee4@gmail.com>
15
+ # Author: Abdelrahman Ahmed <>
16
+ # Samragni Banerjee <samragnibanerjee4@gmail.com>
17
+ # James Serna <jamcar456@gmail.com>
18
+ # Terrence Stahl <>
16
19
  # Alexander Sokolov <alexander.y.sokolov@gmail.com>
17
20
  #
18
21
 
@@ -287,22 +290,13 @@ def get_imds(adc, eris=None):
287
290
  M_ab_a += lib.einsum('mlfd,mled,aebf->ab',t2_1_ab, t2_1_ab, eris_vvvv, optimize=True)
288
291
  del eris_vvvv
289
292
 
290
- temp = np.zeros((nocc_a,nocc_a,nvir_a,nvir_a))
291
- temp[:,:,ab_ind_a[0],ab_ind_a[1]] = adc.imds.t2_1_vvvv[0]
292
- temp[:,:,ab_ind_a[1],ab_ind_a[0]] = -adc.imds.t2_1_vvvv[0]
293
-
294
- M_ab_a -= 2 * 0.5 * 0.25*lib.einsum('mlaf,mlbf->ab',t2_1_a, temp, optimize=True)
295
- del temp
296
-
293
+ M_ab_a -= 2 * 0.5 * 0.25*lib.einsum('mlaf,mlbf->ab',
294
+ t2_1_a, adc.imds.t2_1_vvvv[0], optimize=True)
297
295
  else:
298
-
299
- temp_t2a_vvvv = np.zeros((nocc_a,nocc_a,nvir_a,nvir_a))
300
- temp_t2a_vvvv[:,:,ab_ind_a[0],ab_ind_a[1]] = adc.imds.t2_1_vvvv[0][:]
301
- temp_t2a_vvvv[:,:,ab_ind_a[1],ab_ind_a[0]] = -adc.imds.t2_1_vvvv[0][:]
302
-
303
- M_ab_a -= 2*0.5*0.25*lib.einsum('mlad,mlbd->ab', temp_t2a_vvvv, t2_1_a, optimize=True)
304
- M_ab_a -= 2*0.5*0.25*lib.einsum('mlaf,mlbf->ab', t2_1_a, temp_t2a_vvvv, optimize=True)
305
- del temp_t2a_vvvv
296
+ M_ab_a -= 2*0.5*0.25*lib.einsum('mlad,mlbd->ab',
297
+ adc.imds.t2_1_vvvv[0], t2_1_a, optimize=True)
298
+ M_ab_a -= 2*0.5*0.25*lib.einsum('mlaf,mlbf->ab', t2_1_a,
299
+ adc.imds.t2_1_vvvv[0], optimize=True)
306
300
 
307
301
  if isinstance(eris.vvvv_p, list):
308
302
 
@@ -387,18 +381,20 @@ def get_imds(adc, eris=None):
387
381
  M_ab_b += lib.einsum('mlfd,mled,eafb->ab',t2_1_ab, t2_1_ab, eris_vVvV, optimize=True)
388
382
 
389
383
  eris_vVvV = eris_vVvV.reshape(nvir_a*nvir_b,nvir_a*nvir_b)
390
- temp = adc.imds.t2_1_vvvv[1]
391
- M_ab_a -= 0.5*lib.einsum('mlaf,mlbf->ab',t2_1_ab, temp, optimize=True)
392
- M_ab_b -= 0.5*lib.einsum('mlfa,mlfb->ab',t2_1_ab, temp, optimize=True)
393
- del temp
384
+
385
+ M_ab_a -= 0.5*lib.einsum('mlaf,mlbf->ab',t2_1_ab, adc.imds.t2_1_vvvv[1], optimize=True)
386
+ M_ab_b -= 0.5*lib.einsum('mlfa,mlfb->ab',t2_1_ab, adc.imds.t2_1_vvvv[1], optimize=True)
387
+
394
388
  else:
395
- t2_vVvV = adc.imds.t2_1_vvvv[1][:]
389
+ M_ab_a -= 0.5 * lib.einsum('mlad,mlbd->ab',
390
+ adc.imds.t2_1_vvvv[1], t2_1_ab, optimize=True)
391
+ M_ab_b -= 0.5 * lib.einsum('mlda,mldb->ab',
392
+ adc.imds.t2_1_vvvv[1], t2_1_ab, optimize=True)
393
+ M_ab_a -= 0.5 * lib.einsum('mlaf,mlbf->ab', t2_1_ab,
394
+ adc.imds.t2_1_vvvv[1], optimize=True)
395
+ M_ab_b -= 0.5 * lib.einsum('mlfa,mlfb->ab', t2_1_ab,
396
+ adc.imds.t2_1_vvvv[1], optimize=True)
396
397
 
397
- M_ab_a -= 0.5 * lib.einsum('mlad,mlbd->ab', t2_vVvV, t2_1_ab, optimize=True)
398
- M_ab_b -= 0.5 * lib.einsum('mlda,mldb->ab', t2_vVvV, t2_1_ab, optimize=True)
399
- M_ab_a -= 0.5 * lib.einsum('mlaf,mlbf->ab',t2_1_ab, t2_vVvV, optimize=True)
400
- M_ab_b -= 0.5 * lib.einsum('mlfa,mlfb->ab',t2_1_ab, t2_vVvV, optimize=True)
401
- del t2_vVvV
402
398
  del t2_1_a
403
399
 
404
400
  if isinstance(eris.VVVV_p,np.ndarray):
@@ -409,22 +405,13 @@ def get_imds(adc, eris=None):
409
405
  M_ab_b += lib.einsum('mldf,mlde,aebf->ab',t2_1_ab, t2_1_ab, eris_VVVV, optimize=True)
410
406
  del eris_VVVV
411
407
 
412
- temp = np.zeros((nocc_b,nocc_b,nvir_b,nvir_b))
413
- temp[:,:,ab_ind_b[0],ab_ind_b[1]] = adc.imds.t2_1_vvvv[2]
414
- temp[:,:,ab_ind_b[1],ab_ind_b[0]] = -adc.imds.t2_1_vvvv[2]
415
- M_ab_b -= 2 * 0.5 * 0.25*lib.einsum('mlaf,mlbf->ab',t2_1_b, temp, optimize=True)
416
- del temp
408
+ M_ab_b -= 2 * 0.5 * 0.25*lib.einsum('mlaf,mlbf->ab',
409
+ t2_1_b, adc.imds.t2_1_vvvv[2], optimize=True)
417
410
  else:
418
-
419
- temp_t2b_VVVV = np.zeros((nocc_b,nocc_b,nvir_b,nvir_b))
420
- temp_t2b_VVVV[:,:,ab_ind_b[0],ab_ind_b[1]] = adc.imds.t2_1_vvvv[2][:]
421
- temp_t2b_VVVV[:,:,ab_ind_b[1],ab_ind_b[0]] = -adc.imds.t2_1_vvvv[2][:]
422
-
423
411
  M_ab_b -= 2 * 0.5 * 0.25*lib.einsum('mlad,mlbd->ab',
424
- temp_t2b_VVVV, t2_1_b, optimize=True)
412
+ adc.imds.t2_1_vvvv[2], t2_1_b, optimize=True)
425
413
  M_ab_b -= 2 * 0.5 * 0.25*lib.einsum('mlaf,mlbf->ab',
426
- t2_1_b, temp_t2b_VVVV, optimize=True)
427
- del temp_t2b_VVVV
414
+ t2_1_b, adc.imds.t2_1_vvvv[2], optimize=True)
428
415
 
429
416
  if isinstance(eris.vvvv_p, list):
430
417
 
@@ -1971,6 +1958,7 @@ class UADCEA(uadc.UADC):
1971
1958
  }
1972
1959
 
1973
1960
  def __init__(self, adc):
1961
+ self.mol = adc.mol
1974
1962
  self.verbose = adc.verbose
1975
1963
  self.stdout = adc.stdout
1976
1964
  self.max_memory = adc.max_memory
@@ -1987,6 +1975,7 @@ class UADCEA(uadc.UADC):
1987
1975
  self._scf = adc._scf
1988
1976
  self._nocc = adc._nocc
1989
1977
  self._nvir = adc._nvir
1978
+ self._nmo = adc._nmo
1990
1979
  self.nocc_a = adc._nocc[0]
1991
1980
  self.nocc_b = adc._nocc[1]
1992
1981
  self.nvir_a = adc._nvir[0]
@@ -1996,14 +1985,14 @@ class UADCEA(uadc.UADC):
1996
1985
  self.mo_energy_b = adc.mo_energy_b
1997
1986
  self.nmo_a = adc._nmo[0]
1998
1987
  self.nmo_b = adc._nmo[1]
1999
- self.mol = adc.mol
2000
1988
  self.transform_integrals = adc.transform_integrals
2001
1989
  self.with_df = adc.with_df
1990
+ self.compute_properties = adc.compute_properties
1991
+ self.approx_trans_moments = adc.approx_trans_moments
1992
+
2002
1993
  self.spec_factor_print_tol = adc.spec_factor_print_tol
2003
1994
  self.evec_print_tol = adc.evec_print_tol
2004
1995
 
2005
- self.compute_properties = adc.compute_properties
2006
- self.approx_trans_moments = adc.approx_trans_moments
2007
1996
  self.E = adc.E
2008
1997
  self.U = adc.U
2009
1998
  self.P = adc.P
@@ -2014,11 +2003,12 @@ class UADCEA(uadc.UADC):
2014
2003
  matvec = matvec
2015
2004
  get_diag = get_diag
2016
2005
  get_trans_moments = get_trans_moments
2017
- analyze_spec_factor = analyze_spec_factor
2018
2006
  get_properties = get_properties
2007
+
2019
2008
  analyze = analyze
2020
- compute_dyson_mo = compute_dyson_mo
2009
+ analyze_spec_factor = analyze_spec_factor
2021
2010
  analyze_eigenvector = analyze_eigenvector
2011
+ compute_dyson_mo = compute_dyson_mo
2022
2012
 
2023
2013
  def get_init_guess(self, nroots=1, diag=None, ascending=True):
2024
2014
  if diag is None :
pyscf/adc/uadc_ip.py CHANGED
@@ -12,7 +12,10 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  #
15
- # Author: Samragni Banerjee <samragnibanerjee4@gmail.com>
15
+ # Author: Abdelrahman Ahmed <>
16
+ # Samragni Banerjee <samragnibanerjee4@gmail.com>
17
+ # James Serna <jamcar456@gmail.com>
18
+ # Terrence Stahl <>
16
19
  # Alexander Sokolov <alexander.y.sokolov@gmail.com>
17
20
  #
18
21
 
@@ -1849,6 +1852,7 @@ class UADCIP(uadc.UADC):
1849
1852
  }
1850
1853
 
1851
1854
  def __init__(self, adc):
1855
+ self.mol = adc.mol
1852
1856
  self.verbose = adc.verbose
1853
1857
  self.stdout = adc.stdout
1854
1858
  self.max_memory = adc.max_memory
@@ -1865,6 +1869,7 @@ class UADCIP(uadc.UADC):
1865
1869
  self._scf = adc._scf
1866
1870
  self._nocc = adc._nocc
1867
1871
  self._nvir = adc._nvir
1872
+ self._nmo = adc._nmo
1868
1873
  self.nocc_a = adc._nocc[0]
1869
1874
  self.nocc_b = adc._nocc[1]
1870
1875
  self.nvir_a = adc._nvir[0]
@@ -1874,14 +1879,14 @@ class UADCIP(uadc.UADC):
1874
1879
  self.mo_energy_b = adc.mo_energy_b
1875
1880
  self.nmo_a = adc._nmo[0]
1876
1881
  self.nmo_b = adc._nmo[1]
1877
- self.mol = adc.mol
1878
1882
  self.transform_integrals = adc.transform_integrals
1879
1883
  self.with_df = adc.with_df
1884
+ self.compute_properties = adc.compute_properties
1885
+ self.approx_trans_moments = adc.approx_trans_moments
1886
+
1880
1887
  self.spec_factor_print_tol = adc.spec_factor_print_tol
1881
1888
  self.evec_print_tol = adc.evec_print_tol
1882
1889
 
1883
- self.compute_properties = adc.compute_properties
1884
- self.approx_trans_moments = adc.approx_trans_moments
1885
1890
  self.E = adc.E
1886
1891
  self.U = adc.U
1887
1892
  self.P = adc.P
pyscf/adc/uadc_ip_cvs.py CHANGED
@@ -12,7 +12,10 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  #
15
- # Author: Abdelrahman Ahmed <abdelrahman.maa.ahmed@gmail.com>
15
+ # Author: Abdelrahman Ahmed <>
16
+ # Samragni Banerjee <samragnibanerjee4@gmail.com>
17
+ # James Serna <jamcar456@gmail.com>
18
+ # Terrence Stahl <>
16
19
  # Alexander Sokolov <alexander.y.sokolov@gmail.com>
17
20
  #
18
21
 
pyscf/agf2/__init__.py CHANGED
@@ -17,8 +17,8 @@
17
17
  #
18
18
 
19
19
  '''
20
- Auxiliary second-order Green's function perturbation therory
21
- ============================================================
20
+ Auxiliary second-order Green's function perturbation theory
21
+ ===========================================================
22
22
 
23
23
  The AGF2 method permits the computation of quasiparticle excitations and
24
24
  ground-state properties at the AGF2(None,0) level.
pyscf/agf2/aux_space.py CHANGED
@@ -446,7 +446,7 @@ def combine(*auxspcs):
446
446
  '''
447
447
 
448
448
  nphys = [auxspc.nphys for auxspc in auxspcs]
449
- if not all([x == nphys[0] for x in nphys]):
449
+ if not all(x == nphys[0] for x in nphys):
450
450
  raise ValueError('Size of physical space must be the same to '
451
451
  'combine AuxiliarySpace objects.')
452
452
  nphys = nphys[0]
pyscf/agf2/chkfile.py CHANGED
@@ -111,7 +111,7 @@ def load_agf2(chkfile):
111
111
  def dump_agf2(agf2, chkfile=None, key='agf2',
112
112
  gf=None, se=None, frozen=None, nmom=None,
113
113
  mo_energy=None, mo_coeff=None, mo_occ=None):
114
- ''' Save the AGF2 calculatuion to a chkfile.
114
+ ''' Save the AGF2 calculation to a chkfile.
115
115
  '''
116
116
 
117
117
  if mpi_helper.rank != 0:
pyscf/ao2mo/__init__.py CHANGED
@@ -31,6 +31,7 @@ Simple usage::
31
31
  import tempfile
32
32
  import numpy
33
33
  import h5py
34
+ from pyscf import gto
34
35
  from pyscf.ao2mo import incore
35
36
  from pyscf.ao2mo import outcore
36
37
  from pyscf.ao2mo import r_outcore
@@ -143,7 +144,7 @@ def full(eri_or_mol, mo_coeff, erifile=None, dataname='eri_mo', intor='int2e',
143
144
  '''
144
145
  if isinstance(eri_or_mol, numpy.ndarray):
145
146
  return incore.full(eri_or_mol, mo_coeff, *args, **kwargs)
146
- else:
147
+ elif isinstance(eri_or_mol, gto.MoleBase):
147
148
  if '_spinor' in intor:
148
149
  mod = r_outcore
149
150
  else:
@@ -157,6 +158,11 @@ def full(eri_or_mol, mo_coeff, erifile=None, dataname='eri_mo', intor='int2e',
157
158
  *args, **kwargs)
158
159
  else:
159
160
  return mod.full_iofree(eri_or_mol, mo_coeff, intor, *args, **kwargs)
161
+ else:
162
+ raise RuntimeError('ERI is not available. If this is generated by mf._eri, '
163
+ 'the integral tensor is too big to store in memory. '
164
+ 'You should either increase mol.max_memory, or set '
165
+ 'mol.incore_anyway. See issue #2473.')
160
166
 
161
167
  def general(eri_or_mol, mo_coeffs, erifile=None, dataname='eri_mo', intor='int2e',
162
168
  *args, **kwargs):
@@ -293,7 +299,7 @@ def general(eri_or_mol, mo_coeffs, erifile=None, dataname='eri_mo', intor='int2e
293
299
  '''
294
300
  if isinstance(eri_or_mol, numpy.ndarray):
295
301
  return incore.general(eri_or_mol, mo_coeffs, *args, **kwargs)
296
- else:
302
+ elif isinstance(eri_or_mol, gto.MoleBase):
297
303
  if '_spinor' in intor:
298
304
  mod = r_outcore
299
305
  else:
@@ -307,6 +313,11 @@ def general(eri_or_mol, mo_coeffs, erifile=None, dataname='eri_mo', intor='int2e
307
313
  *args, **kwargs)
308
314
  else:
309
315
  return mod.general_iofree(eri_or_mol, mo_coeffs, intor, *args, **kwargs)
316
+ else:
317
+ raise RuntimeError('ERI is not available. If this is generated by mf._eri, '
318
+ 'the integral tensor is too big to store in memory. '
319
+ 'You should either increase mol.max_memory, or set '
320
+ 'mol.incore_anyway. See issue #2473.')
310
321
 
311
322
  def kernel(eri_or_mol, mo_coeffs, erifile=None, dataname='eri_mo', intor='int2e',
312
323
  *args, **kwargs):
pyscf/ao2mo/_ao2mo.py CHANGED
@@ -73,7 +73,7 @@ def nr_e1fill(intor, sh_range, atm, bas, env,
73
73
  natm = ctypes.c_int(c_atm.shape[0])
74
74
  nbas = ctypes.c_int(c_bas.shape[0])
75
75
  ao_loc = make_loc(bas, intor)
76
- nao = ao_loc[-1]
76
+ nao = int(ao_loc[-1])
77
77
 
78
78
  klsh0, klsh1, nkl = sh_range
79
79
 
@@ -137,6 +137,9 @@ def nr_e1(eri, mo_coeff, orbs_slice, aosym='s1', mosym='s1', out=None):
137
137
  if out.size == 0:
138
138
  return out
139
139
 
140
+ if eri.dtype != numpy.double:
141
+ raise TypeError('_ao2mo.nr_e1 is for double precision only')
142
+
140
143
  fdrv = getattr(libao2mo, 'AO2MOnr_e2_drv')
141
144
  pao_loc = ctypes.POINTER(ctypes.c_void_p)()
142
145
  c_nbas = ctypes.c_int(0)
@@ -184,6 +187,9 @@ def nr_e2(eri, mo_coeff, orbs_slice, aosym='s1', mosym='s1', out=None,
184
187
  if out.size == 0:
185
188
  return out
186
189
 
190
+ if eri.dtype != numpy.double:
191
+ raise TypeError('_ao2mo.nr_e2 is for double precision only')
192
+
187
193
  if ao_loc is None:
188
194
  pao_loc = ctypes.POINTER(ctypes.c_void_p)()
189
195
  c_nbas = ctypes.c_int(0)
@@ -283,6 +289,9 @@ def r_e2(eri, mo_coeff, orbs_slice, tao, ao_loc, aosym='s1', out=None):
283
289
  if out.size == 0:
284
290
  return out
285
291
 
292
+ if eri.dtype != numpy.complex128:
293
+ raise TypeError('_ao2mo.r_e2 is for complex double precision only')
294
+
286
295
  tao = numpy.asarray(tao, dtype=numpy.int32)
287
296
  if ao_loc is None:
288
297
  c_ao_loc = ctypes.POINTER(ctypes.c_void_p)()
pyscf/ao2mo/incore.py CHANGED
@@ -202,6 +202,9 @@ def half_e1(eri_ao, mo_coeffs, compact=True):
202
202
  if nij_pair == 0:
203
203
  return eri1
204
204
 
205
+ if eri_ao.dtype != numpy.double:
206
+ raise TypeError('ao2mo.incore.half_e1 is for double precision only')
207
+
205
208
  if eri_ao.size == nao_pair**2: # 4-fold symmetry
206
209
  # half_e1 first transforms the indices which are contiguous in memory
207
210
  # transpose the 4-fold integrals to make ij the contiguous indices
@@ -380,9 +380,9 @@ def _count_naopair(mol, nao):
380
380
  ao_loc = mol.ao_loc_2c()
381
381
  nao_pair = 0
382
382
  for i in range(mol.nbas):
383
- di = ao_loc[i+1] - ao_loc[i]
383
+ di = int(ao_loc[i+1] - ao_loc[i])
384
384
  for j in range(i+1):
385
- dj = ao_loc[j+1] - ao_loc[j]
385
+ dj = int(ao_loc[j+1] - ao_loc[j])
386
386
  nao_pair += di * dj
387
387
  return nao_pair
388
388
 
pyscf/ao2mo/outcore.py CHANGED
@@ -487,15 +487,17 @@ def _load_from_h5g(h5group, row0, row1, out=None):
487
487
  col1 = 0
488
488
  for key in range(nkeys):
489
489
  col0, col1 = col1, col1 + h5group[str(key)].shape[1]
490
- h5group[str(key)].read_direct(out, dest_sel=numpy.s_[:,col0:col1],
491
- source_sel=numpy.s_[row0:row1])
490
+ if col1 > col0:
491
+ h5group[str(key)].read_direct(out, dest_sel=numpy.s_[:,col0:col1],
492
+ source_sel=numpy.s_[row0:row1])
492
493
  else: # multiple components
493
494
  out = numpy.ndarray((dat.shape[0], row1-row0, ncol), dat.dtype, buffer=out)
494
495
  col1 = 0
495
496
  for key in range(nkeys):
496
497
  col0, col1 = col1, col1 + h5group[str(key)].shape[2]
497
- h5group[str(key)].read_direct(out, dest_sel=numpy.s_[:,:,col0:col1],
498
- source_sel=numpy.s_[:,row0:row1])
498
+ if col1 > col0:
499
+ h5group[str(key)].read_direct(out, dest_sel=numpy.s_[:,:,col0:col1],
500
+ source_sel=numpy.s_[:,row0:row1])
499
501
  return out
500
502
 
501
503
  def _transpose_to_h5g(h5group, key, dat, blksize, chunks=None):
@@ -708,8 +710,8 @@ def guess_shell_ranges(mol, aosym, max_iobuf, max_aobuf=None, ao_loc=None,
708
710
  compress_diag=True):
709
711
  if ao_loc is None: ao_loc = mol.ao_loc_nr()
710
712
  max_iobuf = max(1, max_iobuf)
711
-
712
- dims = ao_loc[1:] - ao_loc[:-1]
713
+ ao_loc_long = ao_loc.astype(numpy.int64)
714
+ dims = ao_loc_long[1:] - ao_loc_long[:-1]
713
715
  dijs = (dims.reshape(-1,1) * dims)
714
716
  nbas = dijs.shape[0]
715
717
 
@@ -771,7 +773,7 @@ def balance_partition(ao_loc, blksize, start_id=0, stop_id=None):
771
773
  displs = [i+start_id for i in displs]
772
774
  tasks = []
773
775
  for i0, i1 in zip(displs[:-1],displs[1:]):
774
- tasks.append((i0, i1, ao_loc[i1]-ao_loc[i0]))
776
+ tasks.append((i0, i1, int(ao_loc[i1]-ao_loc[i0])))
775
777
  return tasks
776
778
 
777
779
  del (MAX_MEMORY)
pyscf/ao2mo/r_outcore.py CHANGED
@@ -302,9 +302,9 @@ def _count_naopair(mol, nao):
302
302
  ao_loc = mol.ao_loc_2c()
303
303
  nao_pair = 0
304
304
  for i in range(mol.nbas):
305
- di = ao_loc[i+1] - ao_loc[i]
305
+ di = int(ao_loc[i+1] - ao_loc[i])
306
306
  for j in range(i+1):
307
- dj = ao_loc[j+1] - ao_loc[j]
307
+ dj = int(ao_loc[j+1] - ao_loc[j])
308
308
  nao_pair += di * dj
309
309
  return nao_pair
310
310
 
pyscf/cc/__init__.py CHANGED
@@ -23,7 +23,7 @@ Simple usage::
23
23
  >>> mf = scf.RHF(mol).run()
24
24
  >>> cc.CCSD(mf).run()
25
25
 
26
- :func:`cc.CCSD` returns an instance of CCSD class. Followings are parameters
26
+ :func:`cc.CCSD` returns an instance of CCSD class. Following are parameters
27
27
  to control CCSD calculation.
28
28
 
29
29
  verbose : int
@@ -54,8 +54,8 @@ to control CCSD calculation.
54
54
 
55
55
  Saved results
56
56
 
57
- converged : bool
58
- CCSD converged or not
57
+ iterinfo : common.IterationInfo
58
+ Information about iteration (see pyscf.common.Iteration in detail)
59
59
  e_tot : float
60
60
  Total CCSD energy (HF + correlation)
61
61
  t1, t2 :
@@ -216,3 +216,21 @@ def FNOCCSD(mf, thresh=1e-6, pct_occ=None, nvir_act=None, frozen=None):
216
216
  return self
217
217
  mycc._finalize = _finalize.__get__(mycc, mycc.__class__)
218
218
  return mycc
219
+
220
+ def BCCD(mf, frozen=None, u=None, conv_tol_normu=1e-5, max_cycle=20, diis=True,
221
+ canonicalization=True):
222
+ from pyscf.cc.bccd import bccd_kernel_
223
+ from pyscf.lib import StreamObject
224
+ mycc = CCSD(mf, frozen=frozen)
225
+
226
+ class BCCD(mycc.__class__):
227
+ def kernel(self):
228
+ obj = self.view(mycc.__class__)
229
+ obj.conv_tol = 1e-3
230
+ obj.kernel()
231
+ bccd_kernel_(obj, u, conv_tol_normu, max_cycle, diis,
232
+ canonicalization, self.verbose)
233
+ self.__dict__.update(obj.__dict__)
234
+ return self.e_tot
235
+
236
+ return mycc.view(BCCD)
pyscf/cc/bccd.py CHANGED
@@ -313,49 +313,3 @@ def bccd_kernel_(mycc, u=None, conv_tol_normu=1e-5, max_cycle=20, diis=True,
313
313
  mycc.t2 = t2
314
314
 
315
315
  return mycc
316
-
317
- if __name__ == "__main__":
318
- import pyscf
319
- from pyscf import cc
320
-
321
- np.set_printoptions(3, linewidth=1000, suppress=True)
322
- mol = pyscf.M(
323
- atom = 'H 0 0 0; F 0 0 1.1',
324
- basis = 'ccpvdz',
325
- verbose = 4,
326
- spin = 0,
327
- )
328
-
329
- myhf = mol.HF()
330
- myhf.kernel()
331
- E_ref = myhf.e_tot
332
- rdm1_mf = myhf.make_rdm1()
333
-
334
- mycc = cc.CCSD(myhf, frozen=None)
335
- #mycc.frozen = [0]
336
- mycc.kernel()
337
- mycc.conv_tol = 1e-3
338
-
339
- mycc = bccd_kernel_(mycc, diis=True, verbose=4)
340
- e_r = mycc.e_tot
341
- e_ccsd_t = mycc.ccsd_t()
342
- # PSI4 reference
343
- assert abs(e_ccsd_t - -0.002625521337000) < 1e-5
344
-
345
- print (la.norm(mycc.t1))
346
- assert la.norm(mycc.t1) < 1e-5
347
-
348
- myhf = mol.UHF()
349
- myhf.kernel()
350
- myucc = cc.CCSD(myhf, frozen=None)
351
- myucc.frozen = [0]
352
- myucc.kernel()
353
-
354
- mybcc = bccd_kernel_(myucc)
355
- e_u = mybcc.e_tot
356
-
357
- mygcc = cc.addons.convert_to_gccsd(mycc)
358
- mybcc = bccd_kernel_(mygcc)
359
- e_g = mybcc.e_tot
360
- print (abs(e_g - e_r))
361
- assert abs(e_g - e_r) < 1e-6
pyscf/cc/ccsd.py CHANGED
@@ -65,7 +65,8 @@ def kernel(mycc, eris=None, t1=None, t2=None, max_cycle=50, tol=1e-8,
65
65
  else:
66
66
  adiis = None
67
67
 
68
- conv = False
68
+ converged = False
69
+ mycc.cycles = 0
69
70
  for istep in range(max_cycle):
70
71
  t1new, t2new = mycc.update_amps(t1, t2, eris)
71
72
  if callback is not None:
@@ -75,22 +76,29 @@ def kernel(mycc, eris=None, t1=None, t2=None, max_cycle=50, tol=1e-8,
75
76
  normt = numpy.linalg.norm(tmpvec)
76
77
  tmpvec = None
77
78
  if mycc.iterative_damping < 1.0:
78
- alpha = mycc.iterative_damping
79
- t1new = (1-alpha) * t1 + alpha * t1new
80
- t2new *= alpha
81
- t2new += (1-alpha) * t2
79
+ alpha = numpy.asarray(mycc.iterative_damping)
80
+ if isinstance(t1, tuple): # e.g. UCCSD
81
+ t1new = tuple((1-alpha) * numpy.asarray(t1_part) + alpha * numpy.asarray(t1new_part)
82
+ for t1_part, t1new_part in zip(t1, t1new))
83
+ t2new = tuple((1-alpha) * numpy.asarray(t2_part) + alpha * numpy.asarray(t2new_part)
84
+ for t2_part, t2new_part in zip(t2, t2new))
85
+ else:
86
+ t1new = (1-alpha) * numpy.asarray(t1) + alpha * numpy.asarray(t1new)
87
+ t2new *= alpha
88
+ t2new += (1-alpha) * numpy.asarray(t2)
82
89
  t1, t2 = t1new, t2new
83
90
  t1new = t2new = None
84
91
  t1, t2 = mycc.run_diis(t1, t2, istep, normt, eccsd-eold, adiis)
85
92
  eold, eccsd = eccsd, mycc.energy(t1, t2, eris)
93
+ mycc.cycles = istep + 1
86
94
  log.info('cycle = %d E_corr(%s) = %.15g dE = %.9g norm(t1,t2) = %.6g',
87
95
  istep+1, name, eccsd, eccsd - eold, normt)
88
96
  cput1 = log.timer(f'{name} iter', *cput1)
89
97
  if abs(eccsd-eold) < tol and normt < tolnormt:
90
- conv = True
98
+ converged = True
91
99
  break
92
100
  log.timer(name, *cput0)
93
- return conv, eccsd, t1, t2
101
+ return converged, eccsd, t1, t2
94
102
 
95
103
 
96
104
  def update_amps(mycc, t1, t2, eris):
@@ -582,7 +590,7 @@ def _contract_s4vvvv_t2(mycc, mol, vvvv, t2, out=None, verbose=None):
582
590
  tril2sq = lib.square_mat_in_trilu_indices(nvira)
583
591
  loadbuf = numpy.empty((blksize,blksize,nvirb,nvirb))
584
592
 
585
- slices = [(i0, i1) for i0, i1 in lib.prange(0, nvira, blksize)]
593
+ slices = list(lib.prange(0, nvira, blksize))
586
594
  for istep, wwbuf in enumerate(fmap(load, lib.prange(0, nvira, blksize))):
587
595
  i0, i1 = slices[istep]
588
596
  off0 = i0*(i0+1)//2
@@ -609,6 +617,8 @@ def _contract_s1vvvv_t2(mycc, mol, vvvv, t2, out=None, verbose=None):
609
617
  # vvvv == None means AO-direct CCSD. It should redirect to
610
618
  # _contract_s4vvvv_t2(mycc, mol, vvvv, t2, out, verbose)
611
619
  assert (vvvv is not None)
620
+ if t2.size == 0:
621
+ return numpy.zeros_like(t2)
612
622
 
613
623
  time0 = logger.process_clock(), logger.perf_counter()
614
624
  log = logger.new_logger(mycc, verbose)
@@ -870,7 +880,7 @@ class CCSDBase(lib.StreamObject):
870
880
  incore_complete : bool
871
881
  Avoid all I/O (also for DIIS). Default is False.
872
882
  level_shift : float
873
- A shift on virtual orbital energies to stablize the CCSD iteration
883
+ A shift on virtual orbital energies to stabilize the CCSD iteration
874
884
  frozen : int or list
875
885
  If integer is given, the inner-most orbitals are frozen from CC
876
886
  amplitudes. Given the orbital indices (0-based) in a list, both
@@ -891,10 +901,10 @@ class CCSDBase(lib.StreamObject):
891
901
  callback function can access all local variables in the current
892
902
  environment.
893
903
 
894
- Saved results
904
+ Saved results:
895
905
 
896
906
  converged : bool
897
- CCSD converged or not
907
+ Whether the CCSD iteration converged
898
908
  e_corr : float
899
909
  CCSD correlation correction
900
910
  e_tot : float
@@ -903,6 +913,8 @@ class CCSDBase(lib.StreamObject):
903
913
  T amplitudes t1[i,a], t2[i,j,a,b] (i,j in occ, a,b in virt)
904
914
  l1, l2 :
905
915
  Lambda amplitudes l1[i,a], l2[i,j,a,b] (i,j in occ, a,b in virt)
916
+ cycles : int
917
+ The number of iteration cycles performed
906
918
  '''
907
919
 
908
920
  max_cycle = getattr(__config__, 'cc_ccsd_CCSD_max_cycle', 50)
@@ -929,8 +941,8 @@ class CCSDBase(lib.StreamObject):
929
941
  'diis_start_cycle', 'diis_start_energy_diff', 'direct',
930
942
  'async_io', 'incore_complete', 'cc2', 'callback',
931
943
  'mol', 'verbose', 'stdout', 'frozen', 'level_shift',
932
- 'mo_coeff', 'mo_occ', 'converged', 'converged_lambda', 'emp2', 'e_hf',
933
- 'e_corr', 't1', 't2', 'l1', 'l2', 'chkfile',
944
+ 'mo_coeff', 'mo_occ', 'cycles', 'converged_lambda', 'emp2', 'e_hf',
945
+ 'converged', 'e_corr', 't1', 't2', 'l1', 'l2', 'chkfile',
934
946
  }
935
947
 
936
948
  def __init__(self, mf, frozen=None, mo_coeff=None, mo_occ=None):
@@ -959,6 +971,7 @@ class CCSDBase(lib.StreamObject):
959
971
  self.mo_coeff = mo_coeff
960
972
  self.mo_occ = mo_occ
961
973
  self.converged = False
974
+ self.cycles = None
962
975
  self.converged_lambda = False
963
976
  self.emp2 = None
964
977
  self.e_hf = None
@@ -971,6 +984,9 @@ class CCSDBase(lib.StreamObject):
971
984
  self._nmo = None
972
985
  self.chkfile = mf.chkfile
973
986
 
987
+ __getstate__, __setstate__ = lib.generate_pickle_methods(
988
+ excludes=('chkfile', 'callback'))
989
+
974
990
  @property
975
991
  def ecc(self):
976
992
  return self.e_corr
pyscf/cc/ccsd_rdm.py CHANGED
@@ -377,8 +377,13 @@ def _make_rdm2(mycc, d1, d2, with_dm1=True, with_frozen=True, ao_repr=False):
377
377
 
378
378
 
379
379
  def _rdm2_mo2ao(dm2, mo):
380
+ '''
381
+ Back transform the two-particle density matrices to AO representation, where
382
+ the dm2 is defined in accordance with the chemist's ERI notation:
383
+ E = einsum('pqrs,pqrs', eri, rdm2)
384
+ '''
380
385
  mo_C = mo.conj()
381
- return lib.einsum('ijkl,pi,qj,rk,sl->pqrs', dm2, mo, mo_C, mo, mo_C)
386
+ return lib.einsum('ijkl,pi,qj,rk,sl->pqrs', dm2, mo_C, mo, mo_C, mo)
382
387
 
383
388
 
384
389
  if __name__ == '__main__':
pyscf/cc/gccsd.py CHANGED
@@ -128,8 +128,8 @@ class GCCSD(ccsd.CCSDBase):
128
128
  eijab = lib.direct_sum('ia,jb->ijab', eia, eia)
129
129
  t1 = eris.fock[:nocc,nocc:] / eia
130
130
  eris_oovv = np.array(eris.oovv)
131
- t2 = eris_oovv / eijab
132
- self.emp2 = 0.25*einsum('ijab,ijab', t2, eris_oovv.conj()).real
131
+ t2 = eris_oovv.conj() / eijab
132
+ self.emp2 = 0.25*einsum('ijab,ijab', t2, eris_oovv).real
133
133
  logger.info(self, 'Init t2, MP2 energy = %.15g', self.emp2)
134
134
  return self.emp2, t1, t2
135
135