00001 SUBROUTINE ZQRT13( SCALE, M, N, A, LDA, NORMA, ISEED )
00002
00003
00004
00005
00006
00007
00008 INTEGER LDA, M, N, SCALE
00009 DOUBLE PRECISION NORMA
00010
00011
00012 INTEGER ISEED( 4 )
00013 COMPLEX*16 A( LDA, * )
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 DOUBLE PRECISION ONE
00052 PARAMETER ( ONE = 1.0D0 )
00053
00054
00055 INTEGER INFO, J
00056 DOUBLE PRECISION BIGNUM, SMLNUM
00057
00058
00059 DOUBLE PRECISION DLAMCH, DZASUM, ZLANGE
00060 EXTERNAL DLAMCH, DZASUM, ZLANGE
00061
00062
00063 EXTERNAL DLABAD, ZLARNV, ZLASCL
00064
00065
00066 INTRINSIC DBLE, DCMPLX, SIGN
00067
00068
00069 DOUBLE PRECISION DUMMY( 1 )
00070
00071
00072
00073 IF( M.LE.0 .OR. N.LE.0 )
00074 $ RETURN
00075
00076
00077
00078 DO 10 J = 1, N
00079 CALL ZLARNV( 2, ISEED, M, A( 1, J ) )
00080 IF( J.LE.M ) THEN
00081 A( J, J ) = A( J, J ) + DCMPLX( SIGN( DZASUM( M, A( 1, J ),
00082 $ 1 ), DBLE( A( J, J ) ) ) )
00083 END IF
00084 10 CONTINUE
00085
00086
00087
00088 IF( SCALE.NE.1 ) THEN
00089 NORMA = ZLANGE( 'Max', M, N, A, LDA, DUMMY )
00090 SMLNUM = DLAMCH( 'Safe minimum' )
00091 BIGNUM = ONE / SMLNUM
00092 CALL DLABAD( SMLNUM, BIGNUM )
00093 SMLNUM = SMLNUM / DLAMCH( 'Epsilon' )
00094 BIGNUM = ONE / SMLNUM
00095
00096 IF( SCALE.EQ.2 ) THEN
00097
00098
00099
00100 CALL ZLASCL( 'General', 0, 0, NORMA, BIGNUM, M, N, A, LDA,
00101 $ INFO )
00102 ELSE IF( SCALE.EQ.3 ) THEN
00103
00104
00105
00106 CALL ZLASCL( 'General', 0, 0, NORMA, SMLNUM, M, N, A, LDA,
00107 $ INFO )
00108 END IF
00109 END IF
00110
00111 NORMA = ZLANGE( 'One-norm', M, N, A, LDA, DUMMY )
00112 RETURN
00113
00114
00115
00116 END