@@ -65,14 +65,15 @@ module test_linalg_mnorm
65
65
subroutine test_mnorm_${ri}$_${rank}$d(error)
66
66
type(error_type), allocatable, intent(out) :: error
67
67
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}$)
69
69
integer(ilp), parameter :: orders(*) = [1_ilp,2_ilp,huge(0_ilp)]
70
70
integer(ilp), parameter :: ndim = ${rank}$
71
- integer(ilp), parameter :: n = 2_ilp**ndim
71
+ integer(ilp), parameter :: n = 2_ilp**ndim
72
72
integer(ilp), parameter :: dims(*) = [(dim1, dim1=1,ndim)]
73
73
real(${rk}$), parameter :: tol = 10*sqrt(epsilon(0.0_${rk}$))
74
+ real(${rk}$) :: one_nrm
74
75
real(${rk}$), allocatable :: bnrm${ranksuffix(rank-2)}$
75
- ${rt}$, allocatable :: a(:), b${ranksuffix(rank)}$
76
+ ${rt}$, allocatable :: a(:), b${ranksuffix(rank)}$, one_mat(:,:)
76
77
77
78
character(64) :: msg
78
79
@@ -84,20 +85,44 @@ module test_linalg_mnorm
84
85
b = reshape(a, shape(b))
85
86
86
87
! 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 )
89
90
do dim1 = 1, ndim
90
91
do dim2 = dim1+1, ndim
91
92
92
- dim = [dim1,dim2]
93
+ dim = [dim1,dim2]
94
+ dim_sizes = [size(b,dim1,kind=ilp),size(b,dim2,kind=ilp)]
93
95
94
96
! Get norms collapsed on these dims
95
97
bnrm = mnorm(b,order,dim)
96
98
97
99
! Assert size
98
100
write(msg,"('dim=[',i0,',',i0,'] order=',i0,' ${rk}$ norm returned wrong shape')") dim, order
99
101
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
101
126
102
127
end do
103
128
end do
0 commit comments