41 use,
intrinsic :: iso_fortran_env
109 integer,
public,
parameter :: &
117 integer,
public :: max_iter
119 real(real64),
public :: lmm_r
122 logical :: conv_eigen_error
123 logical :: check_conv
126 logical :: lcao_restricted
127 logical :: calc_force
128 logical,
public :: calc_stress
129 logical :: calc_dipole
130 logical :: calc_partial_charges
132 type(mixfield_t),
pointer :: mixfield
133 type(eigensolver_t) :: eigens
135 logical :: forced_finish
136 type(lda_u_mixer_t) :: lda_u_mix
137 type(vtau_mixer_t) :: vtau_mix
138 type(berry_t) :: berry
141 type(restart_t),
public :: restart_load, restart_dump
143 type(criterion_list_t),
public :: criterion_list
144 real(real64) :: energy_in, energy_diff, abs_dens_diff, evsum_in, evsum_out, evsum_diff
147 logical :: converged_current, converged_last
148 integer :: verbosity_
150 real(real64),
allocatable :: rhoout(:,:), rhoin(:,:)
151 real(real64),
allocatable :: vhxc_old(:,:)
152 class(wfs_elec_t),
allocatable :: psioutb(:, :)
153 logical :: output_forces, calc_current, output_during_scf, finish
159 subroutine scf_init(scf, namespace, gr, ions, st, mc, hm, space)
160 type(scf_t),
intent(inout) :: scf
161 type(grid_t),
intent(in) :: gr
162 type(namespace_t),
intent(in) :: namespace
163 type(ions_t),
intent(in) :: ions
164 type(states_elec_t),
intent(in) :: st
165 type(multicomm_t),
intent(in) :: mc
166 type(hamiltonian_elec_t),
intent(inout) :: hm
167 class(space_t),
intent(in) :: space
170 integer :: mixdefault
171 type(type_t) :: mix_type
172 class(convergence_criterion_t),
pointer :: crit
173 type(criterion_iterator_t) :: iter
196 if (
allocated(hm%vberry))
then
203 call iter%start(scf%criterion_list)
204 do while (iter%has_next())
205 crit => iter%get_next()
208 call crit%set_pointers(scf%energy_diff, scf%energy_in)
210 call crit%set_pointers(scf%abs_dens_diff, st%qtot)
212 call crit%set_pointers(scf%evsum_diff, scf%evsum_out)
219 if(.not. scf%check_conv .and. scf%max_iter < 0)
then
220 call messages_write(
"All convergence criteria are disabled. Octopus is cowardly refusing")
225 call messages_write(
"Please set one of the following variables to a positive value:")
248 if(scf%max_iter < 0) scf%max_iter = huge(scf%max_iter)
255 if(scf%eigens%es_type /=
rs_evo)
then
279 mixdefault = option__mixfield__potential
282 call parse_variable(namespace,
'MixField', mixdefault, scf%mix_field)
286 if (scf%mix_field == option__mixfield__potential .and. hm%theory_level ==
independent_particles)
then
287 call messages_write(
'Input: Cannot mix the potential for non-interacting particles.')
291 if (scf%mix_field == option__mixfield__potential .and. hm%pcm%run_pcm)
then
292 call messages_write(
'Input: You have selected to mix the potential.', new_line = .
true.)
293 call messages_write(
' This might produce convergence problems for solvated systems.', new_line = .
true.)
298 if(scf%mix_field == option__mixfield__density &
301 call messages_write(
'Input: You have selected to mix the density with OEP or MGGA XC functionals.', new_line = .
true.)
302 call messages_write(
' This might produce convergence problems. Mix the potential instead.')
306 if(scf%mix_field == option__mixfield__states)
then
311 select case(scf%mix_field)
312 case (option__mixfield__potential, option__mixfield__density)
314 case(option__mixfield__states)
321 if (scf%mix_field /= option__mixfield__none)
then
322 call mix_init(scf%smix, namespace, space, gr%der, scf%mixdim1, st%d%nspin, func_type_ = mix_type)
326 if (scf%mix_field /= option__mixfield__states .and. scf%mix_field /= option__mixfield__none )
then
332 if(scf%mix_field == option__mixfield__potential)
then
338 scf%mix_field = option__mixfield__none
351 call parse_variable(namespace,
'SCFinLCAO', .false., scf%lcao_restricted)
352 if(scf%lcao_restricted)
then
354 message(1) =
'Info: SCF restricted to LCAO subspace.'
357 if(scf%conv_eigen_error)
then
358 message(1) =
"ConvEigenError cannot be used with SCFinLCAO, since error is unknown."
373 call parse_variable(namespace,
'SCFCalculateForces', .not. ions%only_user_def, scf%calc_force)
375 if(scf%calc_force .and. gr%der%boundaries%spiralBC)
then
376 message(1) =
'Forces cannot be calculated when using spiral boundary conditions.'
377 write(
message(2),
'(a)')
'Please use SCFCalculateForces = no.'
380 if(scf%calc_force)
then
381 if (
allocated(hm%ep%b_field) .or.
allocated(hm%ep%a_static))
then
382 write(
message(1),
'(a)')
'The forces are currently not properly calculated if static'
383 write(
message(2),
'(a)')
'magnetic fields or static vector potentials are present.'
384 write(
message(3),
'(a)')
'Please use SCFCalculateForces = no.'
397 call parse_variable(namespace,
'SCFCalculateStress', .false. , scf%calc_stress)
411 call parse_variable(namespace,
'SCFCalculateDipole', .not. space%is_periodic(), scf%calc_dipole)
412 if (
allocated(hm%vberry)) scf%calc_dipole = .
true.
422 call parse_variable(namespace,
'SCFCalculatePartialCharges', .false., scf%calc_partial_charges)
423 if (scf%calc_partial_charges)
call messages_experimental(
'SCFCalculatePartialCharges', namespace=namespace)
425 rmin = ions%min_distance()
441 scf%forced_finish = .false.
449 type(
scf_t),
intent(inout) :: scf
458 if(scf%mix_field /= option__mixfield__none)
call mix_end(scf%smix)
460 nullify(scf%mixfield)
462 if (scf%mix_field /= option__mixfield__states)
then
467 call iter%start(scf%criterion_list)
468 do while (iter%has_next())
469 crit => iter%get_next()
470 safe_deallocate_p(crit)
479 type(
scf_t),
intent(inout) :: scf
485 if (scf%mix_field /= option__mixfield__states)
then
495 subroutine scf_load(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, restart_load)
496 type(
scf_t),
intent(inout) :: scf
500 type(
grid_t),
intent(inout) :: gr
501 type(
ions_t),
intent(in) :: ions
504 type(
v_ks_t),
intent(inout) :: ks
506 type(
restart_t),
intent(in) :: restart_load
516 message(1) =
'Unable to read density. Density will be calculated from states.'
519 if (
bitand(ks%xc_family, xc_family_oep) == 0)
then
520 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners)
523 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners)
532 message(1) =
'Unable to read Vhxc. Vhxc will be calculated from states.'
535 call hm%update(gr, namespace, space, ext_partners)
536 if (
bitand(ks%xc_family, xc_family_oep) /= 0)
then
538 do is = 1, st%d%nspin
539 ks%oep%vxc(1:gr%np, is) = hm%vhxc(1:gr%np, is) - hm%vhartree(1:gr%np)
541 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners)
548 if (scf%mix_field == option__mixfield__density .or. scf%mix_field == option__mixfield__potential)
then
549 call mix_load(namespace, restart_load, scf%smix, space, gr, ierr)
552 message(1) =
"Unable to read mixing information. Mixing will start from scratch."
558 call lda_u_load(restart_load, hm%lda_u, st, hm%energy%dft_u, ierr)
560 message(1) =
"Unable to read DFT+U information. DFT+U data will be calculated from states."
577 subroutine scf_start(scf, namespace, space, gr, ions, st, ks, hm, outp, verbosity)
578 type(
scf_t),
intent(inout) :: scf
581 type(
grid_t),
intent(inout) :: gr
582 type(
ions_t),
intent(inout) :: ions
584 type(
v_ks_t),
intent(inout) :: ks
586 type(
output_t),
optional,
intent(in) :: outp
587 integer,
optional,
intent(in) :: verbosity
593 if(scf%forced_finish)
then
594 message(1) =
"Previous clean stop, not doing SCF and quitting."
600 scf%output_during_scf = .false.
601 scf%output_forces = .false.
602 scf%calc_current = .false.
604 if (
present(outp))
then
607 if (outp%what(option__output__stress))
then
608 scf%calc_stress = .
true.
611 scf%output_during_scf = outp%duringscf
614 if (outp%duringscf .and. outp%what(option__output__forces))
then
615 scf%output_forces = .
true.
619 if(scf%lcao_restricted)
then
620 call lcao_init(scf%lcao, namespace, space, gr, ions, st)
622 message(1) =
'LCAO is not available. Cannot do SCF in LCAO.'
627 safe_allocate(scf%rhoout(1:gr%np, 1:st%d%nspin))
628 safe_allocate(scf%rhoin (1:gr%np, 1:st%d%nspin))
630 call lalg_copy(gr%np, st%d%nspin, st%rho, scf%rhoin)
633 if (scf%calc_force .or. scf%output_forces)
then
635 safe_allocate(scf%vhxc_old(1:gr%np, 1:st%d%nspin))
636 call lalg_copy(gr%np, st%d%nspin, hm%vhxc, scf%vhxc_old)
640 select case(scf%mix_field)
641 case(option__mixfield__potential)
644 case(option__mixfield__density)
647 case(option__mixfield__states)
650 allocate(
wfs_elec_t::scf%psioutb (st%group%block_start:st%group%block_end, st%d%kpt%start:st%d%kpt%end))
652 do iqn = st%d%kpt%start, st%d%kpt%end
653 do ib = st%group%block_start, st%group%block_end
654 call st%group%psib(ib, iqn)%copy_to(scf%psioutb(ib, iqn))
662 if (scf%mix_field /= option__mixfield__states)
call lda_u_mixer_set_vin(hm%lda_u, scf%lda_u_mix)
666 if ( scf%verbosity_ /= verb_no )
then
667 if(scf%max_iter > 0)
then
668 write(
message(1),
'(a)')
'Info: Starting SCF iteration.'
670 write(
message(1),
'(a)')
'Info: No SCF iterations will be done.'
677 scf%converged_current = .false.
687 character(len=*),
intent(in) :: dir
688 character(len=*),
intent(in) :: fname
691 character(len=12) :: label
694 iunit =
io_open(trim(dir) //
"/" // trim(fname), namespace, action=
'write')
695 write(iunit,
'(a)', advance =
'no')
'#iter energy '
696 label =
'energy_diff'
697 write(iunit,
'(1x,a)', advance =
'no') label
699 write(iunit,
'(1x,a)', advance =
'no') label
701 write(iunit,
'(1x,a)', advance =
'no') label
703 write(iunit,
'(1x,a)', advance =
'no') label
705 write(iunit,
'(1x,a)', advance =
'no') label
709 label =
'OEP norm2ss'
710 write(iunit,
'(1x,a)', advance =
'no') label
713 write(iunit,
'(a)')
''
723 subroutine scf_run(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, outp, &
724 verbosity, iters_done, restart_dump)
725 type(
scf_t),
intent(inout) :: scf
729 type(
grid_t),
intent(inout) :: gr
730 type(
ions_t),
intent(inout) :: ions
733 type(
v_ks_t),
intent(inout) :: ks
735 type(
output_t),
optional,
intent(in) :: outp
736 integer,
optional,
intent(in) :: verbosity
737 integer,
optional,
intent(out) :: iters_done
738 type(
restart_t),
optional,
intent(in) :: restart_dump
745 call scf_start(scf, namespace, space, gr, ions, st, ks, hm, outp, verbosity)
748 do iter = 1, scf%max_iter
750 call scf_iter(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, iter, outp, &
751 verbosity, iters_done, restart_dump)
753 completed =
scf_iter_finish(scf, namespace, space, gr, ions, st, ks, hm, iter, outp, verbosity, iters_done)
755 if(scf%forced_finish .or. completed)
then
760 call scf_finish(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, iter, outp, &
761 verbosity, iters_done, restart_dump)
767 subroutine scf_iter(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, iter, outp, &
768 verbosity, iters_done, restart_dump)
769 type(
scf_t),
intent(inout) :: scf
773 type(
grid_t),
intent(inout) :: gr
774 type(
ions_t),
intent(inout) :: ions
777 type(
v_ks_t),
intent(inout) :: ks
779 integer,
intent(in) :: iter
780 type(
output_t),
optional,
intent(in) :: outp
781 integer,
optional,
intent(in) :: verbosity
782 integer,
optional,
intent(out) :: iters_done
783 type(
restart_t),
optional,
intent(in) :: restart_dump
785 integer :: iqn, ib, ierr
788 logical :: is_crit_conv
789 real(real64) :: etime, itime
799 scf%eigens%converged = 0
802 call hm%update_span(gr%spacing(1:space%dim), minval(st%eigenval(:, :)), namespace)
808 call iterator%start(scf%criterion_list)
809 do while (iterator%has_next())
810 crit => iterator%get_next()
814 if (scf%calc_force .or. scf%output_forces)
then
816 scf%vhxc_old(1:gr%np, 1:st%d%nspin) = hm%vhxc(1:gr%np, 1:st%d%nspin)
819 if(scf%lcao_restricted)
then
821 call lcao_wf(scf%lcao, st, gr, ions, hm, namespace)
826 if (
allocated(hm%vberry))
then
829 ks%frozen_hxc = .
true.
831 call berry_perform_internal_scf(scf%berry, namespace, space, scf%eigens, gr, st, hm, iter, ks, ions, ext_partners)
833 ks%frozen_hxc = .false.
835 scf%eigens%converged = 0
836 call scf%eigens%run(namespace, gr, st, hm, iter)
840 scf%matvec = scf%matvec + scf%eigens%matvec
849 call lalg_copy(gr%np, st%d%nspin, st%rho, scf%rhoout)
851 select case (scf%mix_field)
852 case (option__mixfield__potential)
853 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_current=scf%output_during_scf)
856 case (option__mixfield__density)
858 case(option__mixfield__states)
860 do iqn = st%d%kpt%start, st%d%kpt%end
861 do ib = st%group%block_start, st%group%block_end
862 call st%group%psib(ib, iqn)%copy_data_to(gr%np, scf%psioutb(ib, iqn))
867 if (scf%mix_field /= option__mixfield__states .and. scf%mix_field /= option__mixfield__none)
then
874 if (
present(outp))
then
876 if (outp%duringscf .and. outp%what_now(option__output__forces, iter))
then
877 call forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, vhxc_old=scf%vhxc_old)
882 call iterator%start(scf%criterion_list)
883 do while (iterator%has_next())
884 crit => iterator%get_next()
889 scf%converged_last = scf%converged_current
891 scf%converged_current = scf%check_conv .and. &
892 (.not. scf%conv_eigen_error .or. all(scf%eigens%converged == st%nst))
894 call iterator%start(scf%criterion_list)
895 do while (iterator%has_next())
896 crit => iterator%get_next()
897 call crit%is_converged(is_crit_conv)
898 scf%converged_current = scf%converged_current .and. is_crit_conv
903 scf%finish = scf%converged_last .and. scf%converged_current
909 select case (scf%mix_field)
910 case (option__mixfield__density)
912 call mixing(namespace, scf%smix)
915 if (minval(st%rho(1:gr%np, 1:st%d%spin_channels)) < -1e-6_real64)
then
916 write(
message(1),*)
'Negative density after mixing. Minimum value = ', &
917 minval(st%rho(1:gr%np, 1:st%d%spin_channels))
921 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_current=scf%output_during_scf)
922 case (option__mixfield__potential)
924 call mixing(namespace, scf%smix)
930 case(option__mixfield__states)
932 do iqn = st%d%kpt%start, st%d%kpt%end
933 do ib = st%group%block_start, st%group%block_end
940 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_current=scf%output_during_scf)
942 case (option__mixfield__none)
943 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_current=scf%output_during_scf)
950 if (scf%finish .and. st%modelmbparticles%nparticle > 0)
then
954 if (
present(outp) .and.
present(restart_dump))
then
957 if ( (scf%finish .or. (modulo(iter, outp%restart_write_interval) == 0) &
958 .or. iter == scf%max_iter .or. scf%forced_finish) )
then
960 call states_elec_dump(scf%restart_dump, space, st, gr, hm%kpoints, ierr, iter=iter)
962 message(1) =
'Unable to write states wavefunctions.'
968 message(1) =
'Unable to write density.'
973 call lda_u_dump(scf%restart_dump, namespace, hm%lda_u, st, gr, ierr)
975 message(1) =
'Unable to write DFT+U information.'
980 select case (scf%mix_field)
981 case (option__mixfield__density)
982 call mix_dump(namespace, scf%restart_dump, scf%smix, space, gr, ierr)
984 message(1) =
'Unable to write mixing information.'
987 case (option__mixfield__potential)
990 message(1) =
'Unable to write Vhxc.'
994 call mix_dump(namespace, scf%restart_dump, scf%smix, space, gr, ierr)
996 message(1) =
'Unable to write mixing information.'
1014 character(len=50) :: str
1015 real(real64) :: dipole(1:space%dim)
1021 write(str,
'(a,i5)')
'SCF CYCLE ITER #' ,iter
1025 ' rel_ev = ', scf%evsum_diff/(abs(scf%evsum_out)+1e-20)
1026 write(
message(2),
'(a,es15.2,2(a,es9.2))') &
1027 ' ediff = ', scf%energy_diff,
' abs_dens = ', scf%abs_dens_diff, &
1028 ' rel_dens = ', scf%abs_dens_diff/st%qtot
1031 if(.not.scf%lcao_restricted)
then
1032 write(
message(1),
'(a,i6)')
'Matrix vector products: ', scf%eigens%matvec
1033 write(
message(2),
'(a,i6)')
'Converged eigenvectors: ', sum(scf%eigens%converged(1:st%nik))
1040 if (
allocated(hm%vberry))
then
1042 call write_dipole(st, hm, space, dipole, namespace=namespace)
1055 write(
message(2),
'(a,i5,a,f14.2)')
'Elapsed time for SCF step ', iter,
':', etime
1065 write(
message(1),
'(a,i4,a,es15.8, a,es9.2, a, f7.1, a)') &
1068 ' : abs_dens', scf%abs_dens_diff, &
1069 ' : etime ', etime,
's'
1079 character(len=*),
intent(in) :: dir
1080 character(len=*),
intent(in) :: fname
1086 iunit =
io_open(trim(dir) //
"/" // trim(fname), namespace, action=
'write', position=
'append')
1088 call iterator%start(scf%criterion_list)
1089 do while (iterator%has_next())
1090 crit => iterator%get_next()
1095 write(iunit,
'(2es13.5)', advance =
'no') crit%val_abs, crit%val_rel
1098 write(iunit,
'(es13.5)', advance =
'no') crit%val_rel
1106 write(iunit,
'(es13.5)', advance =
'no') ks%oep%norm2ss
1109 write(iunit,
'(a)')
''
1116 logical function scf_iter_finish(scf, namespace, space, gr, ions, st, ks, hm, iter, outp, &
1117 verbosity, iters_done)
result(completed)
1118 type(
scf_t),
intent(inout) :: scf
1121 type(
grid_t),
intent(inout) :: gr
1122 type(
ions_t),
intent(inout) :: ions
1124 type(
v_ks_t),
intent(inout) :: ks
1126 integer,
intent(in) :: iter
1127 type(
output_t),
optional,
intent(in) :: outp
1128 integer,
optional,
intent(in) :: verbosity
1129 integer,
optional,
intent(out) :: iters_done
1131 character(len=MAX_PATH_LEN) :: dirname
1132 integer(int64) :: what_i
1139 if(
present(iters_done)) iters_done = iter
1141 write(
message(1),
'(a, i4, a)')
'Info: SCF converged in ', iter,
' iterations'
1149 if (
present(outp))
then
1150 if (any(outp%what) .and. outp%duringscf)
then
1151 do what_i = lbound(outp%what, 1), ubound(outp%what, 1)
1152 if (outp%what_now(what_i, iter))
then
1153 write(dirname,
'(a,a,i4.4)') trim(outp%iter_dir),
"scf.", iter
1154 call output_all(outp, namespace, space, dirname, gr, ions, iter, st, hm, ks)
1155 call output_modelmb(outp, namespace, space, dirname, gr, ions, iter, st)
1163 call lalg_copy(gr%np, st%d%nspin, st%rho, scf%rhoin)
1166 if (scf%mix_field /= option__mixfield__none)
then
1167 if (scf%smix%ns_restart > 0)
then
1168 if (mod(iter, scf%smix%ns_restart) == 0)
then
1169 message(1) =
"Info: restarting mixing."
1176 select case(scf%mix_field)
1177 case(option__mixfield__potential)
1180 case (option__mixfield__density)
1185 if (scf%mix_field /= option__mixfield__states)
then
1196 subroutine scf_finish(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, iter, outp, &
1197 verbosity, iters_done, restart_dump)
1198 type(
scf_t),
intent(inout) :: scf
1202 type(
grid_t),
intent(inout) :: gr
1203 type(
ions_t),
intent(inout) :: ions
1206 type(
v_ks_t),
intent(inout) :: ks
1208 integer,
intent(in) :: iter
1210 integer,
optional,
intent(in) :: verbosity
1211 integer,
optional,
intent(out) :: iters_done
1212 type(
restart_t),
optional,
intent(in) :: restart_dump
1221 if(scf%lcao_restricted)
call lcao_end(scf%lcao)
1223 if ((scf%max_iter > 0 .and. scf%mix_field == option__mixfield__potential) .or. scf%calc_current)
then
1224 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
1225 calc_current=scf%calc_current)
1228 select case(scf%mix_field)
1229 case(option__mixfield__states)
1231 do iqn = st%d%kpt%start, st%d%kpt%end
1232 do ib = st%group%block_start, st%group%block_end
1233 call scf%psioutb(ib, iqn)%end()
1238 deallocate(scf%psioutb)
1241 safe_deallocate_a(scf%rhoout)
1242 safe_deallocate_a(scf%rhoin)
1244 if (scf%max_iter > 0 .and. any(scf%eigens%converged < st%nst) .and. .not. scf%lcao_restricted)
then
1245 write(
message(1),
'(a)')
'Some of the states are not fully converged!'
1249 if (.not.scf%finish)
then
1250 write(
message(1),
'(a,i4,a)')
'SCF *not* converged after ', iter - 1,
' iterations.'
1254 write(
message(1),
'(a,i10)')
'Info: Number of matrix-vector products: ', scf%matvec
1257 if (scf%calc_force)
then
1258 call forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, vhxc_old=scf%vhxc_old)
1261 if (scf%calc_stress)
call stress_calculate(namespace, gr, hm, st, ions, ks, ext_partners)
1263 if(scf%max_iter == 0)
then
1269 if(
present(outp))
then
1276 if (space%is_periodic() .and. st%nik > st%d%nspin)
then
1279 ions, gr, hm%kpoints, hm%phase, vec_pot = hm%hm_base%uniform_vector_potential, &
1280 vec_pot_var = hm%hm_base%vector_potential)
1284 if (ks%vdw%vdw_correction == option__vdwcorrection__vdw_ts)
then
1288 safe_deallocate_a(scf%vhxc_old)
1296 character(len=*),
intent(in) :: dir, fname
1298 integer :: iunit, iatom
1299 real(real64),
allocatable :: hirshfeld_charges(:)
1300 real(real64) :: dipole(1:space%dim)
1301 real(real64) :: ex_virial
1307 iunit =
io_open(trim(dir) //
"/" // trim(fname), namespace, action=
'write')
1313 if (space%is_periodic())
then
1314 call hm%kpoints%write_info(iunit=iunit)
1322 write(iunit,
'(a, i4, a)')
'SCF converged in ', iter,
' iterations'
1324 write(iunit,
'(a)')
'SCF *not* converged!'
1326 write(iunit,
'(1x)')
1328 if(any(scf%eigens%converged < st%nst) .and. .not. scf%lcao_restricted)
then
1329 write(iunit,
'(a)')
'Some of the states are not fully converged!'
1333 write(iunit,
'(1x)')
1335 if (space%is_periodic())
then
1337 write(iunit,
'(1x)')
1353 if(st%d%ispin ==
spinors .and. space%dim == 3 .and. &
1365 if(scf%calc_dipole)
then
1372 hm%xc%functional(
func_c,1)%family == xc_family_none .and. st%d%ispin /=
spinors)
then
1379 write(iunit,
'(1x)')
1384 if(scf%max_iter > 0)
then
1385 write(iunit,
'(a)')
'Convergence:'
1386 call iterator%start(scf%criterion_list)
1387 do while (iterator%has_next())
1388 crit => iterator%get_next()
1389 call crit%write_info(iunit)
1398 write(iunit,
'(a)')
'Photon observables:'
1399 write(iunit,
'(6x, a, es15.8,a,es15.8,a)')
'Photon number = ', ks%oep_photon%pt%number(1)
1400 write(iunit,
'(6x, a, es15.8,a,es15.8,a)')
'Photon ex. = ', ks%oep_photon%pt%ex
1407 if (scf%calc_stress)
then
1408 call output_stress(iunit, space%periodic_dim, st%stress_tensors, all_terms=.false.)
1409 call output_pressure(iunit, space%periodic_dim, st%stress_tensors%total)
1414 if(scf%calc_partial_charges)
then
1415 safe_allocate(hirshfeld_charges(1:ions%natoms))
1421 write(iunit,
'(a)')
'Partial ionic charges'
1422 write(iunit,
'(a)')
' Ion Hirshfeld'
1424 do iatom = 1, ions%natoms
1425 write(iunit,
'(i4,a10,f16.3)') iatom, trim(ions%atom(iatom)%species%get_label()), hirshfeld_charges(iatom)
1431 safe_deallocate_a(hirshfeld_charges)
1466 real(real64) :: mem_tmp
1470 if(
conf%report_memory)
then
1472 call mpi_world%allreduce(mem, mem_tmp, 1, mpi_double_precision, mpi_sum)
1474 write(
message(1),
'(a,f14.2)')
'Memory usage [Mbytes] :', mem
1484 type(
scf_t),
intent(inout) :: scf
1490 select type (criterion)
1492 scf%energy_in = hm%energy%total
1507 type(
scf_t),
intent(inout) :: scf
1510 type(
grid_t),
intent(in) :: gr
1511 real(real64),
intent(in) :: rhoout(:,:), rhoin(:,:)
1515 real(real64),
allocatable :: tmp(:)
1519 select type (criterion)
1521 scf%energy_diff = abs(hm%energy%total - scf%energy_in)
1524 scf%abs_dens_diff =
m_zero
1525 safe_allocate(tmp(1:gr%np))
1526 do is = 1, st%d%nspin
1527 tmp = abs(rhoin(1:gr%np, is) - rhoout(1:gr%np, is))
1528 scf%abs_dens_diff = scf%abs_dens_diff +
dmf_integrate(gr, tmp)
1530 safe_deallocate_a(tmp)
1534 scf%evsum_diff = abs(scf%evsum_out - scf%evsum_in)
1535 scf%evsum_in = scf%evsum_out
1545 subroutine write_dipole(st, hm, space, dipole, iunit, namespace)
1549 real(real64),
intent(in) :: dipole(:)
1550 integer,
optional,
intent(in) :: iunit
1551 type(
namespace_t),
optional,
intent(in) :: namespace
1558 if (space%is_periodic())
then
1559 message(1) =
"Defined only up to quantum of polarization (e * lattice vector)."
1560 message(2) =
"Single-point Berry's phase method only accurate for large supercells."
1563 if (hm%kpoints%full%npoints > 1)
then
1565 "WARNING: Single-point Berry's phase method for dipole should not be used when there is more than one k-point."
1566 message(2) =
"Instead, finite differences on k-points (not yet implemented) are needed."
1571 message(1) =
"Single-point Berry's phase dipole calculation not correct without integer occupations."
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.
subroutine, public eigensolver_init(eigens, namespace, gr, st, mc, space)
integer, parameter, public rs_evo
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
real(real64), parameter, public lmm_r_single_atom
Default local magnetic moments sphere radius for an isolated system.
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)
integer, parameter, public generalized_kohn_sham_dft
integer, parameter, public hartree_fock
integer, parameter, public independent_particles
subroutine, public hamiltonian_elec_dump_vhxc(restart, hm, space, mesh, ierr)
subroutine, public hamiltonian_elec_update_pot(this, mesh, accumulate)
Update the KS potential of the electronic Hamiltonian.
subroutine, public hamiltonian_elec_load_vhxc(restart, hm, space, mesh, ierr)
integer, parameter, public kohn_sham_dft
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
subroutine, public lcao_init_orbitals(this, namespace, st, gr, ions, start)
subroutine, public lcao_wf(this, st, gr, ions, hm, namespace, start)
subroutine, public lcao_end(this)
subroutine, public lcao_init(this, namespace, space, gr, ions, st)
logical function, public lcao_is_available(this)
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
integer, parameter, public dft_u_acbn0
subroutine, public lda_u_update_occ_matrices(this, namespace, mesh, st, hm_base, phase, energy)
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.
real(real64) function, public dmf_integrate(mesh, ff, mask, reduce)
Integrate a function on the mesh.
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, space, mesh, ierr)
subroutine, public mix_load(namespace, restart, smix, space, mesh, ierr)
subroutine, public mix_init(smix, namespace, space, der, d1, d2, def_, func_type_, prefix_)
Initialise mix_t instance.
subroutine, public mix_end(smix)
subroutine, public mix_clear(smix)
subroutine, public modelmb_sym_all_states(space, mesh, st)
logical function mpi_grp_is_root(grp)
Is the current MPI process of grpcomm, root.
type(mpi_grp_t), public mpi_world
This module handles the communicators for the various parallelization strategies.
this module contains 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_calculate(mesh, st, ions, hirshfeld_charges)
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
logical pure function, public restart_has_flag(restart, flag)
Returns true if...
subroutine, public scf_load(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, restart_load)
Loading of restarting data of the SCF cycle.
logical function, public scf_iter_finish(scf, namespace, space, gr, ions, st, ks, hm, iter, outp, verbosity, iters_done)
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)
integer, parameter, public verb_full
subroutine, public scf_finish(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, iter, outp, verbosity, iters_done, restart_dump)
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, verbosity, iters_done, restart_dump)
subroutine, public scf_start(scf, namespace, space, gr, ions, st, ks, hm, outp, verbosity)
Preparation of the SCF cycle.
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, st_start_writing, verbose)
subroutine, public states_elec_load_rho(restart, space, st, mesh, ierr)
subroutine, public states_elec_dump_rho(restart, space, 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_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
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