Salome HOME
Step 8 : meshes have been managed, fields still remaining.
[tools/medcoupling.git] / src / INTERP_KERNEL / CellModel.cxx
1 // Copyright (C) 2007-2016  CEA/DEN, EDF R&D
2 //
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.
7 //
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.
12 //
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
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19 // Author : Anthony Geay (CEA/DEN)
20
21 #include "CellModel.hxx"
22
23 #include "InterpKernelException.hxx"
24 #include "DiameterCalculator.hxx"
25
26 #include <algorithm>
27 #include <sstream>
28 #include <vector>
29 #include <limits>
30
31 namespace INTERP_KERNEL
32 {
33   const char *CellModel::CELL_TYPES_REPR[]={"NORM_POINT1", "NORM_SEG2", "NORM_SEG3", "NORM_TRI3", "NORM_QUAD4",// 0->4
34                                             "NORM_POLYGON", "NORM_TRI6", "NORM_TRI7" , "NORM_QUAD8", "NORM_QUAD9",//5->9
35                                             "NORM_SEG4", "", "", "", "NORM_TETRA4",//10->14
36                                             "NORM_PYRA5", "NORM_PENTA6", "", "NORM_HEXA8", "",//15->19
37                                             "NORM_TETRA10", "", "NORM_HEXGP12", "NORM_PYRA13", "",//20->24
38                                             "NORM_PENTA15", "", "NORM_HEXA27", "", "",//25->29
39                                             "NORM_HEXA20", "NORM_POLYHED", "NORM_QPOLYG", "NORM_POLYL", "",//30->34
40                                             "", "", "", "", "",//35->39
41                                             "NORM_ERROR"};
42
43   std::map<NormalizedCellType,CellModel> CellModel::_map_of_unique_instance;
44
45   const CellModel& CellModel::GetCellModel(NormalizedCellType type)
46   {
47     if(_map_of_unique_instance.empty())
48       buildUniqueInstance();
49     const std::map<NormalizedCellType,CellModel>::iterator iter=_map_of_unique_instance.find(type);
50     if(iter==_map_of_unique_instance.end())
51       {
52         std::ostringstream stream; stream << "no cellmodel for normalized type " << type;
53         throw Exception(stream.str().c_str());
54       }
55     return (*iter).second;
56   }
57
58   const char *CellModel::getRepr() const
59   {
60     return CELL_TYPES_REPR[(int)_type];
61   }
62
63   /*!
64    * This method is compatible with all types including dynamic one.
65    */
66   bool CellModel::isCompatibleWith(NormalizedCellType type) const
67   {
68     if(_type==type)
69       return true;
70     const CellModel& other=GetCellModel(type);
71     if(_dim!=other.getDimension())
72       return false;
73     bool b1=isQuadratic();
74     bool b2=other.isQuadratic();
75     if((b1 && !b2) || (!b1 && b2))
76       return false;
77     b1=isDynamic();
78     b2=other.isDynamic();
79     return b1 || b2;
80   }
81
82   void CellModel::buildUniqueInstance()
83   {
84     _map_of_unique_instance.insert(std::make_pair(NORM_POINT1,CellModel(NORM_POINT1)));
85     _map_of_unique_instance.insert(std::make_pair(NORM_SEG2,CellModel(NORM_SEG2)));
86     _map_of_unique_instance.insert(std::make_pair(NORM_SEG3,CellModel(NORM_SEG3)));
87     _map_of_unique_instance.insert(std::make_pair(NORM_SEG4,CellModel(NORM_SEG4)));
88     _map_of_unique_instance.insert(std::make_pair(NORM_TRI3,CellModel(NORM_TRI3)));
89     _map_of_unique_instance.insert(std::make_pair(NORM_QUAD4,CellModel(NORM_QUAD4)));
90     _map_of_unique_instance.insert(std::make_pair(NORM_TRI6,CellModel(NORM_TRI6)));
91     _map_of_unique_instance.insert(std::make_pair(NORM_TRI7,CellModel(NORM_TRI7)));
92     _map_of_unique_instance.insert(std::make_pair(NORM_QUAD8,CellModel(NORM_QUAD8)));
93     _map_of_unique_instance.insert(std::make_pair(NORM_QUAD9,CellModel(NORM_QUAD9)));
94     _map_of_unique_instance.insert(std::make_pair(NORM_TETRA4,CellModel(NORM_TETRA4)));
95     _map_of_unique_instance.insert(std::make_pair(NORM_HEXA8,CellModel(NORM_HEXA8)));
96     _map_of_unique_instance.insert(std::make_pair(NORM_PYRA5,CellModel(NORM_PYRA5)));
97     _map_of_unique_instance.insert(std::make_pair(NORM_PENTA6,CellModel(NORM_PENTA6)));
98     _map_of_unique_instance.insert(std::make_pair(NORM_TETRA10,CellModel(NORM_TETRA10)));
99     _map_of_unique_instance.insert(std::make_pair(NORM_HEXGP12,CellModel(NORM_HEXGP12)));
100     _map_of_unique_instance.insert(std::make_pair(NORM_PYRA13,CellModel(NORM_PYRA13)));
101     _map_of_unique_instance.insert(std::make_pair(NORM_PENTA15,CellModel(NORM_PENTA15)));
102     _map_of_unique_instance.insert(std::make_pair(NORM_HEXA20,CellModel(NORM_HEXA20)));
103     _map_of_unique_instance.insert(std::make_pair(NORM_HEXA27,CellModel(NORM_HEXA27)));
104     _map_of_unique_instance.insert(std::make_pair(NORM_POLYGON,CellModel(NORM_POLYGON)));
105     _map_of_unique_instance.insert(std::make_pair(NORM_POLYHED,CellModel(NORM_POLYHED)));
106     _map_of_unique_instance.insert(std::make_pair(NORM_QPOLYG,CellModel(NORM_QPOLYG)));
107     _map_of_unique_instance.insert(std::make_pair(NORM_POLYL,CellModel(NORM_POLYL)));
108     _map_of_unique_instance.insert(std::make_pair(NORM_ERROR,CellModel(NORM_ERROR)));
109   }
110
111   CellModel::CellModel(NormalizedCellType type):_type(type)
112   {
113     _is_extruded=false;
114     _quadratic=false;
115     _dyn=false;
116     _extruded_type=NORM_ERROR;
117     _reverse_extruded_type=NORM_ERROR;
118     _linear_type=NORM_ERROR;
119     _quadratic_type=NORM_ERROR;
120     _quadratic_type2=NORM_ERROR;
121     _nb_of_little_sons=std::numeric_limits<unsigned>::max();
122     switch(type)
123       {
124       case NORM_POINT1:
125         {
126           _nb_of_pts=1; _nb_of_sons=0; _dim=0; _extruded_type=NORM_SEG2; _is_simplex=true;
127         }
128         break;
129       case NORM_SEG2:
130         {
131           _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;
132           _sons_type[0]=NORM_POINT1; _sons_type[1]=NORM_POINT1;
133           _sons_con[0][0]=0; _nb_of_sons_con[0]=1;
134           _sons_con[1][0]=1; _nb_of_sons_con[1]=1;
135         }
136         break;
137       case NORM_SEG3:
138         {
139           _nb_of_pts=3; _nb_of_sons=3; _dim=1; _extruded_type=NORM_QUAD8; _linear_type=NORM_SEG2; _quadratic=true; _is_simplex=false;
140           _sons_type[0]=NORM_POINT1; _sons_type[1]=NORM_POINT1; _sons_type[2]=NORM_POINT1;
141           _sons_con[0][0]=0; _nb_of_sons_con[0]=1;
142           _sons_con[1][0]=1; _nb_of_sons_con[1]=1;
143           _sons_con[2][0]=2; _nb_of_sons_con[2]=1;
144         }
145         break;
146       case NORM_SEG4:
147         {
148           _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
149           _sons_type[0]=NORM_POINT1; _sons_type[1]=NORM_POINT1; _sons_type[2]=NORM_POINT1; _sons_type[3]=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;
153           _sons_con[3][0]=3; _nb_of_sons_con[3]=1;
154         }
155         break;
156       case NORM_TETRA4:
157         {
158           _nb_of_pts=4; _nb_of_sons=4; _dim=3; _quadratic_type=NORM_TETRA10; _is_simplex=true;
159           _sons_type[0]=NORM_TRI3; _sons_type[1]=NORM_TRI3; _sons_type[2]=NORM_TRI3; _sons_type[3]=NORM_TRI3;
160           _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=2; _nb_of_sons_con[0]=3;
161           _sons_con[1][0]=0; _sons_con[1][1]=3; _sons_con[1][2]=1; _nb_of_sons_con[1]=3;
162           _sons_con[2][0]=1; _sons_con[2][1]=3; _sons_con[2][2]=2; _nb_of_sons_con[2]=3;
163           _sons_con[3][0]=2; _sons_con[3][1]=3; _sons_con[3][2]=0; _nb_of_sons_con[3]=3;
164           _little_sons_con[0][0]=0; _little_sons_con[0][1]=1;  _nb_of_little_sons=6;
165           _little_sons_con[1][0]=1; _little_sons_con[1][1]=2;
166           _little_sons_con[2][0]=2; _little_sons_con[2][1]=0;
167           _little_sons_con[3][0]=0; _little_sons_con[3][1]=3;
168           _little_sons_con[4][0]=1; _little_sons_con[4][1]=3;
169           _little_sons_con[5][0]=2; _little_sons_con[5][1]=3;
170         }
171         break;
172       case NORM_HEXA8:
173         {
174           _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;
175           _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;
176           _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;
177           _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;
178           _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;
179           _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;
180           _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;
181           _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;
182           _little_sons_con[0][0]=0; _little_sons_con[0][1]=1;  _nb_of_little_sons=12;
183           _little_sons_con[1][0]=1; _little_sons_con[1][1]=2;
184           _little_sons_con[2][0]=2; _little_sons_con[2][1]=3;
185           _little_sons_con[3][0]=3; _little_sons_con[3][1]=0;
186           _little_sons_con[4][0]=4; _little_sons_con[4][1]=5;
187           _little_sons_con[5][0]=5; _little_sons_con[5][1]=6;
188           _little_sons_con[6][0]=6; _little_sons_con[6][1]=7;
189           _little_sons_con[7][0]=7; _little_sons_con[7][1]=4;
190           _little_sons_con[8][0]=0; _little_sons_con[8][1]=4;
191           _little_sons_con[9][0]=1; _little_sons_con[9][1]=5;
192           _little_sons_con[10][0]=2; _little_sons_con[10][1]=6;
193           _little_sons_con[11][0]=3; _little_sons_con[11][1]=7;
194         }
195         break;
196       case NORM_QUAD4:
197         {
198           _nb_of_pts=4; _nb_of_sons=4; _dim=2; _quadratic_type=NORM_QUAD8; _quadratic_type2=NORM_QUAD9; _is_simplex=false; _is_extruded=true;
199           _sons_type[0]=NORM_SEG2; _sons_type[1]=NORM_SEG2; _sons_type[2]=NORM_SEG2; _sons_type[3]=NORM_SEG2;
200           _sons_con[0][0]=0; _sons_con[0][1]=1; _nb_of_sons_con[0]=2;
201           _sons_con[1][0]=1; _sons_con[1][1]=2; _nb_of_sons_con[1]=2;
202           _sons_con[2][0]=2; _sons_con[2][1]=3; _nb_of_sons_con[2]=2;
203           _sons_con[3][0]=3; _sons_con[3][1]=0; _nb_of_sons_con[3]=2; _extruded_type=NORM_HEXA8;
204         }
205         break;
206       case NORM_TRI3:
207         {
208           _nb_of_pts=3; _nb_of_sons=3; _dim=2; _quadratic_type=NORM_TRI6; _quadratic_type2=NORM_TRI7; _is_simplex=true;
209           _sons_type[0]=NORM_SEG2; _sons_type[1]=NORM_SEG2; _sons_type[2]=NORM_SEG2;
210           _sons_con[0][0]=0; _sons_con[0][1]=1; _nb_of_sons_con[0]=2;
211           _sons_con[1][0]=1; _sons_con[1][1]=2; _nb_of_sons_con[1]=2;
212           _sons_con[2][0]=2; _sons_con[2][1]=0; _nb_of_sons_con[2]=2; _extruded_type=NORM_PENTA6;
213         }
214         break;
215       case NORM_TRI6:
216         {
217           _nb_of_pts=6; _nb_of_sons=3; _dim=2; _linear_type=NORM_TRI3; _is_simplex=false;
218           _sons_type[0]=NORM_SEG3; _sons_type[1]=NORM_SEG3; _sons_type[2]=NORM_SEG3;
219           _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=3; _nb_of_sons_con[0]=3;
220           _sons_con[1][0]=1; _sons_con[1][1]=2; _sons_con[1][2]=4; _nb_of_sons_con[1]=3;
221           _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;
222         }
223         break;
224       case NORM_TRI7:
225         {
226           _nb_of_pts=7; _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; //no extruded type because no penta20
231         }
232         break;
233       case NORM_QUAD8:
234         {
235           _nb_of_pts=8; _nb_of_sons=4; _dim=2; _linear_type=NORM_QUAD4; _is_simplex=false;
236           _sons_type[0]=NORM_SEG3; _sons_type[1]=NORM_SEG3; _sons_type[2]=NORM_SEG3; _sons_type[3]=NORM_SEG3;
237           _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=4; _nb_of_sons_con[0]=3;
238           _sons_con[1][0]=1; _sons_con[1][1]=2; _sons_con[1][2]=5; _nb_of_sons_con[1]=3;
239           _sons_con[2][0]=2; _sons_con[2][1]=3; _sons_con[2][2]=6; _nb_of_sons_con[2]=3;
240           _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;
241         }
242         break;
243       case NORM_QUAD9:
244         {
245           _nb_of_pts=9; _nb_of_sons=4; _dim=2; _linear_type=NORM_QUAD4; _is_simplex=false;
246           _sons_type[0]=NORM_SEG3; _sons_type[1]=NORM_SEG3; _sons_type[2]=NORM_SEG3; _sons_type[3]=NORM_SEG3;
247           _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=4; _nb_of_sons_con[0]=3;
248           _sons_con[1][0]=1; _sons_con[1][1]=2; _sons_con[1][2]=5; _nb_of_sons_con[1]=3;
249           _sons_con[2][0]=2; _sons_con[2][1]=3; _sons_con[2][2]=6; _nb_of_sons_con[2]=3;
250           _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;
251         }
252         break;
253       case NORM_PYRA5:
254         {
255           _nb_of_pts=5; _nb_of_sons=5; _dim=3; _quadratic_type=NORM_PYRA13; _is_simplex=false;
256           _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;
257           _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;
258           _sons_con[1][0]=0; _sons_con[1][1]=4; _sons_con[1][2]=1; _nb_of_sons_con[1]=3;
259           _sons_con[2][0]=1; _sons_con[2][1]=4; _sons_con[2][2]=2; _nb_of_sons_con[2]=3;
260           _sons_con[3][0]=2; _sons_con[3][1]=4; _sons_con[3][2]=3; _nb_of_sons_con[3]=3;
261           _sons_con[4][0]=3; _sons_con[4][1]=4; _sons_con[4][2]=0; _nb_of_sons_con[4]=3;
262           _little_sons_con[0][0]=0; _little_sons_con[0][1]=1;  _nb_of_little_sons=8;
263           _little_sons_con[1][0]=1; _little_sons_con[1][1]=2;
264           _little_sons_con[2][0]=2; _little_sons_con[2][1]=3;
265           _little_sons_con[3][0]=3; _little_sons_con[3][1]=0;
266           _little_sons_con[4][0]=0; _little_sons_con[4][1]=4;
267           _little_sons_con[5][0]=1; _little_sons_con[5][1]=4;
268           _little_sons_con[6][0]=2; _little_sons_con[6][1]=4;
269           _little_sons_con[7][0]=3; _little_sons_con[7][1]=4;
270         }
271         break;
272       case NORM_PENTA6:
273         {
274           _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;
275           _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;
276           _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=2; _nb_of_sons_con[0]=3;
277           _sons_con[1][0]=3; _sons_con[1][1]=5; _sons_con[1][2]=4; _nb_of_sons_con[1]=3;
278           _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;
279           _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;
280           _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;
281           _little_sons_con[0][0]=0; _little_sons_con[0][1]=1;  _nb_of_little_sons=9;
282           _little_sons_con[1][0]=1; _little_sons_con[1][1]=2;
283           _little_sons_con[2][0]=2; _little_sons_con[2][1]=0;
284           _little_sons_con[3][0]=3; _little_sons_con[3][1]=4;
285           _little_sons_con[4][0]=4; _little_sons_con[4][1]=5;
286           _little_sons_con[5][0]=5; _little_sons_con[5][1]=3;
287           _little_sons_con[6][0]=0; _little_sons_con[6][1]=3;
288           _little_sons_con[7][0]=1; _little_sons_con[7][1]=4;
289           _little_sons_con[8][0]=2; _little_sons_con[8][1]=5;
290         }
291         break;
292       case NORM_TETRA10:
293         {
294           _nb_of_pts=10; _nb_of_sons=4; _dim=3; _linear_type=NORM_TETRA4; _is_simplex=false;
295           _sons_type[0]=NORM_TRI6; _sons_type[1]=NORM_TRI6; _sons_type[2]=NORM_TRI6; _sons_type[3]=NORM_TRI6;
296           _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;
297           _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;
298           _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;
299           _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;
300           _little_sons_con[0][0]=0; _little_sons_con[0][1]=1;  _little_sons_con[0][2]=4;  _nb_of_little_sons=6;
301           _little_sons_con[1][0]=1; _little_sons_con[1][1]=2;  _little_sons_con[1][2]=5;
302           _little_sons_con[2][0]=2; _little_sons_con[2][1]=0;  _little_sons_con[2][2]=6;
303           _little_sons_con[3][0]=0; _little_sons_con[3][1]=3;  _little_sons_con[3][2]=7;
304           _little_sons_con[4][0]=1; _little_sons_con[4][1]=3;  _little_sons_con[4][2]=8;
305           _little_sons_con[5][0]=2; _little_sons_con[5][1]=3;  _little_sons_con[5][2]=9;
306         }
307         break;
308       case NORM_HEXGP12:
309         {
310           _nb_of_pts=12; _nb_of_sons=8; _dim=3; _is_simplex=false; _is_extruded=true;
311           _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;
312           _sons_type[6]=NORM_QUAD4; _sons_type[7]=NORM_QUAD4;
313           _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;
314           _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;
315           _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;
316           _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;
317           _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;
318           _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;
319           _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;
320           _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;
321         }
322         break;
323       case NORM_PYRA13:
324         {
325           _nb_of_pts=13; _nb_of_sons=5; _dim=3; _linear_type=NORM_PYRA5; _is_simplex=false;
326           _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;
327           _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;
328           _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;
329           _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;
330           _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;
331           _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;
332           _little_sons_con[0][0]=0; _little_sons_con[0][1]=1; _little_sons_con[0][2]=5;  _nb_of_little_sons=8;
333           _little_sons_con[1][0]=1; _little_sons_con[1][1]=2; _little_sons_con[1][2]=6;
334           _little_sons_con[2][0]=2; _little_sons_con[2][1]=3; _little_sons_con[2][2]=7;
335           _little_sons_con[3][0]=3; _little_sons_con[3][1]=0; _little_sons_con[3][2]=8;
336           _little_sons_con[4][0]=0; _little_sons_con[4][1]=4; _little_sons_con[4][2]=9;
337           _little_sons_con[5][0]=1; _little_sons_con[5][1]=4; _little_sons_con[5][2]=10;
338           _little_sons_con[6][0]=2; _little_sons_con[6][1]=4; _little_sons_con[6][2]=11;
339           _little_sons_con[7][0]=3; _little_sons_con[7][1]=4; _little_sons_con[7][2]=12;
340         }
341         break;
342       case NORM_PENTA15:
343         {
344           _nb_of_pts=15; _nb_of_sons=5; _dim=3; _linear_type=NORM_PENTA6; _is_simplex=false;
345           _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;
346           _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;
347           _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;
348           _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;
349           _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;
350           _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; _nb_of_sons_con[4]=8; _quadratic=true;
351           _little_sons_con[0][0]=0; _little_sons_con[0][1]=1; _little_sons_con[0][2]=6;  _nb_of_little_sons=9;
352           _little_sons_con[1][0]=1; _little_sons_con[1][1]=2; _little_sons_con[1][2]=7;
353           _little_sons_con[2][0]=2; _little_sons_con[2][1]=0; _little_sons_con[2][2]=8;
354           _little_sons_con[3][0]=3; _little_sons_con[3][1]=4; _little_sons_con[3][2]=9;
355           _little_sons_con[4][0]=4; _little_sons_con[4][1]=5; _little_sons_con[4][2]=10;
356           _little_sons_con[5][0]=5; _little_sons_con[5][1]=3; _little_sons_con[5][2]=11;
357           _little_sons_con[6][0]=0; _little_sons_con[6][1]=3; _little_sons_con[6][2]=12;
358           _little_sons_con[7][0]=1; _little_sons_con[7][1]=4; _little_sons_con[7][2]=13;
359           _little_sons_con[8][0]=2; _little_sons_con[8][1]=5; _little_sons_con[8][2]=14;
360         }
361         break;
362       case NORM_HEXA20:
363         {
364           _nb_of_pts=20; _nb_of_sons=6; _dim=3; _linear_type=NORM_HEXA8; _is_simplex=false;
365           _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;
366           _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;
367           _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;
368           _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;
369           _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;
370           _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;
371           _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;
372           _little_sons_con[0][0]=0; _little_sons_con[0][1]=1;  _little_sons_con[0][2]=8; _nb_of_little_sons=12;
373           _little_sons_con[1][0]=1; _little_sons_con[1][1]=2;  _little_sons_con[1][2]=9;
374           _little_sons_con[2][0]=2; _little_sons_con[2][1]=3;  _little_sons_con[2][2]=10;
375           _little_sons_con[3][0]=3; _little_sons_con[3][1]=0;  _little_sons_con[3][2]=11;
376           _little_sons_con[4][0]=4; _little_sons_con[4][1]=5;  _little_sons_con[4][2]=12;
377           _little_sons_con[5][0]=5; _little_sons_con[5][1]=6;  _little_sons_con[5][2]=13;
378           _little_sons_con[6][0]=6; _little_sons_con[6][1]=7;  _little_sons_con[6][2]=14;
379           _little_sons_con[7][0]=7; _little_sons_con[7][1]=4;  _little_sons_con[7][2]=15;
380           _little_sons_con[8][0]=0; _little_sons_con[8][1]=4;  _little_sons_con[8][2]=16;
381           _little_sons_con[9][0]=1; _little_sons_con[9][1]=5;  _little_sons_con[9][2]=17;
382           _little_sons_con[10][0]=2; _little_sons_con[10][1]=6;  _little_sons_con[10][2]=18;
383           _little_sons_con[11][0]=3; _little_sons_con[11][1]=7;  _little_sons_con[11][2]=19;
384         }
385         break;
386       case NORM_HEXA27:
387         {
388           _nb_of_pts=27; _nb_of_sons=6; _dim=3; _linear_type=NORM_HEXA8; _is_simplex=false;
389           _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;
390           _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;
391           _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;
392           _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;   
393           _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;
394           _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;
395           _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;
396           _quadratic=true;
397         }
398         break;
399       case NORM_POLYGON:
400         {
401           _nb_of_pts=0; _nb_of_sons=0; _dim=2; _dyn=true; _extruded_type=NORM_POLYHED; _is_simplex=false; _quadratic_type=NORM_QPOLYG;
402         }
403         break;
404       case NORM_POLYHED:
405         {
406           _nb_of_pts=0; _nb_of_sons=0; _dim=3; _dyn=true; _is_simplex=false;
407         }
408         break;
409       case NORM_QPOLYG:
410         {
411           _nb_of_pts=0; _nb_of_sons=0; _dim=2; _dyn=true; _is_simplex=false; _quadratic=true; _linear_type=NORM_POLYGON;
412         }
413         break;
414       case NORM_POLYL:
415         {
416           _nb_of_pts=0; _nb_of_sons=0; _dim=1; _dyn=true; _extruded_type=NORM_POLYGON; _is_simplex=false;
417         }
418         break;
419       case NORM_ERROR:
420         {
421           _nb_of_pts=std::numeric_limits<unsigned>::max(); _nb_of_sons=std::numeric_limits<unsigned>::max(); _dim=std::numeric_limits<unsigned>::max();
422         }
423         break;
424       }
425   }
426
427   /*!
428    * Equivalent to getNumberOfSons except that this method deals with dynamic type.
429    */
430   unsigned CellModel::getNumberOfSons2(const int *conn, int lgth) const
431   {
432     if(!isDynamic())
433       return getNumberOfSons();
434     if(_dim==2)
435       {
436         if(_type==NORM_POLYGON)
437           return lgth;
438         else
439           return lgth/2;
440       }
441     else if(_dim==1)
442       return lgth;//NORM_POLYL
443     else
444       return std::count(conn,conn+lgth,-1)+1;
445   }
446
447   unsigned CellModel::getNumberOfEdgesIn3D(const int *conn, int lgth) const
448   {
449     if(!isDynamic())
450       return _nb_of_little_sons;
451     else//polyhedron
452       return (lgth-std::count(conn,conn+lgth,-1))/2;
453   }
454   
455   /*!
456    * \sa fillMicroEdgeNodalConnectivity
457    */
458   unsigned CellModel::getNumberOfMicroEdges() const
459   {
460     unsigned mul(isQuadratic()?2:1);
461     if(!isDynamic())
462       {
463         switch(getDimension())
464           {
465           case 2:
466             return mul*getNumberOfSons();
467           case 3:
468             return mul*_nb_of_little_sons;
469           default:
470             throw INTERP_KERNEL::Exception("CellModel::getNumberOfMacroEdges : only 2D and 3D cells support this !");
471           }
472       }
473     else
474       throw INTERP_KERNEL::Exception("CellModel::getNumberOfMacroEdges : not supported by dynamic type !");
475   }
476   
477   NormalizedCellType CellModel::getCorrespondingPolyType() const
478   {
479     switch(getDimension())
480       {
481       case 0:
482         return NORM_POINT1;
483       case 1:
484         {
485           if(!isQuadratic())
486             return NORM_POLYL;
487           throw INTERP_KERNEL::Exception("CellModel::getPolyType : no poly type for quadratic 1D !");
488         }
489       case 2:
490         {
491           if(!isQuadratic())
492             return NORM_POLYGON;
493           else
494             return NORM_QPOLYG;
495         }
496       case 3:
497         {
498           if(!isQuadratic())
499             return NORM_POLYHED;
500           throw INTERP_KERNEL::Exception("CellModel::getPolyType : no poly type for quadratic 3D !");
501         }
502       default:
503         throw INTERP_KERNEL::Exception("CellModel::getPolyType : only dimension 0, 1, 2, 3 are supported !");
504       }
505   }
506
507   /*!
508    * Equivalent to getSonType except that this method deals with dynamic type.
509    */
510   NormalizedCellType CellModel::getSonType2(unsigned sonId) const
511   {
512     if(!isDynamic())
513       return getSonType(sonId);
514     if(_dim==2)
515       {
516         if(_type==NORM_POLYGON)
517           return NORM_SEG2;
518         else
519           return NORM_SEG3;
520       }
521     else if(_dim==1)
522       return NORM_ERROR;//NORM_POLYL
523     //polyedron
524     return NORM_POLYGON;
525   }
526
527   /*!
528    * \b WARNING this method do not manage correctly types that return true at the call of isDynamic. Use fillSonCellNodalConnectivity2 instead.
529    */
530   unsigned CellModel::fillSonCellNodalConnectivity(int sonId, const int *nodalConn, int *sonNodalConn) const
531   {
532     unsigned nbOfTurnLoop=_nb_of_sons_con[sonId];
533     const unsigned *sonConn=_sons_con[sonId];
534     for(unsigned i=0;i<nbOfTurnLoop;i++)
535       sonNodalConn[i]=nodalConn[sonConn[i]];
536     return nbOfTurnLoop;
537   }
538
539   unsigned CellModel::fillSonCellNodalConnectivity2(int sonId, const int *nodalConn, int lgth, int *sonNodalConn, NormalizedCellType& typeOfSon) const
540   {
541     typeOfSon=getSonType2(sonId);
542     if(!isDynamic())
543       return fillSonCellNodalConnectivity(sonId,nodalConn,sonNodalConn);
544     else
545       {
546         if(_dim==2)//polygon
547           {
548             if(_type==NORM_POLYGON)
549               {
550                 sonNodalConn[0]=nodalConn[sonId];
551                 sonNodalConn[1]=nodalConn[(sonId+1)%lgth];
552                 return 2;
553               }
554             else
555               {
556                 sonNodalConn[0]=nodalConn[sonId];
557                 sonNodalConn[1]=nodalConn[(sonId+1)%(lgth/2)];
558                 sonNodalConn[2]=nodalConn[sonId+(lgth/2)];
559                 return 3;
560               }
561           }
562         else if(_dim==3)
563           {//polyedron
564             const int *where=nodalConn;
565             for(int i=0;i<sonId;i++)
566               {
567                 where=std::find(where,nodalConn+lgth,-1);
568                 where++;
569               }
570             const int *where2=std::find(where,nodalConn+lgth,-1);
571             std::copy(where,where2,sonNodalConn);
572             return where2-where;
573           }
574         else
575           throw INTERP_KERNEL::Exception("CellModel::fillSonCellNodalConnectivity2 : no sons on NORM_POLYL !");
576       }
577   }
578   
579   /*!
580    * Equivalent to CellModel::fillSonCellNodalConnectivity2 except for HEXA8 where the order of sub faces is not has MED file numbering for transformation HEXA8->HEXA27
581    */
582   unsigned CellModel::fillSonCellNodalConnectivity4(int sonId, const int *nodalConn, int lgth, int *sonNodalConn, NormalizedCellType& typeOfSon) const
583   {
584     if(_type==NORM_HEXA8)
585       {
586         static const int permutation[6]={0,2,3,4,5,1};
587         return fillSonCellNodalConnectivity2(permutation[sonId],nodalConn,lgth,sonNodalConn,typeOfSon);
588       }
589     else
590       return fillSonCellNodalConnectivity2(sonId,nodalConn,lgth,sonNodalConn,typeOfSon);
591   }
592
593   unsigned CellModel::fillSonEdgesNodalConnectivity3D(int sonId, const int *nodalConn, int lgth, int *sonNodalConn, NormalizedCellType& typeOfSon) const
594   {
595     if(!isDynamic())
596       {
597         if(!isQuadratic())
598           {
599             typeOfSon=NORM_SEG2;
600             sonNodalConn[0]=nodalConn[_little_sons_con[sonId][0]];
601             sonNodalConn[1]=nodalConn[_little_sons_con[sonId][1]];
602             return 2;
603           }
604         else
605           {
606             typeOfSon=NORM_SEG3;
607             sonNodalConn[0]=nodalConn[_little_sons_con[sonId][0]];
608             sonNodalConn[1]=nodalConn[_little_sons_con[sonId][1]];
609             sonNodalConn[2]=nodalConn[_little_sons_con[sonId][2]];
610             return 3;
611           }
612       }
613     else
614       throw INTERP_KERNEL::Exception("CellModel::fillSonEdgesNodalConnectivity3D : not implemented yet for NORM_POLYHED !");   
615   }
616
617   /*!
618    * \sa getNumberOfMicroEdges
619    */
620   unsigned CellModel::fillMicroEdgeNodalConnectivity(int sonId, const int *nodalConn, int *sonNodalConn, NormalizedCellType& typeOfSon) const
621   {
622     if(isQuadratic())
623       {
624         int edgeId(sonId/2),subEdgeId(sonId%2);
625         typeOfSon=NORM_SEG2;
626         const unsigned *sonConn(0);
627         switch(getDimension())
628           {
629           case 2:
630             {
631               sonConn=_sons_con[edgeId];
632               break;
633             }
634           case 3:
635             {
636               sonConn=_little_sons_con[edgeId];
637               break;
638             }
639           default:
640             throw INTERP_KERNEL::Exception("CellModel::fillMicroEdgeNodalConnectivity : only 2D and 3D cells support this !");
641           }
642         const unsigned tmp[3]={sonConn[0],sonConn[2],sonConn[1]};
643         sonNodalConn[0]=nodalConn[tmp[subEdgeId]];
644         sonNodalConn[1]=nodalConn[tmp[subEdgeId+1]];
645         return 2;
646       }
647     else
648       {
649         switch(getDimension())
650           {
651           case 2:
652             return fillSonCellNodalConnectivity2(sonId,nodalConn,0,sonNodalConn,typeOfSon);
653           case 3:
654             return fillSonEdgesNodalConnectivity3D(sonId,nodalConn,0,sonNodalConn,typeOfSon);
655           default:
656             throw INTERP_KERNEL::Exception("CellModel::fillMicroEdgeNodalConnectivity : only 2D and 3D cells support this #2 !");
657           }
658       }
659   }
660
661   void CellModel::changeOrientationOf2D(int *nodalConn, unsigned int sz) const
662   {
663     if(sz<1)
664       return ;
665     if(!isQuadratic())
666       {
667         std::vector<int> tmp(sz-1);
668         std::copy(nodalConn+1,nodalConn+sz,tmp.rbegin());
669         std::copy(tmp.begin(),tmp.end(),nodalConn+1);
670       }
671     else
672       {
673         unsigned int sz2(sz/2);
674         std::vector<int> tmp0(sz2-1),tmp1(sz2);
675         std::copy(nodalConn+1,nodalConn+sz2,tmp0.rbegin());
676         std::copy(nodalConn+sz2,nodalConn+sz,tmp1.rbegin());
677         std::copy(tmp0.begin(),tmp0.end(),nodalConn+1);
678         std::copy(tmp1.begin(),tmp1.end(),nodalConn+sz2);
679       }
680   }
681
682   void CellModel::changeOrientationOf1D(int *nodalConn, unsigned int sz) const
683   {
684     if(!isDynamic())
685       {
686         if(sz==2 || sz==3)
687           {
688             std::swap(nodalConn[0],nodalConn[1]);
689             return ;
690           }
691         else if(sz==4)
692           {
693             std::swap(nodalConn[0],nodalConn[1]);
694             std::swap(nodalConn[2],nodalConn[3]);
695           }
696         else
697           throw Exception("CellModel::changeOrientationOf1D : unrecognized 1D cell type !");
698       }
699     else
700       {
701         std::vector<int> tmp(sz-1);
702         std::copy(nodalConn+1,nodalConn+sz,tmp.rbegin());
703         std::copy(tmp.begin(),tmp.end(),nodalConn+1);
704       }
705   }
706
707   //================================================================================
708   /*!
709    * \brief Return number of nodes in sonId-th son of a Dynamic() cell
710    */
711   //================================================================================
712
713   unsigned CellModel::getNumberOfNodesConstituentTheSon2(unsigned sonId, const int *nodalConn, int lgth) const
714   {
715     if(!isDynamic())
716       return getNumberOfNodesConstituentTheSon(sonId);
717
718     if(_dim==2)//polygon
719       {
720         if(_type==NORM_POLYGON)
721           return 2;
722         else
723           return 3;
724       }
725     else if(_dim==3)
726       {//polyedron
727         const int *where=nodalConn;
728         for(unsigned int i=0;i<sonId;i++)
729           {
730             where=std::find(where,nodalConn+lgth,-1);
731             where++;
732           }
733         const int *where2=std::find(where,nodalConn+lgth,-1);
734         return where2-where;
735       }
736     else
737       throw INTERP_KERNEL::Exception("CellModel::getNumberOfNodesConstituentTheSon2 : no sons on NORM_POLYL !");
738   }
739
740   /*!
741    * This method retrieves if cell1 represented by 'conn1' and cell2 represented by 'conn2'
742    * 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.
743    * If not an exception will be thrown.
744    * @return True if two cells have same orientation, false if not.
745    */
746   bool CellModel::getOrientationStatus(unsigned lgth, const int *conn1, const int *conn2) const
747   {
748     if(_dim!=1 && _dim!=2)
749       throw INTERP_KERNEL::Exception("CellModel::getOrientationStatus : invalid dimension ! Must be 1 or 2 !");
750     if(!_quadratic)
751       {
752         std::vector<int> tmp(2*lgth);
753         std::vector<int>::iterator it=std::copy(conn1,conn1+lgth,tmp.begin());
754         std::copy(conn1,conn1+lgth,it);
755         it=std::search(tmp.begin(),tmp.end(),conn2,conn2+lgth);
756         if(it==tmp.begin())
757           return true;
758         if(it!=tmp.end())
759           return _dim!=1;
760         std::vector<int>::reverse_iterator it2=std::search(tmp.rbegin(),tmp.rend(),conn2,conn2+lgth);
761         if(it2!=tmp.rend())
762           return false;
763         throw INTERP_KERNEL::Exception("CellModel::getOrientationStatus : Request of orientation status of non equal connectively cells !");
764       }
765     else
766       {
767         if(_dim!=1)
768           {
769             std::vector<int> tmp(lgth);
770             std::vector<int>::iterator it=std::copy(conn1,conn1+lgth/2,tmp.begin());
771             std::copy(conn1,conn1+lgth/2,it);
772             it=std::search(tmp.begin(),tmp.end(),conn2,conn2+lgth/2);
773             int d=std::distance(tmp.begin(),it);
774             if(it==tmp.end())
775               return false;
776             it=std::copy(conn1+lgth/2,conn1+lgth,tmp.begin());
777             std::copy(conn1+lgth/2,conn1+lgth,it);
778             it=std::search(tmp.begin(),tmp.end(),conn2,conn2+lgth);
779             if(it==tmp.end())
780               return false;
781             int d2=std::distance(tmp.begin(),it);
782             return d==d2;
783           }
784         else
785           {
786             int p=(lgth+1)/2;
787             std::vector<int> tmp(2*p);
788             std::vector<int>::iterator it=std::copy(conn1,conn1+p,tmp.begin());
789             std::copy(conn1,conn1+p,it);
790             it=std::search(tmp.begin(),tmp.end(),conn2,conn2+p);
791             int d=std::distance(tmp.begin(),it);
792             if(it==tmp.end())
793               return false;
794             tmp.resize(2*p-2);
795             it=std::copy(conn1+p,conn1+lgth,tmp.begin());
796             std::copy(conn1+p,conn1+lgth,it);
797             it=std::search(tmp.begin(),tmp.end(),conn2+p,conn2+lgth);
798             if(it==tmp.end())
799               return false;
800             int d2=std::distance(tmp.begin(),it);
801             return d==d2;
802           }
803       }
804   }
805   
806   DiameterCalculator *CellModel::buildInstanceOfDiameterCalulator(int spaceDim) const
807   {
808     switch(_type)
809       {
810       case NORM_TRI3:
811         {
812           switch(spaceDim)
813             {
814             case 2:
815               return new DiameterCalulatorTRI3S2;
816             case 3:
817               return new DiameterCalulatorTRI3S3;
818             default:
819               throw Exception("CellModel::buildInstanceOfDiameterCalulator : For TRI3 only space dimension 2 and 3 implemented !");
820             }
821           break;
822         }
823       case NORM_QUAD4:
824         {
825           switch(spaceDim)
826             {
827             case 2:
828               return new DiameterCalulatorQUAD4S2;
829             case 3:
830               return new DiameterCalulatorQUAD4S3;
831             default:
832               throw Exception("CellModel::buildInstanceOfDiameterCalulator : For QUAD4 only space dimension 2 and 3 implemented !");
833             }
834           break;
835         }
836       case NORM_TRI6:
837         {
838           switch(spaceDim)
839           {
840             case 2:
841               return new DiameterCalulatorTRI6S2;
842             case 3:
843               return new DiameterCalulatorTRI6S3;
844             default:
845               throw Exception("CellModel::buildInstanceOfDiameterCalulator : For TRI6 only space dimension 2 and 3 implemented !");
846           }
847           break;
848         }
849       case NORM_TRI7:
850         {
851           switch(spaceDim)
852           {
853             case 2:
854               return new DiameterCalulatorTRI7S2;
855             case 3:
856               return new DiameterCalulatorTRI7S3;
857             default:
858               throw Exception("CellModel::buildInstanceOfDiameterCalulator : For TRI7 only space dimension 2 and 3 implemented !");
859           }
860           break;
861         }
862       case NORM_QUAD8:
863         {
864           switch(spaceDim)
865           {
866             case 2:
867               return new DiameterCalulatorQUAD8S2;
868             case 3:
869               return new DiameterCalulatorQUAD8S3;
870             default:
871               throw Exception("CellModel::buildInstanceOfDiameterCalulator : For QUAD8 only space dimension 2 and 3 implemented !");
872           }
873           break;
874         }
875       case NORM_QUAD9:
876         {
877           switch(spaceDim)
878           {
879             case 2:
880               return new DiameterCalulatorQUAD9S2;
881             case 3:
882               return new DiameterCalulatorQUAD9S3;
883             default:
884               throw Exception("CellModel::buildInstanceOfDiameterCalulator : For QUAD9 only space dimension 2 and 3 implemented !");
885           }
886           break;
887         }
888       case NORM_TETRA4:
889         {
890           if(spaceDim==3)
891             return new DiameterCalulatorTETRA4;
892           else
893             throw Exception("CellModel::buildInstanceOfDiameterCalulator : For TETRA4 space dimension 3 expected !");
894         }
895       case NORM_TETRA10:
896         {
897           if(spaceDim==3)
898             return new DiameterCalulatorTETRA10;
899           else
900             throw Exception("CellModel::buildInstanceOfDiameterCalulator : For TETRA10 space dimension 3 expected !");
901         }
902       case NORM_HEXA8:
903         {
904           if(spaceDim==3)
905             return new DiameterCalulatorHEXA8;
906           else
907             throw Exception("CellModel::buildInstanceOfDiameterCalulator : For HEXA8 space dimension 3 expected !");
908         }
909       case NORM_HEXA20:
910         {
911           if(spaceDim==3)
912             return new DiameterCalulatorHEXA20;
913           else
914             throw Exception("CellModel::buildInstanceOfDiameterCalulator : For HEXA20 space dimension 3 expected !");
915         }
916       case NORM_HEXA27:
917         {
918           if(spaceDim==3)
919             return new DiameterCalulatorHEXA27;
920           else
921             throw Exception("CellModel::buildInstanceOfDiameterCalulator : For HEXA27 space dimension 3 expected !");
922         }
923       case NORM_PENTA6:
924         {
925           if(spaceDim==3)
926             return new DiameterCalulatorPENTA6;
927           else
928             throw Exception("CellModel::buildInstanceOfDiameterCalulator : For PENTA6 space dimension 3 expected !");
929         }
930       case NORM_PENTA15:
931         {
932           if(spaceDim==3)
933             return new DiameterCalulatorPENTA15;
934           else
935             throw Exception("CellModel::buildInstanceOfDiameterCalulator : For PENTA15 space dimension 3 expected !");
936         }
937       case NORM_PYRA5:
938         {
939           if(spaceDim==3)
940             return new DiameterCalulatorPYRA5;
941           else
942             throw Exception("CellModel::buildInstanceOfDiameterCalulator : For PYRA5 space dimension 3 expected !");
943         }
944       case NORM_PYRA13:
945         {
946           if(spaceDim==3)
947             return new DiameterCalulatorPYRA13;
948           else
949             throw Exception("CellModel::buildInstanceOfDiameterCalulator : For PYRA13 space dimension 3 expected !");
950         }
951       default:
952         throw Exception("CellModel::buildInstanceOfDiameterCalulator : implemented only for TRI3, QUAD4, TETRA4, HEXA8, PENTA6, PYRA5 !");
953       }
954   }
955 }