568{
570 Int *sender, *recver, *g0, *g1;
573 recver = sender + tot;
574 *psend = sender;
575 *precv = recver;
576 g0 = recver + tot;
577 g1 = g0 + nprocs;
578 for (i = 0; i < nprocs; i++) {
579 g0[i] = -1;
580 g1[i] = -1;
581 }
582 for (i = 0; i < tot; i++) {
583 sender[i] = -1;
584 recver[i] = -1;
585 }
586 for (i = 0; i < n0; i++)
587 g0[proc0[i]] = i;
588 for (i = 0; i < n1; i++)
589 g1[proc1[i]] = i;
590 ns = 0;
591 nr = 0;
592 *myrang = -1;
593 for (i = 0; i < nprocs; i++)
594 if (g0[i] >= 0 && g1[i] >= 0) {
595 if (i == mypnum)
596 *myrang = nr;
597 sender[ns] = g0[i];
598 ns += 1;
599 recver[nr] = g1[i];
600 nr += 1;
601 assert(ns <= n0 && nr <= n1 && nr == ns);
602 }
603 for (i = 0; i < nprocs; i++)
604 if (g0[i] >= 0 && g1[i] < 0) {
605 if (i == mypnum)
606 *myrang = ns;
607 sender[ns] = g0[i];
608 ns += 1;
609 assert(ns <= n0);
610 }
611 for (i = 0; i < nprocs; i++)
612 if (g1[i] >= 0 && g0[i] < 0) {
613 if (i == mypnum)
614 *myrang = nr;
615 recver[nr] = g1[i];
616 nr += 1;
617 assert(nr <= n1);
618 }