BUGFIX: Illegal use of uninitialised value (backport)
[foam-extend-3.2.git] / src / dynamicMesh / dynamicFvMesh / dynamicTopoFvMesh / fieldMapping / topoMapper.C
blobab69e266616135fbe23b6436cb94740842825f62
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright held by original author
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
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 the
13     Free Software Foundation; either version 2 of the License, or (at your
14     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
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM; if not, write to the Free Software Foundation,
23     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 Class
26     topoMapper
28 Description
29     Implementation of topoMapper
31 Author
32     Sandeep Menon
33     University of Massachusetts Amherst
34     All rights reserved
36 \*----------------------------------------------------------------------------*/
38 #include "topoMapper.H"
39 #include "fluxCorrector.H"
40 #include "topoCellMapper.H"
41 #include "topoSurfaceMapper.H"
42 #include "topoBoundaryMeshMapper.H"
43 #include "fixedValueFvPatchFields.H"
45 namespace Foam
48 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
50 //- Store gradients prior to mesh reset
51 void topoMapper::storeGradients() const
53     storeGradients<scalar>(sGrads_);
54     storeGradients<vector>(vGrads_);
56     if (fvMesh::debug)
57     {
58         Info<< "Registered volScalarFields: " << scalarGrads() << endl;
59         Info<< "Registered volVectorFields: " << vectorGrads() << endl;
60     }
64 //- Store geometric information
65 void topoMapper::storeGeometry() const
67     // Wipe out existing information
68     deleteDemandDrivenData(cellCentresPtr_);
70     vectorField Cv(mesh_.cellCentres());
71     vectorField Cf(mesh_.faceCentres());
73     // Create and map the patch field values
74     label nPatches = mesh_.boundary().size();
76     // Create field parts
77     PtrList<fvPatchField<vector> > volCentrePatches(nPatches);
79     // Over-ride and set all patches to fixedValue
80     for (label patchI = 0; patchI < nPatches; patchI++)
81     {
82         volCentrePatches.set
83         (
84             patchI,
85             new fixedValueFvPatchField<vector>
86             (
87                 mesh_.boundary()[patchI],
88                 DimensionedField<vector, volMesh>::null()
89             )
90         );
92         // Slice field to patch (forced assignment)
93         volCentrePatches[patchI] ==
94         (
95             mesh_.boundaryMesh()[patchI].patchSlice(Cf)
96         );
97     }
99     // Set the cell-centres pointer.
100     cellCentresPtr_ =
101     (
102         new volVectorField
103         (
104             IOobject
105             (
106                 "cellCentres",
107                 mesh_.time().timeName(),
108                 mesh_,
109                 IOobject::NO_READ,
110                 IOobject::NO_WRITE,
111                 false
112             ),
113             mesh_,
114             dimLength,
115             SubField<vector>(Cv, mesh_.nCells()),
116             volCentrePatches
117         )
118     );
121 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
123 //- Construct from mesh and dictionary
124 topoMapper::topoMapper
126     const fvMesh& mesh,
127     const dictionary& dict
130     mesh_(mesh),
131     dict_(dict),
132     cellMap_(NULL),
133     surfaceMap_(NULL),
134     boundaryMap_(NULL),
135     fluxCorrector_(fluxCorrector::New(mesh, dict)),
136     cellCentresPtr_(NULL)
140 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * *  //
142 topoMapper::~topoMapper()
144     clear();
147 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
149 //- Return reference to the mesh
150 const fvMesh& topoMapper::mesh() const
152     return mesh_;
156 //- Return reference to objectRegistry storing fields.
157 const objectRegistry& topoMapper::thisDb() const
159     return mesh_;
163 //- Set mapping information
164 void topoMapper::setMapper(const mapPolyMesh& mpm) const
166     if
167     (
168         cellMap_.valid() ||
169         surfaceMap_.valid() ||
170         boundaryMap_.valid()
171     )
172     {
173         FatalErrorIn
174         (
175             "void topoMapper::setMapper() const"
176         ) << nl << " Mapper has already been set. "
177           << abort(FatalError);
178     }
180     // Set pointers
181     cellMap_.set(new topoCellMapper(mpm, *this));
182     surfaceMap_.set(new topoSurfaceMapper(mpm, *this));
183     boundaryMap_.set(new topoBoundaryMeshMapper(mesh(), mpm, *this));
187 //- Set face weighting information
188 void topoMapper::setFaceWeights
190     const Xfer<List<scalarField> >& weights,
191     const Xfer<List<vectorField> >& centres
192 ) const
194     faceWeights_.transfer(weights());
195     faceCentres_.transfer(centres());
199 //- Set cell weighting information
200 void topoMapper::setCellWeights
202     const Xfer<List<scalarField> >& weights,
203     const Xfer<List<vectorField> >& centres
204 ) const
206     cellWeights_.transfer(weights());
207     cellCentres_.transfer(centres());
211 //- Set cell / patch offset information
212 void topoMapper::setOffsets
214     const labelList& cellSizes,
215     const labelList& cellStarts,
216     const labelList& faceSizes,
217     const labelList& faceStarts,
218     const labelListList& patchSizes,
219     const labelListList& patchStarts
220 ) const
222     cellSizes_ = cellSizes;
223     cellStarts_ = cellStarts;
224     faceSizes_ = faceSizes;
225     faceStarts_ = faceStarts;
226     patchSizes_ = patchSizes;
227     patchStarts_ = patchStarts;
231 //- Fetch face weights
232 const List<scalarField>& topoMapper::faceWeights() const
234     return faceWeights_;
238 //- Fetch cell weights
239 const List<scalarField>& topoMapper::cellWeights() const
241     return cellWeights_;
245 //- Fetch face centres
246 const List<vectorField>& topoMapper::faceCentres() const
248     return faceCentres_;
252 //- Fetch cell centres
253 const List<vectorField>& topoMapper::cellCentres() const
255     return cellCentres_;
259 //- Fetch cell sizes
260 const labelList& topoMapper::cellSizes() const
262     return cellSizes_;
266 //- Fetch face sizes
267 const labelList& topoMapper::faceSizes() const
269     return faceSizes_;
273 //- Fetch patch sizes
274 const labelListList& topoMapper::patchSizes() const
276     return patchSizes_;
280 //- Fetch cell starts
281 const labelList& topoMapper::cellStarts() const
283     return cellStarts_;
287 //- Fetch face starts
288 const labelList& topoMapper::faceStarts() const
290     return faceStarts_;
294 //- Fetch patch starts
295 const labelListList& topoMapper::patchStarts() const
297     return patchStarts_;
301 //- Store mesh information for the mapping stage
302 void topoMapper::storeMeshInformation() const
304     // Store field-gradients
305     storeGradients();
307     // Store geometry
308     storeGeometry();
311 //- Return non-const access to cell centres
312 volVectorField& topoMapper::volCentres() const
314     if (!cellCentresPtr_)
315     {
316         FatalErrorIn
317         (
318             "const vectorField& topoMapper::volCentres() const"
319         ) << nl << " Pointer has not been set. "
320           << abort(FatalError);
321     }
323     return *cellCentresPtr_;
327 //- Return stored cell centre information
328 const vectorField& topoMapper::internalCentres() const
330     if (!cellCentresPtr_)
331     {
332         FatalErrorIn
333         (
334             "const vectorField& topoMapper::internalCentres() const"
335         ) << nl << " Pointer has not been set. "
336           << abort(FatalError);
337     }
339     return *cellCentresPtr_;
343 //- Return stored patch centre information
344 const vectorField& topoMapper::patchCentres(const label i) const
346     if (!cellCentresPtr_)
347     {
348         FatalErrorIn
349         (
350             "const vectorField& topoMapper::patchCentres"
351             "(const label i) const"
352         ) << nl << " Pointer has not been set. index: " << i
353           << abort(FatalError);
354     }
356     return (*cellCentresPtr_).boundaryField()[i];
360 //- Return names of stored scalar gradients
361 const wordList topoMapper::scalarGrads() const
363     return sGrads_.toc();
367 //- Return names of stored vector gradients
368 const wordList topoMapper::vectorGrads() const
370     return vGrads_.toc();
374 //- Fetch the gradient field (template specialisation)
375 template <>
376 volVectorField& topoMapper::gradient(const word& name) const
378     if (!sGrads_.found(name))
379     {
380         FatalErrorIn
381         (
382             "volVectorField& topoMapper::gradient(const word& name) const"
383         ) << nl << " Gradient for: " << name
384           << " has not been stored."
385           << abort(FatalError);
386     }
388     return sGrads_[name]();
392 //- Fetch the gradient field (template specialisation)
393 template <>
394 volTensorField& topoMapper::gradient(const word& name) const
396     if (!vGrads_.found(name))
397     {
398         FatalErrorIn
399         (
400             "volTensorField& topoMapper::gradient(const word& name) const"
401         ) << nl << " Gradient for: " << name
402           << " has not been stored."
403           << abort(FatalError);
404     }
406     return vGrads_[name]();
410 //- Correct fluxes after topology changes, if required
411 void topoMapper::correctFluxes() const
413     if (surfaceFluxCorrector().required())
414     {
415         // Supply a list of inserted faces for interpolation
416         surfaceFluxCorrector().interpolateFluxes
417         (
418             surfaceMap().insertedObjectLabels()
419         );
421         // Update fluxes
422         surfaceFluxCorrector().updateFluxes();
423     }
427 //- Return volume mapper
428 const topoCellMapper& topoMapper::volMap() const
430     if (!cellMap_.valid())
431     {
432         FatalErrorIn
433         (
434             "const topoCellMapper& topoMapper::volMap() const"
435         ) << nl << " Volume mapper has not been set. "
436           << abort(FatalError);
437     }
439     return cellMap_();
443 //- Return surface mapper
444 const topoSurfaceMapper& topoMapper::surfaceMap() const
446     if (!surfaceMap_.valid())
447     {
448         FatalErrorIn
449         (
450             "const topoSurfaceMapper& topoMapper::surfaceMap() const"
451         ) << nl << " Surface mapper has not been set. "
452           << abort(FatalError);
453     }
455     return surfaceMap_();
459 //- Return boundary mapper
460 const topoBoundaryMeshMapper& topoMapper::boundaryMap() const
462     if (!boundaryMap_.valid())
463     {
464         FatalErrorIn
465         (
466             "const topoBoundaryMeshMapper& topoMapper::boundaryMap() const"
467         ) << nl << " Boundary mapper has not been set. "
468           << abort(FatalError);
469     }
471     return boundaryMap_();
475 //- Return flux-corrector
476 const fluxCorrector& topoMapper::surfaceFluxCorrector() const
478     if (!fluxCorrector_.valid())
479     {
480         FatalErrorIn
481         (
482             "const fluxCorrector& topoMapper::surfaceFluxCorrector() const"
483         ) << nl << " fluxCorrector has not been set. "
484           << abort(FatalError);
485     }
487     return fluxCorrector_();
491 //- Clear out member data
492 void topoMapper::clear() const
494     // Clear out mappers
495     cellMap_.clear();
496     surfaceMap_.clear();
497     boundaryMap_.clear();
499     // Clear stored gradients
500     sGrads_.clear();
501     vGrads_.clear();
503     // Wipe out geomtry information
504     deleteDemandDrivenData(cellCentresPtr_);
506     // Clear maps
507     faceWeights_.clear();
508     cellWeights_.clear();
510     faceCentres_.clear();
511     cellCentres_.clear();
513     // Clear sizes / offsets
514     cellSizes_.clear();
515     cellStarts_.clear();
517     faceSizes_.clear();
518     faceStarts_.clear();
520     patchSizes_.clear();
521     patchStarts_.clear();
525 // * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
526 void topoMapper::operator=(const topoMapper& rhs)
528     // Check for assignment to self
529     if (this == &rhs)
530     {
531         FatalErrorIn
532         (
533             "topoMapper::operator=(const topoMapper&)"
534         )
535             << "Attempted assignment to self"
536             << abort(FatalError);
537     }
540 } // End namespace Foam
542 // ************************************************************************* //