home *** CD-ROM | disk | FTP | other *** search
- C
- C ..................................................................
- C
- C SUBROUTINE MPRC
- C
- C PURPOSE
- C TO PERMUTE THE ROWS OR COLUMNS OF A GIVEN MATRIX ACCORDING
- C TO A GIVEN TRANSPOSITION VECTOR OR ITS INVERSE. (SEE THE
- C DISCUSSION ON PERMUTATIONS FOR DEFINITIONS AND NOTATION.)
- C
- C USAGE
- C CALL MPRC(A,M,N,ITRA,INV,IROCO,IER)
- C
- C DESCRIPTION OF PARAMETERS
- C A - GIVEN M BY N MATRIX AND RESULTING PERMUTED MATRIX
- C M - NUMBER OF ROWS OF A
- C N - NUMBER OF COLUMNS OF A
- C ITRA - GIVEN TRANSPOSITION VECTOR (DIMENSION M IF ROWS ARE
- C PERMUTED, N IF COLUMNS ARE PERMUTED)
- C INV - INPUT PARAMETER
- C INV NON-ZERO - PERMUTE ACCORDING TO ITRA
- C INV = 0 - PERMUTE ACCORDING TO ITRA INVERSE
- C IROCO - INPUT PARAMETER
- C IROCO NON-ZERO - PERMUTE THE COLUMNS OF A
- C IROCO = 0 - PERMUTE THE ROWS OF A
- C IER - RESULTING ERROR PARAMETER
- C IER = -1 - M AND N ARE NOT BOTH POSITIVE
- C IER = 0 - NO ERROR
- C IER = 1 - ITRA IS NOT A TRANSPOSITION VECTOR ON
- C 1,...,M IF ROWS ARE PERMUTED, 1,...,N
- C IF COLUMNS ARE PERMUTED
- C
- C REMARKS
- C (1) IF IER=-1 THERE IS NO COMPUTATION.
- C (2) IF IER= 1, THEN COMPUTATION HAS BEEN UNSUCCESSFUL DUE
- C TO ERROR, BUT THE MATRIX A WILL REFLECT THE ROW OR
- C COLUMN INTERCHANGES PERFORMED BEFORE THE ERROR WAS
- C DETECTED.
- C (3) THE MATRIX A IS ASSUMED TO BE STORED COLUMNWISE.
- C
- C SUBROUTINES AND SUBPROGRAMS REQUIRED
- C NONE
- C
- C METHOD
- C THE ROWS OR COLUMNS ARE PERMUTED ELEMENTWISE, INTERCHANGING
- C ROW OR COLUMN 1 AND ITRA(1),...,ROW OR COLUMN K AND ITRA(K)
- C IN THAT ORDER IF INV=0, AND OTHERWISE INTERCHANGING ROW OR
- C COLUMN K AND ITRA(K),...,ROW OR COLUMN 1 AND ITRA(1), WHERE
- C K IS M OR N DEPENDING ON WHETHER WE PERMUTE ROWS OR COLUMNS.
- C
- C ..................................................................
- C
- SUBROUTINE MPRC(A,M,N,ITRA,INV,IROCO,IER)
- C
- C
- DIMENSION A(1),ITRA(1)
- C
- C TEST OF DIMENSIONS
- IF(M)14,14,1
- 1 IF(N)14,14,2
- C
- C DETERMINE WHICH ARE TO BE PERMUTED-THE ROWS OR THE COLUMNS
- 2 IF(IROCO)3,4,3
- C
- C INITIALIZE FOR COLUMN INTERCHANGES
- 3 MM=M
- MMM=-1
- L=M
- LL=N
- GO TO 5
- C
- C INITIALIZE FOR ROW INTERCHANGES
- 4 MM=1
- MMM=M
- L=N
- LL=M
- C
- C INITIALIZE LOOP OVER ALL ROWS OR COLUMNS
- 5 IA=1
- ID=1
- C
- C TEST FOR INVERSE OPERATION
- IF(INV)6,7,6
- 6 IA=LL
- ID=-1
- 7 DO 12 I=1,LL
- K=ITRA(IA)
- IF(K-IA)8,12,9
- 8 IF(K)13,13,10
- 9 IF(LL-K)13,10,10
- C
- C INITIALIZE ROW OR COLUMN INTERCHANGE
- 10 IL=IA*MM
- K=K*MM
- C
- C PERFORM ROW OR COLUMN INTERCHANGE
- DO 11 J=1,L
- SAVE=A(IL)
- A(IL)=A(K)
- A(K)=SAVE
- K=K+MMM
- 11 IL=IL+MMM
- C
- C ADDRESS NEXT INTERCHANGE STEP
- 12 IA=IA+ID
- C
- C NORMAL EXIT
- IER=0
- RETURN
- C
- C ERROR RETURN IN CASE ITRA IS NOT A TRANSPOSITION VECTOR
- 13 IER=1
- RETURN
- C
- C ERROR RETURN IN CASE OF ILLEGAL DIMENSIONS
- 14 IER=-1
- RETURN
- END