11{
12
19
22 Int nprow_in, npcol_in, myrow_in, mycol_in;
24 Int myrow_old, mycol_old, myrow_new, mycol_new;
27
28
29
30 nprocs_new = nprow_new * npcol_new;
31
32 Cblacs_gridinfo( context_in, &nprow_in, &npcol_in, &myrow_in, &mycol_in );
33
34
35 if( ( nprow_in == nprow_new ) && ( npcol_in == npcol_new ) &&
36 ( first_proc == 0 ) && ( major_in == major_out ) )
37 {
38 *context_out = context_in;
39 return;
40 }
41
42
43 grid_new = (
Int *) malloc( nprocs_new *
sizeof(
Int ) );
44
45
46 myrow_old = 0; mycol_old = 0;
47 if ( major_in == 1 )
48 {
49 myrow_old = first_proc / nprow_in;
50 mycol_old = first_proc % nprow_in;
51 }
52 else
53 {
54 myrow_old = first_proc % nprow_in;
55 mycol_old = first_proc / nprow_in;
56 }
57
58 myrow_new = 0; mycol_new = 0;
59
60
61 for (i=0; i< nprocs_new; i++ )
62 {
63 pnum =
Cblacs_pnum( context_in, myrow_old, mycol_old );
64 grid_new[ (mycol_new * nprow_new) + myrow_new ] = pnum;
65 proc_inc( &myrow_old, &mycol_old, nprow_in, npcol_in, major_in );
66 proc_inc( &myrow_new, &mycol_new, nprow_new, npcol_new, major_out );
67 }
68
69
71
72
73 Cblacs_gridmap( context_out, grid_new, nprow_new, nprow_new, npcol_new );
74
75
76 free( grid_new );
77}
void proc_inc(Int *myrow, Int *mycol, Int nprow, Int npcol, Int major)