42 use,
intrinsic :: iso_fortran_env
112 integer,
public,
parameter :: &
120 integer,
public :: max_iter
122 real(real64),
public :: lmm_r
125 logical :: conv_eigen_error
126 logical :: check_conv
129 logical :: calc_force
130 logical,
public :: calc_stress
131 logical :: calc_dipole
132 logical :: calc_partial_charges
133 logical :: calc_orb_moments = .false.
136 type(mixfield_t),
pointer :: mixfield
137 type(eigensolver_t) :: eigens
139 logical :: forced_finish = .false.
140 type(lda_u_mixer_t) :: lda_u_mix
141 type(vtau_mixer_t) :: vtau_mix
142 type(berry_t) :: berry
145 type(restart_t),
public :: restart_load, restart_dump
147 type(criterion_list_t),
public :: criterion_list
148 real(real64) :: energy_in, energy_diff, abs_dens_diff, evsum_in, evsum_out, evsum_diff
151 logical :: converged_current, converged_last
152 integer :: verbosity_
154 real(real64),
allocatable :: rhoout(:,:), rhoin(:,:)
155 real(real64),
allocatable :: vhxc_old(:,:)
156 class(wfs_elec_t),
allocatable :: psioutb(:, :)
157 logical :: output_forces, calc_current, output_during_scf
158 logical :: finish = .false.
164 subroutine scf_init(scf, namespace, gr, ions, st, mc, hm, space)
165 type(scf_t),
intent(inout) :: scf
166 type(grid_t),
intent(in) :: gr
167 type(namespace_t),
intent(in) :: namespace
168 type(ions_t),
intent(in) :: ions
169 type(states_elec_t),
intent(in) :: st
170 type(multicomm_t),
intent(in) :: mc
171 type(hamiltonian_elec_t),
intent(inout) :: hm
172 class(space_t),
intent(in) :: space
175 integer :: mixdefault
176 type(type_t) :: mix_type
177 class(convergence_criterion_t),
pointer :: crit
178 type(criterion_iterator_t) :: iter
179 logical :: deactivate_oracle
202 if (
allocated(hm%vberry))
then
209 call iter%start(scf%criterion_list)
210 do while (iter%has_next())
211 crit => iter%get_next()
214 call crit%set_pointers(scf%energy_diff, scf%energy_in)
216 call crit%set_pointers(scf%abs_dens_diff, st%qtot)
218 call crit%set_pointers(scf%evsum_diff, scf%evsum_out)
225 if(.not. scf%check_conv .and. scf%max_iter < 0)
then
226 call messages_write(
"All convergence criteria are disabled. Octopus is cowardly refusing")
231 call messages_write(
"Please set one of the following variables to a positive value:")
254 call parse_variable(namespace,
'ConvEigenError', .false., scf%conv_eigen_error)
256 if(scf%max_iter < 0) scf%max_iter = huge(scf%max_iter)
262 call eigensolver_init(scf%eigens, namespace, gr, st, hm, mc, space, deactivate_oracle)
264 if(scf%eigens%es_type /=
rs_evo)
then
288 mixdefault = option__mixfield__potential
291 call parse_variable(namespace,
'MixField', mixdefault, scf%mix_field)
295 if (scf%mix_field == option__mixfield__potential .and. hm%theory_level ==
independent_particles)
then
296 call messages_write(
'Input: Cannot mix the potential for non-interacting particles.')
300 if (scf%mix_field == option__mixfield__potential .and. hm%pcm%run_pcm)
then
301 call messages_write(
'Input: You have selected to mix the potential.', new_line = .
true.)
302 call messages_write(
' This might produce convergence problems for solvated systems.', new_line = .
true.)
307 if(scf%mix_field == option__mixfield__density &
310 call messages_write(
'Input: You have selected to mix the density with OEP or MGGA XC functionals.', new_line = .
true.)
311 call messages_write(
' This might produce convergence problems. Mix the potential instead.')
315 if(scf%mix_field == option__mixfield__states)
then
320 select case(scf%mix_field)
321 case (option__mixfield__potential, option__mixfield__density)
323 case(option__mixfield__states)
330 if (scf%mix_field /= option__mixfield__none)
then
331 call mix_init(scf%smix, namespace, space, gr%der, scf%mixdim1, st%d%nspin, func_type_ = mix_type)
335 if (scf%mix_field /= option__mixfield__states .and. scf%mix_field /= option__mixfield__none )
then
341 if(scf%mix_field == option__mixfield__potential)
then
347 scf%mix_field = option__mixfield__none
359 call parse_variable(namespace,
'SCFCalculateForces', .not. ions%only_user_def, scf%calc_force)
361 if(scf%calc_force .and. gr%der%boundaries%spiralBC)
then
362 message(1) =
'Forces cannot be calculated when using spiral boundary conditions.'
363 write(
message(2),
'(a)')
'Please use SCFCalculateForces = no.'
366 if(scf%calc_force)
then
367 if (
allocated(hm%ep%b_field) .or.
allocated(hm%ep%a_static))
then
368 write(
message(1),
'(a)')
'The forces are currently not properly calculated if static'
369 write(
message(2),
'(a)')
'magnetic fields or static vector potentials are present.'
370 write(
message(3),
'(a)')
'Please use SCFCalculateForces = no.'
384 call parse_variable(namespace,
'SCFCalculateStress', .false. , scf%calc_stress)
398 call parse_variable(namespace,
'SCFCalculateDipole', .not. space%is_periodic(), scf%calc_dipole)
399 if (
allocated(hm%vberry)) scf%calc_dipole = .
true.
414 call parse_variable(namespace,
'SCFCalculateOrbitalMoments', .false. , scf%calc_orb_moments)
415 if((st%d%ispin /=
spinors .or. space%dim /= 3) .and. scf%calc_orb_moments)
then
416 message(1) =
"Orbital moments are only implemented for spinors and in 3D."
419 if (scf%calc_orb_moments .and. .not. (hm%ep%reltype ==
spin_orbit &
421 message(1) =
"Orbital moments are only available with SOC."
424 if(gr%use_curvilinear .and. scf%calc_orb_moments)
then
436 call parse_variable(namespace,
'SCFCalculatePartialCharges', .false., scf%calc_partial_charges)
437 if (scf%calc_partial_charges)
call messages_experimental(
'SCFCalculatePartialCharges', namespace=namespace)
439 rmin = ions%min_distance()
455 scf%forced_finish = .false.
463 type(
scf_t),
intent(inout) :: scf
472 if(scf%mix_field /= option__mixfield__none)
call mix_end(scf%smix)
474 nullify(scf%mixfield)
476 if (scf%mix_field /= option__mixfield__states .and. scf%mix_field /= option__mixfield__none)
then
481 call iter%start(scf%criterion_list)
482 do while (iter%has_next())
483 crit => iter%get_next()
484 safe_deallocate_p(crit)
493 type(
scf_t),
intent(inout) :: scf
499 if (scf%mix_field /= option__mixfield__states .and. scf%mix_field /= option__mixfield__none)
then
509 subroutine scf_load(scf, namespace, space, gr, ions, ext_partners, st, ks, hm, restart_load)
510 type(
scf_t),
intent(inout) :: scf
513 type(
grid_t),
intent(inout) :: gr
514 type(
ions_t),
intent(in) :: ions
517 type(
v_ks_t),
intent(inout) :: ks
519 type(
restart_t),
intent(in) :: restart_load
529 message(1) =
'Unable to read density. Density will be calculated from states.'
532 if (
bitand(ks%xc_family, xc_family_oep) == 0)
then
533 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners)
536 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners)
543 call hm%ks_pot%load(restart_load, gr, ierr)
545 message(1) =
'Unable to read Vhxc. Vhxc will be calculated from states.'
548 call hm%update(gr, namespace, space, ext_partners)
549 if (
bitand(ks%xc_family, xc_family_oep) /= 0)
then
551 do is = 1, st%d%nspin
552 ks%oep%vxc(1:gr%np, is) = hm%ks_pot%vhxc(1:gr%np, is) - hm%ks_pot%vhartree(1:gr%np)
554 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners)
561 if (scf%mix_field == option__mixfield__density .or. scf%mix_field == option__mixfield__potential)
then
562 call mix_load(namespace, restart_load, scf%smix, gr, ierr)
564 message(1) =
"Unable to read mixing information. Mixing will start from scratch."
571 call lda_u_load(restart_load, hm%lda_u, st, hm%energy%dft_u, ierr)
573 message(1) =
"Unable to read DFT+U information. DFT+U data will be calculated from states."
593 subroutine scf_start(scf, namespace, gr, ions, st, ks, hm, outp, verbosity)
594 type(
scf_t),
intent(inout) :: scf
596 type(
grid_t),
intent(inout) :: gr
597 type(
ions_t),
intent(inout) :: ions
599 type(
v_ks_t),
intent(inout) :: ks
601 type(
output_t),
optional,
intent(in) :: outp
602 integer,
optional,
intent(in) :: verbosity
608 if(scf%forced_finish)
then
609 message(1) =
"Previous clean stop, not doing SCF and quitting."
613 if (.not. hm%is_hermitian())
then
614 message(1) =
"Trying to run a SCF calculation for a non-hermitian Hamiltonian. This is not supported."
620 scf%output_during_scf = .false.
621 scf%output_forces = .false.
622 scf%calc_current = .false.
624 if (
present(outp))
then
627 if (outp%what(option__output__stress))
then
628 scf%calc_stress = .
true.
631 scf%output_during_scf = outp%duringscf
634 if (outp%duringscf .and. outp%what(option__output__forces))
then
635 scf%output_forces = .
true.
639 safe_allocate(scf%rhoout(1:gr%np, 1:st%d%nspin))
640 safe_allocate(scf%rhoin (1:gr%np, 1:st%d%nspin))
642 call lalg_copy(gr%np, st%d%nspin, st%rho, scf%rhoin)
645 if (scf%calc_force .or. scf%output_forces)
then
647 safe_allocate(scf%vhxc_old(1:gr%np, 1:st%d%nspin))
648 call lalg_copy(gr%np, st%d%nspin, hm%ks_pot%vhxc, scf%vhxc_old)
652 select case(scf%mix_field)
653 case(option__mixfield__potential)
656 case(option__mixfield__density)
659 case(option__mixfield__states)
662 allocate(
wfs_elec_t::scf%psioutb (st%group%block_start:st%group%block_end, st%d%kpt%start:st%d%kpt%end))
664 do iqn = st%d%kpt%start, st%d%kpt%end
665 do ib = st%group%block_start, st%group%block_end
666 call st%group%psib(ib, iqn)%copy_to(scf%psioutb(ib, iqn))
674 if (scf%mix_field /= option__mixfield__states .and. scf%mix_field /= option__mixfield__none)
then
680 if ( scf%verbosity_ /= verb_no )
then
681 if(scf%max_iter > 0)
then
682 write(
message(1),
'(a)')
'Info: Starting SCF iteration.'
684 write(
message(1),
'(a)')
'Info: No SCF iterations will be done.'
691 scf%converged_current = .false.
701 character(len=*),
intent(in) :: dir
702 character(len=*),
intent(in) :: fname
705 character(len=12) :: label
706 if(st%system_grp%is_root())
then
708 iunit =
io_open(trim(dir) //
"/" // trim(fname), namespace, action=
'write')
709 write(iunit,
'(a)', advance =
'no')
'#iter energy '
710 label =
'energy_diff'
711 write(iunit,
'(1x,a)', advance =
'no') label
713 write(iunit,
'(1x,a)', advance =
'no') label
715 write(iunit,
'(1x,a)', advance =
'no') label
717 write(iunit,
'(1x,a)', advance =
'no') label
719 write(iunit,
'(1x,a)', advance =
'no') label
723 label =
'OEP norm2ss'
724 write(iunit,
'(1x,a)', advance =
'no') label
727 write(iunit,
'(a)')
''
737 subroutine scf_run(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, outp, &
738 verbosity, iters_done, restart_dump)
739 type(
scf_t),
intent(inout) :: scf
743 type(
grid_t),
intent(inout) :: gr
744 type(
ions_t),
intent(inout) :: ions
747 type(
v_ks_t),
intent(inout) :: ks
749 type(
output_t),
optional,
intent(in) :: outp
750 integer,
optional,
intent(in) :: verbosity
751 integer,
optional,
intent(out) :: iters_done
752 type(
restart_t),
optional,
intent(in) :: restart_dump
759 call scf_start(scf, namespace, gr, ions, st, ks, hm, outp, verbosity)
762 do iter = 1, scf%max_iter
764 call scf_iter(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, iter, outp, &
767 completed =
scf_iter_finish(scf, namespace, space, gr, ions, st, ks, hm, iter, outp, iters_done)
769 if(scf%forced_finish .or. completed)
then
774 if (.not.scf%forced_finish)
then
776 call scf_finish(scf, namespace, space, gr, ions, ext_partners, st, ks, hm, iter, outp)
783 subroutine scf_iter(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, iter, outp, &
785 type(
scf_t),
intent(inout) :: scf
789 type(
grid_t),
intent(inout) :: gr
790 type(
ions_t),
intent(inout) :: ions
793 type(
v_ks_t),
intent(inout) :: ks
795 integer,
intent(in) :: iter
796 type(
output_t),
optional,
intent(in) :: outp
797 type(
restart_t),
optional,
intent(in) :: restart_dump
799 integer :: iqn, ib, ierr
802 logical :: is_crit_conv
803 real(real64) :: etime, itime
812 scf%eigens%converged = 0
815 call hm%update_span(gr%spacing(1:space%dim), minval(st%eigenval(:, :)), namespace)
821 call iterator%start(scf%criterion_list)
822 do while (iterator%has_next())
823 crit => iterator%get_next()
827 if (scf%calc_force .or. scf%output_forces)
then
829 scf%vhxc_old(1:gr%np, 1:st%d%nspin) = hm%ks_pot%vhxc(1:gr%np, 1:st%d%nspin)
834 if (
allocated(hm%vberry))
then
837 ks%frozen_hxc = .
true.
839 call berry_perform_internal_scf(scf%berry, namespace, space, scf%eigens, gr, st, hm, iter, ks, ions, ext_partners)
841 ks%frozen_hxc = .false.
843 scf%eigens%converged = 0
844 call scf%eigens%run(namespace, gr, st, hm, space, ext_partners, iter)
847 scf%matvec = scf%matvec + scf%eigens%matvec
856 call lalg_copy(gr%np, st%d%nspin, st%rho, scf%rhoout)
858 select case (scf%mix_field)
859 case (option__mixfield__potential)
860 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_current=scf%output_during_scf)
863 case (option__mixfield__density)
865 case(option__mixfield__states)
866 do iqn = st%d%kpt%start, st%d%kpt%end
867 do ib = st%group%block_start, st%group%block_end
868 call st%group%psib(ib, iqn)%copy_data_to(gr%np, scf%psioutb(ib, iqn))
873 if (scf%mix_field /= option__mixfield__states .and. scf%mix_field /= option__mixfield__none)
then
880 if (
present(outp))
then
882 if (outp%duringscf .and. outp%what_now(option__output__forces, iter))
then
883 call forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, vhxc_old=scf%vhxc_old)
888 call iterator%start(scf%criterion_list)
889 do while (iterator%has_next())
890 crit => iterator%get_next()
895 scf%converged_last = scf%converged_current
897 scf%converged_current = scf%check_conv .and. &
898 (.not. scf%conv_eigen_error .or. all(scf%eigens%converged >= st%nst_conv))
900 call iterator%start(scf%criterion_list)
901 do while (iterator%has_next())
902 crit => iterator%get_next()
903 call crit%is_converged(is_crit_conv)
904 scf%converged_current = scf%converged_current .and. is_crit_conv
909 scf%finish = scf%converged_last .and. scf%converged_current
915 select case (scf%mix_field)
916 case (option__mixfield__density)
918 call mixing(namespace, scf%smix)
924 if (minval(st%rho(1:gr%np, 1:st%d%spin_channels)) < -1e-6_real64)
then
925 write(
message(1),*)
'Negative density after mixing. Minimum value = ', &
926 minval(st%rho(1:gr%np, 1:st%d%spin_channels))
930 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_current=scf%output_during_scf)
932 case (option__mixfield__potential)
934 call mixing(namespace, scf%smix)
940 case(option__mixfield__states)
941 do iqn = st%d%kpt%start, st%d%kpt%end
942 do ib = st%group%block_start, st%group%block_end
948 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_current=scf%output_during_scf)
950 case (option__mixfield__none)
951 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_current=scf%output_during_scf)
957 if (scf%finish .and. st%modelmbparticles%nparticle > 0)
then
961 if (
present(outp) .and.
present(restart_dump))
then
965 .or. iter == scf%max_iter .or. scf%forced_finish) )
then
967 call states_elec_dump(restart_dump, space, st, gr, hm%kpoints, ierr, iter=iter)
969 message(1) =
'Unable to write states wavefunctions.'
975 message(1) =
'Unable to write density.'
980 call lda_u_dump(restart_dump, namespace, hm%lda_u, st, gr, ierr)
982 message(1) =
'Unable to write DFT+U information.'
987 select case (scf%mix_field)
988 case (option__mixfield__density)
989 call mix_dump(namespace, restart_dump, scf%smix, gr, ierr)
991 message(1) =
'Unable to write mixing information.'
994 case (option__mixfield__potential)
995 call hm%ks_pot%dump(restart_dump, gr, ierr)
997 message(1) =
'Unable to write Vhxc.'
1001 call mix_dump(namespace, restart_dump, scf%smix, gr, ierr)
1003 message(1) =
'Unable to write mixing information.'
1022 character(len=50) :: str
1023 real(real64) :: dipole(1:space%dim)
1029 write(str,
'(a,i5)')
'SCF CYCLE ITER #' ,iter
1033 ' rel_ev = ', scf%evsum_diff/(abs(scf%evsum_out)+1e-20)
1034 write(
message(2),
'(a,es15.2,2(a,es9.2))') &
1035 ' ediff = ', scf%energy_diff,
' abs_dens = ', scf%abs_dens_diff, &
1036 ' rel_dens = ', scf%abs_dens_diff/st%qtot
1039 write(
message(1),
'(a,i0)')
'Matrix vector products: ', scf%eigens%matvec
1040 write(
message(2),
'(a,i0)')
'Converged eigenvectors: ', sum(scf%eigens%converged(1:st%nik))
1044 if (
allocated(hm%vberry))
then
1046 call write_dipole(st, hm, space, dipole, namespace=namespace)
1059 write(
message(2),
'(a,i5,a,f14.2)')
'Elapsed time for SCF step ', iter,
':', etime
1069 write(
message(1),
'(a,i4,a,es15.8, a,es9.2, a, f7.1, a)') &
1072 ' : abs_dens', scf%abs_dens_diff, &
1073 ' : etime ', etime,
's'
1083 character(len=*),
intent(in) :: dir
1084 character(len=*),
intent(in) :: fname
1088 if(st%system_grp%is_root())
then
1090 iunit =
io_open(trim(dir) //
"/" // trim(fname), namespace, action=
'write', position=
'append')
1092 call iterator%start(scf%criterion_list)
1093 do while (iterator%has_next())
1094 crit => iterator%get_next()
1099 write(iunit,
'(2es13.5)', advance =
'no') crit%val_abs, crit%val_rel
1102 write(iunit,
'(es13.5)', advance =
'no') crit%val_rel
1110 write(iunit,
'(es13.5)', advance =
'no') ks%oep%norm2ss
1113 write(iunit,
'(a)')
''
1120 logical function scf_iter_finish(scf, namespace, space, gr, ions, st, ks, hm, iter, outp, &
1121 iters_done)
result(completed)
1122 type(
scf_t),
intent(inout) :: scf
1125 type(
grid_t),
intent(inout) :: gr
1126 type(
ions_t),
intent(inout) :: ions
1128 type(
v_ks_t),
intent(inout) :: ks
1130 integer,
intent(in) :: iter
1131 type(
output_t),
optional,
intent(in) :: outp
1132 integer,
optional,
intent(out) :: iters_done
1134 character(len=MAX_PATH_LEN) :: dirname
1135 integer(int64) :: what_i
1142 if(
present(iters_done)) iters_done = iter
1144 write(
message(1),
'(a, i4, a)')
'Info: SCF converged in ', iter,
' iterations'
1152 if (
present(outp))
then
1153 if (any(outp%what) .and. outp%duringscf)
then
1154 do what_i = lbound(outp%what, 1), ubound(outp%what, 1)
1155 if (outp%what_now(what_i, iter))
then
1156 write(dirname,
'(a,a,i4.4)') trim(outp%iter_dir),
"scf.", iter
1157 call output_all(outp, namespace, space, dirname, gr, ions, iter, st, hm, ks)
1158 call output_modelmb(outp, namespace, space, dirname, gr, ions, iter, st)
1166 call lalg_copy(gr%np, st%d%nspin, st%rho, scf%rhoin)
1169 if (scf%mix_field /= option__mixfield__none)
then
1170 if (scf%smix%ns_restart > 0)
then
1171 if (
mix_scheme(scf%smix) /= option__mixingscheme__broyden_adaptive .and. &
1172 mod(iter, scf%smix%ns_restart) == 0)
then
1173 message(1) =
"Info: restarting mixing."
1180 select case(scf%mix_field)
1181 case(option__mixfield__potential)
1184 case (option__mixfield__density)
1189 if (scf%mix_field /= option__mixfield__states .and. scf%mix_field /= option__mixfield__none)
then
1200 subroutine scf_finish(scf, namespace, space, gr, ions, ext_partners, st, ks, hm, iter, outp)
1201 type(
scf_t),
intent(inout) :: scf
1204 type(
grid_t),
intent(inout) :: gr
1205 type(
ions_t),
intent(inout) :: ions
1208 type(
v_ks_t),
intent(inout) :: ks
1210 integer,
intent(in) :: iter
1211 type(
output_t),
optional,
intent(in) :: outp
1222 if ((scf%max_iter > 0 .and. scf%mix_field == option__mixfield__potential) .or. scf%calc_current)
then
1223 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
1224 calc_current=scf%calc_current)
1227 select case(scf%mix_field)
1228 case(option__mixfield__states)
1230 do iqn = st%d%kpt%start, st%d%kpt%end
1231 do ib = st%group%block_start, st%group%block_end
1232 call scf%psioutb(ib, iqn)%end()
1237 deallocate(scf%psioutb)
1240 safe_deallocate_a(scf%rhoout)
1241 safe_deallocate_a(scf%rhoin)
1243 if (scf%max_iter > 0 .and. any(scf%eigens%converged < st%nst))
then
1244 write(
message(1),
'(a)')
'Some of the states are not fully converged!'
1245 if (all(scf%eigens%converged >= st%nst_conv))
then
1246 write(
message(2),
'(a)')
'But all requested states to converge are converged.'
1250 write(
message(2),
'(a)')
'With the Chebyshev filtering eigensolver, it usually helps to'
1251 write(
message(3),
'(a)')
'increase ExtraStates and set ExtraStatesToConverge to the number'
1252 write(
message(4),
'(a)')
'of states to be converged.'
1260 if (.not.scf%finish)
then
1261 write(
message(1),
'(a,i4,a)')
'SCF *not* converged after ', iter - 1,
' iterations.'
1263 write(
message(2),
'(a)')
'With the Chebyshev filtering eigensolver, it usually helps to'
1264 write(
message(3),
'(a)')
'increase ExtraStates to improve convergence.'
1271 write(
message(1),
'(a,i10)')
'Info: Number of matrix-vector products: ', scf%matvec
1274 if (scf%calc_force)
then
1275 call forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, vhxc_old=scf%vhxc_old)
1278 if (scf%calc_stress)
call stress_calculate(namespace, gr, hm, st, ions, ks, ext_partners)
1281 if (scf%mix_field == option__mixfield__potential)
then
1286 if(
present(outp))
then
1293 if (space%is_periodic() .and. st%nik > st%d%nspin)
then
1296 ions, gr, hm%kpoints, hm%phase, vec_pot = hm%hm_base%uniform_vector_potential, &
1297 vec_pot_var = hm%hm_base%vector_potential)
1301 if (ks%vdw%vdw_correction == option__vdwcorrection__vdw_ts)
then
1305 safe_deallocate_a(scf%vhxc_old)
1313 character(len=*),
intent(in) :: dir, fname
1316 real(real64) :: dipole(1:space%dim)
1317 real(real64) :: ex_virial
1321 if(st%system_grp%is_root())
then
1323 iunit =
io_open(trim(dir) //
"/" // trim(fname), namespace, action=
'write')
1329 if (space%is_periodic())
then
1330 call hm%kpoints%write_info(iunit=iunit)
1338 write(iunit,
'(a, i4, a)')
'SCF converged in ', iter,
' iterations'
1340 write(iunit,
'(a)')
'SCF *not* converged!'
1342 write(iunit,
'(1x)')
1344 if(any(scf%eigens%converged < st%nst))
then
1345 write(iunit,
'(a)')
'Some of the states are not fully converged!'
1346 if (all(scf%eigens%converged >= st%nst_conv))
then
1347 write(iunit,
'(a)')
'But all requested states to converge are converged.'
1352 write(iunit,
'(1x)')
1354 if (space%is_periodic())
then
1356 write(iunit,
'(1x)')
1366 if(st%system_grp%is_root())
write(iunit,
'(1x)')
1369 calc_orb_moments=scf%calc_orb_moments)
1370 if (st%system_grp%is_root())
write(iunit,
'(1x)')
1373 if(st%d%ispin ==
spinors .and. space%dim == 3 .and. &
1376 if(st%system_grp%is_root())
write(iunit,
'(1x)')
1382 if(st%system_grp%is_root())
write(iunit,
'(1x)')
1385 if(scf%calc_dipole)
then
1392 hm%xc%functional(
func_c,1)%family == xc_family_none .and. st%d%ispin /=
spinors &
1393 .and. .not. space%is_periodic())
then
1396 if (st%system_grp%is_root())
then
1400 write(iunit,
'(1x)')
1404 if(st%system_grp%is_root())
then
1405 if(scf%max_iter > 0)
then
1406 write(iunit,
'(a)')
'Convergence:'
1407 call iterator%start(scf%criterion_list)
1408 do while (iterator%has_next())
1409 crit => iterator%get_next()
1410 call crit%write_info(iunit)
1419 write(iunit,
'(a)')
'Photon observables:'
1420 write(iunit,
'(6x, a, es15.8,a,es15.8,a)')
'Photon number = ', ks%oep_photon%pt%number(1)
1421 write(iunit,
'(6x, a, es15.8,a,es15.8,a)')
'Photon ex. = ', ks%oep_photon%pt%ex
1428 if (scf%calc_stress)
then
1429 call output_stress(iunit, space%periodic_dim, st%stress_tensors, all_terms=.false.)
1430 call output_pressure(iunit, space%periodic_dim, st%stress_tensors%total)
1435 if(scf%calc_partial_charges)
then
1439 if(st%system_grp%is_root())
then
1470 real(real64) :: mem_tmp
1474 if(
conf%report_memory)
then
1476 call mpi_world%allreduce(mem, mem_tmp, 1, mpi_double_precision, mpi_sum)
1478 write(
message(1),
'(a,f14.2)')
'Memory usage [Mbytes] :', mem
1488 type(
scf_t),
intent(inout) :: scf
1494 select type (criterion)
1496 scf%energy_in = hm%energy%total
1511 type(
scf_t),
intent(inout) :: scf
1514 type(
grid_t),
intent(in) :: gr
1515 real(real64),
intent(in) :: rhoout(:,:), rhoin(:,:)
1519 real(real64),
allocatable :: tmp(:)
1523 select type (criterion)
1525 scf%energy_diff = abs(hm%energy%total - scf%energy_in)
1528 scf%abs_dens_diff =
m_zero
1529 safe_allocate(tmp(1:gr%np))
1530 do is = 1, st%d%nspin
1531 tmp(:) = abs(rhoin(1:gr%np, is) - rhoout(1:gr%np, is))
1532 scf%abs_dens_diff = scf%abs_dens_diff +
dmf_integrate(gr, tmp)
1534 safe_deallocate_a(tmp)
1538 scf%evsum_diff = abs(scf%evsum_out - scf%evsum_in)
1539 scf%evsum_in = scf%evsum_out
1549 subroutine write_dipole(st, hm, space, dipole, iunit, namespace)
1553 real(real64),
intent(in) :: dipole(:)
1554 integer,
optional,
intent(in) :: iunit
1555 type(
namespace_t),
optional,
intent(in) :: namespace
1559 if(st%system_grp%is_root())
then
1560 call output_dipole(dipole, space%dim, iunit=iunit, namespace=namespace)
1562 if (space%is_periodic())
then
1563 message(1) =
"Defined only up to quantum of polarization (e * lattice vector)."
1564 message(2) =
"Single-point Berry's phase method only accurate for large supercells."
1567 if (hm%kpoints%full%npoints > 1)
then
1569 "WARNING: Single-point Berry's phase method for dipole should not be used when there is more than one k-point."
1570 message(2) =
"Instead, finite differences on k-points (not yet implemented) are needed."
1575 message(1) =
"Single-point Berry's phase dipole calculation not correct without integer occupations."
1588 type(
scf_t),
intent(inout) :: scf
1589 logical,
intent(in) :: known_lower_bound
1591 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
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