Statistiques
| Révision :

root / src / blas / srotm.f @ 8

Historique | Voir | Annoter | Télécharger (3,63 ko)

1 1 equemene
      SUBROUTINE SROTM(N,SX,INCX,SY,INCY,SPARAM)
2 1 equemene
*     .. Scalar Arguments ..
3 1 equemene
      INTEGER INCX,INCY,N
4 1 equemene
*     ..
5 1 equemene
*     .. Array Arguments ..
6 1 equemene
      REAL SPARAM(5),SX(1),SY(1)
7 1 equemene
*     ..
8 1 equemene
*
9 1 equemene
*  Purpose
10 1 equemene
*  =======
11 1 equemene
*
12 1 equemene
*     APPLY THE MODIFIED GIVENS TRANSFORMATION, H, TO THE 2 BY N MATRIX
13 1 equemene
*
14 1 equemene
*     (SX**T) , WHERE **T INDICATES TRANSPOSE. THE ELEMENTS OF SX ARE IN
15 1 equemene
*     (DX**T)
16 1 equemene
*
17 1 equemene
*     SX(LX+I*INCX), I = 0 TO N-1, WHERE LX = 1 IF INCX .GE. 0, ELSE
18 1 equemene
*     LX = (-INCX)*N, AND SIMILARLY FOR SY USING USING LY AND INCY.
19 1 equemene
*     WITH SPARAM(1)=SFLAG, H HAS ONE OF THE FOLLOWING FORMS..
20 1 equemene
*
21 1 equemene
*     SFLAG=-1.E0     SFLAG=0.E0        SFLAG=1.E0     SFLAG=-2.E0
22 1 equemene
*
23 1 equemene
*       (SH11  SH12)    (1.E0  SH12)    (SH11  1.E0)    (1.E0  0.E0)
24 1 equemene
*     H=(          )    (          )    (          )    (          )
25 1 equemene
*       (SH21  SH22),   (SH21  1.E0),   (-1.E0 SH22),   (0.E0  1.E0).
26 1 equemene
*     SEE  SROTMG FOR A DESCRIPTION OF DATA STORAGE IN SPARAM.
27 1 equemene
*
28 1 equemene
*
29 1 equemene
*  Arguments
30 1 equemene
*  =========
31 1 equemene
*
32 1 equemene
*  N      (input) INTEGER
33 1 equemene
*         number of elements in input vector(s)
34 1 equemene
*
35 1 equemene
*  SX     (input/output) REAL array, dimension N
36 1 equemene
*         double precision vector with 5 elements
37 1 equemene
*
38 1 equemene
*  INCX   (input) INTEGER
39 1 equemene
*         storage spacing between elements of SX
40 1 equemene
*
41 1 equemene
*  SY     (input/output) REAL array, dimension N
42 1 equemene
*         double precision vector with N elements
43 1 equemene
*
44 1 equemene
*  INCY   (input) INTEGER
45 1 equemene
*         storage spacing between elements of SY
46 1 equemene
*
47 1 equemene
*  SPARAM (input/output)  REAL array, dimension 5
48 1 equemene
*     SPARAM(1)=SFLAG
49 1 equemene
*     SPARAM(2)=SH11
50 1 equemene
*     SPARAM(3)=SH21
51 1 equemene
*     SPARAM(4)=SH12
52 1 equemene
*     SPARAM(5)=SH22
53 1 equemene
*
54 1 equemene
*  =====================================================================
55 1 equemene
*
56 1 equemene
*     .. Local Scalars ..
57 1 equemene
      REAL SFLAG,SH11,SH12,SH21,SH22,TWO,W,Z,ZERO
58 1 equemene
      INTEGER I,KX,KY,NSTEPS
59 1 equemene
*     ..
60 1 equemene
*     .. Data statements ..
61 1 equemene
      DATA ZERO,TWO/0.E0,2.E0/
62 1 equemene
*     ..
63 1 equemene
*
64 1 equemene
      SFLAG = SPARAM(1)
65 1 equemene
      IF (N.LE.0 .OR. (SFLAG+TWO.EQ.ZERO)) GO TO 140
66 1 equemene
      IF (.NOT. (INCX.EQ.INCY.AND.INCX.GT.0)) GO TO 70
67 1 equemene
*
68 1 equemene
      NSTEPS = N*INCX
69 1 equemene
      IF (SFLAG) 50,10,30
70 1 equemene
   10 CONTINUE
71 1 equemene
      SH12 = SPARAM(4)
72 1 equemene
      SH21 = SPARAM(3)
73 1 equemene
      DO 20 I = 1,NSTEPS,INCX
74 1 equemene
          W = SX(I)
75 1 equemene
          Z = SY(I)
76 1 equemene
          SX(I) = W + Z*SH12
77 1 equemene
          SY(I) = W*SH21 + Z
78 1 equemene
   20 CONTINUE
79 1 equemene
      GO TO 140
80 1 equemene
   30 CONTINUE
81 1 equemene
      SH11 = SPARAM(2)
82 1 equemene
      SH22 = SPARAM(5)
83 1 equemene
      DO 40 I = 1,NSTEPS,INCX
84 1 equemene
          W = SX(I)
85 1 equemene
          Z = SY(I)
86 1 equemene
          SX(I) = W*SH11 + Z
87 1 equemene
          SY(I) = -W + SH22*Z
88 1 equemene
   40 CONTINUE
89 1 equemene
      GO TO 140
90 1 equemene
   50 CONTINUE
91 1 equemene
      SH11 = SPARAM(2)
92 1 equemene
      SH12 = SPARAM(4)
93 1 equemene
      SH21 = SPARAM(3)
94 1 equemene
      SH22 = SPARAM(5)
95 1 equemene
      DO 60 I = 1,NSTEPS,INCX
96 1 equemene
          W = SX(I)
97 1 equemene
          Z = SY(I)
98 1 equemene
          SX(I) = W*SH11 + Z*SH12
99 1 equemene
          SY(I) = W*SH21 + Z*SH22
100 1 equemene
   60 CONTINUE
101 1 equemene
      GO TO 140
102 1 equemene
   70 CONTINUE
103 1 equemene
      KX = 1
104 1 equemene
      KY = 1
105 1 equemene
      IF (INCX.LT.0) KX = 1 + (1-N)*INCX
106 1 equemene
      IF (INCY.LT.0) KY = 1 + (1-N)*INCY
107 1 equemene
*
108 1 equemene
      IF (SFLAG) 120,80,100
109 1 equemene
   80 CONTINUE
110 1 equemene
      SH12 = SPARAM(4)
111 1 equemene
      SH21 = SPARAM(3)
112 1 equemene
      DO 90 I = 1,N
113 1 equemene
          W = SX(KX)
114 1 equemene
          Z = SY(KY)
115 1 equemene
          SX(KX) = W + Z*SH12
116 1 equemene
          SY(KY) = W*SH21 + Z
117 1 equemene
          KX = KX + INCX
118 1 equemene
          KY = KY + INCY
119 1 equemene
   90 CONTINUE
120 1 equemene
      GO TO 140
121 1 equemene
  100 CONTINUE
122 1 equemene
      SH11 = SPARAM(2)
123 1 equemene
      SH22 = SPARAM(5)
124 1 equemene
      DO 110 I = 1,N
125 1 equemene
          W = SX(KX)
126 1 equemene
          Z = SY(KY)
127 1 equemene
          SX(KX) = W*SH11 + Z
128 1 equemene
          SY(KY) = -W + SH22*Z
129 1 equemene
          KX = KX + INCX
130 1 equemene
          KY = KY + INCY
131 1 equemene
  110 CONTINUE
132 1 equemene
      GO TO 140
133 1 equemene
  120 CONTINUE
134 1 equemene
      SH11 = SPARAM(2)
135 1 equemene
      SH12 = SPARAM(4)
136 1 equemene
      SH21 = SPARAM(3)
137 1 equemene
      SH22 = SPARAM(5)
138 1 equemene
      DO 130 I = 1,N
139 1 equemene
          W = SX(KX)
140 1 equemene
          Z = SY(KY)
141 1 equemene
          SX(KX) = W*SH11 + Z*SH12
142 1 equemene
          SY(KY) = W*SH21 + Z*SH22
143 1 equemene
          KX = KX + INCX
144 1 equemene
          KY = KY + INCY
145 1 equemene
  130 CONTINUE
146 1 equemene
  140 CONTINUE
147 1 equemene
      RETURN
148 1 equemene
      END