[cig-commits] r15603 - short/3D/PyLith/trunk/libsrc/topology

brad at geodynamics.org brad at geodynamics.org
Thu Aug 27 08:51:32 PDT 2009


Author: brad
Date: 2009-08-27 08:51:31 -0700 (Thu, 27 Aug 2009)
New Revision: 15603

Modified:
   short/3D/PyLith/trunk/libsrc/topology/Field.cc
   short/3D/PyLith/trunk/libsrc/topology/Field.hh
Log:
Fixed elimination of local PETSc vector in scatter (need to create scatter vector when cloning section).

Modified: short/3D/PyLith/trunk/libsrc/topology/Field.cc
===================================================================
--- short/3D/PyLith/trunk/libsrc/topology/Field.cc	2009-08-27 00:32:43 UTC (rev 15602)
+++ short/3D/PyLith/trunk/libsrc/topology/Field.cc	2009-08-27 15:51:31 UTC (rev 15603)
@@ -33,6 +33,7 @@
   _mesh(mesh),
   _vector(0),
   _scatter(0),
+  _scatterVec(0),
   _vecFieldType(OTHER),
   _dimensionsOkay(false)
 { // constructor
@@ -62,6 +63,11 @@
     err = VecScatterDestroy(_scatter); _scatter = 0;
     CHECK_PETSC_ERROR(err);
   } // if
+
+  if (0 != _scatterVec) {
+    err = VecDestroy(_scatterVec); _scatterVec = 0;
+    CHECK_PETSC_ERROR(err);
+  } // if
 } // deallocate
 
 // ----------------------------------------------------------------------
@@ -250,6 +256,8 @@
   ALE::MemoryLogger& logger = ALE::MemoryLogger::singleton();
   //std::cout << "Making Field " << _label << " section type 3" << std::endl;
   logger.stagePush("Field");
+
+  deallocate();
   _vecFieldType = src._vecFieldType;
   _scale = src._scale;
   _dimensionsOkay = false;
@@ -267,10 +275,18 @@
     _section->setBC(srcSection->getBC());
     _section->copyFibration(srcSection);
 
+    PetscErrorCode err = 0;
     if (0 != src._scatter) {
       _scatter = src._scatter;
-      PetscErrorCode err = PetscObjectReference((PetscObject) _scatter);
+      err = PetscObjectReference((PetscObject) _scatter);
       CHECK_PETSC_ERROR(err);
+
+      assert(_section->sizeWithBC() > 0);
+      err = VecCreateSeqWithArray(PETSC_COMM_SELF,
+				  _section->sizeWithBC(),
+				  _section->restrictSpace(),
+				  &_scatterVec); CHECK_PETSC_ERROR(err);
+      CHECK_PETSC_ERROR(err);
     } // if
   } // if
   logger.stagePop();
@@ -654,9 +670,17 @@
     err = VecScatterDestroy(_scatter); _scatter = 0;
     CHECK_PETSC_ERROR(err);
   } // if
-
   err = MeshCreateGlobalScatter(_mesh.sieveMesh(), _section, &_scatter);
   CHECK_PETSC_ERROR(err);
+
+  if (0 != _scatterVec) {
+    err = VecDestroy(_scatterVec); _scatterVec = 0;
+    CHECK_PETSC_ERROR(err);
+  } // if
+  assert(_section->sizeWithBC() > 0);
+  err = VecCreateSeqWithArray(PETSC_COMM_SELF,
+			      _section->sizeWithBC(), _section->restrictSpace(),
+			      &_scatterVec); CHECK_PETSC_ERROR(err);
 } // createScatter
 
 // ----------------------------------------------------------------------
@@ -680,18 +704,14 @@
 { // scatterSectionToVector
   assert(!_section.isNull());
   assert(0 != _scatter);
+  assert(0 != _scatterVec);
   assert(0 != vector);
 
   PetscErrorCode err = 0;
-  PetscVec localVec = 0;
-  err = VecCreateSeqWithArray(PETSC_COMM_SELF,
-			      _section->sizeWithBC(), _section->restrictSpace(),
-			      &localVec); CHECK_PETSC_ERROR(err);
-  err = VecScatterBegin(_scatter, localVec, vector,
+  err = VecScatterBegin(_scatter, _scatterVec, vector,
 			INSERT_VALUES, SCATTER_FORWARD); CHECK_PETSC_ERROR(err);
-  err = VecScatterEnd(_scatter, localVec, vector,
+  err = VecScatterEnd(_scatter, _scatterVec, vector,
 		      INSERT_VALUES, SCATTER_FORWARD); CHECK_PETSC_ERROR(err);
-  err = VecDestroy(localVec); CHECK_PETSC_ERROR(err);
 } // scatterSectionToVector
 
 // ----------------------------------------------------------------------
@@ -715,18 +735,14 @@
 { // scatterVectorToSection
   assert(!_section.isNull());
   assert(0 != _scatter);
+  assert(0 != _scatterVec);
   assert(0 != vector);
 
   PetscErrorCode err = 0;
-  PetscVec localVec = 0;
-  err = VecCreateSeqWithArray(PETSC_COMM_SELF,
-			      _section->sizeWithBC(), _section->restrictSpace(),
-			      &localVec); CHECK_PETSC_ERROR(err);
-  err = VecScatterBegin(_scatter, vector, localVec,
+  err = VecScatterBegin(_scatter, vector, _scatterVec,
 			INSERT_VALUES, SCATTER_REVERSE); CHECK_PETSC_ERROR(err);
-  err = VecScatterEnd(_scatter, vector, localVec,
+  err = VecScatterEnd(_scatter, vector, _scatterVec,
 		      INSERT_VALUES, SCATTER_REVERSE); CHECK_PETSC_ERROR(err);
-  err = VecDestroy(localVec); CHECK_PETSC_ERROR(err);
 } // scatterVectorToSection
 
 // ----------------------------------------------------------------------

Modified: short/3D/PyLith/trunk/libsrc/topology/Field.hh
===================================================================
--- short/3D/PyLith/trunk/libsrc/topology/Field.hh	2009-08-27 00:32:43 UTC (rev 15602)
+++ short/3D/PyLith/trunk/libsrc/topology/Field.hh	2009-08-27 15:51:31 UTC (rev 15603)
@@ -291,6 +291,7 @@
   ALE::Obj<RealSection> _section; ///< Real section with data.
   PetscVec _vector; ///< PETSc vector associated with field.
   PetscVecScatter _scatter; ///< PETSc scatter associated with field.
+  PetscVec _scatterVec; ///< PETSC vector used in scattering.
   VectorFieldEnum _vecFieldType; ///< Type of vector field.
   bool _dimensionsOkay; ///< Flag indicating it is okay to dimensionalize.
 



More information about the CIG-COMMITS mailing list