blob: a1c3108c7f8cbc8fff06daf97e7dd127b4b50a8b [file] [log] [blame]
c---------------------------------------------------------------------
c---------------------------------------------------------------------
subroutine l2norm ( ldx, ldy, ldz,
> nx0, ny0, nz0,
> ist, iend,
> jst, jend,
> v, sum )
c---------------------------------------------------------------------
c---------------------------------------------------------------------
c---------------------------------------------------------------------
c to compute the l2-norm of vector v.
c---------------------------------------------------------------------
implicit none
c---------------------------------------------------------------------
c input parameters
c---------------------------------------------------------------------
integer ldx, ldy, ldz
integer nx0, ny0, nz0
integer ist, iend
integer jst, jend
c---------------------------------------------------------------------
c To improve cache performance, second two dimensions padded by 1
c for even number sizes only. Only needed in v.
c---------------------------------------------------------------------
double precision v(5,ldx/2*2+1,ldy/2*2+1,*), sum(5)
c---------------------------------------------------------------------
c local variables
c---------------------------------------------------------------------
double precision sum_local(5)
integer i, j, k, m
do m = 1, 5
sum(m) = 0.0d+00
end do
!$omp parallel default(shared) private(i,j,k,m,sum_local)
do m = 1, 5
sum_local(m) = 0.0d+00
end do
!$omp do
do k = 2, nz0-1
do j = jst, jend
do i = ist, iend
do m = 1, 5
sum_local(m) = sum_local(m) + v(m,i,j,k)*v(m,i,j,k)
end do
end do
end do
end do
!$omp end do nowait
do m = 1, 5
!$omp atomic
sum(m) = sum(m) + sum_local(m)
end do
!$omp end parallel
do m = 1, 5
sum(m) = sqrt ( sum(m) / ( (nx0-2)*(ny0-2)*(nz0-2) ) )
end do
return
end