Line data Source code
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 Redistribute matrices between full-matrix and tensor process layouts.
10 : ! **************************************************************************************************
11 : MODULE dbt_matrix_redistribution
12 : USE cp_dbcsr_api, ONLY: dbcsr_filter,&
13 : dbcsr_p_type,&
14 : dbcsr_set,&
15 : dbcsr_type
16 : USE cp_dbcsr_operations, ONLY: copy_dbcsr_to_fm,&
17 : copy_fm_to_dbcsr
18 : USE cp_dbcsr_redistribution, ONLY: cp_dbcsr_from_subgroups,&
19 : cp_dbcsr_to_subgroups
20 : USE cp_fm_types, ONLY: cp_fm_type
21 : USE dbt_api, ONLY: dbt_clear,&
22 : dbt_copy,&
23 : dbt_copy_matrix_to_tensor,&
24 : dbt_copy_tensor_to_matrix,&
25 : dbt_create,&
26 : dbt_destroy,&
27 : dbt_type
28 : USE kinds, ONLY: dp
29 : USE message_passing, ONLY: mp_para_env_type
30 : #include "../base/base_uses.f90"
31 :
32 : IMPLICIT NONE
33 : PRIVATE
34 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'dbt_matrix_redistribution'
35 : PUBLIC :: cp_fm_to_dbt, cp_dbt_to_dbcsr, cp_dbt_to_fm
36 :
37 : CONTAINS
38 :
39 : ! **************************************************************************************************
40 : !> \brief ...
41 : !> \param fm_global ...
42 : !> \param mat_global ...
43 : !> \param mat_local ...
44 : !> \param tensor ...
45 : !> \param para_env communicator covering the full matrix and all subgroups
46 : !> \param num_pe_sub number of ranks per subgroup
47 : !> \param eps_filter DBCSR filtering threshold before subgroup distribution
48 : !> \param block_row_ranges ...
49 : ! **************************************************************************************************
50 12744 : SUBROUTINE cp_fm_to_dbt(fm_global, mat_global, mat_local, tensor, para_env, num_pe_sub, eps_filter, block_row_ranges)
51 :
52 : TYPE(cp_fm_type) :: fm_global
53 : TYPE(dbcsr_type) :: mat_global, mat_local
54 : TYPE(dbt_type) :: tensor
55 : TYPE(mp_para_env_type), INTENT(IN), POINTER :: para_env
56 : INTEGER, INTENT(IN) :: num_pe_sub
57 : REAL(KIND=dp), INTENT(IN) :: eps_filter
58 : INTEGER, DIMENSION(:, :), OPTIONAL :: block_row_ranges
59 :
60 : CHARACTER(LEN=*), PARAMETER :: routineN = 'cp_fm_to_dbt'
61 :
62 : INTEGER :: handle
63 114696 : TYPE(dbt_type) :: tensor_tmp
64 :
65 12744 : CALL timeset(routineN, handle)
66 :
67 12744 : CALL dbt_clear(tensor)
68 12744 : CALL copy_fm_to_dbcsr(fm_global, mat_global, keep_sparsity=.FALSE.)
69 12744 : CALL dbcsr_filter(mat_global, eps_filter)
70 17728 : CALL cp_dbcsr_to_subgroups(mat_global, mat_local, para_env, num_pe_sub, block_row_ranges)
71 12744 : CALL dbt_create(mat_local, tensor_tmp)
72 12744 : CALL dbt_copy_matrix_to_tensor(mat_local, tensor_tmp)
73 12744 : CALL dbt_copy(tensor_tmp, tensor, move_data=.TRUE.)
74 12744 : CALL dbt_destroy(tensor_tmp)
75 12744 : CALL dbcsr_set(mat_local, 0.0_dp)
76 12744 : CALL dbcsr_filter(mat_local, 1.0_dp)
77 :
78 12744 : CALL timestop(handle)
79 :
80 12744 : END SUBROUTINE cp_fm_to_dbt
81 :
82 : ! **************************************************************************************************
83 : !> \brief ...
84 : !> \param tensor ...
85 : !> \param mat_tensor ...
86 : !> \param mat_global ...
87 : !> \param para_env ...
88 : ! **************************************************************************************************
89 7358 : SUBROUTINE cp_dbt_to_dbcsr(tensor, mat_tensor, mat_global, para_env)
90 :
91 : TYPE(dbt_type) :: tensor
92 : TYPE(dbcsr_type) :: mat_tensor, mat_global
93 : TYPE(mp_para_env_type), POINTER :: para_env
94 :
95 : CHARACTER(LEN=*), PARAMETER :: routineN = 'cp_dbt_to_dbcsr'
96 :
97 : INTEGER :: handle
98 :
99 7358 : CALL timeset(routineN, handle)
100 :
101 7358 : CALL dbt_copy_tensor_to_matrix(tensor, mat_tensor)
102 7358 : CALL dbt_clear(tensor)
103 : ! the next para_env%sync is not mandatory, but it makes the timing output
104 : ! of cp_dbcsr_from_subgroups correct
105 7358 : CALL para_env%sync()
106 7358 : CALL cp_dbcsr_from_subgroups(mat_tensor, mat_global, para_env)
107 :
108 7358 : CALL timestop(handle)
109 :
110 7358 : END SUBROUTINE cp_dbt_to_dbcsr
111 :
112 : ! **************************************************************************************************
113 : !> \brief ...
114 : !> \param t_R ...
115 : !> \param fm_R ...
116 : !> \param mat_global ...
117 : !> \param mat_local ...
118 : !> \param para_env ...
119 : ! **************************************************************************************************
120 328 : SUBROUTINE cp_dbt_to_fm(t_R, fm_R, mat_global, mat_local, para_env)
121 : TYPE(dbt_type), DIMENSION(:) :: t_R
122 : TYPE(cp_fm_type), DIMENSION(:) :: fm_R
123 : TYPE(dbcsr_p_type) :: mat_global, mat_local
124 : TYPE(mp_para_env_type), INTENT(IN), POINTER :: para_env
125 :
126 : CHARACTER(LEN=*), PARAMETER :: routineN = 'cp_dbt_to_fm'
127 :
128 : INTEGER :: handle, i_cell, n_images
129 :
130 328 : CALL timeset(routineN, handle)
131 :
132 328 : n_images = SIZE(t_R)
133 :
134 328 : CPASSERT(n_images == SIZE(fm_R))
135 :
136 3280 : DO i_cell = 1, n_images
137 : CALL cp_dbt_to_dbcsr(t_R(i_cell), mat_local%matrix, mat_global%matrix, &
138 2952 : para_env)
139 3280 : CALL copy_dbcsr_to_fm(mat_global%matrix, fm_R(i_cell))
140 : END DO
141 :
142 328 : CALL timestop(handle)
143 :
144 328 : END SUBROUTINE cp_dbt_to_fm
145 :
146 : END MODULE dbt_matrix_redistribution
|