41 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
133 type(mixfield_t),
pointer :: mixfield
134 type(eigensolver_t) :: eigens
136 logical :: forced_finish = .false.
137 type(lda_u_mixer_t) :: lda_u_mix
138 type(vtau_mixer_t) :: vtau_mix
139 type(berry_t) :: berry
142 type(restart_t),
public :: restart_load, restart_dump
144 type(criterion_list_t),
public :: criterion_list
145 real(real64) :: energy_in, energy_diff, abs_dens_diff, evsum_in, evsum_out, evsum_diff
148 logical :: converged_current, converged_last
149 integer :: verbosity_
151 real(real64),
allocatable :: rhoout(:,:), rhoin(:,:)
152 real(real64),
allocatable :: vhxc_old(:,:)
153 class(wfs_elec_t),
allocatable :: psioutb(:, :)
154 logical :: output_forces, calc_current, output_during_scf
155 logical :: finish = .false.
161 subroutine scf_init(scf, namespace, gr, ions, st, mc, hm, space)
162 type(scf_t),
intent(inout) :: scf
163 type(grid_t),
intent(in) :: gr
164 type(namespace_t),
intent(in) :: namespace
165 type(ions_t),
intent(in) :: ions
166 type(states_elec_t),
intent(in) :: st
167 type(multicomm_t),
intent(in) :: mc
168 type(hamiltonian_elec_t),
intent(inout) :: hm
169 class(space_t),
intent(in) :: space
172 integer :: mixdefault
173 type(type_t) :: mix_type
174 class(convergence_criterion_t),
pointer :: crit
175 type(criterion_iterator_t) :: iter
176 logical :: deactivate_oracle
199 if (
allocated(hm%vberry))
then
206 call iter%start(scf%criterion_list)
207 do while (iter%has_next())
208 crit => iter%get_next()
211 call crit%set_pointers(scf%energy_diff, scf%energy_in)
213 call crit%set_pointers(scf%abs_dens_diff, st%qtot)
215 call crit%set_pointers(scf%evsum_diff, scf%evsum_out)
222 if(.not. scf%check_conv .and. scf%max_iter < 0)
then
223 call messages_write(
"All convergence criteria are disabled. Octopus is cowardly refusing")
228 call messages_write(
"Please set one of the following variables to a positive value:")
251 call parse_variable(namespace,
'ConvEigenError', .false., scf%conv_eigen_error)
253 if(scf%max_iter < 0) scf%max_iter = huge(scf%max_iter)
259 call eigensolver_init(scf%eigens, namespace, gr, st, hm, mc, space, deactivate_oracle)
261 if(scf%eigens%es_type /=
rs_evo)
then
285 mixdefault = option__mixfield__potential
288 call parse_variable(namespace,
'MixField', mixdefault, scf%mix_field)
292 if (scf%mix_field == option__mixfield__potential .and. hm%theory_level ==
independent_particles)
then
293 call messages_write(
'Input: Cannot mix the potential for non-interacting particles.')
297 if (scf%mix_field == option__mixfield__potential .and. hm%pcm%run_pcm)
then
298 call messages_write(
'Input: You have selected to mix the potential.', new_line = .
true.)
299 call messages_write(
' This might produce convergence problems for solvated systems.', new_line = .
true.)
304 if(scf%mix_field == option__mixfield__density &
307 call messages_write(
'Input: You have selected to mix the density with OEP or MGGA XC functionals.', new_line = .
true.)
308 call messages_write(
' This might produce convergence problems. Mix the potential instead.')
312 if(scf%mix_field == option__mixfield__states)
then
317 select case(scf%mix_field)
318 case (option__mixfield__potential, option__mixfield__density)
320 case(option__mixfield__states)
327 if (scf%mix_field /= option__mixfield__none)
then
328 call mix_init(scf%smix, namespace, space, gr%der, scf%mixdim1, st%d%nspin, func_type_ = mix_type)
332 if (scf%mix_field /= option__mixfield__states .and. scf%mix_field /= option__mixfield__none )
then
338 if(scf%mix_field == option__mixfield__potential)
then
344 scf%mix_field = option__mixfield__none
356 call parse_variable(namespace,
'SCFCalculateForces', .not. ions%only_user_def, scf%calc_force)
358 if(scf%calc_force .and. gr%der%boundaries%spiralBC)
then
359 message(1) =
'Forces cannot be calculated when using spiral boundary conditions.'
360 write(
message(2),
'(a)')
'Please use SCFCalculateForces = no.'
363 if(scf%calc_force)
then
364 if (
allocated(hm%ep%b_field) .or.
allocated(hm%ep%a_static))
then
365 write(
message(1),
'(a)')
'The forces are currently not properly calculated if static'
366 write(
message(2),
'(a)')
'magnetic fields or static vector potentials are present.'
367 write(
message(3),
'(a)')
'Please use SCFCalculateForces = no.'
380 call parse_variable(namespace,
'SCFCalculateStress', .false. , scf%calc_stress)
394 call parse_variable(namespace,
'SCFCalculateDipole', .not. space%is_periodic(), scf%calc_dipole)
395 if (
allocated(hm%vberry)) scf%calc_dipole = .
true.
405 call parse_variable(namespace,
'SCFCalculatePartialCharges', .false., scf%calc_partial_charges)
406 if (scf%calc_partial_charges)
call messages_experimental(
'SCFCalculatePartialCharges', namespace=namespace)
408 rmin = ions%min_distance()
424 scf%forced_finish = .false.
432 type(
scf_t),
intent(inout) :: scf
441 if(scf%mix_field /= option__mixfield__none)
call mix_end(scf%smix)
443 nullify(scf%mixfield)
445 if (scf%mix_field /= option__mixfield__states)
then
450 call iter%start(scf%criterion_list)
451 do while (iter%has_next())
452 crit => iter%get_next()
453 safe_deallocate_p(crit)
462 type(
scf_t),
intent(inout) :: scf
468 if (scf%mix_field /= option__mixfield__states)
then
478 subroutine scf_load(scf, namespace, space, gr, ions, ext_partners, st, ks, hm, restart_load)
479 type(
scf_t),
intent(inout) :: scf
482 type(
grid_t),
intent(inout) :: gr
483 type(
ions_t),
intent(in) :: ions
486 type(
v_ks_t),
intent(inout) :: ks
488 type(
restart_t),
intent(in) :: restart_load
498 message(1) =
'Unable to read density. Density will be calculated from states.'
501 if (
bitand(ks%xc_family, xc_family_oep) == 0)
then
502 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners)
505 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners)
512 call hm%ks_pot%load(restart_load, gr, ierr)
514 message(1) =
'Unable to read Vhxc. Vhxc will be calculated from states.'
517 call hm%update(gr, namespace, space, ext_partners)
518 if (
bitand(ks%xc_family, xc_family_oep) /= 0)
then
520 do is = 1, st%d%nspin
521 ks%oep%vxc(1:gr%np, is) = hm%ks_pot%vhxc(1:gr%np, is) - hm%ks_pot%vhartree(1:gr%np)
523 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners)
530 if (scf%mix_field == option__mixfield__density .or. scf%mix_field == option__mixfield__potential)
then
531 call mix_load(namespace, restart_load, scf%smix, gr, ierr)
534 message(1) =
"Unable to read mixing information. Mixing will start from scratch."
540 call lda_u_load(restart_load, hm%lda_u, st, hm%energy%dft_u, ierr)
542 message(1) =
"Unable to read DFT+U information. DFT+U data will be calculated from states."
562 subroutine scf_start(scf, namespace, gr, ions, st, ks, hm, outp, verbosity)
563 type(
scf_t),
intent(inout) :: scf
565 type(
grid_t),
intent(inout) :: gr
566 type(
ions_t),
intent(inout) :: ions
568 type(
v_ks_t),
intent(inout) :: ks
570 type(
output_t),
optional,
intent(in) :: outp
571 integer,
optional,
intent(in) :: verbosity
577 if(scf%forced_finish)
then
578 message(1) =
"Previous clean stop, not doing SCF and quitting."
582 if (.not. hm%is_hermitian())
then
583 message(1) =
"Trying to run a SCF calculation for a non-hermitian Hamiltonian. This is not supported."
589 scf%output_during_scf = .false.
590 scf%output_forces = .false.
591 scf%calc_current = .false.
593 if (
present(outp))
then
596 if (outp%what(option__output__stress))
then
597 scf%calc_stress = .
true.
600 scf%output_during_scf = outp%duringscf
603 if (outp%duringscf .and. outp%what(option__output__forces))
then
604 scf%output_forces = .
true.
608 safe_allocate(scf%rhoout(1:gr%np, 1:st%d%nspin))
609 safe_allocate(scf%rhoin (1:gr%np, 1:st%d%nspin))
611 call lalg_copy(gr%np, st%d%nspin, st%rho, scf%rhoin)
614 if (scf%calc_force .or. scf%output_forces)
then
616 safe_allocate(scf%vhxc_old(1:gr%np, 1:st%d%nspin))
617 call lalg_copy(gr%np, st%d%nspin, hm%ks_pot%vhxc, scf%vhxc_old)
621 select case(scf%mix_field)
622 case(option__mixfield__potential)
625 case(option__mixfield__density)
628 case(option__mixfield__states)
631 allocate(
wfs_elec_t::scf%psioutb (st%group%block_start:st%group%block_end, st%d%kpt%start:st%d%kpt%end))
633 do iqn = st%d%kpt%start, st%d%kpt%end
634 do ib = st%group%block_start, st%group%block_end
635 call st%group%psib(ib, iqn)%copy_to(scf%psioutb(ib, iqn))
643 if (scf%mix_field /= option__mixfield__states)
call lda_u_mixer_set_vin(hm%lda_u, scf%lda_u_mix)
647 if ( scf%verbosity_ /= verb_no )
then
648 if(scf%max_iter > 0)
then
649 write(
message(1),
'(a)')
'Info: Starting SCF iteration.'
651 write(
message(1),
'(a)')
'Info: No SCF iterations will be done.'
658 scf%converged_current = .false.
668 character(len=*),
intent(in) :: dir
669 character(len=*),
intent(in) :: fname
672 character(len=12) :: label
675 iunit =
io_open(trim(dir) //
"/" // trim(fname), namespace, action=
'write')
676 write(iunit,
'(a)', advance =
'no')
'#iter energy '
677 label =
'energy_diff'
678 write(iunit,
'(1x,a)', advance =
'no') label
680 write(iunit,
'(1x,a)', advance =
'no') label
682 write(iunit,
'(1x,a)', advance =
'no') label
684 write(iunit,
'(1x,a)', advance =
'no') label
686 write(iunit,
'(1x,a)', advance =
'no') label
690 label =
'OEP norm2ss'
691 write(iunit,
'(1x,a)', advance =
'no') label
694 write(iunit,
'(a)')
''
704 subroutine scf_run(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, outp, &
705 verbosity, iters_done, restart_dump)
706 type(
scf_t),
intent(inout) :: scf
710 type(
grid_t),
intent(inout) :: gr
711 type(
ions_t),
intent(inout) :: ions
714 type(
v_ks_t),
intent(inout) :: ks
716 type(
output_t),
optional,
intent(in) :: outp
717 integer,
optional,
intent(in) :: verbosity
718 integer,
optional,
intent(out) :: iters_done
719 type(
restart_t),
optional,
intent(in) :: restart_dump
726 call scf_start(scf, namespace, gr, ions, st, ks, hm, outp, verbosity)
729 do iter = 1, scf%max_iter
731 call scf_iter(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, iter, outp, &
734 completed =
scf_iter_finish(scf, namespace, space, gr, ions, st, ks, hm, iter, outp, iters_done)
736 if(scf%forced_finish .or. completed)
then
741 if (.not.scf%forced_finish)
then
743 call scf_finish(scf, namespace, space, gr, ions, ext_partners, st, ks, hm, iter, outp)
750 subroutine scf_iter(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, iter, outp, &
752 type(
scf_t),
intent(inout) :: scf
756 type(
grid_t),
intent(inout) :: gr
757 type(
ions_t),
intent(inout) :: ions
760 type(
v_ks_t),
intent(inout) :: ks
762 integer,
intent(in) :: iter
763 type(
output_t),
optional,
intent(in) :: outp
764 type(
restart_t),
optional,
intent(in) :: restart_dump
766 integer :: iqn, ib, ierr
769 logical :: is_crit_conv
770 real(real64) :: etime, itime
779 scf%eigens%converged = 0
782 call hm%update_span(gr%spacing(1:space%dim), minval(st%eigenval(:, :)), namespace)
788 call iterator%start(scf%criterion_list)
789 do while (iterator%has_next())
790 crit => iterator%get_next()
794 if (scf%calc_force .or. scf%output_forces)
then
796 scf%vhxc_old(1:gr%np, 1:st%d%nspin) = hm%ks_pot%vhxc(1:gr%np, 1:st%d%nspin)
801 if (
allocated(hm%vberry))
then
804 ks%frozen_hxc = .
true.
806 call berry_perform_internal_scf(scf%berry, namespace, space, scf%eigens, gr, st, hm, iter, ks, ions, ext_partners)
808 ks%frozen_hxc = .false.
810 scf%eigens%converged = 0
811 call scf%eigens%run(namespace, gr, st, hm, space, ext_partners, iter)
814 scf%matvec = scf%matvec + scf%eigens%matvec
823 call lalg_copy(gr%np, st%d%nspin, st%rho, scf%rhoout)
825 select case (scf%mix_field)
826 case (option__mixfield__potential)
827 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_current=scf%output_during_scf)
830 case (option__mixfield__density)
832 case(option__mixfield__states)
833 do iqn = st%d%kpt%start, st%d%kpt%end
834 do ib = st%group%block_start, st%group%block_end
835 call st%group%psib(ib, iqn)%copy_data_to(gr%np, scf%psioutb(ib, iqn))
840 if (scf%mix_field /= option__mixfield__states .and. scf%mix_field /= option__mixfield__none)
then
847 if (
present(outp))
then
849 if (outp%duringscf .and. outp%what_now(option__output__forces, iter))
then
850 call forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, vhxc_old=scf%vhxc_old)
855 call iterator%start(scf%criterion_list)
856 do while (iterator%has_next())
857 crit => iterator%get_next()
862 scf%converged_last = scf%converged_current
864 scf%converged_current = scf%check_conv .and. &
865 (.not. scf%conv_eigen_error .or. all(scf%eigens%converged >= st%nst_conv))
867 call iterator%start(scf%criterion_list)
868 do while (iterator%has_next())
869 crit => iterator%get_next()
870 call crit%is_converged(is_crit_conv)
871 scf%converged_current = scf%converged_current .and. is_crit_conv
876 scf%finish = scf%converged_last .and. scf%converged_current
882 select case (scf%mix_field)
883 case (option__mixfield__density)
885 call mixing(namespace, scf%smix)
888 if (minval(st%rho(1:gr%np, 1:st%d%spin_channels)) < -1e-6_real64)
then
889 write(
message(1),*)
'Negative density after mixing. Minimum value = ', &
890 minval(st%rho(1:gr%np, 1:st%d%spin_channels))
894 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_current=scf%output_during_scf)
896 case (option__mixfield__potential)
898 call mixing(namespace, scf%smix)
904 case(option__mixfield__states)
905 do iqn = st%d%kpt%start, st%d%kpt%end
906 do ib = st%group%block_start, st%group%block_end
912 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_current=scf%output_during_scf)
914 case (option__mixfield__none)
915 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_current=scf%output_during_scf)
921 if (scf%finish .and. st%modelmbparticles%nparticle > 0)
then
925 if (
present(outp) .and.
present(restart_dump))
then
929 .or. iter == scf%max_iter .or. scf%forced_finish) )
then
931 call states_elec_dump(scf%restart_dump, space, st, gr, hm%kpoints, ierr, iter=iter)
933 message(1) =
'Unable to write states wavefunctions.'
939 message(1) =
'Unable to write density.'
944 call lda_u_dump(scf%restart_dump, namespace, hm%lda_u, st, gr, ierr)
946 message(1) =
'Unable to write DFT+U information.'
951 select case (scf%mix_field)
952 case (option__mixfield__density)
953 call mix_dump(namespace, scf%restart_dump, scf%smix, gr, ierr)
955 message(1) =
'Unable to write mixing information.'
958 case (option__mixfield__potential)
959 call hm%ks_pot%dump(scf%restart_dump, gr, ierr)
961 message(1) =
'Unable to write Vhxc.'
965 call mix_dump(namespace, scf%restart_dump, scf%smix, gr, ierr)
967 message(1) =
'Unable to write mixing information.'
986 character(len=50) :: str
987 real(real64) :: dipole(1:space%dim)
993 write(str,
'(a,i5)')
'SCF CYCLE ITER #' ,iter
997 ' rel_ev = ', scf%evsum_diff/(abs(scf%evsum_out)+1e-20)
998 write(
message(2),
'(a,es15.2,2(a,es9.2))') &
999 ' ediff = ', scf%energy_diff,
' abs_dens = ', scf%abs_dens_diff, &
1000 ' rel_dens = ', scf%abs_dens_diff/st%qtot
1003 write(
message(1),
'(a,i6)')
'Matrix vector products: ', scf%eigens%matvec
1004 write(
message(2),
'(a,i6)')
'Converged eigenvectors: ', sum(scf%eigens%converged(1:st%nik))
1008 if (
allocated(hm%vberry))
then
1010 call write_dipole(st, hm, space, dipole, namespace=namespace)
1023 write(
message(2),
'(a,i5,a,f14.2)')
'Elapsed time for SCF step ', iter,
':', etime
1033 write(
message(1),
'(a,i4,a,es15.8, a,es9.2, a, f7.1, a)') &
1036 ' : abs_dens', scf%abs_dens_diff, &
1037 ' : etime ', etime,
's'
1047 character(len=*),
intent(in) :: dir
1048 character(len=*),
intent(in) :: fname
1054 iunit =
io_open(trim(dir) //
"/" // trim(fname), namespace, action=
'write', position=
'append')
1056 call iterator%start(scf%criterion_list)
1057 do while (iterator%has_next())
1058 crit => iterator%get_next()
1063 write(iunit,
'(2es13.5)', advance =
'no') crit%val_abs, crit%val_rel
1066 write(iunit,
'(es13.5)', advance =
'no') crit%val_rel
1074 write(iunit,
'(es13.5)', advance =
'no') ks%oep%norm2ss
1077 write(iunit,
'(a)')
''
1084 logical function scf_iter_finish(scf, namespace, space, gr, ions, st, ks, hm, iter, outp, &
1085 iters_done)
result(completed)
1086 type(
scf_t),
intent(inout) :: scf
1089 type(
grid_t),
intent(inout) :: gr
1090 type(
ions_t),
intent(inout) :: ions
1092 type(
v_ks_t),
intent(inout) :: ks
1094 integer,
intent(in) :: iter
1095 type(
output_t),
optional,
intent(in) :: outp
1096 integer,
optional,
intent(out) :: iters_done
1098 character(len=MAX_PATH_LEN) :: dirname
1099 integer(int64) :: what_i
1106 if(
present(iters_done)) iters_done = iter
1108 write(
message(1),
'(a, i4, a)')
'Info: SCF converged in ', iter,
' iterations'
1116 if (
present(outp))
then
1117 if (any(outp%what) .and. outp%duringscf)
then
1118 do what_i = lbound(outp%what, 1), ubound(outp%what, 1)
1119 if (outp%what_now(what_i, iter))
then
1120 write(dirname,
'(a,a,i4.4)') trim(outp%iter_dir),
"scf.", iter
1121 call output_all(outp, namespace, space, dirname, gr, ions, iter, st, hm, ks)
1122 call output_modelmb(outp, namespace, space, dirname, gr, ions, iter, st)
1130 call lalg_copy(gr%np, st%d%nspin, st%rho, scf%rhoin)
1133 if (scf%mix_field /= option__mixfield__none)
then
1134 if (scf%smix%ns_restart > 0)
then
1135 if (mod(iter, scf%smix%ns_restart) == 0)
then
1136 message(1) =
"Info: restarting mixing."
1143 select case(scf%mix_field)
1144 case(option__mixfield__potential)
1147 case (option__mixfield__density)
1152 if (scf%mix_field /= option__mixfield__states)
then
1163 subroutine scf_finish(scf, namespace, space, gr, ions, ext_partners, st, ks, hm, iter, outp)
1164 type(
scf_t),
intent(inout) :: scf
1167 type(
grid_t),
intent(inout) :: gr
1168 type(
ions_t),
intent(inout) :: ions
1171 type(
v_ks_t),
intent(inout) :: ks
1173 integer,
intent(in) :: iter
1174 type(
output_t),
optional,
intent(in) :: outp
1185 if ((scf%max_iter > 0 .and. scf%mix_field == option__mixfield__potential) .or. scf%calc_current)
then
1186 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
1187 calc_current=scf%calc_current)
1190 select case(scf%mix_field)
1191 case(option__mixfield__states)
1193 do iqn = st%d%kpt%start, st%d%kpt%end
1194 do ib = st%group%block_start, st%group%block_end
1195 call scf%psioutb(ib, iqn)%end()
1200 deallocate(scf%psioutb)
1203 safe_deallocate_a(scf%rhoout)
1204 safe_deallocate_a(scf%rhoin)
1206 if (scf%max_iter > 0 .and. any(scf%eigens%converged < st%nst))
then
1207 write(
message(1),
'(a)')
'Some of the states are not fully converged!'
1208 if (all(scf%eigens%converged >= st%nst_conv))
then
1209 write(
message(2),
'(a)')
'But all requested states to converge are converged.'
1213 write(
message(2),
'(a)')
'With the Chebyshev filtering eigensolver, it usually helps to'
1214 write(
message(3),
'(a)')
'increase ExtraStates and set ExtraStatesToConverge to the number'
1215 write(
message(4),
'(a)')
'of states to be converged.'
1223 if (.not.scf%finish)
then
1224 write(
message(1),
'(a,i4,a)')
'SCF *not* converged after ', iter - 1,
' iterations.'
1226 write(
message(2),
'(a)')
'With the Chebyshev filtering eigensolver, it usually helps to'
1227 write(
message(3),
'(a)')
'increase ExtraStates to improve convergence.'
1234 write(
message(1),
'(a,i10)')
'Info: Number of matrix-vector products: ', scf%matvec
1237 if (scf%calc_force)
then
1238 call forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, vhxc_old=scf%vhxc_old)
1241 if (scf%calc_stress)
call stress_calculate(namespace, gr, hm, st, ions, ks, ext_partners)
1244 if (scf%mix_field == option__mixfield__potential)
then
1249 if(
present(outp))
then
1256 if (space%is_periodic() .and. st%nik > st%d%nspin)
then
1259 ions, gr, hm%kpoints, hm%phase, vec_pot = hm%hm_base%uniform_vector_potential, &
1260 vec_pot_var = hm%hm_base%vector_potential)
1264 if (ks%vdw%vdw_correction == option__vdwcorrection__vdw_ts)
then
1268 safe_deallocate_a(scf%vhxc_old)
1276 character(len=*),
intent(in) :: dir, fname
1279 real(real64) :: dipole(1:space%dim)
1280 real(real64) :: ex_virial
1286 iunit =
io_open(trim(dir) //
"/" // trim(fname), namespace, action=
'write')
1292 if (space%is_periodic())
then
1293 call hm%kpoints%write_info(iunit=iunit)
1301 write(iunit,
'(a, i4, a)')
'SCF converged in ', iter,
' iterations'
1303 write(iunit,
'(a)')
'SCF *not* converged!'
1305 write(iunit,
'(1x)')
1307 if(any(scf%eigens%converged < st%nst))
then
1308 write(iunit,
'(a)')
'Some of the states are not fully converged!'
1309 if (all(scf%eigens%converged >= st%nst_conv))
then
1310 write(iunit,
'(a)')
'But all requested states to converge are converged.'
1315 write(iunit,
'(1x)')
1317 if (space%is_periodic())
then
1319 write(iunit,
'(1x)')
1329 if(
mpi_world%is_root())
write(iunit,
'(1x)')
1332 if (
mpi_world%is_root())
write(iunit,
'(1x)')
1335 if(st%d%ispin ==
spinors .and. space%dim == 3 .and. &
1338 if(
mpi_world%is_root())
write(iunit,
'(1x)')
1344 if(
mpi_world%is_root())
write(iunit,
'(1x)')
1347 if(scf%calc_dipole)
then
1354 hm%xc%functional(
func_c,1)%family == xc_family_none .and. st%d%ispin /=
spinors &
1355 .and. .not. space%is_periodic())
then
1362 write(iunit,
'(1x)')
1367 if(scf%max_iter > 0)
then
1368 write(iunit,
'(a)')
'Convergence:'
1369 call iterator%start(scf%criterion_list)
1370 do while (iterator%has_next())
1371 crit => iterator%get_next()
1372 call crit%write_info(iunit)
1381 write(iunit,
'(a)')
'Photon observables:'
1382 write(iunit,
'(6x, a, es15.8,a,es15.8,a)')
'Photon number = ', ks%oep_photon%pt%number(1)
1383 write(iunit,
'(6x, a, es15.8,a,es15.8,a)')
'Photon ex. = ', ks%oep_photon%pt%ex
1390 if (scf%calc_stress)
then
1391 call output_stress(iunit, space%periodic_dim, st%stress_tensors, all_terms=.false.)
1392 call output_pressure(iunit, space%periodic_dim, st%stress_tensors%total)
1397 if(scf%calc_partial_charges)
then
1432 real(real64) :: mem_tmp
1436 if(
conf%report_memory)
then
1438 call mpi_world%allreduce(mem, mem_tmp, 1, mpi_double_precision, mpi_sum)
1440 write(
message(1),
'(a,f14.2)')
'Memory usage [Mbytes] :', mem
1450 type(
scf_t),
intent(inout) :: scf
1456 select type (criterion)
1458 scf%energy_in = hm%energy%total
1473 type(
scf_t),
intent(inout) :: scf
1476 type(
grid_t),
intent(in) :: gr
1477 real(real64),
intent(in) :: rhoout(:,:), rhoin(:,:)
1481 real(real64),
allocatable :: tmp(:)
1485 select type (criterion)
1487 scf%energy_diff = abs(hm%energy%total - scf%energy_in)
1490 scf%abs_dens_diff =
m_zero
1491 safe_allocate(tmp(1:gr%np))
1492 do is = 1, st%d%nspin
1493 tmp(:) = abs(rhoin(1:gr%np, is) - rhoout(1:gr%np, is))
1494 scf%abs_dens_diff = scf%abs_dens_diff +
dmf_integrate(gr, tmp)
1496 safe_deallocate_a(tmp)
1500 scf%evsum_diff = abs(scf%evsum_out - scf%evsum_in)
1501 scf%evsum_in = scf%evsum_out
1511 subroutine write_dipole(st, hm, space, dipole, iunit, namespace)
1515 real(real64),
intent(in) :: dipole(:)
1516 integer,
optional,
intent(in) :: iunit
1517 type(
namespace_t),
optional,
intent(in) :: namespace
1522 call output_dipole(dipole, space%dim, iunit=iunit, namespace=namespace)
1524 if (space%is_periodic())
then
1525 message(1) =
"Defined only up to quantum of polarization (e * lattice vector)."
1526 message(2) =
"Single-point Berry's phase method only accurate for large supercells."
1529 if (hm%kpoints%full%npoints > 1)
then
1531 "WARNING: Single-point Berry's phase method for dipole should not be used when there is more than one k-point."
1532 message(2) =
"Instead, finite differences on k-points (not yet implemented) are needed."
1537 message(1) =
"Single-point Berry's phase dipole calculation not correct without integer occupations."
1550 type(
scf_t),
intent(inout) :: scf
1551 logical,
intent(in) :: known_lower_bound
1553 call scf%eigens%set_lower_bound_is_known(known_lower_bound)
batchified version of the BLAS axpy routine:
scale a batch by a constant or vector
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 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)
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 write_magnetic_moments(mesh, st, ions, boundaries, lmm_r, iunit, namespace)
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)
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)
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_load(scf, namespace, space, gr, ions, ext_partners, st, ks, hm, restart_load)
Loading of restarting data of the SCF cycle.
pure subroutine, public scf_set_lower_bound_is_known(scf, known_lower_bound)
Set the flag lower_bound_is_known.
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), 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
integer, parameter, public oep_level_kli
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