From 9688b6ccdc4b4bb182d23e0f761500821de2deb2 Mon Sep 17 00:00:00 2001 From: andy Date: Fri, 21 Feb 2014 16:18:00 +0000 Subject: [PATCH] BUG: decomposePar - updated to handle multiple processor cyclic patches - mantis 879 --- .../decomposePar/domainDecomposition.H | 23 ++- .../decomposePar/domainDecompositionMesh.C | 163 ++++++++---------- .../domainDecompositionTemplates.C | 125 ++++++++++++++ 3 files changed, 216 insertions(+), 95 deletions(-) create mode 100644 applications/utilities/parallelProcessing/decomposePar/domainDecompositionTemplates.C diff --git a/applications/utilities/parallelProcessing/decomposePar/domainDecomposition.H b/applications/utilities/parallelProcessing/decomposePar/domainDecomposition.H index 9487aefef0..21bc8e6169 100644 --- a/applications/utilities/parallelProcessing/decomposePar/domainDecomposition.H +++ b/applications/utilities/parallelProcessing/decomposePar/domainDecomposition.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -130,7 +130,7 @@ class domainDecomposition //- Append single element to list static void append(labelList&, const label); - //- Add face to interProcessor patch. + //- Add face to inter-processor patch void addInterProcFace ( const label facei, @@ -141,6 +141,19 @@ class domainDecomposition List > >& ) const; + //- Generate sub patch info for processor cyclics + template + void processInterCyclics + ( + const polyBoundaryMesh& patches, + List > >& interPatchFaces, + List >& procNbrToInterPatch, + List& subPatchIDs, + List& subPatchStarts, + bool owner, + BinaryOp bop + ) const; + public: @@ -187,6 +200,12 @@ public: } // End namespace Foam +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository + #include "domainDecompositionTemplates.C" +#endif + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #endif diff --git a/applications/utilities/parallelProcessing/decomposePar/domainDecompositionMesh.C b/applications/utilities/parallelProcessing/decomposePar/domainDecompositionMesh.C index 1451233254..f5a767225c 100644 --- a/applications/utilities/parallelProcessing/decomposePar/domainDecompositionMesh.C +++ b/applications/utilities/parallelProcessing/decomposePar/domainDecompositionMesh.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -32,9 +32,7 @@ Description #include "domainDecomposition.H" #include "IOstreams.H" -#include "SLPtrList.H" #include "boolList.H" -#include "primitiveMesh.H" #include "cyclicPolyPatch.H" // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // @@ -209,10 +207,11 @@ void Foam::domainDecomposition::decomposeMesh() // Done internal bits of the new mesh and the ordinary patches. - // Per processor, from neighbour processor to the interprocessorpatch that - // communicates with that neighbour. + // Per processor, from neighbour processor to the inter-processor patch + // that communicates with that neighbour List > procNbrToInterPatch(nProcs_); - // Per processor the faces per interprocessorpatch. + + // Per processor the faces per inter-processor patch List > > interPatchFaces(nProcs_); // Processor boundaries from internal faces @@ -248,95 +247,73 @@ void Foam::domainDecomposition::decomposeMesh() subPatchStarts[procI].setSize(nInterfaces, labelList(1, label(0))); } - // Processor boundaries from split cyclics - forAll(patches, patchi) - { - if (isA(patches[patchi])) - { - const cyclicPolyPatch& pp = refCast - ( - patches[patchi] - ); - // cyclic: check opposite side on this processor - const labelUList& patchFaceCells = pp.faceCells(); - const labelUList& nbrPatchFaceCells = - pp.neighbPatch().faceCells(); + // Special handling needed for the case that multiple processor cyclic + // patches are created on each local processor domain, e.g. if a 3x3 case + // is decomposed using the decomposition: + // + // | 1 | 0 | 2 | + // cyclic left | 2 | 0 | 1 | cyclic right + // | 2 | 0 | 1 | + // + // - processors 1 and 2 will both have pieces of both cyclic left- and + // right sub-patches present + // - the interface patch faces are stored in a single list, where each + // sub-patch is referenced into the list using a patch start index and + // size + // - if the patches are in order (in the boundary file) of left, right + // - processor 1 will send: left, right + // - processor 1 will need to receive in reverse order: right, left + // - similarly for processor 2 + // - the sub-patches are therefore generated in 4 passes of the patch lists + // 1. add faces from owner patch where local proc i < nbr proc i + // 2. add faces from nbr patch where local proc i < nbr proc i + // 3. add faces from owner patch where local proc i > nbr proc i + // 4. add faces from nbr patch where local proc i > nbr proc i - // Store old sizes. Used to detect which inter-proc patches - // have been added to. - labelListList oldInterfaceSizes(nProcs_); - forAll(oldInterfaceSizes, procI) - { - labelList& curOldSizes = oldInterfaceSizes[procI]; + processInterCyclics + ( + patches, + interPatchFaces, + procNbrToInterPatch, + subPatchIDs, + subPatchStarts, + true, + lessOp