SCALAPACK 2.2.2
LAPACK: Linear Algebra PACKage
All Classes Files Functions Variables Typedefs Macros
pzgemr.c
Go to the documentation of this file.
1#include "redist.h"
143#define static2 static
144#if defined(Add_) || defined(f77IsF2C)
145#define fortran_mr2d pzgemr2do_
146#define fortran_mr2dnew pzgemr2d_
147#elif defined(UpCase)
148#define fortran_mr2dnew PZGEMR2D
149#define fortran_mr2d PZGEMR2DO
150#define zcopy_ ZCOPY
151#define zlacpy_ ZLACPY
152#else
153#define fortran_mr2d pzgemr2do
154#define fortran_mr2dnew pzgemr2d
155#define zcopy_ zcopy
156#define zlacpy_ zlacpy
157#endif
158#define Clacpy Czgelacpy
159void Clacpy();
160typedef struct {
161 double r, i;
162} dcomplex;
163typedef struct {
164 Int desctype;
165 Int ctxt;
166 Int m;
167 Int n;
168 Int nbrow;
169 Int nbcol;
170 Int sprow;
171 Int spcol;
172 Int lda;
173} MDESC;
174#define BLOCK_CYCLIC_2D 1
175typedef struct {
176 Int lstart;
177 Int len;
178} IDESC;
179#define SHIFT(row,sprow,nbrow) ((row)-(sprow)+ ((row) >= (sprow) ? 0 : (nbrow)))
180#define max(A,B) ((A)>(B)?(A):(B))
181#define min(A,B) ((A)>(B)?(B):(A))
182#define DIVUP(a,b) ( ((a)-1) /(b)+1)
183#define ROUNDUP(a,b) (DIVUP(a,b)*(b))
184#ifdef MALLOCDEBUG
185#define malloc mymalloc
186#define free myfree
187#define realloc myrealloc
188#endif
189/* Cblacs */
190extern void Cblacs_pcoord();
192extern void Csetpvmtids();
193extern void Cblacs_get();
194extern void Cblacs_pinfo();
195extern void Cblacs_gridinfo();
196extern void Cblacs_gridinit();
197extern void Cblacs_exit();
198extern void Cblacs_gridexit();
199extern void Cblacs_setup();
200extern void Cigebs2d();
201extern void Cigebr2d();
202extern void Cigesd2d();
203extern void Cigerv2d();
204extern void Cigsum2d();
205extern void Cigamn2d();
206extern void Cigamx2d();
207extern void Czgesd2d();
208extern void Czgerv2d();
209/* lapack */
210void zlacpy_();
211/* aux fonctions */
213extern void *mr2d_malloc();
214extern Int ppcm();
215extern Int localsize();
218extern void paramcheck();
219/* tools and others function */
220#define scanD0 zgescanD0
221#define dispmat zgedispmat
222#define setmemory zgesetmemory
223#define freememory zgefreememory
224#define scan_intervals zgescan_intervals
225extern void scanD0();
226extern void dispmat();
227extern void setmemory();
228extern void freememory();
229extern Int scan_intervals();
230extern void Cpzgemr2do();
231extern void Cpzgemr2d();
232/* some defines for Cpzgemr2do */
233#define SENDBUFF 0
234#define RECVBUFF 1
235#define SIZEBUFF 2
236#if 0
237#define DEBUG
238#endif
239#ifndef DEBUG
240#define NDEBUG
241#endif
242#include <stdio.h>
243#include <stdlib.h>
244#include <assert.h>
245#define DESCLEN 9
246void
247fortran_mr2d(Int *m, Int *n, dcomplex *A, Int *ia, Int *ja, Int desc_A[DESCLEN],
248 dcomplex *B, Int *ib, Int *jb, Int desc_B[DESCLEN])
249{
250 Cpzgemr2do(*m, *n, A, *ia, *ja, (MDESC *) desc_A,
251 B, *ib, *jb, (MDESC *) desc_B);
252 return;
253}
254void
255fortran_mr2dnew(Int *m, Int *n, dcomplex *A, Int *ia, Int *ja, Int desc_A[DESCLEN],
256 dcomplex *B, Int *ib, Int *jb, Int desc_B[DESCLEN], Int *gcontext)
257{
258 Cpzgemr2d(*m, *n, A, *ia, *ja, (MDESC *) desc_A,
259 B, *ib, *jb, (MDESC *) desc_B, *gcontext);
260 return;
261}
267void
269 ptrmyblock, ia, ja, ma,
270 ptrmynewblock, ib, jb, mb)
271 dcomplex *ptrmyblock, *ptrmynewblock;
272/* pointers to the memory location of the matrix and the redistributed matrix */
273 MDESC *ma;
274 MDESC *mb;
275 Int ia, ja, ib, jb, m, n;
276{
277 Int dummy, nprocs;
278 Int gcontext;
279 /* first we initialize a global grid which serve as a reference to
280 * communicate from grid a to grid b */
281 Cblacs_pinfo(&dummy, &nprocs);
282 Cblacs_get((Int)0, (Int)0, &gcontext);
283 Cblacs_gridinit(&gcontext, "R", (Int)1, nprocs);
284 Cpzgemr2d(m, n, ptrmyblock, ia, ja, ma,
285 ptrmynewblock, ib, jb, mb, gcontext);
286 Cblacs_gridexit(gcontext);
287}
288#define NBPARAM 20 /* p0,q0,p1,q1, puis ma,na,mba,nba,rowa,cola puis
289 * idem B puis ia,ja puis ib,jb */
290#define MAGIC_MAX 100000000
291void
292Cpzgemr2d(m, n,
293 ptrmyblock, ia, ja, ma,
294 ptrmynewblock, ib, jb, mb, globcontext)
295 dcomplex *ptrmyblock, *ptrmynewblock;
296/* pointers to the memory location of the matrix and the redistributed matrix */
297 MDESC *ma;
298 MDESC *mb;
299 Int ia, ja, ib, jb, m, n, globcontext;
300{
301 dcomplex *ptrsendbuff, *ptrrecvbuff, *ptrNULL = 0;
302 dcomplex *recvptr;
303 MDESC newa, newb;
304 Int *proc0, *proc1, *param;
305 Int mypnum, myprow0, mypcol0, myprow1, mypcol1, nprocs;
306 Int i, j;
307 Int nprow, npcol, gcontext;
308 Int recvsize, sendsize;
309 IDESC *h_inter; /* to store the horizontal intersections */
310 IDESC *v_inter; /* to store the vertical intersections */
311 Int hinter_nb, vinter_nb; /* number of intrsections in both directions */
312 Int dummy;
313 Int p0, q0, p1, q1;
314 Int *ra, *ca;
315 /* end of variables */
316 /* To simplify further calcul we change the matrix indexation from
317 * 1..m,1..n (fortran) to 0..m-1,0..n-1 */
318 if (m == 0 || n == 0)
319 return;
320 ia -= 1;
321 ja -= 1;
322 ib -= 1;
323 jb -= 1;
324 Cblacs_gridinfo(globcontext, &nprow, &npcol, &dummy, &mypnum);
325 gcontext = globcontext;
326 nprocs = nprow * npcol;
327 /* if the global context that is given to us has not the shape of a line
328 * (nprow != 1), create a new context. TODO: to be optimal, we should
329 * avoid this because it is an uncessary synchronisation */
330 if (nprow != 1) {
331 gridreshape(&gcontext);
332 Cblacs_gridinfo(gcontext, &dummy, &dummy, &dummy, &mypnum);
333 }
334 Cblacs_gridinfo(ma->ctxt, &p0, &q0, &myprow0, &mypcol0);
335 /* compatibility T3D, must check myprow and mypcol are within bounds */
336 if (myprow0 >= p0 || mypcol0 >= q0)
337 myprow0 = mypcol0 = -1;
338 assert((myprow0 < p0 && mypcol0 < q0) || (myprow0 == -1 && mypcol0 == -1));
339 Cblacs_gridinfo(mb->ctxt, &p1, &q1, &myprow1, &mypcol1);
340 if (myprow1 >= p1 || mypcol1 >= q1)
341 myprow1 = mypcol1 = -1;
342 assert((myprow1 < p1 && mypcol1 < q1) || (myprow1 == -1 && mypcol1 == -1));
343 /* exchange the missing parameters among the processors: shape of grids and
344 * location of the processors */
345 param = (Int *) mr2d_malloc(3 * (nprocs * 2 + NBPARAM) * sizeof(Int));
346 ra = param + nprocs * 2 + NBPARAM;
347 ca = param + (nprocs * 2 + NBPARAM) * 2;
348 for (i = 0; i < nprocs * 2 + NBPARAM; i++)
349 param[i] = MAGIC_MAX;
350 proc0 = param + NBPARAM;
351 proc1 = param + NBPARAM + nprocs;
352 /* we calulate proc0 and proc1 that will give the number of a proc in
353 * respectively a or b in the global context */
354 if (myprow0 >= 0) {
355 proc0[myprow0 * q0 + mypcol0] = mypnum;
356 param[0] = p0;
357 param[1] = q0;
358 param[4] = ma->m;
359 param[5] = ma->n;
360 param[6] = ma->nbrow;
361 param[7] = ma->nbcol;
362 param[8] = ma->sprow;
363 param[9] = ma->spcol;
364 param[10] = ia;
365 param[11] = ja;
366 }
367 if (myprow1 >= 0) {
368 proc1[myprow1 * q1 + mypcol1] = mypnum;
369 param[2] = p1;
370 param[3] = q1;
371 param[12] = mb->m;
372 param[13] = mb->n;
373 param[14] = mb->nbrow;
374 param[15] = mb->nbcol;
375 param[16] = mb->sprow;
376 param[17] = mb->spcol;
377 param[18] = ib;
378 param[19] = jb;
379 }
380 Cigamn2d(gcontext, "All", "H", 2 * nprocs + NBPARAM, (Int)1, param, 2 * nprocs + NBPARAM,
381 ra, ca, 2 * nprocs + NBPARAM, (Int)-1, (Int)-1);
382 newa = *ma;
383 newb = *mb;
384 ma = &newa;
385 mb = &newb;
386 if (myprow0 == -1) {
387 p0 = param[0];
388 q0 = param[1];
389 ma->m = param[4];
390 ma->n = param[5];
391 ma->nbrow = param[6];
392 ma->nbcol = param[7];
393 ma->sprow = param[8];
394 ma->spcol = param[9];
395 ia = param[10];
396 ja = param[11];
397 }
398 if (myprow1 == -1) {
399 p1 = param[2];
400 q1 = param[3];
401 mb->m = param[12];
402 mb->n = param[13];
403 mb->nbrow = param[14];
404 mb->nbcol = param[15];
405 mb->sprow = param[16];
406 mb->spcol = param[17];
407 ib = param[18];
408 jb = param[19];
409 }
410 for (i = 0; i < NBPARAM; i++) {
411 if (param[i] == MAGIC_MAX) {
412 fprintf(stderr, "xxGEMR2D:something wrong in the parameters\n");
413 exit(1);
414 }
415 }
416#ifndef NDEBUG
417 for (i = 0; i < p0 * q0; i++)
418 assert(proc0[i] >= 0 && proc0[i] < nprocs);
419 for (i = 0; i < p1 * q1; i++)
420 assert(proc1[i] >= 0 && proc1[i] < nprocs);
421#endif
422 /* check the validity of the parameters */
423 paramcheck(ma, ia, ja, m, n, p0, q0, gcontext);
424 paramcheck(mb, ib, jb, m, n, p1, q1, gcontext);
425 /* we change the problem so that ia < a->nbrow ... andia + m = a->m ... */
426 {
427 Int decal;
428 ia = changeorigin(myprow0, ma->sprow, p0,
429 ma->nbrow, ia, &decal, &ma->sprow);
430 ptrmyblock += decal;
431 ja = changeorigin(mypcol0, ma->spcol, q0,
432 ma->nbcol, ja, &decal, &ma->spcol);
433 ptrmyblock += decal * ma->lda;
434 ma->m = ia + m;
435 ma->n = ja + n;
436 ib = changeorigin(myprow1, mb->sprow, p1,
437 mb->nbrow, ib, &decal, &mb->sprow);
438 ptrmynewblock += decal;
439 jb = changeorigin(mypcol1, mb->spcol, q1,
440 mb->nbcol, jb, &decal, &mb->spcol);
441 ptrmynewblock += decal * mb->lda;
442 mb->m = ib + m;
443 mb->n = jb + n;
444 if (p0 == 1)
445 ma->nbrow = ma->m;
446 if (q0 == 1)
447 ma->nbcol = ma->n;
448 if (p1 == 1)
449 mb->nbrow = mb->m;
450 if (q1 == 1)
451 mb->nbcol = mb->n;
452#ifndef NDEBUG
453 paramcheck(ma, ia, ja, m, n, p0, q0, gcontext);
454 paramcheck(mb, ib, jb, m, n, p1, q1, gcontext);
455#endif
456 }
457 /* We compute the size of the memory buffer ( we choose the worst case,
458 * when the buffer sizes == the memory block sizes). */
459 if (myprow0 >= 0 && mypcol0 >= 0) {
460 /* Initialize pointer variables */
461 setmemory(&ptrsendbuff, memoryblocksize(ma));
462 }; /* if (mypnum < p0 * q0) */
463 if (myprow1 >= 0 && mypcol1 >= 0) {
464 /* Initialize pointer variables */
465 setmemory(&ptrrecvbuff, memoryblocksize(mb));
466 }; /* if (mypnum < p1 * q1) */
467 /* allocing room for the tabs, alloc for the worst case,local_n or local_m
468 * intervals, in fact the worst case should be less, perhaps half that,I
469 * should think of that one day. */
470 h_inter = (IDESC *) mr2d_malloc(DIVUP(ma->n, q0 * ma->nbcol) *
471 ma->nbcol * sizeof(IDESC));
472 v_inter = (IDESC *) mr2d_malloc(DIVUP(ma->m, p0 * ma->nbrow)
473 * ma->nbrow * sizeof(IDESC));
474 /* We go for the scanning of indices. For each processor including mypnum,
475 * we fill the sendbuff buffer (scanD0(SENDBUFF)) and when it is done send
476 * it. Then for each processor, we compute the size of message to be
477 * receive scanD0(SIZEBUFF)), post a receive and then allocate the elements
478 * of recvbuff the right place (scanD)(RECVBUFF)) */
479 recvptr = ptrrecvbuff;
480 {
481 Int tot, myrang, step, sens;
482 Int *sender, *recver;
483 Int mesending, merecving;
484 tot = max(p0 * q0, p1 * q1);
485 init_chenille(mypnum, nprocs, p0 * q0, proc0, p1 * q1, proc1,
486 &sender, &recver, &myrang);
487 if (myrang == -1)
488 goto after_comm;
489 mesending = myprow0 >= 0;
490 assert(sender[myrang] >= 0 || !mesending);
491 assert(!mesending || proc0[sender[myrang]] == mypnum);
492 merecving = myprow1 >= 0;
493 assert(recver[myrang] >= 0 || !merecving);
494 assert(!merecving || proc1[recver[myrang]] == mypnum);
495 step = tot - 1 - myrang;
496 do {
497 for (sens = 0; sens < 2; sens++) {
498 /* be careful here, when we communicating with ourselves, we must
499 * send first (myrang > step == 0) */
500 if (mesending && recver[step] >= 0 &&
501 (sens == 0)) {
502 i = recver[step] / q1;
503 j = recver[step] % q1;
504 vinter_nb = scan_intervals('r', ia, ib, m, ma, mb, p0, p1, myprow0, i,
505 v_inter);
506 hinter_nb = scan_intervals('c', ja, jb, n, ma, mb, q0, q1, mypcol0, j,
507 h_inter);
508 sendsize = block2buff(v_inter, vinter_nb, h_inter, hinter_nb,
509 ptrmyblock, ma, ptrsendbuff);
510 } /* if (mesending...) { */
511 if (mesending && recver[step] >= 0 &&
512 (sens == myrang > step)) {
513 i = recver[step] / q1;
514 j = recver[step] % q1;
515 if (sendsize > 0
516 && (step != myrang || !merecving)
517 ) {
518 Czgesd2d(gcontext, sendsize, (Int)1, ptrsendbuff, sendsize,
519 (Int)0, proc1[i * q1 + j]);
520 } /* sendsize > 0 */
521 } /* if (mesending ... */
522 if (merecving && sender[step] >= 0 &&
523 (sens == myrang <= step)) {
524 i = sender[step] / q0;
525 j = sender[step] % q0;
526 vinter_nb = scan_intervals('r', ib, ia, m, mb, ma, p1, p0, myprow1, i,
527 v_inter);
528 hinter_nb = scan_intervals('c', jb, ja, n, mb, ma, q1, q0, mypcol1, j,
529 h_inter);
530 recvsize = inter_len(hinter_nb, h_inter, vinter_nb, v_inter);
531 if (recvsize > 0) {
532 if (step == myrang && mesending) {
533 Clacpy(recvsize, (Int)1,
534 ptrsendbuff, recvsize,
535 ptrrecvbuff, recvsize);
536 } else {
537 Czgerv2d(gcontext, recvsize, (Int)1, ptrrecvbuff, recvsize,
538 (Int)0, proc0[i * q0 + j]);
539 }
540 } /* recvsize > 0 */
541 } /* if (merecving ...) */
542 if (merecving && sender[step] >= 0 && sens == 1) {
543 buff2block(v_inter, vinter_nb, h_inter, hinter_nb,
544 recvptr, ptrmynewblock, mb);
545 } /* if (merecving...) */
546 } /* for (sens = 0) */
547 step -= 1;
548 if (step < 0)
549 step = tot - 1;
550 } while (step != tot - 1 - myrang);
551after_comm:
552 free(sender);
553 } /* { int tot,nr,ns ...} */
554 /* don't forget to clean up things! */
555 if (myprow1 >= 0 && mypcol1 >= 0) {
556 freememory((char *) ptrrecvbuff);
557 };
558 if (myprow0 >= 0 && mypcol0 >= 0) {
559 freememory((char *) ptrsendbuff);
560 };
561 if (nprow != 1)
562 Cblacs_gridexit(gcontext);
563 free(v_inter);
564 free(h_inter);
565 free(param);
566}/* distrib */
568init_chenille(Int mypnum, Int nprocs, Int n0, Int *proc0, Int n1, Int *proc1, Int **psend, Int **precv, Int *myrang)
569{
570 Int ns, nr, i, tot;
571 Int *sender, *recver, *g0, *g1;
572 tot = max(n0, n1);
573 sender = (Int *) mr2d_malloc((nprocs + tot) * sizeof(Int) * 2);
574 recver = sender + tot;
575 *psend = sender;
576 *precv = recver;
577 g0 = recver + tot;
578 g1 = g0 + nprocs;
579 for (i = 0; i < nprocs; i++) {
580 g0[i] = -1;
581 g1[i] = -1;
582 }
583 for (i = 0; i < tot; i++) {
584 sender[i] = -1;
585 recver[i] = -1;
586 }
587 for (i = 0; i < n0; i++)
588 g0[proc0[i]] = i;
589 for (i = 0; i < n1; i++)
590 g1[proc1[i]] = i;
591 ns = 0;
592 nr = 0;
593 *myrang = -1;
594 for (i = 0; i < nprocs; i++)
595 if (g0[i] >= 0 && g1[i] >= 0) {
596 if (i == mypnum)
597 *myrang = nr;
598 sender[ns] = g0[i];
599 ns += 1;
600 recver[nr] = g1[i];
601 nr += 1;
602 assert(ns <= n0 && nr <= n1 && nr == ns);
603 }
604 for (i = 0; i < nprocs; i++)
605 if (g0[i] >= 0 && g1[i] < 0) {
606 if (i == mypnum)
607 *myrang = ns;
608 sender[ns] = g0[i];
609 ns += 1;
610 assert(ns <= n0);
611 }
612 for (i = 0; i < nprocs; i++)
613 if (g1[i] >= 0 && g0[i] < 0) {
614 if (i == mypnum)
615 *myrang = nr;
616 recver[nr] = g1[i];
617 nr += 1;
618 assert(nr <= n1);
619 }
621#define Mlacpy(mo,no,ao,ldao,bo,ldbo) \
622{ \
623dcomplex *_a,*_b; \
624Int _m,_n,_lda,_ldb; \
625 Int _i,_j; \
626 _m = (mo);_n = (no); \
627 _a = (ao);_b = (bo); \
628 _lda = (ldao) - _m; \
629 _ldb = (ldbo) - _m; \
630 assert(_lda >= 0 && _ldb >= 0); \
631 for (_j=0;_j<_n;_j++) { \
632 for (_i=0;_i<_m;_i++) \
633 *_b++ = *_a++; \
634 _b += _ldb; \
635 _a += _lda; \
636 } \
637}
639block2buff(IDESC *vi, Int vinb, IDESC *hi, Int hinb, dcomplex *ptra, MDESC *ma, dcomplex *buff)
640{
641 Int h, v, sizebuff;
642 dcomplex *ptr2;
643 sizebuff = 0;
644 for (h = 0; h < hinb; h++) {
645 ptr2 = ptra + hi[h].lstart * ma->lda;
646 for (v = 0; v < vinb; v++) {
647 Mlacpy(vi[v].len, hi[h].len,
648 ptr2 + vi[v].lstart,
649 ma->lda,
650 buff + sizebuff, vi[v].len);
651 sizebuff += hi[h].len * vi[v].len;
652 }
653 }
654 return sizebuff;
655}
657buff2block(IDESC *vi, Int vinb, IDESC *hi, Int hinb, dcomplex *buff, dcomplex *ptrb, MDESC *mb)
658{
659 Int h, v, sizebuff;
660 dcomplex *ptr2;
661 sizebuff = 0;
662 for (h = 0; h < hinb; h++) {
663 ptr2 = ptrb + hi[h].lstart * mb->lda;
664 for (v = 0; v < vinb; v++) {
665 Mlacpy(vi[v].len, hi[h].len,
666 buff + sizebuff, vi[v].len,
667 ptr2 + vi[v].lstart,
668 mb->lda);
669 sizebuff += hi[h].len * vi[v].len;
670 }
671 }
672}
674inter_len(Int hinb, IDESC *hi, Int vinb, IDESC *vi)
675{
676 Int hlen, vlen, h, v;
677 hlen = 0;
678 for (h = 0; h < hinb; h++)
679 hlen += hi[h].len;
680 vlen = 0;
681 for (v = 0; v < vinb; v++)
682 vlen += vi[v].len;
683 return hlen * vlen;
684}
685void
686Clacpy(Int m, Int n, dcomplex *a, Int lda, dcomplex *b, Int ldb)
687{
688 Int i, j;
689 lda -= m;
690 ldb -= m;
691 assert(lda >= 0 && ldb >= 0);
692 for (j = 0; j < n; j++) {
693 for (i = 0; i < m; i++)
694 *b++ = *a++;
695 b += ldb;
696 a += lda;
697 }
698}
700gridreshape(Int *ctxtp)
701{
702 Int ori, final; /* original context, and new context created, with
703 * line form */
704 Int nprow, npcol, myrow, mycol;
705 Int *usermap;
706 Int i, j;
707 ori = *ctxtp;
708 Cblacs_gridinfo(ori, &nprow, &npcol, &myrow, &mycol);
709 usermap = mr2d_malloc(sizeof(Int) * nprow * npcol);
710 for (i = 0; i < nprow; i++)
711 for (j = 0; j < npcol; j++) {
712 usermap[i + j * nprow] = Cblacs_pnum(ori, i, j);
713 }
714 /* Cblacs_get(0, 0, &final); */
715 Cblacs_get(ori, (Int)10, &final);
716 Cblacs_gridmap(&final, usermap, (Int)1, (Int)1, nprow * npcol);
717 *ctxtp = final;
718 free(usermap);
719}
#define Int
Definition Bconfig.h:22
void Cblacs_gridmap()
static2 Int inter_len()
Int memoryblocksize()
Int changeorigin()
#define freememory
Definition pzgemr.c:223
void Czgesd2d()
#define scan_intervals
Definition pzgemr.c:224
void Cblacs_gridexit()
#define max(A, B)
Definition pzgemr.c:180
void Cigsum2d()
#define static2
Definition pzgemr.c:143
void Cpzgemr2d()
#define scanD0
Definition pzgemr.c:220
Int Cblacs_pnum()
static2 void gridreshape()
#define DIVUP(a, b)
Definition pzgemr.c:182
#define fortran_mr2dnew
Definition pzgemr.c:154
void Cpzgemr2do()
#define Clacpy
Definition pzgemr.c:158
void Cigamx2d()
#define Mlacpy(mo, no, ao, ldao, bo, ldbo)
Definition pzgemr.c:620
void Cblacs_pinfo()
#define NBPARAM
Definition pzgemr.c:288
void Cblacs_pcoord()
void Cigamn2d()
Int localsize()
#define setmemory
Definition pzgemr.c:222
void Cblacs_get()
#define zlacpy_
Definition pzgemr.c:156
void Czgerv2d()
void Cigerv2d()
void Cigebs2d()
#define dispmat
Definition pzgemr.c:221
static2 void buff2block()
void paramcheck()
void Cblacs_setup()
static2 Int block2buff()
void Cblacs_gridinit()
void Cblacs_gridinfo()
#define MAGIC_MAX
Definition pzgemr.c:289
void Csetpvmtids()
Int localindice()
void Cigesd2d()
#define DESCLEN
Definition pzgemr.c:245
Int ppcm()
void Cigebr2d()
void Cblacs_exit()
#define fortran_mr2d
Definition pzgemr.c:153
void * mr2d_malloc()
static2 void init_chenille()
Int lstart
Definition pcgemr.c:176
Int len
Definition pcgemr.c:177
Int m
Definition pcgemr.c:166
Int spcol
Definition pcgemr.c:171
Int nbcol
Definition pcgemr.c:169
Int sprow
Definition pcgemr.c:170
Int nbrow
Definition pcgemr.c:168
Int ctxt
Definition pcgemr.c:165
Int n
Definition pcgemr.c:167
Int lda
Definition pcgemr.c:172
double i
Definition pzgemr.c:161