cylinderToPoint.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) 2017 OpenFOAM Foundation
9  Copyright (C) 2018-2022 OpenCFD Ltd.
10 -------------------------------------------------------------------------------
11 License
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 "cylinderToPoint.H"
30 #include "polyMesh.H"
32 
33 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
34 
35 namespace Foam
36 {
37  defineTypeNameAndDebug(cylinderToPoint, 0);
38  addToRunTimeSelectionTable(topoSetSource, cylinderToPoint, word);
39  addToRunTimeSelectionTable(topoSetSource, cylinderToPoint, istream);
40  addToRunTimeSelectionTable(topoSetPointSource, cylinderToPoint, word);
41  addToRunTimeSelectionTable(topoSetPointSource, cylinderToPoint, istream);
43  (
44  topoSetPointSource,
45  cylinderToPoint,
46  word,
47  cylinder
48  );
50  (
51  topoSetPointSource,
52  cylinderToPoint,
53  istream,
54  cylinder
55  );
56 }
57 
58 
59 Foam::topoSetSource::addToUsageTable Foam::cylinderToPoint::usage_
60 (
61  cylinderToPoint::typeName,
62  "\n Usage: cylinderToPoint (p1X p1Y p1Z) (p2X p2Y p2Z) radius\n\n"
63  " Select points within bounding cylinder\n\n"
64 );
65 
66 
67 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
68 
69 void Foam::cylinderToPoint::combine(topoSet& set, const bool add) const
70 {
71  const tmp<pointField> tctrs(this->transform(mesh_.points()));
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 = (d & d) - sqr(magD)/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 :
109  topoSetPointSource(mesh),
110  point1_(point1),
111  point2_(point2),
112  radius_(radius),
113  innerRadius_(innerRadius)
114 {}
115 
116 
118 (
119  const polyMesh& mesh,
120  const dictionary& dict
121 )
122 :
124  point1_(dict.getCompat<point>("point1", {{"p1", -2112}})),
125  point2_(dict.getCompat<point>("point2", {{"p2", -2112}})),
126  radius_(dict.getCompat<scalar>("radius", {{"outerRadius", -2112}})),
127  innerRadius_
128  (
129  dict.getCheckOrDefault<scalar>("innerRadius", 0, scalarMinMax::ge(0))
130  )
131 {}
132 
133 
135 (
136  const polyMesh& mesh,
137  Istream& is,
138  const bool mandatoryInnerRadius
139 )
140 :
142  point1_(checkIs(is)),
143  point2_(checkIs(is)),
144  radius_(readScalar(checkIs(is))),
145  innerRadius_(0)
146 {
147  if (mandatoryInnerRadius)
148  {
149  innerRadius_ = readScalar(checkIs(is));
150  }
151 }
152 
153 
155 (
156  const polyMesh& mesh,
157  Istream& is
158 )
159 :
160  cylinderToPoint(mesh, is, false)
161 {}
162 
163 
164 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
165 
167 (
168  const topoSetSource::setAction action,
169  topoSet& set
170 ) const
171 {
172  if (action == topoSetSource::ADD || action == topoSetSource::NEW)
173  {
174  if (verbose_)
175  {
176  Info<< " Adding points within cylinder"
177  << ", with point1 = " << point1_
178  << ", point2 = " << point2_
179  << ", radius = " << radius_;
180 
181  if (innerRadius_ > 0)
182  {
183  Info<< ", inner radius = " << innerRadius_;
184  }
185 
186  Info<< endl;
187  }
188 
189  combine(set, true);
190  }
191  else if (action == topoSetSource::SUBTRACT)
192  {
193  if (verbose_)
194  {
195  Info<< " Removing points within cylinder"
196  << ", with point1 = " << point1_
197  << ", point2 = " << point2_
198  << ", radius = " << radius_;
199 
200  if (innerRadius_ > 0)
201  {
202  Info<< ", inner radius = " << innerRadius_;
203  }
204 
205  Info<< endl;
206  }
207 
208  combine(set, false);
209  }
210 }
211 
212 
213 // ************************************************************************* //
dictionary dict
The topoSetPointSource is a intermediate class for handling topoSet sources for selecting points...
A list of keyword definitions, which are a keyword followed by a number of values (eg...
Definition: dictionary.H:129
cylinderToPoint(const polyMesh &mesh, Istream &is, const bool mandatoryInnerRadius)
Construct from Istream with mandatory inner radius.
Create a new set and ADD elements to it.
Add elements to current set.
dimensionedSymmTensor sqr(const dimensionedVector &dv)
An Istream is an abstract base class for all input systems (streams, files, token lists etc)...
Definition: Istream.H:57
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:531
static Istream & checkIs(Istream &is)
Check state of stream.
void addOrDelete(topoSet &set, const label id, const bool add) const
Add or delete id from set. Add when &#39;add&#39; is true.
Macros for easy insertion into run-time selection tables.
addNamedToRunTimeSelectionTable(topoSetCellSource, badQualityToCell, word, badQuality)
virtual const pointField & points() const
Return raw points.
Definition: polyMesh.C:1078
#define forAll(list, i)
Loop across all elements in list.
Definition: stdFoam.H:421
AccessType combine(const UList< T > &lists, AccessOp aop=accessOp< T >())
Combines sub-lists into a single list.
Definition: ListListOps.C:62
vectorField pointField
pointField is a vectorField.
Definition: pointFieldFwd.H:38
dynamicFvMesh & mesh
A topoSetPointSource to select all points which are inside a given bounding cylinder or cylinder annu...
static MinMax< scalar > ge(const scalar &minVal)
A semi-infinite range from minVal to the type max.
Definition: MinMaxI.H:24
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...
setAction
Enumeration defining various actions.
Vector< scalar > vector
Definition: vector.H:57
const polyMesh & mesh_
Reference to the mesh.
void add(FieldField< Field1, typename typeOfSum< Type1, Type2 >::type > &f, const FieldField< Field1, Type1 > &f1, const FieldField< Field2, Type2 > &f2)
A Vector of values with scalar precision, where scalar is float/double depending on the compilation f...
defineTypeNameAndDebug(combustionModel, 0)
General set of labels of mesh quantity (points, cells, faces).
Definition: topoSet.H:59
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, or if there are excess tokens.
Subtract elements from current set.
vector point
Point is a vector.
Definition: point.H:37
Class with constructor to add usage string to table.
virtual void applyToSet(const topoSetSource::setAction action, topoSet &set) const
Apply specified action to the topoSet.
tmp< pointField > transform(const pointField &points) const
Coordinate transform (optionally) coordinates. Returns reference to input data if no transform is act...
messageStream Info
Information stream (stdout output on master, null elsewhere)
Mesh consisting of general polyhedral cells.
Definition: polyMesh.H:75
dimensioned< typename typeOfMag< Type >::type > magSqr(const dimensioned< Type > &dt)
Namespace for OpenFOAM.
addToRunTimeSelectionTable(functionObject, pointHistory, dictionary)