35#include "./base/base_uses.f90"
41 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_mo_occupation'
46 MODULE PROCEDURE set_mo_occupation_1, set_mo_occupation_2
61 SUBROUTINE set_mo_occupation_3(mo_array, smear)
63 TYPE(mo_set_type),
DIMENSION(2),
INTENT(INOUT) :: mo_array
64 TYPE(smear_type),
POINTER :: smear
66 CHARACTER(LEN=*),
PARAMETER :: routineN =
'set_mo_occupation_3'
68 INTEGER :: all_nmo, handle, homo_a, homo_b, i, &
69 lfomo_a, lfomo_b, nmo_a, nmo_b, &
71 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: all_index
73 REAL(KIND=
dp) :: all_nelec, kts, mu, nelec_a, nelec_b, &
75 REAL(KIND=
dp),
ALLOCATABLE,
DIMENSION(:) :: all_eigval, all_occ
76 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: eigval_a, eigval_b, occ_a, occ_b
78 CALL timeset(routinen, handle)
80 NULLIFY (eigval_a, eigval_b, occ_a, occ_b)
81 CALL get_mo_set(mo_set=mo_array(1), nmo=nmo_a, eigenvalues=eigval_a, &
82 occupation_numbers=occ_a)
83 CALL get_mo_set(mo_set=mo_array(2), nmo=nmo_b, eigenvalues=eigval_b, &
84 occupation_numbers=occ_b)
85 all_nmo = nmo_a + nmo_b
86 ALLOCATE (all_eigval(all_nmo))
87 ALLOCATE (all_occ(all_nmo))
88 ALLOCATE (all_index(all_nmo))
90 all_eigval(1:nmo_a) = eigval_a(1:nmo_a)
91 all_eigval(nmo_a + 1:all_nmo) = eigval_b(1:nmo_b)
93 CALL sort(all_eigval, all_nmo, all_index)
103 all_nelec = nelec_a + nelec_b
106 IF (all_index(i) <= nmo_a)
THEN
107 all_occ(i) = occ_a(all_index(i))
109 all_occ(i) = occ_b(all_index(i) - nmo_a)
113 CALL fermifixed(all_occ, mu, kts, all_eigval, all_nelec, &
114 smear%electronic_temperature, 1._dp, xas_estate, occ_estate)
116 is_large = abs(maxval(all_occ) - 1.0_dp) > smear%eps_fermi_dirac
118 cpwarn_if(is_large,
"Fermi-Dirac smearing includes the first MO")
120 is_large = abs(minval(all_occ)) > smear%eps_fermi_dirac
122 CALL cp_warn(__location__, &
123 "Fermi-Dirac smearing includes the last MO => "// &
124 "Add more MOs for proper smearing.")
127 is_large = (abs(all_nelec -
accurate_sum(all_occ(:))) > smear%eps_fermi_dirac*all_nelec)
128 cpwarn_if(is_large,
"Total number of electrons is not accurate")
131 IF (all_index(i) <= nmo_a)
THEN
132 occ_a(all_index(i)) = all_occ(i)
133 eigval_a(all_index(i)) = all_eigval(i)
135 occ_b(all_index(i) - nmo_a) = all_occ(i)
136 eigval_b(all_index(i) - nmo_a) = all_eigval(i)
144 IF (occ_a(i) < 1.0_dp)
THEN
150 IF (occ_b(i) < 1.0_dp)
THEN
156 DO i = nmo_a, lfomo_a, -1
157 IF (occ_a(i) > smear%eps_fermi_dirac)
THEN
163 DO i = nmo_b, lfomo_b, -1
164 IF (occ_b(i) > smear%eps_fermi_dirac)
THEN
170 CALL set_mo_set(mo_set=mo_array(1), kts=kts/2.0_dp, mu=mu, n_el_f=nelec_a, &
171 lfomo=lfomo_a, homo=homo_a, uniform_occupation=.false.)
172 CALL set_mo_set(mo_set=mo_array(2), kts=kts/2.0_dp, mu=mu, n_el_f=nelec_b, &
173 lfomo=lfomo_b, homo=homo_b, uniform_occupation=.false.)
175 CALL timestop(handle)
177 END SUBROUTINE set_mo_occupation_3
197 SUBROUTINE set_mo_occupation_2(mo_array, smear, eval_deriv, tot_zeff_corr, probe)
199 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(INOUT) :: mo_array
201 REAL(KIND=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: eval_deriv
202 REAL(KIND=
dp),
OPTIONAL :: tot_zeff_corr
206 CHARACTER(LEN=*),
PARAMETER :: routinen =
'set_mo_occupation_2'
208 INTEGER :: handle, i, lumo_a, lumo_b, &
209 multiplicity_new, multiplicity_old, &
211 REAL(kind=
dp) :: nelec_f, threshold
212 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eigval_a, eigval_b
214 CALL timeset(routinen, handle)
217 IF (
SIZE(mo_array) == 1)
THEN
218 IF (
PRESENT(probe))
THEN
219 CALL set_mo_occupation_1(mo_array(1), smear=smear, probe=probe)
220 ELSE IF (
PRESENT(eval_deriv))
THEN
222 CALL set_mo_occupation_1(mo_array(1), smear=smear, eval_deriv=eval_deriv)
224 IF (
PRESENT(tot_zeff_corr))
THEN
225 CALL set_mo_occupation_1(mo_array(1), smear=smear, tot_zeff_corr=tot_zeff_corr)
227 CALL set_mo_occupation_1(mo_array(1), smear=smear)
230 CALL timestop(handle)
234 IF (
PRESENT(probe))
THEN
235 CALL set_mo_occupation_1(mo_array(1), smear=smear, probe=probe)
236 CALL set_mo_occupation_1(mo_array(2), smear=smear, probe=probe)
239 IF (smear%do_smear)
THEN
240 IF (smear%fixed_mag_mom < 0.0_dp)
THEN
241 IF (
PRESENT(tot_zeff_corr))
THEN
242 CALL cp_warn(__location__, &
243 "CORE_CORRECTION /= 0.0 might cause the cell to charge up "// &
244 "that will lead to application of different background "// &
245 "correction compared to the reference system. "// &
246 "Use FIXED_MAGNETIC_MOMENT >= 0.0 if using SMEAR keyword "// &
247 "to correct the electron density")
249 IF (smear%fixed_mag_mom /= -1.0_dp)
THEN
250 cpassert(.NOT. (
PRESENT(eval_deriv)))
251 CALL set_mo_occupation_3(mo_array, smear=smear)
252 CALL timestop(handle)
256 nelec_f = mo_array(1)%n_el_f + mo_array(2)%n_el_f
257 IF (abs((mo_array(1)%n_el_f - mo_array(2)%n_el_f) - smear%fixed_mag_mom) > smear%eps_fermi_dirac*nelec_f)
THEN
258 mo_array(1)%n_el_f = nelec_f/2.0_dp + smear%fixed_mag_mom/2.0_dp
259 mo_array(2)%n_el_f = nelec_f/2.0_dp - smear%fixed_mag_mom/2.0_dp
261 cpassert(.NOT. (
PRESENT(eval_deriv)))
262 IF (
PRESENT(tot_zeff_corr))
THEN
263 CALL set_mo_occupation_1(mo_array(1), smear=smear, tot_zeff_corr=tot_zeff_corr)
264 CALL set_mo_occupation_1(mo_array(2), smear=smear, tot_zeff_corr=tot_zeff_corr)
266 CALL set_mo_occupation_1(mo_array(1), smear=smear)
267 CALL set_mo_occupation_1(mo_array(2), smear=smear)
272 IF (.NOT. ((mo_array(1)%flexible_electron_count > 0.0_dp) .AND. &
273 (mo_array(2)%flexible_electron_count > 0.0_dp)))
THEN
274 IF (
PRESENT(probe))
THEN
275 CALL set_mo_occupation_1(mo_array(1), smear=smear, probe=probe)
276 CALL set_mo_occupation_1(mo_array(2), smear=smear, probe=probe)
277 ELSE IF (
PRESENT(eval_deriv))
THEN
278 CALL set_mo_occupation_1(mo_array(1), smear=smear, eval_deriv=eval_deriv)
279 CALL set_mo_occupation_1(mo_array(2), smear=smear, eval_deriv=eval_deriv)
281 IF (
PRESENT(tot_zeff_corr))
THEN
282 CALL set_mo_occupation_1(mo_array(1), smear=smear, tot_zeff_corr=tot_zeff_corr)
283 CALL set_mo_occupation_1(mo_array(2), smear=smear, tot_zeff_corr=tot_zeff_corr)
285 CALL set_mo_occupation_1(mo_array(1), smear=smear)
286 CALL set_mo_occupation_1(mo_array(2), smear=smear)
289 CALL timestop(handle)
293 nelec = mo_array(1)%nelectron + mo_array(2)%nelectron
295 multiplicity_old = mo_array(1)%nelectron - mo_array(2)%nelectron + 1
297 IF (mo_array(1)%nelectron >= mo_array(1)%nmo) &
298 CALL cp_warn(__location__, &
299 "All alpha MOs are occupied. Add more alpha MOs to "// &
300 "allow for a higher multiplicity")
301 IF ((mo_array(2)%nelectron >= mo_array(2)%nmo) .AND. (mo_array(2)%nelectron /= mo_array(1)%nelectron)) &
302 CALL cp_warn(__location__,
"All beta MOs are occupied. Add more beta MOs to "// &
303 "allow for a lower multiplicity")
305 eigval_a => mo_array(1)%eigenvalues
306 eigval_b => mo_array(2)%eigenvalues
315 threshold = max(mo_array(1)%flexible_electron_count, mo_array(2)%flexible_electron_count)
316 IF ((eigval_a(lumo_a) - threshold) < eigval_b(lumo_b))
THEN
321 IF (lumo_a > mo_array(1)%nmo)
THEN
323 CALL cp_warn(__location__, &
324 "All alpha MOs are occupied. Add more alpha MOs to "// &
325 "allow for a higher multiplicity")
331 IF (lumo_b > mo_array(2)%nmo)
THEN
332 IF (lumo_b < lumo_a) &
333 CALL cp_warn(__location__, &
334 "All beta MOs are occupied. Add more beta MOs to "// &
335 "allow for a lower multiplicity")
343 mo_array(1)%homo = lumo_a - 1
344 mo_array(2)%homo = lumo_b - 1
346 IF (mo_array(2)%homo > mo_array(1)%homo)
THEN
347 CALL cp_warn(__location__, &
352 ") MOs are occupied. Resorting to low spin state")
353 mo_array(1)%homo = nelec/2 +
modulo(nelec, 2)
354 mo_array(2)%homo = nelec/2
357 mo_array(1)%nelectron = mo_array(1)%homo
358 mo_array(2)%nelectron = mo_array(2)%homo
359 multiplicity_new = mo_array(1)%nelectron - mo_array(2)%nelectron + 1
361 IF (multiplicity_new /= multiplicity_old) &
362 CALL cp_warn(__location__, &
363 "Multiplicity changed from "// &
364 trim(adjustl(
cp_to_string(multiplicity_old)))//
" to "// &
367 IF (
PRESENT(probe))
THEN
368 CALL set_mo_occupation_1(mo_array(1), smear=smear, probe=probe)
369 CALL set_mo_occupation_1(mo_array(2), smear=smear, probe=probe)
370 ELSE IF (
PRESENT(eval_deriv))
THEN
371 CALL set_mo_occupation_1(mo_array(1), smear=smear, eval_deriv=eval_deriv)
372 CALL set_mo_occupation_1(mo_array(2), smear=smear, eval_deriv=eval_deriv)
374 IF (
PRESENT(tot_zeff_corr))
THEN
375 CALL set_mo_occupation_1(mo_array(1), smear=smear, tot_zeff_corr=tot_zeff_corr)
376 CALL set_mo_occupation_1(mo_array(2), smear=smear, tot_zeff_corr=tot_zeff_corr)
378 CALL set_mo_occupation_1(mo_array(1), smear=smear)
379 CALL set_mo_occupation_1(mo_array(2), smear=smear)
383 CALL timestop(handle)
385 END SUBROUTINE set_mo_occupation_2
406 SUBROUTINE set_mo_occupation_1(mo_set, smear, eval_deriv, xas_env, tot_zeff_corr, probe)
410 REAL(KIND=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: eval_deriv
412 REAL(kind=
dp),
OPTIONAL :: tot_zeff_corr
416 CHARACTER(LEN=*),
PARAMETER :: routinen =
'set_mo_occupation_1'
418 INTEGER :: handle, i_first, imo, ir, irmo, nmo, &
420 LOGICAL :: equal_size, is_large
421 REAL(kind=
dp) :: delectron, e1, e2, edelta, edist, &
422 el_count, lengthscale, nelec, &
423 occ_estate, total_zeff_corr, &
425 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: dfde
427 CALL timeset(routinen, handle)
429 cpassert(
ASSOCIATED(mo_set%eigenvalues))
430 cpassert(
ASSOCIATED(mo_set%occupation_numbers))
431 mo_set%occupation_numbers(:) = 0.0_dp
434 IF (mo_set%nelectron == 0)
THEN
435 CALL timestop(handle)
441 IF (
PRESENT(xas_env))
THEN
442 CALL get_xas_env(xas_env=xas_env, xas_nelectron=xas_nelectron, occ_estate=occ_estate, xas_estate=xas_estate)
443 nomo = ceiling(xas_nelectron + 1.0 - occ_estate - epsilon(0.0_dp))
445 mo_set%occupation_numbers(1:nomo) = mo_set%maxocc
446 IF (xas_estate > 0) mo_set%occupation_numbers(xas_estate) = occ_estate
447 el_count = sum(mo_set%occupation_numbers(1:nomo))
448 IF (el_count > xas_nelectron) &
449 mo_set%occupation_numbers(nomo) = mo_set%occupation_numbers(nomo) - (el_count - xas_nelectron)
450 el_count = sum(mo_set%occupation_numbers(1:nomo))
451 is_large = abs(el_count - xas_nelectron) > xas_nelectron*epsilon(el_count)
452 cpassert(.NOT. is_large)
454 IF (
modulo(mo_set%nelectron, int(mo_set%maxocc)) == 0)
THEN
455 nomo = nint(mo_set%nelectron/mo_set%maxocc)
457 mo_set%occupation_numbers(1:nomo) = mo_set%maxocc
459 nomo = int(mo_set%nelectron/mo_set%maxocc) + 1
461 mo_set%occupation_numbers(1:nomo - 1) = mo_set%maxocc
462 mo_set%occupation_numbers(nomo) = mo_set%nelectron - (nomo - 1)*mo_set%maxocc
469 IF (
PRESENT(tot_zeff_corr))
THEN
471 total_zeff_corr = tot_zeff_corr
472 IF (int(mo_set%maxocc) == 1) total_zeff_corr = total_zeff_corr/2.0_dp
474 IF (total_zeff_corr < 0.0_dp)
THEN
476 delectron = abs(total_zeff_corr) - real(mo_set%maxocc, kind=
dp)
477 IF (delectron > 0.0_dp)
THEN
478 mo_set%occupation_numbers(nomo) = 0.0_dp
479 irmo = ceiling(delectron/real(mo_set%maxocc, kind=
dp))
481 delectron = delectron - real(mo_set%maxocc, kind=
dp)
482 IF (delectron < 0.0_dp)
THEN
483 mo_set%occupation_numbers(nomo - ir) = -delectron
485 mo_set%occupation_numbers(nomo - ir) = 0.0_dp
489 IF (mo_set%occupation_numbers(nomo) == 0.0_dp) nomo = nomo - 1
490 ELSEIF (delectron < 0.0_dp)
THEN
491 mo_set%occupation_numbers(nomo) = -delectron
493 mo_set%occupation_numbers(nomo) = 0.0_dp
496 ELSEIF (total_zeff_corr > 0.0_dp)
THEN
498 delectron = total_zeff_corr - real(mo_set%maxocc, kind=
dp)
499 IF (delectron > 0.0_dp)
THEN
500 mo_set%occupation_numbers(nomo + 1) = real(mo_set%maxocc, kind=
dp)
502 irmo = ceiling(delectron/real(mo_set%maxocc, kind=
dp))
504 delectron = delectron - real(mo_set%maxocc, kind=
dp)
505 IF (delectron < 0.0_dp)
THEN
506 mo_set%occupation_numbers(nomo + ir) = delectron + real(mo_set%maxocc, kind=
dp)
508 mo_set%occupation_numbers(nomo + ir) = real(mo_set%maxocc, kind=
dp)
513 mo_set%occupation_numbers(nomo + 1) = total_zeff_corr
519 nmo =
SIZE(mo_set%eigenvalues)
521 cpassert(nmo >= nomo)
522 cpassert((
SIZE(mo_set%occupation_numbers) == nmo))
525 mo_set%lfomo = nomo + 1
526 mo_set%mu = mo_set%eigenvalues(nomo)
529 IF (
PRESENT(eval_deriv))
THEN
530 equal_size = (
SIZE(mo_set%occupation_numbers, 1) ==
SIZE(eval_deriv, 1))
535 IF (
PRESENT(probe))
THEN
537 IF (smear%fixed_mag_mom == -1.0_dp)
THEN
538 nelec = real(mo_set%nelectron,
dp)
540 nelec = mo_set%n_el_f
543 mo_set%occupation_numbers(:) = 0.0_dp
545 CALL probe_occupancy(mo_set%occupation_numbers, mo_set%mu, mo_set%kTS, &
546 mo_set%eigenvalues, mo_set%mo_coeff, mo_set%maxocc, &
551 DO imo = i_first, nmo
552 IF (mo_set%occupation_numbers(imo) < mo_set%maxocc)
THEN
557 is_large = abs(maxval(mo_set%occupation_numbers) - mo_set%maxocc) > probe(1)%eps_hp
560 cpwarn(
"Hair-probes occupancy distribution includes the first MO")
563 DO imo = nmo, mo_set%lfomo, -1
564 IF (mo_set%occupation_numbers(imo) > probe(1)%eps_hp)
THEN
569 is_large = abs(minval(mo_set%occupation_numbers)) > probe(1)%eps_hp
571 CALL cp_warn(__location__, &
572 "Hair-probes occupancy distribution includes the last MO => "// &
573 "Add more MOs for proper smearing.")
576 is_large = (abs(nelec -
accurate_sum(mo_set%occupation_numbers(:))) > probe(1)%eps_hp*nelec)
578 cpwarn(
"Total number of electrons is not accurate")
583 IF (.NOT.
PRESENT(smear))
THEN
585 mo_set%uniform_occupation = .true.
586 IF (
PRESENT(eval_deriv))
THEN
589 CALL timestop(handle)
595 IF ((abs(mo_set%eigenvalues(1)) < 1.0e-12_dp) .AND. &
596 (abs(mo_set%eigenvalues(nmo)) < 1.0e-12_dp))
THEN
597 CALL timestop(handle)
603 IF (smear%do_smear)
THEN
604 IF (
PRESENT(xas_env))
THEN
605 i_first = xas_estate + 1
606 nelec = xas_nelectron
609 IF (smear%fixed_mag_mom == -1.0_dp)
THEN
610 nelec = real(mo_set%nelectron,
dp)
612 nelec = mo_set%n_el_f
615 SELECT CASE (smear%method)
617 IF (.NOT.
PRESENT(eval_deriv))
THEN
618 CALL fermifixed(mo_set%occupation_numbers(1:mo_set%nmo), mo_set%mu, mo_set%kTS, &
619 mo_set%eigenvalues(1:mo_set%nmo), nelec, &
620 smear%electronic_temperature, mo_set%maxocc, xas_estate, occ_estate)
624 ALLOCATE (dfde(nmo, nmo))
626 lengthscale = 10*smear%electronic_temperature
628 CALL fermifixedderiv(dfde, mo_set%occupation_numbers(1:mo_set%nmo), mo_set%mu, &
629 mo_set%kTS, mo_set%eigenvalues(1:mo_set%nmo), nelec, &
630 smear%electronic_temperature, mo_set%maxocc, lengthscale, xas_estate, occ_estate)
633 eval_deriv = eval_deriv - mo_set%eigenvalues + mo_set%mu
635 eval_deriv = matmul(transpose(dfde), eval_deriv)
641 DO imo = i_first, nmo
642 IF (mo_set%occupation_numbers(imo) < mo_set%maxocc)
THEN
647 is_large = abs(maxval(mo_set%occupation_numbers) - mo_set%maxocc) > smear%eps_fermi_dirac
649 cpwarn_if(is_large,
"Fermi-Dirac smearing includes the first MO")
652 DO imo = nmo, mo_set%lfomo, -1
653 IF (mo_set%occupation_numbers(imo) > smear%eps_fermi_dirac)
THEN
658 is_large = abs(minval(mo_set%occupation_numbers)) > smear%eps_fermi_dirac
660 CALL cp_warn(__location__, &
661 "Fermi-Dirac smearing includes the last MO => "// &
662 "Add more MOs for proper smearing.")
665 is_large = (abs(nelec -
accurate_sum(mo_set%occupation_numbers(:))) > smear%eps_fermi_dirac*nelec)
666 cpwarn_if(is_large,
"Total number of electrons is not accurate")
670 cpassert(.NOT.
PRESENT(eval_deriv))
673 e1 = mo_set%eigenvalues(mo_set%homo) - 0.5_dp*smear%window_size
674 IF (e1 <= mo_set%eigenvalues(1))
THEN
675 cpwarn(
"Energy window for smearing includes the first MO")
678 e2 = mo_set%eigenvalues(mo_set%homo) + 0.5_dp*smear%window_size
679 IF (e2 >= mo_set%eigenvalues(nmo)) &
680 CALL cp_warn(__location__, &
681 "Energy window for smearing includes the last MO => "// &
682 "Add more MOs for proper smearing.")
685 DO imo = i_first, nomo
686 IF (mo_set%eigenvalues(imo) > e1)
THEN
693 DO imo = nmo, nomo, -1
694 IF (mo_set%eigenvalues(imo) < e2)
THEN
704 DO imo = mo_set%lfomo, mo_set%homo
705 nelec = nelec + mo_set%occupation_numbers(imo)
706 edist = edist + abs(e2 - mo_set%eigenvalues(imo))
710 DO imo = mo_set%lfomo, mo_set%homo
711 edelta = abs(e2 - mo_set%eigenvalues(imo))
712 mo_set%occupation_numbers(imo) = min(mo_set%maxocc, nelec*edelta/edist)
713 nelec = nelec - mo_set%occupation_numbers(imo)
714 edist = edist - edelta
718 equal_size =
SIZE(mo_set%occupation_numbers, 1) ==
SIZE(smear%list, 1)
720 mo_set%occupation_numbers = smear%list
722 IF (
PRESENT(eval_deriv))
THEN
731 IF (mo_set%lfomo == mo_set%homo)
THEN
733 mo_set%lfomo = nomo + 1
735 mo_set%uniform_occupation = .false.
743 CALL timestop(handle)
745 END SUBROUTINE set_mo_occupation_1
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
various routines to log and control the output. The idea is that decisions about where to log should ...
deal with the Fermi distribution, compute it, fix mu, get derivs
subroutine, public fermifixedderiv(dfde, f, mu, kts, e, n, t, maxocc, l, estate, festate)
returns f and dfde for a given set of energies and number of electrons it is a numerical derivative,...
subroutine, public fermifixed(f, mu, kts, e, n, t, maxocc, estate, festate)
returns occupations according to Fermi-Dirac statistics for a given set of energies and number of ele...
subroutine, public probe_occupancy(occ, fermi, kts, energies, coeff, maxocc, probe, n)
subroutine to calculate occupation number and 'Fermi' level using the
sums arrays of real/complex numbers with much reduced round-off as compared to a naive implementation...
Defines the basic variable types.
integer, parameter, public dp
Set occupation of molecular orbitals.
Definition and initialisation of the mo data type.
subroutine, public set_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, uniform_occupation, kts, mu, flexible_electron_count)
Set the components of a MO set data structure.
logical function, public has_uniform_occupation(mo_set, first_mo, last_mo, occupation, tolerance)
Check if the set of MOs in mo_set specifed by the MO index range [first_mo,last_mo] an integer occupa...
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
parameters that control an scf iteration
All kind of helpful little routines.
define create destroy get and put information in xas_env to calculate the x-ray absorption spectra
subroutine, public get_xas_env(xas_env, exc_state, nao, nvirtual, nvirtual2, centers_wfn, atom_of_state, exc_atoms, nexc_states, type_of_state, mykind_of_atom, mykind_of_kind, state_of_atom, spectrum, groundstate_coeff, ostrength_sm, dip_fm_set, excvec_coeff, excvec_overlap, unoccupied_orbs, unoccupied_evals, unoccupied_max_iter, unoccupied_eps, all_vectors, all_evals, my_gto_basis, qs_loc_env, stogto_overlap, occ_estate, xas_nelectron, xas_estate, nexc_atoms, nexc_search, spin_channel, scf_env, scf_control)
...
contains the parameters needed by a scf run