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