Salome HOME
merge conflict
[modules/med.git] / src / medtool / src / INTERP_KERNEL / CellModel.cxx
1 // Copyright (C) 2007-2015  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   NormalizedCellType CellModel::getCorrespondingPolyType() const
456   {
457     switch(getDimension())
458       {
459       case 0:
460         return NORM_POINT1;
461       case 1:
462         {
463           if(!isQuadratic())
464             return NORM_POLYL;
465           throw INTERP_KERNEL::Exception("CellModel::getPolyType : no poly type for quadratic 1D !");
466         }
467       case 2:
468         {
469           if(!isQuadratic())
470             return NORM_POLYGON;
471           else
472             return NORM_QPOLYG;
473         }
474       case 3:
475         {
476           if(!isQuadratic())
477             return NORM_POLYHED;
478           throw INTERP_KERNEL::Exception("CellModel::getPolyType : no poly type for quadratic 3D !");
479         }
480       default:
481         throw INTERP_KERNEL::Exception("CellModel::getPolyType : only dimension 0, 1, 2, 3 are supported !");
482       }
483   }
484
485   /*!
486    * Equivalent to getSonType except that this method deals with dynamic type.
487    */
488   NormalizedCellType CellModel::getSonType2(unsigned sonId) const
489   {
490     if(!isDynamic())
491       return getSonType(sonId);
492     if(_dim==2)
493       {
494         if(_type==NORM_POLYGON)
495           return NORM_SEG2;
496         else
497           return NORM_SEG3;
498       }
499     else if(_dim==1)
500       return NORM_ERROR;//NORM_POLYL
501     //polyedron
502     return NORM_POLYGON;
503   }
504
505   /*!
506    * \b WARNING this method do not manage correctly types that return true at the call of isDynamic. Use fillSonCellNodalConnectivity2 instead.
507    */
508   unsigned CellModel::fillSonCellNodalConnectivity(int sonId, const int *nodalConn, int *sonNodalConn) const
509   {
510     unsigned nbOfTurnLoop=_nb_of_sons_con[sonId];
511     const unsigned *sonConn=_sons_con[sonId];
512     for(unsigned i=0;i<nbOfTurnLoop;i++)
513       sonNodalConn[i]=nodalConn[sonConn[i]];
514     return nbOfTurnLoop;
515   }
516
517   unsigned CellModel::fillSonCellNodalConnectivity2(int sonId, const int *nodalConn, int lgth, int *sonNodalConn, NormalizedCellType& typeOfSon) const
518   {
519     typeOfSon=getSonType2(sonId);
520     if(!isDynamic())
521       return fillSonCellNodalConnectivity(sonId,nodalConn,sonNodalConn);
522     else
523       {
524         if(_dim==2)//polygon
525           {
526             if(_type==NORM_POLYGON)
527               {
528                 sonNodalConn[0]=nodalConn[sonId];
529                 sonNodalConn[1]=nodalConn[(sonId+1)%lgth];
530                 return 2;
531               }
532             else
533               {
534                 sonNodalConn[0]=nodalConn[sonId];
535                 sonNodalConn[1]=nodalConn[(sonId+1)%(lgth/2)];
536                 sonNodalConn[2]=nodalConn[sonId+(lgth/2)];
537                 return 3;
538               }
539           }
540         else if(_dim==3)
541           {//polyedron
542             const int *where=nodalConn;
543             for(int i=0;i<sonId;i++)
544               {
545                 where=std::find(where,nodalConn+lgth,-1);
546                 where++;
547               }
548             const int *where2=std::find(where,nodalConn+lgth,-1);
549             std::copy(where,where2,sonNodalConn);
550             return where2-where;
551           }
552         else
553           throw INTERP_KERNEL::Exception("CellModel::fillSonCellNodalConnectivity2 : no sons on NORM_POLYL !");
554       }
555   }
556   
557   /*!
558    * Equivalent to CellModel::fillSonCellNodalConnectivity2 except for HEXA8 where the order of sub faces is not has MED file numbering for transformation HEXA8->HEXA27
559    */
560   unsigned CellModel::fillSonCellNodalConnectivity4(int sonId, const int *nodalConn, int lgth, int *sonNodalConn, NormalizedCellType& typeOfSon) const
561   {
562     if(_type==NORM_HEXA8)
563       {
564         static const int permutation[6]={0,2,3,4,5,1};
565         return fillSonCellNodalConnectivity2(permutation[sonId],nodalConn,lgth,sonNodalConn,typeOfSon);
566       }
567     else
568       return fillSonCellNodalConnectivity2(sonId,nodalConn,lgth,sonNodalConn,typeOfSon);
569   }
570
571   unsigned CellModel::fillSonEdgesNodalConnectivity3D(int sonId, const int *nodalConn, int lgth, int *sonNodalConn, NormalizedCellType& typeOfSon) const
572   {
573     if(!isDynamic())
574       {
575         if(!isQuadratic())
576           {
577             typeOfSon=NORM_SEG2;
578             sonNodalConn[0]=nodalConn[_little_sons_con[sonId][0]];
579             sonNodalConn[1]=nodalConn[_little_sons_con[sonId][1]];
580             return 2;
581           }
582         else
583           {
584             typeOfSon=NORM_SEG3;
585             sonNodalConn[0]=nodalConn[_little_sons_con[sonId][0]];
586             sonNodalConn[1]=nodalConn[_little_sons_con[sonId][1]];
587             sonNodalConn[2]=nodalConn[_little_sons_con[sonId][2]];
588             return 3;
589           }
590       }
591     else
592       throw INTERP_KERNEL::Exception("CellModel::fillSonEdgesNodalConnectivity3D : not implemented yet for NORM_POLYHED !");   
593   }
594
595   void CellModel::changeOrientationOf2D(int *nodalConn, unsigned int sz) const
596   {
597     if(sz<1)
598       return ;
599     if(!isQuadratic())
600       {
601         std::vector<int> tmp(sz-1);
602         std::copy(nodalConn+1,nodalConn+sz,tmp.rbegin());
603         std::copy(tmp.begin(),tmp.end(),nodalConn+1);
604       }
605     else
606       {
607         unsigned int sz2(sz/2);
608         std::vector<int> tmp0(sz2-1),tmp1(sz2);
609         std::copy(nodalConn+1,nodalConn+sz2,tmp0.rbegin());
610         std::copy(nodalConn+sz2,nodalConn+sz,tmp1.rbegin());
611         std::copy(tmp0.begin(),tmp0.end(),nodalConn+1);
612         std::copy(tmp1.begin(),tmp1.end(),nodalConn+sz2);
613       }
614   }
615
616   void CellModel::changeOrientationOf1D(int *nodalConn, unsigned int sz) const
617   {
618     if(!isDynamic())
619       {
620         if(sz==2 || sz==3)
621           {
622             std::swap(nodalConn[0],nodalConn[1]);
623             return ;
624           }
625         else if(sz==4)
626           {
627             std::swap(nodalConn[0],nodalConn[1]);
628             std::swap(nodalConn[2],nodalConn[3]);
629           }
630         else
631           throw Exception("CellModel::changeOrientationOf1D : unrecognized 1D cell type !");
632       }
633     else
634       {
635         std::vector<int> tmp(sz-1);
636         std::copy(nodalConn+1,nodalConn+sz,tmp.rbegin());
637         std::copy(tmp.begin(),tmp.end(),nodalConn+1);
638       }
639   }
640
641   //================================================================================
642   /*!
643    * \brief Return number of nodes in sonId-th son of a Dynamic() cell
644    */
645   //================================================================================
646
647   unsigned CellModel::getNumberOfNodesConstituentTheSon2(unsigned sonId, const int *nodalConn, int lgth) const
648   {
649     if(!isDynamic())
650       return getNumberOfNodesConstituentTheSon(sonId);
651
652     if(_dim==2)//polygon
653       {
654         if(_type==NORM_POLYGON)
655           return 2;
656         else
657           return 3;
658       }
659     else if(_dim==3)
660       {//polyedron
661         const int *where=nodalConn;
662         for(unsigned int i=0;i<sonId;i++)
663           {
664             where=std::find(where,nodalConn+lgth,-1);
665             where++;
666           }
667         const int *where2=std::find(where,nodalConn+lgth,-1);
668         return where2-where;
669       }
670     else
671       throw INTERP_KERNEL::Exception("CellModel::getNumberOfNodesConstituentTheSon2 : no sons on NORM_POLYL !");
672   }
673
674   /*!
675    * This method retrieves if cell1 represented by 'conn1' and cell2 represented by 'conn2'
676    * 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.
677    * If not an exception will be thrown.
678    * @return True if two cells have same orientation, false if not.
679    */
680   bool CellModel::getOrientationStatus(unsigned lgth, const int *conn1, const int *conn2) const
681   {
682     if(_dim!=1 && _dim!=2)
683       throw INTERP_KERNEL::Exception("CellModel::getOrientationStatus : invalid dimension ! Must be 1 or 2 !");
684     if(!_quadratic)
685       {
686         std::vector<int> tmp(2*lgth);
687         std::vector<int>::iterator it=std::copy(conn1,conn1+lgth,tmp.begin());
688         std::copy(conn1,conn1+lgth,it);
689         it=std::search(tmp.begin(),tmp.end(),conn2,conn2+lgth);
690         if(it==tmp.begin())
691           return true;
692         if(it!=tmp.end())
693           return _dim!=1;
694         std::vector<int>::reverse_iterator it2=std::search(tmp.rbegin(),tmp.rend(),conn2,conn2+lgth);
695         if(it2!=tmp.rend())
696           return false;
697         throw INTERP_KERNEL::Exception("CellModel::getOrientationStatus : Request of orientation status of non equal connectively cells !");
698       }
699     else
700       {
701         if(_dim!=1)
702           {
703             std::vector<int> tmp(lgth);
704             std::vector<int>::iterator it=std::copy(conn1,conn1+lgth/2,tmp.begin());
705             std::copy(conn1,conn1+lgth/2,it);
706             it=std::search(tmp.begin(),tmp.end(),conn2,conn2+lgth/2);
707             int d=std::distance(tmp.begin(),it);
708             if(it==tmp.end())
709               return false;
710             it=std::copy(conn1+lgth/2,conn1+lgth,tmp.begin());
711             std::copy(conn1+lgth/2,conn1+lgth,it);
712             it=std::search(tmp.begin(),tmp.end(),conn2,conn2+lgth);
713             if(it==tmp.end())
714               return false;
715             int d2=std::distance(tmp.begin(),it);
716             return d==d2;
717           }
718         else
719           {
720             int p=(lgth+1)/2;
721             std::vector<int> tmp(2*p);
722             std::vector<int>::iterator it=std::copy(conn1,conn1+p,tmp.begin());
723             std::copy(conn1,conn1+p,it);
724             it=std::search(tmp.begin(),tmp.end(),conn2,conn2+p);
725             int d=std::distance(tmp.begin(),it);
726             if(it==tmp.end())
727               return false;
728             tmp.resize(2*p-2);
729             it=std::copy(conn1+p,conn1+lgth,tmp.begin());
730             std::copy(conn1+p,conn1+lgth,it);
731             it=std::search(tmp.begin(),tmp.end(),conn2+p,conn2+lgth);
732             if(it==tmp.end())
733               return false;
734             int d2=std::distance(tmp.begin(),it);
735             return d==d2;
736           }
737       }
738   }
739   
740   DiameterCalculator *CellModel::buildInstanceOfDiameterCalulator(int spaceDim) const
741   {
742     switch(_type)
743       {
744       case NORM_TRI3:
745         {
746           switch(spaceDim)
747             {
748             case 2:
749               return new DiameterCalulatorTRI3S2;
750             case 3:
751               return new DiameterCalulatorTRI3S3;
752             default:
753               throw Exception("CellModel::buildInstanceOfDiameterCalulator : For TRI3 only space dimension 2 and 3 implemented !");
754             }
755           break;
756         }
757       case NORM_QUAD4:
758         {
759           switch(spaceDim)
760             {
761             case 2:
762               return new DiameterCalulatorQUAD4S2;
763             case 3:
764               return new DiameterCalulatorQUAD4S3;
765             default:
766               throw Exception("CellModel::buildInstanceOfDiameterCalulator : For QUAD4 only space dimension 2 and 3 implemented !");
767             }
768           break;
769         }
770       case NORM_TRI6:
771         {
772           switch(spaceDim)
773           {
774             case 2:
775               return new DiameterCalulatorTRI6S2;
776             case 3:
777               return new DiameterCalulatorTRI6S3;
778             default:
779               throw Exception("CellModel::buildInstanceOfDiameterCalulator : For TRI6 only space dimension 2 and 3 implemented !");
780           }
781           break;
782         }
783       case NORM_TRI7:
784         {
785           switch(spaceDim)
786           {
787             case 2:
788               return new DiameterCalulatorTRI7S2;
789             case 3:
790               return new DiameterCalulatorTRI7S3;
791             default:
792               throw Exception("CellModel::buildInstanceOfDiameterCalulator : For TRI7 only space dimension 2 and 3 implemented !");
793           }
794           break;
795         }
796       case NORM_QUAD8:
797         {
798           switch(spaceDim)
799           {
800             case 2:
801               return new DiameterCalulatorQUAD8S2;
802             case 3:
803               return new DiameterCalulatorQUAD8S3;
804             default:
805               throw Exception("CellModel::buildInstanceOfDiameterCalulator : For QUAD8 only space dimension 2 and 3 implemented !");
806           }
807           break;
808         }
809       case NORM_QUAD9:
810         {
811           switch(spaceDim)
812           {
813             case 2:
814               return new DiameterCalulatorQUAD9S2;
815             case 3:
816               return new DiameterCalulatorQUAD9S3;
817             default:
818               throw Exception("CellModel::buildInstanceOfDiameterCalulator : For QUAD9 only space dimension 2 and 3 implemented !");
819           }
820           break;
821         }
822       case NORM_TETRA4:
823         {
824           if(spaceDim==3)
825             return new DiameterCalulatorTETRA4;
826           else
827             throw Exception("CellModel::buildInstanceOfDiameterCalulator : For TETRA4 space dimension 3 expected !");
828         }
829       case NORM_TETRA10:
830         {
831           if(spaceDim==3)
832             return new DiameterCalulatorTETRA10;
833           else
834             throw Exception("CellModel::buildInstanceOfDiameterCalulator : For TETRA10 space dimension 3 expected !");
835         }
836       case NORM_HEXA8:
837         {
838           if(spaceDim==3)
839             return new DiameterCalulatorHEXA8;
840           else
841             throw Exception("CellModel::buildInstanceOfDiameterCalulator : For HEXA8 space dimension 3 expected !");
842         }
843       case NORM_HEXA20:
844         {
845           if(spaceDim==3)
846             return new DiameterCalulatorHEXA20;
847           else
848             throw Exception("CellModel::buildInstanceOfDiameterCalulator : For HEXA20 space dimension 3 expected !");
849         }
850       case NORM_HEXA27:
851         {
852           if(spaceDim==3)
853             return new DiameterCalulatorHEXA27;
854           else
855             throw Exception("CellModel::buildInstanceOfDiameterCalulator : For HEXA27 space dimension 3 expected !");
856         }
857       case NORM_PENTA6:
858         {
859           if(spaceDim==3)
860             return new DiameterCalulatorPENTA6;
861           else
862             throw Exception("CellModel::buildInstanceOfDiameterCalulator : For PENTA6 space dimension 3 expected !");
863         }
864       case NORM_PENTA15:
865         {
866           if(spaceDim==3)
867             return new DiameterCalulatorPENTA15;
868           else
869             throw Exception("CellModel::buildInstanceOfDiameterCalulator : For PENTA15 space dimension 3 expected !");
870         }
871       case NORM_PYRA5:
872         {
873           if(spaceDim==3)
874             return new DiameterCalulatorPYRA5;
875           else
876             throw Exception("CellModel::buildInstanceOfDiameterCalulator : For PYRA5 space dimension 3 expected !");
877         }
878       case NORM_PYRA13:
879         {
880           if(spaceDim==3)
881             return new DiameterCalulatorPYRA13;
882           else
883             throw Exception("CellModel::buildInstanceOfDiameterCalulator : For PYRA13 space dimension 3 expected !");
884         }
885       default:
886         throw Exception("CellModel::buildInstanceOfDiameterCalulator : implemented only for TRI3, QUAD4, TETRA4, HEXA8, PENTA6, PYRA5 !");
887       }
888   }
889 }