37 dbcsr_type_antisymmetric
128#include "./base/base_uses.f90"
133 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'xas_methods'
161 SUBROUTINE xas(qs_env, dft_control)
166 CHARACTER(LEN=*),
PARAMETER :: routinen =
'xas'
168 INTEGER :: handle, homo, i, iat, iatom, ispin, istate, my_homo(2), my_nelectron(2), my_spin, &
169 nao, nexc_atoms, nexc_search, nmo, nspins, output_unit, state_to_be_excited
170 INTEGER,
DIMENSION(2) :: added_mos
171 INTEGER,
DIMENSION(:),
POINTER :: nexc_states
172 INTEGER,
DIMENSION(:, :),
POINTER :: state_of_atom
173 LOGICAL :: ch_method_flags, converged, my_uocc(2), &
174 should_stop, skip_scf, &
176 REAL(
dp) :: maxocc, occ_estate, tmp, xas_nelectron
177 REAL(
dp),
DIMENSION(:),
POINTER :: eigenvalues
178 REAL(
dp),
DIMENSION(:, :),
POINTER :: vecbuffer
181 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: groundstate_coeff
182 TYPE(
cp_fm_type),
POINTER :: all_vectors, excvec_coeff, mo_coeff
184 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, op_sm, ostrength_sm
189 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
194 print_loc_section, scf_section, &
199 CALL timeset(routinen, handle)
201 transition_potential = .false.
204 should_stop = .false.
205 ch_method_flags = .false.
211 NULLIFY (xas_env, groundstate_coeff, ostrength_sm, op_sm)
212 NULLIFY (excvec_coeff, qs_loc_env, cell, scf_env)
214 NULLIFY (all_vectors, state_of_atom, nexc_states,
xas_control)
215 NULLIFY (vecbuffer, op_sm, mo_coeff_b)
216 NULLIFY (dft_section, xas_section, scf_section, loc_section, print_loc_section)
225 IF (output_unit > 0)
THEN
226 WRITE (unit=output_unit, fmt=
"(/,T3,A,/,T25,A,/,T3,A,/)") &
228 "START CORE LEVEL SPECTROSCOPY CALCULATION", &
234 IF (.NOT.
ASSOCIATED(xas_env))
THEN
235 IF (output_unit > 0)
THEN
236 WRITE (unit=output_unit, fmt=
"(/,T5,A)") &
237 "Create and initialize the xas environment"
241 CALL xas_env_init(xas_env, qs_env, dft_section, logger)
247 NULLIFY (atomic_kind_set, qs_kind_set, scf_control, mos, para_env, particle_set)
248 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
249 cell=cell, scf_control=scf_control, &
250 matrix_ks=matrix_ks, mos=mos, para_env=para_env, &
251 particle_set=particle_set)
254 NULLIFY (mo_coeff, eigenvalues)
255 IF (scf_control%use_ot)
THEN
256 IF (output_unit > 0)
THEN
257 WRITE (unit=output_unit, fmt=
"(/,T10,A,/)") &
258 "Get eigenstates and eigenvalues from ground state MOs"
260 DO ispin = 1, dft_control%nspins
261 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, nao=nao, nmo=nmo, &
262 eigenvalues=eigenvalues, homo=homo)
264 matrix_ks(ispin)%matrix, eigenvalues, &
269 added_mos = scf_control%added_mos
270 NULLIFY (scf_control)
273 scf_control%added_mos = added_mos
278 DO ispin = 1, dft_control%nspins
279 CALL get_mo_set(mos(ispin), nelectron=my_nelectron(ispin), maxocc=maxocc, &
280 homo=my_homo(ispin), uniform_occupation=my_uocc(ispin))
283 nspins = dft_control%nspins
285 transition_potential = .true.
290 IF (nspins == 1 .AND. transition_potential)
THEN
291 cpabort(
"XAS with TP method requires LSD calculations")
295 all_vectors=all_vectors, &
296 groundstate_coeff=groundstate_coeff, excvec_coeff=excvec_coeff, &
297 nexc_atoms=nexc_atoms, &
298 spin_channel=my_spin)
301 CALL get_mo_set(mos(my_spin), nao=nao, homo=homo)
305 CALL set_xas_env(xas_env=xas_env, nexc_search=nexc_search)
308 CALL get_xas_env(xas_env=xas_env, qs_loc_env=qs_loc_env)
309 IF (qs_loc_env%do_localize)
THEN
310 IF (output_unit > 0)
THEN
311 WRITE (unit=output_unit, fmt=
"(/,T2,A34,I3,A36/)") &
312 "Localize a sub-set of MOs of spin ", my_spin,
","// &
313 " to better identify the core states"
315 qs_loc_env%localized_wfn_control%set_of_states ==
state_loc_range)
THEN
316 WRITE (unit=output_unit, fmt=
"( A , I7, A, I7)")
" The sub-set contains states from ", &
317 qs_loc_env%localized_wfn_control%lu_bound_states(1, my_spin),
" to ", &
318 qs_loc_env%localized_wfn_control%lu_bound_states(2, my_spin)
319 ELSE IF (qs_loc_env%localized_wfn_control%set_of_states ==
state_loc_list)
THEN
320 WRITE (unit=output_unit, fmt=
"( A )")
" The sub-set contains states given in the input list"
324 CALL qs_loc_driver(qs_env, qs_loc_env, print_loc_section, myspin=my_spin)
327 cpassert(
ASSOCIATED(groundstate_coeff))
329 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, mo_coeff_b=mo_coeff_b, nmo=nmo)
330 CALL cp_fm_to_fm(mo_coeff, groundstate_coeff(ispin), nmo, 1, 1)
331 IF (
ASSOCIATED(mo_coeff_b))
THEN
341 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,/,T10,A)') &
342 "START Core Level Spectroscopy Calculation for the Emission Spectrum"
344 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(T10,A,/,A)') &
345 "The core state is fully occupied and XES from ground state calculation.", &
346 " No SCF is needed, MOS already available"
347 ELSE IF (
xas_control%xes_homo_occupation == 0)
THEN
348 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(T10,A,/,A)') &
349 "The core state is fully occupied and the homo is empty", &
350 " (final state of the core hole decay). Only one SCF is needed (not one per atom)"
355 CALL xes_scf_once(qs_env, xas_env, converged, should_stop)
357 IF (converged .AND. .NOT. should_stop .AND.
xas_control%xes_homo_occupation == 0)
THEN
358 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,T10,A,I6)') &
359 "SCF with empty homo converged "
360 ELSE IF (.NOT. converged .OR. should_stop)
THEN
361 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,T10,A,I6)') &
362 "SCF with empty homo NOT converged"
364 IF (
ASSOCIATED(vecbuffer))
THEN
365 DEALLOCATE (vecbuffer)
369 DO ispin = 1, dft_control%nspins
370 CALL set_mo_set(mos(ispin), homo=my_homo(ispin), &
371 uniform_occupation=my_uocc(ispin), nelectron=my_nelectron(ispin))
372 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, nmo=nmo)
373 CALL cp_fm_to_fm(groundstate_coeff(ispin), mos(ispin)%mo_coeff, nmo, 1, 1)
376 IF (output_unit > 0)
THEN
377 WRITE (unit=output_unit, fmt=
"(/,T3,A,/,T25,A,/,T3,A,/)") &
379 "END CORE LEVEL SPECTROSCOPY CALCULATION", &
384 DEALLOCATE (qs_env%xas_env)
385 NULLIFY (qs_env%xas_env)
388 "PRINT%PROGRAM_RUN_INFO")
389 CALL timestop(handle)
396 CALL cls_assign_core_states(
xas_control, xas_env, qs_loc_env%localized_wfn_control, &
399 state_of_atom=state_of_atom, nexc_states=nexc_states)
402 CALL get_mo_set(mos(my_spin), mo_coeff=mo_coeff)
403 CALL cp_fm_to_fm(mo_coeff, all_vectors, ncol=nexc_search, &
404 source_start=1, target_start=1)
407 ALLOCATE (vecbuffer(1, nao))
411 IF (transition_potential)
THEN
413 CALL get_xas_env(xas_env=xas_env, ostrength_sm=ostrength_sm)
415 NULLIFY (op_sm(i)%matrix)
416 op_sm(i)%matrix => ostrength_sm(i)%matrix
424 DO iat = 1, nexc_atoms
425 iatom = xas_env%exc_atoms(iat)
426 DO istate = 1, nexc_states(iat)
428 state_to_be_excited = state_of_atom(iat, istate)
432 CALL get_xas_env(xas_env, occ_estate=occ_estate, xas_nelectron=xas_nelectron)
433 tmp = xas_nelectron + 1.0_dp - occ_estate
435 cpabort(
"CLS: the required method needs added_mos to the ground state")
444 state_to_be_excited, istate)
446 CALL set_xas_env(xas_env=xas_env, xas_estate=state_to_be_excited)
447 CALL get_mo_set(mos(my_spin), mo_coeff=mo_coeff)
448 cpassert(
ASSOCIATED(excvec_coeff))
450 nao, 1, transpose=.true.)
452 nao, 1, transpose=.true.)
454 IF (transition_potential)
THEN
456 IF (.NOT. skip_scf)
THEN
457 IF (output_unit > 0)
THEN
458 WRITE (unit=output_unit, fmt=
'(/,T5,A)') repeat(
"-", 75)
460 WRITE (unit=output_unit, fmt=
'(/,/,T10,A,I6)') &
461 "START DeltaSCF for the first excited state from the core state of ATOM ", iatom
463 WRITE (unit=output_unit, fmt=
'(/,T10,A,I6)') &
464 "Start Core Level Spectroscopy Calculation with TP approach for ATOM ", iatom
465 WRITE (unit=output_unit, fmt=
'(/,T10,A,I6,T34,A,T54,I6)') &
466 "Excited state", istate,
"out of", nexc_states(iat)
467 WRITE (unit=output_unit, fmt=
'(T10,A,T50,f10.4)')
"Occupation of the core orbital", &
469 WRITE (unit=output_unit, fmt=
'(T10,A28,I3, T50,F10.4)')
"Number of electrons in Spin ", &
470 my_spin, xas_nelectron
475 IF (.NOT.
ASSOCIATED(scf_env))
THEN
483 DO ispin = 1,
SIZE(mos)
484 IF (
ASSOCIATED(mos(ispin)%mo_coeff_b))
THEN
486 mos(ispin)%mo_coeff_b)
490 IF (.NOT. scf_env%skip_diis)
THEN
491 IF (.NOT.
ASSOCIATED(scf_env%scf_diis_buffer))
THEN
492 ALLOCATE (scf_env%scf_diis_buffer)
493 CALL qs_diis_b_create(scf_env%scf_diis_buffer, nbuffer=scf_control%max_diis)
498 CALL xas_do_tp_scf(dft_control, xas_env, iatom, istate, scf_env, qs_env, &
499 xas_section, scf_section, converged, should_stop)
502 start_time=qs_env%start_time)
503 IF (should_stop)
THEN
512 IF (
SIZE(mos) > 1)
THEN
514 4, 0, final_mos=.false., spin=
"XAS ALPHA")
516 4, 0, final_mos=.false., spin=
"XAS BETA")
519 4, 0, final_mos=.false., spin=
"XAS")
530 CALL cls_calculate_spectrum(
xas_control, xas_env, qs_env, xas_section, &
533 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,/,T10,A,I6)') &
534 "SCF with core hole NOT converged for ATOM ", iatom
537 IF (.NOT. skip_scf)
THEN
543 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, nmo=nmo)
544 CALL cp_fm_to_fm(groundstate_coeff(ispin), mos(ispin)%mo_coeff, nmo, 1, 1)
546 IF (iat == nexc_atoms)
THEN
549 DEALLOCATE (xas_env%scf_env)
559 IF (
ASSOCIATED(vecbuffer))
THEN
560 DEALLOCATE (vecbuffer)
564 DO ispin = 1, dft_control%nspins
565 CALL set_mo_set(mos(ispin), homo=my_homo(ispin), &
566 uniform_occupation=my_uocc(ispin), nelectron=my_nelectron(ispin))
567 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, nmo=nmo)
568 CALL cp_fm_to_fm(groundstate_coeff(ispin), mos(ispin)%mo_coeff, nmo, 1, 1)
571 IF (output_unit > 0)
THEN
572 WRITE (unit=output_unit, fmt=
"(/,T3,A,/,T25,A,/,T3,A,/)") &
574 "END CORE LEVEL SPECTROSCOPY CALCULATION", &
579 DEALLOCATE (qs_env%xas_env)
580 NULLIFY (qs_env%xas_env)
583 "PRINT%PROGRAM_RUN_INFO")
584 CALL timestop(handle)
598 SUBROUTINE xas_env_init(xas_env, qs_env, dft_section, logger)
605 CHARACTER(LEN=default_string_length) :: name_sto
606 INTEGER :: homo, i, iat, iatom, ik, ikind, ispin, j, l, lfomo, my_spin, n_mo(2), n_rep, nao, &
607 natom, ncubes, nelectron, nexc_atoms, nexc_search, nj, nk, nkind, nmo, nmoloc(2), &
608 nsgf_gto, nsgf_sto, nspins, nvirtual, nvirtual2
609 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: first_sgf, kind_type_tmp, kind_z_tmp, &
611 INTEGER,
DIMENSION(4, 7) :: ne
612 INTEGER,
DIMENSION(:),
POINTER :: bounds,
list, lq, nq, row_blk_sizes
614 REAL(
dp) :: nele, occ_estate, occ_homo, &
616 REAL(
dp),
DIMENSION(:),
POINTER :: sto_zet
630 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
639 cpassert(
ASSOCIATED(xas_env))
641 NULLIFY (atomic_kind_set, qs_kind_set, dft_control, scf_control, matrix_s, mos, mpools)
646 atomic_kind_set=atomic_kind_set, &
647 qs_kind_set=qs_kind_set, &
648 dft_control=dft_control, &
650 matrix_s=matrix_s, mos=mos, &
651 para_env=para_env, particle_set=particle_set, &
653 dbcsr_dist=dbcsr_dist)
656 ALLOCATE (dft_control%xas_control)
661 ALLOCATE (scf_control)
668 IF (nexc_search < 0)
THEN
670 CALL get_mo_set(mos(my_spin), nmo=nmo, lfomo=lfomo)
671 nexc_search = lfomo - 1
674 ALLOCATE (xas_env%exc_atoms(nexc_atoms))
676 CALL set_xas_env(xas_env=xas_env, nexc_search=nexc_search, &
677 nexc_atoms=nexc_atoms, spin_channel=my_spin)
679 CALL mpools_get(mpools, ao_mo_fm_pools=xas_env%ao_mo_fm_pools)
682 CALL get_mo_set(mos(my_spin), nao=nao, homo=homo, nmo=nmo, mo_coeff=mo_coeff, nelectron=nelectron)
688 xas_env%unoccupied_max_iter =
xas_control%max_iter_added
690 nvirtual = nmo + nvirtual2
694 ALLOCATE (xas_env%centers_wfn(3, nexc_search))
695 ALLOCATE (xas_env%atom_of_state(nexc_search))
696 ALLOCATE (xas_env%type_of_state(nexc_search))
697 ALLOCATE (xas_env%state_of_atom(nexc_atoms, nexc_search))
698 ALLOCATE (xas_env%nexc_states(nexc_atoms))
699 ALLOCATE (xas_env%mykind_of_atom(nexc_atoms))
700 nkind =
SIZE(atomic_kind_set, 1)
701 ALLOCATE (xas_env%mykind_of_kind(nkind))
702 xas_env%mykind_of_kind = 0
705 NULLIFY (tmp_fm_struct)
707 ncol_global=1, para_env=para_env, context=mo_coeff%matrix_struct%context)
708 ALLOCATE (xas_env%excvec_coeff)
712 NULLIFY (tmp_fm_struct)
714 ncol_global=nexc_search, para_env=para_env, &
715 context=mo_coeff%matrix_struct%context)
716 ALLOCATE (xas_env%excvec_overlap)
717 CALL cp_fm_create(xas_env%excvec_overlap, tmp_fm_struct)
720 nspins =
SIZE(mos, 1)
725 nele = real(nelectron,
dp) - 0.5_dp
727 occ_homo_plus = 0._dp
730 nele = real(nelectron,
dp)
732 occ_homo_plus = 0.5_dp
735 nele = real(nelectron,
dp) - 1.0_dp
737 occ_homo_plus = 0._dp
740 nele = real(nelectron,
dp)
742 occ_homo_plus = 1._dp
749 nele = real(nelectron,
dp)
751 occ_homo_plus = 1._dp
755 IF (nele < 0.0_dp) nele = real(nelectron,
dp) - (1.0_dp - occ_estate)
758 CALL set_xas_env(xas_env=xas_env, occ_estate=occ_estate, xas_nelectron=nele, &
759 nvirtual2=nvirtual2, nvirtual=nvirtual, homo_occ=occ_homo)
763 "PRINT%CLS_FUNCTION_CUBES"),
cp_p_file))
THEN
764 NULLIFY (bounds,
list)
766 "PRINT%CLS_FUNCTION_CUBES%CUBES_LU_BOUNDS", &
768 ncubes = bounds(2) - bounds(1) + 1
779 "PRINT%CLS_FUNCTION_CUBES%CUBES_LIST", &
785 "PRINT%CLS_FUNCTION_CUBES%CUBES_LIST", &
786 i_rep_val=ik, i_vals=
list)
787 IF (
ASSOCIATED(
list))
THEN
792 ncubes = ncubes +
SIZE(
list)
809 NULLIFY (tmp_fm_struct)
810 ALLOCATE (xas_env%groundstate_coeff(nspins))
814 xas_env%groundstate_coeff(ispin), &
818 NULLIFY (tmp_fm_struct)
820 ncol_global=nvirtual, para_env=para_env, &
821 context=mo_coeff%matrix_struct%context)
822 ALLOCATE (xas_env%dip_fm_set(2, 3))
825 CALL cp_fm_create(xas_env%dip_fm_set(j, i), tmp_fm_struct)
831 IF (nvirtual2 > 0)
THEN
832 ALLOCATE (xas_env%unoccupied_evals(nvirtual2))
833 NULLIFY (tmp_fm_struct)
835 ncol_global=nvirtual2, &
836 para_env=para_env, context=mo_coeff%matrix_struct%context)
837 ALLOCATE (xas_env%unoccupied_orbs)
838 CALL cp_fm_create(xas_env%unoccupied_orbs, tmp_fm_struct)
842 NULLIFY (tmp_fm_struct)
844 ncol_global=nvirtual, &
845 para_env=para_env, context=mo_coeff%matrix_struct%context)
846 ALLOCATE (xas_env%all_vectors)
851 ALLOCATE (xas_env%all_evals(nvirtual))
856 ALLOCATE (xas_env%ostrength_sm(i)%matrix)
857 CALL dbcsr_copy(xas_env%ostrength_sm(i)%matrix, matrix_s(1)%matrix, &
858 "xas_env%ostrength_sm-"//trim(adjustl(
cp_to_string(i))))
859 CALL dbcsr_set(xas_env%ostrength_sm(i)%matrix, 0.0_dp)
864 natom =
SIZE(particle_set, 1)
865 ALLOCATE (first_sgf(natom))
866 ALLOCATE (last_sgf(natom))
868 first_sgf=first_sgf, &
870 ALLOCATE (row_blk_sizes(natom))
871 CALL dbcsr_convert_offsets_to_sizes(first_sgf, row_blk_sizes, last_sgf)
872 DEALLOCATE (first_sgf)
873 DEALLOCATE (last_sgf)
877 ALLOCATE (xas_env%ostrength_sm(1)%matrix)
878 CALL dbcsr_create(matrix=xas_env%ostrength_sm(1)%matrix, &
879 name=
"xas_env%ostrength_sm", &
880 dist=dbcsr_dist, matrix_type=dbcsr_type_antisymmetric, &
881 row_blk_size=row_blk_sizes, col_blk_size=row_blk_sizes, &
884 CALL dbcsr_set(xas_env%ostrength_sm(1)%matrix, 0.0_dp)
886 ALLOCATE (xas_env%ostrength_sm(i)%matrix)
887 CALL dbcsr_copy(xas_env%ostrength_sm(i)%matrix, xas_env%ostrength_sm(1)%matrix, &
888 "xas_env%ostrength_sm-"//trim(adjustl(
cp_to_string(i))))
889 CALL dbcsr_set(xas_env%ostrength_sm(i)%matrix, 0.0_dp)
892 DEALLOCATE (row_blk_sizes)
896 IF (.NOT. (
ASSOCIATED(xas_env%qs_loc_env)))
THEN
897 ALLOCATE (qs_loc_env)
899 CALL set_xas_env(xas_env=xas_env, qs_loc_env=qs_loc_env)
903 do_xas=.true., nloc_xas=nexc_search, spin_xas=my_spin)
905 IF (.NOT. qs_loc_env%do_localize)
THEN
906 qs_loc_env%localized_wfn_control%localization_method =
do_loc_none
909 nmoloc = qs_loc_env%localized_wfn_control%nloc_states
910 CALL set_loc_wfn_lists(qs_loc_env%localized_wfn_control, nmoloc, n_mo, nspins, my_spin)
913 qs_env, myspin=my_spin, do_localize=qs_loc_env%do_localize)
918 ALLOCATE (nq(1), lq(1), sto_zet(1))
950 cpabort(
"XAS type of state not implemented")
954 ALLOCATE (kind_type_tmp(nkind))
955 ALLOCATE (kind_z_tmp(nkind))
959 DO iat = 1, nexc_atoms
960 iatom = xas_env%exc_atoms(iat)
961 NULLIFY (atomic_kind)
962 atomic_kind => particle_set(iatom)%atomic_kind
967 IF (ikind == kind_type_tmp(ik))
THEN
969 xas_env%mykind_of_atom(iat) = ik
973 IF (.NOT. ihavethis)
THEN
975 kind_type_tmp(nk) = ikind
976 kind_z_tmp(nk) = int(zatom)
977 xas_env%mykind_of_atom(iat) = nk
978 xas_env%mykind_of_kind(ikind) = nk
982 ALLOCATE (xas_env%my_gto_basis(nk))
983 ALLOCATE (xas_env%stogto_overlap(nk))
985 NULLIFY (xas_env%my_gto_basis(ik)%gto_basis_set, sto_basis_set)
990 ne(l, i) =
ptable(kind_z_tmp(ik))%e_conv(l - 1) - 2*nj*(i - l)
991 ne(l, i) = max(ne(l, i), 0)
992 ne(l, i) = min(ne(l, i), 2*nj)
996 sto_zet(1) =
srules(kind_z_tmp(ik), ne, nq(1), lq(1))
998 name_sto =
'xas_tmp_sto'
1000 lq=lq, zet=sto_zet, name=name_sto)
1002 xas_env%my_gto_basis(ik)%gto_basis_set,
xas_control%ngauss)
1004 xas_env%my_gto_basis(ik)%gto_basis_set%norm_type = 2
1007 ikind = kind_type_tmp(ik)
1008 CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set)
1011 CALL get_gto_basis_set(gto_basis_set=xas_env%my_gto_basis(ik)%gto_basis_set, nsgf=nsgf_sto)
1012 ALLOCATE (xas_env%stogto_overlap(ik)%array(nsgf_sto, nsgf_gto))
1015 xas_env%stogto_overlap(ik)%array)
1018 DEALLOCATE (nq, lq, sto_zet)
1019 DEALLOCATE (kind_type_tmp, kind_z_tmp)
1021 END SUBROUTINE xas_env_init
1039 SUBROUTINE cls_calculate_spectrum(xas_control, xas_env, qs_env, xas_section, &
1046 INTEGER,
INTENT(IN) :: iatom, istate
1048 INTEGER :: homo, i, lfomo, my_spin, nabs, nmo, &
1049 nvirtual, output_unit, xas_estate
1050 LOGICAL :: append_cube, length
1052 REAL(
dp),
DIMENSION(:),
POINTER :: all_evals
1053 REAL(
dp),
DIMENSION(:, :),
POINTER :: sp_ab, sp_em
1054 TYPE(
cp_fm_type),
DIMENSION(:, :),
POINTER :: dip_fm_set
1055 TYPE(
cp_fm_type),
POINTER :: all_vectors, excvec_coeff
1057 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: op_sm, ostrength_sm
1065 NULLIFY (ostrength_sm, op_sm, dip_fm_set)
1066 NULLIFY (all_evals, all_vectors, excvec_coeff)
1067 NULLIFY (mos, particle_set, sp_em, sp_ab)
1071 mos=mos, particle_set=particle_set)
1073 CALL get_xas_env(xas_env=xas_env, all_vectors=all_vectors, xas_estate=xas_estate, &
1074 all_evals=all_evals, dip_fm_set=dip_fm_set, excvec_coeff=excvec_coeff, &
1075 ostrength_sm=ostrength_sm, nvirtual=nvirtual, spin_channel=my_spin)
1076 CALL get_mo_set(mos(my_spin), homo=homo, lfomo=lfomo, nmo=nmo)
1078 nabs = nvirtual - lfomo + 1
1079 ALLOCATE (sp_em(6, homo))
1080 ALLOCATE (sp_ab(6, nabs))
1081 cpassert(
ASSOCIATED(excvec_coeff))
1086 rc(1:3) = particle_set(iatom)%r(1:3)
1088 NULLIFY (op_sm(i)%matrix)
1089 op_sm(i)%matrix => ostrength_sm(i)%matrix
1092 all_images=.true., minimum_image=.true.)
1093 CALL spectrum_dip_vel(dip_fm_set, op_sm, mos, excvec_coeff, &
1094 all_vectors, all_evals, &
1095 sp_em, sp_ab, xas_estate, nvirtual, my_spin)
1096 DO i = 1,
SIZE(ostrength_sm, 1)
1097 CALL dbcsr_set(ostrength_sm(i)%matrix, 0.0_dp)
1101 NULLIFY (op_sm(i)%matrix)
1102 op_sm(i)%matrix => ostrength_sm(i)%matrix
1104 CALL spectrum_dip_vel(dip_fm_set, op_sm, mos, excvec_coeff, &
1105 all_vectors, all_evals, &
1106 sp_em, sp_ab, xas_estate, nvirtual, my_spin)
1114 CALL xas_write(sp_em, sp_ab, xas_estate, &
1115 xas_section, iatom, istate, lfomo, length=length)
1122 "PRINT%CLS_FUNCTION_CUBES"),
cp_p_file))
THEN
1123 append_cube =
section_get_lval(xas_section,
"PRINT%CLS_FUNCTION_CUBES%APPEND")
1124 CALL xas_print_cubes(
xas_control, qs_env, xas_section, mos, all_vectors, &
1130 CALL xas_pdos(qs_env, xas_section, mos, iatom)
1135 END SUBROUTINE cls_calculate_spectrum
1153 SUBROUTINE xas_write(sp_em, sp_ab, estate, xas_section, iatom, state_to_be_excited, &
1156 REAL(
dp),
DIMENSION(:, :),
POINTER :: sp_em, sp_ab
1157 INTEGER,
INTENT(IN) :: estate
1159 INTEGER,
INTENT(IN) :: iatom, state_to_be_excited, lfomo
1160 LOGICAL,
INTENT(IN) :: length
1162 CHARACTER(LEN=default_string_length) :: mittle_ab, mittle_em, my_act, my_pos
1163 INTEGER :: i, istate, out_sp_ab, out_sp_em
1176 extension=
".spectrum", file_position=my_pos, file_action=my_act, &
1177 file_form=
"FORMATTED", middle_name=trim(mittle_em))
1179 IF (out_sp_em > 0)
THEN
1180 WRITE (out_sp_em,
'(A,I6,A,I6,A,I6)')
" Emission spectrum for atom ", iatom, &
1181 ", index of excited core MO is", estate,
", # of lines ",
SIZE(sp_em, 2)
1183 DO istate = estate,
SIZE(sp_em, 2)
1184 IF (length) ene2 = sp_em(1, istate)*sp_em(1, istate)
1185 WRITE (out_sp_em,
'(I6,5F16.8,F10.5)') istate, sp_em(1, istate)*
evolt, &
1186 sp_em(2, istate)*ene2, sp_em(3, istate)*ene2, &
1187 sp_em(4, istate)*ene2, sp_em(5, istate)*ene2, sp_em(6, istate)
1191 "PRINT%XES_SPECTRUM")
1195 extension=
".spectrum", file_position=my_pos, file_action=my_act, &
1196 file_form=
"FORMATTED", middle_name=trim(mittle_ab))
1198 IF (out_sp_ab > 0)
THEN
1199 WRITE (out_sp_ab,
'(A,I6,A,I6,A,I6)')
" Absorption spectrum for atom ", iatom, &
1200 ", index of excited core MO is", estate,
", # of lines ",
SIZE(sp_ab, 2)
1202 DO i = 1,
SIZE(sp_ab, 2)
1203 istate = lfomo - 1 + i
1204 IF (length) ene2 = sp_ab(1, i)*sp_ab(1, i)
1205 WRITE (out_sp_ab,
'(I6,5F16.8,F10.5)') istate, sp_ab(1, i)*
evolt, &
1206 sp_ab(2, i)*ene2, sp_ab(3, i)*ene2, &
1207 sp_ab(4, i)*ene2, sp_ab(5, i)*ene2, sp_ab(6, i)
1212 "PRINT%XAS_SPECTRUM")
1214 END SUBROUTINE xas_write
1229 SUBROUTINE xas_print_cubes(xas_control, qs_env, xas_section, &
1230 mos, all_vectors, iatom, append_cube)
1235 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mos
1237 INTEGER,
INTENT(IN) :: iatom
1238 LOGICAL,
INTENT(IN) :: append_cube
1240 CHARACTER(LEN=default_string_length) :: my_mittle, my_pos
1241 INTEGER :: homo, istate0, my_spin, nspins, nstates
1242 REAL(
dp),
DIMENSION(:, :),
POINTER :: centers
1254 ALLOCATE (centers(6, nstates))
1263 IF (append_cube)
THEN
1268 centers, print_key, my_mittle, state0=istate0, file_position=my_pos)
1270 DEALLOCATE (centers)
1272 END SUBROUTINE xas_print_cubes
1285 SUBROUTINE xas_pdos(qs_env, xas_section, mos, iatom)
1289 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mos
1290 INTEGER,
INTENT(IN) :: iatom
1292 CHARACTER(LEN=default_string_length) :: xas_mittle
1296 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1298 NULLIFY (atomic_kind_set, particle_set, qs_kind_set)
1299 xas_mittle =
'xasat'//trim(adjustl(
cp_to_string(iatom)))//
'_'
1302 atomic_kind_set=atomic_kind_set, &
1303 particle_set=particle_set, &
1304 qs_kind_set=qs_kind_set)
1308 xas_section, ispin, xas_mittle)
1311 END SUBROUTINE xas_pdos
1335 SUBROUTINE spectrum_dip_vel(fm_set, op_sm, mos, excvec, &
1336 all_vectors, all_evals, sp_em, sp_ab, estate, nstate, my_spin)
1338 TYPE(
cp_fm_type),
DIMENSION(:, :),
POINTER :: fm_set
1340 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mos
1341 TYPE(
cp_fm_type),
INTENT(IN) :: excvec, all_vectors
1342 REAL(
dp),
DIMENSION(:),
POINTER :: all_evals
1343 REAL(
dp),
DIMENSION(:, :),
POINTER :: sp_em, sp_ab
1344 INTEGER,
INTENT(IN) :: estate, nstate, my_spin
1346 INTEGER :: homo, i, i_abs, istate, lfomo, nao, nmo
1347 REAL(
dp) :: dip(3), ene_f, ene_i
1348 REAL(
dp),
DIMENSION(:),
POINTER :: eigenvalues, occupation_numbers
1351 cpassert(
ASSOCIATED(fm_set))
1352 NULLIFY (eigenvalues, occupation_numbers)
1354 CALL get_mo_set(mos(my_spin), eigenvalues=eigenvalues, occupation_numbers=occupation_numbers, &
1355 nao=nao, nmo=nmo, homo=homo, lfomo=lfomo)
1358 DO i = 1,
SIZE(fm_set, 2)
1362 CALL parallel_gemm(
"T",
"N", 1, nstate, nao, 1.0_dp, excvec, &
1363 fm_work, 0.0_dp, fm_set(my_spin, i), b_first_col=1)
1369 ene_i = eigenvalues(estate)
1370 DO istate = 1, nstate
1371 ene_f = all_evals(istate)
1375 IF (istate <= homo)
THEN
1376 sp_em(1, istate) = ene_f - ene_i
1377 sp_em(2, istate) = dip(1)
1378 sp_em(3, istate) = dip(2)
1379 sp_em(4, istate) = dip(3)
1380 sp_em(5, istate) = dip(1)*dip(1) + dip(2)*dip(2) + dip(3)*dip(3)
1381 sp_em(6, istate) = occupation_numbers(istate)
1383 IF (istate >= lfomo)
THEN
1384 i_abs = istate - lfomo + 1
1385 sp_ab(1, i_abs) = ene_f - ene_i
1386 sp_ab(2, i_abs) = dip(1)
1387 sp_ab(3, i_abs) = dip(2)
1388 sp_ab(4, i_abs) = dip(3)
1389 sp_ab(5, i_abs) = dip(1)*dip(1) + dip(2)*dip(2) + dip(3)*dip(3)
1390 IF (istate <= nmo) sp_ab(6, i_abs) = occupation_numbers(istate)
1395 END SUBROUTINE spectrum_dip_vel
1406 REAL(
dp),
DIMENSION(:, :),
POINTER :: matrix
1408 INTEGER :: iset, jset, ldsab, maxcoa, maxcob, maxl, &
1409 maxla, maxlb, na, nb, nseta, nsetb, &
1410 nsgfa, nsgfb, sgfa, sgfb
1411 INTEGER,
DIMENSION(:),
POINTER :: la_max, la_min, lb_max, lb_min, npgfa, &
1412 npgfb, nsgfa_set, nsgfb_set
1413 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa, first_sgfb
1415 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: sab, work
1416 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: rpgfa, rpgfb, scon_a, scon_b, sphi_a, &
1419 NULLIFY (la_max, la_min, lb_max, lb_min)
1420 NULLIFY (npgfa, npgfb, nsgfa_set, nsgfb_set)
1421 NULLIFY (first_sgfa, first_sgfb)
1422 NULLIFY (rpgfa, rpgfb, sphi_a, sphi_b, zeta, zetb)
1424 CALL get_gto_basis_set(gto_basis_set=base_a, nsgf=nsgfa, nsgf_set=nsgfa_set, lmax=la_max, &
1425 lmin=la_min, npgf=npgfa, pgf_radius=rpgfa, &
1426 sphi=sphi_a, scon=scon_a, zet=zeta, first_sgf=first_sgfa, &
1427 maxco=maxcoa, nset=nseta, maxl=maxla)
1429 CALL get_gto_basis_set(gto_basis_set=base_b, nsgf=nsgfb, nsgf_set=nsgfb_set, lmax=lb_max, &
1430 lmin=lb_min, npgf=npgfb, pgf_radius=rpgfb, &
1431 sphi=sphi_b, scon=scon_b, zet=zetb, first_sgf=first_sgfb, &
1432 maxco=maxcob, nset=nsetb, maxl=maxlb)
1437 ldsab = max(maxcoa, maxcob, nsgfa, nsgfb)
1438 maxl = max(maxla, maxlb)
1440 ALLOCATE (sab(ldsab, ldsab))
1441 ALLOCATE (work(ldsab, ldsab))
1445 na = npgfa(iset)*(
ncoset(la_max(iset)) -
ncoset(la_min(iset) - 1))
1446 sgfa = first_sgfa(1, iset)
1449 nb = npgfb(jset)*(
ncoset(lb_max(jset)) -
ncoset(lb_min(jset) - 1))
1450 sgfb = first_sgfb(1, jset)
1452 CALL overlap_ab(la_max(iset), la_min(iset), npgfa(iset), rpgfa(:, iset), zeta(:, iset), &
1453 lb_max(jset), lb_min(jset), npgfb(jset), rpgfb(:, jset), zetb(:, jset), &
1455 CALL contraction(sab, work, ca=scon_a(:, sgfa:), na=na, ma=nsgfa_set(iset), &
1456 cb=scon_b(:, sgfb:), nb=nb, mb=nsgfb_set(jset))
1457 CALL block_add(
"IN", work, nsgfa_set(iset), nsgfb_set(jset), matrix, sgfa, sgfb)
1461 DEALLOCATE (sab, work)
1484 SUBROUTINE cls_assign_core_states(xas_control, xas_env, localized_wfn_control, qs_env)
1491 INTEGER :: chosen_state, homo, i, iat, iatom, &
1492 ikind, isgf, istate, j, my_kind, &
1493 my_spin, nao, natom, nexc_atoms, &
1494 nexc_search, output_unit
1495 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: first_sgf
1496 INTEGER,
DIMENSION(3) :: perd0
1497 INTEGER,
DIMENSION(:),
POINTER :: atom_of_state, mykind_of_kind, &
1498 nexc_states, state_of_mytype, &
1500 INTEGER,
DIMENSION(:, :),
POINTER :: state_of_atom
1501 REAL(
dp) :: component, dist, distmin, maxocc, ra(3), &
1503 REAL(
dp),
DIMENSION(:),
POINTER :: max_overlap, sto_state_overlap
1504 REAL(
dp),
DIMENSION(:, :),
POINTER :: centers_wfn
1505 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: vecbuffer
1513 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1515 NULLIFY (cell, mos, particle_set)
1516 NULLIFY (atom_of_state, centers_wfn, mykind_of_kind, state_of_atom, nexc_states)
1517 NULLIFY (stogto_overlap, type_of_state, max_overlap, qs_kind_set)
1518 NULLIFY (state_of_mytype, type_of_state, sto_state_overlap)
1524 CALL get_qs_env(qs_env=qs_env, cell=cell, mos=mos, particle_set=particle_set, &
1525 qs_kind_set=qs_kind_set)
1529 perd0(1:3) = cell%perd(1:3)
1533 centers_wfn=centers_wfn, atom_of_state=atom_of_state, &
1534 mykind_of_kind=mykind_of_kind, &
1535 type_of_state=type_of_state, state_of_atom=state_of_atom, &
1536 stogto_overlap=stogto_overlap, nexc_atoms=nexc_atoms, &
1537 spin_channel=my_spin, nexc_search=nexc_search, nexc_states=nexc_states)
1539 CALL get_mo_set(mos(my_spin), mo_coeff=mo_coeff, maxocc=maxocc, nao=nao, homo=homo)
1542 ALLOCATE (vecbuffer(1, nao))
1543 natom =
SIZE(particle_set)
1545 ALLOCATE (first_sgf(natom))
1547 ALLOCATE (sto_state_overlap(nexc_search))
1548 ALLOCATE (max_overlap(natom))
1549 max_overlap = 0.0_dp
1550 ALLOCATE (state_of_mytype(natom))
1558 DO istate = 1, nexc_search
1559 centers_wfn(1, istate) = localized_wfn_control%centers_set(my_spin)%array(1, istate)
1560 centers_wfn(2, istate) = localized_wfn_control%centers_set(my_spin)%array(2, istate)
1561 centers_wfn(3, istate) = localized_wfn_control%centers_set(my_spin)%array(3, istate)
1565 DO iat = 1, nexc_atoms
1567 ra(1:3) = particle_set(iatom)%r(1:3)
1568 rc(1:3) = centers_wfn(1:3, istate)
1569 rac =
pbc(ra, rc, cell)
1570 dist = rac(1)*rac(1) + rac(2)*rac(2) + rac(3)*rac(3)
1572 IF (dist < distmin)
THEN
1574 atom_of_state(istate) = iatom
1578 IF (atom_of_state(istate) /= 0)
THEN
1581 nao, 1, transpose=.true.)
1583 iatom = atom_of_state(istate)
1585 NULLIFY (atomic_kind)
1586 atomic_kind => particle_set(iatom)%atomic_kind
1590 my_kind = mykind_of_kind(ikind)
1592 sto_state_overlap(istate) = 0.0_dp
1593 DO i = 1,
SIZE(stogto_overlap(my_kind)%array, 1)
1595 DO j = 1,
SIZE(stogto_overlap(my_kind)%array, 2)
1596 isgf = first_sgf(iatom) + j - 1
1597 component = component + stogto_overlap(my_kind)%array(i, j)*vecbuffer(1, isgf)
1599 sto_state_overlap(istate) = sto_state_overlap(istate) + &
1603 IF (sto_state_overlap(istate) > max_overlap(iatom))
THEN
1604 state_of_mytype(iatom) = istate
1605 max_overlap(iatom) = sto_state_overlap(istate)
1612 DO iat = 1, nexc_atoms
1614 DO istate = 1, nexc_search
1615 IF (atom_of_state(istate) == iatom)
THEN
1616 IF (sto_state_overlap(istate) > max_overlap(iatom)*
xas_control%overlap_threshold &
1617 .AND. istate /= state_of_mytype(iat))
THEN
1618 nexc_states(iat) = nexc_states(iat) + 1
1619 state_of_atom(iat, nexc_states(iat)) = istate
1627 IF (output_unit > 0)
THEN
1628 WRITE (unit=output_unit, fmt=
"(/,T10,A,/)") &
1629 "List the atoms to be excited and the relative of MOs index "
1632 DO iat = 1, nexc_atoms
1633 iatom = xas_env%exc_atoms(iat)
1634 state_of_atom(iat, 1) = state_of_mytype(iatom)
1635 IF (output_unit > 0)
THEN
1636 WRITE (unit=output_unit, fmt=
"(T10,A,I3,T26,A)", advance=
'NO') &
1637 'Atom: ', iatom,
"MO index:"
1639 DO istate = 1, nexc_states(iat)
1640 IF (istate < nexc_states(iat))
THEN
1641 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(I4)", advance=
'NO') state_of_atom(iat, istate)
1643 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(I4)") state_of_atom(iat, istate)
1646 IF (state_of_atom(iat, 1) == 0 .OR. state_of_atom(iat, 1) > homo)
THEN
1647 cpabort(
"A wrong state has been selected for excitation, check the Wannier centers")
1652 DO iat = 1, nexc_atoms
1653 IF (output_unit > 0)
THEN
1654 WRITE (unit=output_unit, fmt=
"(/,T10,A,I6)") &
1655 'Overlap integrals for Atom: ', iat
1656 DO istate = 1, nexc_states(iat)
1657 WRITE (unit=output_unit, fmt=
"(T10,A,I3,T26,A,T38,f10.8)") &
1658 'State: ', state_of_atom(iat, istate),
"Overlap:", sto_state_overlap(state_of_atom(iat, istate))
1665 CALL reallocate(xas_env%state_of_atom, 1, nexc_atoms, 1, maxval(nexc_states))
1670 CALL reallocate(xas_env%nexc_states, 1, natom)
1672 CALL get_xas_env(xas_env, nexc_states=nexc_states, state_of_atom=state_of_atom)
1682 centers_wfn(1, chosen_state) = localized_wfn_control%centers_set(my_spin)%array(1, chosen_state)
1683 centers_wfn(2, chosen_state) = localized_wfn_control%centers_set(my_spin)%array(2, chosen_state)
1684 centers_wfn(3, chosen_state) = localized_wfn_control%centers_set(my_spin)%array(3, chosen_state)
1688 ra(1:3) = particle_set(iat)%r(1:3)
1689 rc(1:3) = centers_wfn(1:3, chosen_state)
1690 rac =
pbc(ra, rc, cell)
1691 dist = rac(1)*rac(1) + rac(2)*rac(2) + rac(3)*rac(3)
1692 IF (dist < distmin)
THEN
1693 atom_of_state(chosen_state) = iat
1698 nexc_states(atom_of_state(chosen_state)) = nexc_states(atom_of_state(chosen_state)) + 1
1699 state_of_atom(atom_of_state(chosen_state), nexc_states(atom_of_state(chosen_state))) = chosen_state
1704 IF (output_unit > 0)
THEN
1705 WRITE (unit=output_unit, fmt=
"(/,T10,A,/)") &
1706 "List the atoms to be excited and the relative of MOs index "
1710 IF (output_unit > 0 .AND. state_of_atom(iat, 1) /= 0)
THEN
1711 WRITE (unit=output_unit, fmt=
"(T10,A,I3,T26,A)", advance=
'NO') &
1712 'Atom: ', iat,
"MO index:"
1713 DO i = 1, nexc_states(iat)
1714 IF (i < nexc_states(iat))
THEN
1715 WRITE (unit=output_unit, fmt=
"(I4)", advance=
'NO') state_of_atom(iat, i)
1717 WRITE (unit=output_unit, fmt=
"(I4)") state_of_atom(iat, i)
1721 IF (state_of_atom(iat, 1) > homo)
THEN
1722 cpabort(
"A wrong state has been selected for excitation, check the Wannier centers")
1726 CALL reallocate(xas_env%state_of_atom, 1, natom, 1, maxval(nexc_states))
1731 cell%perd(1:3) = perd0(1:3)
1733 DEALLOCATE (vecbuffer)
1734 DEALLOCATE (first_sgf)
1735 DEALLOCATE (sto_state_overlap)
1736 DEALLOCATE (max_overlap)
1737 DEALLOCATE (state_of_mytype)
1739 END SUBROUTINE cls_assign_core_states
Set of routines to: Contract integrals over primitive Gaussians Decontract (density) matrices Trace m...
Calculation of the overlap integrals over Cartesian Gaussian-type functions.
subroutine, public overlap_ab(la_max, la_min, npgfa, rpgfa, zeta, lb_max, lb_min, npgfb, rpgfb, zetb, rab, sab, dab, ddab, rr_work)
Calculation of the two-center overlap integrals [a|b] over Cartesian Gaussian-type functions....
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
subroutine, public get_gto_basis_set(gto_basis_set, name, aliases, norm_type, kind_radius, ncgf, nset, nsgf, cgf_symbol, sgf_symbol, norm_cgf, set_radius, lmax, lmin, lx, ly, lz, m, ncgf_set, npgf, nsgf_set, nshell, cphi, pgf_radius, sphi, scon, zet, first_cgf, first_sgf, l, last_cgf, last_sgf, n, gcc, maxco, maxl, maxpgf, maxsgf_set, maxshell, maxso, nco_sum, npgf_sum, nshell_sum, maxder, short_kind_radius, npgf_seg_sum, ccon)
...
subroutine, public create_gto_from_sto_basis(sto_basis_set, gto_basis_set, ngauss, ortho, ngaussflex)
...
pure real(dp) function, public srules(z, ne, n, l)
...
subroutine, public deallocate_sto_basis_set(sto_basis_set)
...
subroutine, public allocate_sto_basis_set(sto_basis_set)
...
subroutine, public set_sto_basis_set(sto_basis_set, name, nshell, symbol, nq, lq, zet)
...
subroutine, public init_orb_basis_set(gto_basis_set)
Initialise a Gaussian-type orbital (GTO) basis set data set.
Handles all functions related to the CELL.
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_set(matrix, alpha)
...
Routines that link DBCSR and CP2K concepts together.
subroutine, public cp_dbcsr_alloc_block_from_nbl(matrix, sab_orb, desymmetrize)
allocate the blocks of a dbcsr based on the neighbor list
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_sm_fm_multiply(matrix, fm_in, fm_out, ncol, alpha, beta)
multiply a dbcsr with a fm matrix
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
Routines to handle the external control of CP2K.
subroutine, public external_control(should_stop, flag, globenv, target_time, start_time, force_check)
External manipulations during a run : when the <PROJECT_NAME>.EXIT_$runtype command is sent the progr...
pool for for elements that are retained and released
subroutine, public fm_pool_create_fm(pool, element, name)
returns an element, allocating it if none is in the pool
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_element(matrix, irow_global, icol_global, alpha, local)
returns an element of a fm this value is valid on every cpu using this call is expensive
subroutine, public cp_fm_set_submatrix(fm, new_values, start_row, start_col, n_rows, n_cols, alpha, beta, transpose)
sets a submatrix of a full matrix fm(start_row:start_row+n_rows,start_col:start_col+n_cols) = alpha*o...
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
subroutine, public cp_fm_get_submatrix(fm, target_m, start_row, start_col, n_rows, n_cols, transpose)
gets a submatrix of a full matrix op(target_m)(1:n_rows,1:n_cols) =fm(start_row:start_row+n_rows,...
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Utility routines for the memory handling.
Interface to the message passing library MPI.
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public ncoset
basic linear algebra operations for full matrixes
Define methods related to particle_type.
subroutine, public get_particle_set(particle_set, qs_kind_set, first_sgf, last_sgf, nsgf, nmao, basis, ncgf)
Get the components of a particle set.
Define the data structure for the particle information.
Periodic Table related data definitions.
type(atom), dimension(0:nelem), public ptable
Definition of physical constants:
real(kind=dp), parameter, public evolt
Apply the direct inversion in the iterative subspace (DIIS) of Pulay in the framework of an SCF itera...
pure subroutine, public qs_diis_b_clear(diis_buffer)
clears the buffer
subroutine, public qs_diis_b_create(diis_buffer, nbuffer)
Allocates an SCF DIIS buffer.
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, mimic, ewald_env, ewald_pw, mpools, rho_external, external_vxc, mask, scf_control, rel_control, qs_charges, ks_env, ks_qmmm_env, wf_history, scf_env, active_space, input, oce, rho_atom_set, rho0_atom_set, rho0_mpole, run_rtp, rtp, rhoz_set, rhoz_tot, ecoul_1c, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, efield, rhoz_cneo_set, linres_control, xas_env, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, ls_scf_env, do_transport, transport_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, harris_env, gcp_env, mp2_env, bs_env, kg_env, force, kpoints, wanniercentres, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Set the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, hund_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, proj_shell_charge, lr_atom, do_mtlr, u_j_loop, ao_coef, init_u_ramping_each_scf, reltmat, ghost, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
Driver for the localization that should be general for all the methods available and all the definiti...
subroutine, public qs_loc_driver(qs_env, qs_loc_env, print_loc_section, myspin, ext_mo_coeff)
set up the calculation of localized orbitals
Driver for the localization that should be general for all the methods available and all the definiti...
subroutine, public qs_print_cubes(qs_env, mo_coeff, nstates, state_list, centers, print_key, root, ispin, idir, state0, file_position)
write the cube files for a set of selected states
New version of the module for the localization of the molecular orbitals This should be able to use d...
subroutine, public qs_loc_env_create(qs_loc_env)
...
Some utilities for the construction of the localization environment.
subroutine, public set_loc_wfn_lists(localized_wfn_control, nmoloc, nmo, nspins, my_spin)
create the lists of mos that are taken into account
subroutine, public qs_loc_env_init(qs_loc_env, localized_wfn_control, qs_env, myspin, do_localize, loc_coeff, mo_loc_history)
allocates the data, and initializes the operators
subroutine, public set_loc_centers(localized_wfn_control, nmoloc, nspins)
create the center and spread array and the file names for the output
subroutine, public qs_loc_control_init(qs_loc_env, loc_section, do_homo, do_mixed, do_xas, nloc_xas, spin_xas)
initializes everything needed for localization of the HOMOs
wrapper for the pools of matrixes
subroutine, public mpools_get(mpools, ao_mo_fm_pools, ao_ao_fm_pools, mo_mo_fm_pools, ao_mosub_fm_pools, mosub_mosub_fm_pools, maxao_maxmo_fm_pool, maxao_maxao_fm_pool, maxmo_maxmo_fm_pool)
returns various attributes of the mpools (notably the pools contained in it)
Definition and initialisation of the mo data type.
subroutine, public write_mo_set_to_output_unit(mo_set, qs_kind_set, particle_set, dft_section, before, kpoint, final_mos, spin, solver_method, rtp, cpart, sim_step, umo_set, qs_env, para_env_inter_kp)
Write MO information to output file (eigenvalues, occupation numbers, coefficients).
collects routines that perform operations directly related to MOs
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.
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, cmo_coeff)
Get the components of a MO set data structure.
Calculates the moment integrals <a|r^m|b> and <a|r x d/dr|b>.
subroutine, public build_local_moment_matrix(qs_env, moments, nmoments, ref_point, ref_points, basis_type, all_images, minimum_image, neighbor_image, first_component)
...
Define the neighbor list data types and the corresponding functionality.
subroutine, public build_lin_mom_matrix(qs_env, matrix, minimum_image)
Calculation of the linear momentum matrix <mu|∂|nu> over Cartesian Gaussian functions.
Calculation and writing of projected density of states The DOS is computed per angular momentum and p...
subroutine, public calculate_projected_dos(mo_set, atomic_kind_set, qs_kind_set, particle_set, qs_env, dft_section, ispin, xas_mittle, external_matrix_shalf, unoccupied_orbs, unoccupied_evals, pdos_print_key, write_pdos, write_pdos_curve)
Compute and write projected density of states.
Utility routines for qs_scf.
subroutine, public qs_scf_env_initialize(qs_env, scf_env, scf_control, scf_section)
initializes input parameters if needed or restores values from previous runs to fill scf_env with the...
module that contains the definitions of the scf types
subroutine, public scf_env_release(scf_env)
releases an scf_env (see doc/ReferenceCounting.html)
Routines for the Quickstep SCF run.
subroutine, public scf_env_cleanup(scf_env)
perform cleanup operations (like releasing temporary storage) at the end of the scf
parameters that control an scf iteration
subroutine, public scf_c_read_parameters(scf_control, inp_section)
reads the parameters of the scf section into the given scf_control
subroutine, public scf_c_create(scf_control)
allocates and initializes an scf control object with the default values
Defines control structures, which contain the parameters and the settings for the calculations.
subroutine, public read_xas_control(xas_control, xas_section)
read from input the instructions for a xes/xas calculation
subroutine, public xas_control_create(xas_control)
create retain release the xas_control_type
subroutine, public write_xas_control(xas_control, dft_section)
write on the instructions for a xes/xas calculation
define create destroy get and put information in xas_env to calculate the x-ray absorption spectra
subroutine, public xas_env_release(xas_env)
...
subroutine, public set_xas_env(xas_env, 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)
...
subroutine, public xas_env_create(xas_env)
...
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)
...
driver for the xas calculation and xas_scf for the tp method
subroutine, public calc_stogto_overlap(base_a, base_b, matrix)
...
subroutine, public xas(qs_env, dft_control)
Driver for xas calculations The initial mos are prepared A loop on the atoms to be excited is started...
Initialize the XAS orbitals for specific core excitations Either the GS orbitals are used as initial ...
subroutine, public xas_read_restart(xas_env, xas_section, qs_env, xas_method, iatom, estate, istate)
Set up for reading the restart corresponding to the excitation of iatom If the corresponding restart ...
xas_scf for the tp method It is repeaated for every atom that have to be excited
subroutine, public xas_do_tp_scf(dft_control, xas_env, iatom, istate, scf_env, qs_env, xas_section, scf_section, converged, should_stop)
perform an scf loop to calculate the xas spectrum given by the excitation of a inner state of a selec...
subroutine, public xes_scf_once(qs_env, xas_env, converged, should_stop)
SCF for emission spectra calculations: vacancy in valence.
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
represent a pointer to a 2d array
keeps the information about the structure of a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.
A type that holds controlling information for the calculation of the spread of wfn and the optimizati...
contains all the info needed by quickstep to calculate the spread of a selected set of orbitals and i...
container for the pools of matrixes used by qs
A type that holds controlling information for a xas calculation.