FLA_LU_piv_blk_var3.c File Reference

(r)


Functions

FLA_Error FLA_LU_piv_blk_var3 (FLA_Obj A, FLA_Obj p, fla_lu_t *cntl)

Function Documentation

FLA_Error FLA_LU_piv_blk_var3 ( FLA_Obj  A,
FLA_Obj  p,
fla_lu_t cntl 
)

References FLA_Apply_pivots(), FLA_Cont_with_1x3_to_1x2(), FLA_Cont_with_3x1_to_2x1(), FLA_Cont_with_3x3_to_2x2(), FLA_Determine_blocksize(), FLA_Gemm_internal(), FLA_LU_piv_internal(), FLA_Merge_2x1(), FLA_MINUS_ONE, FLA_Obj_length(), FLA_Obj_width(), FLA_ONE, FLA_Part_1x2(), FLA_Part_2x1(), FLA_Part_2x2(), FLA_Repart_1x2_to_1x3(), FLA_Repart_2x1_to_3x1(), FLA_Repart_2x2_to_3x3(), FLA_Trsm_external(), and FLA_Trsm_internal().

Referenced by FLA_LU_piv_internal().

00038 {
00039   FLA_Obj ATL,   ATR,      A00, A01, A02, 
00040           ABL,   ABR,      A10, A11, A12,
00041                            A20, A21, A22;
00042 
00043   FLA_Obj AL,    AR,       A0,  A1,  A2;
00044 
00045   FLA_Obj pT,              p0,
00046           pB,              p1,
00047                            p2;
00048 
00049   FLA_Obj AB0, AB1;
00050 
00051   dim_t b;
00052 
00053 
00054   FLA_Part_2x2( A,    &ATL, &ATR,
00055                       &ABL, &ABR,     0, 0, FLA_TL );
00056 
00057   FLA_Part_1x2( A,    &AL,  &AR,      0, FLA_LEFT );
00058 
00059   FLA_Part_2x1( p,    &pT, 
00060                       &pB,            0, FLA_TOP );
00061 
00062   while ( FLA_Obj_length( ATL ) < FLA_Obj_length( A ) &&
00063           FLA_Obj_width( ATL ) < FLA_Obj_width( A )){
00064 
00065     b = FLA_Determine_blocksize( ABR, FLA_BR, FLA_Cntl_blocksize( cntl ) );
00066 
00067     FLA_Repart_2x2_to_3x3( ATL, /**/ ATR,       &A00, /**/ &A01, &A02,
00068                         /* ************* */   /* ******************** */
00069                                                 &A10, /**/ &A11, &A12,
00070                            ABL, /**/ ABR,       &A20, /**/ &A21, &A22,
00071                            b, b, FLA_BR );
00072 
00073     FLA_Repart_1x2_to_1x3( AL,  /**/ AR,        &A0, /**/ &A1, &A2,
00074                            b, FLA_RIGHT );
00075 
00076     FLA_Repart_2x1_to_3x1( pT,                &p0, 
00077                         /* ** */            /* ** */
00078                                               &p1, 
00079                            pB,                &p2,        b, FLA_BOTTOM );
00080 
00081     /*------------------------------------------------------------*/
00082 
00083     /* Apply previously computed pivots */
00084     FLA_Apply_pivots( FLA_LEFT, FLA_NO_TRANSPOSE, p0, A1 );
00085 
00086     /* A01 = trilu( A00 ) \ A10 */ 
00087     FLA_Trsm_internal( FLA_LEFT, FLA_LOWER_TRIANGULAR, 
00088                        FLA_NO_TRANSPOSE, FLA_UNIT_DIAG,
00089                        FLA_ONE, A00, A01,
00090                        FLA_Cntl_sub_trsm1( cntl ) );
00091 
00092     /* A11 = A11 - A10 * A01 */
00093     FLA_Gemm_internal( FLA_NO_TRANSPOSE, FLA_NO_TRANSPOSE,
00094                        FLA_MINUS_ONE, A10, A01, FLA_ONE, A11,
00095                        FLA_Cntl_sub_gemm1( cntl ) );
00096 
00097     /* A21 = A21 - A20 * A01 */
00098     FLA_Gemm_internal( FLA_NO_TRANSPOSE, FLA_NO_TRANSPOSE,
00099                        FLA_MINUS_ONE, A20, A01, FLA_ONE, A21,
00100                        FLA_Cntl_sub_gemm2( cntl ) );
00101 
00102     /* AB1 = / A11 \
00103              \ A21 / */
00104     FLA_Merge_2x1( A11,
00105                    A21,      &AB1 );
00106 
00107     /* AB1, p1 = LU_piv( AB1 ) */
00108     FLA_LU_piv_internal( AB1, p1, 
00109                          FLA_Cntl_sub_lu( cntl ) );
00110 
00111     /* AB0 = / A10 \
00112              \ A20 / */
00113     FLA_Merge_2x1( A10,
00114                    A20,      &AB0 );
00115 
00116     /* Apply pivots to previous columns */
00117     FLA_Apply_pivots( FLA_LEFT, FLA_NO_TRANSPOSE, p1, AB0 );
00118 
00119     /*------------------------------------------------------------*/
00120 
00121     FLA_Cont_with_3x3_to_2x2( &ATL, /**/ &ATR,       A00, A01, /**/ A02,
00122                                                      A10, A11, /**/ A12,
00123                             /* ************** */  /* ****************** */
00124                               &ABL, /**/ &ABR,       A20, A21, /**/ A22,
00125                               FLA_TL );
00126 
00127     FLA_Cont_with_1x3_to_1x2( &AL,  /**/ &AR,        A0, A1, /**/ A2,
00128                               FLA_LEFT );
00129 
00130     FLA_Cont_with_3x1_to_2x1( &pT,                p0, 
00131                                                   p1, 
00132                             /* ** */           /* ** */
00133                               &pB,                p2,     FLA_TOP );
00134 
00135   }
00136 
00137   if ( FLA_Obj_width( ATR ) > 0 )
00138   {
00139     /* Apply pivots to untouched columns */
00140     FLA_Apply_pivots( FLA_LEFT, FLA_NO_TRANSPOSE, p, ATR );
00141 
00142     /* ATR = trilu( ATL ) \ ATR */ 
00143     FLA_Trsm_external( FLA_LEFT, FLA_LOWER_TRIANGULAR, 
00144                        FLA_NO_TRANSPOSE, FLA_UNIT_DIAG,
00145                        FLA_ONE, ATL, ATR );
00146   }
00147 
00148   return FLA_SUCCESS;
00149 }


Generated on Mon Jul 6 05:45:56 2009 for libflame by  doxygen 1.5.9