107 integer,
public,
parameter :: &
112 integer,
public,
parameter :: &
122 integer,
public :: level = dft_u_none
125 real(real64),
allocatable,
public :: dn(:,:,:,:)
126 real(real64),
allocatable :: dV(:,:,:,:)
129 complex(real64),
allocatable,
public :: zn(:,:,:,:)
130 complex(real64),
allocatable :: zV(:,:,:,:)
131 real(real64),
allocatable,
public :: dn_alt(:,:,:,:)
132 complex(real64),
allocatable,
public :: zn_alt(:,:,:,:)
134 real(real64),
allocatable :: renorm_occ(:,:,:,:,:)
137 real(real64),
allocatable,
public :: coulomb(:,:,:,:,:)
139 complex(real64),
allocatable,
public :: zcoulomb(:,:,:,:,:,:,:)
142 type(orbitalbasis_t),
public :: basis
143 type(orbitalset_t),
pointer,
public :: orbsets(:) => null()
144 integer,
public :: norbsets = 0
146 integer,
public :: nspins = 0
147 integer,
public :: spin_channels = 0
148 integer :: nspecies = 0
149 integer,
public :: maxnorbs = 0
150 integer :: max_np = 0
152 logical :: useAllOrbitals = .false.
153 logical :: skipSOrbitals = .
true.
154 logical :: freeze_occ = .false.
155 logical :: freeze_u = .false.
156 logical,
public :: intersite = .false.
157 real(real64) :: intersite_radius =
m_zero
158 logical,
public :: basisfromstates = .false.
159 real(real64) :: acbn0_screening =
m_one
160 integer,
allocatable :: basisstates(:)
161 integer,
allocatable :: basisstates_os(:)
162 logical :: rot_inv = .false.
163 integer :: double_couting = dft_u_fll
165 real(real64),
allocatable :: dc_alpha(:)
167 type(lattice_vectors_t),
pointer :: latt
169 type(distributed_t) :: orbs_dist
172 integer,
public :: maxneighbors = 0
173 real(real64),
allocatable,
public :: dn_ij(:,:,:,:,:), dn_alt_ij(:,:,:,:,:), dn_alt_ii(:,:,:,:,:)
174 complex(real64),
allocatable,
public :: zn_ij(:,:,:,:,:), zn_alt_ij(:,:,:,:,:), zn_alt_ii(:,:,:,:,:)
177 logical :: symmetrize_occ_matrices
178 integer,
allocatable :: inv_map_symm(:,:)
180 real(real64),
allocatable :: symm_weight(:,:,:,:)
186 subroutine lda_u_init(this, namespace, space, level, gr, ions, st, mc, kpoints, has_phase)
187 type(lda_u_t),
target,
intent(inout) :: this
188 type(namespace_t),
intent(in) :: namespace
189 class(space_t),
intent(in) :: space
190 integer,
intent(in) :: level
191 type(grid_t),
intent(in) :: gr
192 type(ions_t),
target,
intent(in) :: ions
193 type(states_elec_t),
intent(in) :: st
194 type(multicomm_t),
intent(in) :: mc
195 type(kpoints_t),
intent(in) :: kpoints
196 logical,
intent(in) :: has_phase
203 assert(.not. (level == dft_u_none))
206 if (gr%parallel_in_domains)
call messages_experimental(
"dft+u parallel in domains", namespace=namespace)
209 this%latt => ions%latt
221 call parse_variable(namespace,
'DFTUBasisFromStates', .false., this%basisfromstates)
239 call parse_variable(namespace,
'DFTUDoubleCounting', dft_u_fll, this%double_couting)
241 if (this%double_couting /= dft_u_fll)
call messages_experimental(
"DFTUDoubleCounting /= dft_u_ffl", namespace=namespace)
242 if (st%d%ispin ==
spinors .and. this%double_couting /= dft_u_fll)
then
275 if (gr%parallel_in_domains)
then
276 call messages_not_implemented(
"DFTUPoissonSolver=dft_u_poisson_isf with domain parallelization", namespace=namespace)
278 if (ions%latt%nonorthogonal)
then
283#if !(defined HAVE_PSOLVER)
284 message(1) =
"The PSolver Poisson solver cannot be used since the code was not compiled with the PSolver library."
287 if (gr%parallel_in_domains)
then
288 call messages_not_implemented(
"DFTUPoissonSolver=dft_u_poisson_psolver with domain parallelization", namespace=namespace)
290 if (ions%latt%nonorthogonal)
then
291 call messages_not_implemented(
"DFTUPoissonSolver=dft_u_poisson_psolver with non-orthogonal cells", namespace=namespace)
305 call parse_variable(namespace,
'UseAllAtomicOrbitals', .false., this%useAllOrbitals)
341 if (this%rot_inv .and. st%d%ispin ==
spinors)
then
354 call parse_variable(namespace,
'ACBN0IntersiteInteraction', .false., this%intersite)
358 if (this%intersite)
then
362 if (kpoints%use_symmetries)
then
374 if (abs(this%intersite_radius) <
m_epsilon)
then
375 call messages_write(
"ACBN0IntersiteCutoff must be greater than 0")
385 if (.not. this%basisfromstates)
then
391 this%skipSOrbitals, this%useAllOrbitals)
394 this%skipSOrbitals, this%useAllOrbitals)
396 this%orbsets => this%basis%orbsets
397 this%norbsets = this%basis%norbsets
398 this%maxnorbs = this%basis%maxnorbs
399 this%max_np = this%basis%max_np
400 this%nspins = st%d%nspin
401 this%spin_channels = st%d%spin_channels
402 this%nspecies = ions%nspecies
413 if (.not. gr%parallel_in_domains)
then
414 call distributed_init(this%orbs_dist, this%norbsets, mpi_comm_world,
"orbsets")
431 if (
parse_block(namespace,
'DFTUBasisStates', blk) == 0)
then
434 if (this%maxnorbs <1)
then
435 write(
message(1),
'(a,i3,a,i3)')
'DFTUBasisStates must contains at least one state.'
438 safe_allocate(this%basisstates(1:this%maxnorbs))
439 safe_allocate(this%basisstates_os(1:this%maxnorbs))
440 do is = 1, this%maxnorbs
446 write(
message(1),
'(a,i3,a,i3)')
'DFTUBasisStates must be specified if DFTUBasisFromStates=yes'
457 this%nspins = st%d%nspin
458 this%spin_channels = st%d%spin_channels
461 this%orbsets => this%basis%orbsets
474 message(1) =
"Unable to load DFT+U basis from selected states."
481 this%symmetrize_occ_matrices = st%symmetrize_density .or. kpoints%use_symmetries
482 if (this%basisfromstates) this%symmetrize_occ_matrices = .false.
483 if (this%symmetrize_occ_matrices)
then
487 safe_allocate(this%dc_alpha(this%norbsets))
488 this%dc_alpha =
m_one
498 type(
lda_u_t),
target,
intent(inout) :: this
500 class(
space_t),
intent(in) :: space
501 type(
grid_t),
intent(in) :: gr
504 logical,
intent(in) :: has_phase
506 logical :: complex_coulomb_integrals
512 norbs = this%maxnorbs
514 if (.not. this%basisfromstates)
then
518 complex_coulomb_integrals = .false.
519 do ios = 1, this%norbsets
520 if (this%orbsets(ios)%ndim > 1) complex_coulomb_integrals = .
true.
523 if (.not. complex_coulomb_integrals)
then
524 write(
message(1),
'(a)')
'Computing the Coulomb integrals of the localized basis.'
526 safe_allocate(this%coulomb(1:norbs,1:norbs,1:norbs,1:norbs, 1:this%norbsets))
534 write(
message(1),
'(a)')
'Computing complex Coulomb integrals of the localized basis.'
536 safe_allocate(this%zcoulomb(1:norbs, 1:norbs, 1:norbs, 1:norbs, 1:st%d%dim, 1:st%d%dim, 1:this%norbsets))
542 write(
message(1),
'(a)')
'Computing the Coulomb integrals of the localized basis.'
544 safe_allocate(this%coulomb(1:norbs, 1:norbs, 1:norbs, 1:norbs, 1:this%norbsets))
561 type(
lda_u_t),
intent(inout) :: this
565 this%level = dft_u_none
567 safe_deallocate_a(this%dn)
568 safe_deallocate_a(this%zn)
569 safe_deallocate_a(this%dn_alt)
570 safe_deallocate_a(this%zn_alt)
571 safe_deallocate_a(this%dV)
572 safe_deallocate_a(this%zV)
573 safe_deallocate_a(this%coulomb)
574 safe_deallocate_a(this%zcoulomb)
575 safe_deallocate_a(this%renorm_occ)
576 safe_deallocate_a(this%dn_ij)
577 safe_deallocate_a(this%zn_ij)
578 safe_deallocate_a(this%dn_alt_ij)
579 safe_deallocate_a(this%zn_alt_ij)
580 safe_deallocate_a(this%dn_alt_ii)
581 safe_deallocate_a(this%zn_alt_ii)
582 safe_deallocate_a(this%basisstates)
583 safe_deallocate_a(this%basisstates_os)
584 safe_deallocate_a(this%dc_alpha)
585 safe_deallocate_a(this%inv_map_symm)
586 safe_deallocate_a(this%symm_weight)
588 nullify(this%orbsets)
593 if (.not. this%basisfromstates)
then
601 subroutine lda_u_update_basis(this, space, gr, ions, st, psolver, namespace, kpoints, has_phase)
602 type(
lda_u_t),
target,
intent(inout) :: this
603 class(
space_t),
intent(in) :: space
604 type(
grid_t),
intent(in) :: gr
605 type(
ions_t),
target,
intent(in) :: ions
610 logical,
intent(in) :: has_phase
612 integer :: ios, maxorbs, nspin
614 if(this%level == dft_u_none)
return
618 if(.not. this%basisfromstates)
then
621 nullify(this%orbsets)
626 this%skipSOrbitals, this%useAllOrbitals, verbose = .false.)
629 this%skipSOrbitals, this%useAllOrbitals, verbose = .false.)
631 this%orbsets => this%basis%orbsets
632 this%max_np = this%basis%max_np
636 if (this%intersite)
then
637 this%maxneighbors = 0
638 do ios = 1, this%norbsets
640 this%orbsets, this%norbsets, this%maxnorbs, this%intersite_radius, st%d%kpt, has_phase, &
641 this%sm_poisson, this%basisfromstates, this%basis%combine_j_orbitals)
642 this%maxneighbors = max(this%maxneighbors, this%orbsets(ios)%nneighbors)
645 maxorbs = this%maxnorbs
649 safe_deallocate_a(this%dn_ij)
650 safe_allocate(this%dn_ij(1:maxorbs,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors))
651 this%dn_ij(1:maxorbs,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors) =
m_zero
652 safe_deallocate_a(this%dn_alt_ij)
653 safe_allocate(this%dn_alt_ij(1:maxorbs,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors))
654 this%dn_alt_ij(1:maxorbs,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors) =
m_zero
655 safe_deallocate_a(this%dn_alt_ii)
656 safe_allocate(this%dn_alt_ii(1:2,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors))
657 this%dn_alt_ii(1:2,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors) =
m_zero
659 safe_deallocate_a(this%zn_ij)
660 safe_allocate(this%zn_ij(1:maxorbs,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors))
661 this%zn_ij(1:maxorbs,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors) =
m_z0
662 safe_deallocate_a(this%zn_alt_ij)
663 safe_allocate(this%zn_alt_ij(1:maxorbs,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors))
664 this%zn_alt_ij(1:maxorbs,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors) =
m_z0
665 safe_deallocate_a(this%zn_alt_ii)
666 safe_allocate(this%zn_alt_ii(1:2,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors))
667 this%zn_alt_ii(1:2,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors) =
m_z0
676 if(.not. this%basisfromstates)
then
678 if(this%basis%orthogonalization)
then
681 if(
debug%info .and. space%is_periodic())
then
689 if (
allocated(this%coulomb))
then
690 safe_deallocate_a(this%coulomb)
692 if (
allocated(this%zcoulomb))
then
693 safe_deallocate_a(this%zcoulomb)
703 type(
lda_u_t),
intent(inout) :: this
705 class(
mesh_t),
intent(in) :: mesh
708 type(
phase_t),
intent(in) :: phase
709 type(
energy_t),
intent(inout) :: energy
711 if (this%level == dft_u_none .or. this%freeze_occ)
return
717 if (phase%is_allocated())
then
730 type(
lda_u_t),
intent(inout) :: this
731 class(
space_t),
intent(in) :: space
736 real(real64),
optional,
allocatable,
intent(in) :: vec_pot(:)
737 real(real64),
optional,
allocatable,
intent(in) :: vec_pot_var(:, :)
747 write(
message(1),
'(a)')
'Debug: Building the phase correction for DFT+U orbitals.'
751 do ios = 1, this%norbsets
758 if (.not. this%basisfromstates)
then
759 if (this%basis%orthogonalization)
then
762 if (
debug%info .and. space%is_periodic())
call zloewdin_info(this%basis, std%kpt, namespace)
772 type(
lda_u_t),
intent(in) :: this
774 real(real64),
intent(out) :: kanamori(:,:)
776 if (this%nspins == 1)
then
797 this%freeze_occ = .
true.
802 type(
lda_u_t),
intent(inout) :: this
804 this%freeze_u = .
true.
809 type(
lda_u_t),
intent(inout) :: this
810 real(real64),
intent(in) :: ueff(:)
816 do ios = 1,this%norbsets
817 this%orbsets(ios)%Ueff = ueff(ios)
825 type(
lda_u_t),
intent(in) :: this
826 real(real64),
intent(inout) :: ueff(:)
832 do ios = 1,this%norbsets
833 ueff(ios) = this%orbsets(ios)%Ueff
841 type(
lda_u_t),
intent(inout) :: this
842 real(real64),
intent(in) :: veff(:)
844 integer :: ios, ncount
849 do ios = 1, this%norbsets
850 this%orbsets(ios)%V_ij(1:this%orbsets(ios)%nneighbors,0) = veff(ncount+1:ncount+this%orbsets(ios)%nneighbors)
851 ncount = ncount + this%orbsets(ios)%nneighbors
859 type(
lda_u_t),
intent(in) :: this
860 real(real64),
intent(inout) :: veff(:)
862 integer :: ios, ncount
867 do ios = 1, this%norbsets
868 veff(ncount+1:ncount+this%orbsets(ios)%nneighbors) = this%orbsets(ios)%V_ij(1:this%orbsets(ios)%nneighbors,0)
869 ncount = ncount + this%orbsets(ios)%nneighbors
877 type(
lda_u_t),
intent(in) :: this
878 integer,
optional,
intent(in) :: iunit
879 type(
namespace_t),
optional,
intent(in) :: namespace
886 write(
message(1),
'(a)')
"Method:"
887 write(
message(2),
'(a)')
" [1] Dudarev et al., Phys. Rev. B 57, 1505 (1998)"
890 if (.not. this%intersite)
then
891 write(
message(1),
'(a)')
"Method:"
892 write(
message(2),
'(a)')
" [1] Agapito et al., Phys. Rev. X 5, 011006 (2015)"
895 write(
message(2),
'(a)')
" [1] Tancogne-Dejean, and Rubio, Phys. Rev. B 102, 155117 (2020)"
899 write(
message(1),
'(a)')
"Implementation:"
900 write(
message(2),
'(a)')
" [1] Tancogne-Dejean, Oliveira, and Rubio, Phys. Rev. B 69, 245133 (2017)"
910 type(
lda_u_t),
intent(inout) :: this
912 class(
space_t),
intent(in) :: space
914 class(
mesh_t),
intent(in) :: mesh
916 integer,
intent(out) :: ierr
918 integer :: err, wfns_file, is, ist, idim, ik, ios, iorb
920 character(len=256) :: lines(3)
921 character(len=256),
allocatable :: restart_file(:, :)
922 logical,
allocatable :: restart_file_present(:, :)
923 character(len=12) :: filename
924 character(len=1) :: char
925 character(len=50) :: str
927 integer,
allocatable :: count(:)
928 real(real64) :: norm, center(space%dim)
929 real(real64),
allocatable :: dpsi(:,:,:)
930 complex(real64),
allocatable :: zpsi(:,:,:)
938 message(1) =
"Debug: Loading DFT+U basis from states."
948 message(1) =
"Error loading DFT+U basis from states, cannot proceed with the calculation"
960 read(lines(2),
'(a)') str
961 if (str(2:8) ==
'Complex')
then
962 message(1) =
"Cannot read real states from complex wavefunctions."
964 else if (str(2:5) /=
'Real')
then
965 message(1) =
"Restart file 'wfns' does not specify real/complex; cannot check compatibility."
976 message(1) =
"Error loading DFT+U basis from states, cannot proceed with the calculation"
982 safe_allocate(restart_file(1:st%d%dim, 1:st%nst))
983 safe_allocate(restart_file_present(1:st%d%dim, 1:st%nst))
984 restart_file_present = .false.
992 read(lines(1),
'(a)') char
993 if (char ==
'%')
then
997 read(lines(1), *) ik, char, ist, char, idim, char, filename
1001 if (any(this%basisstates==ist) .and. ik == 1)
then
1002 restart_file(idim, ist) = trim(filename)
1003 restart_file_present(idim, ist) = .
true.
1009 safe_allocate(count(1:this%norbsets))
1011 do is = 1, this%maxnorbs
1012 ist = this%basisstates(is)
1013 ios = this%basisstates_os(is)
1014 count(ios) = count(ios)+1
1015 do idim = 1, st%d%dim
1017 if (.not. restart_file_present(idim, ist))
then
1018 write(
message(1),
'(a,i3,a)')
"Cannot read states ", ist,
"from the projection folder"
1024 this%orbsets(ios)%dorb(:,idim,count(ios)), err)
1027 this%orbsets(ios)%zorb(:,idim,count(ios)), err)
1032 safe_deallocate_a(count)
1033 safe_deallocate_a(restart_file)
1034 safe_deallocate_a(restart_file_present)
1038 if(this%basis%normalize)
then
1039 do ios = 1, this%norbsets
1040 do iorb = 1, this%orbsets(ios)%norbs
1042 norm =
dmf_nrm2(mesh, st%d%dim, this%orbsets(ios)%dorb(:,:,iorb))
1043 call lalg_scal(mesh%np, st%d%dim,
m_one/norm, this%orbsets(ios)%dorb(:,:,iorb))
1045 norm =
zmf_nrm2(mesh, st%d%dim, this%orbsets(ios)%zorb(:,:,iorb))
1046 call lalg_scal(mesh%np, st%d%dim,
m_one/norm, this%orbsets(ios)%zorb(:,:,iorb))
1054 do ios = 1, this%norbsets
1055 do iorb = 1, this%orbsets(ios)%norbs
1063 do ios = 1, this%norbsets
1071 if (
debug%info)
then
1072 message(1) =
"Debug: Converting the Wannier states to submeshes."
1078 do ios = 1, this%norbsets
1079 os => this%orbsets(ios)
1080 center = os%sphere%center
1081 safe_deallocate_a(os%sphere%center)
1083 safe_allocate(dpsi(1:mesh%np, 1:os%ndim, 1:os%norbs))
1084 dpsi(1:mesh%np, 1:os%ndim, 1:os%norbs) = os%dorb(1:mesh%np, 1:os%ndim, 1:os%norbs)
1086 safe_deallocate_a(os%dorb)
1088 call submesh_init(os%sphere, space, mesh, this%latt, center, os%radius)
1089 safe_allocate(os%dorb(1:os%sphere%np, 1:os%ndim, 1:os%norbs))
1090 do iorb = 1, os%norbs
1091 do idim = 1, os%ndim
1095 safe_deallocate_a(dpsi)
1097 safe_allocate(zpsi(1:mesh%np, 1:os%ndim, 1:os%norbs))
1098 zpsi(1:mesh%np, 1:os%ndim, 1:os%norbs) = os%zorb(1:mesh%np, 1:os%ndim, 1:os%norbs)
1099 safe_deallocate_a(os%zorb)
1101 call submesh_init(os%sphere, space, mesh, this%latt, center, os%radius)
1102 safe_allocate(os%zorb(1:os%sphere%np, 1:os%ndim, 1:os%norbs))
1103 do iorb = 1, os%norbs
1104 do idim = 1, os%ndim
1108 safe_deallocate_a(zpsi)
1110 safe_allocate(os%phase(1:os%sphere%np, st%d%kpt%start:st%d%kpt%end))
1111 safe_allocate(os%eorb_submesh(1:os%sphere%np, 1:os%ndim, 1:os%norbs, st%d%kpt%start:st%d%kpt%end))
1113 os%use_submesh = .
true.
1114 this%max_np = max(this%max_np, os%sphere%np)
1117 this%basis%use_submesh = .
true.
1121 do ios = 1, this%norbsets
1122 os => this%orbsets(ios)
1129 safe_allocate(os%buff_eorb(st%d%kpt%start:st%d%kpt%end))
1131 do ik= st%d%kpt%start, st%d%kpt%end
1139 do iorb = 1, os%norbs
1142 offset = (iorb - 1)*os%ldorbs)
1145 offset = (iorb - 1)*os%ldorbs)
1152 if (
debug%info)
then
1153 message(1) =
"Debug: Loading DFT+U basis from states done."
1162 type(
lda_u_t),
intent(inout) :: this
1163 type(
ions_t),
intent(in) :: ions
1164 type(
grid_t),
intent(in) :: gr
1167 integer :: nsym, iop, ios, iatom, iatom_sym, ios_sym
1171 nsym = ions%symm%nops
1172 safe_allocate(this%inv_map_symm(1:this%norbsets, 1:nsym))
1173 this%inv_map_symm = -1
1177 do ios = 1, this%norbsets
1178 iatom = this%orbsets(ios)%iatom
1180 iatom_sym = ions%inv_map_symm_atoms(iatom, iop)
1182 do ios_sym = 1, this%norbsets
1183 if (this%orbsets(ios_sym)%iatom == iatom_sym .and. this%orbsets(ios_sym)%norbs == this%orbsets(ios)%norbs &
1184 .and. this%orbsets(ios_sym)%nn == this%orbsets(ios)%nn .and. this%orbsets(ios_sym)%ll == this%orbsets(ios)%ll &
1185 .and. this%orbsets(ios_sym)%jj == this%orbsets(ios)%jj)
then
1186 this%inv_map_symm(ios, iop) = ios_sym
1190 assert(this%inv_map_symm(ios, iop) > 0)
1194 safe_allocate(this%symm_weight(1:this%maxnorbs, 1:this%maxnorbs, 1:this%nsym, 1:this%norbsets))
1195 this%symm_weight =
m_zero
1197 do ios = 1, this%norbsets
1199 if (this%orbsets(ios)%norbs == 1)
then
1200 this%symm_weight(1,1, 1:this%nsym, ios) =
m_one
1205 if (this%orbsets(ios)%ndim > 1) cycle
1207 call orbitals_get_symm_weight(this%orbsets(ios), ions%space, ions%latt, gr, ions%symm, this%symm_weight(:,:,:,ios))
1216 type(
space_t),
intent(in) :: space
1218 type(
grid_t),
intent(in) :: gr
1220 real(real64),
intent(inout) :: weight(:,:,:)
1222 integer :: im, imp, iop, mm
1223 real(real64),
allocatable :: orb(:,:), orb_sym(:), ylm(:)
1225 real(real64) :: rc, norm, origin(space%dim)
1229 assert(os%ndim == 1)
1231 safe_allocate(orb_sym(1:gr%np))
1232 safe_allocate(orb(1:gr%np, 1:os%norbs))
1234 assert(2*os%ll+1 == os%norbs)
1242 safe_allocate(ylm(1:sphere%np))
1247 call loct_ylm(sphere%np, sphere%rel_x(1,1), sphere%r(1), os%ll, mm, ylm(1))
1253 safe_deallocate_a(ylm)
1257 do iop = 1, symm%nops
1260 do imp = 1, os%norbs
1261 weight(im, imp, iop) =
dmf_dotp(gr, orb(:,imp), orb_sym, reduce=.false.)
1266 if(gr%parallel_in_domains)
then
1267 call gr%allreduce(weight)
1270 safe_deallocate_a(orb)
1271 safe_deallocate_a(orb_sym)
1276#include "dft_u_noncollinear_inc.F90"
1280#include "lda_u_inc.F90"
1283#include "complex.F90"
1284#include "lda_u_inc.F90"
scales a vector by a constant
Prints out to iunit a message in the form: ["InputVariable" = value] where "InputVariable" is given b...
pure logical function, public accel_is_enabled()
integer, parameter, public accel_mem_read_only
This module implements batches of mesh functions.
This module implements common operations on batches of mesh functions.
Module implementing boundary conditions in Octopus.
type(debug_t), save, public debug
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
subroutine, public distributed_end(this)
subroutine, public distributed_nullify(this, total)
subroutine, public distributed_init(this, total, comm, tag, scalapack_compat)
Distribute N instances across M processes of communicator comm
integer, parameter, public spinors
integer, parameter, public spin_polarized
real(real64), parameter, public m_zero
real(real64), parameter, public m_four
real(real64), parameter, public m_third
real(real64), parameter, public m_pi
some mathematical constants
complex(real64), parameter, public m_z0
real(real64), parameter, public m_epsilon
real(real64), parameter, public m_one
real(real64), parameter, public m_three
This module implements the underlying real-space grid.
subroutine, public dgrid_symmetrize_single(gr, iop, field, symm_field, suppress_warning)
integer, parameter, public dft_u_amf
subroutine, public zlda_u_commute_r(this, mesh, space, d, namespace, psib, gpsib)
This routine computes [r,V_lda+u] .
subroutine zlda_u_allocate(this, st)
subroutine, public lda_u_get_effectiveu(this, Ueff)
subroutine compute_complex_coulomb_integrals(this, gr, st, psolver, namespace, space)
subroutine, public dlda_u_apply(this, d, mesh, psib, hpsib)
subroutine, public lda_u_set_effectiveu(this, Ueff)
subroutine dcompute_acbno_u_kanamori_restricted(this, kanamori)
This routine computes the Kanamori U, Up, and J.
subroutine, public dlda_u_get_occupations(this, occ)
subroutine, public dlda_u_rvu(this, mesh, space, d, namespace, psib, gpsib)
This routine computes .
subroutine, public lda_u_update_basis(this, space, gr, ions, st, psolver, namespace, kpoints, has_phase)
subroutine orbitals_get_symm_weight(os, space, latt, gr, symm, weight)
Computes the weight of each rotated orbitals in the basis of the same localized subspace.
subroutine dupdate_occ_matrices(this, namespace, mesh, st, lda_u_energy, phase)
This routine computes the values of the occupation matrices.
subroutine, public zlda_u_apply(this, d, mesh, psib, hpsib)
subroutine, public zcompute_dftu_energy(this, energy, st)
This routine computes the value of the double counting term in the DFT+U energy.
integer, parameter, public dft_u_empirical
subroutine lda_u_init_coulomb_integrals(this, namespace, space, gr, st, psolver, has_phase)
subroutine zcompute_acbno_u_kanamori_restricted(this, kanamori)
This routine computes the Kanamori U, Up, and J.
subroutine dcompute_acbno_u_kanamori(this, kanamori)
This routine computes the Kanamori U, Up, and J.
subroutine, public zlda_u_commute_r_single(this, mesh, space, d, namespace, ist, ik, psi, gpsi, has_phase)
subroutine, public dlda_u_force(this, namespace, space, mesh, st, iq, psib, grad_psib, force, phase)
subroutine, public lda_u_freeze_occ(this)
integer, parameter, public dft_u_mix
subroutine, public lda_u_freeze_u(this)
subroutine, public zlda_u_rvu(this, mesh, space, d, namespace, psib, gpsib)
This routine computes .
subroutine dlda_u_allocate(this, st)
subroutine, public compute_acbno_u_kanamori(this, st, kanamori)
subroutine, public zlda_u_update_potential(this, st)
This routine computes the potential that, once multiplied by the projector Pmm' and summed over m and...
subroutine, public lda_u_write_info(this, iunit, namespace)
subroutine, public dlda_u_commute_r(this, mesh, space, d, namespace, psib, gpsib)
This routine computes [r,V_lda+u] .
subroutine dcompute_coulomb_integrals(this, namespace, space, gr, psolver)
subroutine, public dlda_u_set_occupations(this, occ)
subroutine, public lda_u_get_effectivev(this, Veff)
subroutine, public zlda_u_force(this, namespace, space, mesh, st, iq, psib, grad_psib, force, phase)
subroutine lda_u_loadbasis(this, namespace, space, st, mesh, mc, ierr)
subroutine, public dlda_u_commute_r_single(this, mesh, space, d, namespace, ist, ik, psi, gpsi, has_phase)
subroutine, public lda_u_build_phase_correction(this, space, std, boundaries, namespace, kpoints, vec_pot, vec_pot_var)
Build the phase correction to the global phase for all orbitals.
subroutine, public lda_u_end(this)
subroutine, public lda_u_set_effectivev(this, Veff)
subroutine, public lda_u_init(this, namespace, space, level, gr, ions, st, mc, kpoints, has_phase)
integer, parameter, public dft_u_acbn0
subroutine zcompute_acbno_u_kanamori(this, kanamori)
This routine computes the Kanamori U, Up, and J.
subroutine, public lda_u_update_occ_matrices(this, namespace, mesh, st, hm_base, phase, energy)
subroutine zcompute_coulomb_integrals(this, namespace, space, gr, psolver)
subroutine, public zlda_u_get_occupations(this, occ)
subroutine zupdate_occ_matrices(this, namespace, mesh, st, lda_u_energy, phase)
This routine computes the values of the occupation matrices.
subroutine build_symmetrization_map(this, ions, gr, st)
Builds a mapping between the orbital sets based on symmetries.
subroutine, public dcompute_dftu_energy(this, energy, st)
This routine computes the value of the double counting term in the DFT+U energy.
subroutine, public dlda_u_update_potential(this, st)
This routine computes the potential that, once multiplied by the projector Pmm' and summed over m and...
subroutine, public zlda_u_set_occupations(this, occ)
subroutine, public dloewdin_orthogonalize(basis, kpt, namespace)
subroutine, public zloewdin_info(basis, kpt, namespace)
subroutine, public zloewdin_orthogonalize(basis, kpt, namespace)
subroutine, public dloewdin_info(basis, kpt, namespace)
This module defines various routines, operating on mesh functions.
subroutine, public zmf_fix_phase(mesh, ff)
Fix the phase of complex function.
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_info(no_lines, iunit, verbose_limit, stress, all_nodes, namespace)
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_experimental(name, namespace)
This module handles the communicators for the various parallelization strategies.
subroutine, public orbitalbasis_end(this)
subroutine, public zorbitalbasis_build(this, namespace, ions, mesh, kpt, ndim, skip_s_orb, use_all_orb, verbose)
This routine is an interface for constructing the orbital basis.
subroutine, public dorbitalbasis_build(this, namespace, ions, mesh, kpt, ndim, skip_s_orb, use_all_orb, verbose)
This routine is an interface for constructing the orbital basis.
subroutine, public zorbitalbasis_build_empty(this, mesh, kpt, ndim, norbsets, map_os, verbose)
This routine constructd an empty orbital basis.
subroutine, public dorbitalbasis_build_empty(this, mesh, kpt, ndim, norbsets, map_os, verbose)
This routine constructd an empty orbital basis.
subroutine, public orbitalbasis_init(this, namespace, periodic_dim)
subroutine, public orbitalset_update_phase_shift(os, dim, kpt, kpoints, spin_polarized, vec_pot, vec_pot_var, kpt_max)
Build the phase shift for the intersite interaction.
subroutine, public orbitalset_update_phase(os, dim, kpt, kpoints, spin_polarized, vec_pot, vec_pot_var, kpt_max)
Build the phase correction to the global phase in case the orbital crosses the border of the simulato...
integer, parameter, public sm_poisson_psolver
integer, parameter, public sm_poisson_isf
subroutine, public zorbitalset_get_center_of_mass(os, space, mesh, latt)
subroutine, public orbitalset_init_intersite(this, namespace, space, ind, ions, der, psolver, os, nos, maxnorbs, rcut, kpt, has_phase, sm_poisson, basis_from_states, combine_j_orbitals)
integer, parameter, public sm_poisson_direct
subroutine, public dorbitalset_get_center_of_mass(os, space, mesh, latt)
integer, parameter, public sm_poisson_fft
integer function, public parse_block(namespace, name, blk, check_varinfo_)
subroutine, public restart_read(restart, iunit, lines, nlines, ierr)
subroutine, public restart_close(restart, iunit)
Close a file previously opened with restart_open.
integer, parameter, public restart_gs
subroutine, public restart_init(restart, namespace, data_type, type, mc, ierr, mesh, dir, exact)
Initializes a restart object.
integer, parameter, public restart_proj
integer function, public restart_open(restart, filename, status, position, silent)
Open file "filename" found inside the current restart directory. Depending on the type of restart,...
integer, parameter, public restart_type_load
subroutine, public restart_end(restart)
pure logical function, public states_are_complex(st)
pure logical function, public states_are_real(st)
This module handles spin dimensions of the states and the k-point distribution.
subroutine, public zsubmesh_copy_from_mesh(this, phi, sphi, conjugate)
subroutine, public dsubmesh_copy_from_mesh(this, phi, sphi, conjugate)
subroutine, public submesh_init(this, space, mesh, latt, center, rc)
type(type_t), public type_float
type(type_t), public type_cmplx
type(type_t), public type_integer
This module defines the unit system, used for input and output.
type(unit_system_t), public units_inp
the units systems for reading and writing
This class contains information about the boundary conditions.
Description of the grid, containing information on derivatives, stencil, and symmetries.
The basic Hamiltonian for electronic system.
Class to describe DFT+U parameters.
Describes mesh distribution to nodes.
Stores all communicators and groups.
A container for the phase.
class for organizing spins and k-points
The states_elec_t class contains all electronic wave functions.
A submesh is a type of mesh, used for the projectors in the pseudopotentials It contains points on a ...