BASKER_INLINE int Basker<Int,Entry,Exe_Space>::serial_backward_solve ( ENTRY_1DARRAY y, ENTRY_1DARRAY x ) { #ifdef BASKER_DEBUG_SOLVE_RHS printf("called serial backward solve \n"); #endif for(Int b = tree.nblks-1; b >=0; b--) { //printf("--HERE-\n"); #ifdef BASKER_DEBUG_SOLVE_RHS printf("Upper solve blk: %d \n", b); #endif BASKER_MATRIX &U = LU(b)(LU_size(b)-1); //printf("\n--------U------------\n"); //U.print(); //U\y -> x upper_tri_solve(U,y,x); for(Int bb = LU_size(b)-2; bb >= 0; bb--) { #ifdef BASKER_DEBUG_SOLVE_RHS printf("Upper solver spmv: %d %d \n", b, bb); #endif BASKER_MATRIX &UB = LU(b)(bb); //y = UB*x; neg_spmv(UB,x,y); } }//end over all blks #ifdef BASKER_DEBUG_SOLVE_RHS printf("Done with Upper Solve: \n"); printVec(x, gn); #endif return 0; }//end serial_backward_solve()
static double* inv_mul_full(double* a, double* x, int n, mat u, mat v, mat q_t, mat r) { int i; double* a_x = inv_mul_ax(a,x,n); //A^{-1}x double* tmp1 = mat_vec_mult(v,a_x); //VA^{-1}x double* tmp2 = mat_vec_mult(q_t,tmp1); //Q^TVA^{-1]x upper_tri_solve(r,tmp2); //R^{-1}Q^TVA^{-1}x free(tmp1); tmp1 = mat_vec_mult(u,tmp2); //UR^{-1}Q^TVA^{-1}x free(tmp2); tmp2 = inv_mul_ax(a,tmp1,n); //A^{-1}UR^{-1}Q^TVA^{-1}x for(i = 0; i < n; i++) { //A^{-1}x-A^{-1}UR^{-1}Q^TVA^{-1}x a_x[i] = a_x[i] - tmp2[i]; } free(tmp1); free(tmp2); return a_x; }
BASKER_INLINE int Basker<Int,Entry,Exe_Space>::serial_btf_solve ( ENTRY_1DARRAY y, ENTRY_1DARRAY x ) { for(Int i = 0; i < gn; ++i) { x(i) = y(i); y(i) = (Entry) 0.0; } //printf("Test \n"); //Start in C and go backwards //In first level, only due U\L\x->y for(Int b = (btf_nblks-btf_tabs_offset)-1; b>= 0; b--) { #ifdef BASKER_DEBUG_SOLVE_RHS printf("\n\n btf b: %d \n", b); #endif //---Lower solve BASKER_MATRIX &LC = LBTF(b); //L\x -> y lower_tri_solve(LC,x,y); BASKER_MATRIX &UC = UBTF(b); //U\x -> y upper_tri_solve(UC,x,y); #ifdef BASKER_DEBUG_SOLVE_RHS printf("Before spmv\n"); printf("Inner Vector y print\n"); printVec(y, gn); printf("Inner Vector x print\n"); printVec(x, gn); printf("\n"); #endif //-----Update //if(b > btf_tabs_offset) { //x = BTF_C*y; //printf("spmv tab: %d \n", b+btf_tabs_offset); spmv_BTF(b+btf_tabs_offset, BTF_C, y, x); } #ifdef BASKER_DEBUG_SOLVE_RHS printf("After spmv\n"); printf("Inner Vector y print\n"); printVec(y, gn); printf("Inner Vector x print\n"); printVec(x, gn); #endif //BASKER_MATRIX &UC = UBTF[b]; //U\x -> y //upper_tri_solve(UC,x,y); } #ifdef BASKER_DEBUG_SOLVE_RHS printf("Done, BTF-C Solve \n"); printf("\n x \n"); printVec(x, gn); printf("\n y \n"); printVec(y, gn); printf("\n\n"); #endif //Update B //BTF_B*y -> x if(btf_tabs_offset != 0) { neg_spmv(BTF_B,y,x); } #ifdef BASKER_DEBUG_SOLVE_RHS printf("Done, SPMV BTF_B UPDATE \n"); printf("\n x \n"); printVec(x, gn); printf("\n y \n"); printVec(y, gn); printf("\n\n"); #endif //now do the forward backwared solve //L\x ->y serial_forward_solve(x,y); //U\y->x serial_backward_solve(y,x); //copy lower part down #ifdef BASKER_DEBUG_SOLVE_RHS printf("copying lower starting: %d \n", btf_tabs[btf_tabs_offset]); #endif for(Int i = btf_tabs(btf_tabs_offset); i < gn; ++i) { //x[i] = y[i]; x(i) = y(i); } //Comeback and fix return 0; }//end serial_btf_solve