Minimum 2D face area refinement selection algorithm
Basically a 2D version of minCellVolume refinement which is quite useful for wedge geometries. If a per-cell-maximum face area on empty (or wedge) patch exceeds a specified minimum face area, cell is selected for refinement. Used as a part of composite refinement.
This commit is contained in:
parent
2c007a1404
commit
fac6af9e34
3 changed files with 314 additions and 0 deletions
|
@ -19,6 +19,7 @@ dynamicPolyRefinementFvMesh/refinementSelection/minCellVolumeRefinement/minCellV
|
|||
dynamicPolyRefinementFvMesh/refinementSelection/minCellSizeRefinement/minCellSizeRefinement.C
|
||||
dynamicPolyRefinementFvMesh/refinementSelection/minPatchDistanceRefinement/minPatchDistanceRefinement.C
|
||||
dynamicPolyRefinementFvMesh/refinementSelection/protectedInitialRefinement/protectedInitialRefinement.C
|
||||
dynamicPolyRefinementFvMesh/refinementSelection/minFaceArea2DRefinement/minFaceArea2DRefinement.C
|
||||
dynamicPolyRefinementFvMesh/refinementSelection/compositeRefinementSelection/compositeRefinementSelection.C
|
||||
|
||||
LIB = $(FOAM_LIBBIN)/libtopoChangerFvMesh
|
||||
|
|
|
@ -0,0 +1,202 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | foam-extend: Open Source CFD
|
||||
\\ / O peration | Version: 4.1
|
||||
\\ / A nd | Web: http://www.foam-extend.org
|
||||
\\/ M anipulation | For copyright notice see file Copyright
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of foam-extend.
|
||||
|
||||
foam-extend 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.
|
||||
|
||||
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Author
|
||||
Vuko Vukcevic, Wikki Ltd. All rights reserved.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "minFaceArea2DRefinement.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
#include "volFields.H"
|
||||
#include "emptyPolyPatch.H"
|
||||
#include "wedgePolyPatch.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
defineTypeNameAndDebug(minFaceArea2DRefinement, 0);
|
||||
addToRunTimeSelectionTable
|
||||
(
|
||||
refinementSelection,
|
||||
minFaceArea2DRefinement,
|
||||
dictionary
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::minFaceArea2DRefinement::minFaceArea2DRefinement
|
||||
(
|
||||
const fvMesh& mesh,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
refinementSelection(mesh, dict),
|
||||
minFaceA_(readScalar(coeffDict().lookup("minFaceArea")))
|
||||
{
|
||||
// It is an error to use this selection algorithm for 3D or 1D cases
|
||||
if (mesh.nGeometricD() != 2)
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"minFaceArea2DRefinement::minFaceArea2DRefinement"
|
||||
"\n("
|
||||
"\n const fvMesh& mesh,"
|
||||
"\n const dictionary& dict,"
|
||||
"\n)"
|
||||
) << "You are trying to use minFaceArea2DRefinement selection"
|
||||
<< " algorithm for a case which is not 2D case."
|
||||
<< nl
|
||||
<< "This is not allowed."
|
||||
<< abort(FatalError);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor* * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::minFaceArea2DRefinement::~minFaceArea2DRefinement()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * Public Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
Foam::Xfer<Foam::labelList>
|
||||
Foam::minFaceArea2DRefinement::refinementCellCandidates() const
|
||||
{
|
||||
// Get face areas (from polyMesh)
|
||||
const scalarField faceArea = mag(mesh().faceAreas());
|
||||
|
||||
// Mark empty or wedge faces
|
||||
boolList faceOnEmptyPatch(mesh().nFaces(), false);
|
||||
|
||||
// Loop through all patches
|
||||
const polyBoundaryMesh& bMesh = mesh().boundaryMesh();
|
||||
forAll (bMesh, patchI)
|
||||
{
|
||||
const polyPatch& curPatch = bMesh[patchI];
|
||||
|
||||
if (isA<emptyPolyPatch>(curPatch) || isA<wedgePolyPatch>(curPatch))
|
||||
{
|
||||
// Faces on this patch need to be marked
|
||||
const label startFaceI = curPatch.start();
|
||||
const label endFaceI = startFaceI + curPatch.size();
|
||||
|
||||
// Loop through all the faces and marke them
|
||||
for (label faceI = startFaceI; faceI < endFaceI; ++faceI)
|
||||
{
|
||||
faceOnEmptyPatch[faceI] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Create field that contains maximum face area on empty patch per cell
|
||||
scalarField maxEmptyPatchFaceArea(mesh().nCells(), 0.0);
|
||||
|
||||
// Get cells from the mesh
|
||||
const cellList& cells = mesh().cells();
|
||||
|
||||
forAll (cells, cellI)
|
||||
{
|
||||
// Get current cell
|
||||
const cell& cellFaces = cells[cellI];
|
||||
|
||||
// Loop through faces of the cell
|
||||
forAll (cellFaces, i)
|
||||
{
|
||||
// Get face index
|
||||
const label& faceI = cellFaces[i];
|
||||
|
||||
if (faceOnEmptyPatch[faceI])
|
||||
{
|
||||
// This face is on empty patch, set maximum face area to the new
|
||||
// value if it's larger than the old value
|
||||
maxEmptyPatchFaceArea[cellI] =
|
||||
max
|
||||
(
|
||||
maxEmptyPatchFaceArea[cellI],
|
||||
faceArea[faceI]
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Create storage for collection of cells. Assume that almost all of the
|
||||
// cells will be marked to prevent excessive resizing.
|
||||
dynamicLabelList refinementCandidates(mesh().nCells());
|
||||
|
||||
// Loop through cells and collect refinement candidates
|
||||
forAll (maxEmptyPatchFaceArea, cellI)
|
||||
{
|
||||
if (maxEmptyPatchFaceArea[cellI] > minFaceA_)
|
||||
{
|
||||
// Face area on empty patch is larger than the specified minimum,
|
||||
// append cell for potential refinement
|
||||
refinementCandidates.append(cellI);
|
||||
}
|
||||
}
|
||||
|
||||
// Print out some information
|
||||
Info<< "Selection algorithm " << type() << " selected "
|
||||
<< returnReduce(refinementCandidates.size(), sumOp<label>())
|
||||
<< " cells as refinement candidates."
|
||||
<< endl;
|
||||
|
||||
// Return the list in the Xfer container to prevent copying
|
||||
return refinementCandidates.xfer();
|
||||
}
|
||||
|
||||
|
||||
Foam::Xfer<Foam::labelList>
|
||||
Foam::minFaceArea2DRefinement::unrefinementPointCandidates() const
|
||||
{
|
||||
// Mark all points as unrefinement candidates since only split points may be
|
||||
// considered for actual unrefinement and since this refinement criterion
|
||||
// will be usually used in combination with others. VV, 4/Sep/2018.
|
||||
|
||||
// All points are unrefinement candidates
|
||||
labelList unrefinementCandidates(mesh().nPoints());
|
||||
|
||||
forAll (unrefinementCandidates, pointI)
|
||||
{
|
||||
unrefinementCandidates[pointI] = pointI;
|
||||
}
|
||||
|
||||
// Print out some information
|
||||
Info<< "Selection algorithm " << type() << " selected "
|
||||
<< returnReduce(unrefinementCandidates.size(), sumOp<label>())
|
||||
<< " points as unrefinement candidates."
|
||||
<< endl;
|
||||
|
||||
// Return the list in the Xfer container to prevent copying
|
||||
return unrefinementCandidates.xfer();
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
|
@ -0,0 +1,111 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | foam-extend: Open Source CFD
|
||||
\\ / O peration | Version: 4.1
|
||||
\\ / A nd | Web: http://www.foam-extend.org
|
||||
\\/ M anipulation | For copyright notice see file Copyright
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of foam-extend.
|
||||
|
||||
foam-extend 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.
|
||||
|
||||
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Class
|
||||
Foam::minFaceArea2DRefinement
|
||||
|
||||
Description
|
||||
Selection of refinement cells based on a minimum face area of empty (or
|
||||
wedge) patches. All cells containing a face on empty (or wedge) patch larger
|
||||
than specified minimum area get selected.
|
||||
|
||||
Useful as a 2D substitute for minCellVolume selection for wedge geometries.
|
||||
|
||||
SourceFiles
|
||||
minFaceArea2DRefinement.C
|
||||
|
||||
Author
|
||||
Vuko Vukcevic, Wikki Ltd. All rights reserved.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef minFaceArea2DRefinement_H
|
||||
#define minFaceArea2DRefinement_H
|
||||
|
||||
#include "refinementSelection.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class minFaceArea2DRefinement Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class minFaceArea2DRefinement
|
||||
:
|
||||
public refinementSelection
|
||||
{
|
||||
// Private data
|
||||
|
||||
//- Minimum face area on empty (or wedge) patches
|
||||
scalar minFaceA_;
|
||||
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- Disallow default bitwise copy construct
|
||||
minFaceArea2DRefinement(const minFaceArea2DRefinement&);
|
||||
|
||||
//- Disallow default bitwise assignment
|
||||
void operator=(const minFaceArea2DRefinement&);
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
TypeName("minFaceArea2DRefinement");
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from components
|
||||
minFaceArea2DRefinement(const fvMesh& mesh, const dictionary& dict);
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~minFaceArea2DRefinement();
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
// Selection of refinement/unrefinement candidates
|
||||
|
||||
//- Return transferable list of cells to refine
|
||||
virtual Xfer<labelList> refinementCellCandidates() const;
|
||||
|
||||
//- Return transferable list of split points to unrefine
|
||||
virtual Xfer<labelList> unrefinementPointCandidates() const;
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
Reference in a new issue