libflame  revision_anchor
Functions
FLA_Bidiag_UT_form_V.c File Reference

(r)

Functions

FLA_Error FLA_Bidiag_UT_form_V (FLA_Obj A, FLA_Obj S, FLA_Obj V)

Function Documentation

References FLA_Bidiag_UT_form_V_check(), FLA_Check_error_level(), FLA_Copyrt(), 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_V_check( A, S, V );

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

    if ( uplo == FLA_UPPER_TRIANGULAR )
    {
        FLA_Obj ATL, ATR,
                ABL, ABR;

        FLA_Obj VTL, VTR,
                VBL, VBR;

        FLA_Obj SL,  SR;

        dim_t   n_A = FLA_Obj_width( A );

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

        FLA_Part_2x2( V,    &VTL, &VTR,
                            &VBL, &VBR,    1, 1, FLA_TL );

        FLA_Part_1x2( S,    &SL,  &SR,     1, FLA_RIGHT );

        FLA_Set( FLA_ONE,  VTL );
        FLA_Set( FLA_ZERO, VBL );
        FLA_Set( FLA_ZERO, VTR );

        //FLA_LQ_UT_form_Q( ATR, SL, VBR );
        FLA_Copyrt( FLA_LOWER_TRIANGULAR, FLA_TRANSPOSE, ATR, VBR );
        FLA_QR_UT_form_Q( VBR, SL, VBR );
    }
    else // if ( uplo == FLA_LOWER_TRIANGULAR )
    {
        //FLA_LQ_UT_form_Q( A, S, V );
        FLA_Copyrt( FLA_LOWER_TRIANGULAR, FLA_TRANSPOSE, A, V );
        FLA_QR_UT_form_Q( V, S, V );
    }

    return FLA_SUCCESS;
}