@@ -65,14 +65,15 @@ module test_linalg_mnorm
6565 subroutine test_mnorm_${ri}$_${rank}$d(error)
6666 type(error_type), allocatable, intent(out) :: error
6767
68- integer(ilp) :: j, dim1,dim2,dim(2),order
68+ integer(ilp) :: i,j,k,l, dim1,dim2,dim(2),dim_sizes(2), order,ptr(${rank}$)
6969 integer(ilp), parameter :: orders(*) = [1_ilp,2_ilp,huge(0_ilp)]
7070 integer(ilp), parameter :: ndim = ${rank}$
71- integer(ilp), parameter :: n = 2_ilp**ndim
71+ integer(ilp), parameter :: n = 2_ilp**ndim
7272 integer(ilp), parameter :: dims(*) = [(dim1, dim1=1,ndim)]
7373 real(${rk}$), parameter :: tol = 10*sqrt(epsilon(0.0_${rk}$))
74+ real(${rk}$) :: one_nrm
7475 real(${rk}$), allocatable :: bnrm${ranksuffix(rank-2)}$
75- ${rt}$, allocatable :: a(:), b${ranksuffix(rank)}$
76+ ${rt}$, allocatable :: a(:), b${ranksuffix(rank)}$, one_mat(:,:)
7677
7778 character(64) :: msg
7879
@@ -84,20 +85,44 @@ module test_linalg_mnorm
8485 b = reshape(a, shape(b))
8586
8687 ! Test norm as collapsed around dimensions
87- do j = 1, size(orders)
88- order = orders(j )
88+ do k = 1, size(orders)
89+ order = orders(k )
8990 do dim1 = 1, ndim
9091 do dim2 = dim1+1, ndim
9192
92- dim = [dim1,dim2]
93+ dim = [dim1,dim2]
94+ dim_sizes = [size(b,dim1,kind=ilp),size(b,dim2,kind=ilp)]
9395
9496 ! Get norms collapsed on these dims
9597 bnrm = mnorm(b,order,dim)
9698
9799 ! Assert size
98100 write(msg,"('dim=[',i0,',',i0,'] order=',i0,' ${rk}$ norm returned wrong shape')") dim, order
99101 call check(error,all(shape(bnrm)==pack(shape(b),dims/=dim1 .and. dims/=dim2) ), trim(msg))
100- if (allocated(error)) return
102+ if (allocated(error)) return
103+
104+ ! Assert some matrix results: check that those on same index i.e. (l,l,l,:,l,l,:) etc.
105+ ! are equal to the corresponding 2d-array result
106+ do l = 1, minval(shape(b))
107+
108+ ptr = l
109+
110+ allocate(one_mat(dim_sizes(1),dim_sizes(2)))
111+ do j = 1, dim_sizes(2)
112+ ptr(dim(2)) = j
113+ do i = 1, dim_sizes(1)
114+ ptr(dim(1)) = i
115+ one_mat(i,j) = b(${loop_array_variables('ptr',rank)}$)
116+ end do
117+ end do
118+ one_nrm = mnorm(one_mat,order)
119+
120+ write(msg,"('dim=[',i0,',',i0,'] order=',i0,' ${rk}$ ',i0,'-th norm is wrong')") dim, order, l
121+ call check(error, abs(one_nrm-bnrm(${fixedranksuffix(rank-2,'l')}$))<tol*one_nrm, trim(msg))
122+ if (allocated(error)) return
123+ deallocate(one_mat)
124+
125+ end do
101126
102127 end do
103128 end do
0 commit comments