mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
- Remove the unused enums() method since it delivers wholly unreliable results. It is not guaranteed to cover the full enumeration range, but only the listed names. - Remove the unused strings() method. Duplicated functionality of the words(), but was never used. - Change access of words() method from static to object. Better code isolation. Permits the constructor to take over as the single point of failure for bad input. - Add values() method - do not expose internal (HashTable) lookup since it makes it more difficult to enforce constness and the implementation detail should not be exposed. However leave toc() and sortedToc() for the interface. STYLE: relocated NamedEnum under primitives (was containers) - internal typedef as 'value_type' for some consistency with STL conventions
268 lines
6.8 KiB
C
268 lines
6.8 KiB
C
/*---------------------------------------------------------------------------*\
|
|
========= |
|
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
\\ / O peration |
|
|
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
|
\\/ M anipulation | Copyright (C) 2017 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 "cellSetOption.H"
|
|
#include "volFields.H"
|
|
|
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
|
|
namespace Foam
|
|
{
|
|
namespace fv
|
|
{
|
|
defineTypeNameAndDebug(cellSetOption, 0);
|
|
}
|
|
|
|
template<> const char* NamedEnum
|
|
<
|
|
fv::cellSetOption::selectionModeType,
|
|
4
|
|
>::names[] =
|
|
{
|
|
"points",
|
|
"cellSet",
|
|
"cellZone",
|
|
"all"
|
|
};
|
|
|
|
const NamedEnum<fv::cellSetOption::selectionModeType, 4>
|
|
fv::cellSetOption::selectionModeTypeNames_;
|
|
}
|
|
|
|
|
|
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
|
|
|
void Foam::fv::cellSetOption::setSelection(const dictionary& dict)
|
|
{
|
|
switch (selectionMode_)
|
|
{
|
|
case smPoints:
|
|
{
|
|
dict.lookup("points") >> points_;
|
|
break;
|
|
}
|
|
case smCellSet:
|
|
{
|
|
dict.lookup("cellSet") >> cellSetName_;
|
|
break;
|
|
}
|
|
case smCellZone:
|
|
{
|
|
dict.lookup("cellZone") >> cellSetName_;
|
|
break;
|
|
}
|
|
case smAll:
|
|
{
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
FatalErrorInFunction
|
|
<< "Unknown selectionMode "
|
|
<< selectionModeTypeNames_[selectionMode_]
|
|
<< ". Valid selectionMode types are "
|
|
<< selectionModeTypeNames_
|
|
<< exit(FatalError);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void Foam::fv::cellSetOption::setVol()
|
|
{
|
|
scalar VOld = V_;
|
|
|
|
// Set volume information
|
|
V_ = 0.0;
|
|
forAll(cells_, i)
|
|
{
|
|
V_ += mesh_.V()[cells_[i]];
|
|
}
|
|
reduce(V_, sumOp<scalar>());
|
|
|
|
|
|
// Convert both volumes to representation using current writeprecision
|
|
word VOldName(Time::timeName(VOld, IOstream::defaultPrecision()));
|
|
word VName(Time::timeName(V_, IOstream::defaultPrecision()));
|
|
|
|
if (VName != VOldName)
|
|
{
|
|
Info<< indent
|
|
<< "- selected " << returnReduce(cells_.size(), sumOp<label>())
|
|
<< " cell(s) with volume " << V_ << endl;
|
|
}
|
|
}
|
|
|
|
|
|
void Foam::fv::cellSetOption::setCellSet()
|
|
{
|
|
switch (selectionMode_)
|
|
{
|
|
case smPoints:
|
|
{
|
|
Info<< indent << "- selecting cells using points" << endl;
|
|
|
|
labelHashSet selectedCells;
|
|
|
|
forAll(points_, i)
|
|
{
|
|
label celli = mesh_.findCell(points_[i]);
|
|
if (celli >= 0)
|
|
{
|
|
selectedCells.insert(celli);
|
|
}
|
|
|
|
label globalCelli = returnReduce(celli, maxOp<label>());
|
|
if (globalCelli < 0)
|
|
{
|
|
WarningInFunction
|
|
<< "Unable to find owner cell for point " << points_[i]
|
|
<< endl;
|
|
}
|
|
|
|
}
|
|
|
|
cells_ = selectedCells.toc();
|
|
|
|
break;
|
|
}
|
|
case smCellSet:
|
|
{
|
|
Info<< indent
|
|
<< "- selecting cells using cellSet " << cellSetName_ << endl;
|
|
|
|
cellSet selectedCells(mesh_, cellSetName_);
|
|
cells_ = selectedCells.toc();
|
|
|
|
break;
|
|
}
|
|
case smCellZone:
|
|
{
|
|
Info<< indent
|
|
<< "- selecting cells using cellZone " << cellSetName_ << endl;
|
|
|
|
label zoneID = mesh_.cellZones().findZoneID(cellSetName_);
|
|
if (zoneID == -1)
|
|
{
|
|
FatalErrorInFunction
|
|
<< "Cannot find cellZone " << cellSetName_ << endl
|
|
<< "Valid cellZones are " << mesh_.cellZones().names()
|
|
<< exit(FatalError);
|
|
}
|
|
cells_ = mesh_.cellZones()[zoneID];
|
|
|
|
break;
|
|
}
|
|
case smAll:
|
|
{
|
|
Info<< indent << "- selecting all cells" << endl;
|
|
cells_ = identity(mesh_.nCells());
|
|
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
FatalErrorInFunction
|
|
<< "Unknown selectionMode "
|
|
<< selectionModeTypeNames_[selectionMode_]
|
|
<< ". Valid selectionMode types are "
|
|
<< selectionModeTypeNames_
|
|
<< exit(FatalError);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
|
|
Foam::fv::cellSetOption::cellSetOption
|
|
(
|
|
const word& name,
|
|
const word& modelType,
|
|
const dictionary& dict,
|
|
const fvMesh& mesh
|
|
)
|
|
:
|
|
option(name, modelType, dict, mesh),
|
|
timeStart_(-1.0),
|
|
duration_(0.0),
|
|
selectionMode_
|
|
(
|
|
selectionModeTypeNames_.read(coeffs_.lookup("selectionMode"))
|
|
),
|
|
cellSetName_("none"),
|
|
V_(0.0)
|
|
{
|
|
Info<< incrIndent;
|
|
read(dict);
|
|
setSelection(coeffs_);
|
|
setCellSet();
|
|
setVol();
|
|
Info<< decrIndent;
|
|
}
|
|
|
|
|
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
|
|
|
Foam::fv::cellSetOption::~cellSetOption()
|
|
{}
|
|
|
|
|
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
|
|
|
bool Foam::fv::cellSetOption::isActive()
|
|
{
|
|
if (option::isActive() && inTimeLimits(mesh_.time().value()))
|
|
{
|
|
// Update the cell set if the mesh is changing
|
|
if (mesh_.changing())
|
|
{
|
|
if (mesh_.topoChanging())
|
|
{
|
|
setCellSet();
|
|
// Force printing of new set volume
|
|
V_ = -GREAT;
|
|
}
|
|
else if (selectionMode_ == smPoints)
|
|
{
|
|
// This is the only geometric selection mode
|
|
setCellSet();
|
|
}
|
|
|
|
// Report new volume (if changed)
|
|
setVol();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
// ************************************************************************* //
|