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    }