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
13
14 #define alpha_to_delta( alpha, delta ) delta = alpha;
15 #define delta_to_alpha( alpha, delta ) alpha = delta;
16
17 #define FLA_OBJ_SET_DIAGONAL_VECTOR( mytype, mybuffer, equal_to, mydim ) \
18 { \
19 mytype* buff_A = mybuffer( A ); \
20 mytype* buff_d = mybuffer( d ); \
21 \
22 for ( i = 0; i < mydim; ++i ) { \
23 equal_to( *( buff_A + i*cs_A + i*rs_A ), *(buff_d + i*inc_d) ) \
24 } \
25 }
26
FLA_Set_diagonal_vector(FLA_Obj A,FLA_Obj d)27 FLA_Error FLA_Set_diagonal_vector( FLA_Obj A, FLA_Obj d )
28 {
29 FLA_Datatype datatype;
30 int i, m;
31 int rs_A, cs_A;
32 int inc_d;
33
34 datatype = FLA_Obj_datatype( A );
35
36 m = FLA_Obj_min_dim( A );
37
38 rs_A = FLA_Obj_row_stride( A );
39 cs_A = FLA_Obj_col_stride( A );
40
41 inc_d = FLA_Obj_vector_inc( d );
42
43 switch ( datatype )
44 {
45 case FLA_FLOAT:
46 {
47 FLA_OBJ_SET_DIAGONAL_VECTOR( float, FLA_FLOAT_PTR, alpha_to_delta, m );
48 break;
49 }
50 case FLA_DOUBLE:
51 {
52 FLA_OBJ_SET_DIAGONAL_VECTOR( double, FLA_DOUBLE_PTR, alpha_to_delta, m );
53 break;
54 }
55
56 case FLA_COMPLEX:
57 {
58 FLA_OBJ_SET_DIAGONAL_VECTOR( scomplex, FLA_COMPLEX_PTR, alpha_to_delta, m );
59 break;
60 }
61
62 case FLA_DOUBLE_COMPLEX:
63 {
64 FLA_OBJ_SET_DIAGONAL_VECTOR( dcomplex, FLA_DOUBLE_COMPLEX_PTR, alpha_to_delta, m );
65 break;
66 }
67 }
68 return FLA_SUCCESS;
69 }
70
FLA_Set_diagonal_matrix(FLA_Obj d,FLA_Obj A)71 FLA_Error FLA_Set_diagonal_matrix( FLA_Obj d, FLA_Obj A )
72 {
73 FLA_Datatype datatype;
74 int i, m;
75 int rs_A, cs_A;
76 int inc_d;
77
78 datatype = FLA_Obj_datatype( A );
79
80 m = FLA_Obj_min_dim( A );
81
82 rs_A = FLA_Obj_row_stride( A );
83 cs_A = FLA_Obj_col_stride( A );
84
85 inc_d = FLA_Obj_vector_inc( d );
86
87 switch ( datatype )
88 {
89 case FLA_FLOAT:
90 {
91 FLA_OBJ_SET_DIAGONAL_VECTOR( float, FLA_FLOAT_PTR, delta_to_alpha, m );
92 break;
93 }
94 case FLA_DOUBLE:
95 {
96 FLA_OBJ_SET_DIAGONAL_VECTOR( double, FLA_DOUBLE_PTR, delta_to_alpha, m );
97 break;
98 }
99
100 case FLA_COMPLEX:
101 {
102 FLA_OBJ_SET_DIAGONAL_VECTOR( scomplex, FLA_COMPLEX_PTR, delta_to_alpha, m );
103 break;
104 }
105
106 case FLA_DOUBLE_COMPLEX:
107 {
108 FLA_OBJ_SET_DIAGONAL_VECTOR( dcomplex, FLA_DOUBLE_COMPLEX_PTR, delta_to_alpha, m );
109 break;
110 }
111 }
112 return FLA_SUCCESS;
113 }
114
115
116