code 34250;
procedure ITISOL(A, LU, N, AUX, RI, CI, B); value N;
integer N;
array A, LU, AUX, B; integer array RI, CI;
begin integer I, ITER, MAXITER;
real MAXERX, ERX, NRMRES, NRMSOL, R, RR;
array RES, SOL[1:N];
MAXERX:= ERX:= AUX[10]; MAXITER:= AUX[12];
INIVEC(1, N, SOL, 0); DUPVEC(1, N, 0, RES, B);
for ITER:= 1, ITER + 1 while ITER <= MAXITER &
MAXERX < ERX do
begin SOLELM(LU, N, RI, CI, RES); ERX:= NRMSOL:= NRMRES:= 0;
for I:= 1 step 1 until N do
begin R:= RES[I]; ERX:= ERX + ABS(R); RR:= SOL[I] + R;
SOL[I]:= RR; NRMSOL:= NRMSOL + ABS(RR)
end;
ERX:= ERX / NRMSOL;
for I:= 1 step 1 until N do
begin LNGMATVEC(1, N, I, A, SOL, - B[I], 0, R, RR);
R:= - (R + RR); RES[I]:= R; NRMRES:= NRMRES + ABS(R)
end
end ITERATION;
DUPVEC(1, N, 0, B, SOL);
AUX[11]:= ERX; AUX[13]:= NRMRES
end ITISOL
eop