33#include "../base/base_uses.f90"
38 INTEGER :: mynode, io_unit
39 INTEGER :: ndims, nblks_alloc, nblks_1, nblks_2, nblks_3, nblks_4, nblks_5, &
40 nblks_alloc_1, nblks_alloc_2, nblks_alloc_3, nblks_alloc_4, nblks_alloc_5
41 INTEGER,
DIMENSION(:),
ALLOCATABLE :: size_1, size_2, size_3, size_4, size_5, dist1_1, dist1_2, dist1_3, &
42 dist2_1, dist2_2, dist3_1, dist3_2, dist3_3, dist4_1, dist4_2, &
43 dist4_3, dist4_4, dist5_1, dist5_2, dist5_3
44 INTEGER,
DIMENSION(:),
ALLOCATABLE :: blk_ind_1, blk_ind_2, blk_ind_3, blk_ind_4, blk_ind_1_1, blk_ind_2_1, &
45 blk_ind_3_1, blk_ind_3_2, blk_ind_4_2, blk_ind_1_3, blk_ind_2_3, &
46 blk_ind_4_3, blk_ind_1_4, blk_ind_2_4, blk_ind_4_4, blk_ind_5_4, &
47 blk_ind_3_5, blk_ind_4_5, blk_ind_5_5
48 INTEGER,
DIMENSION(:),
ALLOCATABLE :: map11, map31, map12, map32, map21, map22
50 LOGICAL,
PARAMETER :: verbose = .false.
52 TYPE(
dbt_type) :: tensor_a, tensor_b, tensor_c
54 LOGICAL,
PARAMETER :: test_format = .true.
55 LOGICAL,
PARAMETER :: test_contraction = .true.
56 INTEGER,
DIMENSION(4) :: pdims_4d
57 INTEGER,
DIMENSION(3) :: pdims_3d
58 INTEGER,
DIMENSION(2) :: pdims_2d
60 INTEGER,
DIMENSION(:),
ALLOCATABLE :: bounds_t
61 INTEGER,
DIMENSION(:, :),
ALLOCATABLE :: bounds, bounds_1, bounds_2
64 mynode = mp_comm%mepos
75 CALL dbcsr_init_lib(mp_comm%get_handle(), io_unit)
93 ALLOCATE (size_1(nblks_1), size_2(nblks_2))
95 size_1(:) = [3, 5, 1, 23, 2, 3, 1, 6, 3, 8, 2, 3, 5, 1]
96 size_2(:) = [4, 2, 5, 3, 1, 5, 13, 5, 2, 4, 5, 6, 7, 2, 3, 1, 2, 6, 9, 12, 21]
100 ALLOCATE (blk_ind_1(nblks_alloc), blk_ind_2(nblks_alloc))
103 blk_ind_1(:) = [1, 1, 1, 2, 4, 4, 7, 10, 10, 10, 10, 13]
104 blk_ind_2(:) = [1, 3, 11, 15, 4, 17, 21, 6, 9, 13, 19, 7]
108 blk_size_1=size_1, blk_size_2=size_2, &
109 blk_ind_1=blk_ind_1, blk_ind_2=blk_ind_2)
111 DEALLOCATE (size_1, size_2)
112 DEALLOCATE (blk_ind_1, blk_ind_2)
125 ALLOCATE (size_1(nblks_1), size_2(nblks_2), size_3(nblks_3))
127 size_1(:) = [3, 1, 5, 2]
128 size_2(:) = [1, 2, 5, 3, 2, 4]
129 size_3(:) = [4, 2, 10]
133 ALLOCATE (blk_ind_1(nblks_alloc), blk_ind_2(nblks_alloc), blk_ind_3(nblks_alloc))
136 blk_ind_1(:) = [1, 1, 1, 2, 2, 2]
137 blk_ind_2(:) = [2, 2, 4, 1, 1, 2]
138 blk_ind_3(:) = [1, 3, 3, 2, 3, 2]
142 blk_size_1=size_1, blk_size_2=size_2, blk_size_3=size_3, &
143 blk_ind_1=blk_ind_1, blk_ind_2=blk_ind_2, blk_ind_3=blk_ind_3)
145 DEALLOCATE (size_1, size_2, size_3)
146 DEALLOCATE (blk_ind_1, blk_ind_2, blk_ind_3)
160 ALLOCATE (size_1(nblks_1), size_2(nblks_2), size_3(nblks_3), size_4(nblks_4))
163 size_2(:) = [6, 2, 5, 12, 3, 1, 7, 2, 5, 17, 9, 3, 4]
164 size_3(:) = [2, 7, 3, 8, 5, 15, 1]
165 size_4(:) = [12, 5, 3]
169 ALLOCATE (blk_ind_1(nblks_alloc), blk_ind_2(nblks_alloc), blk_ind_3(nblks_alloc), blk_ind_4(nblks_alloc))
172 blk_ind_1(:) = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2]
173 blk_ind_2(:) = [2, 2, 3, 4, 7, 7, 10, 11, 11, 12, 12, 1, 1, 3, 5, 6, 6, 9, 12]
174 blk_ind_3(:) = [1, 4, 6, 3, 1, 4, 2, 5, 7, 3, 3, 1, 4, 7, 6, 4, 5, 2, 3]
175 blk_ind_4(:) = [3, 2, 3, 1, 1, 2, 1, 3, 2, 2, 3, 1, 3, 2, 1, 1, 3, 2, 2]
179 blk_size_1=size_1, blk_size_2=size_2, blk_size_3=size_3, blk_size_4=size_4, &
180 blk_ind_1=blk_ind_1, blk_ind_2=blk_ind_2, blk_ind_3=blk_ind_3, blk_ind_4=blk_ind_4)
182 DEALLOCATE (size_1, size_2, size_3, size_4)
183 DEALLOCATE (blk_ind_1, blk_ind_2, blk_ind_3, blk_ind_4)
186 IF (test_contraction)
THEN
199 ALLOCATE (size_1(nblks_1), size_2(nblks_2), size_3(nblks_3), size_4(nblks_4), size_5(nblks_5))
201 size_1(:) = [3, 9, 12, 1]
202 size_2(:) = [4, 2, 3, 1, 9, 2, 32, 10, 5, 8, 7]
203 size_3(:) = [7, 3, 8, 7, 9, 5, 10, 23, 2]
204 size_4(:) = [8, 1, 4, 13, 6]
205 size_5(:) = [4, 2, 22]
208 ALLOCATE (blk_ind_1_1(nblks_alloc_1), blk_ind_2_1(nblks_alloc_1), blk_ind_3_1(nblks_alloc_1))
210 blk_ind_1_1(:) = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, &
211 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, &
212 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, &
215 blk_ind_2_1(:) = [ 3, 5, 5, 5, 6, 6, 7, 8, 10, 11, &
216 11, 1, 1, 4, 7, 7, 9, 10 , 2, 2, &
217 5, 6, 8, 8, 9, 11, 11, 2 , 4, 5, &
220 blk_ind_3_1(:) = [7, 3, 5, 9, 6, 8, 2, 8, 3, 2, &
221 3, 1, 4, 6, 2, 7, 5, 8, 3, 7, &
222 1, 4, 3, 7, 8, 5, 8, 9, 6, 1, &
226 ALLOCATE (blk_ind_3_2(nblks_alloc_2), blk_ind_4_2(nblks_alloc_2))
228 blk_ind_3_2(:) = [1, 1, 2, 2, 2, 4, 4, 5, 5, 6, &
230 blk_ind_4_2(:) = [2, 3, 2, 4, 5, 3, 5, 1, 3, 3, &
234 ALLOCATE (blk_ind_1_3(nblks_alloc_3), blk_ind_2_3(nblks_alloc_3), blk_ind_4_3(nblks_alloc_3))
236 blk_ind_1_3(:) = [1, 1, 2, 4, 4]
237 blk_ind_2_3(:) = [2, 6, 6, 7, 9]
238 blk_ind_4_3(:) = [1, 3, 4, 4, 5]
241 ALLOCATE (blk_ind_1_4(nblks_alloc_4))
242 ALLOCATE (blk_ind_2_4(nblks_alloc_4))
243 ALLOCATE (blk_ind_4_4(nblks_alloc_4))
244 ALLOCATE (blk_ind_5_4(nblks_alloc_4))
246 blk_ind_1_4(:) = [ 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, &
247 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, &
248 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, &
251 blk_ind_2_4(:) = [ 1, 3, 4, 6, 10, 2, 2, 4, 5, 5, &
252 6, 6, 6, 7, 7, 9, 9, 9, 10, 11, &
253 1, 3, 3, 4, 5, 6, 8, 9, 11, 11, &
256 blk_ind_4_4(:) = [ 3, 5, 2, 3, 2, 3, 5, 1, 1, 4, &
257 2, 3, 4, 1, 4, 3, 4, 4, 2, 1, &
258 3, 1, 1, 3, 4, 3, 4, 2, 2, 3, &
261 blk_ind_5_4(:) = [ 1, 3, 2, 1, 1, 2, 3, 1, 3, 1, &
262 2, 3, 2, 1, 3, 2, 3, 2, 1, 2, &
263 3, 1, 2, 3, 2, 2, 2, 3, 1, 2, &
268 ALLOCATE (blk_ind_3_5(nblks_alloc_5), blk_ind_4_5(nblks_alloc_5), blk_ind_5_5(nblks_alloc_5))
270 blk_ind_3_5(:) = [2, 4, 5, 5, 5, 6, 6, 8]
271 blk_ind_4_5(:) = [3, 2, 1, 1, 3, 2, 4, 5]
272 blk_ind_5_5(:) = [3, 2, 1, 2, 3, 2, 1, 1]
274 pdims_4d(:) = 0; pdims_3d(:) = 0; pdims_2d(:) = 0
279 ALLOCATE (dist1_1(nblks_1))
281 ALLOCATE (dist1_2(nblks_2))
283 ALLOCATE (dist1_3(nblks_3))
286 ALLOCATE (dist2_1(nblks_3))
288 ALLOCATE (dist2_2(nblks_4))
291 ALLOCATE (dist3_1(nblks_1))
293 ALLOCATE (dist3_2(nblks_2))
295 ALLOCATE (dist3_3(nblks_4))
298 ALLOCATE (dist4_1(nblks_1))
300 ALLOCATE (dist4_2(nblks_2))
302 ALLOCATE (dist4_3(nblks_4))
304 ALLOCATE (dist4_4(nblks_5))
307 ALLOCATE (dist5_1(nblks_3))
309 ALLOCATE (dist5_2(nblks_4))
311 ALLOCATE (dist5_3(nblks_5))
318 ALLOCATE (map11(2), map12(1), map21(1), map22(1), map31(2), map32(1))
330 CALL dbt_create(tensor_a,
"(12|3)", dist1, map11, map12, size_1, size_2, size_3)
331 CALL dbt_create(tensor_b,
"(3|4)", dist2, map21, map22, size_3, size_4)
332 CALL dbt_create(tensor_c,
"(12|4)", dist3, map31, map32, size_1, size_2, size_4)
344 log_verbose=verbose, &
347 DEALLOCATE (map11, map12, map21, map22, map31, map32)
360 ALLOCATE (map11(1), map12(2), map21(1), map22(1), map31(2), map32(1))
372 CALL dbt_create(tensor_a,
"(2|31)", dist1, map11, map12, size_1, size_2, size_3)
373 CALL dbt_create(tensor_b,
"(4|3)", dist2, map21, map22, size_3, size_4)
374 CALL dbt_create(tensor_c,
"(24|1)", dist3, map31, map32, size_1, size_2, size_4)
385 log_verbose=verbose, &
388 DEALLOCATE (map11, map12, map21, map22, map31, map32)
401 ALLOCATE (map11(1), map12(2), map21(1), map22(1), map31(2), map32(1))
413 CALL dbt_create(tensor_a,
"(1|32)", dist1, map11, map12, size_1, size_2, size_3)
414 CALL dbt_create(tensor_b,
"(4|3)", dist2, map21, map22, size_3, size_4)
415 CALL dbt_create(tensor_c,
"(24|1)", dist3, map31, map32, size_1, size_2, size_4)
424 ALLOCATE (bounds(2, 1))
426 bounds(2, 1) = bounds_t(1) - 21
434 log_verbose=verbose, &
437 DEALLOCATE (map11, map12, map21, map22, map31, map32, bounds_t, bounds)
450 ALLOCATE (map11(2), map12(1), map21(1), map22(1), map31(1), map32(2))
462 CALL dbt_create(tensor_a,
"(21|3)", dist1, map11, map12, size_1, size_2, size_3)
463 CALL dbt_create(tensor_b,
"(3|4)", dist2, map21, map22, size_3, size_4)
464 CALL dbt_create(tensor_c,
"(1|24)", dist3, map31, map32, size_1, size_2, size_4)
473 ALLOCATE (bounds(2, 2))
475 bounds(2, 1) = bounds_t(1)
477 bounds(2, 2) = bounds_t(2) - 10
478 DEALLOCATE (bounds_t)
486 log_verbose=verbose, &
489 DEALLOCATE (map11, map12, map21, map22, map31, map32, bounds)
502 ALLOCATE (map11(2), map12(1), map21(2), map22(2), map31(1), map32(2))
514 CALL dbt_create(tensor_a,
"(12|3)", dist1, map11, map12, size_1, size_2, size_3)
515 CALL dbt_create(tensor_b,
"(12|45)", dist2, map21, map22, size_1, size_2, size_4, size_5)
516 CALL dbt_create(tensor_c,
"(3|45)", dist3, map31, map32, size_3, size_4, size_5)
519 CALL dbt_setup_test_tensor(tensor_b, mp_comm, .false., blk_ind_1_4, blk_ind_2_4, blk_ind_4_4, blk_ind_5_4)
524 ALLOCATE (bounds_1(2, 2))
526 bounds_1(2, 1) = bounds_t(2) - 17
528 bounds_1(2, 2) = bounds_t(1)
529 DEALLOCATE (bounds_t)
533 ALLOCATE (bounds_2(2, 2))
535 bounds_2(2, 1) = bounds_t(3)
537 bounds_2(2, 2) = bounds_t(4) - 18
538 DEALLOCATE (bounds_t)
547 log_verbose=verbose, &
550 DEALLOCATE (map11, map12, map21, map22, map31, map32, bounds_1, bounds_2)
563 ALLOCATE (map11(1), map12(2), map21(2), map22(2), map31(1), map32(2))
575 CALL dbt_create(tensor_a,
"(3|21)", dist1, map11, map12, size_1, size_2, size_3)
576 CALL dbt_create(tensor_b,
"(12|45)", dist2, map21, map22, size_1, size_2, size_4, size_5)
577 CALL dbt_create(tensor_c,
"(3|45)", dist3, map31, map32, size_3, size_4, size_5)
580 CALL dbt_setup_test_tensor(tensor_b, mp_comm, .false., blk_ind_1_4, blk_ind_2_4, blk_ind_4_4, blk_ind_5_4)
588 log_verbose=verbose, &
591 DEALLOCATE (map11, map12, map21, map22, map31, map32)
604 ALLOCATE (map11(2), map12(1), map21(2), map22(2), map31(1), map32(2))
616 CALL dbt_create(tensor_a,
"(13|2)", dist1, map11, map12, size_1, size_2, size_3)
617 CALL dbt_create(tensor_b,
"(54|21)", dist2, map21, map22, size_1, size_2, size_4, size_5)
618 CALL dbt_create(tensor_c,
"(3|45)", dist3, map31, map32, size_3, size_4, size_5)
621 CALL dbt_setup_test_tensor(tensor_b, mp_comm, .false., blk_ind_1_4, blk_ind_2_4, blk_ind_4_4, blk_ind_5_4)
629 log_verbose=verbose, &
632 DEALLOCATE (map11, map12, map21, map22, map31, map32)
645 ALLOCATE (map11(1), map12(2), map21(2), map22(2), map31(2), map32(1))
657 CALL dbt_create(tensor_a,
"(2|31)", dist1, map11, map12, size_1, size_2, size_3)
658 CALL dbt_create(tensor_b,
"(54|21)", dist2, map21, map22, size_1, size_2, size_4, size_5)
659 CALL dbt_create(tensor_c,
"(43|5)", dist3, map31, map32, size_3, size_4, size_5)
662 CALL dbt_setup_test_tensor(tensor_b, mp_comm, .false., blk_ind_1_4, blk_ind_2_4, blk_ind_4_4, blk_ind_5_4)
670 log_verbose=verbose, &
673 DEALLOCATE (map11, map12, map21, map22, map31, map32)
686 ALLOCATE (map11(2), map12(1), map21(3), map22(1), map31(1), map32(2))
698 CALL dbt_create(tensor_a,
"(31|2)", dist1, map11, map12, size_1, size_2, size_3)
699 CALL dbt_create(tensor_b,
"(241|5)", dist2, map21, map22, size_1, size_2, size_4, size_5)
700 CALL dbt_create(tensor_c,
"(5|43)", dist3, map31, map32, size_3, size_4, size_5)
703 CALL dbt_setup_test_tensor(tensor_b, mp_comm, .false., blk_ind_1_4, blk_ind_2_4, blk_ind_4_4, blk_ind_5_4)
711 log_verbose=verbose, &
714 DEALLOCATE (map11, map12, map21, map22, map31, map32)
727 ALLOCATE (map11(2), map12(1), map21(2), map22(2), map31(2), map32(1))
739 CALL dbt_create(tensor_a,
"(12|3)", dist1, map11, map12, size_1, size_2, size_3)
740 CALL dbt_create(tensor_b,
"(14|25)", dist2, map21, map22, size_1, size_2, size_4, size_5)
741 CALL dbt_create(tensor_c,
"(34|5)", dist3, map31, map32, size_3, size_4, size_5)
744 CALL dbt_setup_test_tensor(tensor_b, mp_comm, .false., blk_ind_1_4, blk_ind_2_4, blk_ind_4_4, blk_ind_5_4)
752 log_verbose=verbose, &
755 DEALLOCATE (map11, map12, map21, map22, map31, map32)
768 DEALLOCATE (blk_ind_1_1, blk_ind_2_1, blk_ind_3_1)
769 DEALLOCATE (blk_ind_3_2, blk_ind_4_2)
770 DEALLOCATE (blk_ind_1_3, blk_ind_2_3, blk_ind_4_3)
771 DEALLOCATE (blk_ind_1_4, blk_ind_2_4, blk_ind_4_4, blk_ind_5_4)
772 DEALLOCATE (blk_ind_3_5, blk_ind_4_5, blk_ind_5_5)
773 DEALLOCATE (size_1, size_2, size_3, size_4, size_5, dist1_1, dist1_2, dist1_3, &
774 dist2_1, dist2_2, dist3_1, dist3_2, dist3_3, dist4_1, dist4_2, &
775 dist4_3, dist4_4, dist5_1, dist5_2, dist5_3)
788 CALL dbcsr_finalize_lib()
program dbt_unittest
Block tensor unit test.
subroutine, public dbm_library_init()
Initialize DBM library.
subroutine, public dbm_library_finalize()
Finalize DBM library.
subroutine, public dbm_library_print_stats(mpi_comm, output_unit)
Print DBM library statistics.
General methods for testing DBT tensors.
subroutine, public dbt_reset_randmat_seed()
Reset the seed used for generating random matrices to default value.
subroutine, public dbt_test_formats(ndims, mp_comm, unit_nr, verbose, blk_size_1, blk_size_2, blk_size_3, blk_size_4, blk_ind_1, blk_ind_2, blk_ind_3, blk_ind_4)
Test equivalence of all tensor formats, using a random distribution.
subroutine, public dbt_contract_test(alpha, tensor_1, tensor_2, beta, tensor_3, contract_1, notcontract_1, contract_2, notcontract_2, map_1, map_2, unit_nr, bounds_1, bounds_2, bounds_3, log_verbose, write_int)
test tensor contraction
subroutine, public dbt_setup_test_tensor(tensor, mp_comm, enumerate, blk_ind_1, blk_ind_2, blk_ind_3, blk_ind_4)
Allocate and fill test tensor - entries are enumerated by their index s.t. they only depend on global...
DBT tensor framework for block-sparse tensor contraction: Types and create/destroy routines.
subroutine, public dbt_pgrid_destroy(pgrid, keep_comm)
destroy process grid
subroutine, public dbt_distribution_new(dist, pgrid, nd_dist_1, nd_dist_2, nd_dist_3, nd_dist_4)
Create a tensor distribution.
subroutine, public dbt_destroy(tensor)
Destroy a tensor.
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.
pure integer function, public ndims_tensor(tensor)
tensor rank
subroutine, public dbt_default_distvec(nblk, nproc, blk_size, dist)
get a load-balanced and randomized distribution along one tensor dimension
subroutine, public dbt_pgrid_create(mp_comm, dims, pgrid, tensor_dims)
subroutine, public dbt_distribution_destroy(dist)
Destroy tensor distribution.
Defines the basic variable types.
integer, parameter, public dp
Machine interface based on Fortran 2003 and POSIX.
integer, parameter, public default_output_unit
Interface to the message passing library MPI.
subroutine, public mp_world_init(mp_comm)
initializes the system default communicator
subroutine, public mp_world_finalize()
finalizes the system default communicator
Fortran API for the offload package, which is written in C.
subroutine, public offload_set_chosen_device(device_id)
Selects the chosen device to be used.
integer function, public offload_get_device_count()
Returns the number of available devices.