Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/mathlibs/src/lapack/cgebak.f
5198 views
1
SUBROUTINE CGEBAK( JOB, SIDE, N, ILO, IHI, SCALE, M, V, LDV,
2
$ INFO )
3
*
4
* -- LAPACK routine (version 3.0) --
5
* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
6
* Courant Institute, Argonne National Lab, and Rice University
7
* September 30, 1994
8
*
9
* .. Scalar Arguments ..
10
CHARACTER JOB, SIDE
11
INTEGER IHI, ILO, INFO, LDV, M, N
12
* ..
13
* .. Array Arguments ..
14
REAL SCALE( * )
15
COMPLEX V( LDV, * )
16
* ..
17
*
18
* Purpose
19
* =======
20
*
21
* CGEBAK forms the right or left eigenvectors of a complex general
22
* matrix by backward transformation on the computed eigenvectors of the
23
* balanced matrix output by CGEBAL.
24
*
25
* Arguments
26
* =========
27
*
28
* JOB (input) CHARACTER*1
29
* Specifies the type of backward transformation required:
30
* = 'N', do nothing, return immediately;
31
* = 'P', do backward transformation for permutation only;
32
* = 'S', do backward transformation for scaling only;
33
* = 'B', do backward transformations for both permutation and
34
* scaling.
35
* JOB must be the same as the argument JOB supplied to CGEBAL.
36
*
37
* SIDE (input) CHARACTER*1
38
* = 'R': V contains right eigenvectors;
39
* = 'L': V contains left eigenvectors.
40
*
41
* N (input) INTEGER
42
* The number of rows of the matrix V. N >= 0.
43
*
44
* ILO (input) INTEGER
45
* IHI (input) INTEGER
46
* The integers ILO and IHI determined by CGEBAL.
47
* 1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
48
*
49
* SCALE (input) REAL array, dimension (N)
50
* Details of the permutation and scaling factors, as returned
51
* by CGEBAL.
52
*
53
* M (input) INTEGER
54
* The number of columns of the matrix V. M >= 0.
55
*
56
* V (input/output) COMPLEX array, dimension (LDV,M)
57
* On entry, the matrix of right or left eigenvectors to be
58
* transformed, as returned by CHSEIN or CTREVC.
59
* On exit, V is overwritten by the transformed eigenvectors.
60
*
61
* LDV (input) INTEGER
62
* The leading dimension of the array V. LDV >= max(1,N).
63
*
64
* INFO (output) INTEGER
65
* = 0: successful exit
66
* < 0: if INFO = -i, the i-th argument had an illegal value.
67
*
68
* =====================================================================
69
*
70
* .. Parameters ..
71
REAL ONE
72
PARAMETER ( ONE = 1.0E+0 )
73
* ..
74
* .. Local Scalars ..
75
LOGICAL LEFTV, RIGHTV
76
INTEGER I, II, K
77
REAL S
78
* ..
79
* .. External Functions ..
80
LOGICAL LSAME
81
EXTERNAL LSAME
82
* ..
83
* .. External Subroutines ..
84
EXTERNAL CSSCAL, CSWAP, XERBLA
85
* ..
86
* .. Intrinsic Functions ..
87
INTRINSIC MAX
88
* ..
89
* .. Executable Statements ..
90
*
91
* Decode and Test the input parameters
92
*
93
RIGHTV = LSAME( SIDE, 'R' )
94
LEFTV = LSAME( SIDE, 'L' )
95
*
96
INFO = 0
97
IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
98
$ .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
99
INFO = -1
100
ELSE IF( .NOT.RIGHTV .AND. .NOT.LEFTV ) THEN
101
INFO = -2
102
ELSE IF( N.LT.0 ) THEN
103
INFO = -3
104
ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
105
INFO = -4
106
ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
107
INFO = -5
108
ELSE IF( M.LT.0 ) THEN
109
INFO = -7
110
ELSE IF( LDV.LT.MAX( 1, N ) ) THEN
111
INFO = -9
112
END IF
113
IF( INFO.NE.0 ) THEN
114
CALL XERBLA( 'CGEBAK', -INFO )
115
RETURN
116
END IF
117
*
118
* Quick return if possible
119
*
120
IF( N.EQ.0 )
121
$ RETURN
122
IF( M.EQ.0 )
123
$ RETURN
124
IF( LSAME( JOB, 'N' ) )
125
$ RETURN
126
*
127
IF( ILO.EQ.IHI )
128
$ GO TO 30
129
*
130
* Backward balance
131
*
132
IF( LSAME( JOB, 'S' ) .OR. LSAME( JOB, 'B' ) ) THEN
133
*
134
IF( RIGHTV ) THEN
135
DO 10 I = ILO, IHI
136
S = SCALE( I )
137
CALL CSSCAL( M, S, V( I, 1 ), LDV )
138
10 CONTINUE
139
END IF
140
*
141
IF( LEFTV ) THEN
142
DO 20 I = ILO, IHI
143
S = ONE / SCALE( I )
144
CALL CSSCAL( M, S, V( I, 1 ), LDV )
145
20 CONTINUE
146
END IF
147
*
148
END IF
149
*
150
* Backward permutation
151
*
152
* For I = ILO-1 step -1 until 1,
153
* IHI+1 step 1 until N do --
154
*
155
30 CONTINUE
156
IF( LSAME( JOB, 'P' ) .OR. LSAME( JOB, 'B' ) ) THEN
157
IF( RIGHTV ) THEN
158
DO 40 II = 1, N
159
I = II
160
IF( I.GE.ILO .AND. I.LE.IHI )
161
$ GO TO 40
162
IF( I.LT.ILO )
163
$ I = ILO - II
164
K = SCALE( I )
165
IF( K.EQ.I )
166
$ GO TO 40
167
CALL CSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
168
40 CONTINUE
169
END IF
170
*
171
IF( LEFTV ) THEN
172
DO 50 II = 1, N
173
I = II
174
IF( I.GE.ILO .AND. I.LE.IHI )
175
$ GO TO 50
176
IF( I.LT.ILO )
177
$ I = ILO - II
178
K = SCALE( I )
179
IF( K.EQ.I )
180
$ GO TO 50
181
CALL CSWAP( M, V( I, 1 ), LDV, V( K, 1 ), LDV )
182
50 CONTINUE
183
END IF
184
END IF
185
*
186
RETURN
187
*
188
* End of CGEBAK
189
*
190
END
191
192