[cig-commits] [commit] knepley/upgrade-petsc-interface: Clean up of refinement (fix memory leak). (0de634f)

cig_noreply at geodynamics.org cig_noreply at geodynamics.org
Fri Nov 22 12:18:24 PST 2013


Repository : ssh://geoshell/pylith

On branch  : knepley/upgrade-petsc-interface
Link       : https://github.com/geodynamics/pylith/compare/7f05bb78e08828b094f5f86f3bf5808774dc2591...0de634fa7e9338451f19d5aa3cb546c2c0e3484c

>---------------------------------------------------------------

commit 0de634fa7e9338451f19d5aa3cb546c2c0e3484c
Author: Brad Aagaard <baagaard at usgs.gov>
Date:   Fri Nov 22 12:21:08 2013 -0800

    Clean up of refinement (fix memory leak).
    
    Fix several bugs related with uniform refinement. Fix memory leak (don't
    create PetscDM) and recursive refinement.


>---------------------------------------------------------------

0de634fa7e9338451f19d5aa3cb546c2c0e3484c
 libsrc/pylith/topology/RefineUniform.cc      | 19 ++++++++++++++-----
 pylith/topology/MeshImporter.py              |  2 ++
 pylith/topology/RefineUniform.py             | 11 ++---------
 unittests/libtests/topology/test_topology.cc |  2 +-
 4 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/libsrc/pylith/topology/RefineUniform.cc b/libsrc/pylith/topology/RefineUniform.cc
index 157134d..ae0e816 100644
--- a/libsrc/pylith/topology/RefineUniform.cc
+++ b/libsrc/pylith/topology/RefineUniform.cc
@@ -56,12 +56,14 @@ pylith::topology::RefineUniform::refine(Mesh* const newMesh,
 { // refine
   PYLITH_METHOD_BEGIN;
   
+  if (levels < 1) {
+    PYLITH_METHOD_END;
+  } // if
+
   assert(newMesh);
 
   PetscErrorCode err;
-
-  PetscDM dmNew = newMesh->dmMesh();
-  PetscDM dmOrig = mesh.dmMesh();
+  PetscDM dmOrig = mesh.dmMesh();assert(dmOrig);
   
   PetscInt meshDepth = 0;
   err = DMPlexGetDepth(dmOrig, &meshDepth);
@@ -74,10 +76,17 @@ pylith::topology::RefineUniform::refine(Mesh* const newMesh,
     throw std::runtime_error(msg.str());
   } // if
 
+  // Refine, keeping original mesh intact.
+  PetscDM dmNew = NULL;
   err = DMPlexSetRefinementUniform(dmOrig, PETSC_TRUE);PYLITH_CHECK_ERROR(err);
+  err = DMRefine(dmOrig, mesh.comm(), &dmNew);PYLITH_CHECK_ERROR(err);
+
+  for (int i=1; i < levels; ++i) {
+    PetscDM dmCur = dmNew; dmNew = NULL;
+    err = DMPlexSetRefinementUniform(dmCur, PETSC_TRUE);PYLITH_CHECK_ERROR(err);
+    err = DMRefine(dmCur, mesh.comm(), &dmNew);PYLITH_CHECK_ERROR(err);
 
-  for (int i=0; i < levels; ++i) {
-    err = DMRefine(dmOrig, mesh.comm(), &dmNew);PYLITH_CHECK_ERROR(err);
+    err = DMDestroy(&dmCur);PYLITH_CHECK_ERROR(err);
   } // for
 
   newMesh->dmMesh(dmNew);
diff --git a/pylith/topology/MeshImporter.py b/pylith/topology/MeshImporter.py
index 0498c80..befbacc 100644
--- a/pylith/topology/MeshImporter.py
+++ b/pylith/topology/MeshImporter.py
@@ -129,6 +129,8 @@ class MeshImporter(MeshGenerator):
       mesh.memLoggingStage = "DistributedMesh"
 
     # Refine mesh (if necessary)
+    if 0 == comm.rank:
+      self._info.log("Refining mesh.")
     newMesh = self.refiner.refine(mesh)
     if not newMesh == mesh:
       mesh.cleanup()
diff --git a/pylith/topology/RefineUniform.py b/pylith/topology/RefineUniform.py
index 690ca6a..92a97a3 100644
--- a/pylith/topology/RefineUniform.py
+++ b/pylith/topology/RefineUniform.py
@@ -61,19 +61,12 @@ class RefineUniform(MeshRefiner, ModuleRefineUniform):
     logEvent = "%srefine" % self._loggingPrefix
     self._eventLogger.eventBegin(logEvent)
 
-    newMesh = mesh
     from Mesh import Mesh
-    newMesh = Mesh(dim=mesh.dimension(), comm=mesh.comm())
+    newMesh = Mesh()
     newMesh.debug(mesh.debug())
     newMesh.coordsys(mesh.coordsys())
     ModuleRefineUniform.refine(self, newMesh, mesh, self.levels)
-    if not newMesh == mesh:
-      #from pylith.utils.petsc import MemoryLogger
-      #memoryLogger =  MemoryLogger.singleton()
-    
-      #memoryLogger.stagePush(mesh.memLoggingStage)      
-      mesh.cleanup()
-      #memoryLogger.stagePop()
+    mesh.cleanup()
 
     self._eventLogger.eventEnd(logEvent)
     return newMesh
diff --git a/unittests/libtests/topology/test_topology.cc b/unittests/libtests/topology/test_topology.cc
index c0a47fb..7883469 100644
--- a/unittests/libtests/topology/test_topology.cc
+++ b/unittests/libtests/topology/test_topology.cc
@@ -32,7 +32,7 @@
 
 #include <stdlib.h> // USES abort()
 
-//#define MALLOC_DUMP
+#define MALLOC_DUMP
 
 int
 main(int argc,



More information about the CIG-COMMITS mailing list