37 use,
intrinsic :: iso_fortran_env
109 real(real64) :: total(3,3) =
m_zero
110 real(real64) :: kinetic(3,3) =
m_zero
111 real(real64) :: Hartree(3,3) =
m_zero
112 real(real64) :: xc(3,3) =
m_zero
114 real(real64) :: ps_local(3,3) =
m_zero
115 real(real64) :: ps_nl(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
140 logical :: requires_generalized_overlap = .false.
142 type(states_elec_group_t) :: group
143 integer :: block_size
147 logical :: pack_states
153 character(len=1024),
allocatable :: user_def_states(:,:,:)
159 real(real64),
allocatable :: rho(:,:)
160 real(real64),
allocatable :: rho_core(:)
163 type(accel_mem_t) :: buff_density
165 real(real64),
allocatable :: current(:, :, :)
166 real(real64),
allocatable :: current_para(:, :, :)
167 real(real64),
allocatable :: current_dia(:, :, :)
168 real(real64),
allocatable :: current_mag(:, :, :)
169 real(real64),
allocatable :: current_kpt(:,:,:)
174 real(real64),
allocatable :: frozen_rho(:, :)
175 real(real64),
allocatable :: frozen_tau(:, :)
176 real(real64),
allocatable :: frozen_gdens(:,:,:)
177 real(real64),
allocatable :: frozen_ldens(:,:)
179 logical :: uniform_occ
181 real(real64),
allocatable :: eigenval(:,:)
183 logical :: restart_fixed_occ
184 logical :: restart_reorder_occs
185 real(real64),
allocatable :: occ(:,:)
186 real(real64),
allocatable :: kweights(:)
189 logical :: fixed_spins
191 real(real64),
allocatable :: spin(:, :, :)
194 real(real64) :: val_charge
196 type(stress_t) :: stress_tensors
198 logical :: fromScratch
199 type(smear_t) :: smear
214 logical :: scalapack_compatible
215 logical :: parallel_in_states = .false.
219 integer :: st_start, st_end
220 integer,
allocatable :: node(:)
223 integer,
allocatable :: st_kpt_task(:,:)
226 logical :: symmetrize_density
227 integer :: randomization
228 integer :: orth_method = 0
230 real(real64) :: gpu_states_mem
242 integer,
public,
parameter :: &
276 st%requires_generalized_overlap = .false.
283 subroutine states_elec_init(st, namespace, space, valence_charge, kpoints, calc_mode_id)
287 real(real64),
intent(in) :: valence_charge
289 integer,
optional,
intent(in) :: calc_mode_id
291 real(real64) :: excess_charge, nempty_percent
292 integer :: nempty, ntot, default
293 integer :: nempty_conv, nempty_conv_default
294 logical :: force, adapt_for_chebyshev
295 real(real64),
parameter :: tol = 1e-13_real64
297 integer,
parameter :: rs_chebyshev = 12
298 integer(int64),
parameter :: chebyshev_compatible_modes(3) = &
299 [option__calculationmode__gs, option__calculationmode__go, option__calculationmode__unocc]
308 st%d%ispin = space%ispin
313 if (st%d%ispin /=
unpolarized .and. kpoints%use_time_reversal)
then
314 message(1) =
"Time reversal symmetry is only implemented for unpolarized spins."
315 message(2) =
"Use KPointsUseTimeReversal = no."
347 write(
message(1),
'(a,i5,a)')
"Input: '", ntot,
"' is not a valid value for TotalStates."
369 write(
message(1),
'(a,i5,a)')
"Input: '", nempty,
"' is not a valid value for ExtraStates."
370 message(2) =
'(0 <= ExtraStates)'
374 if (ntot > 0 .and. nempty > 0)
then
375 message(1) =
'You cannot set TotalStates and ExtraStates at the same time.'
390 if (nempty_percent < 0)
then
391 write(
message(1),
'(a,f8.6,a)')
"Input: '", nempty_percent, &
392 "' should be a percentage value x (where x is parts in hundred) larger or equal 0"
396 if (nempty > 0 .and. nempty_percent > 0)
then
397 message(1) =
'You cannot set ExtraStates and ExtraStatesInPercent at the same time.'
402 adapt_for_chebyshev = .false.
403 if (
present(calc_mode_id))
then
404 if (any(calc_mode_id == chebyshev_compatible_modes))
then
407 if (es == rs_chebyshev)
then
409 adapt_for_chebyshev = .
true.
413 if (adapt_for_chebyshev)
then
416 message(1) =
'Chebyshev filtering eigensolver detected. Setting ExtraStatesInPercent = 15'
424 st%val_charge = valence_charge
426 st%qtot = -(st%val_charge + excess_charge)
429 write(
message(1),
'(a,f12.6,a)')
'Total charge = ', st%qtot,
' < 0'
430 message(2) =
'Check Species and ExcessCharge.'
434 select case (st%d%ispin)
437 st%nst = nint(st%qtot/2)
438 if (st%nst*2 - st%qtot < -tol) st%nst = st%nst + 1
440 st%d%spin_channels = 1
443 st%nst = nint(st%qtot/2)
444 if (st%nst*2 - st%qtot < -tol) st%nst = st%nst + 1
446 st%d%spin_channels = 2
449 st%nst = nint(st%qtot)
450 if (st%nst - st%qtot < -tol) st%nst = st%nst + 1
452 st%d%spin_channels = 2
455 if (nempty_percent > 0)
then
456 nempty = ceiling(nempty_percent * st%nst / 100)
476 nempty_conv_default = nempty
477 if (adapt_for_chebyshev)
then
479 nempty_conv_default = min(int(0.8*nempty), nempty - 1)
481 call parse_variable(namespace,
'ExtraStatesToConverge', nempty_conv_default, nempty_conv)
482 if (nempty_conv < 0)
then
483 write(
message(1),
'(a,i5,a)')
"Input: '", nempty_conv,
"' is not a valid value for ExtraStatesToConverge."
484 message(2) =
'(0 <= ExtraStatesToConverge)'
488 if (nempty_conv > nempty)
then
490 message(1) =
'You cannot set ExtraStatesToConverge to a higher value than ExtraStates.'
491 message(2) =
'Capping ExtraStatesToConverge to ExtraStates.'
496 if (ntot < st%nst)
then
497 message(1) =
'TotalStates is smaller than the number of states required by the system.'
504 st%nst_conv = st%nst + nempty_conv
505 st%nst = st%nst + nempty
506 if (st%nst == 0)
then
507 message(1) =
"Cannot run with number of states = zero."
525 default =
accel%warp_size
534 call parse_variable(namespace,
'StatesBlockSize', default, st%block_size)
535 if (st%block_size < 1)
then
536 call messages_write(
"The variable 'StatesBlockSize' must be greater than 0.")
540 st%block_size = min(st%block_size, st%nst)
541 conf%target_states_block_size = st%block_size
543 safe_allocate(st%eigenval(1:st%nst, 1:st%nik))
544 st%eigenval = huge(st%eigenval)
548 if (.not. kpoints%gamma_only())
then
561 call parse_variable(namespace,
'OnlyUserDefinedInitialStates', .false., st%only_userdef_istates)
564 safe_allocate(st%occ (1:st%nst, 1:st%nik))
569 safe_allocate(st%user_def_states(1:st%d%dim, 1:st%nst, 1:st%nik))
571 st%user_def_states(1:st%d%dim, 1:st%nst, 1:st%nik) =
'undefined'
574 if (st%d%ispin ==
spinors)
then
575 safe_allocate(st%spin(1:3, 1:st%nst, 1:st%nik))
602 if (st%smear%photodop)
then
603 if (nempty == 0)
then
604 write(
message(1),
'(a,i5,a)')
"PhotoDoping requires to specify ExtraStates."
605 message(2) =
'(0 == ExtraStates)'
613 safe_allocate(st%node(1:st%nst))
614 st%node(1:st%nst) = 0
617 st%parallel_in_states = .false.
631 call parse_variable(namespace,
'SymmetrizeDensity', kpoints%use_symmetries, st%symmetrize_density)
661 integer,
intent(out) :: nik
662 integer,
intent(out) :: dim
663 integer,
intent(out) :: nst
664 integer,
intent(out) :: ierr
666 character(len=256) :: lines(3)
667 character(len=20) :: char
674 iunit = restart%open(
'states')
675 call restart%read(iunit, lines, 3, ierr)
677 read(lines(1), *) char, nst
678 read(lines(2), *) char, dim
679 read(lines(3), *) char, nik
681 call restart%close(iunit)
699 real(real64),
intent(in) :: excess_charge
702 integer :: ik, ist, ispin, nspin, ncols, nrows, el_per_state, icol, start_pos, spin_n
704 real(real64) :: rr, charge
705 logical :: integral_occs, unoccupied_states
706 real(real64),
allocatable :: read_occs(:, :)
707 real(real64) :: charge_in_block
722 call parse_variable(namespace,
'RestartFixedOccupations', .
true., st%restart_fixed_occ)
793 integral_occs = .
true.
795 occ_fix:
if (
parse_block(namespace,
'Occupations', blk) == 0)
then
797 st%fixed_occ = .
true.
800 if (ncols > st%nst)
then
805 if (nrows /= st%nik)
then
806 call messages_input_error(namespace,
"Occupations",
"Wrong number of rows in block Occupations.")
809 do ik = 1, st%nik - 1
812 "All rows in block Occupations must have the same number of columns.")
823 safe_allocate(read_occs(1:ncols, 1:st%nik))
829 charge_in_block = charge_in_block + read_occs(icol, ik) * st%kweights(ik)
834 select case (st%d%ispin)
843 start_pos = nint((st%qtot - charge_in_block)/spin_n)
845 if (start_pos + ncols > st%nst)
then
846 message(1) =
"To balance charge, the first column in block Occupations is taken to refer to state"
847 write(
message(2),
'(a,i6,a)')
"number ", start_pos,
" but there are too many columns for the number of states."
848 write(
message(3),
'(a,i6,a)')
"Solution: set ExtraStates = ", start_pos + ncols - st%nst
853 do ist = 1, start_pos
854 st%occ(ist, ik) = el_per_state
859 do ist = start_pos + 1, start_pos + ncols
860 st%occ(ist, ik) = read_occs(ist - start_pos, ik)
861 integral_occs = integral_occs .and. &
862 abs((st%occ(ist, ik) - el_per_state) * st%occ(ist, ik)) <=
m_epsilon
867 do ist = start_pos + ncols + 1, st%nst
874 safe_deallocate_a(read_occs)
877 st%fixed_occ = .false.
878 integral_occs = .false.
885 st%qtot = -(st%val_charge + excess_charge)
888 if (st%d%nspin == 2) nspin = 2
890 do ik = 1, st%nik, nspin
893 do ispin = ik, ik + nspin - 1
894 st%occ(ist, ispin) = min(rr, -(st%val_charge + excess_charge) - charge)
895 charge = charge + st%occ(ist, ispin)
914 if (st%fixed_occ)
then
915 call parse_variable(namespace,
'RestartReorderOccs', .false., st%restart_reorder_occs)
917 st%restart_reorder_occs = .false.
920 call smear_init(st%smear, namespace, st%d%ispin, st%fixed_occ, integral_occs, kpoints)
922 unoccupied_states = (st%d%ispin /=
spinors .and. st%nst*2 > st%qtot) .or. (st%d%ispin ==
spinors .and. st%nst > st%qtot)
925 if (.not. unoccupied_states)
then
926 call messages_write(
'Smearing needs unoccupied states (via ExtraStates or TotalStates) to be useful.')
934 charge = charge + sum(st%occ(ist, 1:st%nik) * st%kweights(1:st%nik))
936 if (abs(charge - st%qtot) > 1e-6_real64)
then
937 message(1) =
"Initial occupations do not integrate to total charge."
938 write(
message(2),
'(6x,f12.6,a,f12.6)') charge,
' != ', st%qtot
960 integer :: i, j, nrows
965 st%fixed_spins = .false.
966 if (st%d%ispin /=
spinors)
then
1005 spin_fix:
if (
parse_block(namespace,
'InitialSpins', blk) == 0)
then
1007 if (nrows < st%nst)
then
1008 message(1) =
"Please specify one row for each state in InitialSpins, also for extra states."
1018 st%fixed_spins = .
true.
1020 st%spin(:, :, i) = st%spin(:, :, 1)
1033 class(
mesh_t),
intent(in) :: mesh
1034 type(
type_t),
optional,
intent(in) :: wfs_type
1035 logical,
contiguous,
optional,
intent(in) :: skip(:)
1036 logical,
optional,
intent(in) :: packed
1040 if (
present(wfs_type))
then
1042 st%wfs_type = wfs_type
1070 type(
mesh_t),
intent(in) :: mesh
1071 logical,
optional,
intent(in) :: verbose
1072 logical,
contiguous,
optional,
intent(in) :: skip(:)
1073 logical,
optional,
intent(in) :: packed
1075 integer :: ib, iqn, ist, istmin, istmax
1076 logical :: same_node, verbose_, packed_
1077 integer,
allocatable :: bstart(:), bend(:)
1081 safe_allocate(bstart(1:st%nst))
1082 safe_allocate(bend(1:st%nst))
1083 safe_allocate(st%group%iblock(1:st%nst))
1092 if (
present(skip))
then
1094 if (.not. skip(ist))
then
1102 if (
present(skip))
then
1103 do ist = st%nst, istmin, -1
1104 if (.not. skip(ist))
then
1111 if (
present(skip) .and. verbose_)
then
1121 st%group%nblocks = 0
1123 do ist = istmin, istmax
1126 st%group%iblock(ist) = st%group%nblocks + 1
1129 if (st%parallel_in_states .and. ist /= istmax)
then
1132 same_node = (st%node(ist + 1) == st%node(ist))
1135 if (ib == st%block_size .or. ist == istmax .or. .not. same_node)
then
1137 st%group%nblocks = st%group%nblocks + 1
1138 bend(st%group%nblocks) = ist
1139 if (ist /= istmax) bstart(st%group%nblocks + 1) = ist + 1
1143 safe_allocate(st%group%psib(1:st%group%nblocks, st%d%kpt%start:st%d%kpt%end))
1145 safe_allocate(st%group%block_is_local(1:st%group%nblocks, 1:st%nik))
1146 st%group%block_is_local = .false.
1147 st%group%block_start = -1
1148 st%group%block_end = -2
1150 do ib = 1, st%group%nblocks
1151 if (bstart(ib) >= st%st_start .and. bend(ib) <= st%st_end)
then
1152 if (st%group%block_start == -1) st%group%block_start = ib
1153 st%group%block_end = ib
1154 do iqn = st%d%kpt%start, st%d%kpt%end
1155 st%group%block_is_local(ib, iqn) = .
true.
1158 call dwfs_elec_init(st%group%psib(ib, iqn), st%d%dim, bstart(ib), bend(ib), mesh%np_part, iqn, &
1159 special=.
true., packed=packed_)
1161 call zwfs_elec_init(st%group%psib(ib, iqn), st%d%dim, bstart(ib), bend(ib), mesh%np_part, iqn, &
1162 special=.
true., packed=packed_)
1169 safe_allocate(st%group%block_range(1:st%group%nblocks, 1:2))
1170 safe_allocate(st%group%block_size(1:st%group%nblocks))
1172 st%group%block_range(1:st%group%nblocks, 1) = bstart(1:st%group%nblocks)
1173 st%group%block_range(1:st%group%nblocks, 2) = bend(1:st%group%nblocks)
1174 st%group%block_size(1:st%group%nblocks) = bend(1:st%group%nblocks) - bstart(1:st%group%nblocks) + 1
1176 st%group%block_initialized = .
true.
1178 safe_allocate(st%group%block_node(1:st%group%nblocks, 1:st%nik))
1179 st%group%block_node = 0
1181 assert(
allocated(st%node))
1182 assert(all(st%node >= 0) .and. all(st%node < st%mpi_grp%size))
1184 do iqn = st%d%kpt%start, st%d%kpt%end
1185 do ib = st%group%block_start, st%group%block_end
1186 st%group%block_node(ib, iqn) = st%st_kpt_mpi_grp%rank
1195 do ib = 1, st%group%nblocks
1201 if (st%group%block_size(ib) > 0)
then
1231 safe_deallocate_a(bstart)
1232 safe_deallocate_a(bend)
1257 type(
grid_t),
intent(in) :: gr
1259 real(real64) :: fsize
1263 safe_allocate(st%rho(1:gr%np_part, 1:st%d%nspin))
1266 fsize = gr%np_part*8.0_real64*st%block_size
1278 class(
space_t),
intent(in) :: space
1279 class(
mesh_t),
intent(in) :: mesh
1283 if (.not.
allocated(st%current))
then
1284 safe_allocate(st%current(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1288 if (.not.
allocated(st%current_para))
then
1289 safe_allocate(st%current_para(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1293 if (.not.
allocated(st%current_dia))
then
1294 safe_allocate(st%current_dia(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1298 if (.not.
allocated(st%current_mag))
then
1299 safe_allocate(st%current_mag(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1303 if (.not.
allocated(st%current_kpt))
then
1304 safe_allocate(st%current_kpt(1:mesh%np,1:space%dim,st%d%kpt%start:st%d%kpt%end))
1383 default = option__statesorthogonalization__cholesky_serial
1384#ifdef HAVE_SCALAPACK
1386 default = option__statesorthogonalization__cholesky_parallel
1390 call parse_variable(namespace,
'StatesOrthogonalization', default, st%orth_method)
1411 call parse_variable(namespace,
'StatesDeviceMemory', -512.0_real64, st%gpu_states_mem)
1421 subroutine states_elec_copy(stout, stin, exclude_wfns, exclude_eigenval, special, dest_type, copy_data)
1424 logical,
optional,
intent(in) :: exclude_wfns
1425 logical,
optional,
intent(in) :: exclude_eigenval
1426 logical,
optional,
intent(in) :: special
1427 type(
type_t),
optional,
intent(in) :: dest_type
1429 logical,
optional,
intent(in) :: copy_data
1433 logical :: exclude_wfns_
1442 safe_allocate_source_a(stout%kweights, stin%kweights)
1443 stout%nik = stin%nik
1447 stout%wfs_type = stin%wfs_type
1448 if (
present(dest_type))
then
1449 stout%wfs_type = dest_type
1451 stout%nst = stin%nst
1452 stout%block_size = stin%block_size
1453 stout%orth_method = stin%orth_method
1455 stout%gpu_states_mem = stin%gpu_states_mem
1456 stout%pack_states = stin%pack_states
1458 stout%only_userdef_istates = stin%only_userdef_istates
1459 stout%requires_generalized_overlap = stin%requires_generalized_overlap
1461 if (.not. exclude_wfns_)
then
1462 safe_allocate_source_a(stout%rho, stin%rho)
1465 stout%uniform_occ = stin%uniform_occ
1468 safe_allocate_source_a(stout%eigenval, stin%eigenval)
1469 safe_allocate_source_a(stout%occ, stin%occ)
1470 safe_allocate_source_a(stout%spin, stin%spin)
1475 stout%group%nblocks = stin%group%nblocks
1477 safe_allocate_source_a(stout%user_def_states, stin%user_def_states)
1479 safe_allocate_source_a(stout%current, stin%current)
1480 safe_allocate_source_a(stout%current_kpt, stin%current_kpt)
1481 safe_allocate_source_a(stout%rho_core, stin%rho_core)
1482 safe_allocate_source_a(stout%frozen_rho, stin%frozen_rho)
1483 safe_allocate_source_a(stout%frozen_tau, stin%frozen_tau)
1484 safe_allocate_source_a(stout%frozen_gdens, stin%frozen_gdens)
1485 safe_allocate_source_a(stout%frozen_ldens, stin%frozen_ldens)
1487 stout%fixed_occ = stin%fixed_occ
1488 stout%restart_fixed_occ = stin%restart_fixed_occ
1490 stout%fixed_spins = stin%fixed_spins
1492 stout%qtot = stin%qtot
1493 stout%val_charge = stin%val_charge
1497 stout%parallel_in_states = stin%parallel_in_states
1500 call mpi_grp_copy(stout%dom_st_kpt_mpi_grp, stin%dom_st_kpt_mpi_grp)
1501 call mpi_grp_copy(stout%st_kpt_mpi_grp, stin%st_kpt_mpi_grp)
1502 call mpi_grp_copy(stout%dom_st_mpi_grp, stin%dom_st_mpi_grp)
1503 safe_allocate_source_a(stout%node, stin%node)
1504 safe_allocate_source_a(stout%st_kpt_task, stin%st_kpt_task)
1506#ifdef HAVE_SCALAPACK
1512 stout%scalapack_compatible = stin%scalapack_compatible
1514 stout%lnst = stin%lnst
1515 stout%st_start = stin%st_start
1516 stout%st_end = stin%st_end
1520 stout%symmetrize_density = stin%symmetrize_density
1523 copy_data=copy_data, special=special, dest_type=dest_type)
1525 stout%packed = stin%packed
1527 stout%randomization = stin%randomization
1548 safe_deallocate_a(st%user_def_states)
1550 safe_deallocate_a(st%rho)
1551 safe_deallocate_a(st%eigenval)
1553 safe_deallocate_a(st%current)
1554 safe_deallocate_a(st%current_para)
1555 safe_deallocate_a(st%current_dia)
1556 safe_deallocate_a(st%current_mag)
1557 safe_deallocate_a(st%current_kpt)
1558 safe_deallocate_a(st%rho_core)
1559 safe_deallocate_a(st%frozen_rho)
1560 safe_deallocate_a(st%frozen_tau)
1561 safe_deallocate_a(st%frozen_gdens)
1562 safe_deallocate_a(st%frozen_ldens)
1563 safe_deallocate_a(st%occ)
1564 safe_deallocate_a(st%spin)
1565 safe_deallocate_a(st%kweights)
1568#ifdef HAVE_SCALAPACK
1574 safe_deallocate_a(st%node)
1575 safe_deallocate_a(st%st_kpt_task)
1577 if (st%parallel_in_states)
then
1578 safe_deallocate_a(st%ap%schedule)
1592 class(
mesh_t),
intent(in) :: mesh
1594 integer,
optional,
intent(in) :: ist_start_
1595 integer,
optional,
intent(in) :: ist_end_
1596 integer,
optional,
intent(in) :: ikpt_start_
1597 integer,
optional,
intent(in) :: ikpt_end_
1598 logical,
optional,
intent(in) :: normalized
1601 integer :: ist, ik, id, ist_start, ist_end, jst, ikpt_start, ikpt_end
1602 complex(real64) :: alpha, beta, zdotp_tmp
1603 real(real64),
allocatable :: dpsi(:, :)
1604 complex(real64),
allocatable :: zpsi(:, :), zpsi2(:)
1605 integer :: ikpoint, ip
1608 logical :: normalized_
1619 safe_allocate(dpsi(1:mesh%np, 1:st%d%dim))
1621 safe_allocate(zpsi(1:mesh%np, 1:st%d%dim))
1624 select case (st%d%ispin)
1627 do ik = ikpt_start, ikpt_end
1628 ikpoint = st%d%get_kpoint_index(ik)
1629 do ist = ist_start, ist_end
1633 pre_shift = mesh%pv%xlocal-1, &
1634 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1635 normalized = normalized)
1637 if(mesh%parallel_in_domains)
then
1643 call dmf_random(mesh, dpsi(:, 1), normalized = normalized)
1648 zpsi(ip,1) = cmplx(dpsi(ip,1),
m_zero, real64)
1657 pre_shift = mesh%pv%xlocal-1, &
1658 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1659 normalized = normalized)
1661 if(mesh%parallel_in_domains)
then
1667 call zmf_random(mesh, zpsi(:, 1), normalized = normalized)
1679 if (st%fixed_spins)
then
1681 do ik = ikpt_start, ikpt_end
1682 ikpoint = st%d%get_kpoint_index(ik)
1683 do ist = ist_start, ist_end
1687 pre_shift = mesh%pv%xlocal-1, &
1688 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1689 normalized = normalized)
1691 if(mesh%parallel_in_domains)
then
1697 call dmf_random(mesh, dpsi(:, 1), normalized = normalized)
1701 zpsi(ip,1) = cmplx(dpsi(ip,1),
m_zero, real64)
1707 pre_shift = mesh%pv%xlocal-1, &
1708 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1709 normalized = normalized)
1711 if(mesh%parallel_in_domains)
then
1717 call zmf_random(mesh, zpsi(:, 1), normalized = normalized)
1730 safe_allocate(zpsi2(1:mesh%np))
1731 do jst = ist_start, ist - 1
1733 zdotp_tmp =
zmf_dotp(mesh, zpsi(:, 1), zpsi2)
1734 call lalg_axpy(mesh%np, -zdotp_tmp, zpsi2, zpsi(:, 1))
1736 safe_deallocate_a(zpsi2)
1739 zpsi(1:mesh%np, 2) = zpsi(1:mesh%np, 1)
1744 beta = cmplx(st%spin(1, ist, ik) / abs(alpha), st%spin(2, ist, ik) / abs(alpha), real64)
1746 call lalg_scal(mesh%np, alpha, zpsi(:, 1))
1747 call lalg_scal(mesh%np, beta, zpsi(:, 2))
1752 do ik = ikpt_start, ikpt_end
1753 do ist = ist_start, ist_end
1757 pre_shift = mesh%pv%xlocal-1, &
1758 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1759 normalized = .false.)
1761 if(mesh%parallel_in_domains)
then
1767 call zmf_random(mesh, zpsi(:, id), normalized = .false.)
1783 safe_deallocate_a(dpsi)
1784 safe_deallocate_a(zpsi)
1795 class(
mesh_t),
intent(in) :: mesh
1796 logical,
optional,
intent(in) :: compute_spin
1800 real(real64) :: charge
1801 complex(real64),
allocatable :: zpsi(:, :)
1806 st%nik, st%nst, st%kweights)
1813 charge = charge + sum(st%occ(ist, 1:st%nik) * st%kweights(1:st%nik))
1815 if (abs(charge-st%qtot) > 1e-6_real64)
then
1816 message(1) =
'Occupations do not integrate to total charge.'
1817 write(
message(2),
'(6x,f12.8,a,f12.8)') charge,
' != ', st%qtot
1820 message(1) =
"There don't seem to be any electrons at all!"
1830 safe_allocate(zpsi(1:mesh%np, st%d%dim))
1831 do ik = st%d%kpt%start, st%d%kpt%end
1832 do ist = st%st_start, st%st_end
1834 st%spin(1:3, ist, ik) =
state_spin(mesh, zpsi)
1837 safe_deallocate_a(zpsi)
1839 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
1854 real(real64),
optional,
intent(in) :: alt_eig(st%st_start:, st%d%kpt%start:)
1863 do ik = st%d%kpt%start, st%d%kpt%end
1864 if (
present(alt_eig))
then
1865 tot = tot + st%kweights(ik) * sum(st%occ(st%st_start:st%st_end, ik) * &
1866 alt_eig(st%st_start:st%st_end, ik))
1868 tot = tot + st%kweights(ik) * sum(st%occ(st%st_start:st%st_end, ik) * &
1869 st%eigenval(st%st_start:st%st_end, ik))
1873 if (st%parallel_in_states .or. st%d%kpt%parallel)
call comm_allreduce(st%st_kpt_mpi_grp, tot)
1885 logical :: default_scalapack_compatible
1896 st%parallel_in_states = .false.
1900 call mpi_grp_init(st%dom_st_kpt_mpi_grp, mc%dom_st_kpt_comm)
1904 default_scalapack_compatible =
calc_mode_par%scalapack_compat() .and. .not. st%d%kpt%parallel
1918 call parse_variable(namespace,
'ScaLAPACKCompatible', default_scalapack_compatible, st%scalapack_compatible)
1920#ifdef HAVE_SCALAPACK
1921 if (default_scalapack_compatible .neqv. st%scalapack_compatible)
then
1922 call messages_experimental(
'Setting ScaLAPACKCompatible to other than default', namespace=namespace)
1925 if (st%scalapack_compatible)
then
1932 st%scalapack_compatible = .false.
1938 call multicomm_create_all_pairs(st%mpi_grp, st%ap)
1941 if (st%nst < st%mpi_grp%size)
then
1942 message(1) =
"Have more processors than necessary"
1943 write(
message(2),
'(i4,a,i4,a)') st%mpi_grp%size,
" processors and ", st%nst,
" states."
1947 call distributed_init(st%dist, st%nst, st%mpi_grp%comm,
"states", scalapack_compat = st%scalapack_compatible)
1949 st%parallel_in_states = st%dist%parallel
1952 st%st_start = st%dist%start
1953 st%st_end = st%dist%end
1954 st%lnst = st%dist%nlocal()
1955 st%node(1:st%nst) = st%dist%process(1:st%nst)
1972 kinetic_energy_density, paramagnetic_current, density_gradient, density_laplacian, &
1973 gi_kinetic_energy_density, st_end)
1974 type(
grid_t),
intent(in) :: gr
1977 logical,
intent(in) :: nlcc
1978 real(real64),
contiguous,
optional,
target,
intent(out) :: kinetic_energy_density(:,:)
1979 real(real64),
contiguous,
optional,
target,
intent(out) :: paramagnetic_current(:,:,:)
1980 real(real64),
contiguous,
optional,
intent(out) :: density_gradient(:,:,:)
1981 real(real64),
contiguous,
optional,
intent(out) :: density_laplacian(:,:)
1982 real(real64),
contiguous,
optional,
intent(out) :: gi_kinetic_energy_density(:,:)
1983 integer,
optional,
intent(in) :: st_end
1985 real(real64),
pointer,
contiguous :: jp(:, :, :)
1986 real(real64),
pointer,
contiguous :: tau(:, :)
1987 complex(real64),
allocatable :: wf_psi(:,:), gwf_psi(:,:,:), wf_psi_conj(:,:), lwf_psi(:,:)
1988 real(real64),
allocatable :: abs_wf_psi(:,:), abs_gwf_psi(:,:)
1989 complex(real64),
allocatable :: psi_gpsi(:,:)
1990 complex(real64) :: c_tmp
1991 integer :: is, ik, ist, i_dim, st_dim, ii, st_end_
1992 real(real64) :: ww, kpoint(gr%der%dim)
1993 logical :: something_to_do
2001 something_to_do =
present(kinetic_energy_density) .or.
present(gi_kinetic_energy_density) .or. &
2002 present(paramagnetic_current) .or.
present(density_gradient) .or.
present(density_laplacian)
2003 assert(something_to_do)
2005 safe_allocate( wf_psi(1:gr%np_part, 1:st%d%dim))
2006 safe_allocate( wf_psi_conj(1:gr%np_part, 1:st%d%dim))
2007 safe_allocate(gwf_psi(1:gr%np, 1:gr%der%dim, 1:st%d%dim))
2008 safe_allocate(abs_wf_psi(1:gr%np, 1:st%d%dim))
2009 safe_allocate(abs_gwf_psi(1:gr%np, 1:st%d%dim))
2010 safe_allocate(psi_gpsi(1:gr%np, 1:st%d%dim))
2011 if (
present(density_laplacian))
then
2012 safe_allocate(lwf_psi(1:gr%np, 1:st%d%dim))
2016 if (
present(kinetic_energy_density)) tau => kinetic_energy_density
2019 if (
present(paramagnetic_current)) jp => paramagnetic_current
2023 if (
present(gi_kinetic_energy_density))
then
2025 safe_allocate(jp(1:gr%np, 1:gr%der%dim, 1:st%d%nspin))
2027 if (.not.
present(kinetic_energy_density))
then
2028 safe_allocate(tau(1:gr%np, 1:st%d%nspin))
2032 if (
associated(tau)) tau =
m_zero
2033 if (
associated(jp)) jp =
m_zero
2034 if (
present(density_gradient)) density_gradient(:,:,:) =
m_zero
2035 if (
present(density_laplacian)) density_laplacian(:,:) =
m_zero
2036 if (
present(gi_kinetic_energy_density)) gi_kinetic_energy_density =
m_zero
2038 do ik = st%d%kpt%start, st%d%kpt%end
2040 kpoint(1:gr%der%dim) = kpoints%get_point(st%d%get_kpoint_index(ik))
2041 is = st%d%get_spin_index(ik)
2043 do ist = st%st_start, st_end_
2044 ww = st%kweights(ik)*st%occ(ist, ik)
2050 do st_dim = 1, st%d%dim
2055 do st_dim = 1, st%d%dim
2056 call zderivatives_grad(gr%der, wf_psi(:,st_dim), gwf_psi(:,:,st_dim), set_bc = .false.)
2060 if (
present(density_laplacian))
then
2061 do st_dim = 1, st%d%dim
2062 call zderivatives_lapl(gr%der, wf_psi(:,st_dim), lwf_psi(:,st_dim), ghost_update = .false., set_bc = .false.)
2067 wf_psi_conj(1:gr%np, 1:st%d%dim) = conjg(wf_psi(1:gr%np,1:st%d%dim))
2069 do st_dim = 1, st%d%dim
2071 abs_wf_psi(ii, st_dim) = real(wf_psi_conj(ii, st_dim) * wf_psi(ii, st_dim), real64)
2076 if (
present(density_laplacian))
then
2079 density_laplacian(ii, is) = density_laplacian(ii, is) + &
2080 ww *
m_two*real(wf_psi_conj(ii, 1) * lwf_psi(ii, 1), real64)
2083 if (st%d%ispin ==
spinors)
then
2086 density_laplacian(ii, 2) = density_laplacian(ii, 2) + &
2087 ww *
m_two*real(wf_psi_conj(ii, 2) * lwf_psi(ii, 2), real64)
2092 c_tmp = ww*(lwf_psi(ii, 1) * wf_psi_conj(ii, 2) + wf_psi(ii, 1) * conjg(lwf_psi(ii, 2)))
2093 density_laplacian(ii, 3) = density_laplacian(ii, 3) + real(c_tmp, real64)
2094 density_laplacian(ii, 4) = density_laplacian(ii, 4) + aimag(c_tmp)
2099 if (
associated(tau))
then
2100 call lalg_axpy(gr%np, ww * sum(kpoint(1:gr%der%dim)**2), abs_wf_psi(:, 1), tau(:, is))
2101 if (st%d%ispin ==
spinors)
then
2102 call lalg_axpy(gr%np, ww * sum(kpoint(1:gr%der%dim)**2), abs_wf_psi(:, 2), tau(:, 2))
2106 c_tmp = ww * sum(kpoint(1:gr%der%dim)**2) * wf_psi(ii, 1) * wf_psi_conj(ii, 2)
2107 tau(ii, 3) = tau(ii, 3) + real(c_tmp, real64)
2108 tau(ii, 4) = tau(ii, 4) + aimag(c_tmp)
2113 do i_dim = 1, gr%der%dim
2117 do st_dim = 1, st%d%dim
2120 psi_gpsi(ii, st_dim) = wf_psi_conj(ii, st_dim) * gwf_psi(ii, i_dim, st_dim)
2123 do st_dim = 1, st%d%dim
2126 abs_gwf_psi(ii, st_dim) = real(conjg(gwf_psi(ii, i_dim, st_dim)) &
2127 * gwf_psi(ii, i_dim, st_dim), real64)
2132 if (
present(density_gradient))
then
2135 density_gradient(ii, i_dim, is) = density_gradient(ii, i_dim, is) &
2136 + ww *
m_two * real(psi_gpsi(ii, 1), real64)
2139 if (st%d%ispin ==
spinors)
then
2142 density_gradient(ii, i_dim, 2) = density_gradient(ii, i_dim, 2) &
2143 + ww *
m_two*real(psi_gpsi(ii, 2), real64)
2148 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)))
2149 density_gradient(ii, i_dim, 3) = density_gradient(ii, i_dim, 3) + real(c_tmp, real64)
2150 density_gradient(ii, i_dim, 4) = density_gradient(ii, i_dim, 4) + aimag(c_tmp)
2155 if (
present(density_laplacian))
then
2156 call lalg_axpy(gr%np, ww*
m_two, abs_gwf_psi(:,1), density_laplacian(:,is))
2157 if (st%d%ispin ==
spinors)
then
2158 call lalg_axpy(gr%np, ww*
m_two, abs_gwf_psi(:,2), density_laplacian(:,2))
2161 c_tmp =
m_two * ww * gwf_psi(ii, i_dim, 1) * conjg(gwf_psi(ii, i_dim, 2))
2162 density_laplacian(ii, 3) = density_laplacian(ii, 3) + real(c_tmp, real64)
2163 density_laplacian(ii, 4) = density_laplacian(ii, 4) + aimag(c_tmp)
2171 if (
associated(jp))
then
2175 jp(ii, i_dim, is) = jp(ii, i_dim, is) + &
2176 ww*(aimag(psi_gpsi(ii, 1)) - abs_wf_psi(ii, 1)*kpoint(i_dim))
2179 if (st%d%ispin ==
spinors)
then
2182 jp(ii, i_dim, 2) = jp(ii, i_dim, 2) + &
2183 ww*( aimag(psi_gpsi(ii, 2)) - abs_wf_psi(ii, 2)*kpoint(i_dim))
2188 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)) &
2189 -
m_two *
m_zi*wf_psi(ii, 1)*wf_psi_conj(ii, 2)*kpoint(i_dim))
2190 jp(ii, i_dim, 3) = jp(ii, i_dim, 3) + real(c_tmp, real64)
2191 jp(ii, i_dim, 4) = jp(ii, i_dim, 4) + aimag(c_tmp)
2200 if (
associated(tau))
then
2203 tau(ii, is) = tau(ii, is) + ww*(abs_gwf_psi(ii,1) &
2204 -
m_two*aimag(psi_gpsi(ii, 1))*kpoint(i_dim))
2207 if (st%d%ispin ==
spinors)
then
2210 tau(ii, 2) = tau(ii, 2) + ww*(abs_gwf_psi(ii, 2) &
2211 -
m_two*aimag(psi_gpsi(ii, 2))*kpoint(i_dim))
2216 c_tmp = ww * ( gwf_psi(ii, i_dim, 1)*conjg(gwf_psi(ii, i_dim, 2)) &
2217 +
m_zi * (gwf_psi(ii,i_dim,1)*wf_psi_conj(ii, 2) &
2218 - wf_psi(ii, 1)*conjg(gwf_psi(ii,i_dim,2)))*kpoint(i_dim))
2219 tau(ii, 3) = tau(ii, 3) + real(c_tmp, real64)
2220 tau(ii, 4) = tau(ii, 4) + aimag(c_tmp)
2230 safe_deallocate_a(wf_psi_conj)
2231 safe_deallocate_a(abs_wf_psi)
2232 safe_deallocate_a(abs_gwf_psi)
2233 safe_deallocate_a(psi_gpsi)
2235 if (.not.
present(gi_kinetic_energy_density))
then
2236 if (.not.
present(paramagnetic_current))
then
2237 safe_deallocate_p(jp)
2239 if (.not.
present(kinetic_energy_density))
then
2240 safe_deallocate_p(tau)
2244 if (st%parallel_in_states .or. st%d%kpt%parallel)
call reduce_all(st%st_kpt_mpi_grp)
2249 if (st%symmetrize_density)
then
2250 do is = 1, st%d%nspin
2251 if (
associated(tau))
then
2255 if (
present(density_laplacian))
then
2259 if (
associated(jp))
then
2263 if (
present(density_gradient))
then
2270 if (
allocated(st%rho_core) .and. nlcc .and. (
present(density_laplacian) .or.
present(density_gradient)))
then
2272 wf_psi(ii, 1) = st%rho_core(ii)/st%d%spin_channels
2277 if (
present(density_gradient))
then
2280 do is = 1, st%d%spin_channels
2282 do i_dim = 1, gr%der%dim
2284 density_gradient(ii, i_dim, is) = density_gradient(ii, i_dim, is) + &
2285 real(gwf_psi(ii, i_dim, 1), real64)
2293 if (
present(density_laplacian))
then
2297 do is = 1, st%d%spin_channels
2300 density_laplacian(ii, is) = density_laplacian(ii, is) + real(lwf_psi(ii, 1))
2309 if (
allocated(st%frozen_tau) .and. .not.
present(st_end) .and.
associated(tau))
then
2312 if (
allocated(st%frozen_gdens) .and. .not.
present(st_end) .and.
present(density_gradient))
then
2313 do is = 1, st%d%nspin
2314 call lalg_axpy(gr%np, gr%der%dim,
m_one, st%frozen_gdens(:,:,is), density_gradient(:,:,is))
2317 if (
allocated(st%frozen_ldens) .and. .not.
present(st_end) .and.
present(density_laplacian))
then
2318 call lalg_axpy(gr%np, st%d%nspin,
m_one, st%frozen_ldens, density_laplacian)
2321 safe_deallocate_a(wf_psi)
2322 safe_deallocate_a(gwf_psi)
2323 safe_deallocate_a(lwf_psi)
2327 if (
present(gi_kinetic_energy_density))
then
2328 do is = 1, st%d%nspin
2329 assert(
associated(tau))
2330 gi_kinetic_energy_density(1:gr%np, is) = tau(1:gr%np, is)
2333 assert(
associated(jp))
2334 if (st%d%ispin /=
spinors)
then
2335 do is = 1, st%d%nspin
2338 if (st%rho(ii, is) < 1.0e-7_real64) cycle
2339 gi_kinetic_energy_density(ii, is) = &
2340 gi_kinetic_energy_density(ii, is) - sum(jp(ii,1:gr%der%dim, is)**2)/st%rho(ii, is)
2346 gi_kinetic_energy_density(ii, 1) = gi_kinetic_energy_density(ii, 1) &
2347 - sum(jp(ii,1:gr%der%dim, 1)**2)/(safe_tol(st%rho(ii, 1),
m_epsilon))
2348 gi_kinetic_energy_density(ii, 2) = gi_kinetic_energy_density(ii, 2) &
2349 - sum(jp(ii,1:gr%der%dim, 2)**2)/(safe_tol(st%rho(ii, 2),
m_epsilon))
2350 gi_kinetic_energy_density(ii, 3) = &
2351 gi_kinetic_energy_density(ii, 3) - sum(jp(ii,1:gr%der%dim, 3)**2 + jp(ii,1:gr%der%dim, 4)**2) &
2352 /(safe_tol((st%rho(ii, 3)**2 + st%rho(ii, 4)**2),
m_epsilon))*st%rho(ii, 3)
2353 gi_kinetic_energy_density(ii, 4) = &
2354 gi_kinetic_energy_density(ii, 4) + sum(jp(ii,1:gr%der%dim, 3)**2 + jp(ii,1:gr%der%dim, 4)**2) &
2355 /(safe_tol((st%rho(ii, 3)**2 + st%rho(ii, 4)**2),
m_epsilon))*st%rho(ii, 4)
2361 if (.not.
present(kinetic_energy_density))
then
2362 safe_deallocate_p(tau)
2364 if (.not.
present(paramagnetic_current))
then
2365 safe_deallocate_p(jp)
2380 if (
associated(tau))
call comm_allreduce(grp, tau, dim = (/gr%np, st%d%nspin/))
2382 if (
present(density_laplacian))
call comm_allreduce(grp, density_laplacian, dim = (/gr%np, st%d%nspin/))
2384 do is = 1, st%d%nspin
2385 if (
associated(jp))
call comm_allreduce(grp, jp(:, :, is), dim = (/gr%np, gr%der%dim/))
2387 if (
present(density_gradient))
then
2388 call comm_allreduce(grp, density_gradient(:, :, is), dim = (/gr%np, gr%der%dim/))
2402 type(
mesh_t),
intent(in) :: mesh
2403 complex(real64),
contiguous,
intent(in) :: f1(:, :)
2404 real(real64) :: spin(1:3)
2406 complex(real64) :: z
2410 z =
zmf_dotp(mesh, f1(:, 1) , f1(:, 2))
2412 spin(1) =
m_two*real(z, real64)
2413 spin(2) =
m_two*aimag(z)
2425 integer,
intent(in) :: ist
2439 integer,
intent(in) :: ist
2440 integer,
intent(in) :: ik
2445 ik >= st%d%kpt%start .and. ik <= st%d%kpt%end
2455 class(
mesh_t),
intent(in) :: mesh
2461 memory = memory + real(storage_size(0.0_real64)/8, real64) * &
2462 real(mesh%np_part_global, real64) *st%d%dim *
real(st%nst, real64) *st%d%kpt%nglobal()
2472 logical,
optional,
intent(in) :: copy
2475 integer(int64) :: max_mem, mem
2487 if (accel_is_enabled())
then
2488 max_mem = accel_global_memory_size()
2490 if (st%gpu_states_mem > m_one)
then
2491 max_mem = int(st%gpu_states_mem, int64)*(1024_8)**2
2492 else if (st%gpu_states_mem < 0.0_real64)
then
2493 max_mem = max_mem + int(st%gpu_states_mem, int64)*(1024_8)**2
2495 max_mem = int(st%gpu_states_mem*real(max_mem, real64) , int64)
2498 max_mem = huge(max_mem)
2502 qnloop:
do iqn = st%d%kpt%start, st%d%kpt%end
2503 do ib = st%group%block_start, st%group%block_end
2505 mem = mem + st%group%psib(ib, iqn)%pack_total_size()
2507 if (mem > max_mem)
then
2508 call messages_write(
'Not enough device memory to store all states simultaneously.', new_line = .
true.)
2509 call messages_write(
'Only ')
2510 call messages_write(ib - st%group%block_start)
2511 call messages_write(
' of ')
2512 call messages_write(st%group%block_end - st%group%block_start + 1)
2513 call messages_write(
' blocks will be stored in device memory.', new_line = .
true.)
2514 call messages_warning()
2518 call st%group%psib(ib, iqn)%do_pack(copy)
2530 logical,
optional,
intent(in) :: copy
2539 do iqn = st%d%kpt%start, st%d%kpt%end
2540 do ib = st%group%block_start, st%group%block_end
2541 if (st%group%psib(ib, iqn)%is_packed())
call st%group%psib(ib, iqn)%do_unpack(copy)
2554 type(namespace_t),
intent(in) :: namespace
2558 call messages_print_with_emphasis(msg=
"States", namespace=namespace)
2560 write(message(1),
'(a,f12.3)')
'Total electronic charge = ', st%qtot
2561 write(message(2),
'(a,i8)')
'Number of states = ', st%nst
2562 write(message(3),
'(a,i8)')
'States block-size = ', st%block_size
2563 call messages_info(3, namespace=namespace)
2565 call messages_print_with_emphasis(namespace=namespace)
2578 do iqn = st%d%kpt%start, st%d%kpt%end
2579 do ib = st%group%block_start, st%group%block_end
2580 call batch_set_zero(st%group%psib(ib, iqn))
2590 integer pure function states_elec_block_min(st, ib) result(range)
2592 integer,
intent(in) :: ib
2594 range = st%group%block_range(ib, 1)
2600 integer pure function states_elec_block_max(st, ib) result(range)
2602 integer,
intent(in) :: ib
2604 range = st%group%block_range(ib, 2)
2610 integer pure function states_elec_block_size(st, ib) result(size)
2612 integer,
intent(in) :: ib
2614 size = st%group%block_size(ib)
2620 logical pure function states_elec_all_states_gpu_packed(st) result(all_packed)
2626 do ik = st%d%kpt%start, st%d%kpt%end
2627 do ib = st%group%block_start, st%group%block_end
2628 if (st%group%psib(ib, ik)%status() /= batch_device_packed)
then
2629 all_packed = .false.
2652 subroutine occupied_states(st, namespace, ik, n_filled, n_partially_filled, n_half_filled, &
2653 filled, partially_filled, half_filled)
2655 type(namespace_t),
intent(in) :: namespace
2656 integer,
intent(in) :: ik
2657 integer,
intent(out) :: n_filled, n_partially_filled, n_half_filled
2658 integer,
optional,
intent(out) :: filled(:), partially_filled(:), half_filled(:)
2664 if (
present(filled)) filled(:) = 0
2665 if (
present(partially_filled)) partially_filled(:) = 0
2666 if (
present(half_filled)) half_filled(:) = 0
2668 n_partially_filled = 0
2671 select case (st%d%ispin)
2674 if (abs(st%occ(ist, ik) - m_two) < m_min_occ)
then
2675 n_filled = n_filled + 1
2676 if (
present(filled)) filled(n_filled) = ist
2677 else if (abs(st%occ(ist, ik) - m_one) < m_min_occ)
then
2678 n_half_filled = n_half_filled + 1
2679 if (
present(half_filled)) half_filled(n_half_filled) = ist
2680 else if (st%occ(ist, ik) > m_min_occ)
then
2681 n_partially_filled = n_partially_filled + 1
2682 if (
present(partially_filled)) partially_filled(n_partially_filled) = ist
2683 else if (abs(st%occ(ist, ik)) > m_min_occ)
then
2684 write(message(1),*)
'Internal error in occupied_states: Illegal occupation value ', st%occ(ist, ik)
2685 call messages_fatal(1, namespace=namespace)
2688 case (spin_polarized, spinors)
2690 if (abs(st%occ(ist, ik)-m_one) < m_min_occ)
then
2691 n_filled = n_filled + 1
2692 if (
present(filled)) filled(n_filled) = ist
2693 else if (st%occ(ist, ik) > m_min_occ)
then
2694 n_partially_filled = n_partially_filled + 1
2695 if (
present(partially_filled)) partially_filled(n_partially_filled) = ist
2696 else if (abs(st%occ(ist, ik)) > m_min_occ)
then
2697 write(message(1),*)
'Internal error in occupied_states: Illegal occupation value ', st%occ(ist, ik)
2698 call messages_fatal(1, namespace=namespace)
2710 type(multicomm_t),
intent(in) :: mc
2713 call distributed_init(this%d%kpt, this%nik, mc%group_comm(p_strategy_kpoints),
"k-points")
2728 if (.not.
allocated(st%st_kpt_task))
then
2729 safe_allocate(st%st_kpt_task(0:st%st_kpt_mpi_grp%size-1, 1:4))
2732 st%st_kpt_task(0:st%st_kpt_mpi_grp%size-1, :) = 0
2733 st%st_kpt_task(st%st_kpt_mpi_grp%rank, :) = [st%st_start, st%st_end, st%d%kpt%start, st%d%kpt%end]
2735 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
2736 call comm_allreduce(st%st_kpt_mpi_grp, st%st_kpt_task)
2747 type(kpoints_t),
intent(in) :: kpoints
2748 type(namespace_t),
intent(in) :: namespace
2751 type(states_elec_dim_t),
pointer :: dd
2758 st%nik = kpoints_number(kpoints)
2760 if (dd%ispin == spin_polarized) st%nik = 2*st%nik
2762 safe_allocate(st%kweights(1:st%nik))
2765 ik = dd%get_kpoint_index(iq)
2766 st%kweights(iq) = kpoints%get_weight(ik)
2778 call io_mkdir(
'debug/', namespace)
2779 iunit = io_open(
'debug/kpoints', namespace, action =
'write')
2780 call kpoints%write_info(iunit=iunit, absolute_coordinates = .
true.)
2781 call io_close(iunit)
2795 class(mesh_t),
intent(in) :: gr
2796 real(real64) :: dipole(1:gr%box%dim)
2799 real(real64) :: e_dip(1:gr%box%dim, this%d%spin_channels)
2803 do ispin = 1, this%d%spin_channels
2804 call dmf_dipole(gr, this%rho(:, ispin), e_dip(:, ispin))
2807 dipole(:) = sum(e_dip(:, 1:this%d%spin_channels), 2)
2815#include "states_elec_inc.F90"
2818#include "complex.F90"
2819#include "states_elec_inc.F90"
initialize a batch with existing memory
constant times a vector plus a vector
scales a vector by a constant
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_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.
subroutine, public distributed_init_serial(this, total)
Serial initialization of a distributed instance. The calling process is assigned all total instances,...
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_)
/* To use the profiling module, call profiling_in and profiling_out with the label of the region as a...
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, dest_type)
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, public states_elec_copy(stout, stin, exclude_wfns, exclude_eigenval, special, dest_type, copy_data)
make a (selective) copy of a states_elec_t object
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
logical pure function, public states_elec_all_states_gpu_packed(st)
return boolean indicating whether all states are packed on the GPU
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_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_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.