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 ); }
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; }