(git:f824184)
Loading...
Searching...
No Matches
rpa_gw_kpoints_util.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Routines treating GW and RPA calculations with kpoints
10!> \par History
11!> since 2018 continuous development [J. Wilhelm]
12! **************************************************************************************************
14 USE cell_types, ONLY: cell_type,&
15 get_cell,&
24 USE cp_cfm_diag, ONLY: cp_cfm_geeig,&
36 USE cp_dbcsr_api, ONLY: &
40 dbcsr_release, dbcsr_set, dbcsr_transposed, dbcsr_type, dbcsr_type_no_symmetry
53 USE hfx_types, ONLY: hfx_release
54 USE input_constants, ONLY: cholesky_off,&
58 USE kinds, ONLY: dp
62 USE kpoint_types, ONLY: get_kpoint_info,&
65 USE machine, ONLY: m_walltime
66 USE mathconstants, ONLY: gaussi,&
67 twopi,&
68 z_one,&
69 z_zero
70 USE mathlib, ONLY: invmat
77 USE qs_mo_types, ONLY: get_mo_set
84#include "./base/base_uses.f90"
85
86 IMPLICIT NONE
87
88 PRIVATE
89
90 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'rpa_gw_kpoints_util'
91
95
96CONTAINS
97
98! **************************************************************************************************
99!> \brief Form the screened interaction from a Cholesky-factorized dielectric matrix.
100!> \param eps_chol input Cholesky factor; overwritten by epsilon^-1-Id or Wc
101!> \param B Coulomb factor satisfying V=B^H B
102!> \param Wc optional separate output; if absent, eps_chol is overwritten by Wc
103!> \param n_active optional number of physical rows/columns
104! **************************************************************************************************
105 SUBROUTINE cfm_screened_interaction_from_eps_cholesky(eps_chol, B, Wc, n_active)
106 TYPE(cp_cfm_type), INTENT(INOUT) :: eps_chol
107 TYPE(cp_cfm_type), INTENT(IN) :: b
108 TYPE(cp_cfm_type), INTENT(INOUT), OPTIONAL :: wc
109 INTEGER, INTENT(IN), OPTIONAL :: n_active
110
111 CALL cp_cfm_cholesky_invert(eps_chol)
112 CALL cp_cfm_uplo_to_full(eps_chol)
113 CALL cp_cfm_add_on_diag(eps_chol, -z_one, n_active)
114 CALL cfm_contract_aba(b, eps_chol, wc)
115
117
118! **************************************************************************************************
119!> \brief ...
120!> \param dimen_RI ...
121!> \param jquad ...
122!> \param nkp ...
123!> \param count_ev_sc_GW ...
124!> \param para_env ...
125!> \param Erpa ...
126!> \param grid ...
127!> \param wkp_W ...
128!> \param do_gw_im_time ...
129!> \param do_ri_Sigma_x ...
130!> \param do_kpoints_from_Gamma ...
131!> \param cfm_mat_Q ...
132!> \param ikp_local ...
133!> \param mat_P_omega ...
134!> \param mat_P_omega_kp ...
135!> \param qs_env ...
136!> \param eps_filter_im_time ...
137!> \param unit_nr ...
138!> \param kpoints ...
139!> \param cfm_mat_Minv_L_kpoints ...
140!> \param cfm_matrix_L_kpoints ...
141!> \param fm_mat_W ...
142!> \param cfm_mat_RI_global_work ...
143!> \param mat_MinvVMinv ...
144!> \param fm_matrix_Minv ...
145!> \param fm_matrix_Minv_Vtrunc_Minv ...
146! **************************************************************************************************
147 SUBROUTINE invert_eps_compute_w_and_erpa_kp(dimen_RI, jquad, nkp, count_ev_sc_GW, para_env, &
148 Erpa, grid, wkp_W, do_gw_im_time, &
149 do_ri_Sigma_x, do_kpoints_from_Gamma, &
150 cfm_mat_Q, ikp_local, mat_P_omega, mat_P_omega_kp, &
151 qs_env, eps_filter_im_time, unit_nr, kpoints, cfm_mat_Minv_L_kpoints, &
152 cfm_matrix_L_kpoints, fm_mat_W, &
153 cfm_mat_RI_global_work, mat_MinvVMinv, fm_matrix_Minv, &
154 fm_matrix_Minv_Vtrunc_Minv)
155
156 INTEGER, INTENT(IN) :: dimen_ri, jquad, nkp, count_ev_sc_gw
157 TYPE(mp_para_env_type), POINTER :: para_env
158 REAL(kind=dp), INTENT(INOUT) :: erpa
159 TYPE(time_frequency_grid_type), INTENT(IN) :: grid
160 REAL(kind=dp), DIMENSION(:), INTENT(IN) :: wkp_w
161 LOGICAL, INTENT(IN) :: do_gw_im_time, do_ri_sigma_x, &
162 do_kpoints_from_gamma
163 TYPE(cp_cfm_type), INTENT(INOUT) :: cfm_mat_q
164 INTEGER, INTENT(IN) :: ikp_local
165 TYPE(dbcsr_p_type), DIMENSION(:, :), INTENT(INOUT) :: mat_p_omega, mat_p_omega_kp
166 TYPE(qs_environment_type), POINTER :: qs_env
167 REAL(kind=dp), INTENT(IN) :: eps_filter_im_time
168 INTEGER, INTENT(IN) :: unit_nr
169 TYPE(kpoint_type), POINTER :: kpoints
170 TYPE(cp_cfm_type), ALLOCATABLE, DIMENSION(:) :: cfm_mat_minv_l_kpoints, &
171 cfm_matrix_l_kpoints
172 TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: fm_mat_w
173 TYPE(cp_cfm_type) :: cfm_mat_ri_global_work
174 TYPE(dbcsr_p_type), INTENT(IN) :: mat_minvvminv
175 TYPE(cp_fm_type), ALLOCATABLE, DIMENSION(:, :) :: fm_matrix_minv, &
176 fm_matrix_minv_vtrunc_minv
177
178 CHARACTER(LEN=*), PARAMETER :: routinen = 'invert_eps_compute_W_and_Erpa_kp'
179
180 INTEGER :: handle, ikp, num_integ_points
181 LOGICAL :: do_this_ikp
182 REAL(kind=dp) :: t1, t2
183 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: diag_qomega
184
185 CALL timeset(routinen, handle)
186
187 num_integ_points = SIZE(grid%frequency)
188
189 t1 = m_walltime()
190
191 IF (do_kpoints_from_gamma) THEN
192 CALL get_mat_cell_t_from_mat_gamma(mat_p_omega(jquad, :), qs_env, kpoints, jquad, unit_nr)
193 END IF
194
195 CALL transform_p_from_real_space_to_kpoints(mat_p_omega, mat_p_omega_kp, &
196 kpoints, eps_filter_im_time, jquad)
197
198 ALLOCATE (diag_qomega(dimen_ri))
199
200 IF (unit_nr > 0) WRITE (unit_nr, '(/T3,A,1X,I3)') &
201 'GW_INFO| Computing chi and W frequency point', jquad
202
203 DO ikp = 1, nkp
204
205 ! parallization, we either have all kpoints on all processors or a single kpoint per group
206 do_this_ikp = (ikp_local == -1) .OR. (ikp_local == 0 .AND. ikp == 1) .OR. (ikp_local == ikp)
207 IF (.NOT. do_this_ikp) cycle
208
209 ! 1. remove all spurious negative eigenvalues from P(iw,k), multiplication Q(iw,k) = K^H(k)P(iw,k)K(k)
210 CALL compute_q_kp_rpa(cfm_mat_q, &
211 mat_p_omega_kp, &
212 cfm_mat_minv_l_kpoints(ikp), &
213 cfm_mat_ri_global_work, &
214 ikp, nkp, ikp_local, para_env, &
215 qs_env%mp2_env%ri_rpa_im_time%make_chi_pos_definite)
216
217 ! 2. Cholesky decomposition of Id + Q(iw,k)
218 CALL cholesky_decomp_q(cfm_mat_q, diag_qomega, dimen_ri)
219
220 ! 3. Computing E_c^RPA = E_c^RPA + a_w/N_k*sum_k ln[det(1+Q(iw,k))-Tr(Q(iw,k))]
221 CALL frequency_and_kpoint_integration(erpa, cfm_mat_q, para_env, diag_qomega, &
222 dimen_ri, grid%frequency_weights(jquad), kpoints%wkp(ikp))
223
224 IF (do_gw_im_time) THEN
225
226 ! compute S^-1*V*S^-1 for exchange part of the self-energy in real space as W in real space
227 IF (do_ri_sigma_x .AND. jquad == 1 .AND. count_ev_sc_gw == 1 .AND. do_kpoints_from_gamma) THEN
228
229 CALL dbcsr_set(mat_minvvminv%matrix, 0.0_dp)
230 CALL copy_fm_to_dbcsr(fm_matrix_minv_vtrunc_minv(1, 1), mat_minvvminv%matrix, keep_sparsity=.false.)
231
232 END IF
233 IF (do_kpoints_from_gamma) THEN
234 CALL compute_wc_real_space_tau_gw(fm_mat_w, cfm_mat_q, cfm_matrix_l_kpoints(ikp), &
235 dimen_ri, jquad, &
236 ikp, grid, &
237 ikp_local, para_env, kpoints, qs_env, wkp_w)
238 END IF
239
240 END IF
241 END DO
242
243 ! after the transform of (eps(iw)-1)^-1 from iw to it is done, multiply with V^1/2 to obtain W(it)
244 IF (do_gw_im_time .AND. do_kpoints_from_gamma .AND. jquad == num_integ_points) THEN
245 CALL wc_to_minv_wc_minv(fm_mat_w, fm_matrix_minv, para_env, dimen_ri, num_integ_points)
246 CALL deallocate_kp_matrices(cfm_matrix_l_kpoints, cfm_mat_minv_l_kpoints)
247 END IF
248
249 DEALLOCATE (diag_qomega)
250
251 t2 = m_walltime()
252
253 IF (unit_nr > 0) WRITE (unit_nr, '(T6,A,T56,F25.1)') 'Execution time (s):', t2 - t1
254
255 CALL timestop(handle)
256
258
259! **************************************************************************************************
260!> \brief ...
261!> \param cfm_matrix_L_kpoints ...
262!> \param cfm_mat_Minv_L_kpoints ...
263! **************************************************************************************************
264 SUBROUTINE deallocate_kp_matrices(cfm_matrix_L_kpoints, cfm_mat_Minv_L_kpoints)
265
266 TYPE(cp_cfm_type), ALLOCATABLE, DIMENSION(:) :: cfm_matrix_l_kpoints, &
267 cfm_mat_minv_l_kpoints
268
269 CHARACTER(LEN=*), PARAMETER :: routinen = 'deallocate_kp_matrices'
270
271 INTEGER :: handle, ikp
272
273 CALL timeset(routinen, handle)
274
275 IF (ALLOCATED(cfm_mat_minv_l_kpoints)) THEN
276 DO ikp = 1, SIZE(cfm_mat_minv_l_kpoints)
277 IF (ASSOCIATED(cfm_mat_minv_l_kpoints(ikp)%matrix_struct)) CALL cp_cfm_release(cfm_mat_minv_l_kpoints(ikp))
278 END DO
279 DEALLOCATE (cfm_mat_minv_l_kpoints)
280 END IF
281 IF (ALLOCATED(cfm_matrix_l_kpoints)) THEN
282 DO ikp = 1, SIZE(cfm_matrix_l_kpoints)
283 IF (ASSOCIATED(cfm_matrix_l_kpoints(ikp)%matrix_struct)) CALL cp_cfm_release(cfm_matrix_l_kpoints(ikp))
284 END DO
285 DEALLOCATE (cfm_matrix_l_kpoints)
286 END IF
287
288 CALL timestop(handle)
289
290 END SUBROUTINE deallocate_kp_matrices
291
292! **************************************************************************************************
293!> \brief ...
294!> \param cfm_mat_Q ...
295!> \param mat_P_omega_kp ...
296!> \param cfm_mat_L ...
297!> \param cfm_mat_RI_global_work ...
298!> \param ikp ...
299!> \param nkp ...
300!> \param ikp_local ...
301!> \param para_env ...
302!> \param make_chi_pos_definite ...
303! **************************************************************************************************
304 SUBROUTINE compute_q_kp_rpa(cfm_mat_Q, mat_P_omega_kp, cfm_mat_L, &
305 cfm_mat_RI_global_work, ikp, nkp, ikp_local, para_env, &
306 make_chi_pos_definite)
307
308 TYPE(cp_cfm_type) :: cfm_mat_q
309 TYPE(dbcsr_p_type), DIMENSION(:, :), INTENT(INOUT) :: mat_p_omega_kp
310 TYPE(cp_cfm_type) :: cfm_mat_l, cfm_mat_ri_global_work
311 INTEGER, INTENT(IN) :: ikp, nkp, ikp_local
312 TYPE(mp_para_env_type), POINTER :: para_env
313 LOGICAL, INTENT(IN) :: make_chi_pos_definite
314
315 CHARACTER(LEN=*), PARAMETER :: routinen = 'compute_Q_kp_RPA'
316
317 INTEGER :: handle
318
319 CALL timeset(routinen, handle)
320
321 ! 1. Convert the dbcsr matrix mat_P_omega_kp (that is chi(k,iw)) to a full matrix and
322 ! distribute it to subgroups
323 CALL mat_p_to_subgroup(mat_p_omega_kp, cfm_mat_ri_global_work, cfm_mat_q, ikp, nkp, ikp_local, para_env)
324
325 ! 2. Remove all negative eigenvalues from chi(k,iw)
326 IF (make_chi_pos_definite) THEN
327 CALL cp_cfm_power(cfm_mat_q, threshold=0.0_dp, exponent=1.0_dp)
328 END IF
329
330 ! Q(iw,k) = L^H(k)*P(iw,k)*L(k)
331 CALL cfm_contract_aba(cfm_mat_l, cfm_mat_q)
332
333 CALL timestop(handle)
334
335 END SUBROUTINE compute_q_kp_rpa
336
337! **************************************************************************************************
338!> \brief ...
339!> \param mat_P_omega_kp ...
340!> \param cfm_mat_RI_global_work ...
341!> \param cfm_mat_Q ...
342!> \param ikp ...
343!> \param nkp ...
344!> \param ikp_local ...
345!> \param para_env ...
346! **************************************************************************************************
347 SUBROUTINE mat_p_to_subgroup(mat_P_omega_kp, cfm_mat_RI_global_work, cfm_mat_Q, ikp, nkp, ikp_local, para_env)
348
349 TYPE(dbcsr_p_type), DIMENSION(:, :), INTENT(INOUT) :: mat_p_omega_kp
350 TYPE(cp_cfm_type), INTENT(INOUT) :: cfm_mat_ri_global_work, cfm_mat_q
351 INTEGER, INTENT(IN) :: ikp, nkp, ikp_local
352 TYPE(mp_para_env_type), POINTER :: para_env
353
354 CHARACTER(LEN=*), PARAMETER :: routinen = 'mat_P_to_subgroup'
355
356 INTEGER :: handle, jkp
357 TYPE(cp_cfm_type) :: cfm_dummy
358 TYPE(cp_fm_type) :: fm_mat_work
359 TYPE(dbcsr_type), POINTER :: mat_p_omega_im, mat_p_omega_re
360
361 CALL timeset(routinen, handle)
362
363 CALL cp_fm_create(fm_mat_work, cfm_mat_ri_global_work%matrix_struct)
364
365 DO jkp = 1, nkp
366 IF (ikp_local == -1 .AND. jkp /= ikp) cycle
367
368 mat_p_omega_re => mat_p_omega_kp(1, jkp)%matrix
369 CALL cp_fm_set_all(fm_mat_work, 0.0_dp)
370 CALL copy_dbcsr_to_fm(mat_p_omega_re, fm_mat_work)
371 CALL cp_fm_to_cfm(msourcer=fm_mat_work, mtarget=cfm_mat_ri_global_work)
372
373 mat_p_omega_im => mat_p_omega_kp(2, jkp)%matrix
374 CALL cp_fm_set_all(fm_mat_work, 0.0_dp)
375 CALL copy_dbcsr_to_fm(mat_p_omega_im, fm_mat_work)
376 CALL cp_cfm_scale_and_add_fm(z_one, cfm_mat_ri_global_work, gaussi, fm_mat_work)
377
378 IF (ikp_local /= -1) CALL para_env%sync()
379
380 IF (ikp_local == -1 .OR. ikp_local == jkp) THEN
381 CALL cp_cfm_copy_general(cfm_mat_ri_global_work, cfm_mat_q, para_env)
382 ELSE
383 CALL cp_cfm_copy_general(cfm_mat_ri_global_work, cfm_dummy, para_env)
384 END IF
385
386 IF (ikp_local /= -1) CALL para_env%sync()
387 END DO
388
389 CALL cp_fm_release(fm_mat_work)
390 CALL para_env%sync()
391
392 CALL timestop(handle)
393
394 END SUBROUTINE mat_p_to_subgroup
395
396! **************************************************************************************************
397!> \brief ...
398!> \param cfm_mat_Q ...
399!> \param diag_Qomega ...
400!> \param dimen_RI ...
401! **************************************************************************************************
402 SUBROUTINE cholesky_decomp_q(cfm_mat_Q, diag_Qomega, dimen_RI)
403
404 TYPE(cp_cfm_type), INTENT(INOUT) :: cfm_mat_q
405 REAL(kind=dp), DIMENSION(:), INTENT(OUT) :: diag_qomega
406 INTEGER, INTENT(IN) :: dimen_ri
407
408 CHARACTER(LEN=*), PARAMETER :: routinen = 'cholesky_decomp_Q'
409
410 INTEGER :: handle, info_chol
411 COMPLEX(KIND=dp), DIMENSION(dimen_RI) :: diag_q
412
413 CALL timeset(routinen, handle)
414
415 ! epsilon = I + Q; the Hermitian Q has a real diagonal for the RPA energy.
416 CALL cp_cfm_get_diag(cfm_mat_q, diag_q, n_active=dimen_ri)
417 diag_qomega = real(diag_q, kind=dp)
418 CALL cp_cfm_add_on_diag(cfm_mat_q, z_one, n_active=dimen_ri)
419
420 CALL cp_cfm_cholesky_decompose(matrix=cfm_mat_q, n=dimen_ri, info_out=info_chol)
421
422 cpassert(info_chol == 0)
423
424 CALL timestop(handle)
425
426 END SUBROUTINE cholesky_decomp_q
427
428! **************************************************************************************************
429!> \brief ...
430!> \param Erpa ...
431!> \param cfm_mat_Q ...
432!> \param para_env ...
433!> \param diag_Qomega ...
434!> \param dimen_RI ...
435!> \param freq_weight ...
436!> \param kp_weight ...
437! **************************************************************************************************
438 SUBROUTINE frequency_and_kpoint_integration(Erpa, cfm_mat_Q, para_env, diag_Qomega, &
439 dimen_RI, freq_weight, kp_weight)
440
441 REAL(kind=dp), INTENT(INOUT) :: erpa
442 TYPE(cp_cfm_type), INTENT(IN) :: cfm_mat_q
443 TYPE(mp_para_env_type), INTENT(IN) :: para_env
444 REAL(kind=dp), DIMENSION(:), INTENT(IN) :: diag_qomega
445 INTEGER, INTENT(IN) :: dimen_ri
446 REAL(kind=dp), INTENT(IN) :: freq_weight, kp_weight
447
448 CHARACTER(LEN=*), PARAMETER :: routinen = 'frequency_and_kpoint_integration'
449
450 INTEGER :: handle, iib
451 COMPLEX(KIND=dp), DIMENSION(dimen_RI) :: diag_chol
452 REAL(kind=dp) :: fcomega
453 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: q_log
454
455 CALL timeset(routinen, handle)
456
457 ALLOCATE (q_log(dimen_ri))
458 ! epsilon = U^H U; log(det(epsilon)) = 2*sum(log(real(U_ii))).
459 CALL cp_cfm_get_diag(cfm_mat_q, diag_chol, n_active=dimen_ri)
460 q_log(:) = 2.0_dp*log(real(diag_chol, kind=dp))
461
462 fcomega = 0.0_dp
463 DO iib = 1, dimen_ri
464 IF (modulo(iib, para_env%num_pe) /= para_env%mepos) cycle
465 fcomega = fcomega + (q_log(iib) - diag_qomega(iib))/2.0_dp
466 END DO
467
468 erpa = erpa + fcomega*freq_weight*kp_weight
469
470 DEALLOCATE (q_log)
471
472 CALL timestop(handle)
473
474 END SUBROUTINE frequency_and_kpoint_integration
475
476! **************************************************************************************************
477!> \brief Split a real Gamma matrix among nearest images using normalized equal weights.
478!> \param mat_P_omega ...
479!> \param qs_env ...
480!> \param kpoints ...
481!> \param jquad ...
482!> \param unit_nr ...
483! **************************************************************************************************
484 SUBROUTINE get_mat_cell_t_from_mat_gamma(mat_P_omega, qs_env, kpoints, jquad, unit_nr)
485 TYPE(dbcsr_p_type), DIMENSION(:), INTENT(IN) :: mat_p_omega
486 TYPE(qs_environment_type), POINTER :: qs_env
487 TYPE(kpoint_type), POINTER :: kpoints
488 INTEGER, INTENT(IN) :: jquad, unit_nr
489
490 CHARACTER(LEN=*), PARAMETER :: routinen = 'get_mat_cell_T_from_mat_gamma'
491
492 INTEGER :: col, handle, i_cell, num_cells_p, row
493 INTEGER, DIMENSION(3) :: periodic
494 INTEGER, DIMENSION(:, :), POINTER :: index_to_cell_p
495 LOGICAL :: found
496 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: weights
497 REAL(kind=dp), DIMENSION(:, :), POINTER :: data_block, image_block
498 TYPE(cell_type), POINTER :: cell
499 TYPE(dbcsr_iterator_type) :: iter
500 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
501
502 CALL timeset(routinen, handle)
503
504 NULLIFY (cell, particle_set)
505 CALL get_qs_env(qs_env, cell=cell, particle_set=particle_set)
506 CALL get_cell(cell=cell, periodic=periodic)
507
508 ! Nearest-neighbour candidate cells depend on periodicity, not on the target k-point mesh.
509 CALL init_cell_index_rpa(2*periodic + 1, kpoints%cell_to_index, kpoints%index_to_cell, cell)
510 index_to_cell_p => kpoints%index_to_cell
511 num_cells_p = SIZE(index_to_cell_p, 2)
512 cpassert(SIZE(mat_p_omega) >= num_cells_p)
513 ALLOCATE (weights(num_cells_p))
514
515 DO i_cell = 2, num_cells_p
516 CALL dbcsr_copy(mat_p_omega(i_cell)%matrix, mat_p_omega(1)%matrix)
517 END DO
518
519 IF (jquad == 1 .AND. unit_nr > 0) THEN
520 WRITE (unit_nr, '(T3,A,T66,ES15.2)') 'GW_INFO| RI regularization parameter: ', &
521 qs_env%mp2_env%ri_rpa_im_time%regularization_RI
522 WRITE (unit_nr, '(T3,A,T66,ES15.2)') 'GW_INFO| eps_eigval_S: ', &
523 qs_env%mp2_env%ri_rpa_im_time%eps_eigval_S
524 IF (qs_env%mp2_env%ri_rpa_im_time%make_chi_pos_definite) THEN
525 WRITE (unit_nr, '(T3,A,T81)') &
526 'GW_INFO| Make chi(iw,k) positive definite? TRUE'
527 ELSE
528 WRITE (unit_nr, '(T3,A,T81)') &
529 'GW_INFO| Make chi(iw,k) positive definite? FALSE'
530 END IF
531 END IF
532
533 CALL dbcsr_iterator_start(iter, mat_p_omega(1)%matrix)
534 DO WHILE (dbcsr_iterator_blocks_left(iter))
535 CALL dbcsr_iterator_next_block(iter, row, col, data_block)
536 CALL minimum_image_weights(particle_set(row)%r, particle_set(col)%r, &
537 cell, index_to_cell_p, weights)
538 ! Keep the Gamma block unchanged until its contributions to all other images are copied.
539 DO i_cell = num_cells_p, 1, -1
540 CALL dbcsr_get_block_p(matrix=mat_p_omega(i_cell)%matrix, row=row, col=col, &
541 block=image_block, found=found)
542 cpassert(found)
543 image_block = weights(i_cell)*data_block
544 END DO
545 END DO
546 CALL dbcsr_iterator_stop(iter)
547
548 CALL timestop(handle)
549
550 END SUBROUTINE get_mat_cell_t_from_mat_gamma
551
552! **************************************************************************************************
553!> \brief ...
554!> \param mat_P_omega ...
555!> \param mat_P_omega_kp ...
556!> \param kpoints ...
557!> \param eps_filter_im_time ...
558!> \param jquad ...
559! **************************************************************************************************
560 SUBROUTINE transform_p_from_real_space_to_kpoints(mat_P_omega, mat_P_omega_kp, &
561 kpoints, eps_filter_im_time, jquad)
562
563 TYPE(dbcsr_p_type), DIMENSION(:, :), INTENT(INOUT) :: mat_p_omega, mat_p_omega_kp
564 TYPE(kpoint_type), POINTER :: kpoints
565 REAL(kind=dp), INTENT(IN) :: eps_filter_im_time
566 INTEGER, INTENT(IN) :: jquad
567
568 CHARACTER(LEN=*), PARAMETER :: routinen = 'transform_P_from_real_space_to_kpoints'
569
570 INTEGER :: handle, icell, nkp, num_integ_points
571
572 CALL timeset(routinen, handle)
573
574 num_integ_points = SIZE(mat_p_omega, 1)
575 nkp = SIZE(mat_p_omega, 2)
576
577 CALL real_space_to_kpoint_transform_rpa(mat_p_omega_kp(1, :), mat_p_omega_kp(2, :), mat_p_omega(jquad, :), &
578 kpoints, eps_filter_im_time)
579
580 DO icell = 1, SIZE(mat_p_omega, 2)
581 CALL dbcsr_set(mat_p_omega(jquad, icell)%matrix, 0.0_dp)
582 CALL dbcsr_filter(mat_p_omega(jquad, icell)%matrix, 1.0_dp)
583 END DO
584
585 CALL timestop(handle)
586
587 END SUBROUTINE transform_p_from_real_space_to_kpoints
588
589! **************************************************************************************************
590!> \brief ...
591!> \param real_mat_kp ...
592!> \param imag_mat_kp ...
593!> \param mat_real_space ...
594!> \param kpoints ...
595!> \param eps_filter_im_time ...
596!> \param real_mat_real_space ...
597! **************************************************************************************************
598 SUBROUTINE real_space_to_kpoint_transform_rpa(real_mat_kp, imag_mat_kp, mat_real_space, &
599 kpoints, eps_filter_im_time, real_mat_real_space)
600
601 TYPE(dbcsr_p_type), DIMENSION(:), INTENT(INOUT) :: real_mat_kp, imag_mat_kp, mat_real_space
602 TYPE(kpoint_type), POINTER :: kpoints
603 REAL(kind=dp), INTENT(IN) :: eps_filter_im_time
604 LOGICAL, INTENT(IN), OPTIONAL :: real_mat_real_space
605
606 CHARACTER(LEN=*), PARAMETER :: routinen = 'real_space_to_kpoint_transform_rpa'
607
608 INTEGER :: handle, i_cell, ik, nkp, num_cells
609 INTEGER, DIMENSION(3) :: cell
610 INTEGER, DIMENSION(:, :), POINTER :: index_to_cell
611 LOGICAL :: my_real_mat_real_space
612 REAL(kind=dp) :: arg, coskl, sinkl
613 REAL(kind=dp), DIMENSION(:, :), POINTER :: xkp
614 TYPE(dbcsr_type) :: mat_work
615
616 CALL timeset(routinen, handle)
617
618 my_real_mat_real_space = .true.
619 IF (PRESENT(real_mat_real_space)) my_real_mat_real_space = real_mat_real_space
620
621 CALL dbcsr_create(matrix=mat_work, &
622 template=real_mat_kp(1)%matrix, &
623 matrix_type=dbcsr_type_no_symmetry)
624 CALL dbcsr_reserve_all_blocks(mat_work)
625 CALL dbcsr_set(mat_work, 0.0_dp)
626
627 ! this kpoint environme t should be the kpoints for D(it) and X(it) created in init_cell_index_rpa
628 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp)
629
630 NULLIFY (index_to_cell)
631 index_to_cell => kpoints%index_to_cell
632
633 num_cells = SIZE(index_to_cell, 2)
634
635 cpassert(SIZE(mat_real_space) >= num_cells/2 + 1)
636
637 DO ik = 1, nkp
638
639 CALL dbcsr_reserve_all_blocks(real_mat_kp(ik)%matrix)
640 CALL dbcsr_reserve_all_blocks(imag_mat_kp(ik)%matrix)
641
642 CALL dbcsr_set(real_mat_kp(ik)%matrix, 0.0_dp)
643 CALL dbcsr_set(imag_mat_kp(ik)%matrix, 0.0_dp)
644
645 DO i_cell = 1, num_cells/2 + 1
646
647 cell(:) = index_to_cell(:, i_cell)
648
649 arg = real(cell(1), dp)*xkp(1, ik) + real(cell(2), dp)*xkp(2, ik) + real(cell(3), dp)*xkp(3, ik)
650 coskl = cos(twopi*arg)
651 sinkl = sin(twopi*arg)
652
653 IF (my_real_mat_real_space) THEN
654 CALL dbcsr_add_local(real_mat_kp(ik)%matrix, mat_real_space(i_cell)%matrix, 1.0_dp, coskl)
655 CALL dbcsr_add_local(imag_mat_kp(ik)%matrix, mat_real_space(i_cell)%matrix, 1.0_dp, sinkl)
656 ELSE
657 CALL dbcsr_add_local(real_mat_kp(ik)%matrix, mat_real_space(i_cell)%matrix, 1.0_dp, -sinkl)
658 CALL dbcsr_add_local(imag_mat_kp(ik)%matrix, mat_real_space(i_cell)%matrix, 1.0_dp, coskl)
659 END IF
660
661 IF (.NOT. (cell(1) == 0 .AND. cell(2) == 0 .AND. cell(3) == 0)) THEN
662
663 CALL dbcsr_transposed(mat_work, mat_real_space(i_cell)%matrix)
664
665 IF (my_real_mat_real_space) THEN
666 CALL dbcsr_add_local(real_mat_kp(ik)%matrix, mat_work, 1.0_dp, coskl)
667 CALL dbcsr_add_local(imag_mat_kp(ik)%matrix, mat_work, 1.0_dp, -sinkl)
668 ELSE
669 ! for an imaginary real-space matrix, we need to consider the imaginary unit
670 ! and we need to take into account that the transposed gives an extra "-" sign
671 ! because the transposed is actually Hermitian conjugate
672 CALL dbcsr_add_local(real_mat_kp(ik)%matrix, mat_work, 1.0_dp, -sinkl)
673 CALL dbcsr_add_local(imag_mat_kp(ik)%matrix, mat_work, 1.0_dp, -coskl)
674 END IF
675
676 CALL dbcsr_set(mat_work, 0.0_dp)
677
678 END IF
679
680 END DO
681
682 CALL dbcsr_filter(real_mat_kp(ik)%matrix, eps_filter_im_time)
683 CALL dbcsr_filter(imag_mat_kp(ik)%matrix, eps_filter_im_time)
684
685 END DO
686
687 CALL dbcsr_release(mat_work)
688
689 CALL timestop(handle)
690
692
693! **************************************************************************************************
694!> \brief ...
695!> \param mat_a ...
696!> \param mat_b ...
697!> \param alpha ...
698!> \param beta ...
699! **************************************************************************************************
700 SUBROUTINE dbcsr_add_local(mat_a, mat_b, alpha, beta)
701 TYPE(dbcsr_type), INTENT(INOUT) :: mat_a, mat_b
702 REAL(kind=dp), INTENT(IN) :: alpha, beta
703
704 INTEGER :: col, row
705 LOGICAL :: found
706 REAL(kind=dp), DIMENSION(:, :), POINTER :: block_to_compute, data_block
707 TYPE(dbcsr_iterator_type) :: iter
708
709 CALL dbcsr_iterator_start(iter, mat_b)
710 DO WHILE (dbcsr_iterator_blocks_left(iter))
711 CALL dbcsr_iterator_next_block(iter, row, col, data_block)
712
713 NULLIFY (block_to_compute)
714 CALL dbcsr_get_block_p(matrix=mat_a, &
715 row=row, col=col, block=block_to_compute, found=found)
716
717 cpassert(found)
718
719 block_to_compute(:, :) = alpha*block_to_compute(:, :) + beta*data_block(:, :)
720
721 END DO
722 CALL dbcsr_iterator_stop(iter)
723
724 END SUBROUTINE dbcsr_add_local
725
726! **************************************************************************************************
727!> \brief ...
728!> \param fm_mat_W_tau ...
729!> \param cfm_mat_Q ...
730!> \param cfm_mat_L ...
731!> \param dimen_RI ...
732!> \param jquad ...
733!> \param ikp ...
734!> \param grid ...
735!> \param ikp_local ...
736!> \param para_env ...
737!> \param kpoints ...
738!> \param qs_env ...
739!> \param wkp_W ...
740! **************************************************************************************************
741 SUBROUTINE compute_wc_real_space_tau_gw(fm_mat_W_tau, cfm_mat_Q, cfm_mat_L, &
742 dimen_RI, jquad, &
743 ikp, grid, ikp_local, &
744 para_env, kpoints, qs_env, wkp_W)
745
746 TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: fm_mat_w_tau
747 TYPE(cp_cfm_type), INTENT(INOUT) :: cfm_mat_q
748 TYPE(cp_cfm_type), INTENT(IN) :: cfm_mat_l
749 INTEGER, INTENT(IN) :: dimen_ri, jquad, ikp
750 TYPE(time_frequency_grid_type), INTENT(IN) :: grid
751 INTEGER, INTENT(IN) :: ikp_local
752 TYPE(mp_para_env_type), INTENT(IN), POINTER :: para_env
753 TYPE(kpoint_type), INTENT(IN), POINTER :: kpoints
754 TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
755 REAL(kind=dp), DIMENSION(:), INTENT(IN) :: wkp_w
756
757 CHARACTER(LEN=*), PARAMETER :: routinen = 'compute_Wc_real_space_tau_GW'
758
759 INTEGER :: handle, handle2, iatom, iatom_old, iquad, irow, jatom, jatom_old, jcol, jkp, &
760 ncol_local, nkp, nrow_local, num_cells, num_integ_points
761 INTEGER, ALLOCATABLE, DIMENSION(:) :: atom_from_ri_index
762 INTEGER, DIMENSION(:), POINTER :: col_indices, row_indices
763 INTEGER, DIMENSION(:, :), POINTER :: index_to_cell
764 REAL(kind=dp) :: contribution, weight, weight_im, &
765 weight_re
766 REAL(kind=dp), DIMENSION(3, 3) :: hmat
767 REAL(kind=dp), DIMENSION(:), POINTER :: wkp
768 REAL(kind=dp), DIMENSION(:, :), POINTER :: xkp
769 TYPE(cell_type), POINTER :: cell
770 TYPE(cp_cfm_type) :: cfm_mat_work_2
771 TYPE(cp_fm_type) :: fm_dummy, fm_mat_work_global, &
772 fm_mat_work_local
773 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
774
775 CALL timeset(routinen, handle)
776
777 num_integ_points = SIZE(grid%imaginary_time)
778
779 CALL timeset(routinen//"_1", handle2)
780
781 CALL cp_cfm_create(cfm_mat_work_2, cfm_mat_q%matrix_struct)
782 CALL cp_cfm_set_all(cfm_mat_work_2, z_zero)
783
784 CALL cp_fm_create(fm_mat_work_global, fm_mat_w_tau(1)%matrix_struct)
785 CALL cp_fm_set_all(fm_mat_work_global, 0.0_dp)
786
787 CALL cp_fm_create(fm_mat_work_local, cfm_mat_q%matrix_struct)
788 CALL cp_fm_set_all(fm_mat_work_local, 0.0_dp)
789
790 CALL timestop(handle2)
791
792 CALL timeset(routinen//"_2", handle2)
793
794 CALL cfm_screened_interaction_from_eps_cholesky(cfm_mat_q, cfm_mat_l, cfm_mat_work_2, dimen_ri)
795
796 CALL timestop(handle2)
797
798 CALL timeset(routinen//"_4", handle2)
799
800 CALL get_kpoint_info(kpoints, xkp=xkp, wkp=wkp, nkp=nkp)
801 index_to_cell => kpoints%index_to_cell
802 num_cells = SIZE(index_to_cell, 2)
803
804 ALLOCATE (atom_from_ri_index(dimen_ri))
805
806 CALL get_atom_index_from_basis_function_index(qs_env, atom_from_ri_index, dimen_ri, "RI_AUX")
807
808 NULLIFY (cell, particle_set)
809 CALL get_qs_env(qs_env, cell=cell, particle_set=particle_set)
810 CALL get_cell(cell=cell, h=hmat)
811 iatom_old = 0
812 jatom_old = 0
813
814 CALL cp_cfm_get_info(matrix=cfm_mat_q, &
815 nrow_local=nrow_local, &
816 ncol_local=ncol_local, &
817 row_indices=row_indices, &
818 col_indices=col_indices)
819
820 DO irow = 1, nrow_local
821 DO jcol = 1, ncol_local
822
823 iatom = atom_from_ri_index(row_indices(irow))
824 jatom = atom_from_ri_index(col_indices(jcol))
825
826 IF (iatom /= iatom_old .OR. jatom /= jatom_old) THEN
827
828 ! symmetrize=.FALSE. necessary since we already have a symmetrized index_to_cell
829 CALL compute_weight_re_im(weight_re, weight_im, &
830 num_cells, iatom, jatom, xkp(1:3, ikp), wkp_w(ikp), &
831 cell, index_to_cell, hmat, particle_set)
832
833 iatom_old = iatom
834 jatom_old = jatom
835
836 END IF
837
838 contribution = weight_re*real(cfm_mat_work_2%local_data(irow, jcol)) + &
839 weight_im*aimag(cfm_mat_work_2%local_data(irow, jcol))
840
841 fm_mat_work_local%local_data(irow, jcol) = fm_mat_work_local%local_data(irow, jcol) + contribution
842
843 END DO
844 END DO
845
846 CALL timestop(handle2)
847
848 CALL timeset(routinen//"_5", handle2)
849
850 IF (ikp_local == -1) THEN
851
852 CALL cp_fm_copy_general(fm_mat_work_local, fm_mat_work_global, para_env)
853
854 DO iquad = 1, num_integ_points
855
856 weight = grid%cosine_frequency_to_time(iquad, jquad)
857
858 IF (jquad == 1 .AND. ikp == 1) THEN
859 CALL cp_fm_set_all(matrix=fm_mat_w_tau(iquad), alpha=0.0_dp)
860 END IF
861
862 CALL cp_fm_scale_and_add(alpha=1.0_dp, matrix_a=fm_mat_w_tau(iquad), beta=weight, matrix_b=fm_mat_work_global)
863
864 END DO
865
866 ELSE
867
868 DO jkp = 1, nkp
869
870 CALL para_env%sync()
871
872 IF (ikp_local == jkp) THEN
873 CALL cp_fm_copy_general(fm_mat_work_local, fm_mat_work_global, para_env)
874 ELSE
875 CALL cp_fm_copy_general(fm_dummy, fm_mat_work_global, para_env)
876 END IF
877
878 CALL para_env%sync()
879
880 DO iquad = 1, num_integ_points
881
882 weight = grid%cosine_frequency_to_time(iquad, jquad)
883
884 IF (jquad == 1 .AND. jkp == 1) THEN
885 CALL cp_fm_set_all(matrix=fm_mat_w_tau(iquad), alpha=0.0_dp)
886 END IF
887
888 CALL cp_fm_scale_and_add(alpha=1.0_dp, matrix_a=fm_mat_w_tau(iquad), beta=weight, &
889 matrix_b=fm_mat_work_global)
890
891 END DO
892
893 END DO
894
895 END IF
896
897 CALL cp_cfm_release(cfm_mat_work_2)
898 CALL cp_fm_release(fm_mat_work_global)
899 CALL cp_fm_release(fm_mat_work_local)
900
901 DEALLOCATE (atom_from_ri_index)
902
903 CALL timestop(handle2)
904
905 CALL timestop(handle)
906
907 END SUBROUTINE compute_wc_real_space_tau_gw
908
909! **************************************************************************************************
910!> \brief ...
911!> \param fm_mat_W ...
912!> \param fm_matrix_Minv ...
913!> \param para_env ...
914!> \param dimen_RI ...
915!> \param num_integ_points ...
916! **************************************************************************************************
917 SUBROUTINE wc_to_minv_wc_minv(fm_mat_W, fm_matrix_Minv, para_env, dimen_RI, num_integ_points)
918 TYPE(cp_fm_type), DIMENSION(:) :: fm_mat_w
919 TYPE(cp_fm_type), DIMENSION(:, :) :: fm_matrix_minv
920 TYPE(mp_para_env_type), INTENT(IN), POINTER :: para_env
921 INTEGER :: dimen_ri, num_integ_points
922
923 CHARACTER(LEN=*), PARAMETER :: routinen = 'Wc_to_Minv_Wc_Minv'
924
925 INTEGER :: handle, jquad
926 TYPE(cp_fm_type) :: fm_work_minv, fm_work_minv_w
927
928 CALL timeset(routinen, handle)
929
930 CALL cp_fm_create(fm_work_minv, fm_mat_w(1)%matrix_struct)
931 CALL cp_fm_copy_general(fm_matrix_minv(1, 1), fm_work_minv, para_env)
932
933 CALL cp_fm_create(fm_work_minv_w, fm_mat_w(1)%matrix_struct)
934
935 DO jquad = 1, num_integ_points
936
937 CALL parallel_gemm('N', 'N', dimen_ri, dimen_ri, dimen_ri, 1.0_dp, fm_work_minv, fm_mat_w(jquad), &
938 0.0_dp, fm_work_minv_w)
939 CALL parallel_gemm('N', 'N', dimen_ri, dimen_ri, dimen_ri, 1.0_dp, fm_work_minv_w, fm_work_minv, &
940 0.0_dp, fm_mat_w(jquad))
941
942 END DO
943
944 CALL cp_fm_release(fm_work_minv)
945
946 CALL cp_fm_release(fm_work_minv_w)
947
948 CALL timestop(handle)
949
950 END SUBROUTINE wc_to_minv_wc_minv
951
952! **************************************************************************************************
953!> \brief ...
954!> \param qs_env ...
955!> \param wkp_W ...
956!> \param wkp_V ...
957!> \param kpoints ...
958!> \param h_inv ...
959!> \param periodic ...
960! **************************************************************************************************
961 SUBROUTINE compute_wkp_w(qs_env, wkp_W, wkp_V, kpoints, h_inv, periodic)
962
963 TYPE(qs_environment_type), POINTER :: qs_env
964 REAL(kind=dp), ALLOCATABLE, DIMENSION(:), &
965 INTENT(OUT) :: wkp_w, wkp_v
966 TYPE(kpoint_type), POINTER :: kpoints
967 REAL(kind=dp), DIMENSION(3, 3) :: h_inv
968 INTEGER, DIMENSION(3) :: periodic
969
970 CHARACTER(LEN=*), PARAMETER :: routinen = 'compute_wkp_W'
971
972 INTEGER :: handle, i_x, ikp, info, j_y, k_z, &
973 kpoint_weights_w_method, n_x, n_y, &
974 n_z, nkp, nsuperfine, num_lin_eqs
975 REAL(kind=dp) :: exp_kpoints, integral, k_sq, weight
976 REAL(kind=dp), DIMENSION(3) :: k_vec, x_vec
977 REAL(kind=dp), DIMENSION(:), POINTER :: right_side, wkp, wkp_tmp
978 REAL(kind=dp), DIMENSION(:, :), POINTER :: matrix_lin_eqs, xkp
979
980 CALL timeset(routinen, handle)
981
982 kpoint_weights_w_method = qs_env%mp2_env%ri_rpa_im_time%kpoint_weights_W_method
983
984 CALL get_kpoint_info(kpoints, xkp=xkp, wkp=wkp, nkp=nkp)
985
986 ! we determine the kpoint weights of the Monkhors Pack mesh new
987 ! such that the functions 1/k^2, 1/k and const are integrated exactly
988 ! in the Brillouin zone
989 ! this is done by minimizing sum_i |w_i|^2 where w_i are the weights of
990 ! the i-th kpoint under the following constraints:
991 ! 1) 1/k^2, 1/k and const are integrated exactly
992 ! 2) the kpoint weights of kpoints with identical absolute value are
993 ! the same, of e.g. (1/8,3/8,3/8) same weight as for (3/8,1/8,3/8)
994 ! for 1d and 2d materials: we use ordinary Monkhorst-Pack weights, checked
995 ! by SUM(periodic) == 3
996 ALLOCATE (wkp_v(nkp), wkp_w(nkp))
997
998 ! for exchange part of self-energy, we use truncated Coulomb operator that should be fine
999 ! with uniform weights (without k-point extrapolation)
1000 IF (ALLOCATED(qs_env%mp2_env%ri_rpa_im_time%wkp_V)) THEN
1001 wkp_v(:) = qs_env%mp2_env%ri_rpa_im_time%wkp_V(:)
1002 ELSE
1003 wkp_v(:) = wkp(:)
1004 END IF
1005
1006 IF (kpoint_weights_w_method == kp_weights_w_uniform) THEN
1007
1008 ! in the k-point weights wkp, there might be k-point extrapolation included
1009 wkp_w(:) = wkp(:)
1010
1011 ELSE IF (kpoint_weights_w_method == kp_weights_w_tailored .OR. &
1012 kpoint_weights_w_method == kp_weights_w_auto) THEN
1013
1014 IF (kpoint_weights_w_method == kp_weights_w_tailored) THEN
1015 exp_kpoints = qs_env%mp2_env%ri_rpa_im_time%exp_tailored_weights
1016 END IF
1017
1018 IF (kpoint_weights_w_method == kp_weights_w_auto) THEN
1019 IF (sum(periodic) == 2) exp_kpoints = -1.0_dp
1020 END IF
1021
1022 ! first, compute the integral of f(k)=1/k^2 and 1/k on super fine grid
1023 nsuperfine = 500
1024 integral = 0.0_dp
1025
1026 IF (periodic(1) == 1) THEN
1027 n_x = nsuperfine
1028 ELSE
1029 n_x = 1
1030 END IF
1031 IF (periodic(2) == 1) THEN
1032 n_y = nsuperfine
1033 ELSE
1034 n_y = 1
1035 END IF
1036 IF (periodic(3) == 1) THEN
1037 n_z = nsuperfine
1038 ELSE
1039 n_z = 1
1040 END IF
1041
1042 ! actually, there is the factor *det_3x3(h_inv) missing to account for the
1043 ! integration volume but for wkp det_3x3(h_inv) is needed
1044 weight = 1.0_dp/(real(n_x, dp)*real(n_y, dp)*real(n_z, dp))
1045 DO i_x = 1, n_x
1046 DO j_y = 1, n_y
1047 DO k_z = 1, n_z
1048
1049 IF (periodic(1) == 1) THEN
1050 x_vec(1) = (real(i_x - nsuperfine/2, dp) - 0.5_dp)/real(nsuperfine, dp)
1051 ELSE
1052 x_vec(1) = 0.0_dp
1053 END IF
1054 IF (periodic(2) == 1) THEN
1055 x_vec(2) = (real(j_y - nsuperfine/2, dp) - 0.5_dp)/real(nsuperfine, dp)
1056 ELSE
1057 x_vec(2) = 0.0_dp
1058 END IF
1059 IF (periodic(3) == 1) THEN
1060 x_vec(3) = (real(k_z - nsuperfine/2, dp) - 0.5_dp)/real(nsuperfine, dp)
1061 ELSE
1062 x_vec(3) = 0.0_dp
1063 END IF
1064
1065 k_vec = matmul(h_inv(1:3, 1:3), x_vec)
1066 k_sq = k_vec(1)**2 + k_vec(2)**2 + k_vec(3)**2
1067 integral = integral + weight*k_sq**(exp_kpoints*0.5_dp)
1068
1069 END DO
1070 END DO
1071 END DO
1072
1073 num_lin_eqs = nkp + 2
1074
1075 ALLOCATE (matrix_lin_eqs(num_lin_eqs, num_lin_eqs))
1076 matrix_lin_eqs(:, :) = 0.0_dp
1077
1078 DO ikp = 1, nkp
1079
1080 k_vec = matmul(h_inv(1:3, 1:3), xkp(1:3, ikp))
1081 k_sq = k_vec(1)**2 + k_vec(2)**2 + k_vec(3)**2
1082
1083 matrix_lin_eqs(ikp, ikp) = 2.0_dp
1084 matrix_lin_eqs(ikp, nkp + 1) = 1.0_dp
1085 matrix_lin_eqs(nkp + 1, ikp) = 1.0_dp
1086
1087 matrix_lin_eqs(ikp, nkp + 2) = k_sq**(exp_kpoints*0.5_dp)
1088 matrix_lin_eqs(nkp + 2, ikp) = k_sq**(exp_kpoints*0.5_dp)
1089
1090 END DO
1091
1092 CALL invmat(matrix_lin_eqs, info)
1093 ! check whether inversion was successful
1094 cpassert(info == 0)
1095
1096 ALLOCATE (right_side(num_lin_eqs))
1097 right_side = 0.0_dp
1098 right_side(nkp + 1) = 1.0_dp
1099 ! divide integral by two because CP2K k-mesh already considers symmetry k <-> -k
1100 right_side(nkp + 2) = integral
1101
1102 ALLOCATE (wkp_tmp(num_lin_eqs))
1103
1104 wkp_tmp(1:num_lin_eqs) = matmul(matrix_lin_eqs, right_side)
1105
1106 wkp_w(1:nkp) = wkp_tmp(1:nkp)
1107
1108 DEALLOCATE (matrix_lin_eqs, right_side, wkp_tmp)
1109
1110 END IF
1111
1112 CALL timestop(handle)
1113
1114 END SUBROUTINE compute_wkp_w
1115
1116! **************************************************************************************************
1117!> \brief ...
1118!> \param qs_env ...
1119!> \param Eigenval_kp ...
1120! **************************************************************************************************
1121 SUBROUTINE get_bandstruc_and_k_dependent_mos(qs_env, Eigenval_kp)
1122 TYPE(qs_environment_type), POINTER :: qs_env
1123 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :, :) :: eigenval_kp
1124
1125 CHARACTER(LEN=*), PARAMETER :: routinen = 'get_bandstruc_and_k_dependent_MOs'
1126
1127 INTEGER :: handle, ikp, ispin, nmo, nspins
1128 INTEGER, DIMENSION(3) :: nkp_grid_g
1129 REAL(kind=dp), DIMENSION(:), POINTER :: ev
1130 REAL(kind=dp), DIMENSION(:, :), POINTER :: kpgeneral
1131 TYPE(kpoint_type), POINTER :: kpoints_sigma
1132 TYPE(mp_para_env_type), POINTER :: para_env
1133
1134 CALL timeset(routinen, handle)
1135
1136 NULLIFY (qs_env%mp2_env%ri_rpa_im_time%kpoints_G, &
1137 qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma, &
1138 qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma_no_xc, &
1139 para_env)
1140
1141 nkp_grid_g(1:3) = [1, 1, 1]
1142
1143 CALL get_qs_env(qs_env=qs_env, para_env=para_env)
1144
1145 CALL create_kp_and_calc_kp_orbitals(qs_env, qs_env%mp2_env%ri_rpa_im_time%kpoints_G, &
1146 "MONKHORST-PACK", para_env%num_pe, &
1147 mp_grid=nkp_grid_g(1:3))
1148
1149 IF (qs_env%mp2_env%ri_g0w0%do_kpoints_Sigma) THEN
1150
1151 ! set up k-points for GW band structure calculation, will be completed later
1152 CALL get_kpgeneral_for_sigma_kpoints(qs_env, kpgeneral)
1153
1154 CALL create_kp_and_calc_kp_orbitals(qs_env, qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma, &
1155 "GENERAL", para_env%num_pe, &
1156 kpgeneral=kpgeneral)
1157
1158 CALL create_kp_and_calc_kp_orbitals(qs_env, qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma_no_xc, &
1159 "GENERAL", para_env%num_pe, &
1160 kpgeneral=kpgeneral, with_xc_terms=.false.)
1161
1162 kpoints_sigma => qs_env%mp2_env%ri_rpa_im_time%kpoints_Sigma
1163 nmo = SIZE(eigenval_kp, 1)
1164 nspins = SIZE(eigenval_kp, 3)
1165
1166 ALLOCATE (qs_env%mp2_env%ri_rpa_im_time%Eigenval_Gamma(nmo))
1167 qs_env%mp2_env%ri_rpa_im_time%Eigenval_Gamma(:) = eigenval_kp(:, 1, 1)
1168
1169 DEALLOCATE (eigenval_kp)
1170
1171 ALLOCATE (eigenval_kp(nmo, kpoints_sigma%nkp, nspins))
1172
1173 DO ikp = 1, kpoints_sigma%nkp
1174
1175 DO ispin = 1, nspins
1176
1177 ev => kpoints_sigma%kp_env(ikp)%kpoint_env%mos(ispin)%eigenvalues
1178
1179 eigenval_kp(:, ikp, ispin) = ev(:)
1180
1181 END DO
1182
1183 END DO
1184
1185 DEALLOCATE (kpgeneral)
1186
1187 END IF
1188
1189 CALL release_hfx_stuff(qs_env)
1190
1191 CALL timestop(handle)
1192
1194
1195! **************************************************************************************************
1196!> \brief releases part of the given qs_env in order to save memory
1197!> \param qs_env the object to release
1198! **************************************************************************************************
1199 SUBROUTINE release_hfx_stuff(qs_env)
1200 TYPE(qs_environment_type), POINTER :: qs_env
1201
1202 IF (ASSOCIATED(qs_env%x_data) .AND. .NOT. qs_env%mp2_env%ri_g0w0%do_ri_Sigma_x) THEN
1203 CALL hfx_release(qs_env%x_data)
1204 END IF
1205
1206 END SUBROUTINE release_hfx_stuff
1207
1208! **************************************************************************************************
1209!> \brief ...
1210!> \param qs_env ...
1211!> \param kpoints ...
1212!> \param scheme ...
1213!> \param group_size_ext ...
1214!> \param mp_grid ...
1215!> \param kpgeneral ...
1216!> \param with_xc_terms ...
1217!> \param kp_shift ...
1218!> \param gamma_centered ...
1219! **************************************************************************************************
1220 SUBROUTINE create_kp_and_calc_kp_orbitals(qs_env, kpoints, scheme, &
1221 group_size_ext, mp_grid, kpgeneral, with_xc_terms, &
1222 kp_shift, gamma_centered)
1223
1224 TYPE(qs_environment_type), POINTER :: qs_env
1225 TYPE(kpoint_type), POINTER :: kpoints
1226 CHARACTER(LEN=*), INTENT(IN) :: scheme
1227 INTEGER :: group_size_ext
1228 INTEGER, DIMENSION(3), INTENT(IN), OPTIONAL :: mp_grid
1229 REAL(kind=dp), DIMENSION(:, :), INTENT(IN), &
1230 OPTIONAL :: kpgeneral
1231 LOGICAL, OPTIONAL :: with_xc_terms
1232 REAL(kind=dp), DIMENSION(3), INTENT(IN), OPTIONAL :: kp_shift
1233 LOGICAL, INTENT(IN), OPTIONAL :: gamma_centered
1234
1235 CHARACTER(LEN=*), PARAMETER :: routinen = 'create_kp_and_calc_kp_orbitals'
1236
1237 INTEGER :: handle, i_re_im, ikp, ispin, nkp, nspins
1238 INTEGER, DIMENSION(3) :: periodic
1239 LOGICAL :: my_with_xc_terms
1240 REAL(kind=dp), DIMENSION(:), POINTER :: eigenvalues
1241 TYPE(cell_type), POINTER :: cell
1242 TYPE(cp_blacs_env_type), POINTER :: blacs_env
1243 TYPE(cp_cfm_type) :: cksmat, cmos, csmat, cwork
1244 TYPE(cp_fm_struct_type), POINTER :: matrix_struct
1245 TYPE(cp_fm_type) :: fm_work
1246 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s, matrix_s_desymm
1247 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: mat_ks_kp, mat_s_kp
1248 TYPE(dft_control_type), POINTER :: dft_control
1249 TYPE(kpoint_env_type), POINTER :: kp
1250 TYPE(mp_para_env_type), POINTER :: para_env
1251 TYPE(qs_scf_env_type), POINTER :: scf_env
1252 TYPE(scf_control_type), POINTER :: scf_control
1253
1254 CALL timeset(routinen, handle)
1255
1256 my_with_xc_terms = .true.
1257 IF (PRESENT(with_xc_terms)) my_with_xc_terms = with_xc_terms
1258
1259 CALL get_qs_env(qs_env, &
1260 para_env=para_env, &
1261 blacs_env=blacs_env, &
1262 matrix_s=matrix_s, &
1263 scf_env=scf_env, &
1264 scf_control=scf_control, &
1265 cell=cell)
1266
1267 ! get kpoints
1268 CALL calculate_kpoints_for_bs(kpoints, scheme, kpgeneral=kpgeneral, mp_grid=mp_grid, &
1269 group_size_ext=group_size_ext, kp_shift=kp_shift, &
1270 gamma_centered=gamma_centered)
1271
1272 CALL kpoint_env_initialize(kpoints, para_env, blacs_env)
1273
1274 ! calculate all MOs that are accessible in the given
1275 ! Gaussian AO basis, therefore nadd=1E10
1276 CALL kpoint_initialize_mos(kpoints, qs_env%mos, 2000000000)
1277 CALL kpoint_initialize_mo_set(kpoints)
1278
1279 CALL get_cell(cell=cell, periodic=periodic)
1280
1281 CALL init_cell_index_rpa(2*periodic + 1, kpoints%cell_to_index, kpoints%index_to_cell, cell)
1282
1283 ! get S(k)
1284 CALL get_qs_env(qs_env, matrix_s=matrix_s, scf_env=scf_env, scf_control=scf_control, dft_control=dft_control)
1285
1286 NULLIFY (matrix_s_desymm)
1287 CALL dbcsr_allocate_matrix_set(matrix_s_desymm, 1)
1288 ALLOCATE (matrix_s_desymm(1)%matrix)
1289 CALL dbcsr_create(matrix=matrix_s_desymm(1)%matrix, template=matrix_s(1)%matrix, &
1290 matrix_type=dbcsr_type_no_symmetry)
1291 CALL dbcsr_desymmetrize(matrix_s(1)%matrix, matrix_s_desymm(1)%matrix)
1292
1293 CALL mat_kp_from_mat_gamma(qs_env, mat_s_kp, matrix_s_desymm(1)%matrix, kpoints, 1)
1294
1295 CALL get_kpoint_info(kpoints, nkp=nkp)
1296
1297 matrix_struct => kpoints%kp_env(1)%kpoint_env%wmat(1, 1)%matrix_struct
1298
1299 CALL cp_cfm_create(cksmat, matrix_struct)
1300 CALL cp_cfm_create(csmat, matrix_struct)
1301 CALL cp_cfm_create(cmos, matrix_struct)
1302 CALL cp_cfm_create(cwork, matrix_struct)
1303 CALL cp_fm_create(fm_work, matrix_struct)
1304
1305 nspins = dft_control%nspins
1306
1307 DO ispin = 1, nspins
1308
1309 ! get H(k)
1310 IF (my_with_xc_terms) THEN
1311 CALL mat_kp_from_mat_gamma(qs_env, mat_ks_kp, qs_env%mp2_env%ri_g0w0%matrix_ks(ispin)%matrix, kpoints, ispin)
1312 ELSE
1313 CALL mat_kp_from_mat_gamma(qs_env, mat_ks_kp, qs_env%mp2_env%ri_g0w0%matrix_sigma_x_minus_vxc(ispin)%matrix, &
1314 kpoints, ispin)
1315 END IF
1316
1317 DO ikp = 1, nkp
1318
1319 CALL copy_dbcsr_to_fm(mat_ks_kp(ikp, 1)%matrix, kpoints%kp_env(ikp)%kpoint_env%wmat(1, ispin))
1320 CALL cp_cfm_scale_and_add_fm(z_zero, cksmat, z_one, kpoints%kp_env(ikp)%kpoint_env%wmat(1, ispin))
1321
1322 CALL copy_dbcsr_to_fm(mat_ks_kp(ikp, 2)%matrix, kpoints%kp_env(ikp)%kpoint_env%wmat(2, ispin))
1323 CALL cp_cfm_scale_and_add_fm(z_one, cksmat, gaussi, kpoints%kp_env(ikp)%kpoint_env%wmat(2, ispin))
1324
1325 CALL copy_dbcsr_to_fm(mat_s_kp(ikp, 1)%matrix, fm_work)
1326 CALL cp_cfm_scale_and_add_fm(z_zero, csmat, z_one, fm_work)
1327
1328 CALL copy_dbcsr_to_fm(mat_s_kp(ikp, 2)%matrix, fm_work)
1329 CALL cp_cfm_scale_and_add_fm(z_one, csmat, gaussi, fm_work)
1330
1331 kp => kpoints%kp_env(ikp)%kpoint_env
1332
1333 CALL get_mo_set(kp%mos(ispin), eigenvalues=eigenvalues)
1334
1335 IF (scf_env%cholesky_method == cholesky_off .OR. &
1336 qs_env%mp2_env%ri_rpa_im_time%make_overlap_mat_ao_pos_definite) THEN
1337 CALL cp_cfm_geeig_canon(cksmat, csmat, cmos, eigenvalues, cwork, scf_control%eps_eigval)
1338 ELSE
1339 CALL cp_cfm_geeig(cksmat, csmat, cmos, eigenvalues, cwork)
1340 END IF
1341
1342 CALL cp_cfm_to_cfm(cmos, kp%mos(ispin)%cmo_coeff)
1343
1344 kp%mos(ispin)%eigenvalues = eigenvalues
1345
1346 END DO
1347
1348 END DO
1349
1350 DO ikp = 1, nkp
1351 DO i_re_im = 1, 2
1352 CALL dbcsr_deallocate_matrix(mat_ks_kp(ikp, i_re_im)%matrix)
1353 END DO
1354 END DO
1355 DEALLOCATE (mat_ks_kp)
1356
1357 DO ikp = 1, nkp
1358 DO i_re_im = 1, 2
1359 CALL dbcsr_deallocate_matrix(mat_s_kp(ikp, i_re_im)%matrix)
1360 END DO
1361 END DO
1362 DEALLOCATE (mat_s_kp)
1363
1364 CALL dbcsr_deallocate_matrix(matrix_s_desymm(1)%matrix)
1365 DEALLOCATE (matrix_s_desymm)
1366
1367 CALL cp_cfm_release(cksmat)
1368 CALL cp_cfm_release(csmat)
1369 CALL cp_cfm_release(cwork)
1370 CALL cp_cfm_release(cmos)
1371 CALL cp_fm_release(fm_work)
1372
1373 CALL timestop(handle)
1374
1375 END SUBROUTINE create_kp_and_calc_kp_orbitals
1376
1377! **************************************************************************************************
1378!> \brief ...
1379!> \param qs_env ...
1380!> \param mat_kp ...
1381!> \param mat_gamma ...
1382!> \param kpoints ...
1383!> \param ispin ...
1384!> \param real_mat_real_space ...
1385! **************************************************************************************************
1386 SUBROUTINE mat_kp_from_mat_gamma(qs_env, mat_kp, mat_gamma, kpoints, ispin, real_mat_real_space)
1387
1388 TYPE(qs_environment_type), POINTER :: qs_env
1389 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: mat_kp
1390 TYPE(dbcsr_type) :: mat_gamma
1391 TYPE(kpoint_type), POINTER :: kpoints
1392 INTEGER :: ispin
1393 LOGICAL, INTENT(IN), OPTIONAL :: real_mat_real_space
1394
1395 CHARACTER(LEN=*), PARAMETER :: routinen = 'mat_kp_from_mat_gamma'
1396
1397 INTEGER :: handle, i_cell, i_re_im, ikp, nkp, &
1398 num_cells
1399 INTEGER, DIMENSION(3) :: periodic
1400 INTEGER, DIMENSION(:, :, :), POINTER :: cell_to_index
1401 REAL(kind=dp), DIMENSION(:, :), POINTER :: xkp
1402 TYPE(cell_type), POINTER :: cell
1403 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: mat_real_space
1404
1405 CALL timeset(routinen, handle)
1406
1407 CALL get_qs_env(qs_env, cell=cell)
1408 CALL get_cell(cell=cell, periodic=periodic)
1409 num_cells = 3**(periodic(1) + periodic(2) + periodic(3))
1410
1411 NULLIFY (mat_real_space)
1412 CALL dbcsr_allocate_matrix_set(mat_real_space, num_cells)
1413 DO i_cell = 1, num_cells
1414 ALLOCATE (mat_real_space(i_cell)%matrix)
1415 CALL dbcsr_create(matrix=mat_real_space(i_cell)%matrix, &
1416 template=mat_gamma)
1417 CALL dbcsr_reserve_all_blocks(mat_real_space(i_cell)%matrix)
1418 CALL dbcsr_set(mat_real_space(i_cell)%matrix, 0.0_dp)
1419 END DO
1420
1421 CALL dbcsr_copy(mat_real_space(1)%matrix, mat_gamma)
1422
1423 CALL get_mat_cell_t_from_mat_gamma(mat_real_space, qs_env, kpoints, 2, 0)
1424
1425 NULLIFY (xkp, cell_to_index)
1426 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, cell_to_index=cell_to_index)
1427
1428 IF (ispin == 1) THEN
1429 NULLIFY (mat_kp)
1430 CALL dbcsr_allocate_matrix_set(mat_kp, nkp, 2)
1431 DO ikp = 1, nkp
1432 DO i_re_im = 1, 2
1433 ALLOCATE (mat_kp(ikp, i_re_im)%matrix)
1434 CALL dbcsr_create(matrix=mat_kp(ikp, i_re_im)%matrix, template=mat_gamma)
1435 CALL dbcsr_reserve_all_blocks(mat_kp(ikp, i_re_im)%matrix)
1436 CALL dbcsr_set(mat_kp(ikp, i_re_im)%matrix, 0.0_dp)
1437 END DO
1438 END DO
1439 END IF
1440
1441 IF (PRESENT(real_mat_real_space)) THEN
1442 CALL real_space_to_kpoint_transform_rpa(mat_kp(:, 1), mat_kp(:, 2), mat_real_space, kpoints, 0.0_dp, &
1443 real_mat_real_space)
1444 ELSE
1445 CALL real_space_to_kpoint_transform_rpa(mat_kp(:, 1), mat_kp(:, 2), mat_real_space, kpoints, 0.0_dp)
1446 END IF
1447
1448 DO i_cell = 1, num_cells
1449 CALL dbcsr_deallocate_matrix(mat_real_space(i_cell)%matrix)
1450 END DO
1451 DEALLOCATE (mat_real_space)
1452
1453 CALL timestop(handle)
1454
1455 END SUBROUTINE mat_kp_from_mat_gamma
1456
1457! **************************************************************************************************
1458!> \brief ...
1459!> \param qs_env ...
1460!> \param kpgeneral ...
1461! **************************************************************************************************
1462 SUBROUTINE get_kpgeneral_for_sigma_kpoints(qs_env, kpgeneral)
1463 TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
1464 REAL(kind=dp), DIMENSION(:, :), POINTER :: kpgeneral
1465
1466 CHARACTER(LEN=*), PARAMETER :: routinen = 'get_kpgeneral_for_Sigma_kpoints'
1467
1468 INTEGER :: handle, i_kp_in_kp_line, i_special_kp, &
1469 i_x, ikk, j_y, k_z, n_kp_in_kp_line, &
1470 n_special_kp
1471 INTEGER, DIMENSION(:), POINTER :: nkp_grid
1472
1473 CALL timeset(routinen, handle)
1474
1475 n_special_kp = qs_env%mp2_env%ri_g0w0%n_special_kp
1476 n_kp_in_kp_line = qs_env%mp2_env%ri_g0w0%n_kp_in_kp_line
1477 IF (n_special_kp > 0) THEN
1478 qs_env%mp2_env%ri_g0w0%nkp_self_energy_special_kp = n_kp_in_kp_line*(n_special_kp - 1) + 1
1479 ELSE
1480 qs_env%mp2_env%ri_g0w0%nkp_self_energy_special_kp = 0
1481 END IF
1482
1483 qs_env%mp2_env%ri_g0w0%nkp_self_energy_monkh_pack = qs_env%mp2_env%ri_g0w0%kp_grid_Sigma(1)* &
1484 qs_env%mp2_env%ri_g0w0%kp_grid_Sigma(2)* &
1485 qs_env%mp2_env%ri_g0w0%kp_grid_Sigma(3)
1486
1487 qs_env%mp2_env%ri_g0w0%nkp_self_energy = qs_env%mp2_env%ri_g0w0%nkp_self_energy_special_kp + &
1488 qs_env%mp2_env%ri_g0w0%nkp_self_energy_monkh_pack
1489
1490 ALLOCATE (kpgeneral(3, qs_env%mp2_env%ri_g0w0%nkp_self_energy))
1491
1492 IF (n_special_kp > 0) THEN
1493
1494 kpgeneral(1:3, 1) = qs_env%mp2_env%ri_g0w0%xkp_special_kp(1:3, 1)
1495
1496 ikk = 1
1497
1498 DO i_special_kp = 2, n_special_kp
1499 DO i_kp_in_kp_line = 1, n_kp_in_kp_line
1500
1501 ikk = ikk + 1
1502 kpgeneral(1:3, ikk) = qs_env%mp2_env%ri_g0w0%xkp_special_kp(1:3, i_special_kp - 1) + &
1503 REAL(i_kp_in_kp_line, kind=dp)/real(n_kp_in_kp_line, kind=dp)* &
1504 (qs_env%mp2_env%ri_g0w0%xkp_special_kp(1:3, i_special_kp) - &
1505 qs_env%mp2_env%ri_g0w0%xkp_special_kp(1:3, i_special_kp - 1))
1506
1507 END DO
1508 END DO
1509
1510 ELSE
1511
1512 ikk = 0
1513
1514 END IF
1515
1516 nkp_grid => qs_env%mp2_env%ri_g0w0%kp_grid_Sigma
1517
1518 DO i_x = 1, nkp_grid(1)
1519 DO j_y = 1, nkp_grid(2)
1520 DO k_z = 1, nkp_grid(3)
1521 ikk = ikk + 1
1522 kpgeneral(1, ikk) = real(2*i_x - nkp_grid(1) - 1, kind=dp)/(2._dp*real(nkp_grid(1), kind=dp))
1523 kpgeneral(2, ikk) = real(2*j_y - nkp_grid(2) - 1, kind=dp)/(2._dp*real(nkp_grid(2), kind=dp))
1524 kpgeneral(3, ikk) = real(2*k_z - nkp_grid(3) - 1, kind=dp)/(2._dp*real(nkp_grid(3), kind=dp))
1525 END DO
1526 END DO
1527 END DO
1528
1529 CALL timestop(handle)
1530
1531 END SUBROUTINE get_kpgeneral_for_sigma_kpoints
1532
1533END MODULE rpa_gw_kpoints_util
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
Handles all functions related to the CELL.
Definition cell_types.F:15
subroutine, public get_cell(cell, alpha, beta, gamma, deth, orthorhombic, abc, periodic, h, h_inv, symmetry_id, tag)
Get informations about a simulation cell.
Definition cell_types.F:234
subroutine, public minimum_image_weights(ra, rb, cell, index_to_cell, weights)
Distribute an atom-pair contribution equally among its nearest candidate images. Images within 1....
Definition cell_types.F:426
methods related to the blacs parallel environment
Basic linear algebra operations for complex full matrices.
subroutine, public cp_cfm_scale_and_add_fm(alpha, matrix_a, beta, matrix_b)
Scale and add two BLACS matrices (a = alpha*a + beta*b). where b is a real matrix (adapted from cp_cf...
subroutine, public cp_cfm_get_diag(matrix, diag, n_active)
returns the diagonal of a complex full matrix: diag(i)= A_{ii}. Each diagonal entry is owned by one p...
subroutine, public cp_cfm_uplo_to_full(matrix, workspace, uplo)
...
subroutine, public cp_cfm_add_on_diag(matrix, alpha, n_active)
Adds a scalar to the diagonal of a distributed complex full matrix.
various cholesky decomposition related routines
subroutine, public cp_cfm_cholesky_decompose(matrix, n, info_out)
Used to replace a symmetric positive definite matrix M with its Cholesky decomposition U: M = U^T * U...
subroutine, public cp_cfm_cholesky_invert(matrix, n, info_out)
Used to replace Cholesky decomposition by the inverse.
used for collecting diagonalization schemes available for cp_cfm_type
Definition cp_cfm_diag.F:14
subroutine, public cp_cfm_geeig_canon(amatrix, bmatrix, eigenvectors, eigenvalues, work, epseig, nmo_retained)
General Eigenvalue Problem AX = BXE Use canonical orthogonalization.
subroutine, public cp_cfm_power(matrix, work, exponent, threshold, n_dependent, verbose, eigvals)
Raise the positive spectral part of a Hermitian matrix to a real power. Eigenmodes with eigenvalues b...
subroutine, public cp_cfm_geeig(amatrix, bmatrix, eigenvectors, eigenvalues, work, lowest_subset)
General Eigenvalue Problem AX = BXE Single option version: Cholesky decomposition of B.
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_copy_general(source, destination, para_env)
General copy of a cfm matrix to another cfm matrix. Uses non-blocking MPI rather than ScaLAPACK.
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
subroutine, public cp_fm_to_cfm(msourcer, msourcei, mtarget)
Construct a complex full matrix by taking its real and imaginary parts from two separate real-value f...
subroutine, public cp_cfm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
Creates a new full matrix with the given structure.
subroutine, public cp_cfm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, matrix_struct, para_env)
Returns information about a full matrix.
subroutine, public cp_cfm_set_all(matrix, alpha, beta)
Set all elements of the full matrix to alpha. Besides, set all diagonal matrix elements to beta (if g...
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_transposed(transposed, normal, shallow_data_copy, transpose_distribution, use_distribution)
...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset, transposed)
...
subroutine, public dbcsr_filter(matrix, eps)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_reserve_all_blocks(matrix)
Reserves all blocks.
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm, plan, check_plan)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_scale_and_add(alpha, matrix_a, beta, matrix_b)
calc A <- alpha*A + beta*B optimized for alpha == 1.0 (just add beta*B) and beta == 0....
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_copy_general(source, destination, para_env)
General copy of a fm matrix to another fm matrix. Uses non-blocking MPI rather than ScaLAPACK.
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
Full-matrix operations not provided by the CP2K FM packages.
Definition gw_utils_fm.F:13
subroutine, public cfm_contract_aba(matrix_a, matrix_b, matrix_c, workspace)
Computes A^H B A for complex full matrices.
Definition gw_utils_fm.F:59
Types and set/get functions for HFX.
Definition hfx_types.F:16
subroutine, public hfx_release(x_data)
This routine deallocates all data structures
Definition hfx_types.F:1922
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public kp_weights_w_auto
integer, parameter, public kp_weights_w_uniform
integer, parameter, public cholesky_off
integer, parameter, public kp_weights_w_tailored
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Routines needed for kpoint calculation.
subroutine, public kpoint_initialize_mo_set(kpoint)
...
subroutine, public kpoint_initialize_mos(kpoint, mos, added_mos, for_aux_fit)
Initialize a set of MOs and density matrix for each kpoint (kpoint group).
subroutine, public kpoint_env_initialize(kpoint, para_env, blacs_env, with_aux_fit)
Initialize the kpoint environment.
Types and basic routines needed for a kpoint calculation.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym, inversion_symmetry_only, symmetry_backend, symmetry_reduction_method, gamma_centered, lattice_fft)
Retrieve information from a kpoint environment.
Machine interface based on Fortran 2003 and POSIX.
Definition machine.F:17
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Definition machine.F:144
Definition of mathematical constants and functions.
complex(kind=dp), parameter, public z_one
complex(kind=dp), parameter, public gaussi
real(kind=dp), parameter, public twopi
complex(kind=dp), parameter, public z_zero
Collection of simple mathematical functions and subroutines.
Definition mathlib.F:15
subroutine, public invmat(a, info)
returns inverse of matrix using the lapack routines DGETRF and DGETRI
Definition mathlib.F:551
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
Define the data structure for the particle information.
Calculation of band structures.
subroutine, public calculate_kpoints_for_bs(kpoint, scheme, group_size_ext, mp_grid, kpgeneral, kp_shift, gamma_centered)
...
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count, cmo_coeff)
Get the components of a MO set data structure.
module that contains the definitions of the scf types
Utility routines for RPA and GW with imaginary time.
subroutine, public compute_weight_re_im(weight_re, weight_im, num_cells, iatom, jatom, xkp, wkp_w, cell, index_to_cell, hmat, particle_set)
...
subroutine, public get_atom_index_from_basis_function_index(qs_env, atom_from_basis_index, basis_size, basis_type, first_bf_from_atom)
...
Routines treating GW and RPA calculations with kpoints.
subroutine, public get_mat_cell_t_from_mat_gamma(mat_p_omega, qs_env, kpoints, jquad, unit_nr)
Split a real Gamma matrix among nearest images using normalized equal weights.
subroutine, public real_space_to_kpoint_transform_rpa(real_mat_kp, imag_mat_kp, mat_real_space, kpoints, eps_filter_im_time, real_mat_real_space)
...
subroutine, public compute_wkp_w(qs_env, wkp_w, wkp_v, kpoints, h_inv, periodic)
...
subroutine, public get_bandstruc_and_k_dependent_mos(qs_env, eigenval_kp)
...
subroutine, public cfm_screened_interaction_from_eps_cholesky(eps_chol, b, wc, n_active)
Form the screened interaction from a Cholesky-factorized dielectric matrix.
subroutine, public invert_eps_compute_w_and_erpa_kp(dimen_ri, jquad, nkp, count_ev_sc_gw, para_env, erpa, grid, wkp_w, do_gw_im_time, do_ri_sigma_x, do_kpoints_from_gamma, cfm_mat_q, ikp_local, mat_p_omega, mat_p_omega_kp, qs_env, eps_filter_im_time, unit_nr, kpoints, cfm_mat_minv_l_kpoints, cfm_matrix_l_kpoints, fm_mat_w, cfm_mat_ri_global_work, mat_minvvminv, fm_matrix_minv, fm_matrix_minv_vtrunc_minv)
...
subroutine, public mat_kp_from_mat_gamma(qs_env, mat_kp, mat_gamma, kpoints, ispin, real_mat_real_space)
...
Routines for low-scaling RPA/GW with imaginary time.
Definition rpa_im_time.F:13
subroutine, public init_cell_index_rpa(cell_grid, cell_to_index, index_to_cell, cell)
...
parameters that control an scf iteration
Definition and construction of time/frequency grids for correlation methods.
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
Represent a complex full matrix.
keeps the information about the structure of a full matrix
represent a full matrix
Keeps information about a specific k-point.
Contains information about kpoints.
stores all the informations relevant to an mpi environment