libflame revision_anchor
FLA_Svd_compute_scaling.c File Reference

(r)

Functions

FLA_Error FLA_Svd_compute_scaling (FLA_Obj A, FLA_Obj sigma)
 

Function Documentation

◆ FLA_Svd_compute_scaling()

FLA_Error FLA_Svd_compute_scaling ( FLA_Obj A,
FLA_Obj sigma )
14{
15 FLA_Datatype dt_real;
16 FLA_Obj norm;
17 FLA_Obj safmin;
18 FLA_Obj prec;
19 FLA_Obj rmin;
20 FLA_Obj rmax;
21
22 if ( FLA_Check_error_level() >= FLA_MIN_ERROR_CHECKING )
24
25 dt_real = FLA_Obj_datatype_proj_to_real( A );
26
27 FLA_Obj_create( dt_real, 1, 1, 0, 0, &norm );
28 FLA_Obj_create( dt_real, 1, 1, 0, 0, &prec );
29 FLA_Obj_create( dt_real, 1, 1, 0, 0, &safmin );
30 FLA_Obj_create( dt_real, 1, 1, 0, 0, &rmin );
31 FLA_Obj_create( dt_real, 1, 1, 0, 0, &rmax );
32
33 // Query safmin, precision.
34 FLA_Mach_params( FLA_MACH_PREC, prec );
35 FLA_Mach_params( FLA_MACH_SFMIN, safmin );
36
37//FLA_Obj_show( "safmin", safmin, "%20.12e", "" );
38//FLA_Obj_show( "prec", prec, "%20.12e", "" );
39
40 // rmin = sqrt( safmin ) / prec;
41 FLA_Copy( safmin, rmin );
42 FLA_Sqrt( rmin );
43 FLA_Inv_scal( prec, rmin );
44
45 // rmax = 1 / rmin;
46 FLA_Copy( rmin, rmax );
47 FLA_Invert( FLA_NO_CONJUGATE, rmax );
48
49//FLA_Obj_show( "rmin", rmin, "%20.12e", "" );
50//FLA_Obj_show( "rmax", rmax, "%20.12e", "" );
51
52 // Find the maximum absolute value of A.
53 FLA_Max_abs_value( A, norm );
54
55 if ( FLA_Obj_gt( norm, FLA_ZERO ) && FLA_Obj_lt( norm, rmin ) )
56 {
57 // sigma = rmin / norm;
58 FLA_Copy( rmin, sigma );
59 FLA_Inv_scal( norm, sigma );
60 }
61 else if ( FLA_Obj_gt( norm, rmax ) )
62 {
63 // sigma = rmax / norm;
64 FLA_Copy( rmax, sigma );
65 FLA_Inv_scal( norm, sigma );
66 }
67 else
68 {
69 // sigma = 1.0;
70 FLA_Copy( FLA_ONE, sigma );
71 }
72
73 FLA_Obj_free( &norm );
74 FLA_Obj_free( &prec );
75 FLA_Obj_free( &safmin );
76 FLA_Obj_free( &rmin );
77 FLA_Obj_free( &rmax );
78
79 return FLA_SUCCESS;
80}
FLA_Error FLA_Svd_compute_scaling_check(FLA_Obj A, FLA_Obj sigma)
Definition FLA_Svd_compute_scaling_check.c:13
FLA_Error FLA_Copy(FLA_Obj A, FLA_Obj B)
Definition FLA_Copy.c:15
FLA_Error FLA_Inv_scal(FLA_Obj alpha, FLA_Obj A)
Definition FLA_Inv_scal.c:13
FLA_Obj FLA_ZERO
Definition FLA_Init.c:20
FLA_Obj FLA_ONE
Definition FLA_Init.c:18
FLA_Bool FLA_Obj_gt(FLA_Obj A, FLA_Obj B)
Definition FLA_Query.c:658
FLA_Error FLA_Obj_create(FLA_Datatype datatype, dim_t m, dim_t n, dim_t rs, dim_t cs, FLA_Obj *obj)
Definition FLA_Obj.c:55
FLA_Bool FLA_Obj_lt(FLA_Obj A, FLA_Obj B)
Definition FLA_Query.c:813
FLA_Datatype FLA_Obj_datatype_proj_to_real(FLA_Obj A)
Definition FLA_Query.c:23
unsigned int FLA_Check_error_level(void)
Definition FLA_Check.c:18
FLA_Error FLA_Obj_free(FLA_Obj *obj)
Definition FLA_Obj.c:588
int FLA_Datatype
Definition FLA_type_defs.h:49
FLA_Error FLA_Sqrt(FLA_Obj alpha)
Definition FLA_Sqrt.c:13
FLA_Error FLA_Invert(FLA_Conj conj, FLA_Obj x)
Definition FLA_Invert.c:13
FLA_Error FLA_Max_abs_value(FLA_Obj A, FLA_Obj amax)
Definition FLA_Max_abs_value.c:13
FLA_Error FLA_Mach_params(FLA_Machval machval, FLA_Obj val)
Definition FLA_Mach_params.c:13
Definition FLA_type_defs.h:159

References FLA_Check_error_level(), FLA_Copy(), FLA_Inv_scal(), FLA_Invert(), FLA_Mach_params(), FLA_Max_abs_value(), FLA_Obj_create(), FLA_Obj_datatype_proj_to_real(), FLA_Obj_free(), FLA_Obj_gt(), FLA_Obj_lt(), FLA_ONE, FLA_Sqrt(), FLA_Svd_compute_scaling_check(), and FLA_ZERO.

Referenced by FLA_Svd_uv_unb_var1(), and FLA_Svd_uv_unb_var2().