42 use,
intrinsic :: iso_fortran_env
111 integer,
public,
parameter :: &
119 integer,
public :: max_iter
121 real(real64),
public :: lmm_r
124 logical :: conv_eigen_error
125 logical :: check_conv
128 logical :: calc_force
129 logical,
public :: calc_stress
130 logical :: calc_dipole
131 logical :: calc_partial_charges
132 logical :: calc_orb_moments = .false.
135 type(mixfield_t),
pointer :: mixfield
136 type(eigensolver_t) :: eigens
138 logical :: forced_finish = .false.
139 type(lda_u_mixer_t) :: lda_u_mix
140 type(vtau_mixer_t) :: vtau_mix
141 type(berry_t) :: berry
144 type(restart_t),
public :: restart_load, restart_dump
146 type(criterion_list_t),
public :: criterion_list
147 real(real64) :: energy_in, energy_diff, abs_dens_diff, evsum_in, evsum_out, evsum_diff
150 logical :: converged_current, converged_last
151 integer :: verbosity_
153 real(real64),
allocatable :: rhoout(:,:), rhoin(:,:)
154 real(real64),
allocatable :: vhxc_old(:,:)
155 class(wfs_elec_t),
allocatable :: psioutb(:, :)
156 logical :: output_forces, calc_current, output_during_scf
157 logical :: finish = .false.
163 subroutine scf_init(scf, namespace, gr, ions, st, mc, hm, space)
164 type(scf_t),
intent(inout) :: scf
165 type(grid_t),
intent(in) :: gr
166 type(namespace_t),
intent(in) :: namespace
167 type(ions_t),
intent(in) :: ions
168 type(states_elec_t),
intent(in) :: st
169 type(multicomm_t),
intent(in) :: mc
170 type(hamiltonian_elec_t),
intent(inout) :: hm
171 class(space_t),
intent(in) :: space
174 integer :: mixdefault
175 type(type_t) :: mix_type
176 class(convergence_criterion_t),
pointer :: crit
177 type(criterion_iterator_t) :: iter
178 logical :: deactivate_oracle
201 if (
allocated(hm%vberry))
then
208 call iter%start(scf%criterion_list)
209 do while (iter%has_next())
210 crit => iter%get_next()
213 call crit%set_pointers(scf%energy_diff, scf%energy_in)
215 call crit%set_pointers(scf%abs_dens_diff, st%qtot)
217 call crit%set_pointers(scf%evsum_diff, scf%evsum_out)
224 if(.not. scf%check_conv .and. scf%max_iter < 0)
then
225 call messages_write(
"All convergence criteria are disabled. Octopus is cowardly refusing")
230 call messages_write(
"Please set one of the following variables to a positive value:")
253 call parse_variable(namespace,
'ConvEigenError', .false., scf%conv_eigen_error)
255 if(scf%max_iter < 0) scf%max_iter = huge(scf%max_iter)
261 call eigensolver_init(scf%eigens, namespace, gr, st, hm, mc, space, deactivate_oracle)
263 if(scf%eigens%es_type /=
rs_evo)
then
287 mixdefault = option__mixfield__potential
290 call parse_variable(namespace,
'MixField', mixdefault, scf%mix_field)
294 if (scf%mix_field == option__mixfield__potential .and. hm%theory_level ==
independent_particles)
then
295 call messages_write(
'Input: Cannot mix the potential for non-interacting particles.')
299 if (scf%mix_field == option__mixfield__potential .and. hm%pcm%run_pcm)
then
300 call messages_write(
'Input: You have selected to mix the potential.', new_line = .
true.)
301 call messages_write(
' This might produce convergence problems for solvated systems.', new_line = .
true.)
306 if(scf%mix_field == option__mixfield__density &
309 call messages_write(
'Input: You have selected to mix the density with OEP or MGGA XC functionals.', new_line = .
true.)
310 call messages_write(
' This might produce convergence problems. Mix the potential instead.')
314 if(scf%mix_field == option__mixfield__states)
then
319 select case(scf%mix_field)
320 case (option__mixfield__potential, option__mixfield__density)
322 case(option__mixfield__states)
329 if (scf%mix_field /= option__mixfield__none)
then
330 call mix_init(scf%smix, namespace, space, gr%der, scf%mixdim1, st%d%nspin, func_type_ = mix_type)
334 if (scf%mix_field /= option__mixfield__states .and. scf%mix_field /= option__mixfield__none )
then
340 if(scf%mix_field == option__mixfield__potential)
then
346 scf%mix_field = option__mixfield__none
358 call parse_variable(namespace,
'SCFCalculateForces', .not. ions%only_user_def, scf%calc_force)
360 if(scf%calc_force .and. gr%der%boundaries%spiralBC)
then
361 message(1) =
'Forces cannot be calculated when using spiral boundary conditions.'
362 write(
message(2),
'(a)')
'Please use SCFCalculateForces = no.'
365 if(scf%calc_force)
then
366 if (
allocated(hm%ep%b_field) .or.
allocated(hm%ep%a_static))
then
367 write(
message(1),
'(a)')
'The forces are currently not properly calculated if static'
368 write(
message(2),
'(a)')
'magnetic fields or static vector potentials are present.'
369 write(
message(3),
'(a)')
'Please use SCFCalculateForces = no.'
373 write(
message(1),
'(a)')
'The forces receive no contribution from the ZORA terms of the'
374 write(
message(2),
'(a)')
'Hamiltonian, and are therefore only approximate.'
388 call parse_variable(namespace,
'SCFCalculateStress', .false. , scf%calc_stress)
402 call parse_variable(namespace,
'SCFCalculateDipole', .not. space%is_periodic(), scf%calc_dipole)
403 if (
allocated(hm%vberry)) scf%calc_dipole = .
true.
418 call parse_variable(namespace,
'SCFCalculateOrbitalMoments', .false. , scf%calc_orb_moments)
419 if((st%d%ispin /=
spinors .or. space%dim /= 3) .and. scf%calc_orb_moments)
then
420 message(1) =
"Orbital moments are only implemented for spinors and in 3D."
423 if (scf%calc_orb_moments .and. .not. (hm%ep%reltype ==
spin_orbit &
425 message(1) =
"Orbital moments are only available with SOC."
428 if(gr%use_curvilinear .and. scf%calc_orb_moments)
then
440 call parse_variable(namespace,
'SCFCalculatePartialCharges', .false., scf%calc_partial_charges)
441 if (scf%calc_partial_charges)
call messages_experimental(
'SCFCalculatePartialCharges', namespace=namespace)
443 rmin = ions%min_distance()
459 scf%forced_finish = .false.
467 type(
scf_t),
intent(inout) :: scf
476 if(scf%mix_field /= option__mixfield__none)
call mix_end(scf%smix)
478 nullify(scf%mixfield)
480 if (scf%mix_field /= option__mixfield__states .and. scf%mix_field /= option__mixfield__none)
then
485 call iter%start(scf%criterion_list)
486 do while (iter%has_next())
487 crit => iter%get_next()
488 safe_deallocate_p(crit)
497 type(
scf_t),
intent(inout) :: scf
503 if (scf%mix_field /= option__mixfield__states .and. scf%mix_field /= option__mixfield__none)
then
513 subroutine scf_load(scf, namespace, space, gr, ions, ext_partners, st, ks, hm, restart_load)
514 type(
scf_t),
intent(inout) :: scf
517 type(
grid_t),
intent(inout) :: gr
518 type(
ions_t),
intent(in) :: ions
521 type(
v_ks_t),
intent(inout) :: ks
523 type(
restart_t),
intent(in) :: restart_load
525 integer :: ierr, is, ip
533 message(1) =
'Unable to read density. Density will be calculated from states.'
536 if (
bitand(ks%xc_family, xc_family_oep) == 0)
then
537 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners)
540 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners)
547 call hm%ks_pot%load(restart_load, gr, ierr)
549 message(1) =
'Unable to read Vhxc. Vhxc will be calculated from states.'
552 call hm%update(gr, namespace, space, ext_partners)
553 if (
bitand(ks%xc_family, xc_family_oep) /= 0)
then
556 do is = 1, st%d%nspin
559 ks%oep%vxc(ip, is) = hm%ks_pot%vhxc(ip, is) - hm%ks_pot%vhartree(ip)
563 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners)
570 if (scf%mix_field == option__mixfield__density .or. scf%mix_field == option__mixfield__potential)
then
571 call mix_load(namespace, restart_load, scf%smix, gr, ierr)
573 message(1) =
"Unable to read mixing information. Mixing will start from scratch."
580 call lda_u_load(restart_load, hm%lda_u, st, hm%energy%dft_u, ierr)
582 message(1) =
"Unable to read DFT+U information. DFT+U data will be calculated from states."
602 subroutine scf_start(scf, namespace, gr, ions, st, ks, hm, outp, verbosity)
603 type(
scf_t),
intent(inout) :: scf
605 type(
grid_t),
intent(inout) :: gr
606 type(
ions_t),
intent(inout) :: ions
610 type(
output_t),
optional,
intent(in) :: outp
611 integer,
optional,
intent(in) :: verbosity
617 if(scf%forced_finish)
then
618 message(1) =
"Previous clean stop, not doing SCF and quitting."
622 if (.not. hm%is_hermitian())
then
623 message(1) =
"Trying to run a SCF calculation for a non-hermitian Hamiltonian. This is not supported."
629 scf%output_during_scf = .false.
630 scf%output_forces = .false.
631 scf%calc_current = .false.
633 if (
present(outp))
then
636 if (outp%what(option__output__stress))
then
637 scf%calc_stress = .
true.
640 scf%output_during_scf = outp%duringscf
643 if (outp%duringscf .and. outp%what(option__output__forces))
then
644 scf%output_forces = .
true.
648 safe_allocate(scf%rhoout(1:gr%np, 1:st%d%nspin))
649 safe_allocate(scf%rhoin (1:gr%np, 1:st%d%nspin))
651 call lalg_copy(gr%np, st%d%nspin, st%rho, scf%rhoin)
654 if (scf%calc_force .or. scf%output_forces)
then
656 safe_allocate(scf%vhxc_old(1:gr%np, 1:st%d%nspin))
657 call lalg_copy(gr%np, st%d%nspin, hm%ks_pot%vhxc, scf%vhxc_old)
661 select case(scf%mix_field)
662 case(option__mixfield__potential)
665 case(option__mixfield__density)
668 case(option__mixfield__states)
671 allocate(
wfs_elec_t::scf%psioutb (st%group%block_start:st%group%block_end, st%d%kpt%start:st%d%kpt%end))
673 do iqn = st%d%kpt%start, st%d%kpt%end
674 do ib = st%group%block_start, st%group%block_end
675 call st%group%psib(ib, iqn)%copy_to(scf%psioutb(ib, iqn))
683 if (scf%mix_field /= option__mixfield__states .and. scf%mix_field /= option__mixfield__none)
then
689 if ( scf%verbosity_ /= verb_no )
then
690 if(scf%max_iter > 0)
then
691 write(
message(1),
'(a)')
'Info: Starting SCF iteration.'
693 write(
message(1),
'(a)')
'Info: No SCF iterations will be done.'
700 scf%converged_current = .false.
710 character(len=*),
intent(in) :: dir
711 character(len=*),
intent(in) :: fname
714 character(len=12) :: label
715 if(st%system_grp%is_root())
then
717 iunit =
io_open(trim(dir) //
"/" // trim(fname), namespace, action=
'write')
718 write(iunit,
'(a)', advance =
'no')
'#iter energy '
719 label =
'energy_diff'
720 write(iunit,
'(1x,a)', advance =
'no') label
722 write(iunit,
'(1x,a)', advance =
'no') label
724 write(iunit,
'(1x,a)', advance =
'no') label
726 write(iunit,
'(1x,a)', advance =
'no') label
728 write(iunit,
'(1x,a)', advance =
'no') label
732 label =
'OEP norm2ss'
733 write(iunit,
'(1x,a)', advance =
'no') label
736 write(iunit,
'(a)')
''
746 subroutine scf_run(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, outp, &
747 verbosity, iters_done, restart_dump)
748 type(
scf_t),
intent(inout) :: scf
752 type(
grid_t),
intent(inout) :: gr
753 type(
ions_t),
intent(inout) :: ions
756 type(
v_ks_t),
intent(inout) :: ks
758 type(
output_t),
optional,
intent(in) :: outp
759 integer,
optional,
intent(in) :: verbosity
760 integer,
optional,
intent(out) :: iters_done
761 type(
restart_t),
optional,
intent(in) :: restart_dump
768 call scf_start(scf, namespace, gr, ions, st, ks, hm, outp, verbosity)
771 do iter = 1, scf%max_iter
773 call scf_iter(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, iter, outp, &
776 completed =
scf_iter_finish(scf, namespace, space, gr, ions, st, ks, hm, iter, outp, iters_done)
778 if(scf%forced_finish .or. completed)
then
783 if (.not.scf%forced_finish)
then
785 call scf_finish(scf, namespace, space, gr, ions, ext_partners, st, ks, hm, iter, outp)
792 subroutine scf_iter(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, iter, outp, &
794 type(
scf_t),
intent(inout) :: scf
798 type(
grid_t),
intent(inout) :: gr
799 type(
ions_t),
intent(inout) :: ions
802 type(
v_ks_t),
intent(inout) :: ks
804 integer,
intent(in) :: iter
805 type(
output_t),
optional,
intent(in) :: outp
806 type(
restart_t),
optional,
intent(in) :: restart_dump
808 integer :: iqn, ib, ierr
811 logical :: is_crit_conv
812 real(real64) :: etime, itime
821 scf%eigens%converged = 0
824 call hm%update_span(gr%spacing(1:space%dim), minval(st%eigenval(:, :)), namespace)
830 call iterator%start(scf%criterion_list)
831 do while (iterator%has_next())
832 crit => iterator%get_next()
836 if (scf%calc_force .or. scf%output_forces)
then
838 scf%vhxc_old(1:gr%np, 1:st%d%nspin) = hm%ks_pot%vhxc(1:gr%np, 1:st%d%nspin)
843 if (
allocated(hm%vberry))
then
846 ks%frozen_hxc = .
true.
848 call berry_perform_internal_scf(scf%berry, namespace, space, scf%eigens, gr, st, hm, iter, ks, ions, ext_partners)
850 ks%frozen_hxc = .false.
852 scf%eigens%converged = 0
853 call scf%eigens%run(namespace, gr, st, hm, space, ext_partners, iter)
856 scf%matvec = scf%matvec + scf%eigens%matvec
865 call lalg_copy(gr%np, st%d%nspin, st%rho, scf%rhoout)
867 select case (scf%mix_field)
868 case (option__mixfield__potential)
869 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_current=scf%output_during_scf)
872 case (option__mixfield__density)
874 case(option__mixfield__states)
875 do iqn = st%d%kpt%start, st%d%kpt%end
876 do ib = st%group%block_start, st%group%block_end
877 call st%group%psib(ib, iqn)%copy_data_to(gr%np, scf%psioutb(ib, iqn))
882 if (scf%mix_field /= option__mixfield__states .and. scf%mix_field /= option__mixfield__none)
then
889 if (
present(outp))
then
891 if (outp%duringscf .and. outp%what_now(option__output__forces, iter))
then
892 call forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, vhxc_old=scf%vhxc_old)
897 call iterator%start(scf%criterion_list)
898 do while (iterator%has_next())
899 crit => iterator%get_next()
904 scf%converged_last = scf%converged_current
906 scf%converged_current = scf%check_conv .and. &
907 (.not. scf%conv_eigen_error .or. all(scf%eigens%converged >= st%nst_conv))
909 call iterator%start(scf%criterion_list)
910 do while (iterator%has_next())
911 crit => iterator%get_next()
912 call crit%is_converged(is_crit_conv)
913 scf%converged_current = scf%converged_current .and. is_crit_conv
918 scf%finish = scf%converged_last .and. scf%converged_current
924 select case (scf%mix_field)
925 case (option__mixfield__density)
927 call mixing(namespace, scf%smix)
933 if (minval(st%rho(1:gr%np, 1:st%d%spin_channels)) < -1e-6_real64)
then
934 write(
message(1),*)
'Negative density after mixing. Minimum value = ', &
935 minval(st%rho(1:gr%np, 1:st%d%spin_channels))
939 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_current=scf%output_during_scf)
941 case (option__mixfield__potential)
943 call mixing(namespace, scf%smix)
949 case(option__mixfield__states)
950 do iqn = st%d%kpt%start, st%d%kpt%end
951 do ib = st%group%block_start, st%group%block_end
957 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_current=scf%output_during_scf)
959 case (option__mixfield__none)
960 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_current=scf%output_during_scf)
966 if (scf%finish .and. st%modelmbparticles%nparticle > 0)
then
970 if (
present(outp) .and.
present(restart_dump))
then
974 .or. iter == scf%max_iter .or. scf%forced_finish) )
then
976 call states_elec_dump(restart_dump, space, st, gr, hm%kpoints, ierr, iter=iter)
978 message(1) =
'Unable to write states wavefunctions.'
984 message(1) =
'Unable to write density.'
989 call lda_u_dump(restart_dump, namespace, hm%lda_u, st, gr, ierr)
991 message(1) =
'Unable to write DFT+U information.'
996 select case (scf%mix_field)
997 case (option__mixfield__density)
998 call mix_dump(namespace, restart_dump, scf%smix, gr, ierr)
1000 message(1) =
'Unable to write mixing information.'
1003 case (option__mixfield__potential)
1004 call hm%ks_pot%dump(restart_dump, gr, ierr)
1006 message(1) =
'Unable to write Vhxc.'
1010 call mix_dump(namespace, restart_dump, scf%smix, gr, ierr)
1012 message(1) =
'Unable to write mixing information.'
1031 character(len=50) :: str
1032 real(real64) :: dipole(1:space%dim)
1038 write(str,
'(a,i5)')
'SCF CYCLE ITER #' ,iter
1042 ' rel_ev = ', scf%evsum_diff/(abs(scf%evsum_out)+1e-20)
1043 write(
message(2),
'(a,es15.2,2(a,es9.2))') &
1044 ' ediff = ', scf%energy_diff,
' abs_dens = ', scf%abs_dens_diff, &
1045 ' rel_dens = ', scf%abs_dens_diff/st%qtot
1048 write(
message(1),
'(a,i0)')
'Matrix vector products: ', scf%eigens%matvec
1049 write(
message(2),
'(a,i0)')
'Converged eigenvectors: ', sum(scf%eigens%converged(1:st%nik))
1053 if (
allocated(hm%vberry))
then
1055 call write_dipole(st, hm, space, dipole, namespace=namespace)
1068 write(
message(2),
'(a,i5,a,f14.2)')
'Elapsed time for SCF step ', iter,
':', etime
1078 write(
message(1),
'(a,i4,a,es15.8, a,es9.2, a, f7.1, a)') &
1081 ' : abs_dens', scf%abs_dens_diff, &
1082 ' : etime ', etime,
's'
1092 character(len=*),
intent(in) :: dir
1093 character(len=*),
intent(in) :: fname
1097 if(st%system_grp%is_root())
then
1099 iunit =
io_open(trim(dir) //
"/" // trim(fname), namespace, action=
'write', position=
'append')
1101 call iterator%start(scf%criterion_list)
1102 do while (iterator%has_next())
1103 crit => iterator%get_next()
1108 write(iunit,
'(2es13.5)', advance =
'no') crit%val_abs, crit%val_rel
1111 write(iunit,
'(es13.5)', advance =
'no') crit%val_rel
1119 write(iunit,
'(es13.5)', advance =
'no') ks%oep%norm2ss
1122 write(iunit,
'(a)')
''
1129 logical function scf_iter_finish(scf, namespace, space, gr, ions, st, ks, hm, iter, outp, &
1130 iters_done)
result(completed)
1131 type(
scf_t),
intent(inout) :: scf
1134 type(
grid_t),
intent(inout) :: gr
1135 type(
ions_t),
intent(inout) :: ions
1137 type(
v_ks_t),
intent(inout) :: ks
1139 integer,
intent(in) :: iter
1140 type(
output_t),
optional,
intent(in) :: outp
1141 integer,
optional,
intent(out) :: iters_done
1143 character(len=MAX_PATH_LEN) :: dirname
1144 integer(int64) :: what_i
1151 if(
present(iters_done)) iters_done = iter
1153 write(
message(1),
'(a, i4, a)')
'Info: SCF converged in ', iter,
' iterations'
1161 if (
present(outp))
then
1162 if (any(outp%what) .and. outp%duringscf)
then
1163 do what_i = lbound(outp%what, 1), ubound(outp%what, 1)
1164 if (outp%what_now(what_i, iter))
then
1165 write(dirname,
'(a,a,i4.4)') trim(outp%iter_dir),
"scf.", iter
1166 call output_all(outp, namespace, space, dirname, gr, ions, iter, st, hm, ks)
1167 call output_modelmb(outp, namespace, space, dirname, gr, ions, iter, st)
1175 call lalg_copy(gr%np, st%d%nspin, st%rho, scf%rhoin)
1178 if (scf%mix_field /= option__mixfield__none)
then
1179 if (scf%smix%ns_restart > 0)
then
1180 if (
mix_scheme(scf%smix) /= option__mixingscheme__broyden_adaptive .and. &
1181 mod(iter, scf%smix%ns_restart) == 0)
then
1182 message(1) =
"Info: restarting mixing."
1189 select case(scf%mix_field)
1190 case(option__mixfield__potential)
1193 case (option__mixfield__density)
1198 if (scf%mix_field /= option__mixfield__states .and. scf%mix_field /= option__mixfield__none)
then
1209 subroutine scf_finish(scf, namespace, space, gr, ions, ext_partners, st, ks, hm, iter, outp)
1210 type(
scf_t),
intent(inout) :: scf
1213 type(
grid_t),
intent(inout) :: gr
1214 type(
ions_t),
intent(inout) :: ions
1217 type(
v_ks_t),
intent(inout) :: ks
1219 integer,
intent(in) :: iter
1220 type(
output_t),
optional,
intent(in) :: outp
1231 if ((scf%max_iter > 0 .and. scf%mix_field == option__mixfield__potential) .or. scf%calc_current)
then
1232 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
1233 calc_current=scf%calc_current)
1236 select case(scf%mix_field)
1237 case(option__mixfield__states)
1239 do iqn = st%d%kpt%start, st%d%kpt%end
1240 do ib = st%group%block_start, st%group%block_end
1241 call scf%psioutb(ib, iqn)%end()
1246 deallocate(scf%psioutb)
1249 safe_deallocate_a(scf%rhoout)
1250 safe_deallocate_a(scf%rhoin)
1252 if (scf%max_iter > 0 .and. any(scf%eigens%converged < st%nst))
then
1253 write(
message(1),
'(a)')
'Some of the states are not fully converged!'
1254 if (all(scf%eigens%converged >= st%nst_conv))
then
1255 write(
message(2),
'(a)')
'But all requested states to converge are converged.'
1259 write(
message(2),
'(a)')
'With the Chebyshev filtering eigensolver, it usually helps to'
1260 write(
message(3),
'(a)')
'increase ExtraStates and set ExtraStatesToConverge to the number'
1261 write(
message(4),
'(a)')
'of states to be converged.'
1269 if (.not.scf%finish)
then
1270 write(
message(1),
'(a,i4,a)')
'SCF *not* converged after ', iter - 1,
' iterations.'
1272 write(
message(2),
'(a)')
'With the Chebyshev filtering eigensolver, it usually helps to'
1273 write(
message(3),
'(a)')
'increase ExtraStates to improve convergence.'
1280 write(
message(1),
'(a,i10)')
'Info: Number of matrix-vector products: ', scf%matvec
1283 if (scf%calc_force)
then
1284 call forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, vhxc_old=scf%vhxc_old)
1287 if (scf%calc_stress)
call stress_calculate(namespace, gr, hm, st, ions, ks, ext_partners)
1290 if (scf%mix_field == option__mixfield__potential)
then
1295 if(
present(outp))
then
1302 if (space%is_periodic() .and. st%nik > st%d%nspin)
then
1305 ions, gr, hm%kpoints, hm%phase, vec_pot = hm%hm_base%uniform_vector_potential, &
1306 vec_pot_var = hm%hm_base%vector_potential)
1310 if (ks%vdw%vdw_correction == option__vdwcorrection__vdw_ts)
then
1314 safe_deallocate_a(scf%vhxc_old)
1322 character(len=*),
intent(in) :: dir, fname
1325 real(real64) :: dipole(1:space%dim)
1326 real(real64) :: ex_virial
1330 if(st%system_grp%is_root())
then
1332 iunit =
io_open(trim(dir) //
"/" // trim(fname), namespace, action=
'write')
1338 if (space%is_periodic())
then
1339 call hm%kpoints%write_info(iunit=iunit)
1348 write(iunit,
'(1x)')
1352 write(iunit,
'(a, i4, a)')
'SCF converged in ', iter,
' iterations'
1354 write(iunit,
'(a)')
'SCF *not* converged!'
1356 write(iunit,
'(1x)')
1358 if(any(scf%eigens%converged < st%nst))
then
1359 write(iunit,
'(a)')
'Some of the states are not fully converged!'
1360 if (all(scf%eigens%converged >= st%nst_conv))
then
1361 write(iunit,
'(a)')
'But all requested states to converge are converged.'
1366 write(iunit,
'(1x)')
1368 if (space%is_periodic())
then
1370 write(iunit,
'(1x)')
1380 if(st%system_grp%is_root())
write(iunit,
'(1x)')
1383 calc_orb_moments=scf%calc_orb_moments)
1384 if (st%system_grp%is_root())
write(iunit,
'(1x)')
1387 if(st%d%ispin ==
spinors .and. space%dim == 3 .and. &
1390 if(st%system_grp%is_root())
write(iunit,
'(1x)')
1396 if(st%system_grp%is_root())
write(iunit,
'(1x)')
1399 if(scf%calc_dipole)
then
1406 hm%xc%functional(
func_c,1)%family == xc_family_none .and. st%d%ispin /=
spinors &
1407 .and. .not. space%is_periodic())
then
1410 if (st%system_grp%is_root())
then
1414 write(iunit,
'(1x)')
1418 if(st%system_grp%is_root())
then
1419 if(scf%max_iter > 0)
then
1420 write(iunit,
'(a)')
'Convergence:'
1421 call iterator%start(scf%criterion_list)
1422 do while (iterator%has_next())
1423 crit => iterator%get_next()
1424 call crit%write_info(iunit)
1432 call ks%v_ks_photons%write_info(iunit)
1437 if (scf%calc_stress)
then
1438 call output_stress(iunit, space%periodic_dim, st%stress_tensors, all_terms=.false.)
1439 call output_pressure(iunit, space%periodic_dim, st%stress_tensors%total)
1444 if(scf%calc_partial_charges)
then
1448 if(st%system_grp%is_root())
then
1479 real(real64) :: mem_tmp
1483 if(
conf%report_memory)
then
1485 call mpi_world%allreduce(mem, mem_tmp, 1, mpi_double_precision, mpi_sum)
1487 write(
message(1),
'(a,f14.2)')
'Memory usage [Mbytes] :', mem
1497 type(
scf_t),
intent(inout) :: scf
1503 select type (criterion)
1505 scf%energy_in = hm%energy%total
1520 type(
scf_t),
intent(inout) :: scf
1523 type(
grid_t),
intent(in) :: gr
1524 real(real64),
intent(in) :: rhoout(:,:), rhoin(:,:)
1528 real(real64),
allocatable :: tmp(:)
1532 select type (criterion)
1534 scf%energy_diff = abs(hm%energy%total - scf%energy_in)
1537 scf%abs_dens_diff =
m_zero
1538 safe_allocate(tmp(1:gr%np))
1539 do is = 1, st%d%nspin
1540 tmp(:) = abs(rhoin(1:gr%np, is) - rhoout(1:gr%np, is))
1541 scf%abs_dens_diff = scf%abs_dens_diff +
dmf_integrate(gr, tmp)
1543 safe_deallocate_a(tmp)
1547 scf%evsum_diff = abs(scf%evsum_out - scf%evsum_in)
1548 scf%evsum_in = scf%evsum_out
1558 subroutine write_dipole(st, hm, space, dipole, iunit, namespace)
1562 real(real64),
intent(in) :: dipole(:)
1563 integer,
optional,
intent(in) :: iunit
1564 type(
namespace_t),
optional,
intent(in) :: namespace
1568 if(st%system_grp%is_root())
then
1569 call output_dipole(dipole, space%dim, iunit=iunit, namespace=namespace)
1571 if (space%is_periodic())
then
1572 message(1) =
"Defined only up to quantum of polarization (e * lattice vector)."
1573 message(2) =
"Single-point Berry's phase method only accurate for large supercells."
1576 if (hm%kpoints%full%npoints > 1)
then
1578 "WARNING: Single-point Berry's phase method for dipole should not be used when there is more than one k-point."
1579 message(2) =
"Instead, finite differences on k-points (not yet implemented) are needed."
1584 message(1) =
"Single-point Berry's phase dipole calculation not correct without integer occupations."
1597 type(
scf_t),
intent(inout) :: scf
1598 logical,
intent(in) :: known_lower_bound
1600 call scf%eigens%set_lower_bound_is_known(known_lower_bound)
Copies a vector x, to a vector y.
This module implements common operations on batches of mesh functions.
subroutine, public berry_perform_internal_scf(this, namespace, space, eigensolver, gr, st, hm, iter, ks, ions, ext_partners)
subroutine, public berry_init(this, namespace)
subroutine, public calc_dipole(dipole, space, mesh, st, ions)
subroutine, public criteria_factory_init(list, namespace, check_conv)
This module implements a calculator for the density and defines related functions.
subroutine, public states_elec_sync_buff_density(st, mesh)
Synchronize the GPU density buffer with the host density strho.
subroutine, public density_calc(st, gr, density, istin)
Computes the density from the orbitals in st.
integer, parameter, public rs_evo
subroutine, public eigensolver_init(eigens, namespace, gr, st, hm, mc, space, deactivate_oracle)
integer, parameter, public rs_chebyshev
subroutine, public eigensolver_end(eigens)
integer, parameter, public unpolarized
Parameters...
integer, parameter, public spinors
subroutine, public energy_calc_total(namespace, space, hm, gr, st, ext_partners, iunit, full)
This subroutine calculates the total energy of the system. Basically, it adds up the KS eigenvalues,...
subroutine, public energy_calc_virial_ex(der, vxc, st, ex)
subroutine, public energy_calc_eigenvalues(namespace, hm, der, st)
integer, parameter, public spin_orbit
integer, parameter, public scalar_relativistic_zora
integer, parameter, public fully_relativistic_zora
subroutine, public forces_write_info(iunit, ions, dir, namespace)
subroutine, public forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, vhxc_old, t, dt)
real(real64), parameter, public m_zero
integer, parameter, public hartree_fock
integer, parameter, public independent_particles
Theory level.
integer, parameter, public generalized_kohn_sham_dft
real(real64), parameter, public lmm_r_single_atom
Default local magnetic moments sphere radius for an isolated system.
integer, parameter, public kohn_sham_dft
type(conf_t), public conf
Global instance of Octopus configuration.
character(len= *), parameter, public static_dir
real(real64), parameter, public m_half
real(real64), parameter, public m_one
This module implements the underlying real-space grid.
subroutine, public grid_write_info(gr, iunit, namespace)
subroutine, public hamiltonian_elec_update_pot(this, mesh, accumulate)
Update the KS potential of the electronic Hamiltonian.
This module defines classes and functions for interaction partners.
subroutine, public io_close(iunit, grp)
subroutine, public io_debug_on_the_fly(namespace)
check if debug mode should be enabled or disabled on the fly
subroutine, public io_mkdir(fname, namespace, parents)
integer function, public io_open(file, namespace, action, status, form, position, die, recl, grp)
integer, parameter, public kpoints_path
A module to handle KS potential, without the external potential.
subroutine, public lda_u_dump(restart, namespace, this, st, mesh, ierr)
subroutine, public lda_u_write_u(this, iunit, namespace)
subroutine, public lda_u_load(restart, this, st, dftu_energy, ierr, occ_only, u_only)
subroutine, public lda_u_write_v(this, iunit, namespace)
subroutine, public lda_u_mixer_set_vin(this, mixer)
subroutine, public lda_u_mixer_init(this, mixer, st)
subroutine, public lda_u_mixer_clear(mixer, smix)
subroutine, public lda_u_mixer_init_auxmixer(this, namespace, mixer, smix, st)
subroutine, public lda_u_mixer_get_vnew(this, mixer, st)
subroutine, public lda_u_mixer_set_vout(this, mixer)
subroutine, public lda_u_mixer_end(mixer, smix)
integer, parameter, public dft_u_none
subroutine, public lda_u_update_occ_matrices(this, namespace, mesh, st, phase, energy)
integer, parameter, public dft_u_acbn0
System information (time, memory, sysname)
subroutine, public compute_and_write_magnetic_moments(gr, st, phase, ep, ions, lmm_r, calc_orb_moments, iunit, namespace)
Computes and prints the global and local magnetic moments.
subroutine, public write_total_xc_torque(iunit, mesh, vxc, st)
This module is intended to contain "only mathematical" functions and procedures.
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
subroutine, public messages_print_with_emphasis(msg, iunit, namespace)
subroutine, public messages_not_implemented(feature, namespace)
character(len=512), private msg
subroutine, public messages_warning(no_lines, all_nodes, namespace)
subroutine, public messages_obsolete_variable(namespace, name, rep)
subroutine, public messages_new_line()
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
subroutine, public messages_input_error(namespace, var, details, row, column)
subroutine, public messages_experimental(name, namespace)
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
integer pure function, public mix_scheme(this)
real(real64) pure function, public mix_coefficient(this)
subroutine, public mixing(namespace, smix)
Main entry-point to SCF mixer.
subroutine, public mix_get_field(this, mixfield)
subroutine, public mix_dump(namespace, restart, smix, mesh, ierr)
subroutine, public mix_init(smix, namespace, space, der, d1, d2, def_, func_type_, prefix_)
Initialise mix_t instance.
subroutine, public mix_load(namespace, restart, smix, mesh, ierr)
subroutine, public mix_end(smix)
subroutine, public mix_clear(smix)
subroutine, public modelmb_sym_all_states(space, mesh, st)
type(mpi_grp_t), public mpi_world
This module handles the communicators for the various parallelization strategies.
this module contains the low-level part of the output system
subroutine, public output_modelmb(outp, namespace, space, dir, gr, ions, iter, st)
this module contains the output system
logical function, public output_needs_current(outp, states_are_real)
subroutine, public output_all(outp, namespace, space, dir, gr, ions, iter, st, hm, ks)
subroutine, public partial_charges_compute_and_print_charges(mesh, st, ions, iunit)
Computes and write partial charges to a file.
subroutine, public profiling_out(label)
Increment out counter and sum up difference between entry and exit time.
subroutine, public profiling_in(label, exclude)
Increment in counter and save entry time.
logical function, public clean_stop(comm)
returns true if a file named stop exists
integer, parameter, public restart_flag_mix
integer, parameter, public restart_flag_rho
integer, parameter, public restart_flag_vhxc
subroutine, public scf_finish(scf, namespace, space, gr, ions, ext_partners, st, ks, hm, iter, outp)
subroutine, public scf_set_lower_bound_is_known(scf, known_lower_bound)
Set the flag lower_bound_is_known.
subroutine, public scf_load(scf, namespace, space, gr, ions, ext_partners, st, ks, hm, restart_load)
Loading of restarting data of the SCF cycle.
subroutine write_dipole(st, hm, space, dipole, iunit, namespace)
subroutine scf_update_initial_quantity(scf, hm, criterion)
Update the quantity at the begining of a SCF cycle.
subroutine scf_update_diff_quantity(scf, hm, st, gr, rhoout, rhoin, criterion)
Update the quantity at the begining of a SCF cycle.
subroutine, public scf_state_info(namespace, st)
subroutine, public scf_print_mem_use(namespace)
subroutine, public scf_mix_clear(scf)
subroutine, public scf_start(scf, namespace, gr, ions, st, ks, hm, outp, verbosity)
Preparation of the SCF cycle.
integer, parameter, public verb_full
integer, parameter, public verb_compact
subroutine, public scf_init(scf, namespace, gr, ions, st, mc, hm, space)
subroutine, public scf_end(scf)
subroutine, public scf_run(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, outp, verbosity, iters_done, restart_dump)
Legacy version of the SCF code.
subroutine, public scf_iter(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, iter, outp, restart_dump)
logical function, public scf_iter_finish(scf, namespace, space, gr, ions, st, ks, hm, iter, outp, iters_done)
logical pure function, public smear_is_semiconducting(this)
pure logical function, public states_are_real(st)
This module defines routines to write information about states.
subroutine, public states_elec_write_eigenvalues(nst, st, space, kpoints, error, st_start, compact, iunit, namespace)
write the eigenvalues for some states to a file.
subroutine, public states_elec_write_gaps(iunit, st, space)
calculate gaps and write to a file.
subroutine, public states_elec_write_bandstructure(dir, namespace, nst, st, ions, mesh, kpoints, phase, vec_pot, vec_pot_var)
calculate and write the bandstructure
subroutine, public states_elec_fermi(st, namespace, mesh, compute_spin)
calculate the Fermi level for the states in this object
real(real64) function, public states_elec_eigenvalues_sum(st, alt_eig)
function to calculate the eigenvalues sum using occupations as weights
This module handles reading and writing restart information for the states_elec_t.
subroutine, public states_elec_dump(restart, space, st, mesh, kpoints, ierr, iter, lr, verbose)
subroutine, public states_elec_load_rho(restart, st, mesh, ierr)
subroutine, public states_elec_dump_rho(restart, st, mesh, ierr, iter)
This module implements the calculation of the stress tensor.
subroutine, public output_pressure(iunit, space_dim, total_stress_tensor)
subroutine, public stress_calculate(namespace, gr, hm, st, ions, ks, ext_partners)
This computes the total stress on the lattice.
subroutine, public output_stress(iunit, space_dim, stress_tensors, all_terms)
subroutine, public symmetries_write_info(this, space, iunit, namespace)
type(type_t), parameter, public type_float
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
character(len=20) pure function, public units_abbrev(this)
This module defines the unit system, used for input and output.
type(unit_system_t), public units_out
type(unit_system_t), public units_inp
the units systems for reading and writing
This module is intended to contain simple general-purpose utility functions and procedures.
subroutine, public output_dipole(dipole, ndim, iunit, namespace)
subroutine, public v_ks_write_info(ks, iunit, namespace)
subroutine, public v_ks_update_dftu_energy(ks, namespace, hm, st, int_dft_u)
Update the value of <\psi | V_U | \psi>, where V_U is the DFT+U potential.
subroutine, public v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval, time, calc_energy, calc_current, force_semilocal)
Tkatchenko-Scheffler pairwise method for van der Waals (vdW, dispersion) interactions.
subroutine, public vdw_ts_write_c6ab(this, ions, dir, fname, namespace)
subroutine, public vtau_mixer_end(mixer, smix)
subroutine, public vtau_mixer_init_auxmixer(namespace, mixer, smix, hm, np, nspin)
subroutine, public vtau_mixer_set_vout(mixer, hm)
subroutine, public vtau_mixer_get_vnew(mixer, hm)
subroutine, public vtau_mixer_clear(mixer, smix)
subroutine, public vtau_mixer_set_vin(mixer, hm)
This module provices a simple timer class which can be used to trigger the writing of a restart file ...
logical function, public walltimer_alarm(comm, print)
indicate whether time is up
logical function, public restart_walltime_period_alarm(comm)
integer, parameter, public xc_family_nc_mgga
integer, parameter, public func_c
integer, parameter, public oep_level_full
subroutine scf_write_static(dir, fname)
subroutine create_convergence_file(dir, fname)
subroutine scf_write_iter(namespace)
subroutine write_convergence_file(dir, fname)
Extension of space that contains the knowledge of the spin dimension.
Description of the grid, containing information on derivatives, stencil, and symmetries.
Stores all communicators and groups.
some variables used for the SCF cycle
abstract class for states
The states_elec_t class contains all electronic wave functions.
batches of electronic states