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)