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[])