10
1
mirror of https://github.com/pfloos/quack synced 2024-12-27 06:43:42 +01:00
QuAcK/src/eDFT/read_options.f90

202 lines
4.8 KiB
Fortran
Raw Normal View History

2020-09-11 11:55:04 +02:00
subroutine read_options(nBas,method,x_rung,x_DFA,c_rung,c_DFA,SGn,nEns,wEns,aCC_w1,aCC_w2, &
maxSCF,thresh,DIIS,max_diis,guess_type,ortho_type,doNcentered,occnum,Cx_choice)
2019-03-13 11:07:31 +01:00
! Read DFT options
implicit none
include 'parameters.h'
2020-09-11 11:55:04 +02:00
! Input variables
integer,intent(in) :: nBas
2019-03-13 11:07:31 +01:00
! Local variables
2020-09-11 11:55:04 +02:00
integer :: iBas
integer :: iEns
integer :: iParam
character(len=1) :: answer
double precision,allocatable :: nEl(:)
2019-03-13 11:07:31 +01:00
! Output variables
character(len=8),intent(out) :: method
2019-03-13 11:07:31 +01:00
integer,intent(out) :: x_rung,c_rung
character(len=12),intent(out) :: x_DFA, c_DFA
2019-03-13 11:07:31 +01:00
integer,intent(out) :: SGn
2020-09-11 11:55:04 +02:00
integer,intent(out) :: nEns
integer,intent(out) :: doNcentered
2019-03-13 11:07:31 +01:00
double precision,intent(out) :: wEns(maxEns)
double precision,intent(out) :: aCC_w1(3)
double precision,intent(out) :: aCC_w2(3)
2020-09-11 11:55:04 +02:00
double precision,intent(out) :: occnum(nBas,nspin,maxEns)
2019-03-13 11:07:31 +01:00
integer,intent(out) :: maxSCF
double precision,intent(out) :: thresh
logical,intent(out) :: DIIS
integer,intent(out) :: max_diis
integer,intent(out) :: guess_type
integer,intent(out) :: ortho_type
integer,intent(out) :: Cx_choice
2019-03-13 11:07:31 +01:00
! Open file with method specification
2020-03-15 14:33:53 +01:00
open(unit=1,file='input/dft')
2019-03-13 11:07:31 +01:00
! Default values
2020-03-15 08:23:01 +01:00
method = 'GOK-RKS'
2019-03-13 11:07:31 +01:00
x_rung = 1
c_rung = 1
x_DFA = 'RS51'
c_DFA = 'RVWN5'
2019-03-13 11:07:31 +01:00
SGn = 0
wEns(:) = 0d0
2020-03-15 08:23:01 +01:00
! Restricted or unrestricted calculation
read(1,*)
read(1,*) method
2019-03-13 11:07:31 +01:00
! EXCHANGE: read rung of Jacob's ladder
2020-03-17 11:29:20 +01:00
read(1,*)
read(1,*)
read(1,*)
read(1,*)
read(1,*)
2019-03-13 11:07:31 +01:00
read(1,*)
read(1,*) x_rung,x_DFA
! CORRELATION: read rung of Jacob's ladder
2020-03-17 11:29:20 +01:00
read(1,*)
read(1,*)
read(1,*)
read(1,*)
read(1,*)
2019-03-13 11:07:31 +01:00
read(1,*)
read(1,*) c_rung,c_DFA
! Read SG-n grid
read(1,*)
read(1,*) SGn
! Read number of states in ensemble
read(1,*)
read(1,*) nEns
if(nEns.gt.maxEns) then
write(*,*) ' Number of states in ensemble too big!! '
stop
endif
write(*,*)'----------------------------------------------------------'
write(*,'(A33,I3)')' Number of states in ensemble = ',nEns
write(*,*)'----------------------------------------------------------'
write(*,*)
2020-09-11 11:55:04 +02:00
! Read occupation numbers for orbitals nO and nO+1
2020-09-11 11:55:04 +02:00
occnum(:,:,:) = 0d0
do iEns=1,nEns
read(1,*)
read(1,*) (occnum(iBas,1,iEns),iBas=1,nBas)
read(1,*) (occnum(iBas,2,iEns),iBas=1,nBas)
end do
do iEns=1,nEns
write(*,*)
write(*,*) '==============='
write(*,*) 'State n.',iEns
write(*,*) '==============='
write(*,*)
write(*,*) 'Spin-up occupation numbers'
write(*,*) (int(occnum(iBas,1,iEns)),iBas=1,nBas)
write(*,*) 'Spin-down occupation numbers'
write(*,*) (int(occnum(iBas,2,iEns)),iBas=1,nBas)
write(*,*)
end do
! Read ensemble weights for real physical (fractional number of electrons) ensemble (w1,w2)
2020-09-11 11:55:04 +02:00
allocate(nEl(nEns))
nEl(:) = 0d0
do iEns=1,nEns
do iBas=1,nBas
nEl(iEns) = nEl(iEns) + occnum(iBas,1,iEns) + occnum(iBas,2,iEns)
end do
end do
print*,'nEl'
print*,nEl
2019-03-13 11:07:31 +01:00
read(1,*)
2020-09-11 11:55:04 +02:00
read(1,*) (wEns(iEns),iEns=2,nEns)
read(1,*)
read(1,*) doNcentered
2020-09-11 11:55:04 +02:00
if (doNcentered==0) then
2020-09-11 11:55:04 +02:00
wEns(1) = 1d0 - wEns(2) - wEns(3)
2020-09-11 11:55:04 +02:00
else
2020-09-11 11:55:04 +02:00
! wEns(1) = 1d0 - nEl(2)/nEl(1)*wEns(2) - nEl(3)/nEl(1)*wEns(3)
wEns(1) = 1d0 - wEns(2) - wEns(3)
wEns(2) = nEl(1)/nEl(2)*wEns(2)
wEns(3) = nEl(1)/nEl(3)*wEns(3)
end if
2020-09-11 11:55:04 +02:00
2019-03-13 11:07:31 +01:00
write(*,*)'----------------------------------------------------------'
write(*,*)' Ensemble weights '
write(*,*)'----------------------------------------------------------'
call matout(nEns,1,wEns)
write(*,*)
! Read parameters for weight-dependent functional
read(1,*)
2020-09-11 11:55:04 +02:00
read(1,*) (aCC_w1(iParam),iParam=1,3)
read(1,*) (aCC_w2(iParam),iParam=1,3)
! Read choice of exchange coefficient
read(1,*)
read(1,*) Cx_choice
write(*,*)'----------------------------------------------------------'
write(*,*)' parameters for w1-dependant exchange functional coefficient '
write(*,*)'----------------------------------------------------------'
call matout(3,1,aCC_w1)
write(*,*)
write(*,*)'----------------------------------------------------------'
write(*,*)' parameters for w2-dependant exchange functional coefficient '
write(*,*)'----------------------------------------------------------'
call matout(3,1,aCC_w2)
write(*,*)
2019-03-13 11:07:31 +01:00
! Read KS options
maxSCF = 64
thresh = 1d-6
DIIS = .false.
max_diis = 5
guess_type = 1
ortho_type = 1
read(1,*)
read(1,*) maxSCF,thresh,answer,max_diis,guess_type,ortho_type
if(answer == 'T') DIIS = .true.
if(.not.DIIS) max_diis = 1
! Close file with options
2020-03-15 14:33:53 +01:00
close(unit=1)
2019-03-13 11:07:31 +01:00
end subroutine read_options