From 9d2a6eee0b1a6c1f0c814d483f50994b937bcf13 Mon Sep 17 00:00:00 2001 From: Abdallah Ammar Date: Sun, 1 Sep 2024 15:29:33 +0200 Subject: [PATCH] udapted qsRGF2, qsRGTeh, qsRGTpp and qsRGW pour nOrb --- src/GF/qsRGF2.f90 | 20 ++++++++++++++++---- src/GT/qsRGTeh.f90 | 19 +++++++++++++++---- src/GT/qsRGTpp.f90 | 19 +++++++++++++++---- src/GW/qsRGW.f90 | 23 ++++++++++++++++++----- 4 files changed, 64 insertions(+), 17 deletions(-) diff --git a/src/GF/qsRGF2.f90 b/src/GF/qsRGF2.f90 index 651c876..4b74f64 100644 --- a/src/GF/qsRGF2.f90 +++ b/src/GF/qsRGF2.f90 @@ -188,6 +188,10 @@ subroutine qsRGF2(dotest, maxSCF, thresh, max_diis, dophBSE, doppBSE, TDA, & ! Solve the quasi-particle equation F(:,:) = Hc(:,:) + J(:,:) + 0.5d0*K(:,:) + SigCp(:,:) + if(nBas .ne. nOrb) then + call AOtoMO(nBas, nOrb, c(1,1), F(1,1), Fp(1,1)) + call MOtoAO(nBas, nOrb, S(1,1), c(1,1), Fp(1,1), F(1,1)) + endif ! Compute commutator and convergence criteria @@ -204,10 +208,18 @@ subroutine qsRGF2(dotest, maxSCF, thresh, max_diis, dophBSE, doppBSE, TDA, & ! Diagonalize Hamiltonian in AO basis - Fp = matmul(transpose(X), matmul(F, X)) - cp(:,:) = Fp(:,:) - call diagonalize_matrix(nOrb, cp, eGF) - c = matmul(X, cp) + if(nBas .eq. nOrb) then + Fp = matmul(transpose(X), matmul(F, X)) + cp(:,:) = Fp(:,:) + call diagonalize_matrix(nOrb, cp, eGF) + c = matmul(X, cp) + else + Fp = matmul(transpose(c), matmul(F, c)) + cp(:,:) = Fp(:,:) + call diagonalize_matrix(nOrb, cp, eGF) + c = matmul(c, cp) + endif + ! Compute new density matrix in the AO basis diff --git a/src/GT/qsRGTeh.f90 b/src/GT/qsRGTeh.f90 index 5f6acab..3cb9f94 100644 --- a/src/GT/qsRGTeh.f90 +++ b/src/GT/qsRGTeh.f90 @@ -221,6 +221,10 @@ subroutine qsRGTeh(dotest, maxSCF, thresh, max_diis, doACFDT, exchange_kernel, d ! Solve the quasi-particle equation F(:,:) = Hc(:,:) + J(:,:) + 0.5d0*K(:,:) + Sigp(:,:) + if(nBas .ne. nOrb) then + call AOtoMO(nBas, nOrb, c(1,1), F(1,1), Fp(1,1)) + call MOtoAO(nBas, nOrb, S(1,1), c(1,1), Fp(1,1), F(1,1)) + endif ! Compute commutator and convergence criteria @@ -237,10 +241,17 @@ subroutine qsRGTeh(dotest, maxSCF, thresh, max_diis, doACFDT, exchange_kernel, d ! Diagonalize Hamiltonian in AO basis - Fp = matmul(transpose(X),matmul(F,X)) - cp(:,:) = Fp(:,:) - call diagonalize_matrix(nOrb, cp, eGT) - c = matmul(X,cp) + if(nBas .eq. nOrb) then + Fp = matmul(transpose(X), matmul(F, X)) + cp(:,:) = Fp(:,:) + call diagonalize_matrix(nOrb, cp, eGT) + c = matmul(X, cp) + else + Fp = matmul(transpose(c), matmul(F, c)) + cp(:,:) = Fp(:,:) + call diagonalize_matrix(nOrb, cp, eGT) + c = matmul(c, cp) + endif ! Compute new density matrix in the AO basis diff --git a/src/GT/qsRGTpp.f90 b/src/GT/qsRGTpp.f90 index 15a29dc..43c861d 100644 --- a/src/GT/qsRGTpp.f90 +++ b/src/GT/qsRGTpp.f90 @@ -258,6 +258,10 @@ subroutine qsRGTpp(dotest, maxSCF, thresh, max_diis, doACFDT, exchange_kernel, d ! Solve the quasi-particle equation F(:,:) = Hc(:,:) + J(:,:) + 0.5d0*K(:,:) + Sigp(:,:) + if(nBas .ne. nOrb) then + call AOtoMO(nBas, nOrb, c(1,1), F(1,1), Fp(1,1)) + call MOtoAO(nBas, nOrb, S(1,1), c(1,1), Fp(1,1), F(1,1)) + endif ! Compute commutator and convergence criteria @@ -274,10 +278,17 @@ subroutine qsRGTpp(dotest, maxSCF, thresh, max_diis, doACFDT, exchange_kernel, d ! Diagonalize Hamiltonian in AO basis - Fp = matmul(transpose(X), matmul(F, X)) - cp(:,:) = Fp(:,:) - call diagonalize_matrix(nOrb, cp, eGT) - c = matmul(X, cp) + if(nBas .eq. nOrb) then + Fp = matmul(transpose(X), matmul(F, X)) + cp(:,:) = Fp(:,:) + call diagonalize_matrix(nOrb, cp, eGT) + c = matmul(X, cp) + else + Fp = matmul(transpose(c), matmul(F, c)) + cp(:,:) = Fp(:,:) + call diagonalize_matrix(nOrb, cp, eGT) + c = matmul(c, cp) + endif ! Compute new density matrix in the AO basis diff --git a/src/GW/qsRGW.f90 b/src/GW/qsRGW.f90 index 1756a0b..7f61e0c 100644 --- a/src/GW/qsRGW.f90 +++ b/src/GW/qsRGW.f90 @@ -221,10 +221,14 @@ subroutine qsRGW(dotest, maxSCF, thresh, max_diis, doACFDT, exchange_kernel, doX ! Solve the quasi-particle equation F(:,:) = Hc(:,:) + J(:,:) + 0.5d0*K(:,:) + SigCp(:,:) + if(nBas .ne. nOrb) then + call AOtoMO(nBas, nOrb, c(1,1), F(1,1), Fp(1,1)) + call MOtoAO(nBas, nOrb, S(1,1), c(1,1), Fp(1,1), F(1,1)) + endif ! Compute commutator and convergence criteria - err = matmul(F,matmul(P,S)) - matmul(matmul(S,P),F) + err = matmul(F, matmul(P, S)) - matmul(matmul(S, P), F) if(nSCF > 1) Conv = maxval(abs(err)) @@ -259,10 +263,19 @@ subroutine qsRGW(dotest, maxSCF, thresh, max_diis, doACFDT, exchange_kernel, doX ! Diagonalize Hamiltonian in AO basis - Fp = matmul(transpose(X), matmul(F, X)) - cp(:,:) = Fp(:,:) - call diagonalize_matrix(nOrb, cp, eGW) - c = matmul(X, cp) + if(nBas .eq. nOrb) then + Fp = matmul(transpose(X), matmul(F, X)) + cp(:,:) = Fp(:,:) + call diagonalize_matrix(nOrb, cp, eGW) + c = matmul(X, cp) + else + Fp = matmul(transpose(c), matmul(F, c)) + cp(:,:) = Fp(:,:) + call diagonalize_matrix(nOrb, cp, eGW) + c = matmul(c, cp) + endif + + call AOtoMO(nBas, nOrb, c, SigCp, SigC) ! Density matrix