334 SUBROUTINE zchkhb2stg( NSIZES, NN, NWDTHS, KK, NTYPES, DOTYPE,
335 $ ISEED, THRESH, NOUNIT, A, LDA, SD, SE, D1,
336 $ D2, D3, U, LDU, WORK, LWORK, RWORK, RESULT,
344 INTEGER INFO, LDA, LDU, LWORK, NOUNIT, NSIZES, NTYPES,
346 DOUBLE PRECISION THRESH
350 INTEGER ISEED( 4 ), KK( * ), NN( * )
351 DOUBLE PRECISION RESULT( * ), RWORK( * ), SD( * ), SE( * ),
352 $ d1( * ), d2( * ), d3( * )
353 COMPLEX*16 A( LDA, * ), U( LDU, * ), WORK( * )
359 COMPLEX*16 CZERO, CONE
360 PARAMETER ( CZERO = ( 0.0d+0, 0.0d+0 ),
361 $ cone = ( 1.0d+0, 0.0d+0 ) )
362 DOUBLE PRECISION ZERO, ONE, TWO, TEN
363 parameter( zero = 0.0d+0, one = 1.0d+0, two = 2.0d+0,
365 DOUBLE PRECISION HALF
366 parameter( half = one / two )
368 parameter( maxtyp = 15 )
371 LOGICAL BADNN, BADNNB
372 INTEGER I, IINFO, IMODE, ITYPE, J, JC, JCOL, JR, JSIZE,
373 $ JTYPE, JWIDTH, K, KMAX, LH, , MTYPES, N,
374 $ nerrs, nmats, nmax, ntest, ntestt
375 DOUBLE PRECISION ANINV, ANORM, COND, OVFL, RTOVFL, RTUNFL,
376 $ TEMP1, TEMP2, TEMP3, TEMP4, ULP, ULPINV, UNFL
379 INTEGER IDUMMA( 1 ), IOLDSD( 4 ), KMAGN( MAXTYP ),
380 $ KMODE( MAXTYP ), KTYPE( MAXTYP )
383 DOUBLE PRECISION DLAMCH
394 DATA ktype / 1, 2, 5*4, 5*5, 3*8 /
395 DATA kmagn / 2*1, 1, 1, 1, 2, 3, 1, 1, 1, 2, 3, 1,
397 DATA kmode / 2*0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
412 nmax =
max( nmax, nn( j ) )
420 kmax =
max( kmax, kk( j ) )
424 kmax =
min( nmax-1, kmax )
428 IF( nsizes.LT.0 )
THEN
430 ELSE IF( badnn )
THEN
432 ELSE IF( nwdths.LT.0 )
THEN
434 ELSE IF( badnnb )
THEN
436 ELSE IF( ntypes.LT.0 )
THEN
438 ELSE IF( lda.LT.kmax+1 )
THEN
440 ELSE IF( ldu.LT.nmax )
THEN
442 ELSE IF( (
max( lda, nmax )+1 )*nmax.GT.lwork )
THEN
447 CALL xerbla(
'ZCHKHB2STG', -info )
453 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 .OR. nwdths.EQ.0 )
458 unfl = dlamch(
'Safe minimum' )
460 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
462 rtunfl = sqrt( unfl )
463 rtovfl = sqrt( ovfl )
470 DO 190 jsize = 1, nsizes
472 aninv = one / dble(
max( 1, n ) )
474 DO 180 jwidth = 1, nwdths
478 k =
max( 0,
min( n-1, k ) )
480 IF( nsizes.NE.1 )
THEN
481 mtypes =
min( maxtyp, ntypes )
483 mtypes =
min( maxtyp+1, ntypes )
486 DO 170 jtype = 1, mtypes
487 IF( .NOT.dotype( jtype ) )
493 ioldsd( j ) = iseed( j )
513 IF( mtypes.GT.maxtyp )
516 itype = ktype( jtype )
517 imode = kmode( jtype )
521 GO TO ( 40, 50, 60 )kmagn( jtype )
528 anorm = ( rtovfl*ulp )*aninv
532 anorm = rtunfl*n*ulpinv
537 CALL zlaset(
'Full', lda, n, czero, czero, a, lda )
539 IF( jtype.LE.15 )
THEN
542 cond = ulpinv*aninv / ten
549 IF( itype.EQ.1 )
THEN
552 ELSE IF( itype.EQ.2 )
THEN
557 a( k+1, jcol ) = anorm
560 ELSE IF( itype.EQ.4 )
THEN
564 CALL zlatms( n, n,
'S', iseed,
'H', rwork, imode,
565 $ cond, anorm, 0, 0,
'Q', a( k+1, 1 ), lda,
568 ELSE IF( itype.EQ.5 )
THEN
572 CALL zlatms( n, n,
'S', iseed,
'H', rwork, imode,
573 $ cond, anorm, k, k,
'Q', a, lda, work,
576 ELSE IF( itype.EQ.7 )
THEN
580 CALL zlatmr( n, n,
'S', iseed,
'H', work, 6, one,
581 $ cone,
'T',
'N', work( n+1 ), 1, one,
582 $ work( 2*n+1 ), 1, one,
'N', idumma, 0, 0,
583 $ zero, anorm,
'Q', a( k+1, 1 ), lda,
586 ELSE IF( itype.EQ.8 )
THEN
590 CALL zlatmr( n, n,
'S', iseed,
'H', work, 6, one,
591 $ cone,
'T',
'N', work( n+1 ), 1, one,
592 $ work( 2*n+1 ), 1, one,
'N', idumma, k, k,
593 $ zero, anorm,
'Q', a, lda, idumma, iinfo )
595 ELSE IF( itype.EQ.9 )
THEN
599 CALL zlatms( n, n,
'S', iseed,
'P', rwork, imode,
600 $ cond, anorm, k, k,
'Q', a, lda,
601 $ work( n+1 ), iinfo )
603 ELSE IF( itype.EQ.10 )
THEN
609 CALL zlatms( n, n,
'S', iseed,
'P', rwork, imode,
610 $ cond, anorm, 1, 1,
'Q', a( k, 1 ), lda,
613 temp1 = abs( a( k, i ) ) /
614 $ sqrt( abs( a( k+1, i-1 )*a( k+1, i ) ) )
615 IF( temp1.GT.half )
THEN
616 a( k, i ) = half*sqrt( abs( a( k+1,
617 $ i-1 )*a( k+1, i ) ) )
626 IF( iinfo.NE.0 )
THEN
627 WRITE( nounit, fmt = 9999 )
'Generator', iinfo, n,
637 CALL zlacpy(
' ', k+1, n, a, lda, work, lda )
640 CALL zhbtrd(
'V',
'U', n, k, work, lda, sd, se, u, ldu,
641 $ work( lda*n+1 ), iinfo )
643 IF( iinfo.NE.0 )
THEN
644 WRITE( nounit, fmt = 9999 )
'ZHBTRD(U)', iinfo, n,
647 IF( iinfo.LT.0 )
THEN
657 CALL zhbt21(
'Upper', n, k, 1, a, lda, sd, se, u, ldu,
658 $ work, rwork, result( 1 ) )
672 CALL dcopy( n, sd, 1, d1, 1 )
674 $
CALL dcopy( n-1, se, 1, rwork, 1 )
676 CALL zsteqr(
'N', n, d1, rwork, work, ldu,
677 $ rwork( n+1 ), iinfo )
678 IF( iinfo.NE.0 )
THEN
679 WRITE( nounit, fmt = 9999 )
'ZSTEQR(N)', iinfo, n,
682 IF( iinfo.LT.0 )
THEN
695 CALL dlaset(
'Full', n, 1, zero, zero, sd, n )
696 CALL dlaset(
'Full', n, 1, zero, zero, se, n )
697 CALL zlacpy(
' ', k+1, n, a, lda, u, ldu )
701 $ work, lh, work( lh+1 ), lw, iinfo )
705 CALL dcopy( n, sd, 1, d2, 1 )
707 $
CALL dcopy( n-1, se, 1, rwork, 1 )
709 CALL zsteqr(
'N', n, d2, rwork, work, ldu,
710 $ rwork( n+1 ), iinfo )
711 IF( iinfo.NE.0 )
THEN
712 WRITE( nounit, fmt = 9999 )
'ZSTEQR(N)', iinfo, n,
715 IF( iinfo.LT.0 )
THEN
727 DO 110 jr = 0,
min( k, n-jc )
728 a( jr+1, jc ) = dconjg( a( k+1-jr, jc+jr ) )
731 DO 140 jc = n + 1 - k, n
732 DO 130 jr =
min( k, n-jc ) + 1, k
739 CALL zlacpy( '
', K+1, N, A, LDA, WORK, LDA )
742 CALL ZHBTRD( 'v
', 'l
', N, K, WORK, LDA, SD, SE, U, LDU,
743 $ WORK( LDA*N+1 ), IINFO )
745.NE.
IF( IINFO0 ) THEN
746 WRITE( NOUNIT, FMT = 9999 )'zhbtrd(l)
', IINFO, N,
749.LT.
IF( IINFO0 ) THEN
760 CALL ZHBT21( 'lower
', N, K, 1, A, LDA, SD, SE, U, LDU,
761 $ WORK, RWORK, RESULT( 3 ) )
768 CALL DLASET( 'full
', N, 1, ZERO, ZERO, SD, N )
769 CALL DLASET( 'full
', N, 1, ZERO, ZERO, SE, N )
770 CALL ZLACPY( ' ', K+1, N, A, LDA, U, LDU )
773 CALL ZHETRD_HB2ST( 'n
', 'n
', "L", N, K, U, LDU, SD, SE,
774 $ WORK, LH, WORK( LH+1 ), LW, IINFO )
778 CALL DCOPY( N, SD, 1, D3, 1 )
780 $ CALL DCOPY( N-1, SE, 1, RWORK, 1 )
782 CALL ZSTEQR( 'n
', N, D3, RWORK, WORK, LDU,
783 $ RWORK( N+1 ), IINFO )
784.NE.
IF( IINFO0 ) THEN
785 WRITE( NOUNIT, FMT = 9999 )'zsteqr(n)
', IINFO, N,
788.LT.
IF( IINFO0 ) THEN
807 TEMP1 = MAX( TEMP1, ABS( D1( J ) ), ABS( D2( J ) ) )
808 TEMP2 = MAX( TEMP2, ABS( D1( J )-D2( J ) ) )
809 TEMP3 = MAX( TEMP3, ABS( D1( J ) ), ABS( D3( J ) ) )
810 TEMP4 = MAX( TEMP4, ABS( D1( J )-D3( J ) ) )
813 RESULT(5) = TEMP2 / MAX( UNFL, ULP*MAX( TEMP1, TEMP2 ) )
814 RESULT(6) = TEMP4 / MAX( UNFL, ULP*MAX( TEMP3, TEMP4 ) )
819 NTESTT = NTESTT + NTEST
824.GE.
IF( RESULT( JR )THRESH ) THEN
829.EQ.
IF( NERRS0 ) THEN
830 WRITE( NOUNIT, FMT = 9998 )'zhb
'
831 WRITE( NOUNIT, FMT = 9997 )
832 WRITE( NOUNIT, FMT = 9996 )
833 WRITE( NOUNIT, FMT = 9995 )'hermitian
'
834 WRITE( NOUNIT, FMT = 9994 )'unitary
', '*
',
835 $ 'conjugate transpose
', ( '*
', J = 1, 6 )
838 WRITE( NOUNIT, FMT = 9993 )N, K, IOLDSD, JTYPE,
849 CALL DLASUM( 'zhb
', NOUNIT, NERRS, NTESTT )
852 9999 FORMAT( ' zchkhb2stg:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
853 $ I6, ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ), I5, ')
' )
854 9998 FORMAT( / 1X, A3,
855 $ ' --
Complex Hermitian Banded Tridiagonal Reduction Routines
'
857 9997 FORMAT( ' Matrix types (see DCHK23 for details):
' )
859 9996 FORMAT( / ' Special Matrices:
',
860 $ / ' 1=zero matrix.
',
861 $ ' 5=diagonal: clustered entries.
',
862 $ / ' 2=identity matrix.
',
863 $ ' 6=diagonal: large, evenly spaced.
',
864 $ / ' 3=diagonal: evenly spaced entries.
',
865 $ ' 7=diagonal: small, evenly spaced.
',
866 $ / ' 4=diagonal: geometr. spaced entries.
' )
867 9995 FORMAT( ' dense
', A, ' banded matrices:
',
868 $ / ' 8=evenly spaced eigenvals.
',
869 $ ' 12=small, evenly spaced eigenvals.
',
870 $ / ' 9=geometrically spaced eigenvals.
',
871 $ ' 13=matrix with random o(1) entries.
',
872 $ / ' 10=clustered eigenvalues.
',
873 $ ' 14=matrix with large random entries.
',
874 $ / ' 11=large, evenly spaced eigenvals.
',
875 $ ' 15=matrix with small random entries.
' )
877 9994 FORMAT( / ' tests performed: (s is tridiag, u is
', A, ',
',
878 $ / 20X, A, ' means
', A, '.
', / ' uplo=
''u
'':
',
879 $ / ' 1= | a - u s u
', A1, ' | / ( |a| n ulp )
',
880 $ ' 2= | i - u u
', A1, ' | / ( n ulp )
', / ' uplo=
''l
'':
',
881 $ / ' 3= | a - u s u
', A1, ' | / ( |a| n ulp )
',
882 $ ' 4= | i - u u
', A1, ' | / ( n ulp )
' / ' eig check:
',
883 $ /' 5= | d1 - d2
', '', ' | / ( |d1| ulp )
',
884 $ ' 6= | d1 - d3
', '', ' | / ( |d1| ulp )
' )
885 9993 FORMAT( ' n=
', I5, ', k=
', I4, ',
seed=
', 4( I4, ',
' ), ' type ',
886 $ I2, ', test(
', I2, ')=
', G10.3 )
subroutine eig(k_diag, k_lt, iadk, jdik, ms, in, nddl, ndof, nnzl, x, d, v, a, bufel, ixs, ixq, ixc, ixt, ixp, ixr, ixtg, pm, geo, cont, icut, skew, xcut, fint, itab, fext, fopt, anin, lpby, npby, nstrf, rwbuf, nprw, tani, elbuf_tab, matparam_tab, dd_iad, fr_iad, dd_front, cluster, weight, eani, ipart, rby, nom_opt, igrsurf, bufsf, idata, rdata, bufmat, bufgeo, kxx, ixx, kxsp, ixsp, nod2sp, spbuf, ixs10, ixs20, ixs16, vr, monvol, volmon, ipm, igeo, iparg, eigipm, eigibuf, eigrpm, ldiag, ljdik, ljdik2, ikc, maxncv, thke, nms, nint2, iint2, ipari, intbuf_tab, nodglob, iad_elem, fr_elem, fr_sec, fr_rby2, iad_rby2, fr_wall, inloc, iddl, partsav, fncont, ftcont, temp, err_thk_sh4, err_thk_sh3, irbe2, irbe3, lrbe2, lrbe3, fr_rbe2, fr_rbe3m, iad_rbe2, weight_md, fcluster, mcluster, xfem_tab, w, nv46, nercvois, nesdvois, lercvois, lesdvois, crkedge, indx_crk, xedge4n, xedge3n, stack, sph2sol, stifn, stifr, drape_q4, drape_t3, h3d_data, subset, igrnod, fcont_max, fncontp2, ftcontp2, ale_connectivity, glob_therm)