Statistiques
| Révision :

root / src / blas / srotmg.f @ 1

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

1 1 equemene
      SUBROUTINE SROTMG(SD1,SD2,SX1,SY1,SPARAM)
2 1 equemene
*     .. Scalar Arguments ..
3 1 equemene
      REAL SD1,SD2,SX1,SY1
4 1 equemene
*     ..
5 1 equemene
*     .. Array Arguments ..
6 1 equemene
      REAL SPARAM(5)
7 1 equemene
*     ..
8 1 equemene
*
9 1 equemene
*  Purpose
10 1 equemene
*  =======
11 1 equemene
*
12 1 equemene
*     CONSTRUCT THE MODIFIED GIVENS TRANSFORMATION MATRIX H WHICH ZEROS
13 1 equemene
*     THE SECOND COMPONENT OF THE 2-VECTOR  (SQRT(SD1)*SX1,SQRT(SD2)*
14 1 equemene
*     SY2)**T.
15 1 equemene
*     WITH SPARAM(1)=SFLAG, H HAS ONE OF THE FOLLOWING FORMS..
16 1 equemene
*
17 1 equemene
*     SFLAG=-1.E0     SFLAG=0.E0        SFLAG=1.E0     SFLAG=-2.E0
18 1 equemene
*
19 1 equemene
*       (SH11  SH12)    (1.E0  SH12)    (SH11  1.E0)    (1.E0  0.E0)
20 1 equemene
*     H=(          )    (          )    (          )    (          )
21 1 equemene
*       (SH21  SH22),   (SH21  1.E0),   (-1.E0 SH22),   (0.E0  1.E0).
22 1 equemene
*     LOCATIONS 2-4 OF SPARAM CONTAIN SH11,SH21,SH12, AND SH22
23 1 equemene
*     RESPECTIVELY. (VALUES OF 1.E0, -1.E0, OR 0.E0 IMPLIED BY THE
24 1 equemene
*     VALUE OF SPARAM(1) ARE NOT STORED IN SPARAM.)
25 1 equemene
*
26 1 equemene
*     THE VALUES OF GAMSQ AND RGAMSQ SET IN THE DATA STATEMENT MAY BE
27 1 equemene
*     INEXACT.  THIS IS OK AS THEY ARE ONLY USED FOR TESTING THE SIZE
28 1 equemene
*     OF SD1 AND SD2.  ALL ACTUAL SCALING OF DATA IS DONE USING GAM.
29 1 equemene
*
30 1 equemene
*
31 1 equemene
*  Arguments
32 1 equemene
*  =========
33 1 equemene
*
34 1 equemene
*
35 1 equemene
*  SD1    (input/output) REAL
36 1 equemene
*
37 1 equemene
*  SD2    (input/output) REAL
38 1 equemene
*
39 1 equemene
*  SX1    (input/output) REAL
40 1 equemene
*
41 1 equemene
*  SY1    (input) REAL
42 1 equemene
*
43 1 equemene
*
44 1 equemene
*  SPARAM (input/output)  REAL array, dimension 5
45 1 equemene
*     SPARAM(1)=SFLAG
46 1 equemene
*     SPARAM(2)=SH11
47 1 equemene
*     SPARAM(3)=SH21
48 1 equemene
*     SPARAM(4)=SH12
49 1 equemene
*     SPARAM(5)=SH22
50 1 equemene
*
51 1 equemene
*  =====================================================================
52 1 equemene
*
53 1 equemene
*     .. Local Scalars ..
54 1 equemene
      REAL GAM,GAMSQ,ONE,RGAMSQ,SFLAG,SH11,SH12,SH21,SH22,SP1,SP2,SQ1,
55 1 equemene
     +     SQ2,STEMP,SU,TWO,ZERO
56 1 equemene
      INTEGER IGO
57 1 equemene
*     ..
58 1 equemene
*     .. Intrinsic Functions ..
59 1 equemene
      INTRINSIC ABS
60 1 equemene
*     ..
61 1 equemene
*     .. Data statements ..
62 1 equemene
*
63 1 equemene
      DATA ZERO,ONE,TWO/0.E0,1.E0,2.E0/
64 1 equemene
      DATA GAM,GAMSQ,RGAMSQ/4096.E0,1.67772E7,5.96046E-8/
65 1 equemene
*     ..
66 1 equemene
67 1 equemene
      IF (.NOT.SD1.LT.ZERO) GO TO 10
68 1 equemene
*       GO ZERO-H-D-AND-SX1..
69 1 equemene
      GO TO 60
70 1 equemene
   10 CONTINUE
71 1 equemene
*     CASE-SD1-NONNEGATIVE
72 1 equemene
      SP2 = SD2*SY1
73 1 equemene
      IF (.NOT.SP2.EQ.ZERO) GO TO 20
74 1 equemene
      SFLAG = -TWO
75 1 equemene
      GO TO 260
76 1 equemene
*     REGULAR-CASE..
77 1 equemene
   20 CONTINUE
78 1 equemene
      SP1 = SD1*SX1
79 1 equemene
      SQ2 = SP2*SY1
80 1 equemene
      SQ1 = SP1*SX1
81 1 equemene
*
82 1 equemene
      IF (.NOT.ABS(SQ1).GT.ABS(SQ2)) GO TO 40
83 1 equemene
      SH21 = -SY1/SX1
84 1 equemene
      SH12 = SP2/SP1
85 1 equemene
*
86 1 equemene
      SU = ONE - SH12*SH21
87 1 equemene
*
88 1 equemene
      IF (.NOT.SU.LE.ZERO) GO TO 30
89 1 equemene
*         GO ZERO-H-D-AND-SX1..
90 1 equemene
      GO TO 60
91 1 equemene
   30 CONTINUE
92 1 equemene
      SFLAG = ZERO
93 1 equemene
      SD1 = SD1/SU
94 1 equemene
      SD2 = SD2/SU
95 1 equemene
      SX1 = SX1*SU
96 1 equemene
*         GO SCALE-CHECK..
97 1 equemene
      GO TO 100
98 1 equemene
   40 CONTINUE
99 1 equemene
      IF (.NOT.SQ2.LT.ZERO) GO TO 50
100 1 equemene
*         GO ZERO-H-D-AND-SX1..
101 1 equemene
      GO TO 60
102 1 equemene
   50 CONTINUE
103 1 equemene
      SFLAG = ONE
104 1 equemene
      SH11 = SP1/SP2
105 1 equemene
      SH22 = SX1/SY1
106 1 equemene
      SU = ONE + SH11*SH22
107 1 equemene
      STEMP = SD2/SU
108 1 equemene
      SD2 = SD1/SU
109 1 equemene
      SD1 = STEMP
110 1 equemene
      SX1 = SY1*SU
111 1 equemene
*         GO SCALE-CHECK
112 1 equemene
      GO TO 100
113 1 equemene
*     PROCEDURE..ZERO-H-D-AND-SX1..
114 1 equemene
   60 CONTINUE
115 1 equemene
      SFLAG = -ONE
116 1 equemene
      SH11 = ZERO
117 1 equemene
      SH12 = ZERO
118 1 equemene
      SH21 = ZERO
119 1 equemene
      SH22 = ZERO
120 1 equemene
*
121 1 equemene
      SD1 = ZERO
122 1 equemene
      SD2 = ZERO
123 1 equemene
      SX1 = ZERO
124 1 equemene
*         RETURN..
125 1 equemene
      GO TO 220
126 1 equemene
*     PROCEDURE..FIX-H..
127 1 equemene
   70 CONTINUE
128 1 equemene
      IF (.NOT.SFLAG.GE.ZERO) GO TO 90
129 1 equemene
*
130 1 equemene
      IF (.NOT.SFLAG.EQ.ZERO) GO TO 80
131 1 equemene
      SH11 = ONE
132 1 equemene
      SH22 = ONE
133 1 equemene
      SFLAG = -ONE
134 1 equemene
      GO TO 90
135 1 equemene
   80 CONTINUE
136 1 equemene
      SH21 = -ONE
137 1 equemene
      SH12 = ONE
138 1 equemene
      SFLAG = -ONE
139 1 equemene
   90 CONTINUE
140 1 equemene
      GO TO IGO(120,150,180,210)
141 1 equemene
*     PROCEDURE..SCALE-CHECK
142 1 equemene
  100 CONTINUE
143 1 equemene
  110 CONTINUE
144 1 equemene
      IF (.NOT.SD1.LE.RGAMSQ) GO TO 130
145 1 equemene
      IF (SD1.EQ.ZERO) GO TO 160
146 1 equemene
      ASSIGN 120 TO IGO
147 1 equemene
*              FIX-H..
148 1 equemene
      GO TO 70
149 1 equemene
  120 CONTINUE
150 1 equemene
      SD1 = SD1*GAM**2
151 1 equemene
      SX1 = SX1/GAM
152 1 equemene
      SH11 = SH11/GAM
153 1 equemene
      SH12 = SH12/GAM
154 1 equemene
      GO TO 110
155 1 equemene
  130 CONTINUE
156 1 equemene
  140 CONTINUE
157 1 equemene
      IF (.NOT.SD1.GE.GAMSQ) GO TO 160
158 1 equemene
      ASSIGN 150 TO IGO
159 1 equemene
*              FIX-H..
160 1 equemene
      GO TO 70
161 1 equemene
  150 CONTINUE
162 1 equemene
      SD1 = SD1/GAM**2
163 1 equemene
      SX1 = SX1*GAM
164 1 equemene
      SH11 = SH11*GAM
165 1 equemene
      SH12 = SH12*GAM
166 1 equemene
      GO TO 140
167 1 equemene
  160 CONTINUE
168 1 equemene
  170 CONTINUE
169 1 equemene
      IF (.NOT.ABS(SD2).LE.RGAMSQ) GO TO 190
170 1 equemene
      IF (SD2.EQ.ZERO) GO TO 220
171 1 equemene
      ASSIGN 180 TO IGO
172 1 equemene
*              FIX-H..
173 1 equemene
      GO TO 70
174 1 equemene
  180 CONTINUE
175 1 equemene
      SD2 = SD2*GAM**2
176 1 equemene
      SH21 = SH21/GAM
177 1 equemene
      SH22 = SH22/GAM
178 1 equemene
      GO TO 170
179 1 equemene
  190 CONTINUE
180 1 equemene
  200 CONTINUE
181 1 equemene
      IF (.NOT.ABS(SD2).GE.GAMSQ) GO TO 220
182 1 equemene
      ASSIGN 210 TO IGO
183 1 equemene
*              FIX-H..
184 1 equemene
      GO TO 70
185 1 equemene
  210 CONTINUE
186 1 equemene
      SD2 = SD2/GAM**2
187 1 equemene
      SH21 = SH21*GAM
188 1 equemene
      SH22 = SH22*GAM
189 1 equemene
      GO TO 200
190 1 equemene
  220 CONTINUE
191 1 equemene
      IF (SFLAG) 250,230,240
192 1 equemene
  230 CONTINUE
193 1 equemene
      SPARAM(3) = SH21
194 1 equemene
      SPARAM(4) = SH12
195 1 equemene
      GO TO 260
196 1 equemene
  240 CONTINUE
197 1 equemene
      SPARAM(2) = SH11
198 1 equemene
      SPARAM(5) = SH22
199 1 equemene
      GO TO 260
200 1 equemene
  250 CONTINUE
201 1 equemene
      SPARAM(2) = SH11
202 1 equemene
      SPARAM(3) = SH21
203 1 equemene
      SPARAM(4) = SH12
204 1 equemene
      SPARAM(5) = SH22
205 1 equemene
  260 CONTINUE
206 1 equemene
      SPARAM(1) = SFLAG
207 1 equemene
      RETURN
208 1 equemene
      END