tahoma2d/thirdparty/superlu/SuperLU_4.1/MATLAB/trylusolve.m
2016-03-24 01:31:57 +09:00

137 lines
3.4 KiB
Matlab
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function failed = trylusolve(A,b);
% TRYLUSOLVE : Test the Matlab interface to lusolve.
%
% failed = trylusolve;
% This runs several tests on lusolve, using a matrix with the
% structure of "smallmesh". It returns a list of failed tests.
%
% failed = trylusolve(A);
% failed = trylusolve(A,b);
% This times the solution of a system with the given matrix,
% both with lusolve and with Matlab's builtin "\" operator.
% Usually, "\" will be faster for triangular or symmetric postive
% definite matrices, and lusolve will be faster otherwise.
%
% Copyright (c) 1995 by Xerox Corporation. All rights reserved.
% HELP COPYRIGHT for complete copyright and licensing notice.
disp(' ');
disp(['Testing LUSOLVE on ' time]);
disp(' ');
format compact
resetrandoms;
if nargin == 0
A = hbo('smallmesh');
end;
[n,m] = size(A);
if n~=m, error('matrix must be square'), end;
failed = [];
ntest = 0;
tol = 100 * eps * n^2;
if nargin >= 1 % Just try a solve with the given input matrix.
ntest=ntest+1;
v = spparms;
spparms('spumoni',1);
fprintf('Matrix size: %d by %d with %d nonzeros.\n',n,m,nnz(A));
disp(' ');
if nargin == 1
b = rand(n,1);
end;
tic; x=A\b; t1=toc;
fprintf('A\\b time = %d seconds.\n',t1);
disp(' ');
tic; x=lusolve(A,b); t2=toc;
fprintf('LUSOLVE time = %d seconds.\n',t2);
disp(' ');
ratio = t1/t2;
fprintf('Ratio = %d\n',ratio);
residual_norm = norm(A*x-b,inf)/norm(A,inf)
disp(' ');
if residual_norm > tol
disp('*** FAILED ***'); failed = [failed ntest];
end;
spparms(v);
return;
end;
% With no inputs, try several tests on the small mesh.
A = sprandn(A);
p = randperm(n);
I = speye(n);
P = I(p,:);
b = rand(n,2);
ntest=ntest+1;
fprintf('Test %d: Input perm 0.\n',ntest);
x = lusolve(A,b,0);
residual_norm = norm(A*x-b,inf)
disp(' ');
if residual_norm > tol
disp('*** FAILED ***'), disp(' '), failed = [failed ntest];
end;
ntest=ntest+1;
fprintf('Test %d: Input perm given as vector.\n',ntest);
x = lusolve(A,b,p);
residual_norm = norm(A*x-b,inf)
disp(' ');
if residual_norm > tol
disp('*** FAILED ***^G'), disp(' '), failed = [failed ntest];
end;
ntest=ntest+1;
fprintf('Test %d: Input perm given as matrix.\n',ntest);
x = lusolve(A,b,P);
residual_norm = norm(A*x-b,inf)
disp(' ');
if residual_norm > tol
disp('*** FAILED ***'), disp(' '), failed = [failed ntest];
end;
ntest=ntest+1;
fprintf('Test %d: No input perm (colamd done internally).\n',ntest);
x = lusolve(A,b);
residual_norm = norm(A*x-b,inf)
disp(' ');
if residual_norm > tol
disp('*** FAILED ***'), disp(' '), failed = [failed ntest];
end;
ntest=ntest+1;
fprintf('Test %d: Empty matrix.\n',ntest);
x = lusolve([],[]);
disp(' ');
% if max(size(x))
if length(x)
x
disp('*** FAILED ***^G'), disp(' ');
failed = [failed ntest];
end;
ntest=ntest+1;
fprintf('Test %d: Timing versus \\ on the 3-element airfoil matrix.\n',ntest);
A = hbo('airfoil2');
n = max(size(A));
A = sprandn(A);
b = rand(n,1);
tic; x=A\b; t1=toc;
fprintf('A\\b time = %d seconds.\n',t1);
tic; x=lusolve(A,b); t2=toc;
fprintf('LUSOLVE time = %d seconds.\n',t2);
ratio = t1/t2;
fprintf('Ratio = %d\n',ratio);
disp(' ');
if ratio < 1, disp('*** FAILED ***'), disp(' '), failed = [failed ntest]; end;
nfailed = length(failed);
if nfailed
fprintf('\n%d tests failed.\n\n',nfailed);
else
fprintf('\nAll tests passed.\n\n',nfailed);
end;