39 use,
intrinsic :: iso_fortran_env
93 logical :: complex_ylms
94 logical :: initialized
97 integer,
allocatable :: atom(:)
98 integer,
allocatable :: level(:)
99 integer,
allocatable :: ddim(:)
100 logical :: alternative
101 logical :: derivative
102 integer,
allocatable :: cst(:, :)
103 integer,
allocatable :: ck(:, :)
104 real(4),
allocatable :: dbuff_single(:, :, :, :)
105 complex(4),
allocatable :: zbuff_single(:, :, :, :)
106 real(real64),
allocatable :: dbuff(:, :, :, :)
107 complex(real64),
allocatable :: zbuff(:, :, :, :)
108 logical :: save_memory
109 logical :: initialized_orbitals
110 real(real64) :: orbital_scale_factor
113 logical,
allocatable :: is_empty(:)
119 real(real64),
allocatable :: radius(:)
120 real(real64) :: lapdist
124 integer,
allocatable :: basis_atom(:)
125 integer,
allocatable :: basis_orb(:)
126 integer,
allocatable :: atom_orb_basis(:, :)
127 integer,
allocatable :: norb_atom(:)
129 integer :: lsize(1:2)
130 integer :: nproc(1:2)
131 integer :: myroc(1:2)
132 integer :: desc(1:BLACS_DLEN)
133 logical,
allocatable :: calc_atom(:)
134 real(real64) :: diag_tol
135 type(submesh_t),
allocatable :: sphere(:)
136 type(batch_t),
allocatable :: orbitals(:)
137 logical,
allocatable :: is_orbital_initialized(:)
143 integer,
parameter :: &
144 INITRHO_PARAMAGNETIC = 1, &
152 subroutine lcao_init(this, namespace, space, gr, ions, st, st_start)
153 type(lcao_t),
intent(out) :: this
154 type(namespace_t),
intent(in) :: namespace
155 type(electron_space_t),
intent(in) :: space
156 type(grid_t),
intent(in) :: gr
157 type(ions_t),
intent(in) :: ions
158 type(states_elec_t),
intent(in) :: st
159 integer,
intent(in) :: st_start
161 integer :: ia, n, iorb, jj, maxj, idim
162 integer :: ii, ll, mm, norbs, ii_tmp
163 integer :: mode_default
164 real(real64) :: max_orb_radius, maxradius
169 this%initialized = .
true.
173 mode_default = option__lcaostart__lcao_states
174 if (ions%only_user_def) mode_default = option__lcaostart__lcao_none
231 if (this%mode == option__lcaostart__lcao_states_batch .and. st_start > 1)
then
232 message(1) =
"LCAOStart = lcao_states_batch not compatible with this run."
233 message(2) =
"Please use LCAOStart = lcao_states instead"
238 this%alternative = this%mode == option__lcaostart__lcao_states_batch
240 if (this%mode == option__lcaostart__lcao_none)
then
250 if (st%d%ispin ==
spinors .and. this%alternative)
then
251 message(1) =
"LCAOStart = lcao_states_batch is not working for spinors."
254 if (space%is_periodic() .and. this%alternative)
then
272 call parse_variable(namespace,
'LCAOComplexYlms', .false., this%complex_ylms)
274 this%complex_ylms = .false.
285 call parse_variable(namespace,
'LCAOSaveMemory', .false., this%save_memory)
289 call io_mkdir(
'debug/lcao', namespace)
290 iunit_o =
io_open(
'debug/lcao/orbitals', namespace, action=
'write')
291 write(iunit_o,
'(7a6)')
'iorb',
'atom',
'level',
'i',
'l',
'm',
'spin'
294 if (.not. this%alternative)
then
315 call parse_variable(namespace,
'LCAOMaximumOrbitalRadius', 20.0_real64, max_orb_radius, unit =
units_inp%length)
321 do ia = 1, ions%natoms
322 maxj = max(maxj, ions%atom(ia)%species%get_niwfs())
323 this%maxorbs = this%maxorbs + ions%atom(ia)%species%get_niwfs()
326 this%maxorbs = this%maxorbs*st%d%dim
328 if (this%maxorbs == 0)
then
329 call messages_write(
'The are no atomic orbitals available, cannot do LCAO.')
331 this%mode = option__lcaostart__lcao_none
338 safe_allocate( this%atom(1:this%maxorbs))
339 safe_allocate(this%level(1:this%maxorbs))
340 safe_allocate( this%ddim(1:this%maxorbs))
342 safe_allocate(this%is_empty(1:this%maxorbs))
343 this%is_empty = .false.
346 this%lapdist = maxval(abs(gr%idx%enlarge)*gr%spacing)
349 safe_allocate(this%radius(1:ions%natoms))
351 do ia = 1, ions%natoms
352 norbs = ions%atom(ia)%species%get_niwfs()
356 call ions%atom(ia)%species%get_iwf_ilm(iorb, 1, ii, ll, mm)
358 if(ions%atom(ia)%species%is_full())
call ions%atom(ia)%species%get_iwf_n( iorb, 1, ii)
359 maxradius = max(maxradius, ions%atom(ia)%species%get_iwf_radius( ii, is = 1))
362 maxradius = min(maxradius,
m_two*maxval(gr%box%bounding_box_l(1:space%dim)))
364 this%radius(ia) = maxradius
396 do ia = 1, ions%natoms
398 if (jj > ions%atom(ia)%species%get_niwfs()) cycle
399 call ions%atom(ia)%species%get_iwf_ilm(jj, idim, ii, ll, mm)
401 if(ions%atom(ia)%species%is_full())
then
403 call ions%atom(ia)%species%get_iwf_n( ii_tmp, 1, ii)
405 if (this%orbital_scale_factor*ions%atom(ia)%species%get_iwf_radius( ii, is = 1) >= max_orb_radius) cycle
408 this%level(iorb) = jj
409 this%ddim(iorb) = idim
412 write(iunit_o,
'(7i6)') iorb, this%atom(iorb), this%level(iorb), ii, ll, mm, this%ddim(iorb)
425 if (this%maxorbs /= iorb - 1)
then
430 call messages_write(
' orbitals cannot be used for the LCAO calculation,')
432 call messages_write(
' their radii exceeds LCAOMaximumOrbitalRadius (')
437 this%maxorbs = iorb - 1
440 if (this%maxorbs < st%nst)
then
441 call messages_write(
'Cannot do LCAO for all states because there are not enough atomic orbitals.')
481 if (n > 0 .and. n <= st%nst .and. st%nst <= this%maxorbs)
then
484 else if (n > st%nst .and. n <= this%maxorbs)
then
487 else if (n == 0)
then
489 this%norbs = min(this%maxorbs, 2*st%nst)
492 this%norbs = this%maxorbs
495 assert(this%norbs <= this%maxorbs)
497 safe_allocate(this%cst(1:this%norbs, 1:st%d%spin_channels))
498 safe_allocate(this%ck(1:this%norbs, 1:st%d%spin_channels))
499 this%initialized_orbitals = .false.
509 integer :: iatom, iorb, norbs
510 real(real64) :: maxradius
513 integer :: jatom, jorb, jbasis, ilbasis, jlbasis, proc(1:2),
info, nbl
554 call parse_variable(namespace,
'LCAOExtraOrbitals', .false., this%derivative)
561 if (this%derivative)
then
564 if (st%nst * st%smear%el_per_state > st%qtot)
then
565 message(1) =
"Lower-lying empty states may be missed with LCAOExtraOrbitals."
578 call parse_variable(namespace,
'LCAODiagTol', 1e-10_real64, this%diag_tol)
580 if (this%derivative)
then
586 safe_allocate(this%sphere(1:ions%natoms))
587 safe_allocate(this%orbitals(1:ions%natoms))
588 safe_allocate(this%is_orbital_initialized(1:ions%natoms))
589 this%is_orbital_initialized = .false.
591 safe_allocate(this%norb_atom(1:ions%natoms))
595 do iatom = 1, ions%natoms
596 this%norb_atom(iatom) = this%mult*ions%atom(iatom)%species%get_niwfs()
597 this%maxorb = max(this%maxorb, ions%atom(iatom)%species%get_niwfs())
598 this%norbs = this%norbs + ions%atom(iatom)%species%get_niwfs()
601 this%maxorb = this%maxorb*this%mult
602 this%norbs = this%norbs*this%mult
604 safe_allocate(this%basis_atom(1:this%norbs))
605 safe_allocate(this%basis_orb(1:this%norbs))
606 safe_allocate(this%atom_orb_basis(1:ions%natoms, 1:this%maxorb))
611 do iatom = 1, ions%natoms
612 norbs = ions%atom(iatom)%species%get_niwfs()
614 do iorb = 1, this%mult*norbs
616 this%atom_orb_basis(iatom, iorb) = ibasis
617 this%basis_atom(ibasis) = iatom
618 this%basis_orb(ibasis) = iorb
622 call ions%atom(iatom)%species%get_iwf_ilm(iorb, 1, ii, ll, mm)
623 write(iunit_o,
'(7i6)') ibasis, iatom, iorb, ii, ll, mm, 1
633 this%lapdist = maxval(abs(gr%idx%enlarge)*gr%spacing)
636 safe_allocate(this%radius(1:ions%natoms))
638 do iatom = 1, ions%natoms
639 norbs = ions%atom(iatom)%species%get_niwfs()
643 call ions%atom(iatom)%species%get_iwf_ilm(iorb, 1, ii, ll, mm)
645 if(ions%atom(iatom)%species%is_full())
call ions%atom(iatom)%species%get_iwf_n( iorb, 1, ii)
646 maxradius = max(maxradius, ions%atom(iatom)%species%get_iwf_radius( ii, is = 1))
649 if (this%derivative) maxradius = maxradius + this%lapdist
651 maxradius = min(maxradius,
m_two*maxval(gr%box%bounding_box_l(1:space%dim)))
653 this%radius(iatom) = maxradius
656 safe_allocate(this%calc_atom(1:ions%natoms))
657 this%calc_atom = .
true.
660#ifndef HAVE_SCALAPACK
661 this%parallel = .false.
663 this%parallel = (st%parallel_in_states .or. gr%parallel_in_domains) &
666 if (this%parallel)
then
667 nbl = min(16, this%norbs)
670 this%lsize(1) = max(1,
numroc(this%norbs, nbl, st%dom_st_proc_grid%myrow, 0, st%dom_st_proc_grid%nprow))
671 this%lsize(2) = max(1,
numroc(this%norbs, nbl, st%dom_st_proc_grid%mycol, 0, st%dom_st_proc_grid%npcol))
673 this%nproc(1) = st%dom_st_proc_grid%nprow
674 this%nproc(2) = st%dom_st_proc_grid%npcol
675 this%myroc(1) = st%dom_st_proc_grid%myrow
676 this%myroc(2) = st%dom_st_proc_grid%mycol
678 call descinit(this%desc(1), this%norbs, this%norbs, nbl, nbl, 0, 0, &
679 st%dom_st_proc_grid%context, this%lsize(1),
info)
682 write(
message(1),
'(a,i6)')
'descinit for BLACS failed with error code ',
info
686 this%calc_atom = .false.
687 do iatom = 1, ions%natoms
688 ibasis = this%atom_orb_basis(iatom, 1)
690 do jatom = 1, ions%natoms
691 jbasis = this%atom_orb_basis(jatom, 1)
693 do iorb = 1, this%norb_atom(iatom)
694 do jorb = 1, this%norb_atom(jatom)
696 ilbasis, jlbasis, proc(1), proc(2))
698 this%calc_atom(this%basis_atom(jbasis)) = &
699 this%calc_atom(this%basis_atom(jbasis)) .or. proc(2) == this%myroc(2)
717 subroutine lcao_run(namespace, space, gr, ions, ext_partners, st, ks, hm, st_start, lmm_r)
720 type(
grid_t),
intent(in) :: gr
721 type(
ions_t),
intent(in) :: ions
724 type(
v_ks_t),
intent(inout) :: ks
726 integer,
optional,
intent(in) :: st_start
727 real(real64),
optional,
intent(in) :: lmm_r
730 integer :: st_start_random, required_min_nst
732 logical :: is_orbital_dependent
736 if (
present(st_start))
then
739 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
740 calc_eigenval=.not.
present(st_start), calc_current=.false.)
742 assert(st_start >= 1)
743 if (st_start > st%nst)
then
763 if (.not.
present(st_start))
then
764 call lcao_guess_density(lcao, namespace, st, gr, hm, ions, st%qtot, st%d%ispin, st%rho)
767 assert(
present(lmm_r))
773 message(1) =
'Info: Setting up Hamiltonian.'
777 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval=.false., &
778 calc_current=.false., calc_energy=.false., force_semilocal=is_orbital_dependent)
781 st%eigenval = 1e10_real64
790 if (
present(st_start))
then
791 write(
message(1),
'(a,i8,a)')
'Performing LCAO for states ', st_start,
' and above'
795 call lcao_wf(lcao, st, gr, ions, hm, namespace, start = st_start)
801 select case (st%d%ispin)
803 required_min_nst = int(st%qtot/2)
805 required_min_nst = int(st%qtot/2)
807 required_min_nst = int(st%qtot)
810 if (lcao%norbs <= required_min_nst .and. lcao%norbs < st%nst)
then
811 st%eigenval(lcao%norbs+1:,:) =
m_zero
815 if (.not.
present(st_start))
then
820 if (lcao%mode == option__lcaostart__lcao_full)
then
821 call v_ks_h_setup(namespace, space, gr, ions, ext_partners, st, ks, hm, &
822 calc_eigenval = .false., calc_current=.false.)
824 assert(
present(lmm_r))
831 if (.not. lcao_done .or. lcao%norbs < st%nst)
then
834 st_start_random = lcao%norbs + 1
838 if (
present(st_start)) st_start_random = max(st_start, st_start_random)
840 if (st_start_random > 1)
then
841 write(
message(1),
'(a,i8,a)')
'Generating random wavefunctions for states ', st_start_random,
' and above'
850 if (.not. st%fixed_spins)
then
858 if (.not. lcao_done)
then
861 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
862 calc_eigenval=.not.
present(st_start), calc_current=.false., force_semilocal=is_orbital_dependent)
863 if (.not.
present(st_start))
then
869 else if (
present(st_start))
then
871 if (st_start > 1)
then
888 type(
lcao_t),
intent(inout) :: this
892 safe_deallocate_a(this%calc_atom)
893 safe_deallocate_a(this%norb_atom)
894 safe_deallocate_a(this%basis_atom)
895 safe_deallocate_a(this%basis_orb)
896 safe_deallocate_a(this%atom_orb_basis)
897 safe_deallocate_a(this%radius)
898 safe_deallocate_a(this%sphere)
899 safe_deallocate_a(this%orbitals)
901 safe_deallocate_a(this%atom)
902 safe_deallocate_a(this%level)
903 safe_deallocate_a(this%ddim)
904 safe_deallocate_a(this%cst)
905 safe_deallocate_a(this%ck)
906 safe_deallocate_a(this%dbuff_single)
907 safe_deallocate_a(this%zbuff_single)
908 safe_deallocate_a(this%dbuff)
909 safe_deallocate_a(this%zbuff)
911 this%initialized = .false.
917 subroutine lcao_wf(this, st, gr, ions, hm, namespace, start)
918 type(
lcao_t),
intent(inout) :: this
920 type(
grid_t),
intent(in) :: gr
921 type(
ions_t),
intent(in) :: ions
924 integer,
optional,
intent(in) :: start
928 assert(this%initialized)
934 if (
present(start)) start_ = start
936 if (this%alternative)
then
938 call dlcao_alt_wf(this, st, gr, ions, hm, namespace, start_)
940 call zlcao_alt_wf(this, st, gr, ions, hm, namespace, start_)
944 call dlcao_wf(this, st, gr, ions, hm, namespace, start_)
946 call zlcao_wf(this, st, gr, ions, hm, namespace, start_)
957 type(
lcao_t),
intent(in) :: this
961 available = this%initialized .and. this%mode /= option__lcaostart__lcao_none &
971 type(
lcao_t),
intent(in) :: this
982 type(
lcao_t),
intent(in) :: this
983 integer,
intent(in) :: ig
984 integer,
intent(in) :: jg
985 integer,
intent(out) :: il
986 integer,
intent(out) :: jl
987 integer,
intent(out) :: prow
988 integer,
intent(out) :: pcol
992 call infog2l(ig, jg, this%desc(1), this%nproc(1), this%nproc(2), this%myroc(1), this%myroc(2), &
1009 type(
lcao_t),
intent(inout) :: this
1010 integer,
intent(in) :: iatom
1014 if (this%is_orbital_initialized(iatom))
then
1015 call this%orbitals(iatom)%end()
1016 this%is_orbital_initialized(iatom) = .false.
1026 type(
lcao_t),
intent(inout) :: this
1028 class(
mesh_t),
intent(in) :: mesh
1029 type(
ions_t),
target,
intent(in) :: ions
1030 integer,
intent(in) :: iatom
1031 integer,
intent(in) :: spin_channels
1032 real(real64),
intent(inout) :: rho(:, :)
1034 real(real64),
allocatable :: dorbital(:, :)
1035 complex(real64),
allocatable :: zorbital(:, :)
1036 real(real64),
allocatable :: factors(:)
1037 real(real64) :: factor, aa
1038 integer :: iorb, ip, ii, ll, mm, ispin
1039 type(
ps_t),
pointer :: ps
1040 logical :: use_stored_orbitals
1046 use_stored_orbitals = ions%atom(iatom)%species%is_ps() &
1048 .and. st%d%dim == 1 .and. .not. ions%space%is_periodic()
1052 if (use_stored_orbitals)
then
1054 assert(.not. ions%space%is_periodic())
1056 select type(spec=>ions%atom(iatom)%species)
1063 if (.not. this%alternative)
then
1066 safe_allocate(dorbital(1:mesh%np, 1:st%d%dim))
1068 safe_allocate(zorbital(1:mesh%np, 1:st%d%dim))
1071 do iorb = 1, this%norbs
1072 if (iatom /= this%atom(iorb)) cycle
1074 call ions%atom(iatom)%species%get_iwf_ilm(this%level(iorb), 1, ii, ll, mm)
1075 factor = ps%conf%occ(ii, 1)/(
m_two*ll +
m_one)
1078 call dget_ao(this, st, mesh, ions, iorb, 1, dorbital, use_psi = .
true.)
1081 rho(ip, 1) = rho(ip, 1) + factor*dorbital(ip, 1)**2
1084 call zget_ao(this, st, mesh, ions, iorb, 1, zorbital, use_psi = .
true.)
1087 rho(ip, 1) = rho(ip, 1) + factor*abs(zorbital(ip, 1))**2
1093 safe_deallocate_a(dorbital)
1094 safe_deallocate_a(zorbital)
1102 safe_allocate(factors(1:this%norb_atom(iatom)/this%mult))
1104 do iorb = 1, this%norb_atom(iatom)/this%mult
1105 call ions%atom(iatom)%species%get_iwf_ilm(iorb, 1, ii, ll, mm)
1106 factors(iorb) = ps%conf%occ(ii, 1)/(
m_two*ll +
m_one)
1110 do ip = 1, this%sphere(iatom)%np
1112 do iorb = 1, this%norb_atom(iatom)/this%mult
1113 aa = aa + factors(iorb)*this%orbitals(iatom)%dff_linear(ip, iorb)**2
1115 rho(this%sphere(iatom)%map(ip), 1) = rho(this%sphere(iatom)%map(ip), 1) + aa
1118 safe_deallocate_a(factors)
1124 ions%pos(:, iatom), mesh, spin_channels, rho)
1129 do ispin = 1, spin_channels
1132 rho(ip, ispin) = max(rho(ip, ispin),
m_zero)
1142 type(
lcao_t),
intent(inout) :: this
1145 type(
grid_t),
intent(in) :: gr
1147 type(
ions_t),
intent(in) :: ions
1148 real(real64),
intent(in) :: qtot
1149 integer,
intent(in) :: ispin
1150 real(real64),
contiguous,
intent(out) :: rho(:, :)
1152 integer :: ia, is, idir, ip, m_dim
1155 real(real64) :: rr, rnd, phi, theta, lmag, n1, n2
1156 real(real64),
allocatable :: atom_rho(:,:), mag(:,:)
1157 real(real64),
parameter :: tol_min_mag = 1.0e-20_real64
1161 if (st%d%spin_channels == 1)
then
1162 this%gmd_opt = initrho_paramagnetic
1195 message(1) =
"GuessMagnetDensity cannot be used for Hartree-Fock and generalized Kohn-Sham calculation."
1196 message(2) =
"Please perform a LDA or GGA calculation first and restart from this calculation."
1220 if (
parse_block(namespace,
'AtomsMagnetDirection', blk) < 0)
then
1221 message(1) =
"AtomsMagnetDirection block is not defined."
1226 message(1) =
"The number of rows in the AtomsMagnetDirection block does not equal the number of atoms."
1236 safe_allocate(mag(1:m_dim, 1:ions%natoms))
1237 do ia = 1, ions%natoms
1241 if (abs(mag(idir, ia)) < tol_min_mag) mag(idir, ia) =
m_zero
1249 safe_allocate(atom_rho(1:gr%np, 1:st%d%spin_channels))
1250 select case (this%gmd_opt)
1251 case (initrho_paramagnetic)
1252 do ia = ions%atoms_dist%start, ions%atoms_dist%end
1257 if (st%d%spin_channels == 2)
then
1260 rho(ip, 1) =
m_half*(rho(ip, 1) + rho(ip, 2))
1261 rho(ip, 2) = rho(ip, 1)
1266 do ia = ions%atoms_dist%start, ions%atoms_dist%end
1268 rho(1:gr%np, 1:2) = rho(1:gr%np, 1:2) + atom_rho(1:gr%np, 1:2)
1272 do ia = ions%atoms_dist%start, ions%atoms_dist%end
1287 call lalg_axpy(gr%np, (lmag - n1 + n2)/
m_two/n2, atom_rho(:, 2), atom_rho(:, 1))
1296 rho(1:gr%np, 1:2) = rho(1:gr%np, 1:2) + atom_rho(1:gr%np, 1:2)
1298 rho(1:gr%np, 1) = rho(1:gr%np, 1) + atom_rho(1:gr%np, 2)
1299 rho(1:gr%np, 2) = rho(1:gr%np, 2) + atom_rho(1:gr%np, 1)
1301 elseif (ispin ==
spinors)
then
1312 do ia = ions%atoms_dist%start, ions%atoms_dist%end
1320 lmag = norm2(mag(:, ia))
1321 if (lmag > n1 + n2)
then
1322 mag = mag*(n1 + n2)/lmag
1330 atom_rho(ip, 1) =
m_half*(atom_rho(ip, 1) + atom_rho(ip, 2))
1331 rho(ip, 1) = rho(ip, 1) + atom_rho(ip, 1)
1332 rho(ip, 2) = rho(ip, 2) + atom_rho(ip, 1)
1339 if (n1 - n2 < lmag)
then
1340 call lalg_axpy(gr%np, (lmag - n1 + n2)/
m_two/n2, atom_rho(:, 2), atom_rho(:, 1))
1342 elseif (n1 - n2 > lmag)
then
1343 call lalg_axpy(gr%np, (n1 - n2 - lmag)/
m_two/n1, atom_rho(:, 1), atom_rho(:, 2))
1351 if (mag(1, ia) >
m_zero)
then
1358 elseif (ispin ==
spinors)
then
1368 if (ions%atoms_dist%parallel)
then
1369 do is = 1, st%d%nspin
1370 call lalg_copy(gr%np, rho(:,is), atom_rho(:,1))
1371 call ions%atoms_dist%mpi_grp%allreduce(atom_rho(1, 1), rho(1, is), gr%np, mpi_double_precision, mpi_sum)
1377 write(
message(1),
'(a,f13.6)')
'Info: Unnormalized total charge = ', rr
1382 call lalg_scal(gr%np, st%d%nspin, qtot/rr, rho)
1384 write(
message(1),
'(a,f13.6)')
'Info: Renormalized total charge = ', rr
1389 if (st%symmetrize_density)
then
1390 do is = 1, st%d%nspin
1395 safe_deallocate_a(atom_rho)
1396 safe_deallocate_a(mag)
1402 real(real64) function integrated_charge_density(gr, st, rho) result(rr)
1403 type(
grid_t),
intent(in) :: gr
1405 real(real64),
intent(in) :: rho(:,:)
1410 do is = 1, st%d%spin_channels
1414 call gr%allreduce(rr)
1419 class(mesh_t),
intent(in) :: mesh
1420 real(real64),
intent(inout) :: rho(:,:)
1421 real(real64),
intent(in) :: atom_rho(:,:)
1422 real(real64),
intent(in) :: theta, phi
1425 real(real64) :: half_theta
1429 half_theta = m_half * theta
1433 rho(ip, 1) = rho(ip, 1) +
cos(half_theta)**2*atom_rho(ip, 1) +
sin(half_theta)**2*atom_rho(ip, 2)
1434 rho(ip, 2) = rho(ip, 2) +
sin(half_theta)**2*atom_rho(ip, 1) +
cos(half_theta)**2*atom_rho(ip, 2)
1435 rho(ip, 3) = rho(ip, 3) +
cos(half_theta)*
sin(half_theta)*
cos(phi)*(atom_rho(ip, 1)-atom_rho(ip, 2))
1436 rho(ip, 4) = rho(ip, 4) -
cos(half_theta)*
sin(half_theta)*
sin(phi)*(atom_rho(ip, 1)-atom_rho(ip, 2))
1445 type(
lcao_t),
intent(inout) :: this
1446 type(namespace_t),
intent(in) :: namespace
1447 type(states_elec_t),
intent(inout) :: st
1448 type(grid_t),
intent(in) :: gr
1449 type(ions_t),
intent(in) :: ions
1450 integer,
optional,
intent(in) :: start
1456 if (.not. this%alternative)
then
1457 if (states_are_real(st))
then
1463 if (states_are_real(st))
then
1476 real(real64),
intent(in) :: mag(:)
1477 real(real64),
intent(in) :: lmag
1478 real(real64),
intent(out) :: theta
1479 real(real64),
intent(out) :: phi
1483 assert(lmag > m_zero)
1485 theta =
acos(mag(3)/lmag)
1487 if (abs(mag(1)) <= m_epsilon)
then
1488 if (abs(mag(2)) <= m_epsilon)
then
1490 elseif (mag(2) < m_zero)
then
1491 phi = m_pi*m_three*m_half
1497 arg = mag(1)/
sin(theta)/lmag
1498 if (abs(arg) > m_one) arg = sign(m_one, arg)
1501 if (mag(2) < m_zero)
then
1502 phi = m_two*m_pi - phi
1516 type(states_elec_t),
intent(inout) :: st
1517 type(grid_t),
intent(in) :: gr
1518 integer,
intent(in) :: rel_type
1519 integer,
intent(in) :: ist_start
1520 integer,
intent(in) :: gmd_opt
1522 integer :: ik, ist, ip
1523 real(real64),
allocatable :: md(:,:), up(:)
1524 complex(real64),
allocatable :: down(:), psi(:,:)
1525 real(real64) :: lmag, theta, phi, norm, mm(3)
1527 if (st%d%ispin /= spinors)
return
1532 safe_allocate(psi(1:gr%np, 1:st%d%dim))
1534 select case (gmd_opt)
1537 do ik = st%d%kpt%start, st%d%kpt%end
1538 do ist = ist_start, st%st_end
1539 call states_elec_get_state(st, gr, ist, ik, psi)
1542 psi(ip, 1) = psi(ip, 1) + psi(ip, 2)
1543 psi(ip, 2) = psi(ip, 1)
1545 call zmf_normalize(gr, st%d%dim, psi)
1546 call states_elec_set_state(st, gr, ist, ik, psi)
1552 do ik = st%d%kpt%start, st%d%kpt%end
1553 do ist = ist_start, st%st_end
1554 call states_elec_get_state(st, gr, ist, ik, psi)
1557 psi(ip, 1) = psi(ip, 1) + psi(ip, 2)
1560 call zmf_normalize(gr, st%d%dim, psi)
1561 call states_elec_set_state(st, gr, ist, ik, psi)
1567 safe_allocate(md(1:gr%np, 1:3))
1568 safe_allocate(up(1:gr%np))
1569 safe_allocate(down(1:gr%np))
1570 call magnetic_density(gr, st%d, st%rho, md)
1572 mm(1) = dmf_integrate(gr, md(:, 1), reduce = .false.)
1573 mm(2) = dmf_integrate(gr, md(:, 2), reduce = .false.)
1574 mm(3) = dmf_integrate(gr, md(:, 3), reduce = .false.)
1576 if (gr%parallel_in_domains)
then
1577 call gr%allreduce(mm)
1583 if (lmag > 1.0e-2_real64)
then
1585 up(:) =
cos(theta/m_two)
1586 down(:) =
exp(-m_zi * phi) *
sin(theta/m_two)
1593 lmag = norm2(md(ip, 1:3))
1595 up(ip) =
cos(theta/m_two)
1596 down(ip) =
exp(-m_zi * phi) *
sin(theta/m_two)
1598 safe_deallocate_a(md)
1602 do ik = st%d%kpt%start, st%d%kpt%end
1603 do ist = ist_start, st%st_end
1604 call states_elec_get_state(st, gr, ist, ik, psi)
1605 call zmf_normalize(gr, st%d%dim, psi)
1608 norm =
sqrt(real(psi(ip, 1)*conjg(psi(ip, 1)) + psi(ip, 2)*conjg(psi(ip, 2))))
1609 psi(ip, 1) = norm * up(ip)
1610 psi(ip, 2) = norm * down(ip)
1612 call states_elec_set_state(st, gr, ist, ik, psi)
1615 safe_deallocate_a(up)
1616 safe_deallocate_a(down)
1619 safe_deallocate_a(psi)
1626#include "lcao_inc.F90"
1629#include "complex.F90"
1630#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 exp(double __x) __attribute__((__nothrow__
double sin(double __x) __attribute__((__nothrow__
double sqrt(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
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
subroutine get_angles_from_magnetization(mag, lmag, theta, phi)
Given a magnetization vector, and its norm, this returns the corresponding inclination and azimuthal ...
integer, parameter initrho_random
subroutine rotate_random_states_to_local_frame(st, gr, rel_type, ist_start, gmd_opt)
Rotate the spinors with band index >= ist_start to the local frame of the magnetization.
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.
integer, parameter initrho_paramagnetic
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.