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