This repository has been archived on 2023-11-20. You can view files and clone it, but cannot push or open issues or pull requests.
foam-extend4.1-coherent-io/applications/utilities/mesh/generation/extrude2DMesh/extrude2DMesh.C

264 lines
8 KiB
C

/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright held by original author
\\/ 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 2 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, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\*---------------------------------------------------------------------------*/
#include "extrude2DMesh.H"
#include "polyMesh.H"
#include "directTopoChange.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(extrude2DMesh, 0);
}
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
// Construct from mesh
Foam::extrude2DMesh::extrude2DMesh(const polyMesh& mesh)
:
mesh_(mesh)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::extrude2DMesh::setRefinement
(
const direction extrudeDir,
const scalar thickness,
const label frontPatchI,
directTopoChange& meshMod
) const
{
for (label cellI = 0; cellI < mesh_.nCells(); cellI++)
{
meshMod.addCell
(
-1, //masterPointID,
-1, //masterEdgeID,
-1, //masterFaceID,
cellI, //masterCellID,
mesh_.cellZones().whichZone(cellI) //zoneID
);
}
// Generate points
// ~~~~~~~~~~~~~~~
forAll(mesh_.points(), pointI)
{
meshMod.addPoint
(
mesh_.points()[pointI],
pointI,
-1, // zoneID
true // inCell
);
}
//Info<< "Adding offsetted points." << nl << endl;
forAll(mesh_.points(), pointI)
{
point newPoint(mesh_.points()[pointI]);
newPoint[extrudeDir] = thickness;
meshMod.addPoint
(
newPoint,
pointI,
-1, // zoneID
true // inCell
);
}
// Generate faces
// ~~~~~~~~~~~~~~
const faceList& faces = mesh_.faces();
const polyBoundaryMesh& patches = mesh_.boundaryMesh();
for (label faceI = 0; faceI < mesh_.nInternalFaces(); faceI++)
{
label zoneID = mesh_.faceZones().whichZone(faceI);
bool zoneFlip = false;
if (zoneID != -1)
{
const faceZone& fZone = mesh_.faceZones()[zoneID];
zoneFlip = fZone.flipMap()[fZone.whichFace(faceI)];
}
face newFace(4);
const face& f = faces[faceI];
newFace[0] = f[0];
newFace[1] = f[1];
newFace[2] = f[1]+mesh_.nPoints();
newFace[3] = f[0]+mesh_.nPoints();
meshMod.addFace
(
newFace,
mesh_.faceOwner()[faceI], // own
mesh_.faceNeighbour()[faceI], // nei
-1, // masterPointID
-1, // masterEdgeID
faceI, // masterFaceID
false, // flipFaceFlux
-1, // patchID
zoneID, // zoneID
zoneFlip // zoneFlip
);
}
forAll(patches, patchI)
{
label startFaceI = patches[patchI].start();
label endFaceI = startFaceI + patches[patchI].size();
for (label faceI = startFaceI; faceI < endFaceI; faceI++)
{
label zoneID = mesh_.faceZones().whichZone(faceI);
bool zoneFlip = false;
if (zoneID != -1)
{
const faceZone& fZone = mesh_.faceZones()[zoneID];
zoneFlip = fZone.flipMap()[fZone.whichFace(faceI)];
}
face newFace(4);
const face& f = faces[faceI];
newFace[0] = f[0];
newFace[1] = f[1];
newFace[2] = f[1]+mesh_.nPoints();
newFace[3] = f[0]+mesh_.nPoints();
meshMod.addFace
(
newFace,
mesh_.faceOwner()[faceI], // own
-1, // nei
-1, // masterPointID
-1, // masterEdgeID
faceI, // masterFaceID
false, // flipFaceFlux
patchI, // patchID
zoneID, // zoneID
zoneFlip // zoneFlip
);
}
}
// Generate front and back faces
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
forAll(mesh_.cells(), cellI)
{
const cell& cFaces = mesh_.cells()[cellI];
// Make a loop out of faces.
const face& f = faces[cFaces[0]];
face frontFace(cFaces.size());
frontFace[0] = f[0];
label nextPointI = f[1];
label nextFaceI = cFaces[0];
for (label i = 1; i < frontFace.size(); i++)
{
frontFace[i] = nextPointI;
// Find face containing pointI
forAll(cFaces, cFaceI)
{
label faceI = cFaces[cFaceI];
if (faceI != nextFaceI)
{
const face& f = faces[faceI];
if (f[0] == nextPointI)
{
nextPointI = f[1];
nextFaceI = faceI;
break;
}
else if (f[1] == nextPointI)
{
nextPointI = f[0];
nextFaceI = faceI;
break;
}
}
}
}
// Add back face.
meshMod.addFace
(
frontFace.reverseFace(),
cellI, // own
-1, // nei
-1, // masterPointID
-1, // masterEdgeID
cFaces[0], // masterFaceID
false, // flipFaceFlux
frontPatchI, // patchID
-1, // zoneID
false // zoneFlip
);
// Offset to create front face.
forAll(frontFace, fp)
{
frontFace[fp] += mesh_.nPoints();
}
meshMod.addFace
(
frontFace,
cellI, // own
-1, // nei
-1, // masterPointID
-1, // masterEdgeID
cFaces[0], // masterFaceID
false, // flipFaceFlux
frontPatchI, // patchID
-1, // zoneID
false // zoneFlip
);
}
}
// ************************************************************************* //