1*bf2c3715SXin Li /* srotmg.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
srotmg_(real * sd1,real * sd2,real * sx1,real * sy1,real * sparam)15*bf2c3715SXin Li /* Subroutine */ int srotmg_(real *sd1, real *sd2, real *sx1, real *sy1, real
16*bf2c3715SXin Li *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 one = 1.f;
22*bf2c3715SXin Li static real two = 2.f;
23*bf2c3715SXin Li static real gam = 4096.f;
24*bf2c3715SXin Li static real gamsq = 16777200.f;
25*bf2c3715SXin Li static real rgamsq = 5.96046e-8f;
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 real r__1;
35*bf2c3715SXin Li
36*bf2c3715SXin Li /* Local variables */
37*bf2c3715SXin Li real su, sp1, sp2, sq1, sq2, sh11, sh12, sh21, sh22;
38*bf2c3715SXin Li integer igo;
39*bf2c3715SXin Li real sflag, stemp;
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 (SQRT(SD1)*SX1,SQRT(SD2)* */
54*bf2c3715SXin Li /* SY2)**T. */
55*bf2c3715SXin Li /* WITH SPARAM(1)=SFLAG, H HAS ONE OF THE FOLLOWING FORMS.. */
56*bf2c3715SXin Li
57*bf2c3715SXin Li /* SFLAG=-1.E0 SFLAG=0.E0 SFLAG=1.E0 SFLAG=-2.E0 */
58*bf2c3715SXin Li
59*bf2c3715SXin Li /* (SH11 SH12) (1.E0 SH12) (SH11 1.E0) (1.E0 0.E0) */
60*bf2c3715SXin Li /* H=( ) ( ) ( ) ( ) */
61*bf2c3715SXin Li /* (SH21 SH22), (SH21 1.E0), (-1.E0 SH22), (0.E0 1.E0). */
62*bf2c3715SXin Li /* LOCATIONS 2-4 OF SPARAM CONTAIN SH11,SH21,SH12, AND SH22 */
63*bf2c3715SXin Li /* RESPECTIVELY. (VALUES OF 1.E0, -1.E0, OR 0.E0 IMPLIED BY THE */
64*bf2c3715SXin Li /* VALUE OF SPARAM(1) ARE NOT STORED IN SPARAM.) */
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 SD1 AND SD2. 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
75*bf2c3715SXin Li /* SD1 (input/output) REAL */
76*bf2c3715SXin Li
77*bf2c3715SXin Li /* SD2 (input/output) REAL */
78*bf2c3715SXin Li
79*bf2c3715SXin Li /* SX1 (input/output) REAL */
80*bf2c3715SXin Li
81*bf2c3715SXin Li /* SY1 (input) REAL */
82*bf2c3715SXin Li
83*bf2c3715SXin Li
84*bf2c3715SXin Li /* SPARAM (input/output) REAL array, dimension 5 */
85*bf2c3715SXin Li /* SPARAM(1)=SFLAG */
86*bf2c3715SXin Li /* SPARAM(2)=SH11 */
87*bf2c3715SXin Li /* SPARAM(3)=SH21 */
88*bf2c3715SXin Li /* SPARAM(4)=SH12 */
89*bf2c3715SXin Li /* SPARAM(5)=SH22 */
90*bf2c3715SXin Li
91*bf2c3715SXin Li /* ===================================================================== */
92*bf2c3715SXin Li
93*bf2c3715SXin Li /* .. Local Scalars .. */
94*bf2c3715SXin Li /* .. */
95*bf2c3715SXin Li /* .. Intrinsic Functions .. */
96*bf2c3715SXin Li /* .. */
97*bf2c3715SXin Li /* .. Data statements .. */
98*bf2c3715SXin Li
99*bf2c3715SXin Li /* Parameter adjustments */
100*bf2c3715SXin Li --sparam;
101*bf2c3715SXin Li
102*bf2c3715SXin Li /* Function Body */
103*bf2c3715SXin Li /* .. */
104*bf2c3715SXin Li if (! (*sd1 < zero)) {
105*bf2c3715SXin Li goto L10;
106*bf2c3715SXin Li }
107*bf2c3715SXin Li /* GO ZERO-H-D-AND-SX1.. */
108*bf2c3715SXin Li goto L60;
109*bf2c3715SXin Li L10:
110*bf2c3715SXin Li /* CASE-SD1-NONNEGATIVE */
111*bf2c3715SXin Li sp2 = *sd2 * *sy1;
112*bf2c3715SXin Li if (! (sp2 == zero)) {
113*bf2c3715SXin Li goto L20;
114*bf2c3715SXin Li }
115*bf2c3715SXin Li sflag = -two;
116*bf2c3715SXin Li goto L260;
117*bf2c3715SXin Li /* REGULAR-CASE.. */
118*bf2c3715SXin Li L20:
119*bf2c3715SXin Li sp1 = *sd1 * *sx1;
120*bf2c3715SXin Li sq2 = sp2 * *sy1;
121*bf2c3715SXin Li sq1 = sp1 * *sx1;
122*bf2c3715SXin Li
123*bf2c3715SXin Li if (! (dabs(sq1) > dabs(sq2))) {
124*bf2c3715SXin Li goto L40;
125*bf2c3715SXin Li }
126*bf2c3715SXin Li sh21 = -(*sy1) / *sx1;
127*bf2c3715SXin Li sh12 = sp2 / sp1;
128*bf2c3715SXin Li
129*bf2c3715SXin Li su = one - sh12 * sh21;
130*bf2c3715SXin Li
131*bf2c3715SXin Li if (! (su <= zero)) {
132*bf2c3715SXin Li goto L30;
133*bf2c3715SXin Li }
134*bf2c3715SXin Li /* GO ZERO-H-D-AND-SX1.. */
135*bf2c3715SXin Li goto L60;
136*bf2c3715SXin Li L30:
137*bf2c3715SXin Li sflag = zero;
138*bf2c3715SXin Li *sd1 /= su;
139*bf2c3715SXin Li *sd2 /= su;
140*bf2c3715SXin Li *sx1 *= su;
141*bf2c3715SXin Li /* GO SCALE-CHECK.. */
142*bf2c3715SXin Li goto L100;
143*bf2c3715SXin Li L40:
144*bf2c3715SXin Li if (! (sq2 < zero)) {
145*bf2c3715SXin Li goto L50;
146*bf2c3715SXin Li }
147*bf2c3715SXin Li /* GO ZERO-H-D-AND-SX1.. */
148*bf2c3715SXin Li goto L60;
149*bf2c3715SXin Li L50:
150*bf2c3715SXin Li sflag = one;
151*bf2c3715SXin Li sh11 = sp1 / sp2;
152*bf2c3715SXin Li sh22 = *sx1 / *sy1;
153*bf2c3715SXin Li su = one + sh11 * sh22;
154*bf2c3715SXin Li stemp = *sd2 / su;
155*bf2c3715SXin Li *sd2 = *sd1 / su;
156*bf2c3715SXin Li *sd1 = stemp;
157*bf2c3715SXin Li *sx1 = *sy1 * su;
158*bf2c3715SXin Li /* GO SCALE-CHECK */
159*bf2c3715SXin Li goto L100;
160*bf2c3715SXin Li /* PROCEDURE..ZERO-H-D-AND-SX1.. */
161*bf2c3715SXin Li L60:
162*bf2c3715SXin Li sflag = -one;
163*bf2c3715SXin Li sh11 = zero;
164*bf2c3715SXin Li sh12 = zero;
165*bf2c3715SXin Li sh21 = zero;
166*bf2c3715SXin Li sh22 = zero;
167*bf2c3715SXin Li
168*bf2c3715SXin Li *sd1 = zero;
169*bf2c3715SXin Li *sd2 = zero;
170*bf2c3715SXin Li *sx1 = zero;
171*bf2c3715SXin Li /* RETURN.. */
172*bf2c3715SXin Li goto L220;
173*bf2c3715SXin Li /* PROCEDURE..FIX-H.. */
174*bf2c3715SXin Li L70:
175*bf2c3715SXin Li if (! (sflag >= zero)) {
176*bf2c3715SXin Li goto L90;
177*bf2c3715SXin Li }
178*bf2c3715SXin Li
179*bf2c3715SXin Li if (! (sflag == zero)) {
180*bf2c3715SXin Li goto L80;
181*bf2c3715SXin Li }
182*bf2c3715SXin Li sh11 = one;
183*bf2c3715SXin Li sh22 = one;
184*bf2c3715SXin Li sflag = -one;
185*bf2c3715SXin Li goto L90;
186*bf2c3715SXin Li L80:
187*bf2c3715SXin Li sh21 = -one;
188*bf2c3715SXin Li sh12 = one;
189*bf2c3715SXin Li sflag = -one;
190*bf2c3715SXin Li L90:
191*bf2c3715SXin Li switch (igo) {
192*bf2c3715SXin Li case 0: goto L120;
193*bf2c3715SXin Li case 1: goto L150;
194*bf2c3715SXin Li case 2: goto L180;
195*bf2c3715SXin Li case 3: goto L210;
196*bf2c3715SXin Li }
197*bf2c3715SXin Li /* PROCEDURE..SCALE-CHECK */
198*bf2c3715SXin Li L100:
199*bf2c3715SXin Li L110:
200*bf2c3715SXin Li if (! (*sd1 <= rgamsq)) {
201*bf2c3715SXin Li goto L130;
202*bf2c3715SXin Li }
203*bf2c3715SXin Li if (*sd1 == zero) {
204*bf2c3715SXin Li goto L160;
205*bf2c3715SXin Li }
206*bf2c3715SXin Li igo = 0;
207*bf2c3715SXin Li igo_fmt = fmt_120;
208*bf2c3715SXin Li /* FIX-H.. */
209*bf2c3715SXin Li goto L70;
210*bf2c3715SXin Li L120:
211*bf2c3715SXin Li /* Computing 2nd power */
212*bf2c3715SXin Li r__1 = gam;
213*bf2c3715SXin Li *sd1 *= r__1 * r__1;
214*bf2c3715SXin Li *sx1 /= gam;
215*bf2c3715SXin Li sh11 /= gam;
216*bf2c3715SXin Li sh12 /= gam;
217*bf2c3715SXin Li goto L110;
218*bf2c3715SXin Li L130:
219*bf2c3715SXin Li L140:
220*bf2c3715SXin Li if (! (*sd1 >= gamsq)) {
221*bf2c3715SXin Li goto L160;
222*bf2c3715SXin Li }
223*bf2c3715SXin Li igo = 1;
224*bf2c3715SXin Li igo_fmt = fmt_150;
225*bf2c3715SXin Li /* FIX-H.. */
226*bf2c3715SXin Li goto L70;
227*bf2c3715SXin Li L150:
228*bf2c3715SXin Li /* Computing 2nd power */
229*bf2c3715SXin Li r__1 = gam;
230*bf2c3715SXin Li *sd1 /= r__1 * r__1;
231*bf2c3715SXin Li *sx1 *= gam;
232*bf2c3715SXin Li sh11 *= gam;
233*bf2c3715SXin Li sh12 *= gam;
234*bf2c3715SXin Li goto L140;
235*bf2c3715SXin Li L160:
236*bf2c3715SXin Li L170:
237*bf2c3715SXin Li if (! (dabs(*sd2) <= rgamsq)) {
238*bf2c3715SXin Li goto L190;
239*bf2c3715SXin Li }
240*bf2c3715SXin Li if (*sd2 == zero) {
241*bf2c3715SXin Li goto L220;
242*bf2c3715SXin Li }
243*bf2c3715SXin Li igo = 2;
244*bf2c3715SXin Li igo_fmt = fmt_180;
245*bf2c3715SXin Li /* FIX-H.. */
246*bf2c3715SXin Li goto L70;
247*bf2c3715SXin Li L180:
248*bf2c3715SXin Li /* Computing 2nd power */
249*bf2c3715SXin Li r__1 = gam;
250*bf2c3715SXin Li *sd2 *= r__1 * r__1;
251*bf2c3715SXin Li sh21 /= gam;
252*bf2c3715SXin Li sh22 /= gam;
253*bf2c3715SXin Li goto L170;
254*bf2c3715SXin Li L190:
255*bf2c3715SXin Li L200:
256*bf2c3715SXin Li if (! (dabs(*sd2) >= gamsq)) {
257*bf2c3715SXin Li goto L220;
258*bf2c3715SXin Li }
259*bf2c3715SXin Li igo = 3;
260*bf2c3715SXin Li igo_fmt = fmt_210;
261*bf2c3715SXin Li /* FIX-H.. */
262*bf2c3715SXin Li goto L70;
263*bf2c3715SXin Li L210:
264*bf2c3715SXin Li /* Computing 2nd power */
265*bf2c3715SXin Li r__1 = gam;
266*bf2c3715SXin Li *sd2 /= r__1 * r__1;
267*bf2c3715SXin Li sh21 *= gam;
268*bf2c3715SXin Li sh22 *= gam;
269*bf2c3715SXin Li goto L200;
270*bf2c3715SXin Li L220:
271*bf2c3715SXin Li if (sflag < 0.f) {
272*bf2c3715SXin Li goto L250;
273*bf2c3715SXin Li } else if (sflag == 0) {
274*bf2c3715SXin Li goto L230;
275*bf2c3715SXin Li } else {
276*bf2c3715SXin Li goto L240;
277*bf2c3715SXin Li }
278*bf2c3715SXin Li L230:
279*bf2c3715SXin Li sparam[3] = sh21;
280*bf2c3715SXin Li sparam[4] = sh12;
281*bf2c3715SXin Li goto L260;
282*bf2c3715SXin Li L240:
283*bf2c3715SXin Li sparam[2] = sh11;
284*bf2c3715SXin Li sparam[5] = sh22;
285*bf2c3715SXin Li goto L260;
286*bf2c3715SXin Li L250:
287*bf2c3715SXin Li sparam[2] = sh11;
288*bf2c3715SXin Li sparam[3] = sh21;
289*bf2c3715SXin Li sparam[4] = sh12;
290*bf2c3715SXin Li sparam[5] = sh22;
291*bf2c3715SXin Li L260:
292*bf2c3715SXin Li sparam[1] = sflag;
293*bf2c3715SXin Li return 0;
294*bf2c3715SXin Li } /* srotmg_ */
295*bf2c3715SXin Li
296