Salome HOME
Revert "Synchronize adm files"
[modules/med.git] / src / INTERP_KERNEL / CellModel.cxx
1 // Copyright (C) 2007-2014  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
25 #include <algorithm>
26 #include <sstream>
27 #include <vector>
28 #include <limits>
29
30 namespace INTERP_KERNEL
31 {
32   const char *CellModel::CELL_TYPES_REPR[]={"NORM_POINT1", "NORM_SEG2", "NORM_SEG3", "NORM_TRI3", "NORM_QUAD4",// 0->4
33                                             "NORM_POLYGON", "NORM_TRI6", "NORM_TRI7" , "NORM_QUAD8", "NORM_QUAD9",//5->9
34                                             "NORM_SEG4", "", "", "", "NORM_TETRA4",//10->14
35                                             "NORM_PYRA5", "NORM_PENTA6", "", "NORM_HEXA8", "",//15->19
36                                             "NORM_TETRA10", "", "NORM_HEXGP12", "NORM_PYRA13", "",//20->24
37                                             "NORM_PENTA15", "", "NORM_HEXA27", "", "",//25->29
38                                             "NORM_HEXA20", "NORM_POLYHED", "NORM_QPOLYG", "NORM_POLYL", "",//30->34
39                                             "", "", "", "", "",//35->39
40                                             "NORM_ERROR"};
41
42   std::map<NormalizedCellType,CellModel> CellModel::_map_of_unique_instance;
43
44   const CellModel& CellModel::GetCellModel(NormalizedCellType type)
45   {
46     if(_map_of_unique_instance.empty())
47       buildUniqueInstance();
48     const std::map<NormalizedCellType,CellModel>::iterator iter=_map_of_unique_instance.find(type);
49     if(iter==_map_of_unique_instance.end())
50       {
51         std::ostringstream stream; stream << "no cellmodel for normalized type " << type;
52         throw Exception(stream.str().c_str());
53       }
54     return (*iter).second;
55   }
56
57   const char *CellModel::getRepr() const
58   {
59     return CELL_TYPES_REPR[(int)_type];
60   }
61
62   /*!
63    * This method is compatible with all types including dynamic one.
64    */
65   bool CellModel::isCompatibleWith(NormalizedCellType type) const
66   {
67     if(_type==type)
68       return true;
69     const CellModel& other=GetCellModel(type);
70     if(_dim!=other.getDimension())
71       return false;
72     bool b1=isQuadratic();
73     bool b2=other.isQuadratic();
74     if((b1 && !b2) || (!b1 && b2))
75       return false;
76     b1=isDynamic();
77     b2=other.isDynamic();
78     return b1 || b2;
79   }
80
81   void CellModel::buildUniqueInstance()
82   {
83     _map_of_unique_instance.insert(std::make_pair(NORM_POINT1,CellModel(NORM_POINT1)));
84     _map_of_unique_instance.insert(std::make_pair(NORM_SEG2,CellModel(NORM_SEG2)));
85     _map_of_unique_instance.insert(std::make_pair(NORM_SEG3,CellModel(NORM_SEG3)));
86     _map_of_unique_instance.insert(std::make_pair(NORM_SEG4,CellModel(NORM_SEG4)));
87     _map_of_unique_instance.insert(std::make_pair(NORM_TRI3,CellModel(NORM_TRI3)));
88     _map_of_unique_instance.insert(std::make_pair(NORM_QUAD4,CellModel(NORM_QUAD4)));
89     _map_of_unique_instance.insert(std::make_pair(NORM_TRI6,CellModel(NORM_TRI6)));
90     _map_of_unique_instance.insert(std::make_pair(NORM_TRI7,CellModel(NORM_TRI7)));
91     _map_of_unique_instance.insert(std::make_pair(NORM_QUAD8,CellModel(NORM_QUAD8)));
92     _map_of_unique_instance.insert(std::make_pair(NORM_QUAD9,CellModel(NORM_QUAD9)));
93     _map_of_unique_instance.insert(std::make_pair(NORM_TETRA4,CellModel(NORM_TETRA4)));
94     _map_of_unique_instance.insert(std::make_pair(NORM_HEXA8,CellModel(NORM_HEXA8)));
95     _map_of_unique_instance.insert(std::make_pair(NORM_PYRA5,CellModel(NORM_PYRA5)));
96     _map_of_unique_instance.insert(std::make_pair(NORM_PENTA6,CellModel(NORM_PENTA6)));
97     _map_of_unique_instance.insert(std::make_pair(NORM_TETRA10,CellModel(NORM_TETRA10)));
98     _map_of_unique_instance.insert(std::make_pair(NORM_HEXGP12,CellModel(NORM_HEXGP12)));
99     _map_of_unique_instance.insert(std::make_pair(NORM_PYRA13,CellModel(NORM_PYRA13)));
100     _map_of_unique_instance.insert(std::make_pair(NORM_PENTA15,CellModel(NORM_PENTA15)));
101     _map_of_unique_instance.insert(std::make_pair(NORM_HEXA20,CellModel(NORM_HEXA20)));
102     _map_of_unique_instance.insert(std::make_pair(NORM_HEXA27,CellModel(NORM_HEXA27)));
103     _map_of_unique_instance.insert(std::make_pair(NORM_POLYGON,CellModel(NORM_POLYGON)));
104     _map_of_unique_instance.insert(std::make_pair(NORM_POLYHED,CellModel(NORM_POLYHED)));
105     _map_of_unique_instance.insert(std::make_pair(NORM_QPOLYG,CellModel(NORM_QPOLYG)));
106     _map_of_unique_instance.insert(std::make_pair(NORM_POLYL,CellModel(NORM_POLYL)));
107     _map_of_unique_instance.insert(std::make_pair(NORM_ERROR,CellModel(NORM_ERROR)));
108   }
109
110   CellModel::CellModel(NormalizedCellType type):_type(type)
111   {
112     _is_extruded=false;
113     _quadratic=false;
114     _dyn=false;
115     _extruded_type=NORM_ERROR;
116     _reverse_extruded_type=NORM_ERROR;
117     _linear_type=NORM_ERROR;
118     _quadratic_type=NORM_ERROR;
119     _quadratic_type2=NORM_ERROR;
120     _nb_of_little_sons=std::numeric_limits<unsigned>::max();
121     switch(type)
122       {
123       case NORM_POINT1:
124         {
125           _nb_of_pts=1; _nb_of_sons=0; _dim=0; _extruded_type=NORM_SEG2; _is_simplex=true;
126         }
127         break;
128       case NORM_SEG2:
129         {
130           _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;
131           _sons_type[0]=NORM_POINT1; _sons_type[1]=NORM_POINT1;
132           _sons_con[0][0]=0; _nb_of_sons_con[0]=1;
133           _sons_con[1][0]=1; _nb_of_sons_con[1]=1;
134         }
135         break;
136       case NORM_SEG3:
137         {
138           _nb_of_pts=3; _nb_of_sons=3; _dim=1; _extruded_type=NORM_QUAD8; _linear_type=NORM_SEG2; _quadratic=true; _is_simplex=false;
139           _sons_type[0]=NORM_POINT1; _sons_type[1]=NORM_POINT1; _sons_type[2]=NORM_POINT1;
140           _sons_con[0][0]=0; _nb_of_sons_con[0]=1;
141           _sons_con[1][0]=1; _nb_of_sons_con[1]=1;
142           _sons_con[2][0]=2; _nb_of_sons_con[2]=1;
143         }
144         break;
145       case NORM_SEG4:
146         {
147           _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
148           _sons_type[0]=NORM_POINT1; _sons_type[1]=NORM_POINT1; _sons_type[2]=NORM_POINT1; _sons_type[3]=NORM_POINT1;
149           _sons_con[0][0]=0; _nb_of_sons_con[0]=1;
150           _sons_con[1][0]=1; _nb_of_sons_con[1]=1;
151           _sons_con[2][0]=2; _nb_of_sons_con[2]=1;
152           _sons_con[3][0]=3; _nb_of_sons_con[3]=1;
153         }
154         break;
155       case NORM_TETRA4:
156         {
157           _nb_of_pts=4; _nb_of_sons=4; _dim=3; _quadratic_type=NORM_TETRA10; _is_simplex=true;
158           _sons_type[0]=NORM_TRI3; _sons_type[1]=NORM_TRI3; _sons_type[2]=NORM_TRI3; _sons_type[3]=NORM_TRI3;
159           _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=2; _nb_of_sons_con[0]=3;
160           _sons_con[1][0]=0; _sons_con[1][1]=3; _sons_con[1][2]=1; _nb_of_sons_con[1]=3;
161           _sons_con[2][0]=1; _sons_con[2][1]=3; _sons_con[2][2]=2; _nb_of_sons_con[2]=3;
162           _sons_con[3][0]=2; _sons_con[3][1]=3; _sons_con[3][2]=0; _nb_of_sons_con[3]=3;
163           _little_sons_con[0][0]=0; _little_sons_con[0][1]=1;  _nb_of_little_sons=6;
164           _little_sons_con[1][0]=1; _little_sons_con[1][1]=2;
165           _little_sons_con[2][0]=2; _little_sons_con[2][1]=0;
166           _little_sons_con[3][0]=0; _little_sons_con[3][1]=3;
167           _little_sons_con[4][0]=1; _little_sons_con[4][1]=3;
168           _little_sons_con[5][0]=2; _little_sons_con[5][1]=3;
169         }
170         break;
171       case NORM_HEXA8:
172         {
173           _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;
174           _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;
175           _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;
176           _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;
177           _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;
178           _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;
179           _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;
180           _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;
181           _little_sons_con[0][0]=0; _little_sons_con[0][1]=1;  _nb_of_little_sons=12;
182           _little_sons_con[1][0]=1; _little_sons_con[1][1]=2;
183           _little_sons_con[2][0]=2; _little_sons_con[2][1]=3;
184           _little_sons_con[3][0]=3; _little_sons_con[3][1]=0;
185           _little_sons_con[4][0]=4; _little_sons_con[4][1]=5;
186           _little_sons_con[5][0]=5; _little_sons_con[5][1]=6;
187           _little_sons_con[6][0]=6; _little_sons_con[6][1]=7;
188           _little_sons_con[7][0]=7; _little_sons_con[7][1]=4;
189           _little_sons_con[8][0]=0; _little_sons_con[8][1]=4;
190           _little_sons_con[9][0]=1; _little_sons_con[9][1]=5;
191           _little_sons_con[10][0]=2; _little_sons_con[10][1]=6;
192           _little_sons_con[11][0]=3; _little_sons_con[11][1]=7;
193         }
194         break;
195       case NORM_QUAD4:
196         {
197           _nb_of_pts=4; _nb_of_sons=4; _dim=2; _quadratic_type=NORM_QUAD8; _quadratic_type2=NORM_QUAD9; _is_simplex=false; _is_extruded=true;
198           _sons_type[0]=NORM_SEG2; _sons_type[1]=NORM_SEG2; _sons_type[2]=NORM_SEG2; _sons_type[3]=NORM_SEG2;
199           _sons_con[0][0]=0; _sons_con[0][1]=1; _nb_of_sons_con[0]=2;
200           _sons_con[1][0]=1; _sons_con[1][1]=2; _nb_of_sons_con[1]=2;
201           _sons_con[2][0]=2; _sons_con[2][1]=3; _nb_of_sons_con[2]=2;
202           _sons_con[3][0]=3; _sons_con[3][1]=0; _nb_of_sons_con[3]=2; _extruded_type=NORM_HEXA8;
203         }
204         break;
205       case NORM_TRI3:
206         {
207           _nb_of_pts=3; _nb_of_sons=3; _dim=2; _quadratic_type=NORM_TRI6; _quadratic_type2=NORM_TRI7; _is_simplex=true;
208           _sons_type[0]=NORM_SEG2; _sons_type[1]=NORM_SEG2; _sons_type[2]=NORM_SEG2;
209           _sons_con[0][0]=0; _sons_con[0][1]=1; _nb_of_sons_con[0]=2;
210           _sons_con[1][0]=1; _sons_con[1][1]=2; _nb_of_sons_con[1]=2;
211           _sons_con[2][0]=2; _sons_con[2][1]=0; _nb_of_sons_con[2]=2; _extruded_type=NORM_PENTA6;
212         }
213         break;
214       case NORM_TRI6:
215         {
216           _nb_of_pts=6; _nb_of_sons=3; _dim=2; _linear_type=NORM_TRI3; _is_simplex=false;
217           _sons_type[0]=NORM_SEG3; _sons_type[1]=NORM_SEG3; _sons_type[2]=NORM_SEG3;
218           _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=3; _nb_of_sons_con[0]=3;
219           _sons_con[1][0]=1; _sons_con[1][1]=2; _sons_con[1][2]=4; _nb_of_sons_con[1]=3;
220           _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;
221         }
222         break;
223       case NORM_TRI7:
224         {
225           _nb_of_pts=7; _nb_of_sons=3; _dim=2; _linear_type=NORM_TRI3; _is_simplex=false;
226           _sons_type[0]=NORM_SEG3; _sons_type[1]=NORM_SEG3; _sons_type[2]=NORM_SEG3;
227           _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=3; _nb_of_sons_con[0]=3;
228           _sons_con[1][0]=1; _sons_con[1][1]=2; _sons_con[1][2]=4; _nb_of_sons_con[1]=3;
229           _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
230         }
231         break;
232       case NORM_QUAD8:
233         {
234           _nb_of_pts=8; _nb_of_sons=4; _dim=2; _linear_type=NORM_QUAD4; _is_simplex=false;
235           _sons_type[0]=NORM_SEG3; _sons_type[1]=NORM_SEG3; _sons_type[2]=NORM_SEG3; _sons_type[3]=NORM_SEG3;
236           _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=4; _nb_of_sons_con[0]=3;
237           _sons_con[1][0]=1; _sons_con[1][1]=2; _sons_con[1][2]=5; _nb_of_sons_con[1]=3;
238           _sons_con[2][0]=2; _sons_con[2][1]=3; _sons_con[2][2]=6; _nb_of_sons_con[2]=3;
239           _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;
240         }
241         break;
242       case NORM_QUAD9:
243         {
244           _nb_of_pts=9; _nb_of_sons=4; _dim=2; _linear_type=NORM_QUAD4; _is_simplex=false;
245           _sons_type[0]=NORM_SEG3; _sons_type[1]=NORM_SEG3; _sons_type[2]=NORM_SEG3; _sons_type[3]=NORM_SEG3;
246           _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=4; _nb_of_sons_con[0]=3;
247           _sons_con[1][0]=1; _sons_con[1][1]=2; _sons_con[1][2]=5; _nb_of_sons_con[1]=3;
248           _sons_con[2][0]=2; _sons_con[2][1]=3; _sons_con[2][2]=6; _nb_of_sons_con[2]=3;
249           _sons_con[3][0]=3; _sons_con[3][1]=0; _sons_con[3][2]=7; _nb_of_sons_con[3]=3; _quadratic=true; _extruded_type=NORM_HEXA27;
250         }
251         break;
252       case NORM_PYRA5:
253         {
254           _nb_of_pts=5; _nb_of_sons=5; _dim=3; _quadratic_type=NORM_PYRA13; _is_simplex=false;
255           _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;
256           _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;
257           _sons_con[1][0]=0; _sons_con[1][1]=4; _sons_con[1][2]=1; _nb_of_sons_con[1]=3;
258           _sons_con[2][0]=1; _sons_con[2][1]=4; _sons_con[2][2]=2; _nb_of_sons_con[2]=3;
259           _sons_con[3][0]=2; _sons_con[3][1]=4; _sons_con[3][2]=3; _nb_of_sons_con[3]=3;
260           _sons_con[4][0]=3; _sons_con[4][1]=4; _sons_con[4][2]=0; _nb_of_sons_con[4]=3;
261           _little_sons_con[0][0]=0; _little_sons_con[0][1]=1;  _nb_of_little_sons=8;
262           _little_sons_con[1][0]=1; _little_sons_con[1][1]=2;
263           _little_sons_con[2][0]=2; _little_sons_con[2][1]=3;
264           _little_sons_con[3][0]=3; _little_sons_con[3][1]=0;
265           _little_sons_con[4][0]=0; _little_sons_con[4][1]=4;
266           _little_sons_con[5][0]=1; _little_sons_con[5][1]=4;
267           _little_sons_con[6][0]=2; _little_sons_con[6][1]=4;
268           _little_sons_con[7][0]=3; _little_sons_con[7][1]=4;
269         }
270         break;
271       case NORM_PENTA6:
272         {
273           _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;
274           _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;
275           _sons_con[0][0]=0; _sons_con[0][1]=1; _sons_con[0][2]=2; _nb_of_sons_con[0]=3;
276           _sons_con[1][0]=3; _sons_con[1][1]=5; _sons_con[1][2]=4; _nb_of_sons_con[1]=3;
277           _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;
278           _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;
279           _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;
280           _little_sons_con[0][0]=0; _little_sons_con[0][1]=1;  _nb_of_little_sons=9;
281           _little_sons_con[1][0]=1; _little_sons_con[1][1]=2;
282           _little_sons_con[2][0]=2; _little_sons_con[2][1]=0;
283           _little_sons_con[3][0]=3; _little_sons_con[3][1]=4;
284           _little_sons_con[4][0]=4; _little_sons_con[4][1]=5;
285           _little_sons_con[5][0]=5; _little_sons_con[5][1]=3;
286           _little_sons_con[6][0]=0; _little_sons_con[6][1]=3;
287           _little_sons_con[7][0]=1; _little_sons_con[7][1]=4;
288           _little_sons_con[8][0]=2; _little_sons_con[8][1]=5;
289         }
290         break;
291       case NORM_TETRA10:
292         {
293           _nb_of_pts=10; _nb_of_sons=4; _dim=3; _linear_type=NORM_TETRA4; _is_simplex=false;
294           _sons_type[0]=NORM_TRI6; _sons_type[1]=NORM_TRI6; _sons_type[2]=NORM_TRI6; _sons_type[3]=NORM_TRI6;
295           _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;
296           _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;
297           _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;
298           _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;
299           _little_sons_con[0][0]=0; _little_sons_con[0][1]=1;  _little_sons_con[0][2]=4;  _nb_of_little_sons=6;
300           _little_sons_con[1][0]=1; _little_sons_con[1][1]=2;  _little_sons_con[1][2]=5;
301           _little_sons_con[2][0]=2; _little_sons_con[2][1]=0;  _little_sons_con[2][2]=6;
302           _little_sons_con[3][0]=0; _little_sons_con[3][1]=3;  _little_sons_con[3][2]=7;
303           _little_sons_con[4][0]=1; _little_sons_con[4][1]=3;  _little_sons_con[4][2]=8;
304           _little_sons_con[5][0]=2; _little_sons_con[5][1]=3;  _little_sons_con[5][2]=9;
305         }
306         break;
307       case NORM_HEXGP12:
308         {
309           _nb_of_pts=12; _nb_of_sons=8; _dim=3; _is_simplex=false; _is_extruded=true;
310           _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;
311           _sons_type[6]=NORM_QUAD4; _sons_type[7]=NORM_QUAD4;
312           _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;
313           _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;
314           _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;
315           _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;
316           _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;
317           _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;
318           _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;
319           _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;
320         }
321         break;
322       case NORM_PYRA13:
323         {
324           _nb_of_pts=13; _nb_of_sons=5; _dim=3; _linear_type=NORM_PYRA5; _is_simplex=false;
325           _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;
326           _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;
327           _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;
328           _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;
329           _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;
330           _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;
331           _little_sons_con[0][0]=0; _little_sons_con[0][1]=1; _little_sons_con[0][2]=5;  _nb_of_little_sons=8;
332           _little_sons_con[1][0]=1; _little_sons_con[1][1]=2; _little_sons_con[1][2]=6;
333           _little_sons_con[2][0]=2; _little_sons_con[2][1]=3; _little_sons_con[2][2]=7;
334           _little_sons_con[3][0]=3; _little_sons_con[3][1]=0; _little_sons_con[3][2]=8;
335           _little_sons_con[4][0]=0; _little_sons_con[4][1]=4; _little_sons_con[4][2]=9;
336           _little_sons_con[5][0]=1; _little_sons_con[5][1]=4; _little_sons_con[5][2]=10;
337           _little_sons_con[6][0]=2; _little_sons_con[6][1]=4; _little_sons_con[6][2]=11;
338           _little_sons_con[7][0]=3; _little_sons_con[7][1]=4; _little_sons_con[7][2]=12;
339         }
340         break;
341       case NORM_PENTA15:
342         {
343           _nb_of_pts=15; _nb_of_sons=5; _dim=3; _linear_type=NORM_PENTA6; _is_simplex=false;
344           _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;
345           _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;
346           _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;
347           _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;
348           _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;
349           _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;
350           _little_sons_con[0][0]=0; _little_sons_con[0][1]=1; _little_sons_con[0][2]=6;  _nb_of_little_sons=9;
351           _little_sons_con[1][0]=1; _little_sons_con[1][1]=2; _little_sons_con[1][2]=7;
352           _little_sons_con[2][0]=2; _little_sons_con[2][1]=0; _little_sons_con[2][2]=8;
353           _little_sons_con[3][0]=3; _little_sons_con[3][1]=4; _little_sons_con[3][2]=9;
354           _little_sons_con[4][0]=4; _little_sons_con[4][1]=5; _little_sons_con[4][2]=10;
355           _little_sons_con[5][0]=5; _little_sons_con[5][1]=3; _little_sons_con[5][2]=11;
356           _little_sons_con[6][0]=0; _little_sons_con[6][1]=3; _little_sons_con[6][2]=12;
357           _little_sons_con[7][0]=1; _little_sons_con[7][1]=4; _little_sons_con[7][2]=13;
358           _little_sons_con[8][0]=2; _little_sons_con[8][1]=5; _little_sons_con[8][2]=14;
359         }
360         break;
361       case NORM_HEXA20:
362         {
363           _nb_of_pts=20; _nb_of_sons=6; _dim=3; _linear_type=NORM_HEXA8; _is_simplex=false;
364           _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;
365           _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;
366           _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;
367           _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;
368           _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;
369           _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;
370           _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;
371           _little_sons_con[0][0]=0; _little_sons_con[0][1]=1;  _little_sons_con[0][2]=8; _nb_of_little_sons=12;
372           _little_sons_con[1][0]=1; _little_sons_con[1][1]=2;  _little_sons_con[1][2]=9;
373           _little_sons_con[2][0]=2; _little_sons_con[2][1]=3;  _little_sons_con[2][2]=10;
374           _little_sons_con[3][0]=3; _little_sons_con[3][1]=0;  _little_sons_con[3][2]=11;
375           _little_sons_con[4][0]=4; _little_sons_con[4][1]=5;  _little_sons_con[4][2]=12;
376           _little_sons_con[5][0]=5; _little_sons_con[5][1]=6;  _little_sons_con[5][2]=13;
377           _little_sons_con[6][0]=6; _little_sons_con[6][1]=7;  _little_sons_con[6][2]=14;
378           _little_sons_con[7][0]=7; _little_sons_con[7][1]=4;  _little_sons_con[7][2]=15;
379           _little_sons_con[8][0]=0; _little_sons_con[8][1]=4;  _little_sons_con[8][2]=16;
380           _little_sons_con[9][0]=1; _little_sons_con[9][1]=5;  _little_sons_con[9][2]=17;
381           _little_sons_con[10][0]=2; _little_sons_con[10][1]=6;  _little_sons_con[10][2]=18;
382           _little_sons_con[11][0]=3; _little_sons_con[11][1]=7;  _little_sons_con[11][2]=19;
383         }
384         break;
385       case NORM_HEXA27:
386         {
387           _nb_of_pts=27; _nb_of_sons=6; _dim=3; _linear_type=NORM_HEXA8; _is_simplex=false;
388           _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;
389           _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;
390           _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;
391           _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;   
392           _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;
393           _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;
394           _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;
395           _quadratic=true;
396         }
397         break;
398       case NORM_POLYGON:
399         {
400           _nb_of_pts=0; _nb_of_sons=0; _dim=2; _dyn=true; _extruded_type=NORM_POLYHED; _is_simplex=false; _quadratic_type=NORM_QPOLYG;
401         }
402         break;
403       case NORM_POLYHED:
404         {
405           _nb_of_pts=0; _nb_of_sons=0; _dim=3; _dyn=true; _is_simplex=false;
406         }
407         break;
408       case NORM_QPOLYG:
409         {
410           _nb_of_pts=0; _nb_of_sons=0; _dim=2; _dyn=true; _is_simplex=false; _quadratic=true; _linear_type=NORM_POLYGON;
411         }
412         break;
413       case NORM_POLYL:
414         {
415           _nb_of_pts=0; _nb_of_sons=0; _dim=1; _dyn=true; _extruded_type=NORM_POLYGON; _is_simplex=false;
416         }
417         break;
418       case NORM_ERROR:
419         {
420           _nb_of_pts=std::numeric_limits<unsigned>::max(); _nb_of_sons=std::numeric_limits<unsigned>::max(); _dim=std::numeric_limits<unsigned>::max();
421         }
422         break;
423       }
424   }
425
426   /*!
427    * Equivalent to getNumberOfSons except that this method deals with dynamic type.
428    */
429   unsigned CellModel::getNumberOfSons2(const int *conn, int lgth) const
430   {
431     if(!isDynamic())
432       return getNumberOfSons();
433     if(_dim==2)
434       {
435         if(_type==NORM_POLYGON)
436           return lgth;
437         else
438           return lgth/2;
439       }
440     else if(_dim==1)
441       return lgth;//NORM_POLYL
442     else
443       return std::count(conn,conn+lgth,-1)+1;
444   }
445
446   unsigned CellModel::getNumberOfEdgesIn3D(const int *conn, int lgth) const
447   {
448     if(!isDynamic())
449       return _nb_of_little_sons;
450     else//polyhedron
451       return (lgth-std::count(conn,conn+lgth,-1))/2;
452   }
453   
454   NormalizedCellType CellModel::getCorrespondingPolyType() const
455   {
456     switch(getDimension())
457       {
458       case 0:
459         return NORM_POINT1;
460       case 1:
461         {
462           if(!isQuadratic())
463             return NORM_POLYL;
464           throw INTERP_KERNEL::Exception("CellModel::getPolyType : no poly type for quadratic 1D !");
465         }
466       case 2:
467         {
468           if(!isQuadratic())
469             return NORM_POLYGON;
470           else
471             return NORM_QPOLYG;
472         }
473       case 3:
474         {
475           if(!isQuadratic())
476             return NORM_POLYHED;
477           throw INTERP_KERNEL::Exception("CellModel::getPolyType : no poly type for quadratic 3D !");
478         }
479       default:
480         throw INTERP_KERNEL::Exception("CellModel::getPolyType : only dimension 0, 1, 2, 3 are supported !");
481       }
482   }
483
484   /*!
485    * Equivalent to getSonType except that this method deals with dynamic type.
486    */
487   NormalizedCellType CellModel::getSonType2(unsigned sonId) const
488   {
489     if(!isDynamic())
490       return getSonType(sonId);
491     if(_dim==2)
492       {
493         if(_type==NORM_POLYGON)
494           return NORM_SEG2;
495         else
496           return NORM_SEG3;
497       }
498     else if(_dim==1)
499       return NORM_ERROR;//NORM_POLYL
500     //polyedron
501     return NORM_POLYGON;
502   }
503
504   /*!
505    * \b WARNING this method do not manage correctly types that return true at the call of isDynamic. Use fillSonCellNodalConnectivity2 instead.
506    */
507   unsigned CellModel::fillSonCellNodalConnectivity(int sonId, const int *nodalConn, int *sonNodalConn) const
508   {
509     unsigned nbOfTurnLoop=_nb_of_sons_con[sonId];
510     const unsigned *sonConn=_sons_con[sonId];
511     for(unsigned i=0;i<nbOfTurnLoop;i++)
512       sonNodalConn[i]=nodalConn[sonConn[i]];
513     return nbOfTurnLoop;
514   }
515
516   unsigned CellModel::fillSonCellNodalConnectivity2(int sonId, const int *nodalConn, int lgth, int *sonNodalConn, NormalizedCellType& typeOfSon) const
517   {
518     typeOfSon=getSonType2(sonId);
519     if(!isDynamic())
520       return fillSonCellNodalConnectivity(sonId,nodalConn,sonNodalConn);
521     else
522       {
523         if(_dim==2)//polygon
524           {
525             if(_type==NORM_POLYGON)
526               {
527                 sonNodalConn[0]=nodalConn[sonId];
528                 sonNodalConn[1]=nodalConn[(sonId+1)%lgth];
529                 return 2;
530               }
531             else
532               {
533                 sonNodalConn[0]=nodalConn[sonId];
534                 sonNodalConn[1]=nodalConn[(sonId+1)%(lgth/2)];
535                 sonNodalConn[2]=nodalConn[sonId+(lgth/2)];
536                 return 3;
537               }
538           }
539         else if(_dim==3)
540           {//polyedron
541             const int *where=nodalConn;
542             for(int i=0;i<sonId;i++)
543               {
544                 where=std::find(where,nodalConn+lgth,-1);
545                 where++;
546               }
547             const int *where2=std::find(where,nodalConn+lgth,-1);
548             std::copy(where,where2,sonNodalConn);
549             return where2-where;
550           }
551         else
552           throw INTERP_KERNEL::Exception("CellModel::fillSonCellNodalConnectivity2 : no sons on NORM_POLYL !");
553       }
554   }
555   
556   /*!
557    * Equivalent to CellModel::fillSonCellNodalConnectivity2 except for HEXA8 where the order of sub faces is not has MED file numbering for transformation HEXA8->HEXA27
558    */
559   unsigned CellModel::fillSonCellNodalConnectivity4(int sonId, const int *nodalConn, int lgth, int *sonNodalConn, NormalizedCellType& typeOfSon) const
560   {
561     if(_type==NORM_HEXA8)
562       {
563         static const int permutation[6]={0,2,3,4,5,1};
564         return fillSonCellNodalConnectivity2(permutation[sonId],nodalConn,lgth,sonNodalConn,typeOfSon);
565       }
566     else
567       return fillSonCellNodalConnectivity2(sonId,nodalConn,lgth,sonNodalConn,typeOfSon);
568   }
569
570   unsigned CellModel::fillSonEdgesNodalConnectivity3D(int sonId, const int *nodalConn, int lgth, int *sonNodalConn, NormalizedCellType& typeOfSon) const
571   {
572     if(!isDynamic())
573       {
574         if(!isQuadratic())
575           {
576             typeOfSon=NORM_SEG2;
577             sonNodalConn[0]=nodalConn[_little_sons_con[sonId][0]];
578             sonNodalConn[1]=nodalConn[_little_sons_con[sonId][1]];
579             return 2;
580           }
581         else
582           {
583             typeOfSon=NORM_SEG3;
584             sonNodalConn[0]=nodalConn[_little_sons_con[sonId][0]];
585             sonNodalConn[1]=nodalConn[_little_sons_con[sonId][1]];
586             sonNodalConn[2]=nodalConn[_little_sons_con[sonId][2]];
587             return 3;
588           }
589       }
590     else
591       throw INTERP_KERNEL::Exception("CellModel::fillSonEdgesNodalConnectivity3D : not implemented yet for NORM_POLYHED !");   
592   }
593
594   //================================================================================
595   /*!
596    * \brief Return number of nodes in sonId-th son of a Dynamic() cell
597    */
598   //================================================================================
599
600   unsigned CellModel::getNumberOfNodesConstituentTheSon2(unsigned sonId, const int *nodalConn, int lgth) const
601   {
602     if(!isDynamic())
603       return getNumberOfNodesConstituentTheSon(sonId);
604
605     if(_dim==2)//polygon
606       {
607         if(_type==NORM_POLYGON)
608           return 2;
609         else
610           return 3;
611       }
612     else if(_dim==3)
613       {//polyedron
614         const int *where=nodalConn;
615         for(unsigned int i=0;i<sonId;i++)
616           {
617             where=std::find(where,nodalConn+lgth,-1);
618             where++;
619           }
620         const int *where2=std::find(where,nodalConn+lgth,-1);
621         return where2-where;
622       }
623     else
624       throw INTERP_KERNEL::Exception("CellModel::getNumberOfNodesConstituentTheSon2 : no sons on NORM_POLYL !");
625   }
626
627   /*!
628    * This method retrieves if cell1 represented by 'conn1' and cell2 represented by 'conn2'
629    * 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.
630    * If not an exception will be thrown.
631    * @return True if two cells have same orientation, false if not.
632    */
633   bool CellModel::getOrientationStatus(unsigned lgth, const int *conn1, const int *conn2) const
634   {
635     if(_dim!=1 && _dim!=2)
636       throw INTERP_KERNEL::Exception("CellModel::getOrientationStatus : invalid dimension ! Must be 1 or 2 !");
637     if(!_quadratic)
638       {
639         std::vector<int> tmp(2*lgth);
640         std::vector<int>::iterator it=std::copy(conn1,conn1+lgth,tmp.begin());
641         std::copy(conn1,conn1+lgth,it);
642         it=std::search(tmp.begin(),tmp.end(),conn2,conn2+lgth);
643         if(it==tmp.begin())
644           return true;
645         if(it!=tmp.end())
646           return _dim!=1;
647         std::vector<int>::reverse_iterator it2=std::search(tmp.rbegin(),tmp.rend(),conn2,conn2+lgth);
648         if(it2!=tmp.rend())
649           return false;
650         throw INTERP_KERNEL::Exception("CellModel::getOrientationStatus : Request of orientation status of non equal connectively cells !");
651       }
652     else
653       {
654         if(_dim!=1)
655           {
656             std::vector<int> tmp(lgth);
657             std::vector<int>::iterator it=std::copy(conn1,conn1+lgth/2,tmp.begin());
658             std::copy(conn1,conn1+lgth/2,it);
659             it=std::search(tmp.begin(),tmp.end(),conn2,conn2+lgth/2);
660             int d=std::distance(tmp.begin(),it);
661             if(it==tmp.end())
662               return false;
663             it=std::copy(conn1+lgth/2,conn1+lgth,tmp.begin());
664             std::copy(conn1+lgth/2,conn1+lgth,it);
665             it=std::search(tmp.begin(),tmp.end(),conn2,conn2+lgth);
666             if(it==tmp.end())
667               return false;
668             int d2=std::distance(tmp.begin(),it);
669             return d==d2;
670           }
671         else
672           {
673             int p=(lgth+1)/2;
674             std::vector<int> tmp(2*p);
675             std::vector<int>::iterator it=std::copy(conn1,conn1+p,tmp.begin());
676             std::copy(conn1,conn1+p,it);
677             it=std::search(tmp.begin(),tmp.end(),conn2,conn2+p);
678             int d=std::distance(tmp.begin(),it);
679             if(it==tmp.end())
680               return false;
681             tmp.resize(2*p-2);
682             it=std::copy(conn1+p,conn1+lgth,tmp.begin());
683             std::copy(conn1+p,conn1+lgth,it);
684             it=std::search(tmp.begin(),tmp.end(),conn2+p,conn2+lgth);
685             if(it==tmp.end())
686               return false;
687             int d2=std::distance(tmp.begin(),it);
688             return d==d2;
689           }
690       }
691   }
692
693 }