Commit 6645cae4 authored by Miriam Hinzen's avatar Miriam Hinzen

Merge branch 'kerker' into 'develop'

Merge branch kerker into develop

See merge request fleur/fleur!6
parents dbcba7f2 107ac463
...@@ -24,6 +24,7 @@ MODULE m_constants ...@@ -24,6 +24,7 @@ MODULE m_constants
INTEGER, PARAMETER :: POTDEN_TYPE_POTTOT = 1 ! 0 < POTDEN_TYPE <= 1000 ==> potential INTEGER, PARAMETER :: POTDEN_TYPE_POTTOT = 1 ! 0 < POTDEN_TYPE <= 1000 ==> potential
INTEGER, PARAMETER :: POTDEN_TYPE_POTCOUL = 2 INTEGER, PARAMETER :: POTDEN_TYPE_POTCOUL = 2
INTEGER, PARAMETER :: POTDEN_TYPE_POTX = 3 INTEGER, PARAMETER :: POTDEN_TYPE_POTX = 3
INTEGER, PARAMETER :: POTDEN_TYPE_POTYUK = 4
INTEGER, PARAMETER :: POTDEN_TYPE_DEN = 1001 ! 1000 < POTDEN_TYPE ==> density INTEGER, PARAMETER :: POTDEN_TYPE_DEN = 1001 ! 1000 < POTDEN_TYPE ==> density
CHARACTER(2),DIMENSION(0:103),PARAMETER :: namat_const=(/& CHARACTER(2),DIMENSION(0:103),PARAMETER :: namat_const=(/&
......
...@@ -146,7 +146,8 @@ ...@@ -146,7 +146,8 @@
input%pallst = .false. ; obsolete%lwb = .false. ; vacuum%starcoeff = .false. input%pallst = .false. ; obsolete%lwb = .false. ; vacuum%starcoeff = .false.
input%strho = .false. ; input%l_f = .false. ; atoms%l_geo(:) = .true. input%strho = .false. ; input%l_f = .false. ; atoms%l_geo(:) = .true.
noco%l_noco = noco%l_ss ; input%jspins = 1 noco%l_noco = noco%l_ss ; input%jspins = 1
input%itmax = 9 ; input%maxiter = 99 ; input%imix = 7 ; input%alpha = 0.05 ; input%minDistance = 0.0 input%itmax = 9 ; input%maxiter = 99 ; input%imix = 7 ; input%alpha = 0.05
input%preconditioning_param = 0.0 ; input%minDistance = 0.0
input%spinf = 2.0 ; obsolete%lepr = 0 ; input%coretail_lmax = 0 input%spinf = 2.0 ; obsolete%lepr = 0 ; input%coretail_lmax = 0
sliceplot%kk = 0 ; sliceplot%nnne = 0 ; vacuum%nstars = 0 ; vacuum%nstm = 0 sliceplot%kk = 0 ; sliceplot%nnne = 0 ; vacuum%nstars = 0 ; vacuum%nstm = 0
input%isec1 = 99 ; nu = 5 ; vacuum%layerd = 1 ; iofile = 6 input%isec1 = 99 ; nu = 5 ; vacuum%layerd = 1 ; iofile = 6
......
...@@ -330,6 +330,7 @@ SUBROUTINE r_inpXML(& ...@@ -330,6 +330,7 @@ SUBROUTINE r_inpXML(&
END SELECT END SELECT
input%alpha = evaluateFirstOnly(xmlGetAttributeValue('/fleurInput/calculationSetup/scfLoop/@alpha')) input%alpha = evaluateFirstOnly(xmlGetAttributeValue('/fleurInput/calculationSetup/scfLoop/@alpha'))
input%preconditioning_param = evaluateFirstOnly(xmlGetAttributeValue('/fleurInput/calculationSetup/scfLoop/@preconditioning_param'))
input%spinf = evaluateFirstOnly(xmlGetAttributeValue('/fleurInput/calculationSetup/scfLoop/@spinf')) input%spinf = evaluateFirstOnly(xmlGetAttributeValue('/fleurInput/calculationSetup/scfLoop/@spinf'))
! Get parameters for core electrons ! Get parameters for core electrons
......
...@@ -573,7 +573,7 @@ ...@@ -573,7 +573,7 @@
8061 FORMAT (6x,i3,9x,i3,6x,i2,7x,f6.2,7x,f6.2) 8061 FORMAT (6x,i3,9x,i3,6x,i2,7x,f6.2,7x,f6.2)
END IF END IF
input%preconditioning_param = 0.0
chform = '(5x,l1,'//chntype//'f6.2)' chform = '(5x,l1,'//chntype//'f6.2)'
! chform = '(5x,l1,23f6.2)' ! chform = '(5x,l1,23f6.2)'
......
...@@ -168,8 +168,8 @@ SUBROUTINE w_inpXML(& ...@@ -168,8 +168,8 @@ SUBROUTINE w_inpXML(&
110 FORMAT(' <cutoffs Kmax="',f0.8,'" Gmax="',f0.8,'" GmaxXC="',f0.8,'" numbands="',i0,'"/>') 110 FORMAT(' <cutoffs Kmax="',f0.8,'" Gmax="',f0.8,'" GmaxXC="',f0.8,'" numbands="',i0,'"/>')
WRITE (fileNum,110) input%rkmax,stars%gmaxInit,xcpot%gmaxxc,input%gw_neigd WRITE (fileNum,110) input%rkmax,stars%gmaxInit,xcpot%gmaxxc,input%gw_neigd
! <scfLoop itmax="9" maxIterBroyd="99" imix="Anderson" alpha="0.05" spinf="2.00"/> ! <scfLoop itmax="9" maxIterBroyd="99" imix="Anderson" alpha="0.05" preconditioning_param="0.0" spinf="2.00"/>
120 FORMAT(' <scfLoop itmax="',i0,'" minDistance="',f0.8,'" maxIterBroyd="',i0,'" imix="',a,'" alpha="',f0.8,'" spinf="',f0.8,'"/>') 120 FORMAT(' <scfLoop itmax="',i0,'" minDistance="',f0.8,'" maxIterBroyd="',i0,'" imix="',a,'" alpha="',f0.8,'" preconditioning_param="',f3.1,'" spinf="',f0.8,'"/>')
SELECT CASE (input%imix) SELECT CASE (input%imix)
CASE (1) CASE (1)
mixingScheme='straight' mixingScheme='straight'
...@@ -182,7 +182,7 @@ SUBROUTINE w_inpXML(& ...@@ -182,7 +182,7 @@ SUBROUTINE w_inpXML(&
CASE DEFAULT CASE DEFAULT
mixingScheme='errorUnknownMixing' mixingScheme='errorUnknownMixing'
END SELECT END SELECT
WRITE (fileNum,120) input%itmax,input%minDistance,input%maxiter,TRIM(mixingScheme),input%alpha,input%spinf WRITE (fileNum,120) input%itmax,input%minDistance,input%maxiter,TRIM(mixingScheme),input%alpha,input%preconditioning_param,input%spinf
! <coreElectrons ctail="T" frcor="F" kcrel="0"/> ! <coreElectrons ctail="T" frcor="F" kcrel="0"/>
130 FORMAT(' <coreElectrons ctail="',l1,'" frcor="',l1,'" kcrel="',i0,'" coretail_lmax="',i0,'"/>') 130 FORMAT(' <coreElectrons ctail="',l1,'" frcor="',l1,'" kcrel="',i0,'" coretail_lmax="',i0,'"/>')
......
...@@ -537,6 +537,7 @@ ...@@ -537,6 +537,7 @@
<xsd:attribute default="99" name="maxIterBroyd" type="xsd:nonNegativeInteger" use="optional"/> <xsd:attribute default="99" name="maxIterBroyd" type="xsd:nonNegativeInteger" use="optional"/>
<xsd:attribute name="imix" type="MixingEnum" use="required"/> <xsd:attribute name="imix" type="MixingEnum" use="required"/>
<xsd:attribute name="alpha" type="xsd:string" use="required"/> <xsd:attribute name="alpha" type="xsd:string" use="required"/>
<xsd:attribute default="0.0" name="preconditioning_param" type="xsd:string" use="optional"/>
<xsd:attribute default="2.0" name="spinf" type="xsd:string" use="optional"/> <xsd:attribute default="2.0" name="spinf" type="xsd:string" use="optional"/>
<xsd:attribute default="0.0" name="minDistance" type="xsd:string" use="optional"/> <xsd:attribute default="0.0" name="minDistance" type="xsd:string" use="optional"/>
<xsd:attribute name="maxTimeToStartIter" type="xsd:string" use="optional"/> <xsd:attribute name="maxTimeToStartIter" type="xsd:string" use="optional"/>
......
...@@ -799,10 +799,11 @@ ...@@ -799,10 +799,11 @@
<xsd:attribute name="itmax" type="xsd:positiveInteger" use="required"/> <xsd:attribute name="itmax" type="xsd:positiveInteger" use="required"/>
<xsd:attribute default="99" name="maxIterBroyd" type="xsd:nonNegativeInteger" use="optional"/> <xsd:attribute default="99" name="maxIterBroyd" type="xsd:nonNegativeInteger" use="optional"/>
<xsd:attribute name="imix" type="MixingEnum" use="required"/> <xsd:attribute name="imix" type="MixingEnum" use="required"/>
<xsd:attribute name="alpha" type="xsd:double" use="required"/> <xsd:attribute name="alpha" type="xsd:string" use="required"/>
<xsd:attribute default="2.0" name="spinf" type="xsd:double" use="optional"/> <xsd:attribute default="0.0" name="preconditioning_param" type="xsd:string" use="optional"/>
<xsd:attribute default="0.0" name="minDistance" type="xsd:double" use="optional"/> <xsd:attribute default="2.0" name="spinf" type="xsd:string" use="optional"/>
<xsd:attribute name="maxTimeToStartIter" type="xsd:double" use="optional"/> <xsd:attribute default="0.0" name="minDistance" type="xsd:string" use="optional"/>
<xsd:attribute name="maxTimeToStartIter" type="xsd:string" use="optional"/>
</xsd:complexType> </xsd:complexType>
<xsd:complexType name="VacDOSType"> <xsd:complexType name="VacDOSType">
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -76,7 +76,7 @@ CONTAINS ...@@ -76,7 +76,7 @@ CONTAINS
! Types, these variables contain a lot of data! ! Types, these variables contain a lot of data!
TYPE(t_input) :: input TYPE(t_input) :: input
TYPE(t_field) :: field TYPE(t_field) :: field, field2
TYPE(t_dimension):: DIMENSION TYPE(t_dimension):: DIMENSION
TYPE(t_atoms) :: atoms TYPE(t_atoms) :: atoms
TYPE(t_sphhar) :: sphhar TYPE(t_sphhar) :: sphhar
...@@ -119,6 +119,8 @@ CONTAINS ...@@ -119,6 +119,8 @@ CONTAINS
oneD,coreSpecInput,wann,l_opti) oneD,coreSpecInput,wann,l_opti)
CALL timestop("Initialization") CALL timestop("Initialization")
if( input%preconditioning_param /= 0 .and. input%film ) call juDFT_error('Currently no preconditioner for films', calledby = 'fleur' )
IF (l_opti) CALL optional(mpi,atoms,sphhar,vacuum,dimension,& IF (l_opti) CALL optional(mpi,atoms,sphhar,vacuum,dimension,&
stars,input,sym,cell,sliceplot,obsolete,xcpot,noco,oneD) stars,input,sym,cell,sliceplot,obsolete,xcpot,noco,oneD)
...@@ -236,13 +238,13 @@ CONTAINS ...@@ -236,13 +238,13 @@ CONTAINS
!---< gwf !---< gwf
CALL timestart("generation of potential") CALL timestart("generation of potential")
CALL vgen(hybrid,field,input,xcpot,DIMENSION, atoms,sphhar,stars,vacuum,& CALL vgen( hybrid, field, input, xcpot, DIMENSION, atoms, sphhar, stars, vacuum, &
sym,obsolete,cell, oneD,sliceplot,mpi ,results,noco,inDen,vTot,vx,vCoul) sym, obsolete, cell, oneD, sliceplot, mpi, results, noco, inDen, vTot, vx, &
vCoul )
CALL timestop("generation of potential") CALL timestop("generation of potential")
#ifdef CPP_MPI #ifdef CPP_MPI
CALL MPI_BARRIER(mpi%mpi_comm,ierr) CALL MPI_BARRIER(mpi%mpi_comm,ierr)
#endif #endif
...@@ -251,7 +253,6 @@ CONTAINS ...@@ -251,7 +253,6 @@ CONTAINS
forcetheoloop:DO WHILE(forcetheo%next_job(it==input%itmax,noco)) forcetheoloop:DO WHILE(forcetheo%next_job(it==input%itmax,noco))
CALL timestart("generation of hamiltonian and diagonalization (total)") CALL timestart("generation of hamiltonian and diagonalization (total)")
CALL timestart("eigen") CALL timestart("eigen")
vTemp = vTot vTemp = vTot
...@@ -418,19 +419,21 @@ CONTAINS ...@@ -418,19 +419,21 @@ CONTAINS
CALL forcetheo%postprocess() CALL forcetheo%postprocess()
CALL enpara%mix(mpi,atoms,vacuum,input,vTot%mt(:,0,:,:),vtot%vacz) CALL enpara%mix(mpi,atoms,vacuum,input,vTot%mt(:,0,:,:),vtot%vacz)
IF (mpi%irank.EQ.0) THEN field2 = field
! ----> mix input and output densities ! ----> mix input and output densities
CALL timestart("mixing") CALL timestart("mixing")
CALL mix(stars,atoms,sphhar,vacuum,input,sym,cell,noco,oneD,hybrid,archiveType,inDen,outDen,results) CALL mix( field2, xcpot, dimension, obsolete, sliceplot, mpi, &
stars, atoms, sphhar, vacuum, input, sym, cell, noco, &
oneD, hybrid, archiveType, inDen, outDen, results )
CALL timestop("mixing") CALL timestop("mixing")
if( mpi%irank == 0 ) then
WRITE (6,FMT=8130) it WRITE (6,FMT=8130) it
WRITE (16,FMT=8130) it WRITE (16,FMT=8130) it
8130 FORMAT (/,5x,'******* it=',i3,' is completed********',/,/) 8130 FORMAT (/,5x,'******* it=',i3,' is completed********',/,/)
WRITE(*,*) "Iteration:",it," Distance:",results%last_distance WRITE(*,*) "Iteration:",it," Distance:",results%last_distance
CALL timestop("Iteration") CALL timestop("Iteration")
!+t3e end if ! mpi%irank.EQ.0
ENDIF ! mpi%irank.EQ.0
#ifdef CPP_MPI #ifdef CPP_MPI
......
...@@ -250,6 +250,7 @@ ...@@ -250,6 +250,7 @@
CALL MPI_BCAST(input%jspins,1,MPI_INTEGER,0,mpi%mpi_comm,ierr) CALL MPI_BCAST(input%jspins,1,MPI_INTEGER,0,mpi%mpi_comm,ierr)
CALL MPI_BCAST(atoms%n_u,1,MPI_INTEGER,0,mpi%mpi_comm,ierr) CALL MPI_BCAST(atoms%n_u,1,MPI_INTEGER,0,mpi%mpi_comm,ierr)
CALL MPI_BCAST(atoms%lmaxd,1,MPI_INTEGER,0,mpi%mpi_comm,ierr) CALL MPI_BCAST(atoms%lmaxd,1,MPI_INTEGER,0,mpi%mpi_comm,ierr)
call MPI_BCAST( input%preconditioning_param, 1, MPI_DOUBLE, 0, mpi%mpi_comm, ierr )
#endif #endif
CALL ylmnorm_init(atoms%lmaxd) CALL ylmnorm_init(atoms%lmaxd)
! !
......
...@@ -3,71 +3,80 @@ ...@@ -3,71 +3,80 @@
! This file is part of FLEUR and available as free software under the conditions ! This file is part of FLEUR and available as free software under the conditions
! of the MIT license as expressed in the LICENSE file in more detail. ! of the MIT license as expressed in the LICENSE file in more detail.
!-------------------------------------------------------------------------------- !--------------------------------------------------------------------------------
MODULE m_mix module m_mix
!************************************************************************* !------------------------------------------------------------------------
! mixing of charge densities or potentials: ! mixing of charge densities or potentials:
! IMIX= 0 : linear mixing ! IMIX = 0 : linear mixing
! IMIX = 3 : BROYDEN'S FIRST METHOD ! IMIX = 3 : Broyden's First method
! IMIX = 5 : BROYDEN'S SECOND METHOD ! IMIX = 5 : Broyden's Second method
! IMIX = 7 : GENERALIZED ANDERSEN METHOD ! IMIX = 7 : Generalized Anderson method
!************************************************************************ !------------------------------------------------------------------------
CONTAINS contains
SUBROUTINE mix(stars,atoms,sphhar,vacuum,input,sym,cell,noco,oneD,& subroutine mix( field, xcpot, dimension, obsolete, sliceplot, mpi, &
hybrid,archiveType,inDen,outDen,results) stars, atoms, sphhar, vacuum, input, sym, cell, noco, &
oneD, hybrid, archiveType, inDen, outDen, results )
#include"cpp_double.h" #include"cpp_double.h"
USE m_juDFT use m_juDFT
USE m_constants use m_constants
USE m_cdn_io use m_cdn_io
USE m_broyd_io use m_broyd_io
USE m_brysh1 use m_brysh1
USE m_stmix use m_stmix
USE m_broyden use m_broyden
USE m_broyden2 use m_broyden2
USE m_brysh2 use m_brysh2
USE m_metric use m_metric
USE m_qfix use m_qfix
USE m_types use m_types
USE m_xmlOutput use m_xmlOutput
USE m_umix use m_umix
use m_vgen_coulomb
IMPLICIT NONE #ifdef CPP_MPI
use m_mpi_bc_potden
TYPE(t_oneD),INTENT(IN) :: oneD #endif
TYPE(t_hybrid),INTENT(IN) :: hybrid implicit none
TYPE(t_input),INTENT(IN) :: input
TYPE(t_vacuum),INTENT(IN) :: vacuum type(t_oneD), intent(in) :: oneD
TYPE(t_noco),INTENT(IN) :: noco type(t_hybrid), intent(in) :: hybrid
TYPE(t_sym),INTENT(IN) :: sym type(t_input), intent(in) :: input
TYPE(t_stars),INTENT(IN) :: stars type(t_vacuum), intent(in) :: vacuum
TYPE(t_cell),INTENT(IN) :: cell type(t_noco), intent(in) :: noco
TYPE(t_sphhar),INTENT(IN) :: sphhar type(t_sym), intent(in) :: sym
TYPE(t_atoms),INTENT(INOUT) :: atoms !n_u is modified temporarily type(t_stars), intent(in) :: stars
TYPE(t_potden),INTENT(INOUT) :: outDen type(t_cell), intent(in) :: cell
TYPE(t_results),INTENT(INOUT) :: results type(t_sphhar), intent(in) :: sphhar
TYPE(t_potden),INTENT(INOUT) :: inDen type(t_field), intent(inout) :: field
INTEGER, INTENT(IN) :: archiveType class(t_xcpot), intent(in) :: xcpot
type(t_dimension), intent(in) :: dimension
!Local Scalars type(t_obsolete), intent(in) :: obsolete
REAL fix,intfac,vacfac type(t_sliceplot), intent(in) :: sliceplot
INTEGER i,imap,js type(t_mpi), intent(in) :: mpi
INTEGER mmap,mmaph,nmaph,nmap,mapmt,mapvac,mapvac2 type(t_atoms), intent(inout) :: atoms !n_u is modified temporarily
INTEGER iofl,n_u_keep type(t_potden), intent(inout) :: outDen
LOGICAL l_exist,l_ldaU, l_densityMatrixPresent, l_pot type(t_results), intent(inout) :: results
type(t_potden), intent(inout) :: inDen
!Local Arrays integer, intent(in) :: archiveType
REAL dist(6)
REAL, ALLOCATABLE :: sm(:), fsm(:), fmMet(:), smMet(:) real :: fix, intfac, vacfac
CHARACTER(LEN=20) :: attributes(2) integer :: i, imap, js, n, lh
COMPLEX :: n_mmpTemp(-3:3,-3:3,MAX(1,atoms%n_u),input%jspins) integer :: mmap, mmaph, nmaph, nmap, mapmt, mapvac, mapvac2
integer :: iofl, n_u_keep
logical :: l_exist, l_ldaU, l_densityMatrixPresent, l_pot
real :: dist(6)
real, allocatable :: sm(:), fsm(:), fmMet(:), smMet(:)
character(len=20) :: attributes(2)
complex :: n_mmpTemp(-3:3,-3:3,max(1,atoms%n_u),input%jspins)
type(t_potden) :: resDen, vYukawa
integer :: ierr(2)
!External functions !External functions
REAL CPP_BLAS_sdot real :: CPP_BLAS_sdot
EXTERNAL CPP_BLAS_sdot external :: CPP_BLAS_sdot
! YM: I have exported 'vol' from outside, be aware ! YM: I have exported 'vol' from outside, be aware
! IF (film) THEN ! IF (film) THEN
...@@ -76,87 +85,122 @@ SUBROUTINE mix(stars,atoms,sphhar,vacuum,input,sym,cell,noco,oneD,& ...@@ -76,87 +85,122 @@ SUBROUTINE mix(stars,atoms,sphhar,vacuum,input,sym,cell,noco,oneD,&
! vol = omtil ! vol = omtil
! ENDIF ! ENDIF
l_densityMatrixPresent = ANY(inDen%mmpMat(:,:,:,:).NE.0.0) MPI0_a: if( mpi%irank == 0 ) then
l_densityMatrixPresent = any( inDen%mmpMat(:,:,:,:) /= 0.0 )
!In systems without inversions symmetry the interstitial star- !In systems without inversions symmetry the interstitial star-
!coefficients are complex. Thus twice as many numbers have to be !coefficients are complex. Thus twice as many numbers have to be
!stored. !stored.
intfac = 2.0 intfac = 2.0
IF (sym%invs) intfac = 1.0 if ( sym%invs ) intfac = 1.0
!The corresponding is true for the coeff. of the warping vacuum !The corresponding is true for the coeff. of the warping vacuum
!density depending on the two dimensional inversion. !density depending on the two dimensional inversion.
vacfac = 2.0 vacfac = 2.0
IF (sym%invs2) vacfac = 1.0 if ( sym%invs2 ) vacfac = 1.0
mmaph = intfac*stars%ng3 + atoms%ntype*(sphhar%nlhd+1)*atoms%jmtd +& mmaph = intfac * stars%ng3 + atoms%ntype * ( sphhar%nlhd + 1 ) * atoms%jmtd + &
vacfac*vacuum%nmzxyd*(oneD%odi%n2d-1)*vacuum%nvac + vacuum%nmzd*vacuum%nvac vacfac * vacuum%nmzxyd * ( oneD%odi%n2d - 1 ) * vacuum%nvac + vacuum%nmzd * vacuum%nvac
mmap = mmaph*input%jspins mmap = mmaph * input%jspins
!in a non-collinear calculations extra space is needed for the !in a non-collinear calculations extra space is needed for the
!off-diag. part of the density matrix. these coeff. are generally !off-diag. part of the density matrix. these coeff. are generally
!complex independ of invs and invs2. !complex independ of invs and invs2.
IF (noco%l_noco) THEN if ( noco%l_noco ) then
mmap = mmap + 2*stars%ng3 + 2*vacuum%nmzxyd*(oneD%odi%n2d-1)*vacuum%nvac + & mmap = mmap + 2 * stars%ng3 + 2 * vacuum%nmzxyd * ( oneD%odi%n2d - 1 ) * vacuum%nvac + &
2*vacuum%nmzd*vacuum%nvac 2 * vacuum%nmzd * vacuum%nvac
END IF end if
! LDA+U (start) ! LDA+U (start)
n_mmpTemp = inDen%mmpMat n_mmpTemp = inDen%mmpMat
n_u_keep=atoms%n_u n_u_keep = atoms%n_u
IF (atoms%n_u.GT.0) CALL u_mix(input,atoms,inDen%mmpMat,outDen%mmpMat) if ( atoms%n_u > 0 ) call u_mix( input, atoms, inDen%mmpMat, outDen%mmpMat )
IF (l_densityMatrixPresent) THEN if ( l_densityMatrixPresent ) then
!In an LDA+U caclulation, also the density matrix is included in the !In an LDA+U caclulation, also the density matrix is included in the
!supervectors (sm,fsm) if no linear mixing is performed on it. !supervectors (sm,fsm) if no linear mixing is performed on it.
IF (input%ldauLinMix) THEN if ( input%ldauLinMix ) then
atoms%n_u = 0 atoms%n_u = 0
ELSE else
mmap = mmap + 7 * 7 * 2 * atoms%n_u * input%jspins ! add 7*7 complex numbers per atoms%n_u and spin mmap = mmap + 7 * 7 * 2 * atoms%n_u * input%jspins ! add 7*7 complex numbers per atoms%n_u and spin
END IF end if
ELSE else
atoms%n_u = 0 atoms%n_u = 0
END IF end if
! LDA+U (end) ! LDA+U (end)
ALLOCATE (sm(mmap),fsm(mmap)) allocate( sm(mmap), fsm(mmap) )
ALLOCATE (smMet(mmap),fmMet(mmap)) allocate( smMet(mmap), fmMet(mmap) )
dist(:) = 0.0 dist(:) = 0.0
!determine type of mixing: !determine type of mixing:
!imix=0:straight, imix=o broyden first, imix=5:broyden second !imix=0:straight, imix=o broyden first, imix=5:broyden second
!imix=:generalozed anderson mixing !imix=:generalozed anderson mixing
IF (input%imix.EQ.0) THEN select case( input%imix )
WRITE (16,FMT='(a,2f10.5)') 'STRAIGHT MIXING',input%alpha case( 0 )
ELSE IF (input%imix.EQ.3) THEN write( 16, fmt='(a,2f10.5)' ) 'STRAIGHT MIXING',input%alpha
WRITE (16,FMT='(a,f10.5)') 'BROYDEN FIRST MIXING',input%alpha case( 3 )
ELSE IF (input%imix.EQ.5) THEN write( 16, fmt='(a,f10.5)' ) 'BROYDEN FIRST MIXING',input%alpha
WRITE (16,FMT='(a,f10.5)') 'BROYDEN SECOND MIXING',input%alpha case( 5 )
ELSE IF (input%imix.EQ.7) THEN write( 16, fmt='(a,f10.5)' ) 'BROYDEN SECOND MIXING',input%alpha
WRITE (16,FMT='(a,f10.5)') 'ANDERSON GENERALIZED',input%alpha case( 7 )
ELSE write( 16, fmt='(a,f10.5)' ) 'ANDERSON GENERALIZED',input%alpha
CALL juDFT_error("mix: input%imix =/= 0,3,5,7 ",calledby ="mix") case default
END IF call juDFT_error( "mix: input%imix =/= 0,3,5,7 ", calledby ="mix" )
end select
IF (input%jspins.EQ.2.AND.input%imix.NE.0) THEN
WRITE(6,'(''WARNING : for QUASI-NEWTON METHODS SPINF=1'')') if ( input%jspins == 2 .and. input%imix /= 0 ) then
END IF write( 6, '(''WARNING : for QUASI-NEWTON METHODS SPINF=1'')' )
end if
!put input charge density into array sm !put input charge density into array sm
!(in the spin polarized case the arrays sm and fsm consist of spin up and spin down densities) !(in the spin polarized case the arrays sm and fsm consist of spin up and spin down densities)
CALL brysh1(input,stars,atoms,sphhar,noco,vacuum,sym,oneD,& call brysh1( input, stars, atoms, sphhar, noco, vacuum, sym, oneD, &
intfac,vacfac,inDen,nmap,nmaph,mapmt,mapvac,mapvac2,sm) intfac, vacfac, inDen, nmap, nmaph, mapmt, mapvac, mapvac2, sm )
!put output charge density into array fsm !put output charge density into array fsm
CALL brysh1(input,stars,atoms,sphhar,noco,vacuum,sym,oneD,& call brysh1( input, stars, atoms, sphhar, noco, vacuum, sym, oneD, &
intfac,vacfac,outDen,nmap,nmaph,mapmt,mapvac,mapvac2,fsm) intfac, vacfac, outDen, nmap, nmaph, mapmt, mapvac, mapvac2, fsm )
!store the difference fsm - sm in fsm !store the difference fsm - sm in fsm
fsm(:nmap) = fsm(:nmap) - sm(:nmap) fsm(:nmap) = fsm(:nmap) - sm(:nmap)
l_pot = .FALSE. l_pot = .false.
! Apply metric w to fsm and store in fmMet: w |fsm> ! Apply metric w to fsm and store in fmMet: w |fsm>
CALL metric(cell,atoms,vacuum,sphhar,input,noco,stars,sym,oneD,& call metric( cell, atoms, vacuum, sphhar, input, noco, stars, sym, oneD, &
mmap,nmaph,mapmt,mapvac2,fsm,fmMet,l_pot) mmap, nmaph, mapmt, mapvac2, fsm, fmMet, l_pot )
end if MPI0_a
! KERKER PRECONDITIONER
if( input%preconditioning_param /= 0 ) then
call resDen%init( stars, atoms, sphhar, vacuum, input%jspins, noco%l_noco, 1001 )
call vYukawa%init( stars, atoms, sphhar, vacuum, input%jspins, noco%l_noco, 4 )
MPI0_b: if( mpi%irank == 0 ) then
call resDen%Residual( outDen, inDen )
if( input%jspins == 2 ) call resDen%SpinsToChargeAndMagnetisation()
end if MPI0_b
#ifdef CPP_MPI
call mpi_bc_potden( mpi, stars, sphhar, atoms, input, vacuum, oneD, noco, resDen )
#endif
call vgen_coulomb( 1, mpi, dimension, oneD, input, field, vacuum, sym, stars, cell, &
sphhar, atoms, resDen, vYukawa )
end if
MPI0_c: if( mpi%irank == 0 ) then
if( input%preconditioning_param /= 0 ) then
resDen%pw(1:stars%ng3,1) = resDen%pw(1:stars%ng3,1) - input%preconditioning_param ** 2 / fpi_const * vYukawa%pw(1:stars%ng3,1)
do n = 1, atoms%ntype
do lh = 0, sphhar%nlhd
resDen%mt(1:atoms%jri(n),lh,n,1) = resDen%mt(1:atoms%jri(n),lh,n,1) &
- input%preconditioning_param ** 2 / fpi_const &
* vYukawa%mt(1:atoms%jri(n),lh,n,1) * atoms%rmsh(1:atoms%jri(n),n) ** 2
end do
end do
if( input%jspins == 2 ) call resDen%ChargeAndMagnetisationToSpins()
call brysh1( input, stars, atoms, sphhar, noco, vacuum, sym, oneD, &
intfac, vacfac, resDen, nmap, nmaph, mapmt, mapvac, mapvac2, fsm )
end if
! end of preconditioner
!mixing of the densities !mixing of the densities
IF (input%imix.EQ.0) THEN IF (input%imix.EQ.0) THEN
...@@ -282,6 +326,8 @@ SUBROUTINE mix(stars,atoms,sphhar,vacuum,input,sym,cell,noco,oneD,& ...@@ -282,6 +326,8 @@ SUBROUTINE mix(stars,atoms,sphhar,vacuum,input,sym,cell,noco,oneD,&
8020 FORMAT (4d25.14) 8020 FORMAT (4d25.14)
8030 FORMAT (10i10) 8030 FORMAT (10i10)
END SUBROUTINE mix end if MPI0_c
end subroutine mix