240{
241
242
243
244
245 FILE *fp;
247
249 q0;
250
252
253#define nbparameter 24
254
259 Int ia, ja, ib, jb, m, n;
260 Int gcontext, context0, context1;
261 Int myprow1, myprow0, mypcol0, mypcol1;
264 char *uplo, *diag;
265 Int *ptrmyblock, *ptrsavemyblock, *ptrmyblockcopy, *ptrmyblockvide;
266#ifdef UsingMpiBlacs
267 MPI_Init(&argc, &argv);
268#endif
269 setvbuf(stdout, NULL, _IOLBF, 0);
270 setvbuf(stderr, NULL, _IOLBF, 0);
271#ifdef T3D
272 free(malloc(14000000));
273#endif
275
277
281 if (mypnum == 0) {
282 if ((fp = fopen("TRMR2D.dat", "r")) == NULL) {
283 fprintf(stderr, "Can't open TRMR2D.dat\n");
284 exit(1);
285 };
286 printf("\n// ITRMR2D TESTER for INTEGER //\n");
287 getparam(fp, &nbre, NULL);
288 printf("////////// %d tests \n\n", nbre);
289 parameters[0] = nbre;
291 } else {
293 nbre = parameters[0];
294 };
295 if (mypnum == 0) {
296 printf("\n m n m0 n0 sr0 sc0 i0 j0 p0 q0 nbr0 nbc0 \
297m1 n1 sr1 sc1 i1 j1 p1 q1 nbr1 nbc1\n\n");
298 };
299
300
301 nbremax = nbre;
302#ifdef DEBUG
303 fprintf(stderr, "bonjour,je suis le noeud %d\n", mypnum);
304#endif
305 while (nbre-- != 0) {
306
307
308
309 if (mypnum == 0) {
311 getparam(fp,
312 &m, &n,
317 &u, &d,
318 NULL);
319 uplo = u ? "UPPER" : "LOWER";
320 diag = d ? "UNIT" : "NONUNIT";
321 printf("\t\t************* TEST # %d **********\n",
322 nbremax - nbre);
323 printf(" %3d %3d %3d %3d %3d %3d %3d %3d \
324%3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d",
325 m, n,
330 printf(" %s %s", toupper(*uplo) == 'U' ? "up" : "low",
331 toupper(*diag) == 'U' ? "unit" : "nonunit");
332 printf("\n");
333 if (p0 * q0 > nprocs || p1 * q1 > nprocs) {
334 fprintf(stderr, "not enough nodes:%d processors required\n",
335 max(p0 * q0, p1 * q1));
336 exit(1);
337 }
338 parameters[0] = p0;
339 parameters[1] = q0;
340 parameters[2] = ma.
nbrow;
341 parameters[3] = ma.
nbcol;
342 parameters[4] = p1;
343 parameters[5] = q1;
344 parameters[6] = mb.
nbrow;
345 parameters[7] = mb.
nbcol;
346 parameters[8] = ma.
m;
347 parameters[9] = ma.
n;
348 parameters[10] = ma.
sprow;
349 parameters[11] = ma.
spcol;
350 parameters[12] = mb.
sprow;
351 parameters[13] = mb.
spcol;
352 parameters[14] = ia;
353 parameters[15] = ja;
354 parameters[16] = ib;
355 parameters[17] = jb;
356 parameters[18] = m;
357 parameters[19] = n;
358 parameters[20] = mb.
m;
359 parameters[21] = mb.
n;
360 parameters[22] = *uplo == 'U';
361 parameters[23] = *diag == 'U';
363 } else {
365 p0 = parameters[0];
366 q0 = parameters[1];
367 ma.
nbrow = parameters[2];
368 ma.
nbcol = parameters[3];
369 p1 = parameters[4];
370 q1 = parameters[5];
371 mb.
nbrow = parameters[6];
372 mb.
nbcol = parameters[7];
373 ma.
m = parameters[8];
374 ma.
n = parameters[9];
375 ma.
sprow = parameters[10];
376 ma.
spcol = parameters[11];
377 mb.
sprow = parameters[12];
378 mb.
spcol = parameters[13];
379 ia = parameters[14];
380 ja = parameters[15];
381 ib = parameters[16];
382 jb = parameters[17];
383 m = parameters[18];
384 n = parameters[19];
385 mb.
m = parameters[20];
386 mb.
n = parameters[21];
389 uplo = parameters[22] ? "UPPER" : "LOWER";
390 diag = parameters[23] ? "UNIT" : "NONUNIT";
391 };
397 if (myprow0 >= p0 || mypcol0 >= q0)
398 myprow0 = mypcol0 = -1;
400 if (myprow1 >= p1 || mypcol1 >= q1)
401 myprow1 = mypcol1 = -1;
402 assert((myprow0 < p0 && mypcol0 < q0) || (myprow0 == -1 && mypcol0 == -1));
403 assert((myprow1 < p1 && mypcol1 < q1) || (myprow1 == -1 && mypcol1 == -1));
406
407
408
409
410
411 if (myprow0 >= 0 && mypcol0 >= 0) {
417 memcpy((char *) ptrmyblockcopy, (char *) ptrmyblock,
418 blocksize0 *
sizeof(
Int));
420 for (i = 0; i < blocksize0; i++)
421 ptrmyblockvide[i] = -1;
422 };
423 if (myprow1 >= 0 && mypcol1 >= 0) {
426 };
427
428
430 ptrmyblock, ia, ja, &ma,
431 ptrsavemyblock, ib, jb, &mb, gcontext);
432
433
435 ptrsavemyblock, ib, jb, &mb,
436 ptrmyblockvide, ia, ja, &ma, gcontext);
437
438 nberrors = 0;
439 if (myprow0 >= 0 && mypcol0 >= 0) {
440
441 for (i = 0; i < blocksize0; i++) {
444 in = 1;
451 assert(gi < ma.
m && gj < ma.
n);
452 gi -= (ia - 1);
453 gj -= (ja - 1);
454 if (gi < 0 || gj < 0 || gi >= m || gj >= n)
455 in = 0;
456 else if (toupper(*uplo) == 'U')
457 in = (gi <= gj +
max(0, m - n) - (toupper(*diag) ==
'U'));
458 else
459 in = (gi >= gj -
max(0, n - m) + (toupper(*diag) ==
'U'));
460 if (!in) {
461 ptrmyblockcopy[i] = -1;
462 }
463 if (ptrmyblockvide[i] != ptrmyblockcopy[i]) {
464 nberrors++;
465 printf("Proc %d : Error element number %d, value = %d , initvalue =%d \n"
466 ,mypnum, i, ptrmyblockvide[i], ptrmyblockcopy[i]);
467 };
468 };
469 if (nberrors > 0) {
470 printf("Processor %d, has tested %d INTEGER elements,\
471Number of redistribution errors = %d \n",
472 mypnum, blocksize0, nberrors);
473 }
474 }
475
477 if (mypnum == 0)
478 if (nberrors)
479 printf(" => Total number of redistribution errors = %d \n",
480 nberrors);
481 else
482 printf("TEST PASSED OK\n");
483
484 if (myprow0 >= 0 && mypcol0 >= 0) {
488 };
489
490 if (myprow1 >= 0 && mypcol1 >= 0) {
492 };
493 if (myprow0 >= 0)
495 if (myprow1 >= 0)
497 };
498 if (mypnum == 0) {
499 fclose(fp);
500 };
502 return 0;
503}
#define SHIFT(row, sprow, nbrow)
static2 void initblock(Int *block, Int m, Int n)
void initforpvm(Int argc, char *argv[])