108 integer,
public,
parameter :: &
113 integer,
public,
parameter :: &
123 integer,
public :: level = dft_u_none
126 real(real64),
allocatable,
public :: dn(:,:,:,:)
127 real(real64),
allocatable :: dV(:,:,:,:)
130 complex(real64),
allocatable,
public :: zn(:,:,:,:)
131 complex(real64),
allocatable :: zV(:,:,:,:)
132 real(real64),
allocatable,
public :: dn_alt(:,:,:,:)
133 complex(real64),
allocatable,
public :: zn_alt(:,:,:,:)
135 real(real64),
allocatable :: renorm_occ(:,:,:,:,:)
138 real(real64),
allocatable,
public :: coulomb(:,:,:,:,:)
140 complex(real64),
allocatable,
public :: zcoulomb(:,:,:,:,:,:,:)
143 type(orbitalbasis_t),
public :: basis
144 type(orbitalset_t),
pointer,
public :: orbsets(:) => null()
145 integer,
public :: norbsets = 0
147 integer,
public :: nspins = 0
148 integer,
public :: spin_channels = 0
149 integer :: nspecies = 0
150 integer,
public :: maxnorbs = 0
151 integer :: max_np = 0
153 logical :: useAllOrbitals = .false.
154 logical :: skipSOrbitals = .
true.
155 logical :: freeze_occ = .false.
156 logical :: freeze_u = .false.
157 logical,
public :: intersite = .false.
158 real(real64) :: intersite_radius =
m_zero
159 logical,
public :: basisfromstates = .false.
160 real(real64) :: acbn0_screening =
m_one
161 integer,
allocatable :: basisstates(:)
162 integer,
allocatable :: basisstates_os(:)
164 logical :: rot_inv = .false.
165 integer :: double_couting = dft_u_fll
167 real(real64),
allocatable :: dc_alpha(:)
169 type(lattice_vectors_t),
pointer :: latt
171 type(distributed_t) :: orbs_dist
174 integer,
public :: maxneighbors = 0
175 real(real64),
allocatable,
public :: dn_ij(:,:,:,:,:), dn_alt_ij(:,:,:,:,:), dn_alt_ii(:,:,:,:,:)
176 complex(real64),
allocatable,
public :: zn_ij(:,:,:,:,:), zn_alt_ij(:,:,:,:,:), zn_alt_ii(:,:,:,:,:)
179 logical :: symmetrize_occ_matrices
180 integer,
allocatable :: inv_map_symm(:,:)
182 real(real64),
allocatable :: symm_weight(:,:,:,:)
188 subroutine lda_u_init(this, namespace, space, level, gr, ions, st, mc, kpoints, has_phase)
189 type(lda_u_t),
target,
intent(inout) :: this
190 type(namespace_t),
intent(in) :: namespace
191 class(space_t),
intent(in) :: space
192 integer,
intent(in) :: level
193 type(grid_t),
intent(in) :: gr
194 type(ions_t),
target,
intent(in) :: ions
195 type(states_elec_t),
intent(in) :: st
196 type(multicomm_t),
intent(in) :: mc
197 type(kpoints_t),
intent(in) :: kpoints
198 logical,
intent(in) :: has_phase
205 assert(.not. (level == dft_u_none))
208 if (gr%parallel_in_domains)
call messages_experimental(
"dft+u parallel in domains", namespace=namespace)
211 this%latt => ions%latt
223 call parse_variable(namespace,
'DFTUBasisFromStates', .false., this%basisfromstates)
241 call parse_variable(namespace,
'DFTUDoubleCounting', dft_u_fll, this%double_couting)
243 if (this%double_couting /= dft_u_fll)
call messages_experimental(
"DFTUDoubleCounting /= dft_u_ffl", namespace=namespace)
244 if (st%d%ispin ==
spinors .and. this%double_couting /= dft_u_fll)
then
277 if (gr%parallel_in_domains)
then
278 call messages_not_implemented(
"DFTUPoissonSolver=dft_u_poisson_isf with domain parallelization", namespace=namespace)
280 if (ions%latt%nonorthogonal)
then
285#if !(defined HAVE_PSOLVER)
286 message(1) =
"The PSolver Poisson solver cannot be used since the code was not compiled with the PSolver library."
289 if (gr%parallel_in_domains)
then
290 call messages_not_implemented(
"DFTUPoissonSolver=dft_u_poisson_psolver with domain parallelization", namespace=namespace)
292 if (ions%latt%nonorthogonal)
then
293 call messages_not_implemented(
"DFTUPoissonSolver=dft_u_poisson_psolver with non-orthogonal cells", namespace=namespace)
307 call parse_variable(namespace,
'UseAllAtomicOrbitals', .false., this%useAllOrbitals)
343 if (this%rot_inv .and. st%d%ispin ==
spinors)
then
356 call parse_variable(namespace,
'ACBN0IntersiteInteraction', .false., this%intersite)
360 if (this%intersite)
then
364 if (kpoints%use_symmetries)
then
376 if (abs(this%intersite_radius) <
m_epsilon)
then
377 call messages_write(
"ACBN0IntersiteCutoff must be greater than 0")
387 if (.not. this%basisfromstates)
then
393 this%skipSOrbitals, this%useAllOrbitals)
396 this%skipSOrbitals, this%useAllOrbitals)
398 this%orbsets => this%basis%orbsets
399 this%norbsets = this%basis%norbsets
400 this%maxnorbs = this%basis%maxnorbs
401 this%max_np = this%basis%max_np
402 this%nspins = st%d%nspin
403 this%spin_channels = st%d%spin_channels
404 this%nspecies = ions%nspecies
415 if (.not. gr%parallel_in_domains)
then
416 call distributed_init(this%orbs_dist, this%norbsets, mpi_comm_world,
"orbsets")
433 if (
parse_block(namespace,
'DFTUBasisStates', blk) == 0)
then
436 if (this%maxnorbs <1)
then
437 write(
message(1),
'(a,i3,a,i3)')
'DFTUBasisStates must contains at least one state.'
440 safe_allocate(this%basisstates(1:this%maxnorbs))
441 safe_allocate(this%basisstates_os(1:this%maxnorbs))
442 do is = 1, this%maxnorbs
448 write(
message(1),
'(a,i3,a,i3)')
'DFTUBasisStates must be specified if DFTUBasisFromStates=yes'
459 this%nspins = st%d%nspin
460 this%spin_channels = st%d%spin_channels
463 this%orbsets => this%basis%orbsets
476 message(1) =
"Unable to load DFT+U basis from selected states."
483 this%symmetrize_occ_matrices = st%symmetrize_density .or. kpoints%use_symmetries
484 if (this%basisfromstates) this%symmetrize_occ_matrices = .false.
485 if (this%symmetrize_occ_matrices)
then
489 safe_allocate(this%dc_alpha(this%norbsets))
490 this%dc_alpha =
m_one
500 type(
lda_u_t),
target,
intent(inout) :: this
502 class(
space_t),
intent(in) :: space
503 type(
grid_t),
intent(in) :: gr
506 logical,
intent(in) :: has_phase
508 logical :: complex_coulomb_integrals
514 norbs = this%maxnorbs
516 if (.not. this%basisfromstates)
then
520 complex_coulomb_integrals = .false.
521 do ios = 1, this%norbsets
522 if (this%orbsets(ios)%ndim > 1) complex_coulomb_integrals = .
true.
525 if (.not. complex_coulomb_integrals)
then
526 write(
message(1),
'(a)')
'Computing the Coulomb integrals of the localized basis.'
528 safe_allocate(this%coulomb(1:norbs,1:norbs,1:norbs,1:norbs, 1:this%norbsets))
536 write(
message(1),
'(a)')
'Computing complex Coulomb integrals of the localized basis.'
538 safe_allocate(this%zcoulomb(1:norbs, 1:norbs, 1:norbs, 1:norbs, 1:st%d%dim, 1:st%d%dim, 1:this%norbsets))
544 write(
message(1),
'(a)')
'Computing the Coulomb integrals of the localized basis.'
546 safe_allocate(this%coulomb(1:norbs, 1:norbs, 1:norbs, 1:norbs, 1:this%norbsets))
563 type(
lda_u_t),
intent(inout) :: this
567 this%level = dft_u_none
569 safe_deallocate_a(this%dn)
570 safe_deallocate_a(this%zn)
571 safe_deallocate_a(this%dn_alt)
572 safe_deallocate_a(this%zn_alt)
573 safe_deallocate_a(this%dV)
574 safe_deallocate_a(this%zV)
575 safe_deallocate_a(this%coulomb)
576 safe_deallocate_a(this%zcoulomb)
577 safe_deallocate_a(this%renorm_occ)
578 safe_deallocate_a(this%dn_ij)
579 safe_deallocate_a(this%zn_ij)
580 safe_deallocate_a(this%dn_alt_ij)
581 safe_deallocate_a(this%zn_alt_ij)
582 safe_deallocate_a(this%dn_alt_ii)
583 safe_deallocate_a(this%zn_alt_ii)
584 safe_deallocate_a(this%basisstates)
585 safe_deallocate_a(this%basisstates_os)
586 safe_deallocate_a(this%dc_alpha)
587 safe_deallocate_a(this%inv_map_symm)
588 safe_deallocate_a(this%symm_weight)
590 nullify(this%orbsets)
595 if (.not. this%basisfromstates)
then
603 subroutine lda_u_update_basis(this, space, gr, ions, st, psolver, namespace, kpoints, has_phase)
604 type(
lda_u_t),
target,
intent(inout) :: this
605 class(
space_t),
intent(in) :: space
606 type(
grid_t),
intent(in) :: gr
607 type(
ions_t),
target,
intent(in) :: ions
612 logical,
intent(in) :: has_phase
614 integer :: ios, maxorbs, nspin
616 if(this%level == dft_u_none)
return
620 if(.not. this%basisfromstates)
then
623 nullify(this%orbsets)
628 this%skipSOrbitals, this%useAllOrbitals, verbose = .false.)
631 this%skipSOrbitals, this%useAllOrbitals, verbose = .false.)
633 this%orbsets => this%basis%orbsets
634 this%max_np = this%basis%max_np
638 if (this%intersite)
then
639 this%maxneighbors = 0
640 do ios = 1, this%norbsets
642 this%orbsets, this%norbsets, this%maxnorbs, this%intersite_radius, st%d%kpt, has_phase, &
643 this%sm_poisson, this%basisfromstates, this%basis%combine_j_orbitals)
644 this%maxneighbors = max(this%maxneighbors, this%orbsets(ios)%nneighbors)
647 maxorbs = this%maxnorbs
651 safe_deallocate_a(this%dn_ij)
652 safe_allocate(this%dn_ij(1:maxorbs,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors))
653 this%dn_ij(1:maxorbs,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors) =
m_zero
654 safe_deallocate_a(this%dn_alt_ij)
655 safe_allocate(this%dn_alt_ij(1:maxorbs,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors))
656 this%dn_alt_ij(1:maxorbs,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors) =
m_zero
657 safe_deallocate_a(this%dn_alt_ii)
658 safe_allocate(this%dn_alt_ii(1:2,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors))
659 this%dn_alt_ii(1:2,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors) =
m_zero
661 safe_deallocate_a(this%zn_ij)
662 safe_allocate(this%zn_ij(1:maxorbs,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors))
663 this%zn_ij(1:maxorbs,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors) =
m_z0
664 safe_deallocate_a(this%zn_alt_ij)
665 safe_allocate(this%zn_alt_ij(1:maxorbs,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors))
666 this%zn_alt_ij(1:maxorbs,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors) =
m_z0
667 safe_deallocate_a(this%zn_alt_ii)
668 safe_allocate(this%zn_alt_ii(1:2,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors))
669 this%zn_alt_ii(1:2,1:maxorbs,1:nspin,1:this%norbsets,1:this%maxneighbors) =
m_z0
678 if(.not. this%basisfromstates)
then
680 if(this%basis%orthogonalization)
then
683 if(
debug%info .and. space%is_periodic())
then
691 if (
allocated(this%coulomb))
then
692 safe_deallocate_a(this%coulomb)
694 if (
allocated(this%zcoulomb))
then
695 safe_deallocate_a(this%zcoulomb)
705 type(
lda_u_t),
intent(inout) :: this
707 class(
mesh_t),
intent(in) :: mesh
710 type(
phase_t),
intent(in) :: phase
711 type(
energy_t),
intent(inout) :: energy
713 if (this%level == dft_u_none .or. this%freeze_occ)
return
719 if (phase%is_allocated())
then
732 type(
lda_u_t),
intent(inout) :: this
733 class(
space_t),
intent(in) :: space
738 real(real64),
optional,
allocatable,
intent(in) :: vec_pot(:)
739 real(real64),
optional,
allocatable,
intent(in) :: vec_pot_var(:, :)
748 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
795 type(
lda_u_t),
intent(inout) :: this
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(:,:,:)
937 message(1) =
"Debug: Loading DFT+U basis from states."
946 message(1) =
"Error loading DFT+U basis from states, cannot proceed with the calculation"
958 read(lines(2),
'(a)') str
959 if (str(2:8) ==
'Complex')
then
960 message(1) =
"Cannot read real states from complex wavefunctions."
962 else if (str(2:5) /=
'Real')
then
963 message(1) =
"Restart file 'wfns' does not specify real/complex; cannot check compatibility."
974 message(1) =
"Error loading DFT+U basis from states, cannot proceed with the calculation"
980 safe_allocate(restart_file(1:st%d%dim, 1:st%nst))
981 safe_allocate(restart_file_present(1:st%d%dim, 1:st%nst))
982 restart_file_present = .false.
990 read(lines(1),
'(a)') char
991 if (char ==
'%')
then
995 read(lines(1), *) ik, char, ist, char, idim, char, filename
999 if (any(this%basisstates==ist) .and. ik == 1)
then
1000 restart_file(idim, ist) = trim(filename)
1001 restart_file_present(idim, ist) = .
true.
1007 safe_allocate(count(1:this%norbsets))
1009 do is = 1, this%maxnorbs
1010 ist = this%basisstates(is)
1011 ios = this%basisstates_os(is)
1012 count(ios) = count(ios)+1
1013 do idim = 1, st%d%dim
1015 if (.not. restart_file_present(idim, ist))
then
1016 write(
message(1),
'(a,i3,a)')
"Cannot read states ", ist,
"from the projection folder"
1022 this%orbsets(ios)%dorb(:,idim,count(ios)), err)
1025 this%orbsets(ios)%zorb(:,idim,count(ios)), err)
1030 safe_deallocate_a(count)
1031 safe_deallocate_a(restart_file)
1032 safe_deallocate_a(restart_file_present)
1036 if(this%basis%normalize)
then
1037 do ios = 1, this%norbsets
1038 do iorb = 1, this%orbsets(ios)%norbs
1040 norm =
dmf_nrm2(mesh, st%d%dim, this%orbsets(ios)%dorb(:,:,iorb))
1041 call lalg_scal(mesh%np, st%d%dim,
m_one/norm, this%orbsets(ios)%dorb(:,:,iorb))
1043 norm =
zmf_nrm2(mesh, st%d%dim, this%orbsets(ios)%zorb(:,:,iorb))
1044 call lalg_scal(mesh%np, st%d%dim,
m_one/norm, this%orbsets(ios)%zorb(:,:,iorb))
1052 do ios = 1, this%norbsets
1053 do iorb = 1, this%orbsets(ios)%norbs
1061 do ios = 1, this%norbsets
1069 message(1) =
"Debug: Converting the Wannier states to submeshes."
1074 do ios = 1, this%norbsets
1075 os => this%orbsets(ios)
1076 center = os%sphere%center
1077 safe_deallocate_a(os%sphere%center)
1079 safe_allocate(dpsi(1:mesh%np, 1:os%ndim, 1:os%norbs))
1080 dpsi(1:mesh%np, 1:os%ndim, 1:os%norbs) = os%dorb(1:mesh%np, 1:os%ndim, 1:os%norbs)
1082 safe_deallocate_a(os%dorb)
1084 call submesh_init(os%sphere, space, mesh, this%latt, center, os%radius)
1085 safe_allocate(os%dorb(1:os%sphere%np, 1:os%ndim, 1:os%norbs))
1086 do iorb = 1, os%norbs
1087 do idim = 1, os%ndim
1091 safe_deallocate_a(dpsi)
1093 safe_allocate(zpsi(1:mesh%np, 1:os%ndim, 1:os%norbs))
1094 zpsi(1:mesh%np, 1:os%ndim, 1:os%norbs) = os%zorb(1:mesh%np, 1:os%ndim, 1:os%norbs)
1095 safe_deallocate_a(os%zorb)
1097 call submesh_init(os%sphere, space, mesh, this%latt, center, os%radius)
1098 safe_allocate(os%zorb(1:os%sphere%np, 1:os%ndim, 1:os%norbs))
1099 do iorb = 1, os%norbs
1100 do idim = 1, os%ndim
1104 safe_deallocate_a(zpsi)
1106 safe_allocate(os%phase(1:os%sphere%np, st%d%kpt%start:st%d%kpt%end))
1107 safe_allocate(os%eorb_submesh(1:os%sphere%np, 1:os%ndim, 1:os%norbs, st%d%kpt%start:st%d%kpt%end))
1109 os%use_submesh = .
true.
1110 this%max_np = max(this%max_np, os%sphere%np)
1113 this%basis%use_submesh = .
true.
1117 do ios = 1, this%norbsets
1118 os => this%orbsets(ios)
1125 safe_allocate(os%buff_eorb(st%d%kpt%start:st%d%kpt%end))
1127 do ik= st%d%kpt%start, st%d%kpt%end
1135 do iorb = 1, os%norbs
1138 offset = (iorb - 1)*os%ldorbs)
1141 offset = (iorb - 1)*os%ldorbs)
1148 message(1) =
"Debug: Loading DFT+U basis from states done."
1156 type(
lda_u_t),
intent(inout) :: this
1157 type(
ions_t),
intent(in) :: ions
1158 type(
grid_t),
intent(in) :: gr
1161 integer :: nsym, iop, ios, iatom, iatom_sym, ios_sym
1165 nsym = ions%symm%nops
1166 safe_allocate(this%inv_map_symm(1:this%norbsets, 1:nsym))
1167 this%inv_map_symm = -1
1171 do ios = 1, this%norbsets
1172 iatom = this%orbsets(ios)%iatom
1174 iatom_sym = ions%inv_map_symm_atoms(iatom, iop)
1176 do ios_sym = 1, this%norbsets
1177 if (this%orbsets(ios_sym)%iatom == iatom_sym .and. this%orbsets(ios_sym)%norbs == this%orbsets(ios)%norbs &
1178 .and. this%orbsets(ios_sym)%nn == this%orbsets(ios)%nn .and. this%orbsets(ios_sym)%ll == this%orbsets(ios)%ll &
1179 .and.
is_close(this%orbsets(ios_sym)%jj, this%orbsets(ios)%jj))
then
1180 this%inv_map_symm(ios, iop) = ios_sym
1184 assert(this%inv_map_symm(ios, iop) > 0)
1188 safe_allocate(this%symm_weight(1:this%maxnorbs, 1:this%maxnorbs, 1:this%nsym, 1:this%norbsets))
1189 this%symm_weight =
m_zero
1191 do ios = 1, this%norbsets
1193 if (this%orbsets(ios)%norbs == 1)
then
1194 this%symm_weight(1,1, 1:this%nsym, ios) =
m_one
1199 if (this%orbsets(ios)%ndim > 1) cycle
1201 call orbitals_get_symm_weight(this%orbsets(ios), ions%space, ions%latt, gr, ions%symm, this%symm_weight(:,:,:,ios))
1210 type(
space_t),
intent(in) :: space
1212 type(
grid_t),
intent(in) :: gr
1214 real(real64),
intent(inout) :: weight(:,:,:)
1216 integer :: im, imp, iop, mm
1217 real(real64),
allocatable :: orb(:,:), orb_sym(:), ylm(:)
1219 real(real64) :: rc, norm, origin(space%dim)
1223 assert(os%ndim == 1)
1225 safe_allocate(orb_sym(1:gr%np))
1226 safe_allocate(orb(1:gr%np, 1:os%norbs))
1228 assert(2*os%ll+1 == os%norbs)
1236 safe_allocate(ylm(1:sphere%np))
1241 call loct_ylm(sphere%np, sphere%rel_x(1,1), sphere%r(1), os%ll, mm, ylm(1))
1247 safe_deallocate_a(ylm)
1251 do iop = 1, symm%nops
1254 do imp = 1, os%norbs
1255 weight(im, imp, iop) =
dmf_dotp(gr, orb(:,imp), orb_sym, reduce=.false.)
1260 call gr%allreduce(weight)
1262 safe_deallocate_a(orb)
1263 safe_deallocate_a(orb_sym)
1268#include "dft_u_noncollinear_inc.F90"
1272#include "lda_u_inc.F90"
1275#include "complex.F90"
1276#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)
Apply the +U nonlocal potential to psib and adds the result to 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)
Apply the +U nonlocal potential to psib and adds the result to 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 is intended to contain "only mathematical" functions and procedures.
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)
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)
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, 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 ...