Loading...
Searching...
No Matches
cylinderToCell.C
Go to the documentation of this file.
1/*---------------------------------------------------------------------------*\
2 ========= |
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4 \\ / O peration |
5 \\ / A nd | www.openfoam.com
6 \\/ M anipulation |
7-------------------------------------------------------------------------------
8 Copyright (C) 2011-2017 OpenFOAM Foundation
9 Copyright (C) 2018-2022 OpenCFD Ltd.
10-------------------------------------------------------------------------------
11License
12 This file is part of OpenFOAM.
13
14 OpenFOAM is free software: you can redistribute it and/or modify it
15 under the terms of the GNU General Public License as published by
16 the Free Software Foundation, either version 3 of the License, or
17 (at your option) any later version.
18
19 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26
27\*---------------------------------------------------------------------------*/
28
29#include "cylinderToCell.H"
30#include "polyMesh.H"
33// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
35namespace Foam
36{
43 (
46 word,
47 cylinder
48 );
50 (
53 istream,
54 cylinder
55 );
56}
57
58
59Foam::topoSetSource::addToUsageTable Foam::cylinderToCell::usage_
60(
61 cylinderToCell::typeName,
62 "\n Usage: cylinderToCell (p1X p1Y p1Z) (p2X p2Y p2Z) radius\n\n"
63 " Select all cells with cell centre within bounding cylinder\n\n"
64);
65
66
67// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
68
69void Foam::cylinderToCell::combine(topoSet& set, const bool add) const
70{
71 const tmp<pointField> tctrs(this->transform(mesh_.cellCentres()));
72 const pointField& ctrs = tctrs();
73
74 const vector axis = (point2_ - point1_);
75 const scalar magAxis2 = magSqr(axis);
76 const scalar orad2 = sqr(radius_);
77 const scalar irad2 = innerRadius_ > 0 ? sqr(innerRadius_) : -1;
78
79 // Treat innerRadius == 0 like unspecified innerRadius (always accept)
80
81 forAll(ctrs, elemi)
82 {
83 const vector d = ctrs[elemi] - point1_;
84 const scalar magD = d & axis;
85
86 if ((magD > 0) && (magD < magAxis2))
87 {
88 const scalar d2 = magSqr(d^axis)/magAxis2;
89 if ((d2 < orad2) && (d2 > irad2))
90 {
91 addOrDelete(set, elemi, add);
92 }
93 }
94 }
95}
96
97
98// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
99
101(
102 const polyMesh& mesh,
103 const point& point1,
104 const point& point2,
105 const scalar radius,
106 const scalar innerRadius
107)
108:
110 point1_(point1),
111 point2_(point2),
112 radius_(radius),
113 innerRadius_(innerRadius)
114{
115 if (innerRadius_ > radius_)
116 {
118 << "inner radius = " << innerRadius_ << " cannot be larger than "
119 << "outer radius = " << radius_
120 << exit(FatalError);
121 }
122}
123
124
126(
127 const polyMesh& mesh,
128 const dictionary& dict
129)
130:
131 topoSetCellSource(mesh, dict),
132 point1_(dict.getCompat<point>("point1", {{"p1", -2112}})),
133 point2_(dict.getCompat<point>("point2", {{"p2", -2112}})),
134 radius_(dict.getCompat<scalar>("radius", {{"outerRadius", -2112}})),
135 innerRadius_
136 (
137 dict.getCheckOrDefault<scalar>("innerRadius", 0, scalarMinMax::ge(0))
138 )
139{}
140
141
143(
144 const polyMesh& mesh,
145 Istream& is,
146 const bool mandatoryInnerRadius
147)
148:
150 point1_(checkIs(is)),
151 point2_(checkIs(is)),
152 radius_(readScalar(checkIs(is))),
153 innerRadius_(0)
154{
155 if (mandatoryInnerRadius)
156 {
157 innerRadius_ = readScalar(checkIs(is));
158 }
159}
160
161
163(
164 const polyMesh& mesh,
165 Istream& is
166)
168 cylinderToCell(mesh, is, false)
169{}
170
171
172// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
173
175(
176 const topoSetSource::setAction action,
177 topoSet& set
178) const
179{
180 if (action == topoSetSource::ADD || action == topoSetSource::NEW)
181 {
182 if (verbose_)
183 {
184 Info<< " Adding cells with centres within cylinder"
185 << ", with point1 = " << point1_
186 << ", point2 = " << point2_
187 << ", radius = " << radius_;
188
189 if (innerRadius_ > 0)
190 {
191 Info<< ", inner radius = " << innerRadius_;
192 }
193
194 Info<< endl;
195 }
196
197 combine(set, true);
198 }
199 else if (action == topoSetSource::SUBTRACT)
200 {
201 if (verbose_)
202 {
203 Info<< " Removing cells with centres within cylinder"
204 << ", with point1 = " << point1_
205 << ", point2 = " << point2_
206 << ", radius = " << radius_;
207
208 if (innerRadius_ > 0)
209 {
210 Info<< ", inner radius = " << innerRadius_;
211 }
212
213 Info<< endl;
214 }
215
216 combine(set, false);
217 }
218}
219
220
221// ************************************************************************* //
Macros for easy insertion into run-time selection tables.
#define addNamedToRunTimeSelectionTable(baseType, thisType, argNames, lookupName)
Add to construction table with 'lookupName' as the key.
#define addToRunTimeSelectionTable(baseType, thisType, argNames)
Add to construction table with typeName as the key.
An Istream is an abstract base class for all input systems (streams, files, token lists etc)....
Definition Istream.H:60
static MinMax< scalar > ge(const scalar &minVal)
A topoSetCellSource to select all cells whose cell centre inside a given bounding cylinder or cylinde...
cylinderToCell(const polyMesh &mesh, Istream &is, const bool mandatoryInnerRadius)
Construct from Istream with mandatory inner radius.
virtual void applyToSet(const topoSetSource::setAction action, topoSet &set) const
Apply specified action to the topoSet.
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
Definition dictionary.H:133
T getCompat(const word &keyword, std::initializer_list< std::pair< const char *, int > > compat, enum keyType::option matchOpt=keyType::REGEX) const
Find and return a T using any compatibility names if needed. FatalIOError if not found,...
T getCheckOrDefault(const word &keyword, const T &deflt, const Predicate &pred, enum keyType::option matchOpt=keyType::REGEX) const
Find and return a T, or return the given default value. FatalIOError if it is found and the number of...
Mesh consisting of general polyhedral cells.
Definition polyMesh.H:79
const vectorField & cellCentres() const
The topoSetCellSource is a intermediate class for handling topoSet sources for selecting cells.
topoSetCellSource(const polyMesh &mesh)
Construct from mesh.
Class with constructor to add usage string to table.
Base class of a source for a topoSet.
void addOrDelete(topoSet &set, const label id, const bool add) const
Add or delete id from set. Add when 'add' is true.
setAction
Enumeration defining various actions.
@ SUBTRACT
Subtract elements from current set.
@ ADD
Add elements to current set.
@ NEW
Create a new set and ADD elements to it.
bool verbose_
Output verbosity (default: true).
const polyMesh & mesh() const noexcept
Reference to the mesh.
const polyMesh & mesh_
Reference to the mesh.
static Istream & checkIs(Istream &is)
Check state of stream.
General set of labels of mesh quantity (points, cells, faces).
Definition topoSet.H:63
A Vector of values with scalar precision, where scalar is float/double depending on the compilation f...
A class for handling words, derived from Foam::string.
Definition word.H:66
#define defineTypeNameAndDebug(Type, DebugSwitch)
Define the typeName and debug information.
Definition className.H:142
dynamicFvMesh & mesh
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition error.H:600
Namespace for OpenFOAM.
dimensionedSymmTensor sqr(const dimensionedVector &dv)
refinementData transform(const tensor &, const refinementData val)
No-op rotational transform for base types.
messageStream Info
Information stream (stdout output on master, null elsewhere).
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition Ostream.H:519
vector point
Point is a vector.
Definition point.H:37
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
vectorField pointField
pointField is a vectorField.
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition errorManip.H:125
dimensioned< typename typeOfMag< Type >::type > magSqr(const dimensioned< Type > &dt)
dict add("bounds", meshBb)
dictionary dict
#define forAll(list, i)
Loop across all elements in list.
Definition stdFoam.H:299