591{
593 Int *sender, *recver, *g0, *g1;
596 recver = sender + tot;
597 *psend = sender;
598 *precv = recver;
599 g0 = recver + tot;
600 g1 = g0 + nprocs;
601 for (i = 0; i < nprocs; i++) {
602 g0[i] = -1;
603 g1[i] = -1;
604 }
605 for (i = 0; i < tot; i++) {
606 sender[i] = -1;
607 recver[i] = -1;
608 }
609 for (i = 0; i < n0; i++)
610 g0[proc0[i]] = i;
611 for (i = 0; i < n1; i++)
612 g1[proc1[i]] = i;
613 ns = 0;
614 nr = 0;
615 *myrang = -1;
616 for (i = 0; i < nprocs; i++)
617 if (g0[i] >= 0 && g1[i] >= 0) {
618 if (i == mypnum)
619 *myrang = nr;
620 sender[ns] = g0[i];
621 ns += 1;
622 recver[nr] = g1[i];
623 nr += 1;
624 assert(ns <= n0 && nr <= n1 && nr == ns);
625 }
626 for (i = 0; i < nprocs; i++)
627 if (g0[i] >= 0 && g1[i] < 0) {
628 if (i == mypnum)
629 *myrang = ns;
630 sender[ns] = g0[i];
631 ns += 1;
632 assert(ns <= n0);
633 }
634 for (i = 0; i < nprocs; i++)
635 if (g1[i] >= 0 && g0[i] < 0) {
636 if (i == mypnum)
637 *myrang = nr;
638 recver[nr] = g1[i];
639 nr += 1;
640 assert(nr <= n1);
641 }