174 blk_size_1, blk_size_2, blk_size_3, blk_size_4, &
175 blk_ind_1, blk_ind_2, blk_ind_3, blk_ind_4)
176 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: blk_size_1, blk_size_2, blk_size_3, blk_size_4
177 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: blk_ind_1, blk_ind_2, blk_ind_3, blk_ind_4
178 INTEGER,
INTENT(IN) :: ndims
179 INTEGER,
INTENT(IN) :: unit_nr
180 LOGICAL,
INTENT(IN) :: verbose
184 INTEGER :: isep, iblk
185 INTEGER,
DIMENSION(:),
ALLOCATABLE :: dist1_1, dist1_2, dist1_3, dist1_4, &
186 dist2_1, dist2_2, dist2_3, dist2_4
187 INTEGER :: nblks, imap
188 INTEGER,
DIMENSION(ndims) :: pdims, myploc
190 INTEGER :: iperm, idist, icount
191 INTEGER,
DIMENSION(:),
ALLOCATABLE :: map1, map2, map1_ref, map2_ref
192 INTEGER,
DIMENSION(ndims, factorial(ndims)) :: perm
196 CHARACTER(LEN=default_string_length) :: tensor_name
201 mynode = mp_comm%mepos
204 IF (mynode .EQ. 0) io_unit = unit_nr
206 CALL permute(ndims, perm)
207 ALLOCATE (map1_ref, source=perm(1:ndims/2, 1))
208 ALLOCATE (map2_ref, source=perm(ndims/2 + 1:ndims, 1))
210 IF (io_unit > 0)
THEN
212 WRITE (io_unit,
'(A)') repeat(
"-", 80)
213 WRITE (io_unit,
'(A,1X,I1)')
"Testing matrix representations of tensor rank", ndims
214 WRITE (io_unit,
'(A)') repeat(
"-", 80)
215 WRITE (io_unit,
'(A)')
"Block sizes:"
218 WRITE (io_unit,
'(T4,A,1X,I1,A,1X)', advance=
'no')
'Dim', 1,
':'
219 DO iblk = 1,
SIZE(blk_size_1)
220 WRITE (io_unit,
'(I2,1X)', advance=
'no') blk_size_1(iblk)
225 WRITE (io_unit,
'(T4,A,1X,I1,A,1X)', advance=
'no')
'Dim', 2,
':'
226 DO iblk = 1,
SIZE(blk_size_2)
227 WRITE (io_unit,
'(I2,1X)', advance=
'no') blk_size_2(iblk)
232 WRITE (io_unit,
'(T4,A,1X,I1,A,1X)', advance=
'no')
'Dim', 3,
':'
233 DO iblk = 1,
SIZE(blk_size_3)
234 WRITE (io_unit,
'(I2,1X)', advance=
'no') blk_size_3(iblk)
239 WRITE (io_unit,
'(T4,A,1X,I1,A,1X)', advance=
'no')
'Dim', 4,
':'
240 DO iblk = 1,
SIZE(blk_size_4)
241 WRITE (io_unit,
'(I2,1X)', advance=
'no') blk_size_4(iblk)
246 WRITE (io_unit,
'(A)')
"Non-zero blocks:"
247 DO iblk = 1,
SIZE(blk_ind_1)
249 WRITE (io_unit,
'(T4,A, I3, A, 2I3, 1X, A)') &
250 'Block', iblk,
': (', blk_ind_1(iblk), blk_ind_2(iblk),
')'
253 WRITE (io_unit,
'(T4,A, I3, A, 3I3, 1X, A)') &
254 'Block', iblk,
': (', blk_ind_1(iblk), blk_ind_2(iblk), blk_ind_3(iblk),
')'
257 WRITE (io_unit,
'(T4,A, I3, A, 4I3, 1X, A)') &
258 'Block', iblk,
': (', blk_ind_1(iblk), blk_ind_2(iblk), blk_ind_3(iblk), blk_ind_4(iblk),
')'
263 WRITE (io_unit,
'(A,1X)', advance=
'no')
"Reference map:"
264 WRITE (io_unit,
'(A1,1X)', advance=
'no')
"("
265 DO imap = 1,
SIZE(map1_ref)
266 WRITE (io_unit,
'(I1,1X)', advance=
'no') map1_ref(imap)
268 WRITE (io_unit,
'(A1,1X)', advance=
'no')
"|"
269 DO imap = 1,
SIZE(map2_ref)
270 WRITE (io_unit,
'(I1,1X)', advance=
'no') map2_ref(imap)
272 WRITE (io_unit,
'(A1)')
")"
277 DO iperm = 1, factorial(ndims)
278 DO isep = 1, ndims - 1
281 ALLOCATE (map1, source=perm(1:isep, iperm))
282 ALLOCATE (map2, source=perm(isep + 1:ndims, iperm))
284 mynode = mp_comm%mepos
288 nblks =
SIZE(blk_size_1)
289 ALLOCATE (dist1_1(nblks))
290 ALLOCATE (dist2_1(nblks))
295 nblks =
SIZE(blk_size_2)
296 ALLOCATE (dist1_2(nblks))
297 ALLOCATE (dist2_2(nblks))
302 nblks =
SIZE(blk_size_3)
303 ALLOCATE (dist1_3(nblks))
304 ALLOCATE (dist2_3(nblks))
309 nblks =
SIZE(blk_size_4)
310 ALLOCATE (dist1_4(nblks))
311 ALLOCATE (dist2_4(nblks))
316 WRITE (tensor_name,
'(A,1X,I3,1X)')
"Test", icount
318 IF (io_unit > 0)
THEN
320 WRITE (io_unit,
'(A,A,1X)', advance=
'no') trim(tensor_name),
':'
321 WRITE (io_unit,
'(A1,1X)', advance=
'no')
"("
322 DO imap = 1,
SIZE(map1)
323 WRITE (io_unit,
'(I1,1X)', advance=
'no') map1(imap)
325 WRITE (io_unit,
'(A1,1X)', advance=
'no')
"|"
326 DO imap = 1,
SIZE(map2)
327 WRITE (io_unit,
'(I1,1X)', advance=
'no') map2(imap)
329 WRITE (io_unit,
'(A1)')
")"
331 WRITE (io_unit,
'(T4,A)')
"Reference distribution:"
333 WRITE (io_unit,
'(T7,A,1X)', advance=
'no')
"Dist vec 1:"
334 DO idist = 1,
SIZE(dist2_1)
335 WRITE (io_unit,
'(I2,1X)', advance=
'no') dist2_1(idist)
340 WRITE (io_unit,
'(T7,A,1X)', advance=
'no')
"Dist vec 2:"
341 DO idist = 1,
SIZE(dist2_2)
342 WRITE (io_unit,
'(I2,1X)', advance=
'no') dist2_2(idist)
347 WRITE (io_unit,
'(T7,A,1X)', advance=
'no')
"Dist vec 3:"
348 DO idist = 1,
SIZE(dist2_3)
349 WRITE (io_unit,
'(I2,1X)', advance=
'no') dist2_3(idist)
354 WRITE (io_unit,
'(T7,A,1X)', advance=
'no')
"Dist vec 4:"
355 DO idist = 1,
SIZE(dist2_4)
356 WRITE (io_unit,
'(I2,1X)', advance=
'no') dist2_4(idist)
361 WRITE (io_unit,
'(T4,A)')
"Test distribution:"
363 WRITE (io_unit,
'(T7,A,1X)', advance=
'no')
"Dist vec 1:"
364 DO idist = 1,
SIZE(dist2_1)
365 WRITE (io_unit,
'(I2,1X)', advance=
'no') dist1_1(idist)
370 WRITE (io_unit,
'(T7,A,1X)', advance=
'no')
"Dist vec 2:"
371 DO idist = 1,
SIZE(dist2_2)
372 WRITE (io_unit,
'(I2,1X)', advance=
'no') dist1_2(idist)
377 WRITE (io_unit,
'(T7,A,1X)', advance=
'no')
"Dist vec 3:"
378 DO idist = 1,
SIZE(dist2_3)
379 WRITE (io_unit,
'(I2,1X)', advance=
'no') dist1_3(idist)
384 WRITE (io_unit,
'(T7,A,1X)', advance=
'no')
"Dist vec 4:"
385 DO idist = 1,
SIZE(dist2_4)
386 WRITE (io_unit,
'(I2,1X)', advance=
'no') dist1_4(idist)
394 CALL dbt_create(tensor2,
"Ref", dist2, map1_ref, map2_ref, &
395 blk_size_1, blk_size_2)
400 CALL dbt_create(tensor2,
"Ref", dist2, map1_ref, map2_ref, &
401 blk_size_1, blk_size_2, blk_size_3)
406 CALL dbt_create(tensor2,
"Ref", dist2, map1_ref, map2_ref, &
407 blk_size_1, blk_size_2, blk_size_3, blk_size_4)
408 CALL dbt_setup_test_tensor(tensor2, comm_nd%mp_comm_2d, .true., blk_ind_1, blk_ind_2, blk_ind_3, blk_ind_4)
415 CALL dbt_create(tensor1, tensor_name, dist1, map1, map2, &
416 blk_size_1, blk_size_2)
421 CALL dbt_create(tensor1, tensor_name, dist1, map1, map2, &
422 blk_size_1, blk_size_2, blk_size_3)
427 CALL dbt_create(tensor1, tensor_name, dist1, map1, map2, &
428 blk_size_1, blk_size_2, blk_size_3, blk_size_4)
429 CALL dbt_setup_test_tensor(tensor1, comm_nd%mp_comm_2d, .true., blk_ind_1, blk_ind_2, blk_ind_3, blk_ind_4)
434 eql = dbt_equal(tensor1, tensor2)
437 IF (io_unit > 0)
WRITE (io_unit,
'(A,1X,A)') trim(tensor_name),
'Test failed!'
440 IF (io_unit > 0)
WRITE (io_unit,
'(A,1X,A)') trim(tensor_name),
'Test passed!'
442 DEALLOCATE (map1, map2)
451 DEALLOCATE (dist1_1, dist2_1)
454 DEALLOCATE (dist1_2, dist2_2)
457 DEALLOCATE (dist1_3, dist2_3)
460 DEALLOCATE (dist1_4, dist2_4)
478 LOGICAL,
INTENT(IN) :: enumerate
479 INTEGER,
DIMENSION(:),
INTENT(IN),
OPTIONAL :: blk_ind_1, blk_ind_2, blk_ind_3, blk_ind_4
482 INTEGER :: i, ib, my_nblks_alloc, nblks_alloc, proc, nze
483 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: my_blk_ind_1, my_blk_ind_2, my_blk_ind_3, my_blk_ind_4
484 INTEGER,
DIMENSION(ndims_tensor(tensor)) :: blk_index, blk_offset, blk_size, &
486 INTEGER,
DIMENSION(:, :),
ALLOCATABLE :: ind_nd
487 REAL(kind=
dp),
ALLOCATABLE, &
488 DIMENSION(:,:) :: blk_values_2
489 REAL(kind=
dp),
ALLOCATABLE, &
490 DIMENSION(:,:,:) :: blk_values_3
491 REAL(kind=
dp),
ALLOCATABLE, &
492 DIMENSION(:,:,:,:) :: blk_values_4
494 INTEGER,
DIMENSION(4) :: iseed
495 INTEGER,
DIMENSION(2) :: blk_index_2d, nblks_2d
497 nblks_alloc =
SIZE(blk_ind_1)
498 mynode = mp_comm%mepos
500 IF (.NOT. enumerate)
THEN
501 cpassert(randmat_counter .NE. 0)
503 randmat_counter = randmat_counter + 1
517 DO ib = 1, nblks_alloc
519 ind_nd(ib, :) = [blk_ind_1(ib), blk_ind_2(ib)]
522 ind_nd(ib, :) = [blk_ind_1(ib), blk_ind_2(ib), blk_ind_3(ib)]
525 ind_nd(ib, :) = [blk_ind_1(ib), blk_ind_2(ib), blk_ind_3(ib), blk_ind_4(ib)]
528 IF (proc == mynode)
THEN
529 my_nblks_alloc = my_nblks_alloc + 1
535 ALLOCATE (my_blk_ind_1(my_nblks_alloc))
538 ALLOCATE (my_blk_ind_2(my_nblks_alloc))
541 ALLOCATE (my_blk_ind_3(my_nblks_alloc))
544 ALLOCATE (my_blk_ind_4(my_nblks_alloc))
549 DO ib = 1, nblks_alloc
551 IF (proc == mynode)
THEN
554 my_blk_ind_1(i) = blk_ind_1(ib)
557 my_blk_ind_2(i) = blk_ind_2(ib)
560 my_blk_ind_3(i) = blk_ind_3(ib)
563 my_blk_ind_4(i) = blk_ind_4(ib)
583 IF (.NOT. enumerate)
THEN
586 iseed =
generate_larnv_seed(blk_index_2d(1), nblks_2d(1), blk_index_2d(2), nblks_2d(2), randmat_counter)
587 nze = product(blk_size)
594 CALL enumerate_block_elements(blk_size, blk_offset, tensor_dims, blk_2=blk_values_2)
596 CALL dlarnv(1, iseed, nze, blk_values_2)
599 DEALLOCATE (blk_values_2)
605 CALL enumerate_block_elements(blk_size, blk_offset, tensor_dims, blk_3=blk_values_3)
607 CALL dlarnv(1, iseed, nze, blk_values_3)
610 DEALLOCATE (blk_values_3)
616 CALL enumerate_block_elements(blk_size, blk_offset, tensor_dims, blk_4=blk_values_4)
618 CALL dlarnv(1, iseed, nze, blk_values_4)
621 DEALLOCATE (blk_values_4)
827 contract_1, notcontract_1, &
828 contract_2, notcontract_2, &
831 bounds_1, bounds_2, bounds_3, &
832 log_verbose, write_int)
834 REAL(
dp),
INTENT(IN) :: alpha
835 TYPE(
dbt_type),
INTENT(INOUT) :: tensor_1, tensor_2, tensor_3
836 REAL(
dp),
INTENT(IN) :: beta
837 INTEGER,
DIMENSION(:),
INTENT(IN) :: contract_1, contract_2, &
838 notcontract_1, notcontract_2, &
840 INTEGER,
INTENT(IN) :: unit_nr
841 INTEGER,
DIMENSION(2, SIZE(contract_1)), &
843 INTEGER,
DIMENSION(2, SIZE(notcontract_1)), &
845 INTEGER,
DIMENSION(2, SIZE(notcontract_2)), &
847 LOGICAL,
INTENT(IN),
OPTIONAL :: log_verbose
848 LOGICAL,
INTENT(IN),
OPTIONAL :: write_int
849 INTEGER :: io_unit, mynode
851 INTEGER,
DIMENSION(:),
ALLOCATABLE :: size_1, size_2, size_3, &
852 order_t1, order_t2, order_t3
853 INTEGER,
DIMENSION(2, ndims_tensor(tensor_1)) :: bounds_t1
854 INTEGER,
DIMENSION(2, ndims_tensor(tensor_2)) :: bounds_t2
856 REAL(kind=
dp),
ALLOCATABLE, &
857 DIMENSION(:,:) :: array_1_2d, &
867 REAL(kind=
dp),
ALLOCATABLE, &
868 DIMENSION(:,:,:) :: array_1_3d, &
878 REAL(kind=
dp),
ALLOCATABLE, &
879 DIMENSION(:,:,:,:) :: array_1_4d, &
889 REAL(kind=
dp),
ALLOCATABLE, &
890 DIMENSION(:, :) :: array_1_mm, &
894 LOGICAL :: eql, notzero
895 LOGICAL,
PARAMETER :: debug = .false.
896 REAL(kind=
dp) :: cs_1, cs_2, cs_3, eql_diff
897 LOGICAL :: do_crop_1, do_crop_2
899 mp_comm = tensor_1%pgrid%mp_comm_2d
900 mynode = mp_comm%mepos
902 IF (mynode .EQ. 0) io_unit = unit_nr
908 IF (io_unit > 0)
THEN
910 WRITE (io_unit,
'(A)') repeat(
"-", 80)
911 WRITE (io_unit,
'(A,1X,A,1X,A,1X,A,1X,A,1X,A)')
"Testing tensor contraction", &
912 trim(tensor_1%name),
"x", trim(tensor_2%name),
"=", trim(tensor_3%name)
913 WRITE (io_unit,
'(A)') repeat(
"-", 80)
917 IF (io_unit > 0)
THEN
918 WRITE (io_unit,
"(A, E9.2)")
"checksum ", trim(tensor_1%name), cs_1
919 WRITE (io_unit,
"(A, E9.2)")
"checksum ", trim(tensor_2%name), cs_2
920 WRITE (io_unit,
"(A, E9.2)")
"checksum ", trim(tensor_3%name), cs_3
931 CALL dist_sparse_tensor_to_repl_dense_array(tensor_3, array_3_0_2d)
933 CALL dist_sparse_tensor_to_repl_dense_array(tensor_3, array_3_0_3d)
935 CALL dist_sparse_tensor_to_repl_dense_array(tensor_3, array_3_0_4d)
938 CALL dbt_contract(alpha, tensor_1, tensor_2, beta, tensor_3, &
939 contract_1, notcontract_1, &
940 contract_2, notcontract_2, &
942 bounds_1=bounds_1, bounds_2=bounds_2, bounds_3=bounds_3, &
943 filter_eps=1.0e-12_dp, &
944 unit_nr=io_unit, log_verbose=log_verbose)
949 IF (io_unit > 0)
THEN
950 WRITE (io_unit,
"(A, E9.2)")
"checksum ", trim(tensor_3%name), cs_3
954 do_crop_1 = .false.; do_crop_2 = .false.
958 CALL dbt_get_info(tensor_1, nfull_total=bounds_t1(2, :))
961 CALL dbt_get_info(tensor_2, nfull_total=bounds_t2(2, :))
963 IF (
PRESENT(bounds_1))
THEN
964 bounds_t1(:, contract_1) = bounds_1
966 bounds_t2(:, contract_2) = bounds_1
970 IF (
PRESENT(bounds_2))
THEN
971 bounds_t1(:, notcontract_1) = bounds_2
975 IF (
PRESENT(bounds_3))
THEN
976 bounds_t2(:, notcontract_2) = bounds_3
983 CALL dist_sparse_tensor_to_repl_dense_array(tensor_1, array_1_2d_full)
984 CALL allocate_any(array_1_2d, shape_spec=shape(array_1_2d_full))
986 array_1_2d(bounds_t1(1, 1):bounds_t1(2, 1), bounds_t1(1, 2):bounds_t1(2, 2)) = &
987 array_1_2d_full(bounds_t1(1, 1):bounds_t1(2, 1), bounds_t1(1, 2):bounds_t1(2, 2))
990 CALL dist_sparse_tensor_to_repl_dense_array(tensor_1, array_1_3d_full)
991 CALL allocate_any(array_1_3d, shape_spec=shape(array_1_3d_full))
993 array_1_3d(bounds_t1(1, 1):bounds_t1(2, 1), bounds_t1(1, 2):bounds_t1(2, 2), bounds_t1(1, 3):bounds_t1(2, 3)) = &
994 array_1_3d_full(bounds_t1(1, 1):bounds_t1(2, 1), bounds_t1(1, 2):bounds_t1(2, 2), bounds_t1(1, 3):bounds_t1(2, 3))
997 CALL dist_sparse_tensor_to_repl_dense_array(tensor_1, array_1_4d_full)
998 CALL allocate_any(array_1_4d, shape_spec=shape(array_1_4d_full))
1000 array_1_4d(bounds_t1(1, 1):bounds_t1(2, 1), bounds_t1(1, 2):bounds_t1(2, 2), bounds_t1(1, 3):bounds_t1(2, 3),&
1001 & bounds_t1(1, 4):bounds_t1(2, 4)) = &
1002 array_1_4d_full(bounds_t1(1, 1):bounds_t1(2, 1), bounds_t1(1, 2):bounds_t1(2, 2), bounds_t1(1, 3):bounds_t1(2, 3),&
1003 & bounds_t1(1, 4):bounds_t1(2, 4))
1008 CALL dist_sparse_tensor_to_repl_dense_array(tensor_2, array_2_2d_full)
1009 CALL allocate_any(array_2_2d, shape_spec=shape(array_2_2d_full))
1011 array_2_2d(bounds_t2(1, 1):bounds_t2(2, 1), bounds_t2(1, 2):bounds_t2(2, 2)) = &
1012 array_2_2d_full(bounds_t2(1, 1):bounds_t2(2, 1), bounds_t2(1, 2):bounds_t2(2, 2))
1015 CALL dist_sparse_tensor_to_repl_dense_array(tensor_2, array_2_3d_full)
1016 CALL allocate_any(array_2_3d, shape_spec=shape(array_2_3d_full))
1018 array_2_3d(bounds_t2(1, 1):bounds_t2(2, 1), bounds_t2(1, 2):bounds_t2(2, 2), bounds_t2(1, 3):bounds_t2(2, 3)) = &
1019 array_2_3d_full(bounds_t2(1, 1):bounds_t2(2, 1), bounds_t2(1, 2):bounds_t2(2, 2), bounds_t2(1, 3):bounds_t2(2, 3))
1022 CALL dist_sparse_tensor_to_repl_dense_array(tensor_2, array_2_4d_full)
1023 CALL allocate_any(array_2_4d, shape_spec=shape(array_2_4d_full))
1025 array_2_4d(bounds_t2(1, 1):bounds_t2(2, 1), bounds_t2(1, 2):bounds_t2(2, 2), bounds_t2(1, 3):bounds_t2(2, 3),&
1026 & bounds_t2(1, 4):bounds_t2(2, 4)) = &
1027 array_2_4d_full(bounds_t2(1, 1):bounds_t2(2, 1), bounds_t2(1, 2):bounds_t2(2, 2), bounds_t2(1, 3):bounds_t2(2, 3),&
1028 & bounds_t2(1, 4):bounds_t2(2, 4))
1033 CALL dist_sparse_tensor_to_repl_dense_array(tensor_3, array_3_2d)
1036 CALL dist_sparse_tensor_to_repl_dense_array(tensor_3, array_3_3d)
1039 CALL dist_sparse_tensor_to_repl_dense_array(tensor_3, array_3_4d)
1047 ALLOCATE (size_1, source=shape(array_1_2d))
1050 ALLOCATE (size_1, source=shape(array_1_3d))
1053 ALLOCATE (size_1, source=shape(array_1_4d))
1058 ALLOCATE (size_2, source=shape(array_2_2d))
1061 ALLOCATE (size_2, source=shape(array_2_3d))
1064 ALLOCATE (size_2, source=shape(array_2_4d))
1069 ALLOCATE (size_3, source=shape(array_3_2d))
1072 ALLOCATE (size_3, source=shape(array_3_3d))
1075 ALLOCATE (size_3, source=shape(array_3_4d))
1083 associate(map_t1_1 => notcontract_1, map_t1_2 => contract_1, &
1084 map_t2_1 => notcontract_2, map_t2_2 => contract_2, &
1085 map_t3_1 => map_1, map_t3_2 => map_2)
1091 CALL allocate_any(array_1_rs2d, source=array_1_2d, order=order_t1)
1092 CALL allocate_any(array_1_mm, sizes_2d(size_1, map_t1_1, map_t1_2))
1093 array_1_mm(:, :) = reshape(array_1_rs2d, shape(array_1_mm))
1095 CALL allocate_any(array_1_rs3d, source=array_1_3d, order=order_t1)
1096 CALL allocate_any(array_1_mm, sizes_2d(size_1, map_t1_1, map_t1_2))
1097 array_1_mm(:, :) = reshape(array_1_rs3d, shape(array_1_mm))
1099 CALL allocate_any(array_1_rs4d, source=array_1_4d, order=order_t1)
1100 CALL allocate_any(array_1_mm, sizes_2d(size_1, map_t1_1, map_t1_2))
1101 array_1_mm(:, :) = reshape(array_1_rs4d, shape(array_1_mm))
1107 CALL allocate_any(array_2_rs2d, source=array_2_2d, order=order_t2)
1108 CALL allocate_any(array_2_mm, sizes_2d(size_2, map_t2_1, map_t2_2))
1109 array_2_mm(:, :) = reshape(array_2_rs2d, shape(array_2_mm))
1111 CALL allocate_any(array_2_rs3d, source=array_2_3d, order=order_t2)
1112 CALL allocate_any(array_2_mm, sizes_2d(size_2, map_t2_1, map_t2_2))
1113 array_2_mm(:, :) = reshape(array_2_rs3d, shape(array_2_mm))
1115 CALL allocate_any(array_2_rs4d, source=array_2_4d, order=order_t2)
1116 CALL allocate_any(array_2_mm, sizes_2d(size_2, map_t2_1, map_t2_2))
1117 array_2_mm(:, :) = reshape(array_2_rs4d, shape(array_2_mm))
1123 CALL allocate_any(array_3_rs2d, source=array_3_2d, order=order_t3)
1124 CALL allocate_any(array_3_mm, sizes_2d(size_3, map_t3_1, map_t3_2))
1125 array_3_mm(:, :) = reshape(array_3_rs2d, shape(array_3_mm))
1127 CALL allocate_any(array_3_rs3d, source=array_3_3d, order=order_t3)
1128 CALL allocate_any(array_3_mm, sizes_2d(size_3, map_t3_1, map_t3_2))
1129 array_3_mm(:, :) = reshape(array_3_rs3d, shape(array_3_mm))
1131 CALL allocate_any(array_3_rs4d, source=array_3_4d, order=order_t3)
1132 CALL allocate_any(array_3_mm, sizes_2d(size_3, map_t3_1, map_t3_2))
1133 array_3_mm(:, :) = reshape(array_3_rs4d, shape(array_3_mm))
1138 CALL allocate_any(array_3_0_rs2d, source=array_3_0_2d, order=order_t3)
1139 CALL allocate_any(array_3_test_mm, sizes_2d(size_3, map_t3_1, map_t3_2))
1140 array_3_test_mm(:, :) = reshape(array_3_0_rs2d, shape(array_3_mm))
1142 CALL allocate_any(array_3_0_rs3d, source=array_3_0_3d, order=order_t3)
1143 CALL allocate_any(array_3_test_mm, sizes_2d(size_3, map_t3_1, map_t3_2))
1144 array_3_test_mm(:, :) = reshape(array_3_0_rs3d, shape(array_3_mm))
1146 CALL allocate_any(array_3_0_rs4d, source=array_3_0_4d, order=order_t3)
1147 CALL allocate_any(array_3_test_mm, sizes_2d(size_3, map_t3_1, map_t3_2))
1148 array_3_test_mm(:, :) = reshape(array_3_0_rs4d, shape(array_3_mm))
1151 array_3_test_mm(:, :) = beta*array_3_test_mm(:, :) + alpha*matmul(array_1_mm, transpose(array_2_mm))
1155 eql_diff = maxval(abs(array_3_test_mm(:, :) - array_3_mm(:, :)))
1156 notzero = maxval(abs(array_3_test_mm(:, :))) .GT. 1.0e-12_dp
1158 eql = eql_diff .LT. 1.0e-11_dp
1160 IF (.NOT. eql .OR. .NOT. notzero)
THEN
1161 IF (io_unit > 0)
WRITE (io_unit, *)
'Test failed!', eql_diff
1164 IF (io_unit > 0)
WRITE (io_unit, *)
'Test passed!', eql_diff