[Trilinos-Users] Memory leak inside Ifpack_IC::Compute()?

Thornquist, Heidi K hkthorn at sandia.gov
Thu Apr 17 14:44:55 MDT 2008

Hi Rony,

Thank you for such a detailed message!  I have verified that there is indeed a memory leak inside Ifpack_IC::Compute() when it is called multiple times.  This will be fixed in the next Trilinos 8.0 tarball.


-----Original Message-----
From: trilinos-users-bounces at software.sandia.gov [mailto:trilinos-users-bounces at software.sandia.gov] On Behalf Of Rony Speck
Sent: Thursday, April 17, 2008 2:27 AM
To: trilinos-users at software.sandia.gov
Subject: [Trilinos-Users] Memory leak inside Ifpack_IC::Compute()?

Hi there

I'm doing my master thesis at the ETH in Zurich.

I'm using the Ifpack_IC preconditioner in a time-dependent setting. Within a time increment, multiple linear systems of equations are solved which all have the same matrix structure (only the numerical values change). I therefore create an Ifpack_IC object at the beginning of the increment and keep it throughout the whole increment and only call Ifpack_IC::Compute().
After the increment is done, I delete the object and create a new one for the next increment.
I now noticed that a lot of memory is used this way. When I delete the preconditioner after each single system is solved (not keeping it for a whole increment), the memory usage is normal.
So it seems, that multiple calls to Ifpack_IC::Compute() leeds to a memory leak. The code below shows the problem in a simpler setting. The code just creates a 2D Laplace problem with the help of the matrix gallery. CG inside AztecOO is used together with the Ifpack_IC preconditioner. Compute() is called twice on the Ifpack_IC object to simulate my setting.

#include "AztecOO_config.h"
#ifdef HAVE_MPI
#include "mpi.h"
#include "Epetra_MpiComm.h"
#include "Epetra_SerialComm.h"
#include "Epetra_Map.h"
#include "Epetra_Vector.h"
#include "Epetra_CrsMatrix.h"
#include "AztecOO.h"
#include "Trilinos_Util_CrsMatrixGallery.h"
#include "Ifpack_IC.h"

int main(int argc, char *argv[]) {
#ifdef HAVE_MPI
        Epetra_MpiComm comm(MPI_COMM_WORLD); #else
        Epetra_SerialComm comm;

        // Create matrix and vectors
        int problemSize = 10000;
        Trilinos_Util::CrsMatrixGallery gallery("laplace_2d", comm);
        gallery.Set("problem_size", problemSize);
        gallery.Set("map_type", "linear");
        gallery.Set("exact_solution", "random");

        Epetra_CrsMatrix *A = gallery.GetMatrix();
        Epetra_Vector *b = (Epetra_Vector*) gallery.GetRHS();
        Epetra_Vector *x = (Epetra_Vector*) gallery.GetStartingSolution();

        // Create linear problem
        Epetra_LinearProblem problem(A, x, b);

        // Create preconditioner
        Ifpack_IC *M = new Ifpack_IC(A);
        Teuchos::ParameterList ifpackList;
        int k = 2;
        double alpha = 0.0;
        double rho = 1.0;
        double droptol = 0.0;
        ifpackList.set("fact: level-of-fill", k);
        ifpackList.set("fact: absolute threshold", alpha);
        ifpackList.set("fact: relative threshold", rho);
        ifpackList.set("fact: drop tolerance", droptol);

        // Create solver object
        AztecOO solver(problem);
        Teuchos::ParameterList aztecList;
        aztecList.set("AZ_conv", AZ_rhs);
        aztecList.set("AZ_solver", AZ_cg);
        aztecList.set("AZ_output", AZ_all);
        solver.SetParameters(aztecList, true);

        // Solve
        solver.Iterate(10000, 0.001);

        // Free memory
        delete M;

        #ifdef HAVE_MPI
                MPI_Finalize() ;

When running this code with valgrind --leak-check=full, it says that 360,004 bytes are definitely lost.
If Compute() is called only once, nothing is lost. According to valgrind, the source of the problem seems to be Ifpack_AIJMatrix_alloc inside crout_ict.

Best regards
Rony Speck

Es ist höchste Zeit, dabei zu sein - Holen Sie sich jetzt die neue Generation der Windows Live Services!

Trilinos-Users mailing list
Trilinos-Users at software.sandia.gov

More information about the Trilinos-Users mailing list