(git:9754b87)
Loading...
Searching...
No Matches
cp_dbcsr_api.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
9 USE dbcsr_api, ONLY: &
10 convert_csr_to_dbcsr_prv => dbcsr_convert_csr_to_dbcsr, &
11 convert_dbcsr_to_csr_prv => dbcsr_convert_dbcsr_to_csr, dbcsr_add_prv => dbcsr_add, &
12 dbcsr_binary_read_prv => dbcsr_binary_read, dbcsr_binary_write_prv => dbcsr_binary_write, &
13 dbcsr_clear_mempools, dbcsr_clear_prv => dbcsr_clear, &
14 dbcsr_complete_redistribute_prv => dbcsr_complete_redistribute, &
15 dbcsr_convert_offsets_to_sizes, dbcsr_convert_sizes_to_offsets, &
16 dbcsr_copy_prv => dbcsr_copy, dbcsr_create_prv => dbcsr_create, dbcsr_csr_create, &
17 dbcsr_csr_create_from_dbcsr_prv => dbcsr_csr_create_from_dbcsr, &
18 dbcsr_csr_dbcsr_blkrow_dist, dbcsr_csr_destroy, dbcsr_csr_eqrow_floor_dist, &
19 dbcsr_csr_p_type, dbcsr_csr_print_sparsity, dbcsr_csr_type, &
20 dbcsr_csr_type_real_8 => dbcsr_type_real_8, dbcsr_csr_write, &
21 dbcsr_desymmetrize_prv => dbcsr_desymmetrize, dbcsr_distribute_prv => dbcsr_distribute, &
22 dbcsr_distribution_get_num_images, dbcsr_distribution_get_prv => dbcsr_distribution_get, &
23 dbcsr_distribution_hold_prv => dbcsr_distribution_hold, &
24 dbcsr_distribution_new_prv => dbcsr_distribution_new, &
25 dbcsr_distribution_release_prv => dbcsr_distribution_release, &
26 dbcsr_distribution_type_prv => dbcsr_distribution_type, dbcsr_dot_prv => dbcsr_dot, &
27 dbcsr_filter_prv => dbcsr_filter, dbcsr_finalize_lib, &
28 dbcsr_finalize_prv => dbcsr_finalize, dbcsr_get_block_p_prv => dbcsr_get_block_p, &
29 dbcsr_get_data_p_prv => dbcsr_get_data_p, dbcsr_get_data_size_prv => dbcsr_get_data_size, &
30 dbcsr_get_default_config, dbcsr_get_info_prv => dbcsr_get_info, &
31 dbcsr_get_matrix_type_prv => dbcsr_get_matrix_type, &
32 dbcsr_get_num_blocks_prv => dbcsr_get_num_blocks, &
33 dbcsr_get_occupation_prv => dbcsr_get_occupation, &
34 dbcsr_get_stored_coordinates_prv => dbcsr_get_stored_coordinates, &
35 dbcsr_has_symmetry_prv => dbcsr_has_symmetry, dbcsr_init_lib, &
36 dbcsr_iterator_blocks_left_prv => dbcsr_iterator_blocks_left, &
37 dbcsr_iterator_next_block_prv => dbcsr_iterator_next_block, &
38 dbcsr_iterator_start_prv => dbcsr_iterator_start, &
39 dbcsr_iterator_stop_prv => dbcsr_iterator_stop, &
40 dbcsr_iterator_type_prv => dbcsr_iterator_type, &
41 dbcsr_mp_grid_setup_prv => dbcsr_mp_grid_setup, dbcsr_multiply_prv => dbcsr_multiply, &
42 dbcsr_no_transpose, dbcsr_print_config, dbcsr_print_statistics, &
43 dbcsr_put_block_prv => dbcsr_put_block, dbcsr_release_prv => dbcsr_release, &
44 dbcsr_replicate_all_prv => dbcsr_replicate_all, &
45 dbcsr_reserve_blocks_prv => dbcsr_reserve_blocks, dbcsr_reset_randmat_seed, &
46 dbcsr_run_tests, dbcsr_scale_prv => dbcsr_scale, dbcsr_set_config, &
47 dbcsr_set_prv => dbcsr_set, dbcsr_sum_replicated_prv => dbcsr_sum_replicated, &
48 dbcsr_test_mm, dbcsr_transpose, dbcsr_transposed_prv => dbcsr_transposed, &
49 dbcsr_type_antisymmetric, dbcsr_type_complex_8, dbcsr_type_no_symmetry, &
50 dbcsr_type_prv => dbcsr_type, dbcsr_type_real_8, dbcsr_type_symmetric, &
51 dbcsr_valid_index_prv => dbcsr_valid_index, &
52 dbcsr_verify_matrix_prv => dbcsr_verify_matrix, dbcsr_work_create_prv => dbcsr_work_create
53 USE dbm_api, ONLY: &
56 USE kinds, ONLY: dp,&
57 int_8
59#include "../base/base_uses.f90"
60
61 IMPLICIT NONE
62 PRIVATE
63
64 ! constants
65 PUBLIC :: dbcsr_type_no_symmetry
66 PUBLIC :: dbcsr_type_symmetric
67 PUBLIC :: dbcsr_type_antisymmetric
68 PUBLIC :: dbcsr_transpose
69 PUBLIC :: dbcsr_no_transpose
70
71 ! types
72 PUBLIC :: dbcsr_type
73 PUBLIC :: dbcsr_p_type
75 PUBLIC :: dbcsr_iterator_type
76
77 ! lib init/finalize
78 PUBLIC :: dbcsr_clear_mempools
79 PUBLIC :: dbcsr_init_lib
80 PUBLIC :: dbcsr_finalize_lib
81 PUBLIC :: dbcsr_set_config
82 PUBLIC :: dbcsr_get_default_config
83 PUBLIC :: dbcsr_print_config
84 PUBLIC :: dbcsr_reset_randmat_seed
85 PUBLIC :: dbcsr_mp_grid_setup
86 PUBLIC :: dbcsr_print_statistics
87
88 ! create / release
92 PUBLIC :: dbcsr_create
93 PUBLIC :: dbcsr_init_p
94 PUBLIC :: dbcsr_release
95 PUBLIC :: dbcsr_release_p
97
98 ! primitive matrix operations
99 PUBLIC :: dbcsr_set
100 PUBLIC :: dbcsr_add
101 PUBLIC :: dbcsr_scale
102 PUBLIC :: dbcsr_transposed
103 PUBLIC :: dbcsr_multiply
104 PUBLIC :: dbcsr_copy
105 PUBLIC :: dbcsr_desymmetrize
106 PUBLIC :: dbcsr_filter
108 PUBLIC :: dbcsr_reserve_blocks
109 PUBLIC :: dbcsr_put_block
110 PUBLIC :: dbcsr_get_block_p
112 PUBLIC :: dbcsr_clear
113
114 ! iterator
115 PUBLIC :: dbcsr_iterator_start
117 PUBLIC :: dbcsr_iterator_stop
120
121 ! getters
122 PUBLIC :: dbcsr_get_info
123 PUBLIC :: dbcsr_distribution_get
124 PUBLIC :: dbcsr_get_matrix_type
125 PUBLIC :: dbcsr_get_occupation
126 PUBLIC :: dbcsr_get_num_blocks
127 PUBLIC :: dbcsr_get_data_size
128 PUBLIC :: dbcsr_has_symmetry
130 PUBLIC :: dbcsr_valid_index
131
132 ! work operations
133 PUBLIC :: dbcsr_work_create
134 PUBLIC :: dbcsr_verify_matrix
135 PUBLIC :: dbcsr_get_data_p
136 PUBLIC :: dbcsr_finalize
137
138 ! replication
139 PUBLIC :: dbcsr_replicate_all
140 PUBLIC :: dbcsr_sum_replicated
141 PUBLIC :: dbcsr_distribute
142
143 ! misc
144 PUBLIC :: dbcsr_distribution_get_num_images
145 PUBLIC :: dbcsr_convert_offsets_to_sizes
146 PUBLIC :: dbcsr_convert_sizes_to_offsets
147 PUBLIC :: dbcsr_run_tests
148 PUBLIC :: dbcsr_test_mm
149 PUBLIC :: dbcsr_dot_threadsafe
150
151 ! csr conversion
152 PUBLIC :: dbcsr_csr_type
153 PUBLIC :: dbcsr_csr_p_type
157 PUBLIC :: dbcsr_csr_destroy
158 PUBLIC :: dbcsr_csr_create
159 PUBLIC :: dbcsr_csr_eqrow_floor_dist
160 PUBLIC :: dbcsr_csr_dbcsr_blkrow_dist
161 PUBLIC :: dbcsr_csr_print_sparsity
162 PUBLIC :: dbcsr_csr_write
164 PUBLIC :: dbcsr_csr_type_real_8
165
166 ! binary io
167 PUBLIC :: dbcsr_binary_write
168 PUBLIC :: dbcsr_binary_read
169
171 TYPE(dbcsr_type), POINTER :: matrix => null()
172 END TYPE
173
175 PRIVATE
176 TYPE(dbcsr_type_prv) :: dbcsr = dbcsr_type_prv()
177 TYPE(dbm_type) :: dbm = dbm_type()
178 END TYPE dbcsr_type
179
181 PRIVATE
182 TYPE(dbcsr_distribution_type_prv) :: dbcsr = dbcsr_distribution_type_prv()
185
187 PRIVATE
188 TYPE(dbcsr_iterator_type_prv) :: dbcsr = dbcsr_iterator_type_prv()
189 TYPE(dbm_iterator) :: dbm = dbm_iterator()
190 END TYPE dbcsr_iterator_type
191
192 INTERFACE dbcsr_create
193 MODULE PROCEDURE dbcsr_create_new, dbcsr_create_template
194 END INTERFACE
195
196 LOGICAL, PARAMETER, PRIVATE :: USE_DBCSR_BACKEND = .true.
197
198CONTAINS
199
200! **************************************************************************************************
201!> \brief ...
202!> \param matrix ...
203! **************************************************************************************************
204 SUBROUTINE dbcsr_init_p(matrix)
205 TYPE(dbcsr_type), POINTER :: matrix
206
207 IF (ASSOCIATED(matrix)) THEN
208 CALL dbcsr_release(matrix)
209 DEALLOCATE (matrix)
210 END IF
211
212 ALLOCATE (matrix)
213 END SUBROUTINE dbcsr_init_p
214
215! **************************************************************************************************
216!> \brief ...
217!> \param matrix ...
218! **************************************************************************************************
219 SUBROUTINE dbcsr_release_p(matrix)
220 TYPE(dbcsr_type), POINTER :: matrix
221
222 IF (ASSOCIATED(matrix)) THEN
223 CALL dbcsr_release(matrix)
224 DEALLOCATE (matrix)
225 END IF
226 END SUBROUTINE dbcsr_release_p
227
228! **************************************************************************************************
229!> \brief ...
230!> \param matrix ...
231! **************************************************************************************************
232 SUBROUTINE dbcsr_deallocate_matrix(matrix)
233 TYPE(dbcsr_type), POINTER :: matrix
234
235 CALL dbcsr_release(matrix)
236 IF (dbcsr_valid_index(matrix)) &
237 CALL cp_abort(__location__, &
238 'You should not "deallocate" a referenced matrix. '// &
239 'Avoid pointers to DBCSR matrices.')
240 DEALLOCATE (matrix)
241 END SUBROUTINE dbcsr_deallocate_matrix
242
243! **************************************************************************************************
244!> \brief ...
245!> \param matrix_a ...
246!> \param matrix_b ...
247!> \param alpha_scalar ...
248!> \param beta_scalar ...
249! **************************************************************************************************
250 SUBROUTINE dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
251 TYPE(dbcsr_type), INTENT(INOUT) :: matrix_a
252 TYPE(dbcsr_type), INTENT(IN) :: matrix_b
253 REAL(kind=dp), INTENT(IN) :: alpha_scalar, beta_scalar
254
255 IF (use_dbcsr_backend) THEN
256 CALL dbcsr_add_prv(matrix_a%dbcsr, matrix_b%dbcsr, alpha_scalar, beta_scalar)
257 ELSE
258 IF (alpha_scalar /= 1.0_dp .OR. beta_scalar /= 1.0_dp) cpabort("Not yet implemented for DBM.")
259 CALL dbm_add(matrix_a%dbm, matrix_b%dbm)
260 END IF
261 END SUBROUTINE dbcsr_add
262
263! **************************************************************************************************
264!> \brief ...
265!> \param filepath ...
266!> \param distribution ...
267!> \param matrix_new ...
268! **************************************************************************************************
269 SUBROUTINE dbcsr_binary_read(filepath, distribution, matrix_new)
270 CHARACTER(len=*), INTENT(IN) :: filepath
271 TYPE(dbcsr_distribution_type), INTENT(IN) :: distribution
272 TYPE(dbcsr_type), INTENT(INOUT) :: matrix_new
273
274 IF (use_dbcsr_backend) THEN
275 CALL dbcsr_binary_read_prv(filepath, distribution%dbcsr, matrix_new%dbcsr)
276 ELSE
277 cpabort("Not yet implemented for DBM.")
278 END IF
279 END SUBROUTINE dbcsr_binary_read
280
281! **************************************************************************************************
282!> \brief ...
283!> \param matrix ...
284!> \param filepath ...
285! **************************************************************************************************
286 SUBROUTINE dbcsr_binary_write(matrix, filepath)
287 TYPE(dbcsr_type), INTENT(INOUT) :: matrix
288 CHARACTER(LEN=*), INTENT(IN) :: filepath
289
290 IF (use_dbcsr_backend) THEN
291 CALL dbcsr_binary_write_prv(matrix%dbcsr, filepath)
292 ELSE
293 cpabort("Not yet implemented for DBM.")
294 END IF
295 END SUBROUTINE dbcsr_binary_write
296
297! **************************************************************************************************
298!> \brief ...
299!> \param matrix ...
300! **************************************************************************************************
301 SUBROUTINE dbcsr_clear(matrix)
302 TYPE(dbcsr_type), INTENT(INOUT) :: matrix
303
304 IF (use_dbcsr_backend) THEN
305 CALL dbcsr_clear_prv(matrix%dbcsr)
306 ELSE
307 CALL dbm_clear(matrix%dbm)
308 END IF
309 END SUBROUTINE
310
311! **************************************************************************************************
312!> \brief ...
313!> \param matrix ...
314!> \param redist ...
315! **************************************************************************************************
316 SUBROUTINE dbcsr_complete_redistribute(matrix, redist)
317 TYPE(dbcsr_type), INTENT(IN) :: matrix
318 TYPE(dbcsr_type), INTENT(INOUT) :: redist
319
320 IF (use_dbcsr_backend) THEN
321 CALL dbcsr_complete_redistribute_prv(matrix%dbcsr, redist%dbcsr)
322 ELSE
323 CALL dbm_redistribute(matrix%dbm, redist%dbm)
324 END IF
325 END SUBROUTINE dbcsr_complete_redistribute
326
327! **************************************************************************************************
328!> \brief ...
329!> \param dbcsr_mat ...
330!> \param csr_mat ...
331! **************************************************************************************************
332 SUBROUTINE dbcsr_convert_csr_to_dbcsr(dbcsr_mat, csr_mat)
333 TYPE(dbcsr_type), INTENT(INOUT) :: dbcsr_mat
334 TYPE(dbcsr_csr_type), INTENT(INOUT) :: csr_mat
335
336 IF (use_dbcsr_backend) THEN
337 CALL convert_csr_to_dbcsr_prv(dbcsr_mat%dbcsr, csr_mat)
338 ELSE
339 cpabort("Not yet implemented for DBM.")
340 END IF
341 END SUBROUTINE dbcsr_convert_csr_to_dbcsr
342
343! **************************************************************************************************
344!> \brief ...
345!> \param dbcsr_mat ...
346!> \param csr_mat ...
347! **************************************************************************************************
348 SUBROUTINE dbcsr_convert_dbcsr_to_csr(dbcsr_mat, csr_mat)
349 TYPE(dbcsr_type), INTENT(IN) :: dbcsr_mat
350 TYPE(dbcsr_csr_type), INTENT(INOUT) :: csr_mat
351
352 IF (use_dbcsr_backend) THEN
353 CALL convert_dbcsr_to_csr_prv(dbcsr_mat%dbcsr, csr_mat)
354 ELSE
355 cpabort("Not yet implemented for DBM.")
356 END IF
357 END SUBROUTINE dbcsr_convert_dbcsr_to_csr
358
359! **************************************************************************************************
360!> \brief ...
361!> \param matrix_b ...
362!> \param matrix_a ...
363!> \param name ...
364!> \param keep_sparsity ...
365!> \param keep_imaginary ...
366! **************************************************************************************************
367 SUBROUTINE dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
368 TYPE(dbcsr_type), INTENT(INOUT) :: matrix_b
369 TYPE(dbcsr_type), INTENT(IN) :: matrix_a
370 CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: name
371 LOGICAL, INTENT(IN), OPTIONAL :: keep_sparsity, keep_imaginary
372
373 IF (use_dbcsr_backend) THEN
374 CALL dbcsr_copy_prv(matrix_b%dbcsr, matrix_a%dbcsr, name=name, &
375 keep_sparsity=keep_sparsity, keep_imaginary=keep_imaginary)
376 ELSE
377 IF (PRESENT(name) .OR. PRESENT(keep_sparsity) .OR. PRESENT(keep_imaginary)) THEN
378 cpabort("Not yet implemented for DBM.")
379 END IF
380 CALL dbm_copy(matrix_b%dbm, matrix_a%dbm)
381 END IF
382 END SUBROUTINE dbcsr_copy
383
384! **************************************************************************************************
385!> \brief ...
386!> \param matrix ...
387!> \param name ...
388!> \param dist ...
389!> \param matrix_type ...
390!> \param row_blk_size ...
391!> \param col_blk_size ...
392!> \param reuse_arrays ...
393!> \param mutable_work ...
394! **************************************************************************************************
395 SUBROUTINE dbcsr_create_new(matrix, name, dist, matrix_type, row_blk_size, col_blk_size, &
396 reuse_arrays, mutable_work)
397 TYPE(dbcsr_type), INTENT(INOUT) :: matrix
398 CHARACTER(len=*), INTENT(IN) :: name
399 TYPE(dbcsr_distribution_type), INTENT(IN) :: dist
400 CHARACTER, INTENT(IN) :: matrix_type
401 INTEGER, DIMENSION(:), INTENT(INOUT), POINTER :: row_blk_size, col_blk_size
402 LOGICAL, INTENT(IN), OPTIONAL :: reuse_arrays, mutable_work
403
404 IF (use_dbcsr_backend) THEN
405 CALL dbcsr_create_prv(matrix=matrix%dbcsr, name=name, dist=dist%dbcsr, &
406 matrix_type=matrix_type, row_blk_size=row_blk_size, &
407 col_blk_size=col_blk_size, nze=0, data_type=dbcsr_type_real_8, &
408 reuse_arrays=reuse_arrays, mutable_work=mutable_work)
409 ELSE
410 cpabort("Not yet implemented for DBM.")
411 END IF
412 END SUBROUTINE dbcsr_create_new
413
414! **************************************************************************************************
415!> \brief ...
416!> \param matrix ...
417!> \param name ...
418!> \param template ...
419!> \param dist ...
420!> \param matrix_type ...
421!> \param row_blk_size ...
422!> \param col_blk_size ...
423!> \param reuse_arrays ...
424!> \param mutable_work ...
425! **************************************************************************************************
426 SUBROUTINE dbcsr_create_template(matrix, name, template, dist, matrix_type, &
427 row_blk_size, col_blk_size, reuse_arrays, mutable_work)
428 TYPE(dbcsr_type), INTENT(INOUT) :: matrix
429 CHARACTER(len=*), INTENT(IN), OPTIONAL :: name
430 TYPE(dbcsr_type), INTENT(IN) :: template
431 TYPE(dbcsr_distribution_type), INTENT(IN), &
432 OPTIONAL :: dist
433 CHARACTER, INTENT(IN), OPTIONAL :: matrix_type
434 INTEGER, DIMENSION(:), INTENT(INOUT), OPTIONAL, &
435 POINTER :: row_blk_size, col_blk_size
436 LOGICAL, INTENT(IN), OPTIONAL :: reuse_arrays, mutable_work
437
438 IF (use_dbcsr_backend) THEN
439 CALL dbcsr_create_prv(matrix=matrix%dbcsr, name=name, template=template%dbcsr, &
440 dist=dist%dbcsr, matrix_type=matrix_type, &
441 row_blk_size=row_blk_size, col_blk_size=col_blk_size, &
442 nze=0, data_type=dbcsr_type_real_8, reuse_arrays=reuse_arrays, &
443 mutable_work=mutable_work)
444 ELSE
445 cpabort("Not yet implemented for DBM.")
446 END IF
447 END SUBROUTINE dbcsr_create_template
448
449! **************************************************************************************************
450!> \brief ...
451!> \param dbcsr_mat ...
452!> \param csr_mat ...
453!> \param dist_format ...
454!> \param csr_sparsity ...
455!> \param numnodes ...
456! **************************************************************************************************
457 SUBROUTINE dbcsr_csr_create_from_dbcsr(dbcsr_mat, csr_mat, dist_format, csr_sparsity, numnodes)
458
459 TYPE(dbcsr_type), INTENT(IN) :: dbcsr_mat
460 TYPE(dbcsr_csr_type), INTENT(OUT) :: csr_mat
461 INTEGER :: dist_format
462 TYPE(dbcsr_type), INTENT(IN), OPTIONAL :: csr_sparsity
463 INTEGER, INTENT(IN), OPTIONAL :: numnodes
464
465 IF (use_dbcsr_backend) THEN
466 IF (PRESENT(csr_sparsity)) THEN
467 CALL dbcsr_csr_create_from_dbcsr_prv(dbcsr_mat%dbcsr, csr_mat, dist_format, &
468 csr_sparsity%dbcsr, numnodes)
469 ELSE
470 CALL dbcsr_csr_create_from_dbcsr_prv(dbcsr_mat%dbcsr, csr_mat, &
471 dist_format, numnodes=numnodes)
472 END IF
473 ELSE
474 cpabort("Not yet implemented for DBM.")
475 END IF
476 END SUBROUTINE dbcsr_csr_create_from_dbcsr
477
478! **************************************************************************************************
479!> \brief Combines csr_create_from_dbcsr and convert_dbcsr_to_csr to produce a complex CSR matrix.
480!> \param rmatrix Real part of the matrix.
481!> \param imatrix Imaginary part of the matrix.
482!> \param csr_mat The resulting CSR matrix.
483!> \param dist_format ...
484! **************************************************************************************************
485 SUBROUTINE dbcsr_csr_create_and_convert_complex(rmatrix, imatrix, csr_mat, dist_format)
486 TYPE(dbcsr_type), INTENT(IN) :: rmatrix, imatrix
487 TYPE(dbcsr_csr_type), INTENT(INOUT) :: csr_mat
488 INTEGER :: dist_format
489
490 COMPLEX(KIND=dp), PARAMETER :: ione = cmplx(0.0_dp, 1.0_dp, kind=dp), &
491 rone = cmplx(1.0_dp, 0.0_dp, kind=dp)
492
493 TYPE(dbcsr_type) :: cmatrix, tmp_matrix
494
495 IF (use_dbcsr_backend) THEN
496 CALL dbcsr_create_prv(tmp_matrix%dbcsr, template=rmatrix%dbcsr, data_type=dbcsr_type_complex_8)
497 CALL dbcsr_create_prv(cmatrix%dbcsr, template=rmatrix%dbcsr, data_type=dbcsr_type_complex_8)
498 CALL dbcsr_copy_prv(cmatrix%dbcsr, rmatrix%dbcsr)
499 CALL dbcsr_copy_prv(tmp_matrix%dbcsr, imatrix%dbcsr)
500 CALL dbcsr_add_prv(cmatrix%dbcsr, tmp_matrix%dbcsr, rone, ione)
501 CALL dbcsr_release_prv(tmp_matrix%dbcsr)
502 ! Convert to csr
503 CALL dbcsr_csr_create_from_dbcsr_prv(cmatrix%dbcsr, csr_mat, dist_format)
504 CALL convert_dbcsr_to_csr_prv(cmatrix%dbcsr, csr_mat)
505 CALL dbcsr_release_prv(cmatrix%dbcsr)
506 ELSE
507 cpabort("Not yet implemented for DBM.")
508 END IF
510
511! **************************************************************************************************
512!> \brief ...
513!> \param matrix_a ...
514!> \param matrix_b ...
515! **************************************************************************************************
516 SUBROUTINE dbcsr_desymmetrize(matrix_a, matrix_b)
517 TYPE(dbcsr_type), INTENT(IN) :: matrix_a
518 TYPE(dbcsr_type), INTENT(INOUT) :: matrix_b
519
520 IF (use_dbcsr_backend) THEN
521 CALL dbcsr_desymmetrize_prv(matrix_a%dbcsr, matrix_b%dbcsr)
522 ELSE
523 cpabort("Not yet implemented for DBM.")
524 END IF
525 END SUBROUTINE dbcsr_desymmetrize
526
527! **************************************************************************************************
528!> \brief ...
529!> \param matrix ...
530! **************************************************************************************************
531 SUBROUTINE dbcsr_distribute(matrix)
532 TYPE(dbcsr_type), INTENT(INOUT) :: matrix
533
534 IF (use_dbcsr_backend) THEN
535 CALL dbcsr_distribute_prv(matrix%dbcsr)
536 ELSE
537 cpabort("Not yet implemented for DBM.")
538 END IF
539 END SUBROUTINE dbcsr_distribute
540
541! **************************************************************************************************
542!> \brief ...
543!> \param dist ...
544!> \param row_dist ...
545!> \param col_dist ...
546!> \param nrows ...
547!> \param ncols ...
548!> \param has_threads ...
549!> \param group ...
550!> \param mynode ...
551!> \param numnodes ...
552!> \param nprows ...
553!> \param npcols ...
554!> \param myprow ...
555!> \param mypcol ...
556!> \param pgrid ...
557!> \param subgroups_defined ...
558!> \param prow_group ...
559!> \param pcol_group ...
560! **************************************************************************************************
561 SUBROUTINE dbcsr_distribution_get(dist, row_dist, col_dist, nrows, ncols, has_threads, &
562 group, mynode, numnodes, nprows, npcols, myprow, mypcol, &
563 pgrid, subgroups_defined, prow_group, pcol_group)
564 TYPE(dbcsr_distribution_type), INTENT(IN) :: dist
565 INTEGER, DIMENSION(:), OPTIONAL, POINTER :: row_dist, col_dist
566 INTEGER, INTENT(OUT), OPTIONAL :: nrows, ncols
567 LOGICAL, INTENT(OUT), OPTIONAL :: has_threads
568 INTEGER, INTENT(OUT), OPTIONAL :: group, mynode, numnodes, nprows, npcols, &
569 myprow, mypcol
570 INTEGER, DIMENSION(:, :), OPTIONAL, POINTER :: pgrid
571 LOGICAL, INTENT(OUT), OPTIONAL :: subgroups_defined
572 INTEGER, INTENT(OUT), OPTIONAL :: prow_group, pcol_group
573
574 IF (use_dbcsr_backend) THEN
575 CALL dbcsr_distribution_get_prv(dist%dbcsr, row_dist, col_dist, nrows, ncols, has_threads, &
576 group, mynode, numnodes, nprows, npcols, myprow, mypcol, &
577 pgrid, subgroups_defined, prow_group, pcol_group)
578 ELSE
579 cpabort("Not yet implemented for DBM.")
580 END IF
581 END SUBROUTINE dbcsr_distribution_get
582
583! **************************************************************************************************
584!> \brief ...
585!> \param dist ...
586! **************************************************************************************************
587 SUBROUTINE dbcsr_distribution_hold(dist)
588 TYPE(dbcsr_distribution_type) :: dist
589
590 IF (use_dbcsr_backend) THEN
591 CALL dbcsr_distribution_hold_prv(dist%dbcsr)
592 ELSE
593 cpabort("Not yet implemented for DBM.")
594 END IF
595 END SUBROUTINE dbcsr_distribution_hold
596
597! **************************************************************************************************
598!> \brief ...
599!> \param dist ...
600!> \param template ...
601!> \param group ...
602!> \param pgrid ...
603!> \param row_dist ...
604!> \param col_dist ...
605!> \param reuse_arrays ...
606! **************************************************************************************************
607 SUBROUTINE dbcsr_distribution_new(dist, template, group, pgrid, row_dist, col_dist, reuse_arrays)
608 TYPE(dbcsr_distribution_type), INTENT(OUT) :: dist
609 TYPE(dbcsr_distribution_type), INTENT(IN), &
610 OPTIONAL :: template
611 INTEGER, INTENT(IN), OPTIONAL :: group
612 INTEGER, DIMENSION(:, :), OPTIONAL, POINTER :: pgrid
613 INTEGER, DIMENSION(:), INTENT(INOUT), POINTER :: row_dist, col_dist
614 LOGICAL, INTENT(IN), OPTIONAL :: reuse_arrays
615
616 IF (use_dbcsr_backend) THEN
617 CALL dbcsr_distribution_new_prv(dist%dbcsr, template%dbcsr, group, pgrid, &
618 row_dist, col_dist, reuse_arrays)
619 ELSE
620 cpabort("Not yet implemented for DBM.")
621 END IF
622 END SUBROUTINE dbcsr_distribution_new
623
624! **************************************************************************************************
625!> \brief ...
626!> \param dist ...
627! **************************************************************************************************
629 TYPE(dbcsr_distribution_type) :: dist
630
631 IF (use_dbcsr_backend) THEN
632 CALL dbcsr_distribution_release_prv(dist%dbcsr)
633 ELSE
634 cpabort("Not yet implemented for DBM.")
635 END IF
636 END SUBROUTINE dbcsr_distribution_release
637
638! **************************************************************************************************
639!> \brief ...
640!> \param matrix ...
641!> \param eps ...
642! **************************************************************************************************
643 SUBROUTINE dbcsr_filter(matrix, eps)
644 TYPE(dbcsr_type), INTENT(INOUT) :: matrix
645 REAL(dp), INTENT(IN) :: eps
646
647 IF (use_dbcsr_backend) THEN
648 CALL dbcsr_filter_prv(matrix%dbcsr, eps)
649 ELSE
650 cpabort("Not yet implemented for DBM.")
651 END IF
652 END SUBROUTINE dbcsr_filter
653
654! **************************************************************************************************
655!> \brief ...
656!> \param matrix ...
657! **************************************************************************************************
658 SUBROUTINE dbcsr_finalize(matrix)
659 TYPE(dbcsr_type), INTENT(INOUT) :: matrix
660
661 IF (use_dbcsr_backend) THEN
662 CALL dbcsr_finalize_prv(matrix%dbcsr)
663 ELSE
664 cpabort("Not yet implemented for DBM.")
665 END IF
666 END SUBROUTINE dbcsr_finalize
667
668! **************************************************************************************************
669!> \brief ...
670!> \param matrix ...
671!> \param row ...
672!> \param col ...
673!> \param block ...
674!> \param found ...
675!> \param row_size ...
676!> \param col_size ...
677! **************************************************************************************************
678 SUBROUTINE dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
679 TYPE(dbcsr_type), INTENT(INOUT) :: matrix
680 INTEGER, INTENT(IN) :: row, col
681 REAL(kind=dp), DIMENSION(:, :), POINTER :: block
682 LOGICAL, INTENT(OUT) :: found
683 INTEGER, INTENT(OUT), OPTIONAL :: row_size, col_size
684
685 IF (use_dbcsr_backend) THEN
686 CALL dbcsr_get_block_p_prv(matrix%dbcsr, row, col, block, found, row_size, col_size)
687 ELSE
688 cpabort("Not yet implemented for DBM.")
689 END IF
690 END SUBROUTINE dbcsr_get_block_p
691
692! **************************************************************************************************
693!> \brief Like dbcsr_get_block_p() but with matrix being INTENT(IN).
694!> When invoking this routine, the caller promises not to modify the returned block.
695!> \param matrix ...
696!> \param row ...
697!> \param col ...
698!> \param block ...
699!> \param found ...
700!> \param row_size ...
701!> \param col_size ...
702! **************************************************************************************************
703 SUBROUTINE dbcsr_get_readonly_block_p(matrix, row, col, block, found, row_size, col_size)
704 TYPE(dbcsr_type), INTENT(IN), TARGET :: matrix
705 INTEGER, INTENT(IN) :: row, col
706 REAL(kind=dp), DIMENSION(:, :), POINTER :: block
707 LOGICAL, INTENT(OUT) :: found
708 INTEGER, INTENT(OUT), OPTIONAL :: row_size, col_size
709
710 TYPE(dbcsr_type), POINTER :: matrix_p
711
712 mark_used(matrix)
713 mark_used(row)
714 mark_used(col)
715 mark_used(block)
716 mark_used(found)
717 mark_used(row_size)
718 mark_used(col_size)
719 IF (use_dbcsr_backend) THEN
720 matrix_p => matrix ! Hacky workaround to shake the INTENT(IN).
721 CALL dbcsr_get_block_p_prv(matrix_p%dbcsr, row, col, block, found, row_size, col_size)
722 ELSE
723 cpabort("Not yet implemented for DBM.")
724 END IF
725 END SUBROUTINE dbcsr_get_readonly_block_p
726
727! **************************************************************************************************
728!> \brief ...
729!> \param matrix ...
730!> \param lb ...
731!> \param ub ...
732!> \return ...
733! **************************************************************************************************
734 FUNCTION dbcsr_get_data_p(matrix, lb, ub) RESULT(res)
735 TYPE(dbcsr_type), INTENT(IN) :: matrix
736 INTEGER, INTENT(IN), OPTIONAL :: lb, ub
737 REAL(kind=dp), DIMENSION(:), POINTER :: res
738
739 IF (use_dbcsr_backend) THEN
740 res => dbcsr_get_data_p_prv(matrix%dbcsr, select_data_type=0.0_dp, lb=lb, ub=ub)
741 ELSE
742 cpabort("Not yet implemented for DBM.")
743 END IF
744 END FUNCTION dbcsr_get_data_p
745
746! **************************************************************************************************
747!> \brief ...
748!> \param matrix ...
749!> \return ...
750! **************************************************************************************************
751 FUNCTION dbcsr_get_data_size(matrix) RESULT(data_size)
752 TYPE(dbcsr_type), INTENT(IN) :: matrix
753 INTEGER :: data_size
754
755 IF (use_dbcsr_backend) THEN
756 data_size = dbcsr_get_data_size_prv(matrix%dbcsr)
757 ELSE
758 cpabort("Not yet implemented for DBM.")
759 END IF
760 END FUNCTION dbcsr_get_data_size
761
762! **************************************************************************************************
763!> \brief ...
764!> \param matrix ...
765!> \param nblkrows_total ...
766!> \param nblkcols_total ...
767!> \param nfullrows_total ...
768!> \param nfullcols_total ...
769!> \param nblkrows_local ...
770!> \param nblkcols_local ...
771!> \param nfullrows_local ...
772!> \param nfullcols_local ...
773!> \param my_prow ...
774!> \param my_pcol ...
775!> \param local_rows ...
776!> \param local_cols ...
777!> \param proc_row_dist ...
778!> \param proc_col_dist ...
779!> \param row_blk_size ...
780!> \param col_blk_size ...
781!> \param row_blk_offset ...
782!> \param col_blk_offset ...
783!> \param distribution ...
784!> \param name ...
785!> \param matrix_type ...
786!> \param group ...
787! **************************************************************************************************
788 SUBROUTINE dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, &
789 nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, &
790 nfullrows_local, nfullcols_local, my_prow, my_pcol, &
791 local_rows, local_cols, proc_row_dist, proc_col_dist, &
792 row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, &
793 distribution, name, matrix_type, group)
794 TYPE(dbcsr_type), INTENT(IN) :: matrix
795 INTEGER, INTENT(OUT), OPTIONAL :: nblkrows_total, nblkcols_total, nfullrows_total, &
796 nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, &
797 my_prow, my_pcol
798 INTEGER, DIMENSION(:), OPTIONAL, POINTER :: local_rows, local_cols, proc_row_dist, &
799 proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset
800 TYPE(dbcsr_distribution_type), INTENT(OUT), &
801 OPTIONAL :: distribution
802 CHARACTER(len=*), INTENT(OUT), OPTIONAL :: name
803 CHARACTER, INTENT(OUT), OPTIONAL :: matrix_type
804 TYPE(mp_comm_type), INTENT(OUT), OPTIONAL :: group
805
806 INTEGER :: group_handle
807 TYPE(dbcsr_distribution_type_prv) :: my_distribution
808
809 IF (use_dbcsr_backend) THEN
810 CALL dbcsr_get_info_prv(matrix=matrix%dbcsr, &
811 nblkrows_total=nblkrows_total, &
812 nblkcols_total=nblkcols_total, &
813 nfullrows_total=nfullrows_total, &
814 nfullcols_total=nfullcols_total, &
815 nblkrows_local=nblkrows_local, &
816 nblkcols_local=nblkcols_local, &
817 nfullrows_local=nfullrows_local, &
818 nfullcols_local=nfullcols_local, &
819 my_prow=my_prow, &
820 my_pcol=my_pcol, &
821 local_rows=local_rows, &
822 local_cols=local_cols, &
823 proc_row_dist=proc_row_dist, &
824 proc_col_dist=proc_col_dist, &
825 row_blk_size=row_blk_size, &
826 col_blk_size=col_blk_size, &
827 row_blk_offset=row_blk_offset, &
828 col_blk_offset=col_blk_offset, &
829 distribution=my_distribution, &
830 name=name, &
831 matrix_type=matrix_type, &
832 group=group_handle)
833
834 IF (PRESENT(distribution)) distribution%dbcsr = my_distribution
835 IF (PRESENT(group)) CALL group%set_handle(group_handle)
836 ELSE
837 cpabort("Not yet implemented for DBM.")
838 END IF
839 END SUBROUTINE dbcsr_get_info
840
841! **************************************************************************************************
842!> \brief ...
843!> \param matrix ...
844!> \return ...
845! **************************************************************************************************
846 FUNCTION dbcsr_get_matrix_type(matrix) RESULT(matrix_type)
847 TYPE(dbcsr_type), INTENT(IN) :: matrix
848 CHARACTER :: matrix_type
849
850 IF (use_dbcsr_backend) THEN
851 matrix_type = dbcsr_get_matrix_type_prv(matrix%dbcsr)
852 ELSE
853 cpabort("Not yet implemented for DBM.")
854 END IF
855 END FUNCTION dbcsr_get_matrix_type
856
857! **************************************************************************************************
858!> \brief ...
859!> \param matrix ...
860!> \return ...
861! **************************************************************************************************
862 FUNCTION dbcsr_get_num_blocks(matrix) RESULT(num_blocks)
863 TYPE(dbcsr_type), INTENT(IN) :: matrix
864 INTEGER :: num_blocks
865
866 IF (use_dbcsr_backend) THEN
867 num_blocks = dbcsr_get_num_blocks_prv(matrix%dbcsr)
868 ELSE
869 cpabort("Not yet implemented for DBM.")
870 END IF
871 END FUNCTION dbcsr_get_num_blocks
872
873! **************************************************************************************************
874!> \brief ...
875!> \param matrix ...
876!> \return ...
877! **************************************************************************************************
878 FUNCTION dbcsr_get_occupation(matrix) RESULT(occupation)
879 TYPE(dbcsr_type), INTENT(IN) :: matrix
880 REAL(kind=dp) :: occupation
881
882 IF (use_dbcsr_backend) THEN
883 occupation = dbcsr_get_occupation_prv(matrix%dbcsr)
884 ELSE
885 cpabort("Not yet implemented for DBM.")
886 END IF
887 END FUNCTION dbcsr_get_occupation
888
889! **************************************************************************************************
890!> \brief ...
891!> \param matrix ...
892!> \param row ...
893!> \param column ...
894!> \param processor ...
895! **************************************************************************************************
896 SUBROUTINE dbcsr_get_stored_coordinates(matrix, row, column, processor)
897 TYPE(dbcsr_type), INTENT(IN) :: matrix
898 INTEGER, INTENT(IN) :: row, column
899 INTEGER, INTENT(OUT) :: processor
900
901 IF (use_dbcsr_backend) THEN
902 CALL dbcsr_get_stored_coordinates_prv(matrix%dbcsr, row, column, processor)
903 ELSE
904 cpabort("Not yet implemented for DBM.")
905 END IF
906 END SUBROUTINE dbcsr_get_stored_coordinates
907
908! **************************************************************************************************
909!> \brief ...
910!> \param matrix ...
911!> \return ...
912! **************************************************************************************************
913 FUNCTION dbcsr_has_symmetry(matrix) RESULT(has_symmetry)
914 TYPE(dbcsr_type), INTENT(IN) :: matrix
915 LOGICAL :: has_symmetry
916
917 IF (use_dbcsr_backend) THEN
918 has_symmetry = dbcsr_has_symmetry_prv(matrix%dbcsr)
919 ELSE
920 cpabort("Not yet implemented for DBM.")
921 END IF
922 END FUNCTION dbcsr_has_symmetry
923
924! **************************************************************************************************
925!> \brief ...
926!> \param iterator ...
927!> \return ...
928! **************************************************************************************************
929 FUNCTION dbcsr_iterator_blocks_left(iterator) RESULT(blocks_left)
930 TYPE(dbcsr_iterator_type), INTENT(IN) :: iterator
931 LOGICAL :: blocks_left
932
933 IF (use_dbcsr_backend) THEN
934 blocks_left = dbcsr_iterator_blocks_left_prv(iterator%dbcsr)
935 ELSE
936 cpabort("Not yet implemented for DBM.")
937 END IF
938 END FUNCTION dbcsr_iterator_blocks_left
939
940! **************************************************************************************************
941!> \brief ...
942!> \param iterator ...
943!> \param row ...
944!> \param column ...
945!> \param block ...
946!> \param block_number_argument_has_been_removed ...
947!> \param row_size ...
948!> \param col_size ...
949!> \param row_offset ...
950!> \param col_offset ...
951! **************************************************************************************************
952 SUBROUTINE dbcsr_iterator_next_block(iterator, row, column, block, &
953 block_number_argument_has_been_removed, &
954 row_size, col_size, &
955 row_offset, col_offset)
956 TYPE(dbcsr_iterator_type), INTENT(INOUT) :: iterator
957 INTEGER, INTENT(OUT), OPTIONAL :: row, column
958 REAL(kind=dp), DIMENSION(:, :), OPTIONAL, POINTER :: block
959 LOGICAL, OPTIONAL :: block_number_argument_has_been_removed
960 INTEGER, INTENT(OUT), OPTIONAL :: row_size, col_size, row_offset, &
961 col_offset
962
963 INTEGER :: my_column, my_row
964 REAL(kind=dp), DIMENSION(:, :), POINTER :: my_block
965
966 cpassert(.NOT. PRESENT(block_number_argument_has_been_removed))
967
968 IF (use_dbcsr_backend) THEN
969 CALL dbcsr_iterator_next_block_prv(iterator%dbcsr, row=my_row, column=my_column, &
970 block=my_block, row_size=row_size, col_size=col_size, &
971 row_offset=row_offset, col_offset=col_offset)
972 IF (PRESENT(block)) block => my_block
973 IF (PRESENT(row)) row = my_row
974 IF (PRESENT(column)) column = my_column
975 ELSE
976 cpabort("Not yet implemented for DBM.")
977 END IF
978 END SUBROUTINE dbcsr_iterator_next_block
979
980! **************************************************************************************************
981!> \brief ...
982!> \param iterator ...
983!> \param matrix ...
984!> \param shared ...
985!> \param dynamic ...
986!> \param dynamic_byrows ...
987! **************************************************************************************************
988 SUBROUTINE dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
989 TYPE(dbcsr_iterator_type), INTENT(OUT) :: iterator
990 TYPE(dbcsr_type), INTENT(INOUT) :: matrix
991 LOGICAL, INTENT(IN), OPTIONAL :: shared, dynamic, dynamic_byrows
992
993 IF (use_dbcsr_backend) THEN
994 CALL dbcsr_iterator_start_prv(iterator%dbcsr, matrix%dbcsr, shared, dynamic, dynamic_byrows)
995 ELSE
996 cpabort("Not yet implemented for DBM.")
997 END IF
998 END SUBROUTINE dbcsr_iterator_start
999
1000! **************************************************************************************************
1001!> \brief Like dbcsr_iterator_start() but with matrix being INTENT(IN).
1002!> When invoking this routine, the caller promises not to modify the returned blocks.
1003!> \param iterator ...
1004!> \param matrix ...
1005!> \param shared ...
1006!> \param dynamic ...
1007!> \param dynamic_byrows ...
1008! **************************************************************************************************
1009 SUBROUTINE dbcsr_iterator_readonly_start(iterator, matrix, shared, dynamic, dynamic_byrows)
1010 TYPE(dbcsr_iterator_type), INTENT(OUT) :: iterator
1011 TYPE(dbcsr_type), INTENT(IN) :: matrix
1012 LOGICAL, INTENT(IN), OPTIONAL :: shared, dynamic, dynamic_byrows
1013
1014 IF (use_dbcsr_backend) THEN
1015 CALL dbcsr_iterator_start_prv(iterator%dbcsr, matrix%dbcsr, shared, dynamic, &
1016 dynamic_byrows, read_only=.true.)
1017 ELSE
1018 cpabort("Not yet implemented for DBM.")
1019 END IF
1020 END SUBROUTINE dbcsr_iterator_readonly_start
1021
1022! **************************************************************************************************
1023!> \brief ...
1024!> \param iterator ...
1025! **************************************************************************************************
1026 SUBROUTINE dbcsr_iterator_stop(iterator)
1027 TYPE(dbcsr_iterator_type), INTENT(INOUT) :: iterator
1028
1029 IF (use_dbcsr_backend) THEN
1030 CALL dbcsr_iterator_stop_prv(iterator%dbcsr)
1031 ELSE
1032 cpabort("Not yet implemented for DBM.")
1033 END IF
1034 END SUBROUTINE dbcsr_iterator_stop
1035
1036! **************************************************************************************************
1037!> \brief ...
1038!> \param dist ...
1039! **************************************************************************************************
1040 SUBROUTINE dbcsr_mp_grid_setup(dist)
1041 TYPE(dbcsr_distribution_type), INTENT(INOUT) :: dist
1042
1043 IF (use_dbcsr_backend) THEN
1044 CALL dbcsr_mp_grid_setup_prv(dist%dbcsr)
1045 ELSE
1046 cpabort("Not yet implemented for DBM.")
1047 END IF
1048 END SUBROUTINE dbcsr_mp_grid_setup
1049
1050! **************************************************************************************************
1051!> \brief ...
1052!> \param transa ...
1053!> \param transb ...
1054!> \param alpha ...
1055!> \param matrix_a ...
1056!> \param matrix_b ...
1057!> \param beta ...
1058!> \param matrix_c ...
1059!> \param first_row ...
1060!> \param last_row ...
1061!> \param first_column ...
1062!> \param last_column ...
1063!> \param first_k ...
1064!> \param last_k ...
1065!> \param retain_sparsity ...
1066!> \param filter_eps ...
1067!> \param flop ...
1068! **************************************************************************************************
1069 SUBROUTINE dbcsr_multiply(transa, transb, alpha, matrix_a, matrix_b, beta, &
1070 matrix_c, first_row, last_row, &
1071 first_column, last_column, first_k, last_k, &
1072 retain_sparsity, filter_eps, flop)
1073 CHARACTER(LEN=1), INTENT(IN) :: transa, transb
1074 REAL(kind=dp), INTENT(IN) :: alpha
1075 TYPE(dbcsr_type), INTENT(IN) :: matrix_a, matrix_b
1076 REAL(kind=dp), INTENT(IN) :: beta
1077 TYPE(dbcsr_type), INTENT(INOUT) :: matrix_c
1078 INTEGER, INTENT(IN), OPTIONAL :: first_row, last_row, first_column, &
1079 last_column, first_k, last_k
1080 LOGICAL, INTENT(IN), OPTIONAL :: retain_sparsity
1081 REAL(kind=dp), INTENT(IN), OPTIONAL :: filter_eps
1082 INTEGER(int_8), INTENT(OUT), OPTIONAL :: flop
1083
1084 IF (use_dbcsr_backend) THEN
1085 CALL dbcsr_multiply_prv(transa, transb, alpha, matrix_a%dbcsr, matrix_b%dbcsr, beta, &
1086 matrix_c%dbcsr, first_row, last_row, first_column, last_column, &
1087 first_k, last_k, retain_sparsity, filter_eps=filter_eps, flop=flop)
1088 ELSE
1089 cpabort("Not yet implemented for DBM.")
1090 END IF
1091 END SUBROUTINE dbcsr_multiply
1092
1093! **************************************************************************************************
1094!> \brief ...
1095!> \param matrix ...
1096!> \param row ...
1097!> \param col ...
1098!> \param block ...
1099!> \param summation ...
1100! **************************************************************************************************
1101 SUBROUTINE dbcsr_put_block(matrix, row, col, block, summation)
1102 TYPE(dbcsr_type), INTENT(INOUT) :: matrix
1103 INTEGER, INTENT(IN) :: row, col
1104 REAL(kind=dp), DIMENSION(:, :), INTENT(IN) :: block
1105 LOGICAL, INTENT(IN), OPTIONAL :: summation
1106
1107 IF (use_dbcsr_backend) THEN
1108 CALL dbcsr_put_block_prv(matrix%dbcsr, row, col, block, summation=summation)
1109 ELSE
1110 cpabort("Not yet implemented for DBM.")
1111 END IF
1112 END SUBROUTINE dbcsr_put_block
1113
1114! **************************************************************************************************
1115!> \brief ...
1116!> \param matrix ...
1117! **************************************************************************************************
1118 SUBROUTINE dbcsr_release(matrix)
1119 TYPE(dbcsr_type), INTENT(INOUT) :: matrix
1120
1121 IF (use_dbcsr_backend) THEN
1122 CALL dbcsr_release_prv(matrix%dbcsr)
1123 ELSE
1124 cpabort("Not yet implemented for DBM.")
1125 END IF
1126 END SUBROUTINE dbcsr_release
1127
1128! **************************************************************************************************
1129!> \brief ...
1130!> \param matrix ...
1131! **************************************************************************************************
1132 SUBROUTINE dbcsr_replicate_all(matrix)
1133 TYPE(dbcsr_type), INTENT(INOUT) :: matrix
1134
1135 IF (use_dbcsr_backend) THEN
1136 CALL dbcsr_replicate_all_prv(matrix%dbcsr)
1137 ELSE
1138 cpabort("Not yet implemented for DBM.")
1139 END IF
1140 END SUBROUTINE dbcsr_replicate_all
1141
1142! **************************************************************************************************
1143!> \brief ...
1144!> \param matrix ...
1145!> \param rows ...
1146!> \param cols ...
1147! **************************************************************************************************
1148 SUBROUTINE dbcsr_reserve_blocks(matrix, rows, cols)
1149 TYPE(dbcsr_type), INTENT(INOUT) :: matrix
1150 INTEGER, DIMENSION(:), INTENT(IN) :: rows, cols
1151
1152 IF (use_dbcsr_backend) THEN
1153 CALL dbcsr_reserve_blocks_prv(matrix%dbcsr, rows, cols)
1154 ELSE
1155 cpabort("Not yet implemented for DBM.")
1156 END IF
1157 END SUBROUTINE dbcsr_reserve_blocks
1158
1159! **************************************************************************************************
1160!> \brief ...
1161!> \param matrix ...
1162!> \param alpha_scalar ...
1163! **************************************************************************************************
1164 SUBROUTINE dbcsr_scale(matrix, alpha_scalar)
1165 TYPE(dbcsr_type), INTENT(INOUT) :: matrix
1166 REAL(kind=dp), INTENT(IN) :: alpha_scalar
1167
1168 IF (use_dbcsr_backend) THEN
1169 CALL dbcsr_scale_prv(matrix%dbcsr, alpha_scalar)
1170 ELSE
1171 CALL dbm_scale(matrix%dbm, alpha_scalar)
1172 END IF
1173 END SUBROUTINE dbcsr_scale
1174
1175! **************************************************************************************************
1176!> \brief ...
1177!> \param matrix ...
1178!> \param alpha ...
1179! **************************************************************************************************
1180 SUBROUTINE dbcsr_set(matrix, alpha)
1181 TYPE(dbcsr_type), INTENT(INOUT) :: matrix
1182 REAL(kind=dp), INTENT(IN) :: alpha
1183
1184 IF (use_dbcsr_backend) THEN
1185 CALL dbcsr_set_prv(matrix%dbcsr, alpha)
1186 ELSE
1187 IF (alpha == 0.0_dp) THEN
1188 CALL dbm_zero(matrix%dbm)
1189 ELSE
1190 cpabort("Not yet implemented for DBM.")
1191 END IF
1192 END IF
1193 END SUBROUTINE dbcsr_set
1194
1195! **************************************************************************************************
1196!> \brief ...
1197!> \param matrix ...
1198! **************************************************************************************************
1199 SUBROUTINE dbcsr_sum_replicated(matrix)
1200 TYPE(dbcsr_type), INTENT(inout) :: matrix
1201
1202 IF (use_dbcsr_backend) THEN
1203 CALL dbcsr_sum_replicated_prv(matrix%dbcsr)
1204 ELSE
1205 cpabort("Not yet implemented for DBM.")
1206 END IF
1207 END SUBROUTINE dbcsr_sum_replicated
1208
1209! **************************************************************************************************
1210!> \brief ...
1211!> \param transposed ...
1212!> \param normal ...
1213!> \param shallow_data_copy ...
1214!> \param transpose_distribution ...
1215!> \param use_distribution ...
1216! **************************************************************************************************
1217 SUBROUTINE dbcsr_transposed(transposed, normal, shallow_data_copy, transpose_distribution, &
1218 use_distribution)
1219 TYPE(dbcsr_type), INTENT(INOUT) :: transposed
1220 TYPE(dbcsr_type), INTENT(IN) :: normal
1221 LOGICAL, INTENT(IN), OPTIONAL :: shallow_data_copy, transpose_distribution
1222 TYPE(dbcsr_distribution_type), INTENT(IN), &
1223 OPTIONAL :: use_distribution
1224
1225 IF (use_dbcsr_backend) THEN
1226 IF (PRESENT(use_distribution)) THEN
1227 CALL dbcsr_transposed_prv(transposed%dbcsr, normal%dbcsr, &
1228 shallow_data_copy=shallow_data_copy, &
1229 transpose_distribution=transpose_distribution, &
1230 use_distribution=use_distribution%dbcsr)
1231 ELSE
1232 CALL dbcsr_transposed_prv(transposed%dbcsr, normal%dbcsr, &
1233 shallow_data_copy=shallow_data_copy, &
1234 transpose_distribution=transpose_distribution)
1235 END IF
1236 ELSE
1237 cpabort("Not yet implemented for DBM.")
1238 END IF
1239 END SUBROUTINE dbcsr_transposed
1240
1241! **************************************************************************************************
1242!> \brief ...
1243!> \param matrix ...
1244!> \return ...
1245! **************************************************************************************************
1246 FUNCTION dbcsr_valid_index(matrix) RESULT(valid_index)
1247 TYPE(dbcsr_type), INTENT(IN) :: matrix
1248 LOGICAL :: valid_index
1249
1250 IF (use_dbcsr_backend) THEN
1251 valid_index = dbcsr_valid_index_prv(matrix%dbcsr)
1252 ELSE
1253 valid_index = .true. ! Does not apply to DBM.
1254 END IF
1255 END FUNCTION dbcsr_valid_index
1256
1257! **************************************************************************************************
1258!> \brief ...
1259!> \param matrix ...
1260!> \param verbosity ...
1261!> \param local ...
1262! **************************************************************************************************
1263 SUBROUTINE dbcsr_verify_matrix(matrix, verbosity, local)
1264 TYPE(dbcsr_type), INTENT(IN) :: matrix
1265 INTEGER, INTENT(IN), OPTIONAL :: verbosity
1266 LOGICAL, INTENT(IN), OPTIONAL :: local
1267
1268 IF (use_dbcsr_backend) THEN
1269 CALL dbcsr_verify_matrix_prv(matrix%dbcsr, verbosity, local)
1270 ELSE
1271 ! Does not apply to DBM.
1272 END IF
1273 END SUBROUTINE dbcsr_verify_matrix
1274
1275! **************************************************************************************************
1276!> \brief ...
1277!> \param matrix ...
1278!> \param nblks_guess ...
1279!> \param sizedata_guess ...
1280!> \param n ...
1281!> \param work_mutable ...
1282! **************************************************************************************************
1283 SUBROUTINE dbcsr_work_create(matrix, nblks_guess, sizedata_guess, n, work_mutable)
1284 TYPE(dbcsr_type), INTENT(INOUT) :: matrix
1285 INTEGER, INTENT(IN), OPTIONAL :: nblks_guess, sizedata_guess, n
1286 LOGICAL, INTENT(in), OPTIONAL :: work_mutable
1287
1288 IF (use_dbcsr_backend) THEN
1289 CALL dbcsr_work_create_prv(matrix%dbcsr, nblks_guess, sizedata_guess, n, work_mutable)
1290 ELSE
1291 ! Does not apply to DBM.
1292 END IF
1293 END SUBROUTINE dbcsr_work_create
1294
1295! **************************************************************************************************
1296!> \brief ...
1297!> \param matrix_a ...
1298!> \param matrix_b ...
1299!> \param RESULT ...
1300! **************************************************************************************************
1301 SUBROUTINE dbcsr_dot_threadsafe(matrix_a, matrix_b, RESULT)
1302 TYPE(dbcsr_type), INTENT(IN) :: matrix_a, matrix_b
1303 REAL(kind=dp), INTENT(INOUT) :: result
1304
1305 IF (use_dbcsr_backend) THEN
1306 CALL dbcsr_dot_prv(matrix_a%dbcsr, matrix_b%dbcsr, result)
1307 ELSE
1308 cpabort("Not yet implemented for DBM.")
1309 END IF
1310 END SUBROUTINE dbcsr_dot_threadsafe
1311
1312END MODULE cp_dbcsr_api
subroutine, public dbcsr_verify_matrix(matrix, verbosity, local)
...
subroutine, public dbcsr_transposed(transposed, normal, shallow_data_copy, transpose_distribution, use_distribution)
...
subroutine, public dbcsr_distribution_release(dist)
...
logical function, public dbcsr_has_symmetry(matrix)
...
subroutine, public dbcsr_release_p(matrix)
...
integer function, public dbcsr_get_data_size(matrix)
...
subroutine, public dbcsr_get_readonly_block_p(matrix, row, col, block, found, row_size, col_size)
Like dbcsr_get_block_p() but with matrix being INTENT(IN). When invoking this routine,...
subroutine, public dbcsr_scale(matrix, alpha_scalar)
...
subroutine, public dbcsr_convert_dbcsr_to_csr(dbcsr_mat, csr_mat)
...
subroutine, public dbcsr_distribution_new(dist, template, group, pgrid, row_dist, col_dist, reuse_arrays)
...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset)
...
character function, public dbcsr_get_matrix_type(matrix)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_distribution_hold(dist)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_convert_csr_to_dbcsr(dbcsr_mat, csr_mat)
...
logical function, public dbcsr_valid_index(matrix)
...
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_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_replicate_all(matrix)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_reserve_blocks(matrix, rows, cols)
...
subroutine, public dbcsr_get_stored_coordinates(matrix, row, column, processor)
...
subroutine, public dbcsr_csr_create_and_convert_complex(rmatrix, imatrix, csr_mat, dist_format)
Combines csr_create_from_dbcsr and convert_dbcsr_to_csr to produce a complex CSR matrix.
subroutine, public dbcsr_init_p(matrix)
...
subroutine, public dbcsr_csr_create_from_dbcsr(dbcsr_mat, csr_mat, dist_format, csr_sparsity, numnodes)
...
subroutine, public dbcsr_distribute(matrix)
...
real(kind=dp) function, dimension(:), pointer, public dbcsr_get_data_p(matrix, lb, ub)
...
subroutine, public dbcsr_work_create(matrix, nblks_guess, sizedata_guess, n, work_mutable)
...
subroutine, public dbcsr_sum_replicated(matrix)
...
subroutine, public dbcsr_filter(matrix, eps)
...
subroutine, public dbcsr_binary_write(matrix, filepath)
...
real(kind=dp) function, public dbcsr_get_occupation(matrix)
...
subroutine, public dbcsr_dot_threadsafe(matrix_a, matrix_b, result)
...
subroutine, public dbcsr_finalize(matrix)
...
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_complete_redistribute(matrix, redist)
...
integer function, public dbcsr_get_num_blocks(matrix)
...
subroutine, public dbcsr_iterator_readonly_start(iterator, matrix, shared, dynamic, dynamic_byrows)
Like dbcsr_iterator_start() but with matrix being INTENT(IN). When invoking this routine,...
subroutine, public dbcsr_mp_grid_setup(dist)
...
subroutine, public dbcsr_binary_read(filepath, distribution, matrix_new)
...
subroutine, public dbcsr_clear(matrix)
...
subroutine, public dbcsr_put_block(matrix, row, col, block, summation)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
subroutine, public dbcsr_distribution_get(dist, row_dist, col_dist, nrows, ncols, has_threads, group, mynode, numnodes, nprows, npcols, myprow, mypcol, pgrid, subgroups_defined, prow_group, pcol_group)
...
subroutine, public dbm_redistribute(matrix, redist)
Copies content of matrix_b into matrix_a. Matrices may have different distributions.
Definition dbm_api.F:412
subroutine, public dbm_zero(matrix)
Sets all blocks in the given matrix to zero.
Definition dbm_api.F:662
subroutine, public dbm_clear(matrix)
Remove all blocks from given matrix, but does not release the underlying memory.
Definition dbm_api.F:529
subroutine, public dbm_scale(matrix, alpha)
Multiplies all entries in the given matrix by the given factor alpha.
Definition dbm_api.F:631
subroutine, public dbm_add(matrix_a, matrix_b)
Adds matrix_b to matrix_a.
Definition dbm_api.F:692
subroutine, public dbm_copy(matrix_a, matrix_b)
Copies content of matrix_b into matrix_a. Matrices must have the same row/col block sizes and distrib...
Definition dbm_api.F:380
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public int_8
Definition kinds.F:54
integer, parameter, public dp
Definition kinds.F:34
Interface to the message passing library MPI.