290 ptrmyblock, ia, ja, ma,
291 ptrmynewblock, ib, jb, mb, globcontext)
292 Int *ptrmyblock, *ptrmynewblock;
296 Int ia, ja, ib, jb, m, n, globcontext;
298 Int *ptrsendbuff, *ptrrecvbuff, *ptrNULL = 0;
301 Int *proc0, *proc1, *param;
302 Int mypnum, myprow0, mypcol0, myprow1, mypcol1, nprocs;
304 Int nprow, npcol, gcontext;
305 Int recvsize, sendsize;
308 Int hinter_nb, vinter_nb;
315 if (m == 0 || n == 0)
322 gcontext = globcontext;
323 nprocs = nprow * npcol;
333 if (myprow0 >= p0 || mypcol0 >= q0)
334 myprow0 = mypcol0 = -1;
335 assert((myprow0 < p0 && mypcol0 < q0) || (myprow0 == -1 && mypcol0 == -1));
337 if (myprow1 >= p1 || mypcol1 >= q1)
338 myprow1 = mypcol1 = -1;
339 assert((myprow1 < p1 && mypcol1 < q1) || (myprow1 == -1 && mypcol1 == -1));
343 ra = param + nprocs * 2 +
NBPARAM;
344 ca = param + (nprocs * 2 +
NBPARAM) * 2;
345 for (i = 0; i < nprocs * 2 +
NBPARAM; i++)
348 proc1 = param +
NBPARAM + nprocs;
352 proc0[myprow0 * q0 + mypcol0] = mypnum;
357 param[6] = ma->
nbrow;
358 param[7] = ma->
nbcol;
359 param[8] = ma->
sprow;
360 param[9] = ma->
spcol;
365 proc1[myprow1 * q1 + mypcol1] = mypnum;
370 param[14] = mb->
nbrow;
371 param[15] = mb->
nbcol;
372 param[16] = mb->
sprow;
373 param[17] = mb->
spcol;
388 ma->
nbrow = param[6];
389 ma->
nbcol = param[7];
390 ma->
sprow = param[8];
391 ma->
spcol = param[9];
400 mb->
nbrow = param[14];
401 mb->
nbcol = param[15];
402 mb->
sprow = param[16];
403 mb->
spcol = param[17];
407 for (i = 0; i <
NBPARAM; i++) {
409 fprintf(stderr,
"xxGEMR2D:something wrong in the parameters\n");
414 for (i = 0; i < p0 * q0; i++)
415 assert(proc0[i] >= 0 && proc0[i] < nprocs);
416 for (i = 0; i < p1 * q1; i++)
417 assert(proc1[i] >= 0 && proc1[i] < nprocs);
420 paramcheck(ma, ia, ja, m, n, p0, q0, gcontext);
421 paramcheck(mb, ib, jb, m, n, p1, q1, gcontext);
430 ptrmyblock += decal * ma->
lda;
435 ptrmynewblock += decal;
438 ptrmynewblock += decal * mb->
lda;
450 paramcheck(ma, ia, ja, m, n, p0, q0, gcontext);
451 paramcheck(mb, ib, jb, m, n, p1, q1, gcontext);
456 if (myprow0 >= 0 && mypcol0 >= 0) {
460 if (myprow1 >= 0 && mypcol1 >= 0) {
476 recvptr = ptrrecvbuff;
478 Int tot, myrang, step, sens;
479 Int *sender, *recver;
480 Int mesending, merecving;
481 tot =
max(p0 * q0, p1 * q1);
482 init_chenille(mypnum, nprocs, p0 * q0, proc0, p1 * q1, proc1,
483 &sender, &recver, &myrang);
486 mesending = myprow0 >= 0;
487 assert(sender[myrang] >= 0 || !mesending);
488 assert(!mesending || proc0[sender[myrang]] == mypnum);
489 merecving = myprow1 >= 0;
490 assert(recver[myrang] >= 0 || !merecving);
491 assert(!merecving || proc1[recver[myrang]] == mypnum);
492 step = tot - 1 - myrang;
494 for (sens = 0; sens < 2; sens++) {
497 if (mesending && recver[step] >= 0 &&
499 i = recver[step] / q1;
500 j = recver[step] % q1;
501 vinter_nb =
scan_intervals(
'r', ia, ib, m, ma, mb, p0, p1, myprow0, i,
503 hinter_nb =
scan_intervals(
'c', ja, jb, n, ma, mb, q0, q1, mypcol0, j,
505 sendsize =
block2buff(v_inter, vinter_nb, h_inter, hinter_nb,
506 ptrmyblock, ma, ptrsendbuff);
508 if (mesending && recver[step] >= 0 &&
509 (sens == myrang > step)) {
510 i = recver[step] / q1;
511 j = recver[step] % q1;
513 && (step != myrang || !merecving)
515 Cigesd2d(gcontext, sendsize, (
Int)1, ptrsendbuff, sendsize,
516 (
Int)0, proc1[i * q1 + j]);
519 if (merecving && sender[step] >= 0 &&
520 (sens == myrang <= step)) {
521 i = sender[step] / q0;
522 j = sender[step] % q0;
523 vinter_nb =
scan_intervals(
'r', ib, ia, m, mb, ma, p1, p0, myprow1, i,
525 hinter_nb =
scan_intervals(
'c', jb, ja, n, mb, ma, q1, q0, mypcol1, j,
527 recvsize =
inter_len(hinter_nb, h_inter, vinter_nb, v_inter);
529 if (step == myrang && mesending) {
531 ptrsendbuff, recvsize,
532 ptrrecvbuff, recvsize);
534 Cigerv2d(gcontext, recvsize, (
Int)1, ptrrecvbuff, recvsize,
535 (
Int)0, proc0[i * q0 + j]);
539 if (merecving && sender[step] >= 0 && sens == 1) {
540 buff2block(v_inter, vinter_nb, h_inter, hinter_nb,
541 recvptr, ptrmynewblock, mb);
547 }
while (step != tot - 1 - myrang);
552 if (myprow1 >= 0 && mypcol1 >= 0) {
555 if (myprow0 >= 0 && mypcol0 >= 0) {