38 use,
intrinsic :: iso_fortran_env
91 logical :: complex_ylms
92 logical :: initialized
95 integer,
allocatable :: atom(:)
96 integer,
allocatable :: level(:)
97 integer,
allocatable :: ddim(:)
98 logical :: alternative
100 integer,
allocatable :: cst(:, :)
101 integer,
allocatable :: ck(:, :)
102 real(4),
allocatable :: dbuff_single(:, :, :, :)
103 complex(4),
allocatable :: zbuff_single(:, :, :, :)
104 real(real64),
allocatable :: dbuff(:, :, :, :)
105 complex(real64),
allocatable :: zbuff(:, :, :, :)
106 logical :: save_memory
107 logical :: initialized_orbitals
108 real(real64) :: orbital_scale_factor
111 logical,
allocatable :: is_empty(:)
117 real(real64),
allocatable :: radius(:)
118 real(real64) :: lapdist
122 integer,
allocatable :: basis_atom(:)
123 integer,
allocatable :: basis_orb(:)
124 integer,
allocatable :: atom_orb_basis(:, :)
125 integer,
allocatable :: norb_atom(:)
127 integer :: lsize(1:2)
128 integer :: nproc(1:2)
129 integer :: myroc(1:2)
130 integer :: desc(1:BLACS_DLEN)
131 logical,
allocatable :: calc_atom(:)
132 real(real64) :: diag_tol
133 type(submesh_t),
allocatable :: sphere(:)
134 type(batch_t),
allocatable :: orbitals(:)
135 logical,
allocatable :: is_orbital_initialized(:)
139 integer,
parameter :: &
140 INITRHO_PARAMAGNETIC = 1, &
148 subroutine lcao_init(this, namespace, space, gr, ions, st)
149 type(lcao_t),
intent(out) :: this
150 type(namespace_t),
intent(in) :: namespace
151 type(electron_space_t),
intent(in) :: space
152 type(grid_t),
intent(in) :: gr
153 type(ions_t),
intent(in) :: ions
154 type(states_elec_t),
intent(in) :: st
156 integer :: ia, n, iorb, jj, maxj, idim
157 integer :: ii, ll, mm, norbs, ii_tmp
158 integer :: mode_default
159 real(real64) :: max_orb_radius, maxradius
164 this%initialized = .
true.
168 mode_default = option__lcaostart__lcao_states
169 if (ions%only_user_def) mode_default = option__lcaostart__lcao_none
222 this%alternative = this%mode == option__lcaostart__lcao_states_batch
224 if (this%mode == option__lcaostart__lcao_none)
then
234 if (st%d%ispin ==
spinors .and. this%alternative)
then
235 message(1) =
"LCAOStart = lcao_states_batch is not working for spinors."
238 if (space%is_periodic() .and. this%alternative)
then
256 call parse_variable(namespace,
'LCAOComplexYlms', .false., this%complex_ylms)
258 this%complex_ylms = .false.
269 call parse_variable(namespace,
'LCAOSaveMemory', .false., this%save_memory)
273 call io_mkdir(
'debug/lcao', namespace)
274 iunit_o =
io_open(
'debug/lcao/orbitals', namespace, action=
'write')
275 write(iunit_o,
'(7a6)')
'iorb',
'atom',
'level',
'i',
'l',
'm',
'spin'
278 if (.not. this%alternative)
then
299 call parse_variable(namespace,
'LCAOMaximumOrbitalRadius', 20.0_real64, max_orb_radius, unit =
units_inp%length)
305 do ia = 1, ions%natoms
306 maxj = max(maxj, ions%atom(ia)%species%get_niwfs())
307 this%maxorbs = this%maxorbs + ions%atom(ia)%species%get_niwfs()
310 this%maxorbs = this%maxorbs*st%d%dim
312 if (this%maxorbs == 0)
then
313 call messages_write(
'The are no atomic orbitals available, cannot do LCAO.')
315 this%mode = option__lcaostart__lcao_none
322 safe_allocate( this%atom(1:this%maxorbs))
323 safe_allocate(this%level(1:this%maxorbs))
324 safe_allocate( this%ddim(1:this%maxorbs))
326 safe_allocate(this%is_empty(1:this%maxorbs))
327 this%is_empty = .false.
330 this%lapdist = maxval(abs(gr%idx%enlarge)*gr%spacing)
333 safe_allocate(this%radius(1:ions%natoms))
335 do ia = 1, ions%natoms
336 norbs = ions%atom(ia)%species%get_niwfs()
340 call ions%atom(ia)%species%get_iwf_ilm(iorb, 1, ii, ll, mm)
342 if(ions%atom(ia)%species%is_full())
call ions%atom(ia)%species%get_iwf_n( iorb, 1, ii)
343 maxradius = max(maxradius, ions%atom(ia)%species%get_iwf_radius( ii, is = 1))
346 maxradius = min(maxradius,
m_two*maxval(gr%box%bounding_box_l(1:space%dim)))
348 this%radius(ia) = maxradius
380 do ia = 1, ions%natoms
382 if (jj > ions%atom(ia)%species%get_niwfs()) cycle
383 call ions%atom(ia)%species%get_iwf_ilm(jj, idim, ii, ll, mm)
385 if(ions%atom(ia)%species%is_full())
then
387 call ions%atom(ia)%species%get_iwf_n( ii_tmp, 1, ii)
389 if (this%orbital_scale_factor*ions%atom(ia)%species%get_iwf_radius( ii, is = 1) >= max_orb_radius) cycle
392 this%level(iorb) = jj
393 this%ddim(iorb) = idim
396 write(iunit_o,
'(7i6)') iorb, this%atom(iorb), this%level(iorb), ii, ll, mm, this%ddim(iorb)
409 if (this%maxorbs /= iorb - 1)
then
414 call messages_write(
' orbitals cannot be used for the LCAO calculation,')
416 call messages_write(
' their radii exceeds LCAOMaximumOrbitalRadius (')
421 this%maxorbs = iorb - 1
424 if (this%maxorbs < st%nst)
then
425 call messages_write(
'Cannot do LCAO for all states because there are not enough atomic orbitals.')
465 if (n > 0 .and. n <= st%nst .and. st%nst <= this%maxorbs)
then
468 else if (n > st%nst .and. n <= this%maxorbs)
then
471 else if (n == 0)
then
473 this%norbs = min(this%maxorbs, 2*st%nst)
476 this%norbs = this%maxorbs
479 assert(this%norbs <= this%maxorbs)
481 safe_allocate(this%cst(1:this%norbs, 1:st%d%spin_channels))
482 safe_allocate(this%ck(1:this%norbs, 1:st%d%spin_channels))
483 this%initialized_orbitals = .false.
493 integer :: iatom, iorb, norbs
494 real(real64) :: maxradius
497 integer :: jatom, jorb, jbasis, ilbasis, jlbasis, proc(1:2),
info, nbl
501 call messages_write(
'Info: Using LCAO alternative implementation.')
538 call parse_variable(namespace,
'LCAOExtraOrbitals', .false., this%derivative)
545 if (this%derivative)
then
548 if (st%nst * st%smear%el_per_state > st%qtot)
then
549 message(1) =
"Lower-lying empty states may be missed with LCAOExtraOrbitals."
562 call parse_variable(namespace,
'LCAODiagTol', 1e-10_real64, this%diag_tol)
564 if (this%derivative)
then
570 safe_allocate(this%sphere(1:ions%natoms))
571 safe_allocate(this%orbitals(1:ions%natoms))
572 safe_allocate(this%is_orbital_initialized(1:ions%natoms))
573 this%is_orbital_initialized = .false.
575 safe_allocate(this%norb_atom(1:ions%natoms))
579 do iatom = 1, ions%natoms
580 this%norb_atom(iatom) = this%mult*ions%atom(iatom)%species%get_niwfs()
581 this%maxorb = max(this%maxorb, ions%atom(iatom)%species%get_niwfs())
582 this%norbs = this%norbs + ions%atom(iatom)%species%get_niwfs()
585 this%maxorb = this%maxorb*this%mult
586 this%norbs = this%norbs*this%mult
588 safe_allocate(this%basis_atom(1:this%norbs))
589 safe_allocate(this%basis_orb(1:this%norbs))
590 safe_allocate(this%atom_orb_basis(1:ions%natoms, 1:this%maxorb))
595 do iatom = 1, ions%natoms
596 norbs = ions%atom(iatom)%species%get_niwfs()
598 do iorb = 1, this%mult*norbs
600 this%atom_orb_basis(iatom, iorb) = ibasis
601 this%basis_atom(ibasis) = iatom
602 this%basis_orb(ibasis) = iorb
606 call ions%atom(iatom)%species%get_iwf_ilm(iorb, 1, ii, ll, mm)
607 write(iunit_o,
'(7i6)') ibasis, iatom, iorb, ii, ll, mm, 1
617 this%lapdist = maxval(abs(gr%idx%enlarge)*gr%spacing)
620 safe_allocate(this%radius(1:ions%natoms))
622 do iatom = 1, ions%natoms
623 norbs = ions%atom(iatom)%species%get_niwfs()
627 call ions%atom(iatom)%species%get_iwf_ilm(iorb, 1, ii, ll, mm)
629 if(ions%atom(iatom)%species%is_full())
call ions%atom(iatom)%species%get_iwf_n( iorb, 1, ii)
630 maxradius = max(maxradius, ions%atom(iatom)%species%get_iwf_radius( ii, is = 1))
633 if (this%derivative) maxradius = maxradius + this%lapdist
635 maxradius = min(maxradius,
m_two*maxval(gr%box%bounding_box_l(1:space%dim)))
637 this%radius(iatom) = maxradius
640 safe_allocate(this%calc_atom(1:ions%natoms))
641 this%calc_atom = .
true.
644#ifndef HAVE_SCALAPACK
645 this%parallel = .false.
647 this%parallel = (st%parallel_in_states .or. gr%parallel_in_domains) &
650 if (this%parallel)
then
651 nbl = min(16, this%norbs)
654 this%lsize(1) = max(1,
numroc(this%norbs, nbl, st%dom_st_proc_grid%myrow, 0, st%dom_st_proc_grid%nprow))
655 this%lsize(2) = max(1,
numroc(this%norbs, nbl, st%dom_st_proc_grid%mycol, 0, st%dom_st_proc_grid%npcol))
657 this%nproc(1) = st%dom_st_proc_grid%nprow
658 this%nproc(2) = st%dom_st_proc_grid%npcol
659 this%myroc(1) = st%dom_st_proc_grid%myrow
660 this%myroc(2) = st%dom_st_proc_grid%mycol
662 call descinit(this%desc(1), this%norbs, this%norbs, nbl, nbl, 0, 0, &
663 st%dom_st_proc_grid%context, this%lsize(1),
info)
666 write(
message(1),
'(a,i6)')
'descinit for BLACS failed with error code ',
info
670 this%calc_atom = .false.
671 do iatom = 1, ions%natoms
672 ibasis = this%atom_orb_basis(iatom, 1)
674 do jatom = 1, ions%natoms
675 jbasis = this%atom_orb_basis(jatom, 1)
677 do iorb = 1, this%norb_atom(iatom)
678 do jorb = 1, this%norb_atom(jatom)
680 ilbasis, jlbasis, proc(1), proc(2))
682 this%calc_atom(this%basis_atom(jbasis)) = &
683 this%calc_atom(this%basis_atom(jbasis)) .or. proc(2) == this%myroc(2)
701 subroutine lcao_run(namespace, space, gr, ions, ext_partners, st, ks, hm, st_start, lmm_r)
704 type(
grid_t),
intent(in) :: gr
705 type(
ions_t),
intent(in) :: ions
708 type(
v_ks_t),
intent(inout) :: ks
710 integer,
optional,
intent(in) :: st_start
711 real(real64),
optional,
intent(in) :: lmm_r
714 integer :: st_start_random, required_min_nst
716 logical :: is_orbital_dependent
720 if (
present(st_start))
then
723 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
724 calc_eigenval=.not.
present(st_start), calc_current=.false.)
726 assert(st_start >= 1)
727 if (st_start > st%nst)
then
735 call lcao_init(lcao, namespace, space, gr, ions, st)
747 if (.not.
present(st_start))
then
748 call lcao_guess_density(lcao, namespace, st, gr, hm, ions, st%qtot, st%d%ispin, st%d%spin_channels, st%rho)
751 assert(
present(lmm_r))
757 message(1) =
'Info: Setting up Hamiltonian.'
761 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval=.false., &
762 calc_current=.false., calc_energy=.false., force_semilocal=is_orbital_dependent)
765 st%eigenval = 1e10_real64
774 if (
present(st_start))
then
775 write(
message(1),
'(a,i8,a)')
'Performing LCAO for states ', st_start,
' and above'
779 call lcao_wf(lcao, st, gr, ions, hm, namespace, start = st_start)
785 select case (st%d%ispin)
787 required_min_nst = int(st%qtot/2)
789 required_min_nst = int(st%qtot/2)
791 required_min_nst = int(st%qtot)
794 if (lcao%norbs <= required_min_nst .and. lcao%norbs < st%nst)
then
795 st%eigenval(lcao%norbs+1:,:) =
m_zero
799 if (.not.
present(st_start))
then
804 if (lcao%mode == option__lcaostart__lcao_full)
then
805 call v_ks_h_setup(namespace, space, gr, ions, ext_partners, st, ks, hm, &
806 calc_eigenval = .false., calc_current=.false.)
808 assert(
present(lmm_r))
815 if (.not. lcao_done .or. lcao%norbs < st%nst)
then
818 st_start_random = lcao%norbs + 1
822 if (
present(st_start)) st_start_random = max(st_start, st_start_random)
824 if (st_start_random > 1)
then
825 write(
message(1),
'(a,i8,a)')
'Generating random wavefunctions for states ', st_start_random,
' and above'
836 if (.not. lcao_done)
then
839 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
840 calc_eigenval=.not.
present(st_start), calc_current=.false.)
841 if (.not.
present(st_start))
then
847 else if (
present(st_start))
then
849 if (st_start > 1)
then
866 type(
lcao_t),
intent(inout) :: this
870 safe_deallocate_a(this%calc_atom)
871 safe_deallocate_a(this%norb_atom)
872 safe_deallocate_a(this%basis_atom)
873 safe_deallocate_a(this%basis_orb)
874 safe_deallocate_a(this%atom_orb_basis)
875 safe_deallocate_a(this%radius)
876 safe_deallocate_a(this%sphere)
877 safe_deallocate_a(this%orbitals)
879 safe_deallocate_a(this%atom)
880 safe_deallocate_a(this%level)
881 safe_deallocate_a(this%ddim)
882 safe_deallocate_a(this%cst)
883 safe_deallocate_a(this%ck)
884 safe_deallocate_a(this%dbuff_single)
885 safe_deallocate_a(this%zbuff_single)
886 safe_deallocate_a(this%dbuff)
887 safe_deallocate_a(this%zbuff)
889 this%initialized = .false.
895 subroutine lcao_wf(this, st, gr, ions, hm, namespace, start)
896 type(
lcao_t),
intent(inout) :: this
898 type(
grid_t),
intent(in) :: gr
899 type(
ions_t),
intent(in) :: ions
902 integer,
optional,
intent(in) :: start
906 assert(this%initialized)
912 if (
present(start)) start_ = start
914 if (this%alternative)
then
916 call dlcao_alt_wf(this, st, gr, ions, hm, namespace, start_)
918 call zlcao_alt_wf(this, st, gr, ions, hm, namespace, start_)
922 call dlcao_wf(this, st, gr, ions, hm, namespace, start_)
924 call zlcao_wf(this, st, gr, ions, hm, namespace, start_)
934 type(
lcao_t),
intent(in) :: this
938 available = this%initialized .and. this%mode /= option__lcaostart__lcao_none
946 type(
lcao_t),
intent(in) :: this
957 type(
lcao_t),
intent(in) :: this
958 integer,
intent(in) :: ig
959 integer,
intent(in) :: jg
960 integer,
intent(out) :: il
961 integer,
intent(out) :: jl
962 integer,
intent(out) :: prow
963 integer,
intent(out) :: pcol
967 call infog2l(ig, jg, this%desc(1), this%nproc(1), this%nproc(2), this%myroc(1), this%myroc(2), &
984 type(
lcao_t),
intent(inout) :: this
985 integer,
intent(in) :: iatom
989 if (this%is_orbital_initialized(iatom))
then
990 call this%orbitals(iatom)%end()
991 this%is_orbital_initialized(iatom) = .false.
1001 type(
lcao_t),
intent(inout) :: this
1003 class(
mesh_t),
intent(in) :: mesh
1004 type(
ions_t),
target,
intent(in) :: ions
1005 integer,
intent(in) :: iatom
1006 integer,
intent(in) :: spin_channels
1007 real(real64),
intent(inout) :: rho(:, :)
1009 real(real64),
allocatable :: dorbital(:, :)
1010 complex(real64),
allocatable :: zorbital(:, :)
1011 real(real64),
allocatable :: factors(:)
1012 real(real64) :: factor, aa
1013 integer :: iorb, ip, ii, ll, mm, ispin
1014 type(
ps_t),
pointer :: ps
1015 logical :: use_stored_orbitals
1021 use_stored_orbitals = ions%atom(iatom)%species%is_ps() &
1023 .and. st%d%dim == 1 .and. .not. ions%space%is_periodic()
1027 if (use_stored_orbitals)
then
1029 assert(.not. ions%space%is_periodic())
1031 select type(spec=>ions%atom(iatom)%species)
1038 if (.not. this%alternative)
then
1041 safe_allocate(dorbital(1:mesh%np, 1:st%d%dim))
1043 safe_allocate(zorbital(1:mesh%np, 1:st%d%dim))
1046 do iorb = 1, this%norbs
1047 if (iatom /= this%atom(iorb)) cycle
1049 call ions%atom(iatom)%species%get_iwf_ilm(this%level(iorb), 1, ii, ll, mm)
1050 factor = ps%conf%occ(ii, 1)/(
m_two*ll +
m_one)
1053 call dget_ao(this, st, mesh, ions, iorb, 1, dorbital, use_psi = .
true.)
1056 rho(ip, 1) = rho(ip, 1) + factor*dorbital(ip, 1)**2
1059 call zget_ao(this, st, mesh, ions, iorb, 1, zorbital, use_psi = .
true.)
1062 rho(ip, 1) = rho(ip, 1) + factor*abs(zorbital(ip, 1))**2
1068 safe_deallocate_a(dorbital)
1069 safe_deallocate_a(zorbital)
1077 safe_allocate(factors(1:this%norb_atom(iatom)/this%mult))
1079 do iorb = 1, this%norb_atom(iatom)/this%mult
1080 call ions%atom(iatom)%species%get_iwf_ilm(iorb, 1, ii, ll, mm)
1081 factors(iorb) = ps%conf%occ(ii, 1)/(
m_two*ll +
m_one)
1085 do ip = 1, this%sphere(iatom)%np
1087 do iorb = 1, this%norb_atom(iatom)/this%mult
1088 aa = aa + factors(iorb)*this%orbitals(iatom)%dff_linear(ip, iorb)**2
1090 rho(this%sphere(iatom)%map(ip), 1) = rho(this%sphere(iatom)%map(ip), 1) + aa
1093 safe_deallocate_a(factors)
1099 ions%pos(:, iatom), mesh, spin_channels, rho)
1104 do ispin = 1, spin_channels
1107 rho(ip, ispin) = max(rho(ip, ispin),
m_zero)
1116 subroutine lcao_guess_density(this, namespace, st, gr, hm, ions, qtot, ispin, spin_channels, rho)
1117 type(
lcao_t),
intent(inout) :: this
1120 type(
grid_t),
intent(in) :: gr
1122 type(
ions_t),
intent(in) :: ions
1123 real(real64),
intent(in) :: qtot
1124 integer,
intent(in) :: ispin, spin_channels
1125 real(real64),
contiguous,
intent(out) :: rho(:, :)
1127 integer :: ia, is, idir, gmd_opt, ip
1130 real(real64) :: rr, rnd, phi, theta, mag(1:3), lmag, n1, n2,arg
1131 real(real64),
allocatable :: atom_rho(:,:)
1132 logical :: parallelized_in_atoms
1136 parallelized_in_atoms = .false.
1138 if (spin_channels == 1)
then
1139 gmd_opt = initrho_paramagnetic
1172 message(1) =
"GuessMagnetDensity cannot be used for Hartree-Fock and generalized Kohn-Sham calculation."
1173 message(2) =
"Please perform a LDA or GGA calculation first and restart from this calculation."
1178 select case (gmd_opt)
1179 case (initrho_paramagnetic)
1180 safe_allocate(atom_rho(1:gr%np, 1:spin_channels))
1182 parallelized_in_atoms = .
true.
1184 do ia = ions%atoms_dist%start, ions%atoms_dist%end
1189 if (spin_channels == 2)
then
1192 rho(ip, 1) =
m_half*(rho(ip, 1) + rho(ip, 2))
1193 rho(ip, 2) = rho(ip, 1)
1198 safe_allocate(atom_rho(1:gr%np, 1:2))
1200 parallelized_in_atoms = .
true.
1203 do ia = ions%atoms_dist%start, ions%atoms_dist%end
1205 rho(1:gr%np, 1:2) = rho(1:gr%np, 1:2) + atom_rho(1:gr%np, 1:2)
1209 safe_allocate(atom_rho(1:gr%np, 1:2))
1210 do ia = 1, ions%natoms
1217 rho(1:gr%np, 1:2) = rho(1:gr%np, 1:2) + atom_rho(1:gr%np, 1:2)
1219 rho(1:gr%np, 1) = rho(1:gr%np, 1) + atom_rho(1:gr%np, 2)
1220 rho(1:gr%np, 2) = rho(1:gr%np, 2) + atom_rho(1:gr%np, 1)
1222 elseif (ispin ==
spinors)
then
1253 if (
parse_block(namespace,
'AtomsMagnetDirection', blk) < 0)
then
1254 message(1) =
"AtomsMagnetDirection block is not defined."
1259 message(1) =
"AtomsMagnetDirection block has the wrong number of rows."
1263 safe_allocate(atom_rho(1:gr%np, 1:2))
1264 do ia = 1, ions%natoms
1270 elseif (ispin ==
spinors)
then
1273 if (abs(mag(idir)) < 1.0e-20_real64) mag(idir) =
m_zero
1275 lmag = norm2(mag(1:3))
1285 if (lmag > n1 + n2)
then
1286 mag = mag*(n1 + n2)/lmag
1294 atom_rho(ip, 1) =
m_half*(atom_rho(ip, 1) + atom_rho(ip, 2))
1295 rho(ip, 1) = rho(ip, 1) + atom_rho(ip, 1)
1296 rho(ip, 2) = rho(ip, 2) + atom_rho(ip, 1)
1303 if (n1 - n2 < lmag)
then
1304 call lalg_axpy(gr%np, (lmag - n1 + n2)/
m_two/n2, atom_rho(:, 2), atom_rho(:, 1))
1306 elseif (n1 - n2 > lmag)
then
1307 call lalg_axpy(gr%np, (n1 - n2 - lmag)/
m_two/n1, atom_rho(:, 1), atom_rho(:, 2))
1315 if (mag(1) >
m_zero)
then
1322 elseif (ispin ==
spinors)
then
1324 theta =
acos(mag(3)/lmag)
1328 elseif (mag(2) <
m_zero)
then
1330 elseif (mag(2) >
m_zero)
then
1335 arg = mag(1)/
sin(theta)/lmag
1338 if (mag(2) <
m_zero)
then
1352 if (ions%atoms_dist%parallel .and. parallelized_in_atoms)
then
1354 do is = 1, spin_channels
1355 call lalg_copy(gr%np, rho(:,is), atom_rho(:,1))
1356 call ions%atoms_dist%mpi_grp%allreduce(atom_rho(1, 1), rho(1, is), gr%np, mpi_double_precision, mpi_sum)
1362 do is = 1, spin_channels
1365 if (gr%parallel_in_domains)
then
1366 call gr%allreduce(rr)
1369 write(
message(1),
'(a,f13.6)')
'Info: Unnormalized total charge = ', rr
1377 do is = 1, spin_channels
1380 if (gr%parallel_in_domains)
then
1381 call gr%allreduce(rr)
1384 write(
message(1),
'(a,f13.6)')
'Info: Renormalized total charge = ', rr
1387 if (st%symmetrize_density)
then
1388 do is = 1, st%d%nspin
1393 safe_deallocate_a(atom_rho)
1399 class(
mesh_t),
intent(in) :: mesh
1400 real(real64),
intent(inout) :: rho(:,:)
1401 real(real64),
intent(in) :: atom_rho(:,:)
1402 real(real64),
intent(in) :: theta, phi
1410 rho(ip, 1) = rho(ip, 1) +
cos(theta)**2*atom_rho(ip, 1) +
sin(theta)**2*atom_rho(ip, 2)
1411 rho(ip, 2) = rho(ip, 2) +
sin(theta)**2*atom_rho(ip, 1) +
cos(theta)**2*atom_rho(ip, 2)
1412 rho(ip, 3) = rho(ip, 3) +
cos(theta)*
sin(theta)*
cos(phi)*(atom_rho(ip, 1)-atom_rho(ip, 2))
1413 rho(ip, 4) = rho(ip, 4) -
cos(theta)*
sin(theta)*
sin(phi)*(atom_rho(ip, 1)-atom_rho(ip, 2))
1422 type(
lcao_t),
intent(inout) :: this
1425 type(
grid_t),
intent(in) :: gr
1426 type(
ions_t),
intent(in) :: ions
1427 integer,
optional,
intent(in) :: start
1433 if (.not. this%alternative)
then
1453#include "lcao_inc.F90"
1456#include "complex.F90"
1457#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)
integer, parameter, public generalized_kohn_sham_dft
integer, parameter, public hartree
integer, parameter, public hartree_fock
integer, parameter, public kohn_sham_dft
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)
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, public lcao_init(this, namespace, space, gr, ions, st)
subroutine zlcao_wf(this, st, gr, ions, hm, namespace, start)
subroutine dlcao_alt_wf(this, st, gr, ions, hm, namespace, start)
The alternative implementation.
subroutine lcao_guess_density(this, namespace, st, gr, hm, ions, qtot, ispin, spin_channels, rho)
builds a density which is the sum of the atomic densities
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)
subroutine dinit_orbitals(this, namespace, st, gr, ions, start)
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 accumulate_rotated_density(mesh, rho, atom_rho, theta, phi)
integer, parameter initrho_ferromagnetic
logical function, public lcao_is_available(this)
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.
real(real64) function, public dmf_integrate(mesh, ff, mask, reduce)
Integrate a function on the mesh.
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.
The states_elec_t class contains all electronic wave functions.