Ejemplo n.º 1
0
inline void gemv( const Order, const Trans, const fortran_int_t m,
        const fortran_int_t n, const std::complex<float> alpha,
        const std::complex<float>* a, const fortran_int_t lda,
        const std::complex<float>* x, const fortran_int_t incx,
        const std::complex<float> beta, std::complex<float>* y,
        const fortran_int_t incy ) {
    BOOST_STATIC_ASSERT( (is_same<Order, tag::column_major>::value) );
    BLAS_CGEMV( &blas_option< Trans >::value, &m, &n, &alpha, a, &lda, x,
            &incx, &beta, y, &incy );
}
Ejemplo n.º 2
0
void init_BICG_C(Complex_C *vl, int ldvl, Complex_C *vr, int ldvr, int nvecs, 
               Complex_C *xinit, Complex_C *b, int lde, int n,
               Complex_C *H, int ldH, int *IPIV, Complex_C *work,
               void (*matvec) (void *, void *, void *), void *params, int *info)
{

    /* xinit = xinit + (vr inv(H) vl' res) */
    
    int i,ONE=1;
    Complex_C 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_zsum_cdot(&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_CCOPY(&n,b,&ONE,&work[nvecs],&ONE);

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


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

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

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

    return;
}