sphereToPoint.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) 2018-2020 OpenCFD Ltd.
9 -------------------------------------------------------------------------------
10 License
11  This file is part of OpenFOAM.
12 
13  OpenFOAM is free software: you can redistribute it and/or modify it
14  under the terms of the GNU General Public License as published by
15  the Free Software Foundation, either version 3 of the License, or
16  (at your option) any later version.
17 
18  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
19  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21  for more details.
22 
23  You should have received a copy of the GNU General Public License
24  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
25 
26 \*---------------------------------------------------------------------------*/
27 
28 #include "sphereToPoint.H"
29 #include "polyMesh.H"
31 
32 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
33 
34 namespace Foam
35 {
42  (
45  word,
46  sphere
47  );
49  (
52  istream,
53  sphere
54  );
55 }
56 
57 
58 Foam::topoSetSource::addToUsageTable Foam::sphereToPoint::usage_
59 (
60  sphereToPoint::typeName,
61  "\n Usage: sphereToPoint (centreX centreY centreZ) radius\n\n"
62  " Select all points within bounding sphere\n\n"
63 );
64 
65 
66 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
67 
68 void Foam::sphereToPoint::combine(topoSet& set, const bool add) const
69 {
70  const tmp<pointField> tctrs(this->transform(mesh_.points()));
71  const pointField& ctrs = tctrs();
72 
73  const scalar orad2 = sqr(radius_);
74  const scalar irad2 = innerRadius_ > 0 ? sqr(innerRadius_) : -1;
75 
76  // Treat innerRadius == 0 like unspecified innerRadius (always accept)
77 
78  forAll(ctrs, elemi)
79  {
80  const scalar d2 = magSqr(ctrs[elemi] - origin_);
81 
82  if ((d2 < orad2) && (d2 > irad2))
83  {
84  addOrDelete(set, elemi, add);
85  }
86  }
87 }
88 
89 
90 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
91 
93 (
94  const polyMesh& mesh,
95  const point& origin,
96  const scalar radius,
97  const scalar innerRadius
98 )
99 :
101  origin_(origin),
102  radius_(radius),
103  innerRadius_(innerRadius)
104 {}
105 
106 
108 (
109  const polyMesh& mesh,
110  const dictionary& dict
111 )
112 :
114  origin_(dict.getCompat<vector>("origin", {{"centre", -1806}})),
115  radius_(dict.getCheck<scalar>("radius", scalarMinMax::ge(0))),
116  innerRadius_
117  (
118  dict.getCheckOrDefault<scalar>("innerRadius", 0, scalarMinMax::ge(0))
119  )
120 {}
121 
122 
124 (
125  const polyMesh& mesh,
126  Istream& is
127 )
128 :
130  origin_(checkIs(is)),
131  radius_(readScalar(checkIs(is))),
132  innerRadius_(0)
133 {}
134 
135 
136 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
137 
139 (
140  const topoSetSource::setAction action,
141  topoSet& set
142 ) const
143 {
144  if (action == topoSetSource::ADD || action == topoSetSource::NEW)
145  {
146  if (verbose_)
147  {
148  Info<< " Adding points within sphere,"
149  << " origin = " << origin_ << ", radius = " << radius_;
150 
151  if (innerRadius_ > 0)
152  {
153  Info<< ", innerRadius = " << innerRadius_;
154  }
155 
156  Info<< endl;
157  }
158 
159  combine(set, true);
160  }
161  else if (action == topoSetSource::SUBTRACT)
162  {
163  if (verbose_)
164  {
165  Info<< " Removing points within sphere,"
166  << " origin = " << origin_ << ", radius = " << radius_;
167 
168  if (innerRadius_ > 0)
169  {
170  Info<< ", innerRadius = " << innerRadius_;
171  }
172 
173  Info<< endl;
174  }
175 
176  combine(set, false);
177  }
178 }
179 
180 
181 // ************************************************************************* //
Macros for easy insertion into run-time selection tables.
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 semi-infinite range from minVal to the type max.
Definition: MinMaxI.H:24
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
Definition: dictionary.H:132
T getCheck(const word &keyword, const Predicate &pred, enum keyType::option matchOpt=keyType::REGEX) const
Find and return a T with additional checking FatalIOError if not found, or if the number of tokens is...
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
virtual const pointField & points() const
Return raw points.
Definition: polyMesh.C:1063
A topoSetPointSource to select points which are inside a given bounding sphere.
sphereToPoint(const polyMesh &mesh, const point &origin, const scalar radius, const scalar innerRadius=0)
Construct from components.
Definition: sphereToPoint.C:86
virtual void applyToSet(const topoSetSource::setAction action, topoSet &set) const
Apply specified action to the topoSet.
Specialization of rigidBody to construct a sphere given the mass and radius.
The topoSetPointSource is a intermediate class for handling topoSet sources for selecting points.
Class with constructor to add usage string to table.
Base class of a source for a topoSet.
Definition: topoSetSource.H:64
tmp< pointField > transform(const pointField &points) const
Coordinate transform (optionally) coordinates. Returns reference to input data if no transform is act...
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.
const polyMesh & mesh_
Reference to the mesh.
General set of labels of mesh quantity (points, cells, faces).
Definition: topoSet.H:63
A class for handling words, derived from Foam::string.
Definition: word.H:66
dynamicFvMesh & mesh
void set(List< bool > &bools, const labelUList &locations)
Set the listed locations (assign 'true').
Definition: BitOps.C:30
AccessType combine(const UList< T > &lists, AccessOp aop=accessOp< T >())
Combines sub-lists into a single list.
Definition: ListListOps.C:62
Namespace for OpenFOAM.
addNamedToRunTimeSelectionTable(topoSetCellSource, badQualityToCell, word, badQuality)
dimensionedSymmTensor sqr(const dimensionedVector &dv)
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:529
addToRunTimeSelectionTable(functionObject, pointHistory, dictionary)
messageStream Info
Information stream (stdout output on master, null elsewhere)
vectorField pointField
pointField is a vectorField.
Definition: pointFieldFwd.H:38
vector point
Point is a vector.
Definition: point.H:37
dimensioned< typename typeOfMag< Type >::type > magSqr(const dimensioned< Type > &dt)
void add(FieldField< Field1, typename typeOfSum< Type1, Type2 >::type > &f, const FieldField< Field1, Type1 > &f1, const FieldField< Field2, Type2 > &f2)
defineTypeNameAndDebug(combustionModel, 0)
dictionary dict
#define forAll(list, i)
Loop across all elements in list.
Definition: stdFoam.H:286