!-------------------------------------------------------------------------------- ! 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_types !************************************************************* ! This module contains definitions for all kind of types !************************************************************* ! ! Types for orbital moment calculation: ! ! ! Types for spin-off-diagonal charge density: ! TYPE t_mt21 ! 'normal' contributions SEQUENCE REAL :: uun,udn,dun,ddn ! normes of radial overlaps COMPLEX :: uu,ud,du,dd ! values END TYPE t_mt21 TYPE t_lo21 ! ocal orbitals & (u,d) SEQUENCE REAL :: uulon,dulon,uloun,ulodn ! normes of radial overlaps COMPLEX :: uulo,dulo,ulou,ulod ! values END TYPE t_lo21 TYPE t_orb ! 'normal' contributions SEQUENCE REAL :: uu,dd ! z component COMPLEX :: uup,uum,ddp,ddm ! +/- component END TYPE t_orb TYPE t_orbl ! local orbitals & (u,d) SEQUENCE REAL :: uulo,dulo COMPLEX :: uulop,uulom,dulop,dulom END TYPE t_orbl TYPE t_orblo ! lo,lo' contributions SEQUENCE REAL :: z COMPLEX :: p,m END TYPE t_orblo TYPE t_lapw INTEGER :: nv(2) INTEGER :: nv_tot INTEGER :: nmat INTEGER,ALLOCATABLE:: k1(:,:) INTEGER,ALLOCATABLE:: k2(:,:) INTEGER,ALLOCATABLE:: k3(:,:) INTEGER,ALLOCATABLE:: kp(:,:) REAL,ALLOCATABLE::rk(:,:) END TYPE t_lapw TYPE t_tlmplm COMPLEX,ALLOCATABLE :: tdd(:,:,:) COMPLEX,ALLOCATABLE :: tdu(:,:,:) !(0:lmplmd,ntypd,tspin) COMPLEX,ALLOCATABLE :: tud(:,:,:) COMPLEX,ALLOCATABLE :: tuu(:,:,:) !(0:lmplmd,ntypd,tspin) INTEGER,ALLOCATABLE :: ind(:,:,:,:) !(0:lmd,0:lmd,ntypd,tspin) COMPLEX,ALLOCATABLE :: tdulo(:,:,:,:) !(0:lmd,-llod:llod,mlotot,tspin) COMPLEX,ALLOCATABLE :: tuulo(:,:,:,:) !(0:lmd,-llod:llod,mlotot,tspin) COMPLEX,ALLOCATABLE :: tuloulo(:,:,:,:) !(-llod:llod,-llod:llod,mlolotot,tspin) END TYPE t_tlmplm TYPE t_usdus REAL,ALLOCATABLE,DIMENSION(:,:,:) :: us REAL,ALLOCATABLE,DIMENSION(:,:,:) :: dus REAL,ALLOCATABLE,DIMENSION(:,:,:) :: uds REAL,ALLOCATABLE,DIMENSION(:,:,:) :: duds !(0:lmaxd,ntype,jspd) REAL,ALLOCATABLE,DIMENSION(:,:,:) :: ddn !(0:lmaxd,ntype,jspd) REAL,ALLOCATABLE,DIMENSION(:,:,:) :: ulos REAL,ALLOCATABLE,DIMENSION(:,:,:) :: dulos REAL,ALLOCATABLE,DIMENSION(:,:,:) :: uulon REAL,ALLOCATABLE,DIMENSION(:,:,:) :: dulon !(nlod,ntype,jspd) REAL,ALLOCATABLE,DIMENSION(:,:,:,:) :: uloulopn! (nlod,nlod,ntypd,jspd) CONTAINS PROCEDURE init => usdus_init END TYPE t_usdus ! types for 1D calculations TYPE od_dim LOGICAL :: d1 INTEGER :: mb,M,k3,m_cyl INTEGER :: chi,rot LOGICAL :: invs,zrfs INTEGER :: n2d,nq2,nn2d INTEGER :: kimax2 INTEGER :: nop,nat END TYPE od_dim TYPE od_inp LOGICAL :: d1 INTEGER :: mb,M,k3,m_cyl INTEGER :: chi,rot LOGICAL :: invs,zrfs INTEGER :: n2d,nq2,nn2d INTEGER :: kimax2 INTEGER, POINTER :: ig(:,:) !(-k3:k3,-M:M) INTEGER, POINTER :: kv(:,:) !(2,n2d) INTEGER, POINTER :: nst2(:) !(n2d) END TYPE od_inp TYPE od_sym INTEGER :: nop,nat INTEGER, POINTER :: ngopr(:) !(nat) REAL , POINTER :: mrot(:,:,:) !(3,3,nop) REAL , POINTER :: tau(:,:) !(3,nop) INTEGER, POINTER :: invtab(:) !(nop) INTEGER, POINTER :: multab(:,:) !(nop,nop) END TYPE od_sym TYPE od_lda INTEGER :: nn2d INTEGER, POINTER :: igf(:,:) !(0:nn2d-1,2) REAL , POINTER :: pgf(:) !(0:nn2d-1) END TYPE od_lda TYPE od_gga INTEGER :: nn2d REAL, POINTER :: pgfx(:) ! (0:nn2d-1) REAL, POINTER :: pgfy(:) REAL, POINTER :: pgfxx(:) REAL, POINTER :: pgfyy(:) REAL, POINTER :: pgfxy(:) END TYPE od_gga ! ! Type for LDA+U: ! TYPE t_utype SEQUENCE REAL u,j INTEGER l LOGICAL :: l_amf END TYPE t_utype ! ! Type for the HF total energy ! TYPE t_energy_hf REAL :: valence REAL :: core END TYPE t_energy_hf ! ! Type for the electric field ! TYPE t_efield REAL :: zsigma = 10.0 ! Distance to the charged plates REAL :: sigma = 0.0 ! charge at the plates REAL :: sig_b(2)= 0.0 ! Extra charge for the top/bottom plate COMPLEX :: vslope = 0.0 ! Dirichlet bnd. cond.: Slope REAL, ALLOCATABLE :: sigEF(:,:,:) ! (nx, ny, nvac) COMPLEX, ALLOCATABLE :: rhoEF(:,:) ! (g_||, nvac) COMPLEX, ALLOCATABLE :: C1(:), C2(:) ! Coeff. for Dirichlet bnd.cond. LOGICAL :: l_segmented = .FALSE. LOGICAL :: plot_charge = .FALSE. ! Plot charge as inputted LOGICAL :: plot_rho = .FALSE. ! Plot Fourier-transformed charge LOGICAL :: autocomp = .TRUE. ! Auto-compensate film charge LOGICAL :: dirichlet = .FALSE. ! Dirichlet vs. Neumann boundary cond. LOGICAL :: l_dirichlet_coeff = .FALSE. ! For MPI, true if C1/C2 set END TYPE t_efield TYPE t_atoms !init_potden_types,init_potden_simple END TYPE t_potden CONTAINS SUBROUTINE usdus_init(ud,atoms,jsp) USE m_judft IMPLICIT NONE CLASS(t_usdus) :: ud TYPE(t_atoms),INTENT(IN) :: atoms INTEGER,INTENT(IN) :: jsp INTEGER :: err(10) ALLOCATE ( ud%uloulopn(atoms%nlod,atoms%nlod,atoms%ntype,jsp),stat=err(1) ) ALLOCATE ( ud%ddn(0:atoms%lmaxd,atoms%ntype,jsp),stat=err(2) ) ALLOCATE ( ud%us(0:atoms%lmaxd,atoms%ntype,jsp),stat=err(3)) ALLOCATE ( ud%uds(0:atoms%lmaxd,atoms%ntype,jsp),stat=err(4) ) ALLOCATE ( ud%dus(0:atoms%lmaxd,atoms%ntype,jsp),stat=err(5)) ALLOCATE ( ud%duds(0:atoms%lmaxd,atoms%ntype,jsp),stat=err(6)) ALLOCATE ( ud%ulos(atoms%nlod,atoms%ntype,jsp ),stat=err(7)) ALLOCATE (ud%dulos(atoms%nlod,atoms%ntype,jsp ),stat=err(8) ) ALLOCATE ( ud%uulon(atoms%nlod,atoms%ntype,jsp ),stat=err(9)) ALLOCATE (ud%dulon(atoms%nlod,atoms%ntype,jsp) ,stat=err(10)) IF (ANY(err>0)) CALL judft_error("Not enough memory allocating usdus datatype") END SUBROUTINE usdus_init SUBROUTINE init_potden_types(pd,stars,atoms,sphhar,vacuum,oneD,jsp) USE m_judft IMPLICIT NONE CLASS(t_potden),INTENT(OUT):: pd TYPE(t_atoms),INTENT(IN) :: atoms TYPE(t_stars),INTENT(IN) :: stars TYPE(t_sphhar),INTENT(IN):: sphhar TYPE(t_vacuum),INTENT(IN):: vacuum TYPE(t_oneD),INTENT(IN) :: oneD INTEGER,INTENT(IN) :: jsp CALL init_potden_simple(pd,stars%ng3,atoms%jmtd,sphhar%nlhd,atoms%ntype,jsp,vacuum%nmzd,vacuum%nmzxyd,oneD%odi%n2d) END SUBROUTINE init_potden_types SUBROUTINE init_potden_simple(pd,ng3,jmtd,nlhd,ntype,jsp,nmzd,nmzxyd,n2d) USE m_judft IMPLICIT NONE CLASS(t_potden),INTENT(OUT) :: pd INTEGER,INTENT(IN) :: ng3,jmtd,nlhd,ntype,jsp INTEGER,INTENT(IN),OPTIONAL :: nmzd,nmzxyd,n2d INTEGER:: err(4) err=0 pd%iter=0 ALLOCATE(pd%pw(ng3,jsp),stat=err(1)) ALLOCATE(pd%mt(jmtd,0:nlhd,ntype,jsp),stat=err(2)) IF (PRESENT(nmzd)) THEN ALLOCATE(pd%vacz(nmzd,2,jsp),stat=err(3)) ALLOCATE(pd%vacxy(nmzxyd,n2d-1,2,jsp),stat=err(4)) ENDIF IF (ANY(err>0)) CALL judft_error("Not enough memory allocating potential or density") pd%pw=0.0 pd%mt=0.0 IF (PRESENT(nmzd)) THEN pd%vacz=0.0 pd%vacxy=0.0 ENDIF END SUBROUTINE init_potden_simple END MODULE m_types