* * $Id: f406rr.F,v 1.1.1.1 1996/02/15 17:48:42 mclareni Exp $ * * $Log: f406rr.F,v $ * Revision 1.1.1.1 1996/02/15 17:48:42 mclareni * Kernlib * * #include "kernnumt/pilot.h" SUBROUTINE F406RR(N,M,K,KMAX,IDIM,A,ABAND,B,BREF,RESID) REAL RESID,RB REAL A,ABAND,B,BREF,ONE DIMENSION A(IDIM,N),ABAND(IDIM,2),B(IDIM,KMAX),BREF(IDIM,KMAX) DATA ONE/1./ C C SETS RESID EQUAL TO THE LARGEST RESIDUAL FOUND WHEN SOLVING A BANDED C LINEAR SYSTEM BY MEANS OF SUBROUTINE RBEQN (F406). C C N ORDER OF COEFFICIENT MATRIX. C M BAND-WIDTH PARAMETER. C K CURRENT NUMBER OF RIGHT-HAND SIDES. C KMAX MAXIMUM NUMBER OF RIGHT-HAND SIDES. C A (REAL) TWO-DIMENSIONAL ARRAY WITH AT LEAST N COLUMNS. C ABAND (REAL) TWO-DIMENSIONAL ARRAY WITH AT LEAST MIN(2*M+1,N)+1 C COLUMNS. C B,BREF (REAL) TWO-DIMENSIONAL ARRAYS WITH AT LEAST KMAX COLUMNS. C RESID (REAL) OUTPUT VARIABLE. C C CALLS ... SUBROUTINE RBEQN (F406). C ... CERN PACKAGES F002 AND F003. C ... TEST-ROUTINE F406SR. C C START. C IF(K.LT.1) RETURN MBAND=2*M+1 C C SET ARRAY A TO A BAND MATRIX WHICH IS WELL-CONDITIONED ONLY IF PIV- C OTING OCCURS, AND SET A PACKED COPY IN ARRAY ABAND. C CALL F406SR(N,M,IDIM,A) DO 2 I=1,N JMIN=MAX0(I-M,1) JMAX=MIN0(I+M,N) DO 1 J=JMIN,JMAX L=J-I+M+1 IF(I.LE.M) ABAND(I,J)=A(I,J) IF(I.GT.M) ABAND(I,L)=A(I,J) 1 CONTINUE 2 CONTINUE C C SET MINUS ONES AS A MARKER IN THE FIRST NON-SET COLUMN OF B. C THESE SHOULD NOT BE OVERWRITTEN BY CALLING RBEQN. C LSTCOL=MIN0(MBAND,N) CALL RVSET(N,-ONE,ABAND(1,LSTCOL+1),ABAND(2,LSTCOL+1)) C C SET A RIGHT-HAND SIDE MATRIX IN B, WITH A COPY IN BREF. C CALL RMRAN(N,KMAX,-ONE,ONE,B,B(1,2),B(2,1)) CALL RMCPY(N,KMAX,B,B(1,2),B(2,1),BREF,BREF(1,2),BREF(2,1)) C C CALL RBEQN TO REPLACE B BY THE SOLUTION MATRIX AINV*B. C CALL RBEQN(N,M,ABAND,IDIM,IFAIL,K,B) C C REPLACE B BY THE MATRIX OF RESIDUALS (USING FIRST COLUMN OF ABAND AS C A WORKING VECTOR FOR SUBROUTINE RMMLT). C CALL RMMLT(N,N,K,A,A(1,2),A(2,1),B,B(1,2),B(2,1), * B,B(1,2),B(2,1),ABAND) CALL RMSUB(N,KMAX,B,B(1,2),B(2,1),BREF,BREF(1,2),BREF(2,1), * B,B(1,2),B(2,1)) C C SET RESID TO THE LARGEST RESIDUAL. C RESID=0. DO 4 I=1,N DO 3 J=1,KMAX RB=B(I,J) RESID=AMAX1(RESID,ABS(RB)) 3 CONTINUE 4 CONTINUE C C IF MARKED COLUMN OF ABAND HAS CHANGED, SET RESID NEGATIVE. C DO 5 I=1,N IF(ABAND(I,LSTCOL+1).NE.-ONE) RESID=-ABS(RESID) 5 CONTINUE RETURN END