1*bf2c3715SXin Li /* srotm.f -- translated by f2c (version 20100827).
2*bf2c3715SXin Li You must link the resulting object file with libf2c:
3*bf2c3715SXin Li on Microsoft Windows system, link with libf2c.lib;
4*bf2c3715SXin Li on Linux or Unix systems, link with .../path/to/libf2c.a -lm
5*bf2c3715SXin Li or, if you install libf2c.a in a standard place, with -lf2c -lm
6*bf2c3715SXin Li -- in that order, at the end of the command line, as in
7*bf2c3715SXin Li cc *.o -lf2c -lm
8*bf2c3715SXin Li Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
9*bf2c3715SXin Li
10*bf2c3715SXin Li http://www.netlib.org/f2c/libf2c.zip
11*bf2c3715SXin Li */
12*bf2c3715SXin Li
13*bf2c3715SXin Li #include "datatypes.h"
14*bf2c3715SXin Li
srotm_(integer * n,real * sx,integer * incx,real * sy,integer * incy,real * sparam)15*bf2c3715SXin Li /* Subroutine */ int srotm_(integer *n, real *sx, integer *incx, real *sy,
16*bf2c3715SXin Li integer *incy, real *sparam)
17*bf2c3715SXin Li {
18*bf2c3715SXin Li /* Initialized data */
19*bf2c3715SXin Li
20*bf2c3715SXin Li static real zero = 0.f;
21*bf2c3715SXin Li static real two = 2.f;
22*bf2c3715SXin Li
23*bf2c3715SXin Li /* System generated locals */
24*bf2c3715SXin Li integer i__1, i__2;
25*bf2c3715SXin Li
26*bf2c3715SXin Li /* Local variables */
27*bf2c3715SXin Li integer i__;
28*bf2c3715SXin Li real w, z__;
29*bf2c3715SXin Li integer kx, ky;
30*bf2c3715SXin Li real sh11, sh12, sh21, sh22, sflag;
31*bf2c3715SXin Li integer nsteps;
32*bf2c3715SXin Li
33*bf2c3715SXin Li /* .. Scalar Arguments .. */
34*bf2c3715SXin Li /* .. */
35*bf2c3715SXin Li /* .. Array Arguments .. */
36*bf2c3715SXin Li /* .. */
37*bf2c3715SXin Li
38*bf2c3715SXin Li /* Purpose */
39*bf2c3715SXin Li /* ======= */
40*bf2c3715SXin Li
41*bf2c3715SXin Li /* APPLY THE MODIFIED GIVENS TRANSFORMATION, H, TO THE 2 BY N MATRIX */
42*bf2c3715SXin Li
43*bf2c3715SXin Li /* (SX**T) , WHERE **T INDICATES TRANSPOSE. THE ELEMENTS OF SX ARE IN */
44*bf2c3715SXin Li /* (DX**T) */
45*bf2c3715SXin Li
46*bf2c3715SXin Li /* SX(LX+I*INCX), I = 0 TO N-1, WHERE LX = 1 IF INCX .GE. 0, ELSE */
47*bf2c3715SXin Li /* LX = (-INCX)*N, AND SIMILARLY FOR SY USING USING LY AND INCY. */
48*bf2c3715SXin Li /* WITH SPARAM(1)=SFLAG, H HAS ONE OF THE FOLLOWING FORMS.. */
49*bf2c3715SXin Li
50*bf2c3715SXin Li /* SFLAG=-1.E0 SFLAG=0.E0 SFLAG=1.E0 SFLAG=-2.E0 */
51*bf2c3715SXin Li
52*bf2c3715SXin Li /* (SH11 SH12) (1.E0 SH12) (SH11 1.E0) (1.E0 0.E0) */
53*bf2c3715SXin Li /* H=( ) ( ) ( ) ( ) */
54*bf2c3715SXin Li /* (SH21 SH22), (SH21 1.E0), (-1.E0 SH22), (0.E0 1.E0). */
55*bf2c3715SXin Li /* SEE SROTMG FOR A DESCRIPTION OF DATA STORAGE IN SPARAM. */
56*bf2c3715SXin Li
57*bf2c3715SXin Li
58*bf2c3715SXin Li /* Arguments */
59*bf2c3715SXin Li /* ========= */
60*bf2c3715SXin Li
61*bf2c3715SXin Li /* N (input) INTEGER */
62*bf2c3715SXin Li /* number of elements in input vector(s) */
63*bf2c3715SXin Li
64*bf2c3715SXin Li /* SX (input/output) REAL array, dimension N */
65*bf2c3715SXin Li /* double precision vector with N elements */
66*bf2c3715SXin Li
67*bf2c3715SXin Li /* INCX (input) INTEGER */
68*bf2c3715SXin Li /* storage spacing between elements of SX */
69*bf2c3715SXin Li
70*bf2c3715SXin Li /* SY (input/output) REAL array, dimension N */
71*bf2c3715SXin Li /* double precision vector with N elements */
72*bf2c3715SXin Li
73*bf2c3715SXin Li /* INCY (input) INTEGER */
74*bf2c3715SXin Li /* storage spacing between elements of SY */
75*bf2c3715SXin Li
76*bf2c3715SXin Li /* SPARAM (input/output) REAL array, dimension 5 */
77*bf2c3715SXin Li /* SPARAM(1)=SFLAG */
78*bf2c3715SXin Li /* SPARAM(2)=SH11 */
79*bf2c3715SXin Li /* SPARAM(3)=SH21 */
80*bf2c3715SXin Li /* SPARAM(4)=SH12 */
81*bf2c3715SXin Li /* SPARAM(5)=SH22 */
82*bf2c3715SXin Li
83*bf2c3715SXin Li /* ===================================================================== */
84*bf2c3715SXin Li
85*bf2c3715SXin Li /* .. Local Scalars .. */
86*bf2c3715SXin Li /* .. */
87*bf2c3715SXin Li /* .. Data statements .. */
88*bf2c3715SXin Li /* Parameter adjustments */
89*bf2c3715SXin Li --sparam;
90*bf2c3715SXin Li --sy;
91*bf2c3715SXin Li --sx;
92*bf2c3715SXin Li
93*bf2c3715SXin Li /* Function Body */
94*bf2c3715SXin Li /* .. */
95*bf2c3715SXin Li
96*bf2c3715SXin Li sflag = sparam[1];
97*bf2c3715SXin Li if (*n <= 0 || sflag + two == zero) {
98*bf2c3715SXin Li goto L140;
99*bf2c3715SXin Li }
100*bf2c3715SXin Li if (! (*incx == *incy && *incx > 0)) {
101*bf2c3715SXin Li goto L70;
102*bf2c3715SXin Li }
103*bf2c3715SXin Li
104*bf2c3715SXin Li nsteps = *n * *incx;
105*bf2c3715SXin Li if (sflag < 0.f) {
106*bf2c3715SXin Li goto L50;
107*bf2c3715SXin Li } else if (sflag == 0) {
108*bf2c3715SXin Li goto L10;
109*bf2c3715SXin Li } else {
110*bf2c3715SXin Li goto L30;
111*bf2c3715SXin Li }
112*bf2c3715SXin Li L10:
113*bf2c3715SXin Li sh12 = sparam[4];
114*bf2c3715SXin Li sh21 = sparam[3];
115*bf2c3715SXin Li i__1 = nsteps;
116*bf2c3715SXin Li i__2 = *incx;
117*bf2c3715SXin Li for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) {
118*bf2c3715SXin Li w = sx[i__];
119*bf2c3715SXin Li z__ = sy[i__];
120*bf2c3715SXin Li sx[i__] = w + z__ * sh12;
121*bf2c3715SXin Li sy[i__] = w * sh21 + z__;
122*bf2c3715SXin Li /* L20: */
123*bf2c3715SXin Li }
124*bf2c3715SXin Li goto L140;
125*bf2c3715SXin Li L30:
126*bf2c3715SXin Li sh11 = sparam[2];
127*bf2c3715SXin Li sh22 = sparam[5];
128*bf2c3715SXin Li i__2 = nsteps;
129*bf2c3715SXin Li i__1 = *incx;
130*bf2c3715SXin Li for (i__ = 1; i__1 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__1) {
131*bf2c3715SXin Li w = sx[i__];
132*bf2c3715SXin Li z__ = sy[i__];
133*bf2c3715SXin Li sx[i__] = w * sh11 + z__;
134*bf2c3715SXin Li sy[i__] = -w + sh22 * z__;
135*bf2c3715SXin Li /* L40: */
136*bf2c3715SXin Li }
137*bf2c3715SXin Li goto L140;
138*bf2c3715SXin Li L50:
139*bf2c3715SXin Li sh11 = sparam[2];
140*bf2c3715SXin Li sh12 = sparam[4];
141*bf2c3715SXin Li sh21 = sparam[3];
142*bf2c3715SXin Li sh22 = sparam[5];
143*bf2c3715SXin Li i__1 = nsteps;
144*bf2c3715SXin Li i__2 = *incx;
145*bf2c3715SXin Li for (i__ = 1; i__2 < 0 ? i__ >= i__1 : i__ <= i__1; i__ += i__2) {
146*bf2c3715SXin Li w = sx[i__];
147*bf2c3715SXin Li z__ = sy[i__];
148*bf2c3715SXin Li sx[i__] = w * sh11 + z__ * sh12;
149*bf2c3715SXin Li sy[i__] = w * sh21 + z__ * sh22;
150*bf2c3715SXin Li /* L60: */
151*bf2c3715SXin Li }
152*bf2c3715SXin Li goto L140;
153*bf2c3715SXin Li L70:
154*bf2c3715SXin Li kx = 1;
155*bf2c3715SXin Li ky = 1;
156*bf2c3715SXin Li if (*incx < 0) {
157*bf2c3715SXin Li kx = (1 - *n) * *incx + 1;
158*bf2c3715SXin Li }
159*bf2c3715SXin Li if (*incy < 0) {
160*bf2c3715SXin Li ky = (1 - *n) * *incy + 1;
161*bf2c3715SXin Li }
162*bf2c3715SXin Li
163*bf2c3715SXin Li if (sflag < 0.f) {
164*bf2c3715SXin Li goto L120;
165*bf2c3715SXin Li } else if (sflag == 0) {
166*bf2c3715SXin Li goto L80;
167*bf2c3715SXin Li } else {
168*bf2c3715SXin Li goto L100;
169*bf2c3715SXin Li }
170*bf2c3715SXin Li L80:
171*bf2c3715SXin Li sh12 = sparam[4];
172*bf2c3715SXin Li sh21 = sparam[3];
173*bf2c3715SXin Li i__2 = *n;
174*bf2c3715SXin Li for (i__ = 1; i__ <= i__2; ++i__) {
175*bf2c3715SXin Li w = sx[kx];
176*bf2c3715SXin Li z__ = sy[ky];
177*bf2c3715SXin Li sx[kx] = w + z__ * sh12;
178*bf2c3715SXin Li sy[ky] = w * sh21 + z__;
179*bf2c3715SXin Li kx += *incx;
180*bf2c3715SXin Li ky += *incy;
181*bf2c3715SXin Li /* L90: */
182*bf2c3715SXin Li }
183*bf2c3715SXin Li goto L140;
184*bf2c3715SXin Li L100:
185*bf2c3715SXin Li sh11 = sparam[2];
186*bf2c3715SXin Li sh22 = sparam[5];
187*bf2c3715SXin Li i__2 = *n;
188*bf2c3715SXin Li for (i__ = 1; i__ <= i__2; ++i__) {
189*bf2c3715SXin Li w = sx[kx];
190*bf2c3715SXin Li z__ = sy[ky];
191*bf2c3715SXin Li sx[kx] = w * sh11 + z__;
192*bf2c3715SXin Li sy[ky] = -w + sh22 * z__;
193*bf2c3715SXin Li kx += *incx;
194*bf2c3715SXin Li ky += *incy;
195*bf2c3715SXin Li /* L110: */
196*bf2c3715SXin Li }
197*bf2c3715SXin Li goto L140;
198*bf2c3715SXin Li L120:
199*bf2c3715SXin Li sh11 = sparam[2];
200*bf2c3715SXin Li sh12 = sparam[4];
201*bf2c3715SXin Li sh21 = sparam[3];
202*bf2c3715SXin Li sh22 = sparam[5];
203*bf2c3715SXin Li i__2 = *n;
204*bf2c3715SXin Li for (i__ = 1; i__ <= i__2; ++i__) {
205*bf2c3715SXin Li w = sx[kx];
206*bf2c3715SXin Li z__ = sy[ky];
207*bf2c3715SXin Li sx[kx] = w * sh11 + z__ * sh12;
208*bf2c3715SXin Li sy[ky] = w * sh21 + z__ * sh22;
209*bf2c3715SXin Li kx += *incx;
210*bf2c3715SXin Li ky += *incy;
211*bf2c3715SXin Li /* L130: */
212*bf2c3715SXin Li }
213*bf2c3715SXin Li L140:
214*bf2c3715SXin Li return 0;
215*bf2c3715SXin Li } /* srotm_ */
216*bf2c3715SXin Li
217