Statistiques
| Révision :

root / src / blas / srotmg.f @ 10

Historique | Voir | Annoter | Télécharger (4,66 ko)

1
      SUBROUTINE SROTMG(SD1,SD2,SX1,SY1,SPARAM)
2
*     .. Scalar Arguments ..
3
      REAL SD1,SD2,SX1,SY1
4
*     ..
5
*     .. Array Arguments ..
6
      REAL SPARAM(5)
7
*     ..
8
*
9
*  Purpose
10
*  =======
11
*
12
*     CONSTRUCT THE MODIFIED GIVENS TRANSFORMATION MATRIX H WHICH ZEROS
13
*     THE SECOND COMPONENT OF THE 2-VECTOR  (SQRT(SD1)*SX1,SQRT(SD2)*
14
*     SY2)**T.
15
*     WITH SPARAM(1)=SFLAG, H HAS ONE OF THE FOLLOWING FORMS..
16
*
17
*     SFLAG=-1.E0     SFLAG=0.E0        SFLAG=1.E0     SFLAG=-2.E0
18
*
19
*       (SH11  SH12)    (1.E0  SH12)    (SH11  1.E0)    (1.E0  0.E0)
20
*     H=(          )    (          )    (          )    (          )
21
*       (SH21  SH22),   (SH21  1.E0),   (-1.E0 SH22),   (0.E0  1.E0).
22
*     LOCATIONS 2-4 OF SPARAM CONTAIN SH11,SH21,SH12, AND SH22
23
*     RESPECTIVELY. (VALUES OF 1.E0, -1.E0, OR 0.E0 IMPLIED BY THE
24
*     VALUE OF SPARAM(1) ARE NOT STORED IN SPARAM.)
25
*
26
*     THE VALUES OF GAMSQ AND RGAMSQ SET IN THE DATA STATEMENT MAY BE
27
*     INEXACT.  THIS IS OK AS THEY ARE ONLY USED FOR TESTING THE SIZE
28
*     OF SD1 AND SD2.  ALL ACTUAL SCALING OF DATA IS DONE USING GAM.
29
*
30
*
31
*  Arguments
32
*  =========
33
*
34
*
35
*  SD1    (input/output) REAL
36
*
37
*  SD2    (input/output) REAL
38
*
39
*  SX1    (input/output) REAL
40
*
41
*  SY1    (input) REAL
42
*
43
*
44
*  SPARAM (input/output)  REAL array, dimension 5
45
*     SPARAM(1)=SFLAG
46
*     SPARAM(2)=SH11
47
*     SPARAM(3)=SH21
48
*     SPARAM(4)=SH12
49
*     SPARAM(5)=SH22
50
*
51
*  =====================================================================
52
*
53
*     .. Local Scalars ..
54
      REAL GAM,GAMSQ,ONE,RGAMSQ,SFLAG,SH11,SH12,SH21,SH22,SP1,SP2,SQ1,
55
     +     SQ2,STEMP,SU,TWO,ZERO
56
      INTEGER IGO
57
*     ..
58
*     .. Intrinsic Functions ..
59
      INTRINSIC ABS
60
*     ..
61
*     .. Data statements ..
62
*
63
      DATA ZERO,ONE,TWO/0.E0,1.E0,2.E0/
64
      DATA GAM,GAMSQ,RGAMSQ/4096.E0,1.67772E7,5.96046E-8/
65
*     ..
66

    
67
      IF (.NOT.SD1.LT.ZERO) GO TO 10
68
*       GO ZERO-H-D-AND-SX1..
69
      GO TO 60
70
   10 CONTINUE
71
*     CASE-SD1-NONNEGATIVE
72
      SP2 = SD2*SY1
73
      IF (.NOT.SP2.EQ.ZERO) GO TO 20
74
      SFLAG = -TWO
75
      GO TO 260
76
*     REGULAR-CASE..
77
   20 CONTINUE
78
      SP1 = SD1*SX1
79
      SQ2 = SP2*SY1
80
      SQ1 = SP1*SX1
81
*
82
      IF (.NOT.ABS(SQ1).GT.ABS(SQ2)) GO TO 40
83
      SH21 = -SY1/SX1
84
      SH12 = SP2/SP1
85
*
86
      SU = ONE - SH12*SH21
87
*
88
      IF (.NOT.SU.LE.ZERO) GO TO 30
89
*         GO ZERO-H-D-AND-SX1..
90
      GO TO 60
91
   30 CONTINUE
92
      SFLAG = ZERO
93
      SD1 = SD1/SU
94
      SD2 = SD2/SU
95
      SX1 = SX1*SU
96
*         GO SCALE-CHECK..
97
      GO TO 100
98
   40 CONTINUE
99
      IF (.NOT.SQ2.LT.ZERO) GO TO 50
100
*         GO ZERO-H-D-AND-SX1..
101
      GO TO 60
102
   50 CONTINUE
103
      SFLAG = ONE
104
      SH11 = SP1/SP2
105
      SH22 = SX1/SY1
106
      SU = ONE + SH11*SH22
107
      STEMP = SD2/SU
108
      SD2 = SD1/SU
109
      SD1 = STEMP
110
      SX1 = SY1*SU
111
*         GO SCALE-CHECK
112
      GO TO 100
113
*     PROCEDURE..ZERO-H-D-AND-SX1..
114
   60 CONTINUE
115
      SFLAG = -ONE
116
      SH11 = ZERO
117
      SH12 = ZERO
118
      SH21 = ZERO
119
      SH22 = ZERO
120
*
121
      SD1 = ZERO
122
      SD2 = ZERO
123
      SX1 = ZERO
124
*         RETURN..
125
      GO TO 220
126
*     PROCEDURE..FIX-H..
127
   70 CONTINUE
128
      IF (.NOT.SFLAG.GE.ZERO) GO TO 90
129
*
130
      IF (.NOT.SFLAG.EQ.ZERO) GO TO 80
131
      SH11 = ONE
132
      SH22 = ONE
133
      SFLAG = -ONE
134
      GO TO 90
135
   80 CONTINUE
136
      SH21 = -ONE
137
      SH12 = ONE
138
      SFLAG = -ONE
139
   90 CONTINUE
140
      GO TO IGO(120,150,180,210)
141
*     PROCEDURE..SCALE-CHECK
142
  100 CONTINUE
143
  110 CONTINUE
144
      IF (.NOT.SD1.LE.RGAMSQ) GO TO 130
145
      IF (SD1.EQ.ZERO) GO TO 160
146
      ASSIGN 120 TO IGO
147
*              FIX-H..
148
      GO TO 70
149
  120 CONTINUE
150
      SD1 = SD1*GAM**2
151
      SX1 = SX1/GAM
152
      SH11 = SH11/GAM
153
      SH12 = SH12/GAM
154
      GO TO 110
155
  130 CONTINUE
156
  140 CONTINUE
157
      IF (.NOT.SD1.GE.GAMSQ) GO TO 160
158
      ASSIGN 150 TO IGO
159
*              FIX-H..
160
      GO TO 70
161
  150 CONTINUE
162
      SD1 = SD1/GAM**2
163
      SX1 = SX1*GAM
164
      SH11 = SH11*GAM
165
      SH12 = SH12*GAM
166
      GO TO 140
167
  160 CONTINUE
168
  170 CONTINUE
169
      IF (.NOT.ABS(SD2).LE.RGAMSQ) GO TO 190
170
      IF (SD2.EQ.ZERO) GO TO 220
171
      ASSIGN 180 TO IGO
172
*              FIX-H..
173
      GO TO 70
174
  180 CONTINUE
175
      SD2 = SD2*GAM**2
176
      SH21 = SH21/GAM
177
      SH22 = SH22/GAM
178
      GO TO 170
179
  190 CONTINUE
180
  200 CONTINUE
181
      IF (.NOT.ABS(SD2).GE.GAMSQ) GO TO 220
182
      ASSIGN 210 TO IGO
183
*              FIX-H..
184
      GO TO 70
185
  210 CONTINUE
186
      SD2 = SD2/GAM**2
187
      SH21 = SH21*GAM
188
      SH22 = SH22*GAM
189
      GO TO 200
190
  220 CONTINUE
191
      IF (SFLAG) 250,230,240
192
  230 CONTINUE
193
      SPARAM(3) = SH21
194
      SPARAM(4) = SH12
195
      GO TO 260
196
  240 CONTINUE
197
      SPARAM(2) = SH11
198
      SPARAM(5) = SH22
199
      GO TO 260
200
  250 CONTINUE
201
      SPARAM(2) = SH11
202
      SPARAM(3) = SH21
203
      SPARAM(4) = SH12
204
      SPARAM(5) = SH22
205
  260 CONTINUE
206
      SPARAM(1) = SFLAG
207
      RETURN
208
      END