SCALAPACK 2.2.2
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
pigemr2.c
Go to the documentation of this file.
1#include "redist.h"
2/* $Id: pigemr2.c,v 1.1.1.1 2000/02/15 18:04:08 susan Exp $
3 *
4 * some functions used by the pigemr2d routine see file pigemr.c for more
5 * documentation.
6 *
7 * Created March 1993 by B. Tourancheau (See sccs for modifications). */
8#define static2 static
9#if defined(Add_) || defined(f77IsF2C)
10#define fortran_mr2d pigemr2do_
11#define fortran_mr2dnew pigemr2d_
12#elif defined(UpCase)
13#define fortran_mr2dnew PIGEMR2D
14#define fortran_mr2d PIGEMR2DO
15#define icopy_ ICOPY
16#define ilacpy_ ILACPY
17#else
18#define fortran_mr2d pigemr2do
19#define fortran_mr2dnew pigemr2d
20#define icopy_ icopy
21#define ilacpy_ ilacpy
22#endif
23#define Clacpy Cigelacpy
24void Clacpy();
25typedef struct {
26 Int desctype;
27 Int ctxt;
28 Int m;
29 Int n;
30 Int nbrow;
31 Int nbcol;
32 Int sprow;
33 Int spcol;
34 Int lda;
35} MDESC;
36#define BLOCK_CYCLIC_2D 1
37typedef struct {
38 Int lstart;
39 Int len;
40} IDESC;
41#define SHIFT(row,sprow,nbrow) ((row)-(sprow)+ ((row) >= (sprow) ? 0 : (nbrow)))
42#define max(A,B) ((A)>(B)?(A):(B))
43#define min(A,B) ((A)>(B)?(B):(A))
44#define DIVUP(a,b) ( ((a)-1) /(b)+1)
45#define ROUNDUP(a,b) (DIVUP(a,b)*(b))
46#ifdef MALLOCDEBUG
47#define malloc mymalloc
48#define free myfree
49#define realloc myrealloc
50#endif
51/* Cblacs */
52extern void Cblacs_pcoord();
54extern void Csetpvmtids();
55extern void Cblacs_get();
56extern void Cblacs_pinfo();
57extern void Cblacs_gridinfo();
58extern void Cblacs_gridinit();
59extern void Cblacs_exit();
60extern void Cblacs_gridexit();
61extern void Cblacs_setup();
62extern void Cigebs2d();
63extern void Cigebr2d();
64extern void Cigesd2d();
65extern void Cigerv2d();
66extern void Cigsum2d();
67extern void Cigamn2d();
68extern void Cigamx2d();
69extern void Cigesd2d();
70extern void Cigerv2d();
71/* lapack */
72void ilacpy_();
73/* aux fonctions */
75extern void *mr2d_malloc();
76extern Int ppcm();
77extern Int localsize();
80extern void paramcheck();
81/* tools and others function */
82#define scanD0 igescanD0
83#define dispmat igedispmat
84#define setmemory igesetmemory
85#define freememory igefreememory
86#define scan_intervals igescan_intervals
87extern void scanD0();
88extern void dispmat();
89extern void setmemory();
90extern void freememory();
91extern Int scan_intervals();
92extern void Cpigemr2do();
93extern void Cpigemr2d();
94/* some defines for Cpigemr2do */
95#define SENDBUFF 0
96#define RECVBUFF 1
97#define SIZEBUFF 2
98#if 0
99#define DEBUG
100#endif
101#ifndef DEBUG
102#define NDEBUG
103#endif
104#include <stdio.h>
105#include <stdlib.h>
106#include <string.h>
107#include <assert.h>
108#include <ctype.h>
109/* Created March 1993 by B. Tourancheau (See sccs for modifications). */
110/************************************************************************/
111/* Set the memory space with the malloc function */
112void
113setmemory(Int **adpointer, Int blocksize)
114{
115 assert(blocksize >= 0);
116 if (blocksize == 0) {
117 *adpointer = NULL;
118 return;
119 }
120 *adpointer = (Int *) mr2d_malloc(
121 blocksize * sizeof(Int));
122}
123/******************************************************************/
124/* Free the memory space after the malloc */
125void
126freememory(Int *ptrtobefreed)
127{
128 if (ptrtobefreed == NULL)
129 return;
130 free((char *) ptrtobefreed);
131}
132/* extern functions for intersect() extern icopy_(); */
133/* scan_intervals: scans two distributions in one dimension, and compute the
134 * intersections on the local processor. result must be long enough to
135 * contains the result that are stocked in IDESC structure, the function
136 * returns the number of intersections found */
137Int
138scan_intervals(type, ja, jb, n, ma, mb, q0, q1, col0, col1,
139 result)
140 char type;
141 Int ja, jb, n, q0, q1, col0, col1;
142 MDESC *ma, *mb;
143 IDESC *result;
144{
145 Int offset, j0, j1, templatewidth0, templatewidth1, nbcol0, nbcol1;
146 Int l; /* local indice on the beginning of the interval */
147 assert(type == 'c' || type == 'r');
148 nbcol0 = (type == 'c' ? ma->nbcol : ma->nbrow);
149 nbcol1 = (type == 'c' ? mb->nbcol : mb->nbrow);
150 templatewidth0 = q0 * nbcol0;
151 templatewidth1 = q1 * nbcol1;
152 {
153 Int sp0 = (type == 'c' ? ma->spcol : ma->sprow);
154 Int sp1 = (type == 'c' ? mb->spcol : mb->sprow);
155 j0 = SHIFT(col0, sp0, q0) * nbcol0 - ja;
156 j1 = SHIFT(col1, sp1, q1) * nbcol1 - jb;
157 }
158 offset = 0;
159 l = 0;
160 /* a small check to verify that the submatrix begin inside the first block
161 * of the original matrix, this done by a sort of coordinate change at the
162 * beginning of the Cpigemr2d */
163 assert(j0 + nbcol0 > 0);
164 assert(j1 + nbcol1 > 0);
165 while ((j0 < n) && (j1 < n)) {
166 Int end0, end1;
167 Int start, end;
168 end0 = j0 + nbcol0;
169 end1 = j1 + nbcol1;
170 if (end0 <= j1) {
171 j0 += templatewidth0;
172 l += nbcol0;
173 continue;
174 }
175 if (end1 <= j0) {
176 j1 += templatewidth1;
177 continue;
178 }
179 /* compute the raw intersection */
180 start = max(j0, j1);
181 start = max(start, 0);
182 /* the start is correct now, update the corresponding fields */
183 result[offset].lstart = l + start - j0;
184 end = min(end0, end1);
185 if (end0 == end) {
186 j0 += templatewidth0;
187 l += nbcol0;
188 }
189 if (end1 == end)
190 j1 += templatewidth1;
191 /* throw the limit if they go out of the matrix */
192 end = min(end, n);
193 assert(end > start);
194 /* it is a bit tricky to see why the length is always positive after all
195 * this min and max, first we have the property that every interval
196 * considered is at least partly into the submatrix, second we arrive
197 * here only if the raw intersection is non-void, if we remove a limit
198 * that means the corresponding frontier is in both intervals which
199 * proove the final interval is non-void, clear ?? */
200 result[offset].len = end - start;
201 offset += 1;
202 } /* while */
203 return offset;
204}
#define Int
Definition Bconfig.h:22
Int memoryblocksize()
Int changeorigin()
#define freememory
Definition pigemr2.c:85
#define scan_intervals
Definition pigemr2.c:86
void Cpigemr2do()
#define SHIFT(row, sprow, nbrow)
Definition pigemr2.c:41
void Cblacs_gridexit()
#define max(A, B)
Definition pigemr2.c:42
void Cpigemr2d()
#define min(A, B)
Definition pigemr2.c:43
void Cigsum2d()
#define ilacpy_
Definition pigemr2.c:21
#define scanD0
Definition pigemr2.c:82
Int Cblacs_pnum()
#define Clacpy
Definition pigemr2.c:23
void Cigamx2d()
void Cblacs_pinfo()
void Cblacs_pcoord()
void Cigamn2d()
Int localsize()
#define setmemory
Definition pigemr2.c:84
void Cblacs_get()
void Cigerv2d()
void Cigebs2d()
#define dispmat
Definition pigemr2.c:83
void paramcheck()
void Cblacs_setup()
void Cblacs_gridinit()
void Cblacs_gridinfo()
void Csetpvmtids()
Int localindice()
void Cigesd2d()
Int ppcm()
void Cigebr2d()
void Cblacs_exit()
void * mr2d_malloc()
Int lstart
Definition pcgemr.c:176
Int len
Definition pcgemr.c:177
Int spcol
Definition pcgemr.c:171
Int nbcol
Definition pcgemr.c:169
Int sprow
Definition pcgemr.c:170
Int nbrow
Definition pcgemr.c:168