function [ x, det ] = r8mat_solve_3d ( a, b, det, x )

%*****************************************************************************80
%
%% R8MAT_SOLVE_3D solves a 3 by 3 linear system using Cramer's rule.
%
%  Discussion:
%
%    If the determinant DET is returned as zero, then the matrix A is
%    singular, and does not have an inverse.  In that case, X is
%    returned as the [] vector.
%
%    If DET is nonzero, then its value is roughly an estimate
%    of how nonsingular the matrix A is.
%
%  Licensing:
%
%    This code is distributed under the MIT license.
%
%  Modified:
%
%    05 December 2006
%
%  Author:
%
%    John Burkardt
%
%  Input:
%
%    real A(3,3), the matrix.
%
%    real B(3), the right hand side.
%
%  Output:
%
%    real DET, the determinant of the matrix A.
%
%    real X(3), the solution of the system,
%    if DET is nonzero.
%

%
%  Compute the determinant.
%
  det =  a(1,1) * ( a(2,2) * a(3,3) - a(2,3) * a(3,2) ) ...
       + a(1,2) * ( a(2,3) * a(3,1) - a(2,1) * a(3,3) ) ...
       + a(1,3) * ( a(2,1) * a(3,2) - a(2,2) * a(3,1) );
%
%  If the determinant is zero, bail out.
%
  if ( det == 0.0 )
    x = [];
    return
  end
%
%  Compute the solution.
%
  x(1) = (   ( a(2,2) * a(3,3) - a(2,3) * a(3,2) ) * b(1) ...
           - ( a(1,2) * a(3,3) - a(1,3) * a(3,2) ) * b(2) ...
           + ( a(1,2) * a(2,3) - a(1,3) * a(2,2) ) * b(3) ) / det;

  x(2) = ( - ( a(2,1) * a(3,3) - a(2,3) * a(3,1) ) * b(1) ...
           + ( a(1,1) * a(3,3) - a(1,3) * a(3,1) ) * b(2) ...
           - ( a(1,1) * a(2,3) - a(1,3) * a(2,1) ) * b(3) ) / det;

  x(3) = (   ( a(2,1) * a(3,2) - a(2,2) * a(3,1) ) * b(1) ...
           - ( a(1,1) * a(3,2) - a(1,2) * a(3,1) ) * b(2) ...
           + ( a(1,1) * a(2,2) - a(1,2) * a(2,1) ) * b(3) ) / det;

  return
end
