code 34220;
    procedure CONJ GRAD( MATVEC, X, R, L, N, GO ON, ITERATE, NORM2);
    value L, N; procedure MATVEC; array X, R; boolean GO ON;
    integer L, N, ITERATE; real NORM2;
    begin array P, AP[ L: N];
        integer I;
        real  A, B, PRR, RRP;
        for ITERATE:= 0, ITERATE + 1 while GO ON do 
        begin if ITERATE = 0 then 
            begin MATVEC( X, P);
                for I:= L step 1 until N do 
                P[ I]:= R[ I]:= R[ I] - P[ I];
                PRR:= VECVEC( L, N, 0, R, R)
            end else 
            begin B:= RRP / PRR; PRR:= RRP;
                for I:= L step 1 until N do 
                P[ I]:= R[ I] + B * P[ I]
            end;
            MATVEC( P, AP);
            A:= PRR / VECVEC( L, N, 0, P, AP);
            ELMVEC( L, N, 0, X, P, A);
            ELMVEC( L, N, 0, R, AP, -A);
            NORM2:= RRP:= VECVEC( L, N, 0, R, R)
        end 
    end CONJ GRAD;
        eop