qp2/src/kohn_sham/ks_scf.irp.f

102 lines
2.4 KiB
Fortran

program ks_scf
BEGIN_DOC
! Produce `Kohn_Sham` MO orbital
! output: mo_basis.mo_num mo_basis.mo_label mo_basis.ao_md5 mo_basis.mo_coef mo_basis.mo_occ
! output: kohn_sham.energy
! optional: mo_basis.mo_coef
END_DOC
io_mo_one_e_integrals = "None"
touch io_mo_one_e_integrals
io_ao_one_e_integrals = "None"
touch io_ao_one_e_integrals
density_for_dft ="KS"
touch density_for_dft
print*, '**************************'
print*, 'mu_erf_dft = ',mu_erf_dft
print*, '**************************'
call check_coherence_functional
call create_guess
call orthonormalize_mos
call run
end
subroutine check_coherence_functional
implicit none
integer :: ifound_x,ifound_c
if(exchange_functional.eq."None")then
ifound_x = 1
else
ifound_x = index(exchange_functional,"short_range")
endif
if(correlation_functional.eq."None")then
ifound_c = 1
else
ifound_c = index(correlation_functional,"short_range")
endif
print*,ifound_x,ifound_c
if(ifound_x .ne.0 .or. ifound_c .ne. 0)then
print*,'YOU ARE USING THE RANGE SEPARATED KS PROGRAM BUT YOUR INPUT KEYWORD FOR '
print*,'exchange_functional is ',exchange_functional
print*,'correlation_functional is ',correlation_functional
print*,'CHANGE THE exchange_functional and correlation_functional keywords to range separated functionals'
print*,'or switch to the KS_SCF program that uses regular functionals'
stop
endif
end
subroutine create_guess
implicit none
BEGIN_DOC
! Create a MO guess if no MOs are present in the EZFIO directory
END_DOC
logical :: exists
PROVIDE ezfio_filename
call ezfio_has_mo_basis_mo_coef(exists)
if (.not.exists) then
if (mo_guess_type == "HCore") then
mo_coef = ao_ortho_lowdin_coef
TOUCH mo_coef
mo_label = 'Guess'
call mo_as_eigvectors_of_mo_matrix(mo_one_e_integrals,size(mo_one_e_integrals,1),size(mo_one_e_integrals,2),mo_label,.false.)
SOFT_TOUCH mo_coef mo_label
else if (mo_guess_type == "Huckel") then
call huckel_guess
else
print *, 'Unrecognized MO guess type : '//mo_guess_type
stop 1
endif
endif
end
subroutine run
BEGIN_DOC
! Run SCF calculation
END_DOC
use bitmasks
implicit none
double precision :: EHF
EHF = KS_energy
mo_label = "Orthonormalized"
! Choose SCF algorithm
write(json_unit,*) '"scf" : ['
call Roothaan_Hall_SCF
write(json_unit,*) ']'
call json_close
end