(git:e7e05ae)
dbt_io.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 DBT tensor Input / Output
10 !> \author Patrick Seewald
11 ! **************************************************************************************************
12 MODULE dbt_io
13 
14 
15 
16  USE dbt_types, ONLY: &
19  dbt_pgrid_type, dbt_nblks_total
20  USE kinds, ONLY: default_string_length, int_8, dp
21  USE message_passing, ONLY: mp_comm_type
22  USE dbt_block, ONLY: &
23  dbt_iterator_type, dbt_iterator_next_block, dbt_iterator_start, &
26 
27 #include "../base/base_uses.f90"
28 
29  IMPLICIT NONE
30  PRIVATE
31  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'dbt_types'
32 
33  PUBLIC :: &
41 
42 CONTAINS
43 
44 ! **************************************************************************************************
45 !> \brief Write tensor global info: block dimensions, full dimensions and process grid dimensions
46 !> \param full_info Whether to print distribution and block size vectors
47 !> \author Patrick Seewald
48 ! **************************************************************************************************
49  SUBROUTINE dbt_write_tensor_info(tensor, unit_nr, full_info)
50  TYPE(dbt_type), INTENT(IN) :: tensor
51  INTEGER, INTENT(IN) :: unit_nr
52  LOGICAL, OPTIONAL, INTENT(IN) :: full_info
53  INTEGER, DIMENSION(ndims_tensor(tensor)) :: nblks_total, nfull_total, pdims, my_ploc, nblks_local, nfull_local
54 
55  INTEGER, DIMENSION(dbt_nblks_total(tensor, 1)) :: proc_dist_1
56  INTEGER, DIMENSION(dbt_nblks_total(tensor, 1)) :: blk_size_1
57  INTEGER, DIMENSION(dbt_nblks_total(tensor, 1)) :: blks_local_1
58  INTEGER, DIMENSION(dbt_nblks_total(tensor, 2)) :: proc_dist_2
59  INTEGER, DIMENSION(dbt_nblks_total(tensor, 2)) :: blk_size_2
60  INTEGER, DIMENSION(dbt_nblks_total(tensor, 2)) :: blks_local_2
61  INTEGER, DIMENSION(dbt_nblks_total(tensor, 3)) :: proc_dist_3
62  INTEGER, DIMENSION(dbt_nblks_total(tensor, 3)) :: blk_size_3
63  INTEGER, DIMENSION(dbt_nblks_total(tensor, 3)) :: blks_local_3
64  INTEGER, DIMENSION(dbt_nblks_total(tensor, 4)) :: proc_dist_4
65  INTEGER, DIMENSION(dbt_nblks_total(tensor, 4)) :: blk_size_4
66  INTEGER, DIMENSION(dbt_nblks_total(tensor, 4)) :: blks_local_4
67  CHARACTER(len=default_string_length) :: name
68  INTEGER :: idim
69  INTEGER :: iblk
70  INTEGER :: unit_nr_prv
71 
72  unit_nr_prv = prep_output_unit(unit_nr)
73  IF (unit_nr_prv == 0) RETURN
74 
75  CALL dbt_get_info(tensor, nblks_total, nfull_total, nblks_local, nfull_local, pdims, my_ploc, &
76  blks_local_1, blks_local_2, blks_local_3, blks_local_4, proc_dist_1, proc_dist_2, proc_dist_3,&
77  & proc_dist_4, blk_size_1, blk_size_2, blk_size_3, blk_size_4, &
78  name=name)
79 
80  IF (unit_nr_prv > 0) THEN
81  WRITE (unit_nr_prv, "(T2,A)") &
82  "GLOBAL INFO OF "//trim(name)
83  WRITE (unit_nr_prv, "(T4,A,1X)", advance="no") "block dimensions:"
84  DO idim = 1, ndims_tensor(tensor)
85  WRITE (unit_nr_prv, "(I6)", advance="no") nblks_total(idim)
86  END DO
87  WRITE (unit_nr_prv, "(/T4,A,1X)", advance="no") "full dimensions:"
88  DO idim = 1, ndims_tensor(tensor)
89  WRITE (unit_nr_prv, "(I8)", advance="no") nfull_total(idim)
90  END DO
91  WRITE (unit_nr_prv, "(/T4,A,1X)", advance="no") "process grid dimensions:"
92  DO idim = 1, ndims_tensor(tensor)
93  WRITE (unit_nr_prv, "(I6)", advance="no") pdims(idim)
94  END DO
95  WRITE (unit_nr_prv, *)
96 
97  IF (PRESENT(full_info)) THEN
98  IF (full_info) THEN
99  WRITE (unit_nr_prv, '(T4,A)', advance='no') "Block sizes:"
100  IF (ndims_tensor(tensor) >= 1) THEN
101  WRITE (unit_nr_prv, '(/T8,A,1X,I1,A,1X)', advance='no') 'Dim', 1, ':'
102  DO iblk = 1, SIZE(blk_size_1)
103  WRITE (unit_nr_prv, '(I2,1X)', advance='no') blk_size_1(iblk)
104  END DO
105  END IF
106  IF (ndims_tensor(tensor) >= 2) THEN
107  WRITE (unit_nr_prv, '(/T8,A,1X,I1,A,1X)', advance='no') 'Dim', 2, ':'
108  DO iblk = 1, SIZE(blk_size_2)
109  WRITE (unit_nr_prv, '(I2,1X)', advance='no') blk_size_2(iblk)
110  END DO
111  END IF
112  IF (ndims_tensor(tensor) >= 3) THEN
113  WRITE (unit_nr_prv, '(/T8,A,1X,I1,A,1X)', advance='no') 'Dim', 3, ':'
114  DO iblk = 1, SIZE(blk_size_3)
115  WRITE (unit_nr_prv, '(I2,1X)', advance='no') blk_size_3(iblk)
116  END DO
117  END IF
118  IF (ndims_tensor(tensor) >= 4) THEN
119  WRITE (unit_nr_prv, '(/T8,A,1X,I1,A,1X)', advance='no') 'Dim', 4, ':'
120  DO iblk = 1, SIZE(blk_size_4)
121  WRITE (unit_nr_prv, '(I2,1X)', advance='no') blk_size_4(iblk)
122  END DO
123  END IF
124  WRITE (unit_nr_prv, '(/T4,A)', advance='no') "Block distribution:"
125  IF (ndims_tensor(tensor) >= 1) THEN
126  WRITE (unit_nr_prv, '(/T8,A,1X,I1,A,1X)', advance='no') 'Dim', 1, ':'
127  DO iblk = 1, SIZE(proc_dist_1)
128  WRITE (unit_nr_prv, '(I3,1X)', advance='no') proc_dist_1(iblk)
129  END DO
130  END IF
131  IF (ndims_tensor(tensor) >= 2) THEN
132  WRITE (unit_nr_prv, '(/T8,A,1X,I1,A,1X)', advance='no') 'Dim', 2, ':'
133  DO iblk = 1, SIZE(proc_dist_2)
134  WRITE (unit_nr_prv, '(I3,1X)', advance='no') proc_dist_2(iblk)
135  END DO
136  END IF
137  IF (ndims_tensor(tensor) >= 3) THEN
138  WRITE (unit_nr_prv, '(/T8,A,1X,I1,A,1X)', advance='no') 'Dim', 3, ':'
139  DO iblk = 1, SIZE(proc_dist_3)
140  WRITE (unit_nr_prv, '(I3,1X)', advance='no') proc_dist_3(iblk)
141  END DO
142  END IF
143  IF (ndims_tensor(tensor) >= 4) THEN
144  WRITE (unit_nr_prv, '(/T8,A,1X,I1,A,1X)', advance='no') 'Dim', 4, ':'
145  DO iblk = 1, SIZE(proc_dist_4)
146  WRITE (unit_nr_prv, '(I3,1X)', advance='no') proc_dist_4(iblk)
147  END DO
148  END IF
149  END IF
150  WRITE (unit_nr_prv, *)
151  END IF
152  END IF
153 
154  END SUBROUTINE
155 
156 ! **************************************************************************************************
157 !> \brief Write info on tensor distribution & load balance
158 !> \author Patrick Seewald
159 ! **************************************************************************************************
160  SUBROUTINE dbt_write_tensor_dist(tensor, unit_nr)
161  TYPE(dbt_type), INTENT(IN) :: tensor
162  INTEGER, INTENT(IN) :: unit_nr
163  INTEGER :: nproc, nblock_max, nelement_max
164  INTEGER(KIND=int_8) :: nblock_sum, nelement_sum, nblock_tot
165  INTEGER :: nblock, nelement, unit_nr_prv
166  INTEGER, DIMENSION(2) :: tmp
167  INTEGER, DIMENSION(ndims_tensor(tensor)) :: bdims
168  REAL(kind=dp) :: occupation
169 
170  unit_nr_prv = prep_output_unit(unit_nr)
171  IF (unit_nr_prv == 0) RETURN
172 
173  nproc = tensor%pgrid%mp_comm_2d%num_pe
174 
175  nblock = dbt_get_num_blocks(tensor)
176  nelement = dbt_get_nze(tensor)
177 
178  nblock_sum = dbt_get_num_blocks_total(tensor)
179  nelement_sum = dbt_get_nze_total(tensor)
180 
181  tmp = (/nblock, nelement/)
182  CALL tensor%pgrid%mp_comm_2d%max(tmp)
183  nblock_max = tmp(1); nelement_max = tmp(2)
184 
185  CALL blk_dims_tensor(tensor, bdims)
186  nblock_tot = product(int(bdims, kind=int_8))
187 
188  occupation = -1.0_dp
189  IF (nblock_tot .NE. 0) occupation = 100.0_dp*real(nblock_sum, dp)/real(nblock_tot, dp)
190 
191  IF (unit_nr_prv > 0) THEN
192  WRITE (unit_nr_prv, "(T2,A)") &
193  "DISTRIBUTION OF "//trim(tensor%name)
194  WRITE (unit_nr_prv, "(T15,A,T68,I13)") "Number of non-zero blocks:", nblock_sum
195  WRITE (unit_nr_prv, "(T15,A,T75,F6.2)") "Percentage of non-zero blocks:", occupation
196  WRITE (unit_nr_prv, "(T15,A,T68,I13)") "Average number of blocks per CPU:", (nblock_sum + nproc - 1)/nproc
197  WRITE (unit_nr_prv, "(T15,A,T68,I13)") "Maximum number of blocks per CPU:", nblock_max
198  WRITE (unit_nr_prv, "(T15,A,T68,I13)") "Average number of matrix elements per CPU:", (nelement_sum + nproc - 1)/nproc
199  WRITE (unit_nr_prv, "(T15,A,T68,I13)") "Maximum number of matrix elements per CPU:", nelement_max
200  END IF
201 
202  END SUBROUTINE
203 
204 ! **************************************************************************************************
205 !> \brief Write all tensor blocks
206 !> \param io_unit_master for global output
207 !> \param io_unit_all for local output
208 !> \param write_int convert to integers (useful for testing with integer tensors)
209 !> \author Patrick Seewald
210 ! **************************************************************************************************
211  SUBROUTINE dbt_write_blocks(tensor, io_unit_master, io_unit_all, write_int)
212  TYPE(dbt_type), INTENT(INOUT) :: tensor
213  INTEGER, INTENT(IN) :: io_unit_master, io_unit_all
214  LOGICAL, INTENT(IN), OPTIONAL :: write_int
215  INTEGER, DIMENSION(ndims_tensor(tensor)) :: blk_index, blk_size
216  REAL(kind=dp), ALLOCATABLE, &
217  DIMENSION(:,:) :: blk_values_2
218  REAL(kind=dp), ALLOCATABLE, &
219  DIMENSION(:,:,:) :: blk_values_3
220  REAL(kind=dp), ALLOCATABLE, &
221  DIMENSION(:,:,:,:) :: blk_values_4
222  TYPE(dbt_iterator_type) :: iterator
223  INTEGER :: proc, mynode
224  LOGICAL :: found
225 
226  IF (io_unit_master > 0) THEN
227  WRITE (io_unit_master, '(T7,A)') "(block index) @ process: (array index) value"
228  END IF
229  CALL dbt_iterator_start(iterator, tensor)
230  DO WHILE (dbt_iterator_blocks_left(iterator))
231  CALL dbt_iterator_next_block(iterator, blk_index, blk_size=blk_size)
232  CALL dbt_get_stored_coordinates(tensor, blk_index, proc)
233  mynode = tensor%pgrid%mp_comm_2d%mepos
234  cpassert(proc .EQ. mynode)
235  IF (ndims_tensor(tensor) == 2) THEN
236  CALL dbt_get_block(tensor, blk_index, blk_values_2, found)
237  cpassert(found)
238  CALL dbt_write_block(tensor%name, blk_size, blk_index, proc, io_unit_all, &
239  blk_values_2=blk_values_2, write_int=write_int)
240  DEALLOCATE (blk_values_2)
241  END IF
242  IF (ndims_tensor(tensor) == 3) THEN
243  CALL dbt_get_block(tensor, blk_index, blk_values_3, found)
244  cpassert(found)
245  CALL dbt_write_block(tensor%name, blk_size, blk_index, proc, io_unit_all, &
246  blk_values_3=blk_values_3, write_int=write_int)
247  DEALLOCATE (blk_values_3)
248  END IF
249  IF (ndims_tensor(tensor) == 4) THEN
250  CALL dbt_get_block(tensor, blk_index, blk_values_4, found)
251  cpassert(found)
252  CALL dbt_write_block(tensor%name, blk_size, blk_index, proc, io_unit_all, &
253  blk_values_4=blk_values_4, write_int=write_int)
254  DEALLOCATE (blk_values_4)
255  END IF
256  END DO
257  CALL dbt_iterator_stop(iterator)
258  END SUBROUTINE
259 
260 ! **************************************************************************************************
261 !> \brief Write a tensor block
262 !> \param name tensor name
263 !> \param blk_size block size
264 !> \param blk_index block index
265 !> \param blk_values_i block values for 2 dimensions
266 !> \param write_int write_int convert values to integers
267 !> \param unit_nr unit number
268 !> \param proc which process am I
269 !> \author Patrick Seewald
270 ! **************************************************************************************************
271  SUBROUTINE dbt_write_block(name, blk_size, blk_index, proc, unit_nr, &
272  blk_values_2, blk_values_3, blk_values_4, write_int)
273  CHARACTER(LEN=*), INTENT(IN) :: name
274  INTEGER, DIMENSION(:), INTENT(IN) :: blk_size
275  INTEGER, DIMENSION(:), INTENT(IN) :: blk_index
276  REAL(kind=dp), &
277  DIMENSION(blk_size(1), blk_size(2)), &
278  INTENT(IN), OPTIONAL :: blk_values_2
279  REAL(kind=dp), &
280  DIMENSION(blk_size(1), blk_size(2), blk_size(3)), &
281  INTENT(IN), OPTIONAL :: blk_values_3
282  REAL(kind=dp), &
283  DIMENSION(blk_size(1), blk_size(2), blk_size(3), blk_size(4)), &
284  INTENT(IN), OPTIONAL :: blk_values_4
285  LOGICAL, INTENT(IN), OPTIONAL :: write_int
286  LOGICAL :: write_int_prv
287  INTEGER, INTENT(IN) :: unit_nr
288  INTEGER, INTENT(IN) :: proc
289  INTEGER :: i_1, i_2, i_3, i_4
290  INTEGER :: ndim
291 
292  IF (PRESENT(write_int)) THEN
293  write_int_prv = write_int
294  ELSE
295  write_int_prv = .false.
296  END IF
297 
298  ndim = SIZE(blk_size)
299 
300  IF (unit_nr > 0) THEN
301  IF (ndim == 2) THEN
302  DO i_2 = 1, blk_size(2)
303  DO i_1 = 1, blk_size(1)
304  IF (write_int_prv) THEN
305  WRITE (unit_nr, '(T7,A,T16,A,2I3,1X,A,1X,I3,A,1X,A,2I3,1X,A,1X,I20)') &
306  trim(name), "(", blk_index, ") @", proc, ':', &
307  "(", i_1, i_2, ")", &
308  int(blk_values_2(i_1, i_2), kind=int_8)
309  ELSE
310  WRITE (unit_nr, '(T7,A,T16,A,2I3,1X,A,1X,I3,A,1X,A,2I3,1X,A,1X,F10.5)') &
311  trim(name), "(", blk_index, ") @", proc, ':', &
312  "(", i_1, i_2, ")", &
313  blk_values_2(i_1, i_2)
314  END IF
315  END DO
316  END DO
317  END IF
318  IF (ndim == 3) THEN
319  DO i_3 = 1, blk_size(3)
320  DO i_2 = 1, blk_size(2)
321  DO i_1 = 1, blk_size(1)
322  IF (write_int_prv) THEN
323  WRITE (unit_nr, '(T7,A,T16,A,3I3,1X,A,1X,I3,A,1X,A,3I3,1X,A,1X,I20)') &
324  trim(name), "(", blk_index, ") @", proc, ':', &
325  "(", i_1, i_2, i_3, ")", &
326  int(blk_values_3(i_1, i_2, i_3), kind=int_8)
327  ELSE
328  WRITE (unit_nr, '(T7,A,T16,A,3I3,1X,A,1X,I3,A,1X,A,3I3,1X,A,1X,F10.5)') &
329  trim(name), "(", blk_index, ") @", proc, ':', &
330  "(", i_1, i_2, i_3, ")", &
331  blk_values_3(i_1, i_2, i_3)
332  END IF
333  END DO
334  END DO
335  END DO
336  END IF
337  IF (ndim == 4) THEN
338  DO i_4 = 1, blk_size(4)
339  DO i_3 = 1, blk_size(3)
340  DO i_2 = 1, blk_size(2)
341  DO i_1 = 1, blk_size(1)
342  IF (write_int_prv) THEN
343  WRITE (unit_nr, '(T7,A,T16,A,4I3,1X,A,1X,I3,A,1X,A,4I3,1X,A,1X,I20)') &
344  trim(name), "(", blk_index, ") @", proc, ':', &
345  "(", i_1, i_2, i_3, i_4, ")", &
346  int(blk_values_4(i_1, i_2, i_3, i_4), kind=int_8)
347  ELSE
348  WRITE (unit_nr, '(T7,A,T16,A,4I3,1X,A,1X,I3,A,1X,A,4I3,1X,A,1X,F10.5)') &
349  trim(name), "(", blk_index, ") @", proc, ':', &
350  "(", i_1, i_2, i_3, i_4, ")", &
351  blk_values_4(i_1, i_2, i_3, i_4)
352  END IF
353  END DO
354  END DO
355  END DO
356  END DO
357  END IF
358  END IF
359  END SUBROUTINE
360 
361 ! **************************************************************************************************
362 !> \author Patrick Seewald
363 ! **************************************************************************************************
364  SUBROUTINE dbt_write_block_indices(tensor, io_unit_master, io_unit_all)
365  TYPE(dbt_type), INTENT(INOUT) :: tensor
366  INTEGER, INTENT(IN) :: io_unit_master, io_unit_all
367  TYPE(dbt_iterator_type) :: iterator
368  INTEGER, DIMENSION(ndims_tensor(tensor)) :: blk_index, blk_size
369  INTEGER :: mynode, proc
370 
371  IF (io_unit_master > 0) THEN
372  WRITE (io_unit_master, '(T7,A)') "(block index) @ process: size"
373  END IF
374 
375  CALL dbt_iterator_start(iterator, tensor)
376  DO WHILE (dbt_iterator_blocks_left(iterator))
377  CALL dbt_iterator_next_block(iterator, blk_index, blk_size=blk_size)
378  CALL dbt_get_stored_coordinates(tensor, blk_index, proc)
379  mynode = tensor%pgrid%mp_comm_2d%mepos
380  cpassert(proc .EQ. mynode)
381  IF (ndims_tensor(tensor) == 2) THEN
382  WRITE (io_unit_all, '(T7,A,T16,A,2I3,1X,A,1X,I3,A2,2I3)') &
383  trim(tensor%name), "blk index (", blk_index, ") @", proc, ":", blk_size
384  END IF
385  IF (ndims_tensor(tensor) == 3) THEN
386  WRITE (io_unit_all, '(T7,A,T16,A,3I3,1X,A,1X,I3,A2,3I3)') &
387  trim(tensor%name), "blk index (", blk_index, ") @", proc, ":", blk_size
388  END IF
389  IF (ndims_tensor(tensor) == 4) THEN
390  WRITE (io_unit_all, '(T7,A,T16,A,4I3,1X,A,1X,I3,A2,4I3)') &
391  trim(tensor%name), "blk index (", blk_index, ") @", proc, ":", blk_size
392  END IF
393  END DO
394  CALL dbt_iterator_stop(iterator)
395  END SUBROUTINE
396 
397 ! **************************************************************************************************
398 !> \author Patrick Seewald
399 ! **************************************************************************************************
400  SUBROUTINE dbt_write_split_info(pgrid, unit_nr)
401  TYPE(dbt_pgrid_type), INTENT(IN) :: pgrid
402  INTEGER, INTENT(IN) :: unit_nr
403 
404  IF (ALLOCATED(pgrid%tas_split_info)) THEN
405  CALL dbt_tas_write_split_info(pgrid%tas_split_info, unit_nr)
406  END IF
407  END SUBROUTINE
408 
409 ! **************************************************************************************************
410 !> \author Patrick Seewald
411 ! **************************************************************************************************
412  FUNCTION prep_output_unit(unit_nr) RESULT(unit_nr_out)
413  INTEGER, INTENT(IN), OPTIONAL :: unit_nr
414  INTEGER :: unit_nr_out
415 
416  IF (PRESENT(unit_nr)) THEN
417  unit_nr_out = unit_nr
418  ELSE
419  unit_nr_out = 0
420  END IF
421 
422  END FUNCTION
423 
424  END MODULE
struct tensor_ tensor
Methods to operate on n-dimensional tensor blocks.
Definition: dbt_block.F:12
logical function, public dbt_iterator_blocks_left(iterator)
Generalization of block_iterator_blocks_left for tensors.
Definition: dbt_block.F:197
subroutine, public dbt_iterator_stop(iterator)
Generalization of block_iterator_stop for tensors.
Definition: dbt_block.F:134
subroutine, public dbt_iterator_start(iterator, tensor)
Generalization of block_iterator_start for tensors.
Definition: dbt_block.F:121
subroutine, public dbt_iterator_next_block(iterator, ind_nd, blk_size, blk_offset)
iterate over nd blocks of an nd rank tensor, index only (blocks must be retrieved by calling dbt_get_...
Definition: dbt_block.F:161
DBT tensor Input / Output.
Definition: dbt_io.F:12
subroutine, public dbt_write_block(name, blk_size, blk_index, proc, unit_nr, blk_values_2, blk_values_3, blk_values_4, write_int)
Write a tensor block.
Definition: dbt_io.F:273
subroutine, public dbt_write_blocks(tensor, io_unit_master, io_unit_all, write_int)
Write all tensor blocks.
Definition: dbt_io.F:212
subroutine, public dbt_write_block_indices(tensor, io_unit_master, io_unit_all)
Definition: dbt_io.F:365
subroutine, public dbt_write_tensor_info(tensor, unit_nr, full_info)
Write tensor global info: block dimensions, full dimensions and process grid dimensions.
Definition: dbt_io.F:50
subroutine, public dbt_write_tensor_dist(tensor, unit_nr)
Write info on tensor distribution & load balance.
Definition: dbt_io.F:161
subroutine, public dbt_write_split_info(pgrid, unit_nr)
Definition: dbt_io.F:401
integer function, public prep_output_unit(unit_nr)
Definition: dbt_io.F:413
tall-and-skinny matrices: Input / Output
Definition: dbt_tas_io.F:12
subroutine, public dbt_tas_write_split_info(info, unit_nr, name)
Print info on how matrix is split.
Definition: dbt_tas_io.F:214
DBT tensor framework for block-sparse tensor contraction: Types and create/destroy routines.
Definition: dbt_types.F:12
subroutine, public blk_dims_tensor(tensor, dims)
tensor block dimensions
Definition: dbt_types.F:1466
subroutine, public dbt_get_info(tensor, nblks_total, nfull_total, nblks_local, nfull_local, pdims, my_ploc, blks_local_1, blks_local_2, blks_local_3, blks_local_4, proc_dist_1, proc_dist_2, proc_dist_3, proc_dist_4, blk_size_1, blk_size_2, blk_size_3, blk_size_4, blk_offset_1, blk_offset_2, blk_offset_3, blk_offset_4, distribution, name)
As block_get_info but for tensors.
Definition: dbt_types.F:1656
pure integer function, public ndims_tensor(tensor)
tensor rank
Definition: dbt_types.F:1227
pure integer function, public dbt_nblks_total(tensor, idim)
total numbers of blocks along dimension idim
Definition: dbt_types.F:1617
pure integer function, public dbt_get_num_blocks(tensor)
As block_get_num_blocks: get number of local blocks.
Definition: dbt_types.F:1759
integer(kind=int_8) function, public dbt_get_nze_total(tensor)
Definition: dbt_types.F:1817
subroutine, public dbt_get_stored_coordinates(tensor, ind_nd, processor)
Generalization of block_get_stored_coordinates for tensors.
Definition: dbt_types.F:1510
pure integer function, public dbt_get_nze(tensor)
Definition: dbt_types.F:1808
integer(kind=int_8) function, public dbt_get_num_blocks_total(tensor)
Get total number of blocks.
Definition: dbt_types.F:1769
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
integer, parameter, public default_string_length
Definition: kinds.F:57
Interface to the message passing library MPI.