Annotation of rpl/lapack/blas/drotmg.f, revision 1.14

1.9       bertrand    1: *> \brief \b DROTMG
1.1       bertrand    2: *
1.9       bertrand    3: *  =========== DOCUMENTATION ===========
1.1       bertrand    4: *
1.14    ! bertrand    5: * Online html documentation available at
        !             6: *            http://www.netlib.org/lapack/explore-html/
1.1       bertrand    7: *
1.9       bertrand    8: *  Definition:
                      9: *  ===========
                     10: *
                     11: *       SUBROUTINE DROTMG(DD1,DD2,DX1,DY1,DPARAM)
1.14    ! bertrand   12: *
1.9       bertrand   13: *       .. Scalar Arguments ..
                     14: *       DOUBLE PRECISION DD1,DD2,DX1,DY1
                     15: *       ..
                     16: *       .. Array Arguments ..
                     17: *       DOUBLE PRECISION DPARAM(5)
                     18: *       ..
1.14    ! bertrand   19: *
1.9       bertrand   20: *
                     21: *> \par Purpose:
                     22: *  =============
                     23: *>
                     24: *> \verbatim
                     25: *>
                     26: *>    CONSTRUCT THE MODIFIED GIVENS TRANSFORMATION MATRIX H WHICH ZEROS
                     27: *>    THE SECOND COMPONENT OF THE 2-VECTOR  (DSQRT(DD1)*DX1,DSQRT(DD2)*>    DY2)**T.
                     28: *>    WITH DPARAM(1)=DFLAG, H HAS ONE OF THE FOLLOWING FORMS..
                     29: *>
                     30: *>    DFLAG=-1.D0     DFLAG=0.D0        DFLAG=1.D0     DFLAG=-2.D0
                     31: *>
                     32: *>      (DH11  DH12)    (1.D0  DH12)    (DH11  1.D0)    (1.D0  0.D0)
                     33: *>    H=(          )    (          )    (          )    (          )
                     34: *>      (DH21  DH22),   (DH21  1.D0),   (-1.D0 DH22),   (0.D0  1.D0).
                     35: *>    LOCATIONS 2-4 OF DPARAM CONTAIN DH11, DH21, DH12, AND DH22
                     36: *>    RESPECTIVELY. (VALUES OF 1.D0, -1.D0, OR 0.D0 IMPLIED BY THE
                     37: *>    VALUE OF DPARAM(1) ARE NOT STORED IN DPARAM.)
                     38: *>
                     39: *>    THE VALUES OF GAMSQ AND RGAMSQ SET IN THE DATA STATEMENT MAY BE
                     40: *>    INEXACT.  THIS IS OK AS THEY ARE ONLY USED FOR TESTING THE SIZE
                     41: *>    OF DD1 AND DD2.  ALL ACTUAL SCALING OF DATA IS DONE USING GAM.
                     42: *>
                     43: *> \endverbatim
                     44: *
                     45: *  Arguments:
                     46: *  ==========
                     47: *
                     48: *> \param[in,out] DD1
                     49: *> \verbatim
                     50: *>          DD1 is DOUBLE PRECISION
                     51: *> \endverbatim
                     52: *>
                     53: *> \param[in,out] DD2
                     54: *> \verbatim
                     55: *>          DD2 is DOUBLE PRECISION
                     56: *> \endverbatim
                     57: *>
                     58: *> \param[in,out] DX1
                     59: *> \verbatim
                     60: *>          DX1 is DOUBLE PRECISION
                     61: *> \endverbatim
                     62: *>
                     63: *> \param[in] DY1
                     64: *> \verbatim
                     65: *>          DY1 is DOUBLE PRECISION
                     66: *> \endverbatim
                     67: *>
                     68: *> \param[in,out] DPARAM
                     69: *> \verbatim
                     70: *>          DPARAM is DOUBLE PRECISION array, dimension 5
                     71: *>     DPARAM(1)=DFLAG
                     72: *>     DPARAM(2)=DH11
                     73: *>     DPARAM(3)=DH21
                     74: *>     DPARAM(4)=DH12
                     75: *>     DPARAM(5)=DH22
                     76: *> \endverbatim
                     77: *
                     78: *  Authors:
                     79: *  ========
                     80: *
1.14    ! bertrand   81: *> \author Univ. of Tennessee
        !            82: *> \author Univ. of California Berkeley
        !            83: *> \author Univ. of Colorado Denver
        !            84: *> \author NAG Ltd.
1.1       bertrand   85: *
1.14    ! bertrand   86: *> \date December 2016
1.1       bertrand   87: *
1.9       bertrand   88: *> \ingroup double_blas_level1
1.1       bertrand   89: *
1.9       bertrand   90: *  =====================================================================
                     91:       SUBROUTINE DROTMG(DD1,DD2,DX1,DY1,DPARAM)
1.1       bertrand   92: *
1.14    ! bertrand   93: *  -- Reference BLAS level1 routine (version 3.7.0) --
1.9       bertrand   94: *  -- Reference BLAS is a software package provided by Univ. of Tennessee,    --
                     95: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
1.14    ! bertrand   96: *     December 2016
1.1       bertrand   97: *
1.9       bertrand   98: *     .. Scalar Arguments ..
                     99:       DOUBLE PRECISION DD1,DD2,DX1,DY1
                    100: *     ..
                    101: *     .. Array Arguments ..
                    102:       DOUBLE PRECISION DPARAM(5)
                    103: *     ..
1.1       bertrand  104: *
                    105: *  =====================================================================
                    106: *
                    107: *     .. Local Scalars ..
                    108:       DOUBLE PRECISION DFLAG,DH11,DH12,DH21,DH22,DP1,DP2,DQ1,DQ2,DTEMP,
1.8       bertrand  109:      $                 DU,GAM,GAMSQ,ONE,RGAMSQ,TWO,ZERO
1.1       bertrand  110: *     ..
                    111: *     .. Intrinsic Functions ..
                    112:       INTRINSIC DABS
                    113: *     ..
                    114: *     .. Data statements ..
                    115: *
                    116:       DATA ZERO,ONE,TWO/0.D0,1.D0,2.D0/
                    117:       DATA GAM,GAMSQ,RGAMSQ/4096.D0,16777216.D0,5.9604645D-8/
                    118: *     ..
                    119: 
1.8       bertrand  120:       IF (DD1.LT.ZERO) THEN
                    121: *        GO ZERO-H-D-AND-DX1..
                    122:          DFLAG = -ONE
                    123:          DH11 = ZERO
                    124:          DH12 = ZERO
                    125:          DH21 = ZERO
                    126:          DH22 = ZERO
                    127: *
                    128:          DD1 = ZERO
                    129:          DD2 = ZERO
                    130:          DX1 = ZERO
                    131:       ELSE
                    132: *        CASE-DD1-NONNEGATIVE
                    133:          DP2 = DD2*DY1
                    134:          IF (DP2.EQ.ZERO) THEN
                    135:             DFLAG = -TWO
                    136:             DPARAM(1) = DFLAG
                    137:             RETURN
1.14    ! bertrand  138:          END IF
1.8       bertrand  139: *        REGULAR-CASE..
                    140:          DP1 = DD1*DX1
                    141:          DQ2 = DP2*DY1
                    142:          DQ1 = DP1*DX1
                    143: *
                    144:          IF (DABS(DQ1).GT.DABS(DQ2)) THEN
                    145:             DH21 = -DY1/DX1
                    146:             DH12 = DP2/DP1
                    147: *
                    148:             DU = ONE - DH12*DH21
                    149: *
                    150:            IF (DU.GT.ZERO) THEN
                    151:              DFLAG = ZERO
                    152:              DD1 = DD1/DU
                    153:              DD2 = DD2/DU
                    154:              DX1 = DX1*DU
                    155:            END IF
                    156:          ELSE
                    157: 
                    158:             IF (DQ2.LT.ZERO) THEN
                    159: *              GO ZERO-H-D-AND-DX1..
                    160:                DFLAG = -ONE
                    161:                DH11 = ZERO
                    162:                DH12 = ZERO
                    163:                DH21 = ZERO
                    164:                DH22 = ZERO
                    165: *
                    166:                DD1 = ZERO
                    167:                DD2 = ZERO
                    168:                DX1 = ZERO
                    169:             ELSE
                    170:                DFLAG = ONE
                    171:                DH11 = DP1/DP2
                    172:                DH22 = DX1/DY1
                    173:                DU = ONE + DH11*DH22
                    174:                DTEMP = DD2/DU
                    175:                DD2 = DD1/DU
                    176:                DD1 = DTEMP
                    177:                DX1 = DY1*DU
                    178:             END IF
                    179:          END IF
                    180: 
1.1       bertrand  181: *     PROCEDURE..SCALE-CHECK
1.8       bertrand  182:          IF (DD1.NE.ZERO) THEN
                    183:             DO WHILE ((DD1.LE.RGAMSQ) .OR. (DD1.GE.GAMSQ))
                    184:                IF (DFLAG.EQ.ZERO) THEN
                    185:                   DH11 = ONE
                    186:                   DH22 = ONE
                    187:                   DFLAG = -ONE
                    188:                ELSE
                    189:                   DH21 = -ONE
                    190:                   DH12 = ONE
                    191:                   DFLAG = -ONE
                    192:                END IF
                    193:                IF (DD1.LE.RGAMSQ) THEN
                    194:                   DD1 = DD1*GAM**2
                    195:                   DX1 = DX1/GAM
                    196:                   DH11 = DH11/GAM
                    197:                   DH12 = DH12/GAM
                    198:                ELSE
                    199:                   DD1 = DD1/GAM**2
                    200:                   DX1 = DX1*GAM
                    201:                   DH11 = DH11*GAM
                    202:                   DH12 = DH12*GAM
                    203:                END IF
                    204:             ENDDO
                    205:          END IF
1.14    ! bertrand  206: 
1.8       bertrand  207:          IF (DD2.NE.ZERO) THEN
                    208:             DO WHILE ( (DABS(DD2).LE.RGAMSQ) .OR. (DABS(DD2).GE.GAMSQ) )
                    209:                IF (DFLAG.EQ.ZERO) THEN
                    210:                   DH11 = ONE
                    211:                   DH22 = ONE
                    212:                   DFLAG = -ONE
                    213:                ELSE
                    214:                   DH21 = -ONE
                    215:                   DH12 = ONE
                    216:                   DFLAG = -ONE
                    217:                END IF
                    218:                IF (DABS(DD2).LE.RGAMSQ) THEN
                    219:                   DD2 = DD2*GAM**2
                    220:                   DH21 = DH21/GAM
                    221:                   DH22 = DH22/GAM
                    222:                ELSE
                    223:                   DD2 = DD2/GAM**2
                    224:                   DH21 = DH21*GAM
                    225:                   DH22 = DH22*GAM
1.14    ! bertrand  226:                END IF
1.8       bertrand  227:             END DO
                    228:          END IF
1.14    ! bertrand  229: 
1.8       bertrand  230:       END IF
                    231: 
1.4       bertrand  232:       IF (DFLAG.LT.ZERO) THEN
1.8       bertrand  233:          DPARAM(2) = DH11
                    234:          DPARAM(3) = DH21
                    235:          DPARAM(4) = DH12
                    236:          DPARAM(5) = DH22
1.4       bertrand  237:       ELSE IF (DFLAG.EQ.ZERO) THEN
1.8       bertrand  238:          DPARAM(3) = DH21
1.14    ! bertrand  239:          DPARAM(4) = DH12
1.4       bertrand  240:       ELSE
1.8       bertrand  241:          DPARAM(2) = DH11
                    242:          DPARAM(5) = DH22
1.4       bertrand  243:       END IF
1.8       bertrand  244: 
1.1       bertrand  245:       DPARAM(1) = DFLAG
                    246:       RETURN
                    247:       END
1.14    ! bertrand  248: 
        !           249: 
        !           250: 
        !           251: 

CVSweb interface <joel.bertrand@systella.fr>