function [ l, p, u ] = r8mat_lu ( m, n, a )

%*****************************************************************************80
%
%% R8MAT_LU computes the LU factorization of an R8MAT.
%
%  Discussion:
%
%    The routine is given an M by N matrix A, and produces
%
%      L, an M by M unit lower triangular matrix,
%      U, an M by N upper triangular matrix, and
%      P, an M by M permutation matrix P,
%
%    so that
%
%      A = P' * L * U.
%
%  Licensing:
%
%    This code is distributed under the GNU LGPL license.
%
%  Modified:
%
%    28 July 2016
%
%  Author:
%
%    John Burkardt
%
%  Parameters:
%
%    Input, integer M, the number of rows in A.
%
%    Input, integer N, the number of columns in A.
%
%    Input, real A(M,N), the M by N matrix to be factored.
%
%    Output, real L(M,M), the M by M unit lower triangular factor.
%
%    Output, real P(M,M), the M by M permutation matrix.
%
%    Output, real U(M,N), the M by N upper triangular factor.
%

%  Initialize:
%
%    U:=A
%    L:=Identity
%    P:=Identity
%
  u(1:m,1:n) = a(1:m,1:n);

  l = r8mat_identity ( m, m );

  p = r8mat_identity ( m, m );
%
%  On step J, find the pivot row, IPIV, and the pivot value PIVOT.
%
  for j = 1 : min ( m - 1, n )

    pivot = 0.0;
    ipiv = 0;

    for i = j : m

      if ( pivot < abs ( u(i,j) ) )
        pivot = abs ( u(i,j) );
        ipiv = i;
      end

    end
%
%  Unless IPIV is zero, swap rows J and IPIV.
%
    if ( ipiv ~= 0 )

      t(1,1:n)    = u(j,1:n);
      u(j,1:n)    = u(ipiv,1:n);
      u(ipiv,1:n) = t(1,1:n);

      t(1,1:n)    = l(j,1:n);
      l(j,1:n)    = l(ipiv,1:n);
      l(ipiv,1:n) = t(1,1:n);

      t(1,1:n)    = p(j,1:n);
      p(j,1:n)    = p(ipiv,1:n);
      p(ipiv,1:n) = t(1,1:n);
%
%  Zero out the entries in column J, from row J+1 to M.
%
      for i = j+1 : m

        if ( u(i,j) ~= 0.0 )

          l(i,j) = u(i,j) / u(j,j);

          u(i,j) = 0.0;

          u(i,j+1:n) = u(i,j+1:n) - l(i,j) * u(j,j+1:n);

        end

      end

    end

  end

  return
end
