@@ -54,6 +54,29 @@ def partial_hess_elec(hessobj, mo_energy=None, mo_coeff=None, mo_occ=None,
5454 atmlst , max_memory , verbose , True )
5555 return e1 + ej - ek
5656
57+ def _hk_ip1_ip1 (rhok1_Pko , dm0 , mocc_2 ):
58+ ''' hk contributions due to (10|0)(0|10) + (10|0)(0|01)
59+ '''
60+ nnz = rhok1_Pko .shape [0 ]
61+ nao = dm0 .shape [0 ]
62+ mem_avail = get_avail_mem ()
63+ blksize = int ((mem_avail * 0.4 / (nao * nao * 3 * 8 )/ ALIGNED ))* ALIGNED
64+ hk_ao_ao = cupy .zeros ([nao ,nao ,3 ,3 ])
65+ for k0 , k1 in lib .prange (0 ,nnz ,blksize ):
66+ rhok1_Pko_kslice = cupy .asarray (rhok1_Pko [k0 :k1 ])
67+
68+ # (10|0)(0|10) without response of RI basis
69+ vk2_ip1_ip1 = contract ('piox,pkoy->ikxy' , rhok1_Pko_kslice , rhok1_Pko_kslice )
70+ hk_ao_ao += contract ('ikxy,ik->ikxy' , vk2_ip1_ip1 , dm0 )
71+ vk2_ip1_ip1 = None
72+
73+ # (10|0)(0|01) without response of RI basis
74+ rhok1_Pkl_kslice = contract ('piox,ko->pikx' , rhok1_Pko_kslice , mocc_2 )
75+ hk_ao_ao += contract ('pikx,pkiy->ikxy' , rhok1_Pkl_kslice , rhok1_Pkl_kslice )
76+ rhok1_Pkl_kslice = None
77+ return hk_ao_ao
78+
79+
5780def _partial_hess_ejk (hessobj , mo_energy = None , mo_coeff = None , mo_occ = None ,
5881 atmlst = None , max_memory = 4000 , verbose = None , with_k = True , omega = None ):
5982 '''Partial derivative
@@ -94,7 +117,7 @@ def _partial_hess_ejk(hessobj, mo_energy=None, mo_coeff=None, mo_occ=None,
94117 # ================================ sorted AO begin ===============================================
95118 intopt = int3c2e .VHFOpt (mol , auxmol , 'int2e' )
96119 intopt .build (mf .direct_scf_tol , diag_block_with_triu = True , aosym = False , group_size = BLKSIZE , group_size_aux = BLKSIZE )
97- naux = auxmol .nao #len(aux_ao_idx)
120+ naux = auxmol .nao
98121 mocc_2 = intopt .sort_orbitals (mocc_2 , axis = [0 ])
99122 dm0 = intopt .sort_orbitals (dm0 , axis = [0 ,1 ])
100123 dm0_tag = tag_array (dm0 , occ_coeff = mocc_2 )
@@ -118,7 +141,6 @@ def _partial_hess_ejk(hessobj, mo_energy=None, mo_coeff=None, mo_occ=None,
118141 rhoj0_P = solve_j2c (wj )
119142 rhok0_P__ = solve_j2c (wk_P__ )
120143 wj = wk_P__ = None
121- t1 = log .timer_debug1 ('intermediate variables with int3c2e' , * t1 )
122144
123145 # int3c_ip2 contributions
124146 wj_ip2 , wk_ip2_P__ = int3c2e .get_int3c2e_ip2_wjk (intopt , dm0_tag , omega = omega )
@@ -188,36 +210,20 @@ def _partial_hess_ejk(hessobj, mo_energy=None, mo_coeff=None, mo_occ=None,
188210 rhok1_Pko [:,i0 :i1 ] = contract ('qp,qiox->piox' , cd_low , wk1_tmp ).get ()
189211 wk1_tmp = None
190212 cd_low = None
191-
192- mem_avail = get_avail_mem ()
193- blksize = int ((mem_avail * 0.4 / (nao * nao * 3 * 8 )/ ALIGNED ))* ALIGNED
194- log .debug (f'GPU Memory { mem_avail / GB :.1f} GB available, { blksize } aux AOs per block' )
195- for k0 , k1 in lib .prange (0 ,nnz ,blksize ):
196- rhok1_Pko_kslice = cupy .asarray (rhok1_Pko [k0 :k1 ])
197-
198- # (10|0)(0|10) without response of RI basis
199- vk2_ip1_ip1 = contract ('piox,pkoy->ikxy' , rhok1_Pko_kslice , rhok1_Pko_kslice )
200- hk_ao_ao += contract ('ikxy,ik->ikxy' , vk2_ip1_ip1 , dm0 )
201- vk2_ip1_ip1 = None
202-
203- # (10|0)(0|01) without response of RI basis
204- rhok1_Pkl_kslice = contract ('piox,ko->pikx' , rhok1_Pko_kslice , mocc_2 )
205- hk_ao_ao += contract ('pikx,pkiy->ikxy' , rhok1_Pkl_kslice , rhok1_Pkl_kslice )
206- rhok1_Pkl_kslice = None
207- rhok1_Pko_kslice = None
208-
213+
214+ hk_ao_ao += _hk_ip1_ip1 (rhok1_Pko , dm0 , mocc_2 )
209215 wk1_Pko = rhok1_Pko = None
210216 t1 = log .timer_debug1 ('intermediate variables with int3c2e_ip1' , * t1 )
211217
212218 cupy .get_default_memory_pool ().free_all_blocks ()
213219 # int3c_ipip1 contributions
214- hj_ao_diag , hk_ao_diag = int3c2e .get_int3c2e_ipip1_hjk (intopt , rhoj0_P , rhok0_P__ , dm0_tag , omega = omega , with_k = with_k )
220+ hj_ao_diag , hk_ao_diag = int3c2e .get_int3c2e_hjk (intopt , 'ipip1' , rhoj0_P , rhok0_P__ , dm0_tag , omega = omega , with_k = with_k )
215221 hj_ao_diag *= 2.0
216222 t1 = log .timer_debug1 ('intermediate variables with int3c2e_ipip1' , * t1 )
217223
218224 # int3c_ipvip1 contributions
219225 # (11|0), (0|00) without response of RI basis
220- hj , hk = int3c2e .get_int3c2e_ipvip1_hjk (intopt , rhoj0_P , rhok0_P__ , dm0_tag , omega = omega , with_k = with_k )
226+ hj , hk = int3c2e .get_int3c2e_hjk (intopt , 'ipvip1' , rhoj0_P , rhok0_P__ , dm0_tag , omega = omega , with_k = with_k )
221227 hj_ao_ao += 2.0 * hj
222228 if with_k :
223229 hk_ao_ao += hk
@@ -227,7 +233,7 @@ def _partial_hess_ejk(hessobj, mo_energy=None, mo_coeff=None, mo_occ=None,
227233 # int3c_ip1ip2 contributions
228234 # (10|1), (0|0)(0|00)
229235 if hessobj .auxbasis_response :
230- hj , hk = int3c2e .get_int3c2e_ip1ip2_hjk (intopt , rhoj0_P , rhok0_P__ , dm0_tag , omega = omega , with_k = with_k )
236+ hj , hk = int3c2e .get_int3c2e_hjk (intopt , 'ip1ip2' , rhoj0_P , rhok0_P__ , dm0_tag , omega = omega , with_k = with_k )
231237 hj_ao_aux += hj
232238 if with_k :
233239 hk_ao_aux += hk
@@ -237,7 +243,7 @@ def _partial_hess_ejk(hessobj, mo_energy=None, mo_coeff=None, mo_occ=None,
237243 # int3c_ipip2 contributions
238244 if hessobj .auxbasis_response > 1 :
239245 # (00|2), (0|0)(0|00)
240- hj , hk = int3c2e .get_int3c2e_ipip2_hjk (intopt , rhoj0_P , rhok0_P__ , dm0_tag , omega = omega , with_k = with_k )
246+ hj , hk = int3c2e .get_int3c2e_hjk (intopt , 'ipip2' , rhoj0_P , rhok0_P__ , dm0_tag , omega = omega , with_k = with_k )
241247 hj_aux_diag = hj
242248 if with_k :
243249 hk_aux_diag = .5 * hk
0 commit comments