From 7e735715a4189e02ea322cf507892f623474c018 Mon Sep 17 00:00:00 2001 From: mattijs Date: Tue, 3 Mar 2009 17:09:01 +0000 Subject: [PATCH] more flexible mrfzones modified: finiteVolume/cfdTools/general/MRF/MRFZone.C modified: finiteVolume/cfdTools/general/MRF/MRFZone.H modified: ../tutorials/incompressible/MRFSimpleFoam/mixerVessel2D/constant/MRFZones --- .../cfdTools/general/MRF/MRFZone.C | 441 +++++++++++++----- .../cfdTools/general/MRF/MRFZone.H | 36 +- .../mixerVessel2D/constant/MRFZones | 4 +- 3 files changed, 348 insertions(+), 133 deletions(-) diff --git a/src/finiteVolume/cfdTools/general/MRF/MRFZone.C b/src/finiteVolume/cfdTools/general/MRF/MRFZone.C index 6250de7e24..8b689d0d66 100644 --- a/src/finiteVolume/cfdTools/general/MRF/MRFZone.C +++ b/src/finiteVolume/cfdTools/general/MRF/MRFZone.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. + \\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -29,8 +29,264 @@ License #include "volFields.H" #include "surfaceFields.H" #include "fvMatrices.H" -#include "PackedList.H" #include "syncTools.H" +#include "faceSet.H" + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::MRFZone::setMRFFaces +( + labelList& faceType, + const labelList& excludedPatchIDs +) +{ + const polyBoundaryMesh& patches = mesh_.boundaryMesh(); + + // Knock out coupled patches + forAll(patches, patchi) + { + if (patches[patchi].coupled()) + { + const polyPatch& pp = patches[patchi]; + + forAll(pp, j) + { + label faceI = pp.start()+j; + + if (faceType[faceI] == 1) + { + faceType[faceI] = 2; + } + } + } + } + + // All explicitly provided exclusions + forAll(excludedPatchIDs, i) + { + const polyPatch& pp = patches[excludedPatchIDs[i]]; + + forAll(pp, j) + { + label faceI = pp.start()+j; + + if (faceType[faceI] == 1) + { + faceType[faceI] = 2; + } + } + } + + // Collect into lists per patch. + internalFaces_.setSize(mesh_.nFaces()); + label nInternal = 0; + + for (label faceI = 0; faceI < mesh_.nInternalFaces(); faceI++) + { + if (faceType[faceI] == 1) + { + internalFaces_[nInternal++] = faceI; + } + } + internalFaces_.setSize(nInternal); + + labelList nIncludedFaces(patches.size(), 0); + labelList nExcludedFaces(patches.size(), 0); + + forAll(patches, patchi) + { + const polyPatch& pp = patches[patchi]; + + forAll(pp, patchFacei) + { + label faceI = pp.start()+patchFacei; + + if (faceType[faceI] == 1) + { + nIncludedFaces[patchi]++; + } + else if (faceType[faceI] == 2) + { + nExcludedFaces[patchi]++; + } + } + } + + includedFaces_.setSize(patches.size()); + excludedFaces_.setSize(patches.size()); + forAll(nIncludedFaces, patchi) + { + includedFaces_[patchi].setSize(nIncludedFaces[patchi]); + excludedFaces_[patchi].setSize(nExcludedFaces[patchi]); + } + nIncludedFaces = 0; + nExcludedFaces = 0; + + forAll(patches, patchi) + { + const polyPatch& pp = patches[patchi]; + + forAll(pp, patchFacei) + { + label faceI = pp.start()+patchFacei; + + if (faceType[faceI] == 1) + { + includedFaces_[patchi][nIncludedFaces[patchi]++] = patchFacei; + } + else if (faceType[faceI] == 2) + { + excludedFaces_[patchi][nExcludedFaces[patchi]++] = patchFacei; + } + } + } + + //if (debug) + //{ + // faceSet internalFaces(mesh_, "internalFaces", internalFaces_); + // Pout<< "Writing internal faces in MRF zone to faceSet " + // << internalFaces.name() << endl; + // internalFaces.write(); + //} + //{ + // faceSet MRFFaces(mesh_, "includedFaces", 100); + // forAll(includedFaces_, patchi) + // { + // forAll(includedFaces_[patchi], i) + // { + // label patchFacei = includedFaces_[patchi][i]; + // MRFFaces.insert(patches[patchi].start()+patchFacei); + // } + // } + // Pout<< "Writing patch faces in MRF zone to faceSet " + // << MRFFaces.name() << endl; + // MRFFaces.write(); + //} + //{ + // faceSet excludedFaces(mesh_, "excludedFaces", 100); + // forAll(excludedFaces_, patchi) + // { + // forAll(excludedFaces_[patchi], i) + // { + // label patchFacei = excludedFaces_[patchi][i]; + // excludedFaces.insert(patches[patchi].start()+patchFacei); + // } + // } + // Pout<< "Writing faces in MRF zone with special handling to faceSet " + // << excludedFaces.name() << endl; + // excludedFaces.write(); + //} +} + + +void Foam::MRFZone::setMRFFaces() +{ + const polyBoundaryMesh& patches = mesh_.boundaryMesh(); + + // Type per face: + // 0:not in zone + // 1:moving with frame + // 2:other + labelList faceType(mesh_.nFaces(), 0); + + bool faceZoneFound = (faceZoneID_ != -1); + reduce(faceZoneFound, orOp()); + + if (faceZoneFound) + { + // Explicitly provided faces. + if (faceZoneID_ != -1) + { + const labelList& zoneFaces = mesh_.faceZones()[faceZoneID_]; + + forAll(zoneFaces, i) + { + faceType[zoneFaces[i]] = 1; + } + + if (allPatchesMove_) + { + // Explicitly provided patches that do not move + setMRFFaces(faceType, patchLabels_); + } + else + { + setMRFFaces(faceType, labelList(0)); + } + } + } + else + { + // Determine faces in cell zone + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // (without constructing cells) + + const labelList& own = mesh_.faceOwner(); + const labelList& nei = mesh_.faceNeighbour(); + + // Cells in zone + boolList zoneCell(mesh_.nCells(), false); + + if (cellZoneID_ != -1) + { + const labelList& cellLabels = mesh_.cellZones()[cellZoneID_]; + forAll(cellLabels, i) + { + zoneCell[cellLabels[i]] = true; + } + } + + + label nZoneFaces = 0; + + for (label faceI = 0; faceI < mesh_.nInternalFaces(); faceI++) + { + if (zoneCell[own[faceI]] || zoneCell[nei[faceI]]) + { + faceType[faceI] = 1; + nZoneFaces++; + } + } + forAll(patches, patchI) + { + const polyPatch& pp = patches[patchI]; + + if (!isA(pp)) + { + forAll(pp, i) + { + label faceI = pp.start()+i; + + if (zoneCell[own[faceI]]) + { + faceType[faceI] = 1; + nZoneFaces++; + } + } + } + } + syncTools::syncFaceList(mesh_, faceType, maxEqOp