Skip to content

Commit ba59694

Browse files
committed
add generic-rank tests
1 parent 5d49645 commit ba59694

File tree

2 files changed

+60
-7
lines changed

2 files changed

+60
-7
lines changed

include/common.fypp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,34 @@ ${prefix + joinstr.join([line.strip() for line in txt.split("\n")]) + suffix}$
338338
#:endcall
339339
#:enddef
340340

341+
#!
342+
#! Generates a list of loop variables from an array
343+
#!
344+
#! Args:
345+
#! varname(str): Name of the array variable to be used as prefix
346+
#! n (int): Number of loop variables to be created
347+
#! offset (int): Optional index offset
348+
#!
349+
#! Returns:
350+
#! Variable definition string
351+
#!
352+
#! E.g.,
353+
#! loop_array_variables('j', 5)
354+
#! -> "j(1), j(2), j(3), j(4), j(5)
355+
#!
356+
#! loop_array_variables('j', 5, 2)
357+
#! -> "j(3), j(4), j(5), j(6), j(7)
358+
#!
359+
#:def loop_array_variables(varname, n, offset=0)
360+
#:assert n > 0
361+
#:call join_lines(joinstr=", ")
362+
#:for i in range(1, n + 1)
363+
${varname}$(${i+offset}$)
364+
#:endfor
365+
#:endcall
366+
#:enddef
367+
368+
341369
#! Generates an array shape specifier from an N-D array size
342370
#!
343371
#! Args:

test/linalg/test_linalg_mnorm.fypp

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)