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