Annotation of rpl/lapack/blas/drotg.f90, revision 1.1

1.1     ! bertrand    1: !> \brief \b DROTG
        !             2: !
        !             3: !  =========== DOCUMENTATION ===========
        !             4: !
        !             5: ! Online html documentation available at
        !             6: !            http://www.netlib.org/lapack/explore-html/
        !             7: !
        !             8: !  Definition:
        !             9: !  ===========
        !            10: !
        !            11: !  DROTG constructs a plane rotation
        !            12: !     [  c  s ] [ a ] = [ r ]
        !            13: !     [ -s  c ] [ b ]   [ 0 ]
        !            14: !  satisfying c**2 + s**2 = 1.
        !            15: !
        !            16: !> \par Purpose:
        !            17: !  =============
        !            18: !>
        !            19: !> \verbatim
        !            20: !>
        !            21: !> The computation uses the formulas
        !            22: !>    sigma = sgn(a)    if |a| >  |b|
        !            23: !>          = sgn(b)    if |b| >= |a|
        !            24: !>    r = sigma*sqrt( a**2 + b**2 )
        !            25: !>    c = 1; s = 0      if r = 0
        !            26: !>    c = a/r; s = b/r  if r != 0
        !            27: !> The subroutine also computes
        !            28: !>    z = s    if |a| > |b|,
        !            29: !>      = 1/c  if |b| >= |a| and c != 0
        !            30: !>      = 1    if c = 0
        !            31: !> This allows c and s to be reconstructed from z as follows:
        !            32: !>    If z = 1, set c = 0, s = 1.
        !            33: !>    If |z| < 1, set c = sqrt(1 - z**2) and s = z.
        !            34: !>    If |z| > 1, set c = 1/z and s = sqrt( 1 - c**2).
        !            35: !>
        !            36: !> \endverbatim
        !            37: !
        !            38: !  Arguments:
        !            39: !  ==========
        !            40: !
        !            41: !> \param[in,out] A
        !            42: !> \verbatim
        !            43: !>          A is DOUBLE PRECISION
        !            44: !>          On entry, the scalar a.
        !            45: !>          On exit, the scalar r.
        !            46: !> \endverbatim
        !            47: !>
        !            48: !> \param[in,out] B
        !            49: !> \verbatim
        !            50: !>          B is DOUBLE PRECISION
        !            51: !>          On entry, the scalar b.
        !            52: !>          On exit, the scalar z.
        !            53: !> \endverbatim
        !            54: !>
        !            55: !> \param[out] C
        !            56: !> \verbatim
        !            57: !>          C is DOUBLE PRECISION
        !            58: !>          The scalar c.
        !            59: !> \endverbatim
        !            60: !>
        !            61: !> \param[out] S
        !            62: !> \verbatim
        !            63: !>          S is DOUBLE PRECISION
        !            64: !>          The scalar s.
        !            65: !> \endverbatim
        !            66: !
        !            67: !  Authors:
        !            68: !  ========
        !            69: !
        !            70: !> \author Edward Anderson, Lockheed Martin
        !            71: !
        !            72: !> \par Contributors:
        !            73: !  ==================
        !            74: !>
        !            75: !> Weslley Pereira, University of Colorado Denver, USA
        !            76: !
        !            77: !> \ingroup single_blas_level1
        !            78: !
        !            79: !> \par Further Details:
        !            80: !  =====================
        !            81: !>
        !            82: !> \verbatim
        !            83: !>
        !            84: !>  Anderson E. (2017)
        !            85: !>  Algorithm 978: Safe Scaling in the Level 1 BLAS
        !            86: !>  ACM Trans Math Softw 44:1--28
        !            87: !>  https://doi.org/10.1145/3061665
        !            88: !>
        !            89: !> \endverbatim
        !            90: !
        !            91: !  =====================================================================
        !            92: subroutine DROTG( a, b, c, s )
        !            93:    integer, parameter :: wp = kind(1.d0)
        !            94: !
        !            95: !  -- Reference BLAS level1 routine --
        !            96: !  -- Reference BLAS is a software package provided by Univ. of Tennessee,    --
        !            97: !  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
        !            98: !
        !            99: !  .. Constants ..
        !           100:    real(wp), parameter :: zero = 0.0_wp
        !           101:    real(wp), parameter :: one  = 1.0_wp
        !           102: !  ..
        !           103: !  .. Scaling constants ..
        !           104:    real(wp), parameter :: safmin = real(radix(0._wp),wp)**max( &
        !           105:       minexponent(0._wp)-1, &
        !           106:       1-maxexponent(0._wp) &
        !           107:    )
        !           108:    real(wp), parameter :: safmax = real(radix(0._wp),wp)**max( &
        !           109:       1-minexponent(0._wp), &
        !           110:       maxexponent(0._wp)-1 &
        !           111:    )
        !           112: !  ..
        !           113: !  .. Scalar Arguments ..
        !           114:    real(wp) :: a, b, c, s
        !           115: !  ..
        !           116: !  .. Local Scalars ..
        !           117:    real(wp) :: anorm, bnorm, scl, sigma, r, z
        !           118: !  ..
        !           119:    anorm = abs(a)
        !           120:    bnorm = abs(b)
        !           121:    if( bnorm == zero ) then
        !           122:       c = one
        !           123:       s = zero
        !           124:       b = zero
        !           125:    else if( anorm == zero ) then
        !           126:       c = zero
        !           127:       s = one
        !           128:       a = b
        !           129:       b = one
        !           130:    else
        !           131:       scl = min( safmax, max( safmin, anorm, bnorm ) )
        !           132:       if( anorm > bnorm ) then
        !           133:          sigma = sign(one,a)
        !           134:       else
        !           135:          sigma = sign(one,b)
        !           136:       end if
        !           137:       r = sigma*( scl*sqrt((a/scl)**2 + (b/scl)**2) )
        !           138:       c = a/r
        !           139:       s = b/r
        !           140:       if( anorm > bnorm ) then
        !           141:          z = s
        !           142:       else if( c /= zero ) then
        !           143:          z = one/c
        !           144:       else
        !           145:          z = one
        !           146:       end if
        !           147:       a = r
        !           148:       b = z
        !           149:    end if
        !           150:    return
        !           151: end subroutine

CVSweb interface <joel.bertrand@systella.fr>