@@ -47,156 +47,36 @@ lapack_int LAPACKE_cbbcsd_work( int matrix_layout, char jobu1, char jobu2,
4747 lapack_int lrwork )
4848{
4949 lapack_int info = 0 ;
50- if ( matrix_layout == LAPACK_COL_MAJOR ) {
50+ /* LAPACK function works with matrices in both layouts. It is supported
51+ * through TRANS parameter. So all conversion between layouts can be
52+ * completed in LAPACK function. See the table below which describes how
53+ * every LAPACKE call is forwarded to corresponding LAPACK call.
54+ *
55+ * matrix_layout | trans_LAPACKE | -> trans_LAPACK
56+ * | (trans) | (ltrans)
57+ * -----------------+---------------+----------------
58+ * LAPACK_COL_MAJOR | 'N' | -> 'N'
59+ * LAPACK_COL_MAJOR | 'T' | -> 'T'
60+ * LAPACK_ROW_MAJOR | 'N' | -> 'T'
61+ * LAPACK_ROW_MAJOR | 'T' | -> 'T'
62+ * (note that for row major layout trans parameter is ignored)
63+ */
64+ if ( matrix_layout == LAPACK_COL_MAJOR ||
65+ matrix_layout == LAPACK_ROW_MAJOR ) {
66+ char ltrans ;
67+ if ( !LAPACKE_lsame ( trans , 't' ) && matrix_layout == LAPACK_COL_MAJOR ) {
68+ ltrans = 'n' ;
69+ } else {
70+ ltrans = 't' ;
71+ }
5172 /* Call LAPACK function and adjust info */
52- LAPACK_cbbcsd ( & jobu1 , & jobu2 , & jobv1t , & jobv2t , & trans , & m , & p , & q ,
73+ LAPACK_cbbcsd ( & jobu1 , & jobu2 , & jobv1t , & jobv2t , & ltrans , & m , & p , & q ,
5374 theta , phi , u1 , & ldu1 , u2 , & ldu2 , v1t , & ldv1t , v2t ,
5475 & ldv2t , b11d , b11e , b12d , b12e , b21d , b21e , b22d , b22e ,
5576 rwork , & lrwork , & info );
5677 if ( info < 0 ) {
5778 info = info - 1 ;
5879 }
59- } else if ( matrix_layout == LAPACK_ROW_MAJOR ) {
60- lapack_int nrows_u1 = ( LAPACKE_lsame ( jobu1 , 'y' ) ? p : 1 );
61- lapack_int nrows_u2 = ( LAPACKE_lsame ( jobu2 , 'y' ) ? m - p : 1 );
62- lapack_int nrows_v1t = ( LAPACKE_lsame ( jobv1t , 'y' ) ? q : 1 );
63- lapack_int nrows_v2t = ( LAPACKE_lsame ( jobv2t , 'y' ) ? m - q : 1 );
64- lapack_int ldu1_t = MAX (1 ,nrows_u1 );
65- lapack_int ldu2_t = MAX (1 ,nrows_u2 );
66- lapack_int ldv1t_t = MAX (1 ,nrows_v1t );
67- lapack_int ldv2t_t = MAX (1 ,nrows_v2t );
68- lapack_complex_float * u1_t = NULL ;
69- lapack_complex_float * u2_t = NULL ;
70- lapack_complex_float * v1t_t = NULL ;
71- lapack_complex_float * v2t_t = NULL ;
72- /* Check leading dimension(s) */
73- if ( ldu1 < p ) {
74- info = -13 ;
75- LAPACKE_xerbla ( "LAPACKE_cbbcsd_work" , info );
76- return info ;
77- }
78- if ( ldu2 < m - p ) {
79- info = -15 ;
80- LAPACKE_xerbla ( "LAPACKE_cbbcsd_work" , info );
81- return info ;
82- }
83- if ( ldv1t < q ) {
84- info = -17 ;
85- LAPACKE_xerbla ( "LAPACKE_cbbcsd_work" , info );
86- return info ;
87- }
88- if ( ldv2t < m - q ) {
89- info = -19 ;
90- LAPACKE_xerbla ( "LAPACKE_cbbcsd_work" , info );
91- return info ;
92- }
93- /* Query optimal working array(s) size if requested */
94- if ( lrwork == -1 ) {
95- LAPACK_cbbcsd ( & jobu1 , & jobu2 , & jobv1t , & jobv2t , & trans , & m , & p , & q ,
96- theta , phi , u1 , & ldu1_t , u2 , & ldu2_t , v1t , & ldv1t_t ,
97- v2t , & ldv2t_t , b11d , b11e , b12d , b12e , b21d , b21e ,
98- b22d , b22e , rwork , & lrwork , & info );
99- return (info < 0 ) ? (info - 1 ) : info ;
100- }
101- /* Allocate memory for temporary array(s) */
102- if ( LAPACKE_lsame ( jobu1 , 'y' ) ) {
103- u1_t = (lapack_complex_float * )
104- LAPACKE_malloc ( sizeof (lapack_complex_float ) *
105- ldu1_t * MAX (1 ,p ) );
106- if ( u1_t == NULL ) {
107- info = LAPACK_TRANSPOSE_MEMORY_ERROR ;
108- goto exit_level_0 ;
109- }
110- }
111- if ( LAPACKE_lsame ( jobu2 , 'y' ) ) {
112- u2_t = (lapack_complex_float * )
113- LAPACKE_malloc ( sizeof (lapack_complex_float ) *
114- ldu2_t * MAX (1 ,m - p ) );
115- if ( u2_t == NULL ) {
116- info = LAPACK_TRANSPOSE_MEMORY_ERROR ;
117- goto exit_level_1 ;
118- }
119- }
120- if ( LAPACKE_lsame ( jobv1t , 'y' ) ) {
121- v1t_t = (lapack_complex_float * )
122- LAPACKE_malloc ( sizeof (lapack_complex_float ) *
123- ldv1t_t * MAX (1 ,q ) );
124- if ( v1t_t == NULL ) {
125- info = LAPACK_TRANSPOSE_MEMORY_ERROR ;
126- goto exit_level_2 ;
127- }
128- }
129- if ( LAPACKE_lsame ( jobv2t , 'y' ) ) {
130- v2t_t = (lapack_complex_float * )
131- LAPACKE_malloc ( sizeof (lapack_complex_float ) *
132- ldv2t_t * MAX (1 ,m - q ) );
133- if ( v2t_t == NULL ) {
134- info = LAPACK_TRANSPOSE_MEMORY_ERROR ;
135- goto exit_level_3 ;
136- }
137- }
138- /* Transpose input matrices */
139- if ( LAPACKE_lsame ( jobu1 , 'y' ) ) {
140- LAPACKE_cge_trans ( matrix_layout , nrows_u1 , p , u1 , ldu1 , u1_t ,
141- ldu1_t );
142- }
143- if ( LAPACKE_lsame ( jobu2 , 'y' ) ) {
144- LAPACKE_cge_trans ( matrix_layout , nrows_u2 , m - p , u2 , ldu2 , u2_t ,
145- ldu2_t );
146- }
147- if ( LAPACKE_lsame ( jobv1t , 'y' ) ) {
148- LAPACKE_cge_trans ( matrix_layout , nrows_v1t , q , v1t , ldv1t , v1t_t ,
149- ldv1t_t );
150- }
151- if ( LAPACKE_lsame ( jobv2t , 'y' ) ) {
152- LAPACKE_cge_trans ( matrix_layout , nrows_v2t , m - q , v2t , ldv2t , v2t_t ,
153- ldv2t_t );
154- }
155- /* Call LAPACK function and adjust info */
156- LAPACK_cbbcsd ( & jobu1 , & jobu2 , & jobv1t , & jobv2t , & trans , & m , & p , & q ,
157- theta , phi , u1_t , & ldu1_t , u2_t , & ldu2_t , v1t_t ,
158- & ldv1t_t , v2t_t , & ldv2t_t , b11d , b11e , b12d , b12e , b21d ,
159- b21e , b22d , b22e , rwork , & lrwork , & info );
160- if ( info < 0 ) {
161- info = info - 1 ;
162- }
163- /* Transpose output matrices */
164- if ( LAPACKE_lsame ( jobu1 , 'y' ) ) {
165- LAPACKE_cge_trans ( LAPACK_COL_MAJOR , nrows_u1 , p , u1_t , ldu1_t , u1 ,
166- ldu1 );
167- }
168- if ( LAPACKE_lsame ( jobu2 , 'y' ) ) {
169- LAPACKE_cge_trans ( LAPACK_COL_MAJOR , nrows_u2 , m - p , u2_t , ldu2_t ,
170- u2 , ldu2 );
171- }
172- if ( LAPACKE_lsame ( jobv1t , 'y' ) ) {
173- LAPACKE_cge_trans ( LAPACK_COL_MAJOR , nrows_v1t , q , v1t_t , ldv1t_t ,
174- v1t , ldv1t );
175- }
176- if ( LAPACKE_lsame ( jobv2t , 'y' ) ) {
177- LAPACKE_cge_trans ( LAPACK_COL_MAJOR , nrows_v2t , m - q , v2t_t , ldv2t_t ,
178- v2t , ldv2t );
179- }
180- /* Release memory and exit */
181- if ( LAPACKE_lsame ( jobv2t , 'y' ) ) {
182- LAPACKE_free ( v2t_t );
183- }
184- exit_level_3 :
185- if ( LAPACKE_lsame ( jobv1t , 'y' ) ) {
186- LAPACKE_free ( v1t_t );
187- }
188- exit_level_2 :
189- if ( LAPACKE_lsame ( jobu2 , 'y' ) ) {
190- LAPACKE_free ( u2_t );
191- }
192- exit_level_1 :
193- if ( LAPACKE_lsame ( jobu1 , 'y' ) ) {
194- LAPACKE_free ( u1_t );
195- }
196- exit_level_0 :
197- if ( info == LAPACK_TRANSPOSE_MEMORY_ERROR ) {
198- LAPACKE_xerbla ( "LAPACKE_cbbcsd_work" , info );
199- }
20080 } else {
20181 info = -1 ;
20282 LAPACKE_xerbla ( "LAPACKE_cbbcsd_work" , info );
0 commit comments