1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | cfMesh: A library for mesh generation
5 \\ / A nd | Author: Franjo Juretic (franjo.juretic@c-fields.com)
6 \\/ M anipulation | Copyright (C) Creative Fields, Ltd.
7 -------------------------------------------------------------------------------
9 This file is part of cfMesh.
11 cfMesh 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 3 of the License, or (at your
14 option) any later version.
16 cfMesh 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 cfMesh. If not, see <http://www.gnu.org/licenses/>.
26 \*---------------------------------------------------------------------------*/
28 #include "tetCreatorOctree.H"
29 #include "demandDrivenData.H"
30 #include "meshOctree.H"
34 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
39 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
41 void tetCreatorOctree::createTetsAroundSplitEdges()
43 Info << "Creating tets around split edges " << endl;
45 const labelList& cubeLabel = *cubeLabelPtr_;
46 const meshOctree& octree = octreeCheck_.octree();
47 const VRWGraph& nodeLabels = octreeCheck_.nodeLabels();
48 const FRWGraph<label, 8>& pLeaves = octreeCheck_.nodeLeaves();
49 const VRWGraph& subNodeLabels = *subNodeLabelsPtr_;
50 const VRWGraph& faceCentreLabel = *faceCentreLabelPtr_;
53 Info << "Number of octree nodes " << octreeCheck_.numberOfNodes() << endl;
56 //- find maximum refinement level of octree leaves attached to each vertex
57 List<direction> nodeLevel(octreeCheck_.numberOfNodes());
59 forAll(pLeaves, nodeI)
63 for(label plI=0;plI<8;++plI)
65 const label leafI = pLeaves(nodeI, plI);
70 level = Foam::max(level, octree.returnLeaf(leafI).level());
73 nodeLevel[nodeI] = level;
76 //- start creating tets around split edges
77 label helpNodes[2][8];
80 forAllReverse(sortedLeaves_, levelI)
82 const labelLongList& curLevelLeaves = sortedLeaves_[levelI];
84 const direction level = direction(levelI);
86 forAll(curLevelLeaves, leafI)
88 const label curLabel = curLevelLeaves[leafI];
90 if( cubeLabel[curLabel] == -1 )
93 //- start checking edges
94 for(label eI=0;eI<12;++eI)
100 meshOctreeCubeCoordinates::edgeNodes_[eI][0]
106 meshOctreeCubeCoordinates::edgeNodes_[eI][1]
109 if( (nodeLevel[start] == level) && (nodeLevel[end] == level) )
112 //- the edge has at least one vertex at different ref level
115 FixedList<label, 4> edgeCubes;
116 const label fI = 2*(eI/4)+1;
118 const label* fNodes =
119 meshOctreeCubeCoordinates::faceNodes_[fI];
121 //- store octree leaves at this edge
122 //- they are all adjacent to the start point
123 for(label i=0;i<4;++i)
124 edgeCubes[i] = pLeaves(start, fNodes[i]);
127 Info << "Cube " << curLabel << " has nodes ";
128 forAllRow(nodeLabels, curLabel, i)
129 Info << nodeLabels(curLabel, i) << " ";
131 Info << "Creating tets around edge " << eI << endl;
132 Info << "Edge nodes are " << start << " and " << end << endl;
133 Info << "Edge cubes " << edgeCubes << endl;
138 const label cLabel = edgeCubes[i];
142 (cLabel < curLabel) ||
143 (octree.returnLeaf(cLabel).level() != level)
151 Info << "Edge cube " << i << " is " << cLabel << endl;
154 for(label j=0;j<8;++j)
156 if( nodeLabels(cLabel,j) == start )
158 if( subNodeLabels.sizeOfRow(cLabel) != 0 )
160 helpNodes[0][i] = subNodeLabels(cLabel,j);
164 helpNodes[0][i] = -1;
167 helpNodes[0][i+4] = cubeLabel[cLabel];
170 if( nodeLabels(cLabel, j) == end )
172 if( subNodeLabels.sizeOfRow(cLabel) != 0 )
174 helpNodes[1][i+4] = subNodeLabels(cLabel,j);
178 helpNodes[1][i+4] = -1;
181 helpNodes[1][i] = cubeLabel[cLabel];
185 if( faceCentreLabel.sizeOfRow(cLabel) != 0 )
187 const label helpFace = eI/4;
193 faceCentreHelper_[helpFace][i]
206 for(label n=0;n<4;++n)
208 Info << "Face centre " << n << " "
209 << faceCentres[n] << endl;
210 Info << "Hex 0 " << helpNodes[0][n] << " and "
211 << helpNodes[0][n+4] << endl;
212 Info << "Hex 1 " << helpNodes[1][n] << " and "
213 << helpNodes[1][n+4] << endl;
217 if( nodeLevel[start] > level )
219 for(label k=0;k<4;++k)
228 helpNodes[0][(k+1)%4],
240 helpNodes[0][(k+1)%4],
262 faceCentres[(k+3)%4],
272 for(label k=0;k<4;++k)
278 faceCentres[(k+3)%4],
298 if( nodeLevel[end] > level )
300 for(label k=0;k<4;++k)
309 helpNodes[1][((k+1)%4)+4],
321 helpNodes[1][((k+1)%4)+4],
343 faceCentres[(k+3)%4],
353 for(label k=0;k<4;++k)
359 faceCentres[(k+3)%4],
379 //- add the edge centre
380 tetPoints_.append(0.5 * (tetPoints_[start] + tetPoints_[end]));
386 Info << "Created tets " << tets_ << endl;
390 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
392 } // End namespace Foam
394 // ************************************************************************* //