244{
245
246
247
248
249 FILE *fp;
251
253 q0;
254
256
257#define nbparameter 24
258
263 Int ia, ja, ib, jb, m, n;
264 Int gcontext, context0, context1;
265 Int myprow1, myprow0, mypcol0, mypcol1;
268 char *uplo, *diag;
269 dcomplex *ptrmyblock, *ptrsavemyblock, *ptrmyblockcopy, *ptrmyblockvide;
270#ifdef UsingMpiBlacs
271 MPI_Init(&argc, &argv);
272#endif
273 setvbuf(stdout, NULL, _IOLBF, 0);
274 setvbuf(stderr, NULL, _IOLBF, 0);
275#ifdef T3D
276 free(malloc(14000000));
277#endif
279
281
285 if (mypnum == 0) {
286 if ((fp = fopen("TRMR2D.dat", "r")) == NULL) {
287 fprintf(stderr, "Can't open TRMR2D.dat\n");
288 exit(1);
289 };
290 printf("\n// ZTRMR2D TESTER for COMPLEX*16 //\n");
291 getparam(fp, &nbre, NULL);
292 printf("////////// %d tests \n\n", nbre);
293 parameters[0] = nbre;
295 } else {
297 nbre = parameters[0];
298 };
299 if (mypnum == 0) {
300 printf("\n m n m0 n0 sr0 sc0 i0 j0 p0 q0 nbr0 nbc0 \
301m1 n1 sr1 sc1 i1 j1 p1 q1 nbr1 nbc1\n\n");
302 };
303
304
305 nbremax = nbre;
306#ifdef DEBUG
307 fprintf(stderr, "bonjour,je suis le noeud %d\n", mypnum);
308#endif
309 while (nbre-- != 0) {
310
311
312
313 if (mypnum == 0) {
315 getparam(fp,
316 &m, &n,
321 &u, &d,
322 NULL);
323 uplo = u ? "UPPER" : "LOWER";
324 diag = d ? "UNIT" : "NONUNIT";
325 printf("\t\t************* TEST # %d **********\n",
326 nbremax - nbre);
327 printf(" %3d %3d %3d %3d %3d %3d %3d %3d \
328%3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d",
329 m, n,
334 printf(" %s %s", toupper(*uplo) == 'U' ? "up" : "low",
335 toupper(*diag) == 'U' ? "unit" : "nonunit");
336 printf("\n");
337 if (p0 * q0 > nprocs || p1 * q1 > nprocs) {
338 fprintf(stderr, "not enough nodes:%d processors required\n",
339 max(p0 * q0, p1 * q1));
340 exit(1);
341 }
342 parameters[0] = p0;
343 parameters[1] = q0;
344 parameters[2] = ma.
nbrow;
345 parameters[3] = ma.
nbcol;
346 parameters[4] = p1;
347 parameters[5] = q1;
348 parameters[6] = mb.
nbrow;
349 parameters[7] = mb.
nbcol;
350 parameters[8] = ma.
m;
351 parameters[9] = ma.
n;
352 parameters[10] = ma.
sprow;
353 parameters[11] = ma.
spcol;
354 parameters[12] = mb.
sprow;
355 parameters[13] = mb.
spcol;
356 parameters[14] = ia;
357 parameters[15] = ja;
358 parameters[16] = ib;
359 parameters[17] = jb;
360 parameters[18] = m;
361 parameters[19] = n;
362 parameters[20] = mb.
m;
363 parameters[21] = mb.
n;
364 parameters[22] = *uplo == 'U';
365 parameters[23] = *diag == 'U';
367 } else {
369 p0 = parameters[0];
370 q0 = parameters[1];
371 ma.
nbrow = parameters[2];
372 ma.
nbcol = parameters[3];
373 p1 = parameters[4];
374 q1 = parameters[5];
375 mb.
nbrow = parameters[6];
376 mb.
nbcol = parameters[7];
377 ma.
m = parameters[8];
378 ma.
n = parameters[9];
379 ma.
sprow = parameters[10];
380 ma.
spcol = parameters[11];
381 mb.
sprow = parameters[12];
382 mb.
spcol = parameters[13];
383 ia = parameters[14];
384 ja = parameters[15];
385 ib = parameters[16];
386 jb = parameters[17];
387 m = parameters[18];
388 n = parameters[19];
389 mb.
m = parameters[20];
390 mb.
n = parameters[21];
393 uplo = parameters[22] ? "UPPER" : "LOWER";
394 diag = parameters[23] ? "UNIT" : "NONUNIT";
395 };
401 if (myprow0 >= p0 || mypcol0 >= q0)
402 myprow0 = mypcol0 = -1;
404 if (myprow1 >= p1 || mypcol1 >= q1)
405 myprow1 = mypcol1 = -1;
406 assert((myprow0 < p0 && mypcol0 < q0) || (myprow0 == -1 && mypcol0 == -1));
407 assert((myprow1 < p1 && mypcol1 < q1) || (myprow1 == -1 && mypcol1 == -1));
410
411
412
413
414
415 if (myprow0 >= 0 && mypcol0 >= 0) {
421 memcpy((char *) ptrmyblockcopy, (char *) ptrmyblock,
424 for (i = 0; i < blocksize0; i++)
425 ptrmyblockvide[i].r = -1;
426 };
427 if (myprow1 >= 0 && mypcol1 >= 0) {
430 };
431
432
434 ptrmyblock, ia, ja, &ma,
435 ptrsavemyblock, ib, jb, &mb, gcontext);
436
437
439 ptrsavemyblock, ib, jb, &mb,
440 ptrmyblockvide, ia, ja, &ma, gcontext);
441
442 nberrors = 0;
443 if (myprow0 >= 0 && mypcol0 >= 0) {
444
445 for (i = 0; i < blocksize0; i++) {
448 in = 1;
455 assert(gi < ma.
m && gj < ma.
n);
456 gi -= (ia - 1);
457 gj -= (ja - 1);
458 if (gi < 0 || gj < 0 || gi >= m || gj >= n)
459 in = 0;
460 else if (toupper(*uplo) == 'U')
461 in = (gi <= gj +
max(0, m - n) - (toupper(*diag) ==
'U'));
462 else
463 in = (gi >= gj -
max(0, n - m) + (toupper(*diag) ==
'U'));
464 if (!in) {
465 ptrmyblockcopy[i].r = -1;
466 }
467 if (ptrmyblockvide[i].r != ptrmyblockcopy[i].r) {
468 nberrors++;
469 printf("Proc %d : Error element number %d, value = %f , initvalue =%f \n"
470 ,mypnum, i,
471 ptrmyblockvide[i].r, ptrmyblockcopy[i].r);
472 };
473 };
474 if (nberrors > 0) {
475 printf("Processor %d, has tested %d COMPLEX*16 elements,\
476Number of redistribution errors = %d \n",
477 mypnum, blocksize0, nberrors);
478 }
479 }
480
482 if (mypnum == 0)
483 if (nberrors)
484 printf(" => Total number of redistribution errors = %d \n",
485 nberrors);
486 else
487 printf("TEST PASSED OK\n");
488
489 if (myprow0 >= 0 && mypcol0 >= 0) {
493 };
494
495 if (myprow1 >= 0 && mypcol1 >= 0) {
497 };
498 if (myprow0 >= 0)
500 if (myprow1 >= 0)
502 };
503 if (mypnum == 0) {
504 fclose(fp);
505 };
507 return 0;
508}
#define SHIFT(row, sprow, nbrow)
static2 void initblock(dcomplex *block, Int m, Int n)
void initforpvm(Int argc, char *argv[])