libflame
revision_anchor
|
Functions | |
FLA_Error | FLA_Tridiag_UT_form_Q (FLA_Uplo uplo, FLA_Obj A, FLA_Obj T, FLA_Obj Q) |
References FLA_Check_error_level(), FLA_Obj_is(), FLA_ONE, FLA_Part_1x2(), FLA_Part_2x2(), FLA_QR_UT_form_Q(), FLA_Set(), FLA_Tridiag_UT_form_Q_check(), FLA_Tridiag_UT_shift_U(), and FLA_ZERO.
Referenced by FLA_Hevd_lv_unb_var1(), and FLA_Hevd_lv_unb_var2().
{ FLA_Error r_val = FLA_SUCCESS; FLA_Obj ATL, ATR, ABL, ABR; FLA_Obj QTL, QTR, QBL, QBR; FLA_Obj TL, TR; if ( FLA_Check_error_level() >= FLA_MIN_ERROR_CHECKING ) FLA_Tridiag_UT_form_Q_check( uplo, A, T, Q ); // Adjust T. FLA_Part_1x2( T, &TL, &TR, 1, FLA_RIGHT ); if ( FLA_Obj_is( A, Q ) == FALSE ) { FLA_Part_2x2( Q, &QTL, &QTR, &QBL, &QBR, 1, 1, FLA_TL ); FLA_Set( FLA_ONE, QTL ); FLA_Set( FLA_ZERO, QTR ); FLA_Set( FLA_ZERO, QBL ); if ( uplo == FLA_LOWER_TRIANGULAR ) { FLA_Part_2x2( A, &ATL, &ATR, &ABL, &ABR, 1, 1, FLA_TR ); FLA_QR_UT_form_Q( ABL, TL, QBR ); } else // ( uplo == FLA_UPPER_TRIANGULAR ) { FLA_Check_error_code( FLA_NOT_YET_IMPLEMENTED ); } } else { // Shift the Householder vectors one row/column towards the diagonal. FLA_Tridiag_UT_shift_U( uplo, A ); FLA_Part_2x2( A, &ATL, &ATR, &ABL, &ABR, 1, 1, FLA_TL ); if ( uplo == FLA_LOWER_TRIANGULAR ) { FLA_QR_UT_form_Q( ABR, TL, ABR ); } else // ( uplo == FLA_UPPER_TRIANGULAR ) { FLA_Check_error_code( FLA_NOT_YET_IMPLEMENTED ); } } return r_val; }