18 USE dbt_api,
ONLY: dbt_library_finalize,&
20 dbt_library_print_stats
36#include "../base/base_uses.f90"
41 INTEGER :: mynode, io_unit
42 INTEGER :: ndims, nblks_alloc, nblks_1, nblks_2, nblks_3, nblks_4, nblks_5, &
43 nblks_alloc_1, nblks_alloc_2, nblks_alloc_3, nblks_alloc_4, nblks_alloc_5
44 INTEGER,
DIMENSION(:),
ALLOCATABLE :: size_1, size_2, size_3, size_4, size_5, dist1_1, dist1_2, dist1_3, &
45 dist2_1, dist2_2, dist3_1, dist3_2, dist3_3, dist4_1, dist4_2, &
46 dist4_3, dist4_4, dist5_1, dist5_2, dist5_3
47 INTEGER,
DIMENSION(:),
ALLOCATABLE :: blk_ind_1, blk_ind_2, blk_ind_3, blk_ind_4, blk_ind_1_1, blk_ind_2_1, &
48 blk_ind_3_1, blk_ind_3_2, blk_ind_4_2, blk_ind_1_3, blk_ind_2_3, &
49 blk_ind_4_3, blk_ind_1_4, blk_ind_2_4, blk_ind_4_4, blk_ind_5_4, &
50 blk_ind_3_5, blk_ind_4_5, blk_ind_5_5
51 INTEGER,
DIMENSION(:),
ALLOCATABLE :: map11, map31, map12, map32, map21, map22
53 LOGICAL,
PARAMETER :: verbose = .false.
55 TYPE(
dbt_type) :: tensor_a, tensor_b, tensor_c
57 LOGICAL,
PARAMETER :: test_format = .true.
58 LOGICAL,
PARAMETER :: test_contraction = .true.
59 INTEGER,
DIMENSION(4) :: pdims_4d
60 INTEGER,
DIMENSION(3) :: pdims_3d
61 INTEGER,
DIMENSION(2) :: pdims_2d
63 INTEGER,
DIMENSION(:),
ALLOCATABLE :: bounds_t
64 INTEGER,
DIMENSION(:, :),
ALLOCATABLE :: bounds, bounds_1, bounds_2
67 mynode = mp_comm%mepos
78 CALL dbcsr_init_lib(mp_comm%get_handle(), io_unit)
80 CALL dbt_library_init()
97 ALLOCATE (size_1(nblks_1), size_2(nblks_2))
99 size_1(:) = [3, 5, 1, 23, 2, 3, 1, 6, 3, 8, 2, 3, 5, 1]
100 size_2(:) = [4, 2, 5, 3, 1, 5, 13, 5, 2, 4, 5, 6, 7, 2, 3, 1, 2, 6, 9, 12, 21]
104 ALLOCATE (blk_ind_1(nblks_alloc), blk_ind_2(nblks_alloc))
107 blk_ind_1(:) = [1, 1, 1, 2, 4, 4, 7, 10, 10, 10, 10, 13]
108 blk_ind_2(:) = [1, 3, 11, 15, 4, 17, 21, 6, 9, 13, 19, 7]
112 blk_size_1=size_1, blk_size_2=size_2, &
113 blk_ind_1=blk_ind_1, blk_ind_2=blk_ind_2)
115 DEALLOCATE (size_1, size_2)
116 DEALLOCATE (blk_ind_1, blk_ind_2)
129 ALLOCATE (size_1(nblks_1), size_2(nblks_2), size_3(nblks_3))
131 size_1(:) = [3, 1, 5, 2]
132 size_2(:) = [1, 2, 5, 3, 2, 4]
133 size_3(:) = [4, 2, 10]
137 ALLOCATE (blk_ind_1(nblks_alloc), blk_ind_2(nblks_alloc), blk_ind_3(nblks_alloc))
140 blk_ind_1(:) = [1, 1, 1, 2, 2, 2]
141 blk_ind_2(:) = [2, 2, 4, 1, 1, 2]
142 blk_ind_3(:) = [1, 3, 3, 2, 3, 2]
146 blk_size_1=size_1, blk_size_2=size_2, blk_size_3=size_3, &
147 blk_ind_1=blk_ind_1, blk_ind_2=blk_ind_2, blk_ind_3=blk_ind_3)
149 DEALLOCATE (size_1, size_2, size_3)
150 DEALLOCATE (blk_ind_1, blk_ind_2, blk_ind_3)
164 ALLOCATE (size_1(nblks_1), size_2(nblks_2), size_3(nblks_3), size_4(nblks_4))
167 size_2(:) = [6, 2, 5, 12, 3, 1, 7, 2, 5, 17, 9, 3, 4]
168 size_3(:) = [2, 7, 3, 8, 5, 15, 1]
169 size_4(:) = [12, 5, 3]
173 ALLOCATE (blk_ind_1(nblks_alloc), blk_ind_2(nblks_alloc), blk_ind_3(nblks_alloc), blk_ind_4(nblks_alloc))
176 blk_ind_1(:) = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2]
177 blk_ind_2(:) = [2, 2, 3, 4, 7, 7, 10, 11, 11, 12, 12, 1, 1, 3, 5, 6, 6, 9, 12]
178 blk_ind_3(:) = [1, 4, 6, 3, 1, 4, 2, 5, 7, 3, 3, 1, 4, 7, 6, 4, 5, 2, 3]
179 blk_ind_4(:) = [3, 2, 3, 1, 1, 2, 1, 3, 2, 2, 3, 1, 3, 2, 1, 1, 3, 2, 2]
183 blk_size_1=size_1, blk_size_2=size_2, blk_size_3=size_3, blk_size_4=size_4, &
184 blk_ind_1=blk_ind_1, blk_ind_2=blk_ind_2, blk_ind_3=blk_ind_3, blk_ind_4=blk_ind_4)
186 DEALLOCATE (size_1, size_2, size_3, size_4)
187 DEALLOCATE (blk_ind_1, blk_ind_2, blk_ind_3, blk_ind_4)
190 IF (test_contraction)
THEN
203 ALLOCATE (size_1(nblks_1), size_2(nblks_2), size_3(nblks_3), size_4(nblks_4), size_5(nblks_5))
205 size_1(:) = [3, 9, 12, 1]
206 size_2(:) = [4, 2, 3, 1, 9, 2, 32, 10, 5, 8, 7]
207 size_3(:) = [7, 3, 8, 7, 9, 5, 10, 23, 2]
208 size_4(:) = [8, 1, 4, 13, 6]
209 size_5(:) = [4, 2, 22]
212 ALLOCATE (blk_ind_1_1(nblks_alloc_1), blk_ind_2_1(nblks_alloc_1), blk_ind_3_1(nblks_alloc_1))
214 blk_ind_1_1(:) = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, &
215 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, &
216 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, &
219 blk_ind_2_1(:) = [ 3, 5, 5, 5, 6, 6, 7, 8, 10, 11, &
220 11, 1, 1, 4, 7, 7, 9, 10 , 2, 2, &
221 5, 6, 8, 8, 9, 11, 11, 2 , 4, 5, &
224 blk_ind_3_1(:) = [7, 3, 5, 9, 6, 8, 2, 8, 3, 2, &
225 3, 1, 4, 6, 2, 7, 5, 8, 3, 7, &
226 1, 4, 3, 7, 8, 5, 8, 9, 6, 1, &
230 ALLOCATE (blk_ind_3_2(nblks_alloc_2), blk_ind_4_2(nblks_alloc_2))
232 blk_ind_3_2(:) = [1, 1, 2, 2, 2, 4, 4, 5, 5, 6, &
234 blk_ind_4_2(:) = [2, 3, 2, 4, 5, 3, 5, 1, 3, 3, &
238 ALLOCATE (blk_ind_1_3(nblks_alloc_3), blk_ind_2_3(nblks_alloc_3), blk_ind_4_3(nblks_alloc_3))
240 blk_ind_1_3(:) = [1, 1, 2, 4, 4]
241 blk_ind_2_3(:) = [2, 6, 6, 7, 9]
242 blk_ind_4_3(:) = [1, 3, 4, 4, 5]
245 ALLOCATE (blk_ind_1_4(nblks_alloc_4))
246 ALLOCATE (blk_ind_2_4(nblks_alloc_4))
247 ALLOCATE (blk_ind_4_4(nblks_alloc_4))
248 ALLOCATE (blk_ind_5_4(nblks_alloc_4))
250 blk_ind_1_4(:) = [ 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, &
251 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, &
252 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, &
255 blk_ind_2_4(:) = [ 1, 3, 4, 6, 10, 2, 2, 4, 5, 5, &
256 6, 6, 6, 7, 7, 9, 9, 9, 10, 11, &
257 1, 3, 3, 4, 5, 6, 8, 9, 11, 11, &
260 blk_ind_4_4(:) = [ 3, 5, 2, 3, 2, 3, 5, 1, 1, 4, &
261 2, 3, 4, 1, 4, 3, 4, 4, 2, 1, &
262 3, 1, 1, 3, 4, 3, 4, 2, 2, 3, &
265 blk_ind_5_4(:) = [ 1, 3, 2, 1, 1, 2, 3, 1, 3, 1, &
266 2, 3, 2, 1, 3, 2, 3, 2, 1, 2, &
267 3, 1, 2, 3, 2, 2, 2, 3, 1, 2, &
272 ALLOCATE (blk_ind_3_5(nblks_alloc_5), blk_ind_4_5(nblks_alloc_5), blk_ind_5_5(nblks_alloc_5))
274 blk_ind_3_5(:) = [2, 4, 5, 5, 5, 6, 6, 8]
275 blk_ind_4_5(:) = [3, 2, 1, 1, 3, 2, 4, 5]
276 blk_ind_5_5(:) = [3, 2, 1, 2, 3, 2, 1, 1]
278 pdims_4d(:) = 0; pdims_3d(:) = 0; pdims_2d(:) = 0
283 ALLOCATE (dist1_1(nblks_1))
285 ALLOCATE (dist1_2(nblks_2))
287 ALLOCATE (dist1_3(nblks_3))
290 ALLOCATE (dist2_1(nblks_3))
292 ALLOCATE (dist2_2(nblks_4))
295 ALLOCATE (dist3_1(nblks_1))
297 ALLOCATE (dist3_2(nblks_2))
299 ALLOCATE (dist3_3(nblks_4))
302 ALLOCATE (dist4_1(nblks_1))
304 ALLOCATE (dist4_2(nblks_2))
306 ALLOCATE (dist4_3(nblks_4))
308 ALLOCATE (dist4_4(nblks_5))
311 ALLOCATE (dist5_1(nblks_3))
313 ALLOCATE (dist5_2(nblks_4))
315 ALLOCATE (dist5_3(nblks_5))
322 ALLOCATE (map11(2), map12(1), map21(1), map22(1), map31(2), map32(1))
334 CALL dbt_create(tensor_a,
"(12|3)", dist1, map11, map12, size_1, size_2, size_3)
335 CALL dbt_create(tensor_b,
"(3|4)", dist2, map21, map22, size_3, size_4)
336 CALL dbt_create(tensor_c,
"(12|4)", dist3, map31, map32, size_1, size_2, size_4)
348 log_verbose=verbose, &
351 DEALLOCATE (map11, map12, map21, map22, map31, map32)
364 ALLOCATE (map11(1), map12(2), map21(1), map22(1), map31(2), map32(1))
376 CALL dbt_create(tensor_a,
"(2|31)", dist1, map11, map12, size_1, size_2, size_3)
377 CALL dbt_create(tensor_b,
"(4|3)", dist2, map21, map22, size_3, size_4)
378 CALL dbt_create(tensor_c,
"(24|1)", dist3, map31, map32, size_1, size_2, size_4)
389 log_verbose=verbose, &
392 DEALLOCATE (map11, map12, map21, map22, map31, map32)
405 ALLOCATE (map11(1), map12(2), map21(1), map22(1), map31(2), map32(1))
417 CALL dbt_create(tensor_a,
"(1|32)", dist1, map11, map12, size_1, size_2, size_3)
418 CALL dbt_create(tensor_b,
"(4|3)", dist2, map21, map22, size_3, size_4)
419 CALL dbt_create(tensor_c,
"(24|1)", dist3, map31, map32, size_1, size_2, size_4)
428 ALLOCATE (bounds(2, 1))
430 bounds(2, 1) = bounds_t(1) - 21
438 log_verbose=verbose, &
441 DEALLOCATE (map11, map12, map21, map22, map31, map32, bounds_t, bounds)
454 ALLOCATE (map11(2), map12(1), map21(1), map22(1), map31(1), map32(2))
466 CALL dbt_create(tensor_a,
"(21|3)", dist1, map11, map12, size_1, size_2, size_3)
467 CALL dbt_create(tensor_b,
"(3|4)", dist2, map21, map22, size_3, size_4)
468 CALL dbt_create(tensor_c,
"(1|24)", dist3, map31, map32, size_1, size_2, size_4)
477 ALLOCATE (bounds(2, 2))
479 bounds(2, 1) = bounds_t(1)
481 bounds(2, 2) = bounds_t(2) - 10
482 DEALLOCATE (bounds_t)
490 log_verbose=verbose, &
493 DEALLOCATE (map11, map12, map21, map22, map31, map32, bounds)
506 ALLOCATE (map11(2), map12(1), map21(2), map22(2), map31(1), map32(2))
518 CALL dbt_create(tensor_a,
"(12|3)", dist1, map11, map12, size_1, size_2, size_3)
519 CALL dbt_create(tensor_b,
"(12|45)", dist2, map21, map22, size_1, size_2, size_4, size_5)
520 CALL dbt_create(tensor_c,
"(3|45)", dist3, map31, map32, size_3, size_4, size_5)
523 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)
528 ALLOCATE (bounds_1(2, 2))
530 bounds_1(2, 1) = bounds_t(2) - 17
532 bounds_1(2, 2) = bounds_t(1)
533 DEALLOCATE (bounds_t)
537 ALLOCATE (bounds_2(2, 2))
539 bounds_2(2, 1) = bounds_t(3)
541 bounds_2(2, 2) = bounds_t(4) - 18
542 DEALLOCATE (bounds_t)
551 log_verbose=verbose, &
554 DEALLOCATE (map11, map12, map21, map22, map31, map32, bounds_1, bounds_2)
567 ALLOCATE (map11(1), map12(2), map21(2), map22(2), map31(1), map32(2))
579 CALL dbt_create(tensor_a,
"(3|21)", dist1, map11, map12, size_1, size_2, size_3)
580 CALL dbt_create(tensor_b,
"(12|45)", dist2, map21, map22, size_1, size_2, size_4, size_5)
581 CALL dbt_create(tensor_c,
"(3|45)", dist3, map31, map32, size_3, size_4, size_5)
584 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)
592 log_verbose=verbose, &
595 DEALLOCATE (map11, map12, map21, map22, map31, map32)
608 ALLOCATE (map11(2), map12(1), map21(2), map22(2), map31(1), map32(2))
620 CALL dbt_create(tensor_a,
"(13|2)", dist1, map11, map12, size_1, size_2, size_3)
621 CALL dbt_create(tensor_b,
"(54|21)", dist2, map21, map22, size_1, size_2, size_4, size_5)
622 CALL dbt_create(tensor_c,
"(3|45)", dist3, map31, map32, size_3, size_4, size_5)
625 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)
633 log_verbose=verbose, &
636 DEALLOCATE (map11, map12, map21, map22, map31, map32)
649 ALLOCATE (map11(1), map12(2), map21(2), map22(2), map31(2), map32(1))
661 CALL dbt_create(tensor_a,
"(2|31)", dist1, map11, map12, size_1, size_2, size_3)
662 CALL dbt_create(tensor_b,
"(54|21)", dist2, map21, map22, size_1, size_2, size_4, size_5)
663 CALL dbt_create(tensor_c,
"(43|5)", dist3, map31, map32, size_3, size_4, size_5)
666 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)
674 log_verbose=verbose, &
677 DEALLOCATE (map11, map12, map21, map22, map31, map32)
690 ALLOCATE (map11(2), map12(1), map21(3), map22(1), map31(1), map32(2))
702 CALL dbt_create(tensor_a,
"(31|2)", dist1, map11, map12, size_1, size_2, size_3)
703 CALL dbt_create(tensor_b,
"(241|5)", dist2, map21, map22, size_1, size_2, size_4, size_5)
704 CALL dbt_create(tensor_c,
"(5|43)", dist3, map31, map32, size_3, size_4, size_5)
707 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)
715 log_verbose=verbose, &
718 DEALLOCATE (map11, map12, map21, map22, map31, map32)
731 ALLOCATE (map11(2), map12(1), map21(2), map22(2), map31(2), map32(1))
743 CALL dbt_create(tensor_a,
"(12|3)", dist1, map11, map12, size_1, size_2, size_3)
744 CALL dbt_create(tensor_b,
"(14|25)", dist2, map21, map22, size_1, size_2, size_4, size_5)
745 CALL dbt_create(tensor_c,
"(34|5)", dist3, map31, map32, size_3, size_4, size_5)
748 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)
756 log_verbose=verbose, &
759 DEALLOCATE (map11, map12, map21, map22, map31, map32)
772 DEALLOCATE (blk_ind_1_1, blk_ind_2_1, blk_ind_3_1)
773 DEALLOCATE (blk_ind_3_2, blk_ind_4_2)
774 DEALLOCATE (blk_ind_1_3, blk_ind_2_3, blk_ind_4_3)
775 DEALLOCATE (blk_ind_1_4, blk_ind_2_4, blk_ind_4_4, blk_ind_5_4)
776 DEALLOCATE (blk_ind_3_5, blk_ind_4_5, blk_ind_5_5)
777 DEALLOCATE (size_1, size_2, size_3, size_4, size_5, dist1_1, dist1_2, dist1_3, &
778 dist2_1, dist2_2, dist3_1, dist3_2, dist3_3, dist4_1, dist4_2, &
779 dist4_3, dist4_4, dist5_1, dist5_2, dist5_3)
791 CALL dbt_library_print_stats(mp_comm, io_unit)
792 CALL dbt_library_finalize()
794 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.
This is the start of a dbt_api, all publically needed functions are exported here....
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()
Finalize the system default communicator and MPI when CP2K owns MPI.
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.