37 use,
intrinsic :: iso_fortran_env
108 real(real64) :: total(3,3) =
m_zero
109 real(real64) :: kinetic(3,3) =
m_zero
110 real(real64) :: Hartree(3,3) =
m_zero
111 real(real64) :: xc(3,3) =
m_zero
112 real(real64) :: xc_nlcc(3,3) =
m_zero
113 real(real64) :: ps_local(3,3) =
m_zero
114 real(real64) :: ps_nl(3,3) =
m_zero
116 real(real64) :: vdw(3,3) =
m_zero
117 real(real64) :: hubbard(3,3) =
m_zero
119 real(real64) :: kinetic_sumrule =
m_zero
120 real(real64) :: hartree_sumrule =
m_zero
135 type(states_elec_dim_t) :: d
138 logical :: only_userdef_istates
140 type(states_elec_group_t) :: group
141 integer :: block_size
145 logical :: pack_states
151 character(len=1024),
allocatable :: user_def_states(:,:,:)
157 real(real64),
allocatable :: rho(:,:)
158 real(real64),
allocatable :: rho_core(:)
161 type(accel_mem_t) :: buff_density
163 real(real64),
allocatable :: current(:, :, :)
164 real(real64),
allocatable :: current_para(:, :, :)
165 real(real64),
allocatable :: current_dia(:, :, :)
166 real(real64),
allocatable :: current_mag(:, :, :)
167 real(real64),
allocatable :: current_kpt(:,:,:)
172 real(real64),
allocatable :: frozen_rho(:, :)
173 real(real64),
allocatable :: frozen_tau(:, :)
174 real(real64),
allocatable :: frozen_gdens(:,:,:)
175 real(real64),
allocatable :: frozen_ldens(:,:)
177 logical :: uniform_occ
179 real(real64),
allocatable :: eigenval(:,:)
181 logical :: restart_fixed_occ
182 logical :: restart_reorder_occs
183 real(real64),
allocatable :: occ(:,:)
184 real(real64),
allocatable :: kweights(:)
187 logical :: fixed_spins
189 real(real64),
allocatable :: spin(:, :, :)
192 real(real64) :: val_charge
194 type(stress_t) :: stress_tensors
196 logical :: fromScratch
197 type(smear_t) :: smear
200 type(modelmb_particle_t) :: modelmbparticles
212 logical :: scalapack_compatible
213 logical :: parallel_in_states = .false.
217 integer :: st_start, st_end
218 integer,
allocatable :: node(:)
221 integer,
allocatable :: st_kpt_task(:,:)
224 logical :: symmetrize_density
225 integer :: randomization
226 integer :: orth_method = 0
228 real(real64) :: gpu_states_mem
240 integer,
public,
parameter :: &
284 real(real64),
intent(in) :: valence_charge
286 integer,
optional,
intent(in) :: calc_mode_id
288 real(real64) :: excess_charge, nempty_percent
289 integer :: nempty, ntot, default
290 integer :: nempty_conv, nempty_conv_default
291 logical :: force, adapt_for_chebyshev
292 real(real64),
parameter :: tol = 1e-13_real64
294 integer,
parameter :: rs_chebyshev = 12
295 integer(int64),
parameter :: chebyshev_compatible_modes(3) = &
296 [option__calculationmode__gs, option__calculationmode__go, option__calculationmode__unocc]
305 st%d%ispin = space%ispin
310 if (st%d%ispin /=
unpolarized .and. kpoints%use_time_reversal)
then
311 message(1) =
"Time reversal symmetry is only implemented for unpolarized spins."
312 message(2) =
"Use KPointsUseTimeReversal = no."
344 write(
message(1),
'(a,i5,a)')
"Input: '", ntot,
"' is not a valid value for TotalStates."
366 write(
message(1),
'(a,i5,a)')
"Input: '", nempty,
"' is not a valid value for ExtraStates."
367 message(2) =
'(0 <= ExtraStates)'
371 if (ntot > 0 .and. nempty > 0)
then
372 message(1) =
'You cannot set TotalStates and ExtraStates at the same time.'
387 if (nempty_percent < 0)
then
388 write(
message(1),
'(a,f8.6,a)')
"Input: '", nempty_percent, &
389 "' should be a percentage value x (where x is parts in hundred) larger or equal 0"
393 if (nempty > 0 .and. nempty_percent > 0)
then
394 message(1) =
'You cannot set ExtraStates and ExtraStatesInPercent at the same time.'
399 adapt_for_chebyshev = .false.
400 if (
present(calc_mode_id))
then
401 if (any(calc_mode_id == chebyshev_compatible_modes))
then
404 if (es == rs_chebyshev)
then
406 adapt_for_chebyshev = .
true.
410 if (adapt_for_chebyshev)
then
413 message(1) =
'Chebyshev filtering eigensolver detected. Setting ExtraStatesInPercent = 15'
421 st%val_charge = valence_charge
423 st%qtot = -(st%val_charge + excess_charge)
426 write(
message(1),
'(a,f12.6,a)')
'Total charge = ', st%qtot,
' < 0'
427 message(2) =
'Check Species and ExcessCharge.'
431 select case (st%d%ispin)
434 st%nst = nint(st%qtot/2)
435 if (st%nst*2 - st%qtot < -tol) st%nst = st%nst + 1
437 st%d%spin_channels = 1
440 st%nst = nint(st%qtot/2)
441 if (st%nst*2 - st%qtot < -tol) st%nst = st%nst + 1
443 st%d%spin_channels = 2
446 st%nst = nint(st%qtot)
447 if (st%nst - st%qtot < -tol) st%nst = st%nst + 1
449 st%d%spin_channels = 2
452 if (nempty_percent > 0)
then
453 nempty = ceiling(nempty_percent * st%nst / 100)
473 nempty_conv_default = nempty
474 if (adapt_for_chebyshev)
then
476 nempty_conv_default = min(int(0.8*nempty), nempty - 1)
478 call parse_variable(namespace,
'ExtraStatesToConverge', nempty_conv_default, nempty_conv)
479 if (nempty_conv < 0)
then
480 write(
message(1),
'(a,i5,a)')
"Input: '", nempty_conv,
"' is not a valid value for ExtraStatesToConverge."
481 message(2) =
'(0 <= ExtraStatesToConverge)'
485 if (nempty_conv > nempty)
then
487 message(1) =
'You cannot set ExtraStatesToConverge to a higher value than ExtraStates.'
488 message(2) =
'Capping ExtraStatesToConverge to ExtraStates.'
493 if (ntot < st%nst)
then
494 message(1) =
'TotalStates is smaller than the number of states required by the system.'
501 st%nst_conv = st%nst + nempty_conv
502 st%nst = st%nst + nempty
503 if (st%nst == 0)
then
504 message(1) =
"Cannot run with number of states = zero."
522 default =
accel%warp_size
531 call parse_variable(namespace,
'StatesBlockSize', default, st%block_size)
532 if (st%block_size < 1)
then
533 call messages_write(
"The variable 'StatesBlockSize' must be greater than 0.")
537 st%block_size = min(st%block_size, st%nst)
538 conf%target_states_block_size = st%block_size
540 safe_allocate(st%eigenval(1:st%nst, 1:st%nik))
541 st%eigenval = huge(st%eigenval)
545 if (.not. kpoints%gamma_only())
then
558 call parse_variable(namespace,
'OnlyUserDefinedInitialStates', .false., st%only_userdef_istates)
561 safe_allocate(st%occ (1:st%nst, 1:st%nik))
566 safe_allocate(st%user_def_states(1:st%d%dim, 1:st%nst, 1:st%nik))
568 st%user_def_states(1:st%d%dim, 1:st%nst, 1:st%nik) =
'undefined'
571 if (st%d%ispin ==
spinors)
then
572 safe_allocate(st%spin(1:3, 1:st%nst, 1:st%nik))
599 if (st%smear%photodop)
then
600 if (nempty == 0)
then
601 write(
message(1),
'(a,i5,a)')
"PhotoDoping requires to specify ExtraStates."
602 message(2) =
'(0 == ExtraStates)'
610 safe_allocate(st%node(1:st%nst))
611 st%node(1:st%nst) = 0
614 st%parallel_in_states = .false.
628 call parse_variable(namespace,
'SymmetrizeDensity', kpoints%use_symmetries, st%symmetrize_density)
658 integer,
intent(out) :: nik
659 integer,
intent(out) :: dim
660 integer,
intent(out) :: nst
661 integer,
intent(out) :: ierr
663 character(len=256) :: lines(3)
664 character(len=20) :: char
671 iunit = restart%open(
'states')
672 call restart%read(iunit, lines, 3, ierr)
674 read(lines(1), *) char, nst
675 read(lines(2), *) char, dim
676 read(lines(3), *) char, nik
678 call restart%close(iunit)
696 real(real64),
intent(in) :: excess_charge
699 integer :: ik, ist, ispin, nspin, ncols, nrows, el_per_state, icol, start_pos, spin_n
701 real(real64) :: rr, charge
702 logical :: integral_occs, unoccupied_states
703 real(real64),
allocatable :: read_occs(:, :)
704 real(real64) :: charge_in_block
719 call parse_variable(namespace,
'RestartFixedOccupations', .
true., st%restart_fixed_occ)
790 integral_occs = .
true.
792 occ_fix:
if (
parse_block(namespace,
'Occupations', blk) == 0)
then
794 st%fixed_occ = .
true.
797 if (ncols > st%nst)
then
802 if (nrows /= st%nik)
then
803 call messages_input_error(namespace,
"Occupations",
"Wrong number of rows in block Occupations.")
806 do ik = 1, st%nik - 1
809 "All rows in block Occupations must have the same number of columns.")
820 safe_allocate(read_occs(1:ncols, 1:st%nik))
826 charge_in_block = charge_in_block + read_occs(icol, ik) * st%kweights(ik)
831 select case (st%d%ispin)
840 start_pos = nint((st%qtot - charge_in_block)/spin_n)
842 if (start_pos + ncols > st%nst)
then
843 message(1) =
"To balance charge, the first column in block Occupations is taken to refer to state"
844 write(
message(2),
'(a,i6,a)')
"number ", start_pos,
" but there are too many columns for the number of states."
845 write(
message(3),
'(a,i6,a)')
"Solution: set ExtraStates = ", start_pos + ncols - st%nst
850 do ist = 1, start_pos
851 st%occ(ist, ik) = el_per_state
856 do ist = start_pos + 1, start_pos + ncols
857 st%occ(ist, ik) = read_occs(ist - start_pos, ik)
858 integral_occs = integral_occs .and. &
859 abs((st%occ(ist, ik) - el_per_state) * st%occ(ist, ik)) <=
m_epsilon
864 do ist = start_pos + ncols + 1, st%nst
871 safe_deallocate_a(read_occs)
874 st%fixed_occ = .false.
875 integral_occs = .false.
882 st%qtot = -(st%val_charge + excess_charge)
885 if (st%d%nspin == 2) nspin = 2
887 do ik = 1, st%nik, nspin
890 do ispin = ik, ik + nspin - 1
891 st%occ(ist, ispin) = min(rr, -(st%val_charge + excess_charge) - charge)
892 charge = charge + st%occ(ist, ispin)
911 if (st%fixed_occ)
then
912 call parse_variable(namespace,
'RestartReorderOccs', .false., st%restart_reorder_occs)
914 st%restart_reorder_occs = .false.
917 call smear_init(st%smear, namespace, st%d%ispin, st%fixed_occ, integral_occs, kpoints)
919 unoccupied_states = (st%d%ispin /=
spinors .and. st%nst*2 > st%qtot) .or. (st%d%ispin ==
spinors .and. st%nst > st%qtot)
922 if (.not. unoccupied_states)
then
923 call messages_write(
'Smearing needs unoccupied states (via ExtraStates or TotalStates) to be useful.')
931 charge = charge + sum(st%occ(ist, 1:st%nik) * st%kweights(1:st%nik))
933 if (abs(charge - st%qtot) > 1e-6_real64)
then
934 message(1) =
"Initial occupations do not integrate to total charge."
935 write(
message(2),
'(6x,f12.6,a,f12.6)') charge,
' != ', st%qtot
957 integer :: i, j, nrows
962 st%fixed_spins = .false.
963 if (st%d%ispin /=
spinors)
then
1002 spin_fix:
if (
parse_block(namespace,
'InitialSpins', blk) == 0)
then
1004 if (nrows < st%nst)
then
1005 message(1) =
"Please specify one row for each state in InitialSpins, also for extra states."
1015 st%fixed_spins = .
true.
1017 st%spin(:, :, i) = st%spin(:, :, 1)
1030 class(
mesh_t),
intent(in) :: mesh
1031 type(
type_t),
optional,
intent(in) :: wfs_type
1032 logical,
optional,
intent(in) :: skip(:)
1033 logical,
optional,
intent(in) :: packed
1037 if (
present(wfs_type))
then
1039 st%wfs_type = wfs_type
1067 type(
mesh_t),
intent(in) :: mesh
1068 logical,
optional,
intent(in) :: verbose
1069 logical,
optional,
intent(in) :: skip(:)
1070 logical,
optional,
intent(in) :: packed
1072 integer :: ib, iqn, ist, istmin, istmax
1073 logical :: same_node, verbose_, packed_
1074 integer,
allocatable :: bstart(:), bend(:)
1078 safe_allocate(bstart(1:st%nst))
1079 safe_allocate(bend(1:st%nst))
1080 safe_allocate(st%group%iblock(1:st%nst))
1089 if (
present(skip))
then
1091 if (.not. skip(ist))
then
1099 if (
present(skip))
then
1100 do ist = st%nst, istmin, -1
1101 if (.not. skip(ist))
then
1108 if (
present(skip) .and. verbose_)
then
1118 st%group%nblocks = 0
1120 do ist = istmin, istmax
1123 st%group%iblock(ist) = st%group%nblocks + 1
1126 if (st%parallel_in_states .and. ist /= istmax)
then
1129 same_node = (st%node(ist + 1) == st%node(ist))
1132 if (ib == st%block_size .or. ist == istmax .or. .not. same_node)
then
1134 st%group%nblocks = st%group%nblocks + 1
1135 bend(st%group%nblocks) = ist
1136 if (ist /= istmax) bstart(st%group%nblocks + 1) = ist + 1
1140 safe_allocate(st%group%psib(1:st%group%nblocks, st%d%kpt%start:st%d%kpt%end))
1142 safe_allocate(st%group%block_is_local(1:st%group%nblocks, 1:st%nik))
1143 st%group%block_is_local = .false.
1144 st%group%block_start = -1
1145 st%group%block_end = -2
1147 do ib = 1, st%group%nblocks
1148 if (bstart(ib) >= st%st_start .and. bend(ib) <= st%st_end)
then
1149 if (st%group%block_start == -1) st%group%block_start = ib
1150 st%group%block_end = ib
1151 do iqn = st%d%kpt%start, st%d%kpt%end
1152 st%group%block_is_local(ib, iqn) = .
true.
1155 call dwfs_elec_init(st%group%psib(ib, iqn), st%d%dim, bstart(ib), bend(ib), mesh%np_part, iqn, &
1156 special=.
true., packed=packed_)
1158 call zwfs_elec_init(st%group%psib(ib, iqn), st%d%dim, bstart(ib), bend(ib), mesh%np_part, iqn, &
1159 special=.
true., packed=packed_)
1166 safe_allocate(st%group%block_range(1:st%group%nblocks, 1:2))
1167 safe_allocate(st%group%block_size(1:st%group%nblocks))
1169 st%group%block_range(1:st%group%nblocks, 1) = bstart(1:st%group%nblocks)
1170 st%group%block_range(1:st%group%nblocks, 2) = bend(1:st%group%nblocks)
1171 st%group%block_size(1:st%group%nblocks) = bend(1:st%group%nblocks) - bstart(1:st%group%nblocks) + 1
1173 st%group%block_initialized = .
true.
1175 safe_allocate(st%group%block_node(1:st%group%nblocks, 1:st%nik))
1176 st%group%block_node = 0
1178 assert(
allocated(st%node))
1179 assert(all(st%node >= 0) .and. all(st%node < st%mpi_grp%size))
1181 do iqn = st%d%kpt%start, st%d%kpt%end
1182 do ib = st%group%block_start, st%group%block_end
1183 st%group%block_node(ib, iqn) = st%st_kpt_mpi_grp%rank
1192 do ib = 1, st%group%nblocks
1198 if (st%group%block_size(ib) > 0)
then
1228 safe_deallocate_a(bstart)
1229 safe_deallocate_a(bend)
1254 type(
grid_t),
intent(in) :: gr
1256 real(real64) :: fsize
1260 safe_allocate(st%rho(1:gr%np_part, 1:st%d%nspin))
1263 fsize = gr%np_part*8.0_real64*st%block_size
1275 class(
space_t),
intent(in) :: space
1276 class(
mesh_t),
intent(in) :: mesh
1280 if (.not.
allocated(st%current))
then
1281 safe_allocate(st%current(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1285 if (.not.
allocated(st%current_para))
then
1286 safe_allocate(st%current_para(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1290 if (.not.
allocated(st%current_dia))
then
1291 safe_allocate(st%current_dia(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1295 if (.not.
allocated(st%current_mag))
then
1296 safe_allocate(st%current_mag(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1300 if (.not.
allocated(st%current_kpt))
then
1301 safe_allocate(st%current_kpt(1:mesh%np,1:space%dim,st%d%kpt%start:st%d%kpt%end))
1380 default = option__statesorthogonalization__cholesky_serial
1381#ifdef HAVE_SCALAPACK
1383 default = option__statesorthogonalization__cholesky_parallel
1387 call parse_variable(namespace,
'StatesOrthogonalization', default, st%orth_method)
1408 call parse_variable(namespace,
'StatesDeviceMemory', -512.0_real64, st%gpu_states_mem)
1418 subroutine states_elec_copy(stout, stin, exclude_wfns, exclude_eigenval, special)
1421 logical,
optional,
intent(in) :: exclude_wfns
1422 logical,
optional,
intent(in) :: exclude_eigenval
1423 logical,
optional,
intent(in) :: special
1425 logical :: exclude_wfns_
1434 safe_allocate_source_a(stout%kweights, stin%kweights)
1435 stout%nik = stin%nik
1439 stout%wfs_type = stin%wfs_type
1440 stout%nst = stin%nst
1441 stout%block_size = stin%block_size
1442 stout%orth_method = stin%orth_method
1444 stout%gpu_states_mem = stin%gpu_states_mem
1445 stout%pack_states = stin%pack_states
1447 stout%only_userdef_istates = stin%only_userdef_istates
1449 if (.not. exclude_wfns_)
then
1450 safe_allocate_source_a(stout%rho, stin%rho)
1453 stout%uniform_occ = stin%uniform_occ
1456 safe_allocate_source_a(stout%eigenval, stin%eigenval)
1457 safe_allocate_source_a(stout%occ, stin%occ)
1458 safe_allocate_source_a(stout%spin, stin%spin)
1463 stout%group%nblocks = stin%group%nblocks
1465 safe_allocate_source_a(stout%user_def_states, stin%user_def_states)
1467 safe_allocate_source_a(stout%current, stin%current)
1468 safe_allocate_source_a(stout%current_kpt, stin%current_kpt)
1469 safe_allocate_source_a(stout%rho_core, stin%rho_core)
1470 safe_allocate_source_a(stout%frozen_rho, stin%frozen_rho)
1471 safe_allocate_source_a(stout%frozen_tau, stin%frozen_tau)
1472 safe_allocate_source_a(stout%frozen_gdens, stin%frozen_gdens)
1473 safe_allocate_source_a(stout%frozen_ldens, stin%frozen_ldens)
1475 stout%fixed_occ = stin%fixed_occ
1476 stout%restart_fixed_occ = stin%restart_fixed_occ
1478 stout%fixed_spins = stin%fixed_spins
1480 stout%qtot = stin%qtot
1481 stout%val_charge = stin%val_charge
1485 stout%parallel_in_states = stin%parallel_in_states
1488 call mpi_grp_copy(stout%dom_st_kpt_mpi_grp, stin%dom_st_kpt_mpi_grp)
1489 call mpi_grp_copy(stout%st_kpt_mpi_grp, stin%st_kpt_mpi_grp)
1490 call mpi_grp_copy(stout%dom_st_mpi_grp, stin%dom_st_mpi_grp)
1491 safe_allocate_source_a(stout%node, stin%node)
1492 safe_allocate_source_a(stout%st_kpt_task, stin%st_kpt_task)
1494#ifdef HAVE_SCALAPACK
1500 stout%scalapack_compatible = stin%scalapack_compatible
1502 stout%lnst = stin%lnst
1503 stout%st_start = stin%st_start
1504 stout%st_end = stin%st_end
1508 stout%symmetrize_density = stin%symmetrize_density
1512 stout%packed = stin%packed
1514 stout%randomization = stin%randomization
1535 safe_deallocate_a(st%user_def_states)
1537 safe_deallocate_a(st%rho)
1538 safe_deallocate_a(st%eigenval)
1540 safe_deallocate_a(st%current)
1541 safe_deallocate_a(st%current_para)
1542 safe_deallocate_a(st%current_dia)
1543 safe_deallocate_a(st%current_mag)
1544 safe_deallocate_a(st%current_kpt)
1545 safe_deallocate_a(st%rho_core)
1546 safe_deallocate_a(st%frozen_rho)
1547 safe_deallocate_a(st%frozen_tau)
1548 safe_deallocate_a(st%frozen_gdens)
1549 safe_deallocate_a(st%frozen_ldens)
1550 safe_deallocate_a(st%occ)
1551 safe_deallocate_a(st%spin)
1552 safe_deallocate_a(st%kweights)
1555#ifdef HAVE_SCALAPACK
1561 safe_deallocate_a(st%node)
1562 safe_deallocate_a(st%st_kpt_task)
1564 if (st%parallel_in_states)
then
1565 safe_deallocate_a(st%ap%schedule)
1579 class(
mesh_t),
intent(in) :: mesh
1581 integer,
optional,
intent(in) :: ist_start_
1582 integer,
optional,
intent(in) :: ist_end_
1583 integer,
optional,
intent(in) :: ikpt_start_
1584 integer,
optional,
intent(in) :: ikpt_end_
1585 logical,
optional,
intent(in) :: normalized
1588 integer :: ist, ik, id, ist_start, ist_end, jst, ikpt_start, ikpt_end
1589 complex(real64) :: alpha, beta, zdotp_tmp
1590 real(real64),
allocatable :: dpsi(:, :)
1591 complex(real64),
allocatable :: zpsi(:, :), zpsi2(:)
1592 integer :: ikpoint, ip
1595 logical :: normalized_
1606 safe_allocate(dpsi(1:mesh%np, 1:st%d%dim))
1608 safe_allocate(zpsi(1:mesh%np, 1:st%d%dim))
1611 select case (st%d%ispin)
1614 do ik = ikpt_start, ikpt_end
1615 ikpoint = st%d%get_kpoint_index(ik)
1616 do ist = ist_start, ist_end
1620 pre_shift = mesh%pv%xlocal-1, &
1621 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1622 normalized = normalized)
1624 if(mesh%parallel_in_domains)
then
1630 call dmf_random(mesh, dpsi(:, 1), normalized = normalized)
1635 zpsi(ip,1) = cmplx(dpsi(ip,1),
m_zero, real64)
1644 pre_shift = mesh%pv%xlocal-1, &
1645 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1646 normalized = normalized)
1648 if(mesh%parallel_in_domains)
then
1654 call zmf_random(mesh, zpsi(:, 1), normalized = normalized)
1666 if (st%fixed_spins)
then
1668 do ik = ikpt_start, ikpt_end
1669 ikpoint = st%d%get_kpoint_index(ik)
1670 do ist = ist_start, ist_end
1674 pre_shift = mesh%pv%xlocal-1, &
1675 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1676 normalized = normalized)
1678 if(mesh%parallel_in_domains)
then
1684 call dmf_random(mesh, dpsi(:, 1), normalized = normalized)
1688 zpsi(ip,1) = cmplx(dpsi(ip,1),
m_zero, real64)
1694 pre_shift = mesh%pv%xlocal-1, &
1695 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1696 normalized = normalized)
1698 if(mesh%parallel_in_domains)
then
1704 call zmf_random(mesh, zpsi(:, 1), normalized = normalized)
1717 safe_allocate(zpsi2(1:mesh%np))
1718 do jst = ist_start, ist - 1
1720 zdotp_tmp =
zmf_dotp(mesh, zpsi(:, 1), zpsi2)
1721 call lalg_axpy(mesh%np, -zdotp_tmp, zpsi2, zpsi(:, 1))
1723 safe_deallocate_a(zpsi2)
1726 zpsi(1:mesh%np, 2) = zpsi(1:mesh%np, 1)
1731 beta = cmplx(st%spin(1, ist, ik) / abs(alpha), st%spin(2, ist, ik) / abs(alpha), real64)
1733 call lalg_scal(mesh%np, alpha, zpsi(:, 1))
1734 call lalg_scal(mesh%np, beta, zpsi(:, 2))
1739 do ik = ikpt_start, ikpt_end
1740 do ist = ist_start, ist_end
1744 pre_shift = mesh%pv%xlocal-1, &
1745 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1746 normalized = .false.)
1748 if(mesh%parallel_in_domains)
then
1754 call zmf_random(mesh, zpsi(:, id), normalized = .false.)
1770 safe_deallocate_a(dpsi)
1771 safe_deallocate_a(zpsi)
1782 class(
mesh_t),
intent(in) :: mesh
1783 logical,
optional,
intent(in) :: compute_spin
1787 real(real64) :: charge
1788 complex(real64),
allocatable :: zpsi(:, :)
1793 st%nik, st%nst, st%kweights)
1800 charge = charge + sum(st%occ(ist, 1:st%nik) * st%kweights(1:st%nik))
1802 if (abs(charge-st%qtot) > 1e-6_real64)
then
1803 message(1) =
'Occupations do not integrate to total charge.'
1804 write(
message(2),
'(6x,f12.8,a,f12.8)') charge,
' != ', st%qtot
1807 message(1) =
"There don't seem to be any electrons at all!"
1817 safe_allocate(zpsi(1:mesh%np, st%d%dim))
1818 do ik = st%d%kpt%start, st%d%kpt%end
1819 do ist = st%st_start, st%st_end
1821 st%spin(1:3, ist, ik) =
state_spin(mesh, zpsi)
1824 safe_deallocate_a(zpsi)
1826 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
1841 real(real64),
optional,
intent(in) :: alt_eig(st%st_start:, st%d%kpt%start:)
1850 do ik = st%d%kpt%start, st%d%kpt%end
1851 if (
present(alt_eig))
then
1852 tot = tot + st%kweights(ik) * sum(st%occ(st%st_start:st%st_end, ik) * &
1853 alt_eig(st%st_start:st%st_end, ik))
1855 tot = tot + st%kweights(ik) * sum(st%occ(st%st_start:st%st_end, ik) * &
1856 st%eigenval(st%st_start:st%st_end, ik))
1860 if (st%parallel_in_states .or. st%d%kpt%parallel)
call comm_allreduce(st%st_kpt_mpi_grp, tot)
1872 logical :: default_scalapack_compatible
1883 st%parallel_in_states = .false.
1887 call mpi_grp_init(st%dom_st_kpt_mpi_grp, mc%dom_st_kpt_comm)
1891 default_scalapack_compatible =
calc_mode_par%scalapack_compat() .and. .not. st%d%kpt%parallel
1905 call parse_variable(namespace,
'ScaLAPACKCompatible', default_scalapack_compatible, st%scalapack_compatible)
1907#ifdef HAVE_SCALAPACK
1908 if (default_scalapack_compatible .neqv. st%scalapack_compatible)
then
1909 call messages_experimental(
'Setting ScaLAPACKCompatible to other than default', namespace=namespace)
1912 if (st%scalapack_compatible)
then
1919 st%scalapack_compatible = .false.
1925 call multicomm_create_all_pairs(st%mpi_grp, st%ap)
1928 if (st%nst < st%mpi_grp%size)
then
1929 message(1) =
"Have more processors than necessary"
1930 write(
message(2),
'(i4,a,i4,a)') st%mpi_grp%size,
" processors and ", st%nst,
" states."
1934 call distributed_init(st%dist, st%nst, st%mpi_grp%comm,
"states", scalapack_compat = st%scalapack_compatible)
1936 st%parallel_in_states = st%dist%parallel
1939 st%st_start = st%dist%start
1940 st%st_end = st%dist%end
1941 st%lnst = st%dist%nlocal
1942 st%node(1:st%nst) = st%dist%node(1:st%nst)
1959 kinetic_energy_density, paramagnetic_current, density_gradient, density_laplacian, &
1960 gi_kinetic_energy_density, st_end)
1961 type(
grid_t),
intent(in) :: gr
1964 logical,
intent(in) :: nlcc
1965 real(real64),
contiguous,
optional,
target,
intent(out) :: kinetic_energy_density(:,:)
1966 real(real64),
contiguous,
optional,
target,
intent(out) :: paramagnetic_current(:,:,:)
1967 real(real64),
contiguous,
optional,
intent(out) :: density_gradient(:,:,:)
1968 real(real64),
contiguous,
optional,
intent(out) :: density_laplacian(:,:)
1969 real(real64),
contiguous,
optional,
intent(out) :: gi_kinetic_energy_density(:,:)
1970 integer,
optional,
intent(in) :: st_end
1972 real(real64),
pointer,
contiguous :: jp(:, :, :)
1973 real(real64),
pointer,
contiguous :: tau(:, :)
1974 complex(real64),
allocatable :: wf_psi(:,:), gwf_psi(:,:,:), wf_psi_conj(:,:), lwf_psi(:,:)
1975 real(real64),
allocatable :: abs_wf_psi(:,:), abs_gwf_psi(:,:)
1976 complex(real64),
allocatable :: psi_gpsi(:,:)
1977 complex(real64) :: c_tmp
1978 integer :: is, ik, ist, i_dim, st_dim, ii, st_end_
1979 real(real64) :: ww, kpoint(gr%der%dim)
1980 logical :: something_to_do
1988 something_to_do =
present(kinetic_energy_density) .or.
present(gi_kinetic_energy_density) .or. &
1989 present(paramagnetic_current) .or.
present(density_gradient) .or.
present(density_laplacian)
1990 assert(something_to_do)
1992 safe_allocate( wf_psi(1:gr%np_part, 1:st%d%dim))
1993 safe_allocate( wf_psi_conj(1:gr%np_part, 1:st%d%dim))
1994 safe_allocate(gwf_psi(1:gr%np, 1:gr%der%dim, 1:st%d%dim))
1995 safe_allocate(abs_wf_psi(1:gr%np, 1:st%d%dim))
1996 safe_allocate(abs_gwf_psi(1:gr%np, 1:st%d%dim))
1997 safe_allocate(psi_gpsi(1:gr%np, 1:st%d%dim))
1998 if (
present(density_laplacian))
then
1999 safe_allocate(lwf_psi(1:gr%np, 1:st%d%dim))
2003 if (
present(kinetic_energy_density)) tau => kinetic_energy_density
2006 if (
present(paramagnetic_current)) jp => paramagnetic_current
2010 if (
present(gi_kinetic_energy_density))
then
2012 safe_allocate(jp(1:gr%np, 1:gr%der%dim, 1:st%d%nspin))
2014 if (.not.
present(kinetic_energy_density))
then
2015 safe_allocate(tau(1:gr%np, 1:st%d%nspin))
2019 if (
associated(tau)) tau =
m_zero
2020 if (
associated(jp)) jp =
m_zero
2021 if (
present(density_gradient)) density_gradient(:,:,:) =
m_zero
2022 if (
present(density_laplacian)) density_laplacian(:,:) =
m_zero
2023 if (
present(gi_kinetic_energy_density)) gi_kinetic_energy_density =
m_zero
2025 do ik = st%d%kpt%start, st%d%kpt%end
2027 kpoint(1:gr%der%dim) = kpoints%get_point(st%d%get_kpoint_index(ik))
2028 is = st%d%get_spin_index(ik)
2030 do ist = st%st_start, st_end_
2031 ww = st%kweights(ik)*st%occ(ist, ik)
2037 do st_dim = 1, st%d%dim
2042 do st_dim = 1, st%d%dim
2043 call zderivatives_grad(gr%der, wf_psi(:,st_dim), gwf_psi(:,:,st_dim), set_bc = .false.)
2047 if (
present(density_laplacian))
then
2048 do st_dim = 1, st%d%dim
2049 call zderivatives_lapl(gr%der, wf_psi(:,st_dim), lwf_psi(:,st_dim), ghost_update = .false., set_bc = .false.)
2054 wf_psi_conj(1:gr%np, 1:st%d%dim) = conjg(wf_psi(1:gr%np,1:st%d%dim))
2056 do st_dim = 1, st%d%dim
2058 abs_wf_psi(ii, st_dim) = real(wf_psi_conj(ii, st_dim) * wf_psi(ii, st_dim), real64)
2063 if (
present(density_laplacian))
then
2066 density_laplacian(ii, is) = density_laplacian(ii, is) + &
2067 ww *
m_two*real(wf_psi_conj(ii, 1) * lwf_psi(ii, 1), real64)
2070 if (st%d%ispin ==
spinors)
then
2073 density_laplacian(ii, 2) = density_laplacian(ii, 2) + &
2074 ww *
m_two*real(wf_psi_conj(ii, 2) * lwf_psi(ii, 2), real64)
2079 c_tmp = ww*(lwf_psi(ii, 1) * wf_psi_conj(ii, 2) + wf_psi(ii, 1) * conjg(lwf_psi(ii, 2)))
2080 density_laplacian(ii, 3) = density_laplacian(ii, 3) + real(c_tmp, real64)
2081 density_laplacian(ii, 4) = density_laplacian(ii, 4) + aimag(c_tmp)
2086 if (
associated(tau))
then
2087 call lalg_axpy(gr%np, ww * sum(kpoint(1:gr%der%dim)**2), abs_wf_psi(:, 1), tau(:, is))
2088 if (st%d%ispin ==
spinors)
then
2089 call lalg_axpy(gr%np, ww * sum(kpoint(1:gr%der%dim)**2), abs_wf_psi(:, 2), tau(:, 2))
2093 c_tmp = ww * sum(kpoint(1:gr%der%dim)**2) * wf_psi(ii, 1) * wf_psi_conj(ii, 2)
2094 tau(ii, 3) = tau(ii, 3) + real(c_tmp, real64)
2095 tau(ii, 4) = tau(ii, 4) + aimag(c_tmp)
2100 do i_dim = 1, gr%der%dim
2104 do st_dim = 1, st%d%dim
2107 psi_gpsi(ii, st_dim) = wf_psi_conj(ii, st_dim) * gwf_psi(ii, i_dim, st_dim)
2110 do st_dim = 1, st%d%dim
2113 abs_gwf_psi(ii, st_dim) = real(conjg(gwf_psi(ii, i_dim, st_dim)) &
2114 * gwf_psi(ii, i_dim, st_dim), real64)
2119 if (
present(density_gradient))
then
2122 density_gradient(ii, i_dim, is) = density_gradient(ii, i_dim, is) &
2123 + ww *
m_two * real(psi_gpsi(ii, 1), real64)
2126 if (st%d%ispin ==
spinors)
then
2129 density_gradient(ii, i_dim, 2) = density_gradient(ii, i_dim, 2) &
2130 + ww *
m_two*real(psi_gpsi(ii, 2), real64)
2135 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)))
2136 density_gradient(ii, i_dim, 3) = density_gradient(ii, i_dim, 3) + real(c_tmp, real64)
2137 density_gradient(ii, i_dim, 4) = density_gradient(ii, i_dim, 4) + aimag(c_tmp)
2142 if (
present(density_laplacian))
then
2143 call lalg_axpy(gr%np, ww*
m_two, abs_gwf_psi(:,1), density_laplacian(:,is))
2144 if (st%d%ispin ==
spinors)
then
2145 call lalg_axpy(gr%np, ww*
m_two, abs_gwf_psi(:,2), density_laplacian(:,2))
2148 c_tmp =
m_two * ww * gwf_psi(ii, i_dim, 1) * conjg(gwf_psi(ii, i_dim, 2))
2149 density_laplacian(ii, 3) = density_laplacian(ii, 3) + real(c_tmp, real64)
2150 density_laplacian(ii, 4) = density_laplacian(ii, 4) + aimag(c_tmp)
2158 if (
associated(jp))
then
2162 jp(ii, i_dim, is) = jp(ii, i_dim, is) + &
2163 ww*(aimag(psi_gpsi(ii, 1)) - abs_wf_psi(ii, 1)*kpoint(i_dim))
2166 if (st%d%ispin ==
spinors)
then
2169 jp(ii, i_dim, 2) = jp(ii, i_dim, 2) + &
2170 ww*( aimag(psi_gpsi(ii, 2)) - abs_wf_psi(ii, 2)*kpoint(i_dim))
2175 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)) &
2176 -
m_two *
m_zi*wf_psi(ii, 1)*wf_psi_conj(ii, 2)*kpoint(i_dim))
2177 jp(ii, i_dim, 3) = jp(ii, i_dim, 3) + real(c_tmp, real64)
2178 jp(ii, i_dim, 4) = jp(ii, i_dim, 4) + aimag(c_tmp)
2187 if (
associated(tau))
then
2190 tau(ii, is) = tau(ii, is) + ww*(abs_gwf_psi(ii,1) &
2191 -
m_two*aimag(psi_gpsi(ii, 1))*kpoint(i_dim))
2194 if (st%d%ispin ==
spinors)
then
2197 tau(ii, 2) = tau(ii, 2) + ww*(abs_gwf_psi(ii, 2) &
2198 -
m_two*aimag(psi_gpsi(ii, 2))*kpoint(i_dim))
2203 c_tmp = ww * ( gwf_psi(ii, i_dim, 1)*conjg(gwf_psi(ii, i_dim, 2)) &
2204 +
m_zi * (gwf_psi(ii,i_dim,1)*wf_psi_conj(ii, 2) &
2205 - wf_psi(ii, 1)*conjg(gwf_psi(ii,i_dim,2)))*kpoint(i_dim))
2206 tau(ii, 3) = tau(ii, 3) + real(c_tmp, real64)
2207 tau(ii, 4) = tau(ii, 4) + aimag(c_tmp)
2217 safe_deallocate_a(wf_psi_conj)
2218 safe_deallocate_a(abs_wf_psi)
2219 safe_deallocate_a(abs_gwf_psi)
2220 safe_deallocate_a(psi_gpsi)
2222 if (.not.
present(gi_kinetic_energy_density))
then
2223 if (.not.
present(paramagnetic_current))
then
2224 safe_deallocate_p(jp)
2226 if (.not.
present(kinetic_energy_density))
then
2227 safe_deallocate_p(tau)
2231 if (st%parallel_in_states .or. st%d%kpt%parallel)
call reduce_all(st%st_kpt_mpi_grp)
2236 if (st%symmetrize_density)
then
2237 do is = 1, st%d%nspin
2238 if (
associated(tau))
then
2242 if (
present(density_laplacian))
then
2246 if (
associated(jp))
then
2250 if (
present(density_gradient))
then
2257 if (
allocated(st%rho_core) .and. nlcc .and. (
present(density_laplacian) .or.
present(density_gradient)))
then
2259 wf_psi(ii, 1) = st%rho_core(ii)/st%d%spin_channels
2264 if (
present(density_gradient))
then
2267 do is = 1, st%d%spin_channels
2269 do i_dim = 1, gr%der%dim
2271 density_gradient(ii, i_dim, is) = density_gradient(ii, i_dim, is) + &
2272 real(gwf_psi(ii, i_dim, 1), real64)
2280 if (
present(density_laplacian))
then
2284 do is = 1, st%d%spin_channels
2287 density_laplacian(ii, is) = density_laplacian(ii, is) + real(lwf_psi(ii, 1))
2296 if (
allocated(st%frozen_tau) .and. .not.
present(st_end) .and.
associated(tau))
then
2299 if (
allocated(st%frozen_gdens) .and. .not.
present(st_end) .and.
present(density_gradient))
then
2300 do is = 1, st%d%nspin
2301 call lalg_axpy(gr%np, gr%der%dim,
m_one, st%frozen_gdens(:,:,is), density_gradient(:,:,is))
2304 if (
allocated(st%frozen_ldens) .and. .not.
present(st_end) .and.
present(density_laplacian))
then
2305 call lalg_axpy(gr%np, st%d%nspin,
m_one, st%frozen_ldens, density_laplacian)
2308 safe_deallocate_a(wf_psi)
2309 safe_deallocate_a(gwf_psi)
2310 safe_deallocate_a(lwf_psi)
2314 if (
present(gi_kinetic_energy_density))
then
2315 do is = 1, st%d%nspin
2316 assert(
associated(tau))
2317 gi_kinetic_energy_density(1:gr%np, is) = tau(1:gr%np, is)
2320 assert(
associated(jp))
2321 if (st%d%ispin /=
spinors)
then
2322 do is = 1, st%d%nspin
2325 if (st%rho(ii, is) < 1.0e-7_real64) cycle
2326 gi_kinetic_energy_density(ii, is) = &
2327 gi_kinetic_energy_density(ii, is) - sum(jp(ii,1:gr%der%dim, is)**2)/st%rho(ii, is)
2333 gi_kinetic_energy_density(ii, 1) = gi_kinetic_energy_density(ii, 1) &
2334 - sum(jp(ii,1:gr%der%dim, 1)**2)/(safe_tol(st%rho(ii, 1),
m_epsilon))
2335 gi_kinetic_energy_density(ii, 2) = gi_kinetic_energy_density(ii, 2) &
2336 - sum(jp(ii,1:gr%der%dim, 2)**2)/(safe_tol(st%rho(ii, 2),
m_epsilon))
2337 gi_kinetic_energy_density(ii, 3) = &
2338 gi_kinetic_energy_density(ii, 3) - sum(jp(ii,1:gr%der%dim, 3)**2 + jp(ii,1:gr%der%dim, 4)**2) &
2339 /(safe_tol((st%rho(ii, 3)**2 + st%rho(ii, 4)**2),
m_epsilon))*st%rho(ii, 3)
2340 gi_kinetic_energy_density(ii, 4) = &
2341 gi_kinetic_energy_density(ii, 4) + sum(jp(ii,1:gr%der%dim, 3)**2 + jp(ii,1:gr%der%dim, 4)**2) &
2342 /(safe_tol((st%rho(ii, 3)**2 + st%rho(ii, 4)**2),
m_epsilon))*st%rho(ii, 4)
2348 if (.not.
present(kinetic_energy_density))
then
2349 safe_deallocate_p(tau)
2351 if (.not.
present(paramagnetic_current))
then
2352 safe_deallocate_p(jp)
2367 if (
associated(tau))
call comm_allreduce(grp, tau, dim = (/gr%np, st%d%nspin/))
2369 if (
present(density_laplacian))
call comm_allreduce(grp, density_laplacian, dim = (/gr%np, st%d%nspin/))
2371 do is = 1, st%d%nspin
2372 if (
associated(jp))
call comm_allreduce(grp, jp(:, :, is), dim = (/gr%np, gr%der%dim/))
2374 if (
present(density_gradient))
then
2375 call comm_allreduce(grp, density_gradient(:, :, is), dim = (/gr%np, gr%der%dim/))
2389 type(
mesh_t),
intent(in) :: mesh
2390 complex(real64),
intent(in) :: f1(:, :)
2391 real(real64) :: spin(1:3)
2393 complex(real64) :: z
2397 z =
zmf_dotp(mesh, f1(:, 1) , f1(:, 2))
2399 spin(1) =
m_two*real(z, real64)
2400 spin(2) =
m_two*aimag(z)
2412 integer,
intent(in) :: ist
2426 integer,
intent(in) :: ist
2427 integer,
intent(in) :: ik
2432 ik >= st%d%kpt%start .and. ik <= st%d%kpt%end
2442 class(
mesh_t),
intent(in) :: mesh
2448 memory = memory + real(storage_size(0.0_real64)/8, real64) * &
2449 real(mesh%np_part_global, real64) *st%d%dim *
real(st%nst, real64) *st%d%kpt%nglobal
2459 logical,
optional,
intent(in) :: copy
2462 integer(int64) :: max_mem, mem
2474 if (accel_is_enabled())
then
2475 max_mem = accel_global_memory_size()
2477 if (st%gpu_states_mem > m_one)
then
2478 max_mem = int(st%gpu_states_mem, int64)*(1024_8)**2
2479 else if (st%gpu_states_mem < 0.0_real64)
then
2480 max_mem = max_mem + int(st%gpu_states_mem, int64)*(1024_8)**2
2482 max_mem = int(st%gpu_states_mem*real(max_mem, real64) , int64)
2485 max_mem = huge(max_mem)
2489 qnloop:
do iqn = st%d%kpt%start, st%d%kpt%end
2490 do ib = st%group%block_start, st%group%block_end
2492 mem = mem + st%group%psib(ib, iqn)%pack_total_size()
2494 if (mem > max_mem)
then
2495 call messages_write(
'Not enough CL device memory to store all states simultaneously.', new_line = .
true.)
2496 call messages_write(
'Only ')
2497 call messages_write(ib - st%group%block_start)
2498 call messages_write(
' of ')
2499 call messages_write(st%group%block_end - st%group%block_start + 1)
2500 call messages_write(
' blocks will be stored in device memory.', new_line = .
true.)
2501 call messages_warning()
2505 call st%group%psib(ib, iqn)%do_pack(copy)
2517 logical,
optional,
intent(in) :: copy
2526 do iqn = st%d%kpt%start, st%d%kpt%end
2527 do ib = st%group%block_start, st%group%block_end
2528 if (st%group%psib(ib, iqn)%is_packed())
call st%group%psib(ib, iqn)%do_unpack(copy)
2541 type(namespace_t),
intent(in) :: namespace
2545 call messages_print_with_emphasis(msg=
"States", namespace=namespace)
2547 write(message(1),
'(a,f12.3)')
'Total electronic charge = ', st%qtot
2548 write(message(2),
'(a,i8)')
'Number of states = ', st%nst
2549 write(message(3),
'(a,i8)')
'States block-size = ', st%block_size
2550 call messages_info(3, namespace=namespace)
2552 call messages_print_with_emphasis(namespace=namespace)
2565 do iqn = st%d%kpt%start, st%d%kpt%end
2566 do ib = st%group%block_start, st%group%block_end
2567 call batch_set_zero(st%group%psib(ib, iqn))
2577 integer pure function states_elec_block_min(st, ib) result(range)
2579 integer,
intent(in) :: ib
2581 range = st%group%block_range(ib, 1)
2587 integer pure function states_elec_block_max(st, ib) result(range)
2589 integer,
intent(in) :: ib
2591 range = st%group%block_range(ib, 2)
2597 integer pure function states_elec_block_size(st, ib) result(size)
2599 integer,
intent(in) :: ib
2601 size = st%group%block_size(ib)
2620 subroutine occupied_states(st, namespace, ik, n_filled, n_partially_filled, n_half_filled, &
2621 filled, partially_filled, half_filled)
2623 type(namespace_t),
intent(in) :: namespace
2624 integer,
intent(in) :: ik
2625 integer,
intent(out) :: n_filled, n_partially_filled, n_half_filled
2626 integer,
optional,
intent(out) :: filled(:), partially_filled(:), half_filled(:)
2632 if (
present(filled)) filled(:) = 0
2633 if (
present(partially_filled)) partially_filled(:) = 0
2634 if (
present(half_filled)) half_filled(:) = 0
2636 n_partially_filled = 0
2639 select case (st%d%ispin)
2642 if (abs(st%occ(ist, ik) - m_two) < m_min_occ)
then
2643 n_filled = n_filled + 1
2644 if (
present(filled)) filled(n_filled) = ist
2645 else if (abs(st%occ(ist, ik) - m_one) < m_min_occ)
then
2646 n_half_filled = n_half_filled + 1
2647 if (
present(half_filled)) half_filled(n_half_filled) = ist
2648 else if (st%occ(ist, ik) > m_min_occ)
then
2649 n_partially_filled = n_partially_filled + 1
2650 if (
present(partially_filled)) partially_filled(n_partially_filled) = ist
2651 else if (abs(st%occ(ist, ik)) > m_min_occ)
then
2652 write(message(1),*)
'Internal error in occupied_states: Illegal occupation value ', st%occ(ist, ik)
2653 call messages_fatal(1, namespace=namespace)
2656 case (spin_polarized, spinors)
2658 if (abs(st%occ(ist, ik)-m_one) < m_min_occ)
then
2659 n_filled = n_filled + 1
2660 if (
present(filled)) filled(n_filled) = ist
2661 else if (st%occ(ist, ik) > m_min_occ)
then
2662 n_partially_filled = n_partially_filled + 1
2663 if (
present(partially_filled)) partially_filled(n_partially_filled) = ist
2664 else if (abs(st%occ(ist, ik)) > m_min_occ)
then
2665 write(message(1),*)
'Internal error in occupied_states: Illegal occupation value ', st%occ(ist, ik)
2666 call messages_fatal(1, namespace=namespace)
2678 type(multicomm_t),
intent(in) :: mc
2681 call distributed_init(this%d%kpt, this%nik, mc%group_comm(p_strategy_kpoints),
"k-points")
2696 if (.not.
allocated(st%st_kpt_task))
then
2697 safe_allocate(st%st_kpt_task(0:st%st_kpt_mpi_grp%size-1, 1:4))
2700 st%st_kpt_task(0:st%st_kpt_mpi_grp%size-1, :) = 0
2701 st%st_kpt_task(st%st_kpt_mpi_grp%rank, :) = [st%st_start, st%st_end, st%d%kpt%start, st%d%kpt%end]
2703 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
2704 call comm_allreduce(st%st_kpt_mpi_grp, st%st_kpt_task)
2715 type(kpoints_t),
intent(in) :: kpoints
2716 type(namespace_t),
intent(in) :: namespace
2719 type(states_elec_dim_t),
pointer :: dd
2726 st%nik = kpoints_number(kpoints)
2728 if (dd%ispin == spin_polarized) st%nik = 2*st%nik
2730 safe_allocate(st%kweights(1:st%nik))
2733 ik = dd%get_kpoint_index(iq)
2734 st%kweights(iq) = kpoints%get_weight(ik)
2746 call io_mkdir(
'debug/', namespace)
2747 iunit = io_open(
'debug/kpoints', namespace, action =
'write')
2748 call kpoints%write_info(iunit=iunit, absolute_coordinates = .
true.)
2749 call io_close(iunit)
2763 class(mesh_t),
intent(in) :: gr
2764 real(real64) :: dipole(1:gr%box%dim)
2767 real(real64) :: e_dip(1:gr%box%dim, this%d%spin_channels)
2771 do ispin = 1, this%d%spin_channels
2772 call dmf_dipole(gr, this%rho(:, ispin), e_dip(:, ispin))
2775 dipole(:) = sum(e_dip(:, 1:this%d%spin_channels), 2)
2783#include "states_elec_inc.F90"
2786#include "complex.F90"
2787#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_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_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.