Newer
Older
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2018-2021 OpenCFD Ltd.
-------------------------------------------------------------------------------
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 "polyPatch.H"
#include "addToRunTimeSelectionTable.H"
#include "polyBoundaryMesh.H"
#include "polyMesh.H"
#include "primitiveMesh.H"
#include "SubField.H"
#include "entry.H"
#include "dictionary.H"
#include "pointPatchField.H"
#include "demandDrivenData.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(polyPatch, 0);
int polyPatch::disallowGenericPolyPatch
(
debug::debugSwitch("disallowGenericPolyPatch", 0)
);
defineRunTimeSelectionTable(polyPatch, word);
defineRunTimeSelectionTable(polyPatch, dictionary);
addToRunTimeSelectionTable(polyPatch, polyPatch, word);
addToRunTimeSelectionTable(polyPatch, polyPatch, dictionary);
}
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
void Foam::polyPatch::movePoints(PstreamBuffers&, const pointField& p)
{
primitivePatch::movePoints(p);
}
void Foam::polyPatch::updateMesh(PstreamBuffers&)
primitivePatch::clearGeom();
clearAddressing();
}
void Foam::polyPatch::clearGeom()
{
primitivePatch::clearGeom();
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::polyPatch::polyPatch
(
const word& name,
const label size,
const label start,
const label index,
const polyBoundaryMesh& bm,
const word& patchType
)
:
patchIdentifier(name, index),
primitivePatch
(
faceSubList(bm.mesh().faces(), size, start),
bm.mesh().points()
),
start_(start),
boundaryMesh_(bm),
faceCellsPtr_(nullptr),
mePtr_(nullptr)
if (!patchType.empty() && constraintType(patchType))
inGroups().appendUniq(patchType);
Foam::polyPatch::polyPatch
(
const word& name,
const label size,
const label start,
const label index,
const polyBoundaryMesh& bm,
const word& physicalType,
const wordList& inGroups
)
:
patchIdentifier(name, index, physicalType, inGroups),
primitivePatch
(
faceSubList(bm.mesh().faces(), size, start),
bm.mesh().points()
),
start_(start),
boundaryMesh_(bm),
faceCellsPtr_(nullptr),
mePtr_(nullptr)
Foam::polyPatch::polyPatch
(
const word& name,
const dictionary& dict,
const label index,
const polyBoundaryMesh& bm,
const word& patchType
)
:
patchIdentifier(name, dict, index),
primitivePatch
(
faceSubList
(
bm.mesh().faces(),
dict.get<label>("nFaces"),
dict.get<label>("startFace")
),
bm.mesh().points()
),
start_(dict.get<label>("startFace")),
faceCellsPtr_(nullptr),
mePtr_(nullptr)
if (!patchType.empty() && constraintType(patchType))
inGroups().appendUniq(patchType);
Foam::polyPatch::polyPatch
(
const polyPatch& pp,
const polyBoundaryMesh& bm
)
:
patchIdentifier(pp),
primitivePatch
(
faceSubList
(
bm.mesh().faces(),
pp.size(),
pp.start()
),
bm.mesh().points()
),
start_(pp.start()),
boundaryMesh_(bm),
faceCellsPtr_(nullptr),
mePtr_(nullptr)
{}
Foam::polyPatch::polyPatch
(
const polyPatch& pp,
const polyBoundaryMesh& bm,
const label index,
const label newSize,
const label newStart
)
:
patchIdentifier(pp, index),
primitivePatch
(
faceSubList
(
bm.mesh().faces(),
newSize,
newStart
),
bm.mesh().points()
),
start_(newStart),
boundaryMesh_(bm),
faceCellsPtr_(nullptr),
mePtr_(nullptr)
Foam::polyPatch::polyPatch
(
const polyPatch& pp,
const polyBoundaryMesh& bm,
const label index,
const labelUList& mapAddressing,
const label newStart
)
:
patchIdentifier(pp, index),
primitivePatch
(
faceSubList
(
bm.mesh().faces(),
mapAddressing.size(),
newStart
),
bm.mesh().points()
),
start_(newStart),
boundaryMesh_(bm),
faceCellsPtr_(nullptr),
mePtr_(nullptr)
Foam::polyPatch::polyPatch(const polyPatch& p)
:
patchIdentifier(p),
primitivePatch(p),
start_(p.start_),
boundaryMesh_(p.boundaryMesh_),
faceCellsPtr_(nullptr),
mePtr_(nullptr)
Foam::polyPatch::polyPatch
(
const polyPatch& p,
const labelList& faceCells
)
:
polyPatch(p)
{
faceCellsPtr_ = new labelList::subList(faceCells, faceCells.size());
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::polyPatch::~polyPatch()
{
clearAddressing();
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool Foam::polyPatch::constraintType(const word& pt)
{
return
(
pointPatchField<scalar>::pointPatchConstructorTablePtr_
&& pointPatchField<scalar>::pointPatchConstructorTablePtr_->found(pt)
);
}
Foam::wordList Foam::polyPatch::constraintTypes()
{
const auto& cnstrTable = *dictionaryConstructorTablePtr_;
wordList cTypes(cnstrTable.size());
forAllConstIters(cnstrTable, iter)
if (constraintType(iter.key()))
cTypes[i++] = iter.key();
}
}
cTypes.setSize(i);
return cTypes;
}
Foam::label Foam::polyPatch::offset() const
{
return start_ - boundaryMesh().start();
}
const Foam::polyBoundaryMesh& Foam::polyPatch::boundaryMesh() const
{
return boundaryMesh_;
}
const Foam::vectorField::subField Foam::polyPatch::faceCentres() const
{
return patchSlice(boundaryMesh().mesh().faceCentres());
}
const Foam::vectorField::subField Foam::polyPatch::faceAreas() const
{
return patchSlice(boundaryMesh().mesh().faceAreas());
}
Foam::tmp<Foam::vectorField> Foam::polyPatch::faceCellCentres() const
{
tmp<vectorField> tcc(new vectorField(size()));
Henry Weller
committed
vectorField& cc = tcc.ref();
// get reference to global cell centres
const vectorField& gcc = boundaryMesh_.mesh().cellCentres();
const labelUList& faceCells = this->faceCells();
forAll(faceCells, facei)
{
cc[facei] = gcc[faceCells[facei]];
}
return tcc;
}
Foam::tmp<Foam::scalarField> Foam::polyPatch::areaFraction() const
{
tmp<scalarField> tfraction(new scalarField(size()));
scalarField& fraction = tfraction.ref();
const vectorField::subField faceAreas = this->faceAreas();
const pointField& points = this->points();
forAll(*this, facei)
{
const face& curFace = this->operator[](facei);
fraction[facei] =
mag(faceAreas[facei])/(curFace.mag(points) + ROOTVSMALL);
}
return tfraction;
}
const Foam::labelUList& Foam::polyPatch::faceCells() const
{
if (!faceCellsPtr_)
{
faceCellsPtr_ = new labelList::subList
(
patchSlice(boundaryMesh().mesh().faceOwner())
);
}
return *faceCellsPtr_;
}
const Foam::labelList& Foam::polyPatch::meshEdges() const
{
if (!mePtr_)
{
mePtr_ =
new labelList
(
primitivePatch::meshEdges
(
boundaryMesh().mesh().edges(),
)
);
}
return *mePtr_;
}
void Foam::polyPatch::clearAddressing()
{
primitivePatch::clearTopology();
primitivePatch::clearPatchMeshAddr();
deleteDemandDrivenData(faceCellsPtr_);
deleteDemandDrivenData(mePtr_);
}
void Foam::polyPatch::write(Ostream& os) const
{
os.writeEntry("type", type());
patchIdentifier::write(os);
os.writeEntry("nFaces", size());
os.writeEntry("startFace", start());
void Foam::polyPatch::initOrder(PstreamBuffers&, const primitivePatch&) const
{}
bool Foam::polyPatch::order
(
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
const primitivePatch&,
labelList& faceMap,
labelList& rotation
) const
{
// Nothing changed.
return false;
}
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
void Foam::polyPatch::operator=(const polyPatch& p)
{
clearAddressing();
patchIdentifier::operator=(p);
primitivePatch::operator=(p);
start_ = p.start_;
}
// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * //
Foam::Ostream& Foam::operator<<(Ostream& os, const polyPatch& p)
{
p.write(os);
os.check(FUNCTION_NAME);
return os;
}
// ************************************************************************* //