1 // Copyright (C) 2007-2022 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 // Author : Anthony Geay (EDF R&D)
21 #include "CellModel.hxx"
23 #include "InterpKernelException.hxx"
24 #include "DiameterCalculator.hxx"
25 #include "OrientationInverter.hxx"
32 unsigned char MEDCOUPLING2VTKTYPETRADUCER[INTERP_KERNEL::NORM_MAXTYPE+1]={1,3,21,5,9,7,22,34,23,28,35,MEDCOUPLING2VTKTYPETRADUCER_NONE,MEDCOUPLING2VTKTYPETRADUCER_NONE,MEDCOUPLING2VTKTYPETRADUCER_NONE,10,14,13,MEDCOUPLING2VTKTYPETRADUCER_NONE,12,MEDCOUPLING2VTKTYPETRADUCER_NONE,24,MEDCOUPLING2VTKTYPETRADUCER_NONE,16,27,MEDCOUPLING2VTKTYPETRADUCER_NONE,26,MEDCOUPLING2VTKTYPETRADUCER_NONE,29,32,MEDCOUPLING2VTKTYPETRADUCER_NONE,25,42,36,4};
34 namespace INTERP_KERNEL
36 const char *CellModel::CELL_TYPES_REPR[]={"NORM_POINT1", "NORM_SEG2", "NORM_SEG3", "NORM_TRI3", "NORM_QUAD4",// 0->4
37 "NORM_POLYGON", "NORM_TRI6", "NORM_TRI7" , "NORM_QUAD8", "NORM_QUAD9",//5->9
38 "NORM_SEG4", "", "", "", "NORM_TETRA4",//10->14
39 "NORM_PYRA5", "NORM_PENTA6", "", "NORM_HEXA8", "",//15->19
40 "NORM_TETRA10", "", "NORM_HEXGP12", "NORM_PYRA13", "",//20->24
41 "NORM_PENTA15", "", "NORM_HEXA27", "NORM_PENTA18", "",//25->29
42 "NORM_HEXA20", "NORM_POLYHED", "NORM_QPOLYG", "NORM_POLYL", "",//30->34
43 "", "", "", "", "",//35->39
46 const CellModel& CellModel::GetCellModel(NormalizedCellType type)
48 const std::map<NormalizedCellType,CellModel>& map_unique = GetMapOfUniqueInstance();
49 const std::map<NormalizedCellType,CellModel>::const_iterator iter=map_unique.find(type);
50 if(iter==map_unique.end())
52 std::ostringstream stream; stream << "no cellmodel for normalized type " << type;
53 throw Exception(stream.str().c_str());
55 return (*iter).second;
58 const std::map<NormalizedCellType,CellModel>& CellModel::GetMapOfUniqueInstance()
60 static std::map<NormalizedCellType,CellModel> map_of_unique_instance;
61 if(map_of_unique_instance.empty())
62 BuildUniqueInstance(map_of_unique_instance);
63 return map_of_unique_instance;
66 const char *CellModel::getRepr() const
68 return CELL_TYPES_REPR[(int)_type];
72 * This method is compatible with all types including dynamic one.
74 bool CellModel::isCompatibleWith(NormalizedCellType type) const
78 const CellModel& other=GetCellModel(type);
79 if(_dim!=other.getDimension())
81 bool b1=isQuadratic();
82 bool b2=other.isQuadratic();
83 if((b1 && !b2) || (!b1 && b2))
90 void CellModel::BuildUniqueInstance(std::map<NormalizedCellType,CellModel>& map_unique)
92 map_unique.insert(std::make_pair(NORM_POINT1,CellModel(NORM_POINT1)));
93 map_unique.insert(std::make_pair(NORM_SEG2,CellModel(NORM_SEG2)));
94 map_unique.insert(std::make_pair(NORM_SEG3,CellModel(NORM_SEG3)));
95 map_unique.insert(std::make_pair(NORM_SEG4,CellModel(NORM_SEG4)));
96 map_unique.insert(std::make_pair(NORM_TRI3,CellModel(NORM_TRI3)));
97 map_unique.insert(std::make_pair(NORM_QUAD4,CellModel(NORM_QUAD4)));
98 map_unique.insert(std::make_pair(NORM_TRI6,CellModel(NORM_TRI6)));
99 map_unique.insert(std::make_pair(NORM_TRI7,CellModel(NORM_TRI7)));
100 map_unique.insert(std::make_pair(NORM_QUAD8,CellModel(NORM_QUAD8)));
101 map_unique.insert(std::make_pair(NORM_QUAD9,CellModel(NORM_QUAD9)));
102 map_unique.insert(std::make_pair(NORM_TETRA4,CellModel(NORM_TETRA4)));
103 map_unique.insert(std::make_pair(NORM_HEXA8,CellModel(NORM_HEXA8)));
104 map_unique.insert(std::make_pair(NORM_PYRA5,CellModel(NORM_PYRA5)));
105 map_unique.insert(std::make_pair(NORM_PENTA6,CellModel(NORM_PENTA6)));
106 map_unique.insert(std::make_pair(NORM_TETRA10,CellModel(NORM_TETRA10)));
107 map_unique.insert(std::make_pair(NORM_HEXGP12,CellModel(NORM_HEXGP12)));
108 map_unique.insert(std::make_pair(NORM_PYRA13,CellModel(NORM_PYRA13)));
109 map_unique.insert(std::make_pair(NORM_PENTA15,CellModel(NORM_PENTA15)));
110 map_unique.insert(std::make_pair(NORM_PENTA18,CellModel(NORM_PENTA18)));
111 map_unique.insert(std::make_pair(NORM_HEXA20,CellModel(NORM_HEXA20)));
112 map_unique.insert(std::make_pair(NORM_HEXA27,CellModel(NORM_HEXA27)));
113 map_unique.insert(std::make_pair(NORM_POLYGON,CellModel(NORM_POLYGON)));
114 map_unique.insert(std::make_pair(NORM_POLYHED,CellModel(NORM_POLYHED)));
115 map_unique.insert(std::make_pair(NORM_QPOLYG,CellModel(NORM_QPOLYG)));
116 map_unique.insert(std::make_pair(NORM_POLYL,CellModel(NORM_POLYL)));
117 map_unique.insert(std::make_pair(NORM_ERROR,CellModel(NORM_ERROR)));
120 CellModel::CellModel(NormalizedCellType type):_type(type)
125 _extruded_type=NORM_ERROR;
126 _reverse_extruded_type=NORM_ERROR;
127 _linear_type=NORM_ERROR;
128 _quadratic_type=NORM_ERROR;
129 _quadratic_type2=NORM_ERROR;
130 _nb_of_little_sons=std::numeric_limits<unsigned>::max();
135 _nb_of_pts=1; _nb_of_sons=0; _dim=0; _extruded_type=NORM_SEG2; _is_simplex=true;
140 _nb_of_pts=2; _nb_of_sons=2; _dim=1; _extruded_type=NORM_QUAD4; _quadratic_type=NORM_SEG3; _quadratic_type2=NORM_SEG3; _is_simplex=true; _is_extruded=true; _reverse_extruded_type=NORM_POINT1;
141 _sons_type[0]=NORM_POINT1; _sons_type[1]=NORM_POINT1;
142 _sons_con[0][0]=0; _nb_of_sons_con[0]=1;
143 _sons_con[1][0]=1; _nb_of_sons_con[1]=1;
148 _nb_of_pts=3; _nb_of_sons=3; _dim=1; _extruded_type=NORM_QUAD8; _linear_type=NORM_SEG2; _quadratic=true; _is_simplex=false;
149 _sons_type[0]=NORM_POINT1; _sons_type[1]=NORM_POINT1; _sons_type[2]=NORM_POINT1;
150 _sons_con[0][0]=0; _nb_of_sons_con[0]=1;
151 _sons_con[1][0]=1; _nb_of_sons_con[1]=1;
152 _sons_con[2][0]=2; _nb_of_sons_con[2]=1;
157 _nb_of_pts=4; _nb_of_sons=4; _dim=1; _linear_type=NORM_SEG2; _quadratic=true; _is_simplex=false; // no _extruded_type because no cubic 2D cell
158 _sons_type[0]=NORM_POINT1; _sons_type[1]=NORM_POINT1; _sons_type[2]=NORM_POINT1; _sons_type[3]=NORM_POINT1;
159 _sons_con[0][0]=0; _nb_of_sons_con[0]=1;
160 _sons_con[1][0]=1; _nb_of_sons_con[1]=1;
161 _sons_con[2][0]=2; _nb_of_sons_con[2]=1;
162 _sons_con[3][0]=3; _nb_of_sons_con[3]=1;
167 _nb_of_pts=4; _nb_of_sons=4; _dim=3; _quadratic_type=NORM_TETRA10; _is_simplex=true;
168 _sons_type[0]=NORM_TRI3; _sons_type[1]=NORM_TRI3; _sons_type[2]=NORM_TRI3; _sons_type[3]=NORM_TRI3;
169 _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=2; _nb_of_sons_con[0]=3;
170 _sons_con[1][0]=0; _sons_con[1][1]=3; _sons_con[1][2]=1; _nb_of_sons_con[1]=3;
171 _sons_con[2][0]=1; _sons_con[2][1]=3; _sons_con[2][2]=2; _nb_of_sons_con[2]=3;
172 _sons_con[3][0]=2; _sons_con[3][1]=3; _sons_con[3][2]=0; _nb_of_sons_con[3]=3;
173 _little_sons_con[0][0]=0; _little_sons_con[0][1]=1; _nb_of_little_sons=6;
174 _little_sons_con[1][0]=1; _little_sons_con[1][1]=2;
175 _little_sons_con[2][0]=2; _little_sons_con[2][1]=0;
176 _little_sons_con[3][0]=0; _little_sons_con[3][1]=3;
177 _little_sons_con[4][0]=1; _little_sons_con[4][1]=3;
178 _little_sons_con[5][0]=2; _little_sons_con[5][1]=3;
183 _nb_of_pts=8; _nb_of_sons=6; _dim=3; _quadratic_type=NORM_HEXA20; _quadratic_type2=NORM_HEXA27; _is_simplex=false; _is_extruded=true; _reverse_extruded_type=NORM_QUAD4;
184 _sons_type[0]=NORM_QUAD4; _sons_type[1]=NORM_QUAD4; _sons_type[2]=NORM_QUAD4; _sons_type[3]=NORM_QUAD4; _sons_type[4]=NORM_QUAD4; _sons_type[5]=NORM_QUAD4;
185 _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=2; _sons_con[0][3]=3; _nb_of_sons_con[0]=4;
186 _sons_con[1][0]=4; _sons_con[1][1]=7; _sons_con[1][2]=6; _sons_con[1][3]=5; _nb_of_sons_con[1]=4;
187 _sons_con[2][0]=0; _sons_con[2][1]=4; _sons_con[2][2]=5; _sons_con[2][3]=1; _nb_of_sons_con[2]=4;
188 _sons_con[3][0]=1; _sons_con[3][1]=5; _sons_con[3][2]=6; _sons_con[3][3]=2; _nb_of_sons_con[3]=4;
189 _sons_con[4][0]=2; _sons_con[4][1]=6; _sons_con[4][2]=7; _sons_con[4][3]=3; _nb_of_sons_con[4]=4;
190 _sons_con[5][0]=3; _sons_con[5][1]=7; _sons_con[5][2]=4; _sons_con[5][3]=0; _nb_of_sons_con[5]=4;
191 _little_sons_con[0][0]=0; _little_sons_con[0][1]=1; _nb_of_little_sons=12;
192 _little_sons_con[1][0]=1; _little_sons_con[1][1]=2;
193 _little_sons_con[2][0]=2; _little_sons_con[2][1]=3;
194 _little_sons_con[3][0]=3; _little_sons_con[3][1]=0;
195 _little_sons_con[4][0]=4; _little_sons_con[4][1]=5;
196 _little_sons_con[5][0]=5; _little_sons_con[5][1]=6;
197 _little_sons_con[6][0]=6; _little_sons_con[6][1]=7;
198 _little_sons_con[7][0]=7; _little_sons_con[7][1]=4;
199 _little_sons_con[8][0]=0; _little_sons_con[8][1]=4;
200 _little_sons_con[9][0]=1; _little_sons_con[9][1]=5;
201 _little_sons_con[10][0]=2; _little_sons_con[10][1]=6;
202 _little_sons_con[11][0]=3; _little_sons_con[11][1]=7;
207 _nb_of_pts=4; _nb_of_sons=4; _dim=2; _quadratic_type=NORM_QUAD8; _quadratic_type2=NORM_QUAD9; _is_simplex=false; _is_extruded=true;
208 _sons_type[0]=NORM_SEG2; _sons_type[1]=NORM_SEG2; _sons_type[2]=NORM_SEG2; _sons_type[3]=NORM_SEG2;
209 _sons_con[0][0]=0; _sons_con[0][1]=1; _nb_of_sons_con[0]=2;
210 _sons_con[1][0]=1; _sons_con[1][1]=2; _nb_of_sons_con[1]=2;
211 _sons_con[2][0]=2; _sons_con[2][1]=3; _nb_of_sons_con[2]=2;
212 _sons_con[3][0]=3; _sons_con[3][1]=0; _nb_of_sons_con[3]=2; _extruded_type=NORM_HEXA8;
217 _nb_of_pts=3; _nb_of_sons=3; _dim=2; _quadratic_type=NORM_TRI6; _quadratic_type2=NORM_TRI7; _is_simplex=true;
218 _sons_type[0]=NORM_SEG2; _sons_type[1]=NORM_SEG2; _sons_type[2]=NORM_SEG2;
219 _sons_con[0][0]=0; _sons_con[0][1]=1; _nb_of_sons_con[0]=2;
220 _sons_con[1][0]=1; _sons_con[1][1]=2; _nb_of_sons_con[1]=2;
221 _sons_con[2][0]=2; _sons_con[2][1]=0; _nb_of_sons_con[2]=2; _extruded_type=NORM_PENTA6;
226 _nb_of_pts=6; _nb_of_sons=3; _dim=2; _linear_type=NORM_TRI3; _is_simplex=false;
227 _sons_type[0]=NORM_SEG3; _sons_type[1]=NORM_SEG3; _sons_type[2]=NORM_SEG3;
228 _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=3; _nb_of_sons_con[0]=3;
229 _sons_con[1][0]=1; _sons_con[1][1]=2; _sons_con[1][2]=4; _nb_of_sons_con[1]=3;
230 _sons_con[2][0]=2; _sons_con[2][1]=0; _sons_con[2][2]=5; _nb_of_sons_con[2]=3; _quadratic=true; _extruded_type=NORM_PENTA15;
235 _nb_of_pts=7; _nb_of_sons=3; _dim=2; _linear_type=NORM_TRI3; _is_simplex=false;
236 _sons_type[0]=NORM_SEG3; _sons_type[1]=NORM_SEG3; _sons_type[2]=NORM_SEG3;
237 _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=3; _nb_of_sons_con[0]=3;
238 _sons_con[1][0]=1; _sons_con[1][1]=2; _sons_con[1][2]=4; _nb_of_sons_con[1]=3;
239 _sons_con[2][0]=2; _sons_con[2][1]=0; _sons_con[2][2]=5; _nb_of_sons_con[2]=3; _quadratic=true; //no extruded type because no penta20
244 _nb_of_pts=8; _nb_of_sons=4; _dim=2; _linear_type=NORM_QUAD4; _is_simplex=false;
245 _sons_type[0]=NORM_SEG3; _sons_type[1]=NORM_SEG3; _sons_type[2]=NORM_SEG3; _sons_type[3]=NORM_SEG3;
246 _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=4; _nb_of_sons_con[0]=3;
247 _sons_con[1][0]=1; _sons_con[1][1]=2; _sons_con[1][2]=5; _nb_of_sons_con[1]=3;
248 _sons_con[2][0]=2; _sons_con[2][1]=3; _sons_con[2][2]=6; _nb_of_sons_con[2]=3;
249 _sons_con[3][0]=3; _sons_con[3][1]=0; _sons_con[3][2]=7; _nb_of_sons_con[3]=3; _quadratic=true; _extruded_type=NORM_HEXA20;
254 _nb_of_pts=9; _nb_of_sons=4; _dim=2; _linear_type=NORM_QUAD4; _is_simplex=false;
255 _sons_type[0]=NORM_SEG3; _sons_type[1]=NORM_SEG3; _sons_type[2]=NORM_SEG3; _sons_type[3]=NORM_SEG3;
256 _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=4; _nb_of_sons_con[0]=3;
257 _sons_con[1][0]=1; _sons_con[1][1]=2; _sons_con[1][2]=5; _nb_of_sons_con[1]=3;
258 _sons_con[2][0]=2; _sons_con[2][1]=3; _sons_con[2][2]=6; _nb_of_sons_con[2]=3;
259 _sons_con[3][0]=3; _sons_con[3][1]=0; _sons_con[3][2]=7; _nb_of_sons_con[3]=3; _quadratic=true; _extruded_type=NORM_HEXA27;
264 _nb_of_pts=5; _nb_of_sons=5; _dim=3; _quadratic_type=NORM_PYRA13; _is_simplex=false;
265 _sons_type[0]=NORM_QUAD4; _sons_type[1]=NORM_TRI3; _sons_type[2]=NORM_TRI3; _sons_type[3]=NORM_TRI3; _sons_type[4]=NORM_TRI3;
266 _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=2; _sons_con[0][3]=3; _nb_of_sons_con[0]=4;
267 _sons_con[1][0]=0; _sons_con[1][1]=4; _sons_con[1][2]=1; _nb_of_sons_con[1]=3;
268 _sons_con[2][0]=1; _sons_con[2][1]=4; _sons_con[2][2]=2; _nb_of_sons_con[2]=3;
269 _sons_con[3][0]=2; _sons_con[3][1]=4; _sons_con[3][2]=3; _nb_of_sons_con[3]=3;
270 _sons_con[4][0]=3; _sons_con[4][1]=4; _sons_con[4][2]=0; _nb_of_sons_con[4]=3;
271 _little_sons_con[0][0]=0; _little_sons_con[0][1]=1; _nb_of_little_sons=8;
272 _little_sons_con[1][0]=1; _little_sons_con[1][1]=2;
273 _little_sons_con[2][0]=2; _little_sons_con[2][1]=3;
274 _little_sons_con[3][0]=3; _little_sons_con[3][1]=0;
275 _little_sons_con[4][0]=0; _little_sons_con[4][1]=4;
276 _little_sons_con[5][0]=1; _little_sons_con[5][1]=4;
277 _little_sons_con[6][0]=2; _little_sons_con[6][1]=4;
278 _little_sons_con[7][0]=3; _little_sons_con[7][1]=4;
283 _nb_of_pts=6; _nb_of_sons=5; _dim=3; _quadratic_type=NORM_PENTA15; _is_simplex=false; _is_extruded=true; _reverse_extruded_type=NORM_TRI3;
284 _sons_type[0]=NORM_TRI3; _sons_type[1]=NORM_TRI3; _sons_type[2]=NORM_QUAD4; _sons_type[3]=NORM_QUAD4; _sons_type[4]=NORM_QUAD4;
285 _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=2; _nb_of_sons_con[0]=3;
286 _sons_con[1][0]=3; _sons_con[1][1]=5; _sons_con[1][2]=4; _nb_of_sons_con[1]=3;
287 _sons_con[2][0]=0; _sons_con[2][1]=3; _sons_con[2][2]=4; _sons_con[2][3]=1; _nb_of_sons_con[2]=4;
288 _sons_con[3][0]=1; _sons_con[3][1]=4; _sons_con[3][2]=5; _sons_con[3][3]=2; _nb_of_sons_con[3]=4;
289 _sons_con[4][0]=2; _sons_con[4][1]=5; _sons_con[4][2]=3; _sons_con[4][3]=0; _nb_of_sons_con[4]=4;
290 _little_sons_con[0][0]=0; _little_sons_con[0][1]=1; _nb_of_little_sons=9;
291 _little_sons_con[1][0]=1; _little_sons_con[1][1]=2;
292 _little_sons_con[2][0]=2; _little_sons_con[2][1]=0;
293 _little_sons_con[3][0]=3; _little_sons_con[3][1]=4;
294 _little_sons_con[4][0]=4; _little_sons_con[4][1]=5;
295 _little_sons_con[5][0]=5; _little_sons_con[5][1]=3;
296 _little_sons_con[6][0]=0; _little_sons_con[6][1]=3;
297 _little_sons_con[7][0]=1; _little_sons_con[7][1]=4;
298 _little_sons_con[8][0]=2; _little_sons_con[8][1]=5;
303 _nb_of_pts=10; _nb_of_sons=4; _dim=3; _linear_type=NORM_TETRA4; _is_simplex=false;
304 _sons_type[0]=NORM_TRI6; _sons_type[1]=NORM_TRI6; _sons_type[2]=NORM_TRI6; _sons_type[3]=NORM_TRI6;
305 _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=2; _sons_con[0][3]=4; _sons_con[0][4]=5; _sons_con[0][5]=6; _nb_of_sons_con[0]=6;
306 _sons_con[1][0]=0; _sons_con[1][1]=3; _sons_con[1][2]=1; _sons_con[1][3]=7; _sons_con[1][4]=8; _sons_con[1][5]=4; _nb_of_sons_con[1]=6;
307 _sons_con[2][0]=1; _sons_con[2][1]=3; _sons_con[2][2]=2; _sons_con[2][3]=8; _sons_con[2][4]=9; _sons_con[2][5]=5; _nb_of_sons_con[2]=6;
308 _sons_con[3][0]=2; _sons_con[3][1]=3; _sons_con[3][2]=0; _sons_con[3][3]=9; _sons_con[3][4]=7; _sons_con[3][5]=6; _nb_of_sons_con[3]=6; _quadratic=true;
309 _little_sons_con[0][0]=0; _little_sons_con[0][1]=1; _little_sons_con[0][2]=4; _nb_of_little_sons=6;
310 _little_sons_con[1][0]=1; _little_sons_con[1][1]=2; _little_sons_con[1][2]=5;
311 _little_sons_con[2][0]=2; _little_sons_con[2][1]=0; _little_sons_con[2][2]=6;
312 _little_sons_con[3][0]=0; _little_sons_con[3][1]=3; _little_sons_con[3][2]=7;
313 _little_sons_con[4][0]=1; _little_sons_con[4][1]=3; _little_sons_con[4][2]=8;
314 _little_sons_con[5][0]=2; _little_sons_con[5][1]=3; _little_sons_con[5][2]=9;
319 _nb_of_pts=12; _nb_of_sons=8; _dim=3; _is_simplex=false; _is_extruded=true;
320 _sons_type[0]=NORM_POLYGON; _sons_type[1]=NORM_POLYGON; _sons_type[2]=NORM_QUAD4; _sons_type[3]=NORM_QUAD4; _sons_type[4]=NORM_QUAD4; _sons_type[5]=NORM_QUAD4;
321 _sons_type[6]=NORM_QUAD4; _sons_type[7]=NORM_QUAD4;
322 _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=2; _sons_con[0][3]=3; _sons_con[0][4]=4; _sons_con[0][5]=5; _nb_of_sons_con[0]=6;
323 _sons_con[1][0]=6; _sons_con[1][1]=11; _sons_con[1][2]=10; _sons_con[1][3]=9; _sons_con[1][4]=8; _sons_con[1][5]=7; _nb_of_sons_con[1]=6;
324 _sons_con[2][0]=0; _sons_con[2][1]=6; _sons_con[2][2]=7; _sons_con[2][3]=1; _nb_of_sons_con[2]=4;
325 _sons_con[3][0]=1; _sons_con[3][1]=7; _sons_con[3][2]=8; _sons_con[3][3]=2; _nb_of_sons_con[3]=4;
326 _sons_con[4][0]=2; _sons_con[4][1]=8; _sons_con[4][2]=9; _sons_con[4][3]=3; _nb_of_sons_con[4]=4;
327 _sons_con[5][0]=3; _sons_con[5][1]=9; _sons_con[5][2]=10; _sons_con[5][3]=4; _nb_of_sons_con[5]=4;
328 _sons_con[6][0]=4; _sons_con[6][1]=10; _sons_con[6][2]=11; _sons_con[6][3]=5; _nb_of_sons_con[6]=4;
329 _sons_con[7][0]=5; _sons_con[7][1]=11; _sons_con[7][2]=6; _sons_con[7][3]=0; _nb_of_sons_con[7]=4;
334 _nb_of_pts=13; _nb_of_sons=5; _dim=3; _linear_type=NORM_PYRA5; _is_simplex=false;
335 _sons_type[0]=NORM_QUAD8; _sons_type[1]=NORM_TRI6; _sons_type[2]=NORM_TRI6; _sons_type[3]=NORM_TRI6; _sons_type[4]=NORM_TRI6;
336 _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=2; _sons_con[0][3]=3; _sons_con[0][4]=5; _sons_con[0][5]=6; _sons_con[0][6]=7; _sons_con[0][7]=8; _nb_of_sons_con[0]=8;
337 _sons_con[1][0]=0; _sons_con[1][1]=4; _sons_con[1][2]=1; _sons_con[1][3]=9; _sons_con[1][4]=10; _sons_con[1][5]=5; _nb_of_sons_con[1]=6;
338 _sons_con[2][0]=1; _sons_con[2][1]=4; _sons_con[2][2]=2; _sons_con[2][3]=10; _sons_con[2][4]=11; _sons_con[2][5]=6; _nb_of_sons_con[2]=6;
339 _sons_con[3][0]=2; _sons_con[3][1]=4; _sons_con[3][2]=3; _sons_con[3][3]=11; _sons_con[3][4]=12; _sons_con[3][5]=7; _nb_of_sons_con[3]=6;
340 _sons_con[4][0]=3; _sons_con[4][1]=4; _sons_con[4][2]=0; _sons_con[4][3]=12; _sons_con[4][4]=9; _sons_con[4][5]=8; _nb_of_sons_con[4]=6; _quadratic=true;
341 _little_sons_con[0][0]=0; _little_sons_con[0][1]=1; _little_sons_con[0][2]=5; _nb_of_little_sons=8;
342 _little_sons_con[1][0]=1; _little_sons_con[1][1]=2; _little_sons_con[1][2]=6;
343 _little_sons_con[2][0]=2; _little_sons_con[2][1]=3; _little_sons_con[2][2]=7;
344 _little_sons_con[3][0]=3; _little_sons_con[3][1]=0; _little_sons_con[3][2]=8;
345 _little_sons_con[4][0]=0; _little_sons_con[4][1]=4; _little_sons_con[4][2]=9;
346 _little_sons_con[5][0]=1; _little_sons_con[5][1]=4; _little_sons_con[5][2]=10;
347 _little_sons_con[6][0]=2; _little_sons_con[6][1]=4; _little_sons_con[6][2]=11;
348 _little_sons_con[7][0]=3; _little_sons_con[7][1]=4; _little_sons_con[7][2]=12;
353 _nb_of_pts=15; _nb_of_sons=5; _dim=3; _linear_type=NORM_PENTA6; _is_simplex=false;
354 _sons_type[0]=NORM_TRI6; _sons_type[1]=NORM_TRI6; _sons_type[2]=NORM_QUAD8; _sons_type[3]=NORM_QUAD8; _sons_type[4]=NORM_QUAD8;
355 _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=2; _sons_con[0][3]=6; _sons_con[0][4]=7; _sons_con[0][5]=8; _nb_of_sons_con[0]=6;
356 _sons_con[1][0]=3; _sons_con[1][1]=5; _sons_con[1][2]=4; _sons_con[1][3]=11; _sons_con[1][4]=10; _sons_con[1][5]=9; _nb_of_sons_con[1]=6;
357 _sons_con[2][0]=0; _sons_con[2][1]=3; _sons_con[2][2]=4; _sons_con[2][3]=1; _sons_con[2][4]=12; _sons_con[2][5]=9; _sons_con[2][6]=13; _sons_con[2][7]=6; _nb_of_sons_con[2]=8;
358 _sons_con[3][0]=1; _sons_con[3][1]=4; _sons_con[3][2]=5; _sons_con[3][3]=2; _sons_con[3][4]=13; _sons_con[3][5]=10; _sons_con[3][6]=14; _sons_con[3][7]=7; _nb_of_sons_con[3]=8;
359 _sons_con[4][0]=2; _sons_con[4][1]=5; _sons_con[4][2]=3; _sons_con[4][3]=0; _sons_con[4][4]=14; _sons_con[4][5]=11; _sons_con[4][6]=12; _sons_con[4][7]=8; _nb_of_sons_con[4]=8; _quadratic=true;
360 _little_sons_con[0][0]=0; _little_sons_con[0][1]=1; _little_sons_con[0][2]=6; _nb_of_little_sons=9;
361 _little_sons_con[1][0]=1; _little_sons_con[1][1]=2; _little_sons_con[1][2]=7;
362 _little_sons_con[2][0]=2; _little_sons_con[2][1]=0; _little_sons_con[2][2]=8;
363 _little_sons_con[3][0]=3; _little_sons_con[3][1]=4; _little_sons_con[3][2]=9;
364 _little_sons_con[4][0]=4; _little_sons_con[4][1]=5; _little_sons_con[4][2]=10;
365 _little_sons_con[5][0]=5; _little_sons_con[5][1]=3; _little_sons_con[5][2]=11;
366 _little_sons_con[6][0]=0; _little_sons_con[6][1]=3; _little_sons_con[6][2]=12;
367 _little_sons_con[7][0]=1; _little_sons_con[7][1]=4; _little_sons_con[7][2]=13;
368 _little_sons_con[8][0]=2; _little_sons_con[8][1]=5; _little_sons_con[8][2]=14;
373 _nb_of_pts=18; _nb_of_sons=5; _dim=3; _linear_type=NORM_PENTA6; _is_simplex=false;
374 _sons_type[0]=NORM_TRI6; _sons_type[1]=NORM_TRI6; _sons_type[2]=NORM_QUAD9; _sons_type[3]=NORM_QUAD9; _sons_type[4]=NORM_QUAD9;
375 _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=2; _sons_con[0][3]=6; _sons_con[0][4]=7; _sons_con[0][5]=8; _nb_of_sons_con[0]=6;
376 _sons_con[1][0]=3; _sons_con[1][1]=5; _sons_con[1][2]=4; _sons_con[1][3]=11; _sons_con[1][4]=10; _sons_con[1][5]=9; _nb_of_sons_con[1]=6;
377 _sons_con[2][0]=0; _sons_con[2][1]=3; _sons_con[2][2]=4; _sons_con[2][3]=1; _sons_con[2][4]=12; _sons_con[2][5]=9; _sons_con[2][6]=13; _sons_con[2][7]=6; _sons_con[2][8]=15; _nb_of_sons_con[2]=9;
378 _sons_con[3][0]=1; _sons_con[3][1]=4; _sons_con[3][2]=5; _sons_con[3][3]=2; _sons_con[3][4]=13; _sons_con[3][5]=10; _sons_con[3][6]=14; _sons_con[3][7]=7; _sons_con[3][8]=16; _nb_of_sons_con[3]=9;
379 _sons_con[4][0]=2; _sons_con[4][1]=4; _sons_con[4][2]=5; _sons_con[4][3]=0; _sons_con[4][4]=14; _sons_con[4][5]=11; _sons_con[4][6]=12; _sons_con[4][7]=8; _sons_con[4][8]=17; _nb_of_sons_con[4]=9; _quadratic=true;
380 _little_sons_con[0][0]=0; _little_sons_con[0][1]=1; _little_sons_con[0][2]=6; _nb_of_little_sons=9;
381 _little_sons_con[1][0]=1; _little_sons_con[1][1]=2; _little_sons_con[1][2]=7;
382 _little_sons_con[2][0]=2; _little_sons_con[2][1]=0; _little_sons_con[2][2]=8;
383 _little_sons_con[3][0]=3; _little_sons_con[3][1]=4; _little_sons_con[3][2]=9;
384 _little_sons_con[4][0]=4; _little_sons_con[4][1]=5; _little_sons_con[4][2]=10;
385 _little_sons_con[5][0]=5; _little_sons_con[5][1]=3; _little_sons_con[5][2]=11;
386 _little_sons_con[6][0]=0; _little_sons_con[6][1]=3; _little_sons_con[6][2]=12;
387 _little_sons_con[7][0]=1; _little_sons_con[7][1]=4; _little_sons_con[7][2]=13;
388 _little_sons_con[8][0]=2; _little_sons_con[8][1]=5; _little_sons_con[8][2]=14;
393 _nb_of_pts=20; _nb_of_sons=6; _dim=3; _linear_type=NORM_HEXA8; _is_simplex=false;
394 _sons_type[0]=NORM_QUAD8; _sons_type[1]=NORM_QUAD8; _sons_type[2]=NORM_QUAD8; _sons_type[3]=NORM_QUAD8; _sons_type[4]=NORM_QUAD8; _sons_type[5]=NORM_QUAD8;
395 _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=2; _sons_con[0][3]=3; _sons_con[0][4]=8; _sons_con[0][5]=9; _sons_con[0][6]=10; _sons_con[0][7]=11; _nb_of_sons_con[0]=8;
396 _sons_con[1][0]=4; _sons_con[1][1]=7; _sons_con[1][2]=6; _sons_con[1][3]=5; _sons_con[1][4]=15; _sons_con[1][5]=14; _sons_con[1][6]=13; _sons_con[1][7]=12; _nb_of_sons_con[1]=8;
397 _sons_con[2][0]=0; _sons_con[2][1]=4; _sons_con[2][2]=5; _sons_con[2][3]=1; _sons_con[2][4]=16; _sons_con[2][5]=12; _sons_con[2][6]=17; _sons_con[2][7]=8; _nb_of_sons_con[2]=8;
398 _sons_con[3][0]=1; _sons_con[3][1]=5; _sons_con[3][2]=6; _sons_con[3][3]=2; _sons_con[3][4]=17; _sons_con[3][5]=13; _sons_con[3][6]=18; _sons_con[3][7]=9;_nb_of_sons_con[3]=8;
399 _sons_con[4][0]=2; _sons_con[4][1]=6; _sons_con[4][2]=7; _sons_con[4][3]=3; _sons_con[4][4]=18; _sons_con[4][5]=14; _sons_con[4][6]=19; _sons_con[4][7]=10; _nb_of_sons_con[4]=8;
400 _sons_con[5][0]=3; _sons_con[5][1]=7; _sons_con[5][2]=4; _sons_con[5][3]=0; _sons_con[5][4]=19; _sons_con[5][5]=15; _sons_con[5][6]=16; _sons_con[5][7]=11; _nb_of_sons_con[5]=8; _quadratic=true;
401 _little_sons_con[0][0]=0; _little_sons_con[0][1]=1; _little_sons_con[0][2]=8; _nb_of_little_sons=12;
402 _little_sons_con[1][0]=1; _little_sons_con[1][1]=2; _little_sons_con[1][2]=9;
403 _little_sons_con[2][0]=2; _little_sons_con[2][1]=3; _little_sons_con[2][2]=10;
404 _little_sons_con[3][0]=3; _little_sons_con[3][1]=0; _little_sons_con[3][2]=11;
405 _little_sons_con[4][0]=4; _little_sons_con[4][1]=5; _little_sons_con[4][2]=12;
406 _little_sons_con[5][0]=5; _little_sons_con[5][1]=6; _little_sons_con[5][2]=13;
407 _little_sons_con[6][0]=6; _little_sons_con[6][1]=7; _little_sons_con[6][2]=14;
408 _little_sons_con[7][0]=7; _little_sons_con[7][1]=4; _little_sons_con[7][2]=15;
409 _little_sons_con[8][0]=0; _little_sons_con[8][1]=4; _little_sons_con[8][2]=16;
410 _little_sons_con[9][0]=1; _little_sons_con[9][1]=5; _little_sons_con[9][2]=17;
411 _little_sons_con[10][0]=2; _little_sons_con[10][1]=6; _little_sons_con[10][2]=18;
412 _little_sons_con[11][0]=3; _little_sons_con[11][1]=7; _little_sons_con[11][2]=19;
417 _nb_of_pts=27; _nb_of_sons=6; _dim=3; _linear_type=NORM_HEXA8; _is_simplex=false;
418 _sons_type[0]=NORM_QUAD9; _sons_type[1]=NORM_QUAD9; _sons_type[2]=NORM_QUAD9; _sons_type[3]=NORM_QUAD9; _sons_type[4]=NORM_QUAD9; _sons_type[5]=NORM_QUAD9;
419 _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=2; _sons_con[0][3]=3; _sons_con[0][4]=8; _sons_con[0][5]=9; _sons_con[0][6]=10; _sons_con[0][7]=11; _sons_con[0][8]=20; _nb_of_sons_con[0]=9;
420 _sons_con[1][0]=4; _sons_con[1][1]=7; _sons_con[1][2]=6; _sons_con[1][3]=5; _sons_con[1][4]=15; _sons_con[1][5]=14; _sons_con[1][6]=13; _sons_con[1][7]=12; _sons_con[1][8]=25; _nb_of_sons_con[1]=9;
421 _sons_con[2][0]=0; _sons_con[2][1]=4; _sons_con[2][2]=5; _sons_con[2][3]=1; _sons_con[2][4]=16; _sons_con[2][5]=12; _sons_con[2][6]=17; _sons_con[2][7]=8; _sons_con[2][8]=21; _nb_of_sons_con[2]=9;
422 _sons_con[3][0]=1; _sons_con[3][1]=5; _sons_con[3][2]=6; _sons_con[3][3]=2; _sons_con[3][4]=17; _sons_con[3][5]=13; _sons_con[3][6]=18; _sons_con[3][7]=9; _sons_con[3][8]=22; _nb_of_sons_con[3]=9;
423 _sons_con[4][0]=2; _sons_con[4][1]=6; _sons_con[4][2]=7; _sons_con[4][3]=3; _sons_con[4][4]=18; _sons_con[4][5]=14; _sons_con[4][6]=19; _sons_con[4][7]=10; _sons_con[4][8]=23; _nb_of_sons_con[4]=9;
424 _sons_con[5][0]=3; _sons_con[5][1]=7; _sons_con[5][2]=4; _sons_con[5][3]=0; _sons_con[5][4]=19; _sons_con[5][5]=15; _sons_con[5][6]=16; _sons_con[5][7]=11; _sons_con[5][8]=24; _nb_of_sons_con[5]=9;
430 _nb_of_pts=0; _nb_of_sons=0; _dim=2; _dyn=true; _extruded_type=NORM_POLYHED; _is_simplex=false; _quadratic_type=NORM_QPOLYG;
435 _nb_of_pts=0; _nb_of_sons=0; _dim=3; _dyn=true; _is_simplex=false;
440 _nb_of_pts=0; _nb_of_sons=0; _dim=2; _dyn=true; _is_simplex=false; _quadratic=true; _linear_type=NORM_POLYGON;
445 _nb_of_pts=0; _nb_of_sons=0; _dim=1; _dyn=true; _extruded_type=NORM_POLYGON; _is_simplex=false;
450 _nb_of_pts=std::numeric_limits<unsigned>::max(); _nb_of_sons=std::numeric_limits<unsigned>::max(); _dim=std::numeric_limits<unsigned>::max();
457 * Equivalent to getNumberOfSons except that this method deals with dynamic type.
459 unsigned CellModel::getNumberOfSons2(const mcIdType *conn, mcIdType lgth) const
462 return getNumberOfSons();
465 if(_type==NORM_POLYGON)
466 return FromIdType<unsigned>(lgth);
468 return FromIdType<unsigned>(lgth/2);
471 return FromIdType<unsigned>(lgth);//NORM_POLYL
473 return (unsigned)std::count(conn,conn+lgth,-1)+1;
476 unsigned CellModel::getNumberOfEdgesIn3D(const mcIdType *conn, mcIdType lgth) const
479 return _nb_of_little_sons;
481 return FromIdType<unsigned>(lgth-ToIdType(std::count(conn,conn+lgth,-1)/2));
485 * \sa fillMicroEdgeNodalConnectivity
487 unsigned CellModel::getNumberOfMicroEdges() const
489 unsigned mul(isQuadratic()?2:1);
492 switch(getDimension())
495 return mul*getNumberOfSons();
497 return mul*_nb_of_little_sons;
499 throw INTERP_KERNEL::Exception("CellModel::getNumberOfMacroEdges : only 2D and 3D cells support this !");
503 throw INTERP_KERNEL::Exception("CellModel::getNumberOfMacroEdges : not supported by dynamic type !");
506 NormalizedCellType CellModel::getCorrespondingPolyType() const
508 switch(getDimension())
516 throw INTERP_KERNEL::Exception("CellModel::getPolyType : no poly type for quadratic 1D !");
529 throw INTERP_KERNEL::Exception("CellModel::getPolyType : no poly type for quadratic 3D !");
532 throw INTERP_KERNEL::Exception("CellModel::getPolyType : only dimension 0, 1, 2, 3 are supported !");
537 * Equivalent to getSonType except that this method deals with dynamic type.
539 NormalizedCellType CellModel::getSonType2(unsigned sonId) const
542 return getSonType(sonId);
545 if(_type==NORM_POLYGON)
551 return NORM_ERROR;//NORM_POLYL
557 * \b WARNING this method do not manage correctly types that return true at the call of isDynamic. Use fillSonCellNodalConnectivity2 instead.
559 unsigned CellModel::fillSonCellNodalConnectivity(int sonId, const mcIdType *nodalConn, mcIdType *sonNodalConn) const
561 unsigned nbOfTurnLoop=_nb_of_sons_con[sonId];
562 const unsigned *sonConn=_sons_con[sonId];
563 for(unsigned i=0;i<nbOfTurnLoop;i++)
564 sonNodalConn[i]=nodalConn[sonConn[i]];
568 unsigned CellModel::fillSonCellNodalConnectivity2(int sonId, const mcIdType *nodalConn, mcIdType lgth, mcIdType *sonNodalConn, NormalizedCellType& typeOfSon) const
570 typeOfSon=getSonType2(sonId);
572 return fillSonCellNodalConnectivity(sonId,nodalConn,sonNodalConn);
577 if(_type==NORM_POLYGON)
579 sonNodalConn[0]=nodalConn[sonId];
580 sonNodalConn[1]=nodalConn[(sonId+1)%lgth];
585 sonNodalConn[0]=nodalConn[sonId];
586 sonNodalConn[1]=nodalConn[(sonId+1)%(lgth/2)];
587 sonNodalConn[2]=nodalConn[sonId+(lgth/2)];
593 const mcIdType *where=nodalConn;
594 for(int i=0;i<sonId;i++)
596 where=std::find(where,nodalConn+lgth,-1);
599 const mcIdType *where2=std::find(where,nodalConn+lgth,-1);
600 std::copy(where,where2,sonNodalConn);
601 return (unsigned)(where2-where);
604 throw INTERP_KERNEL::Exception("CellModel::fillSonCellNodalConnectivity2 : no sons on NORM_POLYL !");
609 * Equivalent to CellModel::fillSonCellNodalConnectivity2 except for HEXA8 where the order of sub faces is not has MED file numbering for transformation HEXA8->HEXA27
611 unsigned CellModel::fillSonCellNodalConnectivity4(int sonId, const mcIdType *nodalConn, mcIdType lgth, mcIdType *sonNodalConn, NormalizedCellType& typeOfSon) const
613 if(_type==NORM_HEXA8)
615 static const int permutation[6]={0,2,3,4,5,1};
616 return fillSonCellNodalConnectivity2(permutation[sonId],nodalConn,lgth,sonNodalConn,typeOfSon);
619 return fillSonCellNodalConnectivity2(sonId,nodalConn,lgth,sonNodalConn,typeOfSon);
622 unsigned CellModel::fillSonEdgesNodalConnectivity3D(int sonId, const mcIdType *nodalConn, mcIdType lgth, mcIdType *sonNodalConn, NormalizedCellType& typeOfSon) const
629 sonNodalConn[0]=nodalConn[_little_sons_con[sonId][0]];
630 sonNodalConn[1]=nodalConn[_little_sons_con[sonId][1]];
636 sonNodalConn[0]=nodalConn[_little_sons_con[sonId][0]];
637 sonNodalConn[1]=nodalConn[_little_sons_con[sonId][1]];
638 sonNodalConn[2]=nodalConn[_little_sons_con[sonId][2]];
643 throw INTERP_KERNEL::Exception("CellModel::fillSonEdgesNodalConnectivity3D : not implemented yet for NORM_POLYHED !");
647 * \sa getNumberOfMicroEdges
649 unsigned CellModel::fillMicroEdgeNodalConnectivity(int sonId, const mcIdType *nodalConn, mcIdType *sonNodalConn, NormalizedCellType& typeOfSon) const
653 int edgeId(sonId/2),subEdgeId(sonId%2);
655 const unsigned *sonConn(0);
656 switch(getDimension())
660 sonConn=_sons_con[edgeId];
665 sonConn=_little_sons_con[edgeId];
669 throw INTERP_KERNEL::Exception("CellModel::fillMicroEdgeNodalConnectivity : only 2D and 3D cells support this !");
671 const unsigned tmp[3]={sonConn[0],sonConn[2],sonConn[1]};
672 sonNodalConn[0]=nodalConn[tmp[subEdgeId]];
673 sonNodalConn[1]=nodalConn[tmp[subEdgeId+1]];
678 switch(getDimension())
681 return fillSonCellNodalConnectivity2(sonId,nodalConn,0,sonNodalConn,typeOfSon);
683 return fillSonEdgesNodalConnectivity3D(sonId,nodalConn,0,sonNodalConn,typeOfSon);
685 throw INTERP_KERNEL::Exception("CellModel::fillMicroEdgeNodalConnectivity : only 2D and 3D cells support this #2 !");
690 void CellModel::changeOrientationOf2D(mcIdType *nodalConn, unsigned int sz) const
696 std::vector<mcIdType> tmp(sz-1);
697 std::copy(nodalConn+1,nodalConn+sz,tmp.rbegin());
698 std::copy(tmp.begin(),tmp.end(),nodalConn+1);
702 unsigned int sz2(sz/2);
703 std::vector<mcIdType> tmp0(sz2-1),tmp1(sz2);
704 std::copy(nodalConn+1,nodalConn+sz2,tmp0.rbegin());
705 std::copy(nodalConn+sz2,nodalConn+sz,tmp1.rbegin());
706 std::copy(tmp0.begin(),tmp0.end(),nodalConn+1);
707 std::copy(tmp1.begin(),tmp1.end(),nodalConn+sz2);
711 void CellModel::changeOrientationOf1D(mcIdType *nodalConn, unsigned int sz) const
717 std::swap(nodalConn[0],nodalConn[1]);
722 std::swap(nodalConn[0],nodalConn[1]);
723 std::swap(nodalConn[2],nodalConn[3]);
726 throw Exception("CellModel::changeOrientationOf1D : unrecognized 1D cell type !");
730 std::vector<mcIdType> tmp(sz-1);
731 std::copy(nodalConn+1,nodalConn+sz,tmp.rbegin());
732 std::copy(tmp.begin(),tmp.end(),nodalConn+1);
736 //================================================================================
738 * \brief Return number of nodes in sonId-th son of a Dynamic() cell
740 //================================================================================
742 unsigned CellModel::getNumberOfNodesConstituentTheSon2(unsigned sonId, const mcIdType *nodalConn, mcIdType lgth) const
745 return getNumberOfNodesConstituentTheSon(sonId);
749 if(_type==NORM_POLYGON)
756 const mcIdType *where=nodalConn;
757 for(unsigned int i=0;i<sonId;i++)
759 where=std::find(where,nodalConn+lgth,-1);
762 const mcIdType *where2=std::find(where,nodalConn+lgth,-1);
763 return (unsigned)(where2-where);
766 throw INTERP_KERNEL::Exception("CellModel::getNumberOfNodesConstituentTheSon2 : no sons on NORM_POLYL !");
770 * This method retrieves if cell1 represented by 'conn1' and cell2 represented by 'conn2'
771 * are equivalent by a permutation or not. This method expects to work on 1D or 2D (only mesh dimension where it is possible to have a spaceDim) strictly higher than meshDim.
772 * If not an exception will be thrown.
773 * @return True if two cells have same orientation, false if not.
775 bool CellModel::getOrientationStatus(mcIdType lgth, const mcIdType *conn1, const mcIdType *conn2) const
777 if(_dim!=1 && _dim!=2)
778 throw INTERP_KERNEL::Exception("CellModel::getOrientationStatus : invalid dimension ! Must be 1 or 2 !");
781 std::vector<mcIdType> tmp(2*lgth);
782 std::vector<mcIdType>::iterator it=std::copy(conn1,conn1+lgth,tmp.begin());
783 std::copy(conn1,conn1+lgth,it);
784 it=std::search(tmp.begin(),tmp.end(),conn2,conn2+lgth);
789 std::vector<mcIdType>::reverse_iterator it2=std::search(tmp.rbegin(),tmp.rend(),conn2,conn2+lgth);
792 throw INTERP_KERNEL::Exception("CellModel::getOrientationStatus : Request of orientation status of non equal connectively cells !");
798 std::vector<mcIdType> tmp(lgth);
799 std::vector<mcIdType>::iterator it=std::copy(conn1,conn1+lgth/2,tmp.begin());
800 std::copy(conn1,conn1+lgth/2,it);
801 it=std::search(tmp.begin(),tmp.end(),conn2,conn2+lgth/2);
802 std::size_t d=std::distance(tmp.begin(),it);
805 it=std::copy(conn1+lgth/2,conn1+lgth,tmp.begin());
806 std::copy(conn1+lgth/2,conn1+lgth,it);
807 it=std::search(tmp.begin(),tmp.end(),conn2,conn2+lgth);
810 std::size_t d2=std::distance(tmp.begin(),it);
815 mcIdType p=(lgth+1)/2;
816 std::vector<mcIdType> tmp(2*p);
817 std::vector<mcIdType>::iterator it=std::copy(conn1,conn1+p,tmp.begin());
818 std::copy(conn1,conn1+p,it);
819 it=std::search(tmp.begin(),tmp.end(),conn2,conn2+p);
820 std::size_t d=std::distance(tmp.begin(),it);
824 it=std::copy(conn1+p,conn1+lgth,tmp.begin());
825 std::copy(conn1+p,conn1+lgth,it);
826 it=std::search(tmp.begin(),tmp.end(),conn2+p,conn2+lgth);
829 std::size_t d2=std::distance(tmp.begin(),it);
835 DiameterCalculator *CellModel::buildInstanceOfDiameterCalulator(int spaceDim) const
844 return new DiameterCalulatorTRI3S2;
846 return new DiameterCalulatorTRI3S3;
848 throw Exception("CellModel::buildInstanceOfDiameterCalulator : For TRI3 only space dimension 2 and 3 implemented !");
857 return new DiameterCalulatorQUAD4S2;
859 return new DiameterCalulatorQUAD4S3;
861 throw Exception("CellModel::buildInstanceOfDiameterCalulator : For QUAD4 only space dimension 2 and 3 implemented !");
870 return new DiameterCalulatorTRI6S2;
872 return new DiameterCalulatorTRI6S3;
874 throw Exception("CellModel::buildInstanceOfDiameterCalulator : For TRI6 only space dimension 2 and 3 implemented !");
883 return new DiameterCalulatorTRI7S2;
885 return new DiameterCalulatorTRI7S3;
887 throw Exception("CellModel::buildInstanceOfDiameterCalulator : For TRI7 only space dimension 2 and 3 implemented !");
896 return new DiameterCalulatorQUAD8S2;
898 return new DiameterCalulatorQUAD8S3;
900 throw Exception("CellModel::buildInstanceOfDiameterCalulator : For QUAD8 only space dimension 2 and 3 implemented !");
909 return new DiameterCalulatorQUAD9S2;
911 return new DiameterCalulatorQUAD9S3;
913 throw Exception("CellModel::buildInstanceOfDiameterCalulator : For QUAD9 only space dimension 2 and 3 implemented !");
920 return new DiameterCalulatorTETRA4;
922 throw Exception("CellModel::buildInstanceOfDiameterCalulator : For TETRA4 space dimension 3 expected !");
927 return new DiameterCalulatorTETRA10;
929 throw Exception("CellModel::buildInstanceOfDiameterCalulator : For TETRA10 space dimension 3 expected !");
934 return new DiameterCalulatorHEXA8;
936 throw Exception("CellModel::buildInstanceOfDiameterCalulator : For HEXA8 space dimension 3 expected !");
941 return new DiameterCalulatorHEXA20;
943 throw Exception("CellModel::buildInstanceOfDiameterCalulator : For HEXA20 space dimension 3 expected !");
948 return new DiameterCalulatorHEXA27;
950 throw Exception("CellModel::buildInstanceOfDiameterCalulator : For HEXA27 space dimension 3 expected !");
955 return new DiameterCalulatorPENTA6;
957 throw Exception("CellModel::buildInstanceOfDiameterCalulator : For PENTA6 space dimension 3 expected !");
962 return new DiameterCalulatorPENTA15;
964 throw Exception("CellModel::buildInstanceOfDiameterCalulator : For PENTA15 space dimension 3 expected !");
969 return new DiameterCalulatorPYRA5;
971 throw Exception("CellModel::buildInstanceOfDiameterCalulator : For PYRA5 space dimension 3 expected !");
976 return new DiameterCalulatorPYRA13;
978 throw Exception("CellModel::buildInstanceOfDiameterCalulator : For PYRA13 space dimension 3 expected !");
981 throw Exception("CellModel::buildInstanceOfDiameterCalulator : implemented only for TRI3, QUAD4, TETRA4, HEXA8, PENTA6, PYRA5 !");
985 OrientationInverter *CellModel::buildOrientationInverter() const
990 return new OrientationInverterSEG2;
992 return new OrientationInverterSEG3;
995 return new OrientationInverter2DLinear(getNumberOfNodes());
998 return new OrientationInverter2DQuadratic(getNumberOfNodes());
1000 return new OrientationInverterPolygon;
1002 return new OrientationInverterQPolygon;
1004 return new OrientationInverterTetra4;
1006 return new OrientationInverterPyra5;
1008 return new OrientationInverterTetra10;
1010 return new OrientationInverterPyra13;
1013 return new OrientationInverter3DExtrusionLinear(getNumberOfNodes());
1016 return new OrientationInverter3DExtrusionQuadratic(getNumberOfNodes());
1019 std::ostringstream oss; oss << "CellModel::buildOrientationInverter : not managed geometric type " << getRepr() << " yet !";
1020 throw INTERP_KERNEL::Exception(oss.str());