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()
Example #2
0
File: layout.c Project: ekg/mars
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