1 /*
2 
3     Copyright (C) 2014, The University of Texas at Austin
4 
5     This file is part of libflame and is available under the 3-Clause
6     BSD license, which can be found in the LICENSE file at the top-level
7     directory, or at http://opensource.org/licenses/BSD-3-Clause
8 
9 */
10 
11 #include "FLAME.h"
12 
FLA_Eig_gest_il_unb_var3(FLA_Obj A,FLA_Obj Y,FLA_Obj B)13 FLA_Error FLA_Eig_gest_il_unb_var3( FLA_Obj A, FLA_Obj Y, FLA_Obj B )
14 {
15   FLA_Obj ATL,   ATR,      A00,  a01,     A02,
16           ABL,   ABR,      a10t, alpha11, a12t,
17                            A20,  a21,     A22;
18 
19   FLA_Obj BTL,   BTR,      B00,  b01,    B02,
20           BBL,   BBR,      b10t, beta11, b12t,
21                            B20,  b21,    B22;
22 
23   FLA_Obj YTL,   YTR,      Y00,  y01,   Y02,
24           YBL,   YBR,      y10t, psi11, y12t,
25                            Y20,  y21,   Y22;
26 
27   FLA_Part_2x2( A,    &ATL, &ATR,
28                       &ABL, &ABR,     0, 0, FLA_TL );
29 
30   FLA_Part_2x2( B,    &BTL, &BTR,
31                       &BBL, &BBR,     0, 0, FLA_TL );
32 
33   FLA_Part_2x2( Y,    &YTL, &YTR,
34                       &YBL, &YBR,     0, 0, FLA_TL );
35 
36   while ( FLA_Obj_length( ATL ) < FLA_Obj_length( A ) ){
37 
38     FLA_Repart_2x2_to_3x3( ATL, /**/ ATR,       &A00,  /**/ &a01,     &A02,
39                         /* ************* */   /* ************************** */
40                                                 &a10t, /**/ &alpha11, &a12t,
41                            ABL, /**/ ABR,       &A20,  /**/ &a21,     &A22,
42                            1, 1, FLA_BR );
43 
44     FLA_Repart_2x2_to_3x3( BTL, /**/ BTR,       &B00,  /**/ &b01,    &B02,
45                         /* ************* */   /* ************************* */
46                                                 &b10t, /**/ &beta11, &b12t,
47                            BBL, /**/ BBR,       &B20,  /**/ &b21,    &B22,
48                            1, 1, FLA_BR );
49 
50     FLA_Repart_2x2_to_3x3( YTL, /**/ YTR,       &Y00,  /**/ &y01,   &Y02,
51                         /* ************* */   /* ************************ */
52                                                 &y10t, /**/ &psi11, &y12t,
53                            YBL, /**/ YBR,       &Y20,  /**/ &y21,   &Y22,
54                            1, 1, FLA_BR );
55 
56     /*------------------------------------------------------------*/
57 
58     // a10t = a10t - 1/2 * y10t;
59     FLA_Axpy_external( FLA_MINUS_ONE_HALF, y10t, a10t );
60 
61     // alpha11 = alpha11 - a10t * b10t' - b10t * a10t';
62     FLA_Dot2cs_external( FLA_CONJUGATE, FLA_MINUS_ONE, a10t, b10t, FLA_ONE, alpha11 );
63 
64     // alpha11 = inv(beta11) * alpha11 * inv(conj(beta11));
65     //         = inv(beta11) * alpha11 * inv(beta11);
66     FLA_Inv_scal_external( beta11, alpha11 );
67     FLA_Inv_scal_external( beta11, alpha11 );
68 
69     // a21 = a21 - A20 * b10t';
70     FLA_Gemvc_external( FLA_NO_TRANSPOSE, FLA_CONJUGATE,
71                         FLA_MINUS_ONE, A20, b10t, FLA_ONE, a21 );
72 
73     // a21 = a21 * inv(conj(beta11));
74     //     = a21 * inv(beta11);
75     FLA_Inv_scal_external( beta11, a21 );
76 
77     // a10t = a10t - 1/2 * y10t;
78     FLA_Axpy_external( FLA_MINUS_ONE_HALF, y10t, a10t );
79 
80     // a10t = inv(beta11) * a10t;
81     FLA_Inv_scal_external( beta11, a10t );
82 
83     // Y20 = Y20 + b21 * a10t;
84     FLA_Ger_external( FLA_ONE, b21, a10t, Y20 );
85 
86     // y21 = b21 * alpha11;
87     FLA_Copy_external( b21, y21 );
88     FLA_Scal_external( alpha11, y21 );
89 
90     // y21 = y21 + B20 * a10t';
91     FLA_Gemvc_external( FLA_NO_TRANSPOSE, FLA_CONJUGATE,
92                         FLA_ONE, B20, a10t, FLA_ONE, y21 );
93 
94     /*------------------------------------------------------------*/
95 
96     FLA_Cont_with_3x3_to_2x2( &ATL, /**/ &ATR,       A00,  a01,     /**/ A02,
97                                                      a10t, alpha11, /**/ a12t,
98                             /* ************** */  /* ************************ */
99                               &ABL, /**/ &ABR,       A20,  a21,     /**/ A22,
100                               FLA_TL );
101 
102     FLA_Cont_with_3x3_to_2x2( &BTL, /**/ &BTR,       B00,  b01,    /**/ B02,
103                                                      b10t, beta11, /**/ b12t,
104                             /* ************** */  /* *********************** */
105                               &BBL, /**/ &BBR,       B20,  b21,    /**/ B22,
106                               FLA_TL );
107 
108     FLA_Cont_with_3x3_to_2x2( &YTL, /**/ &YTR,       Y00,  y01,   /**/ Y02,
109                                                      y10t, psi11, /**/ y12t,
110                             /* ************** */  /* ********************** */
111                               &YBL, /**/ &YBR,       Y20,  y21,   /**/ Y22,
112                               FLA_TL );
113   }
114 
115   return FLA_SUCCESS;
116 }
117 
118