9
1
mirror of https://github.com/QuantumPackage/qp2.git synced 2024-06-02 02:35:18 +02:00
qp2/src/two_body_rdm/state_av_full_orb_2_rdm.irp.f

623 lines
22 KiB
Fortran
Raw Permalink Normal View History

2020-03-19 15:57:49 +01:00
2020-03-22 17:21:49 +01:00
BEGIN_PROVIDER [double precision, state_av_full_occ_2_rdm_ab_mo, (n_core_inact_act_orb,n_core_inact_act_orb,n_core_inact_act_orb,n_core_inact_act_orb)]
2020-03-19 15:57:49 +01:00
implicit none
2020-03-22 17:21:49 +01:00
state_av_full_occ_2_rdm_ab_mo = 0.d0
2020-03-22 17:15:39 +01:00
integer :: i,j,k,l,iorb,jorb,korb,lorb
2020-03-19 15:57:49 +01:00
BEGIN_DOC
2023-08-22 10:49:59 +02:00
! state_av_full_occ_2_rdm_ab_mo(i,j,k,l) = STATE AVERAGE physicist notation for 2RDM of alpha/beta + beta/alpha electrons
2020-03-19 15:57:49 +01:00
!
! = \sum_{istate} w(istate) * <Psi_{istate}| a^{\dagger}_{i,alpha} a^{\dagger}_{j,beta} a_{l,beta} a_{k,alpha} |Psi_{istate}>
2020-03-19 15:57:49 +01:00
!
2023-11-11 16:13:23 +01:00
! WHERE ALL ORBITALS (i,j,k,l) BELONG TO ALL OCCUPIED ORBITALS : core, inactive and active
2020-03-19 15:57:49 +01:00
!
! THE NORMALIZATION (i.e. sum of diagonal elements) IS SET TO N_{\alpha} * N_{\beta} * 2
2020-03-19 15:57:49 +01:00
!
2023-08-22 10:49:59 +02:00
! !!!!! WARNING !!!!! ALL SLATER DETERMINANTS IN PSI_DET MUST BELONG TO AN ACTIVE SPACE DEFINED BY "list_act"
!
! !!!!! WARNING !!!!! IF "no_core_density" then all elements involving at least one CORE MO is set to zero
END_DOC
PROVIDE n_core_orb list_core
2020-03-22 17:21:49 +01:00
state_av_full_occ_2_rdm_ab_mo = 0.d0
2023-08-22 10:49:59 +02:00
!$OMP PARALLEL PRIVATE(i,j,k,l,iorb,jorb,korb,lorb) &
!$OMP DEFAULT(NONE) SHARED(n_act_orb, n_inact_orb, n_core_orb, &
!$OMP list_core, list_act, list_inact, no_core_density, &
!$OMP one_e_dm_mo_alpha_average, one_e_dm_mo_beta_average, &
!$OMP state_av_act_2_rdm_ab_mo, state_av_full_occ_2_rdm_ab_mo)
!$OMP DO
2020-03-19 15:57:49 +01:00
do i = 1, n_act_orb
iorb = list_act(i)
do j = 1, n_act_orb
jorb = list_act(j)
do k = 1, n_act_orb
korb = list_act(k)
do l = 1, n_act_orb
lorb = list_act(l)
2023-08-22 10:49:59 +02:00
! alph beta alph beta
state_av_full_occ_2_rdm_ab_mo(lorb,korb,jorb,iorb) = &
2020-03-22 17:21:49 +01:00
state_av_act_2_rdm_ab_mo(l,k,j,i)
2020-03-19 15:57:49 +01:00
enddo
enddo
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
!! BETA ACTIVE - ALPHA inactive
!!
!$OMP DO
2020-03-19 15:57:49 +01:00
do i = 1, n_act_orb
iorb = list_act(i)
do j = 1, n_act_orb
jorb = list_act(j)
do k = 1, n_inact_orb
korb = list_inact(k)
! alph beta alph beta
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_ab_mo(korb,jorb,korb,iorb) = 2.d0 * one_e_dm_mo_beta_average(jorb,iorb)
2020-03-19 15:57:49 +01:00
enddo
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
2020-03-19 15:57:49 +01:00
2023-08-22 10:49:59 +02:00
!! ALPHA ACTIVE - BETA inactive
!!
!$OMP DO
2020-03-19 15:57:49 +01:00
do i = 1, n_act_orb
iorb = list_act(i)
do j = 1, n_act_orb
jorb = list_act(j)
do k = 1, n_inact_orb
korb = list_inact(k)
! alph beta alph beta
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_ab_mo(jorb,korb,iorb,korb) = 2.d0 * one_e_dm_mo_alpha_average(jorb,iorb)
2020-03-19 15:57:49 +01:00
enddo
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
2020-03-19 15:57:49 +01:00
2023-08-22 10:49:59 +02:00
!! ALPHA INACTIVE - BETA INACTIVE
!!
!$OMP DO
2020-03-19 15:57:49 +01:00
do j = 1, n_inact_orb
jorb = list_inact(j)
do k = 1, n_inact_orb
korb = list_inact(k)
! alph beta alph beta
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_ab_mo(korb,jorb,korb,jorb) = 2.D0
2020-03-19 15:57:49 +01:00
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
2020-03-19 15:57:49 +01:00
!!!!!!!!!!!!
2023-08-22 10:49:59 +02:00
!!!!!!!!!!!! if "no_core_density" then you don't put the core part
!!!!!!!!!!!! CAN BE USED
2020-03-19 15:57:49 +01:00
if (.not.no_core_density)then
2023-08-22 10:49:59 +02:00
!! BETA ACTIVE - ALPHA CORE
!!
!$OMP DO
2020-03-19 15:57:49 +01:00
do i = 1, n_act_orb
iorb = list_act(i)
do j = 1, n_act_orb
jorb = list_act(j)
do k = 1, n_core_orb
korb = list_core(k)
! alph beta alph beta
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_ab_mo(korb,jorb,korb,iorb) = 2.d0 * one_e_dm_mo_beta_average(jorb,iorb)
2020-03-19 15:57:49 +01:00
enddo
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
2020-03-19 15:57:49 +01:00
!! ALPHA ACTIVE - BETA CORE
2023-08-22 10:49:59 +02:00
!!
!$OMP DO
2020-03-19 15:57:49 +01:00
do i = 1, n_act_orb
iorb = list_act(i)
do j = 1, n_act_orb
jorb = list_act(j)
do k = 1, n_core_orb
korb = list_core(k)
! alph beta alph beta
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_ab_mo(jorb,korb,iorb,korb) = 2.d0 * one_e_dm_mo_alpha_average(jorb,iorb)
2020-03-19 15:57:49 +01:00
enddo
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
2020-03-19 15:57:49 +01:00
2023-08-22 10:49:59 +02:00
!! ALPHA CORE - BETA CORE
!!
!$OMP DO
2020-03-19 15:57:49 +01:00
do j = 1, n_core_orb
jorb = list_core(j)
do k = 1, n_core_orb
korb = list_core(k)
! alph beta alph beta
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_ab_mo(korb,jorb,korb,jorb) = 2.D0
2020-03-19 15:57:49 +01:00
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
2020-03-19 15:57:49 +01:00
endif
2023-08-22 10:49:59 +02:00
!$OMP END PARALLEL
END_PROVIDER
2020-03-19 15:57:49 +01:00
2020-03-22 17:21:49 +01:00
BEGIN_PROVIDER [double precision, state_av_full_occ_2_rdm_aa_mo, (n_core_inact_act_orb,n_core_inact_act_orb,n_core_inact_act_orb,n_core_inact_act_orb)]
2020-03-19 15:57:49 +01:00
implicit none
2020-03-22 17:21:49 +01:00
state_av_full_occ_2_rdm_aa_mo = 0.d0
2020-03-22 17:15:39 +01:00
integer :: i,j,k,l,iorb,jorb,korb,lorb
2020-03-19 15:57:49 +01:00
BEGIN_DOC
2023-08-22 10:49:59 +02:00
! state_av_full_occ_2_rdm_aa_mo(i,j,k,l) = STATE AVERAGE physicist notation for 2RDM of alpha/alpha electrons
2020-03-19 15:57:49 +01:00
!
! = \sum_{istate} w(istate) * <Psi_{istate}| a^{\dagger}_{i,alpha} a^{\dagger}_{j,alpha} a_{l,alpha} a_{k,alpha} |Psi_{istate}>
2020-03-19 15:57:49 +01:00
!
2023-11-11 16:13:23 +01:00
! WHERE ALL ORBITALS (i,j,k,l) BELONG TO ALL OCCUPIED ORBITALS : core, inactive and active
!
! THE NORMALIZATION (i.e. sum of diagonal elements) IS SET TO N_{\alpha} * (N_{\alpha} - 1)
2020-03-19 15:57:49 +01:00
!
2023-08-22 10:49:59 +02:00
! !!!!! WARNING !!!!! ALL SLATER DETERMINANTS IN PSI_DET MUST BELONG TO AN ACTIVE SPACE DEFINED BY "list_act"
2020-03-19 15:57:49 +01:00
!
2023-08-22 10:49:59 +02:00
! !!!!! WARNING !!!!! IF "no_core_density" then all elements involving at least one CORE MO is set to zero
END_DOC
2020-03-19 15:57:49 +01:00
2023-08-22 10:49:59 +02:00
PROVIDE n_core_orb list_core
!$OMP PARALLEL PRIVATE(i,j,k,l,iorb,jorb,korb,lorb) &
!$OMP DEFAULT(NONE) SHARED(n_act_orb, n_inact_orb, n_core_orb, &
!$OMP list_core, list_act, list_inact, no_core_density, &
!$OMP one_e_dm_mo_alpha_average, one_e_dm_mo_beta_average, &
!$OMP state_av_act_2_rdm_aa_mo, state_av_full_occ_2_rdm_aa_mo)
2020-03-19 15:57:49 +01:00
!! PURE ACTIVE PART ALPHA-ALPHA
2023-08-22 10:49:59 +02:00
!!
!$OMP DO
2020-03-19 15:57:49 +01:00
do i = 1, n_act_orb
iorb = list_act(i)
do j = 1, n_act_orb
jorb = list_act(j)
do k = 1, n_act_orb
korb = list_act(k)
do l = 1, n_act_orb
lorb = list_act(l)
2020-03-22 17:21:49 +01:00
state_av_full_occ_2_rdm_aa_mo(lorb,korb,jorb,iorb) = &
state_av_act_2_rdm_aa_mo(l,k,j,i)
2020-03-19 15:57:49 +01:00
enddo
enddo
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
!! ALPHA ACTIVE - ALPHA inactive
!!
!$OMP DO
2020-03-19 15:57:49 +01:00
do i = 1, n_act_orb
iorb = list_act(i)
do j = 1, n_act_orb
jorb = list_act(j)
do k = 1, n_inact_orb
korb = list_inact(k)
2023-08-22 10:49:59 +02:00
! 1 2 1 2 : DIRECT TERM
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_aa_mo(korb,jorb,korb,iorb) += 1.0d0 * one_e_dm_mo_alpha_average(jorb,iorb)
state_av_full_occ_2_rdm_aa_mo(jorb,korb,iorb,korb) += 1.0d0 * one_e_dm_mo_alpha_average(jorb,iorb)
2023-08-22 10:49:59 +02:00
! 1 2 1 2 : EXCHANGE TERM
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_aa_mo(jorb,korb,korb,iorb) += -1.0d0 * one_e_dm_mo_alpha_average(jorb,iorb)
state_av_full_occ_2_rdm_aa_mo(korb,jorb,iorb,korb) += -1.0d0 * one_e_dm_mo_alpha_average(jorb,iorb)
2020-03-19 15:57:49 +01:00
enddo
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
2020-03-19 15:57:49 +01:00
2023-08-22 10:49:59 +02:00
!! ALPHA INACTIVE - ALPHA INACTIVE
!$OMP DO
2020-03-19 15:57:49 +01:00
do j = 1, n_inact_orb
jorb = list_inact(j)
do k = 1, n_inact_orb
korb = list_inact(k)
2023-08-22 10:49:59 +02:00
state_av_full_occ_2_rdm_aa_mo(korb,jorb,korb,jorb) += 1.0d0
state_av_full_occ_2_rdm_aa_mo(korb,jorb,jorb,korb) -= 1.0d0
2020-03-19 15:57:49 +01:00
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
2020-03-19 15:57:49 +01:00
!!!!!!!!!!
2023-08-22 10:49:59 +02:00
!!!!!!!!!! if "no_core_density" then you don't put the core part
!!!!!!!!!! CAN BE USED
2020-03-19 15:57:49 +01:00
if (.not.no_core_density)then
2023-08-22 10:49:59 +02:00
!! ALPHA ACTIVE - ALPHA CORE
!$OMP DO
2020-03-19 15:57:49 +01:00
do i = 1, n_act_orb
iorb = list_act(i)
do j = 1, n_act_orb
jorb = list_act(j)
do k = 1, n_core_orb
korb = list_core(k)
2023-08-22 10:49:59 +02:00
! 1 2 1 2 : DIRECT TERM
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_aa_mo(korb,jorb,korb,iorb) += 1.0d0 * one_e_dm_mo_alpha_average(jorb,iorb)
state_av_full_occ_2_rdm_aa_mo(jorb,korb,iorb,korb) += 1.0d0 * one_e_dm_mo_alpha_average(jorb,iorb)
2023-08-22 10:49:59 +02:00
! 1 2 1 2 : EXCHANGE TERM
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_aa_mo(jorb,korb,korb,iorb) += -1.0d0 * one_e_dm_mo_alpha_average(jorb,iorb)
state_av_full_occ_2_rdm_aa_mo(korb,jorb,iorb,korb) += -1.0d0 * one_e_dm_mo_alpha_average(jorb,iorb)
2020-03-19 15:57:49 +01:00
enddo
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
!! ALPHA CORE - ALPHA CORE
!$OMP DO
2020-03-19 15:57:49 +01:00
do j = 1, n_core_orb
jorb = list_core(j)
do k = 1, n_core_orb
korb = list_core(k)
2023-08-22 10:49:59 +02:00
state_av_full_occ_2_rdm_aa_mo(korb,jorb,korb,jorb) += 1.0d0
state_av_full_occ_2_rdm_aa_mo(korb,jorb,jorb,korb) -= 1.0d0
2020-03-19 15:57:49 +01:00
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
2020-03-19 15:57:49 +01:00
endif
2023-08-22 10:49:59 +02:00
!$OMP END PARALLEL
END_PROVIDER
2020-03-19 15:57:49 +01:00
2020-03-22 17:21:49 +01:00
BEGIN_PROVIDER [double precision, state_av_full_occ_2_rdm_bb_mo, (n_core_inact_act_orb,n_core_inact_act_orb,n_core_inact_act_orb,n_core_inact_act_orb)]
2020-03-19 15:57:49 +01:00
implicit none
2020-03-22 17:21:49 +01:00
state_av_full_occ_2_rdm_bb_mo = 0.d0
2020-03-22 17:15:39 +01:00
integer :: i,j,k,l,iorb,jorb,korb,lorb
2020-03-19 15:57:49 +01:00
BEGIN_DOC
2023-08-22 10:49:59 +02:00
! state_av_full_occ_2_rdm_bb_mo(i,j,k,l) = STATE AVERAGE physicist notation for 2RDM of beta/beta electrons
2020-03-19 15:57:49 +01:00
!
! = \sum_{istate} w(istate) * <Psi_{istate}| a^{\dagger}_{i,beta} a^{\dagger}_{j,beta} a_{l,beta} a_{k,beta} |Psi_{istate}>
2020-03-19 15:57:49 +01:00
!
2023-11-11 16:13:23 +01:00
! WHERE ALL ORBITALS (i,j,k,l) BELONG TO ALL OCCUPIED ORBITALS : core, inactive and active
2020-03-19 15:57:49 +01:00
!
! THE NORMALIZATION (i.e. sum of diagonal elements) IS SET TO N_{\beta} * (N_{\beta} - 1)
!
2023-08-22 10:49:59 +02:00
! !!!!! WARNING !!!!! ALL SLATER DETERMINANTS IN PSI_DET MUST BELONG TO AN ACTIVE SPACE DEFINED BY "list_act"
2020-03-19 15:57:49 +01:00
!
2023-08-22 10:49:59 +02:00
! !!!!! WARNING !!!!! IF "no_core_density" then all elements involving at least one CORE MO is set to zero
END_DOC
2020-03-19 15:57:49 +01:00
2023-08-22 10:49:59 +02:00
PROVIDE n_core_orb list_core
!$OMP PARALLEL PRIVATE(i,j,k,l,iorb,jorb,korb,lorb) &
!$OMP DEFAULT(NONE) SHARED(n_act_orb, n_inact_orb, n_core_orb, &
!$OMP list_core, list_act, list_inact, no_core_density, &
!$OMP one_e_dm_mo_alpha_average, one_e_dm_mo_beta_average, &
!$OMP state_av_act_2_rdm_bb_mo, state_av_full_occ_2_rdm_bb_mo)
2020-03-19 15:57:49 +01:00
!! PURE ACTIVE PART beta-beta
2023-08-22 10:49:59 +02:00
!!
!$OMP DO
2020-03-19 15:57:49 +01:00
do i = 1, n_act_orb
iorb = list_act(i)
do j = 1, n_act_orb
jorb = list_act(j)
do k = 1, n_act_orb
korb = list_act(k)
do l = 1, n_act_orb
lorb = list_act(l)
2023-08-22 10:49:59 +02:00
state_av_full_occ_2_rdm_bb_mo(lorb,korb,jorb,iorb) = &
2020-03-22 17:21:49 +01:00
state_av_act_2_rdm_bb_mo(l,k,j,i)
2020-03-19 15:57:49 +01:00
enddo
enddo
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
!! beta ACTIVE - beta inactive
!!
!$OMP DO
2020-03-19 15:57:49 +01:00
do i = 1, n_act_orb
iorb = list_act(i)
do j = 1, n_act_orb
jorb = list_act(j)
do k = 1, n_inact_orb
korb = list_inact(k)
2023-08-22 10:49:59 +02:00
! 1 2 1 2 : DIRECT TERM
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_bb_mo(korb,jorb,korb,iorb) += 1.0d0 * one_e_dm_mo_beta_average(jorb,iorb)
state_av_full_occ_2_rdm_bb_mo(jorb,korb,iorb,korb) += 1.0d0 * one_e_dm_mo_beta_average(jorb,iorb)
2023-08-22 10:49:59 +02:00
! 1 2 1 2 : EXCHANGE TERM
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_bb_mo(jorb,korb,korb,iorb) += -1.0d0 * one_e_dm_mo_beta_average(jorb,iorb)
state_av_full_occ_2_rdm_bb_mo(korb,jorb,iorb,korb) += -1.0d0 * one_e_dm_mo_beta_average(jorb,iorb)
2020-03-19 15:57:49 +01:00
enddo
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
2020-03-19 15:57:49 +01:00
2023-08-22 10:49:59 +02:00
!! beta INACTIVE - beta INACTIVE
!$OMP DO
2020-03-19 15:57:49 +01:00
do j = 1, n_inact_orb
jorb = list_inact(j)
do k = 1, n_inact_orb
korb = list_inact(k)
2023-08-22 10:49:59 +02:00
state_av_full_occ_2_rdm_bb_mo(korb,jorb,korb,jorb) += 1.0d0
state_av_full_occ_2_rdm_bb_mo(korb,jorb,jorb,korb) -= 1.0d0
2020-03-19 15:57:49 +01:00
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
2020-03-19 15:57:49 +01:00
!!!!!!!!!!!!
2023-08-22 10:49:59 +02:00
!!!!!!!!!!!! if "no_core_density" then you don't put the core part
!!!!!!!!!!!! CAN BE USED
2020-03-19 15:57:49 +01:00
if (.not.no_core_density)then
2023-08-22 10:49:59 +02:00
!! beta ACTIVE - beta CORE
!$OMP DO
2020-03-19 15:57:49 +01:00
do i = 1, n_act_orb
iorb = list_act(i)
do j = 1, n_act_orb
jorb = list_act(j)
do k = 1, n_core_orb
korb = list_core(k)
2023-08-22 10:49:59 +02:00
! 1 2 1 2 : DIRECT TERM
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_bb_mo(korb,jorb,korb,iorb) += 1.0d0 * one_e_dm_mo_beta_average(jorb,iorb)
state_av_full_occ_2_rdm_bb_mo(jorb,korb,iorb,korb) += 1.0d0 * one_e_dm_mo_beta_average(jorb,iorb)
2023-08-22 10:49:59 +02:00
! 1 2 1 2 : EXCHANGE TERM
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_bb_mo(jorb,korb,korb,iorb) += -1.0d0 * one_e_dm_mo_beta_average(jorb,iorb)
state_av_full_occ_2_rdm_bb_mo(korb,jorb,iorb,korb) += -1.0d0 * one_e_dm_mo_beta_average(jorb,iorb)
2020-03-19 15:57:49 +01:00
enddo
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
!! beta CORE - beta CORE
!$OMP DO
2020-03-19 15:57:49 +01:00
do j = 1, n_core_orb
jorb = list_core(j)
do k = 1, n_core_orb
korb = list_core(k)
2023-08-22 10:49:59 +02:00
state_av_full_occ_2_rdm_bb_mo(korb,jorb,korb,jorb) += 1.0d0
state_av_full_occ_2_rdm_bb_mo(korb,jorb,jorb,korb) -= 1.0d0
2020-03-19 15:57:49 +01:00
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
2020-03-19 15:57:49 +01:00
endif
2023-08-22 10:49:59 +02:00
!$OMP END PARALLEL
2020-03-19 15:57:49 +01:00
2023-08-22 10:49:59 +02:00
END_PROVIDER
2020-03-19 15:57:49 +01:00
2020-03-22 17:21:49 +01:00
BEGIN_PROVIDER [double precision, state_av_full_occ_2_rdm_spin_trace_mo, (n_core_inact_act_orb,n_core_inact_act_orb,n_core_inact_act_orb,n_core_inact_act_orb)]
2020-03-19 15:57:49 +01:00
implicit none
2020-03-22 17:21:49 +01:00
state_av_full_occ_2_rdm_spin_trace_mo = 0.d0
2020-03-22 17:15:39 +01:00
integer :: i,j,k,l,iorb,jorb,korb,lorb
2020-03-19 15:57:49 +01:00
BEGIN_DOC
2023-08-22 10:49:59 +02:00
! state_av_full_occ_2_rdm_bb_mo(i,j,k,l) = STATE AVERAGE physicist notation for 2RDM of beta/beta electrons
2020-03-19 15:57:49 +01:00
!
! = \sum_{istate} w(istate) * \sum_{sigma,sigma'} <Psi_{istate}| a^{\dagger}_{i,sigma} a^{\dagger'}_{j,sigma} a_{l,sigma'} a_{k,sigma} |Psi_{istate}>
2020-03-19 15:57:49 +01:00
!
!
2023-11-11 16:13:23 +01:00
! WHERE ALL ORBITALS (i,j,k,l) BELONG TO ALL OCCUPIED ORBITALS : core, inactive and active
!
! THE NORMALIZATION (i.e. sum of diagonal elements) IS SET TO N_{elec} * (N_{elec} - 1)
!
2023-08-22 10:49:59 +02:00
! !!!!! WARNING !!!!! ALL SLATER DETERMINANTS IN PSI_DET MUST BELONG TO AN ACTIVE SPACE DEFINED BY "list_act"
2020-03-19 15:57:49 +01:00
!
2023-08-22 10:49:59 +02:00
! !!!!! WARNING !!!!! IF "no_core_density" then all elements involving at least one CORE MO is set to zero
END_DOC
2020-03-19 15:57:49 +01:00
2023-08-22 10:49:59 +02:00
PROVIDE n_core_orb list_core
!$OMP PARALLEL PRIVATE(i,j,k,l,iorb,jorb,korb,lorb) &
!$OMP DEFAULT(NONE) SHARED(n_act_orb, n_inact_orb, n_core_orb, &
!$OMP list_core, list_act, list_inact, no_core_density, &
!$OMP one_e_dm_mo_alpha_average, one_e_dm_mo_beta_average, &
!$OMP state_av_act_2_rdm_spin_trace_mo, state_av_full_occ_2_rdm_spin_trace_mo)
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
2020-03-19 15:57:49 +01:00
!! PURE ACTIVE PART SPIN-TRACE
2023-08-22 10:49:59 +02:00
!$OMP DO
2020-03-19 15:57:49 +01:00
do i = 1, n_act_orb
iorb = list_act(i)
do j = 1, n_act_orb
jorb = list_act(j)
do k = 1, n_act_orb
korb = list_act(k)
do l = 1, n_act_orb
lorb = list_act(l)
2023-08-22 10:49:59 +02:00
state_av_full_occ_2_rdm_spin_trace_mo(lorb,korb,jorb,iorb) += &
2020-03-22 17:21:49 +01:00
state_av_act_2_rdm_spin_trace_mo(l,k,j,i)
2020-03-19 15:57:49 +01:00
enddo
enddo
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
2020-03-19 15:57:49 +01:00
2023-08-22 10:49:59 +02:00
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
2020-03-19 15:57:49 +01:00
!!!!! BETA-BETA !!!!!
2023-08-22 10:49:59 +02:00
!! beta ACTIVE - beta inactive
!$OMP DO
2020-03-19 15:57:49 +01:00
do i = 1, n_act_orb
iorb = list_act(i)
do j = 1, n_act_orb
jorb = list_act(j)
do k = 1, n_inact_orb
korb = list_inact(k)
2023-08-22 10:49:59 +02:00
! 1 2 1 2 : DIRECT TERM
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,korb,iorb) += 1.0d0 * one_e_dm_mo_beta_average(jorb,iorb)
state_av_full_occ_2_rdm_spin_trace_mo(jorb,korb,iorb,korb) += 1.0d0 * one_e_dm_mo_beta_average(jorb,iorb)
2023-08-22 10:49:59 +02:00
! 1 2 1 2 : EXCHANGE TERM
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_spin_trace_mo(jorb,korb,korb,iorb) += -1.0d0 * one_e_dm_mo_beta_average(jorb,iorb)
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,iorb,korb) += -1.0d0 * one_e_dm_mo_beta_average(jorb,iorb)
2020-03-19 15:57:49 +01:00
enddo
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
!! beta INACTIVE - beta INACTIVE
!$OMP DO
2020-03-19 15:57:49 +01:00
do j = 1, n_inact_orb
jorb = list_inact(j)
do k = 1, n_inact_orb
korb = list_inact(k)
2023-08-22 10:49:59 +02:00
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,korb,jorb) += 1.0d0
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,jorb,korb) -= 1.0d0
2020-03-19 15:57:49 +01:00
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
2020-03-19 15:57:49 +01:00
if (.not.no_core_density)then
2023-08-22 10:49:59 +02:00
!! beta ACTIVE - beta CORE
!$OMP DO
2020-03-19 15:57:49 +01:00
do i = 1, n_act_orb
iorb = list_act(i)
do j = 1, n_act_orb
jorb = list_act(j)
do k = 1, n_core_orb
korb = list_core(k)
2023-08-22 10:49:59 +02:00
! 1 2 1 2 : DIRECT TERM
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,korb,iorb) += 1.0d0 * one_e_dm_mo_beta_average(jorb,iorb)
state_av_full_occ_2_rdm_spin_trace_mo(jorb,korb,iorb,korb) += 1.0d0 * one_e_dm_mo_beta_average(jorb,iorb)
2023-08-22 10:49:59 +02:00
! 1 2 1 2 : EXCHANGE TERM
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_spin_trace_mo(jorb,korb,korb,iorb) += -1.0d0 * one_e_dm_mo_beta_average(jorb,iorb)
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,iorb,korb) += -1.0d0 * one_e_dm_mo_beta_average(jorb,iorb)
2020-03-19 15:57:49 +01:00
enddo
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
!! beta CORE - beta CORE
!$OMP DO
2020-03-19 15:57:49 +01:00
do j = 1, n_core_orb
jorb = list_core(j)
do k = 1, n_core_orb
korb = list_core(k)
2023-08-22 10:49:59 +02:00
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,korb,jorb) += 1.0d0
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,jorb,korb) -= 1.0d0
2020-03-19 15:57:49 +01:00
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
2020-03-19 15:57:49 +01:00
endif
2023-08-22 10:49:59 +02:00
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
2020-03-19 15:57:49 +01:00
!!!!! ALPHA-ALPHA !!!!!
2023-08-22 10:49:59 +02:00
!! ALPHA ACTIVE - ALPHA inactive
!$OMP DO
2020-03-19 15:57:49 +01:00
do i = 1, n_act_orb
iorb = list_act(i)
do j = 1, n_act_orb
jorb = list_act(j)
do k = 1, n_inact_orb
korb = list_inact(k)
2023-08-22 10:49:59 +02:00
! 1 2 1 2 : DIRECT TERM
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,korb,iorb) += 1.0d0 * one_e_dm_mo_alpha_average(jorb,iorb)
state_av_full_occ_2_rdm_spin_trace_mo(jorb,korb,iorb,korb) += 1.0d0 * one_e_dm_mo_alpha_average(jorb,iorb)
2023-08-22 10:49:59 +02:00
! 1 2 1 2 : EXCHANGE TERM
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_spin_trace_mo(jorb,korb,korb,iorb) += -1.0d0 * one_e_dm_mo_alpha_average(jorb,iorb)
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,iorb,korb) += -1.0d0 * one_e_dm_mo_alpha_average(jorb,iorb)
2020-03-19 15:57:49 +01:00
enddo
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
!! ALPHA INACTIVE - ALPHA INACTIVE
!$OMP DO
2020-03-19 15:57:49 +01:00
do j = 1, n_inact_orb
jorb = list_inact(j)
do k = 1, n_inact_orb
korb = list_inact(k)
2023-08-22 10:49:59 +02:00
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,korb,jorb) += 1.0d0
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,jorb,korb) -= 1.0d0
2020-03-19 15:57:49 +01:00
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
2020-03-19 15:57:49 +01:00
if (.not.no_core_density)then
2023-08-22 10:49:59 +02:00
!! ALPHA ACTIVE - ALPHA CORE
!$OMP DO
2020-03-19 15:57:49 +01:00
do i = 1, n_act_orb
iorb = list_act(i)
do j = 1, n_act_orb
jorb = list_act(j)
do k = 1, n_core_orb
korb = list_core(k)
2023-08-22 10:49:59 +02:00
! 1 2 1 2 : DIRECT TERM
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,korb,iorb) += 1.0d0 * one_e_dm_mo_alpha_average(jorb,iorb)
state_av_full_occ_2_rdm_spin_trace_mo(jorb,korb,iorb,korb) += 1.0d0 * one_e_dm_mo_alpha_average(jorb,iorb)
2023-08-22 10:49:59 +02:00
! 1 2 1 2 : EXCHANGE TERM
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_spin_trace_mo(jorb,korb,korb,iorb) += -1.0d0 * one_e_dm_mo_alpha_average(jorb,iorb)
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,iorb,korb) += -1.0d0 * one_e_dm_mo_alpha_average(jorb,iorb)
2020-03-19 15:57:49 +01:00
enddo
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
!! ALPHA CORE - ALPHA CORE
!$OMP DO
2020-03-19 15:57:49 +01:00
do j = 1, n_core_orb
jorb = list_core(j)
do k = 1, n_core_orb
korb = list_core(k)
2023-08-22 10:49:59 +02:00
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,korb,jorb) += 1.0d0
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,jorb,korb) -= 1.0d0
2020-03-19 15:57:49 +01:00
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
2020-03-19 15:57:49 +01:00
endif
2023-08-22 10:49:59 +02:00
!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!
2020-03-19 15:57:49 +01:00
!!!!! ALPHA-BETA + BETA-ALPHA !!!!!
2023-08-22 10:49:59 +02:00
!$OMP DO
2020-03-19 15:57:49 +01:00
do i = 1, n_act_orb
iorb = list_act(i)
do j = 1, n_act_orb
jorb = list_act(j)
do k = 1, n_inact_orb
korb = list_inact(k)
! ALPHA INACTIVE - BETA ACTIVE
! alph beta alph beta
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,korb,iorb) += 1.0d0 * one_e_dm_mo_beta_average(jorb,iorb)
2020-03-19 15:57:49 +01:00
! beta alph beta alph
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_spin_trace_mo(jorb,korb,iorb,korb) += 1.0d0 * one_e_dm_mo_beta_average(jorb,iorb)
2020-03-19 15:57:49 +01:00
! BETA INACTIVE - ALPHA ACTIVE
2023-08-22 10:49:59 +02:00
! beta alph beta alpha
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,korb,iorb) += 1.0d0 * one_e_dm_mo_alpha_average(jorb,iorb)
2023-08-22 10:49:59 +02:00
! alph beta alph beta
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_spin_trace_mo(jorb,korb,iorb,korb) += 1.0d0 * one_e_dm_mo_alpha_average(jorb,iorb)
2020-03-19 15:57:49 +01:00
enddo
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
!! ALPHA INACTIVE - BETA INACTIVE
!$OMP DO
2020-03-19 15:57:49 +01:00
do j = 1, n_inact_orb
jorb = list_inact(j)
do k = 1, n_inact_orb
korb = list_inact(k)
! alph beta alph beta
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,korb,jorb) += 1.0d0
state_av_full_occ_2_rdm_spin_trace_mo(jorb,korb,jorb,korb) += 1.0d0
2020-03-19 15:57:49 +01:00
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
2020-03-19 15:57:49 +01:00
!!!!!!!!!!!!
2023-08-22 10:49:59 +02:00
!!!!!!!!!!!! if "no_core_density" then you don't put the core part
!!!!!!!!!!!! CAN BE USED
2020-03-19 15:57:49 +01:00
if (.not.no_core_density)then
2023-08-22 10:49:59 +02:00
!$OMP DO
2020-03-19 15:57:49 +01:00
do i = 1, n_act_orb
iorb = list_act(i)
do j = 1, n_act_orb
jorb = list_act(j)
do k = 1, n_core_orb
korb = list_core(k)
2023-08-22 10:49:59 +02:00
!! BETA ACTIVE - ALPHA CORE
2020-03-19 15:57:49 +01:00
! alph beta alph beta
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,korb,iorb) += 1.0D0 * one_e_dm_mo_beta_average(jorb,iorb)
2023-08-22 10:49:59 +02:00
! beta alph beta alph
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_spin_trace_mo(jorb,korb,iorb,korb) += 1.0D0 * one_e_dm_mo_beta_average(jorb,iorb)
2023-08-22 10:49:59 +02:00
!! ALPHA ACTIVE - BETA CORE
2020-03-19 15:57:49 +01:00
! alph beta alph beta
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_spin_trace_mo(jorb,korb,iorb,korb) += 1.0D0 * one_e_dm_mo_alpha_average(jorb,iorb)
2023-08-22 10:49:59 +02:00
! beta alph beta alph
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,korb,iorb) += 1.0D0 * one_e_dm_mo_alpha_average(jorb,iorb)
2020-03-19 15:57:49 +01:00
enddo
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
!! ALPHA CORE - BETA CORE
!$OMP DO
2020-03-19 15:57:49 +01:00
do j = 1, n_core_orb
jorb = list_core(j)
do k = 1, n_core_orb
korb = list_core(k)
! alph beta alph beta
2023-02-27 17:33:43 +01:00
state_av_full_occ_2_rdm_spin_trace_mo(korb,jorb,korb,jorb) += 1.0D0
state_av_full_occ_2_rdm_spin_trace_mo(jorb,korb,jorb,korb) += 1.0D0
2020-03-19 15:57:49 +01:00
enddo
enddo
2023-08-22 10:49:59 +02:00
!$OMP END DO
2020-03-19 15:57:49 +01:00
endif
2023-08-22 10:49:59 +02:00
!$OMP END PARALLEL
2020-03-19 15:57:49 +01:00
2023-08-22 10:49:59 +02:00
END_PROVIDER
2023-11-11 16:13:23 +01:00