# HG changeset patch # User jwe # Date 1193772393 0 # Node ID 6d3e53a2f96371f7846ecf64908c150d509dd195 # Parent 405cf85b435ccc2c3c3f894231fcf9beccd73ebe [project @ 2007-10-30 19:26:32 by jwe] diff -r 405cf85b435c -r 6d3e53a2f963 liboctave/CMatrix.cc --- a/liboctave/CMatrix.cc Tue Oct 30 14:05:00 2007 +0000 +++ b/liboctave/CMatrix.cc Tue Oct 30 19:26:33 2007 +0000 @@ -2491,13 +2491,38 @@ octave_idx_type lwork = -1; Array work (1); - Array rwork (1); - Array iwork (1); + + // FIXME: Can SMLSIZ be other than 25? + octave_idx_type smlsiz = 25; + + // We compute the size of rwork and iwork because ZGELSD in + // older versions of LAPACK does not return them on a query + // call. +#if defined (HAVE_LOG2) + double tmp = log2 (minmn) / static_cast (smlsiz+1) + 1; +#else + double tmp = log (minmn) / static_cast (smlsiz+1) / log (2) + 1; +#endif + octave_idx_type nlvl = static_cast (tmp); + if (nlvl < 0) + nlvl = 0; + + octave_idx_type lrwork = minmn*(10 + 2*smlsiz + 8*nlvl) + + 3*smlsiz*nrhs + (smlsiz+1)*(smlsiz+1); + if (lrwork < 1) + lrwork = 1; + Array rwork (lrwork); + double *prwork = rwork.fortran_vec (); + + octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn; + if (liwork < 1) + liwork = 1; + Array iwork (liwork); + octave_idx_type* piwork = iwork.fortran_vec (); F77_XFCN (zgelsd, ZGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn, ps, rcond, rank, work.fortran_vec (), - lwork, rwork.fortran_vec (), - iwork.fortran_vec (), info)); + lwork, prwork, piwork, info)); if (f77_exception_encountered) (*current_liboctave_error_handler) @@ -2506,14 +2531,11 @@ { lwork = static_cast (std::real (work(0))); work.resize (lwork); - rwork.resize (static_cast (rwork(0))); - iwork.resize (iwork(0)); F77_XFCN (zgelsd, ZGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn, ps, rcond, rank, work.fortran_vec (), lwork, - rwork.fortran_vec (), - iwork.fortran_vec (), info)); + prwork, piwork, info)); if (f77_exception_encountered) (*current_liboctave_error_handler) @@ -2529,6 +2551,8 @@ rcond = 0.0; else rcond = s.elem (minmn - 1) / s.elem (0); + + retval.resize (n, nrhs); } } } @@ -2637,13 +2661,38 @@ octave_idx_type lwork = -1; Array work (1); - Array rwork (1); - Array iwork (1); + + // FIXME: Can SMLSIZ be other than 25? + octave_idx_type smlsiz = 25; + + // We compute the size of rwork and iwork because ZGELSD in + // older versions of LAPACK does not return them on a query + // call. +#if defined (HAVE_LOG2) + double tmp = log2 (minmn) / static_cast (smlsiz+1) + 1; +#else + double tmp = log (minmn) / static_cast (smlsiz+1) / log (2) + 1; +#endif + octave_idx_type nlvl = static_cast (tmp); + if (nlvl < 0) + nlvl = 0; + + octave_idx_type lrwork = minmn*(10 + 2*smlsiz + 8*nlvl) + + 3*smlsiz*nrhs + (smlsiz+1)*(smlsiz+1); + if (lrwork < 1) + lrwork = 1; + Array rwork (lrwork); + double *prwork = rwork.fortran_vec (); + + octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn; + if (liwork < 1) + liwork = 1; + Array iwork (liwork); + octave_idx_type* piwork = iwork.fortran_vec (); F77_XFCN (zgelsd, ZGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn, ps, rcond, rank, work.fortran_vec (), - lwork, rwork.fortran_vec (), - iwork.fortran_vec (), info)); + lwork, prwork, piwork, info)); if (f77_exception_encountered) (*current_liboctave_error_handler) @@ -2658,8 +2707,7 @@ F77_XFCN (zgelsd, ZGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn, ps, rcond, rank, work.fortran_vec (), lwork, - rwork.fortran_vec (), - iwork.fortran_vec (), info)); + prwork, piwork, info)); if (f77_exception_encountered) (*current_liboctave_error_handler) @@ -2675,6 +2723,8 @@ rcond = 0.0; else rcond = s.elem (minmn - 1) / s.elem (0); + + retval.resize (n, nrhs); } } } diff -r 405cf85b435c -r 6d3e53a2f963 liboctave/ChangeLog --- a/liboctave/ChangeLog Tue Oct 30 14:05:00 2007 +0000 +++ b/liboctave/ChangeLog Tue Oct 30 19:26:33 2007 +0000 @@ -1,3 +1,8 @@ +2007-10-30 John W. Eaton + + * CMatrix.cc (lssolve): Compute size of rwork and iwork arrays. + * dMatrix.cc (lssolve): Compute size of iwork array. + 2007-10-29 David Bateman * CMatrix.h (lssolve (const Matrix&, octave_idx_type&, diff -r 405cf85b435c -r 6d3e53a2f963 liboctave/dMatrix.cc --- a/liboctave/dMatrix.cc Tue Oct 30 14:05:00 2007 +0000 +++ b/liboctave/dMatrix.cc Tue Oct 30 19:26:33 2007 +0000 @@ -2104,7 +2104,22 @@ Array work (1); // FIXME: Can SMLSIZ be other than 25? - octave_idx_type liwork = 3 * minmn * 25 + 11 * minmn; + octave_idx_type smlsiz = 25; + + // We compute the size of iwork because DGELSD in older versions + // of LAPACK does not return it on a query call. +#if defined (HAVE_LOG2) + double tmp = log2 (minmn) / static_cast (smlsiz+1) + 1; +#else + double tmp = log (minmn) / static_cast (smlsiz+1) / log (2) + 1; +#endif + octave_idx_type nlvl = static_cast (tmp); + if (nlvl < 0) + nlvl = 0; + + octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn; + if (liwork < 1) + liwork = 1; Array iwork (liwork); octave_idx_type* piwork = iwork.fortran_vec (); @@ -2137,6 +2152,8 @@ rcond = 0.0; else rcond = s.elem (minmn - 1) / s.elem (0); + + retval.resize (n, nrhs); } } } @@ -2250,7 +2267,22 @@ Array work (1); // FIXME: Can SMLSIZ be other than 25? - octave_idx_type liwork = 3 * minmn * 25 + 11 * minmn; + octave_idx_type smlsiz = 25; + + // We compute the size of iwork because DGELSD in older versions + // of LAPACK does not return it on a query call. +#if defined (HAVE_LOG2) + double tmp = log2 (minmn) / static_cast (smlsiz+1) + 1; +#else + double tmp = log (minmn) / static_cast (smlsiz+1) / log (2) + 1; +#endif + octave_idx_type nlvl = static_cast (tmp); + if (nlvl < 0) + nlvl = 0; + + octave_idx_type liwork = 3 * minmn * nlvl + 11 * minmn; + if (liwork < 1) + liwork = 1; Array iwork (liwork); octave_idx_type* piwork = iwork.fortran_vec (); @@ -2284,6 +2316,8 @@ else rcond = s.elem (minmn - 1) / s.elem (0); } + + retval.resize (n, nrhs); } }