Open vvp-nsk opened 8 months ago
I think the CCSD(T) implementation in ebcc
might already be implemented for generalisation to Lambda-CCSD(T). The energy_perturbative
function depends on the Lambda amplitudes. I think the difference between
cc = REBCC(mf, ansatz="CCSD(T)")
cc.kernel()
print(cc.energy_perturbative())
cc.solve_lambda()
print(cc.energy_perturbative())
will be the difference between CCSD(T) and Lambda-CCSD(T), but not sure.
I haven't paid much attention to CCSD(T), my implementation is not very efficient. I'll try to verify this and make Lambda-CCSD(T) it's own ansatz
keyword.
I've been spending some time improving my code generation scripts recently, so hopefully I can make CCSD(T) more efficient, and I will aim to also look at perturbative corrections to DCD and DCSD. Thanks for the suggestions!
actually, correction, I haven't actually implemented CCSD(T) lambda equations since they need an additional perturbative term, so that won't work -- I'll add it to my to-do.
Hej again!
@Lambda-CCSD(T) Thanks for your prompt reply. To test your implementation, you might use a reference data on H2O available within PSI4.
@CC3 To my personal experience, the CC3 is the most robust approach among CCSD perturbative triples correction. The CC3 does a fantastic job by absorbing an orbital relaxation (rotation) into T1. It just scales as O(N^7) at each iteration :) It is a bit surprising that CC3 implementation in EBCC requires a plenty of RAM (~500GB) even for moderate-sized problem such as 74 electrons and 211 molecular orbitals without symmetry. Indeed, PSI4 requires only ~20GB of RAM and 70GB of disk space for the same problem size.
I will be waiting for your implementation of Lambda-CCSD(T) because Lambda-BCCD(T) might be reliable as CC3 but at a lower cost. Moreover, I have not found any published results on neither Lambda-DCSD(T) nor Lambda-DCBD(T).
With best regards, Victor
I am not surprised to hear of the much worse memory requirements in ebcc
. In fact, for a 211 orbital 74 electron system I'd expect CC3 to need way more memory than that, so I assume there's a generous number of frozen orbitals in your example.
It is an unfortunate reality of the very simple way that ebcc
is built, which means that for example T3 amplitudes are stored in their complete non-symmetric form on RAM (i.e. as an (nocc, nocc, nocc, nvir, nvir, nvir)
array). Other implementations may store these in compressed formats and also load them in blocks from disk, which relaxes this memory requirement, often substantially. But these implementations are typically hand written and optimised.
I have several ideas in the pipeline on how to make the larger ansatzes such as CC3 more tractable and hopefully more comparable to implementations such as Psi4's, including alternate tensor backends and generating compiled code. Sadly, ebcc
is just a hobby for me and I develop it on my own at the moment, so I don't have significant time to work on these pretty complicated schemes. But hopefully in the future!
After doing some reading, I realise that you can actually do CC3 without ever storing T3 amplitudes. Finding a way to automatically generate code like this for both CCSD(T) and CC3 is not easy, but will keep it in mind. Maybe this is an area where I should do some handwritten code rather than trying to automatic generate everything.
Hej!
@CC3 From a practical consideration, the CC3 method is a rather limited approach. You recently introduced the FNO approach in EBCC, but it would be beneficial to combine FNO-CC2 with CC3. Indeed, the CC2 still scales as N^5 but does a way better job than MP2 whereas CC3 surpasses CCSD(T). BTW, the CC3 always requires weeks when CCSD(T) just takes several hours to compute energy.
@Lambda-CCSD(T) Generally speaking, Lambda-BCCD(T) might become as a method of choice for many problems, especially regarding 3d transition metal complexes where validity of CCSD(T) is under a question: https://doi.org/10.1021/acs.jctc.5b00081 https://doi.org/10.1021/acs.jctc.9b00674
With best regards, Victor
Thanks for the links and the notes on practicality -- I'll bear it in mind when deciding what to focus on.
Hej!
Just a thought came to mind - it might be a killer feature if you combine the CC Brueckner orbitals with CCSD(aT):
In particular, it is worth thinking about BDCD(aT) as well.
With best regards, Victor