2548
2549
2550
2551
2552
2553
2554
2555 INTEGER I, INB, N, NB, NPROCS, PROC, SRCPROC
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 INTEGER I1, ILOCBLK, INB1, MYDIST, N1, NBLOCKS,
2608 $ SRCPROC1
2609
2610
2611
2612 IF( ( srcproc.EQ.-1 ).OR.( nprocs.EQ.1 ) ) THEN
2614 RETURN
2615 END IF
2616
2617
2618
2619 IF( i.LE.inb ) THEN
2620
2621
2622
2623 srcproc1 = srcproc
2624 inb1 = inb - i + 1
2625
2626 ELSE
2627
2628
2629
2630 i1 = i - 1 - inb
2631 nblocks = i1 / nb + 1
2632 srcproc1 = srcproc + nblocks
2633 srcproc1 = srcproc1 - ( srcproc1 / nprocs ) * nprocs
2634 inb1 = nblocks*nb - i1
2635
2636 END IF
2637
2638
2639
2640
2641 IF( n.LE.inb1 ) THEN
2642 IF( proc.EQ.srcproc1 ) THEN
2644 ELSE
2646 END IF
2647 RETURN
2648 END IF
2649
2650 n1 = n - inb1
2651 nblocks = n1 / nb + 1
2652
2653 IF( proc.EQ.srcproc1 ) THEN
2654 ilocblk = nblocks / nprocs
2655 IF( ilocblk.GT.0 ) THEN
2656 IF( ( nblocks - ilocblk * nprocs ).GT.0 ) THEN
2658 ELSE
2659 pb_numroc = n + nb * ( ilocblk - nblocks )
2660 END IF
2661 ELSE
2663 END IF
2664 ELSE
2665 mydist = proc - srcproc1
2666 IF( mydist.LT.0 )
2667 $ mydist = mydist + nprocs
2668 ilocblk = nblocks / nprocs
2669 IF( ilocblk.GT.0 ) THEN
2670 mydist = mydist - nblocks + ilocblk * nprocs
2671 IF( mydist.LT.0 ) THEN
2673 ELSE IF( mydist.GT.0 ) THEN
2675 ELSE
2676 pb_numroc = n1 + nb * ( ilocblk - nblocks + 1 )
2677 END IF
2678 ELSE
2679 mydist = mydist - nblocks
2680 IF( mydist.LT.0 ) THEN
2682 ELSE IF( mydist.GT.0 ) THEN
2684 ELSE
2686 END IF
2687 END IF
2688 END IF
2689
2690 RETURN
2691
2692
2693
integer function pb_numroc(n, i, inb, nb, proc, srcproc, nprocs)