summaryrefslogtreecommitdiff
path: root/modules/cacsd/src/slicot/ereduc.f
blob: 6e9eb2b81d6e14cc1c915aa8949865efc0ac984b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
      SUBROUTINE EREDUC(E, M, N, Q, Z, ISTAIR, RANKE, TOL)
C     PURPOSE: 
C        
C     Given an M x N matrix E (not necessarily regular) the subroutine         
C     EREDUC computes a unitary transformed matrix Q*E*Z which is in 
C     column echelon form (trapezoidal form). Furthermore the rank of
C     matrix E is determined.
C        
C     CONTRIBUTOR: Th.G.J. Beelen (Philips Glass Eindhoven). 
C     Copyright SLICOT
C        
C     REVISIONS: 1988, January 29.     
C        
C     Specification of the parameters. 
C        
C     .. Scalar arguments .. 
C        
      INTEGER LDE, LDQ, LDZ, M, N, RANKE         
      DOUBLE PRECISION TOL   
C        
C     .. Array arguments ..  
C        
      INTEGER ISTAIR(M)      
C      DOUBLE PRECISION E(LDE,N), Q(LDQ,M), Z(LDZ,N)
C      SET E(M,N) Q(M,M) Z(N,N)
      DOUBLE PRECISION E(M,N), Q(M,M), Z(N,N)
C     Local variables.       
C        
      INTEGER I, J, JMX, K, KM1, L, LK, MNK, NR1 
      DOUBLE PRECISION EMXNRM, EMX, SC, SS       
      LOGICAL LZERO
C
      LDE=M
      LDQ=M
      LDZ=N
      do 991 i=1,m
      do 991 j=1,m
      q(i,j)=0.d0
 991  continue
      do 992 i=1,m
      q(i,i)=1.0d0
 992  continue
      do 993 i=1,n
      do 993 j=1,n
      z(i,j)=0.d0
 993  continue
      do 994 i=1,n
      z(i,i)=1.0d0
 994  continue
      RANKE = MIN0(M,N)      
C        
      K = N        
      LZERO = .FALSE.        
C        
C     WHILE ((K > 0) AND (NOT a zero submatrix encountered) DO       
   10 IF ((K .GT. 0) .AND. (.NOT.LZERO)) THEN    
C        
C        
         MNK = M - N + K     
         EMXNRM = 0.0D0      
         LK = MNK  
         DO 20 L = MNK, 1, -1
             JMX = IDAMAX(K, E(L,1), LDE)                             
             EMX = DABS(E(L,JMX))        
            IF (EMX .GT. EMXNRM) THEN   
               EMXNRM = EMX                                                    
               LK = L
            END IF                                                           
   20    CONTINUE 
C                  
         IF (EMXNRM .LT. TOL) THEN     
C                  
C           Set submatrix Ek to zero.  
C                  
            DO 40 J = 1, K             
               DO 30 L = 1, MNK        
                  E(L,J) = 0.0D0       
   30          CONTINUE                
   40       CONTINUE                   
            LZERO = .TRUE.             
            RANKE = N - K              
         ELSE      
C                  
C           Submatrix Ek is not considered to be identically zero.             
C           Check whether rows have to be interchanged.    
C                  
            IF (LK .NE. MNK) THEN      
C                  
C              Interchange rows lk and m-n+k in whole E-matrix and             
C              update the row transformation matrix Q.     
C              (# elements involved = m)                   
C                  
               CALL DSWAP(N, E(LK,1), LDE, E(MNK,1), LDE)  
               CALL DSWAP(M, Q(LK,1), LDQ, Q(MNK,1), LDQ)  
            END IF 
C                  
            KM1 = K - 1                
            DO 50 J = 1, KM1           
C                  
C              Determine the column Givens transformation to annihilate        
C              E(m-n+k,j) using E(m-n+k,k) as pivot.       
C              Apply the transformation to the columns of Ek.                  
C              (# elements involved = m-n+k)               
C              Update the column transformation matrix Z.  
C              (# elements involved = n)                   
C                  
               CALL DGIV(E(MNK,K), E(MNK,J), SC, SS)       
               CALL DROT(MNK, E(1,K), 1, E(1,J), 1, SC, SS)
               E(MNK, J) = 0.0D0       
               CALL DROT(N, Z(1,K), 1, Z(1,J), 1, SC, SS)  
   50       CONTINUE                   
C                  
            K = K - 1                  
         END IF    
         GOTO 10   
      END IF       
C     END WHILE 10 
C                  
C     Initialise administration staircase form, i.e.,      
C     ISTAIR(i) =  j  if E(i,j) is a nonzero corner point  
C               = -j  if E(i,j) is on the boundary but is no corner pt.        
C     Thus,        
C     ISTAIR(m-k) =   n-k           for k=0,...,rank(E)-1  
C                 = -(n-rank(E)+1)  for k=rank(E),...,m-1. 
C                  
      DO 60 I = 1, RANKE               
         ISTAIR(M - I + 1) = N - I + 1 
   60 CONTINUE     
C                  
      NR1 = N - RANKE + 1              
      DO 70 I = RANKE, M - 1           
         ISTAIR(M-I) = -NR1            
   70 CONTINUE     
C                  
      RETURN       
C *** Last line of EREDUC *********************************************        
      END