41{
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135
  136
  137
  138
  139
  140
  141
  142
  143
  144
  145
  146
  147
  148
  149
  150
  151
  152
  153
  154
  155
  156
  157
  158
  159
  160
  161
  162
  163
  164
  165
  166
  167
  168
  169
  170
  171
  172
  173
  174
  175
  176
  177
  178
  179
  180
  181
  182
  183
  184
  185
  186
  187
  188
  189
  190
  191
  192
  193
  194
  195
  196
  197
  198
  199
  200
  201
  202
  203
  204
  205
  206
  207
  208
  209
  210
  211
  212
  213
  214
  215
  216
  217
  218
  219
  220
  221
  222
  223
  224
  225
  226
  227
  228
  229
  230
  231
  232
  233
  234
  235
  236
  237
  238
  239
  240
  241
  242
  243
  244
  245
  246
  247
  248
  249
  250   char           UploA, * one, top;
  251   Int            Acol, Ai, Aii, Aimb1, Ainb1, Aj, Ajj, Akp, Akq, Ald, Amb, Amp,
 
  252                  Amp0, Anb, Anq, Anq0, Arow, XCfr, XCld, XRfr, XRld, Xi, Xj,
  253                  YCfr, YCpbY, YCsum, YCld, YRfr, YRpbY, YRsum, YRld, Ycol, Yi,
  254                  Yii, YisRow, Yj, Yjj, Yld, Ynp, Ynq, Yrow, ctxt, info, ione=1,
  255                  k, kb, ktmp, mycol, myrow, nb, npcol, nprow, size, upper,
  256                  usiz;
  257   double         * tbeta;
  259
  260
  261
  264   char           * Aptr  = NULL, * XC = NULL, * XR = NULL, * YC = NULL,
  265                  * YR    = NULL;
  266
  267
  268
  269
  274#ifndef NO_ARGCHK
  275
  276
  277
  279   if( !( info = ( ( nprow == -1 ) ? -( 701 + 
CTXT_ ) : 0 ) ) )
 
  280   {
  281      if( ( !upper ) && ( UploA != 
CLOWER ) )
 
  282      {
  283         PB_Cwarn( ctxt, __LINE__, __FILE__, 
"Illegal UPLO = %c\n", UploA );
 
  284         info = -1;
  285      }
  286      PB_Cchkmat( ctxt, 
"PZAHEMV", 
"A", *N, 2, *N, 2, Ai, Aj, Ad,  7, &info );
 
  287      PB_Cchkvec( ctxt, 
"PZAHEMV", 
"X", *N, 2, Xi, Xj, Xd, *INCX, 11, &info );
 
  288      PB_Cchkvec( ctxt, 
"PZAHEMV", 
"Y", *N, 2, Yi, Yj, Yd, *INCY, 17, &info );
 
  289   }
  290   if( info ) { 
PB_Cabort( ctxt, 
"PZAHEMV", info ); 
return; }
 
  291#endif
  292
  293
  294
  295   if( ( *N == 0 ) ||
  297      return;
  298
  299
  300
  301#ifdef NO_ARGCHK
  303#endif
  304
  305
  306
  309
  310
  311
  313   {
  314
  315
  316
  317      PB_Cinfog2l( Yi, Yj, Yd, nprow, npcol, myrow, mycol, &Yii, &Yjj,
 
  318                   &Yrow, &Ycol );
  319 
  320      if( *INCY == Yd[
M_] )
 
  321      {
  322
  323
  324
  325         if( ( myrow == Yrow ) || ( Yrow < 0 ) )
  326         {
  327
  328
  329
  331                              npcol );
  332            if( Ynq > 0 )
  333            {
  335               dascal_( &Ynq, ((
char *) BETA), 
Mptr( ((
char *) Y), Yii,
 
  336                        Yjj, Yld, usiz ), &Yld );
  337            }
  338         }
  339      }
  340      else
  341      {
  342
  343
  344
  345         if( ( mycol == Ycol ) || ( Ycol < 0 ) )
  346         {
  347
  348
  349
  351                              nprow );
  352            if( Ynp > 0 )
  353            {
  354               dascal_( &Ynp, ((
char *) BETA), 
Mptr( ((
char *) Y), Yii,
 
  355                        Yjj, Yd[
LLD_], usiz ), INCY );
 
  356            }
  357         }
  358      }
  359      return;
  360   }
  361
  362
  363
  364   PB_Cdescribe( *N, *N, Ai, Aj, Ad, nprow, npcol, myrow, mycol, &Aii, &Ajj,
 
  365                 &Ald, &Aimb1, &Ainb1, &Amb, &Anb, &Arow, &Acol, Ad0 );
  366
  367
  368
  369
  370   if( ( YisRow = ( *INCY == Yd[
M_] ) ) != 0 )
 
  371   {
  372      PB_CInOutV( utyp, 
ROW,    *N, *N, Ad0, 1, ((
char *)BETA), ((
char *) Y),
 
  373                  Yi, Yj, Yd, 
ROW,    ((
char**)(&tbeta)), &YR, YRd, &YRfr,
 
  374                  &YRsum, &YRpbY );
  375      PB_COutV( utyp, 
COLUMN, 
INIT, *N, *N, Ad0, 1, &YC, YCd, &YCfr, &YCsum );
 
  376   }
  377   else
  378   {
  380                  Yi, Yj, Yd, 
COLUMN, ((
char**)(&tbeta)), &YC, YCd, &YCfr,
 
  381                  &YCsum, &YCpbY );
  382      PB_COutV( utyp, 
ROW,    
INIT, *N, *N, Ad0, 1, &YR, YRd, &YRfr, &YRsum );
 
  383   }
  384
  385
  386
  387
  388   if( *INCX == Xd[
M_] )
 
  389   {
  390      PB_CInV( type, 
NOCONJG, 
ROW,    *N, *N, Ad0, 1, ((
char *) X), Xi, Xj,  Xd,
 
  391               ROW,    &XR, XRd, &XRfr );
 
  392      PB_CInV( type, 
NOCONJG, 
COLUMN, *N, *N, Ad0, 1, XR,            0,  0, XRd,
 
  393               ROW,    &XC, XCd, &XCfr );
 
  394   }
  395   else
  396   {
  397      PB_CInV( type, 
NOCONJG, 
COLUMN, *N, *N, Ad0, 1, ((
char *) X), Xi, Xj,  Xd,
 
  398               COLUMN, &XC, XCd, &XCfr );
 
  399      PB_CInV( type, 
NOCONJG, 
ROW,    *N, *N, Ad0, 1, XC,            0,  0, XCd,
 
  400               COLUMN, &XR, XRd, &XRfr );
 
  401   }
  403
  404
  405
  406   Aimb1 = Ad0[
IMB_ ]; Ainb1 = Ad0[
INB_ ]; Amb = Ad0[
MB_]; Anb = Ad0[
NB_];
 
  408   Amp   = 
PB_Cnumroc( *N, 0, Aimb1, Amb, myrow, Arow, nprow );
 
  409   Anq   = 
PB_Cnumroc( *N, 0, Ainb1, Anb, mycol, Acol, npcol );
 
  410 
  411   if( ( Amp > 0 ) && ( Anq > 0 ) )
  412   {
  413      Aptr = 
Mptr( ((
char *) A), Aii, Ajj, Ald, size );
 
  414 
  416
  417
  418
  419      if( YisRow )
  420      {
  421
  422
  423
  424         if( !YRpbY )
  425         {
  426            if( ( myrow == YRd[
RSRC_] ) || ( YRd[
RSRC_] < 0 ) )
 
  427            {
  428
  429
  430
  431               if( Anq > 0 )
  432                  dascal_( &Anq, ((
char *) tbeta), YR, &YRld );
 
  433            }
  434         }
  435      }
  436      else
  437      {
  438
  439
  440
  441         if( !YCpbY )
  442         {
  443            if( ( mycol == YCd[
CSRC_] ) || ( YCd[
CSRC_] < 0 ) )
 
  444            {
  445
  446
  447
  448               if( Amp > 0 )
  449                  dascal_( &Amp, ((
char *) tbeta), YC, &ione );
 
  450            }
  451         }
  452      }
  453
  454
  455
  456
  458           PB_Clcm( ( Arow >= 0 ? nprow : 1 ), ( Acol >= 0 ? npcol : 1 ) );
 
  459 
  460      if( upper )
  461      {
  462         for( k = 0; k < *N; k += nb )
  463         {
  464            kb   = *N - k; kb = 
MIN( kb, nb );
 
  465            Akp  = 
PB_Cnumroc( k,  0, Aimb1, Amb, myrow, Arow, nprow );
 
  466            Akq  = 
PB_Cnumroc( k,  0, Ainb1, Anb, mycol, Acol, npcol );
 
  467            Anq0 = 
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
 
  468            if( Akp > 0 && Anq0 > 0 )
  469            {
  471                        Mptr( Aptr, 0, Akq, Ald, size ), &Ald, 
Mptr( XR, 0, Akq,
 
  472                        XRld, size ), &XRld, one, YC, &ione );
  474                       Mptr( Aptr, 0, Akq, Ald, size ), &Ald, XC, &ione, one,
 
  475                       Mptr( YR, 0, Akq, YRld, usiz ), &YRld );
 
  476            }
  478                      k, Ad0, 
Mptr( XC, Akp, 0, XCld, size ), XCld, 
Mptr( XR, 0,
 
  479                      Akq, XRld, size ), XRld, 
Mptr( YC, Akp, 0, YCld, usiz ),
 
  481         }
  482      }
  483      else
  484      {
  485         for( k = 0; k < *N; k += nb )
  486         {
  487            kb  = *N - k; ktmp = k + ( kb = 
MIN( kb, nb ) );
 
  488            Akp = 
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
 
  489            Akq = 
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
 
  491                      k, Ad0, 
Mptr( XC, Akp, 0, XCld, size ), XCld, 
Mptr( XR, 0,
 
  492                      Akq, XRld, size ), XRld, 
Mptr( YC, Akp, 0, YCld, usiz ),
 
  494            Akp  = 
PB_Cnumroc( ktmp, 0, Aimb1, Amb, myrow, Arow, nprow );
 
  495            Amp0 = Amp - Akp;
  496            Anq0 = 
PB_Cnumroc( kb,   k, Ainb1, Anb, mycol, Acol, npcol );
 
  497            if( Amp0 > 0 && Anq0 > 0 )
  498            {
  500                        Mptr( Aptr, Akp, Akq, Ald, size ), &Ald, 
Mptr( XR, 0,
 
  501                        Akq, XRld, size ), &XRld, one, 
Mptr( YC, Akp, 0, YCld,
 
  502                        usiz ), &ione );
  504                        Mptr( Aptr, Akp, Akq, Ald, size ), &Ald, 
Mptr( XC, Akp,
 
  505                        0, XCld, size ), &ione, one, 
Mptr( YR, 0, Akq, YRld,
 
  506                        usiz ), &YRld );
  507            }
  508         }
  509      }
  510   }
  511   if( XCfr ) free( XC );
  512   if( XRfr ) free( XR );
  513 
  514   if( YisRow )
  515   {
  516
  517
  518
  519      if( YCsum )
  520      {
  522         if( Amp > 0 )
  523         {
  526         }
  527      }
  528
  529
  530
  531      if( YRsum && ( Anq > 0 ) )
  532      {
  535                   mycol );
  536      }
  537
  538
  539
  540      PB_Cpaxpby( utyp, 
NOCONJG, *N, 1, one, YC, 0, 0, YCd, 
COLUMN, one,
 
  541                  YR, 0, 0, YRd, 
ROW );
 
  542
  543
  544
  545      if( YRpbY )
  546      {
  547
  548
  549
  550         PB_Cinfog2l( Yi, Yj, Yd, nprow, npcol, myrow, mycol, &Yii, &Yjj, &Yrow,
 
  551                      &Ycol );
  552
  553
  554
  555         if( ( myrow == Yrow ) || Yrow < 0 )
  556         {
  557
  558
  559
  561                              npcol );
  562            if( Ynq > 0 )
  563            {
  565               dascal_( &Ynq, ((
char *) BETA), 
Mptr( ((
char *) Y), Yii,
 
  566                        Yjj, Yld, usiz ), &Yld );
  567            }
  568         }
  569         PB_Cpaxpby( utyp, 
NOCONJG, 1, *N, one, YR, 0, 0, YRd, 
ROW, one,
 
  570                     ((
char *) Y), Yi, Yj, Yd, 
ROW );
 
  571      }
  572   }
  573   else
  574   {
  575
  576
  577
  578      if( YRsum )
  579      {
  581         if( Anq > 0 )
  582         {
  585                      mycol );
  586         }
  587      }
  588
  589
  590
  591      if( YCsum && ( Amp > 0 ) )
  592      {
  596      }
  597
  598
  599
  600      PB_Cpaxpby( utyp, 
NOCONJG, 1, *N, one, YR, 0, 0, YRd, 
ROW, one,
 
  602
  603
  604
  605      if( YCpbY )
  606      {
  607
  608
  609
  610         PB_Cinfog2l( Yi, Yj, Yd, nprow, npcol, myrow, mycol, &Yii, &Yjj, &Yrow,
 
  611                      &Ycol );
  612
  613
  614
  615         if( ( mycol == Ycol ) || Ycol < 0 )
  616         {
  617
  618
  619
  621                              nprow );
  622            if( Ynp > 0 )
  623            {
  624               dascal_( &Ynp, ((
char *) BETA), 
Mptr( ((
char *) Y), Yii,
 
  625                        Yjj, Yd[
LLD_], usiz ), INCY );
 
  626            }
  627         }
  628         PB_Cpaxpby( utyp, 
NOCONJG, *N, 1, one, YC, 0, 0, YCd, 
COLUMN, one,
 
  629                     ((
char *) Y), Yi, Yj, Yd, 
COLUMN );
 
  630      }
  631   }
  632   if( YCfr ) free( YC );
  633   if( YRfr ) free( YR );
  634
  635
  636
  637}