Diff for /rpl/lapack/lapack/dlantp.f between versions 1.1 and 1.18

version 1.1, 2010/01/26 15:22:45 version 1.18, 2020/05/21 21:45:59
Line 1 Line 1
   *> \brief \b DLANTP returns the value of the 1-norm, or the Frobenius norm, or the infinity norm, or the element of largest absolute value of a triangular matrix supplied in packed form.
   *
   *  =========== DOCUMENTATION ===========
   *
   * Online html documentation available at
   *            http://www.netlib.org/lapack/explore-html/
   *
   *> \htmlonly
   *> Download DLANTP + dependencies
   *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlantp.f">
   *> [TGZ]</a>
   *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlantp.f">
   *> [ZIP]</a>
   *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlantp.f">
   *> [TXT]</a>
   *> \endhtmlonly
   *
   *  Definition:
   *  ===========
   *
   *       DOUBLE PRECISION FUNCTION DLANTP( NORM, UPLO, DIAG, N, AP, WORK )
   *
   *       .. Scalar Arguments ..
   *       CHARACTER          DIAG, NORM, UPLO
   *       INTEGER            N
   *       ..
   *       .. Array Arguments ..
   *       DOUBLE PRECISION   AP( * ), WORK( * )
   *       ..
   *
   *
   *> \par Purpose:
   *  =============
   *>
   *> \verbatim
   *>
   *> DLANTP  returns the value of the one norm,  or the Frobenius norm, or
   *> the  infinity norm,  or the  element of  largest absolute value  of a
   *> triangular matrix A, supplied in packed form.
   *> \endverbatim
   *>
   *> \return DLANTP
   *> \verbatim
   *>
   *>    DLANTP = ( max(abs(A(i,j))), NORM = 'M' or 'm'
   *>             (
   *>             ( norm1(A),         NORM = '1', 'O' or 'o'
   *>             (
   *>             ( normI(A),         NORM = 'I' or 'i'
   *>             (
   *>             ( normF(A),         NORM = 'F', 'f', 'E' or 'e'
   *>
   *> where  norm1  denotes the  one norm of a matrix (maximum column sum),
   *> normI  denotes the  infinity norm  of a matrix  (maximum row sum) and
   *> normF  denotes the  Frobenius norm of a matrix (square root of sum of
   *> squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.
   *> \endverbatim
   *
   *  Arguments:
   *  ==========
   *
   *> \param[in] NORM
   *> \verbatim
   *>          NORM is CHARACTER*1
   *>          Specifies the value to be returned in DLANTP as described
   *>          above.
   *> \endverbatim
   *>
   *> \param[in] UPLO
   *> \verbatim
   *>          UPLO is CHARACTER*1
   *>          Specifies whether the matrix A is upper or lower triangular.
   *>          = 'U':  Upper triangular
   *>          = 'L':  Lower triangular
   *> \endverbatim
   *>
   *> \param[in] DIAG
   *> \verbatim
   *>          DIAG is CHARACTER*1
   *>          Specifies whether or not the matrix A is unit triangular.
   *>          = 'N':  Non-unit triangular
   *>          = 'U':  Unit triangular
   *> \endverbatim
   *>
   *> \param[in] N
   *> \verbatim
   *>          N is INTEGER
   *>          The order of the matrix A.  N >= 0.  When N = 0, DLANTP is
   *>          set to zero.
   *> \endverbatim
   *>
   *> \param[in] AP
   *> \verbatim
   *>          AP is DOUBLE PRECISION array, dimension (N*(N+1)/2)
   *>          The upper or lower triangular matrix A, packed columnwise in
   *>          a linear array.  The j-th column of A is stored in the array
   *>          AP as follows:
   *>          if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j;
   *>          if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n.
   *>          Note that when DIAG = 'U', the elements of the array AP
   *>          corresponding to the diagonal elements of the matrix A are
   *>          not referenced, but are assumed to be one.
   *> \endverbatim
   *>
   *> \param[out] WORK
   *> \verbatim
   *>          WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)),
   *>          where LWORK >= N when NORM = 'I'; otherwise, WORK is not
   *>          referenced.
   *> \endverbatim
   *
   *  Authors:
   *  ========
   *
   *> \author Univ. of Tennessee
   *> \author Univ. of California Berkeley
   *> \author Univ. of Colorado Denver
   *> \author NAG Ltd.
   *
   *> \date December 2016
   *
   *> \ingroup doubleOTHERauxiliary
   *
   *  =====================================================================
       DOUBLE PRECISION FUNCTION DLANTP( NORM, UPLO, DIAG, N, AP, WORK )        DOUBLE PRECISION FUNCTION DLANTP( NORM, UPLO, DIAG, N, AP, WORK )
 *  *
 *  -- LAPACK auxiliary routine (version 3.2) --  *  -- LAPACK auxiliary routine (version 3.7.0) --
 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --  *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--  *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
 *     November 2006  *     December 2016
 *  *
         IMPLICIT NONE
 *     .. Scalar Arguments ..  *     .. Scalar Arguments ..
       CHARACTER          DIAG, NORM, UPLO        CHARACTER          DIAG, NORM, UPLO
       INTEGER            N        INTEGER            N
Line 13 Line 138
       DOUBLE PRECISION   AP( * ), WORK( * )        DOUBLE PRECISION   AP( * ), WORK( * )
 *     ..  *     ..
 *  *
 *  Purpose  
 *  =======  
 *  
 *  DLANTP  returns the value of the one norm,  or the Frobenius norm, or  
 *  the  infinity norm,  or the  element of  largest absolute value  of a  
 *  triangular matrix A, supplied in packed form.  
 *  
 *  Description  
 *  ===========  
 *  
 *  DLANTP returns the value  
 *  
 *     DLANTP = ( max(abs(A(i,j))), NORM = 'M' or 'm'  
 *              (  
 *              ( norm1(A),         NORM = '1', 'O' or 'o'  
 *              (  
 *              ( normI(A),         NORM = 'I' or 'i'  
 *              (  
 *              ( normF(A),         NORM = 'F', 'f', 'E' or 'e'  
 *  
 *  where  norm1  denotes the  one norm of a matrix (maximum column sum),  
 *  normI  denotes the  infinity norm  of a matrix  (maximum row sum) and  
 *  normF  denotes the  Frobenius norm of a matrix (square root of sum of  
 *  squares).  Note that  max(abs(A(i,j)))  is not a consistent matrix norm.  
 *  
 *  Arguments  
 *  =========  
 *  
 *  NORM    (input) CHARACTER*1  
 *          Specifies the value to be returned in DLANTP as described  
 *          above.  
 *  
 *  UPLO    (input) CHARACTER*1  
 *          Specifies whether the matrix A is upper or lower triangular.  
 *          = 'U':  Upper triangular  
 *          = 'L':  Lower triangular  
 *  
 *  DIAG    (input) CHARACTER*1  
 *          Specifies whether or not the matrix A is unit triangular.  
 *          = 'N':  Non-unit triangular  
 *          = 'U':  Unit triangular  
 *  
 *  N       (input) INTEGER  
 *          The order of the matrix A.  N >= 0.  When N = 0, DLANTP is  
 *          set to zero.  
 *  
 *  AP      (input) DOUBLE PRECISION array, dimension (N*(N+1)/2)  
 *          The upper or lower triangular matrix A, packed columnwise in  
 *          a linear array.  The j-th column of A is stored in the array  
 *          AP as follows:  
 *          if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j;  
 *          if UPLO = 'L', AP(i + (j-1)*(2n-j)/2) = A(i,j) for j<=i<=n.  
 *          Note that when DIAG = 'U', the elements of the array AP  
 *          corresponding to the diagonal elements of the matrix A are  
 *          not referenced, but are assumed to be one.  
 *  
 *  WORK    (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK)),  
 *          where LWORK >= N when NORM = 'I'; otherwise, WORK is not  
 *          referenced.  
 *  
 * =====================================================================  * =====================================================================
 *  *
 *     .. Parameters ..  *     .. Parameters ..
Line 82 Line 147
 *     .. Local Scalars ..  *     .. Local Scalars ..
       LOGICAL            UDIAG        LOGICAL            UDIAG
       INTEGER            I, J, K        INTEGER            I, J, K
       DOUBLE PRECISION   SCALE, SUM, VALUE        DOUBLE PRECISION   SUM, VALUE
 *     ..  *     ..
 *     .. External Subroutines ..  *     .. Local Arrays ..
       EXTERNAL           DLASSQ        DOUBLE PRECISION   SSQ( 2 ), COLSSQ( 2 )
 *     ..  *     ..
 *     .. External Functions ..  *     .. External Functions ..
       LOGICAL            LSAME        LOGICAL            LSAME, DISNAN
       EXTERNAL           LSAME        EXTERNAL           LSAME, DISNAN
   *     ..
   *     .. External Subroutines ..
         EXTERNAL           DLASSQ, DCOMBSSQ
 *     ..  *     ..
 *     .. Intrinsic Functions ..  *     .. Intrinsic Functions ..
       INTRINSIC          ABS, MAX, SQRT        INTRINSIC          ABS, SQRT
 *     ..  *     ..
 *     .. Executable Statements ..  *     .. Executable Statements ..
 *  *
Line 108 Line 176
             IF( LSAME( UPLO, 'U' ) ) THEN              IF( LSAME( UPLO, 'U' ) ) THEN
                DO 20 J = 1, N                 DO 20 J = 1, N
                   DO 10 I = K, K + J - 2                    DO 10 I = K, K + J - 2
                      VALUE = MAX( VALUE, ABS( AP( I ) ) )                       SUM = ABS( AP( I ) )
                        IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
    10             CONTINUE     10             CONTINUE
                   K = K + J                    K = K + J
    20          CONTINUE     20          CONTINUE
             ELSE              ELSE
                DO 40 J = 1, N                 DO 40 J = 1, N
                   DO 30 I = K + 1, K + N - J                    DO 30 I = K + 1, K + N - J
                      VALUE = MAX( VALUE, ABS( AP( I ) ) )                       SUM = ABS( AP( I ) )
                        IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
    30             CONTINUE     30             CONTINUE
                   K = K + N - J + 1                    K = K + N - J + 1
    40          CONTINUE     40          CONTINUE
Line 125 Line 195
             IF( LSAME( UPLO, 'U' ) ) THEN              IF( LSAME( UPLO, 'U' ) ) THEN
                DO 60 J = 1, N                 DO 60 J = 1, N
                   DO 50 I = K, K + J - 1                    DO 50 I = K, K + J - 1
                      VALUE = MAX( VALUE, ABS( AP( I ) ) )                       SUM = ABS( AP( I ) )
                        IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
    50             CONTINUE     50             CONTINUE
                   K = K + J                    K = K + J
    60          CONTINUE     60          CONTINUE
             ELSE              ELSE
                DO 80 J = 1, N                 DO 80 J = 1, N
                   DO 70 I = K, K + N - J                    DO 70 I = K, K + N - J
                      VALUE = MAX( VALUE, ABS( AP( I ) ) )                       SUM = ABS( AP( I ) )
                        IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
    70             CONTINUE     70             CONTINUE
                   K = K + N - J + 1                    K = K + N - J + 1
    80          CONTINUE     80          CONTINUE
Line 159 Line 231
   100             CONTINUE    100             CONTINUE
                END IF                 END IF
                K = K + J                 K = K + J
                VALUE = MAX( VALUE, SUM )                 IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
   110       CONTINUE    110       CONTINUE
          ELSE           ELSE
             DO 140 J = 1, N              DO 140 J = 1, N
Line 175 Line 247
   130             CONTINUE    130             CONTINUE
                END IF                 END IF
                K = K + N - J + 1                 K = K + N - J + 1
                VALUE = MAX( VALUE, SUM )                 IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
   140       CONTINUE    140       CONTINUE
          END IF           END IF
       ELSE IF( LSAME( NORM, 'I' ) ) THEN        ELSE IF( LSAME( NORM, 'I' ) ) THEN
Line 232 Line 304
          END IF           END IF
          VALUE = ZERO           VALUE = ZERO
          DO 270 I = 1, N           DO 270 I = 1, N
             VALUE = MAX( VALUE, WORK( I ) )              SUM = WORK( I )
               IF( VALUE .LT. SUM .OR. DISNAN( SUM ) ) VALUE = SUM
   270    CONTINUE    270    CONTINUE
       ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN        ELSE IF( ( LSAME( NORM, 'F' ) ) .OR. ( LSAME( NORM, 'E' ) ) ) THEN
 *  *
 *        Find normF(A).  *        Find normF(A).
   *        SSQ(1) is scale
   *        SSQ(2) is sum-of-squares
   *        For better accuracy, sum each column separately.
 *  *
          IF( LSAME( UPLO, 'U' ) ) THEN           IF( LSAME( UPLO, 'U' ) ) THEN
             IF( LSAME( DIAG, 'U' ) ) THEN              IF( LSAME( DIAG, 'U' ) ) THEN
                SCALE = ONE                 SSQ( 1 ) = ONE
                SUM = N                 SSQ( 2 ) = N
                K = 2                 K = 2
                DO 280 J = 2, N                 DO 280 J = 2, N
                   CALL DLASSQ( J-1, AP( K ), 1, SCALE, SUM )                    COLSSQ( 1 ) = ZERO
                     COLSSQ( 2 ) = ONE
                     CALL DLASSQ( J-1, AP( K ), 1,
        $                         COLSSQ( 1 ), COLSSQ( 2 ) )
                     CALL DCOMBSSQ( SSQ, COLSSQ )
                   K = K + J                    K = K + J
   280          CONTINUE    280          CONTINUE
             ELSE              ELSE
                SCALE = ZERO                 SSQ( 1 ) = ZERO
                SUM = ONE                 SSQ( 2 ) = ONE
                K = 1                 K = 1
                DO 290 J = 1, N                 DO 290 J = 1, N
                   CALL DLASSQ( J, AP( K ), 1, SCALE, SUM )                    COLSSQ( 1 ) = ZERO
                     COLSSQ( 2 ) = ONE
                     CALL DLASSQ( J, AP( K ), 1,
        $                         COLSSQ( 1 ), COLSSQ( 2 ) )
                     CALL DCOMBSSQ( SSQ, COLSSQ )
                   K = K + J                    K = K + J
   290          CONTINUE    290          CONTINUE
             END IF              END IF
          ELSE           ELSE
             IF( LSAME( DIAG, 'U' ) ) THEN              IF( LSAME( DIAG, 'U' ) ) THEN
                SCALE = ONE                 SSQ( 1 ) = ONE
                SUM = N                 SSQ( 2 ) = N
                K = 2                 K = 2
                DO 300 J = 1, N - 1                 DO 300 J = 1, N - 1
                   CALL DLASSQ( N-J, AP( K ), 1, SCALE, SUM )                    COLSSQ( 1 ) = ZERO
                     COLSSQ( 2 ) = ONE
                     CALL DLASSQ( N-J, AP( K ), 1,
        $                         COLSSQ( 1 ), COLSSQ( 2 ) )
                     CALL DCOMBSSQ( SSQ, COLSSQ )
                   K = K + N - J + 1                    K = K + N - J + 1
   300          CONTINUE    300          CONTINUE
             ELSE              ELSE
                SCALE = ZERO                 SSQ( 1 ) = ZERO
                SUM = ONE                 SSQ( 2 ) = ONE
                K = 1                 K = 1
                DO 310 J = 1, N                 DO 310 J = 1, N
                   CALL DLASSQ( N-J+1, AP( K ), 1, SCALE, SUM )                    COLSSQ( 1 ) = ZERO
                     COLSSQ( 2 ) = ONE
                     CALL DLASSQ( N-J+1, AP( K ), 1,
        $                         COLSSQ( 1 ), COLSSQ( 2 ) )
                     CALL DCOMBSSQ( SSQ, COLSSQ )
                   K = K + N - J + 1                    K = K + N - J + 1
   310          CONTINUE    310          CONTINUE
             END IF              END IF
          END IF           END IF
          VALUE = SCALE*SQRT( SUM )           VALUE = SSQ( 1 )*SQRT( SSQ( 2 ) )
       END IF        END IF
 *  *
       DLANTP = VALUE        DLANTP = VALUE

Removed from v.1.1  
changed lines
  Added in v.1.18


CVSweb interface <joel.bertrand@systella.fr>