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 complex *ptrmyblock, *ptrsavemyblock, *ptrmyblockcopy, *ptrmyblockvide;
269#ifdef UsingMpiBlacs
270 MPI_Init(&argc, &argv);
271#endif
272 setvbuf(stdout, NULL, _IOLBF, 0);
273 setvbuf(stderr, NULL, _IOLBF, 0);
274#ifdef T3D
275 free(malloc(14000000));
276#endif
278
280
284 if (mypnum == 0) {
285 if ((fp = fopen("GEMR2D.dat", "r")) == NULL) {
286 fprintf(stderr, "Can't open GEMR2D.dat\n");
287 exit(1);
288 };
289 printf("\n// CGEMR2D TESTER for COMPLEX //\n");
290 getparam(fp, &nbre, NULL);
291 printf("////////// %d tests \n\n", nbre);
292 parameters[0] = nbre;
294 } else {
296 nbre = parameters[0];
297 };
298 if (mypnum == 0) {
299 printf("\n m n m0 n0 sr0 sc0 i0 j0 p0 q0 nbr0 nbc0 \
300m1 n1 sr1 sc1 i1 j1 p1 q1 nbr1 nbc1\n\n");
301 };
302
303
304 nbremax = nbre;
305#ifdef DEBUG
306 fprintf(stderr, "bonjour,je suis le noeud %d\n", mypnum);
307#endif
308 while (nbre-- != 0) {
309
310
311
312 if (mypnum == 0) {
314 getparam(fp,
315 &m, &n,
320 NULL);
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("\n");
331 if (p0 * q0 > nprocs || p1 * q1 > nprocs) {
332 fprintf(stderr, "not enough nodes:%d processors required\n",
333 max(p0 * q0, p1 * q1));
334 exit(1);
335 }
336 parameters[0] = p0;
337 parameters[1] = q0;
338 parameters[2] = ma.
nbrow;
339 parameters[3] = ma.
nbcol;
340 parameters[4] = p1;
341 parameters[5] = q1;
342 parameters[6] = mb.
nbrow;
343 parameters[7] = mb.
nbcol;
344 parameters[8] = ma.
m;
345 parameters[9] = ma.
n;
346 parameters[10] = ma.
sprow;
347 parameters[11] = ma.
spcol;
348 parameters[12] = mb.
sprow;
349 parameters[13] = mb.
spcol;
350 parameters[14] = ia;
351 parameters[15] = ja;
352 parameters[16] = ib;
353 parameters[17] = jb;
354 parameters[18] = m;
355 parameters[19] = n;
356 parameters[20] = mb.
m;
357 parameters[21] = mb.
n;
359 } else {
361 p0 = parameters[0];
362 q0 = parameters[1];
363 ma.
nbrow = parameters[2];
364 ma.
nbcol = parameters[3];
365 p1 = parameters[4];
366 q1 = parameters[5];
367 mb.
nbrow = parameters[6];
368 mb.
nbcol = parameters[7];
369 ma.
m = parameters[8];
370 ma.
n = parameters[9];
371 ma.
sprow = parameters[10];
372 ma.
spcol = parameters[11];
373 mb.
sprow = parameters[12];
374 mb.
spcol = parameters[13];
375 ia = parameters[14];
376 ja = parameters[15];
377 ib = parameters[16];
378 jb = parameters[17];
379 m = parameters[18];
380 n = parameters[19];
381 mb.
m = parameters[20];
382 mb.
n = parameters[21];
385 };
391 if (myprow0 >= p0 || mypcol0 >= q0)
392 myprow0 = mypcol0 = -1;
394 if (myprow1 >= p1 || mypcol1 >= q1)
395 myprow1 = mypcol1 = -1;
396 assert((myprow0 < p0 && mypcol0 < q0) || (myprow0 == -1 && mypcol0 == -1));
397 assert((myprow1 < p1 && mypcol1 < q1) || (myprow1 == -1 && mypcol1 == -1));
400
401
402
403
404
405 if (myprow0 >= 0 && mypcol0 >= 0) {
411 memcpy((char *) ptrmyblockcopy, (char *) ptrmyblock,
414 for (i = 0; i < blocksize0; i++)
415 ptrmyblockvide[i].r = -1;
416 };
417 if (myprow1 >= 0 && mypcol1 >= 0) {
420 };
421
422
424 ptrmyblock, ia, ja, &ma,
425 ptrsavemyblock, ib, jb, &mb, gcontext);
426
427
429 ptrsavemyblock, ib, jb, &mb,
430 ptrmyblockvide, ia, ja, &ma, gcontext);
431
432 nberrors = 0;
433 if (myprow0 >= 0 && mypcol0 >= 0) {
434
435 for (i = 0; i < blocksize0; i++) {
438 in = 1;
445 assert(gi < ma.
m && gj < ma.
n);
446 gi -= (ia - 1);
447 gj -= (ja - 1);
448 if (gi < 0 || gj < 0 || gi >= m || gj >= n)
449 in = 0;
450 if (!in) {
451 ptrmyblockcopy[i].r = -1;
452 }
453 if (ptrmyblockvide[i].r != ptrmyblockcopy[i].r) {
454 nberrors++;
455 printf("Proc %d : Error element number %d, value = %f , initvalue =%f \n"
456 ,mypnum, i,
457 ptrmyblockvide[i].r, ptrmyblockcopy[i].r);
458 };
459 };
460 if (nberrors > 0) {
461 printf("Processor %d, has tested %d COMPLEX elements,\
462Number of redistribution errors = %d \n",
463 mypnum, blocksize0, nberrors);
464 }
465 }
466
468 if (mypnum == 0)
469 if (nberrors)
470 printf(" => Total number of redistribution errors = %d \n",
471 nberrors);
472 else
473 printf("TEST PASSED OK\n");
474
475 if (myprow0 >= 0 && mypcol0 >= 0) {
479 };
480
481 if (myprow1 >= 0 && mypcol1 >= 0) {
483 };
484 if (myprow0 >= 0)
486 if (myprow1 >= 0)
488 };
489 if (mypnum == 0) {
490 fclose(fp);
491 };
493 return 0;
494}
static2 void initblock(complex *block, Int m, Int n)
#define SHIFT(row, sprow, nbrow)
void initforpvm(Int argc, char *argv[])