Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- MODULE fy_wavefuns
- USE types
- USE cylho_basis_fixed
- IMPLICIT NONE
- REAL(kind=r_kind), protected :: hbaromega0basis, hbaromegaperpbasis, hbaromegazbasis, eps2basis
- ! Transformation from asymptotic cyl. oscillator basis to canonical basis
- ! |a>can = sum_alpha D(alpha,a) |alpha>cyl
- REAL(kind=r_kind), protected, allocatable, target :: Dn(:,:), Dp(:,:)
- !Using rectangular matrices as number of canonical states < number of basis states.
- !!$ REAL(kind=r_kind), protected, target :: Dn(size_matels,size_matels), Dp(size_matels,size_matels)
- ! single-particle energies
- !!$ REAL(kind=r_kind), protected, target :: En(size_matels), Ep(size_matels)
- REAL(kind=r_kind), protected, allocatable, target :: En(:), Ep(:)
- ! quasi-particle energies
- REAL(kind=r_kind), protected, allocatable :: Eqpn(:), Eqpp(:)
- INTEGER, protected, allocatable :: sort_qpn(:), sort_qpp(:)
- !BCS u and v factors in canonical basis
- REAL(kind=r_kind), protected, allocatable :: ucann(:), vcann(:), ucanp(:), vcanp(:)
- INTEGER, protected :: no_neutrons, no_protons
- REAL(kind=r_kind), protected :: efer_p, efer_n
- REAL(kind=r_kind), protected :: efer2_p, efer2_n
- REAL(kind=r_kind), protected :: Delta_p, G_p, Delta_n, G_n
- !BCS U and V matrices in cylho basis
- ! alpha(k)^dagger = ucan(k)a(k)^dagger -vcan(k)a(k_conj) = Sum_lambda u(k)D(lambda,k)a(lambda)^dagger - v(k)D(lambda,k_conj)^*a(lambda)
- ! = Sum_lambda U(lambda,k)a(lambda)^dagger + V(lambda,k)a(lambda)
- COMPLEX(kind=r_kind), protected, allocatable :: Un(:,:), Vn(:,:), Up(:,:), Vp(:,:)
- COMPLEX(kind=r_kind), protected, allocatable :: rhon(:,:), kappan(:,:), rhop(:,:), kappap(:,:)
- INTEGER, protected :: no_statesn, no_statesp !number of canonical states not counting degeneracy = number of degenerate pairs
- INTEGER, protected, allocatable, target :: sort_statesn(:), sort_statesp(:)
- !INTEGER, protected, allocatable :: sort_parposstatesn(:), sort_parnegstatesn(:), sort_parposstatesp(:), sort_parnegstatesp(:)
- TYPE quasi_particle
- INTEGER :: Omega2
- INTEGER :: pi
- INTEGER :: dom_comp !dominating component in unpairied canonical state
- REAL(kind=r_kind) :: amp_dom_comp !amplitude of that comp
- REAL(kind=r_kind) :: occ !v^2 for quasiparticle
- END type quasi_particle
- type(quasi_particle), allocatable, protected, target :: quasiparticlesn(:), quasiparticlesp(:)
- !TODO where to put phases for sigma = -1/2. Currently no phase is multiplied for sigma = -1/2 !done
- !TODO block diagonality for canonical states !skip
- INTEGER, protected, target :: ompiblockposn(1:(2*nmax_matels+1),-1:1), ompiblocksizep(1:(2*nmax_matels+1),-1:1) ! omega2, pi
- INTEGER, protected, target :: ompiblockposp(1:(2*nmax_matels+1),-1:1), ompiblocksizen(1:(2*nmax_matels+1),-1:1) ! omega2, pi
- CONTAINS
- !try to identify spherical shell of lowest energy quasiparticle
- !by looking at nearly degenerate Eqps
- SUBROUTINE print_spherical_shells(filename,filenameNordheim)
- IMPLICIT NONE
- CHARACTER(*), intent(in) :: filename, filenameNordheim
- INTEGER :: II,JJ,dom_comp
- INTEGER :: outunit, outunitNordheim
- REAL(kind=r_kind) :: Eqp_min, Eqp
- INTEGER :: Omeg2n_max, Omeg2p_max
- INTEGER :: pin, pip, ln, lp, s2n, s2p, Jnp
- OPEN(file=TRIM(filename),newunit=outunit)
- WRITE(outunit,*) 'no_statesn = ',no_statesn
- WRITE(outunit,*) 'neutron quasiparticles:'
- WRITE(outunit,'(A4,A6,2A10,2A4,A6,2A10,4A4)') '#nr','qp_nr','Eqp','Esp','om2','pi','dc','amp','occ','N','nz','lam','om2'
- Eqp_min = Eqpn(2*sort_qpn(1)-1)
- Omeg2n_max = ABS(quasiparticlesn(2*sort_qpn(1)-1)%omega2)
- pin = quasiparticlesn(2*sort_qpn(1)-1)%pi
- DO II = 1,no_statesn
- JJ = sort_qpn(II)
- dom_comp = quasiparticlesn(2*JJ-1)%dom_comp
- Eqp = Eqpn(2*JJ-1)
- IF( Eqp > Eqp_min + 0.1 .or. quasiparticlesn(2*JJ-1)%pi /= pin) CYCLE
- Omeg2n_max = MAX( Omeg2n_max, ABS( quasiparticlesn(2*JJ-1)%omega2 ) )
- WRITE(outunit,'(I4,I6,2F10.4,2I4,I6,2F10.4,4I4)') 2*II-1, 2*JJ-1, Eqpn(2*JJ-1),En(2*JJ-1), quasiparticlesn(2*JJ-1)%Omega2, quasiparticlesn(2*JJ-1)%pi, dom_comp , quasiparticlesn(2*JJ-1)%amp_dom_comp, quasiparticlesn(2*JJ-1)%occ, lookup_qn_matels(dom_comp)%n, lookup_qn_matels(dom_comp)%nz, lookup_qn_matels(dom_comp)%lambda, lookup_qn_matels(dom_comp)%omega2
- dom_comp = quasiparticlesn(2*JJ)%dom_comp
- WRITE(outunit,'(I4,I6,2F10.4,2I4,I6,2F10.4,4I4)') 2*II, 2*JJ, Eqpn(2*JJ),En(2*jj), quasiparticlesn(2*JJ)%Omega2, quasiparticlesn(2*JJ)%pi, dom_comp , quasiparticlesn(2*JJ)%amp_dom_comp, quasiparticlesn(2*JJ)%occ, lookup_qn_matels(dom_comp)%n, lookup_qn_matels(dom_comp)%nz, lookup_qn_matels(dom_comp)%lambda, lookup_qn_matels(dom_comp)%omega2
- END DO
- WRITE(outunit,*)
- WRITE(outunit,*) 'no_statesp = ',no_statesp
- WRITE(outunit,*) 'proton quasiparticles:'
- WRITE(outunit,'(A4,A6,2A10,2A4,A6,2A10,4A4)') '#nr','qp_nr','Eqp','Esp','om2','pi','dc','amp','occ','N','nz','lam','om2'
- Eqp_min = Eqpp(2*sort_qpp(1)-1)
- Omeg2p_max = ABS(quasiparticlesp(2*sort_qpp(1)-1)%omega2)
- pip = quasiparticlesp(2*sort_qpp(1)-1)%pi
- DO II = 1,no_statesp
- JJ = sort_qpp(II)
- dom_comp = quasiparticlesp(2*JJ-1)%dom_comp
- Eqp = Eqpp(2*JJ-1)
- IF( Eqp > Eqp_min + 0.1 .or. quasiparticlesp(2*JJ-1)%pi /= pip) CYCLE
- Omeg2p_max = MAX( Omeg2p_max, ABS( quasiparticlesp(2*JJ-1)%omega2 ) )
- WRITE(outunit,'(I4,I6,2F10.4,2I4,I6,2F10.4,4I4)') 2*II-1, 2*JJ-1, Eqpp(2*JJ-1), Ep(2*JJ-1), quasiparticlesp(2*JJ-1)%Omega2, quasiparticlesp(2*JJ-1)%pi, dom_comp , quasiparticlesp(2*JJ-1)%amp_dom_comp, quasiparticlesp(2*JJ-1)%occ, lookup_qn_matels(dom_comp)%n, lookup_qn_matels(dom_comp)%nz, lookup_qn_matels(dom_comp)%lambda, lookup_qn_matels(dom_comp)%omega2
- dom_comp = quasiparticlesp(2*JJ)%dom_comp
- WRITE(outunit,'(I4,I6,2F10.4,2I4,I6,2F10.4,4I4)') 2*II, 2*JJ, Eqpp(2*JJ), Ep(2*JJ), quasiparticlesp(2*JJ)%Omega2, quasiparticlesp(2*JJ)%pi, dom_comp , quasiparticlesp(2*JJ)%amp_dom_comp, quasiparticlesp(2*JJ)%occ, lookup_qn_matels(dom_comp)%n, lookup_qn_matels(dom_comp)%nz, lookup_qn_matels(dom_comp)%lambda, lookup_qn_matels(dom_comp)%omega2
- END DO
- CLOSE(outunit)
- OPEN(file=TRIM(filenameNordheim),newunit=outunitNordheim)
- ln = (Omeg2n_max + 1)/2
- s2n = 1
- IF( (MOD(ln,2) == 0 .and. pin == 1) .or. (MOD(ln,2) == 1 .and. pin == -1) ) THEN
- !guessed correct ln
- ELSE
- ln = (Omeg2n_max -1)/2
- s2n = -1
- END IF
- lp = (Omeg2p_max + 1)/2
- s2p = 1
- IF( (MOD(lp,2) == 0 .and. pip == 1) .or. (MOD(lp,2) == 1 .and. pip == -1) ) THEN
- !guessed correct lp
- ELSE
- lp = (Omeg2p_max -1)/2
- s2p = -1
- END IF
- !Nordheim rule, intrisic spins parallel
- IF( s2n == s2p) THEN
- Jnp = (Omeg2n_max + Omeg2p_max)/2
- ELSE
- Jnp = ABS( (Omeg2n_max - Omeg2p_max)/2 )
- END IF
- WRITE(outunitNordheim,'(8A10)') '# ln','2*jn','pin','lp','2*jp','pip','Jnp','pinp'
- WRITE(outunitNordheim,'(8I10)') ln, Omeg2n_max, pin, lp, Omeg2p_max, pip,Jnp,pin*pip
- CLOSE(outunitNordheim)
- END SUBROUTINE print_spherical_shells
- SUBROUTINE print_quasiparticles(filename)
- IMPLICIT NONE
- CHARACTER(*), intent(in) :: filename
- INTEGER :: II,JJ,dom_comp
- INTEGER :: outunit
- OPEN(file=TRIM(filename),newunit=outunit)
- WRITE(outunit,*) 'no_statesn = ',no_statesn
- WRITE(outunit,*) 'neutron quasiparticles:'
- WRITE(outunit,'(A4,A6,2A10,2A4,A6,2A10,4A4)') '#nr','qp_nr','Eqp','Esp','om2','pi','dc','amp','occ','N','nz','lam','om2'
- DO II = 1,no_statesn
- JJ = sort_qpn(II)
- dom_comp = quasiparticlesn(2*JJ-1)%dom_comp
- WRITE(outunit,'(I4,I6,2F10.4,2I4,I6,2F10.4,4I4)') 2*II-1, 2*JJ-1, Eqpn(2*JJ-1),En(2*JJ-1), quasiparticlesn(2*JJ-1)%Omega2, quasiparticlesn(2*JJ-1)%pi, dom_comp , quasiparticlesn(2*JJ-1)%amp_dom_comp, quasiparticlesn(2*JJ-1)%occ, lookup_qn_matels(dom_comp)%n, lookup_qn_matels(dom_comp)%nz, lookup_qn_matels(dom_comp)%lambda, lookup_qn_matels(dom_comp)%omega2
- dom_comp = quasiparticlesn(2*JJ)%dom_comp
- WRITE(outunit,'(I4,I6,2F10.4,2I4,I6,2F10.4,4I4)') 2*II, 2*JJ, Eqpn(2*JJ),En(2*jj), quasiparticlesn(2*JJ)%Omega2, quasiparticlesn(2*JJ)%pi, dom_comp , quasiparticlesn(2*JJ)%amp_dom_comp, quasiparticlesn(2*JJ)%occ, lookup_qn_matels(dom_comp)%n, lookup_qn_matels(dom_comp)%nz, lookup_qn_matels(dom_comp)%lambda, lookup_qn_matels(dom_comp)%omega2
- END DO
- WRITE(outunit,*)
- WRITE(outunit,*) 'no_statesp = ',no_statesp
- WRITE(outunit,*) 'proton quasiparticles:'
- WRITE(outunit,'(A4,A6,2A10,2A4,A6,2A10,4A4)') '#nr','qp_nr','Eqp','Esp','om2','pi','dc','amp','occ','N','nz','lam','om2'
- DO II = 1,no_statesp
- JJ = sort_qpp(II)
- dom_comp = quasiparticlesp(2*JJ-1)%dom_comp
- WRITE(outunit,'(I4,I6,2F10.4,2I4,I6,2F10.4,4I4)') 2*II-1, 2*JJ-1, Eqpp(2*JJ-1), Ep(2*JJ-1), quasiparticlesp(2*JJ-1)%Omega2, quasiparticlesp(2*JJ-1)%pi, dom_comp , quasiparticlesp(2*JJ-1)%amp_dom_comp, quasiparticlesp(2*JJ-1)%occ, lookup_qn_matels(dom_comp)%n, lookup_qn_matels(dom_comp)%nz, lookup_qn_matels(dom_comp)%lambda, lookup_qn_matels(dom_comp)%omega2
- dom_comp = quasiparticlesp(2*JJ)%dom_comp
- WRITE(outunit,'(I4,I6,2F10.4,2I4,I6,2F10.4,4I4)') 2*II, 2*JJ, Eqpp(2*JJ), Ep(2*JJ), quasiparticlesp(2*JJ)%Omega2, quasiparticlesp(2*JJ)%pi, dom_comp , quasiparticlesp(2*JJ)%amp_dom_comp, quasiparticlesp(2*JJ)%occ, lookup_qn_matels(dom_comp)%n, lookup_qn_matels(dom_comp)%nz, lookup_qn_matels(dom_comp)%lambda, lookup_qn_matels(dom_comp)%omega2
- END DO
- CLOSE(outunit)
- END SUBROUTINE print_quasiparticles
- SUBROUTINE setup_UV_matrices
- IMPLICIT NONE
- INTEGER :: II
- COMPLEX(kind=r_kind), allocatable :: testmat(:,:)
- COMPLEX(kind=r_kind) :: tracerhon, tracerhop
- IF(ALLOCATED(Un)) DEALLOCATE(Un)
- ALLOCATE(Un(size_matels,2*no_statesn))
- IF(ALLOCATED(Vn)) DEALLOCATE(Vn)
- ALLOCATE(Vn(size_matels,2*no_statesn))
- !these values should be overwritten
- Un = -666.0
- Vn = -666.0
- !note D is real
- DO II = 1,2*no_statesn-1,2
- Un(:,II) = Dn(:,II)*ucann(II)
- Un(:,II+1) = Dn(:,II+1)*ucann(II)
- Vn(:,II) = Dn(:,II+1)*(-1.0_r_kind)*vcann(II)
- Vn(:,II+1) = Dn(:,II)*vcann(II)
- quasiparticlesn(II)%occ = vcann(II)**2
- quasiparticlesn(II+1)%occ = vcann(II)**2
- END DO
- IF(ALLOCATED(rhon)) DEALLOCATE(rhon)
- ALLOCATE(rhon(size_matels,size_matels))
- IF(ALLOCATED(kappan)) DEALLOCATE(kappan)
- ALLOCATE(kappan(size_matels,size_matels))
- !rho = V^* V^T = V * V^T (V is real)
- CALL ZGEMM('n','t',size_matels, size_matels, 2*no_statesn, one, Vn, size_matels ,Vn, size_matels, zero, rhon, size_matels)
- !kappa = V^* U^T = V * U^T (V is real)
- CALL ZGEMM('n','t',size_matels, size_matels, 2*no_statesn, one, Vn, size_matels ,Un, size_matels, zero, kappan, size_matels)
- tracerhon = zero
- DO II=1,size_matels
- tracerhon = tracerhon + rhon(II,II)
- END DO
- WRITE(*,*) 'tracerhon = ',tracerhon
- IF(ALLOCATED(Up)) DEALLOCATE(Up)
- ALLOCATE(Up(size_matels,2*no_statesp))
- IF(ALLOCATED(Vp)) DEALLOCATE(Vp)
- ALLOCATE(Vp(size_matels,2*no_statesp))
- !these values should be overwritten
- Up = -666.0
- Vp = -666.0
- !note D is real
- DO II = 1,2*no_statesp-1,2
- Up(:,II) = Dp(:,II)*ucanp(II)
- Up(:,II+1) = Dp(:,II+1)*ucanp(II)
- Vp(:,II) = Dp(:,II+1)*(-1.0_r_kind)*vcanp(II)
- Vp(:,II+1) = Dp(:,II)*vcanp(II)
- quasiparticlesp(II)%occ = vcanp(II)**2
- quasiparticlesp(II+1)%occ = vcanp(II)**2
- END DO
- IF(ALLOCATED(rhop)) DEALLOCATE(rhop)
- ALLOCATE(rhop(size_matels,size_matels))
- IF(ALLOCATED(kappap)) DEALLOCATE(kappap)
- ALLOCATE(kappap(size_matels,size_matels))
- !rho = V^* V^T = V * V^T (V is real)
- CALL ZGEMM('n','t',size_matels, size_matels, 2*no_statesp, one, Vp, size_matels ,Vp, size_matels, zero, rhop, size_matels)
- !kappa = V^* U^T = V * U^T (V is real)
- CALL ZGEMM('n','t',size_matels, size_matels, 2*no_statesp, one, Vp, size_matels ,Up, size_matels, zero, kappap, size_matels)
- tracerhop = zero
- DO II=1,size_matels
- tracerhop = tracerhop + rhop(II,II)
- END DO
- WRITE(*,*) 'tracerhop = ',tracerhop
- !!$ !Testing identities
- !!$ IF(ALLOCATED(testmat)) DEALLOCATE(testmat)
- !!$ ALLOCATE(testmat(2*no_statesn,2*no_statesn))
- !!$ testmat = -666.0
- !!$ testmat = MATMUL(TRANSPOSE(Dn),Dn)
- !!$
- !!$ WRITE(*,*) '(Dn^T*Dn)(1:10,1:10)'
- !!$ CALL zprint_matrix(10,testmat(1:10,1:10))
- !!$
- !!$ DO II = 1,2*no_statesn
- !!$ testmat(II,II) = testmat(II,II) - 1.0_r_kind
- !!$ END DO
- !!$ WRITE(*,*) 'Maxnorm of Dn^T * Dn -1 =',MAXVAL(ABS(testmat))
- !!$ testmat = -666.0
- !!$ testmat = MATMUL(TRANSPOSE(Un),Un) + MATMUL(TRANSPOSE(Vn),Vn)
- !!$ !subtract identity matrix
- !!$ DO II = 1,2*no_statesn
- !!$ testmat(II,II) = testmat(II,II) - 1.0_r_kind
- !!$ END DO
- !!$ WRITE(*,*) 'Maxnorm of Un^T * Un + Vn^T * Vn - 1 =',MAXVAL(ABS(testmat))
- !!$
- !!$ testmat = -666.0
- !!$ testmat = MATMUL(TRANSPOSE(Un),Vn) + MATMUL(TRANSPOSE(Vn),Un)
- !!$ WRITE(*,*) 'Maxnorm of Un^T * Vn + Vn^T * Un =',MAXVAL(ABS(testmat))
- !!$
- !!$ IF(ALLOCATED(testmat)) DEALLOCATE(testmat)
- !!$ ALLOCATE(testmat(size_matels,size_matels))
- !!$ testmat = -666.0
- !!$ testmat = MATMUL(Dn,TRANSPOSE(Dn))
- !!$
- !!$ !FOR Dn*Dn^T, Un*Un^T, Vn*Vn^T:
- !!$ !ONLY THE ROWS AND COLUMNS WHICH CORRESPONDS TO BASIS STATES USED IN THE EXPNASION OF THE CANONICAL STATES WILL BE NONZERO!!
- !!$
- !!$ WRITE(*,*) '(Dn*Dn^T)(1:10,1:10)'
- !!$ CALL zprint_matrix(10,testmat(1:10,1:10))
- !!$ WRITE(*,*) '(Dn*Dn^T)(size-10:size,size-10:size)'
- !!$ CALL zprint_matrix(10,testmat(size_matels-10:size_matels,size_matels-10:size_matels))
- !!$
- !!$ DO II = 1,size_matels
- !!$ testmat(II,II) = testmat(II,II) - 1.0_r_kind
- !!$ END DO
- !!$ WRITE(*,*) 'Maxnorm of Dn * Dn^T -1 =',MAXVAL(ABS(testmat))
- !!$ testmat = -666.0
- !!$ testmat = MATMUL(Un,TRANSPOSE(Un)) + MATMUL(Vn,TRANSPOSE(Vn))
- !!$
- !!$ WRITE(*,*) '(Un*Un^T)(1:10,1:10)'
- !!$ CALL zprint_matrix(10,testmat(1:10,1:10))
- !!$ WRITE(*,*) '(Un*Un^T)(size-10:size,size-10:size)'
- !!$ CALL zprint_matrix(10,testmat(size_matels-10:size_matels,size_matels-10:size_matels))
- !!$
- !!$ !subtract identity matrix
- !!$ DO II = 1,size_matels
- !!$ testmat(II,II) = testmat(II,II) - 1.0_r_kind
- !!$ END DO
- !!$ WRITE(*,*) 'Maxnorm of Un * Un^T + Vn * Vn^T - 1 =',MAXVAL(ABS(testmat))
- !!$ testmat = -666.0
- !!$ testmat = MATMUL(Un,TRANSPOSE(Vn)) + MATMUL(Vn,TRANSPOSE(Un))
- !!$ WRITE(*,*) 'Maxnorm of Un * Vn^T + Vn * Un^T =',MAXVAL(ABS(testmat))
- !!$ IF(ALLOCATED(testmat)) DEALLOCATE(testmat)
- END SUBROUTINE setup_UV_matrices
- SUBROUTINE print_matrix(size,matrix)
- USE types
- IMPLICIT NONE
- INTEGER, intent(in) :: size
- REAL(kind=r_kind) :: matrix(size,size)
- INTEGER :: II, JJ
- DO II = 1,size
- DO JJ = 1,size
- WRITE(*,'(E18.8)',advance = "no") matrix(II,JJ)
- END DO
- WRITE(*,*)
- END DO
- END SUBROUTINE PRINT_MATRIX
- SUBROUTINE zprint_matrix(size,matrix)
- USE types
- IMPLICIT NONE
- INTEGER, intent(in) :: size
- COMPLEX(kind=r_kind) :: matrix(size,size)
- INTEGER :: II, JJ
- DO II = 1,size
- DO JJ = 1,size
- WRITE(*,'(A1,E9.2,A1,E9.2,A1)',advance = "no") "(",REAL(matrix(II,JJ),kind=r_kind),",",AIMAG(matrix(II,JJ)),")"
- END DO
- WRITE(*,*)
- END DO
- END SUBROUTINE zprint_matrix
- SUBROUTINE canonical_uv_unpaired
- IMPLICIT NONE
- INTEGER :: II
- INTEGER :: last_occ_pair
- IF(ALLOCATED(ucann)) DEALLOCATE(ucann)
- ALLOCATE(ucann(2*no_statesn))
- IF(ALLOCATED(vcann)) DEALLOCATE(vcann)
- ALLOCATE(vcann(2*no_statesn))
- IF(ALLOCATED(Eqpn)) DEALLOCATE(Eqpn)
- ALLOCATE(Eqpn(2*no_statesn))
- DO II = 1,2*no_statesn
- IF(En(II) <= efer_n) THEN
- ucann(II) = 0.0_r_kind
- vcann(II) = 1.0_r_kind
- ELSE
- ucann(II) = 1.0_r_kind
- vcann(II) = 0.0_r_kind
- END IF
- Eqpn(II) = ABS(En(II)-efer_n)
- END DO
- IF(MOD(no_neutrons,2) == 1) THEN !equal filling approx for odd
- last_occ_pair = no_neutrons/2
- vcann(2*sort_statesn(last_occ_pair+1)-1) = 1/Sqrt(2.0_r_kind)
- vcann(2*sort_statesn(last_occ_pair+1)) = 1/Sqrt(2.0_r_kind)
- ucann(2*sort_statesn(last_occ_pair+1)-1) = 1/Sqrt(2.0_r_kind)
- ucann(2*sort_statesn(last_occ_pair+1)) = 1/Sqrt(2.0_r_kind)
- END IF
- WRITE(*,*) 'Sum vcann**2 = ', DOT_PRODUCT(vcann,vcann)
- IF(ALLOCATED(ucanp)) DEALLOCATE(ucanp)
- ALLOCATE(ucanp(2*no_statesp))
- IF(ALLOCATED(vcanp)) DEALLOCATE(vcanp)
- ALLOCATE(vcanp(2*no_statesp))
- IF(ALLOCATED(Eqpp)) DEALLOCATE(Eqpp)
- ALLOCATE(Eqpp(2*no_statesp))
- DO II = 1,2*no_statesp
- IF(Ep(II) <= efer_p) THEN
- ucanp(II) = 0.0_r_kind
- vcanp(II) = 1.0_r_kind
- ELSE
- ucanp(II) = 1.0_r_kind
- vcanp(II) = 0.0_r_kind
- END IF
- Eqpp(II) = ABS(Ep(II)-efer_p)
- END DO
- IF(MOD(no_protons,2) == 1) THEN !equal filling approx for odd
- last_occ_pair = no_protons/2
- vcanp(2*sort_statesp(last_occ_pair+1)-1) = 1/Sqrt(2.0_r_kind)
- vcanp(2*sort_statesp(last_occ_pair+1)) = 1/Sqrt(2.0_r_kind)
- ucanp(2*sort_statesp(last_occ_pair+1)-1) = 1/Sqrt(2.0_r_kind)
- ucanp(2*sort_statesp(last_occ_pair+1)) = 1/Sqrt(2.0_r_kind)
- END IF
- WRITE(*,*) 'Sum vcanp**2 = ', DOT_PRODUCT(vcanp,vcanp)
- END SUBROUTINE canonical_uv_unpaired
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement