qp2/src/ccsd/ccsd_spin_orb_sub.irp.f

2306 lines
59 KiB
Fortran

! Code
subroutine run_ccsd_spin_orb
implicit none
BEGIN_DOC
! CCSD in spin orbitals
END_DOC
double precision, allocatable :: t1(:,:), t2(:,:,:,:), tau(:,:,:,:), tau_t(:,:,:,:)
double precision, allocatable :: r1(:,:), r2(:,:,:,:)
double precision, allocatable :: cF_oo(:,:), cF_ov(:,:), cF_vv(:,:)
double precision, allocatable :: cW_oooo(:,:,:,:), cW_ovvo(:,:,:,:), cW_vvvv(:,:,:,:)
double precision, allocatable :: f_oo(:,:), f_ov(:,:), f_vv(:,:), f_o(:), f_v(:)
double precision, allocatable :: v_oooo(:,:,:,:), v_vooo(:,:,:,:), v_ovoo(:,:,:,:)
double precision, allocatable :: v_oovo(:,:,:,:), v_ooov(:,:,:,:), v_vvoo(:,:,:,:)
double precision, allocatable :: v_vovo(:,:,:,:), v_voov(:,:,:,:), v_ovvo(:,:,:,:)
double precision, allocatable :: v_ovov(:,:,:,:), v_oovv(:,:,:,:), v_vvvo(:,:,:,:)
double precision, allocatable :: v_vvov(:,:,:,:), v_vovv(:,:,:,:), v_ovvv(:,:,:,:)
double precision, allocatable :: v_vvvv(:,:,:,:)
double precision, allocatable :: all_err(:,:), all_t(:,:)
logical :: not_converged
integer, allocatable :: list_occ(:,:), list_vir(:,:)
integer :: nO,nV,nOa,nOb,nVa,nVb,nO_m,nV_m,nO_S(2),nV_S(2),n_spin(4)
integer :: nb_iter, i,j,a,b
double precision :: uncorr_energy, energy, max_r, max_r1, max_r2, cc, ta, tb,ti,tf,tbi,tfi
integer(bit_kind) :: det(N_int,2)
det = psi_det(:,:,cc_ref)
print*,'Reference determinant:'
call print_det(det,N_int)
! Extract number of occ/vir alpha/beta spin orbitals
!call extract_n_spin(det,n_spin)
nOa = cc_nOa !n_spin(1)
nOb = cc_nOb !n_spin(2)
nVa = cc_nVa !n_spin(3)
nVb = cc_nVb !n_spin(4)
! Total number of occ/vir spin orb
nO = cc_nOab !nOa + nOb
nV = cc_nVab !nVa + nVb
! Debug
!print*,nO,nV
! Number of occ/vir spin orb per spin
nO_S = cc_nO_S !(/nOa,nOb/)
nV_S = cc_nV_S !(/nVa,nVb/)
! Debug
!print*,nO_S,nV_S
! Maximal number of occ/vir
nO_m = cc_nO_m !max(nOa, nOb)
nV_m = cc_nV_m !max(nVa, nVb)
! Debug
!print*,nO_m,nV_m
allocate(list_occ(nO_m,2), list_vir(nV_m,2))
list_occ = cc_list_occ_spin
list_vir = cc_list_vir_spin
! Debug
!call extract_list_orb_spin(det,nO_m,nV_m,list_occ,list_vir)
!print*,list_occ(:,1)
!print*,list_occ(:,2)
!print*,list_vir(:,1)
!print*,list_vir(:,2)
! Allocation
allocate(t1(nO,nV), t2(nO,nO,nV,nV), tau(nO,nO,nV,nV), tau_t(nO,nO,nV,nV))
allocate(r1(nO,nV), r2(nO,nO,nV,nV))
allocate(cF_oo(nO,nO), cF_ov(nO,nV), cF_vv(nV,nV))
allocate(cW_oooo(nO,nO,nO,nO), cW_ovvo(nO,nV,nV,nO))!, cW_vvvv(nV,nV,nV,nV))
allocate(v_oooo(nO,nO,nO,nO))
!allocate(v_vooo(nV,nO,nO,nO))
allocate(v_ovoo(nO,nV,nO,nO))
allocate(v_oovo(nO,nO,nV,nO))
allocate(v_ooov(nO,nO,nO,nV))
allocate(v_vvoo(nV,nV,nO,nO))
!allocate(v_vovo(nV,nO,nV,nO))
!allocate(v_voov(nV,nO,nO,nV))
allocate(v_ovvo(nO,nV,nV,nO))
allocate(v_ovov(nO,nV,nO,nV))
allocate(v_oovv(nO,nO,nV,nV))
!allocate(v_vvvo(nV,nV,nV,nO))
!allocate(v_vvov(nV,nV,nO,nV))
!allocate(v_vovv(nV,nO,nV,nV))
!allocate(v_ovvv(nO,nV,nV,nV))
!allocate(v_vvvv(nV,nV,nV,nV))
allocate(f_o(nO), f_v(nV))
allocate(f_oo(nO, nO))
allocate(f_ov(nO, nV))
allocate(f_vv(nV, nV))
! Allocation for the diis
if (cc_update_method == 'diis') then
allocate(all_err(nO*nV+nO*nO*nV*nV,cc_diis_depth), all_t(nO*nV+nO*nO*nV*nV,cc_diis_depth))
all_err = 0d0
all_t = 0d0
endif
! Fock elements
call gen_f_spin(det, nO_m,nO_m, nO_S,nO_S, list_occ,list_occ, nO,nO, f_oo)
call gen_f_spin(det, nO_m,nV_m, nO_S,nV_S, list_occ,list_vir, nO,nV, f_ov)
call gen_f_spin(det, nV_m,nV_m, nV_S,nV_S, list_vir,list_vir, nV,nV, f_vv)
! Diag elements
do i = 1, nO
f_o(i) = f_oo(i,i)
enddo
do i = 1, nV
f_v(i) = f_vv(i,i)
enddo
! Bi electronic integrals from list
call wall_time(ti)
! OOOO
call gen_v_spin(nO_m,nO_m,nO_m,nO_m, nO_S,nO_S,nO_S,nO_S, list_occ,list_occ,list_occ,list_occ, nO,nO,nO,nO, v_oooo)
! OOO V
!call gen_v_spin(nV_m,nO_m,nO_m,nO_m, nV_S,nO_S,nO_S,nO_S, list_vir,list_occ,list_occ,list_occ, nV,nO,nO,nO, v_vooo)
call gen_v_spin(nO_m,nV_m,nO_m,nO_m, nO_S,nV_S,nO_S,nO_S, list_occ,list_vir,list_occ,list_occ, nO,nV,nO,nO, v_ovoo)
call gen_v_spin(nO_m,nO_m,nV_m,nO_m, nO_S,nO_S,nV_S,nO_S, list_occ,list_occ,list_vir,list_occ, nO,nO,nV,nO, v_oovo)
call gen_v_spin(nO_m,nO_m,nO_m,nV_m, nO_S,nO_S,nO_S,nV_S, list_occ,list_occ,list_occ,list_vir, nO,nO,nO,nV, v_ooov)
! OO VV
call gen_v_spin(nV_m,nV_m,nO_m,nO_m, nV_S,nV_S,nO_S,nO_S, list_vir,list_vir,list_occ,list_occ, nV,nV,nO,nO, v_vvoo)
!call gen_v_spin(nV_m,nO_m,nV_m,nO_m, nV_S,nO_S,nV_S,nO_S, list_vir,list_occ,list_vir,list_occ, nV,nO,nV,nO, v_vovo)
!call gen_v_spin(nV_m,nO_m,nO_m,nV_m, nV_S,nO_S,nO_S,nV_S, list_vir,list_occ,list_occ,list_vir, nV,nO,nO,nV, v_voov)
call gen_v_spin(nO_m,nV_m,nV_m,nO_m, nO_S,nV_S,nV_S,nO_S, list_occ,list_vir,list_vir,list_occ, nO,nV,nV,nO, v_ovvo)
call gen_v_spin(nO_m,nV_m,nO_m,nV_m, nO_S,nV_S,nO_S,nV_S, list_occ,list_vir,list_occ,list_vir, nO,nV,nO,nV, v_ovov)
call gen_v_spin(nO_m,nO_m,nV_m,nV_m, nO_S,nO_S,nV_S,nV_S, list_occ,list_occ,list_vir,list_vir, nO,nO,nV,nV, v_oovv)
! O VVV
!call gen_v_spin(nV_m,nV_m,nV_m,nO_m, nV_S,nV_S,nV_S,nO_S, list_vir,list_vir,list_vir,list_occ, nV,nV,nV,nO, v_vvvo)
!call gen_v_spin(nV_m,nV_m,nO_m,nV_m, nV_S,nV_S,nO_S,nV_S, list_vir,list_vir,list_occ,list_vir, nV,nV,nO,nV, v_vvov)
!call gen_v_spin(nV_m,nO_m,nV_m,nV_m, nV_S,nO_S,nV_S,nV_S, list_vir,list_occ,list_vir,list_vir, nV,nO,nV,nV, v_vovv)
!call gen_v_spin(nO_m,nV_m,nV_m,nV_m, nO_S,nV_S,nV_S,nV_S, list_occ,list_vir,list_vir,list_vir, nO,nV,nV,nV, v_ovvv)
! VVVV
!call gen_v_spin(nV_m,nV_m,nV_m,nV_m, nV_S,nV_S,nV_S,nV_S, list_vir,list_vir,list_vir,list_vir, nV,nV,nV,nV, v_vvvv)
call wall_time(tf)
if (cc_dev) then
print*,'Load bi elec int:',tf-ti,'s'
endif
! Init of T
t1 = 0d0
call guess_t1(nO,nV,f_o,f_v,f_ov,t1)
call guess_t2(nO,nV,f_o,f_v,v_oovv,t2)
call compute_tau_spin(nO,nV,t1,t2,tau)
call compute_tau_t_spin(nO,nV,t1,t2,tau_t)
! Loop init
nb_iter = 0
not_converged = .True.
r1 = 0d0
r2 = 0d0
max_r1 = 0d0
max_r2 = 0d0
call det_energy(det,uncorr_energy)
print*,'Det energy', uncorr_energy
call ccsd_energy_spin(nO,nV,t1,t2,F_ov,v_oovv,energy)
print*,'guess energy', uncorr_energy+energy, energy
write(*,'(A77)') ' -----------------------------------------------------------------------------'
write(*,'(A77)') ' | It. | E(CCSD) (Ha) | Correlation (Ha) | Conv. T1 | Conv. T2 |'
write(*,'(A77)') ' -----------------------------------------------------------------------------'
call wall_time(ta)
! Loop
do while (not_converged)
! Intermediates
call wall_time(tbi)
call wall_time(ti)
call compute_cF_oo(nO,nV,t1,tau_t,F_oo,F_ov,v_ooov,v_oovv,cF_oo)
call compute_cF_ov(nO,nV,t1,F_ov,v_oovv,cF_ov)
call compute_cF_vv(nO,nV,t1,tau_t,F_ov,F_vv,v_oovv,cF_vv)
call wall_time(tf)
if (cc_dev) then
print*,'Compute cFs:',tf-ti,'s'
endif
call wall_time(ti)
call compute_cW_oooo(nO,nV,t1,t2,tau,v_oooo,v_ooov,v_oovv,cW_oooo)
call compute_cW_ovvo(nO,nV,t1,t2,tau,v_ovvo,v_oovo,v_oovv,cW_ovvo)
!call compute_cW_vvvv(nO,nV,t1,t2,tau,v_vvvv,v_vovv,v_oovv,cW_vvvv)
call wall_time(tf)
if (cc_dev) then
print*,'Compute cFs:',tf-ti,'s'
endif
! Residuals
call wall_time(ti)
call compute_r1_spin(nO,nV,t1,t2,f_o,f_v,F_ov,cF_oo,cF_ov,cF_vv,v_oovo,v_ovov,r1)
call wall_time(tf)
if (cc_dev) then
print*,'Compute r1:',tf-ti,'s'
endif
call wall_time(ti)
call compute_r2_spin(nO,nV,t1,t2,tau,f_o,f_v,cF_oo,cF_ov,cF_vv,cW_oooo,cW_ovvo,v_ovoo,v_oovv,v_ovvo,r2)
call wall_time(tf)
if (cc_dev) then
print*,'Compute r2:',tf-ti,'s'
endif
! Max elements in the residuals
max_r1 = maxval(abs(r1(:,:)))
max_r2 = maxval(abs(r2(:,:,:,:)))
max_r = max(max_r1,max_r2)
call wall_time(ti)
! Update
if (cc_update_method == 'diis') then
!call update_t_ccsd(nO,nV,nb_iter,f_o,f_v,r1,r2,t1,t2,all_err1,all_err2,all_t1,all_t2)
!call update_t_ccsd_diis(nO,nV,nb_iter,f_o,f_v,r1,r2,t1,t2,all_err1,all_err2,all_t1,all_t2)
call update_t_ccsd_diis_v3(nO,nV,nb_iter,f_o,f_v,r1,r2,t1,t2,all_err,all_t)
! Standard update as T = T - Delta
elseif (cc_update_method == 'none') then
call update_t1(nO,nV,f_o,f_v,r1,t1)
call update_t2(nO,nV,f_o,f_v,r2,t2)
else
print*,'Unkonw cc_method_method: '//cc_update_method
endif
call compute_tau_spin(nO,nV,t1,t2,tau)
call compute_tau_t_spin(nO,nV,t1,t2,tau_t)
call wall_time(tf)
if (cc_dev) then
print*,'Update:',tf-ti,'s'
endif
! Print
call ccsd_energy_spin(nO,nV,t1,t2,F_ov,v_oovv,energy)
call wall_time(tfi)
write(*,'(A3,I6,A3,F18.12,A3,F16.12,A3,ES10.2,A3,ES10.2,A2)') ' | ',nb_iter,' | ', &
uncorr_energy+energy,' | ', energy,' | ', max_r1,' | ', max_r2,' |'
if (cc_dev) then
print*,'Total:',tfi-tbi,'s'
endif
! Convergence
nb_iter = nb_iter + 1
if (max_r < cc_thresh_conv .or. nb_iter > cc_max_iter) then
not_converged = .False.
endif
enddo
write(*,'(A77)') ' -----------------------------------------------------------------------------'
call wall_time(tb)
print*,'Time: ',tb-ta, ' s'
print*,''
if (max_r < cc_thresh_conv) then
write(*,'(A30,I6,A11)') ' Successful convergence after ', nb_iter, ' iterations'
else
write(*,'(A26,I6,A11)') ' Failed convergence after ', nb_iter, ' iterations'
endif
print*,''
write(*,'(A15,F18.12,A3)') ' E(CCSD) = ', uncorr_energy+energy, ' Ha'
write(*,'(A15,F18.12,A3)') ' Correlation = ', energy, ' Ha'
write(*,'(A15,ES10.2,A3)')' Conv = ', max_r
print*,''
if (write_amplitudes) then
call write_t1(nO,nV,t1)
call write_t2(nO,nV,t2)
call ezfio_set_utils_cc_io_amplitudes('Read')
endif
! Deallocate
if (cc_update_method == 'diis') then
deallocate(all_err,all_t)
endif
deallocate(tau,tau_t)
deallocate(r1,r2)
deallocate(cF_oo,cF_ov,cF_vv)
deallocate(cW_oooo,cW_ovvo)!,cW_vvvv)
deallocate(v_oooo)
deallocate(v_ovoo,v_oovo)
deallocate(v_ovvo,v_ovov,v_oovv)
double precision :: t_corr
t_corr = 0.d0
if (cc_par_t .and. elec_alpha_num +elec_beta_num > 2) then
print*,'CCSD(T) calculation...'
call wall_time(ta)
!allocate(v_vvvo(nV,nV,nV,nO))
!call gen_v_spin(cc_nV_m,cc_nV_m,cc_nV_m,cc_nO_m, &
! cc_nV_S,cc_nV_S,cc_nV_S,cc_nO_S, &
! cc_list_vir_spin,cc_list_vir_spin,cc_list_vir_spin,cc_list_occ_spin, &
! nV,nV,nV,nO, v_vvvo)
!call ccsd_par_t_spin(nO,nV,t1,t2,f_o,f_v,f_ov,v_ooov,v_vvoo,v_vvvo,t_corr)
call ccsd_par_t_spin_v2(nO,nV,t1,t2,f_o,f_v,f_ov,v_ooov,v_vvoo,t_corr)
!print*,'Working on it...'
!call abort
call wall_time(tb)
print*,'Done'
print*,'Time: ',tb-ta, ' s'
print*,''
write(*,'(A15,F18.12,A3)') ' E(CCSD(T)) = ', uncorr_energy + energy + t_corr, ' Ha'
write(*,'(A15,F18.12,A3)') ' E(T) = ', t_corr, ' Ha'
write(*,'(A15,F18.12,A3)') ' Correlation = ', energy + t_corr, ' Ha'
print*,''
endif
call save_energy(uncorr_energy + energy, t_corr)
deallocate(f_oo,f_ov,f_vv,f_o,f_v)
deallocate(v_ooov,v_vvoo,t1,t2)
!deallocate(v_ovvv,v_vvvo,v_vovv)
!deallocate(v_vvvv)
end
! Energy
subroutine ccsd_energy_spin(nO,nV,t1,t2,Fov,v_oovv,energy)
implicit none
BEGIN_DOC
! CCSD energy in spin orbitals
END_DOC
integer,intent(in) :: nO,nV
double precision,intent(in) :: t1(nO,nV)
double precision,intent(in) :: t2(nO,nO,nV,nV)
double precision,intent(in) :: Fov(nO,nV)
double precision,intent(in) :: v_oovv(nO,nO,nV,nV)
double precision,intent(out) :: energy
integer :: i,j,a,b
energy = 0d0
do i=1,nO
do a=1,nV
energy = energy + Fov(i,a) * t1(i,a)
end do
end do
do i=1,nO
do j=1,nO
do a=1,nV
do b=1,nV
energy = energy &
+ 0.5d0 * v_oovv(i,j,a,b) * t1(i,a) * t1(j,b) &
+ 0.25d0 * v_oovv(i,j,a,b) * t2(i,j,a,b)
end do
end do
end do
end do
end
! Tau
subroutine compute_tau_spin(nO,nV,t1,t2,tau)
implicit none
integer,intent(in) :: nO,nV
double precision,intent(in) :: t1(nO,nV)
double precision,intent(in) :: t2(nO,nO,nV,nV)
double precision,intent(out) :: tau(nO,nO,nV,nV)
integer :: i,j,k,l
integer :: a,b,c,d
!$OMP PARALLEL &
!$OMP SHARED(tau,t1,t2,nO,nV) &
!$OMP PRIVATE(i,j,a,b) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do i=1,nO
do j=1,nO
do a=1,nV
do b=1,nV
tau(i,j,a,b) = t2(i,j,a,b) + t1(i,a)*t1(j,b) - t1(i,b)*t1(j,a)
enddo
enddo
enddo
enddo
!$OMP END DO
!$OMP END PARALLEL
end
! Tau_t
subroutine compute_tau_t_spin(nO,nV,t1,t2,tau_t)
implicit none
integer,intent(in) :: nO,nV
double precision,intent(in) :: t1(nO,nV)
double precision,intent(in) :: t2(nO,nO,nV,nV)
double precision,intent(out) :: tau_t(nO,nO,nV,nV)
integer :: i,j,k,l
integer :: a,b,c,d
!$OMP PARALLEL &
!$OMP SHARED(tau_t,t1,t2,nO,nV) &
!$OMP PRIVATE(i,j,a,b) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do i=1,nO
do j=1,nO
do a=1,nV
do b=1,nV
tau_t(i,j,a,b) = t2(i,j,a,b) + 0.5d0*(t1(i,a)*t1(j,b) - t1(i,b)*t1(j,a))
enddo
enddo
enddo
enddo
!$OMP END DO
!$OMP END PARALLEL
end
! R1
subroutine compute_r1_spin(nO,nV,t1,t2,f_o,f_v,Fov,cF_oo,cF_ov,cF_vv,v_oovo,v_ovov,r1)
implicit none
integer,intent(in) :: nO,nV
double precision,intent(in) :: t1(nO,nV)
double precision,intent(in) :: t2(nO,nO,nV,nV)
double precision,intent(in) :: f_o(nO), f_v(nV)
double precision,intent(in) :: Fov(nO,nV)
double precision,intent(in) :: cF_oo(nO,nO)
double precision,intent(in) :: cF_ov(nO,nV)
double precision,intent(in) :: cF_vv(nV,nV)
double precision,intent(in) :: v_oovo(nO,nO,nV,nO)
double precision,intent(in) :: v_ovov(nO,nV,nO,nV)
!double precision,intent(in) :: v_ovvv(nO,nV,nV,nV)
double precision,intent(out) :: r1(nO,nV)
integer :: i,j,m,n
integer :: a,b,e,f
!double precision, allocatable :: X_vovv(:,:,:,:)
double precision, allocatable :: X_oovv(:,:,:,:)
double precision :: accu
!$OMP PARALLEL &
!$OMP SHARED(r1,t1,t2,Fov,cF_vv,cF_ov, &
!$OMP v_ovov,nO,nV) &
!$OMP PRIVATE(i,j,a,b,e,f,m,n) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(1)
do a=1,nV
do i=1,nO
r1(i,a) = Fov(i,a)
do e=1,nV
do m=1,nO
r1(i,a) = r1(i,a) + t2(i,m,a,e)*cF_ov(m,e)
end do
end do
do f=1,nV
do n=1,nO
r1(i,a) = r1(i,a) - t1(n,f)*v_ovov(n,a,i,f)
end do
end do
end do
end do
!$OMP END DO
!$OMP END PARALLEL
!do a=1,nV
! do i=1,nO
! do e=1,nV
! r1(i,a) = r1(i,a) + t1(i,e)*cF_vv(a,e)
! end do
! end do
!end do
call dgemm('N','T', nO, nV, nV, &
1d0, t1 , size(t1,1), &
cF_vv, size(cF_vv,1), &
1d0, r1 , size(r1,1))
!do a=1,nV
! do i=1,nO
! do m=1,nO
! r1(i,a) = r1(i,a) - t1(m,a)*cF_oo(m,i)
! end do
! end do
!end do
call dgemm('T','N', nO, nV, nO, &
-1d0, cF_oo, size(cF_oo,1), &
t1 , size(t1,1), &
1d0, r1 , size(r1,1))
!do a=1,nV
! do i=1,nO
! do f=1,nV
! do e=1,nV
! do m=1,nO
! r1(i,a) = r1(i,a) - 0.5d0*t2(i,m,e,f)*v_ovvv(m,a,e,f)
! end do
! end do
! end do
! end do
!end do
!allocate(X_vovv(nV,nO,nV,nV))
double precision, allocatable :: v_ovvf(:,:,:), X_vovf(:,:,:)
allocate(v_ovvf(nO,nV,nV),X_vovf(nV,nO,nV))
do f = 1, nV
call gen_v_spin_3idx(cc_nO_m,cc_nV_m,cc_nV_m,cc_nV_m, f, cc_nO_S,cc_nV_S,cc_nV_S,cc_nV_S, &
cc_list_occ_spin,cc_list_vir_spin,cc_list_vir_spin,cc_list_vir_spin, &
nO,nV,nV, v_ovvf)
!$OMP PARALLEL &
!$OMP SHARED(r1,t1,t2,X_vovf,v_ovvf,nO,nV) &
!$OMP PRIVATE(i,j,a,b,e,f,m,n) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
!do f = 1, nV
do e = 1, nV
do m = 1, nO
do a = 1, nV
!X_vovv(a,m,e,f) = v_ovvv(m,a,e,f)
X_vovf(a,m,e) = v_ovvf(m,a,e)
enddo
enddo
enddo
!enddo
!$OMP END DO
!$OMP END PARALLEL
call dgemm('N','T', nO, nV, nO*nV, &
-0.5d0, t2(1,1,1,f), size(t2,1), &
X_vovf, size(X_vovf,1), &
1d0 , r1 , size(r1,1))
enddo
!call dgemm('N','T', nO, nV, nO*nV*nV, &
! -0.5d0, t2 , size(t2,1), &
! X_vovv, size(X_vovv,1), &
! 1d0 , r1 , size(r1,1))
deallocate(X_vovf)
!deallocate(X_vovv)
allocate(X_oovv(nO,nO,nV,nV))
!$OMP PARALLEL &
!$OMP SHARED(r1,t1,t2,X_oovv, &
!$OMP f_o,f_v,v_oovo,nO,nV) &
!$OMP PRIVATE(i,j,a,b,e,f,m,n) &
!$OMP DEFAULT(NONE)
!do a=1,nV
! do i=1,nO
! do e=1,nV
! do m=1,nO
! do n=1,nO
! r1(i,a) = r1(i,a) - 0.5d0*t2(m,n,a,e)*v_oovo(n,m,e,i)
! end do
! end do
! end do
! end do
!end do
!$OMP DO collapse(3)
do a = 1, nV
do e = 1, nV
do m = 1, nO
do n = 1, nO
X_oovv(n,m,e,a) = t2(m,n,a,e)
enddo
enddo
enddo
enddo
!$OMP END DO
!$OMP END PARALLEL
call dgemm('T','N', nO, nV, nO*nO*nV, &
-0.5d0, v_oovo, size(v_oovo,1) * size(v_oovo,2) * size(v_oovo,3), &
X_oovv, size(X_oovv,1) * size(X_oovv,2) * size(X_oovv,3), &
1d0 , r1 , size(r1,1))
!$OMP PARALLEL &
!$OMP SHARED(r1,t1,X_oovv,f_o,f_v,nO,nV) &
!$OMP PRIVATE(i,j,a,b,e,f,m,n) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(1)
do a = 1, nV
do i = 1, nO
r1(i,a) = (f_o(i)-f_v(a)) * t1(i,a) - r1(i,a)
enddo
enddo
!$OMP END DO
!$OMP END PARALLEL
deallocate(X_oovv)
end
! R2
subroutine compute_r2_spin(nO,nV,t1,t2,tau,f_o,f_v,cF_oo,cF_ov,cF_vv,cW_oooo,cW_ovvo,v_ovoo,v_oovv,v_ovvo,r2)
implicit none
integer,intent(in) :: nO,nV
double precision,intent(in) :: cF_oo(nO,nO)
double precision,intent(in) :: cF_ov(nO,nV)
double precision,intent(in) :: cF_vv(nV,nV)
double precision,intent(in) :: f_o(nO), f_v(nV)
double precision,intent(in) :: cW_oooo(nO,nO,nO,nO)
!double precision,intent(in) :: cW_vvvv(nV,nV,nV,nV)
double precision,intent(in) :: cW_ovvo(nO,nV,nV,nO)
double precision,intent(in) :: t1(nO,nV)
double precision,intent(in) :: t2(nO,nO,nV,nV)
double precision,intent(in) :: tau(nO,nO,nV,nV)
double precision,intent(in) :: v_ovoo(nO,nV,nO,nO)
double precision,intent(in) :: v_oovv(nO,nO,nV,nV)
double precision,intent(in) :: v_ovvo(nO,nV,nV,nO)
!double precision,intent(in) :: v_vvvo(nV,nV,nV,nO)!, v_vovv(nV,nO,nV,nV)
double precision,intent(out) :: r2(nO,nO,nV,nV)
integer :: i,j,m,n
integer :: a,b,e,f
double precision, allocatable :: X_vvoo(:,:,:,:)
!double precision, allocatable :: A_vvov(:,:,:,:)
double precision, allocatable :: X_oovv(:,:,:,:), Y_oovv(:,:,:,:)
double precision, allocatable :: A_vvoo(:,:,:,:), B_ovoo(:,:,:,:), C_ovov(:,:,:,:)
double precision, allocatable :: A_ovov(:,:,:,:), B_ovvo(:,:,:,:), X_ovvo(:,:,:,:)
double precision, allocatable :: A_vv(:,:)
double precision, allocatable :: A_oo(:,:), B_oovv(:,:,:,:)
double precision, allocatable :: A_vbov(:,:,:), X_vboo(:,:,:), v_vbvo(:,:,:)
!do b=1,nV
! do a=1,nV
! do j=1,nO
! do i=1,nO
! r2(i,j,a,b) = v_oovv(i,j,a,b)
! end do
! end do
! end do
!end do
!do b=1,nV
! do a=1,nV
! do j=1,nO
! do i=1,nO
! do e=1,nV
! r2(i,j,a,b) = r2(i,j,a,b) + t2(i,j,a,e)*cF_vv(b,e)
! r2(i,j,a,b) = r2(i,j,a,b) - t2(i,j,b,e)*cF_vv(a,e)
! end do
! end do
! end do
! end do
!end do
allocate(X_oovv(nO,nO,nV,nV))
call dgemm('N','T',nO*nO*nV, nV, nV, &
1d0, t2 , size(t2,1) * size(t2,2) * size(t2,3), &
cF_VV , size(cF_vv,1), &
0d0, X_oovv, size(X_oovv,1) * size(X_oovv,2) * size(X_oovv,3))
!$OMP PARALLEL &
!$OMP SHARED(r2,v_oovv,X_oovv,nO,nV) &
!$OMP PRIVATE(i,j,a,b) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do b=1,nV
do a=1,nV
do j=1,nO
do i=1,nO
r2(i,j,a,b) = v_oovv(i,j,a,b) + X_oovv(i,j,a,b) - X_oovv(i,j,b,a)
end do
end do
end do
end do
!$OMP END DO
!$OMP END PARALLEL
!deallocate(X_oovv)
!do b=1,nV
! do a=1,nV
! do j=1,nO
! do i=1,nO
! do e=1,nV
! do m=1,nO
! r2(i,j,a,b) = r2(i,j,a,b) - 0.5d0*t2(i,j,a,e)*t1(m,b)*cF_ov(m,e)
! r2(i,j,a,b) = r2(i,j,a,b) + 0.5d0*t2(i,j,b,e)*t1(m,a)*cF_ov(m,e)
! end do
! end do
! end do
! end do
! end do
!end do
allocate(A_vv(nV,nV))!, X_oovv(nO,nO,nV,nV))
call dgemm('T','N', nV, nV, nO, &
1d0, t1 , size(t1,1), &
cF_ov, size(cF_ov,1), &
0d0, A_vv , size(A_vv,1))
call dgemm('N','T', nO*nO*nV, nV, nV, &
0.5d0, t2 , size(t2,1) * size(t2,2) * size(t2,3), &
A_vv , size(A_vv,1), &
0d0 , X_oovv, size(X_oovv,1) * size(X_oovv,2) * size(X_oovv,3))
!$OMP PARALLEL &
!$OMP SHARED(r2,v_oovv,X_oovv,nO,nV) &
!$OMP PRIVATE(i,j,a,b) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do b=1,nV
do a=1,nV
do j=1,nO
do i=1,nO
r2(i,j,a,b) = r2(i,j,a,b) - X_oovv(i,j,a,b) + X_oovv(i,j,b,a)
end do
end do
end do
end do
!$OMP END DO
!$OMP END PARALLEL
deallocate(A_vv)!,X_oovv)
!do b=1,nV
! do a=1,nV
! do j=1,nO
! do i=1,nO
! do m=1,nO
! r2(i,j,a,b) = r2(i,j,a,b) - t2(i,m,a,b)*cF_oo(m,j)
! r2(i,j,a,b) = r2(i,j,a,b) + t2(j,m,a,b)*cF_oo(m,i)
! end do
! end do
! end do
! end do
!end do
allocate(Y_oovv(nO,nO,nV,nV))!,X_oovv(nO,nO,nV,nV))
!$OMP PARALLEL &
!$OMP SHARED(t2,v_oovv,X_oovv,nO,nV) &
!$OMP PRIVATE(i,m,a,b) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do b=1,nV
do a=1,nV
do i=1,nO
do m=1,nO
X_oovv(m,i,a,b) = t2(i,m,a,b)
end do
end do
end do
end do
!$OMP END DO
!$OMP END PARALLEL
call dgemm('T','N', nO, nO*nV*nV, nO, &
1d0, cF_oo , size(cF_oo,1), &
X_oovv, size(X_oovv,1), &
0d0, Y_oovv, size(Y_oovv,1))
!$OMP PARALLEL &
!$OMP SHARED(r2,v_oovv,Y_oovv,nO,nV) &
!$OMP PRIVATE(i,j,a,b) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do b=1,nV
do a=1,nV
do j=1,nO
do i=1,nO
r2(i,j,a,b) = r2(i,j,a,b) - Y_oovv(j,i,a,b) + Y_oovv(i,j,a,b)
end do
end do
end do
end do
!$OMP END DO
!$OMP END PARALLEL
deallocate(Y_oovv)!,X_oovv)
!do b=1,nV
! do a=1,nV
! do j=1,nO
! do i=1,nO
! do e=1,nV
! do m=1,nO
! r2(i,j,a,b) = r2(i,j,a,b) - 0.5d0*t2(i,m,a,b)*t1(j,e)*cF_ov(m,e)
! r2(i,j,a,b) = r2(i,j,a,b) + 0.5d0*t2(j,m,a,b)*t1(i,e)*cF_ov(m,e)
! end do
! end do
! end do
! end do
! end do
!end do
allocate(A_oo(nO,nO),B_oovv(nO,nO,nV,nV))!,X_oovv(nO,nO,nV,nV))
call dgemm('N','T', nO, nO, nV, &
1d0, t1 , size(t1,1), &
cF_ov, size(cF_ov,1), &
0d0, A_oo , size(A_oo,1))
!$OMP PARALLEL &
!$OMP SHARED(t2,B_oovv,nO,nV) &
!$OMP PRIVATE(i,m,a,b) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do b = 1, nV
do a = 1, nV
do i = 1, nO
do m = 1, nO
B_oovv(m,i,a,b) = t2(i,m,a,b)
enddo
enddo
enddo
enddo
!$OMP END DO
!$OMP END PARALLEL
call dgemm('N','N', nO, nO*nV*nV, nO, &
0.5d0, A_oo, size(A_oo,1), &
B_oovv, size(B_oovv,1), &
0d0 , X_oovv, size(X_oovv,1))
!$OMP PARALLEL &
!$OMP SHARED(r2,X_oovv,nO,nV) &
!$OMP PRIVATE(i,j,a,b) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do b=1,nV
do a=1,nV
do j=1,nO
do i=1,nO
r2(i,j,a,b) = r2(i,j,a,b) - X_oovv(j,i,a,b) + X_oovv(i,j,a,b)
end do
end do
end do
end do
!$OMP END DO
!$OMP END PARALLEL
deallocate(A_oo,B_oovv,X_oovv)
!do b=1,nV
! do a=1,nV
! do j=1,nO
! do i=1,nO
! do n=1,nO
! do m=1,nO
! r2(i,j,a,b) = r2(i,j,a,b) + 0.5d0*tau(m,n,a,b)*cW_oooo(m,n,i,j)
! end do
! end do
! end do
! end do
! end do
!end do
call dgemm('T','N', nO*nO, nV*nV, nO*nO, &
0.5d0, cW_oooo, size(cW_oooo,1) * size(cW_oooo,2), &
tau , size(tau,1) * size(tau,2), &
1d0 , r2 , size(r2,1) * size(r2,2))
!do b=1,nV
! do a=1,nV
! do j=1,nO
! do i=1,nO
! do f=1,nV
! do e=1,nV
! r2(i,j,a,b) = r2(i,j,a,b) + 0.5d0*tau(i,j,e,f)*cW_vvvv(a,b,e,f)
! end do
! end do
! end do
! end do
! end do
!end do
!call dgemm('N','T', nO*nO, nV*nV, nV*nV, &
! 0.5d0, tau , size(tau,1) * size(tau,2), &
! cW_vvvv, size(cW_vvvv,1) * size(cW_vvvv,2), &
! 1d0 , r2 , size(r2,1) * size(r2,2))
double precision :: ti,tf
call wall_time(ti)
call use_cW_vvvf(nO,nV,t1,t2,tau,v_oovv,r2)
call wall_time(tf)
if (cc_dev) then
print*,'cW_vvvv:',tf-ti,'s'
endif
!do b=1,nV
! do a=1,nV
! do j=1,nO
! do i=1,nO
! do e=1,nV
! do m=1,nO
! r2(i,j,a,b) = r2(i,j,a,b) &
! + t2(i,m,a,e)*cW_ovvo(m,b,e,j) &
! - t2(j,m,a,e)*cW_ovvo(m,b,e,i) &
! - t2(i,m,b,e)*cW_ovvo(m,a,e,j) &
! + t2(j,m,b,e)*cW_ovvo(m,a,e,i) &
! - t1(i,e)*t1(m,a)*v_ovvo(m,b,e,j) &
! + t1(j,e)*t1(m,a)*v_ovvo(m,b,e,i) &
! + t1(i,e)*t1(m,b)*v_ovvo(m,a,e,j) &
! - t1(j,e)*t1(m,b)*v_ovvo(m,a,e,i)
! end do
! end do
! end do
! end do
! end do
!end do
allocate(A_ovov(nO,nV,nO,nV), B_ovvo(nO,nV,nV,nO), X_ovvo(nO,nV,nV,nO))
!$OMP PARALLEL &
!$OMP SHARED(t2,A_ovov,B_ovvo,cW_ovvo,nO,nV) &
!$OMP PRIVATE(i,j,a,b,e,m) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do a = 1, nV
do i = 1, nO
do e = 1, nV
do m = 1, nO
A_ovov(m,e,i,a) = t2(i,m,a,e)
end do
end do
end do
end do
!$OMP END DO NOWAIT
!$OMP DO collapse(3)
do j = 1, nO
do b = 1, nV
do e = 1, nV
do m = 1, nO
B_ovvo(m,e,b,j) = cW_ovvo(m,b,e,j)
enddo
enddo
enddo
enddo
!$OMP END DO
!$OMP END PARALLEL
call dgemm('T','N', nO*nV, nV*nO, nO*nV, &
1d0, A_ovov, size(A_ovov,1) * size(A_ovov,2), &
B_ovvo, size(B_ovvo,1) * size(B_ovvo,2), &
0d0, X_ovvo, size(X_ovvo,1) * size(X_ovvo,2))
!$OMP PARALLEL &
!$OMP SHARED(r2,X_ovvo,nO,nV) &
!$OMP PRIVATE(i,j,a,b,e,m) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do b = 1, nV
do a = 1, nV
do j = 1, nO
do i = 1, nO
r2(i,j,a,b) = r2(i,j,a,b) + X_ovvo(i,a,b,j) - X_ovvo(j,a,b,i) &
- X_ovvo(i,b,a,j) + X_ovvo(j,b,a,i)
enddo
enddo
enddo
enddo
!$OMP END DO
!$OMP END PARALLEL
deallocate(A_ovov,B_ovvo,X_ovvo)
allocate(A_vvoo(nV,nV,nO,nO), B_ovoo(nO,nV,nO,nO), C_ovov(nO,nV,nO,nV))
!$OMP PARALLEL &
!$OMP SHARED(A_vvoo,v_ovvo,nO,nV) &
!$OMP PRIVATE(i,j,a,b,e,m) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do m = 1, nO
do j = 1, nO
do b = 1, nV
do e = 1, nV
A_vvoo(e,b,j,m) = v_ovvo(m,b,e,j)
enddo
enddo
enddo
enddo
!$OMP END DO
!$OMP END PARALLEL
call dgemm('N','N', nO, nV*nO*nO, nV, &
1d0, t1 , size(t1,1), &
A_vvoo, size(A_vvoo,1), &
0d0, B_ovoo, size(B_ovoo,1))
call dgemm('N','N', nO*nV*nO, nV, nO, &
1d0, B_ovoo, size(B_ovoo,1) * size(B_ovoo,2) * size(B_ovoo,3), &
t1 , size(t1,1), &
0d0, C_ovov, size(C_ovov,1) * size(C_ovov,2) * size(C_ovov,3))
!$OMP PARALLEL &
!$OMP SHARED(r2,C_ovov,nO,nV) &
!$OMP PRIVATE(i,j,a,b,e,m) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do b=1,nV
do a=1,nV
do j=1,nO
do i=1,nO
r2(i,j,a,b) = r2(i,j,a,b) - C_ovov(i,b,j,a) + C_ovov(j,b,i,a) &
+ C_ovov(i,a,j,b) - C_ovov(j,a,i,b)
end do
end do
end do
end do
!$OMP END DO
!$OMP END PARALLEL
deallocate(A_vvoo, B_ovoo, C_ovov)
!do b=1,nV
! do a=1,nV
! do j=1,nO
! do i=1,nO
! do e=1,nV
! r2(i,j,a,b) = r2(i,j,a,b) + t1(i,e)*v_vvvo(a,b,e,j) - t1(j,e)*v_vvvo(a,b,e,i)
! end do
! end do
! end do
! end do
!end do
!allocate(A_vvov(nV,nV,nO,nV), X_vvoo(nV,nV,nO,nO))
allocate(A_vbov(nV,nO,nV), X_vboo(nV,nO,nO), v_vbvo(nV,nV,nO))
do b = 1, nV
call gen_v_spin_3idx_i_kl(cc_nV_m,cc_nV_m,cc_nV_m,cc_nO_m, b, cc_nV_S,cc_nV_S,cc_nV_S,cc_nO_S, &
cc_list_vir_spin,cc_list_vir_spin,cc_list_vir_spin,cc_list_occ_spin, &
nV,nV,nO, v_vbvo)
!$OMP PARALLEL &
!$OMP SHARED(b,A_vbov,v_vbvo,nO,nV) &
!$OMP PRIVATE(i,j,a,e,m) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(2)
do e = 1, nV
do j = 1, nO
!do b = 1, nV
do a = 1, nV
!A_vvov(a,b,j,e) = v_vvvo(a,b,e,j)
A_vbov(a,j,e) = v_vbvo(a,e,j)
enddo
!enddo
enddo
enddo
!$OMP END DO
!$OMP END PARALLEL
call dgemm('N','T', nV*nO, nO, nV, &
1d0, A_vbov, size(A_vbov,1) * size(A_vbov,2), &
t1 , size(t1,1), &
0d0, X_vboo, size(X_vboo,1) * size(X_vboo,2))
!call dgemm('N','T', nV*nV*nO, nO, nV, &
! 1d0, A_vvov, size(A_vvov,1) * size(A_vvov,2) * size(A_vvov,3), &
! t1 , size(t1,1), &
! 0d0, X_vvoo, size(X_vvoo,1) * size(X_vvoo,2) * size(X_vvoo,3))
!$OMP PARALLEL &
!$OMP SHARED(b,r2,X_vboo,nO,nV) &
!$OMP PRIVATE(i,j,a,e,m) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(2)
!do b = 1, nV
do a = 1, nV
do j = 1, nO
do i = 1, NO
!r2(i,j,a,b ) = r2(i,j,a,b) + X_vvoo(a,b,j,i) - X_vvoo(a,b,i,j)
r2(i,j,a,b) = r2(i,j,a,b) + X_vboo(a,j,i) - X_vboo(a,i,j)
enddo
enddo
enddo
!enddo
!$OMP END DO
!$OMP END PARALLEL
enddo
!deallocate(A_vvov)!,X_vvoo)
deallocate(A_vbov, X_vboo, v_vbvo)
allocate(X_vvoo(nV,nV,nO,nO))
!do b=1,nV
! do a=1,nV
! do j=1,nO
! do i=1,nO
! do m=1,nO
! r2(i,j,a,b) = r2(i,j,a,b) - t1(m,a)*v_ovoo(m,b,i,j) + t1(m,b)*v_ovoo(m,a,i,j)
! end do
! end do
! end do
! end do
!end do
!allocate(X_vvoo(nV,nV,nO,nO))
call dgemm('T','N', nV, nV*nO*nO, nO, &
1d0, t1 , size(t1,1), &
v_ovoo, size(v_ovoo,1), &
0d0, X_vvoo, size(X_vvoo,1))
!$OMP PARALLEL &
!$OMP SHARED(r2,X_vvoo,f_o,f_v,t2,nO,nV) &
!$OMP PRIVATE(i,j,a,b,e,m) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do b=1,nV
do a=1,nV
do j=1,nO
do i=1,nO
r2(i,j,a,b) = r2(i,j,a,b) - X_vvoo(a,b,i,j) + X_vvoo(b,a,i,j)
end do
end do
end do
end do
!$OMP END DO
!$OMP DO collapse(3)
do b=1,nV
do a=1,nV
do j=1,nO
do i=1,nO
r2(i,j,a,b) = (f_o(i)+f_o(j)-f_v(a)-f_v(b)) * t2(i,j,a,b) - r2(i,j,a,b)
end do
end do
end do
end do
!$OMP END DO
!$OMP END PARALLEL
deallocate(X_vvoo)
end
! Use cF_oo
subroutine use_cF_oo(nO,nV,t1,t2,tau_t,F_oo,F_ov,v_ooov,v_oovv,r1,r2)
implicit none
integer,intent(in) :: nO,nV
double precision, intent(in) :: t1(nO,nV), t2(nO,nO,nV,nV), tau_t(nO,nO,nV,nV)
double precision, intent(in) :: F_oo(nO,nV), F_ov(nO,nV)
double precision, intent(in) :: v_ooov(nO,nO,nO,nV), v_oovv(nO,nO,nV,nV)
double precision, intent(inout) :: r1(nO,nV), r2(nO,nO,nV,nV)
double precision, allocatable :: cF_oo(:,:), X_oovv(:,:,:,:),Y_oovv(:,:,:,:)
integer :: i,j,m,a,b
allocate(cF_oo(nO,nO))
call compute_cF_oo(nO,nV,t1,tau_t,F_oo,F_ov,v_ooov,v_oovv,cF_oo)
!do a=1,nV
! do i=1,nO
! do m=1,nO
! r1(i,a) = r1(i,a) - t1(m,a)*cF_oo(m,i)
! end do
! end do
!end do
call dgemm('T','N', nO, nV, nO, &
-1d0, cF_oo, size(cF_oo,1), &
t1 , size(t1,1), &
1d0, r1 , size(r1,1))
!do b=1,nV
! do a=1,nV
! do j=1,nO
! do i=1,nO
! do m=1,nO
! r2(i,j,a,b) = r2(i,j,a,b) - t2(i,m,a,b)*cF_oo(m,j)
! r2(i,j,a,b) = r2(i,j,a,b) + t2(j,m,a,b)*cF_oo(m,i)
! end do
! end do
! end do
! end do
!end do
allocate(Y_oovv(nO,nO,nV,nV),X_oovv(nO,nO,nV,nV))
!$OMP PARALLEL &
!$OMP SHARED(t2,v_oovv,X_oovv,nO,nV) &
!$OMP PRIVATE(i,m,a,b) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do b=1,nV
do a=1,nV
do i=1,nO
do m=1,nO
X_oovv(m,i,a,b) = t2(i,m,a,b)
end do
end do
end do
end do
!$OMP END DO
!$OMP END PARALLEL
call dgemm('T','N', nO, nO*nV*nV, nO, &
1d0, cF_oo , size(cF_oo,1), &
X_oovv, size(X_oovv,1), &
0d0, Y_oovv, size(Y_oovv,1))
!$OMP PARALLEL &
!$OMP SHARED(r2,v_oovv,Y_oovv,nO,nV) &
!$OMP PRIVATE(i,j,a,b) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do b=1,nV
do a=1,nV
do j=1,nO
do i=1,nO
r2(i,j,a,b) = r2(i,j,a,b) - Y_oovv(j,i,a,b) + Y_oovv(i,j,a,b)
end do
end do
end do
end do
!$OMP END DO
!$OMP END PARALLEL
deallocate(cF_oo,X_oovv,Y_oovv)
end
! Use cF_ov
subroutine use_cF_ov(nO,nV,t1,t2,F_ov,v_oovv,r1,r2)
implicit none
integer, intent(in) :: nO,nV
double precision, intent(in) :: t1(nO,nV), t2(nO,nO,nV,nV)
double precision, intent(in) :: F_ov(nO,nV), v_oovv(nO,nO,nV,nV)
double precision, intent(inout) :: r1(nO,nV), r2(nO,nO,nV,nV)
double precision, allocatable :: cF_ov(:,:), A_oo(:,:), A_vv(:,:)
double precision, allocatable :: X_oovv(:,:,:,:), B_oovv(:,:,:,:)
integer :: i,j,a,b,e,m
allocate(cF_ov(nO,nV))
call compute_cF_ov(nO,nV,t1,F_ov,v_oovv,cF_ov)
!$OMP PARALLEL &
!$OMP SHARED(r1,t2,cF_ov,nO,nV) &
!$OMP PRIVATE(i,a,e,m) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(1)
do a=1,nV
do i=1,nO
do e=1,nV
do m=1,nO
r1(i,a) = r1(i,a) + t2(i,m,a,e)*cF_ov(m,e)
end do
end do
end do
end do
!$OMP END DO
!$OMP END PARALLEL
!do b=1,nV
! do a=1,nV
! do j=1,nO
! do i=1,nO
! do e=1,nV
! do m=1,nO
! r2(i,j,a,b) = r2(i,j,a,b) - 0.5d0*t2(i,j,a,e)*t1(m,b)*cF_ov(m,e)
! r2(i,j,a,b) = r2(i,j,a,b) + 0.5d0*t2(i,j,b,e)*t1(m,a)*cF_ov(m,e)
! end do
! end do
! end do
! end do
! end do
!end do
allocate(A_vv(nV,nV), X_oovv(nO,nO,nV,nV))
call dgemm('T','N', nV, nV, nO, &
1d0, t1 , size(t1,1), &
cF_ov, size(cF_ov,1), &
0d0, A_vv , size(A_vv,1))
call dgemm('N','T', nO*nO*nV, nV, nV, &
0.5d0, t2 , size(t2,1) * size(t2,2) * size(t2,3), &
A_vv , size(A_vv,1), &
0d0 , X_oovv, size(X_oovv,1) * size(X_oovv,2) * size(X_oovv,3))
!$OMP PARALLEL &
!$OMP SHARED(nO,nV,r2,X_oovv) &
!$OMP PRIVATE(i,j,a,b) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do b=1,nV
do a=1,nV
do j=1,nO
do i=1,nO
r2(i,j,a,b) = r2(i,j,a,b) - X_oovv(i,j,a,b) + X_oovv(i,j,b,a)
end do
end do
end do
end do
!$OMP END DO
!$OMP END PARALLEL
deallocate(A_vv)
!do b=1,nV
! do a=1,nV
! do j=1,nO
! do i=1,nO
! do e=1,nV
! do m=1,nO
! r2(i,j,a,b) = r2(i,j,a,b) - 0.5d0*t2(i,m,a,b)*t1(j,e)*cF_ov(m,e)
! r2(i,j,a,b) = r2(i,j,a,b) + 0.5d0*t2(j,m,a,b)*t1(i,e)*cF_ov(m,e)
! end do
! end do
! end do
! end do
! end do
!end do
allocate(A_oo(nO,nO),B_oovv(nO,nO,nV,nV))!,X_oovv(nO,nO,nV,nV))
call dgemm('N','T', nO, nO, nV, &
1d0, t1 , size(t1,1), &
cF_ov, size(cF_ov,1), &
0d0, A_oo , size(A_oo,1))
!$OMP PARALLEL &
!$OMP SHARED(t2,B_oovv,nO,nV) &
!$OMP PRIVATE(i,m,a,b) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do b = 1, nV
do a = 1, nV
do i = 1, nO
do m = 1, nO
B_oovv(m,i,a,b) = t2(i,m,a,b)
enddo
enddo
enddo
enddo
!$OMP END DO
!$OMP END PARALLEL
call dgemm('N','N', nO, nO*nV*nV, nO, &
0.5d0, A_oo, size(A_oo,1), &
B_oovv, size(B_oovv,1), &
0d0 , X_oovv, size(X_oovv,1))
!$OMP PARALLEL &
!$OMP SHARED(r2,X_oovv,nO,nV) &
!$OMP PRIVATE(i,j,a,b) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do b=1,nV
do a=1,nV
do j=1,nO
do i=1,nO
r2(i,j,a,b) = r2(i,j,a,b) - X_oovv(j,i,a,b) + X_oovv(i,j,a,b)
end do
end do
end do
end do
!$OMP END DO
!$OMP END PARALLEL
deallocate(cF_ov,A_oo,B_oovv,X_oovv)
end
! Use cF_vv
subroutine use_cF_vv(nO,nV,t1,t2,r1,r2)
implicit none
integer, intent(in) :: nO,nV
double precision, intent(in) :: t1(nO,nV), t2(nO,nO,nV,nV)
double precision, intent(inout) :: r1(nO,nV), r2(nO,nO,nV,nV)
double precision, allocatable :: cF_vv(:,:)
integer :: i,j,a,b,e,m
allocate(cF_vv(nV,nV))
!call compute_cF_vv(nO,nV,t1,tau_t,F_ov,F_vv,v_oovv,v_ovvv,cF_vv)
deallocate(cF_vv)
end
! Use cW_vvvd
subroutine use_cW_vvvf(nO,nV,t1,t2,tau,v_oovv,r2)
implicit none
integer, intent(in) :: nO,nV
double precision, intent(in) :: t1(nO,nV), t2(nO,nO,nV,nV), tau(nO,nO,nV,nV)
double precision, intent(in) :: v_oovv(nO,nO,nV,nV)
!double precision, intent(in) :: v_vovv(nV,nO,nV,nV)
double precision, intent(inout) :: r2(nO,nO,nV,nV)
double precision, allocatable :: cW_vvvf(:,:,:), v_vvvf(:,:,:), tau_f(:,:,:), v_vovf(:,:,:)
integer :: i,j,e,f
double precision :: ti,tf
allocate(cW_vvvf(nV,nV,nV),v_vvvf(nV,nV,nV),tau_f(nO,nO,nV),v_vovf(nV,nO,nV))
!PROVIDE cc_nVab
!do b=1,nV
! do a=1,nV
! do j=1,nO
! do i=1,nO
! do f=1,nV
! do e=1,nV
! r2(i,j,a,b) = r2(i,j,a,b) + 0.5d0*tau(i,j,e,f)*cW_vvvv(a,b,e,f)
! end do
! end do
! end do
! end do
! end do
!end do
do f = 1, nV
call wall_time(ti)
!$OMP PARALLEL &
!$OMP SHARED(tau,tau_f,f,nO,nV) &
!$OMP PRIVATE(i,j,e) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(2)
do e = 1, nV
do j = 1, nO
do i = 1, nO
tau_f(i,j,e) = tau(i,j,e,f)
enddo
enddo
enddo
!$OMP END DO
!$OMP END PARALLEL
call wall_time(tf)
if (cc_dev .and. f == 1) then
print*,'1st transpo', tf-ti
endif
call wall_time(ti)
call gen_v_spin_3idx(cc_nV_m,cc_nV_m,cc_nV_m,cc_nV_m, f, cc_nV_S,cc_nV_S,cc_nV_S,cc_nV_S, &
cc_list_vir_spin,cc_list_vir_spin,cc_list_vir_spin,cc_list_vir_spin, &
nV,nV,nV, v_vvvf)
call wall_time(tf)
if (cc_dev .and. f == 1) then
print*,'vvvf', tf-ti
endif
call wall_time(ti)
call gen_v_spin_3idx(cc_nV_m,cc_nO_m,cc_nV_m,cc_nV_m, f, cc_nV_S,cc_nO_S,cc_nV_S,cc_nV_S, &
cc_list_vir_spin,cc_list_occ_spin,cc_list_vir_spin,cc_list_vir_spin, &
nV,nO,nV, v_vovf)
call wall_time(tf)
if (cc_dev .and. f == 1) then
print*,'vovf', tf-ti
endif
call wall_time(ti)
call compute_cW_vvvf(nO,nV,t1,t2,tau,f,v_vvvf,v_vovf,v_oovv,cW_vvvf)
call wall_time(tf)
if (cc_dev .and. f == 1) then
print*,'cW_vvvf', tf-ti
endif
call wall_time(ti)
call dgemm('N','T', nO*nO, nV*nV, nV, &
0.5d0, tau_f , size(tau_f,1) * size(tau_f,2), &
cW_vvvf, size(cW_vvvf,1) * size(cW_vvvf,2), &
1d0 , r2 , size(r2,1) * size(r2,2))
call wall_time(tf)
if (cc_dev .and. f == 1) then
print*,'last dgemm', tf-ti
endif
enddo
deallocate(cW_vvvf,v_vvvf,v_vovf)
end
! cF_oo
subroutine compute_cF_oo(nO,nV,t1,tau_t,Foo,Fov,v_ooov,v_oovv,cF_oo)
implicit none
integer,intent(in) :: nO,nV
double precision,intent(in) :: t1(nO,nV)
double precision,intent(in) :: tau_t(nO,nO,nV,nV)
double precision,intent(in) :: Foo(nO,nO)
double precision,intent(in) :: Fov(nO,nV)
double precision,intent(in) :: v_ooov(nO,nO,nO,nV)
double precision,intent(in) :: v_oovv(nO,nO,nV,nV)
double precision,intent(out) :: cF_oo(nO,nO)
integer :: i,j,m,n
integer :: a,b,e,f
double precision,external :: Kronecker_Delta
!$OMP PARALLEL &
!$OMP SHARED(cF_oo,Foo,t1,v_ooov,nO,nV) &
!$OMP PRIVATE(i,m,n,e) &
!$OMP DEFAULT(NONE)
!do i=1,nO
! do m=1,nO
! cF_oo(m,i) = (1d0 - Kronecker_delta(m,i))*Foo(m,i)
! end do
!end do
!$OMP DO collapse(1)
do i=1,nO
do m=1,nO
cF_oo(m,i) = Foo(m,i)
end do
end do
!$OMP END DO
!$OMP DO
do i = 1, nO
cF_oo(i,i) = 0d0
end do
!$OMP END DO
do e=1,nV
do n=1,nO
!$OMP DO collapse(1)
do i=1,nO
do m=1,nO
cF_oo(m,i) = cF_oo(m,i) + t1(n,e)*v_ooov(m,n,i,e)
end do
end do
!$OMP END DO
end do
end do
!$OMP END PARALLEL
!do i=1,nO
! do m=1,nO
! do e=1,nV
! cF_oo(m,i) = cF_oo(m,i) + 0.5d0*t1(i,e)*Fov(m,e)
! end do
! end do
!end do
call dgemm('N','T', nO, nO, nV,&
0.5d0, Fov , size(Fov,1), &
t1 , size(t1,1), &
1d0 , cF_oo, size(cF_oo,1))
!do i=1,nO
! do m=1,nO
! do f=1,nV
! do e=1,nV
! do n=1,nO
! cF_oo(m,i) = cF_oo(m,i) + 0.5d0*tau_t(i,n,e,f)*v_oovv(m,n,e,f)
! end do
! end do
! end do
! end do
!end do
call dgemm('N','T', nO, nO, nO*nV*nV, &
0.5d0, v_oovv, size(v_oovv,1), &
tau_t , size(tau_t,1), &
1d0 , cF_oo , size(cF_oo,1))
end
! cF_ov
subroutine compute_cF_ov(nO,nV,t1,Fov,v_oovv,cF_ov)
implicit none
integer,intent(in) :: nO,nV
double precision,intent(in) :: t1(nO,nV)
double precision,intent(in) :: Fov(nO,nV),v_oovv(nO,nO,nV,nV)
double precision,intent(out) :: cF_ov(nO,nV)
integer :: i,j,m,n
integer :: a,b,e,f
!$OMP PARALLEL &
!$OMP SHARED(cF_ov,Fov,t1,v_oovv,nO,nV) &
!$OMP PRIVATE(i,a,m,n,e,f) &
!$OMP DEFAULT(NONE)
!cF_ov = Fov
!$OMP DO collapse(1)
do e=1,nV
do m=1,nO
cF_ov(m,e) = Fov(m,e)
do f=1,nV
do n=1,nO
cF_ov(m,e) = cF_ov(m,e) + t1(n,f)*v_oovv(m,n,e,f)
end do
end do
end do
end do
!$OMP END DO
!$OMP END PARALLEL
end
! cF_vv
subroutine compute_cF_vv(nO,nV,t1,tau_t,Fov,Fvv,v_oovv,cF_vv)
implicit none
integer,intent(in) :: nO,nV
double precision,intent(in) :: t1(nO,nV)
double precision,intent(in) :: tau_t(nO,nO,nV,nV)
double precision,intent(in) :: Fov(nO,nV)
double precision,intent(in) :: Fvv(nV,nV)
double precision,intent(in) :: v_oovv(nO,nO,nV,nV)
!double precision,intent(in) :: v_ovvv(nO,nV,nV,nV)
double precision,intent(out) :: cF_vv(nV,nV)
double precision, allocatable :: v_ovfv(:,:,:),X_ovfv(:,:,:)
integer :: i,j,m,n
integer :: a,b,e,f
!$OMP PARALLEL &
!$OMP SHARED(cF_vv,Fvv,nO,nV) &
!$OMP PRIVATE(e,a) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(1)
do e=1,nV
do a=1,nV
cF_vv(a,e) = Fvv(a,e)
end do
end do
!$OMP END DO
!$OMP DO
do e = 1, nV
cF_vv(e,e) = 0d0
enddo
!$OMP END DO
!$OMP END PARALLEL
!do e=1,nV
! do a=1,nV
! do m=1,nO
! cF_vv(a,e) = cF_vv(a,e) - 0.5d0*t1(m,a)*Fov(m,e)
! end do
! end do
!end do
call dgemm('T','N', nV, nV, nO, &
-0.5d0, t1 , size(t1,1), &
Fov , size(Fov,1), &
1d0 , cF_vv, size(cF_vv,1))
!do e=1,nV
! do a=1,nV
! do m=1,nO
! do f=1,nV
! cF_vv(a,e) = cF_vv(a,e) + t1(m,f)*v_ovvv(m,a,f,e)
! end do
! end do
! end do
!end do
allocate(v_ovfv(nO,nV,nV),X_ovfv(nO,nV,nV))
do f = 1, nV
call gen_v_spin_3idx_ij_l(cc_nO_m,cc_nV_m,cc_nV_m,cc_nV_m, f, cc_nO_S,cc_nV_S,cc_nV_S,cc_nV_S, &
cc_list_occ_spin,cc_list_vir_spin,cc_list_vir_spin,cc_list_vir_spin, &
nO,nV,nV, v_ovfv)
!$OMP PARALLEL &
!$OMP SHARED(nO,nV,v_ovfv,X_ovfv,f) &
!$OMP PRIVATE(m,a,e) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(2)
do e = 1, nV
do a = 1, nV
do m = 1, nO
!X_ovfv(m,a,e) = v_ovvv(m,a,f,e)
X_ovfv(m,a,e) = v_ovfv(m,a,e)
enddo
enddo
enddo
!$OMP END DO
!$OMP END PARALLEL
call dgemv('T', nO, nV*nV, &
!1d0, v_ovvv(:,:,f,:), size(v_ovvv,1), &
1d0, X_ovfv, size(X_ovfv,1), &
t1(1,f), 1, &
1d0, cF_vv, 1)
enddo
deallocate(v_ovfv,X_ovfv)
!do e=1,nV
! do a=1,nV
! do f=1,nV
! do n=1,nO
! do m=1,nO
! cF_vv(a,e) = cF_vv(a,e) - 0.5d0*tau_t(m,n,a,f)*v_oovv(m,n,e,f)
! end do
! end do
! end do
! end do
!end do
do f = 1, nV
call dgemm('T','N', nV, nV, nO*nO,&
-0.5d0, tau_t(1,1,1,f) , size(tau_t,1) * size(tau_t,2), &
v_oovv(1,1,1,f), size(v_oovv,1) * size(v_oovv,2), &
1d0 , cF_vv, size(cF_vv,1))
enddo
end
! cW_oooo
subroutine compute_cW_oooo(nO,nV,t1,t2,tau,v_oooo,v_ooov,v_oovv,cW_oooo)
implicit none
integer,intent(in) :: nO,nV
double precision,intent(in) :: t1(nO,nV)
double precision,intent(in) :: t2(nO,nO,nV,nV)
double precision,intent(in) :: tau(nO,nO,nV,nV)
double precision,intent(in) :: v_oooo(nO,nO,nO,nO)
double precision,intent(in) :: v_ooov(nO,nO,nO,nV)
double precision,intent(in) :: v_oovv(nO,nO,nV,nV)
double precision,intent(out) :: cW_oooo(nO,nO,nO,nO)
integer :: i,j,m,n
integer :: a,b,e,f
double precision, allocatable :: X_oooo(:,:,:,:)
! oooo block
!cW_oooo = v_oooo
!do j=1,nO
! do i=1,nO
! do n=1,nO
! do m=1,nO
! do e=1,nV
! cW_oooo(m,n,i,j) = cW_oooo(m,n,i,j) + t1(j,e)*v_ooov(m,n,i,e) - t1(i,e)*v_ooov(m,n,j,e)
! end do
! end do
! end do
! end do
!end do
allocate(X_oooo(nO,nO,nO,nO))
call dgemm('N','T', nO*nO*nO, nO, nV, &
1d0, v_ooov, size(v_ooov,1) * size(v_ooov,2) * size(v_ooov,3), &
t1 , size(t1,1), &
0d0, X_oooo, size(X_oooo,1) * size(X_oooo,1) * size(X_oooo,3))
!$OMP PARALLEL &
!$OMP SHARED(cW_oooo,v_oooo,X_oooo,nO,nV) &
!$OMP PRIVATE(i,j,m,n) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do j=1,nO
do i=1,nO
do n=1,nO
do m=1,nO
cW_oooo(m,n,i,j) = v_oooo(m,n,i,j) + X_oooo(m,n,i,j) - X_oooo(m,n,j,i)
end do
end do
end do
end do
!$OMP END DO
!$OMP END PARALLEL
deallocate(X_oooo)
!do m=1,nO
! do n=1,nO
! do i=1,nO
! do j=1,nO
!
! do e=1,nV
! do f=1,nV
! cW_oooo(m,n,i,j) = cW_oooo(m,n,i,j) + 0.25d0*tau(i,j,e,f)*v_oovv(m,n,e,f)
! end do
! end do
! end do
! end do
! end do
!end do
call dgemm('N','T', nO*nO, nO*nO, nV*nV, &
0.25d0, v_oovv , size(v_oovv,1) * size(v_oovv,2), &
tau , size(tau,1) * size(tau,2), &
1.d0 , cW_oooo, size(cW_oooo,1) * size(cW_oooo,2))
end
! cW_ovvo
subroutine compute_cW_ovvo(nO,nV,t1,t2,tau,v_ovvo,v_oovo,v_oovv,cW_ovvo)
implicit none
integer,intent(in) :: nO,nV
double precision,intent(in) :: t1(nO,nV)
double precision,intent(in) :: t2(nO,nO,nV,nV)
double precision,intent(in) :: tau(nO,nO,nV,nV)
double precision,intent(in) :: v_oovo(nO,nO,nV,nO)
double precision,intent(in) :: v_oovv(nO,nO,nV,nV)
double precision,intent(in) :: v_ovvo(nO,nV,nV,nO)
!double precision,intent(in) :: v_ovvv(nO,nV,nV,nV)
double precision,intent(out) :: cW_ovvo(nO,nV,nV,nO)
integer :: i,j,m,n
integer :: a,b,e,f
double precision, allocatable :: A_oovo(:,:,:,:), B_vovo(:,:,:,:)
double precision, allocatable :: A_voov(:,:,:,:), B_voov(:,:,:,:), C_ovov(:,:,:,:)
double precision, allocatable :: v_ovev(:,:,:), cW_oveo(:,:,:)
!$OMP PARALLEL &
!$OMP SHARED(cW_ovvo,v_ovvo,nO,nV) &
!$OMP PRIVATE(i,j,a,b) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do j = 1, nO
do b = 1, nV
do a = 1, nV
do i = 1, nO
cW_ovvo(i,a,b,j) = v_ovvo(i,a,b,j)
enddo
enddo
enddo
enddo
!$OMP END DO
!$OMP END PARALLEL
!do m=1,nO
! do b=1,nV
! do e=1,nV
! do j=1,nO
! do f=1,nV
! cW_ovvo(m,b,e,j) = cW_ovvo(m,b,e,j) + t1(j,f)*v_ovvv(m,b,e,f)
! end do
! end do
! end do
! end do
!end do
allocate(v_ovev(nO,nV,nV),cW_oveo(nO,nV,nO))
do e = 1, nV
call gen_v_spin_3idx_ij_l(cc_nO_m,cc_nV_m,cc_nV_m,cc_nV_m, e, cc_nO_S,cc_nV_S,cc_nV_S,cc_nV_S, &
cc_list_occ_spin,cc_list_vir_spin,cc_list_vir_spin,cc_list_vir_spin, &
nO,nV,nV, v_ovev)
call dgemm('N','T', nO*nV, nO, nV, &
1.d0, v_ovev , size(v_ovev,1) * size(v_ovev,2), &
t1 , size(t1,1), &
0.d0, cW_oveo, size(cW_oveo,1) * size(cW_oveo,2))
!$OMP PARALLEL &
!$OMP SHARED(e,cW_ovvo,cW_oveo,nO,nV) &
!$OMP PRIVATE(m,b,j) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(2)
do j = 1, nO
do b = 1, nV
do m = 1, nO
cW_ovvo(m,b,e,j) = cW_ovvo(m,b,e,j) + cW_oveo(m,b,j)
enddo
enddo
enddo
!$OMP END DO
!$OMP END PARALLEL
enddo
deallocate(v_ovev,cW_oveo)
!call dgemm('N','T', nO*nV*nV, nO, nV, &
! 1.d0, v_ovvv , size(v_ovvv,1) * size(v_ovvv,2) * size(v_ovvv,3), &
! t1 , size(t1,1), &
! 1.d0, cW_ovvo, size(cW_ovvo,1) * size(cW_ovvo,2) * size(cW_ovvo,3))
!do j=1,nO
! do e=1,nV
! do b=1,nV
! do m=1,nO
! do n=1,nO
! cW_ovvo(m,b,e,j) = cW_ovvo(m,b,e,j) - t1(n,b)*v_oovo(m,n,e,j)
! end do
! end do
! end do
! end do
!end do
allocate(A_oovo(nO,nO,nV,nO), B_vovo(nV,nO,nV,nO))
!$OMP PARALLEL &
!$OMP SHARED(A_oovo,v_oovo,nO,nV) &
!$OMP PRIVATE(j,e,m,n) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do j=1,nO
do e=1,nV
do m=1,nO
do n=1,nO
A_oovo(n,m,e,j) = v_oovo(m,n,e,j)
end do
end do
end do
end do
!$OMP END DO
!$OMP END PARALLEL
call dgemm('T','N', nV, nO*nV*nO, nO, &
1d0, t1 , size(t1,1), &
A_oovo, size(A_oovo,1), &
0d0, B_vovo, size(B_vovo,1))
!$OMP PARALLEL &
!$OMP SHARED(cW_ovvo,B_vovo,nO,nV) &
!$OMP PRIVATE(j,e,m,b) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do j=1,nO
do e=1,nV
do b=1,nV
do m=1,nO
cW_ovvo(m,b,e,j) = cW_ovvo(m,b,e,j) - B_vovo(b,m,e,j)
end do
end do
end do
end do
!$OMP END DO
!$OMP END PARALLEL
deallocate(A_oovo,B_vovo)
!do j=1,nO
! do e=1,nV
! do b=1,nV
! do m=1,nO
! do f=1,nV
! do n=1,nO
! cW_ovvo(m,b,e,j) = cW_ovvo(m,b,e,j) &
! - ( 0.5d0*t2(j,n,f,b) + t1(j,f)*t1(n,b) )*v_oovv(m,n,e,f)
! end do
! end do
! end do
! end do
! end do
!end do
allocate(A_voov(nV,nO,nO,nV), B_voov(nV,nO,nO,nV), C_ovov(nO,nV,nO,nV))
!$OMP PARALLEL &
!$OMP SHARED(nO,nV,A_voov,B_voov,v_oovv,t2,t1) &
!$OMP PRIVATE(f,n,m,e,j,b) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do b = 1, nV
do j = 1, nO
do n = 1, nO
do f = 1, nV
A_voov(f,n,j,b) = 0.5d0*t2(j,n,f,b) + t1(j,f)*t1(n,b)
enddo
enddo
enddo
enddo
!$OMP END DO
!$OMP DO collapse(3)
do e = 1, nV
do m = 1, nO
do n = 1, nO
do f = 1, nV
B_voov(f,n,m,e) = v_oovv(m,n,e,f)
enddo
enddo
enddo
enddo
!$OMP END DO
!$OMP END PARALLEL
call dgemm('T','N', nO*nV, nV*nO, nV*nO, &
1d0, A_voov, size(A_voov,1) * size(A_voov,2), &
B_voov, size(B_voov,1) * size(B_voov,2), &
0d0, C_ovov, size(C_ovov,1) * size(C_ovov,2))
deallocate(A_voov,B_voov)
!$OMP PARALLEL &
!$OMP SHARED(cW_ovvo,C_ovov,nO,nV) &
!$OMP PRIVATE(j,e,m,b) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do j = 1, nO
do e = 1, nV
do b = 1, nV
do m = 1, nO
cW_ovvo(m,b,e,j) = cW_ovvo(m,b,e,j) - C_ovov(j,b,m,e)
enddo
enddo
enddo
enddo
!$OMP END DO
!$OMP END PARALLEL
deallocate(C_ovov)
end
! cW_vvvv
subroutine compute_cW_vvvv(nO,nV,t1,t2,tau,v_vvvv,v_vovv,v_oovv,cW_vvvv)
implicit none
integer,intent(in) :: nO,nV
double precision,intent(in) :: t1(nO,nV)
double precision,intent(in) :: t2(nO,nO,nV,nV)
double precision,intent(in) :: tau(nO,nO,nV,nV)
double precision,intent(in) :: v_oovv(nO,nO,nV,nV)
double precision,intent(in) :: v_vovv(nV,nO,nV,nV)
double precision,intent(in) :: v_vvvv(nV,nV,nV,nV)
double precision,intent(out) :: cW_vvvv(nV,nV,nV,nV)
integer :: i,j,m,n
integer :: a,b,c,d,e,f
double precision, allocatable :: A_ovvv(:,:,:,:), B_vvvv(:,:,:,:)
allocate(A_ovvv(nO,nV,nV,nV), B_vvvv(nV,nV,nV,nV))
!$OMP PARALLEL &
!$OMP SHARED(nO,nV,cW_vvvv,A_ovvv,v_vovv,v_vvvv) &
!$OMP PRIVATE(a,b,c,d,e,f,m) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do d = 1, nV
do c = 1, nV
do b = 1, nV
do a = 1, nV
cW_vvvv(a,b,c,d) = v_vvvv(a,b,c,d)
enddo
enddo
enddo
enddo
!$OMP END DO NOWAIT
!do f=1,nV
! do e=1,nV
! do b=1,nV
! do a=1,nV
! do m=1,nO
! cW_vvvv(a,b,e,f) = cW_vvvv(a,b,e,f) - t1(m,b)*v_vovv(a,m,e,f) + t1(m,a)*v_vovv(b,m,e,f)
! end do
! end do
! end do
! end do
!end do
!$OMP DO collapse(3)
do f=1,nV
do e=1,nV
do a=1,nV
do m=1,nO
A_ovvv(m,a,e,f) = v_vovv(a,m,e,f)
end do
end do
end do
end do
!$OMP END DO
!$OMP END PARALLEL
call dgemm('T','N', nV, nV*nV*nV, nO, &
1d0, t1 , size(t1,1), &
A_ovvv, size(A_ovvv,1), &
0d0, B_vvvv, size(B_vvvv,1))
!$OMP PARALLEL &
!$OMP SHARED(nO,nV,cW_vvvv,B_vvvv) &
!$OMP PRIVATE(a,b,c,d,e,f,m) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do f=1,nV
do e=1,nV
do b=1,nV
do a=1,nV
cW_vvvv(a,b,e,f) = cW_vvvv(a,b,e,f) - B_vvvv(b,a,e,f) + B_vvvv(a,b,e,f)
end do
end do
end do
end do
!$OMP END DO
!$OMP END PARALLEL
deallocate(A_ovvv,B_vvvv)
!do a=1,nV
! do b=1,nV
! do e=1,nV
! do f=1,nV
!
! do m=1,nO
! do n=1,nO
! cW_vvvv(a,b,e,f) = cW_vvvv(a,b,e,f) + 0.25d0*tau(m,n,a,b)*v_oovv(m,n,e,f)
! end do
! end do
! end do
! end do
! end do
!end do
call dgemm('T','N', nV*nV, nV*nV, nO*nO, &
0.25d0, tau , size(tau,1) * size(tau,2), &
v_oovv , size(v_oovv,1) * size(v_oovv,2), &
1.d0 , cW_vvvv, size(cW_vvvv,1) * size(cW_vvvv,2))
end
! cW_vvvf
subroutine compute_cW_vvvf(nO,nV,t1,t2,tau,f,v_vvvf,v_vovf,v_oovv,cW_vvvf)
implicit none
integer,intent(in) :: nO,nV,f
double precision,intent(in) :: t1(nO,nV)
double precision,intent(in) :: t2(nO,nO,nV,nV)
double precision,intent(in) :: tau(nO,nO,nV,nV)
double precision,intent(in) :: v_oovv(nO,nO,nV,nV)
double precision,intent(in) :: v_vovf(nV,nO,nV)
double precision,intent(in) :: v_vvvf(nV,nV,nV)
double precision,intent(out) :: cW_vvvf(nV,nV,nV)
integer :: i,j,m,n
integer :: a,b,c,d,e
double precision, allocatable :: A_ovvf(:,:,:), B_vvvf(:,:,:), v_oovf(:,:,:)
double precision :: ti,tf
allocate(A_ovvf(nO,nV,nV), B_vvvf(nV,nV,nV))
allocate(v_oovf(nO,nO,nV))
!$OMP PARALLEL &
!$OMP SHARED(nO,nV,cW_vvvf,A_ovvf,v_vovf,v_vvvf,f) &
!$OMP PRIVATE(a,b,c,d,e,m) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(2)
do c = 1, nV
do b = 1, nV
do a = 1, nV
!cW_vvvv(a,b,c,d) = v_vvvv(a,b,c,d)
cW_vvvf(a,b,c) = v_vvvf(a,b,c)
enddo
enddo
enddo
!$OMP END DO NOWAIT
!do f=1,nV
! do e=1,nV
! do b=1,nV
! do a=1,nV
! do m=1,nO
! cW_vvvv(a,b,e,f) = cW_vvvv(a,b,e,f) - t1(m,b)*v_vovv(a,m,e,f) + t1(m,a)*v_vovv(b,m,e,f)
! end do
! end do
! end do
! end do
!end do
!$OMP DO collapse(2)
do e=1,nV
do a=1,nV
do m=1,nO
!A_ovvv(m,a,e,f) = v_vovv(a,m,e,f)
!A_ovvf(m,a,e) = v_vovv(a,m,e,f)
A_ovvf(m,a,e) = v_vovf(a,m,e)
end do
end do
end do
!$OMP END DO
!$OMP END PARALLEL
call dgemm('T','N', nV, nV*nV, nO, &
1d0, t1 , size(t1,1), &
A_ovvf, size(A_ovvf,1), &
0d0, B_vvvf, size(B_vvvf,1))
!$OMP PARALLEL &
!$OMP SHARED(nO,nV,cW_vvvf,B_vvvf,v_oovf,v_oovv,f) &
!$OMP PRIVATE(a,b,c,d,e,m,n) &
!$OMP DEFAULT(NONE)
!$OMP DO collapse(3)
do e=1,nV
do b=1,nV
do a=1,nV
!cW_vvvv(a,b,e,f) = cW_vvvv(a,b,e,f) - B_vvvv(b,a,e,f) + B_vvvv(a,b,e,f)
cW_vvvf(a,b,e) = cW_vvvf(a,b,e) - B_vvvf(b,a,e) + B_vvvf(a,b,e)
end do
end do
end do
!$OMP END DO NOWAIT
!deallocate(A_ovvf,B_vvvf)
!do a=1,nV
! do b=1,nV
! do e=1,nV
! do f=1,nV
!
! do m=1,nO
! do n=1,nO
! cW_vvvv(a,b,e,f) = cW_vvvv(a,b,e,f) + 0.25d0*tau(m,n,a,b)*v_oovv(m,n,e,f)
! end do
! end do
! end do
! end do
! end do
!end do
!$OMP DO collapse(2)
do e = 1, nV
do n = 1, nO
do m = 1, nO
v_oovf(m,n,e) = v_oovv(m,n,e,f)
enddo
enddo
enddo
!$OMP END DO
!$OMP END PARALLEL
call dgemm('T','N', nV*nV, nV, nO*nO, &
0.25d0, tau , size(tau,1) * size(tau,2), &
v_oovf , size(v_oovf,1) * size(v_oovf,2), &
1.d0 , cW_vvvf, size(cW_vvvf,1) * size(cW_vvvf,2))
deallocate(v_oovf)
deallocate(A_ovvf,B_vvvf)
end