libflame  revision_anchor
Functions
FLA_Tevd_iteracc_v_opt_var1.c File Reference

(r)

Functions

FLA_Error FLA_Tevd_iteracc_v_ops_var1 (int m_A, int n_G, int ijTL, float *buff_d, int inc_d, float *buff_e, int inc_e, scomplex *buff_G, int rs_G, int cs_G, int *n_iter_perf)
 
FLA_Error FLA_Tevd_iteracc_v_opd_var1 (int m_A, int n_G, int ijTL, double *buff_d, int inc_d, double *buff_e, int inc_e, dcomplex *buff_G, int rs_G, int cs_G, int *n_iter_perf)
 

Function Documentation

◆ FLA_Tevd_iteracc_v_opd_var1()

FLA_Error FLA_Tevd_iteracc_v_opd_var1 ( int  m_A,
int  n_G,
int  ijTL,
double *  buff_d,
int  inc_d,
double *  buff_e,
int  inc_e,
dcomplex buff_G,
int  rs_G,
int  cs_G,
int *  n_iter_perf 
)
33 {
34  FLA_Error r_val;
35  int i, k;
36  int k_iter = 0;
37  int n_deflations = 0;
38 
39  // Iterate from back to front until all that is left is a 2x2.
40  for ( i = m_A - 1; i > 1; --i )
41  {
42  dcomplex* G1 = buff_G + (k_iter)*cs_G;
43  int m_ATL = i + 1;
44  int k_left = n_G - k_iter;
45 
46  /*------------------------------------------------------------*/
47 
48  // Search for an eigenvalue of ATL submatrix until
49  // (a) deflation occurs, or
50  // (b) we perform the maximum number of additional iterations
51  // that are allowed within the current sweep
52  // (ie: n_G - k_iter).
53  r_val = FLA_Tevd_eigval_v_opd_var1( m_ATL,
54  k_left,
55  G1, rs_G, cs_G,
56  buff_d, inc_d,
57  buff_e, inc_e,
58  &k );
59 
60  // Update local counters according to the results of the eigenvalue
61  // search.
62  k_iter += k;
63  n_deflations += 1;
64 
65  // If the eigenvalue search did not result in any deflation, return.
66  if ( r_val == FLA_FAILURE )
67  {
68 #ifdef PRINTF
69  printf( "FLA_Tevd_iteracc_v_opd_var1: failed to converge (m_A11 = %d) after %2d iters k_total=%d/%d\n", i, k, k_iter, n_G );
70 #endif
71  *n_iter_perf = k_iter;
72  return n_deflations-1;
73  }
74 
75 #ifdef PRINTF
76  if ( r_val == i )
77  printf( "FLA_Tevd_iteracc_v_opd_var1: found eig %22.15e in col %3d (n=%d) after %2d iters k_total=%d/%d\n", buff_d[ r_val*inc_d ], ijTL+r_val, m_ATL, k, k_iter, n_G );
78  else
79  printf( "FLA_Tevd_iteracc_v_opd_var1: split occurred in col %3d (n=%d) after %2d iters k_total=%d/%d\n", ijTL+r_val, m_ATL, k, k_iter, n_G );
80 #endif
81 
82  // If the most recent eigenvalue search put us at our limit
83  // for accumulated Givens rotation sets, return.
84  if ( k_iter == n_G )
85  {
86  *n_iter_perf = k_iter;
87  return n_deflations;
88  }
89 
90 
91  // If r_val != i, then a split occurred somewhere within submatrix
92  // ATL. Therefore, we must recurse with two subproblems.
93  if ( r_val != i )
94  {
95  int m_TLr = r_val + 1;
96  int m_BRr = m_ATL - m_TLr;
97  int ijTLr = 0;
98  int ijBRr = m_TLr;
99  int n_Gr = n_G - k_iter;
100  double* dTL = buff_d + (0 )*inc_d;
101  double* eTL = buff_e + (0 )*inc_e;
102  dcomplex* GT = buff_G + (0 )*rs_G + (k_iter)*cs_G;
103  double* dBR = buff_d + (ijBRr)*inc_d;
104  double* eBR = buff_e + (ijBRr)*inc_e;
105  dcomplex* GB = buff_G + (ijBRr)*rs_G + (k_iter)*cs_G;
106 
107  int n_deflationsTL;
108  int n_deflationsBR;
109  int n_iter_perfTL;
110  int n_iter_perfBR;
111 
112 #ifdef PRINTF
113 printf( "FLA_Tevd_iteracc_v_opd_var1: Internal deflation in col %d\n", ijTL+r_val );
114 printf( "FLA_Tevd_iteracc_v_opd_var1: alpha11 = %23.19e\n", buff_d[r_val*inc_d] );
115 printf( "FLA_Tevd_iteracc_v_opd_var1: alpha21 alpha22 = %23.19e %23.19e\n", buff_e[r_val*inc_e], buff_d[(r_val+1)*inc_d] );
116 #endif
117 #ifdef PRINTF
118 printf( "FLA_Tevd_iteracc_v_opd_var1: recursing: m_TLr m_BRr: %d %d\n", m_TLr, m_BRr );
119 printf( "FLA_Tevd_iteracc_v_opd_var1: ijTLr ijBRr: %d %d\n", ijTLr, ijBRr );
120 printf( "FLA_Tevd_iteracc_v_opd_var1: GB(0,0) i,j: %d %d\n", ijTL + m_TLr+1, k_iter );
121 #endif
122  n_deflationsTL = FLA_Tevd_iteracc_v_opd_var1( m_TLr,
123  n_Gr,
124  ijTL + ijTLr,
125  dTL, inc_d,
126  eTL, inc_e,
127  GT, rs_G, cs_G,
128  &n_iter_perfTL );
129  n_deflationsBR = FLA_Tevd_iteracc_v_opd_var1( m_BRr,
130  n_Gr,
131  ijTL + ijBRr,
132  dBR, inc_d,
133  eBR, inc_e,
134  GB, rs_G, cs_G,
135  &n_iter_perfBR );
136 
137  *n_iter_perf = k_iter + max( n_iter_perfTL, n_iter_perfBR );
138 
139 #ifdef PRINTF
140 printf( "FLA_Tevd_iteracc_v_opd_var1: num deflations: %d = (prev:%d, TL:%d, BR:%d)\n", n_deflations + n_deflationsTL + n_deflationsBR, n_deflations, n_deflationsTL, n_deflationsBR );
141 printf( "FLA_Tevd_iteracc_v_opd_var1: num iterations: %d = (prev:%d, TL:%d, BR:%d)\n", *n_iter_perf, k_iter, n_iter_perfTL, n_iter_perfBR );
142 #endif
143  return n_deflations + n_deflationsTL + n_deflationsBR;
144  }
145 
146  /*------------------------------------------------------------*/
147  }
148 
149  // Skip 1x1 matrices (and submatrices) entirely.
150  if ( m_A > 1 )
151  {
152  dcomplex* g1 = buff_G + (k_iter)*cs_G;
153 
154  double* alpha11 = buff_d + (0 )*inc_d;
155  double* alpha21 = buff_e + (0 )*inc_e;
156  double* alpha22 = buff_d + (1 )*inc_d;
157  double lambda1;
158  double lambda2;
159 
160  double gamma;
161  double sigma;
162 
163  // Find the eigenvalue decomposition of the remaining (or only) 2x2
164  // submatrix.
165  FLA_Hevv_2x2_opd( alpha11,
166  alpha21,
167  alpha22,
168  &lambda1,
169  &lambda2,
170  &gamma,
171  &sigma );
172 
173  // Store the eigenvalues.
174  *alpha11 = lambda1;
175  *alpha22 = lambda2;
176 
177  // Zero out the remaining subdiagonal element.
178  *alpha21 = 0.0;
179 
180  // Store the rotation.
181  g1[0].real = gamma;
182  g1[0].imag = sigma;
183 
184 
185  // Update the local counters.
186  k_iter += 1;
187  n_deflations += 1;
188 
189 #ifdef PRINTF
190 printf( "FLA_Tevd_iteracc_v_opd_var1: Hevv eig %22.15e in col %3d (n=%d) after %2d iters k_total=%d/%d\n", buff_d[ 1*inc_d ], ijTL+1, 2, 1, k_iter, n_G );
191 printf( "FLA_Tevd_iteracc_v_opd_var1: Hevv eig %22.15e in col %3d (n=%d) after %2d iters k_total=%d/%d\n", buff_d[ 0*inc_d ], ijTL+0, 2, 0, k_iter, n_G );
192 #endif
193  }
194 
195 
196  *n_iter_perf = k_iter;
197  return n_deflations;
198 }
FLA_Error FLA_Tevd_eigval_v_opd_var1(int m_A, int n_G, dcomplex *buff_G, int rs_G, int cs_G, double *buff_d, int inc_d, double *buff_e, int inc_e, int *n_iter)
Definition: FLA_Tevd_eigval_v_opt_var1.c:87
FLA_Error FLA_Tevd_iteracc_v_opd_var1(int m_A, int n_G, int ijTL, double *buff_d, int inc_d, double *buff_e, int inc_e, dcomplex *buff_G, int rs_G, int cs_G, int *n_iter_perf)
Definition: FLA_Tevd_iteracc_v_opt_var1.c:26
int FLA_Error
Definition: FLA_type_defs.h:47
FLA_Error FLA_Hevv_2x2_opd(double *alpha11, double *alpha21, double *alpha22, double *lambda1, double *lambda2, double *gamma1, double *sigma1)
Definition: FLA_Hevv_2x2.c:249
int i
Definition: bl1_axmyv2.c:145
Definition: blis_type_defs.h:138
double real
Definition: blis_type_defs.h:139
double imag
Definition: blis_type_defs.h:139

References FLA_Hevv_2x2_opd(), FLA_Tevd_eigval_v_opd_var1(), FLA_Tevd_iteracc_v_opd_var1(), i, dcomplex::imag, and dcomplex::real.

Referenced by FLA_Tevd_iteracc_v_opd_var1(), FLA_Tevd_v_opd_var1(), FLA_Tevd_v_opd_var2(), FLA_Tevd_v_opz_var1(), and FLA_Tevd_v_opz_var2().

◆ FLA_Tevd_iteracc_v_ops_var1()

FLA_Error FLA_Tevd_iteracc_v_ops_var1 ( int  m_A,
int  n_G,
int  ijTL,
float *  buff_d,
int  inc_d,
float *  buff_e,
int  inc_e,
scomplex buff_G,
int  rs_G,
int  cs_G,
int *  n_iter_perf 
)
22 {
23  return FLA_SUCCESS;
24 }