Files
lapack/TESTING/LIN/cqrt04.f
T
Julie e18d437924 Making LAPACK's code eternal... no more version and date in source files.
GitHub is now enabling us to track accurately version and date.
No need for this anymore.
2021-03-25 10:16:58 -07:00

260 lines
6.5 KiB
FortranFixed

*> \brief \b CQRT04
*
* =========== DOCUMENTATION ===========
*
* Online html documentation available at
* http://www.netlib.org/lapack/explore-html/
*
* Definition:
* ===========
*
* SUBROUTINE CQRT04(M,N,NB,RESULT)
*
* .. Scalar Arguments ..
* INTEGER M, N, NB, LDT
* .. Return values ..
* REAL RESULT(6)
*
*
*> \par Purpose:
* =============
*>
*> \verbatim
*>
*> CQRT04 tests CGEQRT and CGEMQRT.
*> \endverbatim
*
* Arguments:
* ==========
*
*> \param[in] M
*> \verbatim
*> M is INTEGER
*> Number of rows in test matrix.
*> \endverbatim
*>
*> \param[in] N
*> \verbatim
*> N is INTEGER
*> Number of columns in test matrix.
*> \endverbatim
*>
*> \param[in] NB
*> \verbatim
*> NB is INTEGER
*> Block size of test matrix. NB <= Min(M,N).
*> \endverbatim
*>
*> \param[out] RESULT
*> \verbatim
*> RESULT is REAL array, dimension (6)
*> Results of each of the six tests below.
*>
*> RESULT(1) = | A - Q R |
*> RESULT(2) = | I - Q^H Q |
*> RESULT(3) = | Q C - Q C |
*> RESULT(4) = | Q^H C - Q^H C |
*> RESULT(5) = | C Q - C Q |
*> RESULT(6) = | C Q^H - C Q^H |
*> \endverbatim
*
* Authors:
* ========
*
*> \author Univ. of Tennessee
*> \author Univ. of California Berkeley
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
*> \ingroup complex_lin
*
* =====================================================================
SUBROUTINE CQRT04(M,N,NB,RESULT)
IMPLICIT NONE
*
* -- LAPACK test routine --
* -- LAPACK is a software package provided by Univ. of Tennessee, --
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
*
* .. Scalar Arguments ..
INTEGER M, N, NB, LDT
* .. Return values ..
REAL RESULT(6)
*
* =====================================================================
*
* ..
* .. Local allocatable arrays
COMPLEX, ALLOCATABLE :: AF(:,:), Q(:,:),
$ R(:,:), WORK( : ), T(:,:),
$ CF(:,:), DF(:,:), A(:,:), C(:,:), D(:,:)
REAL, ALLOCATABLE :: RWORK(:)
*
* .. Parameters ..
REAL ZERO
COMPLEX ONE, CZERO
PARAMETER( ZERO = 0.0, ONE = (1.0,0.0), CZERO=(0.0,0.0) )
* ..
* .. Local Scalars ..
INTEGER INFO, J, K, L, LWORK
REAL ANORM, EPS, RESID, CNORM, DNORM
* ..
* .. Local Arrays ..
INTEGER ISEED( 4 )
* ..
* .. External Functions ..
REAL SLAMCH
REAL CLANGE, CLANSY
LOGICAL LSAME
EXTERNAL SLAMCH, CLANGE, CLANSY, LSAME
* ..
* .. Intrinsic Functions ..
INTRINSIC MAX, MIN
* ..
* .. Data statements ..
DATA ISEED / 1988, 1989, 1990, 1991 /
*
EPS = SLAMCH( 'Epsilon' )
K = MIN(M,N)
L = MAX(M,N)
LWORK = MAX(2,L)*MAX(2,L)*NB
*
* Dynamically allocate local arrays
*
ALLOCATE ( A(M,N), AF(M,N), Q(M,M), R(M,L), RWORK(L),
$ WORK(LWORK), T(NB,N), C(M,N), CF(M,N),
$ D(N,M), DF(N,M) )
*
* Put random numbers into A and copy to AF
*
LDT=NB
DO J=1,N
CALL CLARNV( 2, ISEED, M, A( 1, J ) )
END DO
CALL CLACPY( 'Full', M, N, A, M, AF, M )
*
* Factor the matrix A in the array AF.
*
CALL CGEQRT( M, N, NB, AF, M, T, LDT, WORK, INFO )
*
* Generate the m-by-m matrix Q
*
CALL CLASET( 'Full', M, M, CZERO, ONE, Q, M )
CALL CGEMQRT( 'R', 'N', M, M, K, NB, AF, M, T, LDT, Q, M,
$ WORK, INFO )
*
* Copy R
*
CALL CLASET( 'Full', M, N, CZERO, CZERO, R, M )
CALL CLACPY( 'Upper', M, N, AF, M, R, M )
*
* Compute |R - Q'*A| / |A| and store in RESULT(1)
*
CALL CGEMM( 'C', 'N', M, N, M, -ONE, Q, M, A, M, ONE, R, M )
ANORM = CLANGE( '1', M, N, A, M, RWORK )
RESID = CLANGE( '1', M, N, R, M, RWORK )
IF( ANORM.GT.ZERO ) THEN
RESULT( 1 ) = RESID / (EPS*MAX(1,M)*ANORM)
ELSE
RESULT( 1 ) = ZERO
END IF
*
* Compute |I - Q'*Q| and store in RESULT(2)
*
CALL CLASET( 'Full', M, M, CZERO, ONE, R, M )
CALL CHERK( 'U', 'C', M, M, REAL(-ONE), Q, M, REAL(ONE), R, M )
RESID = CLANSY( '1', 'Upper', M, R, M, RWORK )
RESULT( 2 ) = RESID / (EPS*MAX(1,M))
*
* Generate random m-by-n matrix C and a copy CF
*
DO J=1,N
CALL CLARNV( 2, ISEED, M, C( 1, J ) )
END DO
CNORM = CLANGE( '1', M, N, C, M, RWORK)
CALL CLACPY( 'Full', M, N, C, M, CF, M )
*
* Apply Q to C as Q*C
*
CALL CGEMQRT( 'L', 'N', M, N, K, NB, AF, M, T, NB, CF, M,
$ WORK, INFO)
*
* Compute |Q*C - Q*C| / |C|
*
CALL CGEMM( 'N', 'N', M, N, M, -ONE, Q, M, C, M, ONE, CF, M )
RESID = CLANGE( '1', M, N, CF, M, RWORK )
IF( CNORM.GT.ZERO ) THEN
RESULT( 3 ) = RESID / (EPS*MAX(1,M)*CNORM)
ELSE
RESULT( 3 ) = ZERO
END IF
*
* Copy C into CF again
*
CALL CLACPY( 'Full', M, N, C, M, CF, M )
*
* Apply Q to C as QT*C
*
CALL CGEMQRT( 'L', 'C', M, N, K, NB, AF, M, T, NB, CF, M,
$ WORK, INFO)
*
* Compute |QT*C - QT*C| / |C|
*
CALL CGEMM( 'C', 'N', M, N, M, -ONE, Q, M, C, M, ONE, CF, M )
RESID = CLANGE( '1', M, N, CF, M, RWORK )
IF( CNORM.GT.ZERO ) THEN
RESULT( 4 ) = RESID / (EPS*MAX(1,M)*CNORM)
ELSE
RESULT( 4 ) = ZERO
END IF
*
* Generate random n-by-m matrix D and a copy DF
*
DO J=1,M
CALL CLARNV( 2, ISEED, N, D( 1, J ) )
END DO
DNORM = CLANGE( '1', N, M, D, N, RWORK)
CALL CLACPY( 'Full', N, M, D, N, DF, N )
*
* Apply Q to D as D*Q
*
CALL CGEMQRT( 'R', 'N', N, M, K, NB, AF, M, T, NB, DF, N,
$ WORK, INFO)
*
* Compute |D*Q - D*Q| / |D|
*
CALL CGEMM( 'N', 'N', N, M, M, -ONE, D, N, Q, M, ONE, DF, N )
RESID = CLANGE( '1', N, M, DF, N, RWORK )
IF( CNORM.GT.ZERO ) THEN
RESULT( 5 ) = RESID / (EPS*MAX(1,M)*DNORM)
ELSE
RESULT( 5 ) = ZERO
END IF
*
* Copy D into DF again
*
CALL CLACPY( 'Full', N, M, D, N, DF, N )
*
* Apply Q to D as D*QT
*
CALL CGEMQRT( 'R', 'C', N, M, K, NB, AF, M, T, NB, DF, N,
$ WORK, INFO)
*
* Compute |D*QT - D*QT| / |D|
*
CALL CGEMM( 'N', 'C', N, M, M, -ONE, D, N, Q, M, ONE, DF, N )
RESID = CLANGE( '1', N, M, DF, N, RWORK )
IF( CNORM.GT.ZERO ) THEN
RESULT( 6 ) = RESID / (EPS*MAX(1,M)*DNORM)
ELSE
RESULT( 6 ) = ZERO
END IF
*
* Deallocate all arrays
*
DEALLOCATE ( A, AF, Q, R, RWORK, WORK, T, C, D, CF, DF)
*
RETURN
END