diff --git a/source/KKRhost/main1b.F90 b/source/KKRhost/main1b.F90 index f7dda9d8074ad2279d2ea3b31b679368387dc543..96d1c33f3a4addfa16e1430b69e4d59644d23f69 100644 --- a/source/KKRhost/main1b.F90 +++ b/source/KKRhost/main1b.F90 @@ -37,7 +37,7 @@ contains use :: mod_datatypes, only: dp, sp use :: mod_runoptions, only: calc_exchange_couplings, formatted_file, set_gmat_to_zero, use_Chebychev_solver, & use_qdos, use_readcpa, write_deci_tmat, write_gmat_plain, write_green_host, write_green_imp, write_kkrimp_input, & - write_pkkr_input, write_pkkr_operators, write_rhoq_input, write_gmat_ascii, decouple_spin_cheby, write_double_precision + write_pkkr_input, write_pkkr_operators, write_rhoq_input, write_gmat_ascii, decouple_spin_cheby, write_double_precision, use_gmat_unity use mod_constants, only: czero, cone, pi use mod_operators_for_fscode, only: operators_for_fscode use mod_getscratch, only: opendafile @@ -662,11 +662,19 @@ contains #ifdef CPP_TIMING call timing_start('main1b - kloopz') #endif - call kloopz1_qdos(eryd, gmatll, ins, alat, ie, igf, nshell, naez, nofks(nmesh), volbz(nmesh), bzkp(1,1,nmesh), volcub(1,nmesh), cls, nacls, naclsmax, ncls, rr, rbasis, & - ezoa, atom, rcls, icc, ginp, ideci, lefttinvll(1,1,1,1,ie), righttinvll(1,1,1,1,ie), vacflag, nlbasis, nrbasis, factl, natomimp, nsymat, dsymll, ratom, rrot, nsh1, & - nsh2, ijtabsym, ijtabsh, icheck, invmod, refpot, trefll, tsst, msst, cfctor, cfctorinv, crel, rc, rrel, srrel, irrel, nrrel, drotq, symunitary, kmrot, natyp, ncpa, & - icpa, itcpamax, cpatol, noq, iqat, itoq, conc, iprint, icpaflag, ispin, nspindd, tqdos, iqdosrun, & ! qdos - dtrefll, dtmatll, dginp, lly_grtr(ie,ispin), tracet(ie,ispin), lly) ! LLY Lloyd + if (.not. use_gmat_unity) then + call kloopz1_qdos(eryd, gmatll, ins, alat, ie, igf, nshell, naez, nofks(nmesh), volbz(nmesh), bzkp(1,1,nmesh), volcub(1,nmesh), cls, nacls, naclsmax, ncls, rr, rbasis, & + ezoa, atom, rcls, icc, ginp, ideci, lefttinvll(1,1,1,1,ie), righttinvll(1,1,1,1,ie), vacflag, nlbasis, nrbasis, factl, natomimp, nsymat, dsymll, ratom, rrot, nsh1, & + nsh2, ijtabsym, ijtabsh, icheck, invmod, refpot, trefll, tsst, msst, cfctor, cfctorinv, crel, rc, rrel, srrel, irrel, nrrel, drotq, symunitary, kmrot, natyp, ncpa, & + icpa, itcpamax, cpatol, noq, iqat, itoq, conc, iprint, icpaflag, ispin, nspindd, tqdos, iqdosrun, & ! qdos + dtrefll, dtmatll, dginp, lly_grtr(ie,ispin), tracet(ie,ispin), lly) ! LLY Lloyd + else + ! set gmatll artificially to the unity matrix + if (myrank==master .and. ie_num==1 .and. ispin==1) write(*,'(/A/)') ' !!! setting GMATLL to unity matrix !!!' + do lm1=1, lmmaxd + gmatll(lm1, lm1, :) = cone + end do + end if !.not. use_gmat_unity #ifdef CPP_TIMING call timing_pause('main1b - kloopz') diff --git a/source/KKRhost/rhooutnew.f90 b/source/KKRhost/rhooutnew.f90 index 7bd9eee288c31de05c7808154a01391ff3e1dbbf..e5fbe1153a4001ff3a1250782cef7cae721a52b5 100644 --- a/source/KKRhost/rhooutnew.f90 +++ b/source/KKRhost/rhooutnew.f90 @@ -22,7 +22,7 @@ contains rll, sll, ull, rllleft, sllleft, ullleft, cden, cdenlm, cdenns, rho2nsc, corbital, gflle_part, rpan_intervall, ipan_intervall, nspin) use :: mod_constants, only: cone,czero,pi - use :: mod_runoptions, only: calc_gmat_lm_full, use_ldau, decouple_spin_cheby + use :: mod_runoptions, only: calc_gmat_lm_full, use_ldau, decouple_spin_cheby, calc_onsite_only use :: mod_profiling, only: memocc use :: global_variables, only: lmmaxd, ncleb, ntotd, nfund, korbit use :: mod_datatypes, only: dp @@ -73,7 +73,7 @@ contains integer :: ir, jspin, lm1, lm2, lm3, m1, l1, j, ifun integer :: i_stat, i_all real (kind=dp) :: c0ll - complex (kind=dp) :: cltdf + complex (kind=dp) :: cltdf, alpha integer, dimension (4) :: lmshift1 integer, dimension (4) :: lmshift2 complex (kind=dp), dimension (lmmaxd, lmmaxd, 3) :: loperator @@ -130,6 +130,12 @@ contains ! big component of Dirac spinor do ir = 1, irmdnew + + ! this is the prefactor for the gmatll*rllleft term in the first zgemm + ! if the onsite densit is calculated alone we set this to zero + alpha = cone + if (calc_onsite_only) alpha = czero + do lm1 = 1, lmmaxd do lm2 = 1, lmmaxd qnsi(lm1, lm2) = sllleft(lm1, lm2, ir) @@ -144,7 +150,7 @@ contains pnsi(lm1, lm2) = rllleft(lm1, lm2, ir) end do end do - call zgemm('N', 'T', lmmaxd, lmmaxd, lmmaxd, cone, pnsi, lmmaxd, gmatll, lmmaxd, czero, qnsi, lmmaxd) + call zgemm('N', 'T', lmmaxd, lmmaxd, lmmaxd, alpha, pnsi, lmmaxd, gmatll, lmmaxd, czero, qnsi, lmmaxd) do lm1 = 1, lmmaxd do lm2 = 1, lmmaxd pnsi(lm1, lm2) = rll(lm1, lm2, ir) @@ -172,7 +178,7 @@ contains pnsi(lm1, lm2) = -rllleft(lm1+lmmaxd, lm2, ir) end do end do - call zgemm('N', 'T', lmmaxd, lmmaxd, lmmaxd, cone, pnsi, lmmaxd, gmatll, lmmaxd, czero, qnsi, lmmaxd) + call zgemm('N', 'T', lmmaxd, lmmaxd, lmmaxd, alpha, pnsi, lmmaxd, gmatll, lmmaxd, czero, qnsi, lmmaxd) do lm1 = 1, lmmaxd do lm2 = 1, lmmaxd pnsi(lm1, lm2) = rll(lm1+lmmaxd, lm2, ir) diff --git a/source/KKRimp/rhooutnew.f90 b/source/KKRimp/rhooutnew.f90 index c56048b1407171ca74800ad1841d184249b4c545..7c87351439fbd3dbe2b4b3b68f61a93d17289116 100644 --- a/source/KKRimp/rhooutnew.f90 +++ b/source/KKRimp/rhooutnew.f90 @@ -54,7 +54,7 @@ subroutine rhooutnew(gauntcoeff, df, gmatin, ek, cellnew, wavefunction, rho2nsc, complex (kind=dp) :: gflle_part(lmsize,lmsize) ! lda+u ! .. ! .. Local Scalars .. - complex (kind=dp) :: cltdf + complex (kind=dp) :: cltdf, alpha real (kind=dp) :: c0ll integer :: ifun, ir, j, l1, lm1, lm2, lm3, m1 integer :: ispin, jspin, ierr @@ -134,8 +134,13 @@ subroutine rhooutnew(gauntcoeff, df, gmatin, ek, cellnew, wavefunction, rho2nsc, rlltemp = wavefunction%rll(1:lmsize,1:lmsize,ir,1) end if + ! this is the prefactor for the gmatll*rllleft term in the first zgemm + ! if the onsite densit is calculated alone we set this to zero + alpha = cone + if (config_testflag('calc_onsite_only')) alpha = czero + ! changed the second mode to transpose - bauer - call zgemm('n','t',lmsize,lmsize,lmsize,cone,rlltemp, lmsize,gmat,lmsize,ek,qnsi,lmsize) + call zgemm('n','t',lmsize,lmsize,lmsize, alpha,rlltemp, lmsize,gmat,lmsize,ek,qnsi,lmsize) rlltemp(:,:) = wavefunction%rll(1:lmsize,1:lmsize,ir,1) @@ -172,7 +177,7 @@ subroutine rhooutnew(gauntcoeff, df, gmatin, ek, cellnew, wavefunction, rho2nsc, end if ! changed the second mode to transpose - bauer - call zgemm('n','t',lmsize,lmsize,lmsize,cone,rlltemp, & + call zgemm('n','t',lmsize,lmsize,lmsize,gmat,rlltemp, & lmsize,gmat,lmsize,ek,qnsi,lmsize) rlltemp = wavefunction%rll(lmsize+1:2*lmsize,1:lmsize,ir,1)!/cvlight diff --git a/source/common/runoptions.F90 b/source/common/runoptions.F90 index e4e73da644e21930d0ac32cc2defc1c5d9a4640a..23cddb18c1b9ada2d3d439c1b63c798f63ecfd41 100644 --- a/source/common/runoptions.F90 +++ b/source/common/runoptions.F90 @@ -247,6 +247,8 @@ module mod_runoptions call set_runoption(write_angles_alliter , '<write_angles_alliter>') call set_runoption(write_tmat_all , '<write_tmat_all>') call set_runoption(write_double_precision , '<write_double_precision>') + call set_runoption(calc_onsite_only , '<calc_onsite_only>') + call set_runoption(use_gmat_unity , '<use_gmat_unity>') end subroutine read_runoptions @@ -792,6 +794,8 @@ module mod_runoptions call mpi_bcast(write_angles_alliter , 1, mpi_logical, master, mpi_comm_world, ierr) call mpi_bcast(write_tmat_all , 1, mpi_logical, master, mpi_comm_world, ierr) call mpi_bcast(write_double_precision , 1, mpi_logical, master, mpi_comm_world, ierr) + call mpi_bcast(calc_onsite_only , 1, mpi_logical, master, mpi_comm_world, ierr) + call mpi_bcast(use_gmat_unity , 1, mpi_logical, master, mpi_comm_world, ierr) end subroutine bcast_runoptions #endif @@ -909,6 +913,8 @@ module mod_runoptions write(iounit, '(A35,1x,1L,3x,A)') '<write_angles_alliter>=', write_angles_alliter, "write out noncollinear angles for all iterations" write(iounit, '(A35,1x,1L,3x,A)') '<write_tmat_all>=', write_tmat_all, "write out the tmat for all energies and all atoms" write(iounit, '(A35,1x,1L,3x,A)') '<write_double_precision>=', write_double_precision, "write out kkrflex files in double precision" + write(iounit, '(A35,1x,1L,3x,A)') '<calc_onsite_only>=', calc_onsite_only, "calculate not the full Green function for the density but take the onsite part alone" + write(iounit, '(A35,1x,1L,3x,A)') '<use_gmat_unity>=', use_gmat_unity, "set the structural GF to the unity matrix for test purposes" end subroutine print_runoptions