#+title: Configuration Sigma Vector Helpers #+author: Vijay Gopal Chilkuri #+email: vijay.gopal.c@gmail.com * Generate the singly excited configurations on-the-fly The algorithm is based on the work by Garniron et. al. (see thesis Chap 5). The basic idea is to generate \(|\alpha\rangle\)'s on-the-fly. The algorithm is based on the idea of splitting the list of \(|\alpha\rangle\)'s into blocks associated with a selected determinant \(|D_I\rangle\). ** Create a function to return a list of alphas Here we create a list of \(|\alpha\rangle\)'s associated with the input determinant \(|D_I\rangle\). #+begin_src f90 :main no :tangle configuration_CI_sigma_helpers.irp.f subroutine obtain_associated_alphaI(idxI, Icfg, alphasIcfg, NalphaIcfg) implicit none use bitmasks BEGIN_DOC ! Documentation for alphasI ! Returns the associated alpha's for ! the input configuration Icfg. END_DOC integer,intent(in) :: idxI ! The id of the Ith CFG integer(bit_kind),intent(in) :: Icfg(N_int,2) integer,intent(out) :: NalphaIcfg integer(bit_kind),intent(out) :: alphasIcfg(N_int,2,*) logical,dimension(:,:),allocatable :: tableUniqueAlphas integer :: listholes(mo_num) integer :: holetype(mo_num) ! 1-> SOMO 2->DOMO integer :: nholes integer :: nvmos integer :: listvmos(mo_num) integer :: vmotype(mo_num) ! 1 -> VMO 2 -> SOMO integer*8 :: Idomo integer*8 :: Isomo integer*8 :: Jdomo integer*8 :: Jsomo integer*8 :: diffSOMO integer*8 :: diffDOMO integer :: ndiffSOMO integer :: ndiffDOMO integer :: ndiffAll integer :: i integer :: j integer :: k integer :: hole integer :: p integer :: q integer :: countalphas logical :: pqAlreadyGenQ logical :: pqExistsQ Isomo = iand(reunion_of_act_virt_bitmask(1,1),Icfg(1,1)) Idomo = iand(reunion_of_act_virt_bitmask(1,1),Icfg(1,2)) !print*,"Input cfg" !call debug_spindet(Isomo,1) !call debug_spindet(Idomo,1) !print*,n_act_orb, "monum=",mo_num," n_core=",n_core_orb ! find out all pq holes possible nholes = 0 ! holes in SOMO do i = n_core_orb+1,n_core_orb + n_act_orb if(POPCNT(IAND(Isomo,IBSET(0,i-1))) .EQ. 1) then nholes += 1 listholes(nholes) = i holetype(nholes) = 1 endif end do ! holes in DOMO do i = n_core_orb+1,n_core_orb + n_act_orb if(POPCNT(IAND(Idomo,IBSET(0,i-1))) .EQ. 1) then nholes += 1 listholes(nholes) = i holetype(nholes) = 2 endif end do ! find vmos listvmos = -1 vmotype = -1 nvmos = 0 do i = n_core_orb+1,n_core_orb + n_act_orb !print *,i,IBSET(0,i-1),POPCNT(IAND(Isomo,(IBSET(0,i-1)))), POPCNT(IAND(Idomo,(IBSET(0,i-1)))) if(POPCNT(IAND(Isomo,(IBSET(0,i-1)))) .EQ. 0 .AND. POPCNT(IAND(Idomo,(IBSET(0,i-1)))) .EQ. 0) then nvmos += 1 listvmos(nvmos) = i vmotype(nvmos) = 1 else if(POPCNT(IAND(Isomo,(IBSET(0,i-1)))) .EQ. 1 .AND. POPCNT(IAND(Idomo,(IBSET(0,i-1)))) .EQ. 0 ) then nvmos += 1 listvmos(nvmos) = i vmotype(nvmos) = 2 end if end do !print *,"Nvmo=",nvmos !print *,listvmos !print *,vmotype allocate(tableUniqueAlphas(mo_num,mo_num)) tableUniqueAlphas = .FALSE. ! Now find the allowed (p,q) excitations Isomo = iand(reunion_of_act_virt_bitmask(1,1),Icfg(1,1)) Idomo = iand(reunion_of_act_virt_bitmask(1,1),Icfg(1,2)) !print *,"Isomo" !call debug_spindet(Isomo,1) !call debug_spindet(Idomo,1) do i = 1,nholes p = listholes(i) do j = 1,nvmos q = listvmos(j) if(p == q) cycle if(holetype(i) .EQ. 1 .AND. vmotype(j) .EQ. 1) then ! SOMO -> VMO Jsomo = IBCLR(Isomo,p-1) Jsomo = IBSET(Jsomo,q-1) Jdomo = Idomo else if(holetype(i) .EQ. 1 .AND. vmotype(j) .EQ. 2) then ! SOMO -> SOMO Jsomo = IBCLR(Isomo,p-1) Jsomo = IBCLR(Jsomo,q-1) Jdomo = IBSET(Idomo,q-1) else if(holetype(i) .EQ. 2 .AND. vmotype(j) .EQ. 1) then ! DOMO -> VMO Jsomo = IBSET(Isomo,p-1) Jsomo = IBSET(Jsomo,q-1) Jdomo = IBCLR(Idomo,p-1) else if(holetype(i) .EQ. 2 .AND. vmotype(j) .EQ. 2) then ! DOMO -> SOMO Jsomo = IBSET(Isomo,p-1) Jsomo = IBCLR(Jsomo,q-1) Jdomo = IBCLR(Idomo,p-1) Jdomo = IBSET(Jdomo,q-1) else print*,"Something went wrong in obtain_associated_alphaI" endif pqAlreadyGenQ = .FALSE. ! First check if it can be generated before do k = 1, idxI-1 diffSOMO = XOR(Jsomo,iand(reunion_of_act_virt_bitmask(1,1),psi_configuration(1,1,k))) diffDOMO = XOR(Jdomo,iand(reunion_of_act_virt_bitmask(1,1),psi_configuration(1,2,k))) ndiffSOMO = POPCNT(diffSOMO) ndiffDOMO = POPCNT(diffDOMO) if(POPCNT(XOR(diffSOMO,diffDOMO)) .LE. 1 .AND. ndiffDOMO .LT. 3) then pqAlreadyGenQ = .TRUE. !print *,i,k,ndiffSOMO,ndiffDOMO !call debug_spindet(Jsomo,1) !call debug_spindet(Jdomo,1) !call debug_spindet(iand(reunion_of_act_virt_bitmask(1,1),psi_configuration(1,1,k)),1) !call debug_spindet(iand(reunion_of_act_virt_bitmask(1,1),psi_configuration(1,2,k)),1) EXIT endif end do if(pqAlreadyGenQ) cycle pqExistsQ = .FALSE. ! now check if this exists in the selected list do k = idxI, N_configuration diffSOMO = XOR(OR(reunion_of_act_virt_bitmask(1,1),Jsomo),psi_configuration(1,1,k)) diffDOMO = XOR(OR(reunion_of_act_virt_bitmask(1,1),Jdomo),psi_configuration(1,2,k)) ndiffSOMO = POPCNT(diffSOMO) ndiffDOMO = POPCNT(diffDOMO) if((ndiffSOMO + ndiffDOMO) .EQ. 0) then pqExistsQ = .TRUE. EXIT endif end do if(.NOT. pqExistsQ) then tableUniqueAlphas(p,q) = .TRUE. !print *,p,q !call debug_spindet(Jsomo,1) !call debug_spindet(Jdomo,1) endif end do end do !print *,tableUniqueAlphas(:,:) ! prune list of alphas Isomo = Icfg(1,1) Idomo = Icfg(1,2) Jsomo = Icfg(1,1) Jdomo = Icfg(1,2) NalphaIcfg = 0 do i = 1, nholes p = listholes(i) do j = 1, nvmos q = listvmos(j) if(tableUniqueAlphas(p,q)) then if(holetype(i) .EQ. 1 .AND. vmotype(j) .EQ. 1) then ! SOMO -> VMO Jsomo = IBCLR(Isomo,p-1) Jsomo = IBSET(Jsomo,q-1) Jdomo = Idomo else if(holetype(i) .EQ. 1 .AND. vmotype(j) .EQ. 2) then ! SOMO -> SOMO Jsomo = IBCLR(Isomo,p-1) Jsomo = IBCLR(Jsomo,q-1) Jdomo = IBSET(Idomo,q-1) else if(holetype(i) .EQ. 2 .AND. vmotype(j) .EQ. 1) then ! DOMO -> VMO Jsomo = IBSET(Isomo,p-1) Jsomo = IBSET(Jsomo,q-1) Jdomo = IBCLR(Idomo,p-1) else if(holetype(i) .EQ. 2 .AND. vmotype(j) .EQ. 2) then ! DOMO -> SOMO Jsomo = IBSET(Isomo,p-1) Jsomo = IBCLR(Jsomo,q-1) Jdomo = IBCLR(Idomo,p-1) Jdomo = IBSET(Jdomo,q-1) else print*,"Something went wrong in obtain_associated_alphaI" endif NalphaIcfg += 1 !print *,p,q,"|",holetype(i),vmotype(j) !call debug_spindet(Jsomo,1) !call debug_spindet(Jdomo,1) alphasIcfg(1,1,NalphaIcfg) = Jsomo alphasIcfg(1,2,NalphaIcfg) = Jdomo endif end do end do end subroutine #+end_src