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) :: ps_local(3,3) =
m_zero
114 real(real64) :: ps_nl(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 :: 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
202 type(mpi_grp_t) :: dom_st_mpi_grp
203 type(mpi_grp_t) :: st_kpt_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) :: gpu_states_mem
236 integer,
public,
parameter :: &
280 real(real64),
intent(in) :: valence_charge
282 integer,
optional,
intent(in) :: calc_mode_id
284 real(real64) :: excess_charge, nempty_percent
285 integer :: nempty, ntot, default
286 integer :: nempty_conv, nempty_conv_default
287 logical :: force, adapt_for_chebyshev
288 real(real64),
parameter :: tol = 1e-13_real64
290 integer,
parameter :: rs_chebyshev = 12
291 integer(int64),
parameter :: chebyshev_compatible_modes(3) = &
292 [option__calculationmode__gs, option__calculationmode__go, option__calculationmode__unocc]
301 st%d%ispin = space%ispin
306 if (st%d%ispin /=
unpolarized .and. kpoints%use_time_reversal)
then
307 message(1) =
"Time reversal symmetry is only implemented for unpolarized spins."
308 message(2) =
"Use KPointsUseTimeReversal = no."
340 write(
message(1),
'(a,i5,a)')
"Input: '", ntot,
"' is not a valid value for TotalStates."
362 write(
message(1),
'(a,i5,a)')
"Input: '", nempty,
"' is not a valid value for ExtraStates."
363 message(2) =
'(0 <= ExtraStates)'
367 if (ntot > 0 .and. nempty > 0)
then
368 message(1) =
'You cannot set TotalStates and ExtraStates at the same time.'
383 if (nempty_percent < 0)
then
384 write(
message(1),
'(a,f8.6,a)')
"Input: '", nempty_percent, &
385 "' should be a percentage value x (where x is parts in hundred) larger or equal 0"
389 if (nempty > 0 .and. nempty_percent > 0)
then
390 message(1) =
'You cannot set ExtraStates and ExtraStatesInPercent at the same time.'
395 adapt_for_chebyshev = .false.
396 if (
present(calc_mode_id))
then
397 if (any(calc_mode_id == chebyshev_compatible_modes))
then
400 if (es == rs_chebyshev)
then
402 adapt_for_chebyshev = .
true.
406 if (adapt_for_chebyshev)
then
409 message(1) =
'Chebyshev filtering eigensolver detected. Setting ExtraStatesInPercent = 15'
417 st%val_charge = valence_charge
419 st%qtot = -(st%val_charge + excess_charge)
422 write(
message(1),
'(a,f12.6,a)')
'Total charge = ', st%qtot,
' < 0'
423 message(2) =
'Check Species and ExcessCharge.'
427 select case (st%d%ispin)
430 st%nst = nint(st%qtot/2)
431 if (st%nst*2 - st%qtot < -tol) st%nst = st%nst + 1
433 st%d%spin_channels = 1
436 st%nst = nint(st%qtot/2)
437 if (st%nst*2 - st%qtot < -tol) st%nst = st%nst + 1
439 st%d%spin_channels = 2
442 st%nst = nint(st%qtot)
443 if (st%nst - st%qtot < -tol) st%nst = st%nst + 1
445 st%d%spin_channels = 2
448 if (nempty_percent > 0)
then
449 nempty = ceiling(nempty_percent * st%nst / 100)
469 nempty_conv_default = nempty
470 if (adapt_for_chebyshev)
then
472 nempty_conv_default = min(int(0.8*nempty), nempty - 1)
474 call parse_variable(namespace,
'ExtraStatesToConverge', nempty_conv_default, nempty_conv)
475 if (nempty_conv < 0)
then
476 write(
message(1),
'(a,i5,a)')
"Input: '", nempty_conv,
"' is not a valid value for ExtraStatesToConverge."
477 message(2) =
'(0 <= ExtraStatesToConverge)'
481 if (nempty_conv > nempty)
then
483 message(1) =
'You cannot set ExtraStatesToConverge to a higher value than ExtraStates.'
484 message(2) =
'Capping ExtraStatesToConverge to ExtraStates.'
489 if (ntot < st%nst)
then
490 message(1) =
'TotalStates is smaller than the number of states required by the system.'
497 st%nst_conv = st%nst + nempty_conv
498 st%nst = st%nst + nempty
499 if (st%nst == 0)
then
500 message(1) =
"Cannot run with number of states = zero."
518 default =
accel%warp_size
527 call parse_variable(namespace,
'StatesBlockSize', default, st%block_size)
528 if (st%block_size < 1)
then
529 call messages_write(
"The variable 'StatesBlockSize' must be greater than 0.")
533 st%block_size = min(st%block_size, st%nst)
534 conf%target_states_block_size = st%block_size
536 safe_allocate(st%eigenval(1:st%nst, 1:st%nik))
537 st%eigenval = huge(st%eigenval)
541 if (.not. kpoints%gamma_only())
then
554 call parse_variable(namespace,
'OnlyUserDefinedInitialStates', .false., st%only_userdef_istates)
557 safe_allocate(st%occ (1:st%nst, 1:st%nik))
562 safe_allocate(st%user_def_states(1:st%d%dim, 1:st%nst, 1:st%nik))
564 st%user_def_states(1:st%d%dim, 1:st%nst, 1:st%nik) =
'undefined'
567 if (st%d%ispin ==
spinors)
then
568 safe_allocate(st%spin(1:3, 1:st%nst, 1:st%nik))
595 if (st%smear%photodop)
then
596 if (nempty == 0)
then
597 write(
message(1),
'(a,i5,a)')
"PhotoDoping requires to specify ExtraStates."
598 message(2) =
'(0 == ExtraStates)'
606 safe_allocate(st%node(1:st%nst))
607 st%node(1:st%nst) = 0
610 st%parallel_in_states = .false.
624 call parse_variable(namespace,
'SymmetrizeDensity', kpoints%use_symmetries, st%symmetrize_density)
654 integer,
intent(out) :: nik
655 integer,
intent(out) :: dim
656 integer,
intent(out) :: nst
657 integer,
intent(out) :: ierr
659 character(len=256) :: lines(3)
660 character(len=20) :: char
667 iunit = restart%open(
'states')
668 call restart%read(iunit, lines, 3, ierr)
670 read(lines(1), *) char, nst
671 read(lines(2), *) char, dim
672 read(lines(3), *) char, nik
674 call restart%close(iunit)
692 real(real64),
intent(in) :: excess_charge
695 integer :: ik, ist, ispin, nspin, ncols, nrows, el_per_state, icol, start_pos, spin_n
697 real(real64) :: rr, charge
698 logical :: integral_occs, unoccupied_states
699 real(real64),
allocatable :: read_occs(:, :)
700 real(real64) :: charge_in_block
713 call parse_variable(namespace,
'RestartFixedOccupations', .
true., st%restart_fixed_occ)
786 occ_fix:
if (
parse_block(namespace,
'Occupations', blk) == 0)
then
788 st%fixed_occ = .
true.
791 if (ncols > st%nst)
then
796 if (nrows /= st%nik)
then
797 call messages_input_error(namespace,
"Occupations",
"Wrong number of rows in block Occupations.")
800 do ik = 1, st%nik - 1
803 "All rows in block Occupations must have the same number of columns.")
814 safe_allocate(read_occs(1:ncols, 1:st%nik))
820 charge_in_block = charge_in_block + read_occs(icol, ik) * st%kweights(ik)
825 select case (st%d%ispin)
834 start_pos = nint((st%qtot - charge_in_block)/spin_n)
836 if (start_pos + ncols > st%nst)
then
837 message(1) =
"To balance charge, the first column in block Occupations is taken to refer to state"
838 write(
message(2),
'(a,i6,a)')
"number ", start_pos,
" but there are too many columns for the number of states."
839 write(
message(3),
'(a,i6,a)')
"Solution: set ExtraStates = ", start_pos + ncols - st%nst
844 do ist = 1, start_pos
845 st%occ(ist, ik) = el_per_state
850 do ist = start_pos + 1, start_pos + ncols
851 st%occ(ist, ik) = read_occs(ist - start_pos, ik)
852 integral_occs = integral_occs .and. &
853 abs((st%occ(ist, ik) - el_per_state) * st%occ(ist, ik)) <=
m_epsilon
858 do ist = start_pos + ncols + 1, st%nst
865 safe_deallocate_a(read_occs)
868 st%fixed_occ = .false.
869 integral_occs = .false.
876 st%qtot = -(st%val_charge + excess_charge)
879 if (st%d%nspin == 2) nspin = 2
881 do ik = 1, st%nik, nspin
884 do ispin = ik, ik + nspin - 1
885 st%occ(ist, ispin) = min(rr, -(st%val_charge + excess_charge) - charge)
886 charge = charge + st%occ(ist, ispin)
905 if (st%fixed_occ)
then
906 call parse_variable(namespace,
'RestartReorderOccs', .false., st%restart_reorder_occs)
908 st%restart_reorder_occs = .false.
911 call smear_init(st%smear, namespace, st%d%ispin, st%fixed_occ, integral_occs, kpoints)
913 unoccupied_states = (st%d%ispin /=
spinors .and. st%nst*2 > st%qtot) .or. (st%d%ispin ==
spinors .and. st%nst > st%qtot)
916 if (.not. unoccupied_states)
then
917 call messages_write(
'Smearing needs unoccupied states (via ExtraStates or TotalStates) to be useful.')
925 charge = charge + sum(st%occ(ist, 1:st%nik) * st%kweights(1:st%nik))
927 if (abs(charge - st%qtot) > 1e-6_real64)
then
928 message(1) =
"Initial occupations do not integrate to total charge."
929 write(
message(2),
'(6x,f12.6,a,f12.6)') charge,
' != ', st%qtot
951 integer :: i, j, nrows
956 st%fixed_spins = .false.
957 if (st%d%ispin /=
spinors)
then
996 spin_fix:
if (
parse_block(namespace,
'InitialSpins', blk) == 0)
then
998 if (nrows < st%nst)
then
999 message(1) =
"Please specify one row for each state in InitialSpins, also for extra states."
1009 st%fixed_spins = .
true.
1011 st%spin(:, :, i) = st%spin(:, :, 1)
1024 class(
mesh_t),
intent(in) :: mesh
1025 type(
type_t),
optional,
intent(in) :: wfs_type
1026 logical,
optional,
intent(in) :: skip(:)
1027 logical,
optional,
intent(in) :: packed
1031 if (
present(wfs_type))
then
1033 st%wfs_type = wfs_type
1061 type(
mesh_t),
intent(in) :: mesh
1062 logical,
optional,
intent(in) :: verbose
1063 logical,
optional,
intent(in) :: skip(:)
1064 logical,
optional,
intent(in) :: packed
1066 integer :: ib, iqn, ist, istmin, istmax
1067 logical :: same_node, verbose_, packed_
1068 integer,
allocatable :: bstart(:), bend(:)
1072 safe_allocate(bstart(1:st%nst))
1073 safe_allocate(bend(1:st%nst))
1074 safe_allocate(st%group%iblock(1:st%nst))
1083 if (
present(skip))
then
1085 if (.not. skip(ist))
then
1093 if (
present(skip))
then
1094 do ist = st%nst, istmin, -1
1095 if (.not. skip(ist))
then
1102 if (
present(skip) .and. verbose_)
then
1112 st%group%nblocks = 0
1114 do ist = istmin, istmax
1117 st%group%iblock(ist) = st%group%nblocks + 1
1120 if (st%parallel_in_states .and. ist /= istmax)
then
1123 same_node = (st%node(ist + 1) == st%node(ist))
1126 if (ib == st%block_size .or. ist == istmax .or. .not. same_node)
then
1128 st%group%nblocks = st%group%nblocks + 1
1129 bend(st%group%nblocks) = ist
1130 if (ist /= istmax) bstart(st%group%nblocks + 1) = ist + 1
1134 safe_allocate(st%group%psib(1:st%group%nblocks, st%d%kpt%start:st%d%kpt%end))
1136 safe_allocate(st%group%block_is_local(1:st%group%nblocks, 1:st%nik))
1137 st%group%block_is_local = .false.
1138 st%group%block_start = -1
1139 st%group%block_end = -2
1141 do ib = 1, st%group%nblocks
1142 if (bstart(ib) >= st%st_start .and. bend(ib) <= st%st_end)
then
1143 if (st%group%block_start == -1) st%group%block_start = ib
1144 st%group%block_end = ib
1145 do iqn = st%d%kpt%start, st%d%kpt%end
1146 st%group%block_is_local(ib, iqn) = .
true.
1149 call dwfs_elec_init(st%group%psib(ib, iqn), st%d%dim, bstart(ib), bend(ib), mesh%np_part, iqn, &
1150 special=.
true., packed=packed_)
1152 call zwfs_elec_init(st%group%psib(ib, iqn), st%d%dim, bstart(ib), bend(ib), mesh%np_part, iqn, &
1153 special=.
true., packed=packed_)
1160 safe_allocate(st%group%block_range(1:st%group%nblocks, 1:2))
1161 safe_allocate(st%group%block_size(1:st%group%nblocks))
1163 st%group%block_range(1:st%group%nblocks, 1) = bstart(1:st%group%nblocks)
1164 st%group%block_range(1:st%group%nblocks, 2) = bend(1:st%group%nblocks)
1165 st%group%block_size(1:st%group%nblocks) = bend(1:st%group%nblocks) - bstart(1:st%group%nblocks) + 1
1167 st%group%block_initialized = .
true.
1169 safe_allocate(st%group%block_node(1:st%group%nblocks, 1:st%nik))
1170 st%group%block_node = 0
1172 assert(
allocated(st%node))
1173 assert(all(st%node >= 0) .and. all(st%node < st%mpi_grp%size))
1175 do iqn = st%d%kpt%start, st%d%kpt%end
1176 do ib = st%group%block_start, st%group%block_end
1177 st%group%block_node(ib, iqn) = st%st_kpt_mpi_grp%rank
1186 do ib = 1, st%group%nblocks
1192 if (st%group%block_size(ib) > 0)
then
1222 safe_deallocate_a(bstart)
1223 safe_deallocate_a(bend)
1244 type(
grid_t),
intent(in) :: gr
1246 real(real64) :: fsize
1250 safe_allocate(st%rho(1:gr%np_part, 1:st%d%nspin))
1253 fsize = gr%np_part*8.0_real64*st%block_size
1265 class(
space_t),
intent(in) :: space
1266 class(
mesh_t),
intent(in) :: mesh
1270 if (.not.
allocated(st%current))
then
1271 safe_allocate(st%current(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1275 if (.not.
allocated(st%current_para))
then
1276 safe_allocate(st%current_para(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1280 if (.not.
allocated(st%current_dia))
then
1281 safe_allocate(st%current_dia(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1285 if (.not.
allocated(st%current_mag))
then
1286 safe_allocate(st%current_mag(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1290 if (.not.
allocated(st%current_kpt))
then
1291 safe_allocate(st%current_kpt(1:mesh%np,1:space%dim,st%d%kpt%start:st%d%kpt%end))
1370 default = option__statesorthogonalization__cholesky_serial
1371#ifdef HAVE_SCALAPACK
1373 default = option__statesorthogonalization__cholesky_parallel
1377 call parse_variable(namespace,
'StatesOrthogonalization', default, st%orth_method)
1398 call parse_variable(namespace,
'StatesDeviceMemory', -512.0_real64, st%gpu_states_mem)
1408 subroutine states_elec_copy(stout, stin, exclude_wfns, exclude_eigenval, special)
1411 logical,
optional,
intent(in) :: exclude_wfns
1412 logical,
optional,
intent(in) :: exclude_eigenval
1413 logical,
optional,
intent(in) :: special
1415 logical :: exclude_wfns_
1424 safe_allocate_source_a(stout%kweights, stin%kweights)
1425 stout%nik = stin%nik
1429 stout%wfs_type = stin%wfs_type
1430 stout%nst = stin%nst
1431 stout%block_size = stin%block_size
1432 stout%orth_method = stin%orth_method
1434 stout%gpu_states_mem = stin%gpu_states_mem
1435 stout%pack_states = stin%pack_states
1437 stout%only_userdef_istates = stin%only_userdef_istates
1439 if (.not. exclude_wfns_)
then
1440 safe_allocate_source_a(stout%rho, stin%rho)
1443 stout%uniform_occ = stin%uniform_occ
1446 safe_allocate_source_a(stout%eigenval, stin%eigenval)
1447 safe_allocate_source_a(stout%occ, stin%occ)
1448 safe_allocate_source_a(stout%spin, stin%spin)
1453 stout%group%nblocks = stin%group%nblocks
1455 safe_allocate_source_a(stout%user_def_states, stin%user_def_states)
1457 safe_allocate_source_a(stout%current, stin%current)
1458 safe_allocate_source_a(stout%current_kpt, stin%current_kpt)
1459 safe_allocate_source_a(stout%rho_core, stin%rho_core)
1460 safe_allocate_source_a(stout%frozen_rho, stin%frozen_rho)
1461 safe_allocate_source_a(stout%frozen_tau, stin%frozen_tau)
1462 safe_allocate_source_a(stout%frozen_gdens, stin%frozen_gdens)
1463 safe_allocate_source_a(stout%frozen_ldens, stin%frozen_ldens)
1465 stout%fixed_occ = stin%fixed_occ
1466 stout%restart_fixed_occ = stin%restart_fixed_occ
1468 stout%fixed_spins = stin%fixed_spins
1470 stout%qtot = stin%qtot
1471 stout%val_charge = stin%val_charge
1475 stout%parallel_in_states = stin%parallel_in_states
1477 call mpi_grp_copy(stout%dom_st_kpt_mpi_grp, stin%dom_st_kpt_mpi_grp)
1478 call mpi_grp_copy(stout%st_kpt_mpi_grp, stin%st_kpt_mpi_grp)
1479 call mpi_grp_copy(stout%dom_st_mpi_grp, stin%dom_st_mpi_grp)
1480 safe_allocate_source_a(stout%node, stin%node)
1481 safe_allocate_source_a(stout%st_kpt_task, stin%st_kpt_task)
1483#ifdef HAVE_SCALAPACK
1489 stout%scalapack_compatible = stin%scalapack_compatible
1491 stout%lnst = stin%lnst
1492 stout%st_start = stin%st_start
1493 stout%st_end = stin%st_end
1497 stout%symmetrize_density = stin%symmetrize_density
1501 stout%packed = stin%packed
1503 stout%randomization = stin%randomization
1524 safe_deallocate_a(st%user_def_states)
1526 safe_deallocate_a(st%rho)
1527 safe_deallocate_a(st%eigenval)
1529 safe_deallocate_a(st%current)
1530 safe_deallocate_a(st%current_para)
1531 safe_deallocate_a(st%current_dia)
1532 safe_deallocate_a(st%current_mag)
1533 safe_deallocate_a(st%current_kpt)
1534 safe_deallocate_a(st%rho_core)
1535 safe_deallocate_a(st%frozen_rho)
1536 safe_deallocate_a(st%frozen_tau)
1537 safe_deallocate_a(st%frozen_gdens)
1538 safe_deallocate_a(st%frozen_ldens)
1539 safe_deallocate_a(st%occ)
1540 safe_deallocate_a(st%spin)
1541 safe_deallocate_a(st%kweights)
1544#ifdef HAVE_SCALAPACK
1550 safe_deallocate_a(st%node)
1551 safe_deallocate_a(st%st_kpt_task)
1553 if (st%parallel_in_states)
then
1554 safe_deallocate_a(st%ap%schedule)
1566 class(
mesh_t),
intent(in) :: mesh
1568 integer,
optional,
intent(in) :: ist_start_
1569 integer,
optional,
intent(in) :: ist_end_
1570 integer,
optional,
intent(in) :: ikpt_start_
1571 integer,
optional,
intent(in) :: ikpt_end_
1572 logical,
optional,
intent(in) :: normalized
1575 integer :: ist, ik, id, ist_start, ist_end, jst, ikpt_start, ikpt_end
1576 complex(real64) :: alpha, beta
1577 real(real64),
allocatable :: dpsi(:, :)
1578 complex(real64),
allocatable :: zpsi(:, :), zpsi2(:)
1579 integer :: ikpoint, ip
1582 logical :: normalized_
1593 safe_allocate(dpsi(1:mesh%np, 1:st%d%dim))
1595 safe_allocate(zpsi(1:mesh%np, 1:st%d%dim))
1598 select case (st%d%ispin)
1601 do ik = ikpt_start, ikpt_end
1602 ikpoint = st%d%get_kpoint_index(ik)
1603 do ist = ist_start, ist_end
1607 pre_shift = mesh%pv%xlocal-1, &
1608 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1609 normalized = normalized)
1611 if(mesh%parallel_in_domains)
then
1617 call dmf_random(mesh, dpsi(:, 1), normalized = normalized)
1622 zpsi(ip,1) = cmplx(dpsi(ip,1),
m_zero, real64)
1631 pre_shift = mesh%pv%xlocal-1, &
1632 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1633 normalized = normalized)
1635 if(mesh%parallel_in_domains)
then
1641 call zmf_random(mesh, zpsi(:, 1), normalized = normalized)
1653 if (st%fixed_spins)
then
1655 do ik = ikpt_start, ikpt_end
1656 ikpoint = st%d%get_kpoint_index(ik)
1657 do ist = ist_start, ist_end
1661 pre_shift = mesh%pv%xlocal-1, &
1662 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1663 normalized = normalized)
1665 if(mesh%parallel_in_domains)
then
1671 call dmf_random(mesh, dpsi(:, 1), normalized = normalized)
1675 zpsi(ip,1) = cmplx(dpsi(ip,1),
m_zero, real64)
1681 pre_shift = mesh%pv%xlocal-1, &
1682 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1683 normalized = normalized)
1685 if(mesh%parallel_in_domains)
then
1691 call zmf_random(mesh, zpsi(:, 1), normalized = normalized)
1704 safe_allocate(zpsi2(1:mesh%np))
1705 do jst = ist_start, ist - 1
1707 zpsi(1:mesh%np, 1) = zpsi(1:mesh%np, 1) -
zmf_dotp(mesh, zpsi(:, 1), zpsi2)*zpsi2(1:mesh%np)
1709 safe_deallocate_a(zpsi2)
1712 zpsi(1:mesh%np, 2) = zpsi(1:mesh%np, 1)
1716 if (abs(alpha) >
m_zero)
then
1717 beta = cmplx(st%spin(1, ist, ik) / abs(alpha), st%spin(2, ist, ik) / abs(alpha), real64)
1719 zpsi(1:mesh%np, 1) = alpha*zpsi(1:mesh%np, 1)
1720 zpsi(1:mesh%np, 2) = beta*zpsi(1:mesh%np, 2)
1725 do ik = ikpt_start, ikpt_end
1726 do ist = ist_start, ist_end
1730 pre_shift = mesh%pv%xlocal-1, &
1731 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1732 normalized = .false.)
1734 if(mesh%parallel_in_domains)
then
1740 call zmf_random(mesh, zpsi(:, id), normalized = .false.)
1756 safe_deallocate_a(dpsi)
1757 safe_deallocate_a(zpsi)
1768 class(
mesh_t),
intent(in) :: mesh
1769 logical,
optional,
intent(in) :: compute_spin
1773 real(real64) :: charge
1774 complex(real64),
allocatable :: zpsi(:, :)
1779 st%nik, st%nst, st%kweights)
1786 charge = charge + sum(st%occ(ist, 1:st%nik) * st%kweights(1:st%nik))
1788 if (abs(charge-st%qtot) > 1e-6_real64)
then
1789 message(1) =
'Occupations do not integrate to total charge.'
1790 write(
message(2),
'(6x,f12.8,a,f12.8)') charge,
' != ', st%qtot
1793 message(1) =
"There don't seem to be any electrons at all!"
1803 safe_allocate(zpsi(1:mesh%np, st%d%dim))
1804 do ik = st%d%kpt%start, st%d%kpt%end
1805 do ist = st%st_start, st%st_end
1807 st%spin(1:3, ist, ik) =
state_spin(mesh, zpsi)
1810 safe_deallocate_a(zpsi)
1812 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
1827 real(real64),
optional,
intent(in) :: alt_eig(st%st_start:, st%d%kpt%start:)
1836 do ik = st%d%kpt%start, st%d%kpt%end
1837 if (
present(alt_eig))
then
1838 tot = tot + st%kweights(ik) * sum(st%occ(st%st_start:st%st_end, ik) * &
1839 alt_eig(st%st_start:st%st_end, ik))
1841 tot = tot + st%kweights(ik) * sum(st%occ(st%st_start:st%st_end, ik) * &
1842 st%eigenval(st%st_start:st%st_end, ik))
1846 if (st%parallel_in_states .or. st%d%kpt%parallel)
call comm_allreduce(st%st_kpt_mpi_grp, tot)
1858 logical :: default_scalapack_compatible
1869 st%parallel_in_states = .false.
1872 call mpi_grp_init(st%dom_st_kpt_mpi_grp, mc%dom_st_kpt_comm)
1876 default_scalapack_compatible =
calc_mode_par%scalapack_compat() .and. .not. st%d%kpt%parallel
1890 call parse_variable(namespace,
'ScaLAPACKCompatible', default_scalapack_compatible, st%scalapack_compatible)
1892#ifdef HAVE_SCALAPACK
1893 if (default_scalapack_compatible .neqv. st%scalapack_compatible)
then
1894 call messages_experimental(
'Setting ScaLAPACKCompatible to other than default', namespace=namespace)
1897 if (st%scalapack_compatible)
then
1904 st%scalapack_compatible = .false.
1910 call multicomm_create_all_pairs(st%mpi_grp, st%ap)
1913 if (st%nst < st%mpi_grp%size)
then
1914 message(1) =
"Have more processors than necessary"
1915 write(
message(2),
'(i4,a,i4,a)') st%mpi_grp%size,
" processors and ", st%nst,
" states."
1919 call distributed_init(st%dist, st%nst, st%mpi_grp%comm,
"states", scalapack_compat = st%scalapack_compatible)
1921 st%parallel_in_states = st%dist%parallel
1924 st%st_start = st%dist%start
1925 st%st_end = st%dist%end
1926 st%lnst = st%dist%nlocal
1927 st%node(1:st%nst) = st%dist%node(1:st%nst)
1944 kinetic_energy_density, paramagnetic_current, density_gradient, density_laplacian, &
1945 gi_kinetic_energy_density, st_end)
1946 type(
grid_t),
intent(in) :: gr
1949 logical,
intent(in) :: nlcc
1950 real(real64),
contiguous,
optional,
target,
intent(out) :: kinetic_energy_density(:,:)
1951 real(real64),
contiguous,
optional,
target,
intent(out) :: paramagnetic_current(:,:,:)
1952 real(real64),
contiguous,
optional,
intent(out) :: density_gradient(:,:,:)
1953 real(real64),
contiguous,
optional,
intent(out) :: density_laplacian(:,:)
1954 real(real64),
contiguous,
optional,
intent(out) :: gi_kinetic_energy_density(:,:)
1955 integer,
optional,
intent(in) :: st_end
1957 real(real64),
pointer,
contiguous :: jp(:, :, :)
1958 real(real64),
pointer,
contiguous :: tau(:, :)
1959 complex(real64),
allocatable :: wf_psi(:,:), gwf_psi(:,:,:), wf_psi_conj(:,:), lwf_psi(:,:)
1960 real(real64),
allocatable :: abs_wf_psi(:,:), abs_gwf_psi(:,:)
1961 complex(real64),
allocatable :: psi_gpsi(:,:)
1962 complex(real64) :: c_tmp
1963 integer :: is, ik, ist, i_dim, st_dim, ii, st_end_
1964 real(real64) :: ww, kpoint(gr%der%dim)
1965 logical :: something_to_do
1973 something_to_do =
present(kinetic_energy_density) .or.
present(gi_kinetic_energy_density) .or. &
1974 present(paramagnetic_current) .or.
present(density_gradient) .or.
present(density_laplacian)
1975 assert(something_to_do)
1977 safe_allocate( wf_psi(1:gr%np_part, 1:st%d%dim))
1978 safe_allocate( wf_psi_conj(1:gr%np_part, 1:st%d%dim))
1979 safe_allocate(gwf_psi(1:gr%np, 1:gr%der%dim, 1:st%d%dim))
1980 safe_allocate(abs_wf_psi(1:gr%np, 1:st%d%dim))
1981 safe_allocate(abs_gwf_psi(1:gr%np, 1:st%d%dim))
1982 safe_allocate(psi_gpsi(1:gr%np, 1:st%d%dim))
1983 if (
present(density_laplacian))
then
1984 safe_allocate(lwf_psi(1:gr%np, 1:st%d%dim))
1988 if (
present(kinetic_energy_density)) tau => kinetic_energy_density
1991 if (
present(paramagnetic_current)) jp => paramagnetic_current
1995 if (
present(gi_kinetic_energy_density))
then
1997 safe_allocate(jp(1:gr%np, 1:gr%der%dim, 1:st%d%nspin))
1999 if (.not.
present(kinetic_energy_density))
then
2000 safe_allocate(tau(1:gr%np, 1:st%d%nspin))
2004 if (
associated(tau)) tau =
m_zero
2005 if (
associated(jp)) jp =
m_zero
2006 if (
present(density_gradient)) density_gradient(:,:,:) =
m_zero
2007 if (
present(density_laplacian)) density_laplacian(:,:) =
m_zero
2008 if (
present(gi_kinetic_energy_density)) gi_kinetic_energy_density =
m_zero
2010 do ik = st%d%kpt%start, st%d%kpt%end
2012 kpoint(1:gr%der%dim) = kpoints%get_point(st%d%get_kpoint_index(ik))
2013 is = st%d%get_spin_index(ik)
2015 do ist = st%st_start, st_end_
2016 ww = st%kweights(ik)*st%occ(ist, ik)
2022 do st_dim = 1, st%d%dim
2027 do st_dim = 1, st%d%dim
2028 call zderivatives_grad(gr%der, wf_psi(:,st_dim), gwf_psi(:,:,st_dim), set_bc = .false.)
2032 if (
present(density_laplacian))
then
2033 do st_dim = 1, st%d%dim
2034 call zderivatives_lapl(gr%der, wf_psi(:,st_dim), lwf_psi(:,st_dim), ghost_update = .false., set_bc = .false.)
2039 wf_psi_conj(1:gr%np, 1:st%d%dim) = conjg(wf_psi(1:gr%np,1:st%d%dim))
2040 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)
2042 if (
present(density_laplacian))
then
2043 density_laplacian(1:gr%np, is) = density_laplacian(1:gr%np, is) + &
2044 ww *
m_two*real(wf_psi_conj(1:gr%np, 1) * lwf_psi(1:gr%np, 1), real64)
2045 if (st%d%ispin ==
spinors)
then
2046 density_laplacian(1:gr%np, 2) = density_laplacian(1:gr%np, 2) + &
2047 ww *
m_two*real(wf_psi_conj(1:gr%np, 2) * lwf_psi(1:gr%np, 2), real64)
2050 c_tmp = ww*(lwf_psi(ii, 1) * wf_psi_conj(ii, 2) + wf_psi(ii, 1) * conjg(lwf_psi(ii, 2)))
2051 density_laplacian(ii, 3) = density_laplacian(ii, 3) + real(c_tmp, real64)
2052 density_laplacian(ii, 4) = density_laplacian(ii, 4) + aimag(c_tmp)
2057 if (
associated(tau))
then
2058 tau(1:gr%np, is) = tau(1:gr%np, is) &
2059 + ww * sum(kpoint(1:gr%der%dim)**2) * abs_wf_psi(1:gr%np, 1)
2060 if (st%d%ispin ==
spinors)
then
2061 tau(1:gr%np, 2) = tau(1:gr%np, 2) &
2062 + ww * sum(kpoint(1:gr%der%dim)**2) * abs_wf_psi(1:gr%np, 2)
2066 c_tmp = ww * sum(kpoint(1:gr%der%dim)**2) * wf_psi(ii, 1) * wf_psi_conj(ii, 2)
2067 tau(ii, 3) = tau(ii, 3) + real(c_tmp, real64)
2068 tau(ii, 4) = tau(ii, 4) + aimag(c_tmp)
2073 do i_dim = 1, gr%der%dim
2076 psi_gpsi(1:gr%np, 1:st%d%dim) = wf_psi_conj(1:gr%np, 1:st%d%dim) &
2077 * gwf_psi(1:gr%np,i_dim,1:st%d%dim)
2078 abs_gwf_psi(1:gr%np, 1:st%d%dim) = real(conjg(gwf_psi(1:gr%np, i_dim, 1:st%d%dim)) &
2079 * gwf_psi(1:gr%np, i_dim, 1:st%d%dim), real64)
2081 if (
present(density_gradient))
then
2082 density_gradient(1:gr%np, i_dim, is) = density_gradient(1:gr%np, i_dim, is) &
2083 + ww *
m_two * real(psi_gpsi(1:gr%np, 1), real64)
2084 if (st%d%ispin ==
spinors)
then
2085 density_gradient(1:gr%np, i_dim, 2) = density_gradient(1:gr%np, i_dim, 2) &
2086 + ww *
m_two*real(psi_gpsi(1:gr%np, 2), real64)
2089 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)))
2090 density_gradient(ii, i_dim, 3) = density_gradient(ii, i_dim, 3) + real(c_tmp, real64)
2091 density_gradient(ii, i_dim, 4) = density_gradient(ii, i_dim, 4) + aimag(c_tmp)
2096 if (
present(density_laplacian))
then
2097 call lalg_axpy(gr%np, ww*
m_two, abs_gwf_psi(:,1), density_laplacian(:,is))
2098 if (st%d%ispin ==
spinors)
then
2099 call lalg_axpy(gr%np, ww*
m_two, abs_gwf_psi(:,2), density_laplacian(:,2))
2102 c_tmp =
m_two * ww * gwf_psi(ii, i_dim, 1) * conjg(gwf_psi(ii, i_dim, 2))
2103 density_laplacian(ii, 3) = density_laplacian(ii, 3) + real(c_tmp, real64)
2104 density_laplacian(ii, 4) = density_laplacian(ii, 4) + aimag(c_tmp)
2112 if (
associated(jp))
then
2114 jp(1:gr%np, i_dim, is) = jp(1:gr%np, i_dim, is) + &
2115 ww*(aimag(psi_gpsi(1:gr%np, 1)) - abs_wf_psi(1:gr%np, 1)*kpoint(i_dim))
2116 if (st%d%ispin ==
spinors)
then
2117 jp(1:gr%np, i_dim, 2) = jp(1:gr%np, i_dim, 2) + &
2118 ww*( aimag(psi_gpsi(1:gr%np, 2)) - abs_wf_psi(1:gr%np, 2)*kpoint(i_dim))
2121 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)) &
2122 -
m_two *
m_zi*wf_psi(ii, 1)*wf_psi_conj(ii, 2)*kpoint(i_dim))
2123 jp(ii, i_dim, 3) = jp(ii, i_dim, 3) + real(c_tmp, real64)
2124 jp(ii, i_dim, 4) = jp(ii, i_dim, 4) + aimag(c_tmp)
2133 if (
associated(tau))
then
2134 tau(1:gr%np, is) = tau(1:gr%np, is) + ww*(abs_gwf_psi(1:gr%np,1) &
2135 -
m_two*aimag(psi_gpsi(1:gr%np, 1))*kpoint(i_dim))
2136 if (st%d%ispin ==
spinors)
then
2137 tau(1:gr%np, 2) = tau(1:gr%np, 2) + ww*(abs_gwf_psi(1:gr%np, 2) &
2138 -
m_two*aimag(psi_gpsi(1:gr%np, 2))*kpoint(i_dim))
2141 c_tmp = ww * ( gwf_psi(ii, i_dim, 1)*conjg(gwf_psi(ii, i_dim, 2)) &
2142 +
m_zi * (gwf_psi(ii,i_dim,1)*wf_psi_conj(ii, 2) &
2143 - wf_psi(ii, 1)*conjg(gwf_psi(ii,i_dim,2)))*kpoint(i_dim))
2144 tau(ii, 3) = tau(ii, 3) + real(c_tmp, real64)
2145 tau(ii, 4) = tau(ii, 4) + aimag(c_tmp)
2155 safe_deallocate_a(wf_psi_conj)
2156 safe_deallocate_a(abs_wf_psi)
2157 safe_deallocate_a(abs_gwf_psi)
2158 safe_deallocate_a(psi_gpsi)
2160 if (.not.
present(gi_kinetic_energy_density))
then
2161 if (.not.
present(paramagnetic_current))
then
2162 safe_deallocate_p(jp)
2164 if (.not.
present(kinetic_energy_density))
then
2165 safe_deallocate_p(tau)
2169 if (st%parallel_in_states .or. st%d%kpt%parallel)
call reduce_all(st%st_kpt_mpi_grp)
2174 if (st%symmetrize_density)
then
2175 do is = 1, st%d%nspin
2176 if (
associated(tau))
then
2180 if (
present(density_laplacian))
then
2184 if (
associated(jp))
then
2188 if (
present(density_gradient))
then
2195 if (
allocated(st%rho_core) .and. nlcc .and. (
present(density_laplacian) .or.
present(density_gradient)))
then
2197 wf_psi(ii, 1) = st%rho_core(ii)/st%d%spin_channels
2202 if (
present(density_gradient))
then
2205 do is = 1, st%d%spin_channels
2206 density_gradient(1:gr%np, 1:gr%der%dim, is) = density_gradient(1:gr%np, 1:gr%der%dim, is) + &
2207 real(gwf_psi(1:gr%np, 1:gr%der%dim,1))
2212 if (
present(density_laplacian))
then
2215 do is = 1, st%d%spin_channels
2216 density_laplacian(1:gr%np, is) = density_laplacian(1:gr%np, is) + real(lwf_psi(1:gr%np, 1))
2223 if (
allocated(st%frozen_tau) .and. .not.
present(st_end))
then
2226 if (
allocated(st%frozen_gdens) .and. .not.
present(st_end))
then
2227 do is = 1, st%d%nspin
2228 call lalg_axpy(gr%np, gr%der%dim,
m_one, st%frozen_gdens(:,:,is), density_gradient(:,:,is))
2231 if (
allocated(st%frozen_tau) .and. .not.
present(st_end))
then
2232 call lalg_axpy(gr%np, st%d%nspin,
m_one, st%frozen_ldens, density_laplacian)
2235 safe_deallocate_a(wf_psi)
2236 safe_deallocate_a(gwf_psi)
2237 safe_deallocate_a(lwf_psi)
2241 if (
present(gi_kinetic_energy_density))
then
2242 do is = 1, st%d%nspin
2243 assert(
associated(tau))
2244 gi_kinetic_energy_density(1:gr%np, is) = tau(1:gr%np, is)
2247 assert(
associated(jp))
2248 if (st%d%ispin /=
spinors)
then
2249 do is = 1, st%d%nspin
2252 if (st%rho(ii, is) < 1.0e-7_real64) cycle
2253 gi_kinetic_energy_density(ii, is) = &
2254 gi_kinetic_energy_density(ii, is) - sum(jp(ii,1:gr%der%dim, is)**2)/st%rho(ii, is)
2260 gi_kinetic_energy_density(ii, 1) = gi_kinetic_energy_density(ii, 1) &
2261 - sum(jp(ii,1:gr%der%dim, 1)**2)/(safe_tol(st%rho(ii, 1),
m_epsilon))
2262 gi_kinetic_energy_density(ii, 2) = gi_kinetic_energy_density(ii, 2) &
2263 - sum(jp(ii,1:gr%der%dim, 2)**2)/(safe_tol(st%rho(ii, 2),
m_epsilon))
2264 gi_kinetic_energy_density(ii, 3) = &
2265 gi_kinetic_energy_density(ii, 3) - sum(jp(ii,1:gr%der%dim, 3)**2 + jp(ii,1:gr%der%dim, 4)**2) &
2266 /(safe_tol((st%rho(ii, 3)**2 + st%rho(ii, 4)**2),
m_epsilon))*st%rho(ii, 3)
2267 gi_kinetic_energy_density(ii, 4) = &
2268 gi_kinetic_energy_density(ii, 4) + sum(jp(ii,1:gr%der%dim, 3)**2 + jp(ii,1:gr%der%dim, 4)**2) &
2269 /(safe_tol((st%rho(ii, 3)**2 + st%rho(ii, 4)**2),
m_epsilon))*st%rho(ii, 4)
2275 if (.not.
present(kinetic_energy_density))
then
2276 safe_deallocate_p(tau)
2278 if (.not.
present(paramagnetic_current))
then
2279 safe_deallocate_p(jp)
2294 if (
associated(tau))
call comm_allreduce(grp, tau, dim = (/gr%np, st%d%nspin/))
2296 if (
present(density_laplacian))
call comm_allreduce(grp, density_laplacian, dim = (/gr%np, st%d%nspin/))
2298 do is = 1, st%d%nspin
2299 if (
associated(jp))
call comm_allreduce(grp, jp(:, :, is), dim = (/gr%np, gr%der%dim/))
2301 if (
present(density_gradient))
then
2302 call comm_allreduce(grp, density_gradient(:, :, is), dim = (/gr%np, gr%der%dim/))
2316 type(
mesh_t),
intent(in) :: mesh
2317 complex(real64),
intent(in) :: f1(:, :)
2318 real(real64) :: spin(1:3)
2320 complex(real64) :: z
2324 z =
zmf_dotp(mesh, f1(:, 1) , f1(:, 2))
2326 spin(1) =
m_two*real(z, real64)
2327 spin(2) =
m_two*aimag(z)
2339 integer,
intent(in) :: ist
2353 integer,
intent(in) :: ist
2354 integer,
intent(in) :: ik
2359 ik >= st%d%kpt%start .and. ik <= st%d%kpt%end
2369 class(
mesh_t),
intent(in) :: mesh
2375 memory = memory + real64*real(mesh%np_part_global, real64) *st%d%dim*real(st%nst, real64) *st%d%kpt%nglobal
2385 logical,
optional,
intent(in) :: copy
2388 integer(int64) :: max_mem, mem
2400 if (accel_is_enabled())
then
2401 max_mem = accel_global_memory_size()
2403 if (st%gpu_states_mem > m_one)
then
2404 max_mem = int(st%gpu_states_mem, int64)*(1024_8)**2
2405 else if (st%gpu_states_mem < 0.0_real64)
then
2406 max_mem = max_mem + int(st%gpu_states_mem, int64)*(1024_8)**2
2408 max_mem = int(st%gpu_states_mem*real(max_mem, real64) , int64)
2411 max_mem = huge(max_mem)
2415 qnloop:
do iqn = st%d%kpt%start, st%d%kpt%end
2416 do ib = st%group%block_start, st%group%block_end
2418 mem = mem + st%group%psib(ib, iqn)%pack_total_size()
2420 if (mem > max_mem)
then
2421 call messages_write(
'Not enough CL device memory to store all states simultaneously.', new_line = .
true.)
2422 call messages_write(
'Only ')
2423 call messages_write(ib - st%group%block_start)
2424 call messages_write(
' of ')
2425 call messages_write(st%group%block_end - st%group%block_start + 1)
2426 call messages_write(
' blocks will be stored in device memory.', new_line = .
true.)
2427 call messages_warning()
2431 call st%group%psib(ib, iqn)%do_pack(copy)
2443 logical,
optional,
intent(in) :: copy
2452 do iqn = st%d%kpt%start, st%d%kpt%end
2453 do ib = st%group%block_start, st%group%block_end
2454 if (st%group%psib(ib, iqn)%is_packed())
call st%group%psib(ib, iqn)%do_unpack(copy)
2467 type(namespace_t),
intent(in) :: namespace
2471 call messages_print_with_emphasis(msg=
"States", namespace=namespace)
2473 write(message(1),
'(a,f12.3)')
'Total electronic charge = ', st%qtot
2474 write(message(2),
'(a,i8)')
'Number of states = ', st%nst
2475 write(message(3),
'(a,i8)')
'States block-size = ', st%block_size
2476 call messages_info(3, namespace=namespace)
2478 call messages_print_with_emphasis(namespace=namespace)
2491 do iqn = st%d%kpt%start, st%d%kpt%end
2492 do ib = st%group%block_start, st%group%block_end
2493 call batch_set_zero(st%group%psib(ib, iqn))
2503 integer pure function states_elec_block_min(st, ib) result(range)
2505 integer,
intent(in) :: ib
2507 range = st%group%block_range(ib, 1)
2513 integer pure function states_elec_block_max(st, ib) result(range)
2515 integer,
intent(in) :: ib
2517 range = st%group%block_range(ib, 2)
2523 integer pure function states_elec_block_size(st, ib) result(size)
2525 integer,
intent(in) :: ib
2527 size = st%group%block_size(ib)
2535 type(namespace_t),
intent(in) :: namespace
2536 integer,
intent(out) :: n_pairs
2537 integer,
intent(out) :: n_occ(:)
2538 integer,
intent(out) :: n_unocc(:)
2539 logical,
allocatable,
intent(out) :: is_included(:,:,:)
2541 logical,
intent(out) :: is_frac_occ
2543 integer :: ik, ist, ast, n_filled, n_partially_filled, n_half_filled
2544 character(len=80) :: nst_string, default, wfn_list
2545 real(real64) :: energy_window
2549 is_frac_occ = .false.
2551 call occupied_states(st, namespace, ik, n_filled, n_partially_filled, n_half_filled)
2552 if (n_partially_filled > 0 .or. n_half_filled > 0) is_frac_occ = .
true.
2553 n_occ(ik) = n_filled + n_partially_filled + n_half_filled
2554 n_unocc(ik) = st%nst - n_filled
2567 call parse_variable(namespace,
'CasidaKSEnergyWindow', -m_one, energy_window, units_inp%energy)
2590 safe_allocate(is_included(maxval(n_occ), minval(n_occ) + 1:st%nst , st%nik))
2591 is_included(:,:,:) = .false.
2593 if (energy_window < m_zero)
then
2594 write(nst_string,
'(i6)') st%nst
2595 write(default,
'(a,a)')
"1-", trim(adjustl(nst_string))
2596 call parse_variable(namespace,
'CasidaKohnShamStates', default, wfn_list)
2598 write(message(1),
'(a,a)')
"Info: States that form the basis: ", trim(wfn_list)
2599 call messages_info(1, namespace=namespace)
2604 do ast = n_occ(ik) + 1, st%nst
2605 if (loct_isinstringlist(ast, wfn_list))
then
2606 do ist = 1, n_occ(ik)
2607 if (loct_isinstringlist(ist, wfn_list))
then
2608 n_pairs = n_pairs + 1
2609 is_included(ist, ast, ik) = .
true.
2618 write(message(1),
'(a,f12.6,a)')
"Info: including transitions with energy < ", &
2619 units_from_atomic(units_out%energy, energy_window), trim(units_abbrev(units_out%energy))
2620 call messages_info(1, namespace=namespace)
2625 do ast = n_occ(ik) + 1, st%nst
2626 do ist = 1, n_occ(ik)
2627 if (st%eigenval(ast, ik) - st%eigenval(ist, ik) < energy_window)
then
2628 n_pairs = n_pairs + 1
2629 is_included(ist, ast, ik) = .
true.
2657 subroutine occupied_states(st, namespace, ik, n_filled, n_partially_filled, n_half_filled, &
2658 filled, partially_filled, half_filled)
2660 type(namespace_t),
intent(in) :: namespace
2661 integer,
intent(in) :: ik
2662 integer,
intent(out) :: n_filled, n_partially_filled, n_half_filled
2663 integer,
optional,
intent(out) :: filled(:), partially_filled(:), half_filled(:)
2669 if (
present(filled)) filled(:) = 0
2670 if (
present(partially_filled)) partially_filled(:) = 0
2671 if (
present(half_filled)) half_filled(:) = 0
2673 n_partially_filled = 0
2676 select case (st%d%ispin)
2679 if (abs(st%occ(ist, ik) - m_two) < m_min_occ)
then
2680 n_filled = n_filled + 1
2681 if (
present(filled)) filled(n_filled) = ist
2682 else if (abs(st%occ(ist, ik) - m_one) < m_min_occ)
then
2683 n_half_filled = n_half_filled + 1
2684 if (
present(half_filled)) half_filled(n_half_filled) = ist
2685 else if (st%occ(ist, ik) > m_min_occ)
then
2686 n_partially_filled = n_partially_filled + 1
2687 if (
present(partially_filled)) partially_filled(n_partially_filled) = ist
2688 else if (abs(st%occ(ist, ik)) > m_min_occ)
then
2689 write(message(1),*)
'Internal error in occupied_states: Illegal occupation value ', st%occ(ist, ik)
2690 call messages_fatal(1, namespace=namespace)
2693 case (spin_polarized, spinors)
2695 if (abs(st%occ(ist, ik)-m_one) < m_min_occ)
then
2696 n_filled = n_filled + 1
2697 if (
present(filled)) filled(n_filled) = ist
2698 else if (st%occ(ist, ik) > m_min_occ)
then
2699 n_partially_filled = n_partially_filled + 1
2700 if (
present(partially_filled)) partially_filled(n_partially_filled) = ist
2701 else if (abs(st%occ(ist, ik)) > m_min_occ)
then
2702 write(message(1),*)
'Internal error in occupied_states: Illegal occupation value ', st%occ(ist, ik)
2703 call messages_fatal(1, namespace=namespace)
2715 type(multicomm_t),
intent(in) :: mc
2718 call distributed_init(this%d%kpt, this%nik, mc%group_comm(p_strategy_kpoints),
"k-points")
2733 if (.not.
allocated(st%st_kpt_task))
then
2734 safe_allocate(st%st_kpt_task(0:st%st_kpt_mpi_grp%size-1, 1:4))
2737 st%st_kpt_task(0:st%st_kpt_mpi_grp%size-1, :) = 0
2738 st%st_kpt_task(st%st_kpt_mpi_grp%rank, :) = [st%st_start, st%st_end, st%d%kpt%start, st%d%kpt%end]
2740 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
2741 call comm_allreduce(st%st_kpt_mpi_grp, st%st_kpt_task)
2752 type(kpoints_t),
intent(in) :: kpoints
2753 type(namespace_t),
intent(in) :: namespace
2756 type(states_elec_dim_t),
pointer :: dd
2763 st%nik = kpoints_number(kpoints)
2765 if (dd%ispin == spin_polarized) st%nik = 2*st%nik
2767 safe_allocate(st%kweights(1:st%nik))
2770 ik = dd%get_kpoint_index(iq)
2771 st%kweights(iq) = kpoints%get_weight(ik)
2783 call io_mkdir(
'debug/', namespace)
2784 iunit = io_open(
'debug/kpoints', namespace, action =
'write')
2785 call kpoints%write_info(iunit=iunit, absolute_coordinates = .
true.)
2786 call io_close(iunit)
2800 class(mesh_t),
intent(in) :: gr
2801 real(real64) :: dipole(1:gr%box%dim)
2804 real(real64) :: e_dip(1:gr%box%dim, this%d%spin_channels)
2808 do ispin = 1, this%d%spin_channels
2809 call dmf_dipole(gr, this%rho(:, ispin), e_dip(:, ispin))
2812 dipole(:) = sum(e_dip(:, 1:this%d%spin_channels), 2)
2820#include "states_elec_inc.F90"
2823#include "complex.F90"
2824#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.