38 use,
intrinsic :: iso_fortran_env
92 logical :: complex_ylms
93 logical :: initialized
96 integer,
allocatable :: atom(:)
97 integer,
allocatable :: level(:)
98 integer,
allocatable :: ddim(:)
99 logical :: alternative
100 logical :: derivative
101 integer,
allocatable :: cst(:, :)
102 integer,
allocatable :: ck(:, :)
103 real(4),
allocatable :: dbuff_single(:, :, :, :)
104 complex(4),
allocatable :: zbuff_single(:, :, :, :)
105 real(real64),
allocatable :: dbuff(:, :, :, :)
106 complex(real64),
allocatable :: zbuff(:, :, :, :)
107 logical :: save_memory
108 logical :: initialized_orbitals
109 real(real64) :: orbital_scale_factor
112 logical,
allocatable :: is_empty(:)
118 real(real64),
allocatable :: radius(:)
119 real(real64) :: lapdist
123 integer,
allocatable :: basis_atom(:)
124 integer,
allocatable :: basis_orb(:)
125 integer,
allocatable :: atom_orb_basis(:, :)
126 integer,
allocatable :: norb_atom(:)
128 integer :: lsize(1:2)
129 integer :: nproc(1:2)
130 integer :: myroc(1:2)
131 integer :: desc(1:BLACS_DLEN)
132 logical,
allocatable :: calc_atom(:)
133 real(real64) :: diag_tol
134 type(submesh_t),
allocatable :: sphere(:)
135 type(batch_t),
allocatable :: orbitals(:)
136 logical,
allocatable :: is_orbital_initialized(:)
140 integer,
parameter :: &
141 INITRHO_PARAMAGNETIC = 1, &
146 real(real64),
parameter,
public :: default_eigenval = 1.0e10_real64
151 subroutine lcao_init(this, namespace, space, gr, ions, st, st_start)
152 type(lcao_t),
intent(out) :: this
153 type(namespace_t),
intent(in) :: namespace
154 type(electron_space_t),
intent(in) :: space
155 type(grid_t),
intent(in) :: gr
156 type(ions_t),
intent(in) :: ions
157 type(states_elec_t),
intent(in) :: st
158 integer,
intent(in) :: st_start
160 integer :: ia, n, iorb, jj, maxj, idim
161 integer :: ii, ll, mm, norbs, ii_tmp
162 integer :: mode_default
163 real(real64) :: max_orb_radius, maxradius
168 this%initialized = .
true.
172 mode_default = option__lcaostart__lcao_states
173 if (ions%only_user_def) mode_default = option__lcaostart__lcao_none
230 if (this%mode == option__lcaostart__lcao_states_batch .and. st_start > 1)
then
231 message(1) =
"LCAOStart = lcao_states_batch not compatible with this run."
232 message(2) =
"Please use LCAOStart = lcao_states instead"
237 this%alternative = this%mode == option__lcaostart__lcao_states_batch
239 if (this%mode == option__lcaostart__lcao_none)
then
249 if (st%d%ispin ==
spinors .and. this%alternative)
then
250 message(1) =
"LCAOStart = lcao_states_batch is not working for spinors."
253 if (space%is_periodic() .and. this%alternative)
then
271 call parse_variable(namespace,
'LCAOComplexYlms', .false., this%complex_ylms)
273 this%complex_ylms = .false.
284 call parse_variable(namespace,
'LCAOSaveMemory', .false., this%save_memory)
288 call io_mkdir(
'debug/lcao', namespace)
289 iunit_o =
io_open(
'debug/lcao/orbitals', namespace, action=
'write')
290 write(iunit_o,
'(7a6)')
'iorb',
'atom',
'level',
'i',
'l',
'm',
'spin'
293 if (.not. this%alternative)
then
314 call parse_variable(namespace,
'LCAOMaximumOrbitalRadius', 20.0_real64, max_orb_radius, unit =
units_inp%length)
320 do ia = 1, ions%natoms
321 maxj = max(maxj, ions%atom(ia)%species%get_niwfs())
322 this%maxorbs = this%maxorbs + ions%atom(ia)%species%get_niwfs()
325 this%maxorbs = this%maxorbs*st%d%dim
327 if (this%maxorbs == 0)
then
328 call messages_write(
'The are no atomic orbitals available, cannot do LCAO.')
330 this%mode = option__lcaostart__lcao_none
337 safe_allocate( this%atom(1:this%maxorbs))
338 safe_allocate(this%level(1:this%maxorbs))
339 safe_allocate( this%ddim(1:this%maxorbs))
341 safe_allocate(this%is_empty(1:this%maxorbs))
342 this%is_empty = .false.
345 this%lapdist = maxval(abs(gr%idx%enlarge)*gr%spacing)
348 safe_allocate(this%radius(1:ions%natoms))
350 do ia = 1, ions%natoms
351 norbs = ions%atom(ia)%species%get_niwfs()
355 call ions%atom(ia)%species%get_iwf_ilm(iorb, 1, ii, ll, mm)
357 if(ions%atom(ia)%species%is_full())
call ions%atom(ia)%species%get_iwf_n( iorb, 1, ii)
358 maxradius = max(maxradius, ions%atom(ia)%species%get_iwf_radius( ii, is = 1))
361 maxradius = min(maxradius,
m_two*maxval(gr%box%bounding_box_l(1:space%dim)))
363 this%radius(ia) = maxradius
395 do ia = 1, ions%natoms
397 if (jj > ions%atom(ia)%species%get_niwfs()) cycle
398 call ions%atom(ia)%species%get_iwf_ilm(jj, idim, ii, ll, mm)
400 if(ions%atom(ia)%species%is_full())
then
402 call ions%atom(ia)%species%get_iwf_n( ii_tmp, 1, ii)
404 if (this%orbital_scale_factor*ions%atom(ia)%species%get_iwf_radius( ii, is = 1) >= max_orb_radius) cycle
407 this%level(iorb) = jj
408 this%ddim(iorb) = idim
411 write(iunit_o,
'(7i6)') iorb, this%atom(iorb), this%level(iorb), ii, ll, mm, this%ddim(iorb)
424 if (this%maxorbs /= iorb - 1)
then
429 call messages_write(
' orbitals cannot be used for the LCAO calculation,')
431 call messages_write(
' their radii exceeds LCAOMaximumOrbitalRadius (')
436 this%maxorbs = iorb - 1
439 if (this%maxorbs < st%nst)
then
440 call messages_write(
'Cannot do LCAO for all states because there are not enough atomic orbitals.')
480 if (n > 0 .and. n <= st%nst .and. st%nst <= this%maxorbs)
then
483 else if (n > st%nst .and. n <= this%maxorbs)
then
486 else if (n == 0)
then
488 this%norbs = min(this%maxorbs, 2*st%nst)
491 this%norbs = this%maxorbs
494 assert(this%norbs <= this%maxorbs)
496 safe_allocate(this%cst(1:this%norbs, 1:st%d%spin_channels))
497 safe_allocate(this%ck(1:this%norbs, 1:st%d%spin_channels))
498 this%initialized_orbitals = .false.
508 integer :: iatom, iorb, norbs
509 real(real64) :: maxradius
512 integer :: jatom, jorb, jbasis, ilbasis, jlbasis, proc(1:2),
info, nbl
553 call parse_variable(namespace,
'LCAOExtraOrbitals', .false., this%derivative)
560 if (this%derivative)
then
563 if (st%nst * st%smear%el_per_state > st%qtot)
then
564 message(1) =
"Lower-lying empty states may be missed with LCAOExtraOrbitals."
577 call parse_variable(namespace,
'LCAODiagTol', 1e-10_real64, this%diag_tol)
579 if (this%derivative)
then
585 safe_allocate(this%sphere(1:ions%natoms))
586 safe_allocate(this%orbitals(1:ions%natoms))
587 safe_allocate(this%is_orbital_initialized(1:ions%natoms))
588 this%is_orbital_initialized = .false.
590 safe_allocate(this%norb_atom(1:ions%natoms))
594 do iatom = 1, ions%natoms
595 this%norb_atom(iatom) = this%mult*ions%atom(iatom)%species%get_niwfs()
596 this%maxorb = max(this%maxorb, ions%atom(iatom)%species%get_niwfs())
597 this%norbs = this%norbs + ions%atom(iatom)%species%get_niwfs()
600 this%maxorb = this%maxorb*this%mult
601 this%norbs = this%norbs*this%mult
603 safe_allocate(this%basis_atom(1:this%norbs))
604 safe_allocate(this%basis_orb(1:this%norbs))
605 safe_allocate(this%atom_orb_basis(1:ions%natoms, 1:this%maxorb))
610 do iatom = 1, ions%natoms
611 norbs = ions%atom(iatom)%species%get_niwfs()
613 do iorb = 1, this%mult*norbs
615 this%atom_orb_basis(iatom, iorb) = ibasis
616 this%basis_atom(ibasis) = iatom
617 this%basis_orb(ibasis) = iorb
621 call ions%atom(iatom)%species%get_iwf_ilm(iorb, 1, ii, ll, mm)
622 write(iunit_o,
'(7i6)') ibasis, iatom, iorb, ii, ll, mm, 1
632 this%lapdist = maxval(abs(gr%idx%enlarge)*gr%spacing)
635 safe_allocate(this%radius(1:ions%natoms))
637 do iatom = 1, ions%natoms
638 norbs = ions%atom(iatom)%species%get_niwfs()
642 call ions%atom(iatom)%species%get_iwf_ilm(iorb, 1, ii, ll, mm)
644 if(ions%atom(iatom)%species%is_full())
call ions%atom(iatom)%species%get_iwf_n( iorb, 1, ii)
645 maxradius = max(maxradius, ions%atom(iatom)%species%get_iwf_radius( ii, is = 1))
648 if (this%derivative) maxradius = maxradius + this%lapdist
650 maxradius = min(maxradius,
m_two*maxval(gr%box%bounding_box_l(1:space%dim)))
652 this%radius(iatom) = maxradius
655 safe_allocate(this%calc_atom(1:ions%natoms))
656 this%calc_atom = .
true.
659#ifndef HAVE_SCALAPACK
660 this%parallel = .false.
662 this%parallel = (st%parallel_in_states .or. gr%parallel_in_domains) &
665 if (this%parallel)
then
666 nbl = min(16, this%norbs)
669 this%lsize(1) = max(1,
numroc(this%norbs, nbl, st%dom_st_proc_grid%myrow, 0, st%dom_st_proc_grid%nprow))
670 this%lsize(2) = max(1,
numroc(this%norbs, nbl, st%dom_st_proc_grid%mycol, 0, st%dom_st_proc_grid%npcol))
672 this%nproc(1) = st%dom_st_proc_grid%nprow
673 this%nproc(2) = st%dom_st_proc_grid%npcol
674 this%myroc(1) = st%dom_st_proc_grid%myrow
675 this%myroc(2) = st%dom_st_proc_grid%mycol
677 call descinit(this%desc(1), this%norbs, this%norbs, nbl, nbl, 0, 0, &
678 st%dom_st_proc_grid%context, this%lsize(1),
info)
681 write(
message(1),
'(a,i6)')
'descinit for BLACS failed with error code ',
info
685 this%calc_atom = .false.
686 do iatom = 1, ions%natoms
687 ibasis = this%atom_orb_basis(iatom, 1)
689 do jatom = 1, ions%natoms
690 jbasis = this%atom_orb_basis(jatom, 1)
692 do iorb = 1, this%norb_atom(iatom)
693 do jorb = 1, this%norb_atom(jatom)
695 ilbasis, jlbasis, proc(1), proc(2))
697 this%calc_atom(this%basis_atom(jbasis)) = &
698 this%calc_atom(this%basis_atom(jbasis)) .or. proc(2) == this%myroc(2)
716 subroutine lcao_run(namespace, space, gr, ions, ext_partners, st, ks, hm, st_start, lmm_r)
719 type(
grid_t),
intent(in) :: gr
720 type(
ions_t),
intent(in) :: ions
723 type(
v_ks_t),
intent(inout) :: ks
725 integer,
optional,
intent(in) :: st_start
726 real(real64),
optional,
intent(in) :: lmm_r
729 integer :: st_start_random, required_min_nst
731 logical :: is_orbital_dependent
735 if (
present(st_start))
then
738 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
739 calc_eigenval=.not.
present(st_start), calc_current=.false.)
741 assert(st_start >= 1)
742 if (st_start > st%nst)
then
762 if (.not.
present(st_start))
then
763 call lcao_guess_density(lcao, namespace, st, gr, hm, ions, st%qtot, st%d%ispin, st%rho)
766 assert(
present(lmm_r))
772 message(1) =
'Info: Setting up Hamiltonian.'
776 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval=.false., &
777 calc_current=.false., calc_energy=.false., force_semilocal=is_orbital_dependent)
780 st%eigenval = default_eigenval
789 if (
present(st_start))
then
790 write(
message(1),
'(a,i8,a)')
'Performing LCAO for states ', st_start,
' and above'
794 call lcao_wf(lcao, st, gr, ions, hm, namespace, start = st_start)
800 select case (st%d%ispin)
802 required_min_nst = int(st%qtot/2)
804 required_min_nst = int(st%qtot/2)
806 required_min_nst = int(st%qtot)
809 if (lcao%norbs <= required_min_nst .and. lcao%norbs < st%nst)
then
810 st%eigenval(lcao%norbs+1:,:) =
m_zero
814 if (.not.
present(st_start))
then
819 if (lcao%mode == option__lcaostart__lcao_full)
then
820 call v_ks_h_setup(namespace, space, gr, ions, ext_partners, st, ks, hm, &
821 calc_eigenval = .false., calc_current=.false.)
823 assert(
present(lmm_r))
830 if (.not. lcao_done .or. lcao%norbs < st%nst)
then
833 st_start_random = lcao%norbs + 1
837 if (
present(st_start)) st_start_random = max(st_start, st_start_random)
839 if (st_start_random > 1)
then
840 write(
message(1),
'(a,i8,a)')
'Generating random wavefunctions for states ', st_start_random,
' and above'
851 if (.not. lcao_done)
then
854 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
855 calc_eigenval=.not.
present(st_start), calc_current=.false., force_semilocal=is_orbital_dependent)
856 if (.not.
present(st_start))
then
862 else if (
present(st_start))
then
864 if (st_start > 1)
then
881 type(
lcao_t),
intent(inout) :: this
885 safe_deallocate_a(this%calc_atom)
886 safe_deallocate_a(this%norb_atom)
887 safe_deallocate_a(this%basis_atom)
888 safe_deallocate_a(this%basis_orb)
889 safe_deallocate_a(this%atom_orb_basis)
890 safe_deallocate_a(this%radius)
891 safe_deallocate_a(this%sphere)
892 safe_deallocate_a(this%orbitals)
894 safe_deallocate_a(this%atom)
895 safe_deallocate_a(this%level)
896 safe_deallocate_a(this%ddim)
897 safe_deallocate_a(this%cst)
898 safe_deallocate_a(this%ck)
899 safe_deallocate_a(this%dbuff_single)
900 safe_deallocate_a(this%zbuff_single)
901 safe_deallocate_a(this%dbuff)
902 safe_deallocate_a(this%zbuff)
904 this%initialized = .false.
910 subroutine lcao_wf(this, st, gr, ions, hm, namespace, start)
911 type(
lcao_t),
intent(inout) :: this
913 type(
grid_t),
intent(in) :: gr
914 type(
ions_t),
intent(in) :: ions
917 integer,
optional,
intent(in) :: start
921 assert(this%initialized)
927 if (
present(start)) start_ = start
929 if (this%alternative)
then
931 call dlcao_alt_wf(this, st, gr, ions, hm, namespace, start_)
933 call zlcao_alt_wf(this, st, gr, ions, hm, namespace, start_)
937 call dlcao_wf(this, st, gr, ions, hm, namespace, start_)
939 call zlcao_wf(this, st, gr, ions, hm, namespace, start_)
950 type(
lcao_t),
intent(in) :: this
954 available = this%initialized .and. this%mode /= option__lcaostart__lcao_none &
964 type(
lcao_t),
intent(in) :: this
975 type(
lcao_t),
intent(in) :: this
976 integer,
intent(in) :: ig
977 integer,
intent(in) :: jg
978 integer,
intent(out) :: il
979 integer,
intent(out) :: jl
980 integer,
intent(out) :: prow
981 integer,
intent(out) :: pcol
985 call infog2l(ig, jg, this%desc(1), this%nproc(1), this%nproc(2), this%myroc(1), this%myroc(2), &
1002 type(
lcao_t),
intent(inout) :: this
1003 integer,
intent(in) :: iatom
1007 if (this%is_orbital_initialized(iatom))
then
1008 call this%orbitals(iatom)%end()
1009 this%is_orbital_initialized(iatom) = .false.
1019 type(
lcao_t),
intent(inout) :: this
1021 class(
mesh_t),
intent(in) :: mesh
1022 type(
ions_t),
target,
intent(in) :: ions
1023 integer,
intent(in) :: iatom
1024 integer,
intent(in) :: spin_channels
1025 real(real64),
intent(inout) :: rho(:, :)
1027 real(real64),
allocatable :: dorbital(:, :)
1028 complex(real64),
allocatable :: zorbital(:, :)
1029 real(real64),
allocatable :: factors(:)
1030 real(real64) :: factor, aa
1031 integer :: iorb, ip, ii, ll, mm, ispin
1032 type(
ps_t),
pointer :: ps
1033 logical :: use_stored_orbitals
1039 use_stored_orbitals = ions%atom(iatom)%species%is_ps() &
1041 .and. st%d%dim == 1 .and. .not. ions%space%is_periodic()
1045 if (use_stored_orbitals)
then
1047 assert(.not. ions%space%is_periodic())
1049 select type(spec=>ions%atom(iatom)%species)
1056 if (.not. this%alternative)
then
1059 safe_allocate(dorbital(1:mesh%np, 1:st%d%dim))
1061 safe_allocate(zorbital(1:mesh%np, 1:st%d%dim))
1064 do iorb = 1, this%norbs
1065 if (iatom /= this%atom(iorb)) cycle
1067 call ions%atom(iatom)%species%get_iwf_ilm(this%level(iorb), 1, ii, ll, mm)
1068 factor = ps%conf%occ(ii, 1)/(
m_two*ll +
m_one)
1071 call dget_ao(this, st, mesh, ions, iorb, 1, dorbital, use_psi = .
true.)
1074 rho(ip, 1) = rho(ip, 1) + factor*dorbital(ip, 1)**2
1077 call zget_ao(this, st, mesh, ions, iorb, 1, zorbital, use_psi = .
true.)
1080 rho(ip, 1) = rho(ip, 1) + factor*abs(zorbital(ip, 1))**2
1086 safe_deallocate_a(dorbital)
1087 safe_deallocate_a(zorbital)
1095 safe_allocate(factors(1:this%norb_atom(iatom)/this%mult))
1097 do iorb = 1, this%norb_atom(iatom)/this%mult
1098 call ions%atom(iatom)%species%get_iwf_ilm(iorb, 1, ii, ll, mm)
1099 factors(iorb) = ps%conf%occ(ii, 1)/(
m_two*ll +
m_one)
1103 do ip = 1, this%sphere(iatom)%np
1105 do iorb = 1, this%norb_atom(iatom)/this%mult
1106 aa = aa + factors(iorb)*this%orbitals(iatom)%dff_linear(ip, iorb)**2
1108 rho(this%sphere(iatom)%map(ip), 1) = rho(this%sphere(iatom)%map(ip), 1) + aa
1111 safe_deallocate_a(factors)
1117 ions%pos(:, iatom), mesh, spin_channels, rho)
1122 do ispin = 1, spin_channels
1125 rho(ip, ispin) = max(rho(ip, ispin),
m_zero)
1135 type(
lcao_t),
intent(inout) :: this
1138 type(
grid_t),
intent(in) :: gr
1140 type(
ions_t),
intent(in) :: ions
1141 real(real64),
intent(in) :: qtot
1142 integer,
intent(in) :: ispin
1143 real(real64),
contiguous,
intent(out) :: rho(:, :)
1145 integer :: ia, is, idir, gmd_opt, ip, m_dim
1148 real(real64) :: rr, rnd, phi, theta, lmag, n1, n2,arg
1149 real(real64),
allocatable :: atom_rho(:,:), mag(:,:)
1150 real(real64),
parameter :: tol_min_mag = 1.0e-20_real64
1154 if (st%d%spin_channels == 1)
then
1155 gmd_opt = initrho_paramagnetic
1188 message(1) =
"GuessMagnetDensity cannot be used for Hartree-Fock and generalized Kohn-Sham calculation."
1189 message(2) =
"Please perform a LDA or GGA calculation first and restart from this calculation."
1213 if (
parse_block(namespace,
'AtomsMagnetDirection', blk) < 0)
then
1214 message(1) =
"AtomsMagnetDirection block is not defined."
1219 message(1) =
"The number of rows in the AtomsMagnetDirection block does not equal the number of atoms."
1229 safe_allocate(mag(1:m_dim, 1:ions%natoms))
1230 do ia = 1, ions%natoms
1234 if (abs(mag(idir, ia)) < tol_min_mag) mag(idir, ia) =
m_zero
1242 safe_allocate(atom_rho(1:gr%np, 1:st%d%spin_channels))
1243 select case (gmd_opt)
1244 case (initrho_paramagnetic)
1245 do ia = ions%atoms_dist%start, ions%atoms_dist%end
1250 if (st%d%spin_channels == 2)
then
1253 rho(ip, 1) =
m_half*(rho(ip, 1) + rho(ip, 2))
1254 rho(ip, 2) = rho(ip, 1)
1259 do ia = ions%atoms_dist%start, ions%atoms_dist%end
1261 rho(1:gr%np, 1:2) = rho(1:gr%np, 1:2) + atom_rho(1:gr%np, 1:2)
1265 do ia = ions%atoms_dist%start, ions%atoms_dist%end
1280 call lalg_axpy(gr%np, (lmag - n1 + n2)/
m_two/n2, atom_rho(:, 2), atom_rho(:, 1))
1289 rho(1:gr%np, 1:2) = rho(1:gr%np, 1:2) + atom_rho(1:gr%np, 1:2)
1291 rho(1:gr%np, 1) = rho(1:gr%np, 1) + atom_rho(1:gr%np, 2)
1292 rho(1:gr%np, 2) = rho(1:gr%np, 2) + atom_rho(1:gr%np, 1)
1294 elseif (ispin ==
spinors)
then
1305 do ia = ions%atoms_dist%start, ions%atoms_dist%end
1313 lmag = norm2(mag(:, ia))
1314 if (lmag > n1 + n2)
then
1315 mag = mag*(n1 + n2)/lmag
1323 atom_rho(ip, 1) =
m_half*(atom_rho(ip, 1) + atom_rho(ip, 2))
1324 rho(ip, 1) = rho(ip, 1) + atom_rho(ip, 1)
1325 rho(ip, 2) = rho(ip, 2) + atom_rho(ip, 1)
1332 if (n1 - n2 < lmag)
then
1333 call lalg_axpy(gr%np, (lmag - n1 + n2)/
m_two/n2, atom_rho(:, 2), atom_rho(:, 1))
1335 elseif (n1 - n2 > lmag)
then
1336 call lalg_axpy(gr%np, (n1 - n2 - lmag)/
m_two/n1, atom_rho(:, 1), atom_rho(:, 2))
1344 if (mag(1, ia) >
m_zero)
then
1351 elseif (ispin ==
spinors)
then
1353 theta =
acos(mag(3, ia)/lmag)
1357 elseif (mag(2, ia) <
m_zero)
then
1359 elseif (mag(2, ia) >
m_zero)
then
1364 arg = mag(1, ia)/
sin(theta)/lmag
1367 if (mag(2, ia) <
m_zero)
then
1379 if (ions%atoms_dist%parallel)
then
1380 do is = 1, st%d%nspin
1381 call lalg_copy(gr%np, rho(:,is), atom_rho(:,1))
1382 call ions%atoms_dist%mpi_grp%allreduce(atom_rho(1, 1), rho(1, is), gr%np, mpi_double_precision, mpi_sum)
1388 write(
message(1),
'(a,f13.6)')
'Info: Unnormalized total charge = ', rr
1393 call lalg_scal(gr%np, st%d%nspin, qtot/rr, rho)
1395 write(
message(1),
'(a,f13.6)')
'Info: Renormalized total charge = ', rr
1400 if (st%symmetrize_density)
then
1401 do is = 1, st%d%nspin
1406 safe_deallocate_a(atom_rho)
1407 safe_deallocate_a(mag)
1413 real(real64) function integrated_charge_density(gr, st, rho) result(rr)
1414 type(
grid_t),
intent(in) :: gr
1416 real(real64),
intent(in) :: rho(:,:)
1421 do is = 1, st%d%spin_channels
1425 call gr%allreduce(rr)
1430 class(mesh_t),
intent(in) :: mesh
1431 real(real64),
intent(inout) :: rho(:,:)
1432 real(real64),
intent(in) :: atom_rho(:,:)
1433 real(real64),
intent(in) :: theta, phi
1441 rho(ip, 1) = rho(ip, 1) +
cos(theta)**2*atom_rho(ip, 1) +
sin(theta)**2*atom_rho(ip, 2)
1442 rho(ip, 2) = rho(ip, 2) +
sin(theta)**2*atom_rho(ip, 1) +
cos(theta)**2*atom_rho(ip, 2)
1443 rho(ip, 3) = rho(ip, 3) +
cos(theta)*
sin(theta)*
cos(phi)*(atom_rho(ip, 1)-atom_rho(ip, 2))
1444 rho(ip, 4) = rho(ip, 4) -
cos(theta)*
sin(theta)*
sin(phi)*(atom_rho(ip, 1)-atom_rho(ip, 2))
1453 type(
lcao_t),
intent(inout) :: this
1454 type(namespace_t),
intent(in) :: namespace
1455 type(states_elec_t),
intent(inout) :: st
1456 type(grid_t),
intent(in) :: gr
1457 type(ions_t),
intent(in) :: ions
1458 integer,
optional,
intent(in) :: start
1464 if (.not. this%alternative)
then
1465 if (states_are_real(st))
then
1471 if (states_are_real(st))
then
1484#include "lcao_inc.F90"
1487#include "complex.F90"
1488#include "lcao_inc.F90"
constant times a vector plus a vector
Copies a vector x, to a vector y.
scales a vector by a constant
Prints out to iunit a message in the form: ["InputVariable" = value] where "InputVariable" is given b...
double acos(double __x) __attribute__((__nothrow__
double sin(double __x) __attribute__((__nothrow__
double cos(double __x) __attribute__((__nothrow__
This module implements batches of mesh functions.
This module contains interfaces for BLACS routines Interfaces are from http:
This module provides the BLACS processor grid.
logical pure function, public blacs_proc_grid_null(this)
Module implementing boundary conditions in Octopus.
type(debug_t), save, public debug
integer, parameter, public unpolarized
Parameters...
integer, parameter, public spinors
integer, parameter, public spin_polarized
real(real64), parameter, public m_two
real(real64), parameter, public m_zero
real(real64), parameter, public m_pi
some mathematical constants
real(real64), parameter, public m_epsilon
real(real64), parameter, public m_half
real(real64), parameter, public m_one
real(real64), parameter, public m_three
This module implements the underlying real-space grid.
subroutine, public dgrid_symmetrize_scalar_field(gr, field, suppress_warning)
This module defines classes and functions for interaction partners.
subroutine, public io_close(iunit, grp)
subroutine, public io_mkdir(fname, namespace, parents)
integer function, public io_open(file, namespace, action, status, form, position, die, recl, grp)
A module to handle KS potential, without the external potential.
integer, parameter, public hartree
integer, parameter, public hartree_fock
integer, parameter, public generalized_kohn_sham_dft
integer, parameter, public kohn_sham_dft
This module contains interfaces for LAPACK routines.
subroutine, public lcao_init_orbitals(this, namespace, st, gr, ions, start)
subroutine, public lcao_wf(this, st, gr, ions, hm, namespace, start)
subroutine zlcao_alt_init_orbitals(this, namespace, st, gr, ions, start)
subroutine zget_ao(this, st, mesh, ions, iorb, ispin, ao, use_psi)
subroutine, public lcao_end(this)
subroutine, public lcao_run(namespace, space, gr, ions, ext_partners, st, ks, hm, st_start, lmm_r)
subroutine zlcao_alt_wf(this, st, gr, ions, hm, namespace, start)
The alternative implementation.
subroutine dlcao_wf(this, st, gr, ions, hm, namespace, start)
subroutine dlcao_alt_init_orbitals(this, namespace, st, gr, ions, start)
subroutine zlcao_wf(this, st, gr, ions, hm, namespace, start)
subroutine dlcao_alt_wf(this, st, gr, ions, hm, namespace, start)
The alternative implementation.
integer, parameter initrho_userdef
integer, parameter initrho_random
subroutine lcao_alt_end_orbital(this, iatom)
This function deallocates a set of an atomic orbitals for an atom. It can be called when the batch is...
subroutine lcao_local_index(this, ig, jg, il, jl, prow, pcol)
integer function, public lcao_num_orbitals(this)
Returns the number of LCAO orbitas.
subroutine lcao_guess_density(this, namespace, st, gr, hm, ions, qtot, ispin, rho)
builds a density which is the sum of the atomic densities
subroutine dinit_orbitals(this, namespace, st, gr, ions, start)
real(real64) function integrated_charge_density(gr, st, rho)
Computes the integral of rho, summed over spin channels.
subroutine dget_ao(this, st, mesh, ions, iorb, ispin, ao, use_psi)
subroutine dlcao_alt_get_orbital(this, sphere, ions, ispin, iatom, norbs)
This function generates the set of an atomic orbitals for an atom and stores it in the batch orbitalb...
subroutine zinit_orbitals(this, namespace, st, gr, ions, start)
subroutine lcao_atom_density(this, st, mesh, ions, iatom, spin_channels, rho)
subroutine, public lcao_init(this, namespace, space, gr, ions, st, st_start)
subroutine accumulate_rotated_density(mesh, rho, atom_rho, theta, phi)
integer, parameter initrho_ferromagnetic
logical function, public lcao_is_available(this)
Returns true if LCAO can be done.
subroutine, public write_magnetic_moments(mesh, st, ions, boundaries, lmm_r, iunit, namespace)
This module is intended to contain "only mathematical" functions and procedures.
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
subroutine, public messages_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)
logical function mpi_grp_is_root(grp)
Is the current MPI process of grpcomm, root.
type(mpi_grp_t), public mpi_world
logical function, public parse_is_defined(namespace, name)
integer function, public parse_block(namespace, name, blk, check_varinfo_)
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.
integer(int64), parameter, public splitmix64_321
This module contains interfaces for ScaLAPACK routines Interfaces are from http:
integer, parameter, public smear_semiconductor
integer, parameter, public smear_fixed_occ
subroutine, public species_atom_density(species, namespace, space, latt, pos, mesh, spin_channels, rho)
pure logical function, public states_are_complex(st)
pure logical function, public states_are_real(st)
subroutine, public states_elec_orthogonalize(st, namespace, mesh)
Orthonormalizes nst orbitals in mesh (honours state parallelization).
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_fermi(st, namespace, mesh, compute_spin)
calculate the Fermi level for the states in this object
subroutine, public states_elec_generate_random(st, mesh, kpoints, ist_start_, ist_end_, ikpt_start_, ikpt_end_, normalized)
randomize states
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
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
subroutine, public v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval, time, calc_energy, calc_current, force_semilocal)
subroutine, public v_ks_h_setup(namespace, space, gr, ions, ext_partners, st, ks, hm, calc_eigenval, calc_current)
logical pure function, public xc_is_orbital_dependent(xcs)
Is the xc family orbital dependent.
integer, parameter, public sic_pz_oep
Perdew-Zunger SIC (OEP way)
Extension of space that contains the knowledge of the spin dimension.
Description of the grid, containing information on derivatives, stencil, and symmetries.
Describes mesh distribution to nodes.
A type storing the information and data about a pseudopotential.
The states_elec_t class contains all electronic wave functions.