1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
#include <stdlib.h>
#include <stdio.h>
int SL_Cgridreshape(ctxt, pstart, row_major_in, row_major_out, P, Q)
int ctxt, pstart, row_major_in, row_major_out, P, Q;
{
int Cblacs_pnum();
int nctxt, P0, Q0, Np, i, *g;
Cblacs_gridinfo(ctxt, &P0, &Q0, &i, &Np);
Np = P * Q;
if (Np+pstart > P0*Q0)
{
fprintf(stderr, "Illegal reshape command in %s\n",__FILE__);
Cblacs_abort(ctxt, -22);
}
g = (int *) malloc(Np * sizeof(int));
if (!g)
{
fprintf(stderr, "Cannot allocate memory in %s\n",__FILE__);
Cblacs_abort(ctxt, -23);
}
if (row_major_in) /* Read in in row-major order */
{
if (row_major_out)
for (i=0; i != Np; i++)
g[(i%Q)*P+i/Q] = Cblacs_pnum(ctxt, (pstart+i)/Q0, (pstart+i)%Q0);
else
for (i=0; i != Np; i++)
g[i] = Cblacs_pnum(ctxt, (pstart+i)/Q0, (pstart+i)%Q0);
}
else /* read in in column-major order */
{
if (row_major_out)
for (i=0; i != Np; i++)
g[(i%Q)*P+i/Q] = Cblacs_pnum(ctxt, (pstart+i)%P0, (pstart+i)/P0);
else
for (i=0; i != Np; i++)
g[i] = Cblacs_pnum(ctxt, (pstart+i)%P0, (pstart+i)/P0);
}
Cblacs_get(ctxt, 10, &nctxt);
Cblacs_gridmap(&nctxt, g, P, P, Q);
free(g);
return(nctxt);
}
int sl_gridreshape_(ctxt, pstart, row_major_in, row_major_out, P, Q)
int *ctxt, *pstart, *row_major_in, *row_major_out, *P, *Q;
{
return( SL_Cgridreshape(*ctxt, *pstart, *row_major_in, *row_major_out,
*P, *Q) );
}
int SL_GRIDRESHAPE(ctxt, pstart, row_major_in, row_major_out, P, Q)
int *ctxt, *pstart, *row_major_in, *row_major_out, *P, *Q;
{
return( SL_Cgridreshape(*ctxt, *pstart, *row_major_in, *row_major_out,
*P, *Q) );
}
int sl_gridreshape__(ctxt, pstart, row_major_in, row_major_out, P, Q)
int *ctxt, *pstart, *row_major_in, *row_major_out, *P, *Q;
{
return( SL_Cgridreshape(*ctxt, *pstart, *row_major_in, *row_major_out,
*P, *Q) );
}
int sl_gridreshape(ctxt, pstart, row_major_in, row_major_out, P, Q)
int *ctxt, *pstart, *row_major_in, *row_major_out, *P, *Q;
{
return( SL_Cgridreshape(*ctxt, *pstart, *row_major_in, *row_major_out,
*P, *Q) );
}
|