35 use,
intrinsic :: iso_fortran_env
107 real(real64) :: total(3,3) =
m_zero
108 real(real64) :: kinetic(3,3) =
m_zero
109 real(real64) :: Hartree(3,3) =
m_zero
110 real(real64) :: xc(3,3) =
m_zero
111 real(real64) :: xc_nlcc(3,3) =
m_zero
112 real(real64) :: ps_local(3,3) =
m_zero
113 real(real64) :: ps_nl(3,3) =
m_zero
114 real(real64) :: ion_ion(3,3) =
m_zero
116 real(real64) :: hubbard(3,3) =
m_zero
118 real(real64) :: kinetic_sumrule =
m_zero
119 real(real64) :: hartree_sumrule =
m_zero
134 type(states_elec_dim_t) :: d
137 logical :: only_userdef_istates
139 type(states_elec_group_t) :: group
140 integer :: block_size
144 logical :: pack_states
150 character(len=1024),
allocatable :: user_def_states(:,:,:)
156 real(real64),
allocatable :: rho(:,:)
157 real(real64),
allocatable :: rho_core(:)
159 real(real64),
allocatable :: current(:, :, :)
160 real(real64),
allocatable :: current_para(:, :, :)
161 real(real64),
allocatable :: current_dia(:, :, :)
162 real(real64),
allocatable :: current_mag(:, :, :)
163 real(real64),
allocatable :: current_kpt(:,:,:)
168 real(real64),
allocatable :: frozen_rho(:, :)
169 real(real64),
allocatable :: frozen_tau(:, :)
170 real(real64),
allocatable :: frozen_gdens(:,:,:)
171 real(real64),
allocatable :: frozen_ldens(:,:)
173 logical :: uniform_occ
175 real(real64),
allocatable :: eigenval(:,:)
177 logical :: restart_fixed_occ
178 logical :: restart_reorder_occs
179 real(real64),
allocatable :: occ(:,:)
180 real(real64),
allocatable :: kweights(:)
183 logical :: fixed_spins
185 real(real64),
allocatable :: spin(:, :, :)
188 real(real64) :: val_charge
190 type(stress_t) :: stress_tensors
192 logical :: fromScratch
193 type(smear_t) :: smear
196 type(modelmb_particle_t) :: modelmbparticles
200 type(mpi_grp_t) :: mpi_grp
201 type(mpi_grp_t) :: dom_st_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
1478 call mpi_grp_copy(stout%dom_st_kpt_mpi_grp, stin%dom_st_kpt_mpi_grp)
1479 call mpi_grp_copy(stout%st_kpt_mpi_grp, stin%st_kpt_mpi_grp)
1480 call mpi_grp_copy(stout%dom_st_mpi_grp, stin%dom_st_mpi_grp)
1481 safe_allocate_source_a(stout%node, stin%node)
1482 safe_allocate_source_a(stout%st_kpt_task, stin%st_kpt_task)
1484#ifdef HAVE_SCALAPACK
1490 stout%scalapack_compatible = stin%scalapack_compatible
1492 stout%lnst = stin%lnst
1493 stout%st_start = stin%st_start
1494 stout%st_end = stin%st_end
1498 stout%symmetrize_density = stin%symmetrize_density
1502 stout%packed = stin%packed
1504 stout%randomization = stin%randomization
1525 safe_deallocate_a(st%user_def_states)
1527 safe_deallocate_a(st%rho)
1528 safe_deallocate_a(st%eigenval)
1530 safe_deallocate_a(st%current)
1531 safe_deallocate_a(st%current_para)
1532 safe_deallocate_a(st%current_dia)
1533 safe_deallocate_a(st%current_mag)
1534 safe_deallocate_a(st%current_kpt)
1535 safe_deallocate_a(st%rho_core)
1536 safe_deallocate_a(st%frozen_rho)
1537 safe_deallocate_a(st%frozen_tau)
1538 safe_deallocate_a(st%frozen_gdens)
1539 safe_deallocate_a(st%frozen_ldens)
1540 safe_deallocate_a(st%occ)
1541 safe_deallocate_a(st%spin)
1542 safe_deallocate_a(st%kweights)
1545#ifdef HAVE_SCALAPACK
1551 safe_deallocate_a(st%node)
1552 safe_deallocate_a(st%st_kpt_task)
1554 if (st%parallel_in_states)
then
1555 safe_deallocate_a(st%ap%schedule)
1567 class(
mesh_t),
intent(in) :: mesh
1569 integer,
optional,
intent(in) :: ist_start_
1570 integer,
optional,
intent(in) :: ist_end_
1571 integer,
optional,
intent(in) :: ikpt_start_
1572 integer,
optional,
intent(in) :: ikpt_end_
1573 logical,
optional,
intent(in) :: normalized
1576 integer :: ist, ik, id, ist_start, ist_end, jst, ikpt_start, ikpt_end
1577 complex(real64) :: alpha, beta
1578 real(real64),
allocatable :: dpsi(:, :)
1579 complex(real64),
allocatable :: zpsi(:, :), zpsi2(:)
1580 integer :: ikpoint, ip
1583 logical :: normalized_
1594 safe_allocate(dpsi(1:mesh%np, 1:st%d%dim))
1596 safe_allocate(zpsi(1:mesh%np, 1:st%d%dim))
1599 select case (st%d%ispin)
1602 do ik = ikpt_start, ikpt_end
1603 ikpoint = st%d%get_kpoint_index(ik)
1604 do ist = ist_start, ist_end
1608 pre_shift = mesh%pv%xlocal-1, &
1609 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1610 normalized = normalized)
1612 if(mesh%parallel_in_domains)
then
1618 call dmf_random(mesh, dpsi(:, 1), normalized = normalized)
1623 zpsi(ip,1) = cmplx(dpsi(ip,1),
m_zero, real64)
1632 pre_shift = mesh%pv%xlocal-1, &
1633 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1634 normalized = normalized)
1636 if(mesh%parallel_in_domains)
then
1642 call zmf_random(mesh, zpsi(:, 1), normalized = normalized)
1654 if (st%fixed_spins)
then
1656 do ik = ikpt_start, ikpt_end
1657 ikpoint = st%d%get_kpoint_index(ik)
1658 do ist = ist_start, ist_end
1662 pre_shift = mesh%pv%xlocal-1, &
1663 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1664 normalized = normalized)
1666 if(mesh%parallel_in_domains)
then
1672 call dmf_random(mesh, dpsi(:, 1), normalized = normalized)
1676 zpsi(ip,1) = cmplx(dpsi(ip,1),
m_zero, real64)
1682 pre_shift = mesh%pv%xlocal-1, &
1683 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1684 normalized = normalized)
1686 if(mesh%parallel_in_domains)
then
1692 call zmf_random(mesh, zpsi(:, 1), normalized = normalized)
1705 safe_allocate(zpsi2(1:mesh%np))
1706 do jst = ist_start, ist - 1
1708 zpsi(1:mesh%np, 1) = zpsi(1:mesh%np, 1) -
zmf_dotp(mesh, zpsi(:, 1), zpsi2)*zpsi2(1:mesh%np)
1710 safe_deallocate_a(zpsi2)
1713 zpsi(1:mesh%np, 2) = zpsi(1:mesh%np, 1)
1718 beta = cmplx(st%spin(1, ist, ik) / abs(alpha), st%spin(2, ist, ik) / abs(alpha), real64)
1720 zpsi(1:mesh%np, 1) = alpha*zpsi(1:mesh%np, 1)
1721 zpsi(1:mesh%np, 2) = beta*zpsi(1:mesh%np, 2)
1726 do ik = ikpt_start, ikpt_end
1727 do ist = ist_start, ist_end
1731 pre_shift = mesh%pv%xlocal-1, &
1732 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1733 normalized = .false.)
1735 if(mesh%parallel_in_domains)
then
1741 call zmf_random(mesh, zpsi(:, id), normalized = .false.)
1757 safe_deallocate_a(dpsi)
1758 safe_deallocate_a(zpsi)
1769 class(
mesh_t),
intent(in) :: mesh
1770 logical,
optional,
intent(in) :: compute_spin
1774 real(real64) :: charge
1775 complex(real64),
allocatable :: zpsi(:, :)
1780 st%nik, st%nst, st%kweights)
1787 charge = charge + sum(st%occ(ist, 1:st%nik) * st%kweights(1:st%nik))
1789 if (abs(charge-st%qtot) > 1e-6_real64)
then
1790 message(1) =
'Occupations do not integrate to total charge.'
1791 write(
message(2),
'(6x,f12.8,a,f12.8)') charge,
' != ', st%qtot
1794 message(1) =
"There don't seem to be any electrons at all!"
1804 safe_allocate(zpsi(1:mesh%np, st%d%dim))
1805 do ik = st%d%kpt%start, st%d%kpt%end
1806 do ist = st%st_start, st%st_end
1808 st%spin(1:3, ist, ik) =
state_spin(mesh, zpsi)
1811 safe_deallocate_a(zpsi)
1813 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
1828 real(real64),
optional,
intent(in) :: alt_eig(st%st_start:, st%d%kpt%start:)
1837 do ik = st%d%kpt%start, st%d%kpt%end
1838 if (
present(alt_eig))
then
1839 tot = tot + st%kweights(ik) * sum(st%occ(st%st_start:st%st_end, ik) * &
1840 alt_eig(st%st_start:st%st_end, ik))
1842 tot = tot + st%kweights(ik) * sum(st%occ(st%st_start:st%st_end, ik) * &
1843 st%eigenval(st%st_start:st%st_end, ik))
1847 if (st%parallel_in_states .or. st%d%kpt%parallel)
call comm_allreduce(st%st_kpt_mpi_grp, tot)
1859 logical :: default_scalapack_compatible
1870 st%parallel_in_states = .false.
1874 call mpi_grp_init(st%dom_st_kpt_mpi_grp, mc%dom_st_kpt_comm)
1878 default_scalapack_compatible =
calc_mode_par%scalapack_compat() .and. .not. st%d%kpt%parallel
1892 call parse_variable(namespace,
'ScaLAPACKCompatible', default_scalapack_compatible, st%scalapack_compatible)
1894#ifdef HAVE_SCALAPACK
1895 if (default_scalapack_compatible .neqv. st%scalapack_compatible)
then
1896 call messages_experimental(
'Setting ScaLAPACKCompatible to other than default', namespace=namespace)
1899 if (st%scalapack_compatible)
then
1906 st%scalapack_compatible = .false.
1912 call multicomm_create_all_pairs(st%mpi_grp, st%ap)
1915 if (st%nst < st%mpi_grp%size)
then
1916 message(1) =
"Have more processors than necessary"
1917 write(
message(2),
'(i4,a,i4,a)') st%mpi_grp%size,
" processors and ", st%nst,
" states."
1921 call distributed_init(st%dist, st%nst, st%mpi_grp%comm,
"states", scalapack_compat = st%scalapack_compatible)
1923 st%parallel_in_states = st%dist%parallel
1926 st%st_start = st%dist%start
1927 st%st_end = st%dist%end
1928 st%lnst = st%dist%nlocal
1929 st%node(1:st%nst) = st%dist%node(1:st%nst)
1946 kinetic_energy_density, paramagnetic_current, density_gradient, density_laplacian, &
1947 gi_kinetic_energy_density, st_end)
1948 type(
grid_t),
intent(in) :: gr
1951 logical,
intent(in) :: nlcc
1952 real(real64),
contiguous,
optional,
target,
intent(out) :: kinetic_energy_density(:,:)
1953 real(real64),
contiguous,
optional,
target,
intent(out) :: paramagnetic_current(:,:,:)
1954 real(real64),
contiguous,
optional,
intent(out) :: density_gradient(:,:,:)
1955 real(real64),
contiguous,
optional,
intent(out) :: density_laplacian(:,:)
1956 real(real64),
contiguous,
optional,
intent(out) :: gi_kinetic_energy_density(:,:)
1957 integer,
optional,
intent(in) :: st_end
1959 real(real64),
pointer,
contiguous :: jp(:, :, :)
1960 real(real64),
pointer,
contiguous :: tau(:, :)
1961 complex(real64),
allocatable :: wf_psi(:,:), gwf_psi(:,:,:), wf_psi_conj(:,:), lwf_psi(:,:)
1962 real(real64),
allocatable :: abs_wf_psi(:,:), abs_gwf_psi(:,:)
1963 complex(real64),
allocatable :: psi_gpsi(:,:)
1964 complex(real64) :: c_tmp
1965 integer :: is, ik, ist, i_dim, st_dim, ii, st_end_
1966 real(real64) :: ww, kpoint(gr%der%dim)
1967 logical :: something_to_do
1975 something_to_do =
present(kinetic_energy_density) .or.
present(gi_kinetic_energy_density) .or. &
1976 present(paramagnetic_current) .or.
present(density_gradient) .or.
present(density_laplacian)
1977 assert(something_to_do)
1979 safe_allocate( wf_psi(1:gr%np_part, 1:st%d%dim))
1980 safe_allocate( wf_psi_conj(1:gr%np_part, 1:st%d%dim))
1981 safe_allocate(gwf_psi(1:gr%np, 1:gr%der%dim, 1:st%d%dim))
1982 safe_allocate(abs_wf_psi(1:gr%np, 1:st%d%dim))
1983 safe_allocate(abs_gwf_psi(1:gr%np, 1:st%d%dim))
1984 safe_allocate(psi_gpsi(1:gr%np, 1:st%d%dim))
1985 if (
present(density_laplacian))
then
1986 safe_allocate(lwf_psi(1:gr%np, 1:st%d%dim))
1990 if (
present(kinetic_energy_density)) tau => kinetic_energy_density
1993 if (
present(paramagnetic_current)) jp => paramagnetic_current
1997 if (
present(gi_kinetic_energy_density))
then
1999 safe_allocate(jp(1:gr%np, 1:gr%der%dim, 1:st%d%nspin))
2001 if (.not.
present(kinetic_energy_density))
then
2002 safe_allocate(tau(1:gr%np, 1:st%d%nspin))
2006 if (
associated(tau)) tau =
m_zero
2007 if (
associated(jp)) jp =
m_zero
2008 if (
present(density_gradient)) density_gradient(:,:,:) =
m_zero
2009 if (
present(density_laplacian)) density_laplacian(:,:) =
m_zero
2010 if (
present(gi_kinetic_energy_density)) gi_kinetic_energy_density =
m_zero
2012 do ik = st%d%kpt%start, st%d%kpt%end
2014 kpoint(1:gr%der%dim) = kpoints%get_point(st%d%get_kpoint_index(ik))
2015 is = st%d%get_spin_index(ik)
2017 do ist = st%st_start, st_end_
2018 ww = st%kweights(ik)*st%occ(ist, ik)
2024 do st_dim = 1, st%d%dim
2029 do st_dim = 1, st%d%dim
2030 call zderivatives_grad(gr%der, wf_psi(:,st_dim), gwf_psi(:,:,st_dim), set_bc = .false.)
2034 if (
present(density_laplacian))
then
2035 do st_dim = 1, st%d%dim
2036 call zderivatives_lapl(gr%der, wf_psi(:,st_dim), lwf_psi(:,st_dim), ghost_update = .false., set_bc = .false.)
2041 wf_psi_conj(1:gr%np, 1:st%d%dim) = conjg(wf_psi(1:gr%np,1:st%d%dim))
2042 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)
2044 if (
present(density_laplacian))
then
2045 density_laplacian(1:gr%np, is) = density_laplacian(1:gr%np, is) + &
2046 ww *
m_two*real(wf_psi_conj(1:gr%np, 1) * lwf_psi(1:gr%np, 1), real64)
2047 if (st%d%ispin ==
spinors)
then
2048 density_laplacian(1:gr%np, 2) = density_laplacian(1:gr%np, 2) + &
2049 ww *
m_two*real(wf_psi_conj(1:gr%np, 2) * lwf_psi(1:gr%np, 2), real64)
2052 c_tmp = ww*(lwf_psi(ii, 1) * wf_psi_conj(ii, 2) + wf_psi(ii, 1) * conjg(lwf_psi(ii, 2)))
2053 density_laplacian(ii, 3) = density_laplacian(ii, 3) + real(c_tmp, real64)
2054 density_laplacian(ii, 4) = density_laplacian(ii, 4) + aimag(c_tmp)
2059 if (
associated(tau))
then
2060 tau(1:gr%np, is) = tau(1:gr%np, is) &
2061 + ww * sum(kpoint(1:gr%der%dim)**2) * abs_wf_psi(1:gr%np, 1)
2062 if (st%d%ispin ==
spinors)
then
2063 tau(1:gr%np, 2) = tau(1:gr%np, 2) &
2064 + ww * sum(kpoint(1:gr%der%dim)**2) * abs_wf_psi(1:gr%np, 2)
2068 c_tmp = ww * sum(kpoint(1:gr%der%dim)**2) * wf_psi(ii, 1) * wf_psi_conj(ii, 2)
2069 tau(ii, 3) = tau(ii, 3) + real(c_tmp, real64)
2070 tau(ii, 4) = tau(ii, 4) + aimag(c_tmp)
2075 do i_dim = 1, gr%der%dim
2078 psi_gpsi(1:gr%np, 1:st%d%dim) = wf_psi_conj(1:gr%np, 1:st%d%dim) &
2079 * gwf_psi(1:gr%np,i_dim,1:st%d%dim)
2080 abs_gwf_psi(1:gr%np, 1:st%d%dim) = real(conjg(gwf_psi(1:gr%np, i_dim, 1:st%d%dim)) &
2081 * gwf_psi(1:gr%np, i_dim, 1:st%d%dim), real64)
2083 if (
present(density_gradient))
then
2084 density_gradient(1:gr%np, i_dim, is) = density_gradient(1:gr%np, i_dim, is) &
2085 + ww *
m_two * real(psi_gpsi(1:gr%np, 1), real64)
2086 if (st%d%ispin ==
spinors)
then
2087 density_gradient(1:gr%np, i_dim, 2) = density_gradient(1:gr%np, i_dim, 2) &
2088 + ww *
m_two*real(psi_gpsi(1:gr%np, 2), real64)
2091 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)))
2092 density_gradient(ii, i_dim, 3) = density_gradient(ii, i_dim, 3) + real(c_tmp, real64)
2093 density_gradient(ii, i_dim, 4) = density_gradient(ii, i_dim, 4) + aimag(c_tmp)
2098 if (
present(density_laplacian))
then
2099 call lalg_axpy(gr%np, ww*
m_two, abs_gwf_psi(:,1), density_laplacian(:,is))
2100 if (st%d%ispin ==
spinors)
then
2101 call lalg_axpy(gr%np, ww*
m_two, abs_gwf_psi(:,2), density_laplacian(:,2))
2104 c_tmp =
m_two * ww * gwf_psi(ii, i_dim, 1) * conjg(gwf_psi(ii, i_dim, 2))
2105 density_laplacian(ii, 3) = density_laplacian(ii, 3) + real(c_tmp, real64)
2106 density_laplacian(ii, 4) = density_laplacian(ii, 4) + aimag(c_tmp)
2114 if (
associated(jp))
then
2116 jp(1:gr%np, i_dim, is) = jp(1:gr%np, i_dim, is) + &
2117 ww*(aimag(psi_gpsi(1:gr%np, 1)) - abs_wf_psi(1:gr%np, 1)*kpoint(i_dim))
2118 if (st%d%ispin ==
spinors)
then
2119 jp(1:gr%np, i_dim, 2) = jp(1:gr%np, i_dim, 2) + &
2120 ww*( aimag(psi_gpsi(1:gr%np, 2)) - abs_wf_psi(1:gr%np, 2)*kpoint(i_dim))
2123 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)) &
2124 -
m_two *
m_zi*wf_psi(ii, 1)*wf_psi_conj(ii, 2)*kpoint(i_dim))
2125 jp(ii, i_dim, 3) = jp(ii, i_dim, 3) + real(c_tmp, real64)
2126 jp(ii, i_dim, 4) = jp(ii, i_dim, 4) + aimag(c_tmp)
2135 if (
associated(tau))
then
2136 tau(1:gr%np, is) = tau(1:gr%np, is) + ww*(abs_gwf_psi(1:gr%np,1) &
2137 -
m_two*aimag(psi_gpsi(1:gr%np, 1))*kpoint(i_dim))
2138 if (st%d%ispin ==
spinors)
then
2139 tau(1:gr%np, 2) = tau(1:gr%np, 2) + ww*(abs_gwf_psi(1:gr%np, 2) &
2140 -
m_two*aimag(psi_gpsi(1:gr%np, 2))*kpoint(i_dim))
2143 c_tmp = ww * ( gwf_psi(ii, i_dim, 1)*conjg(gwf_psi(ii, i_dim, 2)) &
2144 +
m_zi * (gwf_psi(ii,i_dim,1)*wf_psi_conj(ii, 2) &
2145 - wf_psi(ii, 1)*conjg(gwf_psi(ii,i_dim,2)))*kpoint(i_dim))
2146 tau(ii, 3) = tau(ii, 3) + real(c_tmp, real64)
2147 tau(ii, 4) = tau(ii, 4) + aimag(c_tmp)
2157 safe_deallocate_a(wf_psi_conj)
2158 safe_deallocate_a(abs_wf_psi)
2159 safe_deallocate_a(abs_gwf_psi)
2160 safe_deallocate_a(psi_gpsi)
2162 if (.not.
present(gi_kinetic_energy_density))
then
2163 if (.not.
present(paramagnetic_current))
then
2164 safe_deallocate_p(jp)
2166 if (.not.
present(kinetic_energy_density))
then
2167 safe_deallocate_p(tau)
2171 if (st%parallel_in_states .or. st%d%kpt%parallel)
call reduce_all(st%st_kpt_mpi_grp)
2176 if (st%symmetrize_density)
then
2177 do is = 1, st%d%nspin
2178 if (
associated(tau))
then
2182 if (
present(density_laplacian))
then
2186 if (
associated(jp))
then
2190 if (
present(density_gradient))
then
2197 if (
allocated(st%rho_core) .and. nlcc .and. (
present(density_laplacian) .or.
present(density_gradient)))
then
2199 wf_psi(ii, 1) = st%rho_core(ii)/st%d%spin_channels
2204 if (
present(density_gradient))
then
2207 do is = 1, st%d%spin_channels
2208 density_gradient(1:gr%np, 1:gr%der%dim, is) = density_gradient(1:gr%np, 1:gr%der%dim, is) + &
2209 real(gwf_psi(1:gr%np, 1:gr%der%dim,1))
2214 if (
present(density_laplacian))
then
2217 do is = 1, st%d%spin_channels
2218 density_laplacian(1:gr%np, is) = density_laplacian(1:gr%np, is) + real(lwf_psi(1:gr%np, 1))
2225 if (
allocated(st%frozen_tau) .and. .not.
present(st_end) .and.
associated(tau))
then
2228 if (
allocated(st%frozen_gdens) .and. .not.
present(st_end) .and.
present(density_gradient))
then
2229 do is = 1, st%d%nspin
2230 call lalg_axpy(gr%np, gr%der%dim,
m_one, st%frozen_gdens(:,:,is), density_gradient(:,:,is))
2233 if (
allocated(st%frozen_ldens) .and. .not.
present(st_end) .and.
present(density_laplacian))
then
2234 call lalg_axpy(gr%np, st%d%nspin,
m_one, st%frozen_ldens, density_laplacian)
2237 safe_deallocate_a(wf_psi)
2238 safe_deallocate_a(gwf_psi)
2239 safe_deallocate_a(lwf_psi)
2243 if (
present(gi_kinetic_energy_density))
then
2244 do is = 1, st%d%nspin
2245 assert(
associated(tau))
2246 gi_kinetic_energy_density(1:gr%np, is) = tau(1:gr%np, is)
2249 assert(
associated(jp))
2250 if (st%d%ispin /=
spinors)
then
2251 do is = 1, st%d%nspin
2254 if (st%rho(ii, is) < 1.0e-7_real64) cycle
2255 gi_kinetic_energy_density(ii, is) = &
2256 gi_kinetic_energy_density(ii, is) - sum(jp(ii,1:gr%der%dim, is)**2)/st%rho(ii, is)
2262 gi_kinetic_energy_density(ii, 1) = gi_kinetic_energy_density(ii, 1) &
2263 - sum(jp(ii,1:gr%der%dim, 1)**2)/(safe_tol(st%rho(ii, 1),
m_epsilon))
2264 gi_kinetic_energy_density(ii, 2) = gi_kinetic_energy_density(ii, 2) &
2265 - sum(jp(ii,1:gr%der%dim, 2)**2)/(safe_tol(st%rho(ii, 2),
m_epsilon))
2266 gi_kinetic_energy_density(ii, 3) = &
2267 gi_kinetic_energy_density(ii, 3) - sum(jp(ii,1:gr%der%dim, 3)**2 + jp(ii,1:gr%der%dim, 4)**2) &
2268 /(safe_tol((st%rho(ii, 3)**2 + st%rho(ii, 4)**2),
m_epsilon))*st%rho(ii, 3)
2269 gi_kinetic_energy_density(ii, 4) = &
2270 gi_kinetic_energy_density(ii, 4) + sum(jp(ii,1:gr%der%dim, 3)**2 + jp(ii,1:gr%der%dim, 4)**2) &
2271 /(safe_tol((st%rho(ii, 3)**2 + st%rho(ii, 4)**2),
m_epsilon))*st%rho(ii, 4)
2277 if (.not.
present(kinetic_energy_density))
then
2278 safe_deallocate_p(tau)
2280 if (.not.
present(paramagnetic_current))
then
2281 safe_deallocate_p(jp)
2296 if (
associated(tau))
call comm_allreduce(grp, tau, dim = (/gr%np, st%d%nspin/))
2298 if (
present(density_laplacian))
call comm_allreduce(grp, density_laplacian, dim = (/gr%np, st%d%nspin/))
2300 do is = 1, st%d%nspin
2301 if (
associated(jp))
call comm_allreduce(grp, jp(:, :, is), dim = (/gr%np, gr%der%dim/))
2303 if (
present(density_gradient))
then
2304 call comm_allreduce(grp, density_gradient(:, :, is), dim = (/gr%np, gr%der%dim/))
2318 type(
mesh_t),
intent(in) :: mesh
2319 complex(real64),
intent(in) :: f1(:, :)
2320 real(real64) :: spin(1:3)
2322 complex(real64) :: z
2326 z =
zmf_dotp(mesh, f1(:, 1) , f1(:, 2))
2328 spin(1) =
m_two*real(z, real64)
2329 spin(2) =
m_two*aimag(z)
2341 integer,
intent(in) :: ist
2355 integer,
intent(in) :: ist
2356 integer,
intent(in) :: ik
2361 ik >= st%d%kpt%start .and. ik <= st%d%kpt%end
2371 class(
mesh_t),
intent(in) :: mesh
2377 memory = memory + real(storage_size(0.0_real64)/8, real64) * &
2378 real(mesh%np_part_global, real64) *st%d%dim *
real(st%nst, real64) *st%d%kpt%nglobal
2388 logical,
optional,
intent(in) :: copy
2391 integer(int64) :: max_mem, mem
2403 if (accel_is_enabled())
then
2404 max_mem = accel_global_memory_size()
2406 if (st%gpu_states_mem > m_one)
then
2407 max_mem = int(st%gpu_states_mem, int64)*(1024_8)**2
2408 else if (st%gpu_states_mem < 0.0_real64)
then
2409 max_mem = max_mem + int(st%gpu_states_mem, int64)*(1024_8)**2
2411 max_mem = int(st%gpu_states_mem*real(max_mem, real64) , int64)
2414 max_mem = huge(max_mem)
2418 qnloop:
do iqn = st%d%kpt%start, st%d%kpt%end
2419 do ib = st%group%block_start, st%group%block_end
2421 mem = mem + st%group%psib(ib, iqn)%pack_total_size()
2423 if (mem > max_mem)
then
2424 call messages_write(
'Not enough CL device memory to store all states simultaneously.', new_line = .
true.)
2425 call messages_write(
'Only ')
2426 call messages_write(ib - st%group%block_start)
2427 call messages_write(
' of ')
2428 call messages_write(st%group%block_end - st%group%block_start + 1)
2429 call messages_write(
' blocks will be stored in device memory.', new_line = .
true.)
2430 call messages_warning()
2434 call st%group%psib(ib, iqn)%do_pack(copy)
2446 logical,
optional,
intent(in) :: copy
2455 do iqn = st%d%kpt%start, st%d%kpt%end
2456 do ib = st%group%block_start, st%group%block_end
2457 if (st%group%psib(ib, iqn)%is_packed())
call st%group%psib(ib, iqn)%do_unpack(copy)
2470 type(namespace_t),
intent(in) :: namespace
2474 call messages_print_with_emphasis(msg=
"States", namespace=namespace)
2476 write(message(1),
'(a,f12.3)')
'Total electronic charge = ', st%qtot
2477 write(message(2),
'(a,i8)')
'Number of states = ', st%nst
2478 write(message(3),
'(a,i8)')
'States block-size = ', st%block_size
2479 call messages_info(3, namespace=namespace)
2481 call messages_print_with_emphasis(namespace=namespace)
2494 do iqn = st%d%kpt%start, st%d%kpt%end
2495 do ib = st%group%block_start, st%group%block_end
2496 call batch_set_zero(st%group%psib(ib, iqn))
2506 integer pure function states_elec_block_min(st, ib) result(range)
2508 integer,
intent(in) :: ib
2510 range = st%group%block_range(ib, 1)
2516 integer pure function states_elec_block_max(st, ib) result(range)
2518 integer,
intent(in) :: ib
2520 range = st%group%block_range(ib, 2)
2526 integer pure function states_elec_block_size(st, ib) result(size)
2528 integer,
intent(in) :: ib
2530 size = st%group%block_size(ib)
2538 type(namespace_t),
intent(in) :: namespace
2539 integer,
intent(out) :: n_pairs
2540 integer,
intent(out) :: n_occ(:)
2541 integer,
intent(out) :: n_unocc(:)
2542 logical,
allocatable,
intent(out) :: is_included(:,:,:)
2544 logical,
intent(out) :: is_frac_occ
2546 integer :: ik, ist, ast, n_filled, n_partially_filled, n_half_filled
2547 character(len=80) :: nst_string, default, wfn_list
2548 real(real64) :: energy_window
2552 is_frac_occ = .false.
2554 call occupied_states(st, namespace, ik, n_filled, n_partially_filled, n_half_filled)
2555 if (n_partially_filled > 0 .or. n_half_filled > 0) is_frac_occ = .
true.
2556 n_occ(ik) = n_filled + n_partially_filled + n_half_filled
2557 n_unocc(ik) = st%nst - n_filled
2570 call parse_variable(namespace,
'CasidaKSEnergyWindow', -m_one, energy_window, units_inp%energy)
2593 safe_allocate(is_included(maxval(n_occ), minval(n_occ) + 1:st%nst , st%nik))
2594 is_included(:,:,:) = .false.
2596 if (energy_window < m_zero)
then
2597 write(nst_string,
'(i6)') st%nst
2598 write(default,
'(a,a)')
"1-", trim(adjustl(nst_string))
2599 call parse_variable(namespace,
'CasidaKohnShamStates', default, wfn_list)
2601 write(message(1),
'(a,a)')
"Info: States that form the basis: ", trim(wfn_list)
2602 call messages_info(1, namespace=namespace)
2607 do ast = n_occ(ik) + 1, st%nst
2608 if (loct_isinstringlist(ast, wfn_list))
then
2609 do ist = 1, n_occ(ik)
2610 if (loct_isinstringlist(ist, wfn_list))
then
2611 n_pairs = n_pairs + 1
2612 is_included(ist, ast, ik) = .
true.
2621 write(message(1),
'(a,f12.6,a)')
"Info: including transitions with energy < ", &
2622 units_from_atomic(units_out%energy, energy_window), trim(units_abbrev(units_out%energy))
2623 call messages_info(1, namespace=namespace)
2628 do ast = n_occ(ik) + 1, st%nst
2629 do ist = 1, n_occ(ik)
2630 if (st%eigenval(ast, ik) - st%eigenval(ist, ik) < energy_window)
then
2631 n_pairs = n_pairs + 1
2632 is_included(ist, ast, ik) = .
true.
2660 subroutine occupied_states(st, namespace, ik, n_filled, n_partially_filled, n_half_filled, &
2661 filled, partially_filled, half_filled)
2663 type(namespace_t),
intent(in) :: namespace
2664 integer,
intent(in) :: ik
2665 integer,
intent(out) :: n_filled, n_partially_filled, n_half_filled
2666 integer,
optional,
intent(out) :: filled(:), partially_filled(:), half_filled(:)
2672 if (
present(filled)) filled(:) = 0
2673 if (
present(partially_filled)) partially_filled(:) = 0
2674 if (
present(half_filled)) half_filled(:) = 0
2676 n_partially_filled = 0
2679 select case (st%d%ispin)
2682 if (abs(st%occ(ist, ik) - m_two) < m_min_occ)
then
2683 n_filled = n_filled + 1
2684 if (
present(filled)) filled(n_filled) = ist
2685 else if (abs(st%occ(ist, ik) - m_one) < m_min_occ)
then
2686 n_half_filled = n_half_filled + 1
2687 if (
present(half_filled)) half_filled(n_half_filled) = ist
2688 else if (st%occ(ist, ik) > m_min_occ)
then
2689 n_partially_filled = n_partially_filled + 1
2690 if (
present(partially_filled)) partially_filled(n_partially_filled) = ist
2691 else if (abs(st%occ(ist, ik)) > m_min_occ)
then
2692 write(message(1),*)
'Internal error in occupied_states: Illegal occupation value ', st%occ(ist, ik)
2693 call messages_fatal(1, namespace=namespace)
2696 case (spin_polarized, spinors)
2698 if (abs(st%occ(ist, ik)-m_one) < m_min_occ)
then
2699 n_filled = n_filled + 1
2700 if (
present(filled)) filled(n_filled) = ist
2701 else if (st%occ(ist, ik) > m_min_occ)
then
2702 n_partially_filled = n_partially_filled + 1
2703 if (
present(partially_filled)) partially_filled(n_partially_filled) = ist
2704 else if (abs(st%occ(ist, ik)) > m_min_occ)
then
2705 write(message(1),*)
'Internal error in occupied_states: Illegal occupation value ', st%occ(ist, ik)
2706 call messages_fatal(1, namespace=namespace)
2718 type(multicomm_t),
intent(in) :: mc
2721 call distributed_init(this%d%kpt, this%nik, mc%group_comm(p_strategy_kpoints),
"k-points")
2736 if (.not.
allocated(st%st_kpt_task))
then
2737 safe_allocate(st%st_kpt_task(0:st%st_kpt_mpi_grp%size-1, 1:4))
2740 st%st_kpt_task(0:st%st_kpt_mpi_grp%size-1, :) = 0
2741 st%st_kpt_task(st%st_kpt_mpi_grp%rank, :) = [st%st_start, st%st_end, st%d%kpt%start, st%d%kpt%end]
2743 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
2744 call comm_allreduce(st%st_kpt_mpi_grp, st%st_kpt_task)
2755 type(kpoints_t),
intent(in) :: kpoints
2756 type(namespace_t),
intent(in) :: namespace
2759 type(states_elec_dim_t),
pointer :: dd
2766 st%nik = kpoints_number(kpoints)
2768 if (dd%ispin == spin_polarized) st%nik = 2*st%nik
2770 safe_allocate(st%kweights(1:st%nik))
2773 ik = dd%get_kpoint_index(iq)
2774 st%kweights(iq) = kpoints%get_weight(ik)
2786 call io_mkdir(
'debug/', namespace)
2787 iunit = io_open(
'debug/kpoints', namespace, action =
'write')
2788 call kpoints%write_info(iunit=iunit, absolute_coordinates = .
true.)
2789 call io_close(iunit)
2803 class(mesh_t),
intent(in) :: gr
2804 real(real64) :: dipole(1:gr%box%dim)
2807 real(real64) :: e_dip(1:gr%box%dim, this%d%spin_channels)
2811 do ispin = 1, this%d%spin_channels
2812 call dmf_dipole(gr, this%rho(:, ispin), e_dip(:, ispin))
2815 dipole(:) = sum(e_dip(:, 1:this%d%spin_channels), 2)
2823#include "states_elec_inc.F90"
2826#include "complex.F90"
2827#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_find_fermi_energy(this, namespace, eigenvalues, occupations, qtot, nik, nst, kweights)
subroutine, public smear_fill_occupations(this, eigenvalues, occupations, kweights, nik, nst)
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.