libflame  12600
Functions
FLA_Hevv_2x2.c File Reference

(r12600)

Functions

FLA_Error FLA_Hevv_2x2 (FLA_Obj alpha11, FLA_Obj alpha21, FLA_Obj alpha22, FLA_Obj lambda1, FLA_Obj lambda2, FLA_Obj gamma1, FLA_Obj sigma1)
FLA_Error FLA_Hevv_2x2_ops (float *alpha11, float *alpha21, float *alpha22, float *lambda1, float *lambda2, float *gamma1, float *sigma1)
FLA_Error FLA_Hevv_2x2_opd (double *alpha11, double *alpha21, double *alpha22, double *lambda1, double *lambda2, double *gamma1, double *sigma1)
FLA_Error FLA_Hevv_2x2_opc (scomplex *alpha11, scomplex *alpha21, scomplex *alpha22, float *lambda1, float *lambda2, float *gamma1, scomplex *sigma1)
FLA_Error FLA_Hevv_2x2_opz (dcomplex *alpha11, dcomplex *alpha21, dcomplex *alpha22, double *lambda1, double *lambda2, double *gamma1, dcomplex *sigma1)

Function Documentation

FLA_Error FLA_Hevv_2x2 ( FLA_Obj  alpha11,
FLA_Obj  alpha21,
FLA_Obj  alpha22,
FLA_Obj  lambda1,
FLA_Obj  lambda2,
FLA_Obj  gamma1,
FLA_Obj  sigma1 
)

References FLA_Hevv_2x2_opc(), FLA_Hevv_2x2_opd(), FLA_Hevv_2x2_ops(), FLA_Hevv_2x2_opz(), and FLA_Obj_datatype().

{
    FLA_Datatype datatype;

    datatype = FLA_Obj_datatype( alpha11 );

    switch ( datatype )
    {
        case FLA_FLOAT:
        {
            float*  buff_alpha11 = FLA_FLOAT_PTR( alpha11 );
            float*  buff_alpha21 = FLA_FLOAT_PTR( alpha21 );
            float*  buff_alpha22 = FLA_FLOAT_PTR( alpha22 );
            float*  buff_lambda1 = FLA_FLOAT_PTR( lambda1 );
            float*  buff_lambda2 = FLA_FLOAT_PTR( lambda2 );
            float*  buff_gamma1  = FLA_FLOAT_PTR( gamma1 );
            float*  buff_sigma1  = FLA_FLOAT_PTR( sigma1 );

            FLA_Hevv_2x2_ops( buff_alpha11,
                              buff_alpha21,
                              buff_alpha22,
                              buff_lambda1,
                              buff_lambda2,
                              buff_gamma1,
                              buff_sigma1 );

            break;
        }

        case FLA_DOUBLE:
        {
            double* buff_alpha11 = FLA_DOUBLE_PTR( alpha11 );
            double* buff_alpha21 = FLA_DOUBLE_PTR( alpha21 );
            double* buff_alpha22 = FLA_DOUBLE_PTR( alpha22 );
            double* buff_lambda1 = FLA_DOUBLE_PTR( lambda1 );
            double* buff_lambda2 = FLA_DOUBLE_PTR( lambda2 );
            double* buff_gamma1  = FLA_DOUBLE_PTR( gamma1 );
            double* buff_sigma1  = FLA_DOUBLE_PTR( sigma1 );

            FLA_Hevv_2x2_opd( buff_alpha11,
                              buff_alpha21,
                              buff_alpha22,
                              buff_lambda1,
                              buff_lambda2,
                              buff_gamma1,
                              buff_sigma1 );

            break;
        }

        case FLA_COMPLEX:
        {
            scomplex* buff_alpha11 = FLA_COMPLEX_PTR( alpha11 );
            scomplex* buff_alpha21 = FLA_COMPLEX_PTR( alpha21 );
            scomplex* buff_alpha22 = FLA_COMPLEX_PTR( alpha22 );
            float*    buff_lambda1 = FLA_FLOAT_PTR( lambda1 );
            float*    buff_lambda2 = FLA_FLOAT_PTR( lambda2 );
            float*    buff_gamma1  = FLA_FLOAT_PTR( gamma1 );
            scomplex* buff_sigma1  = FLA_COMPLEX_PTR( sigma1 );

            FLA_Hevv_2x2_opc( buff_alpha11,
                              buff_alpha21,
                              buff_alpha22,
                              buff_lambda1,
                              buff_lambda2,
                              buff_gamma1,
                              buff_sigma1 );

            break;
        }

        case FLA_DOUBLE_COMPLEX:
        {
            dcomplex* buff_alpha11 = FLA_DOUBLE_COMPLEX_PTR( alpha11 );
            dcomplex* buff_alpha21 = FLA_DOUBLE_COMPLEX_PTR( alpha21 );
            dcomplex* buff_alpha22 = FLA_DOUBLE_COMPLEX_PTR( alpha22 );
            double*   buff_lambda1 = FLA_DOUBLE_PTR( lambda1 );
            double*   buff_lambda2 = FLA_DOUBLE_PTR( lambda2 );
            double*   buff_gamma1  = FLA_DOUBLE_PTR( gamma1 );
            dcomplex* buff_sigma1  = FLA_DOUBLE_COMPLEX_PTR( sigma1 );

            FLA_Hevv_2x2_opz( buff_alpha11,
                              buff_alpha21,
                              buff_alpha22,
                              buff_lambda1,
                              buff_lambda2,
                              buff_gamma1,
                              buff_sigma1 );

            break;
        }
    }

    return FLA_SUCCESS;
}
FLA_Error FLA_Hevv_2x2_opc ( scomplex alpha11,
scomplex alpha21,
scomplex alpha22,
float *  lambda1,
float *  lambda2,
float *  gamma1,
scomplex sigma1 
)

Referenced by FLA_Hevv_2x2().

{
    FLA_Check_error_code( FLA_NOT_YET_IMPLEMENTED );

    return FLA_SUCCESS;
}
FLA_Error FLA_Hevv_2x2_opd ( double *  alpha11,
double *  alpha21,
double *  alpha22,
double *  lambda1,
double *  lambda2,
double *  gamma1,
double *  sigma1 
)

Referenced by FLA_Hevv_2x2(), FLA_Tevd_iteracc_v_opd_var1(), and FLA_Tevd_iteracc_v_opd_var3().

{
    double a11, a21, a22;
    double l1, l2;
    double g1, s1;
    double ab, acmn, acmx, acs, adf, cs, ct, df, rt, sm, tb, tn;
    int    sgn1, sgn2;

    a11 = *alpha11;
    a21 = *alpha21;
    a22 = *alpha22;

    // Compute the eigenvalues.

    sm  = a11 + a22;
    df  = a11 - a22;
    adf = fabs( df );
    tb  = a21 + a21;
    ab  = fabs( tb );

    if ( fabs( a11 ) > fabs( a22 ) )
    {
        acmx = a11;
        acmn = a22;
    }
    else
    {
        acmx = a22;
        acmn = a11;
    }

    if      ( adf > ab ) rt = adf * sqrt( 1.0 + pow( ( ab / adf ), 2.0 ) );
    else if ( adf < ab ) rt = ab  * sqrt( 1.0 + pow( ( adf / ab ), 2.0 ) );
    else                 rt = ab  * sqrt( 2.0 );

    if      ( sm < 0.0 )
    {
        l1 = 0.5 * ( sm - rt );
        l2 = ( acmx / l1 ) * acmn - ( a21 / l1 ) * a21;
        sgn1 = -1;
    }
    else if ( sm > 0.0 )
    {
        l1 = 0.5 * ( sm + rt );
        l2 = ( acmx / l1 ) * acmn - ( a21 / l1 ) * a21;
        sgn1 = 1;
    }
    else
    {
        l1 =  0.5 * rt;
        l2 = -0.5 * rt;
        sgn1 = 1;
    }

    *lambda1 = l1;
    *lambda2 = l2;

    // Compute the eigenvector.

    if ( df >= 0.0 )
    {
        cs = df + rt;
        sgn2 = 1;
    }
    else
    {
        cs = df - rt;
        sgn2 = -1;
    }

    acs = fabs( cs );

    if ( acs > ab )
    {
        ct = -tb / cs;
        s1 = 1.0 / sqrt( 1.0 + ct*ct );
        g1 = ct * s1;
    }
    else
    {
        if ( ab == 0.0 )
        {
            g1 = 1.0;
            s1 = 0.0;
        }
        else
        {
            tn = -cs / tb;
            g1 = 1.0 / sqrt( 1.0 + tn*tn );
            s1 = tn * g1;
        }
    }
    
    if ( sgn1 == sgn2 )
    {
        tn = g1;
        g1 = -s1;
        s1 = tn;
    }

    *gamma1 = g1;
    *sigma1 = s1;

    return FLA_SUCCESS;
}
FLA_Error FLA_Hevv_2x2_ops ( float *  alpha11,
float *  alpha21,
float *  alpha22,
float *  lambda1,
float *  lambda2,
float *  gamma1,
float *  sigma1 
)

Referenced by FLA_Hevv_2x2().

{
    float  a11, a21, a22;
    float  l1, l2;
    float  g1, s1;
    float  ab, acmn, acmx, acs, adf, cs, ct, df, rt, sm, tb, tn;
    int    sgn1, sgn2;

    a11 = *alpha11;
    a21 = *alpha21;
    a22 = *alpha22;

    // Compute the eigenvalues.

    sm  = a11 + a22;
    df  = a11 - a22;
    adf = fabs( df );
    tb  = a21 + a21;
    ab  = fabs( tb );

    if ( fabs( a11 ) > fabs( a22 ) )
    {
        acmx = a11;
        acmn = a22;
    }
    else
    {
        acmx = a22;
        acmn = a11;
    }

    if      ( adf > ab ) rt = adf * sqrt( 1.0F + ( ab / adf ) * ( ab / adf ) );
    else if ( adf < ab ) rt = ab  * sqrt( 1.0F + ( adf / ab ) * ( adf / ab ) );
    else                 rt = ab  * sqrt( 2.0F );

    if      ( sm < 0.0F )
    {
        l1 = 0.5F * ( sm - rt );
        l2 = ( acmx / l1 ) * acmn - ( a21 / l1 ) * a21;
        sgn1 = -1;
    }
    else if ( sm > 0.0F )
    {
        l1 = 0.5F * ( sm + rt );
        l2 = ( acmx / l1 ) * acmn - ( a21 / l1 ) * a21;
        sgn1 = 1;
    }
    else
    {
        l1 =  0.5F * rt;
        l2 = -0.5F * rt;
        sgn1 = 1;
    }

    *lambda1 = l1;
    *lambda2 = l2;

    // Compute the eigenvector.

    if ( df >= 0.0F )
    {
        cs = df + rt;
        sgn2 = 1;
    }
    else
    {
        cs = df - rt;
        sgn2 = -1;
    }

    acs = fabs( cs );

    if ( acs > ab )
    {
        ct = -tb / cs;
        s1 = 1.0F / sqrt( 1.0F + ct*ct );
        g1 = ct * s1;
    }
    else
    {
        if ( ab == 0.0F )
        {
            g1 = 1.0F;
            s1 = 0.0F;
        }
        else
        {
            tn = -cs / tb;
            g1 = 1.0F / sqrt( 1.0F + tn*tn );
            s1 = tn * g1;
        }
    }
    
    if ( sgn1 == sgn2 )
    {
        tn = g1;
        g1 = -s1;
        s1 = tn;
    }

    *gamma1 = g1;
    *sigma1 = s1;

    return FLA_SUCCESS;
}
FLA_Error FLA_Hevv_2x2_opz ( dcomplex alpha11,
dcomplex alpha21,
dcomplex alpha22,
double *  lambda1,
double *  lambda2,
double *  gamma1,
dcomplex sigma1 
)

Referenced by FLA_Hevv_2x2().

{
    FLA_Check_error_code( FLA_NOT_YET_IMPLEMENTED );

    return FLA_SUCCESS;
}