37 use,
intrinsic :: iso_fortran_env
109 real(real64) :: total(3,3) =
m_zero
110 real(real64) :: kinetic(3,3) =
m_zero
111 real(real64) :: Hartree(3,3) =
m_zero
112 real(real64) :: xc(3,3) =
m_zero
113 real(real64) :: xc_nlcc(3,3) =
m_zero
114 real(real64) :: ps_local(3,3) =
m_zero
116 real(real64) :: ion_ion(3,3) =
m_zero
117 real(real64) :: vdw(3,3) =
m_zero
118 real(real64) :: hubbard(3,3) =
m_zero
120 real(real64) :: kinetic_sumrule =
m_zero
121 real(real64) :: hartree_sumrule =
m_zero
136 type(states_elec_dim_t) :: d
139 logical :: only_userdef_istates
141 type(states_elec_group_t) :: group
142 integer :: block_size
146 logical :: pack_states
152 character(len=1024),
allocatable :: user_def_states(:,:,:)
158 real(real64),
allocatable :: rho(:,:)
159 real(real64),
allocatable :: rho_core(:)
162 type(accel_mem_t) :: buff_density
164 real(real64),
allocatable :: current(:, :, :)
165 real(real64),
allocatable :: current_para(:, :, :)
166 real(real64),
allocatable :: current_dia(:, :, :)
167 real(real64),
allocatable :: current_mag(:, :, :)
168 real(real64),
allocatable :: current_kpt(:,:,:)
173 real(real64),
allocatable :: frozen_rho(:, :)
174 real(real64),
allocatable :: frozen_tau(:, :)
175 real(real64),
allocatable :: frozen_gdens(:,:,:)
176 real(real64),
allocatable :: frozen_ldens(:,:)
178 logical :: uniform_occ
180 real(real64),
allocatable :: eigenval(:,:)
182 logical :: restart_fixed_occ
183 logical :: restart_reorder_occs
184 real(real64),
allocatable :: occ(:,:)
185 real(real64),
allocatable :: kweights(:)
188 logical :: fixed_spins
190 real(real64),
allocatable :: spin(:, :, :)
193 real(real64) :: val_charge
195 type(stress_t) :: stress_tensors
197 logical :: fromScratch
198 type(smear_t) :: smear
201 type(modelmb_particle_t) :: modelmbparticles
213 logical :: scalapack_compatible
214 logical :: parallel_in_states = .false.
218 integer :: st_start, st_end
219 integer,
allocatable :: node(:)
222 integer,
allocatable :: st_kpt_task(:,:)
225 logical :: symmetrize_density
226 integer :: randomization
227 integer :: orth_method = 0
229 real(real64) :: gpu_states_mem
241 integer,
public,
parameter :: &
285 real(real64),
intent(in) :: valence_charge
287 integer,
optional,
intent(in) :: calc_mode_id
289 real(real64) :: excess_charge, nempty_percent
290 integer :: nempty, ntot, default
291 integer :: nempty_conv, nempty_conv_default
292 logical :: force, adapt_for_chebyshev
293 real(real64),
parameter :: tol = 1e-13_real64
295 integer,
parameter :: rs_chebyshev = 12
296 integer(int64),
parameter :: chebyshev_compatible_modes(3) = &
297 [option__calculationmode__gs, option__calculationmode__go, option__calculationmode__unocc]
306 st%d%ispin = space%ispin
311 if (st%d%ispin /=
unpolarized .and. kpoints%use_time_reversal)
then
312 message(1) =
"Time reversal symmetry is only implemented for unpolarized spins."
313 message(2) =
"Use KPointsUseTimeReversal = no."
345 write(
message(1),
'(a,i5,a)')
"Input: '", ntot,
"' is not a valid value for TotalStates."
367 write(
message(1),
'(a,i5,a)')
"Input: '", nempty,
"' is not a valid value for ExtraStates."
368 message(2) =
'(0 <= ExtraStates)'
372 if (ntot > 0 .and. nempty > 0)
then
373 message(1) =
'You cannot set TotalStates and ExtraStates at the same time.'
388 if (nempty_percent < 0)
then
389 write(
message(1),
'(a,f8.6,a)')
"Input: '", nempty_percent, &
390 "' should be a percentage value x (where x is parts in hundred) larger or equal 0"
394 if (nempty > 0 .and. nempty_percent > 0)
then
395 message(1) =
'You cannot set ExtraStates and ExtraStatesInPercent at the same time.'
400 adapt_for_chebyshev = .false.
401 if (
present(calc_mode_id))
then
402 if (any(calc_mode_id == chebyshev_compatible_modes))
then
405 if (es == rs_chebyshev)
then
407 adapt_for_chebyshev = .
true.
411 if (adapt_for_chebyshev)
then
414 message(1) =
'Chebyshev filtering eigensolver detected. Setting ExtraStatesInPercent = 15'
422 st%val_charge = valence_charge
424 st%qtot = -(st%val_charge + excess_charge)
427 write(
message(1),
'(a,f12.6,a)')
'Total charge = ', st%qtot,
' < 0'
428 message(2) =
'Check Species and ExcessCharge.'
432 select case (st%d%ispin)
435 st%nst = nint(st%qtot/2)
436 if (st%nst*2 - st%qtot < -tol) st%nst = st%nst + 1
438 st%d%spin_channels = 1
441 st%nst = nint(st%qtot/2)
442 if (st%nst*2 - st%qtot < -tol) st%nst = st%nst + 1
444 st%d%spin_channels = 2
447 st%nst = nint(st%qtot)
448 if (st%nst - st%qtot < -tol) st%nst = st%nst + 1
450 st%d%spin_channels = 2
453 if (nempty_percent > 0)
then
454 nempty = ceiling(nempty_percent * st%nst / 100)
474 nempty_conv_default = nempty
475 if (adapt_for_chebyshev)
then
477 nempty_conv_default = min(int(0.8*nempty), nempty - 1)
479 call parse_variable(namespace,
'ExtraStatesToConverge', nempty_conv_default, nempty_conv)
480 if (nempty_conv < 0)
then
481 write(
message(1),
'(a,i5,a)')
"Input: '", nempty_conv,
"' is not a valid value for ExtraStatesToConverge."
482 message(2) =
'(0 <= ExtraStatesToConverge)'
486 if (nempty_conv > nempty)
then
488 message(1) =
'You cannot set ExtraStatesToConverge to a higher value than ExtraStates.'
489 message(2) =
'Capping ExtraStatesToConverge to ExtraStates.'
494 if (ntot < st%nst)
then
495 message(1) =
'TotalStates is smaller than the number of states required by the system.'
502 st%nst_conv = st%nst + nempty_conv
503 st%nst = st%nst + nempty
504 if (st%nst == 0)
then
505 message(1) =
"Cannot run with number of states = zero."
523 default =
accel%warp_size
532 call parse_variable(namespace,
'StatesBlockSize', default, st%block_size)
533 if (st%block_size < 1)
then
534 call messages_write(
"The variable 'StatesBlockSize' must be greater than 0.")
538 st%block_size = min(st%block_size, st%nst)
539 conf%target_states_block_size = st%block_size
541 safe_allocate(st%eigenval(1:st%nst, 1:st%nik))
542 st%eigenval = huge(st%eigenval)
546 if (.not. kpoints%gamma_only())
then
559 call parse_variable(namespace,
'OnlyUserDefinedInitialStates', .false., st%only_userdef_istates)
562 safe_allocate(st%occ (1:st%nst, 1:st%nik))
567 safe_allocate(st%user_def_states(1:st%d%dim, 1:st%nst, 1:st%nik))
569 st%user_def_states(1:st%d%dim, 1:st%nst, 1:st%nik) =
'undefined'
572 if (st%d%ispin ==
spinors)
then
573 safe_allocate(st%spin(1:3, 1:st%nst, 1:st%nik))
600 if (st%smear%photodop)
then
601 if (nempty == 0)
then
602 write(
message(1),
'(a,i5,a)')
"PhotoDoping requires to specify ExtraStates."
603 message(2) =
'(0 == ExtraStates)'
611 safe_allocate(st%node(1:st%nst))
612 st%node(1:st%nst) = 0
615 st%parallel_in_states = .false.
629 call parse_variable(namespace,
'SymmetrizeDensity', kpoints%use_symmetries, st%symmetrize_density)
659 integer,
intent(out) :: nik
660 integer,
intent(out) :: dim
661 integer,
intent(out) :: nst
662 integer,
intent(out) :: ierr
664 character(len=256) :: lines(3)
665 character(len=20) :: char
672 iunit = restart%open(
'states')
673 call restart%read(iunit, lines, 3, ierr)
675 read(lines(1), *) char, nst
676 read(lines(2), *) char, dim
677 read(lines(3), *) char, nik
679 call restart%close(iunit)
697 real(real64),
intent(in) :: excess_charge
700 integer :: ik, ist, ispin, nspin, ncols, nrows, el_per_state, icol, start_pos, spin_n
702 real(real64) :: rr, charge
703 logical :: integral_occs, unoccupied_states
704 real(real64),
allocatable :: read_occs(:, :)
705 real(real64) :: charge_in_block
720 call parse_variable(namespace,
'RestartFixedOccupations', .
true., st%restart_fixed_occ)
791 integral_occs = .
true.
793 occ_fix:
if (
parse_block(namespace,
'Occupations', blk) == 0)
then
795 st%fixed_occ = .
true.
798 if (ncols > st%nst)
then
803 if (nrows /= st%nik)
then
804 call messages_input_error(namespace,
"Occupations",
"Wrong number of rows in block Occupations.")
807 do ik = 1, st%nik - 1
810 "All rows in block Occupations must have the same number of columns.")
821 safe_allocate(read_occs(1:ncols, 1:st%nik))
827 charge_in_block = charge_in_block + read_occs(icol, ik) * st%kweights(ik)
832 select case (st%d%ispin)
841 start_pos = nint((st%qtot - charge_in_block)/spin_n)
843 if (start_pos + ncols > st%nst)
then
844 message(1) =
"To balance charge, the first column in block Occupations is taken to refer to state"
845 write(
message(2),
'(a,i6,a)')
"number ", start_pos,
" but there are too many columns for the number of states."
846 write(
message(3),
'(a,i6,a)')
"Solution: set ExtraStates = ", start_pos + ncols - st%nst
851 do ist = 1, start_pos
852 st%occ(ist, ik) = el_per_state
857 do ist = start_pos + 1, start_pos + ncols
858 st%occ(ist, ik) = read_occs(ist - start_pos, ik)
859 integral_occs = integral_occs .and. &
860 abs((st%occ(ist, ik) - el_per_state) * st%occ(ist, ik)) <=
m_epsilon
865 do ist = start_pos + ncols + 1, st%nst
872 safe_deallocate_a(read_occs)
875 st%fixed_occ = .false.
876 integral_occs = .false.
883 st%qtot = -(st%val_charge + excess_charge)
886 if (st%d%nspin == 2) nspin = 2
888 do ik = 1, st%nik, nspin
891 do ispin = ik, ik + nspin - 1
892 st%occ(ist, ispin) = min(rr, -(st%val_charge + excess_charge) - charge)
893 charge = charge + st%occ(ist, ispin)
912 if (st%fixed_occ)
then
913 call parse_variable(namespace,
'RestartReorderOccs', .false., st%restart_reorder_occs)
915 st%restart_reorder_occs = .false.
918 call smear_init(st%smear, namespace, st%d%ispin, st%fixed_occ, integral_occs, kpoints)
920 unoccupied_states = (st%d%ispin /=
spinors .and. st%nst*2 > st%qtot) .or. (st%d%ispin ==
spinors .and. st%nst > st%qtot)
923 if (.not. unoccupied_states)
then
924 call messages_write(
'Smearing needs unoccupied states (via ExtraStates or TotalStates) to be useful.')
932 charge = charge + sum(st%occ(ist, 1:st%nik) * st%kweights(1:st%nik))
934 if (abs(charge - st%qtot) > 1e-6_real64)
then
935 message(1) =
"Initial occupations do not integrate to total charge."
936 write(
message(2),
'(6x,f12.6,a,f12.6)') charge,
' != ', st%qtot
958 integer :: i, j, nrows
963 st%fixed_spins = .false.
964 if (st%d%ispin /=
spinors)
then
1003 spin_fix:
if (
parse_block(namespace,
'InitialSpins', blk) == 0)
then
1005 if (nrows < st%nst)
then
1006 message(1) =
"Please specify one row for each state in InitialSpins, also for extra states."
1016 st%fixed_spins = .
true.
1018 st%spin(:, :, i) = st%spin(:, :, 1)
1031 class(
mesh_t),
intent(in) :: mesh
1032 type(
type_t),
optional,
intent(in) :: wfs_type
1033 logical,
optional,
intent(in) :: skip(:)
1034 logical,
optional,
intent(in) :: packed
1038 if (
present(wfs_type))
then
1040 st%wfs_type = wfs_type
1068 type(
mesh_t),
intent(in) :: mesh
1069 logical,
optional,
intent(in) :: verbose
1070 logical,
optional,
intent(in) :: skip(:)
1071 logical,
optional,
intent(in) :: packed
1073 integer :: ib, iqn, ist, istmin, istmax
1074 logical :: same_node, verbose_, packed_
1075 integer,
allocatable :: bstart(:), bend(:)
1079 safe_allocate(bstart(1:st%nst))
1080 safe_allocate(bend(1:st%nst))
1081 safe_allocate(st%group%iblock(1:st%nst))
1090 if (
present(skip))
then
1092 if (.not. skip(ist))
then
1100 if (
present(skip))
then
1101 do ist = st%nst, istmin, -1
1102 if (.not. skip(ist))
then
1109 if (
present(skip) .and. verbose_)
then
1119 st%group%nblocks = 0
1121 do ist = istmin, istmax
1124 st%group%iblock(ist) = st%group%nblocks + 1
1127 if (st%parallel_in_states .and. ist /= istmax)
then
1130 same_node = (st%node(ist + 1) == st%node(ist))
1133 if (ib == st%block_size .or. ist == istmax .or. .not. same_node)
then
1135 st%group%nblocks = st%group%nblocks + 1
1136 bend(st%group%nblocks) = ist
1137 if (ist /= istmax) bstart(st%group%nblocks + 1) = ist + 1
1141 safe_allocate(st%group%psib(1:st%group%nblocks, st%d%kpt%start:st%d%kpt%end))
1143 safe_allocate(st%group%block_is_local(1:st%group%nblocks, 1:st%nik))
1144 st%group%block_is_local = .false.
1145 st%group%block_start = -1
1146 st%group%block_end = -2
1148 do ib = 1, st%group%nblocks
1149 if (bstart(ib) >= st%st_start .and. bend(ib) <= st%st_end)
then
1150 if (st%group%block_start == -1) st%group%block_start = ib
1151 st%group%block_end = ib
1152 do iqn = st%d%kpt%start, st%d%kpt%end
1153 st%group%block_is_local(ib, iqn) = .
true.
1156 call dwfs_elec_init(st%group%psib(ib, iqn), st%d%dim, bstart(ib), bend(ib), mesh%np_part, iqn, &
1157 special=.
true., packed=packed_)
1159 call zwfs_elec_init(st%group%psib(ib, iqn), st%d%dim, bstart(ib), bend(ib), mesh%np_part, iqn, &
1160 special=.
true., packed=packed_)
1167 safe_allocate(st%group%block_range(1:st%group%nblocks, 1:2))
1168 safe_allocate(st%group%block_size(1:st%group%nblocks))
1170 st%group%block_range(1:st%group%nblocks, 1) = bstart(1:st%group%nblocks)
1171 st%group%block_range(1:st%group%nblocks, 2) = bend(1:st%group%nblocks)
1172 st%group%block_size(1:st%group%nblocks) = bend(1:st%group%nblocks) - bstart(1:st%group%nblocks) + 1
1174 st%group%block_initialized = .
true.
1176 safe_allocate(st%group%block_node(1:st%group%nblocks, 1:st%nik))
1177 st%group%block_node = 0
1179 assert(
allocated(st%node))
1180 assert(all(st%node >= 0) .and. all(st%node < st%mpi_grp%size))
1182 do iqn = st%d%kpt%start, st%d%kpt%end
1183 do ib = st%group%block_start, st%group%block_end
1184 st%group%block_node(ib, iqn) = st%st_kpt_mpi_grp%rank
1193 do ib = 1, st%group%nblocks
1199 if (st%group%block_size(ib) > 0)
then
1229 safe_deallocate_a(bstart)
1230 safe_deallocate_a(bend)
1251 type(
grid_t),
intent(in) :: gr
1253 real(real64) :: fsize
1257 safe_allocate(st%rho(1:gr%np_part, 1:st%d%nspin))
1260 fsize = gr%np_part*8.0_real64*st%block_size
1272 class(
space_t),
intent(in) :: space
1273 class(
mesh_t),
intent(in) :: mesh
1277 if (.not.
allocated(st%current))
then
1278 safe_allocate(st%current(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1282 if (.not.
allocated(st%current_para))
then
1283 safe_allocate(st%current_para(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1287 if (.not.
allocated(st%current_dia))
then
1288 safe_allocate(st%current_dia(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1292 if (.not.
allocated(st%current_mag))
then
1293 safe_allocate(st%current_mag(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1297 if (.not.
allocated(st%current_kpt))
then
1298 safe_allocate(st%current_kpt(1:mesh%np,1:space%dim,st%d%kpt%start:st%d%kpt%end))
1377 default = option__statesorthogonalization__cholesky_serial
1378#ifdef HAVE_SCALAPACK
1380 default = option__statesorthogonalization__cholesky_parallel
1384 call parse_variable(namespace,
'StatesOrthogonalization', default, st%orth_method)
1405 call parse_variable(namespace,
'StatesDeviceMemory', -512.0_real64, st%gpu_states_mem)
1415 subroutine states_elec_copy(stout, stin, exclude_wfns, exclude_eigenval, special)
1418 logical,
optional,
intent(in) :: exclude_wfns
1419 logical,
optional,
intent(in) :: exclude_eigenval
1420 logical,
optional,
intent(in) :: special
1422 logical :: exclude_wfns_
1431 safe_allocate_source_a(stout%kweights, stin%kweights)
1432 stout%nik = stin%nik
1436 stout%wfs_type = stin%wfs_type
1437 stout%nst = stin%nst
1438 stout%block_size = stin%block_size
1439 stout%orth_method = stin%orth_method
1441 stout%gpu_states_mem = stin%gpu_states_mem
1442 stout%pack_states = stin%pack_states
1444 stout%only_userdef_istates = stin%only_userdef_istates
1446 if (.not. exclude_wfns_)
then
1447 safe_allocate_source_a(stout%rho, stin%rho)
1450 stout%uniform_occ = stin%uniform_occ
1453 safe_allocate_source_a(stout%eigenval, stin%eigenval)
1454 safe_allocate_source_a(stout%occ, stin%occ)
1455 safe_allocate_source_a(stout%spin, stin%spin)
1460 stout%group%nblocks = stin%group%nblocks
1462 safe_allocate_source_a(stout%user_def_states, stin%user_def_states)
1464 safe_allocate_source_a(stout%current, stin%current)
1465 safe_allocate_source_a(stout%current_kpt, stin%current_kpt)
1466 safe_allocate_source_a(stout%rho_core, stin%rho_core)
1467 safe_allocate_source_a(stout%frozen_rho, stin%frozen_rho)
1468 safe_allocate_source_a(stout%frozen_tau, stin%frozen_tau)
1469 safe_allocate_source_a(stout%frozen_gdens, stin%frozen_gdens)
1470 safe_allocate_source_a(stout%frozen_ldens, stin%frozen_ldens)
1472 stout%fixed_occ = stin%fixed_occ
1473 stout%restart_fixed_occ = stin%restart_fixed_occ
1475 stout%fixed_spins = stin%fixed_spins
1477 stout%qtot = stin%qtot
1478 stout%val_charge = stin%val_charge
1482 stout%parallel_in_states = stin%parallel_in_states
1485 call mpi_grp_copy(stout%dom_st_kpt_mpi_grp, stin%dom_st_kpt_mpi_grp)
1486 call mpi_grp_copy(stout%st_kpt_mpi_grp, stin%st_kpt_mpi_grp)
1487 call mpi_grp_copy(stout%dom_st_mpi_grp, stin%dom_st_mpi_grp)
1488 safe_allocate_source_a(stout%node, stin%node)
1489 safe_allocate_source_a(stout%st_kpt_task, stin%st_kpt_task)
1491#ifdef HAVE_SCALAPACK
1497 stout%scalapack_compatible = stin%scalapack_compatible
1499 stout%lnst = stin%lnst
1500 stout%st_start = stin%st_start
1501 stout%st_end = stin%st_end
1505 stout%symmetrize_density = stin%symmetrize_density
1509 stout%packed = stin%packed
1511 stout%randomization = stin%randomization
1532 safe_deallocate_a(st%user_def_states)
1534 safe_deallocate_a(st%rho)
1535 safe_deallocate_a(st%eigenval)
1537 safe_deallocate_a(st%current)
1538 safe_deallocate_a(st%current_para)
1539 safe_deallocate_a(st%current_dia)
1540 safe_deallocate_a(st%current_mag)
1541 safe_deallocate_a(st%current_kpt)
1542 safe_deallocate_a(st%rho_core)
1543 safe_deallocate_a(st%frozen_rho)
1544 safe_deallocate_a(st%frozen_tau)
1545 safe_deallocate_a(st%frozen_gdens)
1546 safe_deallocate_a(st%frozen_ldens)
1547 safe_deallocate_a(st%occ)
1548 safe_deallocate_a(st%spin)
1549 safe_deallocate_a(st%kweights)
1552#ifdef HAVE_SCALAPACK
1558 safe_deallocate_a(st%node)
1559 safe_deallocate_a(st%st_kpt_task)
1561 if (st%parallel_in_states)
then
1562 safe_deallocate_a(st%ap%schedule)
1576 class(
mesh_t),
intent(in) :: mesh
1578 integer,
optional,
intent(in) :: ist_start_
1579 integer,
optional,
intent(in) :: ist_end_
1580 integer,
optional,
intent(in) :: ikpt_start_
1581 integer,
optional,
intent(in) :: ikpt_end_
1582 logical,
optional,
intent(in) :: normalized
1585 integer :: ist, ik, id, ist_start, ist_end, jst, ikpt_start, ikpt_end
1586 complex(real64) :: alpha, beta
1587 real(real64),
allocatable :: dpsi(:, :)
1588 complex(real64),
allocatable :: zpsi(:, :), zpsi2(:)
1589 integer :: ikpoint, ip
1592 logical :: normalized_
1603 safe_allocate(dpsi(1:mesh%np, 1:st%d%dim))
1605 safe_allocate(zpsi(1:mesh%np, 1:st%d%dim))
1608 select case (st%d%ispin)
1611 do ik = ikpt_start, ikpt_end
1612 ikpoint = st%d%get_kpoint_index(ik)
1613 do ist = ist_start, ist_end
1617 pre_shift = mesh%pv%xlocal-1, &
1618 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1619 normalized = normalized)
1621 if(mesh%parallel_in_domains)
then
1627 call dmf_random(mesh, dpsi(:, 1), normalized = normalized)
1632 zpsi(ip,1) = cmplx(dpsi(ip,1),
m_zero, real64)
1641 pre_shift = mesh%pv%xlocal-1, &
1642 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1643 normalized = normalized)
1645 if(mesh%parallel_in_domains)
then
1651 call zmf_random(mesh, zpsi(:, 1), normalized = normalized)
1663 if (st%fixed_spins)
then
1665 do ik = ikpt_start, ikpt_end
1666 ikpoint = st%d%get_kpoint_index(ik)
1667 do ist = ist_start, ist_end
1671 pre_shift = mesh%pv%xlocal-1, &
1672 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1673 normalized = normalized)
1675 if(mesh%parallel_in_domains)
then
1681 call dmf_random(mesh, dpsi(:, 1), normalized = normalized)
1685 zpsi(ip,1) = cmplx(dpsi(ip,1),
m_zero, real64)
1691 pre_shift = mesh%pv%xlocal-1, &
1692 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1693 normalized = normalized)
1695 if(mesh%parallel_in_domains)
then
1701 call zmf_random(mesh, zpsi(:, 1), normalized = normalized)
1714 safe_allocate(zpsi2(1:mesh%np))
1715 do jst = ist_start, ist - 1
1717 zpsi(1:mesh%np, 1) = zpsi(1:mesh%np, 1) -
zmf_dotp(mesh, zpsi(:, 1), zpsi2)*zpsi2(1:mesh%np)
1719 safe_deallocate_a(zpsi2)
1722 zpsi(1:mesh%np, 2) = zpsi(1:mesh%np, 1)
1727 beta = cmplx(st%spin(1, ist, ik) / abs(alpha), st%spin(2, ist, ik) / abs(alpha), real64)
1729 zpsi(1:mesh%np, 1) = alpha*zpsi(1:mesh%np, 1)
1730 zpsi(1:mesh%np, 2) = beta*zpsi(1:mesh%np, 2)
1735 do ik = ikpt_start, ikpt_end
1736 do ist = ist_start, ist_end
1740 pre_shift = mesh%pv%xlocal-1, &
1741 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1742 normalized = .false.)
1744 if(mesh%parallel_in_domains)
then
1750 call zmf_random(mesh, zpsi(:, id), normalized = .false.)
1766 safe_deallocate_a(dpsi)
1767 safe_deallocate_a(zpsi)
1778 class(
mesh_t),
intent(in) :: mesh
1779 logical,
optional,
intent(in) :: compute_spin
1783 real(real64) :: charge
1784 complex(real64),
allocatable :: zpsi(:, :)
1789 st%nik, st%nst, st%kweights)
1796 charge = charge + sum(st%occ(ist, 1:st%nik) * st%kweights(1:st%nik))
1798 if (abs(charge-st%qtot) > 1e-6_real64)
then
1799 message(1) =
'Occupations do not integrate to total charge.'
1800 write(
message(2),
'(6x,f12.8,a,f12.8)') charge,
' != ', st%qtot
1803 message(1) =
"There don't seem to be any electrons at all!"
1813 safe_allocate(zpsi(1:mesh%np, st%d%dim))
1814 do ik = st%d%kpt%start, st%d%kpt%end
1815 do ist = st%st_start, st%st_end
1817 st%spin(1:3, ist, ik) =
state_spin(mesh, zpsi)
1820 safe_deallocate_a(zpsi)
1822 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
1837 real(real64),
optional,
intent(in) :: alt_eig(st%st_start:, st%d%kpt%start:)
1846 do ik = st%d%kpt%start, st%d%kpt%end
1847 if (
present(alt_eig))
then
1848 tot = tot + st%kweights(ik) * sum(st%occ(st%st_start:st%st_end, ik) * &
1849 alt_eig(st%st_start:st%st_end, ik))
1851 tot = tot + st%kweights(ik) * sum(st%occ(st%st_start:st%st_end, ik) * &
1852 st%eigenval(st%st_start:st%st_end, ik))
1856 if (st%parallel_in_states .or. st%d%kpt%parallel)
call comm_allreduce(st%st_kpt_mpi_grp, tot)
1868 logical :: default_scalapack_compatible
1879 st%parallel_in_states = .false.
1883 call mpi_grp_init(st%dom_st_kpt_mpi_grp, mc%dom_st_kpt_comm)
1887 default_scalapack_compatible =
calc_mode_par%scalapack_compat() .and. .not. st%d%kpt%parallel
1901 call parse_variable(namespace,
'ScaLAPACKCompatible', default_scalapack_compatible, st%scalapack_compatible)
1903#ifdef HAVE_SCALAPACK
1904 if (default_scalapack_compatible .neqv. st%scalapack_compatible)
then
1905 call messages_experimental(
'Setting ScaLAPACKCompatible to other than default', namespace=namespace)
1908 if (st%scalapack_compatible)
then
1915 st%scalapack_compatible = .false.
1921 call multicomm_create_all_pairs(st%mpi_grp, st%ap)
1924 if (st%nst < st%mpi_grp%size)
then
1925 message(1) =
"Have more processors than necessary"
1926 write(
message(2),
'(i4,a,i4,a)') st%mpi_grp%size,
" processors and ", st%nst,
" states."
1930 call distributed_init(st%dist, st%nst, st%mpi_grp%comm,
"states", scalapack_compat = st%scalapack_compatible)
1932 st%parallel_in_states = st%dist%parallel
1935 st%st_start = st%dist%start
1936 st%st_end = st%dist%end
1937 st%lnst = st%dist%nlocal
1938 st%node(1:st%nst) = st%dist%node(1:st%nst)
1955 kinetic_energy_density, paramagnetic_current, density_gradient, density_laplacian, &
1956 gi_kinetic_energy_density, st_end)
1957 type(
grid_t),
intent(in) :: gr
1960 logical,
intent(in) :: nlcc
1961 real(real64),
contiguous,
optional,
target,
intent(out) :: kinetic_energy_density(:,:)
1962 real(real64),
contiguous,
optional,
target,
intent(out) :: paramagnetic_current(:,:,:)
1963 real(real64),
contiguous,
optional,
intent(out) :: density_gradient(:,:,:)
1964 real(real64),
contiguous,
optional,
intent(out) :: density_laplacian(:,:)
1965 real(real64),
contiguous,
optional,
intent(out) :: gi_kinetic_energy_density(:,:)
1966 integer,
optional,
intent(in) :: st_end
1968 real(real64),
pointer,
contiguous :: jp(:, :, :)
1969 real(real64),
pointer,
contiguous :: tau(:, :)
1970 complex(real64),
allocatable :: wf_psi(:,:), gwf_psi(:,:,:), wf_psi_conj(:,:), lwf_psi(:,:)
1971 real(real64),
allocatable :: abs_wf_psi(:,:), abs_gwf_psi(:,:)
1972 complex(real64),
allocatable :: psi_gpsi(:,:)
1973 complex(real64) :: c_tmp
1974 integer :: is, ik, ist, i_dim, st_dim, ii, st_end_
1975 real(real64) :: ww, kpoint(gr%der%dim)
1976 logical :: something_to_do
1984 something_to_do =
present(kinetic_energy_density) .or.
present(gi_kinetic_energy_density) .or. &
1985 present(paramagnetic_current) .or.
present(density_gradient) .or.
present(density_laplacian)
1986 assert(something_to_do)
1988 safe_allocate( wf_psi(1:gr%np_part, 1:st%d%dim))
1989 safe_allocate( wf_psi_conj(1:gr%np_part, 1:st%d%dim))
1990 safe_allocate(gwf_psi(1:gr%np, 1:gr%der%dim, 1:st%d%dim))
1991 safe_allocate(abs_wf_psi(1:gr%np, 1:st%d%dim))
1992 safe_allocate(abs_gwf_psi(1:gr%np, 1:st%d%dim))
1993 safe_allocate(psi_gpsi(1:gr%np, 1:st%d%dim))
1994 if (
present(density_laplacian))
then
1995 safe_allocate(lwf_psi(1:gr%np, 1:st%d%dim))
1999 if (
present(kinetic_energy_density)) tau => kinetic_energy_density
2002 if (
present(paramagnetic_current)) jp => paramagnetic_current
2006 if (
present(gi_kinetic_energy_density))
then
2008 safe_allocate(jp(1:gr%np, 1:gr%der%dim, 1:st%d%nspin))
2010 if (.not.
present(kinetic_energy_density))
then
2011 safe_allocate(tau(1:gr%np, 1:st%d%nspin))
2015 if (
associated(tau)) tau =
m_zero
2016 if (
associated(jp)) jp =
m_zero
2017 if (
present(density_gradient)) density_gradient(:,:,:) =
m_zero
2018 if (
present(density_laplacian)) density_laplacian(:,:) =
m_zero
2019 if (
present(gi_kinetic_energy_density)) gi_kinetic_energy_density =
m_zero
2021 do ik = st%d%kpt%start, st%d%kpt%end
2023 kpoint(1:gr%der%dim) = kpoints%get_point(st%d%get_kpoint_index(ik))
2024 is = st%d%get_spin_index(ik)
2026 do ist = st%st_start, st_end_
2027 ww = st%kweights(ik)*st%occ(ist, ik)
2033 do st_dim = 1, st%d%dim
2038 do st_dim = 1, st%d%dim
2039 call zderivatives_grad(gr%der, wf_psi(:,st_dim), gwf_psi(:,:,st_dim), set_bc = .false.)
2043 if (
present(density_laplacian))
then
2044 do st_dim = 1, st%d%dim
2045 call zderivatives_lapl(gr%der, wf_psi(:,st_dim), lwf_psi(:,st_dim), ghost_update = .false., set_bc = .false.)
2050 wf_psi_conj(1:gr%np, 1:st%d%dim) = conjg(wf_psi(1:gr%np,1:st%d%dim))
2051 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)
2053 if (
present(density_laplacian))
then
2054 density_laplacian(1:gr%np, is) = density_laplacian(1:gr%np, is) + &
2055 ww *
m_two*real(wf_psi_conj(1:gr%np, 1) * lwf_psi(1:gr%np, 1), real64)
2056 if (st%d%ispin ==
spinors)
then
2057 density_laplacian(1:gr%np, 2) = density_laplacian(1:gr%np, 2) + &
2058 ww *
m_two*real(wf_psi_conj(1:gr%np, 2) * lwf_psi(1:gr%np, 2), real64)
2061 c_tmp = ww*(lwf_psi(ii, 1) * wf_psi_conj(ii, 2) + wf_psi(ii, 1) * conjg(lwf_psi(ii, 2)))
2062 density_laplacian(ii, 3) = density_laplacian(ii, 3) + real(c_tmp, real64)
2063 density_laplacian(ii, 4) = density_laplacian(ii, 4) + aimag(c_tmp)
2068 if (
associated(tau))
then
2069 tau(1:gr%np, is) = tau(1:gr%np, is) &
2070 + ww * sum(kpoint(1:gr%der%dim)**2) * abs_wf_psi(1:gr%np, 1)
2071 if (st%d%ispin ==
spinors)
then
2072 tau(1:gr%np, 2) = tau(1:gr%np, 2) &
2073 + ww * sum(kpoint(1:gr%der%dim)**2) * abs_wf_psi(1:gr%np, 2)
2077 c_tmp = ww * sum(kpoint(1:gr%der%dim)**2) * wf_psi(ii, 1) * wf_psi_conj(ii, 2)
2078 tau(ii, 3) = tau(ii, 3) + real(c_tmp, real64)
2079 tau(ii, 4) = tau(ii, 4) + aimag(c_tmp)
2084 do i_dim = 1, gr%der%dim
2087 psi_gpsi(1:gr%np, 1:st%d%dim) = wf_psi_conj(1:gr%np, 1:st%d%dim) &
2088 * gwf_psi(1:gr%np,i_dim,1:st%d%dim)
2089 abs_gwf_psi(1:gr%np, 1:st%d%dim) = real(conjg(gwf_psi(1:gr%np, i_dim, 1:st%d%dim)) &
2090 * gwf_psi(1:gr%np, i_dim, 1:st%d%dim), real64)
2092 if (
present(density_gradient))
then
2093 density_gradient(1:gr%np, i_dim, is) = density_gradient(1:gr%np, i_dim, is) &
2094 + ww *
m_two * real(psi_gpsi(1:gr%np, 1), real64)
2095 if (st%d%ispin ==
spinors)
then
2096 density_gradient(1:gr%np, i_dim, 2) = density_gradient(1:gr%np, i_dim, 2) &
2097 + ww *
m_two*real(psi_gpsi(1:gr%np, 2), real64)
2100 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)))
2101 density_gradient(ii, i_dim, 3) = density_gradient(ii, i_dim, 3) + real(c_tmp, real64)
2102 density_gradient(ii, i_dim, 4) = density_gradient(ii, i_dim, 4) + aimag(c_tmp)
2107 if (
present(density_laplacian))
then
2108 call lalg_axpy(gr%np, ww*
m_two, abs_gwf_psi(:,1), density_laplacian(:,is))
2109 if (st%d%ispin ==
spinors)
then
2110 call lalg_axpy(gr%np, ww*
m_two, abs_gwf_psi(:,2), density_laplacian(:,2))
2113 c_tmp =
m_two * ww * gwf_psi(ii, i_dim, 1) * conjg(gwf_psi(ii, i_dim, 2))
2114 density_laplacian(ii, 3) = density_laplacian(ii, 3) + real(c_tmp, real64)
2115 density_laplacian(ii, 4) = density_laplacian(ii, 4) + aimag(c_tmp)
2123 if (
associated(jp))
then
2125 jp(1:gr%np, i_dim, is) = jp(1:gr%np, i_dim, is) + &
2126 ww*(aimag(psi_gpsi(1:gr%np, 1)) - abs_wf_psi(1:gr%np, 1)*kpoint(i_dim))
2127 if (st%d%ispin ==
spinors)
then
2128 jp(1:gr%np, i_dim, 2) = jp(1:gr%np, i_dim, 2) + &
2129 ww*( aimag(psi_gpsi(1:gr%np, 2)) - abs_wf_psi(1:gr%np, 2)*kpoint(i_dim))
2132 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)) &
2133 -
m_two *
m_zi*wf_psi(ii, 1)*wf_psi_conj(ii, 2)*kpoint(i_dim))
2134 jp(ii, i_dim, 3) = jp(ii, i_dim, 3) + real(c_tmp, real64)
2135 jp(ii, i_dim, 4) = jp(ii, i_dim, 4) + aimag(c_tmp)
2144 if (
associated(tau))
then
2145 tau(1:gr%np, is) = tau(1:gr%np, is) + ww*(abs_gwf_psi(1:gr%np,1) &
2146 -
m_two*aimag(psi_gpsi(1:gr%np, 1))*kpoint(i_dim))
2147 if (st%d%ispin ==
spinors)
then
2148 tau(1:gr%np, 2) = tau(1:gr%np, 2) + ww*(abs_gwf_psi(1:gr%np, 2) &
2149 -
m_two*aimag(psi_gpsi(1:gr%np, 2))*kpoint(i_dim))
2152 c_tmp = ww * ( gwf_psi(ii, i_dim, 1)*conjg(gwf_psi(ii, i_dim, 2)) &
2153 +
m_zi * (gwf_psi(ii,i_dim,1)*wf_psi_conj(ii, 2) &
2154 - wf_psi(ii, 1)*conjg(gwf_psi(ii,i_dim,2)))*kpoint(i_dim))
2155 tau(ii, 3) = tau(ii, 3) + real(c_tmp, real64)
2156 tau(ii, 4) = tau(ii, 4) + aimag(c_tmp)
2166 safe_deallocate_a(wf_psi_conj)
2167 safe_deallocate_a(abs_wf_psi)
2168 safe_deallocate_a(abs_gwf_psi)
2169 safe_deallocate_a(psi_gpsi)
2171 if (.not.
present(gi_kinetic_energy_density))
then
2172 if (.not.
present(paramagnetic_current))
then
2173 safe_deallocate_p(jp)
2175 if (.not.
present(kinetic_energy_density))
then
2176 safe_deallocate_p(tau)
2180 if (st%parallel_in_states .or. st%d%kpt%parallel)
call reduce_all(st%st_kpt_mpi_grp)
2185 if (st%symmetrize_density)
then
2186 do is = 1, st%d%nspin
2187 if (
associated(tau))
then
2191 if (
present(density_laplacian))
then
2195 if (
associated(jp))
then
2199 if (
present(density_gradient))
then
2206 if (
allocated(st%rho_core) .and. nlcc .and. (
present(density_laplacian) .or.
present(density_gradient)))
then
2208 wf_psi(ii, 1) = st%rho_core(ii)/st%d%spin_channels
2213 if (
present(density_gradient))
then
2216 do is = 1, st%d%spin_channels
2217 density_gradient(1:gr%np, 1:gr%der%dim, is) = density_gradient(1:gr%np, 1:gr%der%dim, is) + &
2218 real(gwf_psi(1:gr%np, 1:gr%der%dim,1))
2223 if (
present(density_laplacian))
then
2226 do is = 1, st%d%spin_channels
2227 density_laplacian(1:gr%np, is) = density_laplacian(1:gr%np, is) + real(lwf_psi(1:gr%np, 1))
2234 if (
allocated(st%frozen_tau) .and. .not.
present(st_end) .and.
associated(tau))
then
2237 if (
allocated(st%frozen_gdens) .and. .not.
present(st_end) .and.
present(density_gradient))
then
2238 do is = 1, st%d%nspin
2239 call lalg_axpy(gr%np, gr%der%dim,
m_one, st%frozen_gdens(:,:,is), density_gradient(:,:,is))
2242 if (
allocated(st%frozen_ldens) .and. .not.
present(st_end) .and.
present(density_laplacian))
then
2243 call lalg_axpy(gr%np, st%d%nspin,
m_one, st%frozen_ldens, density_laplacian)
2246 safe_deallocate_a(wf_psi)
2247 safe_deallocate_a(gwf_psi)
2248 safe_deallocate_a(lwf_psi)
2252 if (
present(gi_kinetic_energy_density))
then
2253 do is = 1, st%d%nspin
2254 assert(
associated(tau))
2255 gi_kinetic_energy_density(1:gr%np, is) = tau(1:gr%np, is)
2258 assert(
associated(jp))
2259 if (st%d%ispin /=
spinors)
then
2260 do is = 1, st%d%nspin
2263 if (st%rho(ii, is) < 1.0e-7_real64) cycle
2264 gi_kinetic_energy_density(ii, is) = &
2265 gi_kinetic_energy_density(ii, is) - sum(jp(ii,1:gr%der%dim, is)**2)/st%rho(ii, is)
2271 gi_kinetic_energy_density(ii, 1) = gi_kinetic_energy_density(ii, 1) &
2272 - sum(jp(ii,1:gr%der%dim, 1)**2)/(safe_tol(st%rho(ii, 1),
m_epsilon))
2273 gi_kinetic_energy_density(ii, 2) = gi_kinetic_energy_density(ii, 2) &
2274 - sum(jp(ii,1:gr%der%dim, 2)**2)/(safe_tol(st%rho(ii, 2),
m_epsilon))
2275 gi_kinetic_energy_density(ii, 3) = &
2276 gi_kinetic_energy_density(ii, 3) - sum(jp(ii,1:gr%der%dim, 3)**2 + jp(ii,1:gr%der%dim, 4)**2) &
2277 /(safe_tol((st%rho(ii, 3)**2 + st%rho(ii, 4)**2),
m_epsilon))*st%rho(ii, 3)
2278 gi_kinetic_energy_density(ii, 4) = &
2279 gi_kinetic_energy_density(ii, 4) + sum(jp(ii,1:gr%der%dim, 3)**2 + jp(ii,1:gr%der%dim, 4)**2) &
2280 /(safe_tol((st%rho(ii, 3)**2 + st%rho(ii, 4)**2),
m_epsilon))*st%rho(ii, 4)
2286 if (.not.
present(kinetic_energy_density))
then
2287 safe_deallocate_p(tau)
2289 if (.not.
present(paramagnetic_current))
then
2290 safe_deallocate_p(jp)
2305 if (
associated(tau))
call comm_allreduce(grp, tau, dim = (/gr%np, st%d%nspin/))
2307 if (
present(density_laplacian))
call comm_allreduce(grp, density_laplacian, dim = (/gr%np, st%d%nspin/))
2309 do is = 1, st%d%nspin
2310 if (
associated(jp))
call comm_allreduce(grp, jp(:, :, is), dim = (/gr%np, gr%der%dim/))
2312 if (
present(density_gradient))
then
2313 call comm_allreduce(grp, density_gradient(:, :, is), dim = (/gr%np, gr%der%dim/))
2327 type(
mesh_t),
intent(in) :: mesh
2328 complex(real64),
intent(in) :: f1(:, :)
2329 real(real64) :: spin(1:3)
2331 complex(real64) :: z
2335 z =
zmf_dotp(mesh, f1(:, 1) , f1(:, 2))
2337 spin(1) =
m_two*real(z, real64)
2338 spin(2) =
m_two*aimag(z)
2350 integer,
intent(in) :: ist
2364 integer,
intent(in) :: ist
2365 integer,
intent(in) :: ik
2370 ik >= st%d%kpt%start .and. ik <= st%d%kpt%end
2380 class(
mesh_t),
intent(in) :: mesh
2386 memory = memory + real(storage_size(0.0_real64)/8, real64) * &
2387 real(mesh%np_part_global, real64) *st%d%dim *
real(st%nst, real64) *st%d%kpt%nglobal
2397 logical,
optional,
intent(in) :: copy
2400 integer(int64) :: max_mem, mem
2412 if (accel_is_enabled())
then
2413 max_mem = accel_global_memory_size()
2415 if (st%gpu_states_mem > m_one)
then
2416 max_mem = int(st%gpu_states_mem, int64)*(1024_8)**2
2417 else if (st%gpu_states_mem < 0.0_real64)
then
2418 max_mem = max_mem + int(st%gpu_states_mem, int64)*(1024_8)**2
2420 max_mem = int(st%gpu_states_mem*real(max_mem, real64) , int64)
2423 max_mem = huge(max_mem)
2427 qnloop:
do iqn = st%d%kpt%start, st%d%kpt%end
2428 do ib = st%group%block_start, st%group%block_end
2430 mem = mem + st%group%psib(ib, iqn)%pack_total_size()
2432 if (mem > max_mem)
then
2433 call messages_write(
'Not enough CL device memory to store all states simultaneously.', new_line = .
true.)
2434 call messages_write(
'Only ')
2435 call messages_write(ib - st%group%block_start)
2436 call messages_write(
' of ')
2437 call messages_write(st%group%block_end - st%group%block_start + 1)
2438 call messages_write(
' blocks will be stored in device memory.', new_line = .
true.)
2439 call messages_warning()
2443 call st%group%psib(ib, iqn)%do_pack(copy)
2455 logical,
optional,
intent(in) :: copy
2464 do iqn = st%d%kpt%start, st%d%kpt%end
2465 do ib = st%group%block_start, st%group%block_end
2466 if (st%group%psib(ib, iqn)%is_packed())
call st%group%psib(ib, iqn)%do_unpack(copy)
2479 type(namespace_t),
intent(in) :: namespace
2483 call messages_print_with_emphasis(msg=
"States", namespace=namespace)
2485 write(message(1),
'(a,f12.3)')
'Total electronic charge = ', st%qtot
2486 write(message(2),
'(a,i8)')
'Number of states = ', st%nst
2487 write(message(3),
'(a,i8)')
'States block-size = ', st%block_size
2488 call messages_info(3, namespace=namespace)
2490 call messages_print_with_emphasis(namespace=namespace)
2503 do iqn = st%d%kpt%start, st%d%kpt%end
2504 do ib = st%group%block_start, st%group%block_end
2505 call batch_set_zero(st%group%psib(ib, iqn))
2515 integer pure function states_elec_block_min(st, ib) result(range)
2517 integer,
intent(in) :: ib
2519 range = st%group%block_range(ib, 1)
2525 integer pure function states_elec_block_max(st, ib) result(range)
2527 integer,
intent(in) :: ib
2529 range = st%group%block_range(ib, 2)
2535 integer pure function states_elec_block_size(st, ib) result(size)
2537 integer,
intent(in) :: ib
2539 size = st%group%block_size(ib)
2547 type(namespace_t),
intent(in) :: namespace
2548 integer,
intent(out) :: n_pairs
2549 integer,
intent(out) :: n_occ(:)
2550 integer,
intent(out) :: n_unocc(:)
2551 logical,
allocatable,
intent(out) :: is_included(:,:,:)
2553 logical,
intent(out) :: is_frac_occ
2555 integer :: ik, ist, ast, n_filled, n_partially_filled, n_half_filled
2556 character(len=80) :: nst_string, default, wfn_list
2557 real(real64) :: energy_window
2558 real(real64) :: fdiff, delta_e
2559 real(real64) :: fdiff_tol
2560 real(real64) :: delta_e_tol
2564 is_frac_occ = .false.
2566 call occupied_states(st, namespace, ik, n_filled, n_partially_filled, n_half_filled)
2567 if (n_partially_filled > 0 .or. n_half_filled > 0) is_frac_occ = .
true.
2568 n_occ(ik) = n_filled + n_partially_filled + n_half_filled
2569 n_unocc(ik) = st%nst - n_filled
2582 call parse_variable(namespace,
'CasidaKSEnergyWindow', -m_one, energy_window, units_inp%energy)
2592 call parse_variable(namespace,
'CasidaThresholdOccupation', 1.0e-12_real64, fdiff_tol)
2602 call parse_variable(namespace,
'CasidaThresholdEnergy', 1.0e-12_real64, delta_e_tol, units_inp%energy)
2625 safe_allocate(is_included(st%nst, st%nst , st%nik))
2626 is_included(:,:,:) = .false.
2628 if (energy_window < m_zero)
then
2629 write(nst_string,
'(i6)') st%nst
2630 write(default,
'(a,a)')
"1-", trim(adjustl(nst_string))
2631 call parse_variable(namespace,
'CasidaKohnShamStates', default, wfn_list)
2633 write(message(1),
'(a,a)')
"Info: States that form the basis: ", trim(wfn_list)
2634 call messages_info(1, namespace=namespace)
2640 if (.not. loct_isinstringlist(ast, wfn_list)) cycle
2642 if (.not. loct_isinstringlist(ist, wfn_list)) cycle
2643 fdiff = st%occ(ist,ik) - st%occ(ast,ik)
2644 if (fdiff <= fdiff_tol) cycle
2645 n_pairs = n_pairs + 1
2646 is_included(ist, ast, ik) = .
true.
2653 write(message(1),
'(a,f12.6,a)')
"Info: including transitions with energy < ", &
2654 units_from_atomic(units_out%energy, energy_window), trim(units_abbrev(units_out%energy))
2655 call messages_info(1, namespace=namespace)
2662 fdiff = st%occ(ist,ik) - st%occ(ast,ik)
2663 if (fdiff <= fdiff_tol) cycle
2664 delta_e = st%eigenval(ast, ik) - st%eigenval(ist, ik)
2665 if (delta_e <= delta_e_tol) cycle
2666 if (delta_e >= energy_window) cycle
2667 n_pairs = n_pairs + 1
2668 is_included(ist, ast, ik) = .
true.
2695 subroutine occupied_states(st, namespace, ik, n_filled, n_partially_filled, n_half_filled, &
2696 filled, partially_filled, half_filled)
2698 type(namespace_t),
intent(in) :: namespace
2699 integer,
intent(in) :: ik
2700 integer,
intent(out) :: n_filled, n_partially_filled, n_half_filled
2701 integer,
optional,
intent(out) :: filled(:), partially_filled(:), half_filled(:)
2707 if (
present(filled)) filled(:) = 0
2708 if (
present(partially_filled)) partially_filled(:) = 0
2709 if (
present(half_filled)) half_filled(:) = 0
2711 n_partially_filled = 0
2714 select case (st%d%ispin)
2717 if (abs(st%occ(ist, ik) - m_two) < m_min_occ)
then
2718 n_filled = n_filled + 1
2719 if (
present(filled)) filled(n_filled) = ist
2720 else if (abs(st%occ(ist, ik) - m_one) < m_min_occ)
then
2721 n_half_filled = n_half_filled + 1
2722 if (
present(half_filled)) half_filled(n_half_filled) = ist
2723 else if (st%occ(ist, ik) > m_min_occ)
then
2724 n_partially_filled = n_partially_filled + 1
2725 if (
present(partially_filled)) partially_filled(n_partially_filled) = ist
2726 else if (abs(st%occ(ist, ik)) > m_min_occ)
then
2727 write(message(1),*)
'Internal error in occupied_states: Illegal occupation value ', st%occ(ist, ik)
2728 call messages_fatal(1, namespace=namespace)
2731 case (spin_polarized, spinors)
2733 if (abs(st%occ(ist, ik)-m_one) < m_min_occ)
then
2734 n_filled = n_filled + 1
2735 if (
present(filled)) filled(n_filled) = ist
2736 else if (st%occ(ist, ik) > m_min_occ)
then
2737 n_partially_filled = n_partially_filled + 1
2738 if (
present(partially_filled)) partially_filled(n_partially_filled) = ist
2739 else if (abs(st%occ(ist, ik)) > m_min_occ)
then
2740 write(message(1),*)
'Internal error in occupied_states: Illegal occupation value ', st%occ(ist, ik)
2741 call messages_fatal(1, namespace=namespace)
2753 type(multicomm_t),
intent(in) :: mc
2756 call distributed_init(this%d%kpt, this%nik, mc%group_comm(p_strategy_kpoints),
"k-points")
2771 if (.not.
allocated(st%st_kpt_task))
then
2772 safe_allocate(st%st_kpt_task(0:st%st_kpt_mpi_grp%size-1, 1:4))
2775 st%st_kpt_task(0:st%st_kpt_mpi_grp%size-1, :) = 0
2776 st%st_kpt_task(st%st_kpt_mpi_grp%rank, :) = [st%st_start, st%st_end, st%d%kpt%start, st%d%kpt%end]
2778 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
2779 call comm_allreduce(st%st_kpt_mpi_grp, st%st_kpt_task)
2790 type(kpoints_t),
intent(in) :: kpoints
2791 type(namespace_t),
intent(in) :: namespace
2794 type(states_elec_dim_t),
pointer :: dd
2801 st%nik = kpoints_number(kpoints)
2803 if (dd%ispin == spin_polarized) st%nik = 2*st%nik
2805 safe_allocate(st%kweights(1:st%nik))
2808 ik = dd%get_kpoint_index(iq)
2809 st%kweights(iq) = kpoints%get_weight(ik)
2821 call io_mkdir(
'debug/', namespace)
2822 iunit = io_open(
'debug/kpoints', namespace, action =
'write')
2823 call kpoints%write_info(iunit=iunit, absolute_coordinates = .
true.)
2824 call io_close(iunit)
2838 class(mesh_t),
intent(in) :: gr
2839 real(real64) :: dipole(1:gr%box%dim)
2842 real(real64) :: e_dip(1:gr%box%dim, this%d%spin_channels)
2846 do ispin = 1, this%d%spin_channels
2847 call dmf_dipole(gr, this%rho(:, ispin), e_dip(:, ispin))
2850 dipole(:) = sum(e_dip(:, 1:this%d%spin_channels), 2)
2858#include "states_elec_inc.F90"
2861#include "complex.F90"
2862#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...
subroutine, public accel_free_buffer(this, async)
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)
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)
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), parameter, public type_cmplx
type(type_t), parameter, public type_float
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.