Fix tutorials: coupled/conjugateHeatFoam/conjugateCavity: fix Allrun file
[OpenFOAM-1.6-ext.git] / src / meshTools / sets / cellSources / rotatedBoxToCell / rotatedBoxToCell.C
blob6fc702781e28d678988323a547d7e1231ec582de
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 \*---------------------------------------------------------------------------*/
27 #include "rotatedBoxToCell.H"
28 #include "polyMesh.H"
29 #include "cellModeller.H"
31 #include "addToRunTimeSelectionTable.H"
33 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
35 namespace Foam
38 defineTypeNameAndDebug(rotatedBoxToCell, 0);
40 addToRunTimeSelectionTable(topoSetSource, rotatedBoxToCell, word);
42 addToRunTimeSelectionTable(topoSetSource, rotatedBoxToCell, istream);
47 Foam::topoSetSource::addToUsageTable Foam::rotatedBoxToCell::usage_
49     rotatedBoxToCell::typeName,
50     "\n    Usage: rotatedBoxToCell (originx originy originz)"
51     " (ix iy iz) (jx jy jz) (kx ky kz)\n\n"
52     "    Select all cells with cellCentre within parallelopiped\n\n"
56 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
58 void Foam::rotatedBoxToCell::combine(topoSet& set, const bool add) const
60     // Define a cell for the box
61     pointField boxPoints(8);
62     boxPoints[0] = origin_;
63     boxPoints[1] = origin_ + i_;
64     boxPoints[2] = origin_ + i_ + j_;
65     boxPoints[3] = origin_ + j_;
66     boxPoints[4] = origin_ + k_;
67     boxPoints[5] = origin_ + k_ + i_;
68     boxPoints[6] = origin_ + k_ + i_ + j_;
69     boxPoints[7] = origin_ + k_ + j_;
71     labelList boxVerts(8);
72     forAll(boxVerts, i)
73     {
74         boxVerts[i] = i;
75     }
77     const cellModel& hex = *(cellModeller::lookup("hex"));
79     // Get outwards pointing faces.
80     faceList boxFaces(cellShape(hex, boxVerts).faces());
82     // Precalculate normals
83     vectorField boxFaceNormals(boxFaces.size());
84     forAll(boxFaces, i)
85     {
86         boxFaceNormals[i] = boxFaces[i].normal(boxPoints);
88         Pout<< "Face:" << i << " position:" << boxFaces[i].centre(boxPoints)
89             << " normal:" << boxFaceNormals[i] << endl;
90     }
92     // Check whether cell centre is inside all faces of box.
94     const pointField& ctrs = mesh_.cellCentres();
96     forAll(ctrs, cellI)
97     {
98         bool inside = true;
100         forAll(boxFaces, i)
101         {
102             const face& f = boxFaces[i];
104             if (((ctrs[cellI] - boxPoints[f[0]]) & boxFaceNormals[i]) > 0)
105             {
106                 inside = false;
107                 break;
108             }
109         }
111         if (inside)
112         {
113             addOrDelete(set, cellI, add);
114         }
115     }
119 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
121 // Construct from components
122 Foam::rotatedBoxToCell::rotatedBoxToCell
124     const polyMesh& mesh,
125     const vector& origin,
126     const vector& i,
127     const vector& j,
128     const vector& k
131     topoSetSource(mesh),
132     origin_(origin_),
133     i_(i),
134     j_(j),
135     k_(k)
139 // Construct from dictionary
140 Foam::rotatedBoxToCell::rotatedBoxToCell
142     const polyMesh& mesh,
143     const dictionary& dict
146     topoSetSource(mesh),
147     origin_(dict.lookup("origin")),
148     i_(dict.lookup("i")),
149     j_(dict.lookup("j")),
150     k_(dict.lookup("k"))
154 // Construct from Istream
155 Foam::rotatedBoxToCell::rotatedBoxToCell(const polyMesh& mesh, Istream& is)
157     topoSetSource(mesh),
158     origin_(is),
159     i_(is),
160     j_(is),
161     k_(is)
165 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
167 Foam::rotatedBoxToCell::~rotatedBoxToCell()
171 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
173 void Foam::rotatedBoxToCell::applyToSet
175     const topoSetSource::setAction action,
176     topoSet& set
177 ) const
179     if ((action == topoSetSource::NEW) || (action == topoSetSource::ADD))
180     {
181         Info<< "    Adding cells with center within rotated box " << endl;
183         combine(set, true);
184     }
185     else if (action == topoSetSource::DELETE)
186     {
187         Info<< "    Removing cells with center within rotated box " << endl;
189         combine(set, false);
190     }
194 // ************************************************************************* //