(git:374b731)
Loading...
Searching...
No Matches
xas_tp_scf.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief xas_scf for the tp method
10!> It is repeaated for every atom that have to be excited
11!> \par History
12!> created 05.2005
13!> \author MI (05.2005)
14! **************************************************************************************************
18 USE cell_types, ONLY: cell_type,&
19 pbc
35 cp_p_file,&
40 USE dbcsr_api, ONLY: dbcsr_copy,&
41 dbcsr_p_type
47 USE kinds, ONLY: dp
48 USE machine, ONLY: m_flush,&
71 USE qs_ks_types, ONLY: qs_ks_did_change,&
73 USE qs_loc_main, ONLY: qs_loc_driver
74 USE qs_loc_types, ONLY: get_qs_loc_env,&
81 USE qs_mo_types, ONLY: get_mo_set,&
85 USE qs_rho_types, ONLY: qs_rho_get,&
87 USE qs_scf, ONLY: scf_env_cleanup,&
97 USE xas_env_types, ONLY: get_xas_env,&
102#include "./base/base_uses.f90"
103
104 IMPLICIT NONE
105 PRIVATE
106
107 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xas_tp_scf'
108
109 ! *** Public subroutines ***
110
111 PUBLIC :: xas_do_tp_scf, xes_scf_once
112
113CONTAINS
114
115! **************************************************************************************************
116!> \brief perform an scf loop to calculate the xas spectrum
117!> given by the excitation of a inner state of a selected atom
118!> by using the transition potential method
119!> \param dft_control ...
120!> \param xas_env the environment for XAS calculations
121!> \param iatom ...
122!> \param istate keeps track of the state index for restart writing
123!> \param scf_env the scf_env where to perform the scf procedure
124!> \param qs_env the qs_env, the scf_env and xas_env live in
125!> \param xas_section ...
126!> \param scf_section ...
127!> \param converged ...
128!> \param should_stop ...
129!> \par History
130!> 05.2005 created [MI]
131!> \author MI
132! **************************************************************************************************
133 SUBROUTINE xas_do_tp_scf(dft_control, xas_env, iatom, istate, scf_env, qs_env, &
134 xas_section, scf_section, converged, should_stop)
135
136 TYPE(dft_control_type), POINTER :: dft_control
137 TYPE(xas_environment_type), POINTER :: xas_env
138 INTEGER, INTENT(IN) :: iatom, istate
139 TYPE(qs_scf_env_type), POINTER :: scf_env
140 TYPE(qs_environment_type), POINTER :: qs_env
141 TYPE(section_vals_type), POINTER :: xas_section, scf_section
142 LOGICAL, INTENT(OUT) :: converged, should_stop
143
144 CHARACTER(LEN=*), PARAMETER :: routinen = 'xas_do_tp_scf'
145
146 INTEGER :: handle, handle2, hole_spin, ispin, &
147 iter_count, my_spin, nspin, occ_spin, &
148 output_unit
149 LOGICAL :: diis_step, energy_only, exit_loop, gapw
150 REAL(kind=dp) :: t1, t2
151 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
152 TYPE(cp_logger_type), POINTER :: logger
153 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s
154 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
155 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
156 TYPE(mp_para_env_type), POINTER :: para_env
157 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
158 TYPE(qs_charges_type), POINTER :: qs_charges
159 TYPE(qs_energy_type), POINTER :: energy
160 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
161 TYPE(qs_ks_env_type), POINTER :: ks_env
162 TYPE(qs_rho_type), POINTER :: rho
163 TYPE(scf_control_type), POINTER :: scf_control
164 TYPE(section_vals_type), POINTER :: dft_section
165 TYPE(xas_control_type), POINTER :: xas_control
166
167 CALL timeset(routinen, handle)
168 NULLIFY (xas_control, matrix_s, matrix_ks, para_env, rho_ao_kp)
169 NULLIFY (rho, energy, scf_control, logger, ks_env, mos, atomic_kind_set)
170 NULLIFY (qs_charges, particle_set, qs_kind_set)
171
172 logger => cp_get_default_logger()
173 t1 = m_walltime()
174 converged = .true.
175
176 cpassert(ASSOCIATED(xas_env))
177 cpassert(ASSOCIATED(scf_env))
178 cpassert(ASSOCIATED(qs_env))
179
180 CALL get_qs_env(qs_env=qs_env, &
181 atomic_kind_set=atomic_kind_set, &
182 matrix_s=matrix_s, energy=energy, &
183 qs_charges=qs_charges, &
184 ks_env=ks_env, para_env=para_env)
185
186 CALL get_xas_env(xas_env, scf_control=scf_control, spin_channel=my_spin)
187
188 energy_only = .false.
189 output_unit = cp_print_key_unit_nr(logger, xas_section, "PRINT%PROGRAM_RUN_INFO", &
190 extension=".xasLog")
191 IF (output_unit > 0) THEN
192 WRITE (unit=output_unit, fmt="(/,/,T2,A)") "XAS_TP_SCF WAVEFUNCTION OPTIMIZATION"
193 END IF
194
195 ! GAPW method must be used
196 gapw = dft_control%qs_control%gapw
197 cpassert(gapw)
198 xas_control => dft_control%xas_control
199
200 CALL cp_add_iter_level(logger%iter_info, "XAS_SCF")
201
202 CALL get_qs_env(qs_env, matrix_ks=matrix_ks, rho=rho, mos=mos)
203 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
204
205 iter_count = 0
206 diis_step = .false.
207 nspin = dft_control%nspins
208
209 IF (output_unit > 0) THEN
210 WRITE (unit=output_unit, &
211 fmt="(/,T3,A,T12,A,T31,A,T40,A,T60,A,T75,A/,T3,A)") &
212 "Step", "Update method", "Time", "Convergence", "Total energy", "Change", &
213 repeat("-", 77)
214 END IF
215
216 ! *** SCF loop ***
217
218 energy%tot_old = 0.0_dp
219 scf_loop: DO
220 CALL timeset(routinen//"_inner_loop", handle2)
221
222 exit_loop = .false.
223 IF (output_unit > 0) CALL m_flush(output_unit)
224
225 iter_count = iter_count + 1
226 CALL cp_iterate(logger%iter_info, last=.false., iter_nr=iter_count)
227
228 ! ** here qs_env%rho%rho_r and qs_env%rho%rho_g should be up to date
229
230 CALL qs_ks_update_qs_env(qs_env, calculate_forces=.false., just_energy=energy_only)
231
232 SELECT CASE (scf_env%method)
233 CASE DEFAULT
234 CALL cp_abort(__location__, &
235 "unknown scf method method for core level spectroscopy"// &
236 cp_to_string(scf_env%method))
237
238 CASE (general_diag_method_nr) ! diagonalisation (default)
239
240 scf_env%iter_count = iter_count
241 CALL general_eigenproblem(scf_env, mos, matrix_ks, &
242 matrix_s, scf_control, scf_section, &
243 diis_step)
244
245 CALL find_excited_core_orbital(xas_env, mos, matrix_s)
246
247 ! set occupation for the respective spin channels
248 IF (my_spin == 1) THEN
249 hole_spin = 1 ! hole is generated in channel 1
250 occ_spin = 2
251 ELSE
252 hole_spin = 2
253 occ_spin = 1
254 END IF
255 CALL set_mo_occupation(mo_set=mos(hole_spin), &
256 smear=scf_control%smear, &
257 xas_env=xas_env)
258 CALL set_mo_occupation(mo_set=mos(occ_spin), &
259 smear=scf_control%smear)
260 DO ispin = 1, nspin
261 ! does not yet handle k-points
262 CALL calculate_density_matrix(mos(ispin), &
263 scf_env%p_mix_new(ispin, 1)%matrix)
264 END DO
265 energy%kTS = 0.0_dp
266 energy%efermi = 0.0_dp
267 DO ispin = 1, nspin
268 energy%kTS = energy%kTS + mos(ispin)%kTS
269 energy%efermi = energy%efermi + mos(ispin)%mu
270 END DO
271 energy%efermi = energy%efermi/real(nspin, kind=dp)
272
273 END SELECT
274
275 SELECT CASE (scf_env%mixing_method)
276 CASE (direct_mixing_nr)
277 CALL scf_env_density_mixing(scf_env%p_mix_new, &
278 scf_env%mixing_store, rho_ao_kp, para_env, scf_env%iter_delta, scf_env%iter_count, &
279 diis=diis_step)
282 ! Compute the difference p_out-p_in
283 CALL self_consistency_check(rho_ao_kp, scf_env%p_delta, para_env, scf_env%p_mix_new, &
284 delta=scf_env%iter_delta)
285 CASE (no_mixing_nr)
286 CASE DEFAULT
287 CALL cp_abort(__location__, &
288 "unknown scf mixing method: "// &
289 cp_to_string(scf_env%mixing_method))
290 END SELECT
291
292 t2 = m_walltime()
293
294 IF (output_unit > 0 .AND. scf_env%print_iter_line) THEN
295 WRITE (unit=output_unit, &
296 fmt="(T2,I5,1X,A,T20,E8.2,1X,F6.1,1X,F14.8,1X,F20.10,1X,ES9.2)") &
297 iter_count, trim(scf_env%iter_method), &
298 scf_env%iter_param, t2 - t1, scf_env%iter_delta, energy%total, &
299 energy%total - energy%tot_old
300 END IF
301 energy%tot_old = energy%total
302
303 ! ** convergence check
304 CALL external_control(should_stop, "XASSCF", target_time=qs_env%target_time, &
305 start_time=qs_env%start_time)
306 IF (scf_env%iter_delta < scf_control%eps_scf) THEN
307 IF (output_unit > 0) THEN
308 WRITE (unit=output_unit, fmt="(/,T3,A,I5,A/)") &
309 "*** SCF run converged in ", iter_count, " steps ***"
310 END IF
311 exit_loop = .true.
312 ELSE IF (should_stop .OR. iter_count == scf_control%max_scf) THEN
313 IF (output_unit > 0) THEN
314 WRITE (unit=output_unit, fmt="(/,T3,A,/)") &
315 "*** SCF run NOT converged ***"
316 END IF
317 converged = .false.
318 exit_loop = .true.
319 END IF
320 ! *** Exit if we have finished with the SCF inner loop ***
321 IF (exit_loop) THEN
322 ! now, print out energies and charges corresponding to the obtained wfn
323 ! (this actually is not 100% consistent at this point)!
324 CALL qs_scf_print_summary(output_unit, qs_env)
325 CALL cp_iterate(logger%iter_info, last=.true., iter_nr=iter_count)
326 END IF
327
328 ! ** Write restart file **
329 CALL xas_write_restart(xas_env, xas_section, qs_env, xas_control%xas_method, &
330 iatom, istate)
331
332 dft_section => section_vals_get_subs_vals(qs_env%input, "DFT")
333 CALL get_qs_env(qs_env=qs_env, mos=mos, particle_set=particle_set, qs_kind_set=qs_kind_set)
334 CALL write_mo_set_to_restart(mos, particle_set, dft_section=dft_section, qs_kind_set=qs_kind_set)
335
336 IF (exit_loop) THEN
337 CALL timestop(handle2)
338 EXIT scf_loop
339 END IF
340
341 IF (.NOT. btest(cp_print_key_should_output(logger%iter_info, &
342 xas_section, "PRINT%ITERATION_INFO/TIME_CUMUL"), cp_p_file)) t1 = m_walltime()
343
344 ! *** mixing methods have the new density matrix in p_mix_new
345 IF (scf_env%mixing_method > 0) THEN
346 DO ispin = 1, nspin
347 ! does not yet handle k-points
348 CALL dbcsr_copy(rho_ao_kp(ispin, 1)%matrix, scf_env%p_mix_new(ispin, 1)%matrix)
349 END DO
350 END IF
351
352 ! ** update qs_env%rho
353 CALL qs_rho_update_rho(rho, qs_env=qs_env)
354 IF (scf_env%mixing_method >= gspace_mixing_nr) THEN
355 CALL gspace_mixing(qs_env, scf_env%mixing_method, scf_env%mixing_store, rho, para_env, &
356 scf_env%iter_count)
357 END IF
358
359 CALL qs_ks_did_change(ks_env, rho_changed=.true.)
360 CALL timestop(handle2)
361
362 END DO scf_loop
363
364 IF (output_unit > 0) THEN
365 WRITE (unit=output_unit, fmt="(/,(T3,A,T55,F25.14))") &
366 "Ionization potential of the excited atom: ", xas_env%IP_energy
367 CALL m_flush(output_unit)
368 END IF
369
370 CALL para_env%sync()
371 CALL qs_ks_did_change(ks_env, rho_changed=.true.)
372
373 CALL cls_prepare_states(xas_control, xas_env, qs_env, iatom, xas_section, output_unit)
374
375 CALL para_env%sync()
376
377 CALL cp_print_key_finished_output(output_unit, logger, xas_section, &
378 "PRINT%PROGRAM_RUN_INFO")
379 CALL cp_rm_iter_level(logger%iter_info, "XAS_SCF")
380
381 CALL timestop(handle)
382
383 END SUBROUTINE xas_do_tp_scf
384! **************************************************************************************************
385!> \brief Post processing of the optimized wfn in XAS scheme, as preparation for
386!> the calculation of the spectrum
387!> \param xas_control ...
388!> \param xas_env the environment for XAS calculations
389!> \param qs_env the qs_env, the scf_env and xas_env live in
390!> \param iatom index of the excited atom
391!> \param xas_section ...
392!> \param output_unit ...
393!> \par History
394!> 05.2005 created [MI]
395!> \author MI
396! **************************************************************************************************
397 SUBROUTINE cls_prepare_states(xas_control, xas_env, qs_env, iatom, xas_section, output_unit)
398
400 TYPE(xas_environment_type), POINTER :: xas_env
401 TYPE(qs_environment_type), POINTER :: qs_env
402 INTEGER, INTENT(IN) :: iatom
403 TYPE(section_vals_type), POINTER :: xas_section
404 INTEGER, INTENT(IN) :: output_unit
405
406 CHARACTER(LEN=*), PARAMETER :: routinen = 'cls_prepare_states'
407
408 INTEGER :: handle, i, ikind, isgf, ispin, istate, j, my_kind, my_spin, my_state, nao, natom, &
409 nexc_search, nmo, nvirtual2, uno_iter, xas_estate
410 INTEGER, ALLOCATABLE, DIMENSION(:) :: first_sgf
411 INTEGER, DIMENSION(:), POINTER :: mykind_of_kind
412 REAL(dp), DIMENSION(:, :), POINTER :: centers_wfn
413 REAL(kind=dp) :: component, dist, max_overlap, ra(3), &
414 rac(3), rc(3), sto_state_overlap, &
415 uno_eps
416 REAL(kind=dp), DIMENSION(:), POINTER :: all_evals, eigenvalues, uno_evals
417 REAL(kind=dp), DIMENSION(:, :), POINTER :: vecbuffer, vecbuffer2
418 TYPE(atomic_kind_type), POINTER :: atomic_kind
419 TYPE(cell_type), POINTER :: cell
420 TYPE(cp_2d_r_p_type), DIMENSION(:), POINTER :: stogto_overlap
421 TYPE(cp_blacs_env_type), POINTER :: blacs_env
422 TYPE(cp_fm_type), POINTER :: all_vectors, excvec_coeff, &
423 excvec_overlap, mo_coeff, uno_orbs
424 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: kinetic, matrix_ks, matrix_s
425 TYPE(dft_control_type), POINTER :: dft_control
426 TYPE(localized_wfn_control_type), POINTER :: localized_wfn_control
427 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
428 TYPE(mp_para_env_type), POINTER :: para_env
429 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
430 TYPE(preconditioner_type), POINTER :: local_preconditioner
431 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
432 TYPE(qs_loc_env_type), POINTER :: qs_loc_env
433 TYPE(scf_control_type), POINTER :: scf_control
434 TYPE(section_vals_type), POINTER :: loc_section, print_loc_section
435
436 CALL timeset(routinen, handle)
437
438 NULLIFY (atomic_kind, dft_control, matrix_s, matrix_ks, qs_kind_set, kinetic)
439 NULLIFY (cell, particle_set, local_preconditioner, vecbuffer, vecbuffer2)
440 NULLIFY (dft_control, loc_section, mos, mo_coeff, eigenvalues)
441 NULLIFY (centers_wfn, mykind_of_kind, qs_loc_env, localized_wfn_control, stogto_overlap)
442 NULLIFY (all_evals, all_vectors, excvec_coeff, excvec_overlap, uno_evals, para_env, blacs_env)
443
444 cpassert(ASSOCIATED(xas_env))
445
446 CALL get_qs_env(qs_env, &
447 cell=cell, &
448 dft_control=dft_control, &
449 matrix_ks=matrix_ks, &
450 matrix_s=matrix_s, &
451 kinetic=kinetic, &
452 mos=mos, &
453 particle_set=particle_set, &
454 qs_kind_set=qs_kind_set, &
455 para_env=para_env, &
456 blacs_env=blacs_env)
457
458 ! Some elements from the xas_env
459 CALL get_xas_env(xas_env=xas_env, &
460 all_vectors=all_vectors, all_evals=all_evals, &
461 excvec_coeff=excvec_coeff, &
462 nvirtual2=nvirtual2, xas_estate=xas_estate, &
463 excvec_overlap=excvec_overlap, nexc_search=nexc_search, &
464 spin_channel=my_spin, scf_control=scf_control)
465 cpassert(ASSOCIATED(excvec_overlap))
466
467 CALL get_mo_set(mos(my_spin), mo_coeff=mo_coeff, nao=nao, &
468 eigenvalues=eigenvalues)
469
470 ALLOCATE (vecbuffer(1, nao))
471 vecbuffer = 0.0_dp
472 ALLOCATE (vecbuffer2(1, nao))
473 vecbuffer2 = 0.0_dp
474 natom = SIZE(particle_set, 1)
475 ALLOCATE (first_sgf(natom))
476 CALL get_particle_set(particle_set, qs_kind_set, first_sgf=first_sgf)
477 ALLOCATE (centers_wfn(3, nexc_search))
478 centers_wfn = 0.0_dp
479
480 ! Possible only for emission only
481 IF (scf_control%use_ot) THEN
482 IF (output_unit > 0) THEN
483 WRITE (unit=output_unit, fmt="(/,/,T2,A)") " Eigenstates are derived "// &
484 "from the MOs optimized by OT. Follows localization of the core states"// &
485 " to identify the excited orbital. "
486 END IF
487
488 CALL get_xas_env(xas_env=xas_env, &
489 mykind_of_kind=mykind_of_kind, qs_loc_env=qs_loc_env, &
490 stogto_overlap=stogto_overlap)
491 CALL get_qs_loc_env(qs_loc_env=qs_loc_env, &
492 localized_wfn_control=localized_wfn_control)
493 loc_section => section_vals_get_subs_vals(xas_section, "LOCALIZE")
494 print_loc_section => section_vals_get_subs_vals(loc_section, "PRINT")
495 CALL qs_loc_driver(qs_env, qs_loc_env, print_loc_section, myspin=1)
496 ra(1:3) = particle_set(iatom)%r(1:3)
497
498 NULLIFY (atomic_kind)
499 atomic_kind => particle_set(iatom)%atomic_kind
500 CALL get_atomic_kind(atomic_kind=atomic_kind, &
501 kind_number=ikind)
502 my_kind = mykind_of_kind(ikind)
503
504 my_state = 0
505 CALL cp_fm_get_submatrix(mo_coeff, vecbuffer2, 1, my_state, &
506 nao, 1, transpose=.true.)
507
508 ! Rotate the wfn to get the eigenstate of the KS hamiltonian
509 ! Only ispin=1 should be needed
510 DO ispin = 1, dft_control%nspins
511 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, nmo=nmo, &
512 eigenvalues=eigenvalues)
513 CALL calculate_subspace_eigenvalues(mo_coeff, &
514 matrix_ks(ispin)%matrix, eigenvalues, &
515 do_rotation=.true.)
516 END DO ! ispin
517
518 !Search for the core state to be excited
519 max_overlap = 0.0_dp
520 DO istate = 1, nexc_search
521 centers_wfn(1, istate) = localized_wfn_control%centers_set(my_spin)%array(1, istate)
522 centers_wfn(2, istate) = localized_wfn_control%centers_set(my_spin)%array(2, istate)
523 centers_wfn(3, istate) = localized_wfn_control%centers_set(my_spin)%array(3, istate)
524
525 rc(1:3) = centers_wfn(1:3, istate)
526 rac = pbc(ra, rc, cell)
527 dist = rac(1)*rac(1) + rac(2)*rac(2) + rac(3)*rac(3)
528
529 IF (dist < 1.0_dp) THEN
530 CALL cp_fm_get_submatrix(mo_coeff, vecbuffer, 1, istate, &
531 nao, 1, transpose=.true.)
532 sto_state_overlap = 0.0_dp
533 DO i = 1, SIZE(stogto_overlap(my_kind)%array, 1)
534 component = 0.0_dp
535 DO j = 1, SIZE(stogto_overlap(my_kind)%array, 2)
536 isgf = first_sgf(iatom) + j - 1
537 component = component + stogto_overlap(my_kind)%array(i, j)*vecbuffer(1, isgf)
538 END DO ! j size
539 sto_state_overlap = sto_state_overlap + &
540 component*component
541 END DO ! i size
542
543 IF (sto_state_overlap .GT. max_overlap) THEN
544 max_overlap = sto_state_overlap
545 my_state = istate
546 END IF
547 END IF
548 xas_estate = my_state
549 END DO ! istate
550
551 CALL get_mo_set(mos(my_spin), mo_coeff=mo_coeff)
552 CALL cp_fm_get_submatrix(mo_coeff, vecbuffer, 1, xas_estate, &
553 nao, 1, transpose=.true.)
554 CALL cp_fm_set_submatrix(excvec_coeff, vecbuffer2, 1, 1, &
555 nao, 1, transpose=.true.)
556 !
557 END IF
558
559 CALL para_env%sync()
560 !Calculate the virtual states from the KS matrix matrix_ks(1)
561 IF (nvirtual2 .GT. 0) THEN
562 NULLIFY (mo_coeff)
563 CALL get_mo_set(mos(my_spin), mo_coeff=mo_coeff, nmo=nmo)
564 IF (output_unit > 0) THEN
565 WRITE (unit=output_unit, fmt="(/,/,T2,A,I5,A,I6,A)") " Calculation of ", nvirtual2, &
566 " additional virtual states of the subspace complementary to the"// &
567 " lowest ", nmo, " states"
568 END IF
569
570 NULLIFY (uno_orbs, uno_evals, local_preconditioner)
571 ALLOCATE (local_preconditioner)
572 CALL init_preconditioner(local_preconditioner, para_env=para_env, &
573 blacs_env=blacs_env)
574
575 CALL make_preconditioner(local_preconditioner, &
576 precon_type=ot_precond_full_kinetic, &
577 solver_type=ot_precond_solver_default, &
578 matrix_h=matrix_ks(my_spin)%matrix, &
579 matrix_s=matrix_s(1)%matrix, &
580 matrix_t=kinetic(1)%matrix, &
581 convert_precond_to_dbcsr=.true., &
582 mo_set=mos(my_spin), energy_gap=0.2_dp)
583
584 CALL get_xas_env(xas_env=xas_env, unoccupied_orbs=uno_orbs, &
585 unoccupied_evals=uno_evals, unoccupied_eps=uno_eps, unoccupied_max_iter=uno_iter)
586 CALL cp_fm_init_random(uno_orbs, nvirtual2)
587
588 CALL ot_eigensolver(matrix_h=matrix_ks(my_spin)%matrix, matrix_s=matrix_s(1)%matrix, &
589 matrix_c_fm=uno_orbs, matrix_orthogonal_space_fm=mo_coeff, &
590 preconditioner=local_preconditioner, eps_gradient=uno_eps, &
591 iter_max=uno_iter, size_ortho_space=nmo)
592
593 CALL calculate_subspace_eigenvalues(uno_orbs, matrix_ks(my_spin)%matrix, &
594 uno_evals, do_rotation=.true.)
595 CALL destroy_preconditioner(local_preconditioner)
596
597 DEALLOCATE (local_preconditioner)
598 END IF
599
600 CALL para_env%sync()
601 ! Prapare arrays for the calculation of the spectrum
602 IF (.NOT. xas_control%xas_method == xas_dscf) THEN
603 ! Copy the final vectors in the array
604 NULLIFY (all_vectors, all_evals)
605 CALL get_xas_env(xas_env=xas_env, all_vectors=all_vectors, &
606 all_evals=all_evals)
607 CALL get_mo_set(mos(my_spin), eigenvalues=eigenvalues, mo_coeff=mo_coeff, &
608 nmo=nmo)
609
610 CALL cp_fm_to_fm(mo_coeff, all_vectors, ncol=nmo, &
611 source_start=1, target_start=1)
612 DO istate = 1, nmo
613 all_evals(istate) = eigenvalues(istate)
614 END DO
615 IF (nvirtual2 .GT. 0) THEN
616 CALL cp_fm_to_fm(uno_orbs, all_vectors, ncol=nvirtual2, &
617 source_start=1, target_start=1 + nmo)
618 DO istate = 1, nvirtual2
619 all_evals(istate + nmo) = uno_evals(istate)
620 END DO
621 END IF
622 END IF
623
624 DEALLOCATE (vecbuffer)
625 DEALLOCATE (vecbuffer2)
626 DEALLOCATE (centers_wfn, first_sgf)
627
628 CALL timestop(handle)
629
630 END SUBROUTINE cls_prepare_states
631
632! **************************************************************************************************
633!> \brief SCF for emission spectra calculations: vacancy in valence
634!> \param qs_env the qs_env, the scf_env and xas_env live in
635!> \param xas_env the environment for XAS calculations
636!> \param converged ...
637!> \param should_stop ...
638!> \par History
639!> 05.2005 created [MI]
640!> \author MI
641! **************************************************************************************************
642 SUBROUTINE xes_scf_once(qs_env, xas_env, converged, should_stop)
643
644 TYPE(qs_environment_type), POINTER :: qs_env
645 TYPE(xas_environment_type), POINTER :: xas_env
646 LOGICAL, INTENT(OUT) :: converged, should_stop
647
648 CHARACTER(LEN=*), PARAMETER :: routinen = 'xes_scf_once'
649
650 INTEGER :: handle, ispin, istate, my_spin, nmo, &
651 nvirtual, nvirtual2, output_unit, &
652 tsteps
653 REAL(kind=dp), DIMENSION(:), POINTER :: all_evals, eigenvalues
654 TYPE(cp_fm_type), POINTER :: all_vectors, mo_coeff
655 TYPE(cp_logger_type), POINTER :: logger
656 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks
657 TYPE(dft_control_type), POINTER :: dft_control
658 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
659 TYPE(mp_para_env_type), POINTER :: para_env
660 TYPE(qs_scf_env_type), POINTER :: scf_env
661 TYPE(scf_control_type), POINTER :: scf_control
662 TYPE(section_vals_type), POINTER :: dft_section, scf_section, xas_section
663 TYPE(xas_control_type), POINTER :: xas_control
664
665 NULLIFY (dft_control, scf_control, scf_env, matrix_ks, mos, para_env, xas_control)
666 NULLIFY (dft_section, xas_section, scf_section, all_vectors, mo_coeff, all_evals, eigenvalues)
667 NULLIFY (logger)
668 logger => cp_get_default_logger()
669 output_unit = cp_logger_get_default_io_unit(logger)
670
671 CALL timeset(routinen, handle)
672
673 cpassert(ASSOCIATED(xas_env))
674 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, &
675 matrix_ks=matrix_ks, mos=mos, para_env=para_env)
676
677 xas_control => dft_control%xas_control
678 CALL get_xas_env(xas_env, scf_control=scf_control, spin_channel=my_spin)
679
680 dft_section => section_vals_get_subs_vals(qs_env%input, "DFT")
681 xas_section => section_vals_get_subs_vals(dft_section, "XAS")
682 scf_section => section_vals_get_subs_vals(xas_section, "SCF")
683
684 IF (xas_env%homo_occ == 0) THEN
685
686 NULLIFY (scf_env)
687 CALL get_xas_env(xas_env, scf_env=scf_env)
688 IF (.NOT. ASSOCIATED(scf_env)) THEN
689 CALL qs_scf_env_initialize(qs_env, scf_env, scf_control, scf_section)
690 CALL set_xas_env(xas_env, scf_env=scf_env)
691 ELSE
692 CALL qs_scf_env_initialize(qs_env, scf_env, scf_control, scf_section)
693 END IF
694
695 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
696 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
697 CALL scf_env_cleanup(scf_env)
698
699 END IF
700
701 ! The eigenstate of the KS Hamiltonian are nedeed
702 NULLIFY (mo_coeff, eigenvalues)
703 IF (scf_control%use_ot) THEN
704 IF (output_unit > 0) THEN
705 WRITE (unit=output_unit, fmt="(/,T10,A,/)") &
706 "Get eigenstates and eigenvalues from ground state MOs"
707 END IF
708 DO ispin = 1, SIZE(mos)
709 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, &
710 eigenvalues=eigenvalues)
711 CALL calculate_subspace_eigenvalues(mo_coeff, &
712 matrix_ks(ispin)%matrix, eigenvalues, &
713 do_rotation=.true.)
714 END DO
715 END IF
716 CALL get_xas_env(xas_env=xas_env, all_vectors=all_vectors, &
717 all_evals=all_evals, nvirtual2=nvirtual2)
718 CALL get_mo_set(mos(my_spin), eigenvalues=eigenvalues, mo_coeff=mo_coeff, nmo=nmo)
719
720 CALL cp_fm_to_fm(mo_coeff, all_vectors, ncol=nmo, &
721 source_start=1, target_start=1)
722 DO istate = 1, nmo
723 all_evals(istate) = eigenvalues(istate)
724 END DO
725
726 IF (nvirtual2 /= 0) THEN
727 IF (output_unit > 0) THEN
728 WRITE (unit=output_unit, fmt="(/,T10,A,/)") &
729 "WARNING: for this XES calculation additional unoccupied MOs are not needed"
730 END IF
731 nvirtual2 = 0
732 nvirtual = nmo
733 CALL set_xas_env(xas_env=xas_env, nvirtual=nvirtual, nvirtual2=nvirtual2)
734 END IF
735
736 CALL timestop(handle)
737
738 END SUBROUTINE xes_scf_once
739
740END MODULE xas_tp_scf
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.
Handles all functions related to the CELL.
Definition cell_types.F:15
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
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...
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
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_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,...
subroutine, public cp_fm_init_random(matrix, ncol, start_col)
fills a matrix with random numbers
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
subroutine, public cp_iterate(iteration_info, last, iter_nr, increment, iter_nr_out)
adds one to the actual iteration
subroutine, public cp_rm_iter_level(iteration_info, level_name, n_rlevel_att)
Removes an iteration level.
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...
subroutine, public cp_add_iter_level(iteration_info, level_name, n_rlevel_new)
Adds an iteration level.
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public xas_dscf
integer, parameter, public ot_precond_full_kinetic
integer, parameter, public ot_precond_solver_default
objects that represent the structure of input sections and the data contained in an input section
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Machine interface based on Fortran 2003 and POSIX.
Definition machine.F:17
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Definition machine.F:106
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Definition machine.F:123
Interface to the message passing library MPI.
Define methods related to particle_type.
subroutine, public get_particle_set(particle_set, qs_kind_set, first_sgf, last_sgf, nsgf, nmao, basis)
Get the components of a particle set.
Define the data structure for the particle information.
types of preconditioners
subroutine, public init_preconditioner(preconditioner_env, para_env, blacs_env)
...
subroutine, public destroy_preconditioner(preconditioner_env)
...
computes preconditioners, and implements methods to apply them currently used in qs_ot
subroutine, public make_preconditioner(preconditioner_env, precon_type, solver_type, matrix_h, matrix_s, matrix_t, mo_set, energy_gap, convert_precond_to_dbcsr, chol_type)
...
container for information about total charges on the grids
collects routines that calculate density matrices
module that contains the definitions of the scf types
integer, parameter, public broyden_mixing_nr
integer, parameter, public no_mixing_nr
integer, parameter, public direct_mixing_nr
integer, parameter, public multisecant_mixing_nr
integer, parameter, public pulay_mixing_nr
integer, parameter, public gspace_mixing_nr
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, 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_nonbond, sab_almo, sab_kp, sab_kp_nosym, 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, 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, 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, ecoul_1c, rho0_s_rs, rho0_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, 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, rhs)
Get the QUICKSTEP environment.
subroutine, public gspace_mixing(qs_env, mixing_method, mixing_store, rho, para_env, iter_count)
Driver for the g-space mixing, calls the proper routine given the requested method.
Define the quickstep kind type and their sub types.
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public qs_ks_update_qs_env(qs_env, calculate_forces, just_energy, print_active)
updates the Kohn Sham matrix of the given qs_env (facility method)
subroutine, public qs_ks_did_change(ks_env, s_mstruct_changed, rho_changed, potential_changed, full_reset)
tells that some of the things relevant to the ks calculation did change. has to be called when change...
Driver for the localization that should be general for all the methods available and all the definiti...
Definition qs_loc_main.F:22
subroutine, public qs_loc_driver(qs_env, qs_loc_env, print_loc_section, myspin, ext_mo_coeff)
set up the calculation of localized orbitals
Definition qs_loc_main.F:96
New version of the module for the localization of the molecular orbitals This should be able to use d...
subroutine, public get_qs_loc_env(qs_loc_env, cell, local_molecules, localized_wfn_control, moloc_coeff, op_sm_set, op_fm_set, para_env, particle_set, weights, dim_op)
...
subroutine, public self_consistency_check(rho_ao, p_delta, para_env, p_out, delta)
...
Definition and initialisation of the mo data type.
Definition qs_mo_io.F:21
subroutine, public write_mo_set_to_restart(mo_array, particle_set, dft_section, qs_kind_set)
...
Definition qs_mo_io.F:107
collects routines that perform operations directly related to MOs
Set occupation of molecular orbitals.
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
an eigen-space solver for the generalised symmetric eigenvalue problem for sparse matrices,...
subroutine, public ot_eigensolver(matrix_h, matrix_s, matrix_orthogonal_space_fm, matrix_c_fm, preconditioner, eps_gradient, iter_max, size_ortho_space, silent, ot_settings)
...
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, task_list_external, task_list_external_soft, pw_env_external, para_env_external)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
Different diagonalization schemes that can be used for the iterative solution of the eigenvalue probl...
subroutine, public general_eigenproblem(scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, diis_step)
the inner loop of scf, specific to diagonalization with S matrix basically, in goes the ks matrix out...
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...
groups fairly general SCF methods, so that modules other than qs_scf can use them too split off from ...
subroutine, public scf_env_density_mixing(p_mix_new, mixing_store, rho_ao, para_env, iter_delta, iter_count, diis, invert)
perform (if requested) a density mixing
subroutine, public qs_scf_print_summary(output_unit, qs_env)
writes a summary of information after scf
module that contains the definitions of the scf types
integer, parameter, public general_diag_method_nr
Routines for the Quickstep SCF run.
Definition qs_scf.F:47
subroutine, public scf_env_cleanup(scf_env)
perform cleanup operations (like releasing temporary storage) at the end of the scf
Definition qs_scf.F:895
subroutine, public scf_env_do_scf(scf_env, scf_control, qs_env, converged, should_stop, total_scf_steps)
perform an scf loop
Definition qs_scf.F:337
parameters that control an scf iteration
Defines control structures, which contain the parameters and the settings for the calculations.
Definition xas_control.F:12
define create destroy get and put information in xas_env to calculate the x-ray absorption spectra
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 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)
...
Initialize the XAS orbitals for specific core excitations Either the GS orbitals are used as initial ...
Definition xas_restart.F:20
subroutine, public xas_write_restart(xas_env, xas_section, qs_env, xas_method, iatom, istate)
...
subroutine, public find_excited_core_orbital(xas_env, mos, matrix_s)
Find the index of the core orbital that has been excited by XAS.
xas_scf for the tp method It is repeaated for every atom that have to be excited
Definition xas_tp_scf.F:15
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...
Definition xas_tp_scf.F:135
subroutine, public xes_scf_once(qs_env, xas_env, converged, should_stop)
SCF for emission spectra calculations: vacancy in valence.
Definition xas_tp_scf.F:643
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Definition cell_types.F:55
represent a pointer to a 2d array
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
represent 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
Container for information about total charges on the grids.
Provides all information about a quickstep kind.
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
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...
keeps the density in various representations, keeping track of which ones are valid.
A type that holds controlling information for a xas calculation.
Definition xas_control.F:40