[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