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
113 real(real64) :: xc_nlcc(3,3) =
m_zero
114 real(real64) :: ps_local(3,3) =
m_zero
116 real(real64) :: ion_ion(3,3) =
m_zero
117 real(real64) :: vdw(3,3) =
m_zero
118 real(real64) :: hubbard(3,3) =
m_zero
120 real(real64) :: kinetic_sumrule
121 real(real64) :: hartree_sumrule
136 type(states_elec_dim_t) :: d
139 logical :: only_userdef_istates
141 type(states_elec_group_t) :: group
142 integer :: block_size
146 logical :: pack_states
152 character(len=1024),
allocatable :: user_def_states(:,:,:)
158 real(real64),
allocatable :: rho(:,:)
159 real(real64),
allocatable :: rho_core(:)
161 real(real64),
allocatable :: current(:, :, :)
162 real(real64),
allocatable :: current_para(:, :, :)
163 real(real64),
allocatable :: current_dia(:, :, :)
164 real(real64),
allocatable :: current_mag(:, :, :)
165 real(real64),
allocatable :: current_kpt(:,:,:)
170 real(real64),
allocatable :: frozen_rho(:, :)
171 real(real64),
allocatable :: frozen_tau(:, :)
172 real(real64),
allocatable :: frozen_gdens(:,:,:)
173 real(real64),
allocatable :: frozen_ldens(:,:)
175 logical :: uniform_occ
177 real(real64),
allocatable :: eigenval(:,:)
179 logical :: restart_fixed_occ
180 logical :: restart_reorder_occs
181 real(real64),
allocatable :: occ(:,:)
182 real(real64),
allocatable :: kweights(:)
185 logical :: fixed_spins
187 real(real64),
allocatable :: spin(:, :, :)
190 real(real64) :: val_charge
192 type(stress_t) :: stress_tensors
194 logical :: fromScratch
195 type(smear_t) :: smear
198 type(modelmb_particle_t) :: modelmbparticles
202 type(mpi_grp_t) :: mpi_grp
203 type(mpi_grp_t) :: dom_st_mpi_grp
210 logical :: scalapack_compatible
211 logical :: parallel_in_states = .false.
215 integer :: st_start, st_end
216 integer,
allocatable :: node(:)
219 integer,
allocatable :: st_kpt_task(:,:)
222 logical :: symmetrize_density
223 integer :: randomization
224 integer :: orth_method = 0
226 real(real64) :: gpu_states_mem
238 integer,
public,
parameter :: &
282 real(real64),
intent(in) :: valence_charge
284 integer,
optional,
intent(in) :: calc_mode_id
286 real(real64) :: excess_charge, nempty_percent
287 integer :: nempty, ntot, default
288 integer :: nempty_conv, nempty_conv_default
289 logical :: force, adapt_for_chebyshev
290 real(real64),
parameter :: tol = 1e-13_real64
292 integer,
parameter :: rs_chebyshev = 12
293 integer(int64),
parameter :: chebyshev_compatible_modes(3) = &
294 [option__calculationmode__gs, option__calculationmode__go, option__calculationmode__unocc]
303 st%d%ispin = space%ispin
308 if (st%d%ispin /=
unpolarized .and. kpoints%use_time_reversal)
then
309 message(1) =
"Time reversal symmetry is only implemented for unpolarized spins."
310 message(2) =
"Use KPointsUseTimeReversal = no."
342 write(
message(1),
'(a,i5,a)')
"Input: '", ntot,
"' is not a valid value for TotalStates."
364 write(
message(1),
'(a,i5,a)')
"Input: '", nempty,
"' is not a valid value for ExtraStates."
365 message(2) =
'(0 <= ExtraStates)'
369 if (ntot > 0 .and. nempty > 0)
then
370 message(1) =
'You cannot set TotalStates and ExtraStates at the same time.'
385 if (nempty_percent < 0)
then
386 write(
message(1),
'(a,f8.6,a)')
"Input: '", nempty_percent, &
387 "' should be a percentage value x (where x is parts in hundred) larger or equal 0"
391 if (nempty > 0 .and. nempty_percent > 0)
then
392 message(1) =
'You cannot set ExtraStates and ExtraStatesInPercent at the same time.'
397 adapt_for_chebyshev = .false.
398 if (
present(calc_mode_id))
then
399 if (any(calc_mode_id == chebyshev_compatible_modes))
then
402 if (es == rs_chebyshev)
then
404 adapt_for_chebyshev = .
true.
408 if (adapt_for_chebyshev)
then
411 message(1) =
'Chebyshev filtering eigensolver detected. Setting ExtraStatesInPercent = 15'
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
450 if (nempty_percent > 0)
then
451 nempty = ceiling(nempty_percent * st%nst / 100)
471 nempty_conv_default = nempty
472 if (adapt_for_chebyshev)
then
474 nempty_conv_default = min(int(0.8*nempty), nempty - 1)
476 call parse_variable(namespace,
'ExtraStatesToConverge', nempty_conv_default, nempty_conv)
477 if (nempty_conv < 0)
then
478 write(
message(1),
'(a,i5,a)')
"Input: '", nempty_conv,
"' is not a valid value for ExtraStatesToConverge."
479 message(2) =
'(0 <= ExtraStatesToConverge)'
483 if (nempty_conv > nempty)
then
485 message(1) =
'You cannot set ExtraStatesToConverge to a higher value than ExtraStates.'
486 message(2) =
'Capping ExtraStatesToConverge to ExtraStates.'
491 if (ntot < st%nst)
then
492 message(1) =
'TotalStates is smaller than the number of states required by the system.'
499 st%nst_conv = st%nst + nempty_conv
500 st%nst = st%nst + nempty
501 if (st%nst == 0)
then
502 message(1) =
"Cannot run with number of states = zero."
520 default =
accel%warp_size
529 call parse_variable(namespace,
'StatesBlockSize', default, st%block_size)
530 if (st%block_size < 1)
then
531 call messages_write(
"The variable 'StatesBlockSize' must be greater than 0.")
535 st%block_size = min(st%block_size, st%nst)
536 conf%target_states_block_size = st%block_size
538 safe_allocate(st%eigenval(1:st%nst, 1:st%nik))
539 st%eigenval = huge(st%eigenval)
543 if (.not. kpoints%gamma_only())
then
556 call parse_variable(namespace,
'OnlyUserDefinedInitialStates', .false., st%only_userdef_istates)
559 safe_allocate(st%occ (1:st%nst, 1:st%nik))
564 safe_allocate(st%user_def_states(1:st%d%dim, 1:st%nst, 1:st%nik))
566 st%user_def_states(1:st%d%dim, 1:st%nst, 1:st%nik) =
'undefined'
569 if (st%d%ispin ==
spinors)
then
570 safe_allocate(st%spin(1:3, 1:st%nst, 1:st%nik))
597 if (st%smear%photodop)
then
598 if (nempty == 0)
then
599 write(
message(1),
'(a,i5,a)')
"PhotoDoping requires to specify ExtraStates."
600 message(2) =
'(0 == ExtraStates)'
608 safe_allocate(st%node(1:st%nst))
609 st%node(1:st%nst) = 0
612 st%parallel_in_states = .false.
626 call parse_variable(namespace,
'SymmetrizeDensity', kpoints%use_symmetries, st%symmetrize_density)
656 integer,
intent(out) :: nik
657 integer,
intent(out) :: dim
658 integer,
intent(out) :: nst
659 integer,
intent(out) :: ierr
661 character(len=256) :: lines(3)
662 character(len=20) :: char
669 iunit = restart%open(
'states')
670 call restart%read(iunit, lines, 3, ierr)
672 read(lines(1), *) char, nst
673 read(lines(2), *) char, dim
674 read(lines(3), *) char, nik
676 call restart%close(iunit)
694 real(real64),
intent(in) :: excess_charge
697 integer :: ik, ist, ispin, nspin, ncols, nrows, el_per_state, icol, start_pos, spin_n
699 real(real64) :: rr, charge
700 logical :: integral_occs, unoccupied_states
701 real(real64),
allocatable :: read_occs(:, :)
702 real(real64) :: charge_in_block
715 call parse_variable(namespace,
'RestartFixedOccupations', .
true., st%restart_fixed_occ)
788 occ_fix:
if (
parse_block(namespace,
'Occupations', blk) == 0)
then
790 st%fixed_occ = .
true.
793 if (ncols > st%nst)
then
798 if (nrows /= st%nik)
then
799 call messages_input_error(namespace,
"Occupations",
"Wrong number of rows in block Occupations.")
802 do ik = 1, st%nik - 1
805 "All rows in block Occupations must have the same number of columns.")
816 safe_allocate(read_occs(1:ncols, 1:st%nik))
822 charge_in_block = charge_in_block + read_occs(icol, ik) * st%kweights(ik)
827 select case (st%d%ispin)
836 start_pos = nint((st%qtot - charge_in_block)/spin_n)
838 if (start_pos + ncols > st%nst)
then
839 message(1) =
"To balance charge, the first column in block Occupations is taken to refer to state"
840 write(
message(2),
'(a,i6,a)')
"number ", start_pos,
" but there are too many columns for the number of states."
841 write(
message(3),
'(a,i6,a)')
"Solution: set ExtraStates = ", start_pos + ncols - st%nst
846 do ist = 1, start_pos
847 st%occ(ist, ik) = el_per_state
852 do ist = start_pos + 1, start_pos + ncols
853 st%occ(ist, ik) = read_occs(ist - start_pos, ik)
854 integral_occs = integral_occs .and. &
855 abs((st%occ(ist, ik) - el_per_state) * st%occ(ist, ik)) <=
m_epsilon
860 do ist = start_pos + ncols + 1, st%nst
867 safe_deallocate_a(read_occs)
870 st%fixed_occ = .false.
871 integral_occs = .false.
878 st%qtot = -(st%val_charge + excess_charge)
881 if (st%d%nspin == 2) nspin = 2
883 do ik = 1, st%nik, nspin
886 do ispin = ik, ik + nspin - 1
887 st%occ(ist, ispin) = min(rr, -(st%val_charge + excess_charge) - charge)
888 charge = charge + st%occ(ist, ispin)
907 if (st%fixed_occ)
then
908 call parse_variable(namespace,
'RestartReorderOccs', .false., st%restart_reorder_occs)
910 st%restart_reorder_occs = .false.
913 call smear_init(st%smear, namespace, st%d%ispin, st%fixed_occ, integral_occs, kpoints)
915 unoccupied_states = (st%d%ispin /=
spinors .and. st%nst*2 > st%qtot) .or. (st%d%ispin ==
spinors .and. st%nst > st%qtot)
918 if (.not. unoccupied_states)
then
919 call messages_write(
'Smearing needs unoccupied states (via ExtraStates or TotalStates) to be useful.')
927 charge = charge + sum(st%occ(ist, 1:st%nik) * st%kweights(1:st%nik))
929 if (abs(charge - st%qtot) > 1e-6_real64)
then
930 message(1) =
"Initial occupations do not integrate to total charge."
931 write(
message(2),
'(6x,f12.6,a,f12.6)') charge,
' != ', st%qtot
953 integer :: i, j, nrows
958 st%fixed_spins = .false.
959 if (st%d%ispin /=
spinors)
then
998 spin_fix:
if (
parse_block(namespace,
'InitialSpins', blk) == 0)
then
1000 if (nrows < st%nst)
then
1001 message(1) =
"Please specify one row for each state in InitialSpins, also for extra states."
1011 st%fixed_spins = .
true.
1013 st%spin(:, :, i) = st%spin(:, :, 1)
1026 class(
mesh_t),
intent(in) :: mesh
1027 type(
type_t),
optional,
intent(in) :: wfs_type
1028 logical,
optional,
intent(in) :: skip(:)
1029 logical,
optional,
intent(in) :: packed
1033 if (
present(wfs_type))
then
1035 st%wfs_type = wfs_type
1063 type(
mesh_t),
intent(in) :: mesh
1064 logical,
optional,
intent(in) :: verbose
1065 logical,
optional,
intent(in) :: skip(:)
1066 logical,
optional,
intent(in) :: packed
1068 integer :: ib, iqn, ist, istmin, istmax
1069 logical :: same_node, verbose_, packed_
1070 integer,
allocatable :: bstart(:), bend(:)
1074 safe_allocate(bstart(1:st%nst))
1075 safe_allocate(bend(1:st%nst))
1076 safe_allocate(st%group%iblock(1:st%nst))
1085 if (
present(skip))
then
1087 if (.not. skip(ist))
then
1095 if (
present(skip))
then
1096 do ist = st%nst, istmin, -1
1097 if (.not. skip(ist))
then
1104 if (
present(skip) .and. verbose_)
then
1114 st%group%nblocks = 0
1116 do ist = istmin, istmax
1119 st%group%iblock(ist) = st%group%nblocks + 1
1122 if (st%parallel_in_states .and. ist /= istmax)
then
1125 same_node = (st%node(ist + 1) == st%node(ist))
1128 if (ib == st%block_size .or. ist == istmax .or. .not. same_node)
then
1130 st%group%nblocks = st%group%nblocks + 1
1131 bend(st%group%nblocks) = ist
1132 if (ist /= istmax) bstart(st%group%nblocks + 1) = ist + 1
1136 safe_allocate(st%group%psib(1:st%group%nblocks, st%d%kpt%start:st%d%kpt%end))
1138 safe_allocate(st%group%block_is_local(1:st%group%nblocks, 1:st%nik))
1139 st%group%block_is_local = .false.
1140 st%group%block_start = -1
1141 st%group%block_end = -2
1143 do ib = 1, st%group%nblocks
1144 if (bstart(ib) >= st%st_start .and. bend(ib) <= st%st_end)
then
1145 if (st%group%block_start == -1) st%group%block_start = ib
1146 st%group%block_end = ib
1147 do iqn = st%d%kpt%start, st%d%kpt%end
1148 st%group%block_is_local(ib, iqn) = .
true.
1151 call dwfs_elec_init(st%group%psib(ib, iqn), st%d%dim, bstart(ib), bend(ib), mesh%np_part, iqn, &
1152 special=.
true., packed=packed_)
1154 call zwfs_elec_init(st%group%psib(ib, iqn), st%d%dim, bstart(ib), bend(ib), mesh%np_part, iqn, &
1155 special=.
true., packed=packed_)
1162 safe_allocate(st%group%block_range(1:st%group%nblocks, 1:2))
1163 safe_allocate(st%group%block_size(1:st%group%nblocks))
1165 st%group%block_range(1:st%group%nblocks, 1) = bstart(1:st%group%nblocks)
1166 st%group%block_range(1:st%group%nblocks, 2) = bend(1:st%group%nblocks)
1167 st%group%block_size(1:st%group%nblocks) = bend(1:st%group%nblocks) - bstart(1:st%group%nblocks) + 1
1169 st%group%block_initialized = .
true.
1171 safe_allocate(st%group%block_node(1:st%group%nblocks, 1:st%nik))
1172 st%group%block_node = 0
1174 assert(
allocated(st%node))
1175 assert(all(st%node >= 0) .and. all(st%node < st%mpi_grp%size))
1177 do iqn = st%d%kpt%start, st%d%kpt%end
1178 do ib = st%group%block_start, st%group%block_end
1179 st%group%block_node(ib, iqn) = st%st_kpt_mpi_grp%rank
1188 do ib = 1, st%group%nblocks
1194 if (st%group%block_size(ib) > 0)
then
1224 safe_deallocate_a(bstart)
1225 safe_deallocate_a(bend)
1246 type(
grid_t),
intent(in) :: gr
1248 real(real64) :: fsize
1252 safe_allocate(st%rho(1:gr%np_part, 1:st%d%nspin))
1255 fsize = gr%np_part*8.0_real64*st%block_size
1267 class(
space_t),
intent(in) :: space
1268 class(
mesh_t),
intent(in) :: mesh
1272 if (.not.
allocated(st%current))
then
1273 safe_allocate(st%current(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1277 if (.not.
allocated(st%current_para))
then
1278 safe_allocate(st%current_para(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1282 if (.not.
allocated(st%current_dia))
then
1283 safe_allocate(st%current_dia(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1287 if (.not.
allocated(st%current_mag))
then
1288 safe_allocate(st%current_mag(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1292 if (.not.
allocated(st%current_kpt))
then
1293 safe_allocate(st%current_kpt(1:mesh%np,1:space%dim,st%d%kpt%start:st%d%kpt%end))
1372 default = option__statesorthogonalization__cholesky_serial
1373#ifdef HAVE_SCALAPACK
1375 default = option__statesorthogonalization__cholesky_parallel
1379 call parse_variable(namespace,
'StatesOrthogonalization', default, st%orth_method)
1400 call parse_variable(namespace,
'StatesDeviceMemory', -512.0_real64, st%gpu_states_mem)
1410 subroutine states_elec_copy(stout, stin, exclude_wfns, exclude_eigenval, special)
1413 logical,
optional,
intent(in) :: exclude_wfns
1414 logical,
optional,
intent(in) :: exclude_eigenval
1415 logical,
optional,
intent(in) :: special
1417 logical :: exclude_wfns_
1426 safe_allocate_source_a(stout%kweights, stin%kweights)
1427 stout%nik = stin%nik
1431 stout%wfs_type = stin%wfs_type
1432 stout%nst = stin%nst
1433 stout%block_size = stin%block_size
1434 stout%orth_method = stin%orth_method
1436 stout%gpu_states_mem = stin%gpu_states_mem
1437 stout%pack_states = stin%pack_states
1439 stout%only_userdef_istates = stin%only_userdef_istates
1441 if (.not. exclude_wfns_)
then
1442 safe_allocate_source_a(stout%rho, stin%rho)
1445 stout%uniform_occ = stin%uniform_occ
1448 safe_allocate_source_a(stout%eigenval, stin%eigenval)
1449 safe_allocate_source_a(stout%occ, stin%occ)
1450 safe_allocate_source_a(stout%spin, stin%spin)
1455 stout%group%nblocks = stin%group%nblocks
1457 safe_allocate_source_a(stout%user_def_states, stin%user_def_states)
1459 safe_allocate_source_a(stout%current, stin%current)
1460 safe_allocate_source_a(stout%current_kpt, stin%current_kpt)
1461 safe_allocate_source_a(stout%rho_core, stin%rho_core)
1462 safe_allocate_source_a(stout%frozen_rho, stin%frozen_rho)
1463 safe_allocate_source_a(stout%frozen_tau, stin%frozen_tau)
1464 safe_allocate_source_a(stout%frozen_gdens, stin%frozen_gdens)
1465 safe_allocate_source_a(stout%frozen_ldens, stin%frozen_ldens)
1467 stout%fixed_occ = stin%fixed_occ
1468 stout%restart_fixed_occ = stin%restart_fixed_occ
1470 stout%fixed_spins = stin%fixed_spins
1472 stout%qtot = stin%qtot
1473 stout%val_charge = stin%val_charge
1477 stout%parallel_in_states = stin%parallel_in_states
1480 call mpi_grp_copy(stout%dom_st_kpt_mpi_grp, stin%dom_st_kpt_mpi_grp)
1481 call mpi_grp_copy(stout%st_kpt_mpi_grp, stin%st_kpt_mpi_grp)
1482 call mpi_grp_copy(stout%dom_st_mpi_grp, stin%dom_st_mpi_grp)
1483 safe_allocate_source_a(stout%node, stin%node)
1484 safe_allocate_source_a(stout%st_kpt_task, stin%st_kpt_task)
1486#ifdef HAVE_SCALAPACK
1492 stout%scalapack_compatible = stin%scalapack_compatible
1494 stout%lnst = stin%lnst
1495 stout%st_start = stin%st_start
1496 stout%st_end = stin%st_end
1500 stout%symmetrize_density = stin%symmetrize_density
1504 stout%packed = stin%packed
1506 stout%randomization = stin%randomization
1527 safe_deallocate_a(st%user_def_states)
1529 safe_deallocate_a(st%rho)
1530 safe_deallocate_a(st%eigenval)
1532 safe_deallocate_a(st%current)
1533 safe_deallocate_a(st%current_para)
1534 safe_deallocate_a(st%current_dia)
1535 safe_deallocate_a(st%current_mag)
1536 safe_deallocate_a(st%current_kpt)
1537 safe_deallocate_a(st%rho_core)
1538 safe_deallocate_a(st%frozen_rho)
1539 safe_deallocate_a(st%frozen_tau)
1540 safe_deallocate_a(st%frozen_gdens)
1541 safe_deallocate_a(st%frozen_ldens)
1542 safe_deallocate_a(st%occ)
1543 safe_deallocate_a(st%spin)
1544 safe_deallocate_a(st%kweights)
1547#ifdef HAVE_SCALAPACK
1553 safe_deallocate_a(st%node)
1554 safe_deallocate_a(st%st_kpt_task)
1556 if (st%parallel_in_states)
then
1557 safe_deallocate_a(st%ap%schedule)
1569 class(
mesh_t),
intent(in) :: mesh
1571 integer,
optional,
intent(in) :: ist_start_
1572 integer,
optional,
intent(in) :: ist_end_
1573 integer,
optional,
intent(in) :: ikpt_start_
1574 integer,
optional,
intent(in) :: ikpt_end_
1575 logical,
optional,
intent(in) :: normalized
1578 integer :: ist, ik, id, ist_start, ist_end, jst, ikpt_start, ikpt_end
1579 complex(real64) :: alpha, beta
1580 real(real64),
allocatable :: dpsi(:, :)
1581 complex(real64),
allocatable :: zpsi(:, :), zpsi2(:)
1582 integer :: ikpoint, ip
1585 logical :: normalized_
1596 safe_allocate(dpsi(1:mesh%np, 1:st%d%dim))
1598 safe_allocate(zpsi(1:mesh%np, 1:st%d%dim))
1601 select case (st%d%ispin)
1604 do ik = ikpt_start, ikpt_end
1605 ikpoint = st%d%get_kpoint_index(ik)
1606 do ist = ist_start, ist_end
1610 pre_shift = mesh%pv%xlocal-1, &
1611 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1612 normalized = normalized)
1614 if(mesh%parallel_in_domains)
then
1620 call dmf_random(mesh, dpsi(:, 1), normalized = normalized)
1625 zpsi(ip,1) = cmplx(dpsi(ip,1),
m_zero, real64)
1634 pre_shift = mesh%pv%xlocal-1, &
1635 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1636 normalized = normalized)
1638 if(mesh%parallel_in_domains)
then
1644 call zmf_random(mesh, zpsi(:, 1), normalized = normalized)
1656 if (st%fixed_spins)
then
1658 do ik = ikpt_start, ikpt_end
1659 ikpoint = st%d%get_kpoint_index(ik)
1660 do ist = ist_start, ist_end
1664 pre_shift = mesh%pv%xlocal-1, &
1665 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1666 normalized = normalized)
1668 if(mesh%parallel_in_domains)
then
1674 call dmf_random(mesh, dpsi(:, 1), normalized = normalized)
1678 zpsi(ip,1) = cmplx(dpsi(ip,1),
m_zero, real64)
1684 pre_shift = mesh%pv%xlocal-1, &
1685 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1686 normalized = normalized)
1688 if(mesh%parallel_in_domains)
then
1694 call zmf_random(mesh, zpsi(:, 1), normalized = normalized)
1707 safe_allocate(zpsi2(1:mesh%np))
1708 do jst = ist_start, ist - 1
1710 zpsi(1:mesh%np, 1) = zpsi(1:mesh%np, 1) -
zmf_dotp(mesh, zpsi(:, 1), zpsi2)*zpsi2(1:mesh%np)
1712 safe_deallocate_a(zpsi2)
1715 zpsi(1:mesh%np, 2) = zpsi(1:mesh%np, 1)
1719 if (abs(alpha) >
m_zero)
then
1720 beta = cmplx(st%spin(1, ist, ik) / abs(alpha), st%spin(2, ist, ik) / abs(alpha), real64)
1722 zpsi(1:mesh%np, 1) = alpha*zpsi(1:mesh%np, 1)
1723 zpsi(1:mesh%np, 2) = beta*zpsi(1:mesh%np, 2)
1728 do ik = ikpt_start, ikpt_end
1729 do ist = ist_start, ist_end
1733 pre_shift = mesh%pv%xlocal-1, &
1734 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1735 normalized = .false.)
1737 if(mesh%parallel_in_domains)
then
1743 call zmf_random(mesh, zpsi(:, id), normalized = .false.)
1759 safe_deallocate_a(dpsi)
1760 safe_deallocate_a(zpsi)
1771 class(
mesh_t),
intent(in) :: mesh
1772 logical,
optional,
intent(in) :: compute_spin
1776 real(real64) :: charge
1777 complex(real64),
allocatable :: zpsi(:, :)
1782 st%nik, st%nst, st%kweights)
1789 charge = charge + sum(st%occ(ist, 1:st%nik) * st%kweights(1:st%nik))
1791 if (abs(charge-st%qtot) > 1e-6_real64)
then
1792 message(1) =
'Occupations do not integrate to total charge.'
1793 write(
message(2),
'(6x,f12.8,a,f12.8)') charge,
' != ', st%qtot
1796 message(1) =
"There don't seem to be any electrons at all!"
1806 safe_allocate(zpsi(1:mesh%np, st%d%dim))
1807 do ik = st%d%kpt%start, st%d%kpt%end
1808 do ist = st%st_start, st%st_end
1810 st%spin(1:3, ist, ik) =
state_spin(mesh, zpsi)
1813 safe_deallocate_a(zpsi)
1815 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
1830 real(real64),
optional,
intent(in) :: alt_eig(st%st_start:, st%d%kpt%start:)
1839 do ik = st%d%kpt%start, st%d%kpt%end
1840 if (
present(alt_eig))
then
1841 tot = tot + st%kweights(ik) * sum(st%occ(st%st_start:st%st_end, ik) * &
1842 alt_eig(st%st_start:st%st_end, ik))
1844 tot = tot + st%kweights(ik) * sum(st%occ(st%st_start:st%st_end, ik) * &
1845 st%eigenval(st%st_start:st%st_end, ik))
1849 if (st%parallel_in_states .or. st%d%kpt%parallel)
call comm_allreduce(st%st_kpt_mpi_grp, tot)
1861 logical :: default_scalapack_compatible
1872 st%parallel_in_states = .false.
1876 call mpi_grp_init(st%dom_st_kpt_mpi_grp, mc%dom_st_kpt_comm)
1880 default_scalapack_compatible =
calc_mode_par%scalapack_compat() .and. .not. st%d%kpt%parallel
1894 call parse_variable(namespace,
'ScaLAPACKCompatible', default_scalapack_compatible, st%scalapack_compatible)
1896#ifdef HAVE_SCALAPACK
1897 if (default_scalapack_compatible .neqv. st%scalapack_compatible)
then
1898 call messages_experimental(
'Setting ScaLAPACKCompatible to other than default', namespace=namespace)
1901 if (st%scalapack_compatible)
then
1908 st%scalapack_compatible = .false.
1914 call multicomm_create_all_pairs(st%mpi_grp, st%ap)
1917 if (st%nst < st%mpi_grp%size)
then
1918 message(1) =
"Have more processors than necessary"
1919 write(
message(2),
'(i4,a,i4,a)') st%mpi_grp%size,
" processors and ", st%nst,
" states."
1923 call distributed_init(st%dist, st%nst, st%mpi_grp%comm,
"states", scalapack_compat = st%scalapack_compatible)
1925 st%parallel_in_states = st%dist%parallel
1928 st%st_start = st%dist%start
1929 st%st_end = st%dist%end
1930 st%lnst = st%dist%nlocal
1931 st%node(1:st%nst) = st%dist%node(1:st%nst)
1948 kinetic_energy_density, paramagnetic_current, density_gradient, density_laplacian, &
1949 gi_kinetic_energy_density, st_end)
1950 type(
grid_t),
intent(in) :: gr
1953 logical,
intent(in) :: nlcc
1954 real(real64),
contiguous,
optional,
target,
intent(out) :: kinetic_energy_density(:,:)
1955 real(real64),
contiguous,
optional,
target,
intent(out) :: paramagnetic_current(:,:,:)
1956 real(real64),
contiguous,
optional,
intent(out) :: density_gradient(:,:,:)
1957 real(real64),
contiguous,
optional,
intent(out) :: density_laplacian(:,:)
1958 real(real64),
contiguous,
optional,
intent(out) :: gi_kinetic_energy_density(:,:)
1959 integer,
optional,
intent(in) :: st_end
1961 real(real64),
pointer,
contiguous :: jp(:, :, :)
1962 real(real64),
pointer,
contiguous :: tau(:, :)
1963 complex(real64),
allocatable :: wf_psi(:,:), gwf_psi(:,:,:), wf_psi_conj(:,:), lwf_psi(:,:)
1964 real(real64),
allocatable :: abs_wf_psi(:,:), abs_gwf_psi(:,:)
1965 complex(real64),
allocatable :: psi_gpsi(:,:)
1966 complex(real64) :: c_tmp
1967 integer :: is, ik, ist, i_dim, st_dim, ii, st_end_
1968 real(real64) :: ww, kpoint(gr%der%dim)
1969 logical :: something_to_do
1977 something_to_do =
present(kinetic_energy_density) .or.
present(gi_kinetic_energy_density) .or. &
1978 present(paramagnetic_current) .or.
present(density_gradient) .or.
present(density_laplacian)
1979 assert(something_to_do)
1981 safe_allocate( wf_psi(1:gr%np_part, 1:st%d%dim))
1982 safe_allocate( wf_psi_conj(1:gr%np_part, 1:st%d%dim))
1983 safe_allocate(gwf_psi(1:gr%np, 1:gr%der%dim, 1:st%d%dim))
1984 safe_allocate(abs_wf_psi(1:gr%np, 1:st%d%dim))
1985 safe_allocate(abs_gwf_psi(1:gr%np, 1:st%d%dim))
1986 safe_allocate(psi_gpsi(1:gr%np, 1:st%d%dim))
1987 if (
present(density_laplacian))
then
1988 safe_allocate(lwf_psi(1:gr%np, 1:st%d%dim))
1992 if (
present(kinetic_energy_density)) tau => kinetic_energy_density
1995 if (
present(paramagnetic_current)) jp => paramagnetic_current
1999 if (
present(gi_kinetic_energy_density))
then
2001 safe_allocate(jp(1:gr%np, 1:gr%der%dim, 1:st%d%nspin))
2003 if (.not.
present(kinetic_energy_density))
then
2004 safe_allocate(tau(1:gr%np, 1:st%d%nspin))
2008 if (
associated(tau)) tau =
m_zero
2009 if (
associated(jp)) jp =
m_zero
2010 if (
present(density_gradient)) density_gradient(:,:,:) =
m_zero
2011 if (
present(density_laplacian)) density_laplacian(:,:) =
m_zero
2012 if (
present(gi_kinetic_energy_density)) gi_kinetic_energy_density =
m_zero
2014 do ik = st%d%kpt%start, st%d%kpt%end
2016 kpoint(1:gr%der%dim) = kpoints%get_point(st%d%get_kpoint_index(ik))
2017 is = st%d%get_spin_index(ik)
2019 do ist = st%st_start, st_end_
2020 ww = st%kweights(ik)*st%occ(ist, ik)
2026 do st_dim = 1, st%d%dim
2031 do st_dim = 1, st%d%dim
2032 call zderivatives_grad(gr%der, wf_psi(:,st_dim), gwf_psi(:,:,st_dim), set_bc = .false.)
2036 if (
present(density_laplacian))
then
2037 do st_dim = 1, st%d%dim
2038 call zderivatives_lapl(gr%der, wf_psi(:,st_dim), lwf_psi(:,st_dim), ghost_update = .false., set_bc = .false.)
2043 wf_psi_conj(1:gr%np, 1:st%d%dim) = conjg(wf_psi(1:gr%np,1:st%d%dim))
2044 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)
2046 if (
present(density_laplacian))
then
2047 density_laplacian(1:gr%np, is) = density_laplacian(1:gr%np, is) + &
2048 ww *
m_two*real(wf_psi_conj(1:gr%np, 1) * lwf_psi(1:gr%np, 1), real64)
2049 if (st%d%ispin ==
spinors)
then
2050 density_laplacian(1:gr%np, 2) = density_laplacian(1:gr%np, 2) + &
2051 ww *
m_two*real(wf_psi_conj(1:gr%np, 2) * lwf_psi(1:gr%np, 2), real64)
2054 c_tmp = ww*(lwf_psi(ii, 1) * wf_psi_conj(ii, 2) + wf_psi(ii, 1) * conjg(lwf_psi(ii, 2)))
2055 density_laplacian(ii, 3) = density_laplacian(ii, 3) + real(c_tmp, real64)
2056 density_laplacian(ii, 4) = density_laplacian(ii, 4) + aimag(c_tmp)
2061 if (
associated(tau))
then
2062 tau(1:gr%np, is) = tau(1:gr%np, is) &
2063 + ww * sum(kpoint(1:gr%der%dim)**2) * abs_wf_psi(1:gr%np, 1)
2064 if (st%d%ispin ==
spinors)
then
2065 tau(1:gr%np, 2) = tau(1:gr%np, 2) &
2066 + ww * sum(kpoint(1:gr%der%dim)**2) * abs_wf_psi(1:gr%np, 2)
2070 c_tmp = ww * sum(kpoint(1:gr%der%dim)**2) * wf_psi(ii, 1) * wf_psi_conj(ii, 2)
2071 tau(ii, 3) = tau(ii, 3) + real(c_tmp, real64)
2072 tau(ii, 4) = tau(ii, 4) + aimag(c_tmp)
2077 do i_dim = 1, gr%der%dim
2080 psi_gpsi(1:gr%np, 1:st%d%dim) = wf_psi_conj(1:gr%np, 1:st%d%dim) &
2081 * gwf_psi(1:gr%np,i_dim,1:st%d%dim)
2082 abs_gwf_psi(1:gr%np, 1:st%d%dim) = real(conjg(gwf_psi(1:gr%np, i_dim, 1:st%d%dim)) &
2083 * gwf_psi(1:gr%np, i_dim, 1:st%d%dim), real64)
2085 if (
present(density_gradient))
then
2086 density_gradient(1:gr%np, i_dim, is) = density_gradient(1:gr%np, i_dim, is) &
2087 + ww *
m_two * real(psi_gpsi(1:gr%np, 1), real64)
2088 if (st%d%ispin ==
spinors)
then
2089 density_gradient(1:gr%np, i_dim, 2) = density_gradient(1:gr%np, i_dim, 2) &
2090 + ww *
m_two*real(psi_gpsi(1:gr%np, 2), real64)
2093 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)))
2094 density_gradient(ii, i_dim, 3) = density_gradient(ii, i_dim, 3) + real(c_tmp, real64)
2095 density_gradient(ii, i_dim, 4) = density_gradient(ii, i_dim, 4) + aimag(c_tmp)
2100 if (
present(density_laplacian))
then
2101 call lalg_axpy(gr%np, ww*
m_two, abs_gwf_psi(:,1), density_laplacian(:,is))
2102 if (st%d%ispin ==
spinors)
then
2103 call lalg_axpy(gr%np, ww*
m_two, abs_gwf_psi(:,2), density_laplacian(:,2))
2106 c_tmp =
m_two * ww * gwf_psi(ii, i_dim, 1) * conjg(gwf_psi(ii, i_dim, 2))
2107 density_laplacian(ii, 3) = density_laplacian(ii, 3) + real(c_tmp, real64)
2108 density_laplacian(ii, 4) = density_laplacian(ii, 4) + aimag(c_tmp)
2116 if (
associated(jp))
then
2118 jp(1:gr%np, i_dim, is) = jp(1:gr%np, i_dim, is) + &
2119 ww*(aimag(psi_gpsi(1:gr%np, 1)) - abs_wf_psi(1:gr%np, 1)*kpoint(i_dim))
2120 if (st%d%ispin ==
spinors)
then
2121 jp(1:gr%np, i_dim, 2) = jp(1:gr%np, i_dim, 2) + &
2122 ww*( aimag(psi_gpsi(1:gr%np, 2)) - abs_wf_psi(1:gr%np, 2)*kpoint(i_dim))
2125 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)) &
2126 -
m_two *
m_zi*wf_psi(ii, 1)*wf_psi_conj(ii, 2)*kpoint(i_dim))
2127 jp(ii, i_dim, 3) = jp(ii, i_dim, 3) + real(c_tmp, real64)
2128 jp(ii, i_dim, 4) = jp(ii, i_dim, 4) + aimag(c_tmp)
2137 if (
associated(tau))
then
2138 tau(1:gr%np, is) = tau(1:gr%np, is) + ww*(abs_gwf_psi(1:gr%np,1) &
2139 -
m_two*aimag(psi_gpsi(1:gr%np, 1))*kpoint(i_dim))
2140 if (st%d%ispin ==
spinors)
then
2141 tau(1:gr%np, 2) = tau(1:gr%np, 2) + ww*(abs_gwf_psi(1:gr%np, 2) &
2142 -
m_two*aimag(psi_gpsi(1:gr%np, 2))*kpoint(i_dim))
2145 c_tmp = ww * ( gwf_psi(ii, i_dim, 1)*conjg(gwf_psi(ii, i_dim, 2)) &
2146 +
m_zi * (gwf_psi(ii,i_dim,1)*wf_psi_conj(ii, 2) &
2147 - wf_psi(ii, 1)*conjg(gwf_psi(ii,i_dim,2)))*kpoint(i_dim))
2148 tau(ii, 3) = tau(ii, 3) + real(c_tmp, real64)
2149 tau(ii, 4) = tau(ii, 4) + aimag(c_tmp)
2159 safe_deallocate_a(wf_psi_conj)
2160 safe_deallocate_a(abs_wf_psi)
2161 safe_deallocate_a(abs_gwf_psi)
2162 safe_deallocate_a(psi_gpsi)
2164 if (.not.
present(gi_kinetic_energy_density))
then
2165 if (.not.
present(paramagnetic_current))
then
2166 safe_deallocate_p(jp)
2168 if (.not.
present(kinetic_energy_density))
then
2169 safe_deallocate_p(tau)
2173 if (st%parallel_in_states .or. st%d%kpt%parallel)
call reduce_all(st%st_kpt_mpi_grp)
2178 if (st%symmetrize_density)
then
2179 do is = 1, st%d%nspin
2180 if (
associated(tau))
then
2184 if (
present(density_laplacian))
then
2188 if (
associated(jp))
then
2192 if (
present(density_gradient))
then
2199 if (
allocated(st%rho_core) .and. nlcc .and. (
present(density_laplacian) .or.
present(density_gradient)))
then
2201 wf_psi(ii, 1) = st%rho_core(ii)/st%d%spin_channels
2206 if (
present(density_gradient))
then
2209 do is = 1, st%d%spin_channels
2210 density_gradient(1:gr%np, 1:gr%der%dim, is) = density_gradient(1:gr%np, 1:gr%der%dim, is) + &
2211 real(gwf_psi(1:gr%np, 1:gr%der%dim,1))
2216 if (
present(density_laplacian))
then
2219 do is = 1, st%d%spin_channels
2220 density_laplacian(1:gr%np, is) = density_laplacian(1:gr%np, is) + real(lwf_psi(1:gr%np, 1))
2227 if (
allocated(st%frozen_tau) .and. .not.
present(st_end))
then
2230 if (
allocated(st%frozen_gdens) .and. .not.
present(st_end))
then
2231 do is = 1, st%d%nspin
2232 call lalg_axpy(gr%np, gr%der%dim,
m_one, st%frozen_gdens(:,:,is), density_gradient(:,:,is))
2235 if (
allocated(st%frozen_tau) .and. .not.
present(st_end))
then
2236 call lalg_axpy(gr%np, st%d%nspin,
m_one, st%frozen_ldens, density_laplacian)
2239 safe_deallocate_a(wf_psi)
2240 safe_deallocate_a(gwf_psi)
2241 safe_deallocate_a(lwf_psi)
2245 if (
present(gi_kinetic_energy_density))
then
2246 do is = 1, st%d%nspin
2247 assert(
associated(tau))
2248 gi_kinetic_energy_density(1:gr%np, is) = tau(1:gr%np, is)
2251 assert(
associated(jp))
2252 if (st%d%ispin /=
spinors)
then
2253 do is = 1, st%d%nspin
2256 if (st%rho(ii, is) < 1.0e-7_real64) cycle
2257 gi_kinetic_energy_density(ii, is) = &
2258 gi_kinetic_energy_density(ii, is) - sum(jp(ii,1:gr%der%dim, is)**2)/st%rho(ii, is)
2264 gi_kinetic_energy_density(ii, 1) = gi_kinetic_energy_density(ii, 1) &
2265 - sum(jp(ii,1:gr%der%dim, 1)**2)/(safe_tol(st%rho(ii, 1),
m_epsilon))
2266 gi_kinetic_energy_density(ii, 2) = gi_kinetic_energy_density(ii, 2) &
2267 - sum(jp(ii,1:gr%der%dim, 2)**2)/(safe_tol(st%rho(ii, 2),
m_epsilon))
2268 gi_kinetic_energy_density(ii, 3) = &
2269 gi_kinetic_energy_density(ii, 3) - sum(jp(ii,1:gr%der%dim, 3)**2 + jp(ii,1:gr%der%dim, 4)**2) &
2270 /(safe_tol((st%rho(ii, 3)**2 + st%rho(ii, 4)**2),
m_epsilon))*st%rho(ii, 3)
2271 gi_kinetic_energy_density(ii, 4) = &
2272 gi_kinetic_energy_density(ii, 4) + sum(jp(ii,1:gr%der%dim, 3)**2 + jp(ii,1:gr%der%dim, 4)**2) &
2273 /(safe_tol((st%rho(ii, 3)**2 + st%rho(ii, 4)**2),
m_epsilon))*st%rho(ii, 4)
2279 if (.not.
present(kinetic_energy_density))
then
2280 safe_deallocate_p(tau)
2282 if (.not.
present(paramagnetic_current))
then
2283 safe_deallocate_p(jp)
2298 if (
associated(tau))
call comm_allreduce(grp, tau, dim = (/gr%np, st%d%nspin/))
2300 if (
present(density_laplacian))
call comm_allreduce(grp, density_laplacian, dim = (/gr%np, st%d%nspin/))
2302 do is = 1, st%d%nspin
2303 if (
associated(jp))
call comm_allreduce(grp, jp(:, :, is), dim = (/gr%np, gr%der%dim/))
2305 if (
present(density_gradient))
then
2306 call comm_allreduce(grp, density_gradient(:, :, is), dim = (/gr%np, gr%der%dim/))
2320 type(
mesh_t),
intent(in) :: mesh
2321 complex(real64),
intent(in) :: f1(:, :)
2322 real(real64) :: spin(1:3)
2324 complex(real64) :: z
2328 z =
zmf_dotp(mesh, f1(:, 1) , f1(:, 2))
2330 spin(1) =
m_two*real(z, real64)
2331 spin(2) =
m_two*aimag(z)
2343 integer,
intent(in) :: ist
2357 integer,
intent(in) :: ist
2358 integer,
intent(in) :: ik
2363 ik >= st%d%kpt%start .and. ik <= st%d%kpt%end
2373 class(
mesh_t),
intent(in) :: mesh
2379 memory = memory + real64*real(mesh%np_part_global, real64) *st%d%dim*real(st%nst, real64) *st%d%kpt%nglobal
2389 logical,
optional,
intent(in) :: copy
2392 integer(int64) :: max_mem, mem
2404 if (accel_is_enabled())
then
2405 max_mem = accel_global_memory_size()
2407 if (st%gpu_states_mem > m_one)
then
2408 max_mem = int(st%gpu_states_mem, int64)*(1024_8)**2
2409 else if (st%gpu_states_mem < 0.0_real64)
then
2410 max_mem = max_mem + int(st%gpu_states_mem, int64)*(1024_8)**2
2412 max_mem = int(st%gpu_states_mem*real(max_mem, real64) , int64)
2415 max_mem = huge(max_mem)
2419 qnloop:
do iqn = st%d%kpt%start, st%d%kpt%end
2420 do ib = st%group%block_start, st%group%block_end
2422 mem = mem + st%group%psib(ib, iqn)%pack_total_size()
2424 if (mem > max_mem)
then
2425 call messages_write(
'Not enough CL device memory to store all states simultaneously.', new_line = .
true.)
2426 call messages_write(
'Only ')
2427 call messages_write(ib - st%group%block_start)
2428 call messages_write(
' of ')
2429 call messages_write(st%group%block_end - st%group%block_start + 1)
2430 call messages_write(
' blocks will be stored in device memory.', new_line = .
true.)
2431 call messages_warning()
2435 call st%group%psib(ib, iqn)%do_pack(copy)
2447 logical,
optional,
intent(in) :: copy
2456 do iqn = st%d%kpt%start, st%d%kpt%end
2457 do ib = st%group%block_start, st%group%block_end
2458 if (st%group%psib(ib, iqn)%is_packed())
call st%group%psib(ib, iqn)%do_unpack(copy)
2471 type(namespace_t),
intent(in) :: namespace
2475 call messages_print_with_emphasis(msg=
"States", namespace=namespace)
2477 write(message(1),
'(a,f12.3)')
'Total electronic charge = ', st%qtot
2478 write(message(2),
'(a,i8)')
'Number of states = ', st%nst
2479 write(message(3),
'(a,i8)')
'States block-size = ', st%block_size
2480 call messages_info(3, namespace=namespace)
2482 call messages_print_with_emphasis(namespace=namespace)
2495 do iqn = st%d%kpt%start, st%d%kpt%end
2496 do ib = st%group%block_start, st%group%block_end
2497 call batch_set_zero(st%group%psib(ib, iqn))
2507 integer pure function states_elec_block_min(st, ib) result(range)
2509 integer,
intent(in) :: ib
2511 range = st%group%block_range(ib, 1)
2517 integer pure function states_elec_block_max(st, ib) result(range)
2519 integer,
intent(in) :: ib
2521 range = st%group%block_range(ib, 2)
2527 integer pure function states_elec_block_size(st, ib) result(size)
2529 integer,
intent(in) :: ib
2531 size = st%group%block_size(ib)
2539 type(namespace_t),
intent(in) :: namespace
2540 integer,
intent(out) :: n_pairs
2541 integer,
intent(out) :: n_occ(:)
2542 integer,
intent(out) :: n_unocc(:)
2543 logical,
allocatable,
intent(out) :: is_included(:,:,:)
2545 logical,
intent(out) :: is_frac_occ
2547 integer :: ik, ist, ast, n_filled, n_partially_filled, n_half_filled
2548 character(len=80) :: nst_string, default, wfn_list
2549 real(real64) :: energy_window
2553 is_frac_occ = .false.
2555 call occupied_states(st, namespace, ik, n_filled, n_partially_filled, n_half_filled)
2556 if (n_partially_filled > 0 .or. n_half_filled > 0) is_frac_occ = .
true.
2557 n_occ(ik) = n_filled + n_partially_filled + n_half_filled
2558 n_unocc(ik) = st%nst - n_filled
2571 call parse_variable(namespace,
'CasidaKSEnergyWindow', -m_one, energy_window, units_inp%energy)
2594 safe_allocate(is_included(maxval(n_occ), minval(n_occ) + 1:st%nst , st%nik))
2595 is_included(:,:,:) = .false.
2597 if (energy_window < m_zero)
then
2598 write(nst_string,
'(i6)') st%nst
2599 write(default,
'(a,a)')
"1-", trim(adjustl(nst_string))
2600 call parse_variable(namespace,
'CasidaKohnShamStates', default, wfn_list)
2602 write(message(1),
'(a,a)')
"Info: States that form the basis: ", trim(wfn_list)
2603 call messages_info(1, namespace=namespace)
2608 do ast = n_occ(ik) + 1, st%nst
2609 if (loct_isinstringlist(ast, wfn_list))
then
2610 do ist = 1, n_occ(ik)
2611 if (loct_isinstringlist(ist, wfn_list))
then
2612 n_pairs = n_pairs + 1
2613 is_included(ist, ast, ik) = .
true.
2622 write(message(1),
'(a,f12.6,a)')
"Info: including transitions with energy < ", &
2623 units_from_atomic(units_out%energy, energy_window), trim(units_abbrev(units_out%energy))
2624 call messages_info(1, namespace=namespace)
2629 do ast = n_occ(ik) + 1, st%nst
2630 do ist = 1, n_occ(ik)
2631 if (st%eigenval(ast, ik) - st%eigenval(ist, ik) < energy_window)
then
2632 n_pairs = n_pairs + 1
2633 is_included(ist, ast, ik) = .
true.
2661 subroutine occupied_states(st, namespace, ik, n_filled, n_partially_filled, n_half_filled, &
2662 filled, partially_filled, half_filled)
2664 type(namespace_t),
intent(in) :: namespace
2665 integer,
intent(in) :: ik
2666 integer,
intent(out) :: n_filled, n_partially_filled, n_half_filled
2667 integer,
optional,
intent(out) :: filled(:), partially_filled(:), half_filled(:)
2673 if (
present(filled)) filled(:) = 0
2674 if (
present(partially_filled)) partially_filled(:) = 0
2675 if (
present(half_filled)) half_filled(:) = 0
2677 n_partially_filled = 0
2680 select case (st%d%ispin)
2683 if (abs(st%occ(ist, ik) - m_two) < m_min_occ)
then
2684 n_filled = n_filled + 1
2685 if (
present(filled)) filled(n_filled) = ist
2686 else if (abs(st%occ(ist, ik) - m_one) < m_min_occ)
then
2687 n_half_filled = n_half_filled + 1
2688 if (
present(half_filled)) half_filled(n_half_filled) = ist
2689 else if (st%occ(ist, ik) > m_min_occ)
then
2690 n_partially_filled = n_partially_filled + 1
2691 if (
present(partially_filled)) partially_filled(n_partially_filled) = ist
2692 else if (abs(st%occ(ist, ik)) > m_min_occ)
then
2693 write(message(1),*)
'Internal error in occupied_states: Illegal occupation value ', st%occ(ist, ik)
2694 call messages_fatal(1, namespace=namespace)
2697 case (spin_polarized, spinors)
2699 if (abs(st%occ(ist, ik)-m_one) < m_min_occ)
then
2700 n_filled = n_filled + 1
2701 if (
present(filled)) filled(n_filled) = ist
2702 else if (st%occ(ist, ik) > m_min_occ)
then
2703 n_partially_filled = n_partially_filled + 1
2704 if (
present(partially_filled)) partially_filled(n_partially_filled) = ist
2705 else if (abs(st%occ(ist, ik)) > m_min_occ)
then
2706 write(message(1),*)
'Internal error in occupied_states: Illegal occupation value ', st%occ(ist, ik)
2707 call messages_fatal(1, namespace=namespace)
2719 type(multicomm_t),
intent(in) :: mc
2722 call distributed_init(this%d%kpt, this%nik, mc%group_comm(p_strategy_kpoints),
"k-points")
2737 if (.not.
allocated(st%st_kpt_task))
then
2738 safe_allocate(st%st_kpt_task(0:st%st_kpt_mpi_grp%size-1, 1:4))
2741 st%st_kpt_task(0:st%st_kpt_mpi_grp%size-1, :) = 0
2742 st%st_kpt_task(st%st_kpt_mpi_grp%rank, :) = [st%st_start, st%st_end, st%d%kpt%start, st%d%kpt%end]
2744 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
2745 call comm_allreduce(st%st_kpt_mpi_grp, st%st_kpt_task)
2756 type(kpoints_t),
intent(in) :: kpoints
2757 type(namespace_t),
intent(in) :: namespace
2760 type(states_elec_dim_t),
pointer :: dd
2767 st%nik = kpoints_number(kpoints)
2769 if (dd%ispin == spin_polarized) st%nik = 2*st%nik
2771 safe_allocate(st%kweights(1:st%nik))
2774 ik = dd%get_kpoint_index(iq)
2775 st%kweights(iq) = kpoints%get_weight(ik)
2787 call io_mkdir(
'debug/', namespace)
2788 iunit = io_open(
'debug/kpoints', namespace, action =
'write')
2789 call kpoints%write_info(iunit=iunit, absolute_coordinates = .
true.)
2790 call io_close(iunit)
2804 class(mesh_t),
intent(in) :: gr
2805 real(real64) :: dipole(1:gr%box%dim)
2808 real(real64) :: e_dip(1:gr%box%dim, this%d%spin_channels)
2812 do ispin = 1, this%d%spin_channels
2813 call dmf_dipole(gr, this%rho(:, ispin), e_dip(:, ispin))
2816 dipole(:) = sum(e_dip(:, 1:this%d%spin_channels), 2)
2824#include "states_elec_inc.F90"
2827#include "complex.F90"
2828#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)
System information (time, memory, sysname)
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)
MPI_THREAD_FUNNELED allows for calls to MPI from an OMP region if the thread is the team master.
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)
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 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 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_init(st, namespace, space, valence_charge, kpoints, calc_mode_id)
Initialize a new 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)
Explicitly 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.