!-------------------------------------------------------------------------------- ! Copyright (c) 2016 Peter Grünberg Institut, Forschungszentrum Jülich, Germany ! 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. !-------------------------------------------------------------------------------- MODULE m_vgen USE m_juDFT CONTAINS !> FLAPW potential generator !! The full potential is generated by the following main steps: !! * generation of Coulomb potential !! * copy of VCoul to both spins !! * generation of XC potential !! In addition, the rotation of the density in the noco case and some scaling is done !! In results we store: !! TE_VCOUL : charge density-coulomb potential integral !! TE_VEFF: charge density-effective potential integral !! TE_EXC : charge density-ex-corr.energy density integral SUBROUTINE vgen( hybrid, field, input, xcpot, DIMENSION, atoms, sphhar, stars, & vacuum, sym, obsolete, cell, oneD, sliceplot, mpi, results, noco, & den, vTot, vx, vCoul ) USE m_rotate_int_den_to_local USE m_bfield USE m_vgen_coulomb USE m_vgen_xcpot USE m_vgen_finalize USE m_types #ifdef CPP_MPI USE m_mpi_bc_potden #endif IMPLICIT NONE TYPE(t_results), INTENT(INOUT) :: results CLASS(t_xcpot), INTENT(IN) :: xcpot TYPE(t_hybrid), INTENT(IN) :: hybrid TYPE(t_mpi), INTENT(IN) :: mpi TYPE(t_dimension), INTENT(IN) :: dimension TYPE(t_oneD), INTENT(IN) :: oneD TYPE(t_obsolete), INTENT(IN) :: obsolete TYPE(t_sliceplot), INTENT(IN) :: sliceplot TYPE(t_input), INTENT(IN) :: input TYPE(t_field), INTENT(INOUT) :: field !efield can be modified TYPE(t_vacuum), INTENT(IN) :: vacuum TYPE(t_noco), INTENT(IN) :: noco TYPE(t_sym), INTENT(IN) :: sym TYPE(t_stars), INTENT(IN) :: stars TYPE(t_cell), INTENT(IN) :: cell TYPE(t_sphhar), INTENT(IN) :: sphhar TYPE(t_atoms), INTENT(IN) :: atoms TYPE(t_potden), INTENT(INOUT) :: den TYPE(t_potden), INTENT(INOUT) :: vTot,vx,vCoul TYPE(t_potden) :: workden,denRot if (mpi%irank==0) WRITE (6,FMT=8000) 8000 FORMAT (/,/,t10,' p o t e n t i a l g e n e r a t o r',/) CALL vTot%resetPotDen() CALL vCoul%resetPotDen() CALL vx%resetPotDen() ALLOCATE( vx%pw_w, vTot%pw_w, mold=vTot%pw ) ALLOCATE( vCoul%pw_w(SIZE(den%pw,1),1) ) CALL workDen%init( stars, atoms, sphhar, vacuum, input%jspins, noco%l_noco, 0 ) !sum up both spins in den into workden CALL den%sum_both_spin( workden ) CALL vgen_coulomb( 1, mpi, DIMENSION, oneD, input, field, vacuum, sym, stars, cell, & sphhar, atoms, workden, vCoul, results ) CALL vCoul%copy_both_spin( vTot ) IF (noco%l_noco) THEN CALL denRot%init( stars, atoms, sphhar, vacuum, input%jspins, noco%l_noco, 0 ) denRot=den CALL rotate_int_den_to_local( DIMENSION, sym, stars, atoms, sphhar, vacuum, cell, input, & noco, oneD, denRot ) ENDIF call vgen_xcpot( hybrid, input, xcpot, DIMENSION, atoms, sphhar, stars, & vacuum, sym, obsolete, cell, oneD, sliceplot, mpi, noco, den, denRot, vTot, vx, results ) !ToDo, check if this is needed for more potentials as well... CALL vgen_finalize( atoms, stars, vacuum, sym, noco, input, vTot, denRot ) DEALLOCATE( vcoul%pw_w, vx%pw_w ) CALL bfield( input, noco, atoms, field, vTot ) ! broadcast potentials #ifdef CPP_MPI CALL mpi_bc_potden( mpi, stars, sphhar, atoms, input, vacuum, oneD, noco, vTot ) CALL mpi_bc_potden( mpi, stars, sphhar, atoms, input, vacuum, oneD, noco, vCoul ) CALL mpi_bc_potden( mpi, stars, sphhar, atoms, input, vacuum, oneD, noco, vx ) #endif END SUBROUTINE vgen END MODULE m_vgen