mirror of
https://github.com/triqs/dft_tools
synced 2024-11-14 18:13:49 +01:00
411 lines
15 KiB
Fortran
411 lines
15 KiB
Fortran
|
|
c ******************************************************************************
|
|
c
|
|
c TRIQS: a Toolbox for Research in Interacting Quantum Systems
|
|
c
|
|
c Copyright (C) 2011 by L. Pourovskii, V. Vildosola, C. Martins, M. Aichhorn
|
|
c
|
|
c TRIQS is free software: you can redistribute it and/or modify it under the
|
|
c terms of the GNU General Public License as published by the Free Software
|
|
c Foundation, either version 3 of the License, or (at your option) any later
|
|
c version.
|
|
c
|
|
c TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
c WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
c FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
c details.
|
|
c
|
|
c You should have received a copy of the GNU General Public License along with
|
|
c TRIQS. If not, see <http://www.gnu.org/licenses/>.
|
|
c
|
|
c *****************************************************************************/
|
|
|
|
C--------------------
|
|
C MODULE almblm_data
|
|
C--------------------
|
|
MODULE almblm_data
|
|
INTEGER :: nk, nloat
|
|
INTEGER, DIMENSION(:,:), ALLOCATABLE :: nLO
|
|
REAL(KIND=8), DIMENSION(:,:,:), ALLOCATABLE :: u_dot_norm
|
|
REAL(KIND=8), DIMENSION(:,:,:,:), ALLOCATABLE :: ovl_LO_u
|
|
REAL(KIND=8), DIMENSION(:,:,:,:), ALLOCATABLE :: ovl_LO_udot
|
|
TYPE kp_data
|
|
LOGICAL :: included
|
|
INTEGER :: nb_bot, nb_top
|
|
INTEGER :: nbmin,nbmax
|
|
REAL(KIND=8) :: weight
|
|
COMPLEX(KIND=8), DIMENSION(:), ALLOCATABLE :: tetrweight
|
|
REAL(KIND=8),DIMENSION(:), ALLOCATABLE :: eband
|
|
COMPLEX(KIND=8),DIMENSION(:,:,:), ALLOCATABLE :: Alm, Blm
|
|
COMPLEX(KIND=8),DIMENSION(:,:,:,:), ALLOCATABLE :: Clm
|
|
ENDTYPE
|
|
TYPE(kp_data), DIMENSION(:,:), ALLOCATABLE :: kp
|
|
ENDMODULE almblm_data
|
|
C
|
|
C--------------
|
|
C MODULE bands
|
|
C--------------
|
|
MODULE bands
|
|
INTEGER :: nlab, nkband
|
|
TYPE label
|
|
CHARACTER(len=20) :: kname
|
|
INTEGER :: pos
|
|
ENDTYPE
|
|
TYPE(label), DIMENSION(:), ALLOCATABLE :: labels
|
|
ENDMODULE
|
|
C
|
|
C--------------------
|
|
C MODULE common_data
|
|
C--------------------
|
|
MODULE common_data
|
|
C 11/03/10 : Modification of the fullpath for myDMFTproj-2
|
|
C CHARACTER(len=*), PARAMETER :: wien_path=
|
|
C & '/workpmc/martins/DMFTprojectors/newDMFTproj'
|
|
CHARACTER(len=250) :: wien_path
|
|
INTEGER :: natom, nsort, lmax, nlm, ns, nsp
|
|
INTEGER, DIMENSION(:), ALLOCATABLE :: isort
|
|
INTEGER, DIMENSION(:), ALLOCATABLE :: nmult
|
|
INTEGER, DIMENSION(:,:), ALLOCATABLE :: lsort
|
|
INTEGER, DIMENSION(:), ALLOCATABLE :: ifSOflag
|
|
INTEGER, DIMENSION(:), ALLOCATABLE :: timeflag
|
|
LOGICAL :: ifSO, ifSP, ifBAND
|
|
LOGICAL, DIMENSION(:), ALLOCATABLE :: notinclude
|
|
REAL(KIND=8) :: eferm
|
|
REAL(KIND=8) :: e_bot, e_top
|
|
REAL(KIND=8), PARAMETER :: PI=3.1415926535898d0
|
|
C New type structure basistrans
|
|
TYPE deftrans
|
|
CHARACTER(len=8) :: typebasis
|
|
C The size of typebasis is limited to 8 characters !
|
|
CHARACTER(len=25) :: sourcefile
|
|
C The size of sourcefile is limited to 25 characters !
|
|
ENDTYPE
|
|
TYPE(deftrans), DIMENSION(:), ALLOCATABLE :: defbasis
|
|
C Type structure orbital
|
|
TYPE orbital
|
|
INTEGER :: atom
|
|
INTEGER :: sort
|
|
INTEGER :: l
|
|
LOGICAL :: first
|
|
LOGICAL :: ifsplit
|
|
INTEGER :: ifSOat
|
|
LOGICAL,DIMENSION(:), ALLOCATABLE :: correp
|
|
ENDTYPE
|
|
TYPE(orbital), DIMENSION(:), ALLOCATABLE :: orb, crorb
|
|
INTEGER :: norb, ncrorb
|
|
ENDMODULE common_data
|
|
C
|
|
C------------------
|
|
C MODULE factorial
|
|
C------------------
|
|
MODULE factorial
|
|
REAL(KIND=8), DIMENSION(:), ALLOCATABLE :: fac
|
|
INTEGER :: nfctrl
|
|
CONTAINS
|
|
SUBROUTINE setfact(n)
|
|
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
C %% %%
|
|
C %% This subroutine sets the factorial array %%
|
|
C %% FAC(I+1) = I! for I=0,...,N-1 %%
|
|
C %% %%
|
|
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
C Definiton of the variables :
|
|
C ----------------------------
|
|
IMPLICIT NONE
|
|
INTEGER :: n, i
|
|
C
|
|
nfctrl=n
|
|
ALLOCATE(fac(nfctrl))
|
|
C I! = FAC(I+1)
|
|
fac(1)=1.0d00
|
|
DO i=1,nfctrl-1
|
|
fac(i+1)=i*fac(i)
|
|
ENDDO
|
|
RETURN
|
|
END SUBROUTINE setfact
|
|
END MODULE factorial
|
|
C
|
|
C-------------------
|
|
C MODULE file_names
|
|
C-------------------
|
|
MODULE file_names
|
|
INTEGER :: iudef, iuinp, iusym, iualmblm, iumatfile, iuradwf
|
|
INTEGER :: iuklist
|
|
INTEGER :: ouproj, ouprn, ouctqmc, oupartial,ousymqmc, ousympar
|
|
INTEGER :: ouband, oubwinup, oubwindn, oubwin
|
|
INTEGER :: outw2kpath
|
|
CHARACTER(len=25) :: jobname
|
|
CHARACTER(len=35) :: inp_file, sym_file, almblm_file
|
|
CHARACTER(len=35) :: almblm_file_sp2
|
|
CHARACTER(len=35) :: radwf_file, radwf_file_sp2
|
|
CHARACTER(len=35) :: prn_file, ctqmc_file, partial_file
|
|
CHARACTER(len=35) :: klist_file
|
|
CHARACTER(len=35) :: symqmc_file, sympar_file, outband_file
|
|
CHARACTER(len=35) :: oubwin_file, oubwinup_file, oubwindn_file
|
|
CHARACTER(len=8), PARAMETER :: inp_ext='indmftpr'
|
|
CHARACTER(len=7), PARAMETER :: sym_ext='dmftsym'
|
|
CHARACTER(len=6), PARAMETER :: almblm_ext='almblm'
|
|
CHARACTER(len=8), PARAMETER :: almblmup_ext='almblmup'
|
|
CHARACTER(len=8), PARAMETER :: almblmdn_ext='almblmdn'
|
|
CHARACTER(len=9), PARAMETER :: prn_ext='outdmftpr'
|
|
CHARACTER(len=8), PARAMETER :: ctqmc_ext='ctqmcout'
|
|
CHARACTER(len=7), PARAMETER :: partial_ext='parproj'
|
|
CHARACTER(len=6), PARAMETER :: symqmc_ext='symqmc'
|
|
CHARACTER(len=6), PARAMETER :: sympar_ext='sympar'
|
|
CHARACTER(len=7), PARAMETER :: radwfup_ext='radwfup'
|
|
CHARACTER(len=7), PARAMETER :: radwfdn_ext='radwfdn'
|
|
CHARACTER(len=10), PARAMETER :: klist_ext='klist_band'
|
|
CHARACTER(len=7), PARAMETER :: outband_ext='outband'
|
|
CHARACTER(len=6), PARAMETER :: oubwin_ext='oubwin'
|
|
CHARACTER(len=8), PARAMETER :: oubwinup_ext='oubwinup'
|
|
CHARACTER(len=8), PARAMETER :: oubwindn_ext='oubwindn'
|
|
CONTAINS
|
|
SUBROUTINE set_file_name(filename,exten)
|
|
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
C %% %%
|
|
C %% This subroutine sets the file name %%
|
|
C %% %%
|
|
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
C Definiton of the variables :
|
|
C ----------------------------
|
|
IMPLICIT NONE
|
|
CHARACTER(len=*) :: filename, exten
|
|
INTEGER :: i1, i2, i
|
|
i1=LEN_TRIM(jobname)
|
|
i2=LEN(exten)
|
|
i=i1+i2+1
|
|
IF(LEN(filename) < i) THEN
|
|
WRITE(*,'(i3,3a)')
|
|
& i,' characters required for the $case.',exten,
|
|
& ' filename, too long'
|
|
STOP
|
|
ENDIF
|
|
filename=' '
|
|
filename(1:i)=jobname(1:i1)//'.'//exten(1:i2)
|
|
END SUBROUTINE set_file_name
|
|
C
|
|
SUBROUTINE openfiles
|
|
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
C %% %%
|
|
C %% This subroutine opens the input and output units for dmftproj %%
|
|
C %% %%
|
|
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
C Definiton of the variables :
|
|
C ----------------------------
|
|
USE common_data, ONLY: ifSP, ifSO, ifBAND, wien_path
|
|
IMPLICIT NONE
|
|
CHARACTER(len=120) :: buf
|
|
INTEGER :: i1, i2
|
|
C initialize input/output channels
|
|
CALL setchannels
|
|
C Get working directory name:
|
|
CALL system('pwd > dir_name.tmp')
|
|
OPEN(outw2kpath,file='dir_name.tmp',status='old')
|
|
READ(outw2kpath,'(a)')buf
|
|
CLOSE(outw2kpath,status='delete')
|
|
i1=INDEX(buf,'/',.TRUE.)
|
|
i2=LEN_TRIM(buf)
|
|
jobname(1:i2-i1)=buf(i1+1:i2)
|
|
jobname(i2-i1+1:)=' '
|
|
C Construct file names
|
|
CALL set_file_name(inp_file,inp_ext)
|
|
CALL set_file_name(sym_file,sym_ext)
|
|
IF(.NOT.ifSP) THEN
|
|
CALL set_file_name(almblm_file,almblm_ext)
|
|
ELSE
|
|
CALL set_file_name(almblm_file,almblmup_ext)
|
|
CALL set_file_name(almblm_file_sp2,almblmdn_ext)
|
|
ENDIF
|
|
CALL set_file_name(prn_file,prn_ext)
|
|
CALL set_file_name(ctqmc_file,ctqmc_ext)
|
|
CALL set_file_name(partial_file,partial_ext)
|
|
CALL set_file_name(symqmc_file,symqmc_ext)
|
|
CALL set_file_name(sympar_file,sympar_ext)
|
|
IF(ifSP.AND.ifSO) THEN
|
|
CALL set_file_name(radwf_file,radwfup_ext)
|
|
CALL set_file_name(radwf_file_sp2,radwfdn_ext)
|
|
ENDIF
|
|
IF(ifBAND) THEN
|
|
CALL set_file_name(klist_file,klist_ext)
|
|
CALL set_file_name(outband_file,outband_ext)
|
|
ENDIF
|
|
IF(ifSP) THEN
|
|
CALL set_file_name(oubwinup_file,oubwinup_ext)
|
|
CALL set_file_name(oubwindn_file,oubwindn_ext)
|
|
ELSE
|
|
CALL set_file_name(oubwin_file,oubwin_ext)
|
|
ENDIF
|
|
C Open units
|
|
OPEN(iuinp,file=inp_file,status='old')
|
|
OPEN(iusym,file=sym_file,status='old')
|
|
OPEN(iualmblm,file=almblm_file,status='old')
|
|
OPEN(ouprn,file=prn_file)
|
|
OPEN(ouctqmc,file=ctqmc_file)
|
|
OPEN(oupartial,file=partial_file)
|
|
OPEN(ousymqmc,file=symqmc_file)
|
|
OPEN(ousympar,file=sympar_file)
|
|
IF(ifBAND) THEN
|
|
OPEN(iuklist,file=klist_file,status='old')
|
|
OPEN(ouband,file=outband_file)
|
|
ENDIF
|
|
IF(ifSP) THEN
|
|
OPEN(oubwinup,file=oubwinup_file)
|
|
OPEN(oubwindn,file=oubwindn_file)
|
|
ELSE
|
|
OPEN(oubwin,file=oubwin_file)
|
|
ENDIF
|
|
C
|
|
C Set path to Wien2k
|
|
CALL system('echo $WIENROOT > path_wienroot.tmp')
|
|
OPEN(outw2kpath,file='path_wienroot.tmp',status='old')
|
|
READ(outw2kpath,'(a)')wien_path
|
|
CLOSE(outw2kpath,status='delete')
|
|
C
|
|
RETURN
|
|
END SUBROUTINE
|
|
C
|
|
SUBROUTINE setchannels
|
|
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
C %% %%
|
|
C %% This subroutine opens the input and output channels %%
|
|
C %% %%
|
|
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
C Definiton of the variables :
|
|
C ----------------------------
|
|
USE common_data, ONLY: ifSP
|
|
IMPLICIT NONE
|
|
C Channels
|
|
C input
|
|
iudef=5 ! def-file
|
|
iuinp=7 ! input data
|
|
iusym=8 ! symmetries
|
|
iualmblm=9 ! almblm matrices from Wien
|
|
iumatfile=15 !transformation matrices between different angular basises
|
|
iuradwf=16 !radial mesh and wave functions
|
|
iuklist=20 !bands
|
|
C output
|
|
ouprn=10 ! print-out file
|
|
ouproj=11 ! projection matrices and other data for DMFT run
|
|
ouctqmc=12 ! output for ctqmc
|
|
oupartial=13 ! output for partial charges projectors for ctqmc
|
|
ousymqmc=14 ! output for permutations and rotation matrices
|
|
ousympar=19 ! output for permutations and rotation matrices
|
|
! for partial charges analisis
|
|
ouband=21 ! bands
|
|
IF(ifSP) THEN
|
|
oubwinup=22 ! included bands information for lapw2(up)
|
|
oubwindn=23 ! included bands information for lapw2(dn)
|
|
ELSE
|
|
oubwin=22 ! included bands information for lapw2
|
|
ENDIF
|
|
C
|
|
RETURN
|
|
END SUBROUTINE
|
|
C
|
|
C
|
|
ENDMODULE file_names
|
|
C
|
|
MODULE prnt
|
|
CHARACTER(len=250) :: buf
|
|
CONTAINS
|
|
SUBROUTINE printout(newline)
|
|
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
C %% %%
|
|
C %% This subroutine prints the string in buf to the screen %%
|
|
C %% and to the output file and renitializes buf %%
|
|
C %% %%
|
|
C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
C Definiton of the variables :
|
|
C ----------------------------
|
|
USE file_names
|
|
IMPLICIT NONE
|
|
INTEGER :: newline, i
|
|
i=LEN_TRIM(buf)
|
|
WRITE(ouprn,'(a)')buf(1:i)
|
|
WRITE(*,'(a)')buf(1:i)
|
|
buf=' '
|
|
IF(newline==1) THEN
|
|
WRITE(ouprn,'(/)')
|
|
WRITE(*,'(/)')
|
|
ENDIF
|
|
RETURN
|
|
END subroutine
|
|
ENDMODULE prnt
|
|
C
|
|
C--------------------
|
|
C MODULE projections
|
|
C--------------------
|
|
MODULE projections
|
|
TYPE proj_mat
|
|
COMPLEX(KIND=8), DIMENSION(:,:), ALLOCATABLE :: mat
|
|
COMPLEX(KIND=8), DIMENSION(:,:), ALLOCATABLE :: mat_rep
|
|
ENDTYPE
|
|
TYPE(proj_mat), DIMENSION(:,:,:), ALLOCATABLE :: pr_crorb
|
|
C
|
|
TYPE proj_mat_n
|
|
COMPLEX(KIND=8), DIMENSION(:,:,:), ALLOCATABLE :: matn
|
|
COMPLEX(KIND=8), DIMENSION(:,:,:), ALLOCATABLE :: matn_rep
|
|
ENDTYPE
|
|
TYPE(proj_mat_n), DIMENSION(:,:,:), ALLOCATABLE :: pr_orb
|
|
C
|
|
TYPE ortfunc
|
|
INTEGER :: n
|
|
REAL(KIND=8), DIMENSION(:,:,:), ALLOCATABLE :: s12
|
|
ENDTYPE
|
|
TYPE(ortfunc), DIMENSION(:), ALLOCATABLE :: norm_radf
|
|
ENDMODULE projections
|
|
C
|
|
C-------------
|
|
C MODULE reps
|
|
C-------------
|
|
MODULE reps
|
|
TYPE ang_bas
|
|
INTEGER :: nreps
|
|
INTEGER, DIMENSION(:), ALLOCATABLE :: dreps
|
|
LOGICAL :: ifmixing
|
|
COMPLEX(KIND=8),DIMENSION(:,:), ALLOCATABLE :: transmat
|
|
ENDTYPE
|
|
TYPE(ang_bas), DIMENSION(:,:), ALLOCATABLE :: reptrans
|
|
ENDMODULE
|
|
C
|
|
C-------------
|
|
C MODULE symm
|
|
C-------------
|
|
MODULE symm
|
|
TYPE matrix
|
|
COMPLEX(KIND=8),DIMENSION(:,:),ALLOCATABLE :: mat
|
|
ENDTYPE
|
|
TYPE symop
|
|
LOGICAL :: timeinv
|
|
INTEGER, DIMENSION(:), ALLOCATABLE :: perm
|
|
INTEGER :: iprop
|
|
REAL(KIND=8) :: a, b, g
|
|
REAL(KIND=8) :: phase
|
|
REAL(KIND=8) :: krotm(3,3)
|
|
COMPLEX(KIND=8),DIMENSION(:,:,:),ALLOCATABLE ::rotl
|
|
TYPE(matrix),DIMENSION(:,:),ALLOCATABLE ::rotrep
|
|
ENDTYPE
|
|
TYPE symoploc
|
|
LOGICAL :: timeinv
|
|
INTEGER :: iprop
|
|
INTEGER :: srotnum
|
|
REAL(KIND=8) :: a, b, g
|
|
REAL(KIND=8) :: phase
|
|
REAL(KIND=8) :: krotm(3,3)
|
|
COMPLEX(KIND=8),DIMENSION(:,:,:),ALLOCATABLE ::rotl
|
|
TYPE(matrix),DIMENSION(:),ALLOCATABLE ::rotrep
|
|
ENDTYPE
|
|
INTEGER :: nsym
|
|
INTEGER :: lsym, nlmsym
|
|
TYPE(symop), DIMENSION(:), ALLOCATABLE :: srot
|
|
TYPE(symoploc), DIMENSION(:), ALLOCATABLE :: rotloc
|
|
TYPE(matrix), DIMENSION(:,:), ALLOCATABLE :: densmat
|
|
TYPE(matrix), DIMENSION(:,:), ALLOCATABLE :: crdensmat
|
|
END MODULE symm
|
|
|