xref: /aosp_15_r20/external/eigen/blas/f2c/drotmg.c (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
1*bf2c3715SXin Li /* drotmg.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 
drotmg_(doublereal * dd1,doublereal * dd2,doublereal * dx1,doublereal * dy1,doublereal * dparam)15*bf2c3715SXin Li /* Subroutine */ int drotmg_(doublereal *dd1, doublereal *dd2, doublereal *
16*bf2c3715SXin Li 	dx1, doublereal *dy1, doublereal *dparam)
17*bf2c3715SXin Li {
18*bf2c3715SXin Li     /* Initialized data */
19*bf2c3715SXin Li 
20*bf2c3715SXin Li     static doublereal zero = 0.;
21*bf2c3715SXin Li     static doublereal one = 1.;
22*bf2c3715SXin Li     static doublereal two = 2.;
23*bf2c3715SXin Li     static doublereal gam = 4096.;
24*bf2c3715SXin Li     static doublereal gamsq = 16777216.;
25*bf2c3715SXin Li     static doublereal rgamsq = 5.9604645e-8;
26*bf2c3715SXin Li 
27*bf2c3715SXin Li     /* Format strings */
28*bf2c3715SXin Li     static char fmt_120[] = "";
29*bf2c3715SXin Li     static char fmt_150[] = "";
30*bf2c3715SXin Li     static char fmt_180[] = "";
31*bf2c3715SXin Li     static char fmt_210[] = "";
32*bf2c3715SXin Li 
33*bf2c3715SXin Li     /* System generated locals */
34*bf2c3715SXin Li     doublereal d__1;
35*bf2c3715SXin Li 
36*bf2c3715SXin Li     /* Local variables */
37*bf2c3715SXin Li     doublereal du, dp1, dp2, dq1, dq2, dh11, dh12, dh21, dh22;
38*bf2c3715SXin Li     integer igo;
39*bf2c3715SXin Li     doublereal dflag, dtemp;
40*bf2c3715SXin Li 
41*bf2c3715SXin Li     /* Assigned format variables */
42*bf2c3715SXin Li     static char *igo_fmt;
43*bf2c3715SXin Li 
44*bf2c3715SXin Li /*     .. Scalar Arguments .. */
45*bf2c3715SXin Li /*     .. */
46*bf2c3715SXin Li /*     .. Array Arguments .. */
47*bf2c3715SXin Li /*     .. */
48*bf2c3715SXin Li 
49*bf2c3715SXin Li /*  Purpose */
50*bf2c3715SXin Li /*  ======= */
51*bf2c3715SXin Li 
52*bf2c3715SXin Li /*     CONSTRUCT THE MODIFIED GIVENS TRANSFORMATION MATRIX H WHICH ZEROS */
53*bf2c3715SXin Li /*     THE SECOND COMPONENT OF THE 2-VECTOR  (DSQRT(DD1)*DX1,DSQRT(DD2)* */
54*bf2c3715SXin Li /*     DY2)**T. */
55*bf2c3715SXin Li /*     WITH DPARAM(1)=DFLAG, H HAS ONE OF THE FOLLOWING FORMS.. */
56*bf2c3715SXin Li 
57*bf2c3715SXin Li /*     DFLAG=-1.D0     DFLAG=0.D0        DFLAG=1.D0     DFLAG=-2.D0 */
58*bf2c3715SXin Li 
59*bf2c3715SXin Li /*       (DH11  DH12)    (1.D0  DH12)    (DH11  1.D0)    (1.D0  0.D0) */
60*bf2c3715SXin Li /*     H=(          )    (          )    (          )    (          ) */
61*bf2c3715SXin Li /*       (DH21  DH22),   (DH21  1.D0),   (-1.D0 DH22),   (0.D0  1.D0). */
62*bf2c3715SXin Li /*     LOCATIONS 2-4 OF DPARAM CONTAIN DH11, DH21, DH12, AND DH22 */
63*bf2c3715SXin Li /*     RESPECTIVELY. (VALUES OF 1.D0, -1.D0, OR 0.D0 IMPLIED BY THE */
64*bf2c3715SXin Li /*     VALUE OF DPARAM(1) ARE NOT STORED IN DPARAM.) */
65*bf2c3715SXin Li 
66*bf2c3715SXin Li /*     THE VALUES OF GAMSQ AND RGAMSQ SET IN THE DATA STATEMENT MAY BE */
67*bf2c3715SXin Li /*     INEXACT.  THIS IS OK AS THEY ARE ONLY USED FOR TESTING THE SIZE */
68*bf2c3715SXin Li /*     OF DD1 AND DD2.  ALL ACTUAL SCALING OF DATA IS DONE USING GAM. */
69*bf2c3715SXin Li 
70*bf2c3715SXin Li 
71*bf2c3715SXin Li /*  Arguments */
72*bf2c3715SXin Li /*  ========= */
73*bf2c3715SXin Li 
74*bf2c3715SXin Li /*  DD1    (input/output) DOUBLE PRECISION */
75*bf2c3715SXin Li 
76*bf2c3715SXin Li /*  DD2    (input/output) DOUBLE PRECISION */
77*bf2c3715SXin Li 
78*bf2c3715SXin Li /*  DX1    (input/output) DOUBLE PRECISION */
79*bf2c3715SXin Li 
80*bf2c3715SXin Li /*  DY1    (input) DOUBLE PRECISION */
81*bf2c3715SXin Li 
82*bf2c3715SXin Li /*  DPARAM (input/output)  DOUBLE PRECISION array, dimension 5 */
83*bf2c3715SXin Li /*     DPARAM(1)=DFLAG */
84*bf2c3715SXin Li /*     DPARAM(2)=DH11 */
85*bf2c3715SXin Li /*     DPARAM(3)=DH21 */
86*bf2c3715SXin Li /*     DPARAM(4)=DH12 */
87*bf2c3715SXin Li /*     DPARAM(5)=DH22 */
88*bf2c3715SXin Li 
89*bf2c3715SXin Li /*  ===================================================================== */
90*bf2c3715SXin Li 
91*bf2c3715SXin Li /*     .. Local Scalars .. */
92*bf2c3715SXin Li /*     .. */
93*bf2c3715SXin Li /*     .. Intrinsic Functions .. */
94*bf2c3715SXin Li /*     .. */
95*bf2c3715SXin Li /*     .. Data statements .. */
96*bf2c3715SXin Li 
97*bf2c3715SXin Li     /* Parameter adjustments */
98*bf2c3715SXin Li     --dparam;
99*bf2c3715SXin Li 
100*bf2c3715SXin Li     /* Function Body */
101*bf2c3715SXin Li /*     .. */
102*bf2c3715SXin Li     if (! (*dd1 < zero)) {
103*bf2c3715SXin Li 	goto L10;
104*bf2c3715SXin Li     }
105*bf2c3715SXin Li /*       GO ZERO-H-D-AND-DX1.. */
106*bf2c3715SXin Li     goto L60;
107*bf2c3715SXin Li L10:
108*bf2c3715SXin Li /*     CASE-DD1-NONNEGATIVE */
109*bf2c3715SXin Li     dp2 = *dd2 * *dy1;
110*bf2c3715SXin Li     if (! (dp2 == zero)) {
111*bf2c3715SXin Li 	goto L20;
112*bf2c3715SXin Li     }
113*bf2c3715SXin Li     dflag = -two;
114*bf2c3715SXin Li     goto L260;
115*bf2c3715SXin Li /*     REGULAR-CASE.. */
116*bf2c3715SXin Li L20:
117*bf2c3715SXin Li     dp1 = *dd1 * *dx1;
118*bf2c3715SXin Li     dq2 = dp2 * *dy1;
119*bf2c3715SXin Li     dq1 = dp1 * *dx1;
120*bf2c3715SXin Li 
121*bf2c3715SXin Li     if (! (abs(dq1) > abs(dq2))) {
122*bf2c3715SXin Li 	goto L40;
123*bf2c3715SXin Li     }
124*bf2c3715SXin Li     dh21 = -(*dy1) / *dx1;
125*bf2c3715SXin Li     dh12 = dp2 / dp1;
126*bf2c3715SXin Li 
127*bf2c3715SXin Li     du = one - dh12 * dh21;
128*bf2c3715SXin Li 
129*bf2c3715SXin Li     if (! (du <= zero)) {
130*bf2c3715SXin Li 	goto L30;
131*bf2c3715SXin Li     }
132*bf2c3715SXin Li /*         GO ZERO-H-D-AND-DX1.. */
133*bf2c3715SXin Li     goto L60;
134*bf2c3715SXin Li L30:
135*bf2c3715SXin Li     dflag = zero;
136*bf2c3715SXin Li     *dd1 /= du;
137*bf2c3715SXin Li     *dd2 /= du;
138*bf2c3715SXin Li     *dx1 *= du;
139*bf2c3715SXin Li /*         GO SCALE-CHECK.. */
140*bf2c3715SXin Li     goto L100;
141*bf2c3715SXin Li L40:
142*bf2c3715SXin Li     if (! (dq2 < zero)) {
143*bf2c3715SXin Li 	goto L50;
144*bf2c3715SXin Li     }
145*bf2c3715SXin Li /*         GO ZERO-H-D-AND-DX1.. */
146*bf2c3715SXin Li     goto L60;
147*bf2c3715SXin Li L50:
148*bf2c3715SXin Li     dflag = one;
149*bf2c3715SXin Li     dh11 = dp1 / dp2;
150*bf2c3715SXin Li     dh22 = *dx1 / *dy1;
151*bf2c3715SXin Li     du = one + dh11 * dh22;
152*bf2c3715SXin Li     dtemp = *dd2 / du;
153*bf2c3715SXin Li     *dd2 = *dd1 / du;
154*bf2c3715SXin Li     *dd1 = dtemp;
155*bf2c3715SXin Li     *dx1 = *dy1 * du;
156*bf2c3715SXin Li /*         GO SCALE-CHECK */
157*bf2c3715SXin Li     goto L100;
158*bf2c3715SXin Li /*     PROCEDURE..ZERO-H-D-AND-DX1.. */
159*bf2c3715SXin Li L60:
160*bf2c3715SXin Li     dflag = -one;
161*bf2c3715SXin Li     dh11 = zero;
162*bf2c3715SXin Li     dh12 = zero;
163*bf2c3715SXin Li     dh21 = zero;
164*bf2c3715SXin Li     dh22 = zero;
165*bf2c3715SXin Li 
166*bf2c3715SXin Li     *dd1 = zero;
167*bf2c3715SXin Li     *dd2 = zero;
168*bf2c3715SXin Li     *dx1 = zero;
169*bf2c3715SXin Li /*         RETURN.. */
170*bf2c3715SXin Li     goto L220;
171*bf2c3715SXin Li /*     PROCEDURE..FIX-H.. */
172*bf2c3715SXin Li L70:
173*bf2c3715SXin Li     if (! (dflag >= zero)) {
174*bf2c3715SXin Li 	goto L90;
175*bf2c3715SXin Li     }
176*bf2c3715SXin Li 
177*bf2c3715SXin Li     if (! (dflag == zero)) {
178*bf2c3715SXin Li 	goto L80;
179*bf2c3715SXin Li     }
180*bf2c3715SXin Li     dh11 = one;
181*bf2c3715SXin Li     dh22 = one;
182*bf2c3715SXin Li     dflag = -one;
183*bf2c3715SXin Li     goto L90;
184*bf2c3715SXin Li L80:
185*bf2c3715SXin Li     dh21 = -one;
186*bf2c3715SXin Li     dh12 = one;
187*bf2c3715SXin Li     dflag = -one;
188*bf2c3715SXin Li L90:
189*bf2c3715SXin Li     switch (igo) {
190*bf2c3715SXin Li 	case 0: goto L120;
191*bf2c3715SXin Li 	case 1: goto L150;
192*bf2c3715SXin Li 	case 2: goto L180;
193*bf2c3715SXin Li 	case 3: goto L210;
194*bf2c3715SXin Li     }
195*bf2c3715SXin Li /*     PROCEDURE..SCALE-CHECK */
196*bf2c3715SXin Li L100:
197*bf2c3715SXin Li L110:
198*bf2c3715SXin Li     if (! (*dd1 <= rgamsq)) {
199*bf2c3715SXin Li 	goto L130;
200*bf2c3715SXin Li     }
201*bf2c3715SXin Li     if (*dd1 == zero) {
202*bf2c3715SXin Li 	goto L160;
203*bf2c3715SXin Li     }
204*bf2c3715SXin Li     igo = 0;
205*bf2c3715SXin Li     igo_fmt = fmt_120;
206*bf2c3715SXin Li /*              FIX-H.. */
207*bf2c3715SXin Li     goto L70;
208*bf2c3715SXin Li L120:
209*bf2c3715SXin Li /* Computing 2nd power */
210*bf2c3715SXin Li     d__1 = gam;
211*bf2c3715SXin Li     *dd1 *= d__1 * d__1;
212*bf2c3715SXin Li     *dx1 /= gam;
213*bf2c3715SXin Li     dh11 /= gam;
214*bf2c3715SXin Li     dh12 /= gam;
215*bf2c3715SXin Li     goto L110;
216*bf2c3715SXin Li L130:
217*bf2c3715SXin Li L140:
218*bf2c3715SXin Li     if (! (*dd1 >= gamsq)) {
219*bf2c3715SXin Li 	goto L160;
220*bf2c3715SXin Li     }
221*bf2c3715SXin Li     igo = 1;
222*bf2c3715SXin Li     igo_fmt = fmt_150;
223*bf2c3715SXin Li /*              FIX-H.. */
224*bf2c3715SXin Li     goto L70;
225*bf2c3715SXin Li L150:
226*bf2c3715SXin Li /* Computing 2nd power */
227*bf2c3715SXin Li     d__1 = gam;
228*bf2c3715SXin Li     *dd1 /= d__1 * d__1;
229*bf2c3715SXin Li     *dx1 *= gam;
230*bf2c3715SXin Li     dh11 *= gam;
231*bf2c3715SXin Li     dh12 *= gam;
232*bf2c3715SXin Li     goto L140;
233*bf2c3715SXin Li L160:
234*bf2c3715SXin Li L170:
235*bf2c3715SXin Li     if (! (abs(*dd2) <= rgamsq)) {
236*bf2c3715SXin Li 	goto L190;
237*bf2c3715SXin Li     }
238*bf2c3715SXin Li     if (*dd2 == zero) {
239*bf2c3715SXin Li 	goto L220;
240*bf2c3715SXin Li     }
241*bf2c3715SXin Li     igo = 2;
242*bf2c3715SXin Li     igo_fmt = fmt_180;
243*bf2c3715SXin Li /*              FIX-H.. */
244*bf2c3715SXin Li     goto L70;
245*bf2c3715SXin Li L180:
246*bf2c3715SXin Li /* Computing 2nd power */
247*bf2c3715SXin Li     d__1 = gam;
248*bf2c3715SXin Li     *dd2 *= d__1 * d__1;
249*bf2c3715SXin Li     dh21 /= gam;
250*bf2c3715SXin Li     dh22 /= gam;
251*bf2c3715SXin Li     goto L170;
252*bf2c3715SXin Li L190:
253*bf2c3715SXin Li L200:
254*bf2c3715SXin Li     if (! (abs(*dd2) >= gamsq)) {
255*bf2c3715SXin Li 	goto L220;
256*bf2c3715SXin Li     }
257*bf2c3715SXin Li     igo = 3;
258*bf2c3715SXin Li     igo_fmt = fmt_210;
259*bf2c3715SXin Li /*              FIX-H.. */
260*bf2c3715SXin Li     goto L70;
261*bf2c3715SXin Li L210:
262*bf2c3715SXin Li /* Computing 2nd power */
263*bf2c3715SXin Li     d__1 = gam;
264*bf2c3715SXin Li     *dd2 /= d__1 * d__1;
265*bf2c3715SXin Li     dh21 *= gam;
266*bf2c3715SXin Li     dh22 *= gam;
267*bf2c3715SXin Li     goto L200;
268*bf2c3715SXin Li L220:
269*bf2c3715SXin Li     if (dflag < 0.) {
270*bf2c3715SXin Li 	goto L250;
271*bf2c3715SXin Li     } else if (dflag == 0) {
272*bf2c3715SXin Li 	goto L230;
273*bf2c3715SXin Li     } else {
274*bf2c3715SXin Li 	goto L240;
275*bf2c3715SXin Li     }
276*bf2c3715SXin Li L230:
277*bf2c3715SXin Li     dparam[3] = dh21;
278*bf2c3715SXin Li     dparam[4] = dh12;
279*bf2c3715SXin Li     goto L260;
280*bf2c3715SXin Li L240:
281*bf2c3715SXin Li     dparam[2] = dh11;
282*bf2c3715SXin Li     dparam[5] = dh22;
283*bf2c3715SXin Li     goto L260;
284*bf2c3715SXin Li L250:
285*bf2c3715SXin Li     dparam[2] = dh11;
286*bf2c3715SXin Li     dparam[3] = dh21;
287*bf2c3715SXin Li     dparam[4] = dh12;
288*bf2c3715SXin Li     dparam[5] = dh22;
289*bf2c3715SXin Li L260:
290*bf2c3715SXin Li     dparam[1] = dflag;
291*bf2c3715SXin Li     return 0;
292*bf2c3715SXin Li } /* drotmg_ */
293*bf2c3715SXin Li 
294