16 USE omp_lib,
ONLY: omp_get_thread_num, omp_get_num_threads
41#include "../base/base_uses.f90"
45 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'dbt_block'
69 INTEGER,
DIMENSION(:),
ALLOCATABLE :: sizes
70 REAL(
dp),
DIMENSION(:),
ALLOCATABLE :: blk
74 MODULE PROCEDURE create_block_data
75 MODULE PROCEDURE create_block_nodata
79 MODULE PROCEDURE dbt_put_2d_block
80 MODULE PROCEDURE dbt_put_3d_block
81 MODULE PROCEDURE dbt_put_4d_block
82 MODULE PROCEDURE dbt_put_anyd_block
86 MODULE PROCEDURE dbt_get_2d_block
87 MODULE PROCEDURE dbt_allocate_and_get_2d_block
88 MODULE PROCEDURE dbt_get_3d_block
89 MODULE PROCEDURE dbt_allocate_and_get_3d_block
90 MODULE PROCEDURE dbt_get_4d_block
91 MODULE PROCEDURE dbt_allocate_and_get_4d_block
92 MODULE PROCEDURE dbt_get_anyd_block
96 MODULE PROCEDURE dbt_reserve_blocks_index
97 MODULE PROCEDURE dbt_reserve_blocks_index_array
98 MODULE PROCEDURE dbt_reserve_blocks_template
99 MODULE PROCEDURE dbt_reserve_blocks_tensor_to_matrix
100 MODULE PROCEDURE dbt_reserve_blocks_matrix_to_tensor
109 FUNCTION block_size(block)
110 TYPE(block_nd),
INTENT(IN) :: block
111 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: block_size
113 ALLOCATE (block_size, source=block%sizes)
163 INTEGER,
DIMENSION(ndims_iterator(iterator)), &
164 INTENT(OUT) :: ind_nd
165 INTEGER,
DIMENSION(ndims_iterator(iterator)), &
166 INTENT(OUT),
OPTIONAL :: blk_size, blk_offset
168 INTEGER(KIND=int_8),
DIMENSION(2) :: ind_2d
173 IF (
PRESENT(blk_size)) blk_size(:) =
get_array_elements(iterator%tensor%blk_sizes, ind_nd)
176 IF (
PRESENT(blk_offset)) blk_offset(:) =
get_array_elements(iterator%tensor%blk_offsets, ind_nd)
208 SUBROUTINE dbt_reserve_blocks_index_array(tensor, blk_ind)
209 TYPE(
dbt_type),
INTENT(INOUT) :: tensor
210 INTEGER,
DIMENSION(:, :),
INTENT(IN) :: blk_ind
212 CHARACTER(LEN=*),
PARAMETER :: routineN =
'dbt_reserve_blocks_index_array'
214 CALL timeset(routinen, handle)
222 CALL dbt_reserve_blocks(tensor, blk_ind(:,1), blk_ind(:,2), blk_ind(:,3), blk_ind(:,4))
224 CALL timestop(handle)
233 SUBROUTINE dbt_reserve_blocks_index(tensor, blk_ind_1, blk_ind_2, blk_ind_3, blk_ind_4)
234 TYPE(
dbt_type),
INTENT(INOUT) :: tensor
235 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: blk_ind_1, blk_ind_2, blk_ind_3, blk_ind_4
236 INTEGER :: iblk, nblk, handle
237 INTEGER(KIND=int_8),
ALLOCATABLE,
DIMENSION(:) :: cols, rows
238 INTEGER(KIND=int_8),
DIMENSION(2) :: ind_2d
240 INTEGER,
DIMENSION(ndims_tensor(tensor)) :: iblk_nd, ind_nd, nblk_tmp
241 CHARACTER(LEN=*),
PARAMETER :: routineN =
'dbt_reserve_blocks_index'
243 CALL timeset(routinen, handle)
244 cpassert(tensor%valid)
247 blk_ind_1, blk_ind_2, blk_ind_3, blk_ind_4)
251 ALLOCATE (cols(nblk), rows(nblk))
256 rows(iblk) = ind_2d(1); cols(iblk) = ind_2d(2)
261 CALL timestop(handle)
269 SUBROUTINE dbt_reserve_blocks_template(tensor_in, tensor_out)
270 TYPE(
dbt_type),
INTENT(IN) :: tensor_in
271 TYPE(
dbt_type),
INTENT(INOUT) :: tensor_out
273 CHARACTER(LEN=*),
PARAMETER :: routineN =
'dbt_reserve_blocks_template'
276 INTEGER :: handle, nblk, iblk
277 INTEGER,
DIMENSION(:, :),
ALLOCATABLE :: blk_ind
279 CALL timeset(routinen, handle)
295 CALL timestop(handle)
302 SUBROUTINE dbt_reserve_blocks_matrix_to_tensor(matrix_in, tensor_out)
303 TYPE(
dbcsr_type),
TARGET,
INTENT(IN) :: matrix_in
304 TYPE(
dbt_type),
INTENT(INOUT) :: tensor_out
307 INTEGER :: iblk, nblk, nblk_per_thread, a, b
308 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: blk_ind_1, blk_ind_2
309 INTEGER,
DIMENSION(2) :: ind_2d
312 CHARACTER(LEN=*),
PARAMETER :: routineN =
'dbt_reserve_blocks_matrix_to_tensor'
314 CALL timeset(routinen, handle)
317 ALLOCATE (matrix_in_desym)
320 matrix_in_desym => matrix_in
324 ALLOCATE (blk_ind_1(nblk), blk_ind_2(nblk))
328 blk_ind_1(iblk) = ind_2d(1); blk_ind_2(iblk) = ind_2d(2)
335 nblk_per_thread = nblk/omp_get_num_threads() + 1
336 a = omp_get_thread_num()*nblk_per_thread + 1
337 b = min(a + nblk_per_thread, nblk)
343 DEALLOCATE (matrix_in_desym)
346 CALL timestop(handle)
353 SUBROUTINE dbt_reserve_blocks_tensor_to_matrix(tensor_in, matrix_out)
354 TYPE(
dbt_type),
INTENT(IN) :: tensor_in
357 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: blk_ind_1, blk_ind_2
359 CHARACTER(LEN=*),
PARAMETER :: routineN =
'dbt_reserve_blocks_tensor_to_matrix'
360 INTEGER :: handle, iblk, nblk
361 INTEGER,
DIMENSION(2) :: ind_2d
363 CALL timeset(routinen, handle)
366 ALLOCATE (blk_ind_1(nblk), blk_ind_2(nblk))
376 IF (ind_2d(1) > ind_2d(2))
CALL swap(ind_2d(1), ind_2d(2))
380 blk_ind_1(iblk) = ind_2d(1)
381 blk_ind_2(iblk) = ind_2d(2)
390 CALL timestop(handle)
397 ELEMENTAL SUBROUTINE swap(a, b)
398 INTEGER,
INTENT(INOUT) :: a, b
410 SUBROUTINE create_block_data(block, sizes, array)
411 TYPE(
block_nd),
INTENT(OUT) :: block
412 INTEGER,
DIMENSION(:),
INTENT(IN) :: sizes
413 REAL(dp),
DIMENSION(PRODUCT(sizes)),
INTENT(IN) :: array
415 ALLOCATE (block%sizes, source=sizes)
416 ALLOCATE (block%blk, source=array)
423 SUBROUTINE create_block_nodata(block, sizes)
424 INTEGER,
INTENT(IN),
DIMENSION(:) :: sizes
425 TYPE(
block_nd),
INTENT(OUT) :: block
426 ALLOCATE (block%sizes, source=sizes)
427 ALLOCATE (block%blk(product(sizes)))
435 TYPE(
block_nd),
INTENT(INOUT) :: block
436 DEALLOCATE (block%blk)
437 DEALLOCATE (block%sizes)
453 INTEGER,
INTENT(IN) :: row, column
456 transpose = btest(column + row, 0) .EQV. column .GE. row
472 SUBROUTINE dbt_put_anyd_block(tensor, ind, block, summation)
474 TYPE(
dbt_type),
INTENT(INOUT) :: tensor
475 LOGICAL,
INTENT(IN),
OPTIONAL :: summation
476 INTEGER,
DIMENSION(ndims_tensor(tensor)), &
481 CALL dbt_put_2d_block(tensor, ind, block%sizes, block%blk, summation=summation)
483 CALL dbt_put_3d_block(tensor, ind, block%sizes, block%blk, summation=summation)
485 CALL dbt_put_4d_block(tensor, ind, block%sizes, block%blk, summation=summation)
501 SUBROUTINE dbt_get_anyd_block(tensor, ind, block, found)
502 TYPE(
block_nd),
INTENT(OUT) :: block
503 LOGICAL,
INTENT(OUT) :: found
504 TYPE(
dbt_type),
INTENT(INOUT) :: tensor
505 INTEGER,
DIMENSION(ndims_tensor(tensor)), &
507 INTEGER,
DIMENSION(ndims_tensor(tensor)) :: blk_size
508 REAL(dp),
DIMENSION(:),
ALLOCATABLE :: block_arr
511 ALLOCATE (block_arr(product(blk_size)))
515 CALL dbt_get_2d_block(tensor, ind, blk_size, block_arr, found)
517 CALL dbt_get_3d_block(tensor, ind, blk_size, block_arr, found)
519 CALL dbt_get_4d_block(tensor, ind, blk_size, block_arr, found)
536 SUBROUTINE dbt_put_2d_block(tensor, ind, sizes, block, summation)
537 TYPE(
dbt_type),
INTENT(INOUT) :: tensor
538 INTEGER,
DIMENSION(2),
INTENT(IN) :: ind
539 INTEGER,
DIMENSION(2),
INTENT(IN) :: sizes
540 REAL(dp),
DIMENSION(sizes(1), sizes(2)), &
541 INTENT(IN),
TARGET :: block
542 LOGICAL,
INTENT(IN),
OPTIONAL :: summation
543 INTEGER(KIND=int_8),
DIMENSION(2) :: ind_2d
544 INTEGER,
DIMENSION(2) :: shape_2d
545 REAL(dp),
POINTER,
DIMENSION(:, :) :: block_2d
546 INTEGER,
DIMENSION(2) :: shape_nd
547 LOGICAL :: found, new_block
548 REAL(dp),
DIMENSION(sizes(1), sizes(2)) :: block_check
550 LOGICAL,
PARAMETER :: debug = .false.
556 CALL dbt_get_block(tensor, ind, sizes, block_check, found=found)
560 associate(map_nd => tensor%nd_index_blk%map_nd, &
561 map1_2d => tensor%nd_index_blk%map1_2d, &
562 map2_2d => tensor%nd_index_blk%map2_2d)
564 shape_2d = [product(sizes(map1_2d)), product(sizes(map2_2d))]
566 IF (all([map1_2d, map2_2d] == (/(i, i=1, 2)/)))
THEN
568 block_2d(1:shape_2d(1), 1:shape_2d(2)) => block(:,:)
571 ALLOCATE (block_2d(shape_2d(1), shape_2d(2)))
573 shape_nd(map_nd) = sizes
574 block_2d(:, :) = reshape(reshape(block, shape=shape_nd, order=map_nd), shape=shape_2d)
583 IF (new_block)
DEALLOCATE (block_2d)
598 SUBROUTINE dbt_put_3d_block(tensor, ind, sizes, block, summation)
599 TYPE(dbt_type),
INTENT(INOUT) :: tensor
600 INTEGER,
DIMENSION(3),
INTENT(IN) :: ind
601 INTEGER,
DIMENSION(3),
INTENT(IN) :: sizes
602 REAL(dp),
DIMENSION(sizes(1), sizes(2), sizes(3)), &
603 INTENT(IN),
TARGET :: block
604 LOGICAL,
INTENT(IN),
OPTIONAL :: summation
605 INTEGER(KIND=int_8),
DIMENSION(2) :: ind_2d
606 INTEGER,
DIMENSION(2) :: shape_2d
607 REAL(dp),
POINTER,
DIMENSION(:, :) :: block_2d
608 INTEGER,
DIMENSION(3) :: shape_nd
609 LOGICAL :: found, new_block
610 REAL(dp),
DIMENSION(sizes(1), sizes(2), sizes(3)) :: block_check
612 LOGICAL,
PARAMETER :: debug = .false.
618 CALL dbt_get_block(tensor, ind, sizes, block_check, found=found)
622 associate(map_nd => tensor%nd_index_blk%map_nd, &
623 map1_2d => tensor%nd_index_blk%map1_2d, &
624 map2_2d => tensor%nd_index_blk%map2_2d)
626 shape_2d = [product(sizes(map1_2d)), product(sizes(map2_2d))]
628 IF (all([map1_2d, map2_2d] == (/(i, i=1, 3)/)))
THEN
630 block_2d(1:shape_2d(1), 1:shape_2d(2)) => block(:,:,:)
633 ALLOCATE (block_2d(shape_2d(1), shape_2d(2)))
635 shape_nd(map_nd) = sizes
636 block_2d(:, :) = reshape(reshape(block, shape=shape_nd, order=map_nd), shape=shape_2d)
639 ind_2d(:) = get_2d_indices_tensor(tensor%nd_index_blk, ind)
643 CALL dbt_tas_put_block(
tensor%matrix_rep, ind_2d(1), ind_2d(2), block_2d, summation=summation)
645 IF (new_block)
DEALLOCATE (block_2d)
660 SUBROUTINE dbt_put_4d_block(tensor, ind, sizes, block, summation)
661 TYPE(dbt_type),
INTENT(INOUT) :: tensor
662 INTEGER,
DIMENSION(4),
INTENT(IN) :: ind
663 INTEGER,
DIMENSION(4),
INTENT(IN) :: sizes
664 REAL(dp),
DIMENSION(sizes(1), sizes(2), sizes(3), sizes(4)), &
665 INTENT(IN),
TARGET :: block
666 LOGICAL,
INTENT(IN),
OPTIONAL :: summation
667 INTEGER(KIND=int_8),
DIMENSION(2) :: ind_2d
668 INTEGER,
DIMENSION(2) :: shape_2d
669 REAL(dp),
POINTER,
DIMENSION(:, :) :: block_2d
670 INTEGER,
DIMENSION(4) :: shape_nd
671 LOGICAL :: found, new_block
672 REAL(dp),
DIMENSION(sizes(1), sizes(2), sizes(3), sizes(4)) :: block_check
674 LOGICAL,
PARAMETER :: debug = .false.
680 CALL dbt_get_block(tensor, ind, sizes, block_check, found=found)
684 associate(map_nd => tensor%nd_index_blk%map_nd, &
685 map1_2d => tensor%nd_index_blk%map1_2d, &
686 map2_2d => tensor%nd_index_blk%map2_2d)
688 shape_2d = [product(sizes(map1_2d)), product(sizes(map2_2d))]
690 IF (all([map1_2d, map2_2d] == (/(i, i=1, 4)/)))
THEN
692 block_2d(1:shape_2d(1), 1:shape_2d(2)) => block(:,:,:,:)
695 ALLOCATE (block_2d(shape_2d(1), shape_2d(2)))
697 shape_nd(map_nd) = sizes
698 block_2d(:, :) = reshape(reshape(block, shape=shape_nd, order=map_nd), shape=shape_2d)
701 ind_2d(:) = get_2d_indices_tensor(tensor%nd_index_blk, ind)
705 CALL dbt_tas_put_block(
tensor%matrix_rep, ind_2d(1), ind_2d(2), block_2d, summation=summation)
707 IF (new_block)
DEALLOCATE (block_2d)
723 SUBROUTINE dbt_allocate_and_get_2d_block(tensor, ind, block, found)
724 TYPE(dbt_type),
INTENT(INOUT) :: tensor
725 INTEGER,
DIMENSION(2),
INTENT(IN) :: ind
726 REAL(dp),
DIMENSION(:,:), &
727 ALLOCATABLE,
INTENT(OUT) :: block
728 LOGICAL,
INTENT(OUT) :: found
729 INTEGER,
DIMENSION(2) :: blk_size
731 CALL dbt_blk_sizes(tensor, ind, blk_size)
732 CALL allocate_any(block, shape_spec=blk_size)
733 CALL dbt_get_2d_block(tensor, ind, blk_size, block, found)
748 SUBROUTINE dbt_allocate_and_get_3d_block(tensor, ind, block, found)
749 TYPE(dbt_type),
INTENT(INOUT) :: tensor
750 INTEGER,
DIMENSION(3),
INTENT(IN) :: ind
751 REAL(dp),
DIMENSION(:,:,:), &
752 ALLOCATABLE,
INTENT(OUT) :: block
753 LOGICAL,
INTENT(OUT) :: found
754 INTEGER,
DIMENSION(3) :: blk_size
756 CALL dbt_blk_sizes(tensor, ind, blk_size)
757 CALL allocate_any(block, shape_spec=blk_size)
758 CALL dbt_get_3d_block(tensor, ind, blk_size, block, found)
773 SUBROUTINE dbt_allocate_and_get_4d_block(tensor, ind, block, found)
774 TYPE(dbt_type),
INTENT(INOUT) :: tensor
775 INTEGER,
DIMENSION(4),
INTENT(IN) :: ind
776 REAL(dp),
DIMENSION(:,:,:,:), &
777 ALLOCATABLE,
INTENT(OUT) :: block
778 LOGICAL,
INTENT(OUT) :: found
779 INTEGER,
DIMENSION(4) :: blk_size
781 CALL dbt_blk_sizes(tensor, ind, blk_size)
782 CALL allocate_any(block, shape_spec=blk_size)
783 CALL dbt_get_4d_block(tensor, ind, blk_size, block, found)
795 SUBROUTINE dbt_get_2d_block(tensor, ind, sizes, block, found)
796 TYPE(dbt_type),
INTENT(INOUT) :: tensor
797 INTEGER,
DIMENSION(2),
INTENT(IN) :: ind
798 INTEGER,
DIMENSION(2),
INTENT(IN) :: sizes
799 REAL(dp),
DIMENSION(sizes(1), sizes(2)), &
801 LOGICAL,
INTENT(OUT) :: found
803 INTEGER(KIND=int_8),
DIMENSION(2) :: ind_2d
804 REAL(dp),
DIMENSION(:, :),
POINTER,
CONTIGUOUS :: block_2d_ptr
806 REAL(dp),
DIMENSION(:,:),
POINTER :: block_ptr
808 NULLIFY (block_2d_ptr)
810 ind_2d(:) = get_2d_indices_tensor(tensor%nd_index_blk, ind)
812 associate(map1_2d => tensor%nd_index_blk%map1_2d, &
813 map2_2d => tensor%nd_index_blk%map2_2d)
815 CALL dbt_tas_get_block_p(tensor%matrix_rep, ind_2d(1), ind_2d(2), block_2d_ptr)
816 found =
ASSOCIATED(block_2d_ptr)
819 IF (all([map1_2d, map2_2d] == (/(i, i=1, 2)/)))
THEN
821 block_ptr(lbound(block, 1):ubound(block, 1), lbound(block, 2):ubound(block, 2)) => block_2d_ptr(:, :)
822 block(:,:) = block_ptr(:,:)
825 block(:,:) = reshape(block_2d_ptr, shape=shape(block), order=[map1_2d, map2_2d])
840 SUBROUTINE dbt_get_3d_block(tensor, ind, sizes, block, found)
841 TYPE(dbt_type),
INTENT(INOUT) :: tensor
842 INTEGER,
DIMENSION(3),
INTENT(IN) :: ind
843 INTEGER,
DIMENSION(3),
INTENT(IN) :: sizes
844 REAL(dp),
DIMENSION(sizes(1), sizes(2), sizes(3)), &
846 LOGICAL,
INTENT(OUT) :: found
848 INTEGER(KIND=int_8),
DIMENSION(2) :: ind_2d
849 REAL(dp),
DIMENSION(:, :),
POINTER,
CONTIGUOUS :: block_2d_ptr
851 REAL(dp),
DIMENSION(:,:,:),
POINTER :: block_ptr
853 NULLIFY (block_2d_ptr)
855 ind_2d(:) = get_2d_indices_tensor(tensor%nd_index_blk, ind)
857 associate(map1_2d => tensor%nd_index_blk%map1_2d, &
858 map2_2d => tensor%nd_index_blk%map2_2d)
860 CALL dbt_tas_get_block_p(tensor%matrix_rep, ind_2d(1), ind_2d(2), block_2d_ptr)
861 found =
ASSOCIATED(block_2d_ptr)
864 IF (all([map1_2d, map2_2d] == (/(i, i=1, 3)/)))
THEN
866 block_ptr(lbound(block, 1):ubound(block, 1), lbound(block, 2):ubound(block, 2), lbound(block, 3):ubound(block,&
867 & 3)) => block_2d_ptr(:, :)
868 block(:,:,:) = block_ptr(:,:,:)
871 block(:,:,:) = reshape(block_2d_ptr, shape=shape(block), order=[map1_2d, map2_2d])
886 SUBROUTINE dbt_get_4d_block(tensor, ind, sizes, block, found)
887 TYPE(dbt_type),
INTENT(INOUT) :: tensor
888 INTEGER,
DIMENSION(4),
INTENT(IN) :: ind
889 INTEGER,
DIMENSION(4),
INTENT(IN) :: sizes
890 REAL(dp),
DIMENSION(sizes(1), sizes(2), sizes(3), sizes(4)), &
892 LOGICAL,
INTENT(OUT) :: found
894 INTEGER(KIND=int_8),
DIMENSION(2) :: ind_2d
895 REAL(dp),
DIMENSION(:, :),
POINTER,
CONTIGUOUS :: block_2d_ptr
897 REAL(dp),
DIMENSION(:,:,:,:),
POINTER :: block_ptr
899 NULLIFY (block_2d_ptr)
901 ind_2d(:) = get_2d_indices_tensor(tensor%nd_index_blk, ind)
903 associate(map1_2d => tensor%nd_index_blk%map1_2d, &
904 map2_2d => tensor%nd_index_blk%map2_2d)
906 CALL dbt_tas_get_block_p(tensor%matrix_rep, ind_2d(1), ind_2d(2), block_2d_ptr)
907 found =
ASSOCIATED(block_2d_ptr)
910 IF (all([map1_2d, map2_2d] == (/(i, i=1, 4)/)))
THEN
912 block_ptr(lbound(block, 1):ubound(block, 1), lbound(block, 2):ubound(block, 2), lbound(block, 3):ubound(block,&
913 & 3), lbound(block, 4):ubound(block, 4)) => block_2d_ptr(:, :)
914 block(:,:,:,:) = block_ptr(:,:,:,:)
917 block(:,:,:,:) = reshape(block_2d_ptr, shape=shape(block), order=[map1_2d, map2_2d])
logical function, public dbcsr_has_symmetry(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)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
subroutine, public dbcsr_reserve_blocks(matrix, rows, cols)
...
subroutine, public dbcsr_finalize(matrix)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_release(matrix)
...
integer function, public dbcsr_get_num_blocks(matrix)
...
Wrapper for allocating, copying and reshaping arrays.
Representation of arbitrary number of 1d integer arrays with arbitrary sizes. This is needed for gene...
subroutine, public get_arrays(list, data_1, data_2, data_3, data_4, i_selected)
Get all arrays contained in list.
subroutine, public create_array_list(list, ndata, data_1, data_2, data_3, data_4)
collects any number of arrays of different sizes into a single array (listcol_data),...
subroutine, public destroy_array_list(list)
destroy array list.
integer function, dimension(:), allocatable, public sizes_of_arrays(list)
sizes of arrays stored in list
pure integer function, dimension(number_of_arrays(list)), public get_array_elements(list, indices)
Get an element for each array.
Methods to operate on n-dimensional tensor blocks.
elemental logical function, public checker_tr(row, column)
Determines whether a transpose must be applied.
integer function, public dbt_iterator_num_blocks(iterator)
Generalization of block_iterator_num_blocks for tensors.
logical function, public dbt_iterator_blocks_left(iterator)
Generalization of block_iterator_blocks_left for tensors.
subroutine, public destroy_block(block)
pure integer function, public ndims_iterator(iterator)
Number of dimensions.
subroutine, public dbt_iterator_stop(iterator)
Generalization of block_iterator_stop for tensors.
subroutine, public dbt_iterator_start(iterator, tensor)
Generalization of block_iterator_start for tensors.
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_...
tensor index and mapping to DBM index
subroutine, public create_nd_to_2d_mapping(map, dims, map1_2d, map2_2d, base, col_major)
Create all data needed to quickly map between nd index and 2d index.
pure integer(kind=int_8) function, dimension(2), public get_2d_indices_tensor(map, ind_in)
transform nd index to 2d index, using info from index mapping.
pure integer function, public ndims_mapping(map)
pure integer function, dimension(map%ndim_nd), public get_nd_indices_tensor(map, ind_in)
transform 2d index to nd index, using info from index mapping.
subroutine, public destroy_nd_to_2d_mapping(map)
Tall-and-skinny matrices: base routines similar to DBM API, mostly wrappers around existing DBM routi...
integer function, public dbt_tas_iterator_num_blocks(iter)
As dbm_iterator_num_blocks.
subroutine, public dbt_tas_iterator_start(iter, matrix_in)
As dbm_iterator_start.
logical function, public dbt_tas_iterator_blocks_left(iter)
As dbm_iterator_blocks_left.
subroutine, public dbt_tas_iterator_stop(iter)
As dbm_iterator_stop.
subroutine, public dbt_tas_put_block(matrix, row, col, block, summation)
As dbm_put_block.
subroutine, public dbt_tas_get_block_p(matrix, row, col, block, row_size, col_size)
As dbm_get_block_p.
DBT tall-and-skinny base types. Mostly wrappers around existing DBM routines.
DBT tensor framework for block-sparse tensor contraction: Types and create/destroy routines.
subroutine, public dbt_blk_sizes(tensor, ind, blk_size)
Size of tensor block.
pure integer function, public ndims_tensor(tensor)
tensor rank
pure integer function, public dbt_get_num_blocks(tensor)
As block_get_num_blocks: get number of local blocks.
subroutine, public dbt_finalize(tensor)
Finalize tensor, as block_finalize. This should be taken care of internally in DBT tensors,...
pure integer(int_8) function, public ndims_matrix_row(tensor)
how many tensor dimensions are mapped to matrix row
pure integer(int_8) function, public ndims_matrix_column(tensor)
how many tensor dimensions are mapped to matrix column
Defines the basic variable types.
integer, parameter, public int_8
integer, parameter, public dp