subroutine mat_rref(ar,ai,lda,m,n,eps)
integer,intent(in) :: lda
doubleprecision :: ar(lda,*)
doubleprecision :: ai(lda,*)
integer :: m
integer :: n
doubleprecision :: eps
doubleprecision :: tol
doubleprecision :: tr
doubleprecision :: ti
integer :: i, j, k, l
tol = 0.0d0
do j = 1, n
tol = dmax1(tol,mat_wasum(m,ar(1,j),ai(1,j),1))
enddo
tol = eps*dble(2*max0(m,n))*tol
k = 1
l = 1
infinite: do
if (k.gt.m .or. l.gt.n) return
i = mat_iwamax(m-k+1,ar(k,l),ai(k,l),1) + k-1
if (dabs(ar(i,l))+dabs(ai(i,l)) .le. tol)then
call mat_wset(m-k+1,0.0d0,0.0d0,ar(k,l),ai(k,l),1)
l = l+1
cycle infinite
endif
call mat_wswap(n-l+1,ar(i,l),ai(i,l),lda,ar(k,l),ai(k,l),lda)
call mat_wdiv(1.0d0,0.0d0,ar(k,l),ai(k,l),tr,ti)
call mat_wscal(n-l+1,tr,ti,ar(k,l),ai(k,l),lda)
ar(k,l) = 1.0d0
ai(k,l) = 0.0d0
do i = 1, m
tr = -ar(i,l)
ti = -ai(i,l)
if (i .ne. k) call matx_waxpy(n-l+1,tr,ti,ar(k,l),ai(k,l),lda,ar(i,l),ai(i,l),lda)
enddo
k = k+1
l = l+1
enddo infinite
end subroutine mat_rref