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