libflame  revision_anchor
Functions
FLA_Bidiag_UT_form_U.c File Reference

(r)

Functions

FLA_Error FLA_Bidiag_UT_form_U (FLA_Obj A, FLA_Obj T, FLA_Obj U)

Function Documentation

References FLA_Bidiag_UT_form_U_check(), FLA_Check_error_level(), FLA_Obj_length(), FLA_Obj_width(), FLA_ONE, FLA_Part_1x2(), FLA_Part_2x2(), FLA_QR_UT_form_Q(), FLA_Set(), and FLA_ZERO.

Referenced by FLA_Svd_uv_unb_var1(), and FLA_Svd_uv_unb_var2().

{
    FLA_Uplo uplo;

    if ( FLA_Check_error_level() >= FLA_MIN_ERROR_CHECKING )
        FLA_Bidiag_UT_form_U_check( A, T, U );

    uplo = ( FLA_Obj_length( A ) >= FLA_Obj_width( A ) ?
                                  FLA_UPPER_TRIANGULAR :
                                  FLA_LOWER_TRIANGULAR );

    if ( uplo == FLA_UPPER_TRIANGULAR )
    {
        FLA_QR_UT_form_Q( A, T, U );
        //FLA_Copyr( FLA_LOWER_TRIANGULAR, A, U );
        //FLA_QR_UT_form_Q( U, T, U );
/*
        {
            FLA_Obj W;
            FLA_Set_to_identity( U );
            //FLA_Set( FLA_ZERO, U );
            FLA_Apply_Q_UT_create_workspace( T, U, &W );
            FLA_Apply_Q_UT( FLA_LEFT, FLA_NO_TRANSPOSE, FLA_FORWARD, FLA_COLUMNWISE,
                            A, T, W, U );
            FLA_Obj_free( &W );
        }
*/
    }
    else // if ( uplo == FLA_LOWER_TRIANGULAR )
    {
        FLA_Obj ATL, ATR,
                ABL, ABR;

        FLA_Obj UTL, UTR,
                UBL, UBR;

        FLA_Obj TL,  TR;

        FLA_Part_2x2( A,    &ATL, &ATR,
                            &ABL, &ABR,    1, 1, FLA_TR );

        FLA_Part_2x2( U,    &UTL, &UTR,
                            &UBL, &UBR,    1, 1, FLA_TL );

        FLA_Part_1x2( T,    &TL,  &TR,     1, FLA_RIGHT );

        FLA_Set( FLA_ONE,  UTL );
        FLA_Set( FLA_ZERO, UBL );
        FLA_Set( FLA_ZERO, UTR );

        FLA_QR_UT_form_Q( ABL, TL, UBR );
    }

    return FLA_SUCCESS;
}