2568
 2569
 2570
 2571
 2572
 2573
 2574
 2575      CHARACTER*1        DIAG, TRANS, UPLO
 2576      INTEGER            IA, ICTXT, INCX, INCY, INFO, IX, IY, JA, JX,
 2577     $                   JY, M, N, NOUT, NROUT
 2578      REAL THRESH
 2579      COMPLEX            ALPHA, BETA, ROGUE
 2580
 2581
 2582      INTEGER            DESCA( * ), DESCX( * ), DESCY( * )
 2583      REAL               WORK( * )
 2584      COMPLEX            A( * ), PA( * ), PX( * ), PY( * ), X( * ),
 2585     $                   Y( * )
 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
 2800      REAL               RZERO
 2801      parameter( rzero = 0.0e+0 )
 2802      COMPLEX            ONE, ZERO
 2803      parameter( one = ( 1.0e+0, 0.0e+0 ),
 2804     $                     zero = ( 0.0e+0, 0.0e+0 ) )
 2805      INTEGER            BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
 2806     $                   DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
 2807     $                   RSRC_
 2808      parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
 2809     $                   dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
 2810     $                   imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
 2811     $                   rsrc_ = 9, csrc_ = 10, lld_ = 11 )
 2812
 2813
 2814      INTEGER            I, MYCOL, MYROW, NPCOL, NPROW
 2815      REAL               ERR
 2816      COMPLEX            ALPHA1
 2817
 2818
 2819      INTEGER            IERR( 3 )
 2820
 2821
 2824
 2825
 2826      LOGICAL            LSAME
 2828
 2829
 2831
 2832
 2833
 2834      info = 0
 2835
 2836
 2837
 2838      IF( ( m.LE.0 ).OR.( n.LE.0 ) )
 2839     $   RETURN
 2840
 2841
 2842
 2843      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
 2844
 2845      DO 10 i = 1, 3
 2846         ierr( i ) = 0
 2847   10 CONTINUE
 2848
 2849      IF( nrout.EQ.1 ) THEN
 2850
 2851
 2852
 2853
 2854
 2855         CALL pcmvch( ictxt, trans, m, n, alpha, a, ia, ja, desca, x,
 
 2856     $                ix, jx, descx, incx, beta, y, py, iy, jy, descy,
 2857     $                incy, work, err, ierr( 3 ) )
 2858
 2859         IF( ierr( 3 ).NE.0 ) THEN
 2860            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 2861     $         WRITE( nout, fmt = 9997 )
 2862         ELSE IF( err.GT.thresh ) THEN
 2863            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 2864     $         WRITE( nout, fmt = 9996 ) err
 2865         END IF
 2866
 2867
 2868
 2869         CALL pcchkmin( err, m, n, a, pa, ia, ja, desca, ierr( 1 ) )
 
 2870         IF( 
lsame( trans, 
'N' ) ) 
THEN 
 2871            CALL pcchkvin( err, n, x, px, ix, jx, descx, incx,
 
 2872     $                     ierr( 2 ) )
 2873         ELSE
 2874            CALL pcchkvin( err, m, x, px, ix, jx, descx, incx,
 
 2875     $                     ierr( 2 ) )
 2876         END IF
 2877
 2878      ELSE IF( nrout.EQ.2 ) THEN
 2879
 2880
 2881
 2882
 2883
 2884         CALL pcmvch( ictxt, 
'No transpose', n, n, alpha, a, ia, ja,
 
 2885     $                desca, x, ix, jx, descx, incx, beta, y, py, iy,
 2886     $                jy, descy, incy, work, err, ierr( 3 ) )
 2887
 2888         IF( ierr( 3 ).NE.0 ) THEN
 2889            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 2890     $         WRITE( nout, fmt = 9997 )
 2891         ELSE IF( err.GT.thresh ) THEN
 2892            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 2893     $         WRITE( nout, fmt = 9996 ) err
 2894         END IF
 2895
 2896
 2897
 2898         IF( 
lsame( uplo, 
'L' ) ) 
THEN 
 2899            CALL pb_claset( 
'Upper', n-1, n-1, 0, rogue, rogue,
 
 2900     $                      a( ia+ja*desca( m_ ) ), desca( m_ ) )
 2901         ELSE
 2902            CALL pb_claset( 
'Lower', n-1, n-1, 0, rogue, rogue,
 
 2903     $                      a( ia+1+(ja-1)*desca( m_ ) ), desca( m_ ) )
 2904         END IF
 2905         CALL pcchkmin( err, n, n, a, pa, ia, ja, desca, ierr( 1 ) )
 
 2906         CALL pcchkvin( err, n, x, px, ix, jx, descx, incx, ierr( 2 ) )
 
 2907
 2908      ELSE IF( nrout.EQ.3 ) THEN
 2909
 2910
 2911
 2912
 2913
 2914         CALL pcmvch( ictxt, trans, n, n, one, a, ia, ja, desca, y, ix,
 
 2915     $                jx, descx, incx, zero, x, px, ix, jx, descx, incx,
 2916     $                work, err, ierr( 2 ) )
 2917
 2918         IF( ierr( 2 ).NE.0 ) THEN
 2919            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 2920     $         WRITE( nout, fmt = 9997 )
 2921         ELSE IF( err.GT.thresh ) THEN
 2922            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 2923     $         WRITE( nout, fmt = 9996 ) err
 2924         END IF
 2925
 2926
 2927
 2928         IF( 
lsame( uplo, 
'L' ) ) 
THEN 
 2929            IF( 
lsame( diag, 
'N' ) ) 
THEN 
 2930               CALL pb_claset( 
'Upper', n-1, n-1, 0, rogue, rogue,
 
 2931     $                         a( ia+ja*desca( m_ ) ), desca( m_ ) )
 2932            ELSE
 2933               CALL pb_claset( 
'Upper', n, n, 0, rogue, one,
 
 2934     $                         a( ia+(ja-1)*desca( m_ ) ), desca( m_ ) )
 2935            END IF
 2936         ELSE
 2937            IF( 
lsame( diag, 
'N' ) ) 
THEN 
 2938               CALL pb_claset( 
'Lower', n-1, n-1, 0, rogue, rogue,
 
 2939     $                         a( ia+1+(ja-1)*desca( m_ ) ),
 2940     $                         desca( m_ ) )
 2941            ELSE
 2942               CALL pb_claset( 
'Lower', n, n, 0, rogue, one,
 
 2943     $                         a( ia+(ja-1)*desca( m_ ) ), desca( m_ ) )
 2944            END IF
 2945         END IF
 2946         CALL pcchkmin( err, n, n, a, pa, ia, ja, desca, ierr( 1 ) )
 
 2947
 2948      ELSE IF( nrout.EQ.4 ) THEN
 2949
 2950
 2951
 2952
 2953
 2954         CALL ctrsv( uplo, trans, diag, n, a( ia+(ja-1)*desca( m_ ) ),
 2955     $               desca( m_ ), x( ix+(jx-1)*descx( m_ ) ), incx )
 2956         CALL pctrmv( uplo, trans, diag, n, pa, ia, ja, desca, px, ix,
 2957     $                jx, descx, incx )
 2958         CALL pcmvch( ictxt, trans, n, n, one, a, ia, ja, desca, x, ix,
 
 2959     $                jx, descx, incx, zero, y, px, ix, jx, descx, incx,
 2960     $                work, err, ierr( 2 ) )
 2961
 2962         IF( ierr( 2 ).NE.0 ) THEN
 2963            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 2964     $         WRITE( nout, fmt = 9997 )
 2965         ELSE IF( err.GT.thresh ) THEN
 2966            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 2967     $         WRITE( nout, fmt = 9996 ) err
 2968         END IF
 2969
 2970
 2971
 2972         IF( 
lsame( uplo, 
'L' ) ) 
THEN 
 2973            IF( 
lsame( diag, 
'N' ) ) 
THEN 
 2974               CALL pb_claset( 
'Upper', n-1, n-1, 0, rogue, rogue,
 
 2975     $                         a( ia+ja*desca( m_ ) ), desca( m_ ) )
 2976            ELSE
 2977               CALL pb_claset( 
'Upper', n, n, 0, rogue, one,
 
 2978     $                         a( ia+(ja-1)*desca( m_ ) ), desca( m_ ) )
 2979            END IF
 2980         ELSE
 2981            IF( 
lsame( diag, 
'N' ) ) 
THEN 
 2982               CALL pb_claset( 
'Lower', n-1, n-1, 0, rogue, rogue,
 
 2983     $                         a( ia+1+(ja-1)*desca( m_ ) ),
 2984     $                         desca( m_ ) )
 2985            ELSE
 2986               CALL pb_claset( 
'Lower', n, n, 0, rogue, one,
 
 2987     $                         a( ia+(ja-1)*desca( m_ ) ), desca( m_ ) )
 2988            END IF
 2989         END IF
 2990         CALL pcchkmin( err, n, n, a, pa, ia, ja, desca, ierr( 1 ) )
 
 2991
 2992      ELSE IF( nrout.EQ.5 ) THEN
 2993
 2994
 2995
 2996
 2997
 2998         CALL pcvmch( ictxt, 
'No transpose', 
'Ge', m, n, alpha, x, ix,
 
 2999     $                jx, descx, incx, y, iy, jy, descy, incy, a, pa,
 3000     $                ia, ja, desca, work, err, ierr( 1 ) )
 3001         IF( ierr( 1 ).NE.0 ) THEN
 3002            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3003     $         WRITE( nout, fmt = 9997 )
 3004         ELSE IF( err.GT.thresh ) THEN
 3005            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3006     $         WRITE( nout, fmt = 9996 ) err
 3007         END IF
 3008
 3009
 3010
 3011         CALL pcchkvin( err, m, x, px, ix, jx, descx, incx, ierr( 2 ) )
 
 3012         CALL pcchkvin( err, n, y, py, iy, jy, descy, incy, ierr( 3 ) )
 
 3013
 3014      ELSE IF( nrout.EQ.6 ) THEN
 3015
 3016
 3017
 3018
 3019
 3020         CALL pcvmch( ictxt, 
'Conjugate transpose', 
'Ge', m, n, alpha,
 
 3021     $                x, ix, jx, descx, incx, y, iy, jy, descy, incy,
 3022     $                a, pa, ia, ja, desca, work, err, ierr( 1 ) )
 3023         IF( ierr( 1 ).NE.0 ) THEN
 3024            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3025     $         WRITE( nout, fmt = 9997 )
 3026         ELSE IF( err.GT.thresh ) THEN
 3027            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3028     $         WRITE( nout, fmt = 9996 ) err
 3029         END IF
 3030
 3031
 3032
 3033         CALL pcchkvin( err, m, x, px, ix, jx, descx, incx, ierr( 2 ) )
 
 3034         CALL pcchkvin( err, n, y, py, iy, jy, descy, incy, ierr( 3 ) )
 
 3035
 3036      ELSE IF( nrout.EQ.7 ) THEN
 3037
 3038
 3039
 3040
 3041
 3042         alpha1 = 
cmplx( real( alpha ), rzero )
 
 3043         CALL pcvmch( ictxt, 
'Conjugate transpose', uplo, n, n, alpha1,
 
 3044     $                x, ix, jx, descx, incx, x, ix, jx, descx, incx, a,
 3045     $                pa, ia, ja, desca, work, err, ierr( 1 ) )
 3046         IF( ierr( 1 ).NE.0 ) THEN
 3047            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3048     $         WRITE( nout, fmt = 9997 )
 3049         ELSE IF( err.GT.thresh ) THEN
 3050            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3051     $         WRITE( nout, fmt = 9996 ) err
 3052         END IF
 3053
 3054
 3055
 3056         CALL pcchkvin( err, n, x, px, ix, jx, descx, incx, ierr( 2 ) )
 
 3057
 3058      ELSE IF( nrout.EQ.8 ) THEN
 3059
 3060
 3061
 3062
 3063
 3064         CALL pcvmch2( ictxt, uplo, n, n, alpha, x, ix, jx, descx, incx,
 
 3065     $                 y, iy, jy, descy, incy, a, pa, ia, ja, desca,
 3066     $                 work, err, ierr( 1 ) )
 3067         IF( ierr( 1 ).NE.0 ) THEN
 3068            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3069     $         WRITE( nout, fmt = 9997 )
 3070         ELSE IF( err.GT.thresh ) THEN
 3071            IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3072     $         WRITE( nout, fmt = 9996 ) err
 3073         END IF
 3074
 3075
 3076
 3077         CALL pcchkvin( err, n, x, px, ix, jx, descx, incx, ierr( 2 ) )
 
 3078         CALL pcchkvin( err, n, y, py, iy, jy, descy, incy, ierr( 3 ) )
 
 3079
 3080      END IF
 3081
 3082      IF( ierr( 1 ).NE.0 ) THEN
 3083         info = info + 1
 3084         IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3085     $      WRITE( nout, fmt = 9999 ) 'A'
 3086      END IF
 3087
 3088      IF( ierr( 2 ).NE.0 ) THEN
 3089         info = info + 2
 3090         IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3091     $      WRITE( nout, fmt = 9998 ) 'X'
 3092      END IF
 3093
 3094      IF( ierr( 3 ).NE.0 ) THEN
 3095         info = info + 4
 3096         IF( myrow.EQ.0 .AND. mycol.EQ.0 )
 3097     $      WRITE( nout, fmt = 9998 ) 'Y'
 3098      END IF
 3099
 3100 9999 FORMAT( 2x, '   ***** ERROR: Matrix operand ', a,
 3101     $        ' is incorrect.' )
 3102 9998 FORMAT( 2x, '   ***** ERROR: Vector operand ', a,
 3103     $        ' is incorrect.' )
 3104 9997 FORMAT( 2x, '   ***** FATAL ERROR - Computed result is less ',
 3105     $        'than half accurate *****' )
 3106 9996 FORMAT( 2x, '   ***** Test completed with maximum test ratio: ',
 3107     $        f11.5, ' SUSPECT *****' )
 3108
 3109      RETURN
 3110
 3111
 3112
subroutine pcchkvin(errmax, n, x, px, ix, jx, descx, incx, info)
 
subroutine pcchkmin(errmax, m, n, a, pa, ia, ja, desca, info)
 
subroutine pcvmch(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 pcvmch2(ictxt, uplo, m, n, alpha, x, ix, jx, descx, incx, y, iy, jy, descy, incy, a, pa, ia, ja, desca, g, err, info)
 
subroutine pcmvch(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 pb_claset(uplo, m, n, ioffd, alpha, beta, a, lda)