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

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: *>
1.15      bertrand   68: *> \param[out] DPARAM
1.9       bertrand   69: *> \verbatim
1.15      bertrand   70: *>          DPARAM is DOUBLE PRECISION array, dimension (5)
1.9       bertrand   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.9       bertrand   86: *> \ingroup double_blas_level1
1.1       bertrand   87: *
1.9       bertrand   88: *  =====================================================================
                     89:       SUBROUTINE DROTMG(DD1,DD2,DX1,DY1,DPARAM)
1.1       bertrand   90: *
1.17    ! bertrand   91: *  -- Reference BLAS level1 routine --
1.9       bertrand   92: *  -- Reference BLAS is a software package provided by Univ. of Tennessee,    --
                     93: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
1.1       bertrand   94: *
1.9       bertrand   95: *     .. Scalar Arguments ..
                     96:       DOUBLE PRECISION DD1,DD2,DX1,DY1
                     97: *     ..
                     98: *     .. Array Arguments ..
                     99:       DOUBLE PRECISION DPARAM(5)
                    100: *     ..
1.1       bertrand  101: *
                    102: *  =====================================================================
                    103: *
                    104: *     .. Local Scalars ..
                    105:       DOUBLE PRECISION DFLAG,DH11,DH12,DH21,DH22,DP1,DP2,DQ1,DQ2,DTEMP,
1.8       bertrand  106:      $                 DU,GAM,GAMSQ,ONE,RGAMSQ,TWO,ZERO
1.1       bertrand  107: *     ..
                    108: *     .. Intrinsic Functions ..
                    109:       INTRINSIC DABS
                    110: *     ..
                    111: *     .. Data statements ..
                    112: *
                    113:       DATA ZERO,ONE,TWO/0.D0,1.D0,2.D0/
                    114:       DATA GAM,GAMSQ,RGAMSQ/4096.D0,16777216.D0,5.9604645D-8/
                    115: *     ..
                    116: 
1.8       bertrand  117:       IF (DD1.LT.ZERO) THEN
                    118: *        GO ZERO-H-D-AND-DX1..
                    119:          DFLAG = -ONE
                    120:          DH11 = ZERO
                    121:          DH12 = ZERO
                    122:          DH21 = ZERO
                    123:          DH22 = ZERO
                    124: *
                    125:          DD1 = ZERO
                    126:          DD2 = ZERO
                    127:          DX1 = ZERO
                    128:       ELSE
                    129: *        CASE-DD1-NONNEGATIVE
                    130:          DP2 = DD2*DY1
                    131:          IF (DP2.EQ.ZERO) THEN
                    132:             DFLAG = -TWO
                    133:             DPARAM(1) = DFLAG
                    134:             RETURN
1.14      bertrand  135:          END IF
1.8       bertrand  136: *        REGULAR-CASE..
                    137:          DP1 = DD1*DX1
                    138:          DQ2 = DP2*DY1
                    139:          DQ1 = DP1*DX1
                    140: *
                    141:          IF (DABS(DQ1).GT.DABS(DQ2)) THEN
                    142:             DH21 = -DY1/DX1
                    143:             DH12 = DP2/DP1
                    144: *
                    145:             DU = ONE - DH12*DH21
                    146: *
                    147:            IF (DU.GT.ZERO) THEN
                    148:              DFLAG = ZERO
                    149:              DD1 = DD1/DU
                    150:              DD2 = DD2/DU
                    151:              DX1 = DX1*DU
1.17    ! bertrand  152:            ELSE
        !           153: *            This code path if here for safety. We do not expect this
        !           154: *            condition to ever hold except in edge cases with rounding
        !           155: *            errors. See DOI: 10.1145/355841.355847
        !           156:              DFLAG = -ONE
        !           157:              DH11 = ZERO
        !           158:              DH12 = ZERO
        !           159:              DH21 = ZERO
        !           160:              DH22 = ZERO
        !           161: *
        !           162:              DD1 = ZERO
        !           163:              DD2 = ZERO
        !           164:              DX1 = ZERO
1.8       bertrand  165:            END IF
                    166:          ELSE
                    167: 
                    168:             IF (DQ2.LT.ZERO) THEN
                    169: *              GO ZERO-H-D-AND-DX1..
                    170:                DFLAG = -ONE
                    171:                DH11 = ZERO
                    172:                DH12 = ZERO
                    173:                DH21 = ZERO
                    174:                DH22 = ZERO
                    175: *
                    176:                DD1 = ZERO
                    177:                DD2 = ZERO
                    178:                DX1 = ZERO
                    179:             ELSE
                    180:                DFLAG = ONE
                    181:                DH11 = DP1/DP2
                    182:                DH22 = DX1/DY1
                    183:                DU = ONE + DH11*DH22
                    184:                DTEMP = DD2/DU
                    185:                DD2 = DD1/DU
                    186:                DD1 = DTEMP
                    187:                DX1 = DY1*DU
                    188:             END IF
                    189:          END IF
                    190: 
1.1       bertrand  191: *     PROCEDURE..SCALE-CHECK
1.8       bertrand  192:          IF (DD1.NE.ZERO) THEN
                    193:             DO WHILE ((DD1.LE.RGAMSQ) .OR. (DD1.GE.GAMSQ))
                    194:                IF (DFLAG.EQ.ZERO) THEN
                    195:                   DH11 = ONE
                    196:                   DH22 = ONE
                    197:                   DFLAG = -ONE
                    198:                ELSE
                    199:                   DH21 = -ONE
                    200:                   DH12 = ONE
                    201:                   DFLAG = -ONE
                    202:                END IF
                    203:                IF (DD1.LE.RGAMSQ) THEN
                    204:                   DD1 = DD1*GAM**2
                    205:                   DX1 = DX1/GAM
                    206:                   DH11 = DH11/GAM
                    207:                   DH12 = DH12/GAM
                    208:                ELSE
                    209:                   DD1 = DD1/GAM**2
                    210:                   DX1 = DX1*GAM
                    211:                   DH11 = DH11*GAM
                    212:                   DH12 = DH12*GAM
                    213:                END IF
                    214:             ENDDO
                    215:          END IF
1.14      bertrand  216: 
1.8       bertrand  217:          IF (DD2.NE.ZERO) THEN
                    218:             DO WHILE ( (DABS(DD2).LE.RGAMSQ) .OR. (DABS(DD2).GE.GAMSQ) )
                    219:                IF (DFLAG.EQ.ZERO) THEN
                    220:                   DH11 = ONE
                    221:                   DH22 = ONE
                    222:                   DFLAG = -ONE
                    223:                ELSE
                    224:                   DH21 = -ONE
                    225:                   DH12 = ONE
                    226:                   DFLAG = -ONE
                    227:                END IF
                    228:                IF (DABS(DD2).LE.RGAMSQ) THEN
                    229:                   DD2 = DD2*GAM**2
                    230:                   DH21 = DH21/GAM
                    231:                   DH22 = DH22/GAM
                    232:                ELSE
                    233:                   DD2 = DD2/GAM**2
                    234:                   DH21 = DH21*GAM
                    235:                   DH22 = DH22*GAM
1.14      bertrand  236:                END IF
1.8       bertrand  237:             END DO
                    238:          END IF
1.14      bertrand  239: 
1.8       bertrand  240:       END IF
                    241: 
1.4       bertrand  242:       IF (DFLAG.LT.ZERO) THEN
1.8       bertrand  243:          DPARAM(2) = DH11
                    244:          DPARAM(3) = DH21
                    245:          DPARAM(4) = DH12
                    246:          DPARAM(5) = DH22
1.4       bertrand  247:       ELSE IF (DFLAG.EQ.ZERO) THEN
1.8       bertrand  248:          DPARAM(3) = DH21
1.14      bertrand  249:          DPARAM(4) = DH12
1.4       bertrand  250:       ELSE
1.8       bertrand  251:          DPARAM(2) = DH11
                    252:          DPARAM(5) = DH22
1.4       bertrand  253:       END IF
1.8       bertrand  254: 
1.1       bertrand  255:       DPARAM(1) = DFLAG
                    256:       RETURN
1.17    ! bertrand  257: *
        !           258: *     End of DROTMG
        !           259: *
1.1       bertrand  260:       END

CVSweb interface <joel.bertrand@systella.fr>