pyscf 2.7.0__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 (213) hide show
  1. pyscf/__init__.py +1 -1
  2. pyscf/ao2mo/__init__.py +13 -2
  3. pyscf/ao2mo/_ao2mo.py +10 -1
  4. pyscf/ao2mo/incore.py +3 -0
  5. pyscf/ao2mo/nrr_outcore.py +2 -2
  6. pyscf/ao2mo/outcore.py +3 -3
  7. pyscf/ao2mo/r_outcore.py +2 -2
  8. pyscf/cc/ccsd.py +13 -5
  9. pyscf/cc/ccsd_rdm.py +6 -1
  10. pyscf/cc/gccsd.py +2 -2
  11. pyscf/cc/uccsd.py +6 -6
  12. pyscf/cc/uccsd_rdm.py +2 -2
  13. pyscf/df/addons.py +2 -2
  14. pyscf/df/autoaux.py +4 -0
  15. pyscf/df/df_jk.py +27 -25
  16. pyscf/df/grad/rhf.py +31 -1
  17. pyscf/df/incore.py +1 -1
  18. pyscf/df/outcore.py +6 -6
  19. pyscf/dft/gks.py +25 -21
  20. pyscf/dft/libxc.py +30 -10
  21. pyscf/dft/numint.py +33 -16
  22. pyscf/dft/radi.py +9 -2
  23. pyscf/dft/rks.py +28 -24
  24. pyscf/dft/roks.py +7 -1
  25. pyscf/dft/uks.py +34 -25
  26. pyscf/fci/direct_spin1.py +0 -1
  27. pyscf/grad/ccsd.py +3 -7
  28. pyscf/grad/ccsd_slow.py +2 -3
  29. pyscf/grad/mp2.py +12 -3
  30. pyscf/grad/uccsd.py +3 -7
  31. pyscf/grad/ump2.py +2 -4
  32. pyscf/gto/basis/__init__.py +10 -4
  33. pyscf/gto/basis/def2-mtzvp.dat +4719 -0
  34. pyscf/gto/basis/def2-mtzvpp.dat +4739 -0
  35. pyscf/gto/basis/dyall-basis/__init__.py +0 -0
  36. pyscf/gto/basis/dyall-basis/dyall_2zp.py +6492 -0
  37. pyscf/gto/basis/dyall-basis/dyall_3zp.py +8343 -0
  38. pyscf/gto/basis/dyall-basis/dyall_4zp.py +10055 -0
  39. pyscf/gto/basis/dyall-basis/dyall_aae2z.py +1818 -0
  40. pyscf/gto/basis/dyall-basis/dyall_aae3z.py +2521 -0
  41. pyscf/gto/basis/dyall-basis/dyall_aae4z.py +3351 -0
  42. pyscf/gto/basis/dyall-basis/dyall_acv2z.py +1790 -0
  43. pyscf/gto/basis/dyall-basis/dyall_acv3z.py +2417 -0
  44. pyscf/gto/basis/dyall-basis/dyall_acv4z.py +3085 -0
  45. pyscf/gto/basis/dyall-basis/dyall_ae2z.py +6619 -0
  46. pyscf/gto/basis/dyall-basis/dyall_ae3z.py +9027 -0
  47. pyscf/gto/basis/dyall-basis/dyall_ae4z.py +11839 -0
  48. pyscf/gto/basis/dyall-basis/dyall_av2z.py +1742 -0
  49. pyscf/gto/basis/dyall-basis/dyall_av3z.py +2318 -0
  50. pyscf/gto/basis/dyall-basis/dyall_av4z.py +2905 -0
  51. pyscf/gto/basis/dyall-basis/dyall_cv2z.py +6558 -0
  52. pyscf/gto/basis/dyall-basis/dyall_cv3z.py +8767 -0
  53. pyscf/gto/basis/dyall-basis/dyall_cv4z.py +11098 -0
  54. pyscf/gto/basis/dyall-basis/dyall_v2z.py +6472 -0
  55. pyscf/gto/basis/dyall-basis/dyall_v3z.py +8539 -0
  56. pyscf/gto/basis/dyall-basis/dyall_v4z.py +10658 -0
  57. pyscf/gto/basis/ma-def2-qzvp.dat +5959 -0
  58. pyscf/gto/basis/ma-def2-qzvpp.dat +6195 -0
  59. pyscf/gto/basis/ma-def2-svp.dat +3504 -0
  60. pyscf/gto/basis/ma-def2-svpp.dat +3504 -0
  61. pyscf/gto/basis/ma-def2-tzvp.dat +4347 -0
  62. pyscf/gto/basis/ma-def2-tzvpp.dat +4549 -0
  63. pyscf/gto/basis/parse_cp2k.py +8 -7
  64. pyscf/gto/basis/parse_nwchem.py +25 -10
  65. pyscf/gto/eval_gto.py +1 -1
  66. pyscf/gto/ft_ao.py +6 -6
  67. pyscf/gto/mole.py +25 -28
  68. pyscf/gto/moleintor.py +1 -1
  69. pyscf/gw/rpa.py +133 -244
  70. pyscf/gw/urpa.py +79 -130
  71. pyscf/lib/CMakeLists.txt +6 -2
  72. pyscf/lib/config.h +0 -1
  73. pyscf/lib/config.h.in +0 -1
  74. pyscf/lib/deps/include/xc.h +28 -18
  75. pyscf/lib/deps/include/xc_funcs.h +50 -2
  76. pyscf/lib/deps/include/xc_version.h +3 -3
  77. pyscf/lib/deps/lib/libcint.6.dylib +0 -0
  78. pyscf/lib/deps/lib/{libxc.12.dylib → libxc.15.dylib} +0 -0
  79. pyscf/lib/deps/lib/libxcfun.2.dylib +0 -0
  80. pyscf/lib/dft/libxc_itrf.c +6 -6
  81. pyscf/lib/dft/nr_numint_sparse.c +3 -3
  82. pyscf/lib/diis.py +1 -1
  83. pyscf/lib/exceptions.py +3 -0
  84. pyscf/lib/libagf2.dylib +0 -0
  85. pyscf/lib/libao2mo.dylib +0 -0
  86. pyscf/lib/libcc.dylib +0 -0
  87. pyscf/lib/libcgto.dylib +0 -0
  88. pyscf/lib/libcvhf.dylib +0 -0
  89. pyscf/lib/libdft.dylib +0 -0
  90. pyscf/lib/libfci.dylib +0 -0
  91. pyscf/lib/libmcscf.dylib +0 -0
  92. pyscf/lib/libmp.dylib +0 -0
  93. pyscf/lib/libnp_helper.dylib +0 -0
  94. pyscf/lib/libpbc.dylib +0 -0
  95. pyscf/lib/libri.dylib +0 -0
  96. pyscf/lib/libxc_itrf.dylib +0 -0
  97. pyscf/lib/libxcfun_itrf.dylib +0 -0
  98. pyscf/lib/linalg_helper.py +5 -6
  99. pyscf/lib/logger.py +2 -1
  100. pyscf/lib/mcscf/fci_contract.c +8 -1
  101. pyscf/lib/misc.py +16 -8
  102. pyscf/lib/mp/CMakeLists.txt +22 -0
  103. pyscf/lib/mp/mp2.c +518 -0
  104. pyscf/lib/mp/mp2.h +44 -0
  105. pyscf/lib/np_helper/CMakeLists.txt +1 -1
  106. pyscf/lib/np_helper/imatcopy.c +360 -0
  107. pyscf/lib/np_helper/np_helper.c +94 -0
  108. pyscf/lib/np_helper/np_helper.h +26 -0
  109. pyscf/lib/numpy_helper.py +194 -10
  110. pyscf/lib/pbc/nr_direct.c +2 -7
  111. pyscf/lib/vhf/fblas.h +3 -0
  112. pyscf/lib/vhf/nr_sr_vhf.c +8 -12
  113. pyscf/lib/vhf/rkb_screen.c +139 -0
  114. pyscf/mcscf/casci.py +5 -1
  115. pyscf/mcscf/chkfile.py +2 -3
  116. pyscf/mcscf/mc1step.py +10 -6
  117. pyscf/mcscf/umc1step.py +5 -3
  118. pyscf/mp/__init__.py +1 -0
  119. pyscf/mp/dfmp2.py +498 -59
  120. pyscf/mp/dfmp2_native.py +11 -1
  121. pyscf/mp/dfmp2_slow.py +133 -0
  122. pyscf/mp/dfump2.py +672 -0
  123. pyscf/mp/dfump2_native.py +9 -0
  124. pyscf/mp/dfump2_slow.py +161 -0
  125. pyscf/mp/gmp2.py +6 -47
  126. pyscf/mp/mp2.py +19 -5
  127. pyscf/mp/ump2.py +23 -18
  128. pyscf/pbc/df/aft.py +6 -7
  129. pyscf/pbc/df/df.py +1 -1
  130. pyscf/pbc/df/df_jk.py +4 -1
  131. pyscf/pbc/df/fft.py +3 -3
  132. pyscf/pbc/df/fft_jk.py +7 -7
  133. pyscf/pbc/df/incore.py +1 -1
  134. pyscf/pbc/df/mdf_jk.py +2 -1
  135. pyscf/pbc/df/outcore.py +10 -10
  136. pyscf/pbc/df/rsdf_builder.py +2 -2
  137. pyscf/pbc/df/rsdf_helper.py +5 -5
  138. pyscf/pbc/df/rsdf_jk.py +2 -1
  139. pyscf/pbc/dft/gen_grid.py +3 -2
  140. pyscf/pbc/dft/gks.py +14 -3
  141. pyscf/pbc/dft/kgks.py +15 -4
  142. pyscf/pbc/dft/krks.py +28 -10
  143. pyscf/pbc/dft/krks_ksymm.py +21 -9
  144. pyscf/pbc/dft/krkspu.py +1 -30
  145. pyscf/pbc/dft/krkspu_ksymm.py +0 -30
  146. pyscf/pbc/dft/kuks.py +30 -13
  147. pyscf/pbc/dft/kuks_ksymm.py +22 -10
  148. pyscf/pbc/dft/kukspu.py +0 -27
  149. pyscf/pbc/dft/kukspu_ksymm.py +0 -30
  150. pyscf/pbc/dft/multigrid/multigrid.py +17 -7
  151. pyscf/pbc/dft/multigrid/multigrid_pair.py +6 -1
  152. pyscf/pbc/dft/numint.py +26 -10
  153. pyscf/pbc/dft/rks.py +16 -24
  154. pyscf/pbc/dft/uks.py +21 -4
  155. pyscf/pbc/gto/_pbcintor.py +1 -0
  156. pyscf/pbc/gto/cell.py +157 -4
  157. pyscf/pbc/gto/eval_gto.py +1 -1
  158. pyscf/pbc/gto/neighborlist.py +4 -1
  159. pyscf/pbc/scf/_response_functions.py +141 -34
  160. pyscf/pbc/scf/hf.py +0 -8
  161. pyscf/pbc/scf/khf.py +32 -3
  162. pyscf/pbc/scf/khf_ksymm.py +15 -1
  163. pyscf/pbc/scf/kuhf.py +1 -1
  164. pyscf/pbc/scf/kuhf_ksymm.py +1 -1
  165. pyscf/pbc/scf/rsjk.py +1 -1
  166. pyscf/pbc/scf/stability.py +26 -14
  167. pyscf/pbc/tdscf/krhf.py +58 -56
  168. pyscf/pbc/tdscf/kuhf.py +273 -78
  169. pyscf/pbc/tdscf/rhf.py +17 -12
  170. pyscf/pbc/tdscf/uhf.py +46 -35
  171. pyscf/pbc/tools/k2gamma.py +13 -2
  172. pyscf/pbc/tools/lattice.py +3 -3
  173. pyscf/pbc/tools/pbc.py +48 -35
  174. pyscf/scf/_response_functions.py +85 -44
  175. pyscf/scf/_vhf.py +1 -0
  176. pyscf/scf/dhf.py +82 -28
  177. pyscf/scf/dispersion.py +1 -1
  178. pyscf/scf/hf.py +19 -3
  179. pyscf/scf/uhf.py +9 -3
  180. pyscf/solvent/__init__.py +2 -2
  181. pyscf/solvent/_attach_solvent.py +2 -0
  182. pyscf/solvent/cosmors.py +366 -0
  183. pyscf/solvent/pcm.py +4 -4
  184. pyscf/solvent/smd.py +5 -3
  185. pyscf/soscf/ciah.py +2 -10
  186. pyscf/soscf/newton_ah.py +4 -1
  187. pyscf/symm/geom.py +1 -5
  188. pyscf/tdscf/_lr_eig.py +554 -57
  189. pyscf/tdscf/dhf.py +58 -65
  190. pyscf/tdscf/ghf.py +63 -71
  191. pyscf/tdscf/gks.py +12 -10
  192. pyscf/tdscf/rhf.py +68 -68
  193. pyscf/tdscf/rks.py +12 -9
  194. pyscf/tdscf/uhf.py +59 -58
  195. pyscf/tdscf/uks.py +15 -13
  196. pyscf/tools/qcschema.py +265 -0
  197. pyscf/x2c/tdscf.py +37 -37
  198. {pyscf-2.7.0.dist-info → pyscf-2.8.0.dist-info}/METADATA +29 -26
  199. {pyscf-2.7.0.dist-info → pyscf-2.8.0.dist-info}/NOTICE +11 -0
  200. {pyscf-2.7.0.dist-info → pyscf-2.8.0.dist-info}/RECORD +203 -173
  201. {pyscf-2.7.0.dist-info → pyscf-2.8.0.dist-info}/WHEEL +1 -1
  202. pyscf/pbc/tdscf/kproxy.py +0 -189
  203. pyscf/pbc/tdscf/kproxy_supercell.py +0 -664
  204. pyscf/pbc/tdscf/krhf_slow.py +0 -300
  205. pyscf/pbc/tdscf/krhf_slow_gamma.py +0 -175
  206. pyscf/pbc/tdscf/krhf_slow_supercell.py +0 -250
  207. pyscf/pbc/tdscf/proxy.py +0 -39
  208. pyscf/pbc/tdscf/rhf_slow.py +0 -35
  209. pyscf/tdscf/common_slow.py +0 -799
  210. pyscf/tdscf/proxy.py +0 -258
  211. pyscf/tdscf/rhf_slow.py +0 -181
  212. {pyscf-2.7.0.dist-info → pyscf-2.8.0.dist-info}/LICENSE +0 -0
  213. {pyscf-2.7.0.dist-info → pyscf-2.8.0.dist-info}/top_level.txt +0 -0
pyscf/dft/numint.py CHANGED
@@ -176,9 +176,9 @@ def eval_rho(mol, ao, dm, non0tab=None, xctype='LDA', hermi=0,
176
176
  if hermi:
177
177
  rho[1:4] *= 2 # *2 for + einsum('pi,ij,pj->p', ao[i], dm, ao[0])
178
178
  else:
179
+ c1 = _dot_ao_dm(mol, ao[0], dm.conj().T, non0tab, shls_slice, ao_loc)
179
180
  for i in range(1, 4):
180
- c1 = _dot_ao_dm(mol, ao[i], dm, non0tab, shls_slice, ao_loc)
181
- rho[i] += _contract_rho(c1, ao[0])
181
+ rho[i] += _contract_rho(c1, ao[i])
182
182
  else: # meta-GGA
183
183
  if with_lapl:
184
184
  # rho[4] = \nabla^2 rho, rho[5] = 1/2 |nabla f|^2
@@ -312,14 +312,14 @@ def eval_rho1(mol, ao, dm, screen_index=None, xctype='LDA', hermi=0,
312
312
 
313
313
  rho[tau_idx] = 0
314
314
  for i in range(1, 4):
315
- c1 = _dot_ao_dm_sparse(ao[i], dm.T, nbins, screen_index, pair_mask, ao_loc)
315
+ c1 = _dot_ao_dm_sparse(ao[i], dm, nbins, screen_index, pair_mask, ao_loc)
316
316
  rho[tau_idx] += _contract_rho_sparse(ao[i], c1, screen_index, ao_loc)
317
317
 
318
318
  rho[i] = _contract_rho_sparse(ao[i], c0, screen_index, ao_loc)
319
319
  if hermi:
320
320
  rho[i] *= 2
321
321
  else:
322
- rho[i] += _contract_rho_sparse(c1, ao[0], screen_index, ao_loc)
322
+ rho[i] += _contract_rho_sparse(ao[0], c1, screen_index, ao_loc)
323
323
 
324
324
  # tau = 1/2 (\nabla f)^2
325
325
  rho[tau_idx] *= .5
@@ -812,9 +812,8 @@ def _tau_dot(mol, bra, ket, wv, mask, shls_slice, ao_loc):
812
812
  mat += _dot_ao_ao(mol, bra[3], aow, mask, shls_slice, ao_loc)
813
813
  return mat
814
814
 
815
- def _sparse_enough(screen_index):
815
+ def _sparse_enough(screen_index, threshold=0.5):
816
816
  # TODO: improve the turnover threshold
817
- threshold = 0.5
818
817
  return numpy.count_nonzero(screen_index) < screen_index.size * threshold
819
818
 
820
819
  def _dot_ao_ao_dense(ao1, ao2, wv, out=None):
@@ -831,13 +830,8 @@ def _dot_ao_ao_dense(ao1, ao2, wv, out=None):
831
830
  return lib.ddot(ao1.T, ao2, 1, out, 1)
832
831
  else:
833
832
  assert wv.dtype == numpy.double
834
- libdft.VXCdot_aow_ao_dense(
835
- out.ctypes.data_as(ctypes.c_void_p),
836
- ao1.ctypes.data_as(ctypes.c_void_p),
837
- ao2.ctypes.data_as(ctypes.c_void_p),
838
- wv.ctypes.data_as(ctypes.c_void_p),
839
- ctypes.c_int(nao), ctypes.c_int(ngrids))
840
- return out
833
+ ao1 = _scale_ao(ao1, wv.ravel())
834
+ return lib.ddot(ao1.T, ao2, 1, out, 1)
841
835
 
842
836
  def _dot_ao_ao_sparse(ao1, ao2, wv, nbins, screen_index, pair_mask, ao_loc,
843
837
  hermi=0, out=None):
@@ -2723,9 +2717,12 @@ class LibXCMixin:
2723
2717
  '''
2724
2718
  omega, alpha, beta = self.rsh_coeff(xc_code)
2725
2719
  if self.omega is not None:
2720
+ if omega == 0 and self.omega != 0:
2721
+ raise RuntimeError(f'Not support assigning omega={self.omega}. '
2722
+ f'{xc_code} is not a RSH functional')
2726
2723
  omega = self.omega
2727
2724
 
2728
- if abs(omega) > 1e-10:
2725
+ if omega != 0:
2729
2726
  hyb = alpha + beta
2730
2727
  else:
2731
2728
  hyb = self.hybrid_coeff(xc_code, spin)
@@ -2856,12 +2853,32 @@ class NumInt(lib.StreamObject, LibXCMixin):
2856
2853
  pair_mask = ovlp_cond < -numpy.log(self.cutoff)
2857
2854
  pair_mask = numpy.asarray(pair_mask, dtype=numpy.uint8)
2858
2855
 
2856
+ if (mo_occ is not None) and (grids is not None):
2857
+ # eval_rho2 is more efficient unless we have a very large system
2858
+ # for which the pair_mask is significantly sparser than the
2859
+ # ratio of occupied to total molecular orbitals. So we use this ratio
2860
+ # to switch between eval_rho1 and eval_rho2.
2861
+ mo_ao_sparsity = max(0.5 * numpy.sum(mo_occ) / nao, 1e-8)
2862
+ wts = mol.ao_loc_nr()
2863
+ wts = (wts[1:] - wts[:-1]) / wts[-1]
2864
+ rho1_rho2_ratio = numpy.dot(wts, pair_mask).dot(wts) / mo_ao_sparsity
2865
+ else:
2866
+ rho1_rho2_ratio = 0.0
2867
+
2859
2868
  def make_rho(idm, ao, sindex, xctype):
2860
- if sindex is not None and grids is not None:
2869
+ has_screening = sindex is not None and grids is not None
2870
+ has_mo = mo_coeff is not None
2871
+ if xctype == "GGA":
2872
+ # GGA has to do more contractions using rho2 compared to rho1,
2873
+ # so the threshold for switching to rho1 is less strict.
2874
+ is_sparse = rho1_rho2_ratio < 4
2875
+ else:
2876
+ is_sparse = rho1_rho2_ratio < 1
2877
+ if has_screening and (not has_mo or is_sparse):
2861
2878
  return self.eval_rho1(mol, ao, dms[idm], sindex, xctype, hermi,
2862
2879
  with_lapl, cutoff=self.cutoff,
2863
2880
  ao_cutoff=grids.cutoff, pair_mask=pair_mask)
2864
- elif mo_coeff is not None:
2881
+ elif has_mo:
2865
2882
  return self.eval_rho2(mol, ao, mo_coeff[idm], mo_occ[idm],
2866
2883
  sindex, xctype, with_lapl)
2867
2884
  else:
pyscf/dft/radi.py CHANGED
@@ -47,14 +47,21 @@ SG1RADII = numpy.array((
47
47
  def murray(n, *args, **kwargs):
48
48
  raise RuntimeError('Not implemented')
49
49
 
50
- # Gauss-Chebyshev of the first kind, and the transformed interval [0,\infty)
51
50
  def becke(n, charge, *args, **kwargs):
52
51
  '''Becke, JCP 88, 2547 (1988); DOI:10.1063/1.454033'''
53
52
  if charge == 1:
54
53
  rm = BRAGG_RADII[charge]
55
54
  else:
56
55
  rm = BRAGG_RADII[charge] * .5
57
- t, w = numpy.polynomial.chebyshev.chebgauss(n)
56
+
57
+ # Points and weights for Gauss-Chebyshev quadrature points of the second kind
58
+ # The weights are adjusted to integrate a function on the interval [-1, 1] with uniform weighting
59
+ # instead of weighted by sqrt(1 - t^2) = sin(i pi / (n+1)).
60
+ i = numpy.arange(n) + 1
61
+ t = numpy.cos(i * numpy.pi / (n + 1))
62
+ w = numpy.pi / (n + 1) * numpy.sin(i * numpy.pi / (n + 1))
63
+
64
+ # Change of variables to map the domain to [0, inf)
58
65
  r = (1+t)/(1-t) * rm
59
66
  w *= 2/(1-t)**2 * rm
60
67
  return r, w
pyscf/dft/rks.py CHANGED
@@ -92,36 +92,40 @@ def get_veff(ks, mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1):
92
92
  logger.debug(ks, 'nelec with nlc grids = %s', n)
93
93
  t0 = logger.timer(ks, 'vxc', *t0)
94
94
 
95
+ incremental_jk = (ks._eri is None and ks.direct_scf and
96
+ getattr(vhf_last, 'vj', None) is not None)
97
+ if incremental_jk:
98
+ _dm = numpy.asarray(dm) - numpy.asarray(dm_last)
99
+ else:
100
+ _dm = dm
95
101
  if not ni.libxc.is_hybrid_xc(ks.xc):
96
102
  vk = None
97
- if (ks._eri is None and ks.direct_scf and
98
- getattr(vhf_last, 'vj', None) is not None):
99
- ddm = numpy.asarray(dm) - numpy.asarray(dm_last)
100
- vj = ks.get_j(mol, ddm, hermi)
103
+ vj = ks.get_j(mol, _dm, hermi)
104
+ if incremental_jk:
101
105
  vj += vhf_last.vj
102
- else:
103
- vj = ks.get_j(mol, dm, hermi)
104
106
  vxc += vj
105
107
  else:
106
108
  omega, alpha, hyb = ni.rsh_and_hybrid_coeff(ks.xc, spin=mol.spin)
107
- if (ks._eri is None and ks.direct_scf and
108
- getattr(vhf_last, 'vk', None) is not None):
109
- ddm = numpy.asarray(dm) - numpy.asarray(dm_last)
110
- vj, vk = ks.get_jk(mol, ddm, hermi)
109
+ if omega == 0:
110
+ vj, vk = ks.get_jk(mol, _dm, hermi)
111
+ vk *= hyb
112
+ elif alpha == 0: # LR=0, only SR exchange
113
+ vj = ks.get_j(mol, _dm, hermi)
114
+ vk = ks.get_k(mol, _dm, hermi, omega=-omega)
115
+ vk *= hyb
116
+ elif hyb == 0: # SR=0, only LR exchange
117
+ vj = ks.get_j(mol, _dm, hermi)
118
+ vk = ks.get_k(mol, _dm, hermi, omega=omega)
119
+ vk *= alpha
120
+ else: # SR and LR exchange with different ratios
121
+ vj, vk = ks.get_jk(mol, _dm, hermi)
111
122
  vk *= hyb
112
- if omega != 0: # For range separated Coulomb
113
- vklr = ks.get_k(mol, ddm, hermi, omega=omega)
114
- vklr *= (alpha - hyb)
115
- vk += vklr
123
+ vklr = ks.get_k(mol, _dm, hermi, omega=omega)
124
+ vklr *= (alpha - hyb)
125
+ vk += vklr
126
+ if incremental_jk:
116
127
  vj += vhf_last.vj
117
128
  vk += vhf_last.vk
118
- else:
119
- vj, vk = ks.get_jk(mol, dm, hermi)
120
- vk *= hyb
121
- if omega != 0:
122
- vklr = ks.get_k(mol, dm, hermi, omega=omega)
123
- vklr *= (alpha - hyb)
124
- vk += vklr
125
129
  vxc += vj - vk * .5
126
130
 
127
131
  if ground_state:
@@ -322,6 +326,9 @@ class KohnShamDFT:
322
326
 
323
327
  _keys = {'xc', 'nlc', 'grids', 'disp', 'nlcgrids', 'small_rho_cutoff'}
324
328
 
329
+ # Use rho to filter grids
330
+ small_rho_cutoff = getattr(__config__, 'dft_rks_RKS_small_rho_cutoff', 1e-7)
331
+
325
332
  def __init__(self, xc='LDA,VWN'):
326
333
  # By default, self.nlc = '' and self.disp = None
327
334
  self.xc = xc
@@ -333,9 +340,6 @@ class KohnShamDFT:
333
340
  self.nlcgrids = gen_grid.Grids(self.mol)
334
341
  self.nlcgrids.level = getattr(
335
342
  __config__, 'dft_rks_RKS_nlcgrids_level', self.nlcgrids.level)
336
- # Use rho to filter grids
337
- self.small_rho_cutoff = getattr(
338
- __config__, 'dft_rks_RKS_small_rho_cutoff', 1e-7)
339
343
  ##################################################
340
344
  # don't modify the following attributes, they are not input options
341
345
  self._numint = numint.NumInt()
pyscf/dft/roks.py CHANGED
@@ -30,12 +30,18 @@ from pyscf.dft import uks
30
30
 
31
31
  @lib.with_doc(uks.get_veff.__doc__)
32
32
  def get_veff(ks, mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1):
33
- if getattr(dm, 'mo_coeff', None) is not None:
33
+ if dm is None:
34
+ dm = ks.make_rdm1()
35
+ elif getattr(dm, 'mo_coeff', None) is not None:
34
36
  mo_coeff = dm.mo_coeff
35
37
  mo_occ_a = (dm.mo_occ > 0).astype(numpy.double)
36
38
  mo_occ_b = (dm.mo_occ ==2).astype(numpy.double)
39
+ if dm.ndim == 2: # RHF DM
40
+ dm = numpy.repeat(dm[None]*.5, 2, axis=0)
37
41
  dm = lib.tag_array(dm, mo_coeff=(mo_coeff,mo_coeff),
38
42
  mo_occ=(mo_occ_a,mo_occ_b))
43
+ elif dm.ndim == 2: # RHF DM
44
+ dm = numpy.repeat(dm[None]*.5, 2, axis=0)
39
45
  return uks.get_veff(ks, mol, dm, dm_last, vhf_last, hermi)
40
46
 
41
47
 
pyscf/dft/uks.py CHANGED
@@ -36,7 +36,8 @@ def get_veff(ks, mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1):
36
36
  if not isinstance(dm, numpy.ndarray):
37
37
  dm = numpy.asarray(dm)
38
38
  if dm.ndim == 2: # RHF DM
39
- dm = numpy.asarray((dm*.5,dm*.5))
39
+ logger.warn(ks, 'Incompatible dm dimension. Treat dm as RHF density matrix.')
40
+ dm = numpy.repeat(dm[None]*.5, 2, axis=0)
40
41
  ks.initialize_grids(mol, dm)
41
42
 
42
43
  t0 = (logger.process_clock(), logger.perf_counter())
@@ -63,37 +64,44 @@ def get_veff(ks, mol=None, dm=None, dm_last=0, vhf_last=0, hermi=1):
63
64
  logger.debug(ks, 'nelec with nlc grids = %s', n)
64
65
  t0 = logger.timer(ks, 'vxc', *t0)
65
66
 
67
+ incremental_jk = (ks._eri is None and ks.direct_scf and
68
+ getattr(vhf_last, 'vj', None) is not None)
69
+ if incremental_jk:
70
+ dm_last = numpy.asarray(dm_last)
71
+ dm = numpy.asarray(dm)
72
+ assert dm_last.ndim == 0 or dm_last.ndim == dm.ndim
73
+ _dm = dm - dm_last
74
+ else:
75
+ _dm = dm
66
76
  if not ni.libxc.is_hybrid_xc(ks.xc):
67
77
  vk = None
68
- if (ks._eri is None and ks.direct_scf and
69
- getattr(vhf_last, 'vj', None) is not None):
70
- ddm = numpy.asarray(dm) - numpy.asarray(dm_last)
71
- vj = ks.get_j(mol, ddm[0]+ddm[1], hermi)
78
+ vj = ks.get_j(mol, _dm[0]+_dm[1], hermi)
79
+ if incremental_jk:
72
80
  vj += vhf_last.vj
73
- else:
74
- vj = ks.get_j(mol, dm[0]+dm[1], hermi)
75
81
  vxc += vj
76
82
  else:
77
83
  omega, alpha, hyb = ni.rsh_and_hybrid_coeff(ks.xc, spin=mol.spin)
78
- if (ks._eri is None and ks.direct_scf and
79
- getattr(vhf_last, 'vk', None) is not None):
80
- ddm = numpy.asarray(dm) - numpy.asarray(dm_last)
81
- vj, vk = ks.get_jk(mol, ddm, hermi)
84
+ if omega == 0:
85
+ vj, vk = ks.get_jk(mol, _dm, hermi)
82
86
  vk *= hyb
83
- if omega != 0:
84
- vklr = ks.get_k(mol, ddm, hermi, omega)
85
- vklr *= (alpha - hyb)
86
- vk += vklr
87
- vj = vj[0] + vj[1] + vhf_last.vj
88
- vk += vhf_last.vk
89
- else:
90
- vj, vk = ks.get_jk(mol, dm, hermi)
91
- vj = vj[0] + vj[1]
87
+ elif alpha == 0: # LR=0, only SR exchange
88
+ vj = ks.get_j(mol, _dm, hermi)
89
+ vk = ks.get_k(mol, _dm, hermi, omega=-omega)
90
+ vk *= hyb
91
+ elif hyb == 0: # SR=0, only LR exchange
92
+ vj = ks.get_j(mol, _dm, hermi)
93
+ vk = ks.get_k(mol, _dm, hermi, omega=omega)
94
+ vk *= alpha
95
+ else: # SR and LR exchange with different ratios
96
+ vj, vk = ks.get_jk(mol, _dm, hermi)
92
97
  vk *= hyb
93
- if omega != 0:
94
- vklr = ks.get_k(mol, dm, hermi, omega)
95
- vklr *= (alpha - hyb)
96
- vk += vklr
98
+ vklr = ks.get_k(mol, _dm, hermi, omega=omega)
99
+ vklr *= (alpha - hyb)
100
+ vk += vklr
101
+ vj = vj[0] + vj[1]
102
+ if incremental_jk:
103
+ vj += vhf_last.vj
104
+ vk += vhf_last.vk
97
105
  vxc += vj - vk
98
106
 
99
107
  if ground_state:
@@ -178,7 +186,8 @@ class UKS(rks.KohnShamDFT, uhf.UHF):
178
186
  ground_state = (isinstance(dm, numpy.ndarray)
179
187
  and dm.ndim == 3 and dm.shape[0] == 2)
180
188
  if ground_state:
181
- super().initialize_grids(mol, dm[0]+dm[1])
189
+ dm = numpy.asarray(dm[0] + dm[1])
190
+ super().initialize_grids(mol, dm)
182
191
  else:
183
192
  super().initialize_grids(mol)
184
193
  return self
pyscf/fci/direct_spin1.py CHANGED
@@ -775,7 +775,6 @@ class FCIBase(lib.StreamObject):
775
775
 
776
776
  def __init__(self, mol=None):
777
777
  if mol is None:
778
- self.stdout = sys.stdout
779
778
  self.verbose = logger.NOTE
780
779
  self.max_memory = lib.param.MAX_MEMORY
781
780
  else:
pyscf/grad/ccsd.py CHANGED
@@ -33,7 +33,7 @@ from pyscf.cc import ccsd_rdm
33
33
  from pyscf.ao2mo import _ao2mo
34
34
  from pyscf.scf import cphf
35
35
  from pyscf.grad import rhf as rhf_grad
36
- from pyscf.grad.mp2 import _shell_prange, _index_frozen_active
36
+ from pyscf.grad.mp2 import _shell_prange, _index_frozen_active, has_frozen_orbitals
37
37
 
38
38
 
39
39
  #
@@ -71,9 +71,7 @@ def grad_elec(cc_grad, t1=None, t2=None, l1=None, l2=None, eris=None, atmlst=Non
71
71
  mo_energy = mycc._scf.mo_energy
72
72
  nao, nmo = mo_coeff.shape
73
73
  nocc = numpy.count_nonzero(mycc.mo_occ > 0)
74
- with_frozen = not ((mycc.frozen is None)
75
- or (isinstance(mycc.frozen, (int, numpy.integer)) and mycc.frozen == 0)
76
- or (len(mycc.frozen) == 0))
74
+ with_frozen = has_frozen_orbitals(mycc)
77
75
  OA, VA, OF, VF = _index_frozen_active(mycc.get_frozen_mask(), mycc.mo_occ)
78
76
 
79
77
  log.debug('symmetrized rdm2 and MO->AO transformation')
@@ -267,9 +265,7 @@ class CCSD_GradScanner(lib.GradScanner):
267
265
  def _response_dm1(mycc, Xvo, eris=None):
268
266
  nvir, nocc = Xvo.shape
269
267
  nmo = nocc + nvir
270
- with_frozen = not ((mycc.frozen is None)
271
- or (isinstance(mycc.frozen, (int, numpy.integer)) and mycc.frozen == 0)
272
- or (len(mycc.frozen) == 0))
268
+ with_frozen = has_frozen_orbitals(mycc)
273
269
  if eris is None or with_frozen:
274
270
  mo_energy = mycc._scf.mo_energy
275
271
  mo_occ = mycc.mo_occ
pyscf/grad/ccsd_slow.py CHANGED
@@ -29,6 +29,7 @@ from pyscf import lib
29
29
  from pyscf import ao2mo
30
30
  from pyscf.cc import ccsd_rdm
31
31
  from pyscf.grad import ccsd as ccsd_grad
32
+ from pyscf.grad.mp2 import has_frozen_orbitals
32
33
 
33
34
  def kernel(cc, t1, t2, l1, l2, eris=None):
34
35
  if eris is None:
@@ -40,9 +41,7 @@ def kernel(cc, t1, t2, l1, l2, eris=None):
40
41
  nocc = numpy.count_nonzero(cc.mo_occ > 0)
41
42
  mo_e_o = mo_energy[:nocc]
42
43
  mo_e_v = mo_energy[nocc:]
43
- with_frozen = not ((cc.frozen is None)
44
- or (isinstance(cc.frozen, (int, numpy.integer)) and cc.frozen == 0)
45
- or (len(cc.frozen) == 0))
44
+ with_frozen = has_frozen_orbitals(cc)
46
45
 
47
46
  d1 = _gamma1_intermediates(cc, t1, t2, l1, l2)
48
47
  d2 = _gamma2_intermediates(cc, t1, t2, l1, l2)
pyscf/grad/mp2.py CHANGED
@@ -46,9 +46,7 @@ def grad_elec(mp_grad, t2, atmlst=None, verbose=logger.INFO):
46
46
  # nocc, nvir should be updated to include the frozen orbitals when proceeding
47
47
  # the 1-particle quantities later.
48
48
  mol = mp_grad.mol
49
- with_frozen = not ((mp.frozen is None)
50
- or (isinstance(mp.frozen, (int, numpy.integer)) and mp.frozen == 0)
51
- or (len(mp.frozen) == 0))
49
+ with_frozen = has_frozen_orbitals(mp)
52
50
  OA, VA, OF, VF = _index_frozen_active(mp.get_frozen_mask(), mp.mo_occ)
53
51
  orbo = mp.mo_coeff[:,OA]
54
52
  orbv = mp.mo_coeff[:,VA]
@@ -188,6 +186,17 @@ def grad_elec(mp_grad, t2, atmlst=None, verbose=logger.INFO):
188
186
  log.timer('%s gradients' % mp.__class__.__name__, *time0)
189
187
  return de
190
188
 
189
+ def has_frozen_orbitals(post_hf):
190
+ '''Test if frozen orbitlas are enabled in a post-HF object.'''
191
+ with_frozen = False
192
+ if getattr(post_hf, 'frozen', None) is not None:
193
+ if isinstance(post_hf.frozen, (int, numpy.integer)):
194
+ with_frozen = post_hf.frozen != 0
195
+ elif hasattr(post_hf.frozen, '__len__'):
196
+ with_frozen = len(post_hf.frozen) != 0
197
+ else:
198
+ raise TypeError(f'Unsupported .frozen attribute {post_hf.frozen}')
199
+ return with_frozen
191
200
 
192
201
  def as_scanner(grad_mp):
193
202
  '''Generating a nuclear gradients scanner/solver (for geometry optimizer).
pyscf/grad/uccsd.py CHANGED
@@ -33,7 +33,7 @@ from pyscf.ao2mo import _ao2mo
33
33
  from pyscf.scf import ucphf
34
34
  from pyscf.grad import rhf as rhf_grad
35
35
  from pyscf.grad import ccsd as ccsd_grad
36
-
36
+ from pyscf.grad.mp2 import has_frozen_orbitals
37
37
 
38
38
  #
39
39
  # Note: only works with canonical orbitals
@@ -72,9 +72,7 @@ def grad_elec(cc_grad, t1=None, t2=None, l1=None, l2=None, eris=None, atmlst=Non
72
72
  nmob = mo_b.shape[1]
73
73
  nocca = numpy.count_nonzero(mycc.mo_occ[0] > 0)
74
74
  noccb = numpy.count_nonzero(mycc.mo_occ[1] > 0)
75
- with_frozen = not ((mycc.frozen is None)
76
- or (isinstance(mycc.frozen, (int, numpy.integer)) and mycc.frozen == 0)
77
- or (len(mycc.frozen) == 0))
75
+ with_frozen = has_frozen_orbitals(mycc)
78
76
  moidx = mycc.get_frozen_mask()
79
77
  OA_a, VA_a, OF_a, VF_a = ccsd_grad._index_frozen_active(moidx[0], mycc.mo_occ[0])
80
78
  OA_b, VA_b, OF_b, VF_b = ccsd_grad._index_frozen_active(moidx[1], mycc.mo_occ[1])
@@ -249,9 +247,7 @@ def _response_dm1(mycc, Xvo, eris=None):
249
247
  nmoa = nocca + nvira
250
248
  nmob = noccb + nvirb
251
249
  nova = nocca * nvira
252
- with_frozen = not ((mycc.frozen is None)
253
- or (isinstance(mycc.frozen, (int, numpy.integer)) and mycc.frozen == 0)
254
- or (len(mycc.frozen) == 0))
250
+ with_frozen = has_frozen_orbitals(mycc)
255
251
  if eris is None or with_frozen:
256
252
  mo_energy = mycc._scf.mo_energy
257
253
  mo_occ = mycc.mo_occ
pyscf/grad/ump2.py CHANGED
@@ -30,7 +30,7 @@ from pyscf.ao2mo import _ao2mo
30
30
  from pyscf.mp import ump2
31
31
  from pyscf.grad import rhf as rhf_grad
32
32
  from pyscf.grad import mp2 as mp2_grad
33
-
33
+ from pyscf.grad.mp2 import has_frozen_orbitals
34
34
 
35
35
  def grad_elec(mp_grad, t2, atmlst=None, verbose=logger.INFO):
36
36
  mp = mp_grad.base
@@ -43,9 +43,7 @@ def grad_elec(mp_grad, t2, atmlst=None, verbose=logger.INFO):
43
43
  log.debug('Build ump2 rdm2 intermediates')
44
44
 
45
45
  mol = mp_grad.mol
46
- with_frozen = not ((mp.frozen is None)
47
- or (isinstance(mp.frozen, (int, numpy.integer)) and mp.frozen == 0)
48
- or (len(mp.frozen) == 0))
46
+ with_frozen = has_frozen_orbitals(mp)
49
47
  moidx = mp.get_frozen_mask()
50
48
  OA_a, VA_a, OF_a, VF_a = mp2_grad._index_frozen_active(moidx[0], mp.mo_occ[0])
51
49
  OA_b, VA_b, OF_b, VF_b = mp2_grad._index_frozen_active(moidx[1], mp.mo_occ[1])
@@ -158,6 +158,8 @@ ALIAS = {
158
158
  'def2tzvppd' : 'def2-tzvppd.dat',
159
159
  'def2tzvpp' : 'def2-tzvpp.dat' ,
160
160
  'def2tzvp' : 'def2-tzvp.dat' ,
161
+ 'def2mtzvpp' : 'def2-mtzvpp.dat',
162
+ 'def2mtzvp' : 'def2-mtzvp.dat' ,
161
163
  'def2qzvpd' : 'def2-qzvpd.dat' ,
162
164
  'def2qzvppd' : 'def2-qzvppd.dat',
163
165
  'def2qzvpp' : 'def2-qzvpp.dat' ,
@@ -183,6 +185,12 @@ ALIAS = {
183
185
  'def2qzvpri' : 'def2-qzvp-ri.dat' ,
184
186
  'def2qzvppri' : 'def2-qzvpp-ri.dat' ,
185
187
  'def2qzvppdri' : 'def2-qzvppd-ri.dat' ,
188
+ 'madef2svpp' : 'ma-def2-svpp.dat' ,
189
+ 'madef2svp' : 'ma-def2-svp.dat' ,
190
+ 'madef2tzvpp' : 'ma-def2-tzvpp.dat' ,
191
+ 'madef2tzvp' : 'ma-def2-tzvp.dat' ,
192
+ 'madef2qzvpp' : 'ma-def2-qzvpp.dat' ,
193
+ 'madef2qzvp' : 'ma-def2-qzvp.dat' ,
186
194
  'tzv' : 'tzv.dat' ,
187
195
  'weigend' : 'def2-universal-jfit.dat',
188
196
  'weigend+etb' : 'def2-universal-jfit.dat',
@@ -647,8 +655,7 @@ def load(filename_or_basisname, symb, optimize=OPTIMIZE_CONTRACTION):
647
655
  filename_or_basisname, elements=symb)
648
656
  except KeyError:
649
657
  raise BasisNotFoundError(filename_or_basisname)
650
- else:
651
- return bse._orbital_basis(bse_obj)[0]
658
+ return bse._orbital_basis(bse_obj)[0][symb]
652
659
 
653
660
  raise BasisNotFoundError(f'Unknown basis format or basis name for {filename_or_basisname}')
654
661
 
@@ -701,8 +708,7 @@ def load_ecp(filename_or_basisname, symb):
701
708
  filename_or_basisname, elements=symb)
702
709
  except KeyError:
703
710
  raise BasisNotFoundError(filename_or_basisname)
704
- else:
705
- return bse._ecp_basis(bse_obj)[0]
711
+ return bse._ecp_basis(bse_obj)[0][symb]
706
712
 
707
713
  raise BasisNotFoundError('Unknown ECP format or ECP name')
708
714