1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 2008-2009 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 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
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 \*----------------------------------------------------------------------------*/
27 #include "referredCell.H"
28 #include "interactionLists.H"
33 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
35 void referredCell::setConstructionData
38 const label sourceCell
43 const labelList& points = mesh.cellPoints()[sourceCell];
45 vectorList sourceCellVertices(points.size());
47 forAll(sourceCellVertices, sCV)
49 sourceCellVertices[sCV] = mesh.points()[points[sCV]];
52 vertexPositions_ = referPositions(sourceCellVertices);
57 const labelList& edges = mesh.cellEdges()[sourceCell];
59 edgeList sourceCellEdges(edges.size());
61 forAll(sourceCellEdges, sCE)
63 sourceCellEdges[sCE] = mesh.edges()[edges[sCE]];
66 locallyMapEdgeList(points, sourceCellEdges);
71 labelList faces(mesh.cells()[sourceCell]);
73 vectorList sourceCellFaceCentres(faces.size());
75 vectorList sourceCellFaceAreas(faces.size());
77 labelListList sourceCellFaces(faces.size());
81 sourceCellFaces[f] = mesh.faces()[faces[f]];
83 sourceCellFaceCentres[f] = mesh.faceCentres()[faces[f]];
85 sourceCellFaceAreas[f] = mesh.faceAreas()[faces[f]];
88 locallyMapFaceList(points, sourceCellFaces);
90 faceCentres_ = referPositions(sourceCellFaceCentres);
92 faceAreas_ = rotateVectors(sourceCellFaceAreas);
96 void referredCell::locallyMapEdgeList
98 const labelList& points,
99 const edgeList& sourceCellEdges
102 edges_.setSize(sourceCellEdges.size());
104 forAll(sourceCellEdges, sCE)
106 const edge& e(sourceCellEdges[sCE]);
108 edges_[sCE].start() = findIndex(points, e.start());
110 edges_[sCE].end() = findIndex(points, e.end());
114 edges_[sCE].start() == -1
115 || edges_[sCE].end() == -1
118 FatalErrorIn("Foam::referredCell::locallyMapEdgeList")
119 << "edgeList and points labelList for "
120 << "referred cell do not match: "
121 << nl << "points: " << points
122 << nl << "egdes: " << sourceCellEdges
123 << abort(FatalError);
129 void referredCell::locallyMapFaceList
131 const labelList& points,
132 const labelListList& sourceCellFaces
135 faces_.setSize(sourceCellFaces.size());
137 forAll(sourceCellFaces, sCF)
139 const labelList& sourceCellFace(sourceCellFaces[sCF]);
141 labelList& localFace(faces_[sCF]);
143 localFace.setSize(sourceCellFace.size());
145 forAll(sourceCellFace, p)
147 localFace[p] = findIndex(points, sourceCellFace[p]);
149 if (localFace[p] == -1)
151 FatalErrorIn("Foam::referredCell::locallyMapEdgeList")
152 << "edgeList and points labelList for "
153 << "referred cell do not match: "
154 << nl << "points: " << points
155 << nl << "faces: " << sourceCellFaces
156 << abort(FatalError);
163 vector referredCell::referPosition(const vector& positionToRefer)
165 return offset_ + (rotation_ & positionToRefer);
169 vectorList referredCell::referPositions(const vectorList& positionsToRefer)
171 return offset_ + (rotation_ & positionsToRefer);
175 vector referredCell::rotateVector(const vector& vectorToRotate)
177 return rotation_ & vectorToRotate;
181 vectorList referredCell::rotateVectors(const vectorList& vectorsToRotate)
183 return rotation_ & vectorsToRotate;
187 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
189 referredCell::referredCell()
191 DynamicList<referredMolecule>(),
195 offset_(vector::zero),
200 referredCell::referredCell
202 const polyMesh& mesh,
203 const label sourceProc,
204 const label sourceCell,
205 const vector& offset,
206 const tensor& rotation
209 DynamicList<referredMolecule>(),
210 sourceProc_(sourceProc),
211 sourceCell_(sourceCell),
215 setConstructionData(mesh, sourceCell);
219 referredCell::referredCell
221 const label sourceProc,
222 const label sourceCell,
223 const vectorList& vertexPositions,
224 const edgeList& localEdges,
225 const labelListList& localFaces,
226 const vectorList& faceCentres,
227 const vectorList& faceAreas,
228 const vector& offset,
229 const tensor& rotation
232 DynamicList<referredMolecule>(),
233 sourceProc_(sourceProc),
234 sourceCell_(sourceCell),
240 // Supplied vertexPositions, faceCentres and faceAreas are of the
241 // "original" cell, and need to be transformed to the referred
242 // locations on construction
244 vertexPositions_ = referPositions(vertexPositions);
246 faceCentres_ = referPositions(faceCentres);
248 faceAreas_ = rotateVectors(faceAreas);
252 referredCell::referredCell
254 const polyMesh& mesh,
255 const label sourceProc,
256 const label sourceCell,
263 DynamicList<referredMolecule>(),
264 sourceProc_(sourceProc),
265 sourceCell_(sourceCell)
267 // It is assumed that the vectors originating from the faces being referred
268 // here are correct periodic faces - i.e. they have the same area etc.
270 vector nA = -nS/mag(nS);
271 vector nB = nD/mag(nD);
273 rotation_ = rotationTensor(nA, nB);
275 offset_ = cD - (rotation_ & cS);
277 // Allow sourceCell = -1 to create a dummy referredCell
278 // to obtain the transformation
282 setConstructionData(mesh, sourceCell);
287 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
289 referredCell::~referredCell()
293 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
295 referredCell referredCell::reRefer
303 vector nA = -nS/mag(nS);
304 vector nB = nD/mag(nD);
306 tensor newRotation = rotationTensor(nA, nB);
308 vector newOffset = cD - (newRotation & cS);
310 tensor reReferredRotation = newRotation & rotation_;
312 vector reReferredOffset = newOffset + (newRotation & offset_);
318 rotation_.T() & (vertexPositions_ - offset_),
321 rotation_.T() & (faceCentres_ - offset_),
322 rotation_.T() & (faceAreas_),
329 vector referredCell::referPosition(const vector& positionToRefer) const
331 return offset_ + (rotation_ & positionToRefer);
335 vectorList referredCell::referPosition
337 const vectorList& positionsToRefer
340 return offset_ + (rotation_ & positionsToRefer);
344 vector referredCell::rotateVector(const vector& vectorToRotate) const
346 return rotation_ & vectorToRotate;
350 vectorList referredCell::rotateVectors(const vectorList& vectorsToRotate) const
352 return rotation_ & vectorsToRotate;
356 void referredCell::referInMols(const List<referredMolecule>& incomingMols)
360 forAll(incomingMols, iM)
366 incomingMols[iM].id(),
369 incomingMols[iM].position()
373 incomingMols[iM].sitePositions()
383 bool referredCell::duplicate(const referredCell& refCellDupl) const
387 sourceProc_ == refCellDupl.sourceProc()
388 && sourceCell_ == refCellDupl.sourceCell()
389 && mag(offset_ - refCellDupl.offset()) < interactionLists::transTol
394 bool referredCell::duplicate(const label procNo,const label nCells) const
398 sourceProc_ == procNo
399 && sourceCell_ < nCells
400 && mag(offset_) < interactionLists::transTol
405 // * * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * //
407 Istream& operator>>(Istream& is, referredCell& rC)
412 >> rC.vertexPositions_
420 is.check("Istream& operator<<(Istream& f, const referredCell& rC");
426 Ostream& operator<<(Ostream& os, const referredCell& rC)
429 os << rC.sourceProc()
430 << token::SPACE << rC.sourceCell()
431 << token::SPACE << rC.vertexPositions()
432 << token::SPACE << rC.edges()
433 << token::SPACE << rC.faces()
434 << token::SPACE << rC.faceCentres()
435 << token::SPACE << rC.faceAreas()
436 << token::SPACE << rC.offset()
437 << token::SPACE << rC.rotation();
439 os.check("Ostream& operator<<(Ostream& f, const referredCell& rC");
445 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
447 } // End namespace Foam
449 // ************************************************************************* //