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