2582
 2583
 2584
 2585
 2586
 2587
 2588
 2589      INTEGER            INCX, INFO, IX, JX, N
 2590      DOUBLE PRECISION   ERRMAX
 2591
 2592
 2593      INTEGER            DESCX( * )
 2594      COMPLEX*16         PX( * ), X( * )
 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      INTEGER            BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
 2719     $                   DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
 2720     $                   RSRC_
 2721      parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
 2722     $                   dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
 2723     $                   imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
 2724     $                   rsrc_ = 9, csrc_ = 10, lld_ = 11 )
 2725      DOUBLE PRECISION   ZERO
 2726      parameter( zero = 0.0d+0 )
 2727
 2728
 2729      LOGICAL            COLREP, ROWREP
 2730      INTEGER            I, IB, ICTXT, ICURCOL, ICURROW, IIX, IN, IXCOL,
 2731     $                   IXROW, J, JB, JJX, JN, KK, LDPX, LDX, LL,
 2732     $                   MYCOL, MYROW, NPCOL, NPROW
 2733      DOUBLE PRECISION   ERR, EPS
 2734
 2735
 2737
 2738
 2739      DOUBLE PRECISION   PDLAMCH
 2741
 2742
 2743      INTRINSIC          abs, dble, dimag, 
max, 
min, mod
 
 2744
 2745
 2746
 2747      info = 0
 2748      errmax = zero
 2749
 2750
 2751
 2752      IF( n.LE.0 )
 2753     $   RETURN
 2754
 2755      ictxt = descx( ctxt_ )
 2756      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
 2757
 2759
 2760      CALL pb_infog2l( ix, jx, descx, nprow, npcol, myrow, mycol, iix,
 
 2761     $                 jjx, ixrow, ixcol )
 2762
 2763      ldx    = descx( m_ )
 2764      ldpx   = descx( lld_ )
 2765      rowrep = ( ixrow.EQ.-1 )
 2766      colrep = ( ixcol.EQ.-1 )
 2767
 2768      IF( n.EQ.1 ) THEN
 2769
 2770         IF( ( myrow.EQ.ixrow .OR. rowrep ) .AND.
 2771     $       ( mycol.EQ.ixcol .OR. colrep ) )
 2772     $      
CALL pzerrset( err, errmax, x( ix+(jx-1)*ldx ),
 
 2773     $                     px( iix+(jjx-1)*ldpx ) )
 2774
 2775      ELSE IF( incx.EQ.descx( m_ ) ) THEN
 2776
 2777
 2778
 2779         jb = descx( inb_ ) - jx + 1
 2780         IF( jb.LE.0 )
 2781     $      jb = ( ( -jb ) / descx( nb_ ) + 1 ) * descx( nb_ ) + jb
 2783         jn = jx + jb - 1
 2784
 2785         IF( myrow.EQ.ixrow .OR. rowrep ) THEN
 2786
 2787            icurcol = ixcol
 2788            IF( mycol.EQ.icurcol .OR. colrep ) THEN
 2789               DO 10 j = jx, jn
 2790                  CALL pzerrset( err, errmax, x( ix+(j-1)*ldx ),
 
 2791     $                           px( iix+(jjx-1)*ldpx ) )
 2792                  jjx = jjx + 1
 2793   10          CONTINUE
 2794            END IF
 2795            icurcol = mod( icurcol+1, npcol )
 2796
 2797            DO 30 j = jn+1, jx+n-1, descx( nb_ )
 2798               jb = 
min( jx+n-j, descx( nb_ ) )
 
 2799
 2800               IF( mycol.EQ.icurcol .OR. colrep ) THEN
 2801
 2802                  DO 20 kk = 0, jb-1
 2803                     CALL pzerrset( err, errmax, x( ix+(j+kk-1)*ldx ),
 
 2804     $                              px( iix+(jjx+kk-1)*ldpx ) )
 2805   20             CONTINUE
 2806
 2807                  jjx = jjx + jb
 2808
 2809               END IF
 2810
 2811               icurcol = mod( icurcol+1, npcol )
 2812
 2813   30       CONTINUE
 2814
 2815         END IF
 2816
 2817      ELSE
 2818
 2819
 2820
 2821         ib = descx( imb_ ) - ix + 1
 2822         IF( ib.LE.0 )
 2823     $      ib = ( ( -ib ) / descx( mb_ ) + 1 ) * descx( mb_ ) + ib
 2825         in = ix + ib - 1
 2826
 2827         IF( mycol.EQ.ixcol .OR. colrep ) THEN
 2828
 2829            icurrow = ixrow
 2830            IF( myrow.EQ.icurrow .OR. rowrep ) THEN
 2831               DO 40 i = ix, in
 2832                  CALL pzerrset( err, errmax, x( i+(jx-1)*ldx ),
 
 2833     $                           px( iix+(jjx-1)*ldpx ) )
 2834                  iix = iix + 1
 2835   40          CONTINUE
 2836            END IF
 2837            icurrow = mod( icurrow+1, nprow )
 2838
 2839            DO 60 i = in+1, ix+n-1, descx( mb_ )
 2840               ib = 
min( ix+n-i, descx( mb_ ) )
 
 2841
 2842               IF( myrow.EQ.icurrow .OR. rowrep ) THEN
 2843
 2844                  DO 50 kk = 0, ib-1
 2845                     CALL pzerrset( err, errmax, x( i+kk+(jx-1)*ldx ),
 
 2846     $                              px( iix+kk+(jjx-1)*ldpx ) )
 2847   50             CONTINUE
 2848
 2849                  iix = iix + ib
 2850
 2851               END IF
 2852
 2853               icurrow = mod( icurrow+1, nprow )
 2854
 2855   60       CONTINUE
 2856
 2857         END IF
 2858
 2859      END IF
 2860
 2861      CALL dgamx2d( ictxt, 'All', ' ', 1, 1, errmax, 1, kk, ll, -1,
 2862     $              -1, -1 )
 2863
 2864      IF( errmax.GT.zero .AND. errmax.LE.eps ) THEN
 2865         info = 1
 2866      ELSE IF( errmax.GT.eps ) THEN
 2867         info = -1
 2868      END IF
 2869
 2870      RETURN
 2871
 2872
 2873
subroutine pb_infog2l(i, j, desc, nprow, npcol, myrow, mycol, ii, jj, prow, pcol)
 
double precision function pdlamch(ictxt, cmach)
 
subroutine pzerrset(err, errmax, xtrue, x)