Skip to content

Commit beb082d

Browse files
committed
adc3 gradients working
1 parent 8fb8d69 commit beb082d

File tree

4 files changed

+548
-525
lines changed

4 files changed

+548
-525
lines changed

adcc/gradients/amplitude_response.py

Lines changed: 65 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def tbar_TD_oovv_adc3(exci, g1a_adc0):
8787
).antisymmetrise(0, 1).antisymmetrise(2, 3)
8888
ret += 2.0 * (
8989
- 1.0 * einsum("ijcd,cdab->ijab", tbarD, hf.vvvv)
90-
- 1.0 * einsum("klab,klij->ijab", tbarD, hf.oooo)
90+
- 1.0 * einsum("klab,ijkl->ijab", tbarD, hf.oooo)
9191
)
9292
return ret
9393

@@ -132,7 +132,9 @@ def t2bar_oovv_adc3(exci, g1a_adc0, g2a_adc1):
132132

133133
ttilde1 = (
134134
- 1.0 * einsum("klab,ijkm,lm->ijab", t2, hf.oooo, g1a_adc0.oo)
135-
- 1.0 * 2.0 * einsum("ka,ijkl,lb->ijab", u.ph, hf.oooo, rx).antisymmetrise(2, 3)
135+
- 1.0 * 2.0 * einsum(
136+
"ka,ijkl,lb->ijab", u.ph, hf.oooo, rx
137+
).antisymmetrise(2, 3)
136138
+ 1.0 * 2.0 * (
137139
+ 0.5 * einsum("ik,jklm,lmab->ijab", g1a_adc0.oo, hf.oooo, t2)
138140
- 2.0 * einsum("jkab,lm,ilkm->ijab", t2, g1a_adc0.oo, hf.oooo)
@@ -146,60 +148,74 @@ def t2bar_oovv_adc3(exci, g1a_adc0, g2a_adc1):
146148

147149
ttilde2 = 4.0 * (
148150
- 1.0 * einsum("ijkc,lc,klab->ijab", hf.ooov, u.ph, u.pphh)
149-
+ 1.0 * 2.0 * einsum("ikab,jlkc,lc->ijab", u.pphh, hf.ooov, u.ph).antisymmetrise(0, 1)
150-
- 1.0 * 4.0 * einsum("jklb,kc,ilac->ijab", hf.ooov, u.ph, u.pphh).antisymmetrise(0, 1).antisymmetrise(2, 3)
151+
+ 1.0 * 2.0 * einsum(
152+
"ikab,jlkc,lc->ijab", u.pphh, hf.ooov, u.ph
153+
).antisymmetrise(0, 1)
154+
- 1.0 * 4.0 * einsum(
155+
"jklb,kc,ilac->ijab", hf.ooov, u.ph, u.pphh
156+
).antisymmetrise(0, 1).antisymmetrise(2, 3)
151157
)
152158
ttilde2.evaluate()
153159

154160
ttilde3 = (
155-
+ 1.0 * 2.0 * einsum("ijbc,ac->ijab", hf.oovv, g1a_adc0.vv).antisymmetrise(2, 3)
156-
- 1.0 * 2.0 * einsum("jkab,ik->ijab", hf.oovv, g1a_adc0.oo).antisymmetrise(0, 1)
157-
+ 1.0 * 4.0 * einsum("ia,jkbc,kc->ijab", u.ph, hf.oovv, u.ph).antisymmetrise(0, 1).antisymmetrise(2, 3)
161+
+ 1.0 * 2.0 * einsum(
162+
"ijbc,ac->ijab", hf.oovv, g1a_adc0.vv
163+
).antisymmetrise(2, 3)
164+
- 1.0 * 2.0 * einsum(
165+
"jkab,ik->ijab", hf.oovv, g1a_adc0.oo
166+
).antisymmetrise(0, 1)
167+
+ 1.0 * 4.0 * einsum(
168+
"ia,jkbc,kc->ijab", u.ph, hf.oovv, u.ph
169+
).antisymmetrise(0, 1).antisymmetrise(2, 3)
158170
)
159171
ttilde3.evaluate()
160172

161173
# TODO: intermediate x_ka <ic||kd>?
162174
# TODO: intermediate x_lc t_jlbd?
163175
ttilde4 = (
164176
+ 1.0 * 2.0 * (
165-
- 2.0 * einsum("jkab,ickd,cd->ijab", t2, hf.ovov, g1a_adc0.vv) #1 ok
166-
# - 2.0 * einsum("klab,ickd,jcld->ijab", t2, g2a_adc1.ovov, hf.ovov)
167-
- 2.0 * einsum("ic,kd,jcld,klab->ijab", u.ph, u.ph, hf.ovov, t2) #18 anners
168-
+ 1.0 * einsum("ic,jkab,ld,lckd->ijab", u.ph, t2, u.ph, hf.ovov) #13 ok
169-
+ 1.0 * einsum("jkab,kc,ld,lcid->ijab", t2, u.ph, u.ph, hf.ovov) #14 ok
177+
- 2.0 * einsum("jkab,ickd,cd->ijab", t2, hf.ovov, g1a_adc0.vv)
178+
- 2.0 * einsum("ic,kd,jcld,klab->ijab", u.ph, u.ph, hf.ovov, t2)
179+
+ 1.0 * einsum("ic,jkab,ld,lckd->ijab", u.ph, t2, u.ph, hf.ovov)
180+
+ 1.0 * einsum("jkab,kc,ld,lcid->ijab", t2, u.ph, u.ph, hf.ovov)
170181
).antisymmetrise(0, 1)
171182
+ 1.0 * 2.0 * (
172-
- 2.0 * einsum("ijcb,kalc,kl->ijab", t2, hf.ovov, g1a_adc0.oo) #2 ok
173-
# - 2.0 * einsum("ijcd,kalc,kbld->ijab", t2, g2a_adc1.ovov, hf.ovov)
174-
- 2.0 * einsum("ka,lc,kbld,ijcd->ijab", u.ph, u.ph, hf.ovov, t2) # 17 anners
175-
+ 1.0 * einsum("ka,ijbc,ld,kdlc->ijab", u.ph, t2, u.ph, hf.ovov) #11 ok
176-
+ 1.0 * einsum("ijbc,kc,ld,kdla->ijab", t2, u.ph, u.ph, hf.ovov) #12 ok
183+
- 2.0 * einsum("ijcb,kalc,kl->ijab", t2, hf.ovov, g1a_adc0.oo)
184+
- 2.0 * einsum("ka,lc,kbld,ijcd->ijab", u.ph, u.ph, hf.ovov, t2)
185+
+ 1.0 * einsum("ka,ijbc,ld,kdlc->ijab", u.ph, t2, u.ph, hf.ovov)
186+
+ 1.0 * einsum("ijbc,kc,ld,kdla->ijab", t2, u.ph, u.ph, hf.ovov)
177187
).antisymmetrise(2, 3)
178188
+ 1.0 * 4.0 * (
179-
+ 1.0 * einsum("ac,jdkc,ikbd->ijab", g1a_adc0.vv, hf.ovov, t2) #3 ok
180-
- 1.0 * einsum("jckb,ikad,cd->ijab", hf.ovov, t2, g1a_adc0.vv) #4 ok
181-
- 1.0 * einsum("ik,kclb,jlac->ijab", g1a_adc0.oo, hf.ovov, t2) #5 ok
182-
+ 1.0 * einsum("jckb,ilac,lk->ijab", hf.ovov, t2, g1a_adc0.oo) #6 ok
183-
- 1.0 * einsum("ic,jckb,ka->ijab", u.ph, hf.ovov, rx) #7 ok
184-
- 1.0 * einsum("jb,kc,lcid,klad->ijab", u.ph, u.ph, hf.ovov, t2) #8 ok
185-
- 1.0 * einsum("ka,jckb,ic->ijab", u.ph, hf.ovov, rx) #9 ok
186-
- 1.0 * einsum("jb,kc,lakd,ilcd->ijab", u.ph, u.ph, hf.ovov, t2) #10 ok
187-
+ 2.0 * einsum("ka,ickd,ld,jlbc->ijab", u.ph, hf.ovov, u.ph, t2) #15 ok
188-
+ 2.0 * einsum("ic,kcla,kd,jlbd->ijab", u.ph, hf.ovov, u.ph, t2) #15 ok
189+
+ 1.0 * einsum("ac,jdkc,ikbd->ijab", g1a_adc0.vv, hf.ovov, t2)
190+
- 1.0 * einsum("jckb,ikad,cd->ijab", hf.ovov, t2, g1a_adc0.vv)
191+
- 1.0 * einsum("ik,kclb,jlac->ijab", g1a_adc0.oo, hf.ovov, t2)
192+
+ 1.0 * einsum("jckb,ilac,lk->ijab", hf.ovov, t2, g1a_adc0.oo)
193+
- 1.0 * einsum("ic,jckb,ka->ijab", u.ph, hf.ovov, rx)
194+
- 1.0 * einsum("jb,kc,lcid,klad->ijab", u.ph, u.ph, hf.ovov, t2)
195+
- 1.0 * einsum("ka,jckb,ic->ijab", u.ph, hf.ovov, rx)
196+
- 1.0 * einsum("jb,kc,lakd,ilcd->ijab", u.ph, u.ph, hf.ovov, t2)
197+
+ 2.0 * einsum("ka,ickd,ld,jlbc->ijab", u.ph, hf.ovov, u.ph, t2)
198+
+ 2.0 * einsum("ic,kcla,kd,jlbd->ijab", u.ph, hf.ovov, u.ph, t2)
189199
).antisymmetrise(0, 1).antisymmetrise(2, 3)
190200
)
191201
ttilde4.evaluate()
192202

193203
ttilde5 = - 4.0 * (
194204
+ 1.0 * einsum("kcab,kd,ijcd->ijab", hf.ovvv, u.ph, u.pphh)
195-
+ 1.0 * 2.0 * einsum("ijbc,kcad,kd->ijab", u.pphh, hf.ovvv, u.ph).antisymmetrise(2, 3)
196-
+ 1.0 * 4.0 * einsum("jcbd,kd,ikac->ijab", hf.ovvv, u.ph, u.pphh).antisymmetrise(0, 1).antisymmetrise(2, 3)
205+
+ 1.0 * 2.0 * einsum(
206+
"ijbc,kcad,kd->ijab", u.pphh, hf.ovvv, u.ph
207+
).antisymmetrise(2, 3)
208+
+ 1.0 * 4.0 * einsum(
209+
"jcbd,kd,ikac->ijab", hf.ovvv, u.ph, u.pphh
210+
).antisymmetrise(0, 1).antisymmetrise(2, 3)
197211
)
198212
ttilde5.evaluate()
199213

200214
ttilde6 = (
201215
- 1.0 * einsum("ijcd,abde,ce->ijab", t2, hf.vvvv, g1a_adc0.vv)
202-
- 1.0 * 2.0 * einsum("ic,abcd,jkde,ke->ijab", u.ph, hf.vvvv, t2, u.ph).antisymmetrise(0, 1)
216+
- 1.0 * 2.0 * einsum(
217+
"ic,abcd,jkde,ke->ijab", u.ph, hf.vvvv, t2, u.ph
218+
).antisymmetrise(0, 1)
203219
- 1.0 * 2.0 * (
204220
+ 0.5 * einsum("ac,bcde,ijde->ijab", g1a_adc0.vv, hf.vvvv, t2)
205221
- 2.0 * einsum("ijbc,de,adce->ijab", t2, g1a_adc0.vv, hf.vvvv)
@@ -210,11 +226,11 @@ def t2bar_oovv_adc3(exci, g1a_adc0, g2a_adc1):
210226
).antisymmetrise(0, 1).antisymmetrise(2, 3)
211227
)
212228
ttilde6.evaluate()
213-
# TODO: prefactors etc maybe wrong...
229+
214230
ret = 0.5 * (
215231
hf.oovv
216232
+ ttilde1 + ttilde2 + ttilde3 + ttilde4 + ttilde5 + ttilde6
217-
+ tbar_TD + tbar_rho
233+
+ tbar_TD + tbar_rho
218234
) / (2.0 * direct_sum("ia+jb->ijab", df_ia, df_ia).symmetrise(0, 1))
219235
return ret
220236

@@ -285,8 +301,8 @@ def ampl_relaxed_dms_adc2(exci):
285301
g2a.oovv = (
286302
0.5 * (
287303
- 1.0 * t2
288-
+ 2.0 * einsum("ijcb,ca->ijab", t2, g1a_adc1.vv).antisymmetrise((2, 3))
289-
- 2.0 * einsum("kjab,ki->ijab", t2, g1a_adc1.oo).antisymmetrise((0, 1))
304+
+ 2.0 * einsum("ijcb,ca->ijab", t2, g1a_adc1.vv).antisymmetrise(2, 3)
305+
- 2.0 * einsum("kjab,ki->ijab", t2, g1a_adc1.oo).antisymmetrise(0, 1)
290306
- 4.0 * einsum(
291307
"ia,jb->ijab", u.ph, ru_ov
292308
).antisymmetrise((0, 1)).antisymmetrise((2, 3))
@@ -321,9 +337,7 @@ def ampl_relaxed_dms_adc3(exci):
321337
tD = mp.td2(b.oovv)
322338
rho = mp.mp2_diffdm
323339

324-
print("bar", 0.25 * t2bar.dot(hf.oovv))
325-
326-
# Table IX (10.1063/1.5085117)
340+
# Table IX (10.1063/1.5085117)
327341
g1a = g1a_adc1.copy()
328342
g1a.oo += (
329343
- 2.0 * einsum("jkab,ikab->ij", u.pphh, u.pphh)
@@ -335,7 +349,7 @@ def ampl_relaxed_dms_adc3(exci):
335349
)
336350
g1a.vv += (
337351
+ 2.0 * einsum("ijac,ijbc->ab", u.pphh, u.pphh)
338-
+ 1.0 * 2.0 *(
352+
+ 1.0 * 2.0 * (
339353
+ 1.0 * einsum("ijac,ijbc->ab", t2bar, t2)
340354
+ 1.0 * einsum("ijac,ijbc->ab", tbarD, tD)
341355
+ 0.5 * einsum("ia,ib->ab", rho_bar, rho.ov)
@@ -352,13 +366,17 @@ def ampl_relaxed_dms_adc3(exci):
352366
+ 2.0 * einsum("ijab,klab->ijkl", u.pphh, u.pphh)
353367
+ 0.5 * 2.0 * (
354368
+ 2.0 * einsum("ijab,klab->ijkl", tbarD, t2)
355-
+ 0.5 * 2.0 * einsum("jm,imkl->ijkl", g1a_adc1.oo, tsq_oooo).antisymmetrise(0, 1)
356-
+ 1.0 * 2.0 * einsum("kc,ijbc,ma,lmab->ijkl", u.ph, t2, u.ph, t2).antisymmetrise(2, 3)
369+
+ 0.5 * 2.0 * einsum(
370+
"jm,imab,klab->ijkl", g1a_adc1.oo, t2, t2
371+
).antisymmetrise(0, 1)
372+
+ 1.0 * 2.0 * einsum(
373+
"kc,ijbc,ma,lmab->ijkl", u.ph, t2, u.ph, t2
374+
).antisymmetrise(2, 3)
357375
+ 1.0 * 4.0 * (
358376
+ 1.0 * einsum("ik,jl->ijkl", rho.oo, g1a_adc1.oo)
359377
- 1.0 * einsum("lajb,ia,kb->ijkl", tsq_ovov, u.ph, u.ph)
360378
).antisymmetrise(0, 1).antisymmetrise(2, 3)
361-
).symmetrise([(0, 1), (2, 3)])
379+
).symmetrise([(0, 2), (1, 3)])
362380
)
363381
g2a.ooov = (
364382
- 2.0 * einsum("kb,ijab->ijka", u.ph, u.pphh)
@@ -380,7 +398,8 @@ def ampl_relaxed_dms_adc3(exci):
380398
+ 1.0 * einsum("jkab,ik->ijab", tD + t2, g1a_adc1.oo)
381399
).antisymmetrise(0, 1)
382400
- 1.0 * 4.0 * (
383-
+ 1.0 * einsum("ia,jb->ijab", u.ph, einsum("jkbc,kc->jb", tD, u.ph) + rx)
401+
+ 1.0 * einsum("ia,jb->ijab", u.ph,
402+
einsum("jkbc,kc->jb", tD, u.ph) + rx)
384403
).antisymmetrise(0, 1).antisymmetrise(2, 3)
385404
)
386405
g2a.ovov = (
@@ -399,7 +418,7 @@ def ampl_relaxed_dms_adc3(exci):
399418
- 2.0 * einsum("jckb,ic,ka->iajb", tsq_ovov, u.ph, u.ph)
400419
+ 0.5 * einsum("acbd,ic,jd->iajb", tsq_vvvv, u.ph, u.ph)
401420
+ 0.5 * einsum("ikjl,ka,lb->iajb", tsq_oooo, u.ph, u.ph)
402-
).symmetrise([(0, 2), (1, 3)]) # TODO: symmetrise correct?
421+
).symmetrise([(0, 2), (1, 3)])
403422
)
404423
g2a.ovvv = (
405424
- 2.0 * einsum("ja,ijbc->iabc", u.ph, u.pphh)
@@ -420,15 +439,15 @@ def ampl_relaxed_dms_adc3(exci):
420439
- 1.0 * einsum("be,aecd->abcd", g1a_adc1.vv, tsq_vvvv)
421440
).antisymmetrise(0, 1)
422441
+ 1.0 * 2.0 * (
423-
+ 1.0 * einsum("ia,ijcd,jkbe,ke->abcd", u.ph, t2, t2, u.ph) # TODO: not sure...
442+
+ 1.0 * einsum("ia,ijcd,jkbe,ke->abcd", u.ph, t2, t2, u.ph)
424443
).antisymmetrise(0, 1)
425444
+ 1.0 * 4.0 * (
426445
+ 1.0 * einsum("bd,ac->abcd", rho.vv, g1a_adc1.vv)
427446
- 1.0 * einsum("idjb,ia,jc->abcd", tsq_ovov, u.ph, u.ph)
428447
).antisymmetrise(0, 1).antisymmetrise(2, 3)
429-
).symmetrise([(0, 1), (2, 3)])
448+
).symmetrise([(0, 2), (1, 3)])
430449
)
431-
return g1a, g2a
450+
return g1a, g2a
432451

433452

434453
### CVS ###

adcc/gradients/test_functionality_gradients.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,13 @@ def template_nuclear_gradient(self, molecule, basis, method, backend):
7171
# check energy computed with unrelaxed densities
7272
gs_corr = 0.0
7373
if ee.method.level > 0:
74-
gs_corr = ee.ground_state.energy_correction(ee.method.level)
74+
# compute the ground state contribution
75+
# to the correlation energy
76+
gs_energy = ee.ground_state.energy(ee.method.level)
77+
gs_corr = gs_energy - ee.reference_state.energy_scf
7578
assert_allclose(
7679
gs_corr + ee.excitation_energy,
77-
grad._energy, atol=1e-8
80+
grad._energy, atol=1e-10
7881
)
7982
assert_allclose(
8083
grad_fdiff[ee.index], grad.total, atol=1e-7,

adcc/testdata/dump_fdiff_gradient.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,11 @@ def main():
133133
"adc1",
134134
"adc2",
135135
"adc2x",
136+
"adc3",
136137
"cvs-adc0",
137138
"cvs-adc1",
138139
"cvs-adc2",
139-
"cvs-adc2x", # TODO: broken
140+
# "cvs-adc2x", # TODO: broken
140141
]
141142
molnames = [
142143
"h2o",

0 commit comments

Comments
 (0)