(git:295f299)
Loading...
Searching...
No Matches
qs_tddfpt2_methods.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
10 USE admm_types, ONLY: admm_type,&
13 USE bibliography, ONLY: grimme2013,&
17 cite_reference
18 USE cell_types, ONLY: cell_type
23 USE cp_dbcsr_api, ONLY: dbcsr_create,&
26 dbcsr_set,&
28 dbcsr_type_antisymmetric,&
29 dbcsr_type_symmetric
54 USE header, ONLY: tddfpt_header,&
59 USE input_constants, ONLY: &
69 USE kinds, ONLY: dp
71 USE kpoint_types, ONLY: get_kpoint_info,&
78 USE machine, ONLY: m_flush
83 USE physcon, ONLY: evolt
93 USE qs_mo_types, ONLY: get_mo_set,&
118 USE qs_tddfpt2_soc, ONLY: tddfpt_soc
138 USE rixs_types, ONLY: rixs_env_type,&
141 USE util, ONLY: sort
142 USE xc_write_output, ONLY: xc_write
143#include "./base/base_uses.f90"
144
145 IMPLICIT NONE
146
147 PRIVATE
148
149 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_tddfpt2_methods'
150
151 LOGICAL, PARAMETER, PRIVATE :: debug_this_module = .false.
152 ! number of first derivative components (3: d/dx, d/dy, d/dz)
153 INTEGER, PARAMETER, PRIVATE :: nderivs = 3
154 INTEGER, PARAMETER, PRIVATE :: maxspins = 2
155
157
158! **************************************************************************************************
159
160CONTAINS
161
162! **************************************************************************************************
163!> \brief Perform TDDFPT calculation. If calc_forces then it also builds the response vector for the
164!> Z-vector method and calculates some contributions to the force
165!> \param qs_env Quickstep environment
166!> \param calc_forces ...
167!> \param rixs_env ...
168!> \par History
169!> * 05.2016 created [Sergey Chulkov]
170!> * 06.2016 refactored to be used with Davidson eigensolver [Sergey Chulkov]
171!> * 03.2017 cleaned and refactored [Sergey Chulkov]
172!> \note Based on the subroutines tddfpt_env_init(), and tddfpt_env_deallocate().
173! **************************************************************************************************
174 SUBROUTINE tddfpt(qs_env, calc_forces, rixs_env)
175 TYPE(qs_environment_type), POINTER :: qs_env
176 LOGICAL, INTENT(IN) :: calc_forces
177 TYPE(rixs_env_type), OPTIONAL, POINTER :: rixs_env
178
179 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt'
180
181 INTEGER :: handle, ispin, istate, log_unit, mult, &
182 my_state, nao, nocc, nspins, &
183 nstate_max, nstates, nvirt, old_state
184 INTEGER, DIMENSION(maxspins) :: nactive
185 LOGICAL :: do_admm, do_exck, do_hfx, do_hfxlr, &
186 do_hfxsr, do_kpoints, do_rixs, do_sf, &
187 do_soc, lmult_tmp, state_change
188 REAL(kind=dp) :: gsmin, gsval, xsval
189 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: evals, ostrength
190 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
191 TYPE(cell_type), POINTER :: cell
192 TYPE(cp_blacs_env_type), POINTER :: blacs_env
193 TYPE(cp_fm_struct_type), POINTER :: matrix_struct
194 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: my_active, my_mos
195 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: dipole_op_mos_occ, evects, s_evects
196 TYPE(cp_logger_type), POINTER :: logger
197 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_ks_oep, matrix_s, &
198 matrix_s_aux_fit, &
199 matrix_s_aux_fit_vs_orb
200 TYPE(dft_control_type), POINTER :: dft_control
201 TYPE(excited_energy_type), POINTER :: ex_env
202 TYPE(full_kernel_env_type), TARGET :: full_kernel_env, kernel_env_admm_aux
203 TYPE(kernel_env_type) :: kernel_env
204 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos, mos_aux_fit
205 TYPE(mp_para_env_type), POINTER :: para_env
206 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
207 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
208 TYPE(qs_scf_env_type), POINTER :: scf_env
209 TYPE(rixs_control_type), POINTER :: rixs_control
210 TYPE(section_vals_type), POINTER :: hfxsr_section, kernel_section, &
211 lri_section, soc_section, &
212 tddfpt_print_section, tddfpt_section, &
213 xc_section
214 TYPE(stda_env_type), TARGET :: stda_kernel
215 TYPE(tddfpt2_control_type), POINTER :: tddfpt_control
216 TYPE(tddfpt2_valence_type), POINTER :: valence_state
217 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
218 POINTER :: gs_mos
219 TYPE(tddfpt_subgroup_env_type) :: sub_env
220 TYPE(tddfpt_work_matrices) :: work_matrices
221
222 CALL timeset(routinen, handle)
223
224 NULLIFY (logger)
225 logger => cp_get_default_logger()
226
227 NULLIFY (tddfpt_section, tddfpt_control)
228
229 CALL get_qs_env(qs_env, &
230 dft_control=dft_control, &
231 do_rixs=do_rixs)
232 do_kpoints = dft_control%nimages > 1
233
234 IF (do_rixs) THEN
235 tddfpt_section => section_vals_get_subs_vals(qs_env%input, "PROPERTIES%RIXS%TDDFPT")
236 NULLIFY (rixs_control, valence_state)
237 rixs_control => dft_control%rixs_control
238 tddfpt_control => rixs_control%tddfpt2_control
239 valence_state => rixs_env%valence_state
240 ELSE
241 tddfpt_section => section_vals_get_subs_vals(qs_env%input, "PROPERTIES%TDDFPT")
242 tddfpt_control => dft_control%tddfpt2_control
243 END IF
244
245 ! input section print/xc
246 CALL tddfpt_input(qs_env, tddfpt_section, tddfpt_control, do_hfx, do_admm, do_exck, &
247 do_hfxsr, do_hfxlr, xc_section, tddfpt_print_section, &
248 lri_section, hfxsr_section)
249
250 log_unit = cp_print_key_unit_nr(logger, tddfpt_print_section, "PROGRAM_BANNER", &
251 extension=".tddfptLog")
252
253 tddfpt_control%do_hfx = do_hfx
254 tddfpt_control%do_admm = do_admm
255 tddfpt_control%do_hfxsr = do_hfxsr
256 tddfpt_control%hfxsr_primbas = 0
257 tddfpt_control%hfxsr_re_int = .true.
258 tddfpt_control%do_hfxlr = do_hfxlr
259 tddfpt_control%do_exck = do_exck
260 do_sf = tddfpt_control%spinflip /= no_sf_tddfpt
261 IF (do_sf) CALL cite_reference(hernandez2025)
262 IF (tddfpt_control%do_hfxlr) THEN
263 kernel_section => section_vals_get_subs_vals(tddfpt_section, "XC%HFX_KERNEL%HFXLR")
264 CALL section_vals_val_get(kernel_section, "RCUT", r_val=tddfpt_control%hfxlr_rcut)
265 CALL section_vals_val_get(kernel_section, "SCALE", r_val=tddfpt_control%hfxlr_scale)
266 END IF
267
268 soc_section => section_vals_get_subs_vals(tddfpt_section, "SOC")
269 CALL section_vals_get(soc_section, explicit=do_soc)
270
271 IF (do_soc) THEN
272 ! start with multiplicity that is not specified in input
273 ! so that excited-state gradient is for multiplicity given in input
274 lmult_tmp = tddfpt_control%rks_triplets
275 tddfpt_control%rks_triplets = .NOT. (tddfpt_control%rks_triplets)
276 END IF
277
278 CALL cite_reference(iannuzzi2005)
279 IF (tddfpt_control%kernel == tddfpt_kernel_stda) THEN
280 CALL cite_reference(grimme2013)
281 CALL cite_reference(grimme2016)
282 END IF
283
284 CALL tddfpt_header(log_unit)
285 CALL kernel_info(log_unit, dft_control, tddfpt_control, xc_section)
286
287 IF (do_kpoints) THEN
288 IF (calc_forces) THEN
289 cpabort("TDDFPT forces are not implemented for k-points")
290 END IF
291 IF (do_rixs) THEN
292 cpabort("RIXS/TDDFPT is not implemented for k-points")
293 END IF
294 IF (do_soc) THEN
295 cpabort("TDDFPT-SOC is not implemented for k-points")
296 END IF
297 CALL tddfpt_kpoint_independent_particle(qs_env, logger, tddfpt_control)
298 CALL cp_print_key_finished_output(log_unit, &
299 logger, &
300 tddfpt_print_section, &
301 "PROGRAM_BANNER")
302 CALL timestop(handle)
303 RETURN
304 END IF
305
306 CALL get_qs_env(qs_env, &
307 blacs_env=blacs_env, &
308 cell=cell, &
309 matrix_ks=matrix_ks, &
310 matrix_s=matrix_s, &
311 mos=mos, &
312 scf_env=scf_env)
313
314 ! obtain occupied and virtual (unoccupied) ground-state Kohn-Sham orbitals
315 NULLIFY (gs_mos)
316 CALL tddfpt_init_mos(qs_env, gs_mos, log_unit)
317
318 ! obtain smeared occupation numbers
319 IF (tddfpt_control%do_smearing) THEN
320 CALL tddfpt_smeared_occupation(qs_env, gs_mos, log_unit)
321 END IF
322
323 ! obtain corrected KS-matrix
324 CALL tddfpt_oecorr(qs_env, gs_mos, matrix_ks_oep)
325
326 IF ((tddfpt_control%do_lrigpw) .AND. &
327 (tddfpt_control%kernel /= tddfpt_kernel_full)) THEN
328 CALL cp_abort(__location__, "LRI only implemented for full kernel")
329 END IF
330
331 IF (ASSOCIATED(matrix_ks_oep)) matrix_ks => matrix_ks_oep
332
333 ! determine active orbitals
334 ! default is all occupied MOs
335 CALL init_res_method(qs_env, gs_mos, tddfpt_control, tddfpt_section, log_unit)
336
337 ! components of the dipole operator
338 CALL tddfpt_dipole_operator(dipole_op_mos_occ, &
339 tddfpt_control, &
340 gs_mos, &
341 qs_env)
342
343 nspins = SIZE(gs_mos)
344 ! multiplicity of molecular system
345 IF (nspins > 1) THEN
346 mult = abs(SIZE(gs_mos(1)%evals_occ) - SIZE(gs_mos(2)%evals_occ)) + 1
347 IF (mult > 2) THEN
348 CALL cp_warn(__location__, "There is a convergence issue for multiplicity >= 3")
349 END IF
350 ELSE
351 IF (tddfpt_control%rks_triplets) THEN
352 mult = 3
353 ELSE
354 mult = 1
355 END IF
356 END IF
357
358 ! split mpi communicator
359 ALLOCATE (my_mos(nspins), my_active(nspins))
360 DO ispin = 1, nspins
361 my_mos(ispin) = gs_mos(ispin)%mos_occ
362 my_active(ispin) = gs_mos(ispin)%mos_active
363 END DO
364 CALL tddfpt_sub_env_init(sub_env, qs_env, &
365 mos_occ=my_mos(:), mos_active=my_active(:), &
366 kernel=tddfpt_control%kernel)
367 DEALLOCATE (my_mos, my_active)
368
369 IF (tddfpt_control%kernel == tddfpt_kernel_full) THEN
370 ! create environment for Full Kernel
371 IF (dft_control%qs_control%xtb) THEN
372 cpabort("TDDFPT: xTB only works with sTDA Kernel")
373 END IF
374
375 IF (tddfpt_control%do_hfxsr) THEN
376 kernel_section => section_vals_get_subs_vals(tddfpt_section, "XC%HFX_KERNEL")
377 CALL section_vals_val_get(kernel_section, "HFXSR_PRIMBAS", &
378 i_val=tddfpt_control%hfxsr_primbas)
379 ! basis set
380 CALL create_minbas_set(qs_env, log_unit, basis_type="TDA_HFX", &
381 primitive=tddfpt_control%hfxsr_primbas)
382 ! admm control
383 ALLOCATE (full_kernel_env%admm_control)
384 full_kernel_env%admm_control%purification_method = do_admm_purify_none
385 full_kernel_env%admm_control%method = do_admm_basis_projection
386 full_kernel_env%admm_control%scaling_model = do_admm_exch_scaling_none
387 full_kernel_env%admm_control%aux_exch_func = do_admm_aux_exch_func_none
388 ! hfx section
389 full_kernel_env%hfxsr_section => hfxsr_section
390 !
391 CALL aux_admm_init(qs_env, mos, full_kernel_env%admm_env, &
392 full_kernel_env%admm_control, "TDA_HFX")
393 CALL get_admm_env(full_kernel_env%admm_env, mos_aux_fit=mos_aux_fit, &
394 matrix_s_aux_fit=matrix_s_aux_fit, &
395 matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb)
396 CALL admm_fit_mo_coeffs(full_kernel_env%admm_env, matrix_s_aux_fit, &
397 matrix_s_aux_fit_vs_orb, mos, mos_aux_fit, .true.)
398 ! x_data
399 CALL get_qs_env(qs_env, cell=cell, atomic_kind_set=atomic_kind_set, &
400 qs_kind_set=qs_kind_set, particle_set=particle_set, &
401 para_env=para_env)
402 CALL hfx_create(full_kernel_env%x_data, para_env, hfxsr_section, atomic_kind_set, &
403 qs_kind_set, particle_set, dft_control, cell, orb_basis="TDA_HFX")
404 END IF
405
406 ! allocate pools and work matrices
407 nstates = tddfpt_control%nstates
408 !! Too many states can lead to Problems
409 !! You should be warned if there are more states
410 !! than occ-virt Combinations!!
411 CALL cp_fm_get_info(gs_mos(1)%mos_occ, ncol_global=nocc)
412 IF (tddfpt_control%spinflip == no_sf_tddfpt) THEN
413 CALL cp_fm_get_info(gs_mos(1)%mos_virt, ncol_global=nvirt)
414 ELSE
415 CALL cp_fm_get_info(gs_mos(2)%mos_virt, ncol_global=nvirt)
416 END IF
417 nstate_max = nocc*nvirt
418 IF (nstates > nstate_max) THEN
419 cpwarn("NUMBER OF EXCITED STATES COULD LEAD TO PROBLEMS!")
420 cpwarn("Experimental: CHANGED NSTATES TO ITS MAXIMUM VALUE!")
421 nstates = nstate_max
422 tddfpt_control%nstates = nstate_max
423 END IF
424 CALL tddfpt_create_work_matrices(work_matrices, gs_mos, nstates, &
425 do_hfx, do_admm, do_hfxlr, do_exck, do_sf, qs_env, sub_env)
426
427 ! create full_kernel and admm_kernel within tddfpt_energies
428 kernel_env%full_kernel => full_kernel_env
429 kernel_env%admm_kernel => kernel_env_admm_aux
430 NULLIFY (kernel_env%stda_kernel)
431 IF (do_hfxsr) THEN
432 ! work matrices for SR HFX
433 CALL hfxsr_create_work_matrices(work_matrices, qs_env, full_kernel_env%admm_env)
434 END IF
435 IF (do_hfxlr) THEN
436 ! calculate S_half and Lowdin MO coefficients
437 CALL get_lowdin_mo_coefficients(qs_env, sub_env, work_matrices)
438 END IF
439 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_stda) THEN
440 ! setup for kernel_stda outside tddfpt_energies
441 CALL cp_fm_get_info(gs_mos(1)%mos_occ, nrow_global=nao)
442 nactive = tddfpt_control%nactive
443 CALL allocate_stda_env(qs_env, stda_kernel, nao, nactive)
444 ! sTDA parameters
445 CALL stda_init_param(qs_env, stda_kernel, tddfpt_control%stda_control)
446 ! allocate pools and work matrices
447 nstates = tddfpt_control%nstates
448 CALL stda_create_work_matrices(work_matrices, gs_mos, nstates, qs_env, sub_env)
449 !
450 CALL stda_init_matrices(qs_env, stda_kernel, sub_env, &
451 work_matrices, tddfpt_control)
452 !
453 kernel_env%stda_kernel => stda_kernel
454 NULLIFY (kernel_env%full_kernel)
455 NULLIFY (kernel_env%admm_kernel)
456 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_none) THEN
457 ! allocate pools and work matrices
458 nstates = tddfpt_control%nstates
459 CALL stda_create_work_matrices(work_matrices, gs_mos, nstates, qs_env, sub_env)
460 NULLIFY (kernel_env%full_kernel)
461 NULLIFY (kernel_env%admm_kernel)
462 NULLIFY (kernel_env%stda_kernel)
463 END IF
464
465 IF (do_sf) THEN
466 ! only alpha -> beta excitations are considered in spin-flip TDDFT
467 ALLOCATE (evects(1, nstates))
468 ELSE
469 ALLOCATE (evects(nspins, nstates))
470 END IF
471 ALLOCATE (evals(nstates))
472 ALLOCATE (s_evects(SIZE(evects, 1), nstates))
473
474 DO istate = 1, nstates
475 DO ispin = 1, SIZE(evects, 1)
476 CALL fm_pool_create_fm( &
477 work_matrices%fm_pool_ao_mo_active(ispin)%pool, &
478 s_evects(ispin, istate))
479 END DO
480 END DO
481
482 IF (.NOT. do_soc) THEN
483 ! compute tddfpt excitation energies of multiplicity mult
484 CALL tddfpt_energies(qs_env, nstates, nspins, work_matrices, &
485 tddfpt_control, logger, tddfpt_print_section, evects, evals, &
486 gs_mos, tddfpt_section, s_evects, matrix_s, kernel_env, matrix_ks, &
487 sub_env, ostrength, dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
488 kernel_env_admm_aux)
489 ELSE
490 CALL tddfpt_soc_energies(qs_env, nstates, work_matrices, &
491 tddfpt_control, logger, tddfpt_print_section, &
492 evects, evals, ostrength, &
493 gs_mos, tddfpt_section, s_evects, matrix_s, kernel_env, matrix_ks, &
494 sub_env, dipole_op_mos_occ, lmult_tmp, xc_section, full_kernel_env, &
495 kernel_env_admm_aux)
496 END IF
497
498 !print forces for selected states
499 IF (calc_forces) THEN
500 CALL tddfpt_print_forces(qs_env, evects, evals, ostrength, &
501 tddfpt_print_section, gs_mos, &
502 kernel_env, sub_env, work_matrices)
503 END IF
504
505 ! excited state potential energy surface
506 IF (qs_env%excited_state) THEN
507 IF (sub_env%is_split) THEN
508 CALL cp_abort(__location__, &
509 "Excited state forces not possible when states"// &
510 " are distributed to different CPU pools.")
511 END IF
512 ! for gradients unshifted KS matrix
513 IF (ASSOCIATED(matrix_ks_oep)) CALL get_qs_env(qs_env, matrix_ks=matrix_ks)
514 CALL get_qs_env(qs_env, exstate_env=ex_env)
515 state_change = .false.
516 IF (ex_env%state > 0) THEN
517 my_state = ex_env%state
518 ELSE IF (ex_env%state < 0) THEN
519 ! state following
520 ALLOCATE (my_mos(nspins))
521 DO ispin = 1, nspins
522 my_mos(ispin) = gs_mos(ispin)%mos_occ
523 END DO
524 my_state = abs(ex_env%state)
525 CALL assign_state(qs_env, matrix_s, evects, my_mos, ex_env%wfn_history, my_state)
526 DEALLOCATE (my_mos)
527 IF (my_state /= abs(ex_env%state)) THEN
528 state_change = .true.
529 old_state = abs(ex_env%state)
530 END IF
531 ex_env%state = -my_state
532 ELSE
533 CALL cp_warn(__location__, &
534 "Active excited state not assigned. Use the first state.")
535 my_state = 1
536 END IF
537 cpassert(my_state > 0)
538 IF (my_state > nstates) THEN
539 CALL cp_warn(__location__, &
540 "There were not enough excited states calculated.")
541 cpabort("excited state potential energy surface")
542 END IF
543 !
544 ! energy
545 ex_env%evalue = evals(my_state)
546 ! excitation vector
547 CALL cp_fm_release(ex_env%evect)
548 ALLOCATE (ex_env%evect(SIZE(evects, 1)))
549 DO ispin = 1, SIZE(evects, 1)
550 CALL cp_fm_get_info(matrix=evects(ispin, 1), &
551 matrix_struct=matrix_struct)
552 CALL cp_fm_create(ex_env%evect(ispin), matrix_struct)
553 CALL cp_fm_to_fm(evects(ispin, my_state), ex_env%evect(ispin))
554 END DO
555
556 IF (log_unit > 0) THEN
557 gsval = ex_env%wfn_history%gsval
558 gsmin = ex_env%wfn_history%gsmin
559 xsval = ex_env%wfn_history%xsval
560 WRITE (log_unit, "(1X,A,T40,F10.6,A,T62,F10.6,A)") "Ground state orbital alignment:", &
561 gsmin, "[MinVal]", gsval, "[Average]"
562 WRITE (log_unit, "(1X,A,T71,F10.6)") "Excitation vector alignment:", xsval
563 IF (state_change) THEN
564 WRITE (log_unit, "(1X,A,I5,T60,A14,T76,I5)") &
565 "Target state has been changed from state ", &
566 old_state, " to new state ", my_state
567 END IF
568 WRITE (log_unit, "(1X,A,I4,A,F12.5,A)") "Calculate properties for state:", &
569 my_state, " with excitation energy ", ex_env%evalue*evolt, " eV"
570 END IF
571
572 ! Calculate response vector
573 IF (calc_forces) THEN
574 CALL tddfpt_forces_main(qs_env, gs_mos, ex_env, kernel_env, &
575 sub_env, work_matrices)
576 END IF
577 END IF
578
579 ! share evals, evects and mo_coefs with rixs
580 IF (do_rixs) THEN
581 ! copy evals
582 valence_state%nstates = nstates
583 ALLOCATE (valence_state%evals(SIZE(evals)))
584 valence_state%evals(:) = evals(:)
585
586 ALLOCATE (valence_state%evects(nspins, nstates))
587 ALLOCATE (valence_state%mos_active(nspins))
588 DO ispin = 1, nspins
589 ! copy evects
590 DO istate = 1, nstates
591 CALL cp_fm_get_info(matrix=evects(ispin, istate), &
592 matrix_struct=matrix_struct)
593 CALL cp_fm_create(valence_state%evects(ispin, istate), matrix_struct)
594 CALL cp_fm_to_fm(evects(ispin, istate), valence_state%evects(ispin, istate))
595 END DO
596 ! copy mos_occ
597 CALL cp_fm_get_info(matrix=gs_mos(ispin)%mos_active, &
598 matrix_struct=matrix_struct)
599 CALL cp_fm_create(valence_state%mos_active(ispin), matrix_struct)
600 CALL cp_fm_to_fm(gs_mos(ispin)%mos_active, valence_state%mos_active(ispin))
601 END DO
602 END IF
603
604 ! clean up
605 CALL cp_fm_release(evects)
606 CALL cp_fm_release(s_evects)
607
608 CALL cp_print_key_finished_output(log_unit, &
609 logger, &
610 tddfpt_print_section, &
611 "PROGRAM_BANNER")
612
613 DEALLOCATE (evals, ostrength)
614
615 IF (tddfpt_control%kernel == tddfpt_kernel_full) THEN
616 IF (do_admm) CALL release_kernel_env(kernel_env%admm_kernel)
617 IF (tddfpt_control%do_lrigpw) THEN
618 CALL lri_env_release(kernel_env%full_kernel%lri_env)
619 DEALLOCATE (kernel_env%full_kernel%lri_env)
620 CALL lri_density_release(kernel_env%full_kernel%lri_density)
621 DEALLOCATE (kernel_env%full_kernel%lri_density)
622 END IF
623 CALL release_kernel_env(kernel_env%full_kernel)
624 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_stda) THEN
625 CALL deallocate_stda_env(stda_kernel)
626 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_none) THEN
627 !
628 ELSE
629 cpabort('Unknown kernel type')
630 END IF
631 CALL tddfpt_release_work_matrices(work_matrices, sub_env)
632 CALL tddfpt_sub_env_release(sub_env)
633
634 CALL cp_fm_release(dipole_op_mos_occ)
635
636 DO ispin = nspins, 1, -1
637 CALL tddfpt_release_ground_state_mos(gs_mos(ispin))
638 END DO
639 DEALLOCATE (gs_mos)
640
641 IF (ASSOCIATED(matrix_ks_oep)) THEN
642 CALL dbcsr_deallocate_matrix_set(matrix_ks_oep)
643 END IF
644
645 CALL timestop(handle)
646
647 END SUBROUTINE tddfpt
648
649! **************************************************************************************************
650!> \brief TDDFPT input
651!> \param qs_env Quickstep environment
652!> \param tddfpt_section ...
653!> \param tddfpt_control ...
654!> \param do_hfx ...
655!> \param do_admm ...
656!> \param do_exck ...
657!> \param do_hfxsr ...
658!> \param do_hfxlr ...
659!> \param xc_section ...
660!> \param tddfpt_print_section ...
661!> \param lri_section ...
662!> \param hfxsr_section ...
663! **************************************************************************************************
664 SUBROUTINE tddfpt_input(qs_env, tddfpt_section, tddfpt_control, do_hfx, do_admm, do_exck, &
665 do_hfxsr, do_hfxlr, xc_section, tddfpt_print_section, lri_section, &
666 hfxsr_section)
667 TYPE(qs_environment_type), POINTER :: qs_env
668 TYPE(section_vals_type), POINTER :: tddfpt_section
669 TYPE(tddfpt2_control_type), POINTER :: tddfpt_control
670 LOGICAL, INTENT(INOUT) :: do_hfx, do_admm, do_exck, do_hfxsr, &
671 do_hfxlr
672 TYPE(section_vals_type), POINTER :: xc_section, tddfpt_print_section, &
673 lri_section, hfxsr_section
674
675 CHARACTER(len=20) :: nstates_str
676 LOGICAL :: exar, exf, exgcp, exhf, exhfxk, exk, &
677 explicit, explicit_root, expot, exvdw, &
678 exwfn, found, same_hfx, use_real_wfn
679 REAL(kind=dp) :: c_hf
680 TYPE(dft_control_type), POINTER :: dft_control
681 TYPE(kpoint_type), POINTER :: kpoints
682 TYPE(section_vals_type), POINTER :: hfx_section, hfx_section_gs, input, &
683 print_sub, xc_root, xc_sub
684
685 NULLIFY (dft_control, input, kpoints)
686 CALL get_qs_env(qs_env, dft_control=dft_control, input=input, kpoints=kpoints)
687
688 IF (dft_control%nimages > 1) THEN
689 IF (tddfpt_control%kernel /= tddfpt_kernel_none) THEN
690 cpabort("TDDFPT with k-points currently supports only KERNEL NONE")
691 END IF
692 CALL get_kpoint_info(kpoints, use_real_wfn=use_real_wfn)
693 IF (use_real_wfn) THEN
694 cpabort("K-point TDDFPT requires complex wavefunctions")
695 END IF
696 IF (tddfpt_control%spinflip /= no_sf_tddfpt) THEN
697 cpabort("Spin-flip TDDFPT is not implemented for k-points")
698 END IF
699 IF (tddfpt_control%do_smearing) THEN
700 cpabort("Smeared-occupation TDDFPT is not implemented for k-points")
701 END IF
702 IF (tddfpt_control%oe_corr /= oe_none) THEN
703 cpabort("Orbital-energy-corrected TDDFPT is not implemented for k-points")
704 END IF
705 IF (tddfpt_control%dipole_form /= 0 .AND. &
706 tddfpt_control%dipole_form /= tddfpt_dipole_velocity .AND. &
707 tddfpt_control%dipole_form /= tddfpt_dipole_scf_moment) THEN
708 cpabort("K-point TDDFPT supports only velocity-form or SCF_MOMENT transition dipoles")
709 END IF
710 END IF
711
712 IF (tddfpt_control%nstates <= 0) THEN
713 CALL integer_to_string(tddfpt_control%nstates, nstates_str)
714 CALL cp_warn(__location__, "TDDFPT calculation was requested for "// &
715 trim(nstates_str)//" excited states: nothing to do.")
716 RETURN
717 END IF
718
719 NULLIFY (tddfpt_print_section)
720 tddfpt_print_section => section_vals_get_subs_vals(tddfpt_section, "PRINT")
721
722 IF (dft_control%nimages > 1) THEN
723 IF (tddfpt_control%do_exciton_descriptors .OR. &
724 tddfpt_control%do_directional_exciton_descriptors) THEN
725 cpabort("Exciton descriptors are not implemented for k-point TDDFPT")
726 END IF
727 print_sub => section_vals_get_subs_vals(tddfpt_print_section, "NTO_ANALYSIS")
728 CALL section_vals_get(print_sub, explicit=explicit)
729 IF (explicit) cpabort("NTO analysis is not implemented for k-point TDDFPT")
730 print_sub => section_vals_get_subs_vals(tddfpt_print_section, "NAMD_PRINT")
731 CALL section_vals_get(print_sub, explicit=explicit)
732 IF (explicit) cpabort("NAMD_PRINT is not implemented for k-point TDDFPT")
733 END IF
734
735 IF (tddfpt_control%kernel == tddfpt_kernel_full) THEN
736 NULLIFY (xc_root)
737 xc_root => section_vals_get_subs_vals(tddfpt_section, "XC")
738 CALL section_vals_get(xc_root, explicit=explicit_root)
739 NULLIFY (xc_section)
740 IF (explicit_root) THEN
741 ! No ADIABATIC_RESCALING option possible
742 NULLIFY (xc_sub)
743 xc_sub => section_vals_get_subs_vals(xc_root, "ADIABATIC_RESCALING")
744 CALL section_vals_get(xc_sub, explicit=exar)
745 IF (exar) THEN
746 CALL cp_warn(__location__, "TDDFPT Kernel with ADIABATIC_RESCALING not possible.")
747 cpabort("TDDFPT Input")
748 END IF
749 ! No GCP_POTENTIAL option possible
750 NULLIFY (xc_sub)
751 xc_sub => section_vals_get_subs_vals(xc_root, "GCP_POTENTIAL")
752 CALL section_vals_get(xc_sub, explicit=exgcp)
753 IF (exgcp) THEN
754 CALL cp_warn(__location__, "TDDFPT Kernel with GCP_POTENTIAL not possible.")
755 cpabort("TDDFPT Input")
756 END IF
757 ! No VDW_POTENTIAL option possible
758 NULLIFY (xc_sub)
759 xc_sub => section_vals_get_subs_vals(xc_root, "VDW_POTENTIAL")
760 CALL section_vals_get(xc_sub, explicit=exvdw)
761 IF (exvdw) THEN
762 CALL cp_warn(__location__, "TDDFPT Kernel with VDW_POTENTIAL not possible.")
763 cpabort("TDDFPT Input")
764 END IF
765 ! No WF_CORRELATION option possible
766 NULLIFY (xc_sub)
767 xc_sub => section_vals_get_subs_vals(xc_root, "WF_CORRELATION")
768 CALL section_vals_get(xc_sub, explicit=exwfn)
769 IF (exwfn) THEN
770 CALL cp_warn(__location__, "TDDFPT Kernel with WF_CORRELATION not possible.")
771 cpabort("TDDFPT Input")
772 END IF
773 ! No XC_POTENTIAL option possible
774 NULLIFY (xc_sub)
775 xc_sub => section_vals_get_subs_vals(xc_root, "XC_POTENTIAL")
776 CALL section_vals_get(xc_sub, explicit=expot)
777 IF (expot) THEN
778 CALL cp_warn(__location__, "TDDFPT Kernel with XC_POTENTIAL not possible.")
779 cpabort("TDDFPT Input")
780 END IF
781 !
782 NULLIFY (xc_sub)
783 xc_sub => section_vals_get_subs_vals(xc_root, "XC_FUNCTIONAL")
784 CALL section_vals_get(xc_sub, explicit=exf)
785 NULLIFY (xc_sub)
786 xc_sub => section_vals_get_subs_vals(xc_root, "XC_KERNEL")
787 CALL section_vals_get(xc_sub, explicit=exk)
788 IF ((exf .AND. exk) .OR. .NOT. (exf .OR. exk)) THEN
789 CALL cp_warn(__location__, "TDDFPT Kernel needs XC_FUNCTIONAL or XC_KERNEL section.")
790 cpabort("TDDFPT Input")
791 END IF
792 NULLIFY (xc_sub)
793 xc_sub => section_vals_get_subs_vals(xc_root, "HF")
794 CALL section_vals_get(xc_sub, explicit=exhf)
795 NULLIFY (xc_sub)
796 xc_sub => section_vals_get_subs_vals(xc_root, "HFX_KERNEL")
797 CALL section_vals_get(xc_sub, explicit=exhfxk)
798 !
799 xc_section => xc_root
800 hfx_section => section_vals_get_subs_vals(xc_section, "HF")
801 CALL section_vals_get(hfx_section, explicit=do_hfx)
802 IF (do_hfx) THEN
803 CALL section_vals_val_get(hfx_section, "FRACTION", r_val=c_hf)
804 do_hfx = (c_hf /= 0.0_dp)
805 END IF
806 !TDDFPT only works if the kernel has the same HF section as the DFT%XC one
807 IF (do_hfx) THEN
808 hfx_section_gs => section_vals_get_subs_vals(input, "DFT%XC%HF")
809 CALL compare_hfx_sections(hfx_section, hfx_section_gs, same_hfx)
810 IF (.NOT. same_hfx) THEN
811 cpabort("TDDFPT Kernel must use the same HF section as DFT%XC or no HF at all.")
812 END IF
813 END IF
814
815 do_admm = do_hfx .AND. dft_control%do_admm
816 IF (do_admm) THEN
817 ! 'admm_env%xc_section_primary' and 'admm_env%xc_section_aux' need to be redefined
818 CALL cp_abort(__location__, &
819 "ADMM is not implemented for a TDDFT kernel XC-functional which is different from "// &
820 "the one used for the ground-state calculation. A ground-state 'admm_env' cannot be reused.")
821 END IF
822 ! SET HFX_KERNEL and/or XC_KERNEL
823 IF (exk) THEN
824 do_exck = .true.
825 ELSE
826 do_exck = .false.
827 END IF
828 IF (exhfxk) THEN
829 xc_sub => section_vals_get_subs_vals(xc_root, "HFX_KERNEL")
830 CALL section_vals_val_get(xc_sub, "DO_HFXSR", l_val=do_hfxsr)
831 xc_sub => section_vals_get_subs_vals(xc_root, "HFX_KERNEL%HFXLR")
832 CALL section_vals_get(xc_sub, explicit=do_hfxlr)
833 ELSE
834 do_hfxsr = .false.
835 do_hfxlr = .false.
836 END IF
837 ELSE
838 xc_section => section_vals_get_subs_vals(input, "DFT%XC")
839 hfx_section => section_vals_get_subs_vals(xc_section, "HF")
840 CALL section_vals_get(hfx_section, explicit=do_hfx)
841 IF (do_hfx) THEN
842 CALL section_vals_val_get(hfx_section, "FRACTION", r_val=c_hf)
843 do_hfx = (c_hf /= 0.0_dp)
844 END IF
845 do_admm = do_hfx .AND. dft_control%do_admm
846 do_exck = .false.
847 do_hfxsr = .false.
848 do_hfxlr = .false.
849 END IF
850 ELSE
851 do_hfx = .false.
852 do_admm = .false.
853 do_exck = .false.
854 do_hfxsr = .false.
855 do_hfxlr = .false.
856 END IF
857
858 ! reset rks_triplets if UKS is in use
859 IF (tddfpt_control%rks_triplets .AND. dft_control%nspins > 1) THEN
860 tddfpt_control%rks_triplets = .false.
861 CALL cp_warn(__location__, "Keyword RKS_TRIPLETS has been ignored for spin-polarised calculations")
862 END IF
863
864 ! lri input
865 IF (tddfpt_control%do_lrigpw) THEN
866 lri_section => section_vals_get_subs_vals(tddfpt_section, "LRIGPW")
867 END IF
868
869 ! set defaults for short range HFX
870 NULLIFY (hfxsr_section)
871 IF (do_hfxsr) THEN
872 hfxsr_section => section_vals_get_subs_vals(tddfpt_section, "XC%HFX_KERNEL%HF")
873 CALL section_vals_get(hfxsr_section, explicit=found)
874 IF (.NOT. found) THEN
875 cpabort("HFXSR option needs &HF section defined")
876 END IF
877 CALL section_vals_val_get(hfxsr_section, "INTERACTION_POTENTIAL%POTENTIAL_TYPE", explicit=found)
878 IF (.NOT. found) THEN
879 CALL section_vals_val_set(hfxsr_section, "INTERACTION_POTENTIAL%POTENTIAL_TYPE", &
881 END IF
882 CALL section_vals_val_get(hfxsr_section, "INTERACTION_POTENTIAL%CUTOFF_RADIUS", explicit=found)
883 IF (.NOT. found) THEN
884 CALL section_vals_val_set(hfxsr_section, "INTERACTION_POTENTIAL%CUTOFF_RADIUS", r_val=7.5589_dp)
885 END IF
886 CALL section_vals_val_get(hfxsr_section, "RI%_SECTION_PARAMETERS_", l_val=found)
887 IF (found) THEN
888 CALL cp_abort(__location__, "Short range TDA kernel with RI not possible")
889 END IF
890 END IF
891
892 END SUBROUTINE tddfpt_input
893
894! **************************************************************************************************
895!> \brief ...
896!> \param log_unit ...
897!> \param dft_control ...
898!> \param tddfpt_control ...
899!> \param xc_section ...
900! **************************************************************************************************
901 SUBROUTINE kernel_info(log_unit, dft_control, tddfpt_control, xc_section)
902 INTEGER, INTENT(IN) :: log_unit
903 TYPE(dft_control_type), POINTER :: dft_control
904 TYPE(tddfpt2_control_type), POINTER :: tddfpt_control
905 TYPE(section_vals_type), POINTER :: xc_section
906
907 CHARACTER(LEN=4) :: ktype
908 LOGICAL :: lsd
909
910 lsd = (dft_control%nspins > 1)
911 IF (tddfpt_control%kernel == tddfpt_kernel_full) THEN
912 ktype = "FULL"
913 IF (log_unit > 0) THEN
914 WRITE (log_unit, "(T2,A,T77,A4)") "KERNEL|", trim(ktype)
915 CALL xc_write(log_unit, xc_section, lsd)
916 IF (tddfpt_control%do_hfx) THEN
917 IF (tddfpt_control%do_admm) THEN
918 WRITE (log_unit, "(T2,A,T62,A19)") "KERNEL|", "ADMM Exact Exchange"
919 IF (tddfpt_control%admm_xc_correction) THEN
920 WRITE (log_unit, "(T2,A,T60,A21)") "KERNEL|", "Apply ADMM Kernel XC Correction"
921 END IF
922 IF (tddfpt_control%admm_symm) THEN
923 WRITE (log_unit, "(T2,A,T60,A21)") "KERNEL|", "Symmetric ADMM Kernel"
924 END IF
925 ELSE
926 WRITE (log_unit, "(T2,A,T67,A14)") "KERNEL|", "Exact Exchange"
927 END IF
928 END IF
929 IF (tddfpt_control%do_hfxsr) THEN
930 WRITE (log_unit, "(T2,A,T43,A38)") "KERNEL|", "Short range HFX approximation"
931 END IF
932 IF (tddfpt_control%do_hfxlr) THEN
933 WRITE (log_unit, "(T2,A,T43,A38)") "KERNEL|", "Long range HFX approximation"
934 END IF
935 IF (tddfpt_control%do_lrigpw) THEN
936 WRITE (log_unit, "(T2,A,T42,A39)") "KERNEL|", "LRI approximation of transition density"
937 END IF
938 END IF
939 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_stda) THEN
940 ktype = "sTDA"
941 IF (log_unit > 0) THEN
942 WRITE (log_unit, "(T2,A,T77,A4)") "KERNEL|", trim(ktype)
943 IF (tddfpt_control%stda_control%do_ewald) THEN
944 WRITE (log_unit, "(T2,A,T78,A3)") "KERNEL| Coulomb term uses Ewald summation"
945 ELSE
946 WRITE (log_unit, "(T2,A,T78,A3)") "KERNEL| Coulomb term uses direct summation (MIC)"
947 END IF
948 IF (tddfpt_control%stda_control%do_exchange) THEN
949 WRITE (log_unit, "(T2,A,T78,A3)") "KERNEL| Exact exchange term", "YES"
950 WRITE (log_unit, "(T2,A,T71,F10.3)") "KERNEL| Short range HFX fraction:", &
951 tddfpt_control%stda_control%hfx_fraction
952 ELSE
953 WRITE (log_unit, "(T2,A,T79,A2)") "KERNEL| Exact exchange term", "NO"
954 END IF
955 WRITE (log_unit, "(T2,A,T66,E15.3)") "KERNEL| Transition density filter", &
956 tddfpt_control%stda_control%eps_td_filter
957 END IF
958 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_none) THEN
959 ktype = "NONE"
960 IF (log_unit > 0) THEN
961 WRITE (log_unit, "(T2,A,T77,A4)") "KERNEL|", trim(ktype)
962 END IF
963 ELSE
964 !CPABORT("Unknown kernel")
965 END IF
966 !
967 IF (log_unit > 0) THEN
968 IF (tddfpt_control%rks_triplets) THEN
969 WRITE (log_unit, "(T2,A,T74,A7)") "KERNEL| Spin symmetry of excitations", "Triplet"
970 ELSE IF (lsd) THEN
971 ! Spin-conserving excitations where requested
972 IF (tddfpt_control%spinflip == no_sf_tddfpt) THEN
973 WRITE (log_unit, "(T2,A,T69,A12)") "KERNEL| Spin symmetry of excitations", "Unrestricted"
974 ! Spin-flip excitations with collinear exchange-correlation kernel requested
975 ELSE IF (tddfpt_control%spinflip == tddfpt_sf_col) THEN
976 WRITE (log_unit, "(T2,A,T72,A9)") "KERNEL| Spin flip", "Collinear"
977 ! Spin-flip excitations with noncollinear exchange-correlation kernel requested
978 ELSE IF (tddfpt_control%spinflip == tddfpt_sf_noncol) THEN
979 WRITE (log_unit, "(T2,A,T69,A12)") "KERNEL| Spin flip", "Noncollinear"
980 END IF
981 ELSE
982 WRITE (log_unit, "(T2,A,T74,A7)") "KERNEL| Spin symmetry of excitations", "Singlet"
983 END IF
984 WRITE (log_unit, "(T2,A,T73,I8)") "TDDFPT| Number of states calculated", tddfpt_control%nstates
985 WRITE (log_unit, "(T2,A,T73,I8)") "TDDFPT| Number of Davidson iterations", tddfpt_control%niters
986 WRITE (log_unit, "(T2,A,T66,E15.3)") "TDDFPT| Davidson iteration convergence", tddfpt_control%conv
987 WRITE (log_unit, "(T2,A,T73,I8)") "TDDFPT| Max. number of Krylov space vectors", tddfpt_control%nkvs
988 END IF
989
990 END SUBROUTINE kernel_info
991
992! **************************************************************************************************
993!> \brief Print independent-particle vertical transitions for k-point calculations.
994!> \param qs_env ...
995!> \param logger ...
996!> \param tddfpt_control ...
997! **************************************************************************************************
998 SUBROUTINE tddfpt_kpoint_independent_particle(qs_env, logger, tddfpt_control)
999 TYPE(qs_environment_type), POINTER :: qs_env
1000 TYPE(cp_logger_type), POINTER :: logger
1001 TYPE(tddfpt2_control_type), POINTER :: tddfpt_control
1002
1003 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_kpoint_independent_particle'
1004
1005 COMPLEX(KIND=dp), ALLOCATABLE, &
1006 DIMENSION(:, :, :, :, :) :: kpoint_dipole
1007 INTEGER :: handle, ideriv, ikp, ikp_local, iocc, ispin, istate, itrans, ivirt, log_unit, &
1008 nao, nkp, nkp_local, nspins, nstates, ntrans_kpoint, ntrans_spin, ntrans_total, &
1009 spin_offset, trans_index
1010 INTEGER, ALLOCATABLE, DIMENSION(:) :: inds
1011 INTEGER, DIMENSION(2) :: kp_range
1012 INTEGER, DIMENSION(:, :, :), POINTER :: cell_to_index
1013 INTEGER, DIMENSION(maxspins) :: homo_spin, nao_spin, nmo_spin, nvirt_spin
1014 LOGICAL :: my_kpgrp, use_scf_moment_dipoles
1015 REAL(kind=dp) :: checksum, dipole_im, dipole_re, fsum, &
1016 gap, oscillator_factor, spin_factor
1017 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: eigenvalues_kp, evals, &
1018 oscillator_strength, transition_energy
1019 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: transition_dipole_im, &
1020 transition_dipole_re
1021 REAL(kind=dp), DIMENSION(:), POINTER :: eigenvalues, wkp
1022 REAL(kind=dp), DIMENSION(nderivs) :: transition_dipole_abs
1023 TYPE(cp_blacs_env_type), POINTER :: blacs_env, blacs_env_all
1024 TYPE(cp_fm_struct_type), POINTER :: fm_struct, moment_struct
1025 TYPE(cp_fm_type) :: fm_dummy, fm_tmp, mo_coeff_im_global, &
1026 mo_coeff_re_global, moment_im, &
1027 moment_re
1028 TYPE(cp_fm_type), POINTER :: mo_coeff_im, mo_coeff_re
1029 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: overlap_deriv
1030 TYPE(dbcsr_type), POINTER :: cmatrix, rmatrix
1031 TYPE(dft_control_type), POINTER :: dft_control
1032 TYPE(kpoint_env_p_type), DIMENSION(:), POINTER :: kp_env
1033 TYPE(kpoint_env_type), POINTER :: kp
1034 TYPE(kpoint_type), POINTER :: kpoints
1035 TYPE(mo_set_type), DIMENSION(:, :), POINTER :: mos_kp
1036 TYPE(mp_para_env_type), POINTER :: para_env, para_env_inter_kp, para_env_kp
1037 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
1038 POINTER :: sab_kp, sab_orb
1039 TYPE(qs_ks_env_type), POINTER :: ks_env
1040
1041 CALL timeset(routinen, handle)
1042
1043 NULLIFY (blacs_env, blacs_env_all, cell_to_index, cmatrix, dft_control, eigenvalues, &
1044 fm_struct, kp, kp_env, kpoints, ks_env, mo_coeff_im, mo_coeff_re, &
1045 moment_struct, mos_kp, overlap_deriv, para_env, para_env_inter_kp, para_env_kp, &
1046 rmatrix, sab_kp, sab_orb, wkp)
1047 CALL get_qs_env(qs_env, dft_control=dft_control, kpoints=kpoints, ks_env=ks_env, &
1048 sab_orb=sab_orb)
1049 cpassert(ASSOCIATED(kpoints))
1050
1051 CALL get_kpoint_info(kpoints, nkp=nkp, kp_range=kp_range, kp_env=kp_env, &
1052 para_env=para_env, blacs_env_all=blacs_env_all, &
1053 para_env_inter_kp=para_env_inter_kp, para_env_kp=para_env_kp, &
1054 blacs_env=blacs_env, wkp=wkp, cell_to_index=cell_to_index, &
1055 sab_nl=sab_kp)
1056 cpassert(ASSOCIATED(para_env))
1057 cpassert(ASSOCIATED(para_env_inter_kp))
1058 cpassert(ASSOCIATED(para_env_kp))
1059 cpassert(ASSOCIATED(blacs_env_all))
1060 cpassert(ASSOCIATED(blacs_env))
1061 cpassert(ASSOCIATED(kp_env))
1062 cpassert(ASSOCIATED(ks_env))
1063 cpassert(ASSOCIATED(sab_orb))
1064 cpassert(ASSOCIATED(sab_kp))
1065 cpassert(ASSOCIATED(cell_to_index))
1066
1067 nspins = dft_control%nspins
1068 nmo_spin = 0
1069 homo_spin = 0
1070 nao_spin = 0
1071 nkp_local = max(0, kp_range(2) - kp_range(1) + 1)
1072 IF (nkp_local > 0) THEN
1073 kp => kp_env(1)%kpoint_env
1074 mos_kp => kp%mos
1075 cpassert(ASSOCIATED(mos_kp))
1076 cpassert(SIZE(mos_kp, 2) == nspins)
1077 DO ispin = 1, nspins
1078 CALL get_mo_set(mos_kp(1, ispin), nmo=nmo_spin(ispin), homo=homo_spin(ispin), &
1079 nao=nao_spin(ispin))
1080 END DO
1081 END IF
1082 CALL para_env%max(nmo_spin)
1083 CALL para_env%max(homo_spin)
1084 CALL para_env%max(nao_spin)
1085
1086 ntrans_kpoint = 0
1087 DO ispin = 1, nspins
1088 nvirt_spin(ispin) = nmo_spin(ispin) - homo_spin(ispin)
1089 IF (homo_spin(ispin) <= 0 .OR. nvirt_spin(ispin) <= 0) THEN
1090 cpabort("At least one occupied and one unoccupied MO are required for k-point TDDFPT")
1091 END IF
1092 ntrans_kpoint = ntrans_kpoint + homo_spin(ispin)*nvirt_spin(ispin)
1093 END DO
1094 ntrans_total = nkp*ntrans_kpoint
1095 IF (ntrans_total <= 0) THEN
1096 cpabort("No independent-particle k-point transitions available")
1097 END IF
1098
1099 ALLOCATE (transition_energy(ntrans_total), transition_dipole_re(ntrans_total, nderivs), &
1100 transition_dipole_im(ntrans_total, nderivs), oscillator_strength(ntrans_total), &
1101 inds(ntrans_total))
1102 transition_energy = 0.0_dp
1103 transition_dipole_re = 0.0_dp
1104 transition_dipole_im = 0.0_dp
1105 oscillator_strength = 0.0_dp
1106 use_scf_moment_dipoles = (tddfpt_control%dipole_form == tddfpt_dipole_scf_moment)
1107 IF (use_scf_moment_dipoles) THEN
1108 CALL cp_warn(__location__, "SCF_MOMENT k-point dipoles use direct SCF MO matrix "// &
1109 "elements; compare folded energy blocks, not individual degenerate states.")
1110 CALL qs_moment_kpoints_scf_mos(qs_env, kpoint_dipole)
1111 END IF
1112
1113 IF (.NOT. use_scf_moment_dipoles) THEN
1114 CALL build_overlap_matrix(ks_env, matrixkp_s=overlap_deriv, nderivative=1, &
1115 basis_type_a="ORB", basis_type_b="ORB", sab_nl=sab_orb, &
1116 ext_kpoints=kpoints)
1117
1118 ALLOCATE (rmatrix, cmatrix)
1119 CALL dbcsr_create(rmatrix, template=overlap_deriv(1, 1)%matrix, &
1120 matrix_type=dbcsr_type_symmetric)
1121 CALL dbcsr_create(cmatrix, template=overlap_deriv(1, 1)%matrix, &
1122 matrix_type=dbcsr_type_antisymmetric)
1123 CALL cp_dbcsr_alloc_block_from_nbl(rmatrix, sab_kp)
1124 CALL cp_dbcsr_alloc_block_from_nbl(cmatrix, sab_kp)
1125 END IF
1126
1127 DO ikp = 1, nkp
1128 my_kpgrp = (ikp >= kp_range(1) .AND. ikp <= kp_range(2))
1129 IF (my_kpgrp) THEN
1130 ikp_local = ikp - kp_range(1) + 1
1131 kp => kp_env(ikp_local)%kpoint_env
1132 mos_kp => kp%mos
1133 ELSE
1134 NULLIFY (kp, mos_kp)
1135 END IF
1136 spin_offset = 0
1137 DO ispin = 1, nspins
1138 nao = nao_spin(ispin)
1139 ALLOCATE (eigenvalues_kp(nmo_spin(ispin)))
1140 eigenvalues_kp = 0.0_dp
1141
1142 IF (.NOT. use_scf_moment_dipoles) THEN
1143 CALL cp_fm_struct_create(fm_struct, nrow_global=nao, ncol_global=nmo_spin(ispin), &
1144 para_env=para_env, context=blacs_env_all)
1145 CALL cp_fm_create(mo_coeff_re_global, fm_struct)
1146 CALL cp_fm_create(mo_coeff_im_global, fm_struct)
1147 CALL cp_fm_create(fm_tmp, fm_struct)
1148 CALL cp_fm_struct_release(fm_struct)
1149 CALL cp_fm_struct_create(moment_struct, nrow_global=nmo_spin(ispin), &
1150 ncol_global=nmo_spin(ispin), para_env=para_env, &
1151 context=blacs_env_all)
1152 CALL cp_fm_create(moment_re, moment_struct)
1153 CALL cp_fm_create(moment_im, moment_struct)
1154 CALL cp_fm_struct_release(moment_struct)
1155 END IF
1156
1157 IF (my_kpgrp) THEN
1158 CALL get_mo_set(mos_kp(1, ispin), eigenvalues=eigenvalues)
1159 cpassert(ASSOCIATED(eigenvalues))
1160 IF (para_env_kp%is_source()) THEN
1161 eigenvalues_kp(1:nmo_spin(ispin)) = eigenvalues(1:nmo_spin(ispin))
1162 END IF
1163 IF (.NOT. use_scf_moment_dipoles) THEN
1164 CALL get_mo_set(mos_kp(1, ispin), mo_coeff=mo_coeff_re)
1165 CALL get_mo_set(mos_kp(2, ispin), mo_coeff=mo_coeff_im)
1166 cpassert(ASSOCIATED(mo_coeff_re))
1167 cpassert(ASSOCIATED(mo_coeff_im))
1168 CALL cp_fm_copy_general(mo_coeff_re, mo_coeff_re_global, para_env)
1169 CALL cp_fm_copy_general(mo_coeff_im, mo_coeff_im_global, para_env)
1170 END IF
1171 ELSE IF (.NOT. use_scf_moment_dipoles) THEN
1172 CALL cp_fm_copy_general(fm_dummy, mo_coeff_re_global, para_env)
1173 CALL cp_fm_copy_general(fm_dummy, mo_coeff_im_global, para_env)
1174 END IF
1175 CALL para_env%sum(eigenvalues_kp)
1176
1177 spin_factor = 1.0_dp
1178 IF (nspins == 1) THEN
1179 IF (tddfpt_control%rks_triplets) THEN
1180 spin_factor = 0.0_dp
1181 ELSE
1182 spin_factor = 2.0_dp
1183 END IF
1184 END IF
1185
1186 DO ideriv = 1, nderivs
1187 IF (.NOT. use_scf_moment_dipoles) THEN
1188 CALL dbcsr_set(rmatrix, 0.0_dp)
1189 CALL dbcsr_set(cmatrix, 0.0_dp)
1190 CALL rskp_transform(rmatrix=rmatrix, cmatrix=cmatrix, rsmat=overlap_deriv, &
1191 ispin=ideriv + 1, xkp=kpoints%xkp(:, ikp), &
1192 cell_to_index=cell_to_index, sab_nl=sab_kp)
1193
1194 CALL cp_dbcsr_sm_fm_multiply(rmatrix, mo_coeff_re_global, fm_tmp, nmo_spin(ispin))
1195 CALL parallel_gemm("T", "N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1196 1.0_dp, mo_coeff_re_global, fm_tmp, 0.0_dp, moment_re)
1197 CALL parallel_gemm("T", "N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1198 1.0_dp, mo_coeff_im_global, fm_tmp, 0.0_dp, moment_im)
1199
1200 CALL cp_dbcsr_sm_fm_multiply(rmatrix, mo_coeff_im_global, fm_tmp, nmo_spin(ispin))
1201 CALL parallel_gemm("T", "N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1202 1.0_dp, mo_coeff_re_global, fm_tmp, 1.0_dp, moment_im)
1203 CALL parallel_gemm("T", "N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1204 -1.0_dp, mo_coeff_im_global, fm_tmp, 1.0_dp, moment_re)
1205
1206 CALL cp_dbcsr_sm_fm_multiply(cmatrix, mo_coeff_re_global, fm_tmp, nmo_spin(ispin))
1207 CALL parallel_gemm("T", "N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1208 1.0_dp, mo_coeff_re_global, fm_tmp, 1.0_dp, moment_im)
1209 CALL parallel_gemm("T", "N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1210 -1.0_dp, mo_coeff_im_global, fm_tmp, 1.0_dp, moment_re)
1211
1212 CALL cp_dbcsr_sm_fm_multiply(cmatrix, mo_coeff_im_global, fm_tmp, nmo_spin(ispin))
1213 CALL parallel_gemm("T", "N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1214 -1.0_dp, mo_coeff_re_global, fm_tmp, 1.0_dp, moment_re)
1215 CALL parallel_gemm("T", "N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1216 -1.0_dp, mo_coeff_im_global, fm_tmp, 1.0_dp, moment_im)
1217 END IF
1218
1219 DO iocc = 1, homo_spin(ispin)
1220 DO ivirt = homo_spin(ispin) + 1, nmo_spin(ispin)
1221 trans_index = (ikp - 1)*ntrans_kpoint + spin_offset + &
1222 (iocc - 1)*nvirt_spin(ispin) + ivirt - homo_spin(ispin)
1223 gap = eigenvalues_kp(ivirt) - eigenvalues_kp(iocc)
1224 IF (gap <= 0.0_dp) THEN
1225 cpabort("K-point TDDFPT requires positive occupied-virtual energy gaps")
1226 END IF
1227 IF (use_scf_moment_dipoles) THEN
1228 oscillator_factor = sqrt(spin_factor*wkp(ikp))
1229 dipole_re = real(kpoint_dipole(ispin, ikp, ideriv, iocc, ivirt), kind=dp)
1230 dipole_im = aimag(kpoint_dipole(ispin, ikp, ideriv, iocc, ivirt))
1231 ELSE
1232 oscillator_factor = sqrt(spin_factor*wkp(ikp))/gap
1233 CALL cp_fm_get_element(moment_re, ivirt, iocc, dipole_re)
1234 CALL cp_fm_get_element(moment_im, ivirt, iocc, dipole_im)
1235 END IF
1236 transition_dipole_re(trans_index, ideriv) = oscillator_factor*dipole_re
1237 transition_dipole_im(trans_index, ideriv) = oscillator_factor*dipole_im
1238 END DO
1239 END DO
1240 END DO
1241
1242 DO iocc = 1, homo_spin(ispin)
1243 DO ivirt = homo_spin(ispin) + 1, nmo_spin(ispin)
1244 trans_index = (ikp - 1)*ntrans_kpoint + spin_offset + &
1245 (iocc - 1)*nvirt_spin(ispin) + ivirt - homo_spin(ispin)
1246 transition_energy(trans_index) = eigenvalues_kp(ivirt) - eigenvalues_kp(iocc)
1247 oscillator_strength(trans_index) = 2.0_dp/3.0_dp*transition_energy(trans_index)* &
1248 sum(transition_dipole_re(trans_index, :)**2 + &
1249 transition_dipole_im(trans_index, :)**2)
1250 END DO
1251 END DO
1252 IF (.NOT. use_scf_moment_dipoles) THEN
1253 CALL cp_fm_release(moment_im)
1254 CALL cp_fm_release(moment_re)
1255 CALL cp_fm_release(fm_tmp)
1256 CALL cp_fm_release(mo_coeff_im_global)
1257 CALL cp_fm_release(mo_coeff_re_global)
1258 END IF
1259 DEALLOCATE (eigenvalues_kp)
1260 spin_offset = spin_offset + homo_spin(ispin)*nvirt_spin(ispin)
1261 END DO
1262 END DO
1263
1264 IF (any(transition_energy <= 0.0_dp)) THEN
1265 cpabort("K-point TDDFPT KERNEL NONE requires positive occupied-virtual energy gaps")
1266 END IF
1267
1268 CALL sort(transition_energy, ntrans_total, inds)
1269 nstates = min(tddfpt_control%nstates, ntrans_total)
1270 IF (tddfpt_control%nstates > ntrans_total) THEN
1271 cpwarn("Requested more TDDFPT states than independent-particle k-point transitions")
1272 END IF
1273
1274 ALLOCATE (evals(nstates))
1275 evals(1:nstates) = transition_energy(1:nstates)
1276 checksum = sqrt(sum(evals**2))
1277
1278 log_unit = cp_logger_get_default_io_unit(logger)
1279 IF (log_unit > 0) THEN
1280 WRITE (log_unit, "(1X,A)") "", &
1281 "-------------------------------------------------------------------------------", &
1282 "- TDDFPT K-point Independent-particle Transitions -", &
1283 "-------------------------------------------------------------------------------"
1284 WRITE (log_unit, "(1X,A)") &
1285 "Only KERNEL NONE is active for k-point TDDFPT; transition dipole magnitudes are shown."
1286 WRITE (log_unit, '(/,T10,A,T19,A,T37,A,T69,A)') "State", "Excitation", &
1287 "Transition dipole (a.u.)", "Oscillator"
1288 WRITE (log_unit, '(T10,A,T19,A,T37,A,T49,A,T61,A,T67,A)') "number", "energy (eV)", &
1289 "x", "y", "z", "strength (a.u.)"
1290 WRITE (log_unit, '(T10,72("-"))')
1291 END IF
1292
1293 fsum = 0.0_dp
1294 DO istate = 1, nstates
1295 itrans = inds(istate) - 1
1296 ikp = itrans/ntrans_kpoint + 1
1297 itrans = mod(itrans, ntrans_kpoint)
1298 spin_offset = 0
1299 DO ispin = 1, nspins
1300 ntrans_spin = homo_spin(ispin)*nvirt_spin(ispin)
1301 IF (itrans < spin_offset + ntrans_spin) THEN
1302 itrans = itrans - spin_offset
1303 iocc = itrans/nvirt_spin(ispin) + 1
1304 ivirt = mod(itrans, nvirt_spin(ispin)) + homo_spin(ispin) + 1
1305 EXIT
1306 END IF
1307 spin_offset = spin_offset + ntrans_spin
1308 END DO
1309
1310 IF (log_unit > 0) THEN
1311 transition_dipole_abs(1:nderivs) = &
1312 sqrt(transition_dipole_re(inds(istate), 1:nderivs)**2 + &
1313 transition_dipole_im(inds(istate), 1:nderivs)**2)
1314 WRITE (log_unit, '(1X,A,T9,I7,T19,F11.5,T31,3(1X,ES11.4E2),T69,ES12.5E2)') &
1315 "TDDFPT|", istate, evals(istate)*evolt, transition_dipole_abs, &
1316 oscillator_strength(inds(istate))
1317 fsum = fsum + oscillator_strength(inds(istate))**2
1318 WRITE (log_unit, '(1X,A,T18,I7,T28,I7,T38,I7,T50,I7,T62,I7,T74,F10.5)') &
1319 "TDDFPT_KPOINT|", istate, ikp, ispin, iocc, ivirt, wkp(ikp)
1320 END IF
1321 END DO
1322
1323 IF (log_unit > 0) THEN
1324 WRITE (log_unit, '(/,T2,A,E16.8)') 'TDDFPT : CheckSum E = ', checksum
1325 WRITE (log_unit, '(T2,A,E16.8)') 'TDDFPT : CheckSum F = ', sqrt(fsum)
1326 WRITE (log_unit, "(1X,A)") &
1327 "-------------------------------------------------------------------------------"
1328 END IF
1329
1330 IF (use_scf_moment_dipoles) THEN
1331 DEALLOCATE (kpoint_dipole)
1332 ELSE
1333 CALL dbcsr_deallocate_matrix(rmatrix)
1334 CALL dbcsr_deallocate_matrix(cmatrix)
1335 CALL dbcsr_deallocate_matrix_set(overlap_deriv)
1336 END IF
1337
1338 DEALLOCATE (evals, inds, oscillator_strength, transition_dipole_im, transition_dipole_re, &
1339 transition_energy)
1340
1341 CALL timestop(handle)
1342
1343 END SUBROUTINE tddfpt_kpoint_independent_particle
1344
1345! **************************************************************************************************
1346!> \brief The energy calculation has been moved to its own subroutine
1347!> \param qs_env ...
1348!> \param nstates ...
1349!> \param nspins ...
1350!> \param work_matrices ...
1351!> \param tddfpt_control ...
1352!> \param logger ...
1353!> \param tddfpt_print_section ...
1354!> \param evects ...
1355!> \param evals ...
1356!> \param gs_mos ...
1357!> \param tddfpt_section ...
1358!> \param S_evects ...
1359!> \param matrix_s ...
1360!> \param kernel_env ...
1361!> \param matrix_ks ...
1362!> \param sub_env ...
1363!> \param ostrength ...
1364!> \param dipole_op_mos_occ ...
1365!> \param mult ...
1366!> \param xc_section ...
1367!> \param full_kernel_env ...
1368!> \param kernel_env_admm_aux ...
1369! **************************************************************************************************
1370 SUBROUTINE tddfpt_energies(qs_env, nstates, nspins, work_matrices, &
1371 tddfpt_control, logger, tddfpt_print_section, evects, evals, &
1372 gs_mos, tddfpt_section, S_evects, matrix_s, kernel_env, matrix_ks, &
1373 sub_env, ostrength, dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
1374 kernel_env_admm_aux)
1375
1376 TYPE(qs_environment_type), POINTER :: qs_env
1377 INTEGER :: nstates, nspins
1378 TYPE(tddfpt_work_matrices) :: work_matrices
1379 TYPE(tddfpt2_control_type), POINTER :: tddfpt_control
1380 TYPE(cp_logger_type), POINTER :: logger
1381 TYPE(section_vals_type), POINTER :: tddfpt_print_section
1382 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: evects
1383 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: evals
1384 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
1385 POINTER :: gs_mos
1386 TYPE(section_vals_type), POINTER :: tddfpt_section
1387 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: s_evects
1388 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
1389 TYPE(kernel_env_type) :: kernel_env
1390 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks
1391 TYPE(tddfpt_subgroup_env_type) :: sub_env
1392 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: ostrength
1393 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: dipole_op_mos_occ
1394 INTEGER :: mult
1395 TYPE(section_vals_type), POINTER :: xc_section
1396 TYPE(full_kernel_env_type), TARGET :: full_kernel_env, kernel_env_admm_aux
1397
1398 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_energies'
1399
1400 CHARACTER(len=20) :: nstates_str
1401 INTEGER :: energy_unit, handle, iter, log_unit, &
1402 niters, nocc, nstate_max, &
1403 nstates_read, nvirt
1404 LOGICAL :: do_admm, do_exck, do_soc, explicit
1405 REAL(kind=dp) :: conv
1406 TYPE(admm_type), POINTER :: admm_env
1407 TYPE(cp_blacs_env_type), POINTER :: blacs_env
1408 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks_oep
1409 TYPE(section_vals_type), POINTER :: lri_section, namd_print_section, &
1410 soc_section
1411
1412 CALL timeset(routinen, handle)
1413
1414 NULLIFY (admm_env, matrix_ks_oep)
1415 do_admm = tddfpt_control%do_admm
1416 IF (do_admm) CALL get_qs_env(qs_env, admm_env=admm_env)
1417
1418 ! setup for full_kernel and admm_kernel within tddfpt_energies due to dependence on multiplicity
1419 IF (tddfpt_control%kernel == tddfpt_kernel_full) THEN
1420
1422 rho_orb_struct=work_matrices%rho_orb_struct_sub, &
1423 rho_xc_struct=work_matrices%rho_xc_struct_sub, &
1424 is_rks_triplets=tddfpt_control%rks_triplets, &
1425 qs_env=qs_env, sub_env=sub_env, &
1426 wfm_rho_orb=work_matrices%rho_ao_orb_fm_sub)
1427
1428 IF (do_admm) THEN
1429 ! Full kernel with ADMM
1430 IF (tddfpt_control%admm_xc_correction) THEN
1431 CALL create_kernel_env(kernel_env=full_kernel_env, &
1432 rho_struct_sub=work_matrices%rho_orb_struct_sub, &
1433 xc_section=admm_env%xc_section_primary, &
1434 is_rks_triplets=tddfpt_control%rks_triplets, &
1435 sub_env=sub_env)
1436 ELSE
1437 CALL create_kernel_env(kernel_env=full_kernel_env, &
1438 rho_struct_sub=work_matrices%rho_orb_struct_sub, &
1439 xc_section=xc_section, &
1440 is_rks_triplets=tddfpt_control%rks_triplets, &
1441 sub_env=sub_env)
1442 END IF
1443
1445 rho_orb_struct=work_matrices%rho_orb_struct_sub, &
1446 rho_aux_fit_struct=work_matrices%rho_aux_fit_struct_sub, &
1447 local_rho_set=sub_env%local_rho_set_admm, &
1448 qs_env=qs_env, sub_env=sub_env, &
1449 wfm_rho_orb=work_matrices%rho_ao_orb_fm_sub, &
1450 wfm_rho_aux_fit=work_matrices%rho_ao_aux_fit_fm_sub, &
1451 wfm_aux_orb=work_matrices%wfm_aux_orb_sub)
1452
1453 CALL create_kernel_env(kernel_env=kernel_env_admm_aux, &
1454 rho_struct_sub=work_matrices%rho_aux_fit_struct_sub, &
1455 xc_section=admm_env%xc_section_aux, &
1456 is_rks_triplets=tddfpt_control%rks_triplets, &
1457 sub_env=sub_env)
1458 kernel_env%full_kernel => full_kernel_env
1459 kernel_env%admm_kernel => kernel_env_admm_aux
1460 ELSE
1461 ! Full kernel
1462 CALL create_kernel_env(kernel_env=full_kernel_env, &
1463 rho_struct_sub=work_matrices%rho_orb_struct_sub, &
1464 xc_section=xc_section, &
1465 is_rks_triplets=tddfpt_control%rks_triplets, &
1466 sub_env=sub_env)
1467 kernel_env%full_kernel => full_kernel_env
1468 NULLIFY (kernel_env%admm_kernel)
1469 END IF
1470 ! Fxc from kernel definition
1471 do_exck = tddfpt_control%do_exck
1472 kernel_env%full_kernel%do_exck = do_exck
1473 ! initilize xc kernel
1474 IF (do_exck) THEN
1475 CALL create_fxc_kernel(work_matrices%rho_orb_struct_sub, work_matrices%fxc_rspace_sub, &
1476 xc_section, tddfpt_control%rks_triplets, sub_env, qs_env)
1477 END IF
1478 END IF
1479
1480 ! lri input
1481 IF (tddfpt_control%do_lrigpw) THEN
1482 lri_section => section_vals_get_subs_vals(tddfpt_section, "LRIGPW")
1483 CALL tddfpt2_lri_init(qs_env, kernel_env, lri_section, &
1484 tddfpt_print_section)
1485 END IF
1486
1487 !! Too many states can lead to Problems
1488 !! You should be warned if there are more states
1489 !! than occ-virt Combinations!!
1490 CALL cp_fm_get_info(gs_mos(1)%mos_occ, ncol_global=nocc)
1491 IF (tddfpt_control%spinflip == no_sf_tddfpt) THEN
1492 CALL cp_fm_get_info(gs_mos(1)%mos_virt, ncol_global=nvirt)
1493 ELSE
1494 CALL cp_fm_get_info(gs_mos(2)%mos_virt, ncol_global=nvirt)
1495 END IF
1496 nstate_max = nocc*nvirt
1497 IF ((SIZE(gs_mos, 1) == 2) .AND. (tddfpt_control%spinflip == no_sf_tddfpt)) THEN
1498 CALL cp_fm_get_info(gs_mos(2)%mos_occ, ncol_global=nocc)
1499 CALL cp_fm_get_info(gs_mos(2)%mos_virt, ncol_global=nvirt)
1500 nstate_max = nocc*nvirt + nstate_max
1501 END IF
1502 IF (nstates > nstate_max) THEN
1503 cpwarn("NUMBER OF EXCITED STATES COULD LEAD TO PROBLEMS!")
1504 cpwarn("Experimental: CHANGED NSTATES TO ITS MAXIMUM VALUE!")
1505 nstates = nstate_max
1506 END IF
1507
1508 soc_section => section_vals_get_subs_vals(tddfpt_section, "SOC")
1509 CALL section_vals_get(soc_section, explicit=do_soc)
1510
1511 ! reuse Ritz vectors from the previous calculation if available
1512 IF (tddfpt_control%is_restart .AND. .NOT. do_soc) THEN
1513 CALL get_qs_env(qs_env, blacs_env=blacs_env)
1514
1515 nstates_read = tddfpt_read_restart( &
1516 evects=evects, &
1517 evals=evals, &
1518 gs_mos=gs_mos, &
1519 logger=logger, &
1520 tddfpt_section=tddfpt_section, &
1521 tddfpt_print_section=tddfpt_print_section, &
1522 fm_pool_ao_mo_active=work_matrices%fm_pool_ao_mo_active, &
1523 blacs_env_global=blacs_env)
1524 ELSE
1525 nstates_read = 0
1526 END IF
1527
1528 ! build the list of missed singly excited states and sort them in ascending order
1529 ! according to their excitation energies
1530 log_unit = cp_print_key_unit_nr(logger, tddfpt_print_section, &
1531 "GUESS_VECTORS", extension=".tddfptLog")
1532 CALL tddfpt_guess_vectors(evects=evects, evals=evals, &
1533 gs_mos=gs_mos, log_unit=log_unit, tddfpt_control=tddfpt_control, &
1534 fm_pool_ao_mo_active=work_matrices%fm_pool_ao_mo_active, &
1535 qs_env=qs_env, nspins=nspins)
1536 CALL cp_print_key_finished_output(log_unit, logger, &
1537 tddfpt_print_section, "GUESS_VECTORS")
1538
1539 CALL tddfpt_orthogonalize_psi1_psi0(evects, work_matrices%S_C0_C0T, qs_env, &
1540 gs_mos, evals, tddfpt_control, work_matrices%S_C0)
1541 CALL tddfpt_orthonormalize_psi1_psi1(evects, nstates, s_evects, matrix_s(1)%matrix)
1542
1543 niters = tddfpt_control%niters
1544 IF (niters > 0) THEN
1545 log_unit = cp_print_key_unit_nr(logger, tddfpt_print_section, &
1546 "ITERATION_INFO", extension=".tddfptLog")
1547 energy_unit = cp_print_key_unit_nr(logger, &
1548 tddfpt_print_section, &
1549 "DETAILED_ENERGY", &
1550 extension=".tddfptLog")
1551
1552 IF (log_unit > 0) THEN
1553 WRITE (log_unit, "(1X,A)") "", &
1554 "-------------------------------------------------------------------------------", &
1555 "- TDDFPT WAVEFUNCTION OPTIMIZATION -", &
1556 "-------------------------------------------------------------------------------"
1557
1558 WRITE (log_unit, '(/,T11,A,T27,A,T40,A,T62,A)') "Step", "Time", "Convergence", "Conv. states"
1559 WRITE (log_unit, '(1X,79("-"))')
1560 END IF
1561
1562 CALL cp_add_iter_level(logger%iter_info, "TDDFT_SCF")
1563
1564 DO
1565 ! *** perform Davidson iterations ***
1566 conv = tddfpt_davidson_solver( &
1567 evects=evects, &
1568 evals=evals, &
1569 s_evects=s_evects, &
1570 gs_mos=gs_mos, &
1571 tddfpt_control=tddfpt_control, &
1572 matrix_ks=matrix_ks, &
1573 qs_env=qs_env, &
1574 kernel_env=kernel_env, &
1575 sub_env=sub_env, &
1576 logger=logger, &
1577 iter_unit=log_unit, &
1578 energy_unit=energy_unit, &
1579 tddfpt_print_section=tddfpt_print_section, &
1580 work_matrices=work_matrices)
1581
1582 ! at this point at least one of the following conditions are met:
1583 ! a) convergence criteria has been achieved;
1584 ! b) maximum number of iterations has been reached;
1585 ! c) Davidson iterations must be restarted due to lack of Krylov vectors
1586
1587 CALL cp_iterate(logger%iter_info, increment=0, iter_nr_out=iter)
1588 ! terminate the loop if either (a) or (b) is true ...
1589 IF ((conv <= tddfpt_control%conv) .OR. iter >= niters) EXIT
1590
1591 ! ... otherwise restart Davidson iterations
1592 evals = 0.0_dp
1593 IF (log_unit > 0) THEN
1594 WRITE (log_unit, '(1X,25("-"),1X,A,1X,25("-"))') "Restart Davidson iterations"
1595 CALL m_flush(log_unit)
1596 END IF
1597 END DO
1598
1599 ! write TDDFPT restart file at the last iteration if requested to do so
1600 CALL cp_iterate(logger%iter_info, increment=0, last=.true.)
1601 CALL tddfpt_write_restart(evects=evects, &
1602 evals=evals, &
1603 gs_mos=gs_mos, &
1604 logger=logger, &
1605 tddfpt_print_section=tddfpt_print_section)
1606
1607 CALL cp_rm_iter_level(logger%iter_info, "TDDFT_SCF")
1608
1609 ! print convergence summary
1610 IF (log_unit > 0) THEN
1611 CALL integer_to_string(iter, nstates_str)
1612 IF (conv <= tddfpt_control%conv) THEN
1613 WRITE (log_unit, "(1X,A)") "", &
1614 "-------------------------------------------------------------------------------", &
1615 "- TDDFPT run converged in "//trim(nstates_str)//" iteration(s) ", &
1616 "-------------------------------------------------------------------------------"
1617 ELSE
1618 WRITE (log_unit, "(1X,A)") "", &
1619 "-------------------------------------------------------------------------------", &
1620 "- TDDFPT run did NOT converge after "//trim(nstates_str)//" iteration(s) ", &
1621 "-------------------------------------------------------------------------------"
1622 END IF
1623 END IF
1624
1625 CALL cp_print_key_finished_output(energy_unit, logger, &
1626 tddfpt_print_section, "DETAILED_ENERGY")
1627 CALL cp_print_key_finished_output(log_unit, logger, &
1628 tddfpt_print_section, "ITERATION_INFO")
1629 ELSE
1630 CALL cp_warn(__location__, &
1631 "Skipping TDDFPT wavefunction optimization")
1632 END IF
1633
1634 IF (ASSOCIATED(matrix_ks_oep)) THEN
1635 IF (tddfpt_control%dipole_form == tddfpt_dipole_velocity) THEN
1636 CALL cp_warn(__location__, &
1637 "Transition dipole moments and oscillator strengths are likely to be incorrect "// &
1638 "when computed using an orbital energy correction XC-potential together with "// &
1639 "the velocity form of dipole transition integrals")
1640 END IF
1641 END IF
1642
1643 ! *** print summary information ***
1644 log_unit = cp_logger_get_default_io_unit(logger)
1645
1646 namd_print_section => section_vals_get_subs_vals( &
1647 tddfpt_print_section, &
1648 "NAMD_PRINT")
1649 CALL section_vals_get(namd_print_section, explicit=explicit)
1650 IF (explicit) THEN
1651 CALL tddfpt_write_newtonx_output(evects, &
1652 evals, &
1653 gs_mos, &
1654 logger, &
1655 tddfpt_print_section, &
1656 matrix_s(1)%matrix, &
1657 s_evects, &
1658 sub_env)
1659 END IF
1660 ALLOCATE (ostrength(nstates))
1661 ostrength = 0.0_dp
1662 CALL tddfpt_print_summary(log_unit, &
1663 evects, &
1664 evals, &
1665 gs_mos, &
1666 ostrength, &
1667 mult, &
1668 dipole_op_mos_occ, &
1669 tddfpt_control%dipole_form)
1671 log_unit, &
1672 evects, &
1673 evals, &
1674 gs_mos, &
1675 matrix_s(1)%matrix, &
1676 tddfpt_control%spinflip, &
1677 min_amplitude=tddfpt_control%min_excitation_amplitude)
1678 CALL tddfpt_print_nto_analysis(qs_env, &
1679 evects, evals, &
1680 ostrength, &
1681 gs_mos, &
1682 matrix_s(1)%matrix, &
1683 tddfpt_print_section)
1684 IF (tddfpt_control%do_exciton_descriptors) THEN
1686 log_unit, &
1687 evects, &
1688 gs_mos, &
1689 matrix_s(1)%matrix, &
1690 tddfpt_control%do_directional_exciton_descriptors, &
1691 qs_env)
1692 END IF
1693
1694 IF (tddfpt_control%do_lrigpw) THEN
1695 CALL lri_print_stat(qs_env, &
1696 ltddfpt=.true., &
1697 tddfpt_lri_env=kernel_env%full_kernel%lri_env)
1698 END IF
1699
1700 CALL timestop(handle)
1701 END SUBROUTINE tddfpt_energies
1702
1703! **************************************************************************************************
1704!> \brief Perform singlet and triplet computations for subsequent TDDFPT-SOC calculation.
1705!> \param qs_env Quickstep environment
1706!> \param nstates number of requested exited states
1707!> \param work_matrices ...
1708!> \param tddfpt_control ...
1709!> \param logger ...
1710!> \param tddfpt_print_section ...
1711!> \param evects Eigenvector of the requested multiplicity
1712!> \param evals Eigenvalue of the requested multiplicity
1713!> \param ostrength Oscillatorstrength
1714!> \param gs_mos ...
1715!> \param tddfpt_section ...
1716!> \param S_evects ...
1717!> \param matrix_s ...
1718!> \param kernel_env ...
1719!> \param matrix_ks ...
1720!> \param sub_env ...
1721!> \param dipole_op_mos_occ ...
1722!> \param lmult_tmp ...
1723!> \param xc_section ...
1724!> \param full_kernel_env ...
1725!> \param kernel_env_admm_aux ...
1726!> \par History
1727!> * 02.2023 created [Jan-Robert Vogt]
1728!> \note Based on tddfpt2_methods and xas_tdp_utils.
1729!> \note only the values of one multiplicity will be passed back for force calculations!
1730! **************************************************************************************************
1731
1732 SUBROUTINE tddfpt_soc_energies(qs_env, nstates, work_matrices, &
1733 tddfpt_control, logger, tddfpt_print_section, &
1734 evects, evals, ostrength, &
1735 gs_mos, tddfpt_section, S_evects, matrix_s, kernel_env, matrix_ks, &
1736 sub_env, dipole_op_mos_occ, lmult_tmp, xc_section, full_kernel_env, &
1737 kernel_env_admm_aux)
1738
1739 TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
1740 INTEGER, INTENT(in) :: nstates
1741 TYPE(tddfpt_work_matrices) :: work_matrices
1742 TYPE(tddfpt2_control_type), POINTER :: tddfpt_control
1743 TYPE(cp_logger_type), POINTER :: logger
1744 TYPE(section_vals_type), POINTER :: tddfpt_print_section
1745 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: evects
1746 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: evals, ostrength
1747 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
1748 POINTER :: gs_mos
1749 TYPE(section_vals_type), POINTER :: tddfpt_section
1750 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: s_evects
1751 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
1752 TYPE(kernel_env_type) :: kernel_env
1753 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks
1754 TYPE(tddfpt_subgroup_env_type) :: sub_env
1755 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: dipole_op_mos_occ
1756 LOGICAL, INTENT(in) :: lmult_tmp
1757 TYPE(section_vals_type), POINTER :: xc_section
1758 TYPE(full_kernel_env_type), TARGET :: full_kernel_env, kernel_env_admm_aux
1759
1760 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_soc_energies'
1761
1762 INTEGER :: handle, ispin, istate, log_unit, mult, &
1763 nspins
1764 LOGICAL :: do_sf
1765 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: evals_mult, ostrength_mult
1766 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: evects_mult
1767
1768 CALL timeset(routinen, handle)
1769
1770 log_unit = cp_print_key_unit_nr(logger, tddfpt_print_section, &
1771 "PROGRAM_BANNER", &
1772 extension=".tddfptLog")
1773 CALL tddfpt_soc_header(log_unit)
1774
1775 nspins = SIZE(gs_mos)
1776 ALLOCATE (evects_mult(nspins, nstates))
1777 ALLOCATE (evals_mult(nstates))
1778 do_sf = tddfpt_control%spinflip /= no_sf_tddfpt
1779
1780 ! First multiplicity
1781 IF (lmult_tmp) THEN
1782 IF (log_unit > 0) THEN
1783 WRITE (log_unit, "(1X,A)") "", &
1784 "-------------------------------------------------------------------------------", &
1785 "- TDDFPT SINGLET ENERGIES -", &
1786 "-------------------------------------------------------------------------------"
1787 END IF
1788 mult = 1
1789 ELSE
1790 IF (log_unit > 0) THEN
1791 WRITE (log_unit, "(1X,A)") "", &
1792 "-------------------------------------------------------------------------------", &
1793 "- TDDFPT TRIPLET ENERGIES -", &
1794 "-------------------------------------------------------------------------------"
1795 END IF
1796 mult = 3
1797 END IF
1798
1799 CALL tddfpt_energies(qs_env, nstates, nspins, work_matrices, tddfpt_control, logger, &
1800 tddfpt_print_section, evects_mult, evals_mult, &
1801 gs_mos, tddfpt_section, s_evects, matrix_s, &
1802 kernel_env, matrix_ks, sub_env, ostrength_mult, &
1803 dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
1804 kernel_env_admm_aux)
1805
1806 ! Clean up in between for full kernel
1807 IF (tddfpt_control%kernel == tddfpt_kernel_full) THEN
1808 IF (tddfpt_control%do_admm) CALL release_kernel_env(kernel_env%admm_kernel)
1809 CALL release_kernel_env(kernel_env%full_kernel)
1810 CALL tddfpt_release_work_matrices(work_matrices, sub_env)
1811 CALL tddfpt_create_work_matrices(work_matrices, gs_mos, nstates, &
1812 tddfpt_control%do_hfx, &
1813 tddfpt_control%do_admm, tddfpt_control%do_hfxlr, &
1814 tddfpt_control%do_exck, do_sf, qs_env, sub_env)
1815 END IF
1816
1817 DO istate = 1, nstates
1818 DO ispin = 1, nspins
1819 CALL cp_fm_release(s_evects(ispin, istate))
1820 END DO
1821 END DO
1822
1823 DO istate = 1, nstates
1824 DO ispin = 1, nspins
1825 CALL fm_pool_create_fm( &
1826 work_matrices%fm_pool_ao_mo_active(ispin)%pool, &
1827 s_evects(ispin, istate))
1828 END DO
1829 END DO
1830
1831 tddfpt_control%rks_triplets = lmult_tmp
1832
1833 ! Second multiplicity
1834 IF (lmult_tmp) THEN
1835 IF (log_unit > 0) THEN
1836 WRITE (log_unit, "(1X,A)") "", &
1837 " singlet excitations finished ", &
1838 " ", &
1839 "-------------------------------------------------------------------------------", &
1840 "- TDDFPT TRIPLET ENERGIES -", &
1841 "-------------------------------------------------------------------------------"
1842 END IF !log_unit
1843 mult = 3
1844 ELSE
1845 IF (log_unit > 0) THEN
1846 WRITE (log_unit, "(1X,A)") "", &
1847 " triplet excitations finished ", &
1848 " ", &
1849 "-------------------------------------------------------------------------------", &
1850 "- TDDFPT SINGLET ENERGIES -", &
1851 "-------------------------------------------------------------------------------"
1852 END IF !log_unit
1853 mult = 1
1854 END IF
1855
1856 CALL tddfpt_energies(qs_env, nstates, nspins, work_matrices, tddfpt_control, logger, &
1857 tddfpt_print_section, evects, evals, &
1858 gs_mos, tddfpt_section, s_evects, matrix_s, &
1859 kernel_env, matrix_ks, sub_env, ostrength, &
1860 dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
1861 kernel_env_admm_aux)
1862
1863 ! Compute perturbative SOC correction
1864 ! Order should always be singlet triplet in tddfpt_soc
1865 IF (lmult_tmp) THEN
1866 CALL tddfpt_soc(qs_env, evals_mult, evals, evects_mult, evects, gs_mos) !mult=singlet
1867 ELSE
1868 CALL tddfpt_soc(qs_env, evals, evals_mult, evects, evects_mult, gs_mos) !mult=triplet
1869 END IF
1870
1871 ! deallocate the additional multiplicity
1872 DO ispin = 1, SIZE(evects_mult, 1)
1873 DO istate = 1, SIZE(evects_mult, 2)
1874 CALL cp_fm_release(evects_mult(ispin, istate))
1875 END DO
1876 END DO
1877 DEALLOCATE (evects_mult, evals_mult, ostrength_mult)
1878
1879 CALL timestop(handle)
1880
1881 END SUBROUTINE tddfpt_soc_energies
1882
1883! **************************************************************************************************
1884!> \brief ...
1885!> \param qs_env ...
1886!> \param gs_mos ...
1887!> \param tddfpt_control ...
1888!> \param tddfpt_section ...
1889!> \param iounit ...
1890! **************************************************************************************************
1891 SUBROUTINE init_res_method(qs_env, gs_mos, tddfpt_control, tddfpt_section, iounit)
1892
1893 TYPE(qs_environment_type), POINTER :: qs_env
1894 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
1895 POINTER :: gs_mos
1896 TYPE(tddfpt2_control_type), POINTER :: tddfpt_control
1897 TYPE(section_vals_type), POINTER :: tddfpt_section
1898 INTEGER, INTENT(IN) :: iounit
1899
1900 CHARACTER(LEN=*), PARAMETER :: routinen = 'init_res_method'
1901
1902 INTEGER :: handle, i, io, ispin, nao, nmo, nmol, &
1903 nspins
1904 INTEGER, ALLOCATABLE, DIMENSION(:, :) :: orblist
1905 INTEGER, DIMENSION(:), POINTER :: mollist
1906 LOGICAL :: do_res, do_sf, ew1, ew2, ew3, ewcut, lms
1907 REAL(kind=dp) :: eclow, ecup, eint, emo
1908 REAL(kind=dp), DIMENSION(:), POINTER :: rvint
1909 TYPE(cp_blacs_env_type), POINTER :: blacs_env
1910 TYPE(cp_fm_struct_type), POINTER :: fm_struct
1911 TYPE(section_vals_type), POINTER :: res_section
1912
1913 CALL timeset(routinen, handle)
1914
1915 res_section => section_vals_get_subs_vals(tddfpt_section, "REDUCED_EXCITATION_SPACE")
1916 CALL section_vals_val_get(res_section, "_SECTION_PARAMETERS_", l_val=do_res)
1917
1918 ! spin flip TDA
1919 IF (tddfpt_control%spinflip == no_sf_tddfpt) THEN
1920 do_sf = .false.
1921 ELSE
1922 do_sf = .true.
1923 END IF
1924
1925 nspins = SIZE(gs_mos)
1926 IF (.NOT. do_res) THEN
1927 DO ispin = 1, nspins
1928 nmo = gs_mos(ispin)%nmo_occ
1929 tddfpt_control%nactive(ispin) = nmo
1930 gs_mos(ispin)%nmo_active = nmo
1931 ALLOCATE (gs_mos(ispin)%index_active(nmo))
1932 DO i = 1, nmo
1933 gs_mos(ispin)%index_active(i) = i
1934 END DO
1935 END DO
1936 ELSE
1937 IF (iounit > 0) THEN
1938 WRITE (iounit, "(/,1X,27('='),A,26('='))") ' REDUCED EXCITATION SPACE '
1939 END IF
1940 CALL section_vals_val_get(res_section, "ENERGY_WINDOW", explicit=ew1)
1941 CALL section_vals_val_get(res_section, "UPPER_ENERGY_CUTOFF", explicit=ew2)
1942 CALL section_vals_val_get(res_section, "LOWER_ENERGY_CUTOFF", explicit=ew3)
1943 ewcut = (ew1 .OR. ew2 .OR. ew3)
1944 CALL section_vals_val_get(res_section, "MOLECULE_LIST", explicit=lms)
1945
1946 CALL section_vals_val_get(res_section, "ENERGY_WINDOW", r_vals=rvint)
1947 cpassert(SIZE(rvint) == 2)
1948 eclow = rvint(1)
1949 ecup = rvint(2)
1950 CALL section_vals_val_get(res_section, "UPPER_ENERGY_CUTOFF", r_val=eint)
1951 ecup = min(ecup, eint)
1952 CALL section_vals_val_get(res_section, "LOWER_ENERGY_CUTOFF", r_val=eint)
1953 eclow = max(eclow, eint)
1954 IF (ewcut .AND. (iounit > 0)) THEN
1955 IF (eclow < -1.e8_dp .AND. ecup > 1.e8_dp) THEN
1956 WRITE (iounit, "(1X,A,T51,A10,T71,A10)") &
1957 'Orbital Energy Window [eV]', " -Inf", " Inf"
1958 ELSE IF (eclow < -1.e8_dp) THEN
1959 WRITE (iounit, "(1X,A,T51,A10,T71,F10.4)") &
1960 'Orbital Energy Window [eV]', " -Inf", evolt*ecup
1961 ELSE IF (ecup > 1.e8_dp) THEN
1962 WRITE (iounit, "(1X,A,T51,F10.4,T71,A10)") &
1963 'Orbital Energy Window [eV]', evolt*eclow, " Inf"
1964 ELSE
1965 WRITE (iounit, "(1X,A,T51,F10.4,T71,F10.4)") &
1966 'Orbital Energy Window [eV]', evolt*eclow, evolt*ecup
1967 END IF
1968 END IF
1969
1970 nmol = 0
1971 IF (lms) THEN
1972 CALL section_vals_val_get(res_section, "MOLECULE_LIST", i_vals=mollist)
1973 nmol = SIZE(mollist)
1974 WRITE (iounit, "(1X,A)") 'List of Selected Molecules'
1975 WRITE (iounit, "(1X,15(I5))") mollist(1:nmol)
1976 END IF
1977
1978 DO ispin = 1, nspins
1979 tddfpt_control%nactive(ispin) = gs_mos(ispin)%nmo_occ
1980 END DO
1981 nmo = maxval(tddfpt_control%nactive)
1982 ALLOCATE (orblist(nmo, nspins))
1983 orblist = 0
1984
1985 IF (lms) THEN
1986 ! ignore for now
1987 orblist = 1
1988 DO ispin = 1, nspins
1989 cpassert(.NOT. ASSOCIATED(gs_mos(ispin)%evals_occ_matrix))
1990 END DO
1991 ELSE IF (ewcut) THEN
1992 ! Filter orbitals wrt energy window
1993 DO ispin = 1, nspins
1994 DO i = 1, gs_mos(ispin)%nmo_occ
1995 emo = gs_mos(ispin)%evals_occ(i)
1996 IF (emo > eclow .AND. emo < ecup) orblist(i, ispin) = 1
1997 END DO
1998 END DO
1999 ELSE
2000 orblist = 1
2001 END IF
2002
2003 ! count active orbitals
2004 nmo = sum(orblist)
2005 IF (nmo == 0) THEN
2006 cpabort("RSE TDA: no active orbitals selected.")
2007 END IF
2008 DO ispin = 1, nspins
2009 nmo = sum(orblist(:, ispin))
2010 tddfpt_control%nactive(ispin) = nmo
2011 gs_mos(ispin)%nmo_active = nmo
2012 ALLOCATE (gs_mos(ispin)%index_active(nmo))
2013 io = 0
2014 DO i = 1, SIZE(orblist, 1)
2015 IF (orblist(i, ispin) == 1) THEN
2016 io = io + 1
2017 gs_mos(ispin)%index_active(io) = i
2018 END IF
2019 END DO
2020 END DO
2021 DEALLOCATE (orblist)
2022
2023 IF (lms) THEN
2024 ! output information
2025 ELSE
2026 IF (iounit > 0) THEN
2027 WRITE (iounit, "(1X,A)") 'List of Selected States'
2028 IF (nspins == 1) THEN
2029 WRITE (iounit, "(A,T67,A)") ' Active State Orbital', 'Orbital Energy'
2030 DO i = 1, gs_mos(1)%nmo_active
2031 io = gs_mos(1)%index_active(i)
2032 WRITE (iounit, "(T8,I6,T21,I6,T61,F20.4)") i, io, gs_mos(1)%evals_occ(io)*evolt
2033 END DO
2034 ELSE
2035 DO ispin = 1, nspins
2036 WRITE (iounit, "(1X,A,I2)") 'Spin ', ispin
2037 WRITE (iounit, "(A,T67,A)") ' Active State Orbital', 'Orbital Energy'
2038 DO i = 1, gs_mos(ispin)%nmo_active
2039 io = gs_mos(ispin)%index_active(i)
2040 WRITE (iounit, "(T8,I6,T21,I6,T61,F20.4)") i, io, gs_mos(ispin)%evals_occ(io)*evolt
2041 END DO
2042 END DO
2043 END IF
2044 END IF
2045 END IF
2046
2047 IF (do_sf) THEN
2048 cpabort("Restricted Active Space with spin flip TDA NYA")
2049 END IF
2050
2051 IF (iounit > 0) THEN
2052 WRITE (iounit, "(1X,79('='))")
2053 END IF
2054 END IF
2055
2056 ! Allocate mos_active
2057 DO ispin = 1, nspins
2058 CALL get_qs_env(qs_env, blacs_env=blacs_env)
2059 CALL cp_fm_get_info(gs_mos(ispin)%mos_occ, nrow_global=nao)
2060 nmo = gs_mos(ispin)%nmo_active
2061 CALL cp_fm_struct_create(fm_struct, template_fmstruct=gs_mos(ispin)%mos_occ%matrix_struct, &
2062 ncol_global=nmo, context=blacs_env)
2063 NULLIFY (gs_mos(ispin)%mos_active)
2064 ALLOCATE (gs_mos(ispin)%mos_active)
2065 CALL cp_fm_create(gs_mos(ispin)%mos_active, fm_struct)
2066 CALL cp_fm_struct_release(fm_struct)
2067 ! copy the active orbitals
2068 IF (gs_mos(ispin)%nmo_active == gs_mos(ispin)%nmo_occ) THEN
2069 DO i = 1, gs_mos(ispin)%nmo_active
2070 cpassert(i == gs_mos(ispin)%index_active(i))
2071 END DO
2072 CALL cp_fm_to_fm_submat(gs_mos(ispin)%mos_occ, gs_mos(ispin)%mos_active, &
2073 nao, nmo, 1, 1, 1, 1)
2074 ELSE
2075 DO i = 1, gs_mos(ispin)%nmo_active
2076 io = gs_mos(ispin)%index_active(i)
2077 CALL cp_fm_to_fm_submat(gs_mos(ispin)%mos_occ, gs_mos(ispin)%mos_active, &
2078 nao, 1, 1, io, 1, i)
2079 END DO
2080 END IF
2081 END DO
2082
2083 CALL timestop(handle)
2084
2085 END SUBROUTINE init_res_method
2086
2087END MODULE qs_tddfpt2_methods
Contains ADMM methods which require molecular orbitals.
subroutine, public admm_fit_mo_coeffs(admm_env, matrix_s_aux_fit, matrix_s_mixed, mos, mos_aux_fit, geometry_did_change)
...
Types and set/get functions for auxiliary density matrix methods.
Definition admm_types.F:15
subroutine, public get_admm_env(admm_env, mo_derivs_aux_fit, mos_aux_fit, sab_aux_fit, sab_aux_fit_asymm, sab_aux_fit_vs_orb, matrix_s_aux_fit, matrix_s_aux_fit_kp, matrix_s_aux_fit_vs_orb, matrix_s_aux_fit_vs_orb_kp, task_list_aux_fit, matrix_ks_aux_fit, matrix_ks_aux_fit_kp, matrix_ks_aux_fit_im, matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_ks_aux_fit_dft_kp, matrix_ks_aux_fit_hfx_kp, rho_aux_fit, rho_aux_fit_buffer, admm_dm)
Get routine for the ADMM env.
Definition admm_types.F:599
Define the atomic kind types and their sub types.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public grimme2016
integer, save, public iannuzzi2005
integer, save, public hernandez2025
integer, save, public grimme2013
Handles all functions related to the CELL.
Definition cell_types.F:15
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_deallocate_matrix(matrix)
...
subroutine, public dbcsr_set(matrix, alpha)
...
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
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
Definition cp_fm_types.F:15
subroutine, public cp_fm_copy_general(source, destination, para_env)
General copy of a fm matrix to another fm matrix. Uses non-blocking MPI rather than ScaLAPACK.
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
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_to_fm_submat(msource, mtarget, nrow, ncol, s_firstrow, s_firstcol, t_firstrow, t_firstcol)
copy just a part ot the matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
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,...
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.
subroutine, public cp_add_iter_level(iteration_info, level_name, n_rlevel_new)
Adds an iteration level.
Types for excited states potential energies.
subroutine, public tddfpt_header(iw)
...
Definition header.F:122
subroutine, public tddfpt_soc_header(iw)
...
Definition header.F:143
Utilities for hfx and admm methods.
subroutine, public aux_admm_init(qs_env, mos, admm_env, admm_control, basis_type)
Minimal setup routine for admm_env No forces No k-points No DFT correction terms.
Types and set/get functions for HFX.
Definition hfx_types.F:16
subroutine, public hfx_create(x_data, para_env, hfx_section, atomic_kind_set, qs_kind_set, particle_set, dft_control, cell, orb_basis, ri_basis, nelectron_total, nkp_grid)
This routine allocates and initializes all types in hfx_data
Definition hfx_types.F:607
subroutine, public compare_hfx_sections(hfx_section1, hfx_section2, is_identical, same_except_frac)
Compares the non-technical parts of two HFX input section and check whether they are the same Ignore ...
Definition hfx_types.F:3036
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public do_admm_purify_none
integer, parameter, public tddfpt_sf_col
integer, parameter, public tddfpt_kernel_none
integer, parameter, public tddfpt_dipole_scf_moment
integer, parameter, public oe_none
integer, parameter, public do_admm_basis_projection
integer, parameter, public do_admm_aux_exch_func_none
integer, parameter, public tddfpt_dipole_velocity
integer, parameter, public do_potential_truncated
integer, parameter, public tddfpt_kernel_full
integer, parameter, public tddfpt_sf_noncol
integer, parameter, public tddfpt_kernel_stda
integer, parameter, public no_sf_tddfpt
integer, parameter, public do_admm_exch_scaling_none
objects that represent the structure of input sections and the data contained in an input section
subroutine, public section_vals_val_set(section_vals, keyword_name, i_rep_section, i_rep_val, val, l_val, i_val, r_val, c_val, l_vals_ptr, i_vals_ptr, r_vals_ptr, c_vals_ptr)
sets the requested value
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
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Routines needed for kpoint calculation.
subroutine, public rskp_transform(rmatrix, cmatrix, rsmat, ispin, xkp, cell_to_index, sab_nl, is_complex, rs_sign)
Transformation of real space matrices to a kpoint.
Types and basic routines needed for a kpoint calculation.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym, inversion_symmetry_only, symmetry_backend, symmetry_reduction_method, gamma_centered)
Retrieve information from a kpoint environment.
Calculates integral matrices for LRIGPW method lri : local resolution of the identity.
subroutine, public lri_print_stat(qs_env, ltddfpt, tddfpt_lri_env)
...
contains the types and subroutines for dealing with the lri_env lri : local resolution of the identit...
subroutine, public lri_density_release(lri_density)
releases the given lri_density
subroutine, public lri_env_release(lri_env)
releases the given lri_env
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
Interface to the message passing library MPI.
generate or use from input minimal basis set
subroutine, public create_minbas_set(qs_env, unit_nr, basis_type, primitive)
...
basic linear algebra operations for full matrixes
Define the data structure for the particle information.
Definition of physical constants:
Definition physcon.F:68
real(kind=dp), parameter, public evolt
Definition physcon.F:183
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 create_fxc_kernel(rho_struct, fxc_rspace, xc_section, is_rks_triplets, sub_env, qs_env)
Create the xc kernel potential for the approximate Fxc kernel model.
subroutine, public create_kernel_env(kernel_env, xc_section, is_rks_triplets, rho_struct_sub, lsd_singlets, do_excitations, sub_env, qs_env)
Create kernel environment.
subroutine, public release_kernel_env(kernel_env)
Release kernel environment.
Define the quickstep kind type and their sub types.
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.
Calculates the moment integrals <a|r^m|b> and <a|r x d/dr|b>
Definition qs_moments.F:14
subroutine, public qs_moment_kpoints_scf_mos(qs_env, dipole, rcc, nmo_spin_out)
Calculates interband k-point dipoles in the existing SCF MO basis.
Define the neighbor list data types and the corresponding functionality.
Calculation of overlap matrix, its derivatives and forces.
Definition qs_overlap.F:19
subroutine, public build_overlap_matrix(ks_env, matrix_s, matrixkp_s, matrix_name, nderivative, basis_type_a, basis_type_b, sab_nl, calculate_forces, matrix_p, matrixkp_p, ext_kpoints)
Calculation of the overlap matrix over Cartesian Gaussian functions.
Definition qs_overlap.F:121
groups fairly general SCF methods, so that modules other than qs_scf can use them too split off from ...
subroutine, public eigensolver(matrix_ks_fm, mo_set, ortho, work, cholesky_method, do_level_shift, level_shift, matrix_u_fm, use_jacobi)
Diagonalise the Kohn-Sham matrix to get a new set of MO eigen- vectors and MO eigenvalues....
module that contains the definitions of the scf types
subroutine, public assign_state(qs_env, matrix_s, evects, psi0, wfn_history, my_state)
...
subroutine, public tddfpt_construct_aux_fit_density(rho_orb_struct, rho_aux_fit_struct, local_rho_set, qs_env, sub_env, wfm_rho_orb, wfm_rho_aux_fit, wfm_aux_orb)
Project a charge density expressed in primary basis set into the auxiliary basis set.
subroutine, public tddfpt_construct_ground_state_orb_density(rho_orb_struct, rho_xc_struct, is_rks_triplets, qs_env, sub_env, wfm_rho_orb)
Compute the ground-state charge density expressed in primary basis set.
subroutine, public tddfpt_orthonormalize_psi1_psi1(evects, nvects_new, s_evects, matrix_s)
Make new TDDFPT trial vectors orthonormal to all previous trial vectors.
subroutine, public tddfpt_orthogonalize_psi1_psi0(evects, s_c0_c0t, qs_env, gs_mos, evals, tddfpt_control, s_c0)
Make TDDFPT trial vectors orthogonal to all occupied molecular orbitals.
real(kind=dp) function, public tddfpt_davidson_solver(evects, evals, s_evects, gs_mos, tddfpt_control, matrix_ks, qs_env, kernel_env, sub_env, logger, iter_unit, energy_unit, tddfpt_print_section, work_matrices)
Perform Davidson iterations.
subroutine, public tddfpt_forces_main(qs_env, gs_mos, ex_env, kernel_env, sub_env, work_matrices)
Perform TDDFPT gradient calculation. This routine calculates the response vector R of Eq....
subroutine, public tddfpt_print_forces(qs_env, evects, evals, ostrength, print_section, gs_mos, kernel_env, sub_env, work_matrices)
Calculate and print forces of selected excited states.
subroutine, public tddfpt2_lri_init(qs_env, kernel_env, lri_section, tddfpt_print_section)
Initialize LRI environment, basis, neighborlists and matrices.
subroutine, public tddfpt(qs_env, calc_forces, rixs_env)
Perform TDDFPT calculation. If calc_forces then it also builds the response vector for the Z-vector m...
subroutine, public tddfpt_input(qs_env, tddfpt_section, tddfpt_control, do_hfx, do_admm, do_exck, do_hfxsr, do_hfxlr, xc_section, tddfpt_print_section, lri_section, hfxsr_section)
TDDFPT input.
subroutine, public tddfpt_energies(qs_env, nstates, nspins, work_matrices, tddfpt_control, logger, tddfpt_print_section, evects, evals, gs_mos, tddfpt_section, s_evects, matrix_s, kernel_env, matrix_ks, sub_env, ostrength, dipole_op_mos_occ, mult, xc_section, full_kernel_env, kernel_env_admm_aux)
The energy calculation has been moved to its own subroutine.
subroutine, public tddfpt_dipole_operator(dipole_op_mos_occ, tddfpt_control, gs_mos, qs_env)
Compute the action of the dipole operator on the ground state wave function.
subroutine, public tddfpt_print_nto_analysis(qs_env, evects, evals, ostrength, gs_mos, matrix_s, print_section)
Print natural transition orbital analysis.
subroutine, public tddfpt_print_excitation_analysis(log_unit, evects, evals, gs_mos, matrix_s, spinflip, min_amplitude)
Print excitation analysis.
subroutine, public tddfpt_print_exciton_descriptors(log_unit, evects, gs_mos, matrix_s, do_directional_exciton_descriptors, qs_env)
Print exciton descriptors, cf. Mewes et al., JCTC 14, 710-725 (2018)
subroutine, public tddfpt_print_summary(log_unit, evects, evals, gs_mos, ostrength, mult, dipole_op_mos_occ, dipole_form)
Print final TDDFPT excitation energies and oscillator strengths.
subroutine, public tddfpt_write_newtonx_output(evects, evals, gs_mos, logger, tddfpt_print_section, matrix_s, s_evects, sub_env)
Write Ritz vectors to a binary restart file.
subroutine, public tddfpt_write_restart(evects, evals, gs_mos, logger, tddfpt_print_section)
Write Ritz vectors to a binary restart file.
integer function, public tddfpt_read_restart(evects, evals, gs_mos, logger, tddfpt_section, tddfpt_print_section, fm_pool_ao_mo_active, blacs_env_global)
Initialise initial guess vectors by reading (un-normalised) Ritz vectors from a binary restart file.
subroutine, public tddfpt_smeared_occupation(qs_env, gs_mos, log_unit)
...
subroutine, public tddfpt_soc(qs_env, evals_a, evals_b, evects_a, evects_b, gs_mos)
Perform TDDFPT-SOC calculation.
Simplified Tamm Dancoff approach (sTDA).
subroutine, public stda_init_param(qs_env, stda_kernel, stda_control)
Get the parameters needed for an sTDA calculation.
subroutine, public deallocate_stda_env(stda_kernel)
Deallocate the sTDA environment.
subroutine, public allocate_stda_env(qs_env, stda_kernel, n_ao, nactive)
Allocate the sTDA environment.
Simplified Tamm Dancoff approach (sTDA).
subroutine, public get_lowdin_mo_coefficients(qs_env, sub_env, work)
Calculate Lowdin MO coefficients.
subroutine, public stda_init_matrices(qs_env, stda_kernel, sub_env, work, tddfpt_control)
Calculate sTDA matrices.
subroutine, public tddfpt_sub_env_init(sub_env, qs_env, mos_occ, mos_active, kernel)
Split MPI communicator to create a set of parallel (sub)groups.
subroutine, public tddfpt_sub_env_release(sub_env)
Release parallel group environment.
subroutine, public hfxsr_create_work_matrices(work_matrices, qs_env, admm_env)
Allocate work matrices for hfxsr.
subroutine, public tddfpt_create_work_matrices(work_matrices, gs_mos, nstates, do_hfx, do_admm, do_hfxlr, do_exck, do_sf, qs_env, sub_env)
Allocate work matrices for full kernel.
subroutine, public tddfpt_release_work_matrices(work_matrices, sub_env)
Release work matrices.
subroutine, public stda_create_work_matrices(work_matrices, gs_mos, nstates, qs_env, sub_env)
Allocate work matrices for sTDA kernel.
subroutine, public tddfpt_release_ground_state_mos(gs_mos)
Release molecular orbitals.
subroutine, public tddfpt_oecorr(qs_env, gs_mos, matrix_ks_oep)
Callculate orbital corrected KS matrix for TDDFPT.
subroutine, public tddfpt_guess_vectors(evects, evals, gs_mos, log_unit, tddfpt_control, fm_pool_ao_mo_active, qs_env, nspins)
Generate missed guess vectors.
subroutine, public tddfpt_init_mos(qs_env, gs_mos, iounit)
Prepare MOs for TDDFPT Calculations.
Define Resonant Inelastic XRAY Scattering (RIXS) control type and associated create,...
Definition rixs_types.F:13
Utilities for string manipulations.
subroutine, public integer_to_string(inumber, string)
Converts an integer number to a string. The WRITE statement will return an error message,...
All kind of helpful little routines.
Definition util.F:14
Writes information on XC functionals to output.
subroutine, public xc_write(iounit, xc_section, lsd)
...
stores some data used in wavefunction fitting
Definition admm_types.F:120
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
keeps the information about the structure of a full matrix
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...
Contains information on the excited states energy.
Keeps information about a specific k-point.
Contains information about kpoints.
stores all the informations relevant to an mpi environment
Collection of variables required to evaluate adiabatic TDDFPT kernel.
Type to hold environments for the different kernels.
Provides all information about a quickstep kind.
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
Ground state molecular orbitals.
Set of temporary ("work") matrices.
Valence state coming from the qs_tddfpt2 routine.
Definition rixs_types.F:40