(git:ed6f26b)
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-2025 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,&
16 cite_reference
17 USE cell_types, ONLY: cell_type
21 USE cp_dbcsr_api, ONLY: dbcsr_p_type
25 USE cp_fm_types, ONLY: cp_fm_create,&
39 USE header, ONLY: tddfpt_header,&
44 USE input_constants, ONLY: &
53 USE kinds, ONLY: dp
57 USE machine, ONLY: m_flush
61 USE physcon, ONLY: evolt
70 USE qs_mo_types, ONLY: mo_set_type
91 USE qs_tddfpt2_soc, ONLY: tddfpt_soc
112 USE xc_write_output, ONLY: xc_write
113#include "./base/base_uses.f90"
114
115 IMPLICIT NONE
116
117 PRIVATE
118
119 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_tddfpt2_methods'
120
121 LOGICAL, PARAMETER, PRIVATE :: debug_this_module = .false.
122 ! number of first derivative components (3: d/dx, d/dy, d/dz)
123 INTEGER, PARAMETER, PRIVATE :: nderivs = 3
124 INTEGER, PARAMETER, PRIVATE :: maxspins = 2
125
127
128! **************************************************************************************************
129
130CONTAINS
131
132! **************************************************************************************************
133!> \brief Perform TDDFPT calculation.
134!> \param qs_env Quickstep environment
135!> \param calc_forces ...
136!> \par History
137!> * 05.2016 created [Sergey Chulkov]
138!> * 06.2016 refactored to be used with Davidson eigensolver [Sergey Chulkov]
139!> * 03.2017 cleaned and refactored [Sergey Chulkov]
140!> \note Based on the subroutines tddfpt_env_init(), and tddfpt_env_deallocate().
141! **************************************************************************************************
142 SUBROUTINE tddfpt(qs_env, calc_forces)
143 TYPE(qs_environment_type), POINTER :: qs_env
144 LOGICAL, INTENT(IN) :: calc_forces
145
146 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt'
147
148 INTEGER :: handle, ispin, istate, log_unit, mult, &
149 my_state, nao, nocc, nspins, &
150 nstate_max, nstates, nvirt, old_state
151 INTEGER, DIMENSION(maxspins) :: nactive
152 LOGICAL :: do_admm, do_exck, do_hfx, do_hfxlr, &
153 do_hfxsr, do_soc, lmult_tmp, &
154 state_change
155 REAL(kind=dp) :: gsmin, gsval, xsval
156 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: evals, ostrength
157 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
158 TYPE(cell_type), POINTER :: cell
159 TYPE(cp_blacs_env_type), POINTER :: blacs_env
160 TYPE(cp_fm_struct_type), POINTER :: matrix_struct
161 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:) :: my_mos
162 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: dipole_op_mos_occ, evects, s_evects
163 TYPE(cp_logger_type), POINTER :: logger
164 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_ks_oep, matrix_s, &
165 matrix_s_aux_fit, &
166 matrix_s_aux_fit_vs_orb
167 TYPE(dft_control_type), POINTER :: dft_control
168 TYPE(excited_energy_type), POINTER :: ex_env
169 TYPE(full_kernel_env_type), TARGET :: full_kernel_env, kernel_env_admm_aux
170 TYPE(kernel_env_type) :: kernel_env
171 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos, mos_aux_fit
172 TYPE(mp_para_env_type), POINTER :: para_env
173 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
174 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
175 TYPE(qs_scf_env_type), POINTER :: scf_env
176 TYPE(section_vals_type), POINTER :: hfxsr_section, kernel_section, &
177 lri_section, soc_section, &
178 tddfpt_print_section, tddfpt_section, &
179 xc_section
180 TYPE(stda_env_type), TARGET :: stda_kernel
181 TYPE(tddfpt2_control_type), POINTER :: tddfpt_control
182 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
183 POINTER :: gs_mos
184 TYPE(tddfpt_subgroup_env_type) :: sub_env
185 TYPE(tddfpt_work_matrices) :: work_matrices
186
187 CALL timeset(routinen, handle)
188
189 NULLIFY (logger)
190 logger => cp_get_default_logger()
191
192 ! input section print/xc
193 NULLIFY (tddfpt_section)
194 tddfpt_section => section_vals_get_subs_vals(qs_env%input, "PROPERTIES%TDDFPT")
195
196 CALL tddfpt_input(qs_env, do_hfx, do_admm, do_exck, &
197 do_hfxsr, do_hfxlr, xc_section, tddfpt_print_section, &
198 lri_section, hfxsr_section)
199
200 log_unit = cp_print_key_unit_nr(logger, tddfpt_print_section, "PROGRAM_BANNER", &
201 extension=".tddfptLog")
202
203 CALL get_qs_env(qs_env, &
204 blacs_env=blacs_env, &
205 cell=cell, &
206 dft_control=dft_control, &
207 matrix_ks=matrix_ks, &
208 matrix_s=matrix_s, &
209 mos=mos, &
210 scf_env=scf_env)
211 tddfpt_control => dft_control%tddfpt2_control
212 tddfpt_control%do_hfx = do_hfx
213 tddfpt_control%do_admm = do_admm
214 tddfpt_control%do_hfxsr = do_hfxsr
215 tddfpt_control%hfxsr_primbas = 0
216 tddfpt_control%hfxsr_re_int = .true.
217 tddfpt_control%do_hfxlr = do_hfxlr
218 tddfpt_control%do_exck = do_exck
219 IF (tddfpt_control%do_hfxlr) THEN
220 kernel_section => section_vals_get_subs_vals(tddfpt_section, "XC%HFX_KERNEL%HFXLR")
221 CALL section_vals_val_get(kernel_section, "RCUT", r_val=tddfpt_control%hfxlr_rcut)
222 CALL section_vals_val_get(kernel_section, "SCALE", r_val=tddfpt_control%hfxlr_scale)
223 END IF
224
225 soc_section => section_vals_get_subs_vals(tddfpt_section, "SOC")
226 CALL section_vals_get(soc_section, explicit=do_soc)
227
228 IF (do_soc) THEN
229 ! start with multiplicity that is not specified in input
230 ! so that excited-state gradient is for multiplicity given in input
231 lmult_tmp = tddfpt_control%rks_triplets
232 tddfpt_control%rks_triplets = .NOT. (tddfpt_control%rks_triplets)
233 END IF
234
235 CALL cite_reference(iannuzzi2005)
236 IF (tddfpt_control%kernel == tddfpt_kernel_stda) THEN
237 CALL cite_reference(grimme2013)
238 CALL cite_reference(grimme2016)
239 END IF
240
241 CALL tddfpt_header(log_unit)
242 CALL kernel_info(log_unit, dft_control, tddfpt_control, xc_section)
243 ! obtain occupied and virtual (unoccupied) ground-state Kohn-Sham orbitals
244 NULLIFY (gs_mos)
245
246 CALL tddfpt_init_mos(qs_env, gs_mos, log_unit)
247
248 ! obtain smeared occupation numbers
249 IF (tddfpt_control%do_smearing) THEN
250 CALL tddfpt_smeared_occupation(qs_env, gs_mos, log_unit)
251 END IF
252
253 ! obtain corrected KS-matrix
254 CALL tddfpt_oecorr(qs_env, gs_mos, matrix_ks_oep)
255
256 IF ((tddfpt_control%do_lrigpw) .AND. &
257 (tddfpt_control%kernel /= tddfpt_kernel_full)) THEN
258 CALL cp_abort(__location__, "LRI only implemented for full kernel")
259 END IF
260
261 IF (ASSOCIATED(matrix_ks_oep)) matrix_ks => matrix_ks_oep
262
263 ! components of the dipole operator
264 CALL tddfpt_dipole_operator(dipole_op_mos_occ, &
265 tddfpt_control, &
266 gs_mos, &
267 qs_env)
268
269 nspins = SIZE(gs_mos)
270 ! multiplicity of molecular system
271 IF (nspins > 1) THEN
272 mult = abs(SIZE(gs_mos(1)%evals_occ) - SIZE(gs_mos(2)%evals_occ)) + 1
273 IF (mult > 2) &
274 CALL cp_warn(__location__, "There is a convergence issue for multiplicity >= 3")
275 ELSE
276 IF (tddfpt_control%rks_triplets) THEN
277 mult = 3
278 ELSE
279 mult = 1
280 END IF
281 END IF
282
283 ! split mpi communicator
284 ALLOCATE (my_mos(nspins))
285 DO ispin = 1, nspins
286 my_mos(ispin) = gs_mos(ispin)%mos_occ
287 END DO
288 CALL tddfpt_sub_env_init(sub_env, qs_env, mos_occ=my_mos(:), &
289 kernel=tddfpt_control%kernel)
290 DEALLOCATE (my_mos)
291
292 IF (tddfpt_control%kernel == tddfpt_kernel_full) THEN
293 ! create environment for Full Kernel
294 IF (dft_control%qs_control%xtb) THEN
295 cpabort("TDDFPT: xTB only works with sTDA Kernel")
296 END IF
297
298 IF (tddfpt_control%do_hfxsr) THEN
299 kernel_section => section_vals_get_subs_vals(tddfpt_section, "XC%HFX_KERNEL")
300 CALL section_vals_val_get(kernel_section, "HFXSR_PRIMBAS", &
301 i_val=tddfpt_control%hfxsr_primbas)
302 ! basis set
303 CALL create_minbas_set(qs_env, log_unit, basis_type="TDA_HFX", &
304 primitive=tddfpt_control%hfxsr_primbas)
305 ! admm control
306 ALLOCATE (full_kernel_env%admm_control)
307 full_kernel_env%admm_control%purification_method = do_admm_purify_none
308 full_kernel_env%admm_control%method = do_admm_basis_projection
309 full_kernel_env%admm_control%scaling_model = do_admm_exch_scaling_none
310 full_kernel_env%admm_control%aux_exch_func = do_admm_aux_exch_func_none
311 ! hfx section
312 full_kernel_env%hfxsr_section => hfxsr_section
313 !
314 CALL aux_admm_init(qs_env, mos, full_kernel_env%admm_env, &
315 full_kernel_env%admm_control, "TDA_HFX")
316 CALL get_admm_env(full_kernel_env%admm_env, mos_aux_fit=mos_aux_fit, &
317 matrix_s_aux_fit=matrix_s_aux_fit, &
318 matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb)
319 CALL admm_fit_mo_coeffs(full_kernel_env%admm_env, matrix_s_aux_fit, &
320 matrix_s_aux_fit_vs_orb, mos, mos_aux_fit, .true.)
321 ! x_data
322 CALL get_qs_env(qs_env, cell=cell, atomic_kind_set=atomic_kind_set, &
323 qs_kind_set=qs_kind_set, particle_set=particle_set, &
324 para_env=para_env)
325 CALL hfx_create(full_kernel_env%x_data, para_env, hfxsr_section, atomic_kind_set, &
326 qs_kind_set, particle_set, dft_control, cell, orb_basis="TDA_HFX")
327 END IF
328
329 ! allocate pools and work matrices
330 nstates = tddfpt_control%nstates
331 !! Too many states can lead to Problems
332 !! You should be warned if there are more states
333 !! then occ-virt Combinations!!
334 CALL cp_fm_get_info(gs_mos(1)%mos_occ, ncol_global=nocc)
335 CALL cp_fm_get_info(gs_mos(1)%mos_virt, ncol_global=nvirt)
336 nstate_max = nocc*nvirt
337 IF (nstates > nstate_max) THEN
338 cpwarn("NUMBER OF EXCITED STATES COULD LEAD TO PROBLEMS!")
339 cpwarn("Experimental: CHANGED NSTATES TO ITS MAXIMUM VALUE!")
340 nstates = nstate_max
341 tddfpt_control%nstates = nstate_max
342 END IF
343 CALL tddfpt_create_work_matrices(work_matrices, gs_mos, nstates, do_hfx, do_admm, &
344 do_hfxlr, do_exck, qs_env, sub_env)
345
346 ! create full_kernel and admm_kernel within tddfpt_energies
347 kernel_env%full_kernel => full_kernel_env
348 kernel_env%admm_kernel => kernel_env_admm_aux
349 NULLIFY (kernel_env%stda_kernel)
350 IF (do_hfxsr) THEN
351 ! work matrices for SR HFX
352 CALL hfxsr_create_work_matrices(work_matrices, qs_env, full_kernel_env%admm_env)
353 END IF
354 IF (do_hfxlr) THEN
355 ! calculate S_half and Lowdin MO coefficients
356 CALL get_lowdin_mo_coefficients(qs_env, sub_env, work_matrices)
357 END IF
358 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_stda) THEN
359 ! setup for kernel_stda outside tddfpt_energies
360 nactive = 0
361 CALL cp_fm_get_info(gs_mos(1)%mos_occ, nrow_global=nao)
362 DO ispin = 1, SIZE(gs_mos)
363 CALL cp_fm_get_info(gs_mos(ispin)%mos_occ, &
364 ncol_global=nactive(ispin))
365 END DO
366 CALL allocate_stda_env(qs_env, stda_kernel, nao, nactive)
367 ! sTDA parameters
368 CALL stda_init_param(qs_env, stda_kernel, tddfpt_control%stda_control)
369 ! allocate pools and work matrices
370 nstates = tddfpt_control%nstates
371 CALL stda_create_work_matrices(work_matrices, gs_mos, nstates, &
372 qs_env, sub_env)
373 !
374 CALL stda_init_matrices(qs_env, stda_kernel, sub_env, &
375 work_matrices, tddfpt_control)
376 !
377 kernel_env%stda_kernel => stda_kernel
378 NULLIFY (kernel_env%full_kernel)
379 NULLIFY (kernel_env%admm_kernel)
380 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_none) THEN
381 ! allocate pools and work matrices
382 nstates = tddfpt_control%nstates
383 CALL stda_create_work_matrices(work_matrices, gs_mos, nstates, &
384 qs_env, sub_env)
385 NULLIFY (kernel_env%full_kernel)
386 NULLIFY (kernel_env%admm_kernel)
387 NULLIFY (kernel_env%stda_kernel)
388 END IF
389
390 ALLOCATE (evects(nspins, nstates))
391 ALLOCATE (evals(nstates))
392
393 ALLOCATE (s_evects(nspins, nstates))
394 DO istate = 1, nstates
395 DO ispin = 1, nspins
396 CALL fm_pool_create_fm( &
397 work_matrices%fm_pool_ao_mo_occ(ispin)%pool, &
398 s_evects(ispin, istate))
399 END DO
400 END DO
401
402 IF (.NOT. do_soc) THEN
403 ! compute tddfpt excitation energies of multiplicity mult
404 CALL tddfpt_energies(qs_env, nstates, work_matrices, &
405 tddfpt_control, logger, tddfpt_print_section, evects, evals, &
406 gs_mos, tddfpt_section, s_evects, matrix_s, kernel_env, matrix_ks, &
407 sub_env, ostrength, dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
408 kernel_env_admm_aux)
409 ELSE
410 CALL tddfpt_soc_energies(qs_env, nstates, work_matrices, &
411 tddfpt_control, logger, tddfpt_print_section, &
412 evects, evals, ostrength, &
413 gs_mos, tddfpt_section, s_evects, matrix_s, kernel_env, matrix_ks, &
414 sub_env, dipole_op_mos_occ, lmult_tmp, xc_section, full_kernel_env, &
415 kernel_env_admm_aux)
416 END IF
417
418 !print forces for selected states
419 IF (calc_forces) THEN
420 CALL tddfpt_print_forces(qs_env, evects, evals, ostrength, &
421 tddfpt_print_section, gs_mos, &
422 kernel_env, sub_env, work_matrices)
423 END IF
424
425 ! excited state potential energy surface
426 IF (qs_env%excited_state) THEN
427 IF (sub_env%is_split) THEN
428 CALL cp_abort(__location__, &
429 "Excited state forces not possible when states"// &
430 " are distributed to different CPU pools.")
431 END IF
432 ! for gradients unshifted KS matrix
433 IF (ASSOCIATED(matrix_ks_oep)) CALL get_qs_env(qs_env, matrix_ks=matrix_ks)
434 CALL get_qs_env(qs_env, exstate_env=ex_env)
435 state_change = .false.
436 IF (ex_env%state > 0) THEN
437 my_state = ex_env%state
438 ELSEIF (ex_env%state < 0) THEN
439 ! state following
440 ALLOCATE (my_mos(nspins))
441 DO ispin = 1, nspins
442 my_mos(ispin) = gs_mos(ispin)%mos_occ
443 END DO
444 my_state = abs(ex_env%state)
445 CALL assign_state(qs_env, matrix_s, evects, my_mos, ex_env%wfn_history, my_state)
446 DEALLOCATE (my_mos)
447 IF (my_state /= abs(ex_env%state)) THEN
448 state_change = .true.
449 old_state = abs(ex_env%state)
450 END IF
451 ex_env%state = -my_state
452 ELSE
453 CALL cp_warn(__location__, &
454 "Active excited state not assigned. Use the first state.")
455 my_state = 1
456 END IF
457 cpassert(my_state > 0)
458 IF (my_state > nstates) THEN
459 CALL cp_warn(__location__, &
460 "There were not enough excited states calculated.")
461 cpabort("excited state potential energy surface")
462 END IF
463 !
464 ! energy
465 ex_env%evalue = evals(my_state)
466 ! excitation vector
467 CALL cp_fm_release(ex_env%evect)
468 ALLOCATE (ex_env%evect(nspins))
469 DO ispin = 1, nspins
470 CALL cp_fm_get_info(matrix=evects(ispin, 1), &
471 matrix_struct=matrix_struct)
472 CALL cp_fm_create(ex_env%evect(ispin), matrix_struct)
473 CALL cp_fm_to_fm(evects(ispin, my_state), ex_env%evect(ispin))
474 END DO
475
476 IF (log_unit > 0) THEN
477 gsval = ex_env%wfn_history%gsval
478 gsmin = ex_env%wfn_history%gsmin
479 xsval = ex_env%wfn_history%xsval
480 WRITE (log_unit, "(1X,A,T40,F10.6,A,T62,F10.6,A)") "Ground state orbital alignment:", &
481 gsmin, "[MinVal]", gsval, "[Average]"
482 WRITE (log_unit, "(1X,A,T71,F10.6)") "Excitation vector alignment:", xsval
483 IF (state_change) THEN
484 WRITE (log_unit, "(1X,A,I5,T60,A14,T76,I5)") &
485 "Target state has been changed from state ", &
486 old_state, " to new state ", my_state
487 END IF
488 WRITE (log_unit, "(1X,A,I4,A,F12.5,A)") "Calculate properties for state:", &
489 my_state, " with excitation energy ", ex_env%evalue*evolt, " eV"
490 END IF
491
492 IF (calc_forces) THEN
493 CALL tddfpt_forces_main(qs_env, gs_mos, ex_env, kernel_env, &
494 sub_env, work_matrices)
495 END IF
496 END IF
497
498 ! clean up
499 CALL cp_fm_release(evects)
500 CALL cp_fm_release(s_evects)
501
502 CALL cp_print_key_finished_output(log_unit, &
503 logger, &
504 tddfpt_print_section, &
505 "PROGRAM_BANNER")
506
507 DEALLOCATE (evals, ostrength)
508
509 IF (tddfpt_control%kernel == tddfpt_kernel_full) THEN
510 IF (do_admm) CALL release_kernel_env(kernel_env%admm_kernel)
511 IF (tddfpt_control%do_lrigpw) THEN
512 CALL lri_env_release(kernel_env%full_kernel%lri_env)
513 DEALLOCATE (kernel_env%full_kernel%lri_env)
514 CALL lri_density_release(kernel_env%full_kernel%lri_density)
515 DEALLOCATE (kernel_env%full_kernel%lri_density)
516 END IF
517 CALL release_kernel_env(kernel_env%full_kernel)
518 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_stda) THEN
519 CALL deallocate_stda_env(stda_kernel)
520 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_none) THEN
521 !
522 ELSE
523 cpabort('Unknown kernel type')
524 END IF
525 CALL tddfpt_release_work_matrices(work_matrices, sub_env)
526 CALL tddfpt_sub_env_release(sub_env)
527
528 CALL cp_fm_release(dipole_op_mos_occ)
529
530 DO ispin = nspins, 1, -1
531 CALL tddfpt_release_ground_state_mos(gs_mos(ispin))
532 END DO
533 DEALLOCATE (gs_mos)
534
535 IF (ASSOCIATED(matrix_ks_oep)) &
536 CALL dbcsr_deallocate_matrix_set(matrix_ks_oep)
537
538 CALL timestop(handle)
539
540 END SUBROUTINE tddfpt
541
542! **************************************************************************************************
543!> \brief TDDFPT input
544!> \param qs_env Quickstep environment
545!> \param do_hfx ...
546!> \param do_admm ...
547!> \param do_exck ...
548!> \param do_hfxsr ...
549!> \param do_hfxlr ...
550!> \param xc_section ...
551!> \param tddfpt_print_section ...
552!> \param lri_section ...
553!> \param hfxsr_section ...
554! **************************************************************************************************
555 SUBROUTINE tddfpt_input(qs_env, do_hfx, do_admm, do_exck, do_hfxsr, do_hfxlr, &
556 xc_section, tddfpt_print_section, lri_section, hfxsr_section)
557 TYPE(qs_environment_type), POINTER :: qs_env
558 LOGICAL, INTENT(INOUT) :: do_hfx, do_admm, do_exck, do_hfxsr, &
559 do_hfxlr
560 TYPE(section_vals_type), POINTER :: xc_section, tddfpt_print_section, &
561 lri_section, hfxsr_section
562
563 CHARACTER(len=20) :: nstates_str
564 LOGICAL :: exar, exf, exgcp, exhf, exhfxk, exk, &
565 explicit_root, expot, exvdw, exwfn, &
566 found, same_hfx
567 REAL(kind=dp) :: c_hf
568 TYPE(dft_control_type), POINTER :: dft_control
569 TYPE(section_vals_type), POINTER :: hfx_section, hfx_section_gs, input, &
570 tddfpt_section, xc_root, xc_sub
571 TYPE(tddfpt2_control_type), POINTER :: tddfpt_control
572
573 NULLIFY (dft_control, input)
574 CALL get_qs_env(qs_env, dft_control=dft_control, input=input)
575 tddfpt_control => dft_control%tddfpt2_control
576
577 ! no k-points
578 IF (dft_control%nimages > 1) cpabort("k-points not implemented for TDDFPT")
579
580 IF (tddfpt_control%nstates <= 0) THEN
581 CALL integer_to_string(tddfpt_control%nstates, nstates_str)
582 CALL cp_warn(__location__, "TDDFPT calculation was requested for "// &
583 trim(nstates_str)//" excited states: nothing to do.")
584 RETURN
585 END IF
586
587 NULLIFY (tddfpt_section, tddfpt_print_section)
588 tddfpt_section => section_vals_get_subs_vals(input, "PROPERTIES%TDDFPT")
589 tddfpt_print_section => section_vals_get_subs_vals(tddfpt_section, "PRINT")
590
591 IF (tddfpt_control%kernel == tddfpt_kernel_full) THEN
592 NULLIFY (xc_root)
593 xc_root => section_vals_get_subs_vals(tddfpt_section, "XC")
594 CALL section_vals_get(xc_root, explicit=explicit_root)
595 NULLIFY (xc_section)
596 IF (explicit_root) THEN
597 ! No ADIABATIC_RESCALING option possible
598 NULLIFY (xc_sub)
599 xc_sub => section_vals_get_subs_vals(xc_root, "ADIABATIC_RESCALING")
600 CALL section_vals_get(xc_sub, explicit=exar)
601 IF (exar) THEN
602 CALL cp_warn(__location__, "TDDFPT Kernel with ADIABATIC_RESCALING not possible.")
603 cpabort("TDDFPT Input")
604 END IF
605 ! No GCP_POTENTIAL option possible
606 NULLIFY (xc_sub)
607 xc_sub => section_vals_get_subs_vals(xc_root, "GCP_POTENTIAL")
608 CALL section_vals_get(xc_sub, explicit=exgcp)
609 IF (exgcp) THEN
610 CALL cp_warn(__location__, "TDDFPT Kernel with GCP_POTENTIAL not possible.")
611 cpabort("TDDFPT Input")
612 END IF
613 ! No VDW_POTENTIAL option possible
614 NULLIFY (xc_sub)
615 xc_sub => section_vals_get_subs_vals(xc_root, "VDW_POTENTIAL")
616 CALL section_vals_get(xc_sub, explicit=exvdw)
617 IF (exvdw) THEN
618 CALL cp_warn(__location__, "TDDFPT Kernel with VDW_POTENTIAL not possible.")
619 cpabort("TDDFPT Input")
620 END IF
621 ! No WF_CORRELATION option possible
622 NULLIFY (xc_sub)
623 xc_sub => section_vals_get_subs_vals(xc_root, "WF_CORRELATION")
624 CALL section_vals_get(xc_sub, explicit=exwfn)
625 IF (exwfn) THEN
626 CALL cp_warn(__location__, "TDDFPT Kernel with WF_CORRELATION not possible.")
627 cpabort("TDDFPT Input")
628 END IF
629 ! No XC_POTENTIAL option possible
630 NULLIFY (xc_sub)
631 xc_sub => section_vals_get_subs_vals(xc_root, "XC_POTENTIAL")
632 CALL section_vals_get(xc_sub, explicit=expot)
633 IF (expot) THEN
634 CALL cp_warn(__location__, "TDDFPT Kernel with XC_POTENTIAL not possible.")
635 cpabort("TDDFPT Input")
636 END IF
637 !
638 NULLIFY (xc_sub)
639 xc_sub => section_vals_get_subs_vals(xc_root, "XC_FUNCTIONAL")
640 CALL section_vals_get(xc_sub, explicit=exf)
641 NULLIFY (xc_sub)
642 xc_sub => section_vals_get_subs_vals(xc_root, "XC_KERNEL")
643 CALL section_vals_get(xc_sub, explicit=exk)
644 IF ((exf .AND. exk) .OR. .NOT. (exf .OR. exk)) THEN
645 CALL cp_warn(__location__, "TDDFPT Kernel needs XC_FUNCTIONAL or XC_KERNEL section.")
646 cpabort("TDDFPT Input")
647 END IF
648 NULLIFY (xc_sub)
649 xc_sub => section_vals_get_subs_vals(xc_root, "HF")
650 CALL section_vals_get(xc_sub, explicit=exhf)
651 NULLIFY (xc_sub)
652 xc_sub => section_vals_get_subs_vals(xc_root, "HFX_KERNEL")
653 CALL section_vals_get(xc_sub, explicit=exhfxk)
654 !
655 xc_section => xc_root
656 hfx_section => section_vals_get_subs_vals(xc_section, "HF")
657 CALL section_vals_get(hfx_section, explicit=do_hfx)
658 IF (do_hfx) THEN
659 CALL section_vals_val_get(hfx_section, "FRACTION", r_val=c_hf)
660 do_hfx = (c_hf /= 0.0_dp)
661 END IF
662 !TDDFPT only works if the kernel has the same HF section as the DFT%XC one
663 IF (do_hfx) THEN
664 hfx_section_gs => section_vals_get_subs_vals(input, "DFT%XC%HF")
665 CALL compare_hfx_sections(hfx_section, hfx_section_gs, same_hfx)
666 IF (.NOT. same_hfx) THEN
667 cpabort("TDDFPT Kernel must use the same HF section as DFT%XC or no HF at all.")
668 END IF
669 END IF
670
671 do_admm = do_hfx .AND. dft_control%do_admm
672 IF (do_admm) THEN
673 ! 'admm_env%xc_section_primary' and 'admm_env%xc_section_aux' need to be redefined
674 CALL cp_abort(__location__, &
675 "ADMM is not implemented for a TDDFT kernel XC-functional which is different from "// &
676 "the one used for the ground-state calculation. A ground-state 'admm_env' cannot be reused.")
677 END IF
678 ! SET HFX_KERNEL and/or XC_KERNEL
679 IF (exk) THEN
680 do_exck = .true.
681 ELSE
682 do_exck = .false.
683 END IF
684 IF (exhfxk) THEN
685 xc_sub => section_vals_get_subs_vals(xc_root, "HFX_KERNEL")
686 CALL section_vals_val_get(xc_sub, "DO_HFXSR", l_val=do_hfxsr)
687 xc_sub => section_vals_get_subs_vals(xc_root, "HFX_KERNEL%HFXLR")
688 CALL section_vals_get(xc_sub, explicit=do_hfxlr)
689 ELSE
690 do_hfxsr = .false.
691 do_hfxlr = .false.
692 END IF
693 ELSE
694 xc_section => section_vals_get_subs_vals(input, "DFT%XC")
695 hfx_section => section_vals_get_subs_vals(xc_section, "HF")
696 CALL section_vals_get(hfx_section, explicit=do_hfx)
697 IF (do_hfx) THEN
698 CALL section_vals_val_get(hfx_section, "FRACTION", r_val=c_hf)
699 do_hfx = (c_hf /= 0.0_dp)
700 END IF
701 do_admm = do_hfx .AND. dft_control%do_admm
702 do_exck = .false.
703 do_hfxsr = .false.
704 do_hfxlr = .false.
705 END IF
706 ELSE
707 do_hfx = .false.
708 do_admm = .false.
709 do_exck = .false.
710 do_hfxsr = .false.
711 do_hfxlr = .false.
712 END IF
713
714 ! reset rks_triplets if UKS is in use
715 IF (tddfpt_control%rks_triplets .AND. dft_control%nspins > 1) THEN
716 tddfpt_control%rks_triplets = .false.
717 CALL cp_warn(__location__, "Keyword RKS_TRIPLETS has been ignored for spin-polarised calculations")
718 END IF
719
720 ! lri input
721 IF (tddfpt_control%do_lrigpw) THEN
722 lri_section => section_vals_get_subs_vals(tddfpt_section, "LRIGPW")
723 END IF
724
725 ! set defaults for short range HFX
726 NULLIFY (hfxsr_section)
727 IF (do_hfxsr) THEN
728 hfxsr_section => section_vals_get_subs_vals(tddfpt_section, "XC%HFX_KERNEL%HF")
729 CALL section_vals_get(hfxsr_section, explicit=found)
730 IF (.NOT. found) THEN
731 cpabort("HFXSR option needs &HF section defined")
732 END IF
733 CALL section_vals_val_get(hfxsr_section, "INTERACTION_POTENTIAL%POTENTIAL_TYPE", explicit=found)
734 IF (.NOT. found) THEN
735 CALL section_vals_val_set(hfxsr_section, "INTERACTION_POTENTIAL%POTENTIAL_TYPE", &
737 END IF
738 CALL section_vals_val_get(hfxsr_section, "INTERACTION_POTENTIAL%CUTOFF_RADIUS", explicit=found)
739 IF (.NOT. found) THEN
740 CALL section_vals_val_set(hfxsr_section, "INTERACTION_POTENTIAL%CUTOFF_RADIUS", r_val=7.5589_dp)
741 END IF
742 CALL section_vals_val_get(hfxsr_section, "RI%_SECTION_PARAMETERS_", l_val=found)
743 IF (found) THEN
744 CALL cp_abort(__location__, "Short range TDA kernel with RI not possible")
745 END IF
746 END IF
747
748 END SUBROUTINE tddfpt_input
749
750! **************************************************************************************************
751!> \brief ...
752!> \param log_unit ...
753!> \param dft_control ...
754!> \param tddfpt_control ...
755!> \param xc_section ...
756! **************************************************************************************************
757 SUBROUTINE kernel_info(log_unit, dft_control, tddfpt_control, xc_section)
758 INTEGER, INTENT(IN) :: log_unit
759 TYPE(dft_control_type), POINTER :: dft_control
760 TYPE(tddfpt2_control_type), POINTER :: tddfpt_control
761 TYPE(section_vals_type), POINTER :: xc_section
762
763 CHARACTER(LEN=4) :: ktype
764 LOGICAL :: lsd
765
766 lsd = (dft_control%nspins > 1)
767 IF (tddfpt_control%kernel == tddfpt_kernel_full) THEN
768 ktype = "FULL"
769 IF (log_unit > 0) THEN
770 WRITE (log_unit, "(T2,A,T77,A4)") "KERNEL|", trim(ktype)
771 CALL xc_write(log_unit, xc_section, lsd)
772 IF (tddfpt_control%do_hfx) THEN
773 IF (tddfpt_control%do_admm) THEN
774 WRITE (log_unit, "(T2,A,T62,A19)") "KERNEL|", "ADMM Exact Exchange"
775 IF (tddfpt_control%admm_xc_correction) THEN
776 WRITE (log_unit, "(T2,A,T60,A21)") "KERNEL|", "Apply ADMM Kernel XC Correction"
777 END IF
778 IF (tddfpt_control%admm_symm) THEN
779 WRITE (log_unit, "(T2,A,T60,A21)") "KERNEL|", "Symmetric ADMM Kernel"
780 END IF
781 ELSE
782 WRITE (log_unit, "(T2,A,T67,A14)") "KERNEL|", "Exact Exchange"
783 END IF
784 END IF
785 IF (tddfpt_control%do_hfxsr) THEN
786 WRITE (log_unit, "(T2,A,T43,A38)") "KERNEL|", "Short range HFX approximation"
787 END IF
788 IF (tddfpt_control%do_hfxlr) THEN
789 WRITE (log_unit, "(T2,A,T43,A38)") "KERNEL|", "Long range HFX approximation"
790 END IF
791 IF (tddfpt_control%do_lrigpw) THEN
792 WRITE (log_unit, "(T2,A,T42,A39)") "KERNEL|", "LRI approximation of transition density"
793 END IF
794 END IF
795 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_stda) THEN
796 ktype = "sTDA"
797 IF (log_unit > 0) THEN
798 WRITE (log_unit, "(T2,A,T77,A4)") "KERNEL|", trim(ktype)
799 IF (tddfpt_control%stda_control%do_ewald) THEN
800 WRITE (log_unit, "(T2,A,T78,A3)") "KERNEL| Coulomb term uses Ewald summation"
801 ELSE
802 WRITE (log_unit, "(T2,A,T78,A3)") "KERNEL| Coulomb term uses direct summation (MIC)"
803 END IF
804 IF (tddfpt_control%stda_control%do_exchange) THEN
805 WRITE (log_unit, "(T2,A,T78,A3)") "KERNEL| Exact exchange term", "YES"
806 WRITE (log_unit, "(T2,A,T71,F10.3)") "KERNEL| Short range HFX fraction:", &
807 tddfpt_control%stda_control%hfx_fraction
808 ELSE
809 WRITE (log_unit, "(T2,A,T79,A2)") "KERNEL| Exact exchange term", "NO"
810 END IF
811 WRITE (log_unit, "(T2,A,T66,E15.3)") "KERNEL| Transition density filter", &
812 tddfpt_control%stda_control%eps_td_filter
813 END IF
814 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_none) THEN
815 ktype = "NONE"
816 IF (log_unit > 0) THEN
817 WRITE (log_unit, "(T2,A,T77,A4)") "KERNEL|", trim(ktype)
818 END IF
819 ELSE
820 !CPABORT("Unknown kernel")
821 END IF
822 !
823 IF (log_unit > 0) THEN
824 IF (tddfpt_control%rks_triplets) THEN
825 WRITE (log_unit, "(T2,A,T74,A7)") "KERNEL| Spin symmetry of excitations", "Triplet"
826 ELSE IF (lsd) THEN
827 WRITE (log_unit, "(T2,A,T69,A12)") "KERNEL| Spin symmetry of excitations", "Unrestricted"
828 ELSE
829 WRITE (log_unit, "(T2,A,T74,A7)") "KERNEL| Spin symmetry of excitations", "Singlet"
830 END IF
831 WRITE (log_unit, "(T2,A,T73,I8)") "TDDFPT| Number of states calculated", tddfpt_control%nstates
832 WRITE (log_unit, "(T2,A,T73,I8)") "TDDFPT| Number of Davidson iterations", tddfpt_control%niters
833 WRITE (log_unit, "(T2,A,T66,E15.3)") "TDDFPT| Davidson iteration convergence", tddfpt_control%conv
834 WRITE (log_unit, "(T2,A,T73,I8)") "TDDFPT| Max. number of Krylov space vectors", tddfpt_control%nkvs
835 END IF
836
837 END SUBROUTINE kernel_info
838
839! **************************************************************************************************
840!> \brief The energy calculation has been moved to its own subroutine
841!> \param qs_env ...
842!> \param nstates ...
843!> \param work_matrices ...
844!> \param tddfpt_control ...
845!> \param logger ...
846!> \param tddfpt_print_section ...
847!> \param evects ...
848!> \param evals ...
849!> \param gs_mos ...
850!> \param tddfpt_section ...
851!> \param S_evects ...
852!> \param matrix_s ...
853!> \param kernel_env ...
854!> \param matrix_ks ...
855!> \param sub_env ...
856!> \param ostrength ...
857!> \param dipole_op_mos_occ ...
858!> \param mult ...
859!> \param xc_section ...
860!> \param full_kernel_env ...
861!> \param kernel_env_admm_aux ...
862! **************************************************************************************************
863 SUBROUTINE tddfpt_energies(qs_env, nstates, work_matrices, &
864 tddfpt_control, logger, tddfpt_print_section, evects, evals, &
865 gs_mos, tddfpt_section, S_evects, matrix_s, kernel_env, matrix_ks, &
866 sub_env, ostrength, dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
867 kernel_env_admm_aux)
868
869 TYPE(qs_environment_type), POINTER :: qs_env
870 INTEGER :: nstates
871 TYPE(tddfpt_work_matrices) :: work_matrices
872 TYPE(tddfpt2_control_type), POINTER :: tddfpt_control
873 TYPE(cp_logger_type), POINTER :: logger
874 TYPE(section_vals_type), POINTER :: tddfpt_print_section
875 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: evects
876 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: evals
877 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
878 POINTER :: gs_mos
879 TYPE(section_vals_type), POINTER :: tddfpt_section
880 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: s_evects
881 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
882 TYPE(kernel_env_type) :: kernel_env
883 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks
884 TYPE(tddfpt_subgroup_env_type) :: sub_env
885 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: ostrength
886 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: dipole_op_mos_occ
887 INTEGER :: mult
888 TYPE(section_vals_type), POINTER :: xc_section
889 TYPE(full_kernel_env_type), TARGET :: full_kernel_env, kernel_env_admm_aux
890
891 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_energies'
892
893 CHARACTER(len=20) :: nstates_str
894 INTEGER :: energy_unit, handle, iter, log_unit, &
895 niters, nocc, nstate_max, &
896 nstates_read, nvirt
897 LOGICAL :: do_admm, do_exck, do_soc, explicit
898 REAL(kind=dp) :: conv
899 TYPE(admm_type), POINTER :: admm_env
900 TYPE(cp_blacs_env_type), POINTER :: blacs_env
901 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks_oep
902 TYPE(section_vals_type), POINTER :: lri_section, namd_print_section, &
903 soc_section
904
905 CALL timeset(routinen, handle)
906
907 NULLIFY (admm_env, matrix_ks_oep)
908 do_admm = tddfpt_control%do_admm
909 IF (do_admm) CALL get_qs_env(qs_env, admm_env=admm_env)
910
911 ! setup for full_kernel and admm_kernel within tddfpt_energies due to dependence on multiplicity
912 IF (tddfpt_control%kernel == tddfpt_kernel_full) THEN
913
915 rho_orb_struct=work_matrices%rho_orb_struct_sub, &
916 rho_xc_struct=work_matrices%rho_xc_struct_sub, &
917 is_rks_triplets=tddfpt_control%rks_triplets, &
918 qs_env=qs_env, sub_env=sub_env, &
919 wfm_rho_orb=work_matrices%rho_ao_orb_fm_sub)
920
921 IF (do_admm) THEN
922 ! Full kernel with ADMM
923 IF (tddfpt_control%admm_xc_correction) THEN
924 CALL create_kernel_env(kernel_env=full_kernel_env, &
925 rho_struct_sub=work_matrices%rho_orb_struct_sub, &
926 xc_section=admm_env%xc_section_primary, &
927 is_rks_triplets=tddfpt_control%rks_triplets, &
928 sub_env=sub_env)
929 ELSE
930 CALL create_kernel_env(kernel_env=full_kernel_env, &
931 rho_struct_sub=work_matrices%rho_orb_struct_sub, &
932 xc_section=xc_section, &
933 is_rks_triplets=tddfpt_control%rks_triplets, &
934 sub_env=sub_env)
935 END IF
936
938 rho_orb_struct=work_matrices%rho_orb_struct_sub, &
939 rho_aux_fit_struct=work_matrices%rho_aux_fit_struct_sub, &
940 local_rho_set=sub_env%local_rho_set_admm, &
941 qs_env=qs_env, sub_env=sub_env, &
942 wfm_rho_orb=work_matrices%rho_ao_orb_fm_sub, &
943 wfm_rho_aux_fit=work_matrices%rho_ao_aux_fit_fm_sub, &
944 wfm_aux_orb=work_matrices%wfm_aux_orb_sub)
945
946 CALL create_kernel_env(kernel_env=kernel_env_admm_aux, &
947 rho_struct_sub=work_matrices%rho_aux_fit_struct_sub, &
948 xc_section=admm_env%xc_section_aux, &
949 is_rks_triplets=tddfpt_control%rks_triplets, &
950 sub_env=sub_env)
951 kernel_env%full_kernel => full_kernel_env
952 kernel_env%admm_kernel => kernel_env_admm_aux
953 ELSE
954 ! Full kernel
955 CALL create_kernel_env(kernel_env=full_kernel_env, &
956 rho_struct_sub=work_matrices%rho_orb_struct_sub, &
957 xc_section=xc_section, &
958 is_rks_triplets=tddfpt_control%rks_triplets, &
959 sub_env=sub_env)
960 kernel_env%full_kernel => full_kernel_env
961 NULLIFY (kernel_env%admm_kernel)
962 END IF
963 ! Fxc from kernel definition
964 do_exck = tddfpt_control%do_exck
965 kernel_env%full_kernel%do_exck = do_exck
966 ! initilize xc kernel
967 IF (do_exck) THEN
968 CALL create_fxc_kernel(work_matrices%rho_orb_struct_sub, work_matrices%fxc_rspace_sub, &
969 xc_section, tddfpt_control%rks_triplets, sub_env, qs_env)
970 END IF
971 END IF
972
973 ! lri input
974 IF (tddfpt_control%do_lrigpw) THEN
975 lri_section => section_vals_get_subs_vals(tddfpt_section, "LRIGPW")
976 CALL tddfpt2_lri_init(qs_env, kernel_env, lri_section, &
977 tddfpt_print_section)
978 END IF
979
980 !! Too many states can lead to problems
981 !! You should be warned if there are more states
982 !! then occ-virt combinations!!
983 CALL cp_fm_get_info(gs_mos(1)%mos_occ, ncol_global=nocc)
984 CALL cp_fm_get_info(gs_mos(1)%mos_virt, ncol_global=nvirt)
985 nstate_max = nocc*nvirt
986 IF (nstates > nstate_max) THEN
987 cpwarn("NUMBER OF EXCITED STATES COULD LEAD TO PROBLEMS!")
988 cpwarn("Experimental: CHANGED NSTATES TO ITS MAXIMUM VALUE!")
989 nstates = nstate_max
990 END IF
991
992 soc_section => section_vals_get_subs_vals(tddfpt_section, "SOC")
993 CALL section_vals_get(soc_section, explicit=do_soc)
994
995 ! reuse Ritz vectors from the previous calculation if available
996 IF (tddfpt_control%is_restart .AND. .NOT. do_soc) THEN
997 CALL get_qs_env(qs_env, blacs_env=blacs_env)
998
999 nstates_read = tddfpt_read_restart( &
1000 evects=evects, &
1001 evals=evals, &
1002 gs_mos=gs_mos, &
1003 logger=logger, &
1004 tddfpt_section=tddfpt_section, &
1005 tddfpt_print_section=tddfpt_print_section, &
1006 fm_pool_ao_mo_occ=work_matrices%fm_pool_ao_mo_occ, &
1007 blacs_env_global=blacs_env)
1008 ELSE
1009 nstates_read = 0
1010 END IF
1011
1012 ! build the list of missed singly excited states and sort them in ascending order
1013 ! according to their excitation energies
1014 log_unit = cp_print_key_unit_nr(logger, tddfpt_print_section, &
1015 "GUESS_VECTORS", extension=".tddfptLog")
1016 CALL tddfpt_guess_vectors(evects=evects, evals=evals, &
1017 gs_mos=gs_mos, log_unit=log_unit)
1018 CALL cp_print_key_finished_output(log_unit, logger, &
1019 tddfpt_print_section, "GUESS_VECTORS")
1020
1021 CALL tddfpt_orthogonalize_psi1_psi0(evects, work_matrices%S_C0_C0T, qs_env, &
1022 gs_mos, evals, tddfpt_control, work_matrices%S_C0)
1023 CALL tddfpt_orthonormalize_psi1_psi1(evects, &
1024 nstates, &
1025 s_evects, &
1026 matrix_s(1)%matrix)
1027
1028 niters = tddfpt_control%niters
1029 IF (niters > 0) THEN
1030 log_unit = cp_print_key_unit_nr(logger, tddfpt_print_section, &
1031 "ITERATION_INFO", extension=".tddfptLog")
1032 energy_unit = cp_print_key_unit_nr(logger, &
1033 tddfpt_print_section, &
1034 "DETAILED_ENERGY", &
1035 extension=".tddfptLog")
1036
1037 IF (log_unit > 0) THEN
1038 WRITE (log_unit, "(1X,A)") "", &
1039 "-------------------------------------------------------------------------------", &
1040 "- TDDFPT WAVEFUNCTION OPTIMIZATION -", &
1041 "-------------------------------------------------------------------------------"
1042
1043 WRITE (log_unit, '(/,T11,A,T27,A,T40,A,T62,A)') "Step", "Time", "Convergence", "Conv. states"
1044 WRITE (log_unit, '(1X,79("-"))')
1045 END IF
1046
1047 CALL cp_add_iter_level(logger%iter_info, "TDDFT_SCF")
1048
1049 DO
1050 ! *** perform Davidson iterations ***
1051 conv = tddfpt_davidson_solver( &
1052 evects=evects, &
1053 evals=evals, &
1054 s_evects=s_evects, &
1055 gs_mos=gs_mos, &
1056 tddfpt_control=tddfpt_control, &
1057 matrix_ks=matrix_ks, &
1058 qs_env=qs_env, &
1059 kernel_env=kernel_env, &
1060 sub_env=sub_env, &
1061 logger=logger, &
1062 iter_unit=log_unit, &
1063 energy_unit=energy_unit, &
1064 tddfpt_print_section=tddfpt_print_section, &
1065 work_matrices=work_matrices)
1066
1067 ! at this point at least one of the following conditions are met:
1068 ! a) convergence criteria has been achieved;
1069 ! b) maximum number of iterations has been reached;
1070 ! c) Davidson iterations must be restarted due to lack of Krylov vectors
1071
1072 CALL cp_iterate(logger%iter_info, increment=0, iter_nr_out=iter)
1073 ! terminate the loop if either (a) or (b) is true ...
1074 IF ((conv <= tddfpt_control%conv) .OR. iter >= niters) EXIT
1075
1076 ! ... otherwise restart Davidson iterations
1077 evals = 0.0_dp
1078 IF (log_unit > 0) THEN
1079 WRITE (log_unit, '(1X,25("-"),1X,A,1X,25("-"))') "Restart Davidson iterations"
1080 CALL m_flush(log_unit)
1081 END IF
1082 END DO
1083
1084 ! write TDDFPT restart file at the last iteration if requested to do so
1085 CALL cp_iterate(logger%iter_info, increment=0, last=.true.)
1086 CALL tddfpt_write_restart(evects=evects, &
1087 evals=evals, &
1088 gs_mos=gs_mos, &
1089 logger=logger, &
1090 tddfpt_print_section=tddfpt_print_section)
1091
1092 CALL cp_rm_iter_level(logger%iter_info, "TDDFT_SCF")
1093
1094 ! print convergence summary
1095 IF (log_unit > 0) THEN
1096 CALL integer_to_string(iter, nstates_str)
1097 IF (conv <= tddfpt_control%conv) THEN
1098 WRITE (log_unit, "(1X,A)") "", &
1099 "-------------------------------------------------------------------------------", &
1100 "- TDDFPT run converged in "//trim(nstates_str)//" iteration(s) ", &
1101 "-------------------------------------------------------------------------------"
1102 ELSE
1103 WRITE (log_unit, "(1X,A)") "", &
1104 "-------------------------------------------------------------------------------", &
1105 "- TDDFPT run did NOT converge after "//trim(nstates_str)//" iteration(s) ", &
1106 "-------------------------------------------------------------------------------"
1107 END IF
1108 END IF
1109
1110 CALL cp_print_key_finished_output(energy_unit, logger, &
1111 tddfpt_print_section, "DETAILED_ENERGY")
1112 CALL cp_print_key_finished_output(log_unit, logger, &
1113 tddfpt_print_section, "ITERATION_INFO")
1114 ELSE
1115 CALL cp_warn(__location__, &
1116 "Skipping TDDFPT wavefunction optimization")
1117 END IF
1118
1119 IF (ASSOCIATED(matrix_ks_oep)) THEN
1120 IF (tddfpt_control%dipole_form == tddfpt_dipole_velocity) THEN
1121 CALL cp_warn(__location__, &
1122 "Transition dipole moments and oscillator strengths are likely to be incorrect "// &
1123 "when computed using an orbital energy correction XC-potential together with "// &
1124 "the velocity form of dipole transition integrals")
1125 END IF
1126 END IF
1127
1128 ! *** print summary information ***
1129 log_unit = cp_logger_get_default_io_unit(logger)
1130
1131 namd_print_section => section_vals_get_subs_vals( &
1132 tddfpt_print_section, &
1133 "NAMD_PRINT")
1134 CALL section_vals_get(namd_print_section, explicit=explicit)
1135 IF (explicit) THEN
1136 CALL tddfpt_write_newtonx_output(evects, &
1137 evals, &
1138 gs_mos, &
1139 logger, &
1140 tddfpt_print_section, &
1141 matrix_s(1)%matrix, &
1142 s_evects, &
1143 sub_env)
1144 END IF
1145 ALLOCATE (ostrength(nstates))
1146 ostrength = 0.0_dp
1147 CALL tddfpt_print_summary(log_unit, &
1148 evects, &
1149 evals, &
1150 ostrength, &
1151 mult, &
1152 dipole_op_mos_occ, &
1153 tddfpt_control%dipole_form)
1155 log_unit, &
1156 evects, &
1157 evals, &
1158 gs_mos, &
1159 matrix_s(1)%matrix, &
1160 min_amplitude=tddfpt_control%min_excitation_amplitude)
1161 CALL tddfpt_print_nto_analysis(qs_env, &
1162 evects, evals, &
1163 ostrength, &
1164 gs_mos, &
1165 matrix_s(1)%matrix, &
1166 tddfpt_print_section)
1167 IF (tddfpt_control%do_exciton_descriptors) THEN
1169 log_unit, &
1170 evects, &
1171 gs_mos, &
1172 matrix_s(1)%matrix, &
1173 tddfpt_control%do_directional_exciton_descriptors, &
1174 qs_env)
1175 END IF
1176
1177 IF (tddfpt_control%do_lrigpw) THEN
1178 CALL lri_print_stat(qs_env, &
1179 ltddfpt=.true., &
1180 tddfpt_lri_env=kernel_env%full_kernel%lri_env)
1181 END IF
1182
1183 CALL timestop(handle)
1184 END SUBROUTINE tddfpt_energies
1185
1186! **************************************************************************************************
1187!> \brief Perform singlet and triplet computations for subsequent TDDFPT-SOC calculation.
1188!> \param qs_env Quickstep environment
1189!> \param nstates number of requested exited states
1190!> \param work_matrices ...
1191!> \param tddfpt_control ...
1192!> \param logger ...
1193!> \param tddfpt_print_section ...
1194!> \param evects Eigenvector of the requested multiplicity
1195!> \param evals Eigenvalue of the requested multiplicity
1196!> \param ostrength Oscillatorstrength
1197!> \param gs_mos ...
1198!> \param tddfpt_section ...
1199!> \param S_evects ...
1200!> \param matrix_s ...
1201!> \param kernel_env ...
1202!> \param matrix_ks ...
1203!> \param sub_env ...
1204!> \param dipole_op_mos_occ ...
1205!> \param lmult_tmp ...
1206!> \param xc_section ...
1207!> \param full_kernel_env ...
1208!> \param kernel_env_admm_aux ...
1209!> \par History
1210!> * 02.2023 created [Jan-Robert Vogt]
1211!> \note Based on tddfpt2_methods and xas_tdp_utils.
1212!> \note only the values of one multiplicity will be passed back for force calculations!
1213! **************************************************************************************************
1214
1215 SUBROUTINE tddfpt_soc_energies(qs_env, nstates, work_matrices, &
1216 tddfpt_control, logger, tddfpt_print_section, &
1217 evects, evals, ostrength, &
1218 gs_mos, tddfpt_section, S_evects, matrix_s, kernel_env, matrix_ks, &
1219 sub_env, dipole_op_mos_occ, lmult_tmp, xc_section, full_kernel_env, &
1220 kernel_env_admm_aux)
1221
1222 TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
1223 INTEGER, INTENT(in) :: nstates
1224 TYPE(tddfpt_work_matrices) :: work_matrices
1225 TYPE(tddfpt2_control_type), POINTER :: tddfpt_control
1226 TYPE(cp_logger_type), POINTER :: logger
1227 TYPE(section_vals_type), POINTER :: tddfpt_print_section
1228 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: evects
1229 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: evals, ostrength
1230 TYPE(tddfpt_ground_state_mos), DIMENSION(:), &
1231 POINTER :: gs_mos
1232 TYPE(section_vals_type), POINTER :: tddfpt_section
1233 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: s_evects
1234 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
1235 TYPE(kernel_env_type) :: kernel_env
1236 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks
1237 TYPE(tddfpt_subgroup_env_type) :: sub_env
1238 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: dipole_op_mos_occ
1239 LOGICAL, INTENT(in) :: lmult_tmp
1240 TYPE(section_vals_type), POINTER :: xc_section
1241 TYPE(full_kernel_env_type), TARGET :: full_kernel_env, kernel_env_admm_aux
1242
1243 CHARACTER(LEN=*), PARAMETER :: routinen = 'tddfpt_soc_energies'
1244
1245 INTEGER :: handle, ispin, istate, log_unit, mult, &
1246 nspins
1247 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: evals_mult, ostrength_mult
1248 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: evects_mult
1249
1250 CALL timeset(routinen, handle)
1251
1252 log_unit = cp_print_key_unit_nr(logger, tddfpt_print_section, &
1253 "PROGRAM_BANNER", &
1254 extension=".tddfptLog")
1255 CALL tddfpt_soc_header(log_unit)
1256
1257 nspins = SIZE(gs_mos)
1258 ALLOCATE (evects_mult(nspins, nstates))
1259 ALLOCATE (evals_mult(nstates))
1260
1261 ! First multiplicity
1262 IF (lmult_tmp) THEN
1263 IF (log_unit > 0) THEN
1264 WRITE (log_unit, "(1X,A)") "", &
1265 "-------------------------------------------------------------------------------", &
1266 "- TDDFPT SINGLET ENERGIES -", &
1267 "-------------------------------------------------------------------------------"
1268 END IF
1269 mult = 1
1270 ELSE
1271 IF (log_unit > 0) THEN
1272 WRITE (log_unit, "(1X,A)") "", &
1273 "-------------------------------------------------------------------------------", &
1274 "- TDDFPT TRIPLET ENERGIES -", &
1275 "-------------------------------------------------------------------------------"
1276 END IF
1277 mult = 3
1278 END IF
1279
1280 CALL tddfpt_energies(qs_env, nstates, work_matrices, tddfpt_control, logger, &
1281 tddfpt_print_section, evects_mult, evals_mult, &
1282 gs_mos, tddfpt_section, s_evects, matrix_s, &
1283 kernel_env, matrix_ks, sub_env, ostrength_mult, &
1284 dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
1285 kernel_env_admm_aux)
1286
1287 ! Clean up in between for full kernel
1288 IF (tddfpt_control%kernel == tddfpt_kernel_full) THEN
1289 IF (tddfpt_control%do_admm) CALL release_kernel_env(kernel_env%admm_kernel)
1290 CALL release_kernel_env(kernel_env%full_kernel)
1291 CALL tddfpt_release_work_matrices(work_matrices, sub_env)
1292 CALL tddfpt_create_work_matrices(work_matrices, gs_mos, nstates, tddfpt_control%do_hfx, &
1293 tddfpt_control%do_admm, tddfpt_control%do_hfxlr, &
1294 tddfpt_control%do_exck, qs_env, sub_env)
1295 END IF
1296
1297 DO istate = 1, nstates
1298 DO ispin = 1, nspins
1299 CALL cp_fm_release(s_evects(ispin, istate))
1300 END DO
1301 END DO
1302
1303 DO istate = 1, nstates
1304 DO ispin = 1, nspins
1305 CALL fm_pool_create_fm( &
1306 work_matrices%fm_pool_ao_mo_occ(ispin)%pool, &
1307 s_evects(ispin, istate))
1308 END DO
1309 END DO
1310
1311 tddfpt_control%rks_triplets = lmult_tmp
1312
1313 ! Second multiplicity
1314 IF (lmult_tmp) THEN
1315 IF (log_unit > 0) THEN
1316 WRITE (log_unit, "(1X,A)") "", &
1317 " singlet excitations finished ", &
1318 " ", &
1319 "-------------------------------------------------------------------------------", &
1320 "- TDDFPT TRIPLET ENERGIES -", &
1321 "-------------------------------------------------------------------------------"
1322 END IF !log_unit
1323 mult = 3
1324 ELSE
1325 IF (log_unit > 0) THEN
1326 WRITE (log_unit, "(1X,A)") "", &
1327 " triplet excitations finished ", &
1328 " ", &
1329 "-------------------------------------------------------------------------------", &
1330 "- TDDFPT SINGLET ENERGIES -", &
1331 "-------------------------------------------------------------------------------"
1332 END IF !log_unit
1333 mult = 1
1334 END IF
1335
1336 CALL tddfpt_energies(qs_env, nstates, work_matrices, tddfpt_control, logger, &
1337 tddfpt_print_section, evects, evals, &
1338 gs_mos, tddfpt_section, s_evects, matrix_s, &
1339 kernel_env, matrix_ks, sub_env, ostrength, &
1340 dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
1341 kernel_env_admm_aux)
1342
1343 ! Compute perturbative SOC correction
1344 ! Order should always be singlet triplet in tddfpt_soc
1345 IF (lmult_tmp) THEN
1346 CALL tddfpt_soc(qs_env, evals_mult, evals, evects_mult, evects, gs_mos) !mult=singlet
1347 ELSE
1348 CALL tddfpt_soc(qs_env, evals, evals_mult, evects, evects_mult, gs_mos) !mult=triplet
1349 END IF
1350
1351 ! deallocate the additional multiplicity
1352 DO ispin = 1, SIZE(evects_mult, 1)
1353 DO istate = 1, SIZE(evects_mult, 2)
1354 CALL cp_fm_release(evects_mult(ispin, istate))
1355 END DO
1356 END DO
1357 DEALLOCATE (evects_mult, evals_mult, ostrength_mult)
1358
1359 CALL timestop(handle)
1360
1361 END SUBROUTINE tddfpt_soc_energies
1362
1363END 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:593
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 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...
DBCSR operations in CP2K.
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
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
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_create(matrix, matrix_struct, name, use_sp)
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:15
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:594
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:2952
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_kernel_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_kernel_stda
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
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:130
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)
...
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, 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, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, 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)
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
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.
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)
Perform TDDFPT calculation.
subroutine, public tddfpt_energies(qs_env, nstates, 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_input(qs_env, do_hfx, do_admm, do_exck, do_hfxsr, do_hfxlr, xc_section, tddfpt_print_section, lri_section, hfxsr_section)
TDDFPT input.
subroutine, public tddfpt_print_excitation_analysis(log_unit, evects, evals, gs_mos, matrix_s, min_amplitude)
Print excitation analysis.
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_summary(log_unit, evects, evals, ostrength, mult, dipole_op_mos_occ, dipole_form)
Print final TDDFPT excitation energies and oscillator strengths.
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)
integer function, public tddfpt_read_restart(evects, evals, gs_mos, logger, tddfpt_section, tddfpt_print_section, fm_pool_ao_mo_occ, blacs_env_global)
Initialise initial guess vectors by reading (un-normalised) Ritz vectors from a binary restart file.
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.
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, 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_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_create_work_matrices(work_matrices, gs_mos, nstates, do_hfx, do_admm, do_hfxlr, do_exck, qs_env, sub_env)
Allocate work matrices for full kernel.
subroutine, public tddfpt_release_ground_state_mos(gs_mos)
Release molecular orbitals.
subroutine, public tddfpt_guess_vectors(evects, evals, gs_mos, log_unit)
Generate missed guess vectors.
subroutine, public tddfpt_oecorr(qs_env, gs_mos, matrix_ks_oep)
Callculate orbital corrected KS matrix for TDDFPT.
subroutine, public tddfpt_init_mos(qs_env, gs_mos, iounit)
Prepare MOs for TDDFPT Calculations.
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,...
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:55
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.
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.
Ground state molecular orbitals.
Set of temporary ("work") matrices.