示例#1
0
inline void gemv( const Order, const Trans, const fortran_int_t m,
        const fortran_int_t n, const std::complex<double> alpha,
        const std::complex<double>* a, const fortran_int_t lda,
        const std::complex<double>* x, const fortran_int_t incx,
        const std::complex<double> beta, std::complex<double>* y,
        const fortran_int_t incy ) {
    BOOST_STATIC_ASSERT( (is_same<Order, tag::column_major>::value) );
    BLAS_ZGEMV( &blas_option< Trans >::value, &m, &n, &alpha, a, &lda, x,
            &incx, &beta, y, &incy );
}
示例#2
0
void init_BICG_Z(Complex_Z *vl, int ldvl, Complex_Z *vr, int ldvr, int nvecs, 
               Complex_Z *xinit, Complex_Z *b, int lde, int n,
               Complex_Z *H, int ldH, int *IPIV, Complex_Z *work,
               void (*matvec) (void *, void *, void *), void *params, int *info)
{

    /* xinit = xinit + (vr inv(H) vl' res) */
    
    int i,ONE=1;
    Complex_Z tempc,tpone={1.00000e+00,0.000000e+00};
    char cN='N';

    //compute res=b-Ax and store it in work[nvecs:nvecs+n-1]
    tempc = wrap_zdot(&n,xinit,&ONE,xinit,&ONE,params);
    if(tempc.r > 0.0) //if nonzero initial guess
      {
           matvec(xinit,&work[nvecs],params);

           for(i=0; i<n; i++)
              { work[nvecs+i].r = b[i].r - work[nvecs+i].r;
                work[nvecs+i].i = b[i].i - work[nvecs+i].i;}
      }
     else
       BLAS_ZCOPY(&n,b,&ONE,&work[nvecs],&ONE);

    for(i=0; i<nvecs; i++){
      work[i] = wrap_zdot(&n, &vl[i*ldvl],&ONE,&work[nvecs],&ONE,params);}


    //solve using LU factorized H
    BLAS_ZGETRS(&cN,&nvecs,&ONE,H,&ldH,IPIV,work,&nvecs,info);
    printf("inside init_bicg\n");

    if( (*info) != 0)
      { fprintf(stderr,"Error in BLAS_ZGESV inside init-BICG_Z. info %d\n",(*info));
        exit(2);
      }

    BLAS_ZGEMV(&cN,&n,&nvecs,&tpone,vr,&ldvr,work,&ONE,&tpone,xinit,&ONE);

    return;
}