Salome HOME
Copyright update 2021
[tools/medcoupling.git] / src / INTERP_KERNEL / VolSurfUser.txx
1 // Copyright (C) 2007-2021  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 #ifndef __VOLSURFUSER_TXX__
21 #define __VOLSURFUSER_TXX__
22
23 #include "VolSurfUser.hxx"
24 #include "VolSurfFormulae.hxx"
25 #include "InterpolationUtils.hxx"
26
27 #include <algorithm>
28
29 namespace INTERP_KERNEL
30 {
31   template<class ConnType, NumberingPolicy numPol, int SPACEDIM>
32   double computeVolSurfOfCell(NormalizedCellType type, const ConnType *connec, mcIdType lgth, const double *coords)
33   {
34     switch(type)
35       {
36       case INTERP_KERNEL::NORM_SEG2 :
37       case INTERP_KERNEL::NORM_SEG4 :
38         {
39           ConnType N1 = OTT<ConnType,numPol>::coo2C(connec[0]);
40           ConnType N2 = OTT<ConnType,numPol>::coo2C(connec[1]);
41           return INTERP_KERNEL::calculateLgthForSeg2(coords+(SPACEDIM*N1),coords+(SPACEDIM*N2),SPACEDIM);
42         }
43       case INTERP_KERNEL::NORM_SEG3 :
44         {
45           ConnType beginNode = OTT<ConnType,numPol>::coo2C(connec[0]);
46           ConnType endNode = OTT<ConnType,numPol>::coo2C(connec[1]);
47           ConnType middleNode = OTT<ConnType,numPol>::coo2C(connec[2]);
48           return INTERP_KERNEL::calculateLgthForSeg3(coords+(SPACEDIM*beginNode),coords+(SPACEDIM*endNode),coords+(SPACEDIM*middleNode),SPACEDIM);
49         }
50       case INTERP_KERNEL::NORM_TRI3 :
51         {
52           ConnType N1 = OTT<ConnType,numPol>::coo2C(connec[0]);
53           ConnType N2 = OTT<ConnType,numPol>::coo2C(connec[1]);
54           ConnType N3 = OTT<ConnType,numPol>::coo2C(connec[2]);
55               
56           return INTERP_KERNEL::calculateAreaForTria(coords+(SPACEDIM*N1),
57                                                      coords+(SPACEDIM*N2),
58                                                      coords+(SPACEDIM*N3),
59                                                      SPACEDIM);
60         }
61         break;
62             
63       case INTERP_KERNEL::NORM_TRI6 :
64       case INTERP_KERNEL::NORM_TRI7 :
65         {
66           const double *pts[6];
67           pts[0] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[0]);
68           pts[1] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[1]);
69           pts[2] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[2]);
70           pts[3] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[3]);
71           pts[4] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[4]);
72           pts[5] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[5]);
73           return INTERP_KERNEL::calculateAreaForQPolyg(pts,6,SPACEDIM);
74         }
75         break;
76       case INTERP_KERNEL::NORM_QUAD4 :
77         {
78           ConnType N1 = OTT<ConnType,numPol>::coo2C(connec[0]);
79           ConnType N2 = OTT<ConnType,numPol>::coo2C(connec[1]);
80           ConnType N3 = OTT<ConnType,numPol>::coo2C(connec[2]);
81           ConnType N4 = OTT<ConnType,numPol>::coo2C(connec[3]);
82               
83           return INTERP_KERNEL::calculateAreaForQuad(coords+SPACEDIM*N1,
84                                                      coords+SPACEDIM*N2,
85                                                      coords+SPACEDIM*N3,
86                                                      coords+SPACEDIM*N4,
87                                                      SPACEDIM);
88         }
89         break;
90       case INTERP_KERNEL::NORM_QUAD8 :
91       case INTERP_KERNEL::NORM_QUAD9 :  
92         {
93           const double *pts[8];
94           pts[0] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[0]);
95           pts[1] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[1]);
96           pts[2] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[2]);
97           pts[3] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[3]);
98           pts[4] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[4]);
99           pts[5] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[5]);
100           pts[6] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[6]);
101           pts[7] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[7]);
102           return INTERP_KERNEL::calculateAreaForQPolyg(pts,8,SPACEDIM);
103         }
104         break;
105       case INTERP_KERNEL::NORM_POLYGON :
106         {          
107           const double **pts=new const double *[lgth];
108           for(int inod=0;inod<lgth;inod++)
109             pts[inod] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[inod]);
110           double val=INTERP_KERNEL::calculateAreaForPolyg(pts,lgth,SPACEDIM);
111           delete [] pts;
112           return val;
113         }
114         break;
115       case INTERP_KERNEL::NORM_QPOLYG :
116         {
117           const double **pts=new const double *[lgth];
118           for(int inod=0;inod<lgth;inod++)
119             pts[inod] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[inod]);
120           double val=INTERP_KERNEL::calculateAreaForQPolyg(pts,lgth,SPACEDIM);
121           delete [] pts;
122           return val;
123         }
124         break;
125       case INTERP_KERNEL::NORM_TETRA4 :
126       case INTERP_KERNEL::NORM_TETRA10 :
127         {
128           ConnType N1 = OTT<ConnType,numPol>::coo2C(connec[0]);
129           ConnType N2 = OTT<ConnType,numPol>::coo2C(connec[1]);
130           ConnType N3 = OTT<ConnType,numPol>::coo2C(connec[2]);
131           ConnType N4 = OTT<ConnType,numPol>::coo2C(connec[3]);
132               
133           return INTERP_KERNEL::calculateVolumeForTetra(coords+SPACEDIM*N1,
134                                                         coords+SPACEDIM*N2,
135                                                         coords+SPACEDIM*N3,
136                                                         coords+SPACEDIM*N4);
137         }
138         break;
139             
140       case INTERP_KERNEL::NORM_PYRA5 :
141       case INTERP_KERNEL::NORM_PYRA13 :
142         {
143           ConnType N1 = OTT<ConnType,numPol>::coo2C(connec[0]);
144           ConnType N2 = OTT<ConnType,numPol>::coo2C(connec[1]);
145           ConnType N3 = OTT<ConnType,numPol>::coo2C(connec[2]);
146           ConnType N4 = OTT<ConnType,numPol>::coo2C(connec[3]);
147           ConnType N5 = OTT<ConnType,numPol>::coo2C(connec[4]);
148               
149           return INTERP_KERNEL::calculateVolumeForPyra(coords+SPACEDIM*N1,
150                                                        coords+SPACEDIM*N2,
151                                                        coords+SPACEDIM*N3,
152                                                        coords+SPACEDIM*N4,
153                                                        coords+SPACEDIM*N5);
154         }
155         break;
156             
157       case INTERP_KERNEL::NORM_PENTA6 :
158       case INTERP_KERNEL::NORM_PENTA15 :
159       case INTERP_KERNEL::NORM_PENTA18 :
160         {
161           ConnType N1 = OTT<ConnType,numPol>::coo2C(connec[0]);
162           ConnType N2 = OTT<ConnType,numPol>::coo2C(connec[1]);
163           ConnType N3 = OTT<ConnType,numPol>::coo2C(connec[2]);
164           ConnType N4 = OTT<ConnType,numPol>::coo2C(connec[3]);
165           ConnType N5 = OTT<ConnType,numPol>::coo2C(connec[4]);
166           ConnType N6 = OTT<ConnType,numPol>::coo2C(connec[5]);
167               
168           return INTERP_KERNEL::calculateVolumeForPenta(coords+SPACEDIM*N1,
169                                                         coords+SPACEDIM*N2,
170                                                         coords+SPACEDIM*N3,
171                                                         coords+SPACEDIM*N4,
172                                                         coords+SPACEDIM*N5,
173                                                         coords+SPACEDIM*N6);
174         }
175         break;
176             
177       case INTERP_KERNEL::NORM_HEXA8 :
178       case INTERP_KERNEL::NORM_HEXA20 :
179       case INTERP_KERNEL::NORM_HEXA27 :
180         {
181           ConnType N1 = OTT<ConnType,numPol>::coo2C(connec[0]);
182           ConnType N2 = OTT<ConnType,numPol>::coo2C(connec[1]);
183           ConnType N3 = OTT<ConnType,numPol>::coo2C(connec[2]);
184           ConnType N4 = OTT<ConnType,numPol>::coo2C(connec[3]);
185           ConnType N5 = OTT<ConnType,numPol>::coo2C(connec[4]);
186           ConnType N6 = OTT<ConnType,numPol>::coo2C(connec[5]);
187           ConnType N7 = OTT<ConnType,numPol>::coo2C(connec[6]);
188           ConnType N8 = OTT<ConnType,numPol>::coo2C(connec[7]);
189               
190           return INTERP_KERNEL::calculateVolumeForHexa(coords+SPACEDIM*N1,
191                                                        coords+SPACEDIM*N2,
192                                                        coords+SPACEDIM*N3,
193                                                        coords+SPACEDIM*N4,
194                                                        coords+SPACEDIM*N5,
195                                                        coords+SPACEDIM*N6,
196                                                        coords+SPACEDIM*N7,
197                                                        coords+SPACEDIM*N8);
198         }
199         break;
200       case INTERP_KERNEL::NORM_HEXGP12:
201         {
202           const ConnType connecHexa12[43]={
203             OTT<ConnType,numPol>::coo2C(connec[0]),OTT<ConnType,numPol>::coo2C(connec[1]),OTT<ConnType,numPol>::coo2C(connec[2]),OTT<ConnType,numPol>::coo2C(connec[3]),OTT<ConnType,numPol>::coo2C(connec[4]),OTT<ConnType,numPol>::coo2C(connec[5]),-1,
204             OTT<ConnType,numPol>::coo2C(connec[6]),OTT<ConnType,numPol>::coo2C(connec[11]),OTT<ConnType,numPol>::coo2C(connec[10]),OTT<ConnType,numPol>::coo2C(connec[9]),OTT<ConnType,numPol>::coo2C(connec[8]),OTT<ConnType,numPol>::coo2C(connec[7]),-1,
205             OTT<ConnType,numPol>::coo2C(connec[0]),OTT<ConnType,numPol>::coo2C(connec[6]),OTT<ConnType,numPol>::coo2C(connec[7]),OTT<ConnType,numPol>::coo2C(connec[1]),-1,
206             OTT<ConnType,numPol>::coo2C(connec[1]),OTT<ConnType,numPol>::coo2C(connec[7]),OTT<ConnType,numPol>::coo2C(connec[8]),OTT<ConnType,numPol>::coo2C(connec[2]),-1,
207             OTT<ConnType,numPol>::coo2C(connec[2]),OTT<ConnType,numPol>::coo2C(connec[8]),OTT<ConnType,numPol>::coo2C(connec[9]),OTT<ConnType,numPol>::coo2C(connec[3]),-1,
208             OTT<ConnType,numPol>::coo2C(connec[3]),OTT<ConnType,numPol>::coo2C(connec[9]),OTT<ConnType,numPol>::coo2C(connec[10]),OTT<ConnType,numPol>::coo2C(connec[4]),-1,
209             OTT<ConnType,numPol>::coo2C(connec[4]),OTT<ConnType,numPol>::coo2C(connec[10]),OTT<ConnType,numPol>::coo2C(connec[11]),OTT<ConnType,numPol>::coo2C(connec[5]),-1,
210             OTT<ConnType,numPol>::coo2C(connec[5]),OTT<ConnType,numPol>::coo2C(connec[11]),OTT<ConnType,numPol>::coo2C(connec[6]),OTT<ConnType,numPol>::coo2C(connec[0])};
211           return calculateVolumeForPolyh2<ConnType,numPol>(connecHexa12,43,coords);
212         }
213       case INTERP_KERNEL::NORM_POLYHED :
214         {
215           return calculateVolumeForPolyh2<ConnType,numPol>(connec,lgth,coords);
216         }
217         break;
218       default:
219         throw INTERP_KERNEL::Exception("Not recognized cell type to get Length/Area/Volume on it !");
220       }
221   }
222
223   template<class ConnType, NumberingPolicy numPolConn>
224   double computeVolSurfOfCell2(NormalizedCellType type, const ConnType *connec, mcIdType lgth, const double *coords, int spaceDim)
225   {
226     if(spaceDim==3)
227       return computeVolSurfOfCell<ConnType,numPolConn,3>(type,connec,lgth,coords);
228     if(spaceDim==2)
229       return computeVolSurfOfCell<ConnType,numPolConn,2>(type,connec,lgth,coords);
230     if(spaceDim==1)
231       return computeVolSurfOfCell<ConnType,numPolConn,1>(type,connec,lgth,coords);
232     throw INTERP_KERNEL::Exception("Invalid spaceDim specified : must be 1, 2 or 3");
233   }
234
235
236   template<class ConnType, NumberingPolicy numPol,int SPACEDIM>
237   void computeBarycenter(NormalizedCellType type, const ConnType *connec, mcIdType lgth, const double *coords, double *res)
238   {
239     switch(type)
240       {
241       case NORM_SEG2:
242       case NORM_SEG4:
243         {
244           std::copy(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[0]),
245                     coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[0]+1),res);
246           std::transform(res,res+SPACEDIM,coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[1]),res,std::plus<double>());
247           std::transform(res,res+SPACEDIM,res,std::bind(std::multiplies<double>(),std::placeholders::_1,0.5));
248           break;
249         }
250       case NORM_SEG3:
251         {
252           if(SPACEDIM==2)
253             {
254               Edge *ed=Edge::BuildEdgeFrom3Points(coords+2*OTT<ConnType,numPol>::coo2C(connec[0]),coords+2*OTT<ConnType,numPol>::coo2C(connec[2]),coords+2*OTT<ConnType,numPol>::coo2C(connec[1]));
255               ed->getBarycenter(res);
256               ed->decrRef();
257             }
258           else if(SPACEDIM==1)
259             {
260               *res=(coords[OTT<ConnType,numPol>::coo2C(connec[0])]+coords[OTT<ConnType,numPol>::coo2C(connec[1])])/2.;
261             }
262           else if(SPACEDIM==3)
263             {
264               std::copy(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[0]),
265                         coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[0]+1),res);
266               std::transform(res,res+SPACEDIM,coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[1]),res,std::plus<double>());
267               std::transform(res,res+SPACEDIM,res,std::bind(std::multiplies<double>(),std::placeholders::_1,0.5));
268             }
269           else
270             throw INTERP_KERNEL::Exception("computeBarycenter for SEG3 only SPACEDIM 1,2 or 3 supported !");
271           break;
272         }
273       case NORM_TRI3:
274       case NORM_TRI7:
275         {
276           std::copy(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[0]),
277                     coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[0]+1),res);
278           std::transform(res,res+SPACEDIM,coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[1]),res,std::plus<double>());
279           std::transform(res,res+SPACEDIM,coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[2]),res,std::plus<double>());
280           std::transform(res,res+SPACEDIM,res,std::bind(std::multiplies<double>(),std::placeholders::_1,1./3.));
281           break;
282         }
283       case NORM_TRI6:
284         {
285           if(SPACEDIM==2)
286             {
287               double *pts[6];
288               pts[0] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[0]));
289               pts[1] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[1]));
290               pts[2] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[2]));
291               pts[3] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[3]));
292               pts[4] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[4]));
293               pts[5] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[5]));
294               computeQPolygonBarycenter2D(pts,6,2,res);
295             }
296           else if(SPACEDIM==3)
297             computePolygonBarycenter3D<ConnType,numPol>(connec,lgth/2,coords,res);
298           else
299             throw INTERP_KERNEL::Exception("Impossible spacedim linked to cell 2D Cell !");
300           break;
301         }
302       case NORM_QUAD4:
303       case NORM_POLYGON:
304         {
305           if(SPACEDIM==2)
306             computePolygonBarycenter2D<ConnType,numPol>(connec,lgth,coords,res);
307           else if(SPACEDIM==3)
308             computePolygonBarycenter3D<ConnType,numPol>(connec,lgth,coords,res);
309           else
310             throw INTERP_KERNEL::Exception("Impossible spacedim linked to cell 2D Cell !");
311           break;
312         }
313       case NORM_QUAD8:
314         {
315           if(SPACEDIM==2)
316             {
317               double *pts[8];
318               pts[0] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[0]));
319               pts[1] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[1]));
320               pts[2] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[2]));
321               pts[3] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[3]));
322               pts[4] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[4]));
323               pts[5] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[5]));
324               pts[6] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[6]));
325               pts[7] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[7]));
326               computeQPolygonBarycenter2D(pts,8,2,res);
327             }
328           else if(SPACEDIM==3)
329             computePolygonBarycenter3D<ConnType,numPol>(connec,lgth/2,coords,res);
330           else
331             throw INTERP_KERNEL::Exception("Impossible spacedim linked to cell 2D Cell !");
332           break;
333         }
334       case INTERP_KERNEL::NORM_QPOLYG :
335         {
336           if(SPACEDIM==2)
337             {
338               double **pts=new double *[lgth];
339               for(int i=0;i<lgth;i++)
340                 pts[i]=const_cast<double *>(coords+2*OTT<ConnType,numPol>::coo2C(connec[i]));
341               computeQPolygonBarycenter2D(pts,lgth,2,res);
342               delete [] pts;
343             }
344           else if(SPACEDIM==3)
345             computePolygonBarycenter3D<ConnType,numPol>(connec,lgth/2,coords,res);
346           else
347             throw INTERP_KERNEL::Exception("Impossible spacedim linked to cell 2D Cell !");
348           break;
349         }
350         break;
351       case NORM_TETRA4:
352         {
353           res[0]=coords[3*OTT<ConnType,numPol>::coo2C(connec[0])]; 
354           res[1]=coords[3*OTT<ConnType,numPol>::coo2C(connec[0])+1];
355           res[2]=coords[3*OTT<ConnType,numPol>::coo2C(connec[0])+2];
356           res[0]+=coords[3*OTT<ConnType,numPol>::coo2C(connec[1])]; 
357           res[1]+=coords[3*OTT<ConnType,numPol>::coo2C(connec[1])+1];
358           res[2]+=coords[3*OTT<ConnType,numPol>::coo2C(connec[1])+2];
359           res[0]+=coords[3*OTT<ConnType,numPol>::coo2C(connec[2])]; 
360           res[1]+=coords[3*OTT<ConnType,numPol>::coo2C(connec[2])+1];
361           res[2]+=coords[3*OTT<ConnType,numPol>::coo2C(connec[2])+2];
362           res[0]+=coords[3*OTT<ConnType,numPol>::coo2C(connec[3])]; 
363           res[1]+=coords[3*OTT<ConnType,numPol>::coo2C(connec[3])+1];
364           res[2]+=coords[3*OTT<ConnType,numPol>::coo2C(connec[3])+2];
365           res[0]*=0.25; res[1]*=0.25; res[2]*=0.25;
366           break;
367         }
368       case NORM_PYRA5:
369         {
370           double tmp[3];
371           computePolygonBarycenter3D<ConnType,numPol>(connec,lgth-1,coords,tmp);
372           res[0]=(coords[3*OTT<ConnType,numPol>::coo2C(connec[4])]+3.*tmp[0])/4.;
373           res[1]=(coords[3*OTT<ConnType,numPol>::coo2C(connec[4])+1]+3.*tmp[1])/4.;
374           res[2]=(coords[3*OTT<ConnType,numPol>::coo2C(connec[4])+2]+3.*tmp[2])/4.;
375           break;
376         }
377       case NORM_HEXA8:
378         {
379           const ConnType conn[29]={
380             OTT<ConnType,numPol>::coo2C(connec[0]),OTT<ConnType,numPol>::coo2C(connec[1]),OTT<ConnType,numPol>::coo2C(connec[2]),OTT<ConnType,numPol>::coo2C(connec[3]),-1,
381             OTT<ConnType,numPol>::coo2C(connec[4]),OTT<ConnType,numPol>::coo2C(connec[7]),OTT<ConnType,numPol>::coo2C(connec[6]),OTT<ConnType,numPol>::coo2C(connec[5]),-1,
382             OTT<ConnType,numPol>::coo2C(connec[0]),OTT<ConnType,numPol>::coo2C(connec[3]),OTT<ConnType,numPol>::coo2C(connec[7]),OTT<ConnType,numPol>::coo2C(connec[4]),-1,
383             OTT<ConnType,numPol>::coo2C(connec[3]),OTT<ConnType,numPol>::coo2C(connec[2]),OTT<ConnType,numPol>::coo2C(connec[6]),OTT<ConnType,numPol>::coo2C(connec[7]),-1,
384             OTT<ConnType,numPol>::coo2C(connec[2]),OTT<ConnType,numPol>::coo2C(connec[1]),OTT<ConnType,numPol>::coo2C(connec[5]),OTT<ConnType,numPol>::coo2C(connec[6]),-1,
385             OTT<ConnType,numPol>::coo2C(connec[0]),OTT<ConnType,numPol>::coo2C(connec[4]),OTT<ConnType,numPol>::coo2C(connec[5]),OTT<ConnType,numPol>::coo2C(connec[1]),
386             };
387           barycenterOfPolyhedron<ConnType,numPol>(conn,29,coords,res);
388           break;
389         }
390       case NORM_PENTA6:
391         {
392           const ConnType conn[22]={
393             OTT<ConnType,numPol>::coo2C(connec[0]),OTT<ConnType,numPol>::coo2C(connec[1]),OTT<ConnType,numPol>::coo2C(connec[2]),-1,
394             OTT<ConnType,numPol>::coo2C(connec[3]),OTT<ConnType,numPol>::coo2C(connec[5]),OTT<ConnType,numPol>::coo2C(connec[4]),-1,
395             OTT<ConnType,numPol>::coo2C(connec[0]),OTT<ConnType,numPol>::coo2C(connec[2]),OTT<ConnType,numPol>::coo2C(connec[5]),OTT<ConnType,numPol>::coo2C(connec[3]),-1,
396             OTT<ConnType,numPol>::coo2C(connec[2]),OTT<ConnType,numPol>::coo2C(connec[1]),OTT<ConnType,numPol>::coo2C(connec[4]),OTT<ConnType,numPol>::coo2C(connec[5]),-1,
397             OTT<ConnType,numPol>::coo2C(connec[1]),OTT<ConnType,numPol>::coo2C(connec[0]),OTT<ConnType,numPol>::coo2C(connec[3]),OTT<ConnType,numPol>::coo2C(connec[4])
398           };
399           barycenterOfPolyhedron<ConnType,numPol>(conn,22,coords,res);
400           break;
401         }
402       case INTERP_KERNEL::NORM_HEXGP12:
403         {
404           const ConnType connecHexa12[43]={
405             OTT<ConnType,numPol>::coo2C(connec[0]),OTT<ConnType,numPol>::coo2C(connec[1]),OTT<ConnType,numPol>::coo2C(connec[2]),OTT<ConnType,numPol>::coo2C(connec[3]),OTT<ConnType,numPol>::coo2C(connec[4]),OTT<ConnType,numPol>::coo2C(connec[5]),-1,
406             OTT<ConnType,numPol>::coo2C(connec[6]),OTT<ConnType,numPol>::coo2C(connec[11]),OTT<ConnType,numPol>::coo2C(connec[10]),OTT<ConnType,numPol>::coo2C(connec[9]),OTT<ConnType,numPol>::coo2C(connec[8]),OTT<ConnType,numPol>::coo2C(connec[7]),-1,
407             OTT<ConnType,numPol>::coo2C(connec[0]),OTT<ConnType,numPol>::coo2C(connec[6]),OTT<ConnType,numPol>::coo2C(connec[7]),OTT<ConnType,numPol>::coo2C(connec[1]),-1,
408             OTT<ConnType,numPol>::coo2C(connec[1]),OTT<ConnType,numPol>::coo2C(connec[7]),OTT<ConnType,numPol>::coo2C(connec[8]),OTT<ConnType,numPol>::coo2C(connec[2]),-1,
409             OTT<ConnType,numPol>::coo2C(connec[2]),OTT<ConnType,numPol>::coo2C(connec[8]),OTT<ConnType,numPol>::coo2C(connec[9]),OTT<ConnType,numPol>::coo2C(connec[3]),-1,
410             OTT<ConnType,numPol>::coo2C(connec[3]),OTT<ConnType,numPol>::coo2C(connec[9]),OTT<ConnType,numPol>::coo2C(connec[10]),OTT<ConnType,numPol>::coo2C(connec[4]),-1,
411             OTT<ConnType,numPol>::coo2C(connec[4]),OTT<ConnType,numPol>::coo2C(connec[10]),OTT<ConnType,numPol>::coo2C(connec[11]),OTT<ConnType,numPol>::coo2C(connec[5]),-1,
412             OTT<ConnType,numPol>::coo2C(connec[5]),OTT<ConnType,numPol>::coo2C(connec[11]),OTT<ConnType,numPol>::coo2C(connec[6]),OTT<ConnType,numPol>::coo2C(connec[0])};
413           barycenterOfPolyhedron<ConnType,numPol>(connecHexa12,43,coords,res);
414           break;
415         }
416       case NORM_POLYHED:
417         {
418           barycenterOfPolyhedron<ConnType,numPol>(connec,lgth,coords,res);
419           break;
420         }
421       default:
422         throw INTERP_KERNEL::Exception("Not recognized cell type to get Barycenter on it !");
423       }
424   }
425
426   template<class ConnType, NumberingPolicy numPolConn>
427   void computeBarycenter2(NormalizedCellType type, const ConnType *connec, mcIdType lgth, const double *coords, int spaceDim, double *res)
428   {
429     if(spaceDim==3)
430       return computeBarycenter<ConnType,numPolConn,3>(type,connec,lgth,coords,res);
431     if(spaceDim==2)
432       return computeBarycenter<ConnType,numPolConn,2>(type,connec,lgth,coords,res);
433     if(spaceDim==1)
434       return computeBarycenter<ConnType,numPolConn,1>(type,connec,lgth,coords,res);
435     throw INTERP_KERNEL::Exception("Invalid spaceDim specified for compute barycenter : must be 1, 2 or 3");
436   }
437 }
438
439 #endif