BASKER_INLINE int Basker<Int,Entry,Exe_Space>::serial_forward_solve ( ENTRY_1DARRAY y, ENTRY_1DARRAY x ) { #ifdef BASKER_DEBUG_SOLVE_RHS printf("Called serial forward solve \n"); #endif //Forward solve on A for(Int b = 0; b < tree.nblks; ++b) //for(Int b = 0; b < 1; ++b) { #ifdef BASKER_DEBUG_SOLVE_RHS printf("Lower Solve blk: %d \n",b); #endif BASKER_MATRIX &L = LL(b)(0); //L\y -> x lower_tri_solve(L, y, x); //Update offdiag for(Int bb = 1; bb < LL_size(b); ++bb) { #ifdef BASKER_DEBUG_SOLVE_RHS printf("Lower Solver Update blk: %d %d \n", b, bb); #endif BASKER_MATRIX &LD = LL(b)(bb); //y = LD*x; neg_spmv_perm(LD, x, y); } //printf("spmv test\n"); //printVec(y,gn); } #ifdef BASKER_DEBUG_SOLVE_RHS printf("Done forward solve A \n"); printVec(x, gn); #endif return 0; }//end serial_forward_solve()
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