306          ptrmyblock, ia, ja, ma,
 
  307          ptrmynewblock, ib, jb, mb, globcontext)
 
  309  double *ptrmyblock, *ptrmynewblock;
 
  313  Int   ia, ja, ib, jb, m, n, globcontext;
 
  315  double *ptrsendbuff, *ptrrecvbuff, *ptrNULL = 0;
 
  318  Int  *proc0, *proc1, *param;
 
  319  Int   mypnum, myprow0, mypcol0, myprow1, mypcol1, nprocs;
 
  321  Int   nprow, npcol, gcontext;
 
  322  Int   recvsize, sendsize;
 
  325  Int   hinter_nb, vinter_nb;   
 
  332  if (m == 0 || n == 0)
 
  339  gcontext = globcontext;
 
  340  nprocs = nprow * npcol;
 
  350  if (myprow0 >= p0 || mypcol0 >= q0)
 
  351    myprow0 = mypcol0 = -1;
 
  352  assert((myprow0 < p0 && mypcol0 < q0) || (myprow0 == -1 && mypcol0 == -1));
 
  354  if (myprow1 >= p1 || mypcol1 >= q1)
 
  355    myprow1 = mypcol1 = -1;
 
  356  assert((myprow1 < p1 && mypcol1 < q1) || (myprow1 == -1 && mypcol1 == -1));
 
  360  ra = param + nprocs * 2 + 
NBPARAM;
 
  361  ca = param + (nprocs * 2 + 
NBPARAM) * 2;
 
  362  for (i = 0; i < nprocs * 2 + 
NBPARAM; i++)
 
  365  proc1 = param + 
NBPARAM + nprocs;
 
  369    proc0[myprow0 * q0 + mypcol0] = mypnum;
 
  374    param[6] = ma->
nbrow;
 
  375    param[7] = ma->
nbcol;
 
  376    param[8] = ma->
sprow;
 
  377    param[9] = ma->
spcol;
 
  382    proc1[myprow1 * q1 + mypcol1] = mypnum;
 
  387    param[14] = mb->
nbrow;
 
  388    param[15] = mb->
nbcol;
 
  389    param[16] = mb->
sprow;
 
  390    param[17] = mb->
spcol;
 
  405    ma->
nbrow = param[6];
 
  406    ma->
nbcol = param[7];
 
  407    ma->
sprow = param[8];
 
  408    ma->
spcol = param[9];
 
  417    mb->
nbrow = param[14];
 
  418    mb->
nbcol = param[15];
 
  419    mb->
sprow = param[16];
 
  420    mb->
spcol = param[17];
 
  424  for (i = 0; i < 
NBPARAM; i++) {
 
  426      fprintf(stderr, 
"xxGEMR2D:something wrong in the parameters\n");
 
  431  for (i = 0; i < p0 * q0; i++)
 
  432    assert(proc0[i] >= 0 && proc0[i] < nprocs);
 
  433  for (i = 0; i < p1 * q1; i++)
 
  434    assert(proc1[i] >= 0 && proc1[i] < nprocs);
 
  437  paramcheck(ma, ia, ja, m, n, p0, q0, gcontext);
 
  438  paramcheck(mb, ib, jb, m, n, p1, q1, gcontext);
 
  447    ptrmyblock += decal * ma->
lda;
 
  452    ptrmynewblock += decal;
 
  455    ptrmynewblock += decal * mb->
lda;
 
  467    paramcheck(ma, ia, ja, m, n, p0, q0, gcontext);
 
  468    paramcheck(mb, ib, jb, m, n, p1, q1, gcontext);
 
  473  if (myprow0 >= 0 && mypcol0 >= 0) {
 
  477  if (myprow1 >= 0 && mypcol1 >= 0) {
 
  493  recvptr = ptrrecvbuff;
 
  495    Int   tot, myrang, step, sens;
 
  496    Int  *sender, *recver;
 
  497    Int   mesending, merecving;
 
  498    tot = 
max(p0 * q0, p1 * q1);
 
  499    init_chenille(mypnum, nprocs, p0 * q0, proc0, p1 * q1, proc1,
 
  500                  &sender, &recver, &myrang);
 
  503    mesending = myprow0 >= 0;
 
  504    assert(sender[myrang] >= 0 || !mesending);
 
  505    assert(!mesending || proc0[sender[myrang]] == mypnum);
 
  506    merecving = myprow1 >= 0;
 
  507    assert(recver[myrang] >= 0 || !merecving);
 
  508    assert(!merecving || proc1[recver[myrang]] == mypnum);
 
  509    step = tot - 1 - myrang;
 
  511      for (sens = 0; sens < 2; sens++) {
 
  514        if (mesending && recver[step] >= 0 &&
 
  516          i = recver[step] / q1;
 
  517          j = recver[step] % q1;
 
  518          vinter_nb = 
scan_intervals(
'r', ia, ib, m, ma, mb, p0, p1, myprow0, i,
 
  520          hinter_nb = 
scan_intervals(
'c', ja, jb, n, ma, mb, q0, q1, mypcol0, j,
 
  523                 m, n, ma, ia, ja, p0, q0, mb, ib, jb, p1, q1,
 
  524                 v_inter, vinter_nb, h_inter, hinter_nb,
 
  527        if (mesending && recver[step] >= 0 &&
 
  528            (sens == myrang > step)) {
 
  529          i = recver[step] / q1;
 
  530          j = recver[step] % q1;
 
  532              && (step != myrang || !merecving)
 
  534            Cdgesd2d(gcontext, sendsize, (
Int)1, ptrsendbuff, sendsize,
 
  535                     (
Int)0, proc1[i * q1 + j]);
 
  538        if (merecving && sender[step] >= 0 &&
 
  539            (sens == myrang <= step)) {
 
  540          i = sender[step] / q0;
 
  541          j = sender[step] % q0;
 
  542          vinter_nb = 
scan_intervals(
'r', ib, ia, m, mb, ma, p1, p0, myprow1, i,
 
  544          hinter_nb = 
scan_intervals(
'c', jb, ja, n, mb, ma, q1, q0, mypcol1, j,
 
  547                 m, n, ma, ia, ja, p0, q0, mb, ib, jb, p1, q1,
 
  548                 v_inter, vinter_nb, h_inter, hinter_nb, ptrNULL);
 
  550            if (step == myrang && mesending) {
 
  552                     ptrsendbuff, recvsize,
 
  553                     ptrrecvbuff, recvsize);
 
  555              Cdgerv2d(gcontext, recvsize, (
Int)1, ptrrecvbuff, recvsize,
 
  556                       (
Int)0, proc0[i * q0 + j]);
 
  560        if (merecving && sender[step] >= 0 && sens == 1) {
 
  562                 m, n, ma, ia, ja, p0, q0, mb, ib, jb, p1, q1,
 
  563                 v_inter, vinter_nb, h_inter, hinter_nb, ptrmynewblock);
 
  569    } 
while (step != tot - 1 - myrang);
 
  574  if (myprow1 >= 0 && mypcol1 >= 0) {
 
  577  if (myprow0 >= 0 && mypcol0 >= 0) {