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