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(:, :)
746 write(
message(1),
'(a)')
'Debug: Building the phase correction for DFT+U orbitals.'
749 do ios = 1, this%norbsets
756 if (.not. this%basisfromstates)
then
757 if (this%basis%orthogonalization)
then
760 if (
debug%info .and. space%is_periodic())
call zloewdin_info(this%basis, std%kpt, namespace)
770 type(
lda_u_t),
intent(in) :: this
772 real(real64),
intent(out) :: kanamori(:,:)
774 if (this%nspins == 1)
then
793 type(
lda_u_t),
intent(inout) :: this
800 type(
lda_u_t),
intent(inout) :: this
802 this%freeze_u = .
true.
807 type(
lda_u_t),
intent(inout) :: this
808 real(real64),
intent(in) :: ueff(:)
814 do ios = 1,this%norbsets
815 this%orbsets(ios)%Ueff = ueff(ios)
823 type(
lda_u_t),
intent(in) :: this
824 real(real64),
intent(inout) :: ueff(:)
830 do ios = 1,this%norbsets
831 ueff(ios) = this%orbsets(ios)%Ueff
839 type(
lda_u_t),
intent(inout) :: this
840 real(real64),
intent(in) :: veff(:)
842 integer :: ios, ncount
847 do ios = 1, this%norbsets
848 this%orbsets(ios)%V_ij(1:this%orbsets(ios)%nneighbors,0) = veff(ncount+1:ncount+this%orbsets(ios)%nneighbors)
849 ncount = ncount + this%orbsets(ios)%nneighbors
857 type(
lda_u_t),
intent(in) :: this
858 real(real64),
intent(inout) :: veff(:)
860 integer :: ios, ncount
865 do ios = 1, this%norbsets
866 veff(ncount+1:ncount+this%orbsets(ios)%nneighbors) = this%orbsets(ios)%V_ij(1:this%orbsets(ios)%nneighbors,0)
867 ncount = ncount + this%orbsets(ios)%nneighbors
875 type(
lda_u_t),
intent(in) :: this
876 integer,
optional,
intent(in) :: iunit
877 type(
namespace_t),
optional,
intent(in) :: namespace
884 write(
message(1),
'(a)')
"Method:"
885 write(
message(2),
'(a)')
" [1] Dudarev et al., Phys. Rev. B 57, 1505 (1998)"
888 if (.not. this%intersite)
then
889 write(
message(1),
'(a)')
"Method:"
890 write(
message(2),
'(a)')
" [1] Agapito et al., Phys. Rev. X 5, 011006 (2015)"
893 write(
message(2),
'(a)')
" [1] Tancogne-Dejean, and Rubio, Phys. Rev. B 102, 155117 (2020)"
897 write(
message(1),
'(a)')
"Implementation:"
898 write(
message(2),
'(a)')
" [1] Tancogne-Dejean, Oliveira, and Rubio, Phys. Rev. B 69, 245133 (2017)"
908 type(
lda_u_t),
intent(inout) :: this
910 class(
space_t),
intent(in) :: space
912 class(
mesh_t),
intent(in) :: mesh
914 integer,
intent(out) :: ierr
916 integer :: err, wfns_file, is, ist, idim, ik, ios, iorb
918 character(len=256) :: lines(3)
919 character(len=256),
allocatable :: restart_file(:, :)
920 logical,
allocatable :: restart_file_present(:, :)
921 character(len=12) :: filename
922 character(len=1) :: char
923 character(len=50) :: str
925 integer,
allocatable :: count(:)
926 real(real64) :: norm, center(space%dim)
927 real(real64),
allocatable :: dpsi(:,:,:)
928 complex(real64),
allocatable :: zpsi(:,:,:)
935 message(1) =
"Debug: Loading DFT+U basis from states."
944 message(1) =
"Error loading DFT+U basis from states, cannot proceed with the calculation"
956 read(lines(2),
'(a)') str
957 if (str(2:8) ==
'Complex')
then
958 message(1) =
"Cannot read real states from complex wavefunctions."
960 else if (str(2:5) /=
'Real')
then
961 message(1) =
"Restart file 'wfns' does not specify real/complex; cannot check compatibility."
972 message(1) =
"Error loading DFT+U basis from states, cannot proceed with the calculation"
978 safe_allocate(restart_file(1:st%d%dim, 1:st%nst))
979 safe_allocate(restart_file_present(1:st%d%dim, 1:st%nst))
980 restart_file_present = .false.
988 read(lines(1),
'(a)') char
989 if (char ==
'%')
then
993 read(lines(1), *) ik, char, ist, char, idim, char, filename
997 if (any(this%basisstates==ist) .and. ik == 1)
then
998 restart_file(idim, ist) = trim(filename)
999 restart_file_present(idim, ist) = .
true.
1005 safe_allocate(count(1:this%norbsets))
1007 do is = 1, this%maxnorbs
1008 ist = this%basisstates(is)
1009 ios = this%basisstates_os(is)
1010 count(ios) = count(ios)+1
1011 do idim = 1, st%d%dim
1013 if (.not. restart_file_present(idim, ist))
then
1014 write(
message(1),
'(a,i3,a)')
"Cannot read states ", ist,
"from the projection folder"
1020 this%orbsets(ios)%dorb(:,idim,count(ios)), err)
1023 this%orbsets(ios)%zorb(:,idim,count(ios)), err)
1028 safe_deallocate_a(count)
1029 safe_deallocate_a(restart_file)
1030 safe_deallocate_a(restart_file_present)
1034 if(this%basis%normalize)
then
1035 do ios = 1, this%norbsets
1036 do iorb = 1, this%orbsets(ios)%norbs
1038 norm =
dmf_nrm2(mesh, st%d%dim, this%orbsets(ios)%dorb(:,:,iorb))
1039 call lalg_scal(mesh%np, st%d%dim,
m_one/norm, this%orbsets(ios)%dorb(:,:,iorb))
1041 norm =
zmf_nrm2(mesh, st%d%dim, this%orbsets(ios)%zorb(:,:,iorb))
1042 call lalg_scal(mesh%np, st%d%dim,
m_one/norm, this%orbsets(ios)%zorb(:,:,iorb))
1050 do ios = 1, this%norbsets
1051 do iorb = 1, this%orbsets(ios)%norbs
1059 do ios = 1, this%norbsets
1067 message(1) =
"Debug: Converting the Wannier states to submeshes."
1072 do ios = 1, this%norbsets
1073 os => this%orbsets(ios)
1074 center = os%sphere%center
1075 safe_deallocate_a(os%sphere%center)
1077 safe_allocate(dpsi(1:mesh%np, 1:os%ndim, 1:os%norbs))
1078 dpsi(1:mesh%np, 1:os%ndim, 1:os%norbs) = os%dorb(1:mesh%np, 1:os%ndim, 1:os%norbs)
1080 safe_deallocate_a(os%dorb)
1082 call submesh_init(os%sphere, space, mesh, this%latt, center, os%radius)
1083 safe_allocate(os%dorb(1:os%sphere%np, 1:os%ndim, 1:os%norbs))
1084 do iorb = 1, os%norbs
1085 do idim = 1, os%ndim
1089 safe_deallocate_a(dpsi)
1091 safe_allocate(zpsi(1:mesh%np, 1:os%ndim, 1:os%norbs))
1092 zpsi(1:mesh%np, 1:os%ndim, 1:os%norbs) = os%zorb(1:mesh%np, 1:os%ndim, 1:os%norbs)
1093 safe_deallocate_a(os%zorb)
1095 call submesh_init(os%sphere, space, mesh, this%latt, center, os%radius)
1096 safe_allocate(os%zorb(1:os%sphere%np, 1:os%ndim, 1:os%norbs))
1097 do iorb = 1, os%norbs
1098 do idim = 1, os%ndim
1102 safe_deallocate_a(zpsi)
1104 safe_allocate(os%phase(1:os%sphere%np, st%d%kpt%start:st%d%kpt%end))
1105 safe_allocate(os%eorb_submesh(1:os%sphere%np, 1:os%ndim, 1:os%norbs, st%d%kpt%start:st%d%kpt%end))
1107 os%use_submesh = .
true.
1108 this%max_np = max(this%max_np, os%sphere%np)
1111 this%basis%use_submesh = .
true.
1115 do ios = 1, this%norbsets
1116 os => this%orbsets(ios)
1123 safe_allocate(os%buff_eorb(st%d%kpt%start:st%d%kpt%end))
1125 do ik= st%d%kpt%start, st%d%kpt%end
1133 do iorb = 1, os%norbs
1136 offset = (iorb - 1)*os%ldorbs)
1139 offset = (iorb - 1)*os%ldorbs)
1146 message(1) =
"Debug: Loading DFT+U basis from states done."
1154 type(
lda_u_t),
intent(inout) :: this
1155 type(
ions_t),
intent(in) :: ions
1156 type(
grid_t),
intent(in) :: gr
1159 integer :: nsym, iop, ios, iatom, iatom_sym, ios_sym
1163 nsym = ions%symm%nops
1164 safe_allocate(this%inv_map_symm(1:this%norbsets, 1:nsym))
1165 this%inv_map_symm = -1
1169 do ios = 1, this%norbsets
1170 iatom = this%orbsets(ios)%iatom
1172 iatom_sym = ions%inv_map_symm_atoms(iatom, iop)
1174 do ios_sym = 1, this%norbsets
1175 if (this%orbsets(ios_sym)%iatom == iatom_sym .and. this%orbsets(ios_sym)%norbs == this%orbsets(ios)%norbs &
1176 .and. this%orbsets(ios_sym)%nn == this%orbsets(ios)%nn .and. this%orbsets(ios_sym)%ll == this%orbsets(ios)%ll &
1177 .and. this%orbsets(ios_sym)%jj == this%orbsets(ios)%jj)
then
1178 this%inv_map_symm(ios, iop) = ios_sym
1182 assert(this%inv_map_symm(ios, iop) > 0)
1186 safe_allocate(this%symm_weight(1:this%maxnorbs, 1:this%maxnorbs, 1:this%nsym, 1:this%norbsets))
1187 this%symm_weight =
m_zero
1189 do ios = 1, this%norbsets
1191 if (this%orbsets(ios)%norbs == 1)
then
1192 this%symm_weight(1,1, 1:this%nsym, ios) =
m_one
1197 if (this%orbsets(ios)%ndim > 1) cycle
1199 call orbitals_get_symm_weight(this%orbsets(ios), ions%space, ions%latt, gr, ions%symm, this%symm_weight(:,:,:,ios))
1208 type(
space_t),
intent(in) :: space
1210 type(
grid_t),
intent(in) :: gr
1212 real(real64),
intent(inout) :: weight(:,:,:)
1214 integer :: im, imp, iop, mm
1215 real(real64),
allocatable :: orb(:,:), orb_sym(:), ylm(:)
1217 real(real64) :: rc, norm, origin(space%dim)
1221 assert(os%ndim == 1)
1223 safe_allocate(orb_sym(1:gr%np))
1224 safe_allocate(orb(1:gr%np, 1:os%norbs))
1226 assert(2*os%ll+1 == os%norbs)
1234 safe_allocate(ylm(1:sphere%np))
1239 call loct_ylm(sphere%np, sphere%rel_x(1,1), sphere%r(1), os%ll, mm, ylm(1))
1245 safe_deallocate_a(ylm)
1249 do iop = 1, symm%nops
1252 do imp = 1, os%norbs
1253 weight(im, imp, iop) =
dmf_dotp(gr, orb(:,imp), orb_sym, reduce=.false.)
1258 if(gr%parallel_in_domains)
then
1259 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)
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)
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 ...