From 1c191c73b89507ff2e400d61be78f5af5164902f Mon Sep 17 00:00:00 2001 From: Sebastien Blaise <sebastien.blaise@uclouvain.be> Date: Tue, 5 Nov 2013 13:33:35 +0000 Subject: [PATCH] lu factorization: adding pivot indices as parameter --- Numeric/fullMatrix.cpp | 14 ++++++-------- Numeric/fullMatrix.h | 4 ++-- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/Numeric/fullMatrix.cpp b/Numeric/fullMatrix.cpp index 58abf9f24a..b4325e0ef6 100644 --- a/Numeric/fullMatrix.cpp +++ b/Numeric/fullMatrix.cpp @@ -290,24 +290,22 @@ bool fullMatrix<double>::luSolve(const fullVector<double> &rhs, fullVector<doubl } template<> -bool fullMatrix<double>::luFactor() +bool fullMatrix<double>::luFactor(fullVector<int> &ipiv) { int M = size1(), N = size2(), lda = size1(), info; - int *ipiv = new int[std::min(M, N)]; - F77NAME(dgetrf)(&M, &N, _data, &lda, ipiv, &info); - delete [] ipiv; + ipiv.resize(std::min(M, N)); + F77NAME(dgetrf)(&M, &N, _data, &lda, &ipiv(0), &info); if(info == 0) return true; return false; } template<> -bool fullMatrix<double>::luSubstitute(const fullVector<double> &rhs, fullVector<double> &result) +bool fullMatrix<double>::luSubstitute(const fullVector<double> &rhs, fullVector<int> &ipiv, fullVector<double> &result) { int N = size1(), nrhs=1, lda = N, ldb = N, info; - int *ipiv = new int[N]; + char trans = 'N'; for(int i = 0; i < N; i++) result(i) = rhs(i); - F77NAME(dgetrs)("N", &N, &nrhs, _data, &lda, ipiv, result._data, &ldb, &info); - delete [] ipiv; + F77NAME(dgetrs)(&trans, &N, &nrhs, _data, &lda, &ipiv(0), result._data, &ldb, &info); if(info == 0) return true; return false; } diff --git a/Numeric/fullMatrix.h b/Numeric/fullMatrix.h index 74cf557c33..74debb530e 100644 --- a/Numeric/fullMatrix.h +++ b/Numeric/fullMatrix.h @@ -686,7 +686,7 @@ class fullMatrix } #endif ; - bool luFactor() + bool luFactor(fullVector<int> &ipiv) #if !defined(HAVE_LAPACK) { Msg::Error("LU factorization requires LAPACK"); @@ -694,7 +694,7 @@ class fullMatrix } #endif ; - bool luSubstitute(const fullVector<double> &rhs, fullVector<double> &result) + bool luSubstitute(const fullVector<scalar> &rhs, fullVector<int> &ipiv, fullVector<scalar> &result) #if !defined(HAVE_LAPACK) { Msg::Error("LU substitution requires LAPACK"); -- GitLab