Files
OpenFOAM-6/src/parallel/decompose/decompositionMethods/decompositionConstraints/preservePatches/preservePatchesConstraint.C
Henry Weller 1441f8cab0 Patches contributed by Mattijs Janssens:
splitMeshRegions: handle flipping of faces for surface fields

subsetMesh: subset dimensionedFields

decomposePar: use run-time selection of decomposition constraints. Used to
    keep cells on particular processors. See the decomposeParDict in

$FOAM_UTILITIES/parallel/decomposePar:
  - preserveBaffles: keep baffle faces on same processor
  - preserveFaceZones: keep faceZones owner and neighbour on same processor
  - preservePatches: keep owner and neighbour on same processor. Note: not
    suitable for cyclicAMI since these are not coupled on the patch level
  - singleProcessorFaceSets: keep complete faceSet on a single processor
  - refinementHistory: keep cells originating from a single cell on the
    same processor.

decomposePar: clean up decomposition of refinement data from snappyHexMesh

reconstructPar: reconstruct refinement data (refineHexMesh, snappyHexMesh)

reconstructParMesh: reconstruct refinement data (refineHexMesh, snappyHexMesh)

redistributePar:
  - corrected mapping surfaceFields
  - adding processor patches in order consistent with decomposePar

argList: check that slaves are running same version as master

fvMeshSubset: move to dynamicMesh library

fvMeshDistribute:
  - support for mapping dimensionedFields
  - corrected mapping of surfaceFields

parallel routines: allow parallel running on single processor

Field: support for
  - distributed mapping
  - mapping with flipping

mapDistribute: support for flipping

AMIInterpolation: avoid constructing localPoints
2016-05-15 16:36:48 +01:00

201 lines
5.4 KiB
C

/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015-2016 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "preservePatchesConstraint.H"
#include "addToRunTimeSelectionTable.H"
#include "syncTools.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace decompositionConstraints
{
defineTypeName(preservePatchesConstraint);
addToRunTimeSelectionTable
(
decompositionConstraint,
preservePatchesConstraint,
dictionary
);
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::decompositionConstraints::preservePatchesConstraint::
preservePatchesConstraint
(
const dictionary& constraintsDict,
const word& modelType
)
:
decompositionConstraint(constraintsDict, typeName),
patches_(coeffDict_.lookup("patches"))
{
if (decompositionConstraint::debug)
{
Info<< type() << " : adding constraints to keep owner of faces"
<< " in patches " << patches_
<< " on same processor. This only makes sense for cyclics." << endl;
}
}
Foam::decompositionConstraints::preservePatchesConstraint::
preservePatchesConstraint
(
const wordReList& patches
)
:
decompositionConstraint(dictionary(), typeName),
patches_(patches)
{
if (decompositionConstraint::debug)
{
Info<< type() << " : adding constraints to keep owner of faces"
<< " in patches " << patches_
<< " on same processor. This only makes sense for cyclics." << endl;
}
}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
void Foam::decompositionConstraints::preservePatchesConstraint::add
(
const polyMesh& mesh,
boolList& blockedFace,
PtrList<labelList>& specifiedProcessorFaces,
labelList& specifiedProcessor,
List<labelPair>& explicitConnections
) const
{
const polyBoundaryMesh& pbm = mesh.boundaryMesh();
blockedFace.setSize(mesh.nFaces(), true);
const labelList patchIDs(pbm.patchSet(patches_).sortedToc());
label nUnblocked = 0;
forAll(patchIDs, i)
{
const polyPatch& pp = pbm[patchIDs[i]];
forAll(pp, i)
{
if (blockedFace[pp.start() + i])
{
blockedFace[pp.start() + i] = false;
nUnblocked++;
}
}
}
if (decompositionConstraint::debug & 2)
{
reduce(nUnblocked, sumOp<label>());
Info<< type() << " : unblocked " << nUnblocked << " faces" << endl;
}
syncTools::syncFaceList(mesh, blockedFace, andEqOp<bool>());
}
void Foam::decompositionConstraints::preservePatchesConstraint::apply
(
const polyMesh& mesh,
const boolList& blockedFace,
const PtrList<labelList>& specifiedProcessorFaces,
const labelList& specifiedProcessor,
const List<labelPair>& explicitConnections,
labelList& decomposition
) const
{
// If the decomposition has not enforced the constraint do it over
// here.
// Synchronise decomposition on patchIDs
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
const polyBoundaryMesh& pbm = mesh.boundaryMesh();
labelList destProc(mesh.nFaces()-mesh.nInternalFaces(), labelMax);
forAll(pbm, patchI)
{
const polyPatch& pp = pbm[patchI];
const labelUList& faceCells = pp.faceCells();
forAll(faceCells, i)
{
label bFaceI = pp.start()+i-mesh.nInternalFaces();
destProc[bFaceI] = decomposition[faceCells[i]];
}
}
syncTools::syncBoundaryFaceList(mesh, destProc, minEqOp<label>());
// Override if differing
// ~~~~~~~~~~~~~~~~~~~~~
const labelList patchIDs(pbm.patchSet(patches_).sortedToc());
label nChanged = 0;
forAll(patchIDs, i)
{
const polyPatch& pp = pbm[patchIDs[i]];
const labelUList& faceCells = pp.faceCells();
forAll(faceCells, i)
{
label bFaceI = pp.start()+i-mesh.nInternalFaces();
if (decomposition[faceCells[i]] != destProc[bFaceI])
{
decomposition[faceCells[i]] = destProc[bFaceI];
nChanged++;
}
}
}
if (decompositionConstraint::debug & 2)
{
reduce(nChanged, sumOp<label>());
Info<< type() << " : changed decomposition on " << nChanged
<< " cells" << endl;
}
}
// ************************************************************************* //