mirror of
https://github.com/cp2k/cp2k.git
synced 2026-07-28 14:15:19 -04:00
XAS: enable excitation for beta spin channel
svn-origin-rev: 18295
This commit is contained in:
parent
84796ecda6
commit
02ebe2af46
11 changed files with 274 additions and 119 deletions
|
|
@ -7571,7 +7571,7 @@ CONTAINS
|
|||
|
||||
CALL keyword_create(keyword, name="STATE_TYPE", &
|
||||
variants=(/"TYPE"/), &
|
||||
description="Type of the orbitas that are excited for the xas spectra calculation", &
|
||||
description="Type of the orbitals that are excited for the xas spectra calculation", &
|
||||
usage="STATE_TYPE 1S", &
|
||||
default_i_val=xas_1s_type, &
|
||||
enum_c_vals=s2a("1S", "2S", "2P"), &
|
||||
|
|
@ -7587,6 +7587,13 @@ CONTAINS
|
|||
CALL section_add_keyword(section, keyword)
|
||||
CALL keyword_release(keyword)
|
||||
|
||||
CALL keyword_create(keyword, name="SPIN_CHANNEL", &
|
||||
description="# Spin channel of the excited orbital", &
|
||||
usage="SPIN_CHANNEL 1", &
|
||||
default_i_val=1)
|
||||
CALL section_add_keyword(section, keyword)
|
||||
CALL keyword_release(keyword)
|
||||
|
||||
CALL keyword_create(keyword, name="ATOMS_LIST", &
|
||||
variants=(/"AT_LIST"/), &
|
||||
description="Indexes of the atoms to be excited. "// &
|
||||
|
|
|
|||
|
|
@ -205,7 +205,7 @@ CONTAINS
|
|||
CHARACTER(len=*), PARAMETER :: routineN = 'qs_loc_env_destroy', &
|
||||
routineP = moduleN//':'//routineN
|
||||
|
||||
INTEGER :: i, j
|
||||
INTEGER :: i, ii, j
|
||||
|
||||
CPASSERT(ASSOCIATED(qs_loc_env))
|
||||
|
||||
|
|
@ -220,7 +220,8 @@ CONTAINS
|
|||
|
||||
IF (ASSOCIATED(qs_loc_env%moloc_coeff)) THEN
|
||||
DO i = 1, SIZE(qs_loc_env%moloc_coeff, 1)
|
||||
CALL cp_fm_release(qs_loc_env%moloc_coeff(i)%matrix)
|
||||
ii = LBOUND(qs_loc_env%moloc_coeff, 1)+i-1
|
||||
CALL cp_fm_release(qs_loc_env%moloc_coeff(ii)%matrix)
|
||||
END DO
|
||||
DEALLOCATE (qs_loc_env%moloc_coeff)
|
||||
END IF
|
||||
|
|
|
|||
|
|
@ -462,9 +462,8 @@ CONTAINS
|
|||
routineP = moduleN//':'//routineN
|
||||
|
||||
INTEGER :: dim_op, handle, i, iatom, imo, imoloc, &
|
||||
ispin, j, l_spin, lb, my_nspins, nao, &
|
||||
naosub, natoms, nmo, nmosub, nspins, &
|
||||
s_spin, ub
|
||||
ispin, j, l_spin, lb, nao, naosub, &
|
||||
natoms, nmo, nmosub, nspins, s_spin, ub
|
||||
REAL(KIND=dp) :: my_occ, occ_imo
|
||||
REAL(KIND=dp), DIMENSION(:), POINTER :: occupations
|
||||
REAL(KIND=dp), DIMENSION(:, :), POINTER :: vecbuffer
|
||||
|
|
@ -489,13 +488,11 @@ CONTAINS
|
|||
nspins = SIZE(mos, 1)
|
||||
s_spin = 1
|
||||
l_spin = nspins
|
||||
my_nspins = nspins
|
||||
IF (PRESENT(myspin)) THEN
|
||||
s_spin = myspin
|
||||
l_spin = myspin
|
||||
my_nspins = 1
|
||||
END IF
|
||||
ALLOCATE (moloc_coeff(my_nspins))
|
||||
ALLOCATE (moloc_coeff(s_spin:l_spin))
|
||||
DO ispin = s_spin, l_spin
|
||||
NULLIFY (tmp_fm_struct, mo_coeff)
|
||||
CALL get_mo_set(mos(ispin)%mo_set, mo_coeff=mo_coeff, nao=nao, nmo=nmo)
|
||||
|
|
@ -1180,16 +1177,17 @@ CONTAINS
|
|||
!> \param do_homo ...
|
||||
!> \param do_xas ...
|
||||
!> \param nloc_xas ...
|
||||
!> \param spin_xas ...
|
||||
!> \par History
|
||||
!> 2009 created
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE qs_loc_control_init(qs_loc_env, loc_section, do_homo, do_xas, nloc_xas)
|
||||
SUBROUTINE qs_loc_control_init(qs_loc_env, loc_section, do_homo, do_xas, nloc_xas, spin_xas)
|
||||
|
||||
TYPE(qs_loc_env_new_type), POINTER :: qs_loc_env
|
||||
TYPE(section_vals_type), POINTER :: loc_section
|
||||
LOGICAL, INTENT(IN) :: do_homo
|
||||
LOGICAL, INTENT(IN), OPTIONAL :: do_xas
|
||||
INTEGER, INTENT(IN), OPTIONAL :: nloc_xas
|
||||
INTEGER, INTENT(IN), OPTIONAL :: nloc_xas, spin_xas
|
||||
|
||||
CHARACTER(len=*), PARAMETER :: routineN = 'qs_loc_control_init', &
|
||||
routineP = moduleN//':'//routineN
|
||||
|
|
@ -1204,7 +1202,7 @@ CONTAINS
|
|||
CALL get_qs_loc_env(qs_loc_env, localized_wfn_control=localized_wfn_control)
|
||||
localized_wfn_control%do_homo = do_homo
|
||||
CALL read_loc_section(localized_wfn_control, loc_section, &
|
||||
qs_loc_env%do_localize, do_xas, nloc_xas)
|
||||
qs_loc_env%do_localize, do_xas, nloc_xas, spin_xas)
|
||||
|
||||
END SUBROUTINE qs_loc_control_init
|
||||
|
||||
|
|
@ -1402,23 +1400,25 @@ CONTAINS
|
|||
!> \param localize ...
|
||||
!> \param do_xas ...
|
||||
!> \param nloc_xas ...
|
||||
!> \param spin_channel_xas ...
|
||||
!> \par History
|
||||
!> 05.2005 created [MI]
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE read_loc_section(localized_wfn_control, loc_section, &
|
||||
localize, do_xas, nloc_xas)
|
||||
localize, do_xas, nloc_xas, spin_channel_xas)
|
||||
|
||||
TYPE(localized_wfn_control_type), POINTER :: localized_wfn_control
|
||||
TYPE(section_vals_type), POINTER :: loc_section
|
||||
LOGICAL, INTENT(OUT) :: localize
|
||||
LOGICAL, INTENT(IN), OPTIONAL :: do_xas
|
||||
INTEGER, INTENT(IN), OPTIONAL :: nloc_xas
|
||||
INTEGER, INTENT(IN), OPTIONAL :: nloc_xas, spin_channel_xas
|
||||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'read_loc_section', &
|
||||
routineP = moduleN//':'//routineN
|
||||
|
||||
INTEGER :: i, ind, ir, n_list, n_rep, n_state, &
|
||||
nline, output_unit
|
||||
nline, other_spin, output_unit, &
|
||||
spin_xas
|
||||
INTEGER, DIMENSION(:), POINTER :: list, loc_list
|
||||
LOGICAL :: my_do_xas
|
||||
REAL(dp), POINTER :: ene(:)
|
||||
|
|
@ -1426,10 +1426,12 @@ CONTAINS
|
|||
TYPE(section_vals_type), POINTER :: loc_print_section
|
||||
|
||||
my_do_xas = .FALSE.
|
||||
spin_xas = 1
|
||||
IF (PRESENT(do_xas)) THEN
|
||||
my_do_xas = do_xas
|
||||
CPASSERT(PRESENT(nloc_xas))
|
||||
END IF
|
||||
IF (PRESENT(spin_channel_xas)) spin_xas = spin_channel_xas
|
||||
CPASSERT(ASSOCIATED(loc_section))
|
||||
NULLIFY (logger)
|
||||
logger => cp_get_default_logger()
|
||||
|
|
@ -1495,9 +1497,12 @@ CONTAINS
|
|||
localized_wfn_control%loc_states(:, 1) = loc_list(:)
|
||||
localized_wfn_control%loc_states(:, 2) = loc_list(:)
|
||||
localized_wfn_control%nloc_states(1) = n_list
|
||||
localized_wfn_control%nloc_states(2) = n_list
|
||||
IF (my_do_xas) THEN
|
||||
localized_wfn_control%nloc_states(2) = 0
|
||||
localized_wfn_control%loc_states(:, 2) = 0
|
||||
other_spin = 2
|
||||
IF (spin_xas == 2) other_spin = 1
|
||||
localized_wfn_control%nloc_states(other_spin) = 0
|
||||
localized_wfn_control%loc_states(:, other_spin) = 0
|
||||
END IF
|
||||
DEALLOCATE (loc_list)
|
||||
END IF
|
||||
|
|
@ -1544,12 +1549,12 @@ CONTAINS
|
|||
IF (localized_wfn_control%set_of_states == 0) THEN
|
||||
IF (my_do_xas) THEN
|
||||
localized_wfn_control%set_of_states = state_loc_range
|
||||
localized_wfn_control%nloc_states(1) = nloc_xas
|
||||
localized_wfn_control%lu_bound_states(1, 1) = 1
|
||||
localized_wfn_control%lu_bound_states(2, 1) = nloc_xas
|
||||
localized_wfn_control%nloc_states(2) = 0
|
||||
localized_wfn_control%lu_bound_states(1, 2) = 0
|
||||
localized_wfn_control%lu_bound_states(2, 2) = 0
|
||||
localized_wfn_control%nloc_states(:) = 0
|
||||
localized_wfn_control%lu_bound_states(1, :) = 0
|
||||
localized_wfn_control%lu_bound_states(2, :) = 0
|
||||
localized_wfn_control%nloc_states(spin_xas) = nloc_xas
|
||||
localized_wfn_control%lu_bound_states(1, spin_xas) = 1
|
||||
localized_wfn_control%lu_bound_states(2, spin_xas) = nloc_xas
|
||||
ELSE
|
||||
localized_wfn_control%set_of_states = state_loc_all
|
||||
END IF
|
||||
|
|
@ -1582,8 +1587,8 @@ CONTAINS
|
|||
CASE (state_loc_range)
|
||||
WRITE (UNIT=output_unit, FMT="(T2,A,T65,I8,A,I8)") &
|
||||
"LOCALIZE| Orbitals to be localized: Those with index between ", &
|
||||
localized_wfn_control%lu_bound_states(1, 1), " and ", &
|
||||
localized_wfn_control%lu_bound_states(2, 1)
|
||||
localized_wfn_control%lu_bound_states(1, spin_xas), " and ", &
|
||||
localized_wfn_control%lu_bound_states(2, spin_xas)
|
||||
CASE (state_loc_list)
|
||||
WRITE (UNIT=output_unit, FMT="(T2,A)") &
|
||||
"LOCALIZE| Orbitals to be localized: Those with index in the following list"
|
||||
|
|
@ -1691,14 +1696,16 @@ CONTAINS
|
|||
!> \param nmoloc ...
|
||||
!> \param nmo ...
|
||||
!> \param nspins ...
|
||||
!> \param my_spin ...
|
||||
!> \par History
|
||||
!> 04.2005 created [MI]
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE set_loc_wfn_lists(localized_wfn_control, nmoloc, nmo, nspins)
|
||||
SUBROUTINE set_loc_wfn_lists(localized_wfn_control, nmoloc, nmo, nspins, my_spin)
|
||||
|
||||
TYPE(localized_wfn_control_type) :: localized_wfn_control
|
||||
INTEGER, DIMENSION(2), INTENT(IN) :: nmoloc, nmo
|
||||
INTEGER, INTENT(IN) :: nspins
|
||||
INTEGER, INTENT(IN), OPTIONAL :: my_spin
|
||||
|
||||
CHARACTER(len=*), PARAMETER :: routineN = 'set_loc_wfn_lists', &
|
||||
routineP = moduleN//':'//routineN
|
||||
|
|
@ -1728,9 +1735,9 @@ CONTAINS
|
|||
localized_wfn_control%loc_states = 0
|
||||
DO ispin = 1, nspins
|
||||
localized_wfn_control%lu_bound_states(1, ispin) = &
|
||||
localized_wfn_control%lu_bound_states(1, 1)
|
||||
localized_wfn_control%lu_bound_states(1, my_spin)
|
||||
localized_wfn_control%lu_bound_states(2, ispin) = &
|
||||
localized_wfn_control%lu_bound_states(1, 1)+nmoloc(ispin)-1
|
||||
localized_wfn_control%lu_bound_states(1, my_spin)+nmoloc(ispin)-1
|
||||
max_iloc = localized_wfn_control%lu_bound_states(2, ispin)
|
||||
DO i = 1, nmoloc(ispin)
|
||||
localized_wfn_control%loc_states(i, ispin) = localized_wfn_control%lu_bound_states(1, ispin)+i-1
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ MODULE xas_control
|
|||
INTEGER :: ref_count
|
||||
INTEGER :: nexc_atoms
|
||||
INTEGER :: nexc_search
|
||||
INTEGER :: spin_channel
|
||||
INTEGER :: state_type
|
||||
INTEGER :: xas_method
|
||||
INTEGER :: dipole_form
|
||||
|
|
@ -109,6 +110,9 @@ CONTAINS
|
|||
CALL section_vals_val_get(xas_section, "STATE_SEARCH", &
|
||||
i_val=xas_control%nexc_search)
|
||||
|
||||
CALL section_vals_val_get(xas_section, "SPIN_CHANNEL", &
|
||||
i_val=xas_control%spin_channel)
|
||||
|
||||
CALL section_vals_val_get(xas_section, "XAS_CORE", &
|
||||
r_val=xas_control%xas_core_occupation)
|
||||
|
||||
|
|
@ -255,6 +259,7 @@ CONTAINS
|
|||
xas_control%ref_count = 1
|
||||
xas_control%xas_method = xas_tp_hh
|
||||
xas_control%nexc_atoms = 1
|
||||
xas_control%spin_channel = 1
|
||||
xas_control%nexc_search = -1
|
||||
xas_control%state_type = xas_1s_type
|
||||
xas_control%xas_restart = .FALSE.
|
||||
|
|
|
|||
|
|
@ -73,6 +73,7 @@ MODULE xas_env_types
|
|||
INTEGER :: iter_count
|
||||
INTEGER :: nao, exc_state, xas_estate
|
||||
INTEGER :: nexc_search, nexc_atoms
|
||||
INTEGER :: spin_channel
|
||||
INTEGER :: nvirtual, nvirtual2
|
||||
INTEGER :: unoccupied_max_iter
|
||||
INTEGER, DIMENSION(:), POINTER :: state_of_atom
|
||||
|
|
@ -139,6 +140,7 @@ CONTAINS
|
|||
!> \param xas_estate ...
|
||||
!> \param nexc_atoms ...
|
||||
!> \param nexc_search ...
|
||||
!> \param spin_channel ...
|
||||
!> \param scf_env ...
|
||||
!> \param scf_control ...
|
||||
! **************************************************************************************************
|
||||
|
|
@ -148,7 +150,8 @@ CONTAINS
|
|||
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, scf_env, scf_control)
|
||||
stogto_overlap, occ_estate, xas_nelectron, xas_estate, nexc_atoms, nexc_search, spin_channel, &
|
||||
scf_env, scf_control)
|
||||
|
||||
TYPE(xas_environment_type), POINTER :: xas_env
|
||||
INTEGER, INTENT(OUT), OPTIONAL :: iter_count, exc_state, nao, nvirtual, &
|
||||
|
|
@ -177,7 +180,8 @@ CONTAINS
|
|||
TYPE(cp_2d_r_p_type), DIMENSION(:), OPTIONAL, &
|
||||
POINTER :: stogto_overlap
|
||||
REAL(dp), INTENT(OUT), OPTIONAL :: occ_estate, xas_nelectron
|
||||
INTEGER, INTENT(OUT), OPTIONAL :: xas_estate, nexc_atoms, nexc_search
|
||||
INTEGER, INTENT(OUT), OPTIONAL :: xas_estate, nexc_atoms, nexc_search, &
|
||||
spin_channel
|
||||
TYPE(qs_scf_env_type), OPTIONAL, POINTER :: scf_env
|
||||
TYPE(scf_control_type), OPTIONAL, POINTER :: scf_control
|
||||
|
||||
|
|
@ -194,6 +198,7 @@ CONTAINS
|
|||
IF (PRESENT(occ_estate)) occ_estate = xas_env%occ_estate
|
||||
IF (PRESENT(xas_estate)) xas_estate = xas_env%xas_estate
|
||||
IF (PRESENT(nexc_search)) nexc_search = xas_env%nexc_search
|
||||
IF (PRESENT(spin_channel)) spin_channel = xas_env%spin_channel
|
||||
IF (PRESENT(nexc_atoms)) nexc_atoms = xas_env%nexc_atoms
|
||||
IF (PRESENT(unoccupied_eps)) unoccupied_eps = xas_env%unoccupied_eps
|
||||
IF (PRESENT(unoccupied_max_iter)) unoccupied_max_iter = xas_env%unoccupied_max_iter
|
||||
|
|
@ -226,6 +231,7 @@ CONTAINS
|
|||
!> \param xas_env ...
|
||||
!> \param iter_count ...
|
||||
!> \param nexc_search ...
|
||||
!> \param spin_channel ...
|
||||
!> \param nexc_atoms ...
|
||||
!> \param nvirtual ...
|
||||
!> \param nvirtual2 ...
|
||||
|
|
@ -238,13 +244,13 @@ CONTAINS
|
|||
!> \param scf_env ...
|
||||
!> \param scf_control ...
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE set_xas_env(xas_env, iter_count, nexc_search, nexc_atoms, &
|
||||
SUBROUTINE set_xas_env(xas_env, iter_count, nexc_search, spin_channel, nexc_atoms, &
|
||||
nvirtual, nvirtual2, ip_energy, occ_estate, qs_loc_env, &
|
||||
xas_estate, xas_nelectron, homo_occ, scf_env, scf_control)
|
||||
|
||||
TYPE(xas_environment_type), POINTER :: xas_env
|
||||
INTEGER, INTENT(IN), OPTIONAL :: iter_count, nexc_search, nexc_atoms, &
|
||||
nvirtual, nvirtual2
|
||||
INTEGER, INTENT(IN), OPTIONAL :: iter_count, nexc_search, spin_channel, &
|
||||
nexc_atoms, nvirtual, nvirtual2
|
||||
REAL(dp), INTENT(IN), OPTIONAL :: ip_energy, occ_estate
|
||||
TYPE(qs_loc_env_new_type), OPTIONAL, POINTER :: qs_loc_env
|
||||
INTEGER, INTENT(IN), OPTIONAL :: xas_estate
|
||||
|
|
@ -258,6 +264,7 @@ CONTAINS
|
|||
|
||||
IF (PRESENT(iter_count)) xas_env%iter_count = iter_count
|
||||
IF (PRESENT(nexc_search)) xas_env%nexc_search = nexc_search
|
||||
IF (PRESENT(spin_channel)) xas_env%spin_channel = spin_channel
|
||||
IF (PRESENT(nexc_atoms)) xas_env%nexc_atoms = nexc_atoms
|
||||
IF (PRESENT(nvirtual)) xas_env%nvirtual = nvirtual
|
||||
IF (PRESENT(nvirtual2)) xas_env%nvirtual2 = nvirtual2
|
||||
|
|
|
|||
|
|
@ -153,8 +153,8 @@ CONTAINS
|
|||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'xas', routineP = moduleN//':'//routineN
|
||||
|
||||
INTEGER :: handle, homo, i, iat, iatom, ispin, my_homo(2), my_nelectron(2), nao, nexc_atoms, &
|
||||
nexc_search, nmo, nspins, output_unit, state_to_be_excited
|
||||
INTEGER :: handle, homo, i, iat, iatom, ispin, my_homo(2), my_nelectron(2), my_spin, nao, &
|
||||
nexc_atoms, nexc_search, nmo, nspins, output_unit, state_to_be_excited
|
||||
INTEGER, DIMENSION(2) :: added_mos
|
||||
INTEGER, DIMENSION(:), POINTER :: state_of_atom
|
||||
LOGICAL :: ch_method_flags, converged, my_uocc(2), &
|
||||
|
|
@ -279,15 +279,16 @@ CONTAINS
|
|||
CPABORT("XAS with TP method requires LSD calculations")
|
||||
END IF
|
||||
|
||||
! Set of states among which there is the state to be excited
|
||||
CALL get_mo_set(mos(1)%mo_set, nao=nao, homo=homo)
|
||||
IF (xas_control%nexc_search < 0) xas_control%nexc_search = homo
|
||||
nexc_search = xas_control%nexc_search
|
||||
|
||||
CALL get_xas_env(xas_env=xas_env, &
|
||||
state_of_atom=state_of_atom, all_vectors=all_vectors, &
|
||||
groundstate_coeff=groundstate_coeff, excvec_coeff=excvec_coeff, &
|
||||
nexc_atoms=nexc_atoms, occ_estate=occ_estate, xas_nelectron=xas_nelectron)
|
||||
nexc_atoms=nexc_atoms, occ_estate=occ_estate, xas_nelectron=xas_nelectron, &
|
||||
spin_channel=my_spin)
|
||||
|
||||
! Set of states among which there is the state to be excited
|
||||
CALL get_mo_set(mos(my_spin)%mo_set, nao=nao, homo=homo)
|
||||
IF (xas_control%nexc_search < 0) xas_control%nexc_search = homo
|
||||
nexc_search = xas_control%nexc_search
|
||||
|
||||
CALL set_xas_env(xas_env=xas_env, nexc_search=nexc_search)
|
||||
|
||||
|
|
@ -295,20 +296,20 @@ CONTAINS
|
|||
CALL get_xas_env(xas_env=xas_env, qs_loc_env=qs_loc_env)
|
||||
IF (qs_loc_env%do_localize) THEN
|
||||
IF (output_unit > 0) THEN
|
||||
WRITE (UNIT=output_unit, FMT="(/,T10,A,/)") &
|
||||
"Localize a sub-set of MOs with spin alpha,"// &
|
||||
WRITE (UNIT=output_unit, FMT="(/,T2,A34,I3,A36/)") &
|
||||
"Localize a sub-set of MOs of spin ", my_spin, ","// &
|
||||
" to better identify the core states"
|
||||
IF ( &
|
||||
qs_loc_env%localized_wfn_control%set_of_states == state_loc_range) THEN
|
||||
WRITE (UNIT=output_unit, FMT="( A , I7, A, I7)") " The sub-set contains states from ", &
|
||||
qs_loc_env%localized_wfn_control%lu_bound_states(1, 1), " to ", &
|
||||
qs_loc_env%localized_wfn_control%lu_bound_states(2, 1)
|
||||
qs_loc_env%localized_wfn_control%lu_bound_states(1, my_spin), " to ", &
|
||||
qs_loc_env%localized_wfn_control%lu_bound_states(2, my_spin)
|
||||
ELSEIF (qs_loc_env%localized_wfn_control%set_of_states == state_loc_list) THEN
|
||||
WRITE (UNIT=output_unit, FMT="( A )") " The sub-set contains states given in the input list"
|
||||
END IF
|
||||
|
||||
END IF
|
||||
CALL qs_loc_driver(qs_env, qs_loc_env, print_loc_section, myspin=1)
|
||||
CALL qs_loc_driver(qs_env, qs_loc_env, print_loc_section, myspin=my_spin)
|
||||
END IF
|
||||
|
||||
CPASSERT(ASSOCIATED(groundstate_coeff))
|
||||
|
|
@ -382,7 +383,7 @@ CONTAINS
|
|||
qs_env)
|
||||
|
||||
IF (skip_scf) THEN
|
||||
CALL get_mo_set(mos(1)%mo_set, mo_coeff=mo_coeff)
|
||||
CALL get_mo_set(mos(my_spin)%mo_set, mo_coeff=mo_coeff)
|
||||
CALL cp_fm_to_fm(mo_coeff, all_vectors, ncol=nexc_search, &
|
||||
source_start=1, target_start=1)
|
||||
END IF
|
||||
|
|
@ -411,7 +412,7 @@ CONTAINS
|
|||
state_to_be_excited = state_of_atom(iat)
|
||||
|
||||
! Take the state_to_be_excited vector from the full set and copy into excvec_coeff
|
||||
CALL get_mo_set(mos(1)%mo_set, nmo=nmo)
|
||||
CALL get_mo_set(mos(my_spin)%mo_set, nmo=nmo)
|
||||
CALL get_xas_env(xas_env, occ_estate=occ_estate, xas_nelectron=xas_nelectron)
|
||||
tmp = xas_nelectron+1.0_dp-occ_estate
|
||||
IF (nmo < tmp) &
|
||||
|
|
@ -427,7 +428,7 @@ CONTAINS
|
|||
END IF
|
||||
|
||||
CALL set_xas_env(xas_env=xas_env, xas_estate=state_to_be_excited)
|
||||
CALL get_mo_set(mos(1)%mo_set, mo_coeff=mo_coeff)
|
||||
CALL get_mo_set(mos(my_spin)%mo_set, mo_coeff=mo_coeff)
|
||||
CPASSERT(ASSOCIATED(excvec_coeff))
|
||||
CALL cp_fm_get_submatrix(mo_coeff, vecbuffer, 1, state_to_be_excited, &
|
||||
nao, 1, transpose=.TRUE.)
|
||||
|
|
@ -447,8 +448,8 @@ CONTAINS
|
|||
"Start Core Level Spectroscopy Calculation with TP approach for ATOM ", iatom
|
||||
WRITE (UNIT=output_unit, FMT='(T10,A,T50,f10.4)') "Occupation of the core orbital", &
|
||||
occ_estate
|
||||
WRITE (UNIT=output_unit, FMT='(T10,A,T50,f10.4)') "Number of electrons in Spin 1", &
|
||||
xas_nelectron
|
||||
WRITE (UNIT=output_unit, FMT='(T10,A28,I3, T50,F10.4)') "Number of electrons in Spin ", &
|
||||
my_spin, xas_nelectron
|
||||
END IF
|
||||
END IF
|
||||
|
||||
|
|
@ -578,9 +579,9 @@ CONTAINS
|
|||
CHARACTER(len=*), PARAMETER :: routineN = 'xas_env_init', routineP = moduleN//':'//routineN
|
||||
|
||||
CHARACTER(LEN=default_string_length) :: name_sto
|
||||
INTEGER :: homo, i, iat, iatom, ik, ikind, ispin, j, l, lfomo, n_mo(2), n_rep, nao, natom, &
|
||||
ncubes, nelectron, nexc_atoms, nexc_search, nj, nk, nkind, nmo, nmoloc(2), norb(0:3), &
|
||||
nsgf_gto, nsgf_sto, nspins, nvirtual, nvirtual2
|
||||
INTEGER :: homo, i, iat, iatom, ik, ikind, ispin, j, l, lfomo, my_spin, n_mo(2), n_rep, nao, &
|
||||
natom, ncubes, nelectron, nexc_atoms, nexc_search, nj, nk, nkind, nmo, nmoloc(2), &
|
||||
norb(0:3), nsgf_gto, nsgf_sto, nspins, nvirtual, nvirtual2
|
||||
INTEGER, ALLOCATABLE, DIMENSION(:) :: first_sgf, kind_type_tmp, kind_z_tmp, &
|
||||
last_sgf
|
||||
INTEGER, DIMENSION(4, 7) :: ne
|
||||
|
|
@ -638,22 +639,23 @@ CONTAINS
|
|||
CALL scf_c_release(scf_control)
|
||||
CALL get_xas_env(xas_env, scf_control=scf_control)
|
||||
|
||||
my_spin = xas_control%spin_channel
|
||||
nexc_search = xas_control%nexc_search
|
||||
IF (nexc_search < 0) THEN
|
||||
! ground state occupation
|
||||
CALL get_mo_set(mos(1)%mo_set, nmo=nmo, lfomo=lfomo)
|
||||
CALL get_mo_set(mos(my_spin)%mo_set, nmo=nmo, lfomo=lfomo)
|
||||
nexc_search = lfomo-1
|
||||
END IF
|
||||
nexc_atoms = xas_control%nexc_atoms
|
||||
ALLOCATE (xas_env%exc_atoms(nexc_atoms))
|
||||
xas_env%exc_atoms = xas_control%exc_atoms
|
||||
CALL set_xas_env(xas_env=xas_env, nexc_search=nexc_search, &
|
||||
nexc_atoms=nexc_atoms)
|
||||
nexc_atoms=nexc_atoms, spin_channel=my_spin)
|
||||
|
||||
CALL mpools_get(mpools, ao_mo_fm_pools=xas_env%ao_mo_fm_pools)
|
||||
|
||||
NULLIFY (mo_coeff)
|
||||
CALL get_mo_set(mos(1)%mo_set, nao=nao, homo=homo, nmo=nmo, mo_coeff=mo_coeff, nelectron=nelectron)
|
||||
CALL get_mo_set(mos(my_spin)%mo_set, nao=nao, homo=homo, nmo=nmo, mo_coeff=mo_coeff, nelectron=nelectron)
|
||||
|
||||
nvirtual2 = 0
|
||||
IF (xas_control%added_mos .GT. 0) THEN
|
||||
|
|
@ -874,15 +876,15 @@ CONTAINS
|
|||
CALL get_xas_env(xas_env=xas_env, qs_loc_env=qs_loc_env)
|
||||
loc_section => section_vals_get_subs_vals(xas_section, "LOCALIZE")
|
||||
CALL qs_loc_control_init(qs_loc_env, loc_section, do_homo=.TRUE., &
|
||||
do_xas=.TRUE., nloc_xas=nexc_search)
|
||||
do_xas=.TRUE., nloc_xas=nexc_search, spin_xas=my_spin)
|
||||
IF (.NOT. qs_loc_env%do_localize) THEN
|
||||
qs_loc_env%localized_wfn_control%localization_method = do_loc_none
|
||||
ELSE
|
||||
nmoloc = qs_loc_env%localized_wfn_control%nloc_states
|
||||
CALL set_loc_wfn_lists(qs_loc_env%localized_wfn_control, nmoloc, n_mo, nspins)
|
||||
CALL set_loc_wfn_lists(qs_loc_env%localized_wfn_control, nmoloc, n_mo, nspins, my_spin)
|
||||
CALL set_loc_centers(qs_loc_env%localized_wfn_control, nmoloc, nspins)
|
||||
CALL qs_loc_env_init(qs_loc_env, qs_loc_env%localized_wfn_control, &
|
||||
qs_env, myspin=1, do_localize=qs_loc_env%do_localize)
|
||||
qs_env, myspin=my_spin, do_localize=qs_loc_env%do_localize)
|
||||
END IF
|
||||
END IF
|
||||
|
||||
|
|
@ -1003,8 +1005,8 @@ CONTAINS
|
|||
CHARACTER(LEN=*), PARAMETER :: routineN = 'cls_calculate_spectrum', &
|
||||
routineP = moduleN//':'//routineN
|
||||
|
||||
INTEGER :: homo, i, lfomo, nabs, nmo, nvirtual, &
|
||||
output_unit, xas_estate
|
||||
INTEGER :: homo, i, lfomo, my_spin, nabs, nmo, &
|
||||
nvirtual, output_unit, xas_estate
|
||||
LOGICAL :: append_cube, length
|
||||
REAL(dp) :: rc(3)
|
||||
REAL(dp), DIMENSION(:), POINTER :: all_evals
|
||||
|
|
@ -1028,10 +1030,10 @@ CONTAINS
|
|||
CALL get_qs_env(qs_env=qs_env, &
|
||||
mos=mos, particle_set=particle_set)
|
||||
|
||||
CALL get_mo_set(mos(1)%mo_set, homo=homo, lfomo=lfomo, nmo=nmo)
|
||||
CALL get_xas_env(xas_env=xas_env, all_vectors=all_vectors, xas_estate=xas_estate, &
|
||||
all_evals=all_evals, dip_fm_set=dip_fm_set, excvec_coeff=excvec_coeff, &
|
||||
ostrength_sm=ostrength_sm, nvirtual=nvirtual)
|
||||
ostrength_sm=ostrength_sm, nvirtual=nvirtual, spin_channel=my_spin)
|
||||
CALL get_mo_set(mos(my_spin)%mo_set, homo=homo, lfomo=lfomo, nmo=nmo)
|
||||
|
||||
nabs = nvirtual-lfomo+1
|
||||
ALLOCATE (sp_em(6, homo))
|
||||
|
|
@ -1049,7 +1051,7 @@ CONTAINS
|
|||
CALL rRc_xyz_ao(op_sm, qs_env, rc, order=1, minimum_image=.TRUE.)
|
||||
CALL spectrum_dip_vel(dip_fm_set, op_sm, mos, excvec_coeff, &
|
||||
all_vectors, all_evals, &
|
||||
sp_em, sp_ab, xas_estate, nvirtual)
|
||||
sp_em, sp_ab, xas_estate, nvirtual, my_spin)
|
||||
DO i = 1, SIZE(ostrength_sm, 1)
|
||||
CALL dbcsr_set(ostrength_sm(i)%matrix, 0.0_dp)
|
||||
END DO
|
||||
|
|
@ -1060,11 +1062,11 @@ CONTAINS
|
|||
END DO
|
||||
CALL spectrum_dip_vel(dip_fm_set, op_sm, mos, excvec_coeff, &
|
||||
all_vectors, all_evals, &
|
||||
sp_em, sp_ab, xas_estate, nvirtual)
|
||||
sp_em, sp_ab, xas_estate, nvirtual, my_spin)
|
||||
END IF
|
||||
END IF
|
||||
|
||||
CALL get_mo_set(mos(1)%mo_set, lfomo=lfomo)
|
||||
CALL get_mo_set(mos(my_spin)%mo_set, lfomo=lfomo)
|
||||
! writw thw spectrum, if the file exists it is appended
|
||||
IF (.NOT. xas_control%xas_method == xas_dscf) THEN
|
||||
length = (.NOT. xas_control%dipole_form == xas_dip_vel)
|
||||
|
|
@ -1198,7 +1200,7 @@ CONTAINS
|
|||
routineP = moduleN//':'//routineN
|
||||
|
||||
CHARACTER(LEN=default_string_length) :: my_mittle, my_pos
|
||||
INTEGER :: homo, istate0, nspins, nstates
|
||||
INTEGER :: homo, istate0, my_spin, nspins, nstates
|
||||
REAL(dp), DIMENSION(:, :), POINTER :: centers
|
||||
TYPE(section_vals_type), POINTER :: print_key
|
||||
|
||||
|
|
@ -1214,8 +1216,9 @@ CONTAINS
|
|||
ALLOCATE (centers(6, nstates))
|
||||
centers = 0.0_dp
|
||||
END IF
|
||||
my_spin = xas_control%spin_channel
|
||||
|
||||
CALL get_mo_set(mos(1)%mo_set, homo=homo)
|
||||
CALL get_mo_set(mos(my_spin)%mo_set, homo=homo)
|
||||
istate0 = 0
|
||||
|
||||
my_pos = "REWIND"
|
||||
|
|
@ -1288,12 +1291,13 @@ CONTAINS
|
|||
!> \param sp_ab ...
|
||||
!> \param estate index of the excited state
|
||||
!> \param nstate ...
|
||||
!> \param my_spin ...
|
||||
!> \par History
|
||||
!> 06.2005 created [MI]
|
||||
!> \author MI
|
||||
! **************************************************************************************************
|
||||
SUBROUTINE spectrum_dip_vel(fm_set, op_sm, mos, excvec, &
|
||||
all_vectors, all_evals, sp_em, sp_ab, estate, nstate)
|
||||
all_vectors, all_evals, sp_em, sp_ab, estate, nstate, my_spin)
|
||||
|
||||
TYPE(cp_fm_p_type), DIMENSION(:, :), POINTER :: fm_set
|
||||
TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: op_sm
|
||||
|
|
@ -1301,7 +1305,7 @@ CONTAINS
|
|||
TYPE(cp_fm_type), POINTER :: excvec, all_vectors
|
||||
REAL(dp), DIMENSION(:), POINTER :: all_evals
|
||||
REAL(dp), DIMENSION(:, :), POINTER :: sp_em, sp_ab
|
||||
INTEGER, INTENT(IN) :: estate, nstate
|
||||
INTEGER, INTENT(IN) :: estate, nstate, my_spin
|
||||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'spectrum_dip_vel', &
|
||||
routineP = moduleN//':'//routineN
|
||||
|
|
@ -1315,17 +1319,17 @@ CONTAINS
|
|||
CPASSERT(ASSOCIATED(mos))
|
||||
NULLIFY (eigenvalues, occupation_numbers, fm_work)
|
||||
|
||||
CALL get_mo_set(mos(1)%mo_set, eigenvalues=eigenvalues, occupation_numbers=occupation_numbers, &
|
||||
CALL get_mo_set(mos(my_spin)%mo_set, eigenvalues=eigenvalues, occupation_numbers=occupation_numbers, &
|
||||
nao=nao, nmo=nmo, homo=homo, lfomo=lfomo)
|
||||
|
||||
CALL cp_fm_create(fm_work, all_vectors%matrix_struct)
|
||||
DO i = 1, SIZE(fm_set, 2)
|
||||
CPASSERT(ASSOCIATED(fm_set(1, i)%matrix))
|
||||
CALL cp_fm_set_all(fm_set(1, i)%matrix, 0.0_dp)
|
||||
CPASSERT(ASSOCIATED(fm_set(my_spin, i)%matrix))
|
||||
CALL cp_fm_set_all(fm_set(my_spin, i)%matrix, 0.0_dp)
|
||||
CALL cp_fm_set_all(fm_work, 0.0_dp)
|
||||
CALL cp_dbcsr_sm_fm_multiply(op_sm(i)%matrix, all_vectors, fm_work, ncol=nstate)
|
||||
CALL cp_gemm("T", "N", 1, nstate, nao, 1.0_dp, excvec, &
|
||||
fm_work, 0.0_dp, fm_set(1, i)%matrix, b_first_col=1)
|
||||
fm_work, 0.0_dp, fm_set(my_spin, i)%matrix, b_first_col=1)
|
||||
END DO
|
||||
CALL cp_fm_release(fm_work)
|
||||
|
||||
|
|
@ -1335,9 +1339,8 @@ CONTAINS
|
|||
|
||||
DO istate = 1, nstate
|
||||
ene_f = all_evals(istate)
|
||||
|
||||
DO i = 1, 3
|
||||
CALL cp_fm_get_element(fm_set(1, i)%matrix, 1, istate, dip(i))
|
||||
CALL cp_fm_get_element(fm_set(my_spin, i)%matrix, 1, istate, dip(i))
|
||||
END DO
|
||||
IF (istate <= homo) THEN
|
||||
sp_em(1, istate) = ene_f-ene_i
|
||||
|
|
@ -1464,8 +1467,9 @@ CONTAINS
|
|||
routineP = moduleN//':'//routineN
|
||||
|
||||
INTEGER :: homo, i, iat, iatom, ikind, isgf, &
|
||||
istate, j, my_kind, nao, natom, &
|
||||
nexc_atoms, nexc_search, output_unit
|
||||
istate, j, my_kind, my_spin, nao, &
|
||||
natom, nexc_atoms, nexc_search, &
|
||||
output_unit
|
||||
INTEGER, ALLOCATABLE, DIMENSION(:) :: first_sgf
|
||||
INTEGER, DIMENSION(3) :: perd0
|
||||
INTEGER, DIMENSION(:), POINTER :: atom_of_state, mykind_of_kind, &
|
||||
|
|
@ -1502,13 +1506,14 @@ CONTAINS
|
|||
perd0(1:3) = cell%perd(1:3)
|
||||
cell%perd(1:3) = 1
|
||||
|
||||
CALL get_mo_set(mos(1)%mo_set, mo_coeff=mo_coeff, maxocc=maxocc, nao=nao, homo=homo)
|
||||
|
||||
CALL get_xas_env(xas_env=xas_env, &
|
||||
centers_wfn=centers_wfn, atom_of_state=atom_of_state, &
|
||||
mykind_of_kind=mykind_of_kind, &
|
||||
type_of_state=type_of_state, state_of_atom=state_of_atom, &
|
||||
stogto_overlap=stogto_overlap, nexc_atoms=nexc_atoms, nexc_search=nexc_search)
|
||||
stogto_overlap=stogto_overlap, nexc_atoms=nexc_atoms, &
|
||||
spin_channel=my_spin, nexc_search=nexc_search)
|
||||
|
||||
CALL get_mo_set(mos(my_spin)%mo_set, mo_coeff=mo_coeff, maxocc=maxocc, nao=nao, homo=homo)
|
||||
|
||||
! scratch array for the state
|
||||
ALLOCATE (vecbuffer(1, nao))
|
||||
|
|
@ -1524,9 +1529,9 @@ CONTAINS
|
|||
atom_of_state = 0
|
||||
|
||||
DO istate = 1, nexc_search
|
||||
centers_wfn(1, istate) = localized_wfn_control%centers_set(1)%array(1, istate)
|
||||
centers_wfn(2, istate) = localized_wfn_control%centers_set(1)%array(2, istate)
|
||||
centers_wfn(3, istate) = localized_wfn_control%centers_set(1)%array(3, istate)
|
||||
centers_wfn(1, istate) = localized_wfn_control%centers_set(my_spin)%array(1, istate)
|
||||
centers_wfn(2, istate) = localized_wfn_control%centers_set(my_spin)%array(2, istate)
|
||||
centers_wfn(3, istate) = localized_wfn_control%centers_set(my_spin)%array(3, istate)
|
||||
|
||||
! Assign the state to the closest atom
|
||||
distmin = 100.0_dp
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@ CONTAINS
|
|||
routineP = moduleN//':'//routineN
|
||||
|
||||
CHARACTER(LEN=default_path_length) :: filename
|
||||
INTEGER :: group, handle, i, ia, ie, ispin, nao, nao_read, nelectron, nexc_atoms, &
|
||||
INTEGER :: group, handle, i, ia, ie, ispin, my_spin, nao, nao_read, nelectron, nexc_atoms, &
|
||||
nexc_atoms_read, nexc_search, nexc_search_read, nmo, nmo_read, output_unit, rst_unit, &
|
||||
source, xas_estate, xas_estate_read, xas_method_read
|
||||
LOGICAL :: file_exists
|
||||
|
|
@ -168,7 +168,8 @@ CONTAINS
|
|||
CALL mp_bcast(file_exists, source, group)
|
||||
|
||||
CALL get_xas_env(xas_env=xas_env, occ_estate=occ_estate, xas_estate=xas_estate, &
|
||||
xas_nelectron=xas_nelectron, nexc_search=nexc_search, nexc_atoms=nexc_atoms)
|
||||
xas_nelectron=xas_nelectron, nexc_search=nexc_search, &
|
||||
nexc_atoms=nexc_atoms, spin_channel=my_spin)
|
||||
|
||||
IF (file_exists) THEN
|
||||
CALL get_qs_env(qs_env=qs_env, mos=mos, matrix_s=matrix_s)
|
||||
|
|
@ -190,7 +191,7 @@ CONTAINS
|
|||
CALL set_xas_env(xas_env=xas_env, xas_estate=xas_estate_read)
|
||||
estate = xas_estate_read
|
||||
|
||||
CALL get_mo_set(mo_set=mos(1)%mo_set, nao=nao)
|
||||
CALL get_mo_set(mo_set=mos(my_spin)%mo_set, nao=nao)
|
||||
ALLOCATE (vecbuffer(1, nao))
|
||||
|
||||
DO ispin = 1, SIZE(mos)
|
||||
|
|
@ -370,7 +371,7 @@ CONTAINS
|
|||
CHARACTER(LEN=*), PARAMETER :: routineN = 'xas_initialize_rho', &
|
||||
routineP = moduleN//':'//routineN
|
||||
|
||||
INTEGER :: handle, ispin, nelectron
|
||||
INTEGER :: handle, ispin, my_spin, nelectron
|
||||
TYPE(cp_para_env_type), POINTER :: para_env
|
||||
TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao
|
||||
TYPE(mo_set_p_type), DIMENSION(:), POINTER :: mos
|
||||
|
|
@ -388,9 +389,10 @@ CONTAINS
|
|||
xas_env=xas_env, &
|
||||
para_env=para_env)
|
||||
|
||||
my_spin = xas_env%spin_channel
|
||||
CALL qs_rho_get(rho, rho_ao=rho_ao)
|
||||
DO ispin = 1, SIZE(mos)
|
||||
IF (ispin == 1) THEN
|
||||
IF (ispin == my_spin) THEN
|
||||
IF (xas_env%homo_occ == 0) THEN
|
||||
CALL get_mo_set(mos(ispin)%mo_set, nelectron=nelectron)
|
||||
nelectron = nelectron-1
|
||||
|
|
@ -437,7 +439,7 @@ CONTAINS
|
|||
CHARACTER(LEN=*), PARAMETER :: routineN = 'find_excited_core_orbital', &
|
||||
routineP = moduleN//':'//routineN
|
||||
|
||||
INTEGER :: i, ic_max, ir_max, m, n, nao, &
|
||||
INTEGER :: i, ic_max, ir_max, m, my_spin, n, nao, &
|
||||
nexc_search, nmo, xas_estate
|
||||
INTEGER, DIMENSION(:), POINTER :: col_indices
|
||||
REAL(dp) :: a_max, b_max, ip_energy, occ_estate
|
||||
|
|
@ -450,10 +452,10 @@ CONTAINS
|
|||
! Some elements from the xas_env
|
||||
CALL get_xas_env(xas_env=xas_env, excvec_coeff=excvec_coeff, &
|
||||
excvec_overlap=excvec_overlap, nexc_search=nexc_search, &
|
||||
xas_estate=xas_estate, occ_estate=occ_estate)
|
||||
xas_estate=xas_estate, occ_estate=occ_estate, spin_channel=my_spin)
|
||||
CPASSERT(ASSOCIATED(excvec_overlap))
|
||||
|
||||
CALL get_mo_set(mos(1)%mo_set, mo_coeff=mo_coeff, nao=nao, nmo=nmo, &
|
||||
CALL get_mo_set(mos(my_spin)%mo_set, mo_coeff=mo_coeff, nao=nao, nmo=nmo, &
|
||||
eigenvalues=eigenvalues, occupation_numbers=occupation_numbers)
|
||||
ALLOCATE (vecbuffer(1, nao))
|
||||
vecbuffer = 0.0_dp
|
||||
|
|
|
|||
|
|
@ -142,8 +142,9 @@ CONTAINS
|
|||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'xas_do_tp_scf', routineP = moduleN//':'//routineN
|
||||
|
||||
INTEGER :: handle, handle2, ispin, iter_count, &
|
||||
nspin, output_unit
|
||||
INTEGER :: handle, handle2, hole_spin, ispin, &
|
||||
iter_count, my_spin, nspin, occ_spin, &
|
||||
output_unit
|
||||
LOGICAL :: diis_step, energy_only, exit_loop, gapw
|
||||
REAL(KIND=dp) :: t1, t2
|
||||
TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
|
||||
|
|
@ -181,7 +182,7 @@ CONTAINS
|
|||
qs_charges=qs_charges, &
|
||||
ks_env=ks_env, para_env=para_env)
|
||||
|
||||
CALL get_xas_env(xas_env, scf_control=scf_control)
|
||||
CALL get_xas_env(xas_env, scf_control=scf_control, spin_channel=my_spin)
|
||||
|
||||
energy_only = .FALSE.
|
||||
output_unit = cp_print_key_unit_nr(logger, xas_section, "PRINT%PROGRAM_RUN_INFO", &
|
||||
|
|
@ -239,10 +240,18 @@ CONTAINS
|
|||
matrix_s, scf_control, scf_section, &
|
||||
diis_step)
|
||||
CALL find_excited_core_orbital(xas_env, mos, matrix_s)
|
||||
CALL set_mo_occupation(mo_set=mos(1)%mo_set, &
|
||||
! set occupation for the respective spin channels
|
||||
IF (my_spin == 1) THEN
|
||||
hole_spin = 1 ! hole is generated in channel 1
|
||||
occ_spin = 2
|
||||
ELSE
|
||||
hole_spin = 2
|
||||
occ_spin = 1
|
||||
ENDIF
|
||||
CALL set_mo_occupation(mo_set=mos(hole_spin)%mo_set, &
|
||||
smear=scf_control%smear, &
|
||||
xas_env=xas_env)
|
||||
CALL set_mo_occupation(mo_set=mos(2)%mo_set, &
|
||||
CALL set_mo_occupation(mo_set=mos(occ_spin)%mo_set, &
|
||||
smear=scf_control%smear)
|
||||
DO ispin = 1, nspin
|
||||
! does not yet handle k-points
|
||||
|
|
@ -389,10 +398,8 @@ CONTAINS
|
|||
CHARACTER(LEN=*), PARAMETER :: routineN = 'cls_prepare_states', &
|
||||
routineP = moduleN//':'//routineN
|
||||
|
||||
INTEGER :: handle, i, ikind, isgf, ispin, istate, &
|
||||
j, my_kind, my_state, nao, natom, &
|
||||
nexc_search, nmo, nvirtual2, uno_iter, &
|
||||
xas_estate
|
||||
INTEGER :: handle, i, ikind, isgf, ispin, istate, j, my_kind, my_spin, my_state, nao, natom, &
|
||||
nexc_search, nmo, nvirtual2, uno_iter, xas_estate
|
||||
INTEGER, ALLOCATABLE, DIMENSION(:) :: first_sgf
|
||||
INTEGER, DIMENSION(:), POINTER :: mykind_of_kind
|
||||
REAL(dp), DIMENSION(:, :), POINTER :: centers_wfn
|
||||
|
|
@ -446,10 +453,11 @@ CONTAINS
|
|||
all_vectors=all_vectors, all_evals=all_evals, &
|
||||
excvec_coeff=excvec_coeff, &
|
||||
nvirtual2=nvirtual2, xas_estate=xas_estate, &
|
||||
excvec_overlap=excvec_overlap, nexc_search=nexc_search, scf_control=scf_control)
|
||||
excvec_overlap=excvec_overlap, nexc_search=nexc_search, &
|
||||
spin_channel=my_spin, scf_control=scf_control)
|
||||
CPASSERT(ASSOCIATED(excvec_overlap))
|
||||
|
||||
CALL get_mo_set(mos(1)%mo_set, mo_coeff=mo_coeff, nao=nao, &
|
||||
CALL get_mo_set(mos(my_spin)%mo_set, mo_coeff=mo_coeff, nao=nao, &
|
||||
eigenvalues=eigenvalues)
|
||||
|
||||
ALLOCATE (vecbuffer(1, nao))
|
||||
|
|
@ -502,9 +510,9 @@ CONTAINS
|
|||
!Search for the core state to be excited
|
||||
max_overlap = 0.0_dp
|
||||
DO istate = 1, nexc_search
|
||||
centers_wfn(1, istate) = localized_wfn_control%centers_set(1)%array(1, istate)
|
||||
centers_wfn(2, istate) = localized_wfn_control%centers_set(1)%array(2, istate)
|
||||
centers_wfn(3, istate) = localized_wfn_control%centers_set(1)%array(3, istate)
|
||||
centers_wfn(1, istate) = localized_wfn_control%centers_set(my_spin)%array(1, istate)
|
||||
centers_wfn(2, istate) = localized_wfn_control%centers_set(my_spin)%array(2, istate)
|
||||
centers_wfn(3, istate) = localized_wfn_control%centers_set(my_spin)%array(3, istate)
|
||||
|
||||
rc(1:3) = centers_wfn(1:3, istate)
|
||||
rac = pbc(ra, rc, cell)
|
||||
|
|
@ -531,7 +539,7 @@ CONTAINS
|
|||
xas_estate = my_state
|
||||
END DO ! istate
|
||||
|
||||
CALL get_mo_set(mos(1)%mo_set, mo_coeff=mo_coeff)
|
||||
CALL get_mo_set(mos(my_spin)%mo_set, mo_coeff=mo_coeff)
|
||||
CALL cp_fm_get_submatrix(mo_coeff, vecbuffer, 1, xas_estate, &
|
||||
nao, 1, transpose=.TRUE.)
|
||||
CALL cp_fm_set_submatrix(excvec_coeff, vecbuffer2, 1, 1, &
|
||||
|
|
@ -543,7 +551,7 @@ CONTAINS
|
|||
!Calculate the virtual states from the KS matrix matrix_ks(1)
|
||||
IF (nvirtual2 .GT. 0) THEN
|
||||
NULLIFY (mo_coeff)
|
||||
CALL get_mo_set(mos(1)%mo_set, mo_coeff=mo_coeff, nmo=nmo)
|
||||
CALL get_mo_set(mos(my_spin)%mo_set, mo_coeff=mo_coeff, nmo=nmo)
|
||||
IF (output_unit > 0) THEN
|
||||
WRITE (UNIT=output_unit, FMT="(/,/,T2,A,I5,A,I6,A)") " Calculation of ", nvirtual2, &
|
||||
" additional virtual states of the subspace complementary to the "// &
|
||||
|
|
@ -558,22 +566,22 @@ CONTAINS
|
|||
CALL make_preconditioner(local_preconditioner, &
|
||||
precon_type=ot_precond_full_kinetic, &
|
||||
solver_type=ot_precond_solver_default, &
|
||||
matrix_h=matrix_ks(1)%matrix, &
|
||||
matrix_h=matrix_ks(my_spin)%matrix, &
|
||||
matrix_s=matrix_s(1)%matrix, &
|
||||
matrix_t=kinetic(1)%matrix, &
|
||||
convert_precond_to_dbcsr=.TRUE., &
|
||||
mo_set=mos(1)%mo_set, energy_gap=0.2_dp)
|
||||
mo_set=mos(my_spin)%mo_set, energy_gap=0.2_dp)
|
||||
|
||||
CALL get_xas_env(xas_env=xas_env, unoccupied_orbs=uno_orbs, &
|
||||
unoccupied_evals=uno_evals, unoccupied_eps=uno_eps, unoccupied_max_iter=uno_iter)
|
||||
CALL cp_fm_init_random(uno_orbs, nvirtual2)
|
||||
|
||||
CALL ot_eigensolver(matrix_h=matrix_ks(1)%matrix, matrix_s=matrix_s(1)%matrix, &
|
||||
CALL ot_eigensolver(matrix_h=matrix_ks(my_spin)%matrix, matrix_s=matrix_s(1)%matrix, &
|
||||
matrix_c_fm=uno_orbs, matrix_orthogonal_space_fm=mo_coeff, &
|
||||
preconditioner=local_preconditioner, eps_gradient=uno_eps, &
|
||||
iter_max=uno_iter, size_ortho_space=nmo)
|
||||
|
||||
CALL calculate_subspace_eigenvalues(uno_orbs, matrix_ks(1)%matrix, &
|
||||
CALL calculate_subspace_eigenvalues(uno_orbs, matrix_ks(my_spin)%matrix, &
|
||||
uno_evals, do_rotation=.TRUE.)
|
||||
CALL destroy_preconditioner(local_preconditioner)
|
||||
|
||||
|
|
@ -587,7 +595,7 @@ CONTAINS
|
|||
NULLIFY (all_vectors, all_evals)
|
||||
CALL get_xas_env(xas_env=xas_env, all_vectors=all_vectors, &
|
||||
all_evals=all_evals)
|
||||
CALL get_mo_set(mos(1)%mo_set, eigenvalues=eigenvalues, mo_coeff=mo_coeff, &
|
||||
CALL get_mo_set(mos(my_spin)%mo_set, eigenvalues=eigenvalues, mo_coeff=mo_coeff, &
|
||||
nmo=nmo)
|
||||
|
||||
CALL cp_fm_to_fm(mo_coeff, all_vectors, ncol=nmo, &
|
||||
|
|
@ -630,8 +638,8 @@ CONTAINS
|
|||
|
||||
CHARACTER(LEN=*), PARAMETER :: routineN = 'xes_scf_once', routineP = moduleN//':'//routineN
|
||||
|
||||
INTEGER :: handle, ispin, istate, nmo, nvirtual, &
|
||||
nvirtual2, output_unit
|
||||
INTEGER :: handle, ispin, istate, my_spin, nmo, &
|
||||
nvirtual, nvirtual2, output_unit
|
||||
REAL(KIND=dp), DIMENSION(:), POINTER :: all_evals, eigenvalues
|
||||
TYPE(cp_fm_type), POINTER :: all_vectors, mo_coeff
|
||||
TYPE(cp_logger_type), POINTER :: logger
|
||||
|
|
@ -657,7 +665,7 @@ CONTAINS
|
|||
matrix_ks=matrix_ks, mos=mos, para_env=para_env)
|
||||
|
||||
xas_control => dft_control%xas_control
|
||||
CALL get_xas_env(xas_env, scf_control=scf_control)
|
||||
CALL get_xas_env(xas_env, scf_control=scf_control, spin_channel=my_spin)
|
||||
|
||||
dft_section => section_vals_get_subs_vals(qs_env%input, "DFT")
|
||||
xas_section => section_vals_get_subs_vals(dft_section, "XAS")
|
||||
|
|
@ -699,7 +707,7 @@ CONTAINS
|
|||
END IF
|
||||
CALL get_xas_env(xas_env=xas_env, all_vectors=all_vectors, &
|
||||
all_evals=all_evals, nvirtual2=nvirtual2)
|
||||
CALL get_mo_set(mos(1)%mo_set, eigenvalues=eigenvalues, mo_coeff=mo_coeff, nmo=nmo)
|
||||
CALL get_mo_set(mos(my_spin)%mo_set, eigenvalues=eigenvalues, mo_coeff=mo_coeff, nmo=nmo)
|
||||
|
||||
CALL cp_fm_to_fm(mo_coeff, all_vectors, ncol=nmo, &
|
||||
source_start=1, target_start=1)
|
||||
|
|
|
|||
110
tests/QS/regtest-gapw-4/O2_xas_beta_spin.inp
Normal file
110
tests/QS/regtest-gapw-4/O2_xas_beta_spin.inp
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
&FORCE_EVAL
|
||||
METHOD Quickstep
|
||||
&DFT
|
||||
LSD
|
||||
BASIS_SET_FILE_NAME BASIS_def2_QZVP_RI_ALL
|
||||
POTENTIAL_FILE_NAME POTENTIAL
|
||||
|
||||
CHARGE 0
|
||||
MULTIPLICITY 3
|
||||
&MGRID
|
||||
CUTOFF 150
|
||||
&END MGRID
|
||||
&POISSON
|
||||
PERIODIC NONE
|
||||
POISSON_SOLVER MT
|
||||
&END
|
||||
&QS
|
||||
METHOD GAPW
|
||||
&END QS
|
||||
&SCF
|
||||
MAX_SCF 2
|
||||
SCF_GUESS ATOMIC
|
||||
EPS_SCF 1.0E-6
|
||||
&DIAGONALIZATION
|
||||
&END
|
||||
&END SCF
|
||||
&XC
|
||||
&XC_FUNCTIONAL PBE
|
||||
&END XC_FUNCTIONAL
|
||||
&END XC
|
||||
&PRINT
|
||||
&MO
|
||||
EIGENVALUES
|
||||
MO_RANGE 1 50
|
||||
OCCUPATION_NUMBERS
|
||||
&END
|
||||
&END
|
||||
&XAS
|
||||
&SCF
|
||||
EPS_SCF 8.5E-2
|
||||
MAX_SCF 30
|
||||
&END
|
||||
METHOD TP_FH
|
||||
DIPOLE_FORM VELOCITY
|
||||
STATE_TYPE 1s
|
||||
STATE_SEARCH 2
|
||||
SPIN_CHANNEL 2
|
||||
ATOMS_LIST 1
|
||||
ADDED_MOS 10
|
||||
&LOCALIZE
|
||||
&END
|
||||
&PRINT
|
||||
&PROGRAM_RUN_INFO
|
||||
&END
|
||||
&RESTART
|
||||
&END
|
||||
&XES_SPECTRUM
|
||||
&END
|
||||
&XAS_SPECTRUM
|
||||
&END
|
||||
&END
|
||||
|
||||
&END
|
||||
&END DFT
|
||||
|
||||
|
||||
&SUBSYS
|
||||
&CELL
|
||||
ABC [angstrom] 6.0 6.0 6.0
|
||||
PERIODIC NONE
|
||||
&END CELL
|
||||
|
||||
&COORD
|
||||
O 0.00000000 0.00000000 -0.00423076
|
||||
O 0.00000000 -0.00000000 1.21423076
|
||||
&END
|
||||
|
||||
&KIND H
|
||||
BASIS_SET def2-QZVP
|
||||
POTENTIAL ALL
|
||||
&END KIND
|
||||
|
||||
&KIND O
|
||||
BASIS_SET def2-QZVP
|
||||
POTENTIAL ALL
|
||||
&END KIND
|
||||
|
||||
&KIND N
|
||||
BASIS_SET def2-QZVP
|
||||
POTENTIAL ALL
|
||||
&END KIND
|
||||
|
||||
&KIND C
|
||||
BASIS_SET def2-QZVP
|
||||
POTENTIAL ALL
|
||||
&END KIND
|
||||
|
||||
&KIND F
|
||||
BASIS_SET def2-QZVP
|
||||
POTENTIAL ALL
|
||||
&END KIND
|
||||
|
||||
&END SUBSYS
|
||||
&END FORCE_EVAL
|
||||
&GLOBAL
|
||||
PROJECT 7782-44-7
|
||||
RUN_TYPE energy
|
||||
WALLTIME 10700
|
||||
&END GLOBAL
|
||||
|
||||
|
|
@ -29,4 +29,6 @@ Fe.inp 1 6e-14 -
|
|||
# GAPW with an external potential
|
||||
H2O_constant_extpot_GAPW.inp 1 2e-13 -17.156932432160339
|
||||
H2O_uniform_efield_GAPW.inp 1 6e-14 -17.15696477358598
|
||||
#XAS with for beta channel
|
||||
O2_xas_beta_spin.inp 84 1e-14 -20.79715369081585
|
||||
#EOF
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
83
|
||||
84
|
||||
Total energy:!3
|
||||
POTENTIAL ENERGY!4
|
||||
Total energy \[eV\]:!4
|
||||
|
|
@ -82,6 +82,7 @@ IC HOMO-LUMO gap (eV)!5
|
|||
HOMO SCF Cycle: 4!9
|
||||
DEBUG| Sum of differences:!5
|
||||
1\[\ \ \ 1\]\ -\ 2\[\ \ \ 1\]!7
|
||||
Ionization potential of the excited atom:!7
|
||||
#
|
||||
# these are the tests the can be selected for regtesting.
|
||||
# do regtest will grep for test_grep (first column) and look if the numeric value
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue