github.com/gonum/lapack@v0.0.0-20181123203213-e4cdc5a0bff9/internal/testdata/dlasqtest/dlascl.f (about)

     1  *> \brief \b DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
     2  *
     3  *  =========== DOCUMENTATION ===========
     4  *
     5  * Online html documentation available at 
     6  *            http://www.netlib.org/lapack/explore-html/ 
     7  *
     8  *> \htmlonly
     9  *> Download DLASCL + dependencies 
    10  *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlascl.f"> 
    11  *> [TGZ]</a> 
    12  *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlascl.f"> 
    13  *> [ZIP]</a> 
    14  *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlascl.f"> 
    15  *> [TXT]</a>
    16  *> \endhtmlonly 
    17  *
    18  *  Definition:
    19  *  ===========
    20  *
    21  *       SUBROUTINE DLASCL( TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO )
    22  * 
    23  *       .. Scalar Arguments ..
    24  *       CHARACTER          TYPE
    25  *       INTEGER            INFO, KL, KU, LDA, M, N
    26  *       DOUBLE PRECISION   CFROM, CTO
    27  *       ..
    28  *       .. Array Arguments ..
    29  *       DOUBLE PRECISION   A( LDA, * )
    30  *       ..
    31  *  
    32  *
    33  *> \par Purpose:
    34  *  =============
    35  *>
    36  *> \verbatim
    37  *>
    38  *> DLASCL multiplies the M by N real matrix A by the real scalar
    39  *> CTO/CFROM.  This is done without over/underflow as long as the final
    40  *> result CTO*A(I,J)/CFROM does not over/underflow. TYPE specifies that
    41  *> A may be full, upper triangular, lower triangular, upper Hessenberg,
    42  *> or banded.
    43  *> \endverbatim
    44  *
    45  *  Arguments:
    46  *  ==========
    47  *
    48  *> \param[in] TYPE
    49  *> \verbatim
    50  *>          TYPE is CHARACTER*1
    51  *>          TYPE indices the storage type of the input matrix.
    52  *>          = 'G':  A is a full matrix.
    53  *>          = 'L':  A is a lower triangular matrix.
    54  *>          = 'U':  A is an upper triangular matrix.
    55  *>          = 'H':  A is an upper Hessenberg matrix.
    56  *>          = 'B':  A is a symmetric band matrix with lower bandwidth KL
    57  *>                  and upper bandwidth KU and with the only the lower
    58  *>                  half stored.
    59  *>          = 'Q':  A is a symmetric band matrix with lower bandwidth KL
    60  *>                  and upper bandwidth KU and with the only the upper
    61  *>                  half stored.
    62  *>          = 'Z':  A is a band matrix with lower bandwidth KL and upper
    63  *>                  bandwidth KU. See DGBTRF for storage details.
    64  *> \endverbatim
    65  *>
    66  *> \param[in] KL
    67  *> \verbatim
    68  *>          KL is INTEGER
    69  *>          The lower bandwidth of A.  Referenced only if TYPE = 'B',
    70  *>          'Q' or 'Z'.
    71  *> \endverbatim
    72  *>
    73  *> \param[in] KU
    74  *> \verbatim
    75  *>          KU is INTEGER
    76  *>          The upper bandwidth of A.  Referenced only if TYPE = 'B',
    77  *>          'Q' or 'Z'.
    78  *> \endverbatim
    79  *>
    80  *> \param[in] CFROM
    81  *> \verbatim
    82  *>          CFROM is DOUBLE PRECISION
    83  *> \endverbatim
    84  *>
    85  *> \param[in] CTO
    86  *> \verbatim
    87  *>          CTO is DOUBLE PRECISION
    88  *>
    89  *>          The matrix A is multiplied by CTO/CFROM. A(I,J) is computed
    90  *>          without over/underflow if the final result CTO*A(I,J)/CFROM
    91  *>          can be represented without over/underflow.  CFROM must be
    92  *>          nonzero.
    93  *> \endverbatim
    94  *>
    95  *> \param[in] M
    96  *> \verbatim
    97  *>          M is INTEGER
    98  *>          The number of rows of the matrix A.  M >= 0.
    99  *> \endverbatim
   100  *>
   101  *> \param[in] N
   102  *> \verbatim
   103  *>          N is INTEGER
   104  *>          The number of columns of the matrix A.  N >= 0.
   105  *> \endverbatim
   106  *>
   107  *> \param[in,out] A
   108  *> \verbatim
   109  *>          A is DOUBLE PRECISION array, dimension (LDA,N)
   110  *>          The matrix to be multiplied by CTO/CFROM.  See TYPE for the
   111  *>          storage type.
   112  *> \endverbatim
   113  *>
   114  *> \param[in] LDA
   115  *> \verbatim
   116  *>          LDA is INTEGER
   117  *>          The leading dimension of the array A.  LDA >= max(1,M).
   118  *> \endverbatim
   119  *>
   120  *> \param[out] INFO
   121  *> \verbatim
   122  *>          INFO is INTEGER
   123  *>          0  - successful exit
   124  *>          <0 - if INFO = -i, the i-th argument had an illegal value.
   125  *> \endverbatim
   126  *
   127  *  Authors:
   128  *  ========
   129  *
   130  *> \author Univ. of Tennessee 
   131  *> \author Univ. of California Berkeley 
   132  *> \author Univ. of Colorado Denver 
   133  *> \author NAG Ltd. 
   134  *
   135  *> \date September 2012
   136  *
   137  *> \ingroup auxOTHERauxiliary
   138  *
   139  *  =====================================================================
   140        SUBROUTINE DLASCL( TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO )
   141  *
   142  *  -- LAPACK auxiliary routine (version 3.4.2) --
   143  *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
   144  *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
   145  *     September 2012
   146  *
   147  *     .. Scalar Arguments ..
   148        CHARACTER          TYPE
   149        INTEGER            INFO, KL, KU, LDA, M, N
   150        DOUBLE PRECISION   CFROM, CTO
   151  *     ..
   152  *     .. Array Arguments ..
   153        DOUBLE PRECISION   A( LDA, * )
   154  *     ..
   155  *
   156  *  =====================================================================
   157  *
   158  *     .. Parameters ..
   159        DOUBLE PRECISION   ZERO, ONE
   160        PARAMETER          ( ZERO = 0.0D0, ONE = 1.0D0 )
   161  *     ..
   162  *     .. Local Scalars ..
   163        LOGICAL            DONE
   164        INTEGER            I, ITYPE, J, K1, K2, K3, K4
   165        DOUBLE PRECISION   BIGNUM, CFROM1, CFROMC, CTO1, CTOC, MUL, SMLNUM
   166  *     ..
   167  *     .. External Functions ..
   168        LOGICAL            LSAME, DISNAN
   169        DOUBLE PRECISION   DLAMCH
   170        EXTERNAL           LSAME, DLAMCH, DISNAN
   171  *     ..
   172  *     .. Intrinsic Functions ..
   173        INTRINSIC          ABS, MAX, MIN
   174  *     ..
   175  *     .. External Subroutines ..
   176        EXTERNAL           XERBLA
   177  *     ..
   178  *     .. Executable Statements ..
   179  *
   180  *     Test the input arguments
   181  *
   182        INFO = 0
   183  *
   184        IF( LSAME( TYPE, 'G' ) ) THEN
   185           ITYPE = 0
   186        ELSE IF( LSAME( TYPE, 'L' ) ) THEN
   187           ITYPE = 1
   188        ELSE IF( LSAME( TYPE, 'U' ) ) THEN
   189           ITYPE = 2
   190        ELSE IF( LSAME( TYPE, 'H' ) ) THEN
   191           ITYPE = 3
   192        ELSE IF( LSAME( TYPE, 'B' ) ) THEN
   193           ITYPE = 4
   194        ELSE IF( LSAME( TYPE, 'Q' ) ) THEN
   195           ITYPE = 5
   196        ELSE IF( LSAME( TYPE, 'Z' ) ) THEN
   197           ITYPE = 6
   198        ELSE
   199           ITYPE = -1
   200        END IF
   201  *
   202        IF( ITYPE.EQ.-1 ) THEN
   203           INFO = -1
   204        ELSE IF( CFROM.EQ.ZERO .OR. DISNAN(CFROM) ) THEN
   205           INFO = -4
   206        ELSE IF( DISNAN(CTO) ) THEN
   207           INFO = -5
   208        ELSE IF( M.LT.0 ) THEN
   209           INFO = -6
   210        ELSE IF( N.LT.0 .OR. ( ITYPE.EQ.4 .AND. N.NE.M ) .OR.
   211       $         ( ITYPE.EQ.5 .AND. N.NE.M ) ) THEN
   212           INFO = -7
   213        ELSE IF( ITYPE.LE.3 .AND. LDA.LT.MAX( 1, M ) ) THEN
   214           INFO = -9
   215        ELSE IF( ITYPE.GE.4 ) THEN
   216           IF( KL.LT.0 .OR. KL.GT.MAX( M-1, 0 ) ) THEN
   217              INFO = -2
   218           ELSE IF( KU.LT.0 .OR. KU.GT.MAX( N-1, 0 ) .OR.
   219       $            ( ( ITYPE.EQ.4 .OR. ITYPE.EQ.5 ) .AND. KL.NE.KU ) )
   220       $             THEN
   221              INFO = -3
   222           ELSE IF( ( ITYPE.EQ.4 .AND. LDA.LT.KL+1 ) .OR.
   223       $            ( ITYPE.EQ.5 .AND. LDA.LT.KU+1 ) .OR.
   224       $            ( ITYPE.EQ.6 .AND. LDA.LT.2*KL+KU+1 ) ) THEN
   225              INFO = -9
   226           END IF
   227        END IF
   228  *
   229        IF( INFO.NE.0 ) THEN
   230           CALL XERBLA( 'DLASCL', -INFO )
   231           RETURN
   232        END IF
   233  *
   234  *     Quick return if possible
   235  *
   236        IF( N.EQ.0 .OR. M.EQ.0 )
   237       $   RETURN
   238  *
   239  *     Get machine parameters
   240  *
   241        SMLNUM = DLAMCH( 'S' )
   242        BIGNUM = ONE / SMLNUM
   243  *
   244        CFROMC = CFROM
   245        CTOC = CTO
   246  *
   247     10 CONTINUE
   248        CFROM1 = CFROMC*SMLNUM
   249        IF( CFROM1.EQ.CFROMC ) THEN
   250  !        CFROMC is an inf.  Multiply by a correctly signed zero for
   251  !        finite CTOC, or a NaN if CTOC is infinite.
   252           MUL = CTOC / CFROMC
   253           DONE = .TRUE.
   254           CTO1 = CTOC
   255        ELSE
   256           CTO1 = CTOC / BIGNUM
   257           IF( CTO1.EQ.CTOC ) THEN
   258  !           CTOC is either 0 or an inf.  In both cases, CTOC itself
   259  !           serves as the correct multiplication factor.
   260              MUL = CTOC
   261              DONE = .TRUE.
   262              CFROMC = ONE
   263           ELSE IF( ABS( CFROM1 ).GT.ABS( CTOC ) .AND. CTOC.NE.ZERO ) THEN
   264              MUL = SMLNUM
   265              DONE = .FALSE.
   266              CFROMC = CFROM1
   267           ELSE IF( ABS( CTO1 ).GT.ABS( CFROMC ) ) THEN
   268              MUL = BIGNUM
   269              DONE = .FALSE.
   270              CTOC = CTO1
   271           ELSE
   272              MUL = CTOC / CFROMC
   273              DONE = .TRUE.
   274           END IF
   275        END IF
   276  *
   277        IF( ITYPE.EQ.0 ) THEN
   278  *
   279  *        Full matrix
   280  *
   281           DO 30 J = 1, N
   282              DO 20 I = 1, M
   283                 A( I, J ) = A( I, J )*MUL
   284     20       CONTINUE
   285     30    CONTINUE
   286  *
   287        ELSE IF( ITYPE.EQ.1 ) THEN
   288  *
   289  *        Lower triangular matrix
   290  *
   291           DO 50 J = 1, N
   292              DO 40 I = J, M
   293                 A( I, J ) = A( I, J )*MUL
   294     40       CONTINUE
   295     50    CONTINUE
   296  *
   297        ELSE IF( ITYPE.EQ.2 ) THEN
   298  *
   299  *        Upper triangular matrix
   300  *
   301           DO 70 J = 1, N
   302              DO 60 I = 1, MIN( J, M )
   303                 A( I, J ) = A( I, J )*MUL
   304     60       CONTINUE
   305     70    CONTINUE
   306  *
   307        ELSE IF( ITYPE.EQ.3 ) THEN
   308  *
   309  *        Upper Hessenberg matrix
   310  *
   311           DO 90 J = 1, N
   312              DO 80 I = 1, MIN( J+1, M )
   313                 A( I, J ) = A( I, J )*MUL
   314     80       CONTINUE
   315     90    CONTINUE
   316  *
   317        ELSE IF( ITYPE.EQ.4 ) THEN
   318  *
   319  *        Lower half of a symmetric band matrix
   320  *
   321           K3 = KL + 1
   322           K4 = N + 1
   323           DO 110 J = 1, N
   324              DO 100 I = 1, MIN( K3, K4-J )
   325                 A( I, J ) = A( I, J )*MUL
   326    100       CONTINUE
   327    110    CONTINUE
   328  *
   329        ELSE IF( ITYPE.EQ.5 ) THEN
   330  *
   331  *        Upper half of a symmetric band matrix
   332  *
   333           K1 = KU + 2
   334           K3 = KU + 1
   335           DO 130 J = 1, N
   336              DO 120 I = MAX( K1-J, 1 ), K3
   337                 A( I, J ) = A( I, J )*MUL
   338    120       CONTINUE
   339    130    CONTINUE
   340  *
   341        ELSE IF( ITYPE.EQ.6 ) THEN
   342  *
   343  *        Band matrix
   344  *
   345           K1 = KL + KU + 2
   346           K2 = KL + 1
   347           K3 = 2*KL + KU + 1
   348           K4 = KL + KU + 1 + M
   349           DO 150 J = 1, N
   350              DO 140 I = MAX( K1-J, K2 ), MIN( K3, K4-J )
   351                 A( I, J ) = A( I, J )*MUL
   352    140       CONTINUE
   353    150    CONTINUE
   354  *
   355        END IF
   356  *
   357        IF( .NOT.DONE )
   358       $   GO TO 10
   359  *
   360        RETURN
   361  *
   362  *     End of DLASCL
   363  *
   364        END