(git:691081d)
Loading...
Searching...
No Matches
gw_dbcsr_utils.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 Common DBCSR matrix operations used by GW modules.
10!> \par History
11!> 09.2026 created Jan Wilhelm
12! **************************************************************************************************
14 USE cp_dbcsr_api, ONLY: dbcsr_create,&
18 USE kinds, ONLY: dp
19#include "./base/base_uses.f90"
20
21 IMPLICIT NONE
22 PRIVATE
23
24 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'gw_dbcsr_utils'
25
26 PUBLIC :: dbcsr_contract_aba
27
28CONTAINS
29
30! **************************************************************************************************
31!> \brief Computes C=A B A^T or C=A^T B A for DBCSR matrices.
32!> \param trans_A_left transposition applied to the left occurrence of A
33!> \param trans_A_right transposition applied to the right occurrence of A
34!> \param matrix_A left and right matrix A
35!> \param matrix_B input matrix B
36!> \param matrix_C output matrix C
37!> \param eps_filter filtering threshold for both matrix multiplications
38!> \param retain_sparsity if true, only existing blocks of C are filled
39! **************************************************************************************************
40 SUBROUTINE dbcsr_contract_aba(trans_A_left, trans_A_right, matrix_A, matrix_B, matrix_C, &
41 eps_filter, retain_sparsity)
42 CHARACTER(LEN=1), INTENT(IN) :: trans_a_left, trans_a_right
43 TYPE(dbcsr_type), INTENT(INOUT) :: matrix_a, matrix_b, matrix_c
44 REAL(kind=dp), INTENT(IN) :: eps_filter
45 LOGICAL, INTENT(IN), OPTIONAL :: retain_sparsity
46
47 CHARACTER(LEN=*), PARAMETER :: routinen = 'dbcsr_contract_ABA'
48
49 INTEGER :: handle
50 LOGICAL :: my_retain_sparsity
51 TYPE(dbcsr_type) :: work
52
53 CALL timeset(routinen, handle)
54
55 my_retain_sparsity = .false.
56 IF (PRESENT(retain_sparsity)) my_retain_sparsity = retain_sparsity
57
58 CALL dbcsr_create(work, template=matrix_a)
59
60 IF (trans_a_left == "N" .AND. trans_a_right == "T") THEN
61 ! C = A B A^T
62 CALL dbcsr_multiply("N", "N", 1.0_dp, matrix_a, matrix_b, &
63 0.0_dp, work, filter_eps=eps_filter)
64 CALL dbcsr_multiply("N", "T", 1.0_dp, work, matrix_a, &
65 0.0_dp, matrix_c, filter_eps=eps_filter, &
66 retain_sparsity=my_retain_sparsity)
67 ELSE IF (trans_a_left == "T" .AND. trans_a_right == "N") THEN
68 ! C = A^T B A
69 CALL dbcsr_multiply("N", "N", 1.0_dp, matrix_b, matrix_a, &
70 0.0_dp, work, filter_eps=eps_filter)
71 CALL dbcsr_multiply("T", "N", 1.0_dp, matrix_a, work, &
72 0.0_dp, matrix_c, filter_eps=eps_filter, &
73 retain_sparsity=my_retain_sparsity)
74 ELSE
75 cpabort("Unsupported transposition pair in dbcsr_contract_ABA")
76 END IF
77 CALL dbcsr_release(work)
78
79 CALL timestop(handle)
80
81 END SUBROUTINE dbcsr_contract_aba
82
83END MODULE gw_dbcsr_utils
subroutine, public dbcsr_multiply(transa, transb, alpha, matrix_a, matrix_b, beta, matrix_c, first_row, last_row, first_column, last_column, first_k, last_k, retain_sparsity, filter_eps, flop)
...
subroutine, public dbcsr_release(matrix)
...
Common DBCSR matrix operations used by GW modules.
subroutine, public dbcsr_contract_aba(trans_a_left, trans_a_right, matrix_a, matrix_b, matrix_c, eps_filter, retain_sparsity)
Computes C=A B A^T or C=A^T B A for DBCSR matrices.
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34