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