2567
 2568
 2569
 2570
 2571
 2572
 2573
 2574      CHARACTER*1        DIAG, TRANS, UPLO
 2575      INTEGER            IA, ICTXT, INCX, INCY, INFO, IX, IY, JA, JX,
 2576     $                   JY, M, N, NOUT, NROUT
 2577      REAL THRESH
 2578      COMPLEX*16         ALPHA, BETA, ROGUE
 2579
 2580
 2581      INTEGER            DESCA( * ), DESCX( * ), DESCY( * )
 2582      DOUBLE PRECISION   WORK( * )
 2583      COMPLEX*16         A( * ), PA( * ), PX( * ), PY( * ), X( * ),
 2584     $                   Y( * )
 2585
 2586
 2587
 2588
 2589
 2590
 2591
 2592
 2593
 2594
 2595
 2596
 2597
 2598
 2599
 2600
 2601
 2602
 2603
 2604
 2605
 2606
 2607
 2608
 2609
 2610
 2611
 2612
 2613
 2614
 2615
 2616
 2617
 2618
 2619
 2620
 2621
 2622
 2623
 2624
 2625
 2626
 2627
 2628
 2629
 2630
 2631
 2632
 2633
 2634
 2635
 2636
 2637
 2638
 2639
 2640
 2641
 2642
 2643
 2644
 2645
 2646
 2647
 2648
 2649
 2650
 2651
 2652
 2653
 2654
 2655
 2656
 2657
 2658
 2659
 2660
 2661
 2662
 2663
 2664
 2665
 2666
 2667
 2668
 2669
 2670
 2671
 2672
 2673
 2674
 2675
 2676
 2677
 2678
 2679
 2680
 2681
 2682
 2683
 2684
 2685
 2686
 2687
 2688
 2689
 2690
 2691
 2692
 2693
 2694
 2695
 2696
 2697
 2698
 2699
 2700
 2701
 2702
 2703
 2704
 2705
 2706
 2707
 2708
 2709
 2710
 2711
 2712
 2713
 2714
 2715
 2716
 2717
 2718
 2719
 2720
 2721
 2722
 2723
 2724
 2725
 2726
 2727
 2728
 2729
 2730
 2731
 2732
 2733
 2734
 2735
 2736
 2737
 2738
 2739
 2740
 2741
 2742
 2743
 2744
 2745
 2746
 2747
 2748
 2749
 2750
 2751
 2752
 2753
 2754
 2755
 2756
 2757
 2758
 2759
 2760
 2761
 2762
 2763
 2764
 2765
 2766
 2767
 2768
 2769
 2770
 2771
 2772
 2773
 2774
 2775
 2776
 2777
 2778
 2779
 2780
 2781
 2782
 2783
 2784
 2785
 2786
 2787
 2788
 2789
 2790
 2791
 2792
 2793
 2794
 2795
 2796
 2797
 2798
 2799      DOUBLE PRECISION   RZERO
 2800      parameter( rzero = 0.0d+0 )
 2801      COMPLEX*16         ONE, ZERO
 2802      parameter( one = ( 1.0d+0, 0.0d+0 ),
 2803     $                     zero = ( 0.0d+0, 0.0d+0 ) )
 2804      INTEGER            BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
 2805     $                   DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
 2806     $                   RSRC_
 2807      parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
 2808     $                   dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
 2809     $                   imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
 2810     $                   rsrc_ = 9, csrc_ = 10, lld_ = 11 )
 2811
 2812
 2813      INTEGER            I, MYCOL, MYROW, NPCOL, NPROW
 2814      DOUBLE PRECISION   ERR
 2815      COMPLEX*16         ALPHA1
 2816
 2817
 2818      INTEGER            IERR( 3 )
 2819
 2820
 2823
 2824
 2825      LOGICAL            LSAME
 2827
 2828
 2829      INTRINSIC          dcmplx, dble
 2830
 2831
 2832
 2833      info = 0
 2834
 2835
 2836
 2837      IF( ( m.LE.0 ).OR.( n.LE.0 ) )
 2838     $   RETURN
 2839
 2840
 2841
 2842      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
 2843
 2844      DO 10 i = 1, 3
 2845         ierr( i ) = 0
 2846   10 CONTINUE
 2847
 2848      IF( nrout.EQ.1 ) THEN
 2849
 2850
 2851
 2852
 2853
 2854         CALL pzmvch( ictxt, trans, m, n, alpha, a, ia, ja, desca, x,
 
 2855     $                ix, jx, descx, incx, beta, y, py, iy, jy, descy,
 2856     $                incy, work, err, ierr( 3 ) )
 2857
 2858         IF( ierr( 3 ).NE.0 ) THEN
 2859            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 2860     $         WRITE( nout, fmt = 9997 )
 2861         ELSE IF( err.GT.dble( thresh ) ) THEN
 2862            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 2863     $         WRITE( nout, fmt = 9996 ) err
 2864         END IF
 2865
 2866
 2867
 2868         CALL pzchkmin( err, m, n, a, pa, ia, ja, desca, ierr( 1 ) )
 
 2869         IF( 
lsame( trans, 
'N' ) ) 
THEN 
 2870            CALL pzchkvin( err, n, x, px, ix, jx, descx, incx,
 
 2871     $                     ierr( 2 ) )
 2872         ELSE
 2873            CALL pzchkvin( err, m, x, px, ix, jx, descx, incx,
 
 2874     $                     ierr( 2 ) )
 2875         END IF
 2876
 2877      ELSE IF( nrout.EQ.2 ) THEN
 2878
 2879
 2880
 2881
 2882
 2883         CALL pzmvch( ictxt, 
'No transpose', n, n, alpha, a, ia, ja,
 
 2884     $                desca, x, ix, jx, descx, incx, beta, y, py, iy,
 2885     $                jy, descy, incy, work, err, ierr( 3 ) )
 2886
 2887         IF( ierr( 3 ).NE.0 ) THEN
 2888            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 2889     $         WRITE( nout, fmt = 9997 )
 2890         ELSE IF( err.GT.dble( thresh ) ) THEN
 2891            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 2892     $         WRITE( nout, fmt = 9996 ) err
 2893         END IF
 2894
 2895
 2896
 2897         IF( 
lsame( uplo, 
'L' ) ) 
THEN 
 2898            CALL pb_zlaset( 
'Upper', n-1, n-1, 0, rogue, rogue,
 
 2899     $                      a( ia+ja*desca( m_ ) ), desca( m_ ) )
 2900         ELSE
 2901            CALL pb_zlaset( 
'Lower', n-1, n-1, 0, rogue, rogue,
 
 2902     $                      a( ia+1+(ja-1)*desca( m_ ) ), desca( m_ ) )
 2903         END IF
 2904         CALL pzchkmin( err, n, n, a, pa, ia, ja, desca, ierr( 1 ) )
 
 2905         CALL pzchkvin( err, n, x, px, ix, jx, descx, incx, ierr( 2 ) )
 
 2906
 2907      ELSE IF( nrout.EQ.3 ) THEN
 2908
 2909
 2910
 2911
 2912
 2913         CALL pzmvch( ictxt, trans, n, n, one, a, ia, ja, desca, y, ix,
 
 2914     $                jx, descx, incx, zero, x, px, ix, jx, descx, incx,
 2915     $                work, err, ierr( 2 ) )
 2916
 2917         IF( ierr( 2 ).NE.0 ) THEN
 2918            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 2919     $         WRITE( nout, fmt = 9997 )
 2920         ELSE IF( err.GT.dble( thresh ) ) THEN
 2921            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 2922     $         WRITE( nout, fmt = 9996 ) err
 2923         END IF
 2924
 2925
 2926
 2927         IF( 
lsame( uplo, 
'L' ) ) 
THEN 
 2928            IF( 
lsame( diag, 
'N' ) ) 
THEN 
 2929               CALL pb_zlaset( 
'Upper', n-1, n-1, 0, rogue, rogue,
 
 2930     $                         a( ia+ja*desca( m_ ) ), desca( m_ ) )
 2931            ELSE
 2932               CALL pb_zlaset( 
'Upper', n, n, 0, rogue, one,
 
 2933     $                         a( ia+(ja-1)*desca( m_ ) ), desca( m_ ) )
 2934            END IF
 2935         ELSE
 2936            IF( 
lsame( diag, 
'N' ) ) 
THEN 
 2937               CALL pb_zlaset( 
'Lower', n-1, n-1, 0, rogue, rogue,
 
 2938     $                         a( ia+1+(ja-1)*desca( m_ ) ),
 2939     $                         desca( m_ ) )
 2940            ELSE
 2941               CALL pb_zlaset( 
'Lower', n, n, 0, rogue, one,
 
 2942     $                         a( ia+(ja-1)*desca( m_ ) ), desca( m_ ) )
 2943            END IF
 2944         END IF
 2945         CALL pzchkmin( err, n, n, a, pa, ia, ja, desca, ierr( 1 ) )
 
 2946
 2947      ELSE IF( nrout.EQ.4 ) THEN
 2948
 2949
 2950
 2951
 2952
 2953         CALL ztrsv( uplo, trans, diag, n, a( ia+(ja-1)*desca( m_ ) ),
 2954     $               desca( m_ ), x( ix+(jx-1)*descx( m_ ) ), incx )
 2955         CALL pztrmv( uplo, trans, diag, n, pa, ia, ja, desca, px, ix,
 2956     $                jx, descx, incx )
 2957         CALL pzmvch( ictxt, trans, n, n, one, a, ia, ja, desca, x, ix,
 
 2958     $                jx, descx, incx, zero, y, px, ix, jx, descx, incx,
 2959     $                work, err, ierr( 2 ) )
 2960
 2961         IF( ierr( 2 ).NE.0 ) THEN
 2962            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 2963     $         WRITE( nout, fmt = 9997 )
 2964         ELSE IF( err.GT.dble( thresh ) ) THEN
 2965            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 2966     $         WRITE( nout, fmt = 9996 ) err
 2967         END IF
 2968
 2969
 2970
 2971         IF( 
lsame( uplo, 
'L' ) ) 
THEN 
 2972            IF( 
lsame( diag, 
'N' ) ) 
THEN 
 2973               CALL pb_zlaset( 
'Upper', n-1, n-1, 0, rogue, rogue,
 
 2974     $                         a( ia+ja*desca( m_ ) ), desca( m_ ) )
 2975            ELSE
 2976               CALL pb_zlaset( 
'Upper', n, n, 0, rogue, one,
 
 2977     $                         a( ia+(ja-1)*desca( m_ ) ), desca( m_ ) )
 2978            END IF
 2979         ELSE
 2980            IF( 
lsame( diag, 
'N' ) ) 
THEN 
 2981               CALL pb_zlaset( 
'Lower', n-1, n-1, 0, rogue, rogue,
 
 2982     $                         a( ia+1+(ja-1)*desca( m_ ) ),
 2983     $                         desca( m_ ) )
 2984            ELSE
 2985               CALL pb_zlaset( 
'Lower', n, n, 0, rogue, one,
 
 2986     $                         a( ia+(ja-1)*desca( m_ ) ), desca( m_ ) )
 2987            END IF
 2988         END IF
 2989         CALL pzchkmin( err, n, n, a, pa, ia, ja, desca, ierr( 1 ) )
 
 2990
 2991      ELSE IF( nrout.EQ.5 ) THEN
 2992
 2993
 2994
 2995
 2996
 2997         CALL pzvmch( ictxt, 
'No transpose', 
'Ge', m, n, alpha, x, ix,
 
 2998     $                jx, descx, incx, y, iy, jy, descy, incy, a, pa,
 2999     $                ia, ja, desca, work, err, ierr( 1 ) )
 3000         IF( ierr( 1 ).NE.0 ) THEN
 3001            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3002     $         WRITE( nout, fmt = 9997 )
 3003         ELSE IF( err.GT.dble( thresh ) ) THEN
 3004            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3005     $         WRITE( nout, fmt = 9996 ) err
 3006         END IF
 3007
 3008
 3009
 3010         CALL pzchkvin( err, m, x, px, ix, jx, descx, incx, ierr( 2 ) )
 
 3011         CALL pzchkvin( err, n, y, py, iy, jy, descy, incy, ierr( 3 ) )
 
 3012
 3013      ELSE IF( nrout.EQ.6 ) THEN
 3014
 3015
 3016
 3017
 3018
 3019         CALL pzvmch( ictxt, 
'Conjugate transpose', 
'Ge', m, n, alpha,
 
 3020     $                x, ix, jx, descx, incx, y, iy, jy, descy, incy,
 3021     $                a, pa, ia, ja, desca, work, err, ierr( 1 ) )
 3022         IF( ierr( 1 ).NE.0 ) THEN
 3023            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3024     $         WRITE( nout, fmt = 9997 )
 3025         ELSE IF( err.GT.dble( thresh ) ) THEN
 3026            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3027     $         WRITE( nout, fmt = 9996 ) err
 3028         END IF
 3029
 3030
 3031
 3032         CALL pzchkvin( err, m, x, px, ix, jx, descx, incx, ierr( 2 ) )
 
 3033         CALL pzchkvin( err, n, y, py, iy, jy, descy, incy, ierr( 3 ) )
 
 3034
 3035      ELSE IF( nrout.EQ.7 ) THEN
 3036
 3037
 3038
 3039
 3040
 3041         alpha1 = dcmplx( dble( alpha ), rzero )
 3042         CALL pzvmch( ictxt, 
'Conjugate transpose', uplo, n, n, alpha1,
 
 3043     $                x, ix, jx, descx, incx, x, ix, jx, descx, incx, a,
 3044     $                pa, ia, ja, desca, work, err, ierr( 1 ) )
 3045         IF( ierr( 1 ).NE.0 ) THEN
 3046            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3047     $         WRITE( nout, fmt = 9997 )
 3048         ELSE IF( err.GT.dble( thresh ) ) THEN
 3049            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3050     $         WRITE( nout, fmt = 9996 ) err
 3051         END IF
 3052
 3053
 3054
 3055         CALL pzchkvin( err, n, x, px, ix, jx, descx, incx, ierr( 2 ) )
 
 3056
 3057      ELSE IF( nrout.EQ.8 ) THEN
 3058
 3059
 3060
 3061
 3062
 3063         CALL pzvmch2( ictxt, uplo, n, n, alpha, x, ix, jx, descx, incx,
 
 3064     $                 y, iy, jy, descy, incy, a, pa, ia, ja, desca,
 3065     $                 work, err, ierr( 1 ) )
 3066         IF( ierr( 1 ).NE.0 ) THEN
 3067            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3068     $         WRITE( nout, fmt = 9997 )
 3069         ELSE IF( err.GT.dble( thresh ) ) THEN
 3070            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3071     $         WRITE( nout, fmt = 9996 ) err
 3072         END IF
 3073
 3074
 3075
 3076         CALL pzchkvin( err, n, x, px, ix, jx, descx, incx, ierr( 2 ) )
 
 3077         CALL pzchkvin( err, n, y, py, iy, jy, descy, incy, ierr( 3 ) )
 
 3078
 3079      END IF
 3080
 3081      IF( ierr( 1 ).NE.0 ) THEN
 3082         info = info + 1
 3083         IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3084     $      WRITE( nout, fmt = 9999 ) 'A'
 3085      END IF
 3086
 3087      IF( ierr( 2 ).NE.0 ) THEN
 3088         info = info + 2
 3089         IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3090     $      WRITE( nout, fmt = 9998 ) 'X'
 3091      END IF
 3092
 3093      IF( ierr( 3 ).NE.0 ) THEN
 3094         info = info + 4
 3095         IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3096     $      WRITE( nout, fmt = 9998 ) 'Y'
 3097      END IF
 3098
 3099 9999 FORMAT( 2x, '   ***** ERROR: Matrix operand ', a,
 3100     $        ' is incorrect.' )
 3101 9998 FORMAT( 2x, '   ***** ERROR: Vector operand ', a,
 3102     $        ' is incorrect.' )
 3103 9997 FORMAT( 2x, '   ***** FATAL ERROR - Computed result is less ',
 3104     $        'than half accurate *****' )
 3105 9996 FORMAT( 2x, '   ***** Test completed with maximum test ratio: ',
 3106     $        f11.5, ' SUSPECT *****' )
 3107
 3108      RETURN
 3109
 3110
 3111
subroutine pzchkvin(errmax, n, x, px, ix, jx, descx, incx, info)
 
subroutine pb_zlaset(uplo, m, n, ioffd, alpha, beta, a, lda)
 
subroutine pzchkmin(errmax, m, n, a, pa, ia, ja, desca, info)
 
subroutine pzmvch(ictxt, trans, m, n, alpha, a, ia, ja, desca, x, ix, jx, descx, incx, beta, y, py, iy, jy, descy, incy, g, err, info)
 
subroutine pzvmch(ictxt, trans, uplo, m, n, alpha, x, ix, jx, descx, incx, y, iy, jy, descy, incy, a, pa, ia, ja, desca, g, err, info)
 
subroutine pzvmch2(ictxt, uplo, m, n, alpha, x, ix, jx, descx, incx, y, iy, jy, descy, incy, a, pa, ia, ja, desca, g, err, info)