From c7a96e7ff42229742005db9f0fa1898f58965fec Mon Sep 17 00:00:00 2001 From: mattijs Date: Wed, 8 Jun 2011 09:53:06 +0100 Subject: [PATCH] ENH: cylinderAnnulusToCell: new cellSource for cellSets --- src/meshTools/Make/files | 1 + .../cylinderAnnulusToCell/cylinderAnnulusToCell.C | 161 +++++++++++++++++++++ .../cylinderAnnulusToCell/cylinderAnnulusToCell.H | 135 +++++++++++++++++ 3 files changed, 297 insertions(+) create mode 100644 src/meshTools/sets/cellSources/cylinderAnnulusToCell/cylinderAnnulusToCell.C create mode 100644 src/meshTools/sets/cellSources/cylinderAnnulusToCell/cylinderAnnulusToCell.H diff --git a/src/meshTools/Make/files b/src/meshTools/Make/files index 272f3e06..9ffa2f94 100644 --- a/src/meshTools/Make/files +++ b/src/meshTools/Make/files @@ -94,6 +94,7 @@ $(cellSources)/zoneToCell/zoneToCell.C $(cellSources)/sphereToCell/sphereToCell.C $(cellSources)/cylinderToCell/cylinderToCell.C $(cellSources)/faceZoneToCell/faceZoneToCell.C +$(cellSources)/cylinderAnnulusToCell/cylinderAnnulusToCell.C faceSources = sets/faceSources $(faceSources)/faceToFace/faceToFace.C diff --git a/src/meshTools/sets/cellSources/cylinderAnnulusToCell/cylinderAnnulusToCell.C b/src/meshTools/sets/cellSources/cylinderAnnulusToCell/cylinderAnnulusToCell.C new file mode 100644 index 00000000..80ccd4fa --- /dev/null +++ b/src/meshTools/sets/cellSources/cylinderAnnulusToCell/cylinderAnnulusToCell.C @@ -0,0 +1,161 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ 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 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 . + +\*---------------------------------------------------------------------------*/ + +#include "cylinderAnnulusToCell.H" +#include "polyMesh.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(cylinderAnnulusToCell, 0); + addToRunTimeSelectionTable(topoSetSource, cylinderAnnulusToCell, word); + addToRunTimeSelectionTable(topoSetSource, cylinderAnnulusToCell, istream); +} + + +Foam::topoSetSource::addToUsageTable Foam::cylinderAnnulusToCell::usage_ +( + cylinderAnnulusToCell::typeName, + "\n Usage: cylinderAnnulusToCell (p1X p1Y p1Z) (p2X p2Y p2Z)" + " outerRadius innerRadius\n\n" + " Select all cells with cell centre within bounding cylinder annulus\n\n" +); + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::cylinderAnnulusToCell::combine(topoSet& set, const bool add) const +{ + const vector axis = p2_ - p1_; + const scalar orad2 = sqr(outerRadius_); + const scalar irad2 = sqr(innerRadius_); + const scalar magAxis2 = magSqr(axis); + + const pointField& ctrs = mesh_.cellCentres(); + + forAll(ctrs, cellI) + { + vector d = ctrs[cellI] - p1_; + scalar magD = d & axis; + + if ((magD > 0) && (magD < magAxis2)) + { + scalar d2 = (d & d) - sqr(magD)/magAxis2; + if ((d2 < orad2) && (d2 > irad2)) + { + addOrDelete(set, cellI, add); + } + } + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::cylinderAnnulusToCell::cylinderAnnulusToCell +( + const polyMesh& mesh, + const vector& p1, + const vector& p2, + const scalar outerRadius, + const scalar innerRadius +) +: + topoSetSource(mesh), + p1_(p1), + p2_(p2), + outerRadius_(outerRadius), + innerRadius_(innerRadius) +{} + + +Foam::cylinderAnnulusToCell::cylinderAnnulusToCell +( + const polyMesh& mesh, + const dictionary& dict +) +: + topoSetSource(mesh), + p1_(dict.lookup("p1")), + p2_(dict.lookup("p2")), + outerRadius_(readScalar(dict.lookup("outerRadius"))), + innerRadius_(readScalar(dict.lookup("innerRadius"))) +{} + + +// Construct from Istream +Foam::cylinderAnnulusToCell::cylinderAnnulusToCell +( + const polyMesh& mesh, + Istream& is +) +: + topoSetSource(mesh), + p1_(checkIs(is)), + p2_(checkIs(is)), + outerRadius_(readScalar(checkIs(is))), + innerRadius_(readScalar(checkIs(is))) +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::cylinderAnnulusToCell::~cylinderAnnulusToCell() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::cylinderAnnulusToCell::applyToSet +( + const topoSetSource::setAction action, + topoSet& set +) const +{ + if ((action == topoSetSource::NEW) || (action == topoSetSource::ADD)) + { + Info<< " Adding cells with centre within cylinder annulus," + << " with p1 = " + << p1_ << ", p2 = " << p2_ << " and outer radius = " << outerRadius_ + << " and inner radius = " << innerRadius_ + << endl; + + combine(set, true); + } + else if (action == topoSetSource::DELETE) + { + Info<< " Removing cells with centre within cylinder, with p1 = " + << p1_ << ", p2 = " << p2_ << " and outer radius = " << outerRadius_ + << " and inner radius " << innerRadius_ + << endl; + + combine(set, false); + } +} + + +// ************************************************************************* // diff --git a/src/meshTools/sets/cellSources/cylinderAnnulusToCell/cylinderAnnulusToCell.H b/src/meshTools/sets/cellSources/cylinderAnnulusToCell/cylinderAnnulusToCell.H new file mode 100644 index 00000000..96a9e6d9 --- /dev/null +++ b/src/meshTools/sets/cellSources/cylinderAnnulusToCell/cylinderAnnulusToCell.H @@ -0,0 +1,135 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\/ 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 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 . + +Class + Foam::cylinderAnnulusToCell + +Description + A topoSetSource to select cells based on cell centres inside a + cylinder annulus. + +SourceFiles + cylinderAnnulusToCell.C + +\*---------------------------------------------------------------------------*/ + +#ifndef cylinderAnnulusToCell_H +#define cylinderAnnulusToCell_H + +#include "topoSetSource.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class cylinderAnnulusToCell Declaration +\*---------------------------------------------------------------------------*/ + +class cylinderAnnulusToCell +: + public topoSetSource +{ + + // Private data + + //- Add usage string + static addToUsageTable usage_; + + //- First point on cylinder axis + vector p1_; + + //- Second point on cylinder axis + vector p2_; + + //- Outer Radius + scalar outerRadius_; + + //- Inner Radius + scalar innerRadius_; + + + // Private Member Functions + + void combine(topoSet& set, const bool add) const; + + +public: + + //- Runtime type information + TypeName("cylinderAnnulusToCell"); + + + // Constructors + + //- Construct from components + cylinderAnnulusToCell + ( + const polyMesh& mesh, + const vector& p1, + const vector& p2, + const scalar outerRadius, + const scalar innerRadius + ); + + //- Construct from dictionary + cylinderAnnulusToCell + ( + const polyMesh& mesh, + const dictionary& dict + ); + + //- Construct from Istream + cylinderAnnulusToCell + ( + const polyMesh& mesh, + Istream& + ); + + + // Destructor + + virtual ~cylinderAnnulusToCell(); + + + // Member Functions + + virtual void applyToSet + ( + const topoSetSource::setAction action, + topoSet& + ) const; + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // -- 2.11.4.GIT