/usr/include/freefoam/meshTools/PointEdgeWave.H is in libfreefoam-dev 0.1.0+dfsg-1build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 | /*---------------------------------------------------------------------------*\
========= |
\\ / 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 <http://www.gnu.org/licenses/>.
Class
Foam::PointEdgeWave
Description
Wave propagation of information through grid. Every iteration
information goes through one layer of edges. Templated on information
that is transferred.
Templated on information that is transferred.
Handles parallel and cyclics. Only parallel reasonably tested. Cyclics
hardly tested.
Note: whether to propagate depends on the return value of Type::update
which returns true (i.e. propagate) if the value changes by more than a
certain tolerance.
Note: parallel is done in two steps:
-# transfer patch points in offset notation, i.e. every patch
point is denoted by a patchface label and an index in this face.
Receiving end uses that fact that f[0] is shared and order is
reversed.
-# do all non-local shared points by means of reduce of data on them.
Note: cyclics is with offset in patchface as well. Patch is divided into
two sub patches and the point-point addressing is never explicitly
calculated but instead use is made of the face-face correspondence.
(it probably is more efficient to calculate a point-point
correspondence at the start and then reuse this; task to be done)
SourceFiles
PointEdgeWave.C
\*---------------------------------------------------------------------------*/
#ifndef PointEdgeWave_H
#define PointEdgeWave_H
#include <OpenFOAM/label.H>
#include <OpenFOAM/boolList.H>
#include <OpenFOAM/scalarField.H>
#include <OpenFOAM/pointFields.H>
#include <OpenFOAM/tensor.H>
#include <OpenFOAM/primitivePatch.H>
#include <OpenFOAM/PtrList.H>
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// Forward declaration of classes
class polyMesh;
/*---------------------------------------------------------------------------*\
Class PointEdgeWaveName Declaration
\*---------------------------------------------------------------------------*/
TemplateName(PointEdgeWave);
/*---------------------------------------------------------------------------*\
Class PointEdgeWave Declaration
\*---------------------------------------------------------------------------*/
template <class Type>
class PointEdgeWave
:
public PointEdgeWaveName
{
// Private static data
//- Relative tolerance. Stop propagation if relative changes
// less than this tolerance (responsability for checking this is
// up to Type implementation)
static scalar propagationTol_;
// Private data
//- Reference to mesh
const polyMesh& mesh_;
//- Wall information for all points
List<Type>& allPointInfo_;
//- Information on all mesh edges
List<Type>& allEdgeInfo_;
//- Has point changed
boolList changedPoint_;
//- List of changed points
labelList changedPoints_;
//- Number of changed points
label nChangedPoints_;
//- Edges that have changed
boolList changedEdge_;
labelList changedEdges_;
label nChangedEdges_;
//- Number of cyclic patches
label nCyclicPatches_;
//- For every cyclic patch two primitivePatches
PtrList<primitivePatch> cycHalves_;
//- Number of evaluations
label nEvals_;
//- Number of unvisited edges/points
label nUnvisitedPoints_;
label nUnvisitedEdges_;
// Private Member Functions
//- Add value to all elements of labelList
static void offset(const label val, labelList& elems);
//- Adapt pointInfo for leaving domain
void leaveDomain
(
const polyPatch& meshPatch,
const primitivePatch& patch,
const List<label>& patchPointLabels,
List<Type>& pointInfo
) const;
//- Adapt pointInfo for entering domain
void enterDomain
(
const polyPatch& meshPatch,
const primitivePatch& patch,
const List<label>& patchPointLabels,
List<Type>& pointInfo
) const;
//- Transform. Implementation referred to Type
void transform
(
const tensorField& rotTensor,
List<Type>& pointInfo
) const;
//- Updates pointInfo with information from neighbour. Updates all
// statistics.
bool updatePoint
(
const label pointI,
const label neighbourEdgeI,
const Type& neighbourInfo,
const scalar tol,
Type& pointInfo
);
//- Updates pointInfo with information from same point. Updates all
// statistics.
bool updatePoint
(
const label pointI,
const Type& neighbourInfo,
const scalar tol,
Type& pointInfo
);
//- Updates edgeInfo with information from neighbour. Updates all
// statistics.
bool updateEdge
(
const label edgeI,
const label neighbourPointI,
const Type& neighbourInfo,
const scalar tol,
Type& edgeInfo
);
// Parallel, cyclic
//- Has patches of certain type?
template <class PatchType>
label countPatchType() const;
//- Get info on patch points
void getChangedPatchPoints
(
const primitivePatch& patch,
DynamicList<Type>& patchInfo,
DynamicList<label>& patchPoints,
DynamicList<label>& owner,
DynamicList<label>& ownerIndex
) const;
//- Merge data from patch into overall data
void updateFromPatchInfo
(
const polyPatch& meshPatch,
const primitivePatch& patch,
const labelList& owner,
const labelList& ownerIndex,
List<Type>& patchInfo
);
//- Merge data from across processor boundaries
void handleProcPatches();
//- Calculate cyclic halves addressing.
void calcCyclicAddressing();
//- Merge data from across cyclic boundaries
void handleCyclicPatches();
//- Disallow default bitwise copy construct
PointEdgeWave(const PointEdgeWave&);
//- Disallow default bitwise assignment
void operator=(const PointEdgeWave&);
public:
// Static Functions
//- Access to tolerance
static scalar propagationTol()
{
return propagationTol_;
}
//- Change tolerance
static void setPropagationTol(const scalar tol)
{
propagationTol_ = tol;
}
// Constructors
//- Construct from mesh, list of changed points with the Type
// for these points. Gets work arrays to operate on, one of size
// number of mesh points, the other number of mesh edges.
// Iterates until nothing changes or maxIter reached.
// (maxIter can be 0)
PointEdgeWave
(
const polyMesh& mesh,
const labelList& initialPoints,
const List<Type>& initialPointsInfo,
List<Type>& allPointInfo,
List<Type>& allEdgeInfo,
const label maxIter
);
// Destructor
~PointEdgeWave();
// Member Functions
//- Get allPointInfo
const List<Type>& allPointInfo() const
{
return allPointInfo_;
}
//- Get allEdgeInfo
const List<Type>& allEdgeInfo() const
{
return allEdgeInfo_;
}
//- Get number of unvisited edges, i.e. edges that were not (yet)
// reached from walking across mesh. This can happen from
// - not enough iterations done
// - a disconnected mesh
// - a mesh without walls in it
label getUnsetEdges() const;
label getUnsetPoints() const;
//- Copy initial data into allPointInfo_
void setPointInfo
(
const labelList& changedPoints,
const List<Type>& changedPointsInfo
);
//- Propagate from point to edge. Returns total number of edges
// (over all processors) changed.
label pointToEdge();
//- Propagate from edge to point. Returns total number of points
// (over all processors) changed.
label edgeToPoint();
//- Iterate until no changes or maxIter reached. Returns actual
// number of iterations.
label iterate(const label maxIter);
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
/*---------------------------------------------------------------------------*\
Class listUpdateOp Declaration
\*---------------------------------------------------------------------------*/
//- List update operation
template <class Type>
class listUpdateOp
{
public:
void operator()(List<Type>& x, const List<Type>& y) const
{
forAll(x, i)
{
x[i].updatePoint(y[i], PointEdgeWave<Type>::propagationTol());
}
}
};
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository
# include "PointEdgeWave.C"
#endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************ vim: set sw=4 sts=4 et: ************************ //
|