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