(git:6a2e663)
cp_blacs_types.F
Go to the documentation of this file.
1 !--------------------------------------------------------------------------------------------------!
2 ! CP2K: A general program to perform molecular dynamics simulations !
3 ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 ! !
5 ! SPDX-License-Identifier: GPL-2.0-or-later !
6 !--------------------------------------------------------------------------------------------------!
7 
8 ! **************************************************************************************************
9 !> \brief wrappers for the actual blacs calls.
10 !> all functionality needed in the code should actually be provide by cp_blacs_env
11 !> these functions should be private members of that module
12 !> \note
13 !> http://www.netlib.org/blacs/BLACS/QRef.html
14 !> \par History
15 !> 12.2003 created [Joost]
16 !> \author Joost VandeVondele
17 ! **************************************************************************************************
19 
20 #if defined(__DLAF)
23 #endif
24  USE kinds, ONLY: dp
25  USE message_passing, ONLY: mp_comm_type
26 #include "../base/base_uses.f90"
27 
28  IMPLICIT NONE
29  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'cp_blacs_types'
30  PRIVATE
31 
32  PUBLIC :: cp_blacs_type
33 
34  TYPE cp_blacs_type
35  PRIVATE
36 #if defined(__SCALAPACK)
37  INTEGER :: context_handle = -1
38 #endif
39  INTEGER, DIMENSION(2), PUBLIC :: mepos = -1, num_pe = -1
40  CONTAINS
41  PROCEDURE, PUBLIC, PASS(this), NON_OVERRIDABLE :: gridinit => cp_blacs_gridinit
42  PROCEDURE, PUBLIC, PASS(this), NON_OVERRIDABLE :: gridexit => cp_blacs_gridexit
43  PROCEDURE, PRIVATE, PASS(this), NON_OVERRIDABLE :: gridinfo => cp_blacs_gridinfo
44  PROCEDURE, PUBLIC, PASS(this), NON_OVERRIDABLE :: set => cp_blacs_set
45  PROCEDURE, PUBLIC, PASS(this), NON_OVERRIDABLE :: zgebs2d => cp_blacs_zgebs2d
46  PROCEDURE, PUBLIC, PASS(this), NON_OVERRIDABLE :: dgebs2d => cp_blacs_dgebs2d
47  PROCEDURE, PUBLIC, PASS(this), NON_OVERRIDABLE :: zgebr2d => cp_blacs_zgebr2d
48  PROCEDURE, PUBLIC, PASS(this), NON_OVERRIDABLE :: dgebr2d => cp_blacs_dgebr2d
49  PROCEDURE, PUBLIC, PASS(this), NON_OVERRIDABLE :: get_handle => cp_blacs_get_handle
50 
51  PROCEDURE, PRIVATE, PASS(this), NON_OVERRIDABLE :: cp_context_is_equal
52  generic, PUBLIC :: OPERATOR(==) => cp_context_is_equal
53 
54  PROCEDURE, PRIVATE, PASS(this), NON_OVERRIDABLE :: cp_context_is_not_equal
55  generic, PUBLIC :: OPERATOR(/=) => cp_context_is_not_equal
56 
57  PROCEDURE, PUBLIC, PASS(this), NON_OVERRIDABLE :: interconnect => cp_blacs_interconnect
58  END TYPE
59 
60 !***
61 CONTAINS
62 
63 ! **************************************************************************************************
64 !> \brief ...
65 !> \param this ...
66 !> \param comm ...
67 !> \param order ...
68 !> \param nprow ...
69 !> \param npcol ...
70 ! **************************************************************************************************
71  SUBROUTINE cp_blacs_gridinit(this, comm, order, nprow, npcol)
72  CLASS(cp_blacs_type), INTENT(OUT) :: this
73  CLASS(mp_comm_type), INTENT(IN) :: comm
74  CHARACTER(len=1), INTENT(IN):: order
75  INTEGER, INTENT(IN) :: nprow, npcol
76 #if defined(__SCALAPACK)
77  INTEGER :: context_handle
78  context_handle = comm%get_handle()
79  CALL blacs_gridinit(context_handle, order, nprow, npcol)
80  this%context_handle = context_handle
81 
82 #if defined(__DLAF)
83  CALL cp_dlaf_create_grid(context_handle)
84 #endif
85 #else
86  mark_used(this)
87  mark_used(comm)
88  mark_used(order)
89  mark_used(nprow)
90  mark_used(npcol)
91 #endif
92  CALL this%gridinfo()
93  END SUBROUTINE cp_blacs_gridinit
94 
95 ! **************************************************************************************************
96 !> \brief ...
97 !> \param this ...
98 ! **************************************************************************************************
99  SUBROUTINE cp_blacs_gridexit(this)
100  CLASS(cp_blacs_type), INTENT(IN) :: this
101 #if defined(__SCALAPACK)
102  CALL blacs_gridexit(this%context_handle)
103 
104 #if defined(__DLAF)
105  CALL cp_dlaf_free_grid(this%context_handle)
106 #endif
107 #else
108  mark_used(this)
109 #endif
110  END SUBROUTINE cp_blacs_gridexit
111 
112 ! **************************************************************************************************
113 !> \brief ...
114 !> \param this ...
115 ! **************************************************************************************************
116  SUBROUTINE cp_blacs_gridinfo(this)
117  CLASS(cp_blacs_type), INTENT(INOUT) :: this
118 #if defined(__SCALAPACK)
119  CALL blacs_gridinfo(this%context_handle, this%num_pe(1), this%num_pe(2), this%mepos(1), this%mepos(2))
120 #else
121  mark_used(this)
122  this%num_pe = 1
123  this%mepos = 0
124 #endif
125  END SUBROUTINE cp_blacs_gridinfo
126 
127 ! **************************************************************************************************
128 !> \brief ...
129 !> \param this ...
130 !> \param what :
131 !> WHAT = 0 : Handle indicating default system context; ! DO NOT USE (i.e. use para_env)
132 !> WHAT = 1 : The BLACS message ID range;
133 !> WHAT = 2 : The BLACS debug level the library was compiled with;
134 !> WHAT = 10: Handle indicating the system context used to define the BLACS context whose handle is ICONTXT;
135 !> WHAT = 11: Number of rings multiring topology is presently using;
136 !> WHAT = 12: Number of branches general tree topology is presently using.
137 !> WHAT = 15: If non-zero, makes topology choice for repeatable collectives
138 !> \param val ...
139 ! **************************************************************************************************
140  SUBROUTINE cp_blacs_set(this, what, val)
141  CLASS(cp_blacs_type), INTENT(IN) :: this
142  INTEGER, INTENT(IN) :: what, val
143 #if defined(__SCALAPACK)
144  CALL blacs_set(this%context_handle, what, val)
145 #else
146  mark_used(this)
147  mark_used(what)
148  mark_used(val)
149 #endif
150  END SUBROUTINE cp_blacs_set
151 
152 ! **************************************************************************************************
153 !> \brief ...
154 !> \param this ...
155 !> \param SCOPE ...
156 !> \param TOP ...
157 !> \param M ...
158 !> \param N ...
159 !> \param A ...
160 !> \param LDA ...
161 ! **************************************************************************************************
162  SUBROUTINE cp_blacs_zgebs2d(this, SCOPE, TOP, M, N, A, LDA)
163  CLASS(cp_blacs_type), INTENT(IN) :: this
164  CHARACTER(len=1), INTENT(IN) :: SCOPE, TOP
165  INTEGER, INTENT(IN) :: M, N, LDA
166  COMPLEX(KIND=dp) :: A
167 #if defined(__SCALAPACK)
168  CALL zgebs2d(this%context_handle, scope, top, m, n, a, lda)
169 #else
170  mark_used(this)
171  mark_used(scope)
172  mark_used(top)
173  mark_used(m)
174  mark_used(n)
175  mark_used(a)
176  mark_used(lda)
177 #endif
178  END SUBROUTINE
179 ! **************************************************************************************************
180 !> \brief ...
181 !> \param this ...
182 !> \param SCOPE ...
183 !> \param TOP ...
184 !> \param M ...
185 !> \param N ...
186 !> \param A ...
187 !> \param LDA ...
188 !> \param RSRC ...
189 !> \param CSRC ...
190 ! **************************************************************************************************
191  SUBROUTINE cp_blacs_zgebr2d(this, SCOPE, TOP, M, N, A, LDA, RSRC, CSRC)
192  CLASS(cp_blacs_type), INTENT(IN) :: this
193  CHARACTER(len=1), INTENT(IN) :: SCOPE, TOP
194  INTEGER, INTENT(IN) :: M, N, LDA
195  INTEGER, INTENT(IN) :: RSRC, CSRC
196  COMPLEX(KIND=dp) :: A
197 #if defined(__SCALAPACK)
198  CALL zgebr2d(this%context_handle, scope, top, m, n, a, lda, rsrc, csrc)
199 #else
200  mark_used(this)
201  mark_used(scope)
202  mark_used(top)
203  mark_used(m)
204  mark_used(n)
205  mark_used(a)
206  mark_used(lda)
207  mark_used(rsrc)
208  mark_used(csrc)
209 #endif
210  END SUBROUTINE
211 
212 ! **************************************************************************************************
213 !> \brief ...
214 !> \param this ...
215 !> \param SCOPE ...
216 !> \param TOP ...
217 !> \param M ...
218 !> \param N ...
219 !> \param A ...
220 !> \param LDA ...
221 ! **************************************************************************************************
222  SUBROUTINE cp_blacs_dgebs2d(this, SCOPE, TOP, M, N, A, LDA)
223  CLASS(cp_blacs_type), INTENT(IN) :: this
224  CHARACTER(len=1), INTENT(IN) :: SCOPE, TOP
225  INTEGER, INTENT(IN) :: M, N, LDA
226  REAL(KIND=dp) :: a
227 #if defined(__SCALAPACK)
228  CALL dgebs2d(this%context_handle, scope, top, m, n, a, lda)
229 #else
230  mark_used(this)
231  mark_used(scope)
232  mark_used(top)
233  mark_used(m)
234  mark_used(n)
235  mark_used(a)
236  mark_used(lda)
237 #endif
238  END SUBROUTINE
239 ! **************************************************************************************************
240 !> \brief ...
241 !> \param this ...
242 !> \param SCOPE ...
243 !> \param TOP ...
244 !> \param M ...
245 !> \param N ...
246 !> \param A ...
247 !> \param LDA ...
248 !> \param RSRC ...
249 !> \param CSRC ...
250 ! **************************************************************************************************
251  SUBROUTINE cp_blacs_dgebr2d(this, SCOPE, TOP, M, N, A, LDA, RSRC, CSRC)
252  CLASS(cp_blacs_type), INTENT(IN) :: this
253  CHARACTER(len=1), INTENT(IN) :: SCOPE, TOP
254  INTEGER, INTENT(IN) :: M, N, LDA
255  INTEGER, INTENT(IN) :: RSRC, CSRC
256  REAL(KIND=dp) :: a
257 #if defined(__SCALAPACK)
258  CALL dgebr2d(this%context_handle, scope, top, m, n, a, lda, rsrc, csrc)
259 #else
260  mark_used(this)
261  mark_used(scope)
262  mark_used(top)
263  mark_used(m)
264  mark_used(n)
265  mark_used(a)
266  mark_used(lda)
267  mark_used(rsrc)
268  mark_used(csrc)
269 #endif
270  END SUBROUTINE
271 
272 ! **************************************************************************************************
273 !> \brief ...
274 !> \param this ...
275 !> \return ...
276 ! **************************************************************************************************
277  ELEMENTAL INTEGER FUNCTION cp_blacs_get_handle(this)
278  CLASS(cp_blacs_type), INTENT(IN) :: this
279 #if defined(__SCALAPACK)
280  cp_blacs_get_handle = this%context_handle
281 #else
282  mark_used(this)
283  cp_blacs_get_handle = -1
284 #endif
285  END FUNCTION
286 
287 ! **************************************************************************************************
288 !> \brief ...
289 !> \param this ...
290 !> \param other ...
291 !> \return ...
292 ! **************************************************************************************************
293  ELEMENTAL LOGICAL FUNCTION cp_context_is_equal(this, other)
294  CLASS(cp_blacs_type), INTENT(IN) :: this, other
295 #if defined(__SCALAPACK)
296  cp_context_is_equal = (this%context_handle == other%context_handle)
297 #else
298  mark_used(this)
299  mark_used(other)
300  cp_context_is_equal = .true.
301 #endif
302  END FUNCTION cp_context_is_equal
303 
304 ! **************************************************************************************************
305 !> \brief ...
306 !> \param this ...
307 !> \param other ...
308 !> \return ...
309 ! **************************************************************************************************
310  ELEMENTAL LOGICAL FUNCTION cp_context_is_not_equal(this, other)
311  CLASS(cp_blacs_type), INTENT(IN) :: this, other
312 #if defined(__SCALAPACK)
313  cp_context_is_not_equal = (this%context_handle /= other%context_handle)
314 #else
315  mark_used(this)
316  mark_used(other)
317  cp_context_is_not_equal = .false.
318 #endif
319  END FUNCTION cp_context_is_not_equal
320 
321 ! **************************************************************************************************
322 !> \brief ...
323 !> \param this ...
324 !> \param comm_super ...
325 !> \return ...
326 ! **************************************************************************************************
327  TYPE(mp_comm_type) FUNCTION cp_blacs_interconnect(this, comm_super)
328  CLASS(cp_blacs_type), INTENT(IN) :: this
329  CLASS(mp_comm_type), INTENT(IN) :: comm_super
330 
331  INTEGER :: blacs_coord
332 
333 ! We enumerate the processes within the process grid in a linear fashion
334  blacs_coord = this%mepos(1)*this%num_pe(2) + this%mepos(2)
335 
336  CALL cp_blacs_interconnect%from_split(comm_super, blacs_coord)
337 
338  END FUNCTION cp_blacs_interconnect
339 
340 END MODULE cp_blacs_types
wrappers for the actual blacs calls. all functionality needed in the code should actually be provide ...
subroutine, public cp_dlaf_create_grid(blacs_context)
Create DLA-Future grid from BLACS context.
subroutine, public cp_dlaf_free_grid(blacs_context)
Free DLA-Future grid corresponding to BLACS context.
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
Interface to the message passing library MPI.