105 pastix_complex64_t *A,
108 pastix_complex64_t *tau,
109 pastix_complex64_t *work,
113 int SEED[4] = {26, 67, 52, 197};
120 pastix_int_t size_B, size_O, size_W, size_Y, size_A, size_T, sublw;
124 double tolB = sqrt( (
double)(bp) ) * tol;
125 pastix_complex64_t *AP, *Y, *WT, *T, *B, *tau_b, *omega, *subw;
127 minMN = pastix_imin(m, n);
131 maxrank = pastix_imin( maxrank, minMN );
138 size_W = n * maxrank;
144 sublw = n * bp + pastix_imax( bp, n );
145 sublw = pastix_imax( sublw, size_O );
146 sublw = pastix_imax( sublw, b * maxrank );
148 lwkopt = size_A + size_Y + size_W
149 + size_T + size_B + n + sublw;
152 work[0] = (pastix_complex64_t)lwkopt;
162 if (lda < pastix_imax(1, m)) {
165 if( lwork < lwkopt ) {
175 if ( maxrank == 0 ) {
180 norm = LAPACKE_zlange_work( LAPACK_COL_MAJOR,
'f', m, n,
200 ret = LAPACKE_zlaset_work( LAPACK_COL_MAJOR,
'A', b, b,
205 memset(T, 0, size_T *
sizeof(pastix_complex64_t));
208 ret = LAPACKE_zlacpy_work( LAPACK_COL_MAJOR,
'A', m, n,
213 for (j=0; j<n; j++) jpvt[j] = j;
218 ret = LAPACKE_zlarnv_work(3, SEED, size_O, omega);
220 cblas_zgemm( CblasColMajor, CblasNoTrans, CblasNoTrans,
222 CBLAS_SADDR(zone), omega, bp,
224 CBLAS_SADDR(zzero), B, ldb );
230 ib = pastix_imin( b, minMN-rk );
235 subw, sublw, rwork );
249 if ( (rk + d) > maxrank ) {
255 for (j = rk; j < rk + d; j++) {
256 if (jpvt_b[j] >= 0) {
261 jpvt_b[k] = - jpvt_b[k] - 1;
263 while( jpvt_b[in] >= 0 ) {
266 cblas_zswap( m, A + k * lda, 1,
268 cblas_zswap( m, AP + k * m, 1,
276 cblas_zswap( rk, WT + k * ldw, 1,
281 jpvt_b[in] = - jpvt_b[in] - 1;
290 cblas_zgemm( CblasColMajor, CblasNoTrans, CblasNoTrans,
292 CBLAS_SADDR(mzone), A + rk, lda,
294 CBLAS_SADDR(zone), A + rk * lda + rk, lda );
300 ret = LAPACKE_zgeqrf_work( LAPACK_COL_MAJOR, m-rk, d,
301 A + rk * lda + rk, lda, tau + rk,
305 ret = LAPACKE_zlarft_work( LAPACK_COL_MAJOR,
'F',
'C', m-rk, d,
306 A + rk * lda + rk, lda, tau + rk, T, b );
319 ret = LAPACKE_zlacpy_work( LAPACK_COL_MAJOR,
'L', d-1, d-1,
320 A + lda * rk + rk + 1, lda,
325 cblas_zgemm( CblasColMajor, CblasConjTrans, CblasNoTrans,
327 CBLAS_SADDR(zone), Y, ldy,
329 CBLAS_SADDR(zzero), WT + rk, ldw );
333 cblas_zgemm( CblasColMajor, CblasConjTrans, CblasNoTrans,
335 CBLAS_SADDR(zone), A + rk * lda + rk + d, lda,
337 CBLAS_SADDR(zone), WT + rk, ldw );
347 cblas_zgemm( CblasColMajor, CblasConjTrans, CblasNoTrans,
349 CBLAS_SADDR(zone), Y, ldy,
351 CBLAS_SADDR(zzero), subw, d );
355 cblas_zgemm( CblasColMajor, CblasConjTrans, CblasNoTrans,
357 CBLAS_SADDR(zone), A + rk * lda + rk + d, lda,
359 CBLAS_SADDR(zone), subw, d );
362 cblas_zgemm( CblasColMajor, CblasNoTrans, CblasNoTrans,
364 CBLAS_SADDR(mzone), subw, d,
366 CBLAS_SADDR(zone), WT + rk, ldw );
373 cblas_ztrmm( CblasColMajor, CblasLeft, CblasUpper, CblasConjTrans, CblasNonUnit,
374 d, n, CBLAS_SADDR(zone),
380 cblas_zgemm( CblasColMajor, CblasNoTrans, CblasNoTrans,
382 CBLAS_SADDR(mzone), A + rk, lda,
383 WT + (rk+d)*ldw, ldw,
384 CBLAS_SADDR(zone), A + rk + (rk+d)*lda, lda );
386 cblas_zgemm( CblasColMajor, CblasNoTrans, CblasNoTrans,
388 CBLAS_SADDR(mzone), Y, ldy,
389 WT + rk + (rk+d)*ldw, ldw,
390 CBLAS_SADDR(zone), A + rk + (rk+d)*lda, lda );
393 if ( loop && (rk+d < maxrank) ) {
398 ret = LAPACKE_zlaset_work( LAPACK_COL_MAJOR,
'L', d-1, d-1,
399 0, 0, B + rk*ldb + 1, ldb );
404 cblas_ztrsm( CblasColMajor, CblasRight, CblasUpper,
405 CblasNoTrans, CblasNonUnit,
407 CBLAS_SADDR(zone), A + rk*lda + rk, lda,
411 cblas_zgemm( CblasColMajor, CblasNoTrans, CblasNoTrans,
413 CBLAS_SADDR(mzone), B + rk *ldb, ldb,
414 A + (rk+d)*lda + rk, lda,
415 CBLAS_SADDR(zone), B + (rk+d)*ldb, ldb );