2523
2524
2525
2526
2527
2528
2529
2530 CHARACTER*1 DIAG, TRANS, UPLO
2531 INTEGER IA, ICTXT, INCX, INCY, INFO, IX, IY, JA, JX,
2532 $ JY, M, N, NOUT, NROUT
2533 REAL ALPHA, BETA, ROGUE, THRESH
2534
2535
2536 INTEGER DESCA( * ), DESCX( * ), DESCY( * )
2537 REAL A( * ), PA( * ), PX( * ), PY( * ), WORK( * ),
2538 $ X( * ), Y( * )
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
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 REAL ONE, ZERO
2752 parameter( one = 1.0e+0, zero = 0.0e+0 )
2753 INTEGER BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
2754 $ DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
2755 $ RSRC_
2756 parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
2757 $ dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
2758 $ imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
2759 $ rsrc_ = 9, csrc_ = 10, lld_ = 11 )
2760
2761
2762 INTEGER I, MYCOL, MYROW, NPCOL, NPROW
2763 REAL ERR
2764
2765
2766 INTEGER IERR( 3 )
2767
2768
2771
2772
2773 LOGICAL LSAME
2775
2776
2777
2778 info = 0
2779
2780
2781
2782 IF( ( m.LE.0 ).OR.( n.LE.0 ) )
2783 $ RETURN
2784
2785
2786
2787 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
2788
2789 DO 10 i = 1, 3
2790 ierr( i ) = 0
2791 10 CONTINUE
2792
2793 IF( nrout.EQ.1 ) THEN
2794
2795
2796
2797
2798
2799 CALL psmvch( ictxt, trans, m, n, alpha, a, ia, ja, desca, x,
2800 $ ix, jx, descx, incx, beta, y, py, iy, jy, descy,
2801 $ incy, work, err, ierr( 3 ) )
2802
2803 IF( ierr( 3 ).NE.0 ) THEN
2804 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
2805 $ WRITE( nout, fmt = 9997 )
2806 ELSE IF( err.GT.thresh ) THEN
2807 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
2808 $ WRITE( nout, fmt = 9996 ) err
2809 END IF
2810
2811
2812
2813 CALL pschkmin( err, m, n, a, pa, ia, ja, desca, ierr( 1 ) )
2814 IF(
lsame( trans,
'N' ) )
THEN
2815 CALL pschkvin( err, n, x, px, ix, jx, descx, incx,
2816 $ ierr( 2 ) )
2817 ELSE
2818 CALL pschkvin( err, m, x, px, ix, jx, descx, incx,
2819 $ ierr( 2 ) )
2820 END IF
2821
2822 ELSE IF( nrout.EQ.2 ) THEN
2823
2824
2825
2826
2827
2828 CALL psmvch( ictxt,
'No transpose', n, n, alpha, a, ia, ja,
2829 $ desca, x, ix, jx, descx, incx, beta, y, py, iy,
2830 $ jy, descy, incy, work, err, ierr( 3 ) )
2831
2832 IF( ierr( 3 ).NE.0 ) THEN
2833 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
2834 $ WRITE( nout, fmt = 9997 )
2835 ELSE IF( err.GT.thresh ) THEN
2836 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
2837 $ WRITE( nout, fmt = 9996 ) err
2838 END IF
2839
2840
2841
2842 IF(
lsame( uplo,
'L' ) )
THEN
2843 CALL pb_slaset(
'Upper', n-1, n-1, 0, rogue, rogue,
2844 $ a( ia+ja*desca( m_ ) ), desca( m_ ) )
2845 ELSE
2846 CALL pb_slaset(
'Lower', n-1, n-1, 0, rogue, rogue,
2847 $ a( ia+1+(ja-1)*desca( m_ ) ), desca( m_ ) )
2848 END IF
2849 CALL pschkmin( err, n, n, a, pa, ia, ja, desca, ierr( 1 ) )
2850 CALL pschkvin( err, n, x, px, ix, jx, descx, incx, ierr( 2 ) )
2851
2852 ELSE IF( nrout.EQ.3 ) THEN
2853
2854
2855
2856
2857
2858 CALL psmvch( ictxt, trans, n, n, one, a, ia, ja, desca, y, ix,
2859 $ jx, descx, incx, zero, x, px, ix, jx, descx, incx,
2860 $ work, err, ierr( 2 ) )
2861
2862 IF( ierr( 2 ).NE.0 ) THEN
2863 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
2864 $ WRITE( nout, fmt = 9997 )
2865 ELSE IF( err.GT.thresh ) THEN
2866 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
2867 $ WRITE( nout, fmt = 9996 ) err
2868 END IF
2869
2870
2871
2872 IF(
lsame( uplo,
'L' ) )
THEN
2873 IF(
lsame( diag,
'N' ) )
THEN
2874 CALL pb_slaset(
'Upper', n-1, n-1, 0, rogue, rogue,
2875 $ a( ia+ja*desca( m_ ) ), desca( m_ ) )
2876 ELSE
2877 CALL pb_slaset(
'Upper', n, n, 0, rogue, one,
2878 $ a( ia+(ja-1)*desca( m_ ) ), desca( m_ ) )
2879 END IF
2880 ELSE
2881 IF(
lsame( diag,
'N' ) )
THEN
2882 CALL pb_slaset(
'Lower', n-1, n-1, 0, rogue, rogue,
2883 $ a( ia+1+(ja-1)*desca( m_ ) ),
2884 $ desca( m_ ) )
2885 ELSE
2886 CALL pb_slaset(
'Lower', n, n, 0, rogue, one,
2887 $ a( ia+(ja-1)*desca( m_ ) ), desca( m_ ) )
2888 END IF
2889 END IF
2890 CALL pschkmin( err, n, n, a, pa, ia, ja, desca, ierr( 1 ) )
2891
2892 ELSE IF( nrout.EQ.4 ) THEN
2893
2894
2895
2896
2897
2898 CALL strsv( uplo, trans, diag, n, a( ia+(ja-1)*desca( m_ ) ),
2899 $ desca( m_ ), x( ix+(jx-1)*descx( m_ ) ), incx )
2900 CALL pstrmv( uplo, trans, diag, n, pa, ia, ja, desca, px, ix,
2901 $ jx, descx, incx )
2902 CALL psmvch( ictxt, trans, n, n, one, a, ia, ja, desca, x, ix,
2903 $ jx, descx, incx, zero, y, px, ix, jx, descx, incx,
2904 $ work, err, ierr( 2 ) )
2905
2906 IF( ierr( 2 ).NE.0 ) THEN
2907 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
2908 $ WRITE( nout, fmt = 9997 )
2909 ELSE IF( err.GT.thresh ) THEN
2910 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
2911 $ WRITE( nout, fmt = 9996 ) err
2912 END IF
2913
2914
2915
2916 IF(
lsame( uplo,
'L' ) )
THEN
2917 IF(
lsame( diag,
'N' ) )
THEN
2918 CALL pb_slaset(
'Upper', n-1, n-1, 0, rogue, rogue,
2919 $ a( ia+ja*desca( m_ ) ), desca( m_ ) )
2920 ELSE
2921 CALL pb_slaset(
'Upper', n, n, 0, rogue, one,
2922 $ a( ia+(ja-1)*desca( m_ ) ), desca( m_ ) )
2923 END IF
2924 ELSE
2925 IF(
lsame( diag,
'N' ) )
THEN
2926 CALL pb_slaset(
'Lower', n-1, n-1, 0, rogue, rogue,
2927 $ a( ia+1+(ja-1)*desca( m_ ) ),
2928 $ desca( m_ ) )
2929 ELSE
2930 CALL pb_slaset(
'Lower', n, n, 0, rogue, one,
2931 $ a( ia+(ja-1)*desca( m_ ) ), desca( m_ ) )
2932 END IF
2933 END IF
2934 CALL pschkmin( err, n, n, a, pa, ia, ja, desca, ierr( 1 ) )
2935
2936 ELSE IF( nrout.EQ.5 ) THEN
2937
2938
2939
2940
2941
2942 CALL psvmch( ictxt,
'Ge', m, n, alpha, x, ix, jx, descx,
2943 $ incx, y, iy, jy, descy, incy, a, pa, ia, ja,
2944 $ desca, work, err, ierr( 1 ) )
2945 IF( ierr( 1 ).NE.0 ) THEN
2946 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
2947 $ WRITE( nout, fmt = 9997 )
2948 ELSE IF( err.GT.thresh ) THEN
2949 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
2950 $ WRITE( nout, fmt = 9996 ) err
2951 END IF
2952
2953
2954
2955 CALL pschkvin( err, m, x, px, ix, jx, descx, incx, ierr( 2 ) )
2956 CALL pschkvin( err, n, y, py, iy, jy, descy, incy, ierr( 3 ) )
2957
2958 ELSE IF( nrout.EQ.6 ) THEN
2959
2960
2961
2962
2963
2964 CALL psvmch( ictxt, uplo, n, n, alpha, x, ix, jx, descx,
2965 $ incx, x, ix, jx, descx, incx, a, pa, ia, ja,
2966 $ desca, work, err, ierr( 1 ) )
2967 IF( ierr( 1 ).NE.0 ) THEN
2968 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
2969 $ WRITE( nout, fmt = 9997 )
2970 ELSE IF( err.GT.thresh ) THEN
2971 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
2972 $ WRITE( nout, fmt = 9996 ) err
2973 END IF
2974
2975
2976
2977 CALL pschkvin( err, n, x, px, ix, jx, descx, incx, ierr( 2 ) )
2978
2979 ELSE IF( nrout.EQ.7 ) THEN
2980
2981
2982
2983
2984
2985 CALL psvmch2( ictxt, uplo, n, n, alpha, x, ix, jx, descx, incx,
2986 $ y, iy, jy, descy, incy, a, pa, ia, ja, desca,
2987 $ work, err, ierr( 1 ) )
2988 IF( ierr( 1 ).NE.0 ) THEN
2989 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
2990 $ WRITE( nout, fmt = 9997 )
2991 ELSE IF( err.GT.thresh ) THEN
2992 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
2993 $ WRITE( nout, fmt = 9996 ) err
2994 END IF
2995
2996
2997
2998 CALL pschkvin( err, n, x, px, ix, jx, descx, incx, ierr( 2 ) )
2999 CALL pschkvin( err, n, y, py, iy, jy, descy, incy, ierr( 3 ) )
3000
3001 END IF
3002
3003 IF( ierr( 1 ).NE.0 ) THEN
3004 info = info + 1
3005 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3006 $ WRITE( nout, fmt = 9999 ) 'A'
3007 END IF
3008
3009 IF( ierr( 2 ).NE.0 ) THEN
3010 info = info + 2
3011 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3012 $ WRITE( nout, fmt = 9998 ) 'X'
3013 END IF
3014
3015 IF( ierr( 3 ).NE.0 ) THEN
3016 info = info + 4
3017 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
3018 $ WRITE( nout, fmt = 9998 ) 'Y'
3019 END IF
3020
3021 9999 FORMAT( 2x, ' ***** ERROR: Matrix operand ', a,
3022 $ ' is incorrect.' )
3023 9998 FORMAT( 2x, ' ***** ERROR: Vector operand ', a,
3024 $ ' is incorrect.' )
3025 9997 FORMAT( 2x, ' ***** FATAL ERROR - Computed result is less ',
3026 $ 'than half accurate *****' )
3027 9996 FORMAT( 2x, ' ***** Test completed with maximum test ratio: ',
3028 $ f11.5, ' SUSPECT *****' )
3029
3030 RETURN
3031
3032
3033
subroutine pschkmin(errmax, m, n, a, pa, ia, ja, desca, info)
subroutine pschkvin(errmax, n, x, px, ix, jx, descx, incx, info)
subroutine pb_slaset(uplo, m, n, ioffd, alpha, beta, a, lda)
subroutine psvmch(ictxt, uplo, m, n, alpha, x, ix, jx, descx, incx, y, iy, jy, descy, incy, a, pa, ia, ja, desca, g, err, info)
subroutine psmvch(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 psvmch2(ictxt, uplo, m, n, alpha, x, ix, jx, descx, incx, y, iy, jy, descy, incy, a, pa, ia, ja, desca, g, err, info)