(git:374b731)
Loading...
Searching...
No Matches
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! **************************************************************************************************
12MODULE dbt_io
13
14
15
16 USE dbt_types, ONLY: &
22 USE dbt_block, ONLY: &
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
42CONTAINS
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.