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