(git:ed6f26b)
Loading...
Searching...
No Matches
bse_print.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
8! **************************************************************************************************
9!> \brief Routines for printing information in context of the BSE calculation
10!> \par History
11!> 10.2024 created [Maximilian Graml]
12! **************************************************************************************************
14
19 USE cp_fm_types, ONLY: cp_fm_get_info,&
25 USE kinds, ONLY: dp
26 USE mp2_types, ONLY: mp2_type
28 USE physcon, ONLY: angstrom,&
29 evolt
32#include "./base/base_uses.f90"
33
34 IMPLICIT NONE
35
36 PRIVATE
37
38 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'bse_print'
39
43
44CONTAINS
45
46! **************************************************************************************************
47!> \brief ...
48!> \param bse_tda ...
49!> \param bse_abba ...
50!> \param unit_nr ...
51! **************************************************************************************************
52 SUBROUTINE print_bse_start_flag(bse_tda, bse_abba, unit_nr)
53
54 LOGICAL, INTENT(IN) :: bse_tda, bse_abba
55 INTEGER, INTENT(IN) :: unit_nr
56
57 CHARACTER(LEN=*), PARAMETER :: routinen = 'print_BSE_start_flag'
58
59 INTEGER :: handle
60
61 CALL timeset(routinen, handle)
62
63 IF (unit_nr > 0) THEN
64 WRITE (unit_nr, *) ' '
65 WRITE (unit_nr, '(T2,A79)') '*******************************************************************************'
66 WRITE (unit_nr, '(T2,A79)') '** **'
67 WRITE (unit_nr, '(T2,A79)') '** Bethe Salpeter equation (BSE) for excitation energies **'
68 IF (bse_tda .AND. bse_abba) THEN
69 WRITE (unit_nr, '(T2,A79)') '** solved with and without Tamm-Dancoff approximation (TDA) **'
70 ELSE IF (bse_tda) THEN
71 WRITE (unit_nr, '(T2,A79)') '** solved with Tamm-Dancoff approximation (TDA) **'
72 ELSE
73 WRITE (unit_nr, '(T2,A79)') '** solved without Tamm-Dancoff approximation (TDA) **'
74 END IF
75
76 WRITE (unit_nr, '(T2,A79)') '** **'
77 WRITE (unit_nr, '(T2,A79)') '*******************************************************************************'
78 WRITE (unit_nr, *) ' '
79 END IF
80
81 CALL timestop(handle)
82
83 END SUBROUTINE
84
85! **************************************************************************************************
86!> \brief ...
87!> \param homo ...
88!> \param virtual ...
89!> \param homo_irred ...
90!> \param flag_TDA ...
91!> \param multiplet ...
92!> \param alpha ...
93!> \param mp2_env ...
94!> \param unit_nr ...
95! **************************************************************************************************
96 SUBROUTINE print_output_header(homo, virtual, homo_irred, flag_TDA, &
97 multiplet, alpha, mp2_env, unit_nr)
98
99 INTEGER, INTENT(IN) :: homo, virtual, homo_irred
100 LOGICAL, INTENT(IN) :: flag_tda
101 CHARACTER(LEN=10), INTENT(IN) :: multiplet
102 REAL(kind=dp), INTENT(IN) :: alpha
103 TYPE(mp2_type), INTENT(INOUT) :: mp2_env
104 INTEGER, INTENT(IN) :: unit_nr
105
106 CHARACTER(LEN=*), PARAMETER :: routinen = 'print_output_header'
107
108 INTEGER :: handle
109
110 CALL timeset(routinen, handle)
111
112 IF (unit_nr > 0) THEN
113 WRITE (unit_nr, '(T2,A4)') 'BSE|'
114 WRITE (unit_nr, '(T2,A4)') 'BSE|'
115 IF (flag_tda) THEN
116 WRITE (unit_nr, '(T2,A4,T7,A74)') 'BSE|', '**************************************************************************'
117 WRITE (unit_nr, '(T2,A4,T7,A74)') 'BSE|', '* Bethe Salpeter equation (BSE) with Tamm Dancoff approximation (TDA) *'
118 WRITE (unit_nr, '(T2,A4,T7,A74)') 'BSE|', '**************************************************************************'
119 WRITE (unit_nr, '(T2,A4)') 'BSE|'
120 WRITE (unit_nr, '(T2,A4,T7,A48,A23)') 'BSE|', 'The excitations are calculated by diagonalizing ', &
121 'the BSE within the TDA:'
122 WRITE (unit_nr, '(T2,A4)') 'BSE|'
123 WRITE (unit_nr, '(T2,A4,T29,A16)') 'BSE|', Ω'A X^n = ^n X^n'
124 WRITE (unit_nr, '(T2,A4)') 'BSE|'
125 WRITE (unit_nr, '(T2,A4,T7,A23)') 'BSE|', 'i.e. in index notation:'
126 WRITE (unit_nr, '(T2,A4)') 'BSE|'
127 WRITE (unit_nr, '(T2,A4,T7,A41)') 'BSE|', Ω'sum_jb ( A_ia,jb X_jb^n ) = ^n X_ia^n'
128 WRITE (unit_nr, '(T2,A4)') 'BSE|'
129 WRITE (unit_nr, '(T2,A4,T7,A30)') 'BSE|', 'prelim Ref.: Eq. (36) with B=0'
130 WRITE (unit_nr, '(T2,A4,T7,A71)') 'BSE|', 'in PRB 92,045209 (2015); http://dx.doi.org/10.1103/PhysRevB.92.045209 .'
131 ELSE
132 WRITE (unit_nr, '(T2,A4,T7,A74)') 'BSE|', '**************************************************************************'
133 WRITE (unit_nr, '(T2,A4,T7,A74)') 'BSE|', '* Full ("ABBA") Bethe Salpeter equation (BSE) (i.e. without TDA) *'
134 WRITE (unit_nr, '(T2,A4,T7,A74)') 'BSE|', '**************************************************************************'
135 WRITE (unit_nr, '(T2,A4)') 'BSE|'
136 WRITE (unit_nr, '(T2,A4,T7,A48,A24)') 'BSE|', 'The excitations are calculated by diagonalizing ', &
137 'the BSE without the TDA:'
138 WRITE (unit_nr, '(T2,A4)') 'BSE|'
139 WRITE (unit_nr, '(T2,A4,T22,A30)') 'BSE|', '|A B| |X^n| |1 0| |X^n|'
140 WRITE (unit_nr, '(T2,A4,T22,A31)') 'BSE|', Ω'|B A| |Y^n| = ^n |0 -1| |Y^n|'
141 WRITE (unit_nr, '(T2,A4)') 'BSE|'
142 WRITE (unit_nr, '(T2,A4,T7,A23)') 'BSE|', 'i.e. in index notation:'
143 WRITE (unit_nr, '(T2,A4)') 'BSE|'
144 WRITE (unit_nr, '(T2,A4,T7,A62)') 'BSE|', Ω' sum_jb ( A_ia,jb X_jb^n + B_ia,jb Y_jb^n ) = ^n X_ia^n'
145 WRITE (unit_nr, '(T2,A4,T7,A62)') 'BSE|', Ω'- sum_jb ( B_ia,jb X_jb^n + A_ia,jb Y_jb^n ) = ^n Y_ia^n'
146 END IF
147 WRITE (unit_nr, '(T2,A4)') 'BSE|'
148 WRITE (unit_nr, '(T2,A4)') 'BSE|'
149 WRITE (unit_nr, '(T2,A4,T7,A4,T18,A42,T70,A1,I4,A1,I4,A1)') 'BSE|', 'i,j:', &
150 'occupied molecular orbitals, i.e. state in', '[', homo_irred - homo + 1, ',', homo_irred, ']'
151 WRITE (unit_nr, '(T2,A4,T7,A4,T18,A44,T70,A1,I4,A1,I4,A1)') 'BSE|', 'a,b:', &
152 'unoccupied molecular orbitals, i.e. state in', '[', homo_irred + 1, ',', homo_irred + virtual, ']'
153 WRITE (unit_nr, '(T2,A4,T7,A2,T18,A16)') 'BSE|', 'n:', 'Excitation index'
154 WRITE (unit_nr, '(T2,A4)') 'BSE|'
155 IF (mp2_env%bse%screening_method == bse_screening_w0) THEN
156 WRITE (unit_nr, '(T2,A4,T7,A)') 'BSE|', εεδδα'A_ia,jb = (_a-_i) _ij _ab + * v_ia,jb - W_ij,ab'
157 ELSE IF (mp2_env%bse%screening_method == bse_screening_rpa) THEN
158 WRITE (unit_nr, '(T2,A4,T7,A)') 'BSE|', εεδδα'A_ia,jb = (_a-_i) _ij _ab + * v_ia,jb'
159 END IF
160 IF (.NOT. flag_tda) THEN
161 IF (mp2_env%bse%screening_method == bse_screening_w0) THEN
162 WRITE (unit_nr, '(T2,A4,T7,A)') 'BSE|', α'B_ia,jb = * v_ia,jb - W_ib,aj'
163 ELSE IF (mp2_env%bse%screening_method == bse_screening_rpa) THEN
164 WRITE (unit_nr, '(T2,A4,T7,A)') 'BSE|', α'B_ia,jb = * v_ia,jb'
165 END IF
166 WRITE (unit_nr, '(T2,A4)') 'BSE|'
167 WRITE (unit_nr, '(T2,A4,T7,A35)') 'BSE|', 'prelim Ref.: Eqs. (24-27),(30),(35)'
168 WRITE (unit_nr, '(T2,A4,T7,A71)') 'BSE|', 'in PRB 92,045209 (2015); http://dx.doi.org/10.1103/PhysRevB.92.045209 .'
169 END IF
170 IF (.NOT. flag_tda) THEN
171 WRITE (unit_nr, '(T2,A4)') 'BSE|'
172 WRITE (unit_nr, '(T2,A4,T7,A74)') 'BSE|', Ω'The BSE is solved for ^n and X_ia^n as a hermitian problem, e.g. Eq.(42)'
173 WRITE (unit_nr, '(T2,A4,T7,A71)') 'BSE|', 'in PRB 92,045209 (2015); http://dx.doi.org/10.1103/PhysRevB.92.045209 .'
174 END IF
175 WRITE (unit_nr, '(T2,A4)') 'BSE|'
176 WRITE (unit_nr, '(T2,A4,T7,A7,T31,A23)') 'BSE|', ε'_...:', 'GW quasiparticle energy'
177 WRITE (unit_nr, '(T2,A4,T7,A7,T31,A15)') 'BSE|', δ'_...:', 'Kronecker delta'
178 WRITE (unit_nr, '(T2,A4,T7,A3,T31,A21)') 'BSE|', α':', 'spin-dependent factor (Singlet/Triplet)'
179 WRITE (unit_nr, '(T2,A4,T7,A6,T30,A34)') 'BSE|', 'v_...:', 'Electron-hole exchange interaction'
180 IF (mp2_env%bse%screening_method == bse_screening_w0) THEN
181 WRITE (unit_nr, '(T2,A4,T7,A,T31,A)') 'BSE|', ϵ'W_... = 1/ v_...:', &
182 'Direct interaction screened by '
183 WRITE (unit_nr, '(T2,A4,T30,A)') 'BSE|', &
184 ϵω'dielectric function (=0)'
185 ELSE IF (mp2_env%bse%screening_method == bse_screening_tdhf) THEN
186 WRITE (unit_nr, '(T2,A4,T7,A,T30,A)') 'BSE|', 'W_... = v_...:', 'Direct interaction without screening'
187 ELSE IF (mp2_env%bse%screening_method == bse_screening_alpha) THEN
188 WRITE (unit_nr, '(T2,A4,T7,A,T31,A,F5.2)') 'BSE|', γ'W_... = v_...:', &
189 γ'Direct interaction with artificial screening =', mp2_env%bse%screening_factor
190 END IF
191 WRITE (unit_nr, '(T2,A4)') 'BSE|'
192 WRITE (unit_nr, '(T2,A4)') 'BSE|'
193 WRITE (unit_nr, '(T2,A4,T7,A47,A7,A9,F3.1)') 'BSE|', &
194 'The spin-dependent factor is for the requested ', multiplet, α" is = ", alpha
195 WRITE (unit_nr, '(T2,A4)') 'BSE|'
196 END IF
197
198 CALL timestop(handle)
199
200 END SUBROUTINE
201
202! **************************************************************************************************
203!> \brief ...
204!> \param Exc_ens ...
205!> \param homo ...
206!> \param virtual ...
207!> \param flag_TDA ...
208!> \param multiplet ...
209!> \param info_approximation ...
210!> \param mp2_env ...
211!> \param unit_nr ...
212! **************************************************************************************************
213 SUBROUTINE print_excitation_energies(Exc_ens, homo, virtual, flag_TDA, multiplet, &
214 info_approximation, mp2_env, unit_nr)
215
216 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: exc_ens
217 INTEGER, INTENT(IN) :: homo, virtual
218 LOGICAL, INTENT(IN) :: flag_tda
219 CHARACTER(LEN=10), INTENT(IN) :: multiplet, info_approximation
220 TYPE(mp2_type), INTENT(INOUT) :: mp2_env
221 INTEGER, INTENT(IN) :: unit_nr
222
223 CHARACTER(LEN=*), PARAMETER :: routinen = 'print_excitation_energies'
224
225 INTEGER :: handle, i_exc
226
227 CALL timeset(routinen, handle)
228
229 IF (unit_nr > 0) THEN
230 IF (flag_tda) THEN
231 WRITE (unit_nr, '(T2,A4,T7,A56)') 'BSE|', 'Excitation energies from solving the BSE within the TDA:'
232 ELSE
233 WRITE (unit_nr, '(T2,A4,T7,A57)') 'BSE|', 'Excitation energies from solving the BSE without the TDA:'
234 END IF
235 WRITE (unit_nr, '(T2,A4)') 'BSE|'
236 WRITE (unit_nr, '(T2,A4,T11,A12,T26,A11,T44,A8,T55,A27)') 'BSE|', &
237 'Excitation n', "Spin Config", 'TDA/ABBA', Ω'Excitation energy ^n (eV)'
238 END IF
239 !prints actual energies values
240 IF (unit_nr > 0) THEN
241 DO i_exc = 1, min(homo*virtual, mp2_env%bse%num_print_exc)
242 WRITE (unit_nr, '(T2,A4,T7,I16,T30,A7,T46,A6,T59,F22.4)') &
243 'BSE|', i_exc, multiplet, info_approximation, exc_ens(i_exc)*evolt
244 END DO
245 END IF
246
247 CALL timestop(handle)
248
249 END SUBROUTINE print_excitation_energies
250
251! **************************************************************************************************
252!> \brief ...
253!> \param fm_eigvec_X ...
254!> \param homo ...
255!> \param virtual ...
256!> \param homo_irred ...
257!> \param info_approximation ...
258!> \param mp2_env ...
259!> \param unit_nr ...
260!> \param fm_eigvec_Y ...
261! **************************************************************************************************
262 SUBROUTINE print_transition_amplitudes(fm_eigvec_X, homo, virtual, homo_irred, &
263 info_approximation, mp2_env, unit_nr, fm_eigvec_Y)
264
265 TYPE(cp_fm_type), INTENT(IN) :: fm_eigvec_x
266 INTEGER, INTENT(IN) :: homo, virtual, homo_irred
267 CHARACTER(LEN=10), INTENT(IN) :: info_approximation
268 TYPE(mp2_type), INTENT(INOUT) :: mp2_env
269 INTEGER, INTENT(IN) :: unit_nr
270 TYPE(cp_fm_type), INTENT(IN), OPTIONAL :: fm_eigvec_y
271
272 CHARACTER(LEN=*), PARAMETER :: routinen = 'print_transition_amplitudes'
273
274 INTEGER :: handle, i_exc
275
276 CALL timeset(routinen, handle)
277
278 IF (unit_nr > 0) THEN
279 WRITE (unit_nr, '(T2,A4)') 'BSE|'
280 WRITE (unit_nr, '(T2,A4,T7,A61)') &
281 'BSE|', "Single-particle transitions are built up by (de-)excitations,"
282 WRITE (unit_nr, '(T2,A4,T7,A18)') &
283 'BSE|', "which we denote by"
284 WRITE (unit_nr, '(T2,A4)') 'BSE|'
285 WRITE (unit_nr, '(T2,A4,T20,A2,T30,A40)') &
286 'BSE|', "=>", "for excitations, i.e. entries of X_ia^n,"
287 WRITE (unit_nr, '(T2,A4,T20,A2,T30,A42)') &
288 'BSE|', "<=", "for deexcitations, i.e. entries of Y_ia^n."
289 WRITE (unit_nr, '(T2,A4)') &
290 'BSE|'
291 WRITE (unit_nr, '(T2,A4,T7,A73)') &
292 'BSE|', "The following single-particle transitions have significant contributions,"
293 WRITE (unit_nr, '(T2,A4,T7,A16,F5.3,A15,F5.3,A16)') &
294 'BSE|', "i.e. |X_ia^n| > ", mp2_env%bse%eps_x, " or |Y_ia^n| > ", &
295 mp2_env%bse%eps_x, ", respectively :"
296
297 WRITE (unit_nr, '(T2,A4,T15,A27,I5,A13,I5,A3)') 'BSE|', '-- Quick reminder: HOMO i =', &
298 homo_irred, ' and LUMO a =', homo_irred + 1, " --"
299 WRITE (unit_nr, '(T2,A4)') 'BSE|'
300 WRITE (unit_nr, '(T2,A4,T7,A12,T30,A1,T32,A5,T42,A1,T49,A8,T64,A17)') &
301 "BSE|", "Excitation n", "i", "=>/<=", "a", 'TDA/ABBA', "|X_ia^n|/|Y_ia^n|"
302 END IF
303 DO i_exc = 1, min(homo*virtual, mp2_env%bse%num_print_exc)
304 IF (unit_nr > 0) THEN
305 WRITE (unit_nr, '(T2,A4)') 'BSE|'
306 END IF
307 !Iterate through eigenvector and print values above threshold
308 CALL print_transition_amplitudes_core(fm_eigvec_x, "=>", info_approximation, &
309 i_exc, virtual, homo, homo_irred, &
310 unit_nr, mp2_env)
311 IF (PRESENT(fm_eigvec_y)) THEN
312 CALL print_transition_amplitudes_core(fm_eigvec_y, "<=", info_approximation, &
313 i_exc, virtual, homo, homo_irred, &
314 unit_nr, mp2_env)
315 END IF
316 END DO
317
318 CALL timestop(handle)
319
320 END SUBROUTINE print_transition_amplitudes
321
322! **************************************************************************************************
323!> \brief ...
324!> \param Exc_ens ...
325!> \param oscill_str ...
326!> \param trans_mom_bse ...
327!> \param polarizability_residues ...
328!> \param homo ...
329!> \param virtual ...
330!> \param homo_irred ...
331!> \param flag_TDA ...
332!> \param info_approximation ...
333!> \param mp2_env ...
334!> \param unit_nr ...
335! **************************************************************************************************
336 SUBROUTINE print_optical_properties(Exc_ens, oscill_str, trans_mom_bse, polarizability_residues, &
337 homo, virtual, homo_irred, flag_TDA, &
338 info_approximation, mp2_env, unit_nr)
339
340 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: exc_ens, oscill_str
341 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :, :) :: trans_mom_bse, polarizability_residues
342 INTEGER, INTENT(IN) :: homo, virtual, homo_irred
343 LOGICAL, INTENT(IN) :: flag_tda
344 CHARACTER(LEN=10), INTENT(IN) :: info_approximation
345 TYPE(mp2_type), INTENT(INOUT) :: mp2_env
346 INTEGER, INTENT(IN) :: unit_nr
347
348 CHARACTER(LEN=*), PARAMETER :: routinen = 'print_optical_properties'
349
350 INTEGER :: handle, i_exc
351
352 CALL timeset(routinen, handle)
353
354 ! Discriminate between singlet and triplet, since triplet state can't couple to light
355 ! and therefore calculations of dipoles etc are not necessary
356 IF (mp2_env%bse%bse_spin_config == 0) THEN
357 IF (unit_nr > 0) THEN
358 WRITE (unit_nr, '(T2,A4)') 'BSE|'
359 WRITE (unit_nr, '(T2,A4,T7,A60)') &
360 'BSE|', ∈"Transition moments d_r^n (with r(x,y,z), in atomic units)"
361 WRITE (unit_nr, '(T2,A4,T7,A67)') &
362 'BSE|', "and oscillator strength f^n of excitation level n are obtained from"
363 WRITE (unit_nr, '(T2,A4)') 'BSE|'
364 IF (flag_tda) THEN
365 WRITE (unit_nr, '(T2,A4,T10,A)') &
366 'BSE|', ψψ"d_r^n = sqrt(2) sum_ia < _i | r | _a > X_ia^n"
367 ELSE
368 WRITE (unit_nr, '(T2,A4,T10,A)') &
369 'BSE|', ψψ"d_r^n = sum_ia sqrt(2) < _i | r | _a > ( X_ia^n + Y_ia^n )"
370 END IF
371 WRITE (unit_nr, '(T2,A4)') 'BSE|'
372 WRITE (unit_nr, '(T2,A4,T14,A)') &
373 'BSE|', Ω∈"f^n = 2/3 * ^n sum_r(x,y,z) ( d_r^n )^2"
374 WRITE (unit_nr, '(T2,A4)') 'BSE|'
375 WRITE (unit_nr, '(T2,A4,T7,A19)') &
376 'BSE|', "where we introduced"
377 WRITE (unit_nr, '(T2,A4)') 'BSE|'
378 WRITE (unit_nr, '(T2,A4,T7,A5,T15,A28)') &
379 'BSE|', ψ"_i:", "occupied molecular orbitals,"
380 WRITE (unit_nr, '(T2,A4,T7,A5,T15,A28)') &
381 'BSE|', ψ"_a:", "empty molecular orbitals and"
382 WRITE (unit_nr, '(T2,A4,T9,A2,T14,A18)') &
383 'BSE|', "r:", "position operator."
384 WRITE (unit_nr, '(T2,A4)') 'BSE|'
385 WRITE (unit_nr, '(T2,A4,T7,A28)') &
386 'BSE|', "prelim Ref.: Eqs. (23), (24)"
387 WRITE (unit_nr, '(T2,A4,T7,A71)') &
388 'BSE|', "in J. Chem. Phys. 152, 044105 (2020); https://doi.org/10.1063/1.5123290"
389 WRITE (unit_nr, '(T2,A4)') 'BSE|'
390 IF (flag_tda) THEN
391 WRITE (unit_nr, '(T2,A4,T7,A55)') 'BSE|', &
392 'Optical properties from solving the BSE within the TDA:'
393 ELSE
394 WRITE (unit_nr, '(T2,A4,T7,A56)') 'BSE|', &
395 'Optical properties from solving the BSE without the TDA:'
396 END IF
397 WRITE (unit_nr, '(T2,A4)') 'BSE|'
398 WRITE (unit_nr, '(T2,A4,T8,A12,T22,A8,T38,A5,T48,A5,T58,A5,T64,A17)') 'BSE|', &
399 'Excitation n', "TDA/ABBA", "d_x^n", "d_y^n", "d_z^n", 'Osc. strength f^n'
400 DO i_exc = 1, min(homo*virtual, mp2_env%bse%num_print_exc)
401 WRITE (unit_nr, '(T2,A4,T8,I12,T24,A6,T35,F8.3,T45,F8.3,T55,F8.3,T65,F16.3)') &
402 'BSE|', i_exc, info_approximation, trans_mom_bse(1, 1, i_exc), trans_mom_bse(2, 1, i_exc), &
403 trans_mom_bse(3, 1, i_exc), oscill_str(i_exc)
404 END DO
405 WRITE (unit_nr, '(T2,A4)') 'BSE|'
406 WRITE (unit_nr, '(T2,A4,T7,A)') 'BSE|', &
407 'Check for Thomas-Reiche-Kuhn sum rule'
408 WRITE (unit_nr, '(T2,A4)') 'BSE|'
409 WRITE (unit_nr, '(T2,A4,T35,A15)') 'BSE|', &
410 Σ'N_e = _n f^n'
411 WRITE (unit_nr, '(T2,A4)') 'BSE|'
412 WRITE (unit_nr, '(T2,A4,T7,A24,T65,I16)') 'BSE|', &
413 'Number of electrons N_e:', homo_irred*2
414 WRITE (unit_nr, '(T2,A4,T7,A40,T66,F16.3)') 'BSE|', &
415 Σ'Sum over oscillator strengths _n f^n :', sum(oscill_str)
416 WRITE (unit_nr, '(T2,A4)') 'BSE|'
417 IF (mp2_env%bse%bse_cutoff_occ > 0 .OR. mp2_env%bse%bse_cutoff_empty > 0) THEN
418 CALL cp_warn(__location__, &
419 "Accuracy of TRK sum rule might suffer from cutoffs.")
420 END IF
421 END IF
422
423 ! Compute and print the absorption spectrum to external file
424 IF (mp2_env%bse%bse_print_spectrum) THEN
425 CALL compute_absorption_spectrum(oscill_str, polarizability_residues, exc_ens, &
426 info_approximation, unit_nr, mp2_env)
427 END IF
428
429 ELSE
430 IF (unit_nr > 0) THEN
431 WRITE (unit_nr, '(T2,A4)') 'BSE|'
432 WRITE (unit_nr, '(T2,A4)') 'BSE|'
433 CALL cp_warn(__location__, &
434 "Requested triplet excitation cannot couple to light. "// &
435 "Skipping calculation of transition moments, "// &
436 "oscillator strengths, and spectrum.")
437 END IF
438 END IF
439
440 CALL timestop(handle)
441
442 END SUBROUTINE print_optical_properties
443
444! **************************************************************************************************
445!> \brief ...
446!> \param fm_eigvec ...
447!> \param direction_excitation ...
448!> \param info_approximation ...
449!> \param i_exc ...
450!> \param virtual ...
451!> \param homo ...
452!> \param homo_irred ...
453!> \param unit_nr ...
454!> \param mp2_env ...
455! **************************************************************************************************
456 SUBROUTINE print_transition_amplitudes_core(fm_eigvec, direction_excitation, info_approximation, &
457 i_exc, virtual, homo, homo_irred, &
458 unit_nr, mp2_env)
459
460 TYPE(cp_fm_type), INTENT(IN) :: fm_eigvec
461 CHARACTER(LEN=2), INTENT(IN) :: direction_excitation
462 CHARACTER(LEN=10), INTENT(IN) :: info_approximation
463 INTEGER :: i_exc, virtual, homo, homo_irred
464 INTEGER, INTENT(IN) :: unit_nr
465 TYPE(mp2_type), INTENT(INOUT) :: mp2_env
466
467 CHARACTER(LEN=*), PARAMETER :: routinen = 'print_transition_amplitudes_core'
468
469 INTEGER :: handle, k, num_entries
470 INTEGER, ALLOCATABLE, DIMENSION(:) :: idx_homo, idx_virt
471 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: eigvec_entries
472
473 CALL timeset(routinen, handle)
474
475 CALL filter_eigvec_contrib(fm_eigvec, idx_homo, idx_virt, eigvec_entries, &
476 i_exc, virtual, num_entries, mp2_env)
477 ! direction_excitation can be either => (means excitation; from fm_eigvec_X)
478 ! or <= (means deexcitation; from fm_eigvec_Y)
479 IF (unit_nr > 0) THEN
480 DO k = 1, num_entries
481 WRITE (unit_nr, '(T2,A4,T14,I5,T26,I5,T35,A2,T38,I5,T51,A6,T65,F16.4)') &
482 "BSE|", i_exc, homo_irred - homo + idx_homo(k), direction_excitation, &
483 homo_irred + idx_virt(k), info_approximation, abs(eigvec_entries(k))
484 END DO
485 END IF
486 DEALLOCATE (idx_homo)
487 DEALLOCATE (idx_virt)
488 DEALLOCATE (eigvec_entries)
489 CALL timestop(handle)
490
491 END SUBROUTINE
492
493! **************************************************************************************************
494!> \brief Prints exciton descriptors, cf. Mewes et al., JCTC 14, 710-725 (2018)
495!> \param exc_descr Exciton descriptors with size of num_print_exc_descr
496!> \param ref_point_multipole Reference point for computation of multipole moments, e.g. center of mass
497!> \param unit_nr ...
498!> \param num_print_exc_descr Number of excitation levels for which descriptors are printed
499!> \param print_checkvalue Flag, which determines if values for regtests should be printed
500!> \param print_directional_exc_descr Flag, which activates printing of directional descriptors
501!> \param prefix_output String, which is put in front of prints, i.e. "BSE|" or "" for TDDFPT
502!> \param qs_env ...
503! **************************************************************************************************
504 SUBROUTINE print_exciton_descriptors(exc_descr, ref_point_multipole, unit_nr, &
505 num_print_exc_descr, print_checkvalue, print_directional_exc_descr, &
506 prefix_output, qs_env)
507
508 TYPE(exciton_descr_type), ALLOCATABLE, &
509 DIMENSION(:) :: exc_descr
510 REAL(kind=dp), ALLOCATABLE, DIMENSION(:), &
511 INTENT(IN) :: ref_point_multipole
512 INTEGER, INTENT(IN) :: unit_nr, num_print_exc_descr
513 LOGICAL, INTENT(IN) :: print_checkvalue, &
514 print_directional_exc_descr
515 CHARACTER(LEN=4), INTENT(IN) :: prefix_output
516 TYPE(qs_environment_type), POINTER :: qs_env
517
518 CHARACTER(LEN=*), PARAMETER :: routinen = 'print_exciton_descriptors'
519
520 CHARACTER(LEN=1), DIMENSION(3) :: array_direction_str
521 CHARACTER(LEN=5) :: method_name
522 INTEGER :: handle, i_dir, i_exc
523 REAL(kind=dp) :: d_eh_dir, d_exc_dir, sigma_e_dir, &
524 sigma_h_dir
525 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
526
527 IF (prefix_output == 'BSE|') THEN
528 method_name = 'BSE'
529 ELSE
530 method_name = 'TDDFT'
531 END IF
532
533 CALL timeset(routinen, handle)
534 CALL get_qs_env(qs_env, particle_set=particle_set)
535 IF (unit_nr > 0) THEN
536 WRITE (unit_nr, '(T2,A4,T7,A)') prefix_output, &
537 'Exciton descriptors for excitation level n are given by'
538 WRITE (unit_nr, '(T2,A4)') prefix_output
539 WRITE (unit_nr, '(T2,A4,T15,A)') prefix_output, &
540 'd_eh = | <r_h - r_e>_exc |'
541 WRITE (unit_nr, '(T2,A4)') prefix_output
542 WRITE (unit_nr, '(T2,A4,T15,A)') prefix_output, &
543 σ'_e = sqrt( <r_e^2>_exc - <r_e>_exc^2 )'
544 WRITE (unit_nr, '(T2,A4)') prefix_output
545 WRITE (unit_nr, '(T2,A4,T15,A)') prefix_output, &
546 σ'_h = sqrt( <r_h^2>_exc - <r_h>_exc^2 )'
547 WRITE (unit_nr, '(T2,A4)') prefix_output
548 WRITE (unit_nr, '(T2,A4,T15,A)') prefix_output, &
549 'COV_eh = <r_e r_h>_exc - <r_e>_exc <r_h>_exc'
550 WRITE (unit_nr, '(T2,A4)') prefix_output
551 WRITE (unit_nr, '(T2,A4,T15,A)') prefix_output, &
552 'd_exc = sqrt( | < |r_h - r_e|^2 >_exc )'
553 WRITE (unit_nr, '(T2,A4,T15,A)') prefix_output, &
554 σσ' = sqrt( d_eh^2 + _e^2 + _h^2 - 2 * COV_eh )'
555 WRITE (unit_nr, '(T2,A4)') prefix_output
556 WRITE (unit_nr, '(T2,A4,T15,A)') prefix_output, &
557 σσ'R_eh = COV_eh / (_e * _h)'
558 WRITE (unit_nr, '(T2,A4)') prefix_output
559 WRITE (unit_nr, '(T2,A4,T7,A)') prefix_output, &
560 'where the expectation values <.>_exc are taken with respect to the '
561 WRITE (unit_nr, '(T2,A4,T7,A)') prefix_output, &
562 'exciton wavefunction of excitation n:'
563 WRITE (unit_nr, '(T2,A4)') prefix_output
564
565 IF (exc_descr(1)%flag_TDA) THEN
566 WRITE (unit_nr, '(T2,A4,T20,A)') prefix_output, &
567 𝚿Σψψ'_n(r_e,r_h) = _{i,a} X_ia^n _i(r_h) _a(r_e) ,'
568 ELSE
569 WRITE (unit_nr, '(T2,A4,T20,A)') prefix_output, &
570 𝚿Σψψ'_n(r_e,r_h) = _{i,a} X_ia^n _i(r_h) _a(r_e)'
571 WRITE (unit_nr, '(T2,A4,T40,A)') prefix_output, &
572 ψψ'+ Y_ia^n _a(r_h) _i(r_e) ,'
573 END IF
574 WRITE (unit_nr, '(T2,A4)') prefix_output
575 WRITE (unit_nr, '(T2,A4,T7,A)') prefix_output, &
576 'i.e.'
577 WRITE (unit_nr, '(T2,A4)') prefix_output
578 WRITE (unit_nr, '(T2,A4,T20,A)') prefix_output, &
579 𝚿𝚿𝚿𝚿'< O >_exc = < _n | O | _n > / < _n | _n > ,'
580 WRITE (unit_nr, '(T2,A4)') prefix_output
581 IF (exc_descr(1)%flag_TDA) THEN
582 WRITE (unit_nr, '(T2,A4,T7,A)') prefix_output, &
583 𝚿𝚿'where c_n = < _n | _n > = 1 within TDA.'
584 ELSE
585 WRITE (unit_nr, '(T2,A4,T7,A)') prefix_output, &
586 𝚿𝚿'where c_n = < _n | _n > deviates from 1 without TDA.'
587 END IF
588 WRITE (unit_nr, '(T2,A4)') prefix_output
589 WRITE (unit_nr, '(T2,A4)') prefix_output
590 WRITE (unit_nr, '(T2,A4,T7,A)') prefix_output, &
591 'Here, we introduced'
592 WRITE (unit_nr, '(T2,A4)') prefix_output
593 WRITE (unit_nr, '(T2,A4,T7,A5,T15,A)') &
594 prefix_output, ψ"_i:", "occupied molecular orbitals,"
595 WRITE (unit_nr, '(T2,A4,T7,A5,T15,A)') &
596 prefix_output, ψ"_a:", "empty molecular orbitals and"
597 WRITE (unit_nr, '(T2,A4,T9,A2,T14,A)') &
598 prefix_output, "r:", "position operator."
599 WRITE (unit_nr, '(T2,A4)') prefix_output
600 WRITE (unit_nr, '(T2,A4,T7,A)') prefix_output, &
601 'prelim Ref.: Eqs. (15)-(22)'
602 WRITE (unit_nr, '(T2,A4,T7,A,A)') prefix_output, &
603 'JCTC 2018, 14, 710-725; ', &
604 'http://doi.org/10.1021/acs.jctc.7b01145'
605 WRITE (unit_nr, '(T2,A4)') prefix_output
606 WRITE (unit_nr, '(T2,A4)') prefix_output
607 IF (exc_descr(1)%flag_TDA) THEN
608 WRITE (unit_nr, '(T2,A4,T7,A,A,A)') prefix_output, &
609 'Exciton descriptors from solving the ', method_name, ' within the TDA:'
610 ELSE
611 WRITE (unit_nr, '(T2,A4,T7,A,A,A)') prefix_output, &
612 'Exciton descriptors from solving the ', method_name, ' without the TDA:'
613 END IF
614 WRITE (unit_nr, '(T2,A4)') prefix_output
615 WRITE (unit_nr, '(T2,A4,T10,A1,6X,A3,1X,4X,A10,5X,A10,5X,A10,3X,A11,8X,A4)') prefix_output, &
616 'n', 'c_n', Å'd_eh []', σÅ'_e []', σÅ'_h []', Å'd_exc []', 'R_eh'
617 DO i_exc = 1, num_print_exc_descr
618 WRITE (unit_nr, '(T2,A4,T7,I4,4X,F5.3,1X,5(2X,F10.4))') &
619 prefix_output, i_exc, exc_descr(i_exc)%norm_XpY, &
620 exc_descr(i_exc)%diff_r_abs*angstrom, &
621 exc_descr(i_exc)%sigma_e*angstrom, exc_descr(i_exc)%sigma_h*angstrom, &
622 exc_descr(i_exc)%diff_r_sqr*angstrom, exc_descr(i_exc)%corr_e_h
623 END DO
624 WRITE (unit_nr, '(T2,A4)') prefix_output
625 ! For debug runs, print first d_exc separately to allow the regtests to read in
626 IF (print_checkvalue) THEN
627 WRITE (unit_nr, '(T2)')
628 WRITE (unit_nr, '(T2,A28,T65,F16.4)') 'Checksum exciton descriptors', &
629 exc_descr(1)%diff_r_sqr*angstrom
630 WRITE (unit_nr, '(T2)')
631 END IF
632 WRITE (unit_nr, '(T2,A4)') prefix_output
633 ! Print exciton descriptor resolved per direction
634 IF (print_directional_exc_descr) THEN
635 WRITE (unit_nr, '(T2,A4,T7,A)') prefix_output, &
636 'We can restrict the exciton descriptors to a specific direction,'
637 WRITE (unit_nr, '(T2,A4,T7,A)') prefix_output, &
638 'e.g. the x-components are:'
639 WRITE (unit_nr, '(T2,A4)') prefix_output
640 WRITE (unit_nr, '(T2,A4,T15,A)') prefix_output, &
641 'd_eh^x = | <x_h - x_e>_exc |'
642 WRITE (unit_nr, '(T2,A4)') prefix_output
643 WRITE (unit_nr, '(T2,A4,T15,A)') prefix_output, &
644 σ'_e^x = sqrt( <x_e^2>_exc - <x_e>_exc^2 )'
645 WRITE (unit_nr, '(T2,A4)') prefix_output
646 WRITE (unit_nr, '(T2,A4,T15,A)') prefix_output, &
647 σ'_h^x = sqrt( <x_h^2>_exc - <x_h>_exc^2 )'
648 WRITE (unit_nr, '(T2,A4)') prefix_output
649 WRITE (unit_nr, '(T2,A4,T15,A)') prefix_output, &
650 'COV_eh^x = <x_e x_h>_exc - <x_e>_exc <x_h>_exc'
651 WRITE (unit_nr, '(T2,A4)') prefix_output
652 WRITE (unit_nr, '(T2,A4,T15,A)') prefix_output, &
653 'd_exc^x = sqrt( | < |x_h - x_e|^2 >_exc )'
654 WRITE (unit_nr, '(T2,A4,T15,A)') prefix_output, &
655 σ' = sqrt( (d_eh^x)^2 + (_e^x)^2'
656 WRITE (unit_nr, '(T2,A4,T15,A)') prefix_output, &
657 σ' + (_h^x)^2 - 2 * (COV_eh^x) )'
658 WRITE (unit_nr, '(T2,A4)') prefix_output
659 WRITE (unit_nr, '(T2,A4)') prefix_output
660 IF (exc_descr(1)%flag_TDA) THEN
661 WRITE (unit_nr, '(T2,A4,T7,A,A,A)') prefix_output, &
662 'Exciton descriptors per direction from solving the ', method_name, ' within the TDA:'
663 ELSE
664 WRITE (unit_nr, '(T2,A4,T7,A,A,A)') prefix_output, &
665 'Exciton descriptors per direction from solving the ', method_name, ' without the TDA:'
666 END IF
667 WRITE (unit_nr, '(T2,A4)') prefix_output
668 WRITE (unit_nr, '(T2,A4,T12,A1,2X,A9,5X,A12,5X,A12,5X,A12,3X,A13)') prefix_output, &
669 'n', 'r = x/y/z', Å'd_eh^r []', σÅ'_e^r []', σÅ'_h^r []', Å'd_exc^r []'
670 DO i_exc = 1, num_print_exc_descr
671 DO i_dir = 1, 3
672 array_direction_str = (/"x", "y", "z"/)
673 d_eh_dir = abs(exc_descr(i_exc)%r_h(i_dir) - exc_descr(i_exc)%r_e(i_dir))
674 sigma_e_dir = sqrt(exc_descr(i_exc)%r_e_sq(i_dir) - exc_descr(i_exc)%r_e(i_dir)**2)
675 sigma_h_dir = sqrt(exc_descr(i_exc)%r_h_sq(i_dir) - exc_descr(i_exc)%r_h(i_dir)**2)
676 d_exc_dir = sqrt(d_eh_dir**2 + sigma_e_dir**2 + sigma_h_dir**2 &
677 - 2*exc_descr(i_exc)%cov_e_h(i_dir))
678 WRITE (unit_nr, '(T2,A4,T9,I4,10X,A1,1X,4(4X,F10.4))') &
679 prefix_output, i_exc, array_direction_str(i_dir), &
680 d_eh_dir*angstrom, &
681 sigma_e_dir*angstrom, sigma_h_dir*angstrom, &
682 d_exc_dir*angstrom
683 END DO
684 WRITE (unit_nr, '(T2,A4)') prefix_output
685 END DO
686 WRITE (unit_nr, '(T2,A4)') prefix_output
687 END IF
688 ! Print the reference atomic geometry for the exciton descriptors
689 WRITE (unit_nr, '(T2,A4,T7,A)') prefix_output, &
690 'With the center of charge as reference point r_0,'
691 WRITE (unit_nr, '(T2,A4,T15,A7,F10.4,A2,F10.4,A2,F10.4,A1)') prefix_output, &
692 'r_0 = (', ref_point_multipole(1)*angstrom, ', ', ref_point_multipole(2)*angstrom, ', ', &
693 ref_point_multipole(3)*angstrom, ')'
694 WRITE (unit_nr, '(T2,A4,T7,A,A,A)') prefix_output, &
695 'we further obtain r_e and r_h from solving the ', method_name, ' within the TDA'
696 WRITE (unit_nr, '(T2,A4)') prefix_output
697 WRITE (unit_nr, '(T2,A4,T8,A12,1X,13X,A9,13X,A9,13X,A9)') prefix_output, &
698 'Excitation n', Å'x_e []', Å'y_e []', Å'z_e []'
699 DO i_exc = 1, num_print_exc_descr
700 WRITE (unit_nr, '(T2,A4,T8,I12,1X,3(5X,F15.4))') &
701 prefix_output, i_exc, &
702 exc_descr(i_exc)%r_e_shift(:)*angstrom
703 END DO
704 WRITE (unit_nr, '(T2,A4)') prefix_output
705 WRITE (unit_nr, '(T2,A4,T8,A12,1X,13X,A9,13X,A9,13X,A9)') prefix_output, &
706 'Excitation n', Å'x_h []', Å'y_h []', Å'z_h []'
707 DO i_exc = 1, num_print_exc_descr
708 WRITE (unit_nr, '(T2,A4,T8,I12,1X,3(5X,F15.4))') &
709 prefix_output, i_exc, &
710 exc_descr(i_exc)%r_h_shift(:)*angstrom
711 END DO
712 WRITE (unit_nr, '(T2,A4)') prefix_output
713 WRITE (unit_nr, '(T2,A4,T7,A)') prefix_output, &
714 'The reference atomic geometry for these values is given by'
715 END IF
716 CALL write_qs_particle_coordinates_bse(particle_set, unit_nr, prefix_output)
717 IF (unit_nr > 0) THEN
718 WRITE (unit_nr, '(T2,A4)') prefix_output
719 END IF
720 CALL timestop(handle)
721
722 END SUBROUTINE print_exciton_descriptors
723
724! **************************************************************************************************
725!> \brief Debug function to write elements of a full matrix to file, if they are larger than a given threshold
726!> \param fm ...
727!> \param thresh ...
728!> \param header ...
729!> \param unit_nr ...
730!> \param abs_vals ...
731! **************************************************************************************************
732 SUBROUTINE fm_write_thresh(fm, thresh, header, unit_nr, abs_vals)
733
734 TYPE(cp_fm_type), INTENT(IN) :: fm
735 REAL(kind=dp), INTENT(IN) :: thresh
736 CHARACTER(LEN=*), INTENT(IN) :: header
737 INTEGER, INTENT(IN) :: unit_nr
738 LOGICAL, OPTIONAL :: abs_vals
739
740 CHARACTER(LEN=*), PARAMETER :: my_footer = " | ENDING WRITING OF MATRIX", &
741 routinen = 'fm_write_thresh'
742
743 INTEGER :: handle, i, j, ncol_local, nrow_local
744 INTEGER, DIMENSION(:), POINTER :: col_indices, row_indices
745 LOGICAL :: my_abs_vals
746
747 CALL timeset(routinen, handle)
748
749 IF (PRESENT(abs_vals)) THEN
750 my_abs_vals = abs_vals
751 ELSE
752 my_abs_vals = .false.
753 END IF
754
755 CALL cp_fm_get_info(matrix=fm, &
756 nrow_local=nrow_local, &
757 ncol_local=ncol_local, &
758 row_indices=row_indices, &
759 col_indices=col_indices)
760
761 IF (unit_nr > 0) THEN
762 WRITE (unit_nr, *) header
763 END IF
764 IF (my_abs_vals) THEN
765 DO i = 1, nrow_local
766 DO j = 1, ncol_local
767 IF (abs(fm%local_data(i, j)) > thresh) THEN
768 IF (unit_nr > 0) THEN
769 WRITE (unit_nr, "(A7,T10,I5,T20,I5,T30,F13.5)") header, row_indices(i), col_indices(j), &
770 abs(fm%local_data(i, j))
771 END IF
772 END IF
773 END DO
774 END DO
775 ELSE
776 DO i = 1, nrow_local
777 DO j = 1, ncol_local
778 IF (abs(fm%local_data(i, j)) > thresh) THEN
779 IF (unit_nr > 0) THEN
780 WRITE (unit_nr, "(A7,T10,I5,T20,I5,T30,F13.5)") header, row_indices(i), col_indices(j), &
781 fm%local_data(i, j)
782 END IF
783 END IF
784 END DO
785 END DO
786 END IF
787 CALL fm%matrix_struct%para_env%sync()
788 IF (unit_nr > 0) THEN
789 WRITE (unit_nr, *) my_footer
790 END IF
791
792 CALL timestop(handle)
793
794 END SUBROUTINE
795
796! **************************************************************************************************
797!> \brief Write the atomic coordinates to the output unit.
798!> \param particle_set ...
799!> \note Adapted from particle_methods.F [MG]
800!> \param unit_nr ...
801!> \param prefix_output ...
802! **************************************************************************************************
803 SUBROUTINE write_qs_particle_coordinates_bse(particle_set, unit_nr, prefix_output)
804
805 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
806 INTEGER, INTENT(IN) :: unit_nr
807 CHARACTER(LEN=4), INTENT(IN) :: prefix_output
808
809 CHARACTER(len=*), PARAMETER :: routinen = 'write_qs_particle_coordinates_bse'
810
811 CHARACTER(LEN=2) :: element_symbol
812 INTEGER :: handle, iatom, natom
813
814 CALL timeset(routinen, handle)
815
816 IF (unit_nr > 0) THEN
817 WRITE (unit_nr, '(T2,A4)') prefix_output
818 WRITE (unit_nr, '(T2,A4,T13,A7,16X,A7,15X,A7,15X,A7)') prefix_output, &
819 'Element', Å'x []', Å'y []', Å'z []'
820 natom = SIZE(particle_set)
821 DO iatom = 1, natom
822 CALL get_atomic_kind(atomic_kind=particle_set(iatom)%atomic_kind, &
823 element_symbol=element_symbol)
824 WRITE (unit_nr, '(T2,A4,T8,A12,1X,3(5X,F15.4))') &
825 prefix_output, element_symbol, particle_set(iatom)%r(1:3)*angstrom
826 END DO
827 END IF
828
829 CALL timestop(handle)
830
831 END SUBROUTINE write_qs_particle_coordinates_bse
832
833END MODULE bse_print
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
Routines for printing information in context of the BSE calculation.
Definition bse_print.F:13
subroutine, public print_output_header(homo, virtual, homo_irred, flag_tda, multiplet, alpha, mp2_env, unit_nr)
...
Definition bse_print.F:98
subroutine, public print_optical_properties(exc_ens, oscill_str, trans_mom_bse, polarizability_residues, homo, virtual, homo_irred, flag_tda, info_approximation, mp2_env, unit_nr)
...
Definition bse_print.F:339
subroutine, public print_bse_start_flag(bse_tda, bse_abba, unit_nr)
...
Definition bse_print.F:53
subroutine, public print_exciton_descriptors(exc_descr, ref_point_multipole, unit_nr, num_print_exc_descr, print_checkvalue, print_directional_exc_descr, prefix_output, qs_env)
Prints exciton descriptors, cf. Mewes et al., JCTC 14, 710-725 (2018)
Definition bse_print.F:507
subroutine, public print_transition_amplitudes(fm_eigvec_x, homo, virtual, homo_irred, info_approximation, mp2_env, unit_nr, fm_eigvec_y)
...
Definition bse_print.F:264
subroutine, public fm_write_thresh(fm, thresh, header, unit_nr, abs_vals)
Debug function to write elements of a full matrix to file, if they are larger than a given threshold.
Definition bse_print.F:733
subroutine, public print_excitation_energies(exc_ens, homo, virtual, flag_tda, multiplet, info_approximation, mp2_env, unit_nr)
...
Definition bse_print.F:215
Routines for computing excitonic properties, e.g. exciton diameter, from the BSE.
subroutine, public compute_absorption_spectrum(oscill_str, polarizability_residues, exc_ens, info_approximation, unit_nr, mp2_env)
Computes and returns absorption spectrum for the frequency range and broadening provided by the user....
Auxiliary routines for GW + Bethe-Salpeter for computing electronic excitations.
Definition bse_util.F:13
subroutine, public filter_eigvec_contrib(fm_eigvec, idx_homo, idx_virt, eigvec_entries, i_exc, virtual, num_entries, mp2_env)
Filters eigenvector entries above a given threshold to describe excitations in the singleparticle bas...
Definition bse_util.F:994
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
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public bse_screening_tdhf
integer, parameter, public bse_screening_w0
integer, parameter, public bse_tda
integer, parameter, public bse_screening_alpha
integer, parameter, public bse_screening_rpa
integer, parameter, public bse_abba
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Types needed for MP2 calculations.
Definition mp2_types.F:14
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
real(kind=dp), parameter, public angstrom
Definition physcon.F:144
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.
represent a full matrix