37 use,
intrinsic :: iso_fortran_env
109 real(real64) :: total(3,3) =
m_zero
110 real(real64) :: kinetic(3,3) =
m_zero
111 real(real64) :: Hartree(3,3) =
m_zero
112 real(real64) :: xc(3,3) =
m_zero
114 real(real64) :: ps_nl(3,3) =
m_zero
115 real(real64) :: ion_ion(3,3) =
m_zero
116 real(real64) :: vdw(3,3) =
m_zero
117 real(real64) :: hubbard(3,3) =
m_zero
119 real(real64) :: kinetic_sumrule
120 real(real64) :: hartree_sumrule
135 type(states_elec_dim_t) :: d
138 logical :: only_userdef_istates
140 type(states_elec_group_t) :: group
141 integer :: block_size
145 logical :: pack_states
151 character(len=1024),
allocatable :: user_def_states(:,:,:)
157 real(real64),
allocatable :: rho(:,:)
158 real(real64),
allocatable :: rho_core(:)
160 real(real64),
allocatable :: current(:, :, :)
161 real(real64),
allocatable :: current_para(:, :, :)
162 real(real64),
allocatable :: current_dia(:, :, :)
163 real(real64),
allocatable :: current_mag(:, :, :)
164 real(real64),
allocatable :: current_kpt(:,:,:)
169 real(real64),
allocatable :: frozen_rho(:, :)
170 real(real64),
allocatable :: frozen_tau(:, :)
171 real(real64),
allocatable :: frozen_gdens(:,:,:)
172 real(real64),
allocatable :: frozen_ldens(:,:)
174 logical :: uniform_occ
176 real(real64),
allocatable :: eigenval(:,:)
178 logical :: restart_fixed_occ
179 logical :: restart_reorder_occs
180 real(real64),
allocatable :: occ(:,:)
181 real(real64),
allocatable :: kweights(:)
184 logical,
private :: fixed_spins
186 real(real64),
allocatable :: spin(:, :, :)
189 real(real64) :: val_charge
191 type(stress_t) :: stress_tensors
193 logical :: fromScratch
194 type(smear_t) :: smear
197 type(modelmb_particle_t) :: modelmbparticles
201 type(mpi_grp_t) :: mpi_grp
208 logical :: scalapack_compatible
209 logical :: parallel_in_states = .false.
213 integer :: st_start, st_end
214 integer,
allocatable :: node(:)
217 integer,
allocatable :: st_kpt_task(:,:)
220 logical :: symmetrize_density
221 integer :: randomization
222 integer :: orth_method = 0
224 real(real64) :: cl_states_mem
236 integer,
public,
parameter :: &
280 real(real64),
intent(in) :: valence_charge
283 real(real64) :: excess_charge, nempty_percent
284 integer :: nempty, ntot, default
285 integer :: nempty_conv
287 real(real64),
parameter :: tol = 1e-13_real64
291 st%fromScratch = .
true.
296 st%d%ispin = space%ispin
301 if (st%d%ispin /=
unpolarized .and. kpoints%use_time_reversal)
then
302 message(1) =
"Time reversal symmetry is only implemented for unpolarized spins."
303 message(2) =
"Use KPointsUseTimeReversal = no."
335 write(
message(1),
'(a,i5,a)')
"Input: '", ntot,
"' is not a valid value for TotalStates."
357 write(
message(1),
'(a,i5,a)')
"Input: '", nempty,
"' is not a valid value for ExtraStates."
358 message(2) =
'(0 <= ExtraStates)'
362 if (ntot > 0 .and. nempty > 0)
then
363 message(1) =
'You cannot set TotalStates and ExtraStates at the same time.'
378 if (nempty_percent < 0)
then
379 write(
message(1),
'(a,f8.6,a)')
"Input: '", nempty_percent, &
380 "' should be a percentage value x (where x is parts in hundred) larger or equal 0"
384 if (nempty > 0 .and. nempty_percent > 0)
then
385 message(1) =
'You cannot set ExtraStates and ExtraStatesInPercent at the same time.'
404 call parse_variable(namespace,
'ExtraStatesToConverge', nempty, nempty_conv)
406 write(
message(1),
'(a,i5,a)')
"Input: '", nempty_conv,
"' is not a valid value for ExtraStatesToConverge."
407 message(2) =
'(0 <= ExtraStatesToConverge)'
411 if (nempty_conv > nempty)
then
412 message(1) =
'You cannot set ExtraStatesToConverge to a higher value than ExtraStates.'
419 st%val_charge = valence_charge
421 st%qtot = -(st%val_charge + excess_charge)
424 write(
message(1),
'(a,f12.6,a)')
'Total charge = ', st%qtot,
' < 0'
425 message(2) =
'Check Species and ExcessCharge.'
429 select case (st%d%ispin)
432 st%nst = nint(st%qtot/2)
433 if (st%nst*2 - st%qtot < -tol) st%nst = st%nst + 1
435 st%d%spin_channels = 1
438 st%nst = nint(st%qtot/2)
439 if (st%nst*2 - st%qtot < -tol) st%nst = st%nst + 1
441 st%d%spin_channels = 2
444 st%nst = nint(st%qtot)
445 if (st%nst - st%qtot < -tol) st%nst = st%nst + 1
447 st%d%spin_channels = 2
451 if (ntot < st%nst)
then
452 message(1) =
'TotalStates is smaller than the number of states required by the system.'
459 if (nempty_percent > 0)
then
460 nempty = ceiling(nempty_percent * st%nst / 100)
463 st%nst_conv = st%nst + nempty_conv
464 st%nst = st%nst + nempty
465 if (st%nst == 0)
then
466 message(1) =
"Cannot run with number of states = zero."
486 default = max(
accel%warp_size, 32)
495 call parse_variable(namespace,
'StatesBlockSize', default, st%block_size)
496 if (st%block_size < 1)
then
497 call messages_write(
"The variable 'StatesBlockSize' must be greater than 0.")
501 st%block_size = min(st%block_size, st%nst)
502 conf%target_states_block_size = st%block_size
504 safe_allocate(st%eigenval(1:st%nst, 1:st%nik))
505 st%eigenval = huge(st%eigenval)
509 if (.not. kpoints%gamma_only())
then
522 call parse_variable(namespace,
'OnlyUserDefinedInitialStates', .false., st%only_userdef_istates)
525 safe_allocate(st%occ (1:st%nst, 1:st%nik))
530 safe_allocate(st%user_def_states(1:st%d%dim, 1:st%nst, 1:st%nik))
532 st%user_def_states(1:st%d%dim, 1:st%nst, 1:st%nik) =
'undefined'
535 if (st%d%ispin ==
spinors)
then
536 safe_allocate(st%spin(1:3, 1:st%nst, 1:st%nik))
563 if (st%smear%photodop)
then
564 if (nempty == 0)
then
565 write(
message(1),
'(a,i5,a)')
"PhotoDoping requires to specify ExtraStates."
566 message(2) =
'(0 == ExtraStates)'
574 safe_allocate(st%node(1:st%nst))
575 st%node(1:st%nst) = 0
578 st%parallel_in_states = .false.
592 call parse_variable(namespace,
'SymmetrizeDensity', kpoints%use_symmetries, st%symmetrize_density)
622 integer,
intent(out) :: nik
623 integer,
intent(out) :: dim
624 integer,
intent(out) :: nst
625 integer,
intent(out) :: ierr
627 character(len=256) :: lines(3)
628 character(len=20) :: char
638 read(lines(1), *) char, nst
639 read(lines(2), *) char, dim
640 read(lines(3), *) char, nik
660 real(real64),
intent(in) :: excess_charge
663 integer :: ik, ist, ispin, nspin, ncols, nrows, el_per_state, icol, start_pos, spin_n
665 real(real64) :: rr, charge
666 logical :: integral_occs, unoccupied_states
667 real(real64),
allocatable :: read_occs(:, :)
668 real(real64) :: charge_in_block
681 call parse_variable(namespace,
'RestartFixedOccupations', .
true., st%restart_fixed_occ)
752 integral_occs = .
true.
754 occ_fix:
if (
parse_block(namespace,
'Occupations', blk) == 0)
then
756 st%fixed_occ = .
true.
759 if (ncols > st%nst)
then
764 if (nrows /= st%nik)
then
765 call messages_input_error(namespace,
"Occupations",
"Wrong number of rows in block Occupations.")
768 do ik = 1, st%nik - 1
771 "All rows in block Occupations must have the same number of columns.")
782 safe_allocate(read_occs(1:ncols, 1:st%nik))
788 charge_in_block = charge_in_block + read_occs(icol, ik) * st%kweights(ik)
793 select case (st%d%ispin)
802 start_pos = nint((st%qtot - charge_in_block)/spin_n)
804 if (start_pos + ncols > st%nst)
then
805 message(1) =
"To balance charge, the first column in block Occupations is taken to refer to state"
806 write(
message(2),
'(a,i6,a)')
"number ", start_pos,
" but there are too many columns for the number of states."
807 write(
message(3),
'(a,i6,a)')
"Solution: set ExtraStates = ", start_pos + ncols - st%nst
812 do ist = 1, start_pos
813 st%occ(ist, ik) = el_per_state
818 do ist = start_pos + 1, start_pos + ncols
819 st%occ(ist, ik) = read_occs(ist - start_pos, ik)
820 integral_occs = integral_occs .and. &
821 abs((st%occ(ist, ik) - el_per_state) * st%occ(ist, ik)) <=
m_epsilon
826 do ist = start_pos + ncols + 1, st%nst
833 safe_deallocate_a(read_occs)
836 st%fixed_occ = .false.
837 integral_occs = .false.
844 st%qtot = -(st%val_charge + excess_charge)
847 if (st%d%nspin == 2) nspin = 2
849 do ik = 1, st%nik, nspin
852 do ispin = ik, ik + nspin - 1
853 st%occ(ist, ispin) = min(rr, -(st%val_charge + excess_charge) - charge)
854 charge = charge + st%occ(ist, ispin)
873 if (st%fixed_occ)
then
874 call parse_variable(namespace,
'RestartReorderOccs', .false., st%restart_reorder_occs)
876 st%restart_reorder_occs = .false.
879 call smear_init(st%smear, namespace, st%d%ispin, st%fixed_occ, integral_occs, kpoints)
881 unoccupied_states = (st%d%ispin /=
spinors .and. st%nst*2 > st%qtot) .or. (st%d%ispin ==
spinors .and. st%nst > st%qtot)
884 if (.not. unoccupied_states)
then
885 call messages_write(
'Smearing needs unoccupied states (via ExtraStates or TotalStates) to be useful.')
893 charge = charge + sum(st%occ(ist, 1:st%nik) * st%kweights(1:st%nik))
895 if (abs(charge - st%qtot) > 1e-6_real64)
then
896 message(1) =
"Initial occupations do not integrate to total charge."
897 write(
message(2),
'(6x,f12.6,a,f12.6)') charge,
' != ', st%qtot
924 st%fixed_spins = .false.
925 if (st%d%ispin /=
spinors)
then
964 spin_fix:
if (
parse_block(namespace,
'InitialSpins', blk) == 0)
then
972 st%fixed_spins = .
true.
974 st%spin(:, :, i) = st%spin(:, :, 1)
987 class(
mesh_t),
intent(in) :: mesh
988 type(
type_t),
optional,
intent(in) :: wfs_type
989 logical,
optional,
intent(in) :: skip(:)
990 logical,
optional,
intent(in) :: packed
994 if (
present(wfs_type))
then
996 st%wfs_type = wfs_type
1024 type(
mesh_t),
intent(in) :: mesh
1025 logical,
optional,
intent(in) :: verbose
1026 logical,
optional,
intent(in) :: skip(:)
1027 logical,
optional,
intent(in) :: packed
1029 integer :: ib, iqn, ist, istmin, istmax
1030 logical :: same_node, verbose_, packed_
1031 integer,
allocatable :: bstart(:), bend(:)
1035 safe_allocate(bstart(1:st%nst))
1036 safe_allocate(bend(1:st%nst))
1037 safe_allocate(st%group%iblock(1:st%nst))
1046 if (
present(skip))
then
1048 if (.not. skip(ist))
then
1056 if (
present(skip))
then
1057 do ist = st%nst, istmin, -1
1058 if (.not. skip(ist))
then
1065 if (
present(skip) .and. verbose_)
then
1075 st%group%nblocks = 0
1077 do ist = istmin, istmax
1080 st%group%iblock(ist) = st%group%nblocks + 1
1083 if (st%parallel_in_states .and. ist /= istmax)
then
1086 same_node = (st%node(ist + 1) == st%node(ist))
1089 if (ib == st%block_size .or. ist == istmax .or. .not. same_node)
then
1091 st%group%nblocks = st%group%nblocks + 1
1092 bend(st%group%nblocks) = ist
1093 if (ist /= istmax) bstart(st%group%nblocks + 1) = ist + 1
1097 safe_allocate(st%group%psib(1:st%group%nblocks, st%d%kpt%start:st%d%kpt%end))
1099 safe_allocate(st%group%block_is_local(1:st%group%nblocks, 1:st%nik))
1100 st%group%block_is_local = .false.
1101 st%group%block_start = -1
1102 st%group%block_end = -2
1104 do ib = 1, st%group%nblocks
1105 if (bstart(ib) >= st%st_start .and. bend(ib) <= st%st_end)
then
1106 if (st%group%block_start == -1) st%group%block_start = ib
1107 st%group%block_end = ib
1108 do iqn = st%d%kpt%start, st%d%kpt%end
1109 st%group%block_is_local(ib, iqn) = .
true.
1112 call dwfs_elec_init(st%group%psib(ib, iqn), st%d%dim, bstart(ib), bend(ib), mesh%np_part, iqn, &
1113 special=.
true., packed=packed_)
1115 call zwfs_elec_init(st%group%psib(ib, iqn), st%d%dim, bstart(ib), bend(ib), mesh%np_part, iqn, &
1116 special=.
true., packed=packed_)
1123 safe_allocate(st%group%block_range(1:st%group%nblocks, 1:2))
1124 safe_allocate(st%group%block_size(1:st%group%nblocks))
1126 st%group%block_range(1:st%group%nblocks, 1) = bstart(1:st%group%nblocks)
1127 st%group%block_range(1:st%group%nblocks, 2) = bend(1:st%group%nblocks)
1128 st%group%block_size(1:st%group%nblocks) = bend(1:st%group%nblocks) - bstart(1:st%group%nblocks) + 1
1130 st%group%block_initialized = .
true.
1132 safe_allocate(st%group%block_node(1:st%group%nblocks, 1:st%nik))
1133 st%group%block_node = 0
1135 assert(
allocated(st%node))
1136 assert(all(st%node >= 0) .and. all(st%node < st%mpi_grp%size))
1138 do iqn = st%d%kpt%start, st%d%kpt%end
1139 do ib = st%group%block_start, st%group%block_end
1140 st%group%block_node(ib, iqn) = st%st_kpt_mpi_grp%rank
1149 do ib = 1, st%group%nblocks
1155 if (st%group%block_size(ib) > 0)
then
1185 safe_deallocate_a(bstart)
1186 safe_deallocate_a(bend)
1207 type(
grid_t),
intent(in) :: gr
1209 real(real64) :: fsize
1213 safe_allocate(st%rho(1:gr%np_part, 1:st%d%nspin))
1216 fsize = gr%np_part*8.0_real64*st%block_size
1228 class(
space_t),
intent(in) :: space
1229 class(
mesh_t),
intent(in) :: mesh
1233 if (.not.
allocated(st%current))
then
1234 safe_allocate(st%current(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1238 if (.not.
allocated(st%current_para))
then
1239 safe_allocate(st%current_para(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1243 if (.not.
allocated(st%current_dia))
then
1244 safe_allocate(st%current_dia(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1248 if (.not.
allocated(st%current_mag))
then
1249 safe_allocate(st%current_mag(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1253 if (.not.
allocated(st%current_kpt))
then
1254 safe_allocate(st%current_kpt(1:mesh%np,1:space%dim,st%d%kpt%start:st%d%kpt%end))
1333 default = option__statesorthogonalization__cholesky_serial
1334#ifdef HAVE_SCALAPACK
1336 default = option__statesorthogonalization__cholesky_parallel
1340 call parse_variable(namespace,
'StatesOrthogonalization', default, st%orth_method)
1361 call parse_variable(namespace,
'StatesCLDeviceMemory', -512.0_real64, st%cl_states_mem)
1370 subroutine states_elec_copy(stout, stin, exclude_wfns, exclude_eigenval, special)
1373 logical,
optional,
intent(in) :: exclude_wfns
1374 logical,
optional,
intent(in) :: exclude_eigenval
1375 logical,
optional,
intent(in) :: special
1377 logical :: exclude_wfns_
1386 safe_allocate_source_a(stout%kweights, stin%kweights)
1387 stout%nik = stin%nik
1391 stout%wfs_type = stin%wfs_type
1392 stout%nst = stin%nst
1393 stout%block_size = stin%block_size
1394 stout%orth_method = stin%orth_method
1396 stout%cl_states_mem = stin%cl_states_mem
1397 stout%pack_states = stin%pack_states
1399 stout%only_userdef_istates = stin%only_userdef_istates
1401 if (.not. exclude_wfns_)
then
1402 safe_allocate_source_a(stout%rho, stin%rho)
1405 stout%uniform_occ = stin%uniform_occ
1408 safe_allocate_source_a(stout%eigenval, stin%eigenval)
1409 safe_allocate_source_a(stout%occ, stin%occ)
1410 safe_allocate_source_a(stout%spin, stin%spin)
1415 stout%group%nblocks = stin%group%nblocks
1417 safe_allocate_source_a(stout%user_def_states, stin%user_def_states)
1419 safe_allocate_source_a(stout%current, stin%current)
1420 safe_allocate_source_a(stout%current_kpt, stin%current_kpt)
1421 safe_allocate_source_a(stout%rho_core, stin%rho_core)
1422 safe_allocate_source_a(stout%frozen_rho, stin%frozen_rho)
1423 safe_allocate_source_a(stout%frozen_tau, stin%frozen_tau)
1424 safe_allocate_source_a(stout%frozen_gdens, stin%frozen_gdens)
1425 safe_allocate_source_a(stout%frozen_ldens, stin%frozen_ldens)
1427 stout%fixed_occ = stin%fixed_occ
1428 stout%restart_fixed_occ = stin%restart_fixed_occ
1430 stout%fixed_spins = stin%fixed_spins
1432 stout%qtot = stin%qtot
1433 stout%val_charge = stin%val_charge
1437 stout%parallel_in_states = stin%parallel_in_states
1439 call mpi_grp_copy(stout%dom_st_kpt_mpi_grp, stin%dom_st_kpt_mpi_grp)
1440 call mpi_grp_copy(stout%st_kpt_mpi_grp, stin%st_kpt_mpi_grp)
1441 call mpi_grp_copy(stout%dom_st_mpi_grp, stin%dom_st_mpi_grp)
1442 safe_allocate_source_a(stout%node, stin%node)
1443 safe_allocate_source_a(stout%st_kpt_task, stin%st_kpt_task)
1445#ifdef HAVE_SCALAPACK
1451 stout%scalapack_compatible = stin%scalapack_compatible
1453 stout%lnst = stin%lnst
1454 stout%st_start = stin%st_start
1455 stout%st_end = stin%st_end
1459 stout%symmetrize_density = stin%symmetrize_density
1463 stout%packed = stin%packed
1465 stout%randomization = stin%randomization
1486 safe_deallocate_a(st%user_def_states)
1488 safe_deallocate_a(st%rho)
1489 safe_deallocate_a(st%eigenval)
1491 safe_deallocate_a(st%current)
1492 safe_deallocate_a(st%current_para)
1493 safe_deallocate_a(st%current_dia)
1494 safe_deallocate_a(st%current_mag)
1495 safe_deallocate_a(st%current_kpt)
1496 safe_deallocate_a(st%rho_core)
1497 safe_deallocate_a(st%frozen_rho)
1498 safe_deallocate_a(st%frozen_tau)
1499 safe_deallocate_a(st%frozen_gdens)
1500 safe_deallocate_a(st%frozen_ldens)
1501 safe_deallocate_a(st%occ)
1502 safe_deallocate_a(st%spin)
1503 safe_deallocate_a(st%kweights)
1506#ifdef HAVE_SCALAPACK
1512 safe_deallocate_a(st%node)
1513 safe_deallocate_a(st%st_kpt_task)
1515 if (st%parallel_in_states)
then
1516 safe_deallocate_a(st%ap%schedule)
1528 class(
mesh_t),
intent(in) :: mesh
1530 integer,
optional,
intent(in) :: ist_start_
1531 integer,
optional,
intent(in) :: ist_end_
1532 integer,
optional,
intent(in) :: ikpt_start_
1533 integer,
optional,
intent(in) :: ikpt_end_
1534 logical,
optional,
intent(in) :: normalized
1537 integer :: ist, ik, id, ist_start, ist_end, jst, ikpt_start, ikpt_end
1538 complex(real64) :: alpha, beta
1539 real(real64),
allocatable :: dpsi(:, :)
1540 complex(real64),
allocatable :: zpsi(:, :), zpsi2(:)
1541 integer :: ikpoint, ip
1544 logical :: normalized_
1555 safe_allocate(dpsi(1:mesh%np, 1:st%d%dim))
1557 safe_allocate(zpsi(1:mesh%np, 1:st%d%dim))
1560 select case (st%d%ispin)
1563 do ik = ikpt_start, ikpt_end
1564 ikpoint = st%d%get_kpoint_index(ik)
1565 do ist = ist_start, ist_end
1569 pre_shift = mesh%pv%xlocal-1, &
1570 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1571 normalized = normalized)
1573 if(mesh%parallel_in_domains)
then
1579 call dmf_random(mesh, dpsi(:, 1), normalized = normalized)
1584 zpsi(ip,1) = cmplx(dpsi(ip,1),
m_zero, real64)
1593 pre_shift = mesh%pv%xlocal-1, &
1594 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1595 normalized = normalized)
1597 if(mesh%parallel_in_domains)
then
1603 call zmf_random(mesh, zpsi(:, 1), normalized = normalized)
1615 if (st%fixed_spins)
then
1617 do ik = ikpt_start, ikpt_end
1618 ikpoint = st%d%get_kpoint_index(ik)
1619 do ist = ist_start, ist_end
1623 pre_shift = mesh%pv%xlocal-1, &
1624 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1625 normalized = normalized)
1627 if(mesh%parallel_in_domains)
then
1633 call dmf_random(mesh, dpsi(:, 1), normalized = normalized)
1637 zpsi(ip,1) = cmplx(dpsi(ip,1),
m_zero, real64)
1643 pre_shift = mesh%pv%xlocal-1, &
1644 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1645 normalized = normalized)
1647 if(mesh%parallel_in_domains)
then
1653 call zmf_random(mesh, zpsi(:, 1), normalized = normalized)
1666 safe_allocate(zpsi2(1:mesh%np))
1667 do jst = ist_start, ist - 1
1669 zpsi(1:mesh%np, 1) = zpsi(1:mesh%np, 1) -
zmf_dotp(mesh, zpsi(:, 1), zpsi2)*zpsi2(1:mesh%np)
1671 safe_deallocate_a(zpsi2)
1674 zpsi(1:mesh%np, 2) = zpsi(1:mesh%np, 1)
1678 if (abs(alpha) >
m_zero)
then
1679 beta = cmplx(st%spin(1, ist, ik) / abs(alpha), st%spin(2, ist, ik) / abs(alpha), real64)
1681 zpsi(1:mesh%np, 1) = alpha*zpsi(1:mesh%np, 1)
1682 zpsi(1:mesh%np, 2) = beta*zpsi(1:mesh%np, 2)
1687 do ik = ikpt_start, ikpt_end
1688 do ist = ist_start, ist_end
1692 pre_shift = mesh%pv%xlocal-1, &
1693 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1694 normalized = .false.)
1696 if(mesh%parallel_in_domains)
then
1702 call zmf_random(mesh, zpsi(:, id), normalized = .false.)
1718 safe_deallocate_a(dpsi)
1719 safe_deallocate_a(zpsi)
1730 class(
mesh_t),
intent(in) :: mesh
1731 logical,
optional,
intent(in) :: compute_spin
1735 real(real64) :: charge
1736 complex(real64),
allocatable :: zpsi(:, :)
1741 st%nik, st%nst, st%kweights)
1748 charge = charge + sum(st%occ(ist, 1:st%nik) * st%kweights(1:st%nik))
1750 if (abs(charge-st%qtot) > 1e-6_real64)
then
1751 message(1) =
'Occupations do not integrate to total charge.'
1752 write(
message(2),
'(6x,f12.8,a,f12.8)') charge,
' != ', st%qtot
1755 message(1) =
"There don't seem to be any electrons at all!"
1765 safe_allocate(zpsi(1:mesh%np, st%d%dim))
1766 do ik = st%d%kpt%start, st%d%kpt%end
1767 do ist = st%st_start, st%st_end
1769 st%spin(1:3, ist, ik) =
state_spin(mesh, zpsi)
1772 safe_deallocate_a(zpsi)
1774 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
1789 real(real64),
optional,
intent(in) :: alt_eig(st%st_start:, st%d%kpt%start:)
1798 do ik = st%d%kpt%start, st%d%kpt%end
1799 if (
present(alt_eig))
then
1800 tot = tot + st%kweights(ik) * sum(st%occ(st%st_start:st%st_end, ik) * &
1801 alt_eig(st%st_start:st%st_end, ik))
1803 tot = tot + st%kweights(ik) * sum(st%occ(st%st_start:st%st_end, ik) * &
1804 st%eigenval(st%st_start:st%st_end, ik))
1808 if (st%parallel_in_states .or. st%d%kpt%parallel)
call comm_allreduce(st%st_kpt_mpi_grp, tot)
1820 logical :: default_scalapack_compatible
1831 st%parallel_in_states = .false.
1834 call mpi_grp_init(st%dom_st_kpt_mpi_grp, mc%dom_st_kpt_comm)
1838 default_scalapack_compatible =
calc_mode_par%scalapack_compat() .and. .not. st%d%kpt%parallel
1852 call parse_variable(namespace,
'ScaLAPACKCompatible', default_scalapack_compatible, st%scalapack_compatible)
1854#ifdef HAVE_SCALAPACK
1855 if (default_scalapack_compatible .neqv. st%scalapack_compatible)
then
1856 call messages_experimental(
'Setting ScaLAPACKCompatible to other than default', namespace=namespace)
1859 if (st%scalapack_compatible)
then
1866 st%scalapack_compatible = .false.
1875 if (st%nst < st%mpi_grp%size)
then
1876 message(1) =
"Have more processors than necessary"
1877 write(
message(2),
'(i4,a,i4,a)') st%mpi_grp%size,
" processors and ", st%nst,
" states."
1881 call distributed_init(st%dist, st%nst, st%mpi_grp%comm,
"states", scalapack_compat = st%scalapack_compatible)
1883 st%parallel_in_states = st%dist%parallel
1886 st%st_start = st%dist%start
1887 st%st_end = st%dist%end
1888 st%lnst = st%dist%nlocal
1889 st%node(1:st%nst) = st%dist%node(1:st%nst)
1906 kinetic_energy_density, paramagnetic_current, density_gradient, density_laplacian, &
1907 gi_kinetic_energy_density, st_end)
1911 logical,
intent(in) :: nlcc
1912 real(real64),
contiguous,
optional,
target,
intent(out) :: kinetic_energy_density(:,:)
1913 real(real64),
contiguous,
optional,
target,
intent(out) :: paramagnetic_current(:,:,:)
1914 real(real64),
contiguous,
optional,
intent(out) :: density_gradient(:,:,:)
1915 real(real64),
contiguous,
optional,
intent(out) :: density_laplacian(:,:)
1916 real(real64),
contiguous,
optional,
intent(out) :: gi_kinetic_energy_density(:,:)
1917 integer,
optional,
intent(in) :: st_end
1919 real(real64),
pointer,
contiguous :: jp(:, :, :)
1920 real(real64),
pointer,
contiguous :: tau(:, :)
1921 complex(real64),
allocatable :: wf_psi(:,:), gwf_psi(:,:,:), wf_psi_conj(:,:), lwf_psi(:,:)
1922 real(real64),
allocatable :: abs_wf_psi(:,:), abs_gwf_psi(:,:)
1923 complex(real64),
allocatable :: psi_gpsi(:,:)
1924 complex(real64) :: c_tmp
1925 integer :: is, ik, ist, i_dim, st_dim, ii, st_end_
1926 real(real64) :: ww, kpoint(gr%der%dim)
1927 logical :: something_to_do
1935 something_to_do =
present(kinetic_energy_density) .or.
present(gi_kinetic_energy_density) .or. &
1936 present(paramagnetic_current) .or.
present(density_gradient) .or.
present(density_laplacian)
1937 assert(something_to_do)
1939 safe_allocate( wf_psi(1:gr%np_part, 1:st%d%dim))
1940 safe_allocate( wf_psi_conj(1:gr%np_part, 1:st%d%dim))
1941 safe_allocate(gwf_psi(1:gr%np, 1:gr%der%dim, 1:st%d%dim))
1942 safe_allocate(abs_wf_psi(1:gr%np, 1:st%d%dim))
1943 safe_allocate(abs_gwf_psi(1:gr%np, 1:st%d%dim))
1944 safe_allocate(psi_gpsi(1:gr%np, 1:st%d%dim))
1945 if (
present(density_laplacian))
then
1946 safe_allocate(lwf_psi(1:gr%np, 1:st%d%dim))
1950 if (
present(kinetic_energy_density)) tau => kinetic_energy_density
1953 if (
present(paramagnetic_current)) jp => paramagnetic_current
1957 if (
present(gi_kinetic_energy_density))
then
1959 safe_allocate(jp(1:gr%np, 1:gr%der%dim, 1:st%d%nspin))
1961 if (.not.
present(kinetic_energy_density))
then
1962 safe_allocate(tau(1:gr%np, 1:st%d%nspin))
1966 if (
associated(tau)) tau =
m_zero
1967 if (
associated(jp)) jp =
m_zero
1968 if (
present(density_gradient)) density_gradient(:,:,:) =
m_zero
1969 if (
present(density_laplacian)) density_laplacian(:,:) =
m_zero
1970 if (
present(gi_kinetic_energy_density)) gi_kinetic_energy_density =
m_zero
1972 do ik = st%d%kpt%start, st%d%kpt%end
1974 kpoint(1:gr%der%dim) = kpoints%get_point(st%d%get_kpoint_index(ik))
1975 is = st%d%get_spin_index(ik)
1977 do ist = st%st_start, st_end_
1978 ww = st%kweights(ik)*st%occ(ist, ik)
1984 do st_dim = 1, st%d%dim
1989 do st_dim = 1, st%d%dim
1990 call zderivatives_grad(gr%der, wf_psi(:,st_dim), gwf_psi(:,:,st_dim), set_bc = .false.)
1994 if (
present(density_laplacian))
then
1995 do st_dim = 1, st%d%dim
1996 call zderivatives_lapl(gr%der, wf_psi(:,st_dim), lwf_psi(:,st_dim), ghost_update = .false., set_bc = .false.)
2001 wf_psi_conj(1:gr%np, 1:st%d%dim) = conjg(wf_psi(1:gr%np,1:st%d%dim))
2002 abs_wf_psi(1:gr%np, 1:st%d%dim) = real(wf_psi_conj(1:gr%np, 1:st%d%dim) * wf_psi(1:gr%np, 1:st%d%dim), real64)
2004 if (
present(density_laplacian))
then
2005 density_laplacian(1:gr%np, is) = density_laplacian(1:gr%np, is) + &
2006 ww *
m_two*real(wf_psi_conj(1:gr%np, 1) * lwf_psi(1:gr%np, 1), real64)
2007 if (st%d%ispin ==
spinors)
then
2008 density_laplacian(1:gr%np, 2) = density_laplacian(1:gr%np, 2) + &
2009 ww *
m_two*real(wf_psi_conj(1:gr%np, 2) * lwf_psi(1:gr%np, 2), real64)
2012 c_tmp = ww*(lwf_psi(ii, 1) * wf_psi_conj(ii, 2) + wf_psi(ii, 1) * conjg(lwf_psi(ii, 2)))
2013 density_laplacian(ii, 3) = density_laplacian(ii, 3) + real(c_tmp, real64)
2014 density_laplacian(ii, 4) = density_laplacian(ii, 4) + aimag(c_tmp)
2019 if (
associated(tau))
then
2020 tau(1:gr%np, is) = tau(1:gr%np, is) &
2021 + ww * sum(kpoint(1:gr%der%dim)**2) * abs_wf_psi(1:gr%np, 1)
2022 if (st%d%ispin ==
spinors)
then
2023 tau(1:gr%np, 2) = tau(1:gr%np, 2) &
2024 + ww * sum(kpoint(1:gr%der%dim)**2) * abs_wf_psi(1:gr%np, 2)
2028 c_tmp = ww * sum(kpoint(1:gr%der%dim)**2) * wf_psi(ii, 1) * wf_psi_conj(ii, 2)
2029 tau(ii, 3) = tau(ii, 3) + real(c_tmp, real64)
2030 tau(ii, 4) = tau(ii, 4) + aimag(c_tmp)
2035 do i_dim = 1, gr%der%dim
2038 psi_gpsi(1:gr%np, 1:st%d%dim) = wf_psi_conj(1:gr%np, 1:st%d%dim) &
2039 * gwf_psi(1:gr%np,i_dim,1:st%d%dim)
2040 abs_gwf_psi(1:gr%np, 1:st%d%dim) = real(conjg(gwf_psi(1:gr%np, i_dim, 1:st%d%dim)) &
2041 * gwf_psi(1:gr%np, i_dim, 1:st%d%dim), real64)
2043 if (
present(density_gradient))
then
2044 density_gradient(1:gr%np, i_dim, is) = density_gradient(1:gr%np, i_dim, is) &
2045 + ww *
m_two * real(psi_gpsi(1:gr%np, 1), real64)
2046 if (st%d%ispin ==
spinors)
then
2047 density_gradient(1:gr%np, i_dim, 2) = density_gradient(1:gr%np, i_dim, 2) &
2048 + ww *
m_two*real(psi_gpsi(1:gr%np, 2), real64)
2051 c_tmp = ww * (gwf_psi(ii, i_dim, 1) * wf_psi_conj(ii, 2) + wf_psi(ii, 1) * conjg(gwf_psi(ii, i_dim, 2)))
2052 density_gradient(ii, i_dim, 3) = density_gradient(ii, i_dim, 3) + real(c_tmp, real64)
2053 density_gradient(ii, i_dim, 4) = density_gradient(ii, i_dim, 4) + aimag(c_tmp)
2058 if (
present(density_laplacian))
then
2059 call lalg_axpy(gr%np, ww*
m_two, abs_gwf_psi(:,1), density_laplacian(:,is))
2060 if (st%d%ispin ==
spinors)
then
2061 call lalg_axpy(gr%np, ww*
m_two, abs_gwf_psi(:,2), density_laplacian(:,2))
2064 c_tmp =
m_two * ww * gwf_psi(ii, i_dim, 1) * conjg(gwf_psi(ii, i_dim, 2))
2065 density_laplacian(ii, 3) = density_laplacian(ii, 3) + real(c_tmp, real64)
2066 density_laplacian(ii, 4) = density_laplacian(ii, 4) + aimag(c_tmp)
2074 if (
associated(jp))
then
2076 jp(1:gr%np, i_dim, is) = jp(1:gr%np, i_dim, is) + &
2077 ww*(aimag(psi_gpsi(1:gr%np, 1)) - abs_wf_psi(1:gr%np, 1)*kpoint(i_dim))
2078 if (st%d%ispin ==
spinors)
then
2079 jp(1:gr%np, i_dim, 2) = jp(1:gr%np, i_dim, 2) + &
2080 ww*( aimag(psi_gpsi(1:gr%np, 2)) - abs_wf_psi(1:gr%np, 2)*kpoint(i_dim))
2083 c_tmp = -ww*
m_half*
m_zi*(gwf_psi(ii, i_dim, 1)*wf_psi_conj(ii, 2) - wf_psi(ii, 1)*conjg(gwf_psi(ii, i_dim, 2)) &
2084 -
m_two *
m_zi*wf_psi(ii, 1)*wf_psi_conj(ii, 2)*kpoint(i_dim))
2085 jp(ii, i_dim, 3) = jp(ii, i_dim, 3) + real(c_tmp, real64)
2086 jp(ii, i_dim, 4) = jp(ii, i_dim, 4) + aimag(c_tmp)
2095 if (
associated(tau))
then
2096 tau(1:gr%np, is) = tau(1:gr%np, is) + ww*(abs_gwf_psi(1:gr%np,1) &
2097 -
m_two*aimag(psi_gpsi(1:gr%np, 1))*kpoint(i_dim))
2098 if (st%d%ispin ==
spinors)
then
2099 tau(1:gr%np, 2) = tau(1:gr%np, 2) + ww*(abs_gwf_psi(1:gr%np, 2) &
2100 -
m_two*aimag(psi_gpsi(1:gr%np, 2))*kpoint(i_dim))
2103 c_tmp = ww * ( gwf_psi(ii, i_dim, 1)*conjg(gwf_psi(ii, i_dim, 2)) &
2104 +
m_zi * (gwf_psi(ii,i_dim,1)*wf_psi_conj(ii, 2) &
2105 - wf_psi(ii, 1)*conjg(gwf_psi(ii,i_dim,2)))*kpoint(i_dim))
2106 tau(ii, 3) = tau(ii, 3) + real(c_tmp, real64)
2107 tau(ii, 4) = tau(ii, 4) + aimag(c_tmp)
2117 safe_deallocate_a(wf_psi_conj)
2118 safe_deallocate_a(abs_wf_psi)
2119 safe_deallocate_a(abs_gwf_psi)
2120 safe_deallocate_a(psi_gpsi)
2122 if (.not.
present(gi_kinetic_energy_density))
then
2123 if (.not.
present(paramagnetic_current))
then
2124 safe_deallocate_p(jp)
2126 if (.not.
present(kinetic_energy_density))
then
2127 safe_deallocate_p(tau)
2131 if (st%parallel_in_states .or. st%d%kpt%parallel)
call reduce_all(st%st_kpt_mpi_grp)
2136 if (st%symmetrize_density)
then
2137 do is = 1, st%d%nspin
2138 if (
associated(tau))
then
2142 if (
present(density_laplacian))
then
2146 if (
associated(jp))
then
2150 if (
present(density_gradient))
then
2157 if (
allocated(st%rho_core) .and. nlcc .and. (
present(density_laplacian) .or.
present(density_gradient)))
then
2159 wf_psi(ii, 1) = st%rho_core(ii)/st%d%spin_channels
2164 if (
present(density_gradient))
then
2167 do is = 1, st%d%spin_channels
2168 density_gradient(1:gr%np, 1:gr%der%dim, is) = density_gradient(1:gr%np, 1:gr%der%dim, is) + &
2169 real(gwf_psi(1:gr%np, 1:gr%der%dim,1))
2174 if (
present(density_laplacian))
then
2177 do is = 1, st%d%spin_channels
2178 density_laplacian(1:gr%np, is) = density_laplacian(1:gr%np, is) + real(lwf_psi(1:gr%np, 1))
2185 if (
allocated(st%frozen_tau) .and. .not.
present(st_end))
then
2188 if (
allocated(st%frozen_gdens) .and. .not.
present(st_end))
then
2189 do is = 1, st%d%nspin
2190 call lalg_axpy(gr%np, gr%der%dim,
m_one, st%frozen_gdens(:,:,is), density_gradient(:,:,is))
2193 if (
allocated(st%frozen_tau) .and. .not.
present(st_end))
then
2194 call lalg_axpy(gr%np, st%d%nspin,
m_one, st%frozen_ldens, density_laplacian)
2197 safe_deallocate_a(wf_psi)
2198 safe_deallocate_a(gwf_psi)
2199 safe_deallocate_a(lwf_psi)
2203 if (
present(gi_kinetic_energy_density))
then
2204 do is = 1, st%d%nspin
2205 assert(
associated(tau))
2206 gi_kinetic_energy_density(1:gr%np, is) = tau(1:gr%np, is)
2209 assert(
associated(jp))
2210 if (st%d%ispin /=
spinors)
then
2211 do is = 1, st%d%nspin
2214 if (st%rho(ii, is) < 1.0e-7_real64) cycle
2215 gi_kinetic_energy_density(ii, is) = &
2216 gi_kinetic_energy_density(ii, is) - sum(jp(ii,1:gr%der%dim, is)**2)/st%rho(ii, is)
2222 gi_kinetic_energy_density(ii, 1) = gi_kinetic_energy_density(ii, 1) &
2223 - sum(jp(ii,1:gr%der%dim, 1)**2)/(safe_tol(st%rho(ii, 1),
m_epsilon))
2224 gi_kinetic_energy_density(ii, 2) = gi_kinetic_energy_density(ii, 2) &
2225 - sum(jp(ii,1:gr%der%dim, 2)**2)/(safe_tol(st%rho(ii, 2),
m_epsilon))
2226 gi_kinetic_energy_density(ii, 3) = &
2227 gi_kinetic_energy_density(ii, 3) - sum(jp(ii,1:gr%der%dim, 3)**2 + jp(ii,1:gr%der%dim, 4)**2) &
2228 /(safe_tol((st%rho(ii, 3)**2 + st%rho(ii, 4)**2),
m_epsilon))*st%rho(ii, 3)
2229 gi_kinetic_energy_density(ii, 4) = &
2230 gi_kinetic_energy_density(ii, 4) + sum(jp(ii,1:gr%der%dim, 3)**2 + jp(ii,1:gr%der%dim, 4)**2) &
2231 /(safe_tol((st%rho(ii, 3)**2 + st%rho(ii, 4)**2),
m_epsilon))*st%rho(ii, 4)
2237 if (.not.
present(kinetic_energy_density))
then
2238 safe_deallocate_p(tau)
2240 if (.not.
present(paramagnetic_current))
then
2241 safe_deallocate_p(jp)
2256 if (
associated(tau))
call comm_allreduce(grp, tau, dim = (/gr%np, st%d%nspin/))
2258 if (
present(density_laplacian))
call comm_allreduce(grp, density_laplacian, dim = (/gr%np, st%d%nspin/))
2260 do is = 1, st%d%nspin
2261 if (
associated(jp))
call comm_allreduce(grp, jp(:, :, is), dim = (/gr%np, gr%der%dim/))
2263 if (
present(density_gradient))
then
2264 call comm_allreduce(grp, density_gradient(:, :, is), dim = (/gr%np, gr%der%dim/))
2278 type(
mesh_t),
intent(in) :: mesh
2279 complex(real64),
intent(in) :: f1(:, :)
2280 real(real64) :: spin(1:3)
2282 complex(real64) :: z
2286 z =
zmf_dotp(mesh, f1(:, 1) , f1(:, 2))
2288 spin(1) =
m_two*real(z, real64)
2289 spin(2) =
m_two*aimag(z)
2301 integer,
intent(in) :: ist
2315 integer,
intent(in) :: ist
2316 integer,
intent(in) :: ik
2321 ik >= st%d%kpt%start .and. ik <= st%d%kpt%end
2331 class(
mesh_t),
intent(in) :: mesh
2337 memory = memory + real64*real(mesh%np_part_global, real64) *st%d%dim*real(st%nst, real64) *st%d%kpt%nglobal
2347 logical,
optional,
intent(in) :: copy
2350 integer(int64) :: max_mem, mem
2362 if (accel_is_enabled())
then
2363 max_mem = accel_global_memory_size()
2365 if (st%cl_states_mem > m_one)
then
2366 max_mem = int(st%cl_states_mem, int64)*(1024_8)**2
2367 else if (st%cl_states_mem < 0.0_real64)
then
2368 max_mem = max_mem + int(st%cl_states_mem, int64)*(1024_8)**2
2370 max_mem = int(st%cl_states_mem*real(max_mem, real64) , int64)
2373 max_mem = huge(max_mem)
2377 qnloop:
do iqn = st%d%kpt%start, st%d%kpt%end
2378 do ib = st%group%block_start, st%group%block_end
2380 mem = mem + st%group%psib(ib, iqn)%pack_total_size()
2382 if (mem > max_mem)
then
2383 call messages_write(
'Not enough CL device memory to store all states simultaneously.', new_line = .
true.)
2384 call messages_write(
'Only ')
2385 call messages_write(ib - st%group%block_start)
2386 call messages_write(
' of ')
2387 call messages_write(st%group%block_end - st%group%block_start + 1)
2388 call messages_write(
' blocks will be stored in device memory.', new_line = .
true.)
2389 call messages_warning()
2393 call st%group%psib(ib, iqn)%do_pack(copy)
2405 logical,
optional,
intent(in) :: copy
2414 do iqn = st%d%kpt%start, st%d%kpt%end
2415 do ib = st%group%block_start, st%group%block_end
2416 if (st%group%psib(ib, iqn)%is_packed())
call st%group%psib(ib, iqn)%do_unpack(copy)
2429 type(namespace_t),
intent(in) :: namespace
2433 call messages_print_with_emphasis(msg=
"States", namespace=namespace)
2435 write(message(1),
'(a,f12.3)')
'Total electronic charge = ', st%qtot
2436 write(message(2),
'(a,i8)')
'Number of states = ', st%nst
2437 write(message(3),
'(a,i8)')
'States block-size = ', st%block_size
2438 call messages_info(3, namespace=namespace)
2440 call messages_print_with_emphasis(namespace=namespace)
2455 do iqn = st%d%kpt%start, st%d%kpt%end
2456 do ib = st%group%block_start, st%group%block_end
2457 call batch_set_zero(st%group%psib(ib, iqn))
2467 integer pure function states_elec_block_min(st, ib) result(range)
2469 integer,
intent(in) :: ib
2471 range = st%group%block_range(ib, 1)
2477 integer pure function states_elec_block_max(st, ib) result(range)
2479 integer,
intent(in) :: ib
2481 range = st%group%block_range(ib, 2)
2487 integer pure function states_elec_block_size(st, ib) result(size)
2489 integer,
intent(in) :: ib
2491 size = st%group%block_size(ib)
2499 type(namespace_t),
intent(in) :: namespace
2500 integer,
intent(out) :: n_pairs
2501 integer,
intent(out) :: n_occ(:)
2502 integer,
intent(out) :: n_unocc(:)
2503 logical,
allocatable,
intent(out) :: is_included(:,:,:)
2505 logical,
intent(out) :: is_frac_occ
2507 integer :: ik, ist, ast, n_filled, n_partially_filled, n_half_filled
2508 character(len=80) :: nst_string, default, wfn_list
2509 real(real64) :: energy_window
2513 is_frac_occ = .false.
2515 call occupied_states(st, namespace, ik, n_filled, n_partially_filled, n_half_filled)
2516 if (n_partially_filled > 0 .or. n_half_filled > 0) is_frac_occ = .
true.
2517 n_occ(ik) = n_filled + n_partially_filled + n_half_filled
2518 n_unocc(ik) = st%nst - n_filled
2531 call parse_variable(namespace,
'CasidaKSEnergyWindow', -m_one, energy_window, units_inp%energy)
2554 safe_allocate(is_included(maxval(n_occ), minval(n_occ) + 1:st%nst , st%nik))
2555 is_included(:,:,:) = .false.
2557 if (energy_window < m_zero)
then
2558 write(nst_string,
'(i6)') st%nst
2559 write(default,
'(a,a)')
"1-", trim(adjustl(nst_string))
2560 call parse_variable(namespace,
'CasidaKohnShamStates', default, wfn_list)
2562 write(message(1),
'(a,a)')
"Info: States that form the basis: ", trim(wfn_list)
2563 call messages_info(1, namespace=namespace)
2568 do ast = n_occ(ik) + 1, st%nst
2569 if (loct_isinstringlist(ast, wfn_list))
then
2570 do ist = 1, n_occ(ik)
2571 if (loct_isinstringlist(ist, wfn_list))
then
2572 n_pairs = n_pairs + 1
2573 is_included(ist, ast, ik) = .
true.
2582 write(message(1),
'(a,f12.6,a)')
"Info: including transitions with energy < ", &
2583 units_from_atomic(units_out%energy, energy_window), trim(units_abbrev(units_out%energy))
2584 call messages_info(1, namespace=namespace)
2589 do ast = n_occ(ik) + 1, st%nst
2590 do ist = 1, n_occ(ik)
2591 if (st%eigenval(ast, ik) - st%eigenval(ist, ik) < energy_window)
then
2592 n_pairs = n_pairs + 1
2593 is_included(ist, ast, ik) = .
true.
2621 subroutine occupied_states(st, namespace, ik, n_filled, n_partially_filled, n_half_filled, &
2622 filled, partially_filled, half_filled)
2624 type(namespace_t),
intent(in) :: namespace
2625 integer,
intent(in) :: ik
2626 integer,
intent(out) :: n_filled, n_partially_filled, n_half_filled
2627 integer,
optional,
intent(out) :: filled(:), partially_filled(:), half_filled(:)
2633 if (
present(filled)) filled(:) = 0
2634 if (
present(partially_filled)) partially_filled(:) = 0
2635 if (
present(half_filled)) half_filled(:) = 0
2637 n_partially_filled = 0
2640 select case (st%d%ispin)
2643 if (abs(st%occ(ist, ik) - m_two) < m_min_occ)
then
2644 n_filled = n_filled + 1
2645 if (
present(filled)) filled(n_filled) = ist
2646 else if (abs(st%occ(ist, ik) - m_one) < m_min_occ)
then
2647 n_half_filled = n_half_filled + 1
2648 if (
present(half_filled)) half_filled(n_half_filled) = ist
2649 else if (st%occ(ist, ik) > m_min_occ)
then
2650 n_partially_filled = n_partially_filled + 1
2651 if (
present(partially_filled)) partially_filled(n_partially_filled) = ist
2652 else if (abs(st%occ(ist, ik)) > m_min_occ)
then
2653 write(message(1),*)
'Internal error in occupied_states: Illegal occupation value ', st%occ(ist, ik)
2654 call messages_fatal(1, namespace=namespace)
2657 case (spin_polarized, spinors)
2659 if (abs(st%occ(ist, ik)-m_one) < m_min_occ)
then
2660 n_filled = n_filled + 1
2661 if (
present(filled)) filled(n_filled) = ist
2662 else if (st%occ(ist, ik) > m_min_occ)
then
2663 n_partially_filled = n_partially_filled + 1
2664 if (
present(partially_filled)) partially_filled(n_partially_filled) = ist
2665 else if (abs(st%occ(ist, ik)) > m_min_occ)
then
2666 write(message(1),*)
'Internal error in occupied_states: Illegal occupation value ', st%occ(ist, ik)
2667 call messages_fatal(1, namespace=namespace)
2679 type(multicomm_t),
intent(in) :: mc
2682 call distributed_init(this%d%kpt, this%nik, mc%group_comm(p_strategy_kpoints),
"k-points")
2697 if (.not.
allocated(st%st_kpt_task))
then
2698 safe_allocate(st%st_kpt_task(0:st%st_kpt_mpi_grp%size-1, 1:4))
2701 st%st_kpt_task(0:st%st_kpt_mpi_grp%size-1, :) = 0
2702 st%st_kpt_task(st%st_kpt_mpi_grp%rank, :) = [st%st_start, st%st_end, st%d%kpt%start, st%d%kpt%end]
2704 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
2705 call comm_allreduce(st%st_kpt_mpi_grp, st%st_kpt_task)
2716 type(kpoints_t),
intent(in) :: kpoints
2717 type(namespace_t),
intent(in) :: namespace
2720 type(states_elec_dim_t),
pointer :: dd
2727 st%nik = kpoints_number(kpoints)
2729 if (dd%ispin == spin_polarized) st%nik = 2*st%nik
2731 safe_allocate(st%kweights(1:st%nik))
2734 ik = dd%get_kpoint_index(iq)
2735 st%kweights(iq) = kpoints%get_weight(ik)
2747 call io_mkdir(
'debug/', namespace)
2748 iunit = io_open(
'debug/kpoints', namespace, action =
'write')
2749 call kpoints%write_info(iunit=iunit, absolute_coordinates = .
true.)
2750 call io_close(iunit)
2764 class(mesh_t),
intent(in) :: gr
2765 real(real64) :: dipole(1:gr%box%dim)
2768 real(real64) :: e_dip(1:gr%box%dim, this%d%spin_channels)
2772 do ispin = 1, this%d%spin_channels
2773 call dmf_dipole(gr, this%rho(:, ispin), e_dip(:, ispin))
2776 dipole(:) = sum(e_dip(:, 1:this%d%spin_channels), 2)
2784#include "states_elec_inc.F90"
2787#include "complex.F90"
2788#include "states_elec_inc.F90"
initialize a batch with existing memory
constant times a vector plus a vector
Prints out to iunit a message in the form: ["InputVariable" = value] where "InputVariable" is given b...
pure logical function, public accel_is_enabled()
type(accel_t), public accel
This module implements batches of mesh functions.
This module implements common operations on batches of mesh functions.
This module provides the BLACS processor grid.
subroutine, public blacs_proc_grid_init(this, mpi_grp, procdim)
Initializes a blacs context from an MPI communicator with topological information.
subroutine, public blacs_proc_grid_end(this)
subroutine, public blacs_proc_grid_copy(cin, cout)
Module implementing boundary conditions in Octopus.
This module handles the calculation mode.
type(calc_mode_par_t), public calc_mode_par
Singleton instance of parallel calculation mode.
integer, parameter, public p_strategy_states
parallelization in states
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
subroutine, public zderivatives_grad(der, ff, op_ff, ghost_update, set_bc, to_cartesian)
apply the gradient to a mesh function
subroutine, public zderivatives_lapl(der, ff, op_ff, ghost_update, set_bc, factor)
apply the Laplacian to a mesh 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
subroutine, public distributed_copy(in, out)
@Brief Create a copy of a distributed instance
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_fourth
complex(real64), parameter, public m_zi
real(real64), parameter, public m_epsilon
type(conf_t), public conf
Global instance of Octopus configuration.
real(real64), parameter, public m_half
real(real64), parameter, public m_one
This module implements the underlying real-space grid.
subroutine, public dgrid_symmetrize_vector_field(gr, field, suppress_warning)
subroutine, public dgrid_symmetrize_scalar_field(gr, field, suppress_warning)
logical pure function, public kpoints_point_is_gamma(this, ik)
This module is intended to contain "only mathematical" functions and procedures.
integer pure function, public pad_pow2(size)
create array size, which is padded to powers of 2
This module defines functions over batches of mesh functions.
subroutine, public zmesh_batch_exchange_points(mesh, aa, forward_map, backward_map)
This functions exchanges points of a mesh according to a certain map. Two possible maps can be given....
subroutine, public dmesh_batch_exchange_points(mesh, aa, forward_map, backward_map)
This functions exchanges points of a mesh according to a certain map. Two possible maps can be given....
This module defines various routines, operating on mesh functions.
subroutine, public zmf_random(mesh, ff, pre_shift, post_shift, seed, normalized)
This subroutine fills a function with random values.
subroutine, public dmf_random(mesh, ff, pre_shift, post_shift, seed, normalized)
This subroutine fills a function with random values.
subroutine, public zmf_normalize(mesh, dim, psi, norm)
Normalize a mesh function psi.
This module defines the meshes, which are used in Octopus.
subroutine, public messages_not_implemented(feature, namespace)
subroutine, public messages_warning(no_lines, all_nodes, namespace)
subroutine, public messages_obsolete_variable(namespace, name, rep)
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)
general module for modelmb particles
subroutine, public modelmb_particles_end(this)
subroutine, public modelmb_particles_init(this, namespace, space, nst)
==============================================================
subroutine, public modelmb_particles_copy(modelmb_out, modelmb_in)
subroutine mpi_grp_copy(mpi_grp_out, mpi_grp_in)
type(mpi_comm), parameter, public mpi_comm_undefined
used to indicate a communicator has not been initialized
subroutine mpi_grp_init(grp, comm)
Initialize MPI group instance.
This module handles the communicators for the various parallelization strategies.
logical pure function, public multicomm_strategy_is_parallel(mc, level)
subroutine, public multicomm_all_pairs_copy(apout, apin)
logical pure function, public multicomm_have_slaves(this)
subroutine, public multicomm_create_all_pairs(mpi_grp, ap)
This routine uses the one-factorization (or near-one-factorization of a complete graph to construct a...
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.
subroutine, public restart_read(restart, iunit, lines, nlines, ierr)
subroutine, public restart_close(restart, iunit)
Close a file previously opened with restart_open.
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,...
subroutine, public smear_fill_occupations(this, eigenvalues, occupations, nik, nst)
subroutine, public smear_find_fermi_energy(this, namespace, eigenvalues, occupations, qtot, nik, nst, kweights)
subroutine, public smear_copy(to, from)
integer, parameter, public smear_fixed_occ
subroutine, public smear_init(this, namespace, ispin, fixed_occ, integral_occs, kpoints)
logical pure function, public smear_is_semiconducting(this)
subroutine, public states_set_complex(st)
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 states_elec_dim_copy(dout, din)
subroutine, public states_elec_dim_end(dim)
This module handles groups of electronic batches and their parallel distribution.
subroutine, public states_elec_group_copy(d, group_in, group_out, copy_data, special)
make a copy of a group
subroutine, public states_elec_group_end(this, d)
finalize the local blocks of wave functions and release local arrays
real(real64) function, public states_elec_wfns_memory(st, mesh)
return the memory usage of a states_elec_t object
integer pure function, public states_elec_block_max(st, ib)
return index of last state in block ib
subroutine zstates_elec_generate_random_vector(mesh, st, vector, normalized, reset_seed)
Generate a random vector.
subroutine, public states_elec_null(st)
subroutine, public states_elec_distribute_nodes(st, namespace, mc)
@Brief. Distribute states over the processes for states parallelization
subroutine, public states_elec_fermi(st, namespace, mesh, compute_spin)
calculate the Fermi level for the states in this object
logical function, public state_kpt_is_local(st, ist, ik)
check whether a given state (ist, ik) is on the local node
subroutine, public states_elec_calc_quantities(gr, st, kpoints, nlcc, kinetic_energy_density, paramagnetic_current, density_gradient, density_laplacian, gi_kinetic_energy_density, st_end)
calculated selected quantities
real(real64) function, dimension(1:gr%box%dim) states_elec_calculate_dipole(this, gr)
calculate the expectation value of the dipole moment of electrons
subroutine, public states_elec_densities_init(st, gr)
subroutine, public states_elec_end(st)
finalize the states_elec_t object
subroutine zstates_elec_get_state1(st, mesh, idim, ist, iqn, psi)
Write one component (dim) of a wave function into a state_elec_t object.
subroutine, public states_elec_deallocate_wfns(st)
Deallocates the KS wavefunctions defined within a states_elec_t structure.
subroutine, public states_elec_allocate_wfns(st, mesh, wfs_type, skip, packed)
Allocates the KS wavefunctions defined within a states_elec_t structure.
subroutine zstates_elec_get_points1(st, start_point, end_point, iqn, psi)
Returns the value of all the states for given k-point in the range of points [start_point:end_point].
subroutine states_elec_read_initial_occs(st, namespace, excess_charge, kpoints)
Reads from the input file the initial occupations, if the block "Occupations" is present....
subroutine, public states_elec_init(st, namespace, space, valence_charge, kpoints)
Initialize a new states_elec_t object.
subroutine zstates_elec_set_state1(st, mesh, idim, ist, iqn, psi)
get one dimension of local wave function for given k-point and states index from a states_elec_t obje...
real(real64) function, public states_elec_eigenvalues_sum(st, alt_eig)
function to calculate the eigenvalues sum using occupations as weights
integer, parameter, public par_independent
Method used to generate random states.
subroutine dstates_elec_generate_random_vector(mesh, st, vector, normalized, reset_seed)
Generate a random vector.
subroutine, public occupied_states(st, namespace, ik, n_filled, n_partially_filled, n_half_filled, filled, partially_filled, half_filled)
return information about occupied orbitals in many-body state
subroutine dstates_elec_get_state2(st, mesh, ist, iqn, psi)
Write a wave function into a state_elec_t object.
subroutine zstates_elec_set_state2(st, mesh, ist, iqn, psi)
get local wave function for given k-point and states index from a states_elec_t object
subroutine zstates_elec_get_state2(st, mesh, ist, iqn, psi)
Write a wave function into a state_elec_t object.
subroutine dstates_elec_get_points1(st, start_point, end_point, iqn, psi)
Returns the value of all the states for given k-point in the range of points [start_point:end_point].
integer pure function, public states_elec_block_size(st, ib)
return number of states in block ib
subroutine, public kpoints_distribute(this, mc)
distribute k-points over the nodes in the corresponding communicator
integer, parameter, public par_dependent
subroutine states_elec_pack(st, copy)
pack the batches in this states object
subroutine, public states_elec_choose_kpoints(st, kpoints, namespace)
double up k-points for SPIN_POLARIZED calculations
subroutine zstates_elec_get_state3(st, mesh, iqn, psi)
get local wave functions for given k-point from a states_elec_t object
logical function, public state_is_local(st, ist)
check whether a given state (ist) is on the local node
subroutine dstates_elec_set_state1(st, mesh, idim, ist, iqn, psi)
get one dimension of local wave function for given k-point and states index from a states_elec_t obje...
subroutine, public states_elec_exec_init(st, namespace, mc)
Further initializations.
subroutine dstates_elec_set_state4(st, mesh, psi)
set all local wave functions in a states_elec_t object
subroutine dstates_elec_set_state3(st, mesh, iqn, psi)
set local wave functions for given k-point in a states_elec_t object
subroutine states_elec_write_info(st, namespace)
write information about the states object
subroutine states_elec_init_block(st, mesh, verbose, skip, packed)
Initializes the data components in st that describe how the states are distributed in blocks:
real(real64) function, dimension(1:3) state_spin(mesh, f1)
calculate the spin vector for a spinor wave function f1
subroutine states_elec_kpoints_distribution(st)
Assign the start and end indices for states and kpoints, for "st_kpt_mpi_grp" communicator.
subroutine zstates_elec_get_state4(st, mesh, psi)
get all local wave functions from a states_elec_t object
subroutine, public states_elec_copy(stout, stin, exclude_wfns, exclude_eigenval, special)
make a (selective) copy of a states_elec_t object
subroutine, public states_elec_generate_random(st, mesh, kpoints, ist_start_, ist_end_, ikpt_start_, ikpt_end_, normalized)
randomize states
subroutine dstates_elec_get_state1(st, mesh, idim, ist, iqn, psi)
Write one component (dim) of a wave function into a state_elec_t object.
subroutine dstates_elec_set_state2(st, mesh, ist, iqn, psi)
get local wave function for given k-point and states index from a states_elec_t object
subroutine zstates_elec_set_state4(st, mesh, psi)
set all local wave functions in a states_elec_t object
subroutine states_elec_read_initial_spins(st, namespace)
Reads, if present, the "InitialSpins" block.
subroutine dstates_elec_get_state3(st, mesh, iqn, psi)
get local wave functions for given k-point from a states_elec_t object
subroutine dstates_elec_get_points2(st, start_point, end_point, psi)
Returns the value of all the states in the range of points [start_point:end_point].
integer pure function, public states_elec_block_min(st, ib)
return index of first state in block ib
subroutine states_elec_unpack(st, copy)
unpack the batches in this states object
subroutine, public states_elec_look(restart, nik, dim, nst, ierr)
Reads the 'states' file in the restart directory, and finds out the nik, dim, and nst contained in it...
subroutine dstates_elec_get_state4(st, mesh, psi)
get all local wave functions from a states_elec_t object
subroutine, public states_elec_count_pairs(st, namespace, n_pairs, n_occ, n_unocc, is_included, is_frac_occ)
number of occupied-unoccupied pairs for Casida
subroutine, public states_elec_allocate_current(st, space, mesh)
subroutine, public states_elec_set_zero(st)
expclicitely set all wave functions in the states to zero
subroutine zstates_elec_set_state3(st, mesh, iqn, psi)
set local wave functions for given k-point in a states_elec_t object
subroutine zstates_elec_get_points2(st, start_point, end_point, psi)
Returns the value of all the states in the range of points [start_point:end_point].
type(type_t), public type_float
type(type_t), public type_cmplx
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_t), public unit_megabytes
For large amounts of data (natural code units are bytes)
subroutine, public zwfs_elec_init(this, dim, st_start, st_end, np, ik, special, packed)
initialize an empty wfs_elec_t object
subroutine, public dwfs_elec_init(this, dim, st_start, st_end, np, ik, special, packed)
initialize an empty wfs_elec_t object
subroutine reduce_all(grp)
subroutine print_kpoints_debug
Class defining batches of mesh functions.
Distribution of N instances over mpi_grpsize processes, for the local rank mpi_grprank....
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.
This is defined even when running serial.
An all-pairs communication schedule for a given group.
Stores all communicators and groups.
abstract class for states
The states_elec_t class contains all electronic wave functions.