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.'
383 call parse_variable(namespace,
'SCFCalculateStress', .false. , scf%calc_stress)
397 call parse_variable(namespace,
'SCFCalculateDipole', .not. space%is_periodic(), scf%calc_dipole)
398 if (
allocated(hm%vberry)) scf%calc_dipole = .
true.
413 call parse_variable(namespace,
'SCFCalculateOrbitalMoments', .false. , scf%calc_orb_moments)
414 if((st%d%ispin /=
spinors .or. space%dim /= 3) .and. scf%calc_orb_moments)
then
415 message(1) =
"Orbital moments are only implemented for spinors and in 3D."
418 if (scf%calc_orb_moments .and. .not. (hm%ep%reltype ==
spin_orbit &
420 message(1) =
"Orbital moments are only available with SOC."
423 if(gr%use_curvilinear .and. scf%calc_orb_moments)
then
435 call parse_variable(namespace,
'SCFCalculatePartialCharges', .false., scf%calc_partial_charges)
436 if (scf%calc_partial_charges)
call messages_experimental(
'SCFCalculatePartialCharges', namespace=namespace)
438 rmin = ions%min_distance()
454 scf%forced_finish = .false.
462 type(
scf_t),
intent(inout) :: scf
471 if(scf%mix_field /= option__mixfield__none)
call mix_end(scf%smix)
473 nullify(scf%mixfield)
475 if (scf%mix_field /= option__mixfield__states .and. scf%mix_field /= option__mixfield__none)
then
480 call iter%start(scf%criterion_list)
481 do while (iter%has_next())
482 crit => iter%get_next()
483 safe_deallocate_p(crit)
492 type(
scf_t),
intent(inout) :: scf
498 if (scf%mix_field /= option__mixfield__states .and. scf%mix_field /= option__mixfield__none)
then
508 subroutine scf_load(scf, namespace, space, gr, ions, ext_partners, st, ks, hm, restart_load)
509 type(
scf_t),
intent(inout) :: scf
512 type(
grid_t),
intent(inout) :: gr
513 type(
ions_t),
intent(in) :: ions
516 type(
v_ks_t),
intent(inout) :: ks
518 type(
restart_t),
intent(in) :: restart_load
520 integer :: ierr, is, ip
528 message(1) =
'Unable to read density. Density will be calculated from states.'
531 if (
bitand(ks%xc_family, xc_family_oep) == 0)
then
532 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners)
535 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners)
542 call hm%ks_pot%load(restart_load, gr, ierr)
544 message(1) =
'Unable to read Vhxc. Vhxc will be calculated from states.'
547 call hm%update(gr, namespace, space, ext_partners)
548 if (
bitand(ks%xc_family, xc_family_oep) /= 0)
then
551 do is = 1, st%d%nspin
554 ks%oep%vxc(ip, is) = hm%ks_pot%vhxc(ip, is) - hm%ks_pot%vhartree(ip)
558 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners)
565 if (scf%mix_field == option__mixfield__density .or. scf%mix_field == option__mixfield__potential)
then
566 call mix_load(namespace, restart_load, scf%smix, gr, ierr)
568 message(1) =
"Unable to read mixing information. Mixing will start from scratch."
575 call lda_u_load(restart_load, hm%lda_u, st, hm%energy%dft_u, ierr)
577 message(1) =
"Unable to read DFT+U information. DFT+U data will be calculated from states."
597 subroutine scf_start(scf, namespace, gr, ions, st, ks, hm, outp, verbosity)
598 type(
scf_t),
intent(inout) :: scf
600 type(
grid_t),
intent(inout) :: gr
601 type(
ions_t),
intent(inout) :: ions
605 type(
output_t),
optional,
intent(in) :: outp
606 integer,
optional,
intent(in) :: verbosity
612 if(scf%forced_finish)
then
613 message(1) =
"Previous clean stop, not doing SCF and quitting."
617 if (.not. hm%is_hermitian())
then
618 message(1) =
"Trying to run a SCF calculation for a non-hermitian Hamiltonian. This is not supported."
624 scf%output_during_scf = .false.
625 scf%output_forces = .false.
626 scf%calc_current = .false.
628 if (
present(outp))
then
631 if (outp%what(option__output__stress))
then
632 scf%calc_stress = .
true.
635 scf%output_during_scf = outp%duringscf
638 if (outp%duringscf .and. outp%what(option__output__forces))
then
639 scf%output_forces = .
true.
643 safe_allocate(scf%rhoout(1:gr%np, 1:st%d%nspin))
644 safe_allocate(scf%rhoin (1:gr%np, 1:st%d%nspin))
646 call lalg_copy(gr%np, st%d%nspin, st%rho, scf%rhoin)
649 if (scf%calc_force .or. scf%output_forces)
then
651 safe_allocate(scf%vhxc_old(1:gr%np, 1:st%d%nspin))
652 call lalg_copy(gr%np, st%d%nspin, hm%ks_pot%vhxc, scf%vhxc_old)
656 select case(scf%mix_field)
657 case(option__mixfield__potential)
660 case(option__mixfield__density)
663 case(option__mixfield__states)
666 allocate(
wfs_elec_t::scf%psioutb (st%group%block_start:st%group%block_end, st%d%kpt%start:st%d%kpt%end))
668 do iqn = st%d%kpt%start, st%d%kpt%end
669 do ib = st%group%block_start, st%group%block_end
670 call st%group%psib(ib, iqn)%copy_to(scf%psioutb(ib, iqn))
678 if (scf%mix_field /= option__mixfield__states .and. scf%mix_field /= option__mixfield__none)
then
684 if ( scf%verbosity_ /= verb_no )
then
685 if(scf%max_iter > 0)
then
686 write(
message(1),
'(a)')
'Info: Starting SCF iteration.'
688 write(
message(1),
'(a)')
'Info: No SCF iterations will be done.'
695 scf%converged_current = .false.
705 character(len=*),
intent(in) :: dir
706 character(len=*),
intent(in) :: fname
709 character(len=12) :: label
710 if(st%system_grp%is_root())
then
712 iunit =
io_open(trim(dir) //
"/" // trim(fname), namespace, action=
'write')
713 write(iunit,
'(a)', advance =
'no')
'#iter energy '
714 label =
'energy_diff'
715 write(iunit,
'(1x,a)', advance =
'no') label
717 write(iunit,
'(1x,a)', advance =
'no') label
719 write(iunit,
'(1x,a)', advance =
'no') label
721 write(iunit,
'(1x,a)', advance =
'no') label
723 write(iunit,
'(1x,a)', advance =
'no') label
727 label =
'OEP norm2ss'
728 write(iunit,
'(1x,a)', advance =
'no') label
731 write(iunit,
'(a)')
''
741 subroutine scf_run(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, outp, &
742 verbosity, iters_done, restart_dump)
743 type(
scf_t),
intent(inout) :: scf
747 type(
grid_t),
intent(inout) :: gr
748 type(
ions_t),
intent(inout) :: ions
751 type(
v_ks_t),
intent(inout) :: ks
753 type(
output_t),
optional,
intent(in) :: outp
754 integer,
optional,
intent(in) :: verbosity
755 integer,
optional,
intent(out) :: iters_done
756 type(
restart_t),
optional,
intent(in) :: restart_dump
763 call scf_start(scf, namespace, gr, ions, st, ks, hm, outp, verbosity)
766 do iter = 1, scf%max_iter
768 call scf_iter(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, iter, outp, &
771 completed =
scf_iter_finish(scf, namespace, space, gr, ions, st, ks, hm, iter, outp, iters_done)
773 if(scf%forced_finish .or. completed)
then
778 if (.not.scf%forced_finish)
then
780 call scf_finish(scf, namespace, space, gr, ions, ext_partners, st, ks, hm, iter, outp)
787 subroutine scf_iter(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, iter, outp, &
789 type(
scf_t),
intent(inout) :: scf
793 type(
grid_t),
intent(inout) :: gr
794 type(
ions_t),
intent(inout) :: ions
797 type(
v_ks_t),
intent(inout) :: ks
799 integer,
intent(in) :: iter
800 type(
output_t),
optional,
intent(in) :: outp
801 type(
restart_t),
optional,
intent(in) :: restart_dump
803 integer :: iqn, ib, ierr
806 logical :: is_crit_conv
807 real(real64) :: etime, itime
816 scf%eigens%converged = 0
819 call hm%update_span(gr%spacing(1:space%dim), minval(st%eigenval(:, :)), namespace)
825 call iterator%start(scf%criterion_list)
826 do while (iterator%has_next())
827 crit => iterator%get_next()
831 if (scf%calc_force .or. scf%output_forces)
then
833 scf%vhxc_old(1:gr%np, 1:st%d%nspin) = hm%ks_pot%vhxc(1:gr%np, 1:st%d%nspin)
838 if (
allocated(hm%vberry))
then
841 ks%frozen_hxc = .
true.
843 call berry_perform_internal_scf(scf%berry, namespace, space, scf%eigens, gr, st, hm, iter, ks, ions, ext_partners)
845 ks%frozen_hxc = .false.
847 scf%eigens%converged = 0
848 call scf%eigens%run(namespace, gr, st, hm, space, ext_partners, iter)
851 scf%matvec = scf%matvec + scf%eigens%matvec
860 call lalg_copy(gr%np, st%d%nspin, st%rho, scf%rhoout)
862 select case (scf%mix_field)
863 case (option__mixfield__potential)
864 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_current=scf%output_during_scf)
867 case (option__mixfield__density)
869 case(option__mixfield__states)
870 do iqn = st%d%kpt%start, st%d%kpt%end
871 do ib = st%group%block_start, st%group%block_end
872 call st%group%psib(ib, iqn)%copy_data_to(gr%np, scf%psioutb(ib, iqn))
877 if (scf%mix_field /= option__mixfield__states .and. scf%mix_field /= option__mixfield__none)
then
884 if (
present(outp))
then
886 if (outp%duringscf .and. outp%what_now(option__output__forces, iter))
then
887 call forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, vhxc_old=scf%vhxc_old)
892 call iterator%start(scf%criterion_list)
893 do while (iterator%has_next())
894 crit => iterator%get_next()
899 scf%converged_last = scf%converged_current
901 scf%converged_current = scf%check_conv .and. &
902 (.not. scf%conv_eigen_error .or. all(scf%eigens%converged >= st%nst_conv))
904 call iterator%start(scf%criterion_list)
905 do while (iterator%has_next())
906 crit => iterator%get_next()
907 call crit%is_converged(is_crit_conv)
908 scf%converged_current = scf%converged_current .and. is_crit_conv
913 scf%finish = scf%converged_last .and. scf%converged_current
919 select case (scf%mix_field)
920 case (option__mixfield__density)
922 call mixing(namespace, scf%smix)
928 if (minval(st%rho(1:gr%np, 1:st%d%spin_channels)) < -1e-6_real64)
then
929 write(
message(1),*)
'Negative density after mixing. Minimum value = ', &
930 minval(st%rho(1:gr%np, 1:st%d%spin_channels))
934 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_current=scf%output_during_scf)
936 case (option__mixfield__potential)
938 call mixing(namespace, scf%smix)
944 case(option__mixfield__states)
945 do iqn = st%d%kpt%start, st%d%kpt%end
946 do ib = st%group%block_start, st%group%block_end
952 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_current=scf%output_during_scf)
954 case (option__mixfield__none)
955 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_current=scf%output_during_scf)
961 if (scf%finish .and. st%modelmbparticles%nparticle > 0)
then
965 if (
present(outp) .and.
present(restart_dump))
then
969 .or. iter == scf%max_iter .or. scf%forced_finish) )
then
971 call states_elec_dump(restart_dump, space, st, gr, hm%kpoints, ierr, iter=iter)
973 message(1) =
'Unable to write states wavefunctions.'
979 message(1) =
'Unable to write density.'
984 call lda_u_dump(restart_dump, namespace, hm%lda_u, st, gr, ierr)
986 message(1) =
'Unable to write DFT+U information.'
991 select case (scf%mix_field)
992 case (option__mixfield__density)
993 call mix_dump(namespace, restart_dump, scf%smix, gr, ierr)
995 message(1) =
'Unable to write mixing information.'
998 case (option__mixfield__potential)
999 call hm%ks_pot%dump(restart_dump, gr, ierr)
1001 message(1) =
'Unable to write Vhxc.'
1005 call mix_dump(namespace, restart_dump, scf%smix, gr, ierr)
1007 message(1) =
'Unable to write mixing information.'
1026 character(len=50) :: str
1027 real(real64) :: dipole(1:space%dim)
1033 write(str,
'(a,i5)')
'SCF CYCLE ITER #' ,iter
1037 ' rel_ev = ', scf%evsum_diff/(abs(scf%evsum_out)+1e-20)
1038 write(
message(2),
'(a,es15.2,2(a,es9.2))') &
1039 ' ediff = ', scf%energy_diff,
' abs_dens = ', scf%abs_dens_diff, &
1040 ' rel_dens = ', scf%abs_dens_diff/st%qtot
1043 write(
message(1),
'(a,i0)')
'Matrix vector products: ', scf%eigens%matvec
1044 write(
message(2),
'(a,i0)')
'Converged eigenvectors: ', sum(scf%eigens%converged(1:st%nik))
1048 if (
allocated(hm%vberry))
then
1050 call write_dipole(st, hm, space, dipole, namespace=namespace)
1063 write(
message(2),
'(a,i5,a,f14.2)')
'Elapsed time for SCF step ', iter,
':', etime
1073 write(
message(1),
'(a,i4,a,es15.8, a,es9.2, a, f7.1, a)') &
1076 ' : abs_dens', scf%abs_dens_diff, &
1077 ' : etime ', etime,
's'
1087 character(len=*),
intent(in) :: dir
1088 character(len=*),
intent(in) :: fname
1092 if(st%system_grp%is_root())
then
1094 iunit =
io_open(trim(dir) //
"/" // trim(fname), namespace, action=
'write', position=
'append')
1096 call iterator%start(scf%criterion_list)
1097 do while (iterator%has_next())
1098 crit => iterator%get_next()
1103 write(iunit,
'(2es13.5)', advance =
'no') crit%val_abs, crit%val_rel
1106 write(iunit,
'(es13.5)', advance =
'no') crit%val_rel
1114 write(iunit,
'(es13.5)', advance =
'no') ks%oep%norm2ss
1117 write(iunit,
'(a)')
''
1124 logical function scf_iter_finish(scf, namespace, space, gr, ions, st, ks, hm, iter, outp, &
1125 iters_done)
result(completed)
1126 type(
scf_t),
intent(inout) :: scf
1129 type(
grid_t),
intent(inout) :: gr
1130 type(
ions_t),
intent(inout) :: ions
1132 type(
v_ks_t),
intent(inout) :: ks
1134 integer,
intent(in) :: iter
1135 type(
output_t),
optional,
intent(in) :: outp
1136 integer,
optional,
intent(out) :: iters_done
1138 character(len=MAX_PATH_LEN) :: dirname
1139 integer(int64) :: what_i
1146 if(
present(iters_done)) iters_done = iter
1148 write(
message(1),
'(a, i4, a)')
'Info: SCF converged in ', iter,
' iterations'
1156 if (
present(outp))
then
1157 if (any(outp%what) .and. outp%duringscf)
then
1158 do what_i = lbound(outp%what, 1), ubound(outp%what, 1)
1159 if (outp%what_now(what_i, iter))
then
1160 write(dirname,
'(a,a,i4.4)') trim(outp%iter_dir),
"scf.", iter
1161 call output_all(outp, namespace, space, dirname, gr, ions, iter, st, hm, ks)
1162 call output_modelmb(outp, namespace, space, dirname, gr, ions, iter, st)
1170 call lalg_copy(gr%np, st%d%nspin, st%rho, scf%rhoin)
1173 if (scf%mix_field /= option__mixfield__none)
then
1174 if (scf%smix%ns_restart > 0)
then
1175 if (
mix_scheme(scf%smix) /= option__mixingscheme__broyden_adaptive .and. &
1176 mod(iter, scf%smix%ns_restart) == 0)
then
1177 message(1) =
"Info: restarting mixing."
1184 select case(scf%mix_field)
1185 case(option__mixfield__potential)
1188 case (option__mixfield__density)
1193 if (scf%mix_field /= option__mixfield__states .and. scf%mix_field /= option__mixfield__none)
then
1204 subroutine scf_finish(scf, namespace, space, gr, ions, ext_partners, st, ks, hm, iter, outp)
1205 type(
scf_t),
intent(inout) :: scf
1208 type(
grid_t),
intent(inout) :: gr
1209 type(
ions_t),
intent(inout) :: ions
1212 type(
v_ks_t),
intent(inout) :: ks
1214 integer,
intent(in) :: iter
1215 type(
output_t),
optional,
intent(in) :: outp
1226 if ((scf%max_iter > 0 .and. scf%mix_field == option__mixfield__potential) .or. scf%calc_current)
then
1227 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
1228 calc_current=scf%calc_current)
1231 select case(scf%mix_field)
1232 case(option__mixfield__states)
1234 do iqn = st%d%kpt%start, st%d%kpt%end
1235 do ib = st%group%block_start, st%group%block_end
1236 call scf%psioutb(ib, iqn)%end()
1241 deallocate(scf%psioutb)
1244 safe_deallocate_a(scf%rhoout)
1245 safe_deallocate_a(scf%rhoin)
1247 if (scf%max_iter > 0 .and. any(scf%eigens%converged < st%nst))
then
1248 write(
message(1),
'(a)')
'Some of the states are not fully converged!'
1249 if (all(scf%eigens%converged >= st%nst_conv))
then
1250 write(
message(2),
'(a)')
'But all requested states to converge are converged.'
1254 write(
message(2),
'(a)')
'With the Chebyshev filtering eigensolver, it usually helps to'
1255 write(
message(3),
'(a)')
'increase ExtraStates and set ExtraStatesToConverge to the number'
1256 write(
message(4),
'(a)')
'of states to be converged.'
1264 if (.not.scf%finish)
then
1265 write(
message(1),
'(a,i4,a)')
'SCF *not* converged after ', iter - 1,
' iterations.'
1267 write(
message(2),
'(a)')
'With the Chebyshev filtering eigensolver, it usually helps to'
1268 write(
message(3),
'(a)')
'increase ExtraStates to improve convergence.'
1275 write(
message(1),
'(a,i10)')
'Info: Number of matrix-vector products: ', scf%matvec
1278 if (scf%calc_force)
then
1279 call forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, vhxc_old=scf%vhxc_old)
1282 if (scf%calc_stress)
call stress_calculate(namespace, gr, hm, st, ions, ks, ext_partners)
1285 if (scf%mix_field == option__mixfield__potential)
then
1290 if(
present(outp))
then
1297 if (space%is_periodic() .and. st%nik > st%d%nspin)
then
1300 ions, gr, hm%kpoints, hm%phase, vec_pot = hm%hm_base%uniform_vector_potential, &
1301 vec_pot_var = hm%hm_base%vector_potential)
1305 if (ks%vdw%vdw_correction == option__vdwcorrection__vdw_ts)
then
1309 safe_deallocate_a(scf%vhxc_old)
1317 character(len=*),
intent(in) :: dir, fname
1320 real(real64) :: dipole(1:space%dim)
1321 real(real64) :: ex_virial
1325 if(st%system_grp%is_root())
then
1327 iunit =
io_open(trim(dir) //
"/" // trim(fname), namespace, action=
'write')
1333 if (space%is_periodic())
then
1334 call hm%kpoints%write_info(iunit=iunit)
1342 write(iunit,
'(a, i4, a)')
'SCF converged in ', iter,
' iterations'
1344 write(iunit,
'(a)')
'SCF *not* converged!'
1346 write(iunit,
'(1x)')
1348 if(any(scf%eigens%converged < st%nst))
then
1349 write(iunit,
'(a)')
'Some of the states are not fully converged!'
1350 if (all(scf%eigens%converged >= st%nst_conv))
then
1351 write(iunit,
'(a)')
'But all requested states to converge are converged.'
1356 write(iunit,
'(1x)')
1358 if (space%is_periodic())
then
1360 write(iunit,
'(1x)')
1370 if(st%system_grp%is_root())
write(iunit,
'(1x)')
1373 calc_orb_moments=scf%calc_orb_moments)
1374 if (st%system_grp%is_root())
write(iunit,
'(1x)')
1377 if(st%d%ispin ==
spinors .and. space%dim == 3 .and. &
1380 if(st%system_grp%is_root())
write(iunit,
'(1x)')
1386 if(st%system_grp%is_root())
write(iunit,
'(1x)')
1389 if(scf%calc_dipole)
then
1396 hm%xc%functional(
func_c,1)%family == xc_family_none .and. st%d%ispin /=
spinors &
1397 .and. .not. space%is_periodic())
then
1400 if (st%system_grp%is_root())
then
1404 write(iunit,
'(1x)')
1408 if(st%system_grp%is_root())
then
1409 if(scf%max_iter > 0)
then
1410 write(iunit,
'(a)')
'Convergence:'
1411 call iterator%start(scf%criterion_list)
1412 do while (iterator%has_next())
1413 crit => iterator%get_next()
1414 call crit%write_info(iunit)
1422 call ks%v_ks_photons%write_info(iunit)
1427 if (scf%calc_stress)
then
1428 call output_stress(iunit, space%periodic_dim, st%stress_tensors, all_terms=.false.)
1429 call output_pressure(iunit, space%periodic_dim, st%stress_tensors%total)
1434 if(scf%calc_partial_charges)
then
1438 if(st%system_grp%is_root())
then
1469 real(real64) :: mem_tmp
1473 if(
conf%report_memory)
then
1475 call mpi_world%allreduce(mem, mem_tmp, 1, mpi_double_precision, mpi_sum)
1477 write(
message(1),
'(a,f14.2)')
'Memory usage [Mbytes] :', mem
1487 type(
scf_t),
intent(inout) :: scf
1493 select type (criterion)
1495 scf%energy_in = hm%energy%total
1510 type(
scf_t),
intent(inout) :: scf
1513 type(
grid_t),
intent(in) :: gr
1514 real(real64),
intent(in) :: rhoout(:,:), rhoin(:,:)
1518 real(real64),
allocatable :: tmp(:)
1522 select type (criterion)
1524 scf%energy_diff = abs(hm%energy%total - scf%energy_in)
1527 scf%abs_dens_diff =
m_zero
1528 safe_allocate(tmp(1:gr%np))
1529 do is = 1, st%d%nspin
1530 tmp(:) = abs(rhoin(1:gr%np, is) - rhoout(1:gr%np, is))
1531 scf%abs_dens_diff = scf%abs_dens_diff +
dmf_integrate(gr, tmp)
1533 safe_deallocate_a(tmp)
1537 scf%evsum_diff = abs(scf%evsum_out - scf%evsum_in)
1538 scf%evsum_in = scf%evsum_out
1548 subroutine write_dipole(st, hm, space, dipole, iunit, namespace)
1552 real(real64),
intent(in) :: dipole(:)
1553 integer,
optional,
intent(in) :: iunit
1554 type(
namespace_t),
optional,
intent(in) :: namespace
1558 if(st%system_grp%is_root())
then
1559 call output_dipole(dipole, space%dim, iunit=iunit, namespace=namespace)
1561 if (space%is_periodic())
then
1562 message(1) =
"Defined only up to quantum of polarization (e * lattice vector)."
1563 message(2) =
"Single-point Berry's phase method only accurate for large supercells."
1566 if (hm%kpoints%full%npoints > 1)
then
1568 "WARNING: Single-point Berry's phase method for dipole should not be used when there is more than one k-point."
1569 message(2) =
"Instead, finite differences on k-points (not yet implemented) are needed."
1574 message(1) =
"Single-point Berry's phase dipole calculation not correct without integer occupations."
1587 type(
scf_t),
intent(inout) :: scf
1588 logical,
intent(in) :: known_lower_bound
1590 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 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