14 #include "../PBpblas.h"
15 #include "../PBtools.h"
16 #include "../PBblacs.h"
17 #include "../PBblas.h"
20 void PB_Cchkmat(
int ICTXT,
char * ROUT,
char * MNAME,
int M,
int MPOS0,
21 int N,
int NPOS0,
int IA,
int JA,
int * DESCA,
int DPOS0,
24 void PB_Cchkmat( ICTXT, ROUT, MNAME, M, MPOS0, N, NPOS0, IA, JA, DESCA,
29 int DPOS0, IA, ICTXT, * INFO, JA, M, MPOS0, N, NPOS0;
111 int dpos, iapos, japos, mpos, mycol, myrow, np, npcol, nprow,
121 if( *INFO >= 0 ) *INFO =
BIGNUM;
122 else if( *INFO < -
DESCMULT ) *INFO = -(*INFO);
145 *INFO =
MIN( *INFO, mpos );
146 PB_Cwarn( ICTXT, -1, ROUT,
"%s sub( %s ) = %d, it must be at least 0",
147 "Illegal number of rows of", MNAME, M );
154 *INFO =
MIN( *INFO, npos );
155 PB_Cwarn( ICTXT, -1, ROUT,
"%s sub( %s ) = %d, it must be at least 0",
156 "Illegal number of columns of", MNAME, N );
164 *INFO =
MIN( *INFO, iapos );
165 PB_Cwarn( ICTXT, -1, ROUT,
"Illegal I%s = %d, I%s must be at least 1",
166 MNAME, IA+1, MNAME );
173 *INFO =
MIN( *INFO, japos );
174 PB_Cwarn( ICTXT, -1, ROUT,
"Illegal J%s = %d, I%s must be at least 1",
175 MNAME, IA+1, MNAME );
184 PB_Cwarn( ICTXT, -1, ROUT,
"%s %d for matrix %s. PBLAS accepts: %d or %d",
185 "Illegal descriptor type", DESCA[
DTYPE_], MNAME,
188 else *INFO = -(*INFO);
195 if( DESCA[
CTXT_] != ICTXT )
202 PB_Cwarn( ICTXT, -1, ROUT,
"DESC%s[CTXT_] = %d %s= %d", MNAME,
203 DESCA[
CTXT_],
"does not match other operand's context ",
206 else *INFO = -(*INFO);
213 if( DESCA[
IMB_] < 1 )
218 *INFO =
MIN( *INFO, dpos +
IMB_ );
219 PB_Cwarn( ICTXT, -1, ROUT,
"Illegal DESC%s[IMB_] = %d, DESC%s[IMB_] %s",
220 MNAME, DESCA[
IMB_], MNAME,
"must be at least 1" );
222 if( DESCA[
INB_] < 1 )
227 *INFO =
MIN( *INFO, dpos +
INB_ );
228 PB_Cwarn( ICTXT, -1, ROUT,
"Illegal DESC%s[INB_] = %d, DESC%s[INB_] %s",
229 MNAME, DESCA[
INB_], MNAME,
"must be at least 1" );
236 *INFO =
MIN( *INFO, dpos +
MB_ );
237 PB_Cwarn( ICTXT, -1, ROUT,
"Illegal DESC%s[MB_] = %d, DESC%s[MB_] %s",
238 MNAME, DESCA[
MB_], MNAME,
"must be at least 1" );
245 *INFO =
MIN( *INFO, dpos +
NB_ );
246 PB_Cwarn( ICTXT, -1, ROUT,
"Illegal DESC%s[NB_] = %d, DESC%s[NB_] %s",
247 MNAME, DESCA[
NB_], MNAME,
"must be at least 1" );
250 if( ( DESCA[
RSRC_] < -1 ) || ( DESCA[
RSRC_] >= nprow ) )
257 "Illegal DESC%s[RSRC_] = %d, DESC%s[RSRC_] %s%d", MNAME,
258 DESCA[
RSRC_], MNAME,
"must be either -1, or >= 0 and < ",
261 if( ( DESCA[
CSRC_] < -1 ) || ( DESCA[
CSRC_] >= npcol ) )
268 "Illegal DESC%s[CSRC_] = %d, DESC%s[CSRC_] %s%d", MNAME,
269 DESCA[
CSRC_], MNAME,
"must be either -1, or >= 0 and < ",
273 if( M == 0 || N == 0 )
283 *INFO =
MIN( *INFO, dpos +
M_ );
284 PB_Cwarn( ICTXT, -1, ROUT,
"DESC%s[M_] = %d, it must be at least 0",
292 *INFO =
MIN( *INFO, dpos +
N_ );
293 PB_Cwarn( ICTXT, -1, ROUT,
"DESC%s[N_] = %d, it must be at least 0",
297 if( DESCA[
LLD_] < 1 )
302 *INFO =
MIN( *INFO, dpos +
LLD_ );
303 PB_Cwarn( ICTXT, -1, ROUT,
"DESC%s[LLD_] = %d, it must be at least 1",
304 MNAME, DESCA[
LLD_] );
317 *INFO =
MIN( *INFO, dpos +
M_ );
319 "Illegal DESC%s[M_] = %d, it must be at least 1", MNAME,
327 *INFO =
MIN( *INFO, dpos +
N_ );
329 "Illegal DESC%s[N_] = %d, it must be at least 1", MNAME,
333 if( ( DESCA[
M_] >= 1 ) && ( DESCA[
N_] >= 1 ) )
335 if( IA+M > DESCA[
M_] )
340 *INFO =
MIN( *INFO, iapos );
341 PB_Cwarn( ICTXT, -1, ROUT,
"%s M = %d, I%s = %d, DESC%s[M_] = %d",
342 "Operation out of bounds:", M, MNAME, IA+1, MNAME,
345 if( JA+N > DESCA[
N_] )
350 *INFO =
MIN( *INFO, japos );
351 PB_Cwarn( ICTXT, -1, ROUT,
"%s N = %d, J%s = %d, DESC%s[N_] = %d",
352 "Operation out of bounds:", N, MNAME, JA+1, MNAME,
362 DESCA[
RSRC_], nprow );
363 if( DESCA[
LLD_] <
MAX( 1, np ) )
366 DESCA[
CSRC_], npcol );
371 if( DESCA[
LLD_] < 1 )
373 *INFO =
MIN( *INFO, dpos +
LLD_ );
375 "DESC%s[LLD_] = %d, it must be at least 1", MNAME,
384 *INFO =
MIN( *INFO, dpos +
LLD_ );
386 "DESC%s[LLD_] = %d, it must be at least %d", MNAME,
396 if( *INFO ==
BIGNUM ) *INFO = 0;
398 else *INFO = -(*INFO);