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