function [ M, N, b ] = split( A, b, w, flag )
%
% function [ M, N, b ] = split( A, b, w, flag )
%
% split.m sets up the matrix splitting for the stationary
% iterative methods: jacobi and sor (gauss-seidel when w = 1.0 )
%
% input A DOUBLE PRECISION matrix
% b DOUBLE PRECISION right hand side vector (for SOR)
% w DOUBLE PRECISION relaxation scalar
% flag INTEGER flag for method: 1 = jacobi
% 2 = sor
%
% output M DOUBLE PRECISION matrix
% N DOUBLE PRECISION matrix such that A = M - N
% b DOUBLE PRECISION rhs vector ( altered for SOR )
[m,n] = size( A );
if ( flag == 1 ), % jacobi splitting
M = diag(diag(A));
N = diag(diag(A)) - A;
elseif ( flag == 2 ), % sor/gauss-seidel splitting
b = w * b;
M = w * tril( A, -1 ) + diag(diag( A ));
N = -w * triu( A, 1 ) + ( 1.0 - w ) * diag(diag( A ));
end;
% END split.m