From 02ebe2af46dca9c26d6cac61dd83a7e7ab6ef49d Mon Sep 17 00:00:00 2001 From: Dorothea Golze Date: Tue, 6 Mar 2018 16:41:07 +0000 Subject: [PATCH] XAS: enable excitation for beta spin channel svn-origin-rev: 18295 --- src/input_cp2k_dft.F | 9 +- src/qs_loc_types.F | 5 +- src/qs_loc_utils.F | 57 +++++----- src/xas_control.F | 5 + src/xas_env_types.F | 17 ++- src/xas_methods.F | 109 +++++++++--------- src/xas_restart.F | 18 +-- src/xas_tp_scf.F | 58 +++++----- tests/QS/regtest-gapw-4/O2_xas_beta_spin.inp | 110 +++++++++++++++++++ tests/QS/regtest-gapw-4/TEST_FILES | 2 + tests/TEST_TYPES | 3 +- 11 files changed, 274 insertions(+), 119 deletions(-) create mode 100644 tests/QS/regtest-gapw-4/O2_xas_beta_spin.inp diff --git a/src/input_cp2k_dft.F b/src/input_cp2k_dft.F index 406ccb1c12..e18ca2bf2c 100644 --- a/src/input_cp2k_dft.F +++ b/src/input_cp2k_dft.F @@ -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. "// & diff --git a/src/qs_loc_types.F b/src/qs_loc_types.F index 0d169c2687..879ff2c038 100644 --- a/src/qs_loc_types.F +++ b/src/qs_loc_types.F @@ -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 diff --git a/src/qs_loc_utils.F b/src/qs_loc_utils.F index 99de496dd6..321df198a0 100644 --- a/src/qs_loc_utils.F +++ b/src/qs_loc_utils.F @@ -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 diff --git a/src/xas_control.F b/src/xas_control.F index 4a196fb736..d0432ddc0b 100644 --- a/src/xas_control.F +++ b/src/xas_control.F @@ -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. diff --git a/src/xas_env_types.F b/src/xas_env_types.F index f11f4af4f8..bf62d563b8 100644 --- a/src/xas_env_types.F +++ b/src/xas_env_types.F @@ -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 diff --git a/src/xas_methods.F b/src/xas_methods.F index 81547cc6cf..110b531518 100644 --- a/src/xas_methods.F +++ b/src/xas_methods.F @@ -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 diff --git a/src/xas_restart.F b/src/xas_restart.F index a80b9d807a..d648098c7c 100644 --- a/src/xas_restart.F +++ b/src/xas_restart.F @@ -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 diff --git a/src/xas_tp_scf.F b/src/xas_tp_scf.F index 763b1f29f0..2830bdef22 100644 --- a/src/xas_tp_scf.F +++ b/src/xas_tp_scf.F @@ -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) diff --git a/tests/QS/regtest-gapw-4/O2_xas_beta_spin.inp b/tests/QS/regtest-gapw-4/O2_xas_beta_spin.inp new file mode 100644 index 0000000000..2d162eab88 --- /dev/null +++ b/tests/QS/regtest-gapw-4/O2_xas_beta_spin.inp @@ -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 + diff --git a/tests/QS/regtest-gapw-4/TEST_FILES b/tests/QS/regtest-gapw-4/TEST_FILES index e428ad27b7..3affdbde35 100644 --- a/tests/QS/regtest-gapw-4/TEST_FILES +++ b/tests/QS/regtest-gapw-4/TEST_FILES @@ -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 diff --git a/tests/TEST_TYPES b/tests/TEST_TYPES index 75a00cc083..27e7a215e8 100644 --- a/tests/TEST_TYPES +++ b/tests/TEST_TYPES @@ -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