1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
7 -------------------------------------------------------------------------------
9 This file is part of OpenFOAM.
11 OpenFOAM is free software: you can redistribute it and/or modify it
12 under the terms of the GNU General Public License as published by
13 the Free Software Foundation, either version 3 of the License, or
14 (at your option) any later version.
16 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 You should have received a copy of the GNU General Public License
22 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
28 Given a displacement moves the mesh by scaling the displacement back
29 until there are no more mesh errors.
31 Holds displacement field (read upon construction since need boundary
32 conditions) and scaling factor and optional patch number on which to
33 scale back displacement.
37 // Construct iterative mesh mover.
38 motionSmoother meshMover(mesh, labelList(1, patchI));
40 // Set desired displacement:
41 meshMover.displacement() = ..
43 for (label iter = 0; iter < maxIter; iter++)
45 if (meshMover.scaleMesh(true))
47 Info<< "Successfully moved mesh" << endl;
54 - Shared points (parallel): a processor can have points which are part of
55 pp on another processor but have no pp itself (i.e. it has points
56 and/or edges but no faces of pp). Hence we have to be careful when e.g.
57 synchronising displacements that the value from the processor which has
58 faces of pp get priority. This is currently handled in setDisplacement
59 by resetting the internal displacement to zero before doing anything
60 else. The combine operator used will give preference to non-zero
63 - Various routines take baffles. These are sets of boundary faces that
64 are treated as a single internal face. This is a hack used to apply
65 movement to internal faces.
67 - Mesh constraints are looked up from the supplied dictionary. (uses
72 motionSmootherTemplates.C
74 \*---------------------------------------------------------------------------*/
76 #ifndef motionSmoother_H
77 #define motionSmoother_H
79 #include <OpenFOAM/pointFields.H>
80 #include <OpenFOAM/HashSet.H>
81 #include <OpenFOAM/PackedBoolList.H>
82 #include <OpenFOAM/indirectPrimitivePatch.H>
83 #include <OpenFOAM/className.H>
84 #include <meshTools/twoDPointCorrector.H>
86 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
91 class polyMeshGeometry;
94 /*---------------------------------------------------------------------------*\
95 Class motionSmoother Declaration
96 \*---------------------------------------------------------------------------*/
102 //- To synchronise displacements. We want max displacement since
103 // this is what is specified on pp and internal mesh will have
104 // zero displacement.
110 void operator()(vector& x, const vector& y) const
112 for (direction i = 0; i < vector::nComponents; i++)
114 scalar magX = mag(x[i]);
115 scalar magY = mag(y[i]);
121 else if (magX == magY)
135 //- Reference to polyMesh. Non-const since we move mesh.
138 //- Reference to pointMesh
141 //- Reference to face subset of all adaptPatchIDs
142 indirectPrimitivePatch& pp_;
144 //- Indices of fixedValue patches that we're allowed to modify the
146 const labelList adaptPatchIDs_;
149 // Smoothing and checking parameters
150 dictionary paramDict_;
154 //- Displacement field
155 pointVectorField displacement_;
157 //- Scale factor for displacement
158 pointScalarField scale_;
160 //- Starting mesh position
161 pointField oldPoints_;
163 //- Is mesh point on boundary or not
164 PackedBoolList isInternalPoint_;
166 //- Is edge master (always except if on coupled boundary and on
168 PackedBoolList isMasterEdge_;
170 //- 2-D motion corrector
171 twoDPointCorrector twoDCorrector_;
173 // Muli-patch constraints (from pointPatchInterpolation)
175 labelList patchPatchPointConstraintPoints_;
176 tensorField patchPatchPointConstraintTensors_;
179 // Private Member Functions
181 //- Average of connected points.
182 template <class Type>
183 tmp<GeometricField<Type, pointPatchField, pointMesh> > avg
185 const GeometricField<Type, pointPatchField, pointMesh>& fld,
186 const scalarField& edgeWeight,
187 const bool separation
190 //- Check constraints
192 static void checkConstraints
194 GeometricField<Type, pointPatchField, pointMesh>&
197 //- Multi-patch constraints
199 void applyCornerConstraints
201 GeometricField<Type, pointPatchField, pointMesh>&
204 //- Test synchronisation of pointField
205 template<class Type, class CombineOp>
209 const CombineOp& cop,
211 const bool separation,
215 //- Assemble tensors for multi-patch constraints
216 void makePatchPatchAddressing();
218 static void checkFld(const pointScalarField&);
220 //- Get points used by given faces
221 labelHashSet getPoints(const labelHashSet&) const;
223 //- explicit smoothing and min on all affected internal points
226 const PackedBoolList& isAffectedPoint,
227 const pointScalarField& fld,
228 pointScalarField& newFld
231 //- same but only on selected points (usually patch points)
234 const PackedBoolList& isAffectedPoint,
235 const labelList& meshPoints,
236 const pointScalarField& fld,
237 pointScalarField& newFld
240 //- Scale certain (internal) points of a field
243 const labelHashSet& pointLabels,
248 //- As above but points have to be in meshPoints as well
249 // (usually to scale patch points)
252 const labelList& meshPoints,
253 const labelHashSet& pointLabels,
258 //- Helper function. Is point internal?
259 bool isInternalPoint(const label pointI) const;
261 //- Given a set of faces that cause smoothing and a number of
262 // iterations determine the maximum set of points who are affected
263 // and the accordingly affected faces.
264 void getAffectedFacesAndPoints
266 const label nPointIter,
267 const faceSet& wrongFaces,
269 labelList& affectedFaces,
270 PackedBoolList& isAffectedPoint
273 //- Disallow default bitwise copy construct
274 motionSmoother(const motionSmoother&);
276 //- Disallow default bitwise assignment
277 void operator=(const motionSmoother&);
282 ClassName("motionSmoother");
286 //- Construct from mesh, patches to work on and smoothing parameters.
287 // Reads displacement field (only boundary conditions used)
292 indirectPrimitivePatch& pp, // 'outside' points
293 const labelList& adaptPatchIDs, // patches forming 'outside'
294 const dictionary& paramDict
297 //- Construct from mesh, patches to work on and smoothing parameters and
298 // displacementfield (only boundary conditions used)
302 indirectPrimitivePatch& pp, // 'outside' points
303 const labelList& adaptPatchIDs, // patches forming 'outside'
304 const pointVectorField&,
305 const dictionary& paramDict
318 //- Reference to mesh
319 const polyMesh& mesh() const;
321 //- Reference to pointMesh
322 const pointMesh& pMesh() const;
324 //- Reference to patch
325 const indirectPrimitivePatch& patch() const;
327 //- Patch labels that are being adapted
328 const labelList& adaptPatchIDs() const;
330 const dictionary& paramDict() const;
332 //- Reference to displacement field
333 pointVectorField& displacement();
335 //- Reference to displacement field
336 const pointVectorField& displacement() const;
338 //- Reference to scale field
339 const pointScalarField& scale() const;
341 //- Starting mesh position
342 const pointField& oldPoints() const;
344 //- Return reference to 2D point motion correction
345 twoDPointCorrector& twoDCorrector()
347 return twoDCorrector_;
354 //- Take over existing mesh position.
357 //- Set displacement field from displacement on patch points.
358 // Modify provided displacement to be consistent with actual
359 // boundary conditions on displacement. Note: resets the
360 // displacement to be 0 on coupled patches beforehand
361 // to make sure shared points
362 // partially on pp (on some processors) and partially not
363 // (on other processors) get the value from pp.
364 void setDisplacement(pointField& patchDisp);
366 //- Special correctBoundaryConditions which evaluates fixedValue
367 // patches first so they get overwritten with any constraint
369 void correctBoundaryConditions(pointVectorField&) const;
371 //- Move mesh. Does 2D correction (modifies passed pointField) and
372 // polyMesh::movePoints. Returns swept volumes.
373 tmp<scalarField> movePoints(pointField&);
375 //- Set the errorReduction (by how much to scale the displacement
376 // at error locations) parameter. Returns the old value.
377 // Set to 0 (so revert to old mesh) grows out one cell layer
379 scalar setErrorReduction(const scalar);
381 //- Move mesh with given scale. Return true if mesh ok or has
382 // less than nAllow errors, false
383 // otherwise and locally update scale. Smoothmesh=false means only
384 // patch points get moved.
385 // Parallel ok (as long as displacement field is consistent
389 labelList& checkFaces,
390 const bool smoothMesh = true,
391 const label nAllow = 0
394 //- Move mesh (with baffles) with given scale.
397 labelList& checkFaces,
398 const List<labelPair>& baffles,
399 const bool smoothMesh = true,
400 const label nAllow = 0
403 //- Move mesh with externally provided mesh constraints
406 labelList& checkFaces,
407 const List<labelPair>& baffles,
408 const dictionary& paramDict,
409 const dictionary& meshQualityDict,
410 const bool smoothMesh = true,
411 const label nAllow = 0
417 //- Check mesh with mesh settings in dict. Collects incorrect faces
418 // in set. Returns true if one or more faces in error.
420 static bool checkMesh
423 const polyMesh& mesh,
424 const dictionary& dict,
425 labelHashSet& wrongFaces
428 //- Check (subset of mesh) with mesh settings in dict.
429 // Collects incorrect faces in set. Returns true if one
430 // or more faces in error. Parallel ok.
431 static bool checkMesh
434 const polyMesh& mesh,
435 const dictionary& dict,
436 const labelList& checkFaces,
437 labelHashSet& wrongFaces
440 //- Check (subset of mesh including baffles) with mesh settings
441 // in dict. Collects incorrect faces in set. Returns true if one
442 // or more faces in error. Parallel ok.
443 static bool checkMesh
446 const polyMesh& mesh,
447 const dictionary& dict,
448 const labelList& checkFaces,
449 const List<labelPair>& baffles,
450 labelHashSet& wrongFaces
453 //- Check part of mesh with mesh settings in dict.
454 // Collects incorrect faces in set. Returns true if one or
455 // more faces in error. Parallel ok.
456 static bool checkMesh
459 const dictionary& dict,
460 const polyMeshGeometry&,
461 const labelList& checkFaces,
462 labelHashSet& wrongFaces
465 //- Check part of mesh including baffles with mesh settings in dict.
466 // Collects incorrect faces in set. Returns true if one or
467 // more faces in error. Parallel ok.
468 static bool checkMesh
471 const dictionary& dict,
472 const polyMeshGeometry&,
473 const labelList& checkFaces,
474 const List<labelPair>& baffles,
475 labelHashSet& wrongFaces
478 // Helper functions to manipulate displacement vector.
480 //- Fully explicit smoothing of internal points with varying
482 template <class Type>
485 const GeometricField<Type, pointPatchField, pointMesh>& fld,
486 const scalarField& edgeWeight,
487 const bool separation,
488 GeometricField<Type, pointPatchField, pointMesh>& newFld
494 void motionSmoother::applyCornerConstraints<scalar>
496 GeometricField<scalar, pointPatchField, pointMesh>& pf
500 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
502 } // End namespace Foam
504 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
507 # include "motionSmootherTemplates.C"
510 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
514 // ************************ vim: set sw=4 sts=4 et: ************************ //