libflame revision_anchor
Functions
FLA_Hevv_2x2.c File Reference

(r)

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_Hevv_2x2()

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 
)
38{
39 FLA_Datatype datatype;
40
41 datatype = FLA_Obj_datatype( alpha11 );
42
43 switch ( datatype )
44 {
45 case FLA_FLOAT:
46 {
54
62
63 break;
64 }
65
66 case FLA_DOUBLE:
67 {
75
83
84 break;
85 }
86
87 case FLA_COMPLEX:
88 {
96
103 buff_sigma1 );
104
105 break;
106 }
107
109 {
115 double* buff_gamma1 = FLA_DOUBLE_PTR( gamma1 );
117
124 buff_sigma1 );
125
126 break;
127 }
128 }
129
130 return FLA_SUCCESS;
131}
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
FLA_Error FLA_Hevv_2x2_opc(scomplex *alpha11, scomplex *alpha21, scomplex *alpha22, float *lambda1, float *lambda2, float *gamma1, scomplex *sigma1)
Definition FLA_Hevv_2x2.c:363
FLA_Error FLA_Hevv_2x2_ops(float *alpha11, float *alpha21, float *alpha22, float *lambda1, float *lambda2, float *gamma1, float *sigma1)
Definition FLA_Hevv_2x2.c:135
FLA_Error FLA_Hevv_2x2_opz(dcomplex *alpha11, dcomplex *alpha21, dcomplex *alpha22, double *lambda1, double *lambda2, double *gamma1, dcomplex *sigma1)
Definition FLA_Hevv_2x2.c:378
FLA_Datatype FLA_Obj_datatype(FLA_Obj obj)
Definition FLA_Query.c:13
int FLA_Datatype
Definition FLA_type_defs.h:49
int i
Definition bl1_axmyv2.c:145
Definition blis_type_defs.h:138
Definition blis_type_defs.h:133

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

◆ FLA_Hevv_2x2_opc()

FLA_Error FLA_Hevv_2x2_opc ( scomplex alpha11,
scomplex alpha21,
scomplex alpha22,
float lambda1,
float lambda2,
float gamma1,
scomplex sigma1 
)
370{
372
373 return FLA_SUCCESS;
374}

References i.

Referenced by FLA_Hevv_2x2().

◆ FLA_Hevv_2x2_opd()

FLA_Error FLA_Hevv_2x2_opd ( double alpha11,
double alpha21,
double alpha22,
double lambda1,
double lambda2,
double gamma1,
double sigma1 
)
256{
257 double a11, a21, a22;
258 double l1, l2;
259 double g1, s1;
260 double ab, acmn, acmx, acs, adf, cs, ct, df, rt, sm, tb, tn;
261 int sgn1, sgn2;
262
263 a11 = *alpha11;
264 a21 = *alpha21;
265 a22 = *alpha22;
266
267 // Compute the eigenvalues.
268
269 sm = a11 + a22;
270 df = a11 - a22;
271 adf = fabs( df );
272 tb = a21 + a21;
273 ab = fabs( tb );
274
275 if ( fabs( a11 ) > fabs( a22 ) )
276 {
277 acmx = a11;
278 acmn = a22;
279 }
280 else
281 {
282 acmx = a22;
283 acmn = a11;
284 }
285
286 if ( adf > ab ) rt = adf * sqrt( 1.0 + pow( ( ab / adf ), 2.0 ) );
287 else if ( adf < ab ) rt = ab * sqrt( 1.0 + pow( ( adf / ab ), 2.0 ) );
288 else rt = ab * sqrt( 2.0 );
289
290 if ( sm < 0.0 )
291 {
292 l1 = 0.5 * ( sm - rt );
293 l2 = ( acmx / l1 ) * acmn - ( a21 / l1 ) * a21;
294 sgn1 = -1;
295 }
296 else if ( sm > 0.0 )
297 {
298 l1 = 0.5 * ( sm + rt );
299 l2 = ( acmx / l1 ) * acmn - ( a21 / l1 ) * a21;
300 sgn1 = 1;
301 }
302 else
303 {
304 l1 = 0.5 * rt;
305 l2 = -0.5 * rt;
306 sgn1 = 1;
307 }
308
309 *lambda1 = l1;
310 *lambda2 = l2;
311
312 // Compute the eigenvector.
313
314 if ( df >= 0.0 )
315 {
316 cs = df + rt;
317 sgn2 = 1;
318 }
319 else
320 {
321 cs = df - rt;
322 sgn2 = -1;
323 }
324
325 acs = fabs( cs );
326
327 if ( acs > ab )
328 {
329 ct = -tb / cs;
330 s1 = 1.0 / sqrt( 1.0 + ct*ct );
331 g1 = ct * s1;
332 }
333 else
334 {
335 if ( ab == 0.0 )
336 {
337 g1 = 1.0;
338 s1 = 0.0;
339 }
340 else
341 {
342 tn = -cs / tb;
343 g1 = 1.0 / sqrt( 1.0 + tn*tn );
344 s1 = tn * g1;
345 }
346 }
347
348 if ( sgn1 == sgn2 )
349 {
350 tn = g1;
351 g1 = -s1;
352 s1 = tn;
353 }
354
355 *gamma1 = g1;
356 *sigma1 = s1;
357
358 return FLA_SUCCESS;
359}

References i.

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

◆ FLA_Hevv_2x2_ops()

FLA_Error FLA_Hevv_2x2_ops ( float alpha11,
float alpha21,
float alpha22,
float lambda1,
float lambda2,
float gamma1,
float sigma1 
)
142{
143 float a11, a21, a22;
144 float l1, l2;
145 float g1, s1;
146 float ab, acmn, acmx, acs, adf, cs, ct, df, rt, sm, tb, tn;
147 int sgn1, sgn2;
148
149 a11 = *alpha11;
150 a21 = *alpha21;
151 a22 = *alpha22;
152
153 // Compute the eigenvalues.
154
155 sm = a11 + a22;
156 df = a11 - a22;
157 adf = fabs( df );
158 tb = a21 + a21;
159 ab = fabs( tb );
160
161 if ( fabs( a11 ) > fabs( a22 ) )
162 {
163 acmx = a11;
164 acmn = a22;
165 }
166 else
167 {
168 acmx = a22;
169 acmn = a11;
170 }
171
172 if ( adf > ab ) rt = adf * sqrt( 1.0F + ( ab / adf ) * ( ab / adf ) );
173 else if ( adf < ab ) rt = ab * sqrt( 1.0F + ( adf / ab ) * ( adf / ab ) );
174 else rt = ab * sqrt( 2.0F );
175
176 if ( sm < 0.0F )
177 {
178 l1 = 0.5F * ( sm - rt );
179 l2 = ( acmx / l1 ) * acmn - ( a21 / l1 ) * a21;
180 sgn1 = -1;
181 }
182 else if ( sm > 0.0F )
183 {
184 l1 = 0.5F * ( sm + rt );
185 l2 = ( acmx / l1 ) * acmn - ( a21 / l1 ) * a21;
186 sgn1 = 1;
187 }
188 else
189 {
190 l1 = 0.5F * rt;
191 l2 = -0.5F * rt;
192 sgn1 = 1;
193 }
194
195 *lambda1 = l1;
196 *lambda2 = l2;
197
198 // Compute the eigenvector.
199
200 if ( df >= 0.0F )
201 {
202 cs = df + rt;
203 sgn2 = 1;
204 }
205 else
206 {
207 cs = df - rt;
208 sgn2 = -1;
209 }
210
211 acs = fabs( cs );
212
213 if ( acs > ab )
214 {
215 ct = -tb / cs;
216 s1 = 1.0F / sqrt( 1.0F + ct*ct );
217 g1 = ct * s1;
218 }
219 else
220 {
221 if ( ab == 0.0F )
222 {
223 g1 = 1.0F;
224 s1 = 0.0F;
225 }
226 else
227 {
228 tn = -cs / tb;
229 g1 = 1.0F / sqrt( 1.0F + tn*tn );
230 s1 = tn * g1;
231 }
232 }
233
234 if ( sgn1 == sgn2 )
235 {
236 tn = g1;
237 g1 = -s1;
238 s1 = tn;
239 }
240
241 *gamma1 = g1;
242 *sigma1 = s1;
243
244 return FLA_SUCCESS;
245}

References i.

Referenced by FLA_Hevv_2x2().

◆ FLA_Hevv_2x2_opz()

FLA_Error FLA_Hevv_2x2_opz ( dcomplex alpha11,
dcomplex alpha21,
dcomplex alpha22,
double lambda1,
double lambda2,
double gamma1,
dcomplex sigma1 
)
385{
387
388 return FLA_SUCCESS;
389}

References i.

Referenced by FLA_Hevv_2x2().