123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- /* drotmg.f -- translated by f2c (version 20061008).
- You must link the resulting object file with libf2c:
- on Microsoft Windows system, link with libf2c.lib;
- on Linux or Unix systems, link with .../path/to/libf2c.a -lm
- or, if you install libf2c.a in a standard place, with -lf2c -lm
- -- in that order, at the end of the command line, as in
- cc *.o -lf2c -lm
- Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
- http://www.netlib.org/f2c/libf2c.zip
- */
- #include "f2c.h"
- #include "blaswrap.h"
- /* Subroutine */ int drotmg_(doublereal *dd1, doublereal *dd2, doublereal *
- dx1, doublereal *dy1, doublereal *dparam)
- {
- /* Initialized data */
- static doublereal zero = 0.;
- static doublereal one = 1.;
- static doublereal two = 2.;
- static doublereal gam = 4096.;
- static doublereal gamsq = 16777216.;
- static doublereal rgamsq = 5.9604645e-8;
- /* Format strings */
- static char fmt_120[] = "";
- static char fmt_150[] = "";
- static char fmt_180[] = "";
- static char fmt_210[] = "";
- /* System generated locals */
- doublereal d__1;
- /* Local variables */
- doublereal du, dp1, dp2, dq1, dq2, dh11, dh12, dh21, dh22;
- integer igo;
- doublereal dflag, dtemp;
- /* Assigned format variables */
- static char *igo_fmt;
- /* .. Scalar Arguments .. */
- /* .. */
- /* .. Array Arguments .. */
- /* .. */
- /* Purpose */
- /* ======= */
- /* CONSTRUCT THE MODIFIED GIVENS TRANSFORMATION MATRIX H WHICH ZEROS */
- /* THE SECOND COMPONENT OF THE 2-VECTOR (DSQRT(DD1)*DX1,DSQRT(DD2)* */
- /* DY2)**T. */
- /* WITH DPARAM(1)=DFLAG, H HAS ONE OF THE FOLLOWING FORMS.. */
- /* DFLAG=-1.D0 DFLAG=0.D0 DFLAG=1.D0 DFLAG=-2.D0 */
- /* (DH11 DH12) (1.D0 DH12) (DH11 1.D0) (1.D0 0.D0) */
- /* H=( ) ( ) ( ) ( ) */
- /* (DH21 DH22), (DH21 1.D0), (-1.D0 DH22), (0.D0 1.D0). */
- /* LOCATIONS 2-4 OF DPARAM CONTAIN DH11, DH21, DH12, AND DH22 */
- /* RESPECTIVELY. (VALUES OF 1.D0, -1.D0, OR 0.D0 IMPLIED BY THE */
- /* VALUE OF DPARAM(1) ARE NOT STORED IN DPARAM.) */
- /* THE VALUES OF GAMSQ AND RGAMSQ SET IN THE DATA STATEMENT MAY BE */
- /* INEXACT. THIS IS OK AS THEY ARE ONLY USED FOR TESTING THE SIZE */
- /* OF DD1 AND DD2. ALL ACTUAL SCALING OF DATA IS DONE USING GAM. */
- /* Arguments */
- /* ========= */
- /* DD1 (input/output) DOUBLE PRECISION */
- /* DD2 (input/output) DOUBLE PRECISION */
- /* DX1 (input/output) DOUBLE PRECISION */
- /* DY1 (input) DOUBLE PRECISION */
- /* DPARAM (input/output) DOUBLE PRECISION array, dimension 5 */
- /* DPARAM(1)=DFLAG */
- /* DPARAM(2)=DH11 */
- /* DPARAM(3)=DH21 */
- /* DPARAM(4)=DH12 */
- /* DPARAM(5)=DH22 */
- /* ===================================================================== */
- /* .. Local Scalars .. */
- /* .. */
- /* .. Intrinsic Functions .. */
- /* .. */
- /* .. Data statements .. */
- /* Parameter adjustments */
- --dparam;
- /* Function Body */
- /* .. */
- if (! (*dd1 < zero)) {
- goto L10;
- }
- /* GO ZERO-H-D-AND-DX1.. */
- goto L60;
- L10:
- /* CASE-DD1-NONNEGATIVE */
- dp2 = *dd2 * *dy1;
- if (! (dp2 == zero)) {
- goto L20;
- }
- dflag = -two;
- goto L260;
- /* REGULAR-CASE.. */
- L20:
- dp1 = *dd1 * *dx1;
- dq2 = dp2 * *dy1;
- dq1 = dp1 * *dx1;
- if (! (abs(dq1) > abs(dq2))) {
- goto L40;
- }
- dh21 = -(*dy1) / *dx1;
- dh12 = dp2 / dp1;
- du = one - dh12 * dh21;
- if (! (du <= zero)) {
- goto L30;
- }
- /* GO ZERO-H-D-AND-DX1.. */
- goto L60;
- L30:
- dflag = zero;
- *dd1 /= du;
- *dd2 /= du;
- *dx1 *= du;
- /* GO SCALE-CHECK.. */
- goto L100;
- L40:
- if (! (dq2 < zero)) {
- goto L50;
- }
- /* GO ZERO-H-D-AND-DX1.. */
- goto L60;
- L50:
- dflag = one;
- dh11 = dp1 / dp2;
- dh22 = *dx1 / *dy1;
- du = one + dh11 * dh22;
- dtemp = *dd2 / du;
- *dd2 = *dd1 / du;
- *dd1 = dtemp;
- *dx1 = *dy1 * du;
- /* GO SCALE-CHECK */
- goto L100;
- /* PROCEDURE..ZERO-H-D-AND-DX1.. */
- L60:
- dflag = -one;
- dh11 = zero;
- dh12 = zero;
- dh21 = zero;
- dh22 = zero;
- *dd1 = zero;
- *dd2 = zero;
- *dx1 = zero;
- /* RETURN.. */
- goto L220;
- /* PROCEDURE..FIX-H.. */
- L70:
- if (! (dflag >= zero)) {
- goto L90;
- }
- if (! (dflag == zero)) {
- goto L80;
- }
- dh11 = one;
- dh22 = one;
- dflag = -one;
- goto L90;
- L80:
- dh21 = -one;
- dh12 = one;
- dflag = -one;
- L90:
- switch (igo) {
- case 0: goto L120;
- case 1: goto L150;
- case 2: goto L180;
- case 3: goto L210;
- }
- /* PROCEDURE..SCALE-CHECK */
- L100:
- L110:
- if (! (*dd1 <= rgamsq)) {
- goto L130;
- }
- if (*dd1 == zero) {
- goto L160;
- }
- igo = 0;
- igo_fmt = fmt_120;
- /* FIX-H.. */
- goto L70;
- L120:
- /* Computing 2nd power */
- d__1 = gam;
- *dd1 *= d__1 * d__1;
- *dx1 /= gam;
- dh11 /= gam;
- dh12 /= gam;
- goto L110;
- L130:
- L140:
- if (! (*dd1 >= gamsq)) {
- goto L160;
- }
- igo = 1;
- igo_fmt = fmt_150;
- /* FIX-H.. */
- goto L70;
- L150:
- /* Computing 2nd power */
- d__1 = gam;
- *dd1 /= d__1 * d__1;
- *dx1 *= gam;
- dh11 *= gam;
- dh12 *= gam;
- goto L140;
- L160:
- L170:
- if (! (abs(*dd2) <= rgamsq)) {
- goto L190;
- }
- if (*dd2 == zero) {
- goto L220;
- }
- igo = 2;
- igo_fmt = fmt_180;
- /* FIX-H.. */
- goto L70;
- L180:
- /* Computing 2nd power */
- d__1 = gam;
- *dd2 *= d__1 * d__1;
- dh21 /= gam;
- dh22 /= gam;
- goto L170;
- L190:
- L200:
- if (! (abs(*dd2) >= gamsq)) {
- goto L220;
- }
- igo = 3;
- igo_fmt = fmt_210;
- /* FIX-H.. */
- goto L70;
- L210:
- /* Computing 2nd power */
- d__1 = gam;
- *dd2 /= d__1 * d__1;
- dh21 *= gam;
- dh22 *= gam;
- goto L200;
- L220:
- if (dflag < 0.) {
- goto L250;
- } else if (dflag == 0) {
- goto L230;
- } else {
- goto L240;
- }
- L230:
- dparam[3] = dh21;
- dparam[4] = dh12;
- goto L260;
- L240:
- dparam[2] = dh11;
- dparam[5] = dh22;
- goto L260;
- L250:
- dparam[2] = dh11;
- dparam[3] = dh21;
- dparam[4] = dh12;
- dparam[5] = dh22;
- L260:
- dparam[1] = dflag;
- return 0;
- } /* drotmg_ */
|