From b811aeaf1812690851659908296261d44c010526 Mon Sep 17 00:00:00 2001 From: mattijs Date: Thu, 26 Sep 2013 10:34:32 +0100 Subject: [PATCH 1/9] BUG: autoPtr: cloning empty autoPtr --- src/OpenFOAM/memory/autoPtr/autoPtrI.H | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/OpenFOAM/memory/autoPtr/autoPtrI.H b/src/OpenFOAM/memory/autoPtr/autoPtrI.H index 55e032fcd4..3557ffc49b 100644 --- a/src/OpenFOAM/memory/autoPtr/autoPtrI.H +++ b/src/OpenFOAM/memory/autoPtr/autoPtrI.H @@ -52,10 +52,14 @@ inline Foam::autoPtr::autoPtr(const autoPtr& ap, const bool reUse) ptr_ = ap.ptr_; ap.ptr_ = 0; } - else + else if (ap.valid()) { ptr_ = ap().clone().ptr(); } + else + { + ptr_ = NULL; + } } From d16c545b3edd5443af031da79dd4674dc88acd0e Mon Sep 17 00:00:00 2001 From: mattijs Date: Thu, 26 Sep 2013 10:35:31 +0100 Subject: [PATCH 2/9] ENH: regionSplit: allow local region counting --- src/meshTools/regionSplit/regionSplit.C | 16 ++++++++++----- src/meshTools/regionSplit/regionSplit.H | 26 ++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/meshTools/regionSplit/regionSplit.C b/src/meshTools/regionSplit/regionSplit.C index f7815a16d8..2583c2ddfe 100644 --- a/src/meshTools/regionSplit/regionSplit.C +++ b/src/meshTools/regionSplit/regionSplit.C @@ -379,6 +379,7 @@ Foam::label Foam::regionSplit::calcLocalRegionSplit Foam::autoPtr Foam::regionSplit::calcRegionSplit ( + const bool doGlobalRegions, const boolList& blockedFace, const List& explicitConnections, @@ -395,7 +396,7 @@ Foam::autoPtr Foam::regionSplit::calcRegionSplit cellRegion ); - if (!Pstream::parRun()) + if (!doGlobalRegions) { return autoPtr(new globalIndex(nLocalRegions)); } @@ -422,7 +423,7 @@ Foam::autoPtr Foam::regionSplit::calcRegionSplit // (this will create gaps in the global region list so they will get // merged later on) - while (Pstream::parRun()) + while (true) { if (debug) { @@ -690,13 +691,14 @@ Foam::autoPtr Foam::regionSplit::calcRegionSplit // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // -Foam::regionSplit::regionSplit(const polyMesh& mesh) +Foam::regionSplit::regionSplit(const polyMesh& mesh, const bool doGlobalRegions) : MeshObject(mesh), labelList(mesh.nCells(), -1) { globalNumberingPtr_ = calcRegionSplit ( + doGlobalRegions, //do global regions boolList(0, false), //blockedFaces List(0), //explicitConnections, *this @@ -707,7 +709,8 @@ Foam::regionSplit::regionSplit(const polyMesh& mesh) Foam::regionSplit::regionSplit ( const polyMesh& mesh, - const boolList& blockedFace + const boolList& blockedFace, + const bool doGlobalRegions ) : MeshObject(mesh), @@ -715,6 +718,7 @@ Foam::regionSplit::regionSplit { globalNumberingPtr_ = calcRegionSplit ( + doGlobalRegions, blockedFace, //blockedFaces List(0), //explicitConnections, *this @@ -726,7 +730,8 @@ Foam::regionSplit::regionSplit ( const polyMesh& mesh, const boolList& blockedFace, - const List& explicitConnections + const List& explicitConnections, + const bool doGlobalRegions ) : MeshObject(mesh), @@ -734,6 +739,7 @@ Foam::regionSplit::regionSplit { globalNumberingPtr_ = calcRegionSplit ( + doGlobalRegions, blockedFace, //blockedFaces explicitConnections, //explicitConnections, *this diff --git a/src/meshTools/regionSplit/regionSplit.H b/src/meshTools/regionSplit/regionSplit.H index b7be9dd32e..83302529df 100644 --- a/src/meshTools/regionSplit/regionSplit.H +++ b/src/meshTools/regionSplit/regionSplit.H @@ -87,6 +87,9 @@ Description proc0 | proc1 | proc2 + Can optionally keep all regions local to the processor. + + SourceFiles regionSplit.C @@ -155,6 +158,7 @@ class regionSplit //- Calculate global region split. Return globalIndex. autoPtr calcRegionSplit ( + const bool doGlobalRegions, const boolList& blockedFace, const List& explicitConnections, labelList& cellRegion @@ -170,11 +174,20 @@ public: // Constructors //- Construct from mesh - regionSplit(const polyMesh&); + regionSplit + ( + const polyMesh&, + const bool doGlobalRegions = Pstream::parRun() + ); //- Construct from mesh and whether face is blocked // NOTE: blockedFace has to be consistent across coupled faces! - regionSplit(const polyMesh&, const boolList& blockedFace); + regionSplit + ( + const polyMesh&, + const boolList& blockedFace, + const bool doGlobalRegions = Pstream::parRun() + ); //- Construct from mesh and whether face is blocked. Additional explicit // connections between normal boundary faces. @@ -183,7 +196,8 @@ public: ( const polyMesh&, const boolList& blockedFace, - const List& + const List&, + const bool doGlobalRegions = Pstream::parRun() ); @@ -195,6 +209,12 @@ public: return globalNumberingPtr_(); } + //- Return local number of regions + label nLocalRegions() const + { + return globalNumbering().localSize(Pstream::myProcNo()); + } + //- Return total number of regions label nRegions() const { From 1e541a6c73e76e6fd66f30dca8b989b526466038 Mon Sep 17 00:00:00 2001 From: mattijs Date: Thu, 26 Sep 2013 10:37:12 +0100 Subject: [PATCH 3/9] BUG: decompositionMethod: use local regions --- .../decompositionMethod/decompositionMethod.C | 60 +++++++++++++------ .../decompositionMethod/decompositionMethod.H | 27 +-------- 2 files changed, 45 insertions(+), 42 deletions(-) diff --git a/src/parallel/decompose/decompositionMethods/decompositionMethod/decompositionMethod.C b/src/parallel/decompose/decompositionMethods/decompositionMethod/decompositionMethod.C index 8021284723..4e19610373 100644 --- a/src/parallel/decompose/decompositionMethods/decompositionMethod/decompositionMethod.C +++ b/src/parallel/decompose/decompositionMethods/decompositionMethod/decompositionMethod.C @@ -167,7 +167,7 @@ void Foam::decompositionMethod::calcCellCells ( const polyMesh& mesh, const labelList& agglom, - const label nCoarse, + const label nLocalCoarse, const bool parallel, CompactListList