(git:1f9fd2c)
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-2026 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
23 USE cp_dbcsr_api, ONLY: dbcsr_copy,&
37 cp_p_file,&
47 USE kinds, ONLY: dp
48 USE machine, ONLY: m_flush,&
73 USE qs_ks_types, ONLY: qs_ks_did_change,&
75 USE qs_loc_main, ONLY: qs_loc_driver
76 USE qs_loc_types, ONLY: get_qs_loc_env,&
83 USE qs_mo_types, ONLY: get_mo_set,&
87 USE qs_rho_types, ONLY: qs_rho_get,&
89 USE qs_scf, ONLY: scf_env_cleanup,&
99 USE xas_env_types, ONLY: get_xas_env,&
104#include "./base/base_uses.f90"
105
106 IMPLICIT NONE
107 PRIVATE
108
109 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xas_tp_scf'
110
111 ! *** Public subroutines ***
112
113 PUBLIC :: xas_do_tp_scf, xes_scf_once
114
115CONTAINS
116
117! **************************************************************************************************
118!> \brief perform an scf loop to calculate the xas spectrum
119!> given by the excitation of a inner state of a selected atom
120!> by using the transition potential method
121!> \param dft_control ...
122!> \param xas_env the environment for XAS calculations
123!> \param iatom ...
124!> \param istate keeps track of the state index for restart writing
125!> \param scf_env the scf_env where to perform the scf procedure
126!> \param qs_env the qs_env, the scf_env and xas_env live in
127!> \param xas_section ...
128!> \param scf_section ...
129!> \param converged ...
130!> \param should_stop ...
131!> \par History
132!> 05.2005 created [MI]
133!> \author MI
134! **************************************************************************************************
135 SUBROUTINE xas_do_tp_scf(dft_control, xas_env, iatom, istate, scf_env, qs_env, &
136 xas_section, scf_section, converged, should_stop)
137
138 TYPE(dft_control_type), POINTER :: dft_control
139 TYPE(xas_environment_type), POINTER :: xas_env
140 INTEGER, INTENT(IN) :: iatom, istate
141 TYPE(qs_scf_env_type), POINTER :: scf_env
142 TYPE(qs_environment_type), POINTER :: qs_env
143 TYPE(section_vals_type), POINTER :: xas_section, scf_section
144 LOGICAL, INTENT(OUT) :: converged, should_stop
145
146 CHARACTER(LEN=*), PARAMETER :: routinen = 'xas_do_tp_scf'
147
148 INTEGER :: handle, handle2, hole_spin, ispin, &
149 iter_count, my_spin, nspin, occ_spin, &
150 output_unit
151 LOGICAL :: diis_step, energy_only, exit_loop, gapw
152 REAL(kind=dp) :: t1, t2
153 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
154 TYPE(cp_logger_type), POINTER :: logger
155 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s
156 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp
157 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
158 TYPE(mp_para_env_type), POINTER :: para_env
159 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
160 TYPE(qs_charges_type), POINTER :: qs_charges
161 TYPE(qs_energy_type), POINTER :: energy
162 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
163 TYPE(qs_ks_env_type), POINTER :: ks_env
164 TYPE(qs_rho_type), POINTER :: rho
165 TYPE(scf_control_type), POINTER :: scf_control
166 TYPE(section_vals_type), POINTER :: dft_section
167 TYPE(xas_control_type), POINTER :: xas_control
168
169 CALL timeset(routinen, handle)
170 NULLIFY (xas_control, matrix_s, matrix_ks, para_env, rho_ao_kp)
171 NULLIFY (rho, energy, scf_control, logger, ks_env, mos, atomic_kind_set)
172 NULLIFY (qs_charges, particle_set, qs_kind_set)
173
174 logger => cp_get_default_logger()
175 t1 = m_walltime()
176 converged = .true.
177
178 cpassert(ASSOCIATED(xas_env))
179 cpassert(ASSOCIATED(scf_env))
180 cpassert(ASSOCIATED(qs_env))
181
182 CALL get_qs_env(qs_env=qs_env, &
183 atomic_kind_set=atomic_kind_set, &
184 matrix_s=matrix_s, energy=energy, &
185 qs_charges=qs_charges, &
186 ks_env=ks_env, para_env=para_env)
187
188 CALL get_xas_env(xas_env, scf_control=scf_control, spin_channel=my_spin)
189
190 energy_only = .false.
191 output_unit = cp_print_key_unit_nr(logger, xas_section, "PRINT%PROGRAM_RUN_INFO", &
192 extension=".xasLog")
193 IF (output_unit > 0) THEN
194 WRITE (unit=output_unit, fmt="(/,/,T2,A)") "XAS_TP_SCF WAVEFUNCTION OPTIMIZATION"
195 END IF
196
197 ! GAPW method must be used
198 gapw = dft_control%qs_control%gapw
199 cpassert(gapw)
200 xas_control => dft_control%xas_control
201
202 CALL cp_add_iter_level(logger%iter_info, "XAS_SCF")
203
204 CALL get_qs_env(qs_env, matrix_ks=matrix_ks, rho=rho, mos=mos)
205 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
206
207 iter_count = 0
208 diis_step = .false.
209 nspin = dft_control%nspins
210
211 IF (output_unit > 0) THEN
212 WRITE (unit=output_unit, &
213 fmt="(/,T3,A,T12,A,T31,A,T40,A,T60,A,T75,A/,T3,A)") &
214 "Step", "Update method", "Time", "Convergence", "Total energy", "Change", &
215 repeat("-", 77)
216 END IF
217
218 ! *** SCF loop ***
219
220 energy%tot_old = 0.0_dp
221 scf_loop: DO
222 CALL timeset(routinen//"_inner_loop", handle2)
223
224 exit_loop = .false.
225 IF (output_unit > 0) CALL m_flush(output_unit)
226
227 iter_count = iter_count + 1
228 CALL cp_iterate(logger%iter_info, last=.false., iter_nr=iter_count)
229
230 ! ** here qs_env%rho%rho_r and qs_env%rho%rho_g should be up to date
231
232 CALL qs_ks_update_qs_env(qs_env, calculate_forces=.false., just_energy=energy_only)
233
234 SELECT CASE (scf_env%method)
235 CASE DEFAULT
236 CALL cp_abort(__location__, &
237 "unknown scf method method for core level spectroscopy"// &
238 cp_to_string(scf_env%method))
239
240 CASE (general_diag_method_nr) ! diagonalisation (default)
241
242 scf_env%iter_count = iter_count
243 CALL general_eigenproblem(scf_env, mos, matrix_ks, &
244 matrix_s, scf_control, scf_section, &
245 diis_step)
246
247 CALL find_excited_core_orbital(xas_env, mos, matrix_s)
248
249 ! set occupation for the respective spin channels
250 IF (my_spin == 1) THEN
251 hole_spin = 1 ! hole is generated in channel 1
252 occ_spin = 2
253 ELSE
254 hole_spin = 2
255 occ_spin = 1
256 END IF
257 CALL set_mo_occupation(mo_set=mos(hole_spin), &
258 smear=scf_control%smear, &
259 xas_env=xas_env)
260 CALL set_mo_occupation(mo_set=mos(occ_spin), &
261 smear=scf_control%smear)
262 DO ispin = 1, nspin
263 ! does not yet handle k-points
264 CALL calculate_density_matrix(mos(ispin), &
265 scf_env%p_mix_new(ispin, 1)%matrix)
266 END DO
267 energy%kTS = 0.0_dp
268 energy%efermi = 0.0_dp
269 DO ispin = 1, nspin
270 energy%kTS = energy%kTS + mos(ispin)%kTS
271 energy%efermi = energy%efermi + mos(ispin)%mu
272 END DO
273 energy%efermi = energy%efermi/real(nspin, kind=dp)
274
275 END SELECT
276
277 SELECT CASE (scf_env%mixing_method)
278 CASE (direct_mixing_nr)
279 CALL scf_env_density_mixing(scf_env%p_mix_new, &
280 scf_env%mixing_store, rho_ao_kp, para_env, scf_env%iter_delta, scf_env%iter_count, &
281 diis=diis_step)
284 ! Compute the difference p_out-p_in
285 CALL self_consistency_check(rho_ao_kp, scf_env%p_delta, para_env, scf_env%p_mix_new, &
286 delta=scf_env%iter_delta)
287 CASE (no_mixing_nr)
288 CASE DEFAULT
289 CALL cp_abort(__location__, &
290 "unknown scf mixing method: "// &
291 cp_to_string(scf_env%mixing_method))
292 END SELECT
293
294 t2 = m_walltime()
295
296 IF (output_unit > 0 .AND. scf_env%print_iter_line) THEN
297 WRITE (unit=output_unit, &
298 fmt="(T2,I5,1X,A,T20,E8.2,1X,F6.1,1X,F14.8,1X,F20.10,1X,ES9.2)") &
299 iter_count, trim(scf_env%iter_method), &
300 scf_env%iter_param, t2 - t1, scf_env%iter_delta, energy%total, &
301 energy%total - energy%tot_old
302 END IF
303 energy%tot_old = energy%total
304
305 ! ** convergence check
306 CALL external_control(should_stop, "XASSCF", target_time=qs_env%target_time, &
307 start_time=qs_env%start_time)
308 IF (scf_env%iter_delta < scf_control%eps_scf) THEN
309 IF (output_unit > 0) THEN
310 WRITE (unit=output_unit, fmt="(/,T3,A,I5,A/)") &
311 "*** SCF run converged in ", iter_count, " steps ***"
312 END IF
313 exit_loop = .true.
314 ELSE IF (should_stop .OR. iter_count == scf_control%max_scf) THEN
315 IF (output_unit > 0) THEN
316 WRITE (unit=output_unit, fmt="(/,T3,A,/)") &
317 "*** SCF run NOT converged ***"
318 END IF
319 converged = .false.
320 exit_loop = .true.
321 END IF
322 ! *** Exit if we have finished with the SCF inner loop ***
323 IF (exit_loop) THEN
324 ! now, print out energies and charges corresponding to the obtained wfn
325 ! (this actually is not 100% consistent at this point)!
326 CALL qs_scf_print_summary(output_unit, qs_env)
327 CALL cp_iterate(logger%iter_info, last=.true., iter_nr=iter_count)
328 END IF
329
330 ! ** Write restart file **
331 CALL xas_write_restart(xas_env, xas_section, qs_env, xas_control%xas_method, &
332 iatom, istate)
333
334 dft_section => section_vals_get_subs_vals(qs_env%input, "DFT")
335 CALL get_qs_env(qs_env=qs_env, mos=mos, particle_set=particle_set, qs_kind_set=qs_kind_set)
336 CALL write_mo_set_to_restart(mos, particle_set, dft_section=dft_section, qs_kind_set=qs_kind_set)
337
338 IF (exit_loop) THEN
339 CALL timestop(handle2)
340 EXIT scf_loop
341 END IF
342
343 IF (.NOT. btest(cp_print_key_should_output(logger%iter_info, &
344 xas_section, "PRINT%ITERATION_INFO/TIME_CUMUL"), cp_p_file)) t1 = m_walltime()
345
346 ! *** mixing methods have the new density matrix in p_mix_new
347 IF (scf_env%mixing_method > 0) THEN
348 DO ispin = 1, nspin
349 ! does not yet handle k-points
350 CALL dbcsr_copy(rho_ao_kp(ispin, 1)%matrix, scf_env%p_mix_new(ispin, 1)%matrix)
351 END DO
352 END IF
353
354 ! ** update qs_env%rho
355 CALL qs_rho_update_rho(rho, qs_env=qs_env)
356 IF (scf_env%mixing_method >= gspace_mixing_nr) THEN
357 CALL gspace_mixing(qs_env, scf_env%mixing_method, scf_env%mixing_store, rho, para_env, &
358 scf_env%iter_count)
359 END IF
360
361 CALL qs_ks_did_change(ks_env, rho_changed=.true.)
362 CALL timestop(handle2)
363
364 END DO scf_loop
365
366 IF (output_unit > 0) THEN
367 WRITE (unit=output_unit, fmt="(/,(T3,A,T55,F25.14))") &
368 "Ionization potential of the excited atom: ", xas_env%IP_energy
369 CALL m_flush(output_unit)
370 END IF
371
372 CALL para_env%sync()
373 CALL qs_ks_did_change(ks_env, rho_changed=.true.)
374
375 CALL cls_prepare_states(xas_control, xas_env, qs_env, iatom, xas_section, output_unit)
376
377 CALL para_env%sync()
378
379 CALL cp_print_key_finished_output(output_unit, logger, xas_section, &
380 "PRINT%PROGRAM_RUN_INFO")
381 CALL cp_rm_iter_level(logger%iter_info, "XAS_SCF")
382
383 CALL timestop(handle)
384
385 END SUBROUTINE xas_do_tp_scf
386! **************************************************************************************************
387!> \brief Post processing of the optimized wfn in XAS scheme, as preparation for
388!> the calculation of the spectrum
389!> \param xas_control ...
390!> \param xas_env the environment for XAS calculations
391!> \param qs_env the qs_env, the scf_env and xas_env live in
392!> \param iatom index of the excited atom
393!> \param xas_section ...
394!> \param output_unit ...
395!> \par History
396!> 05.2005 created [MI]
397!> \author MI
398! **************************************************************************************************
399 SUBROUTINE cls_prepare_states(xas_control, xas_env, qs_env, iatom, xas_section, output_unit)
400
402 TYPE(xas_environment_type), POINTER :: xas_env
403 TYPE(qs_environment_type), POINTER :: qs_env
404 INTEGER, INTENT(IN) :: iatom
405 TYPE(section_vals_type), POINTER :: xas_section
406 INTEGER, INTENT(IN) :: output_unit
407
408 CHARACTER(LEN=*), PARAMETER :: routinen = 'cls_prepare_states'
409
410 INTEGER :: handle, i, ikind, isgf, ispin, istate, j, my_kind, my_spin, my_state, nao, natom, &
411 nexc_search, nmo, nvirtual2, uno_iter, xas_estate
412 INTEGER, ALLOCATABLE, DIMENSION(:) :: first_sgf
413 INTEGER, DIMENSION(:), POINTER :: mykind_of_kind
414 REAL(dp), DIMENSION(:, :), POINTER :: centers_wfn
415 REAL(kind=dp) :: component, dist, max_overlap, ra(3), &
416 rac(3), rc(3), sto_state_overlap, &
417 uno_eps
418 REAL(kind=dp), DIMENSION(:), POINTER :: all_evals, eigenvalues, uno_evals
419 REAL(kind=dp), DIMENSION(:, :), POINTER :: vecbuffer
420 TYPE(atomic_kind_type), POINTER :: atomic_kind
421 TYPE(cell_type), POINTER :: cell
422 TYPE(cp_2d_r_p_type), DIMENSION(:), POINTER :: stogto_overlap
423 TYPE(cp_blacs_env_type), POINTER :: blacs_env
424 TYPE(cp_fm_type), POINTER :: all_vectors, excvec_coeff, &
425 excvec_overlap, mo_coeff, uno_orbs
426 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: kinetic, matrix_ks, matrix_s
427 TYPE(dft_control_type), POINTER :: dft_control
428 TYPE(localized_wfn_control_type), POINTER :: localized_wfn_control
429 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
430 TYPE(mp_para_env_type), POINTER :: para_env
431 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
432 TYPE(preconditioner_type), POINTER :: local_preconditioner
433 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
434 TYPE(qs_loc_env_type), POINTER :: qs_loc_env
435 TYPE(scf_control_type), POINTER :: scf_control
436 TYPE(section_vals_type), POINTER :: loc_section, print_loc_section
437
438 CALL timeset(routinen, handle)
439
440 NULLIFY (atomic_kind, dft_control, matrix_s, matrix_ks, qs_kind_set, kinetic)
441 NULLIFY (cell, particle_set, local_preconditioner, vecbuffer)
442 NULLIFY (dft_control, loc_section, mos, mo_coeff, eigenvalues)
443 NULLIFY (centers_wfn, mykind_of_kind, qs_loc_env, localized_wfn_control, stogto_overlap)
444 NULLIFY (all_evals, all_vectors, excvec_coeff, excvec_overlap, uno_evals, para_env, blacs_env)
445
446 cpassert(ASSOCIATED(xas_env))
447
448 CALL get_qs_env(qs_env, &
449 cell=cell, &
450 dft_control=dft_control, &
451 matrix_ks=matrix_ks, &
452 matrix_s=matrix_s, &
453 kinetic=kinetic, &
454 mos=mos, &
455 particle_set=particle_set, &
456 qs_kind_set=qs_kind_set, &
457 para_env=para_env, &
458 blacs_env=blacs_env)
459
460 ! Some elements from the xas_env
461 CALL get_xas_env(xas_env=xas_env, &
462 all_vectors=all_vectors, all_evals=all_evals, &
463 excvec_coeff=excvec_coeff, &
464 nvirtual2=nvirtual2, xas_estate=xas_estate, &
465 excvec_overlap=excvec_overlap, nexc_search=nexc_search, &
466 spin_channel=my_spin, scf_control=scf_control)
467 cpassert(ASSOCIATED(excvec_overlap))
468
469 CALL get_mo_set(mos(my_spin), mo_coeff=mo_coeff, nao=nao, &
470 eigenvalues=eigenvalues)
471
472 ALLOCATE (vecbuffer(1, nao))
473 vecbuffer = 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
506 ! Rotate the wfn to get the eigenstate of the KS hamiltonian
507 ! Only ispin=1 should be needed
508 DO ispin = 1, dft_control%nspins
509 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, nmo=nmo, &
510 eigenvalues=eigenvalues)
511 CALL calculate_subspace_eigenvalues(mo_coeff, &
512 matrix_ks(ispin)%matrix, eigenvalues, &
513 do_rotation=.true.)
514 END DO ! ispin
515
516 !Search for the core state to be excited
517 max_overlap = 0.0_dp
518 DO istate = 1, nexc_search
519 centers_wfn(1, istate) = localized_wfn_control%centers_set(my_spin)%array(1, istate)
520 centers_wfn(2, istate) = localized_wfn_control%centers_set(my_spin)%array(2, istate)
521 centers_wfn(3, istate) = localized_wfn_control%centers_set(my_spin)%array(3, istate)
522
523 rc(1:3) = centers_wfn(1:3, istate)
524 rac = pbc(ra, rc, cell)
525 dist = rac(1)*rac(1) + rac(2)*rac(2) + rac(3)*rac(3)
526
527 IF (dist < 1.0_dp) THEN
528 CALL cp_fm_get_submatrix(mo_coeff, vecbuffer, 1, istate, &
529 nao, 1, transpose=.true.)
530 sto_state_overlap = 0.0_dp
531 DO i = 1, SIZE(stogto_overlap(my_kind)%array, 1)
532 component = 0.0_dp
533 DO j = 1, SIZE(stogto_overlap(my_kind)%array, 2)
534 isgf = first_sgf(iatom) + j - 1
535 component = component + stogto_overlap(my_kind)%array(i, j)*vecbuffer(1, isgf)
536 END DO ! j size
537 sto_state_overlap = sto_state_overlap + &
538 component*component
539 END DO ! i size
540
541 IF (sto_state_overlap > max_overlap) THEN
542 max_overlap = sto_state_overlap
543 my_state = istate
544 END IF
545 END IF
546 END DO ! istate
547
548 IF (my_state == 0) &
549 cpabort("Could not identify the core state to be excited")
550 xas_estate = my_state
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, vecbuffer, 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 > 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 > 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 (centers_wfn, first_sgf)
626
627 CALL timestop(handle)
628
629 END SUBROUTINE cls_prepare_states
630
631! **************************************************************************************************
632!> \brief SCF for emission spectra calculations: vacancy in valence
633!> \param qs_env the qs_env, the scf_env and xas_env live in
634!> \param xas_env the environment for XAS calculations
635!> \param converged ...
636!> \param should_stop ...
637!> \par History
638!> 05.2005 created [MI]
639!> \author MI
640! **************************************************************************************************
641 SUBROUTINE xes_scf_once(qs_env, xas_env, converged, should_stop)
642
643 TYPE(qs_environment_type), POINTER :: qs_env
644 TYPE(xas_environment_type), POINTER :: xas_env
645 LOGICAL, INTENT(OUT) :: converged, should_stop
646
647 CHARACTER(LEN=*), PARAMETER :: routinen = 'xes_scf_once'
648
649 INTEGER :: handle, ispin, istate, my_spin, nmo, &
650 nvirtual, nvirtual2, output_unit, &
651 tsteps
652 REAL(kind=dp), DIMENSION(:), POINTER :: all_evals, eigenvalues
653 TYPE(cp_fm_type), POINTER :: all_vectors, mo_coeff
654 TYPE(cp_logger_type), POINTER :: logger
655 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks
656 TYPE(dft_control_type), POINTER :: dft_control
657 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
658 TYPE(mp_para_env_type), POINTER :: para_env
659 TYPE(qs_scf_env_type), POINTER :: scf_env
660 TYPE(scf_control_type), POINTER :: scf_control
661 TYPE(section_vals_type), POINTER :: dft_section, scf_section, xas_section
662 TYPE(xas_control_type), POINTER :: xas_control
663
664 NULLIFY (dft_control, scf_control, scf_env, matrix_ks, mos, para_env, xas_control)
665 NULLIFY (dft_section, xas_section, scf_section, all_vectors, mo_coeff, all_evals, eigenvalues)
666 NULLIFY (logger)
667 logger => cp_get_default_logger()
668 output_unit = cp_logger_get_default_io_unit(logger)
669
670 CALL timeset(routinen, handle)
671
672 cpassert(ASSOCIATED(xas_env))
673 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, &
674 matrix_ks=matrix_ks, mos=mos, para_env=para_env)
675
676 xas_control => dft_control%xas_control
677 CALL get_xas_env(xas_env, scf_control=scf_control, spin_channel=my_spin)
678
679 dft_section => section_vals_get_subs_vals(qs_env%input, "DFT")
680 xas_section => section_vals_get_subs_vals(dft_section, "XAS")
681 scf_section => section_vals_get_subs_vals(xas_section, "SCF")
682
683 IF (xas_env%homo_occ == 0) THEN
684
685 NULLIFY (scf_env)
686 CALL get_xas_env(xas_env, scf_env=scf_env)
687 IF (.NOT. ASSOCIATED(scf_env)) THEN
688 CALL qs_scf_env_initialize(qs_env, scf_env, scf_control, scf_section)
689 CALL set_xas_env(xas_env, scf_env=scf_env)
690 ELSE
691 CALL qs_scf_env_initialize(qs_env, scf_env, scf_control, scf_section)
692 END IF
693
694 CALL scf_env_do_scf(scf_env=scf_env, scf_control=scf_control, qs_env=qs_env, &
695 converged=converged, should_stop=should_stop, total_scf_steps=tsteps)
696 CALL scf_env_cleanup(scf_env)
697
698 END IF
699
700 ! The eigenstate of the KS Hamiltonian are nedeed
701 NULLIFY (mo_coeff, eigenvalues)
702 IF (scf_control%use_ot) THEN
703 IF (output_unit > 0) THEN
704 WRITE (unit=output_unit, fmt="(/,T10,A,/)") &
705 "Get eigenstates and eigenvalues from ground state MOs"
706 END IF
707 DO ispin = 1, SIZE(mos)
708 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, &
709 eigenvalues=eigenvalues)
710 CALL calculate_subspace_eigenvalues(mo_coeff, &
711 matrix_ks(ispin)%matrix, eigenvalues, &
712 do_rotation=.true.)
713 END DO
714 END IF
715 CALL get_xas_env(xas_env=xas_env, all_vectors=all_vectors, &
716 all_evals=all_evals, nvirtual2=nvirtual2)
717 CALL get_mo_set(mos(my_spin), eigenvalues=eigenvalues, mo_coeff=mo_coeff, nmo=nmo)
718
719 CALL cp_fm_to_fm(mo_coeff, all_vectors, ncol=nmo, &
720 source_start=1, target_start=1)
721 DO istate = 1, nmo
722 all_evals(istate) = eigenvalues(istate)
723 END DO
724
725 IF (nvirtual2 /= 0) THEN
726 IF (output_unit > 0) THEN
727 WRITE (unit=output_unit, fmt="(/,T10,A,/)") &
728 "WARNING: for this XES calculation additional unoccupied MOs are not needed"
729 END IF
730 nvirtual2 = 0
731 nvirtual = nmo
732 CALL set_xas_env(xas_env=xas_env, nvirtual=nvirtual, nvirtual2=nvirtual2)
733 END IF
734
735 CALL timestop(handle)
736
737 END SUBROUTINE xes_scf_once
738
739END 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...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
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:124
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Definition machine.F:141
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, ncgf)
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 new_pulay_mixing_nr
integer, parameter, public broyden_mixing_nr
integer, parameter, public modified_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, 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, 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 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, matrix_ks)
...
Definition qs_mo_io.F:117
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:1023
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:352
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:137
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:642
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
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