Home | History | Annotate | Download | only in lapack
      1 *> \brief \b CLARFG
      2 *
      3 *  =========== DOCUMENTATION ===========
      4 *
      5 * Online html documentation available at 
      6 *            http://www.netlib.org/lapack/explore-html/ 
      7 *
      8 *> \htmlonly
      9 *> Download CLARFG + dependencies 
     10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/clarfg.f"> 
     11 *> [TGZ]</a> 
     12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/clarfg.f"> 
     13 *> [ZIP]</a> 
     14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/clarfg.f"> 
     15 *> [TXT]</a>
     16 *> \endhtmlonly 
     17 *
     18 *  Definition:
     19 *  ===========
     20 *
     21 *       SUBROUTINE CLARFG( N, ALPHA, X, INCX, TAU )
     22 * 
     23 *       .. Scalar Arguments ..
     24 *       INTEGER            INCX, N
     25 *       COMPLEX            ALPHA, TAU
     26 *       ..
     27 *       .. Array Arguments ..
     28 *       COMPLEX            X( * )
     29 *       ..
     30 *  
     31 *
     32 *> \par Purpose:
     33 *  =============
     34 *>
     35 *> \verbatim
     36 *>
     37 *> CLARFG generates a complex elementary reflector H of order n, such
     38 *> that
     39 *>
     40 *>       H**H * ( alpha ) = ( beta ),   H**H * H = I.
     41 *>              (   x   )   (   0  )
     42 *>
     43 *> where alpha and beta are scalars, with beta real, and x is an
     44 *> (n-1)-element complex vector. H is represented in the form
     45 *>
     46 *>       H = I - tau * ( 1 ) * ( 1 v**H ) ,
     47 *>                     ( v )
     48 *>
     49 *> where tau is a complex scalar and v is a complex (n-1)-element
     50 *> vector. Note that H is not hermitian.
     51 *>
     52 *> If the elements of x are all zero and alpha is real, then tau = 0
     53 *> and H is taken to be the unit matrix.
     54 *>
     55 *> Otherwise  1 <= real(tau) <= 2  and  abs(tau-1) <= 1 .
     56 *> \endverbatim
     57 *
     58 *  Arguments:
     59 *  ==========
     60 *
     61 *> \param[in] N
     62 *> \verbatim
     63 *>          N is INTEGER
     64 *>          The order of the elementary reflector.
     65 *> \endverbatim
     66 *>
     67 *> \param[in,out] ALPHA
     68 *> \verbatim
     69 *>          ALPHA is COMPLEX
     70 *>          On entry, the value alpha.
     71 *>          On exit, it is overwritten with the value beta.
     72 *> \endverbatim
     73 *>
     74 *> \param[in,out] X
     75 *> \verbatim
     76 *>          X is COMPLEX array, dimension
     77 *>                         (1+(N-2)*abs(INCX))
     78 *>          On entry, the vector x.
     79 *>          On exit, it is overwritten with the vector v.
     80 *> \endverbatim
     81 *>
     82 *> \param[in] INCX
     83 *> \verbatim
     84 *>          INCX is INTEGER
     85 *>          The increment between elements of X. INCX > 0.
     86 *> \endverbatim
     87 *>
     88 *> \param[out] TAU
     89 *> \verbatim
     90 *>          TAU is COMPLEX
     91 *>          The value tau.
     92 *> \endverbatim
     93 *
     94 *  Authors:
     95 *  ========
     96 *
     97 *> \author Univ. of Tennessee 
     98 *> \author Univ. of California Berkeley 
     99 *> \author Univ. of Colorado Denver 
    100 *> \author NAG Ltd. 
    101 *
    102 *> \date November 2011
    103 *
    104 *> \ingroup complexOTHERauxiliary
    105 *
    106 *  =====================================================================
    107       SUBROUTINE CLARFG( N, ALPHA, X, INCX, TAU )
    108 *
    109 *  -- LAPACK auxiliary routine (version 3.4.0) --
    110 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
    111 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
    112 *     November 2011
    113 *
    114 *     .. Scalar Arguments ..
    115       INTEGER            INCX, N
    116       COMPLEX            ALPHA, TAU
    117 *     ..
    118 *     .. Array Arguments ..
    119       COMPLEX            X( * )
    120 *     ..
    121 *
    122 *  =====================================================================
    123 *
    124 *     .. Parameters ..
    125       REAL               ONE, ZERO
    126       PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
    127 *     ..
    128 *     .. Local Scalars ..
    129       INTEGER            J, KNT
    130       REAL               ALPHI, ALPHR, BETA, RSAFMN, SAFMIN, XNORM
    131 *     ..
    132 *     .. External Functions ..
    133       REAL               SCNRM2, SLAMCH, SLAPY3
    134       COMPLEX            CLADIV
    135       EXTERNAL           SCNRM2, SLAMCH, SLAPY3, CLADIV
    136 *     ..
    137 *     .. Intrinsic Functions ..
    138       INTRINSIC          ABS, AIMAG, CMPLX, REAL, SIGN
    139 *     ..
    140 *     .. External Subroutines ..
    141       EXTERNAL           CSCAL, CSSCAL
    142 *     ..
    143 *     .. Executable Statements ..
    144 *
    145       IF( N.LE.0 ) THEN
    146          TAU = ZERO
    147          RETURN
    148       END IF
    149 *
    150       XNORM = SCNRM2( N-1, X, INCX )
    151       ALPHR = REAL( ALPHA )
    152       ALPHI = AIMAG( ALPHA )
    153 *
    154       IF( XNORM.EQ.ZERO .AND. ALPHI.EQ.ZERO ) THEN
    155 *
    156 *        H  =  I
    157 *
    158          TAU = ZERO
    159       ELSE
    160 *
    161 *        general case
    162 *
    163          BETA = -SIGN( SLAPY3( ALPHR, ALPHI, XNORM ), ALPHR )
    164          SAFMIN = SLAMCH( 'S' ) / SLAMCH( 'E' )
    165          RSAFMN = ONE / SAFMIN
    166 *
    167          KNT = 0
    168          IF( ABS( BETA ).LT.SAFMIN ) THEN
    169 *
    170 *           XNORM, BETA may be inaccurate; scale X and recompute them
    171 *
    172    10       CONTINUE
    173             KNT = KNT + 1
    174             CALL CSSCAL( N-1, RSAFMN, X, INCX )
    175             BETA = BETA*RSAFMN
    176             ALPHI = ALPHI*RSAFMN
    177             ALPHR = ALPHR*RSAFMN
    178             IF( ABS( BETA ).LT.SAFMIN )
    179      $         GO TO 10
    180 *
    181 *           New BETA is at most 1, at least SAFMIN
    182 *
    183             XNORM = SCNRM2( N-1, X, INCX )
    184             ALPHA = CMPLX( ALPHR, ALPHI )
    185             BETA = -SIGN( SLAPY3( ALPHR, ALPHI, XNORM ), ALPHR )
    186          END IF
    187          TAU = CMPLX( ( BETA-ALPHR ) / BETA, -ALPHI / BETA )
    188          ALPHA = CLADIV( CMPLX( ONE ), ALPHA-BETA )
    189          CALL CSCAL( N-1, ALPHA, X, INCX )
    190 *
    191 *        If ALPHA is subnormal, it may lose relative accuracy
    192 *
    193          DO 20 J = 1, KNT
    194             BETA = BETA*SAFMIN
    195  20      CONTINUE
    196          ALPHA = BETA
    197       END IF
    198 *
    199       RETURN
    200 *
    201 *     End of CLARFG
    202 *
    203       END
    204