1 // Copyright (C) 2007-2022 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 // Author : Anthony Geay (CEA/DEN)
20 #ifndef __VOLSURFUSER_TXX__
21 #define __VOLSURFUSER_TXX__
23 #include "VolSurfUser.hxx"
24 #include "VolSurfFormulae.hxx"
25 #include "InterpolationUtils.hxx"
26 #include "VectorUtils.hxx"
30 namespace INTERP_KERNEL
32 template<class ConnType, NumberingPolicy numPol, int SPACEDIM>
33 double computeVolSurfOfCell(NormalizedCellType type, const ConnType *connec, mcIdType lgth, const double *coords)
37 case INTERP_KERNEL::NORM_SEG2 :
38 case INTERP_KERNEL::NORM_SEG4 :
40 ConnType N1 = OTT<ConnType,numPol>::coo2C(connec[0]);
41 ConnType N2 = OTT<ConnType,numPol>::coo2C(connec[1]);
42 return INTERP_KERNEL::calculateLgthForSeg2(coords+(SPACEDIM*N1),coords+(SPACEDIM*N2),SPACEDIM);
44 case INTERP_KERNEL::NORM_SEG3 :
46 ConnType beginNode = OTT<ConnType,numPol>::coo2C(connec[0]);
47 ConnType endNode = OTT<ConnType,numPol>::coo2C(connec[1]);
48 ConnType middleNode = OTT<ConnType,numPol>::coo2C(connec[2]);
49 return INTERP_KERNEL::calculateLgthForSeg3(coords+(SPACEDIM*beginNode),coords+(SPACEDIM*endNode),coords+(SPACEDIM*middleNode),SPACEDIM);
51 case INTERP_KERNEL::NORM_TRI3 :
53 ConnType N1 = OTT<ConnType,numPol>::coo2C(connec[0]);
54 ConnType N2 = OTT<ConnType,numPol>::coo2C(connec[1]);
55 ConnType N3 = OTT<ConnType,numPol>::coo2C(connec[2]);
57 return INTERP_KERNEL::calculateAreaForTria(coords+(SPACEDIM*N1),
64 case INTERP_KERNEL::NORM_TRI6 :
65 case INTERP_KERNEL::NORM_TRI7 :
68 pts[0] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[0]);
69 pts[1] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[1]);
70 pts[2] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[2]);
71 pts[3] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[3]);
72 pts[4] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[4]);
73 pts[5] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[5]);
74 return INTERP_KERNEL::calculateAreaForQPolyg(pts,6,SPACEDIM);
77 case INTERP_KERNEL::NORM_QUAD4 :
79 ConnType N1 = OTT<ConnType,numPol>::coo2C(connec[0]);
80 ConnType N2 = OTT<ConnType,numPol>::coo2C(connec[1]);
81 ConnType N3 = OTT<ConnType,numPol>::coo2C(connec[2]);
82 ConnType N4 = OTT<ConnType,numPol>::coo2C(connec[3]);
84 return INTERP_KERNEL::calculateAreaForQuad(coords+SPACEDIM*N1,
91 case INTERP_KERNEL::NORM_QUAD8 :
92 case INTERP_KERNEL::NORM_QUAD9 :
95 pts[0] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[0]);
96 pts[1] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[1]);
97 pts[2] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[2]);
98 pts[3] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[3]);
99 pts[4] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[4]);
100 pts[5] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[5]);
101 pts[6] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[6]);
102 pts[7] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[7]);
103 return INTERP_KERNEL::calculateAreaForQPolyg(pts,8,SPACEDIM);
106 case INTERP_KERNEL::NORM_POLYGON :
108 const double **pts=new const double *[lgth];
109 for(int inod=0;inod<lgth;inod++)
110 pts[inod] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[inod]);
111 double val=INTERP_KERNEL::calculateAreaForPolyg(pts,lgth,SPACEDIM);
116 case INTERP_KERNEL::NORM_QPOLYG :
118 const double **pts=new const double *[lgth];
119 for(int inod=0;inod<lgth;inod++)
120 pts[inod] = coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[inod]);
121 double val=INTERP_KERNEL::calculateAreaForQPolyg(pts,lgth,SPACEDIM);
126 case INTERP_KERNEL::NORM_TETRA4 :
127 case INTERP_KERNEL::NORM_TETRA10 :
129 ConnType N1 = OTT<ConnType,numPol>::coo2C(connec[0]);
130 ConnType N2 = OTT<ConnType,numPol>::coo2C(connec[1]);
131 ConnType N3 = OTT<ConnType,numPol>::coo2C(connec[2]);
132 ConnType N4 = OTT<ConnType,numPol>::coo2C(connec[3]);
134 return INTERP_KERNEL::calculateVolumeForTetra(coords+SPACEDIM*N1,
141 case INTERP_KERNEL::NORM_PYRA5 :
142 case INTERP_KERNEL::NORM_PYRA13 :
144 ConnType N1 = OTT<ConnType,numPol>::coo2C(connec[0]);
145 ConnType N2 = OTT<ConnType,numPol>::coo2C(connec[1]);
146 ConnType N3 = OTT<ConnType,numPol>::coo2C(connec[2]);
147 ConnType N4 = OTT<ConnType,numPol>::coo2C(connec[3]);
148 ConnType N5 = OTT<ConnType,numPol>::coo2C(connec[4]);
150 return INTERP_KERNEL::calculateVolumeForPyra(coords+SPACEDIM*N1,
158 case INTERP_KERNEL::NORM_PENTA6 :
159 case INTERP_KERNEL::NORM_PENTA15 :
160 case INTERP_KERNEL::NORM_PENTA18 :
162 ConnType N1 = OTT<ConnType,numPol>::coo2C(connec[0]);
163 ConnType N2 = OTT<ConnType,numPol>::coo2C(connec[1]);
164 ConnType N3 = OTT<ConnType,numPol>::coo2C(connec[2]);
165 ConnType N4 = OTT<ConnType,numPol>::coo2C(connec[3]);
166 ConnType N5 = OTT<ConnType,numPol>::coo2C(connec[4]);
167 ConnType N6 = OTT<ConnType,numPol>::coo2C(connec[5]);
169 return INTERP_KERNEL::calculateVolumeForPenta(coords+SPACEDIM*N1,
178 case INTERP_KERNEL::NORM_HEXA8 :
179 case INTERP_KERNEL::NORM_HEXA20 :
180 case INTERP_KERNEL::NORM_HEXA27 :
182 ConnType N1 = OTT<ConnType,numPol>::coo2C(connec[0]);
183 ConnType N2 = OTT<ConnType,numPol>::coo2C(connec[1]);
184 ConnType N3 = OTT<ConnType,numPol>::coo2C(connec[2]);
185 ConnType N4 = OTT<ConnType,numPol>::coo2C(connec[3]);
186 ConnType N5 = OTT<ConnType,numPol>::coo2C(connec[4]);
187 ConnType N6 = OTT<ConnType,numPol>::coo2C(connec[5]);
188 ConnType N7 = OTT<ConnType,numPol>::coo2C(connec[6]);
189 ConnType N8 = OTT<ConnType,numPol>::coo2C(connec[7]);
191 return INTERP_KERNEL::calculateVolumeForHexa(coords+SPACEDIM*N1,
201 case INTERP_KERNEL::NORM_HEXGP12:
203 const ConnType connecHexa12[43]={
204 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,
205 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,
206 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,
207 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,
208 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,
209 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,
210 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,
211 OTT<ConnType,numPol>::coo2C(connec[5]),OTT<ConnType,numPol>::coo2C(connec[11]),OTT<ConnType,numPol>::coo2C(connec[6]),OTT<ConnType,numPol>::coo2C(connec[0])};
212 return calculateVolumeForPolyh2<ConnType,numPol>(connecHexa12,43,coords);
214 case INTERP_KERNEL::NORM_POLYHED :
216 return calculateVolumeForPolyh2<ConnType,numPol>(connec,lgth,coords);
220 throw INTERP_KERNEL::Exception("Not recognized cell type to get Length/Area/Volume on it !");
224 template<class ConnType, NumberingPolicy numPolConn>
225 double computeVolSurfOfCell2(NormalizedCellType type, const ConnType *connec, mcIdType lgth, const double *coords, int spaceDim)
228 return computeVolSurfOfCell<ConnType,numPolConn,3>(type,connec,lgth,coords);
230 return computeVolSurfOfCell<ConnType,numPolConn,2>(type,connec,lgth,coords);
232 return computeVolSurfOfCell<ConnType,numPolConn,1>(type,connec,lgth,coords);
233 throw INTERP_KERNEL::Exception("Invalid spaceDim specified : must be 1, 2 or 3");
237 template<class ConnType, NumberingPolicy numPol,int SPACEDIM>
238 void computeBarycenter(NormalizedCellType type, const ConnType *connec, mcIdType lgth, const double *coords, double *res)
245 std::copy(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[0]),
246 coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[0]+1),res);
247 std::transform(res,res+SPACEDIM,coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[1]),res,std::plus<double>());
248 std::transform(res,res+SPACEDIM,res,std::bind(std::multiplies<double>(),std::placeholders::_1,0.5));
255 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]));
256 ed->getBarycenter(res);
261 *res=(coords[OTT<ConnType,numPol>::coo2C(connec[0])]+coords[OTT<ConnType,numPol>::coo2C(connec[1])])/2.;
265 std::copy(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[0]),
266 coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[0]+1),res);
267 std::transform(res,res+SPACEDIM,coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[1]),res,std::plus<double>());
268 std::transform(res,res+SPACEDIM,res,std::bind(std::multiplies<double>(),std::placeholders::_1,0.5));
271 throw INTERP_KERNEL::Exception("computeBarycenter for SEG3 only SPACEDIM 1,2 or 3 supported !");
277 std::copy(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[0]),
278 coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[0]+1),res);
279 std::transform(res,res+SPACEDIM,coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[1]),res,std::plus<double>());
280 std::transform(res,res+SPACEDIM,coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[2]),res,std::plus<double>());
281 std::transform(res,res+SPACEDIM,res,std::bind(std::multiplies<double>(),std::placeholders::_1,1./3.));
289 pts[0] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[0]));
290 pts[1] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[1]));
291 pts[2] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[2]));
292 pts[3] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[3]));
293 pts[4] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[4]));
294 pts[5] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[5]));
295 computeQPolygonBarycenter2D(pts,6,2,res);
298 computePolygonBarycenter3D<ConnType,numPol>(connec,lgth/2,coords,res);
300 throw INTERP_KERNEL::Exception("Impossible spacedim linked to cell 2D Cell !");
307 computePolygonBarycenter2D<ConnType,numPol>(connec,lgth,coords,res);
309 computePolygonBarycenter3D<ConnType,numPol>(connec,lgth,coords,res);
311 throw INTERP_KERNEL::Exception("Impossible spacedim linked to cell 2D Cell !");
319 pts[0] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[0]));
320 pts[1] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[1]));
321 pts[2] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[2]));
322 pts[3] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[3]));
323 pts[4] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[4]));
324 pts[5] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[5]));
325 pts[6] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[6]));
326 pts[7] = const_cast<double *>(coords+SPACEDIM*OTT<ConnType,numPol>::coo2C(connec[7]));
327 computeQPolygonBarycenter2D(pts,8,2,res);
330 computePolygonBarycenter3D<ConnType,numPol>(connec,lgth/2,coords,res);
332 throw INTERP_KERNEL::Exception("Impossible spacedim linked to cell 2D Cell !");
335 case INTERP_KERNEL::NORM_QPOLYG :
339 double **pts=new double *[lgth];
340 for(int i=0;i<lgth;i++)
341 pts[i]=const_cast<double *>(coords+2*OTT<ConnType,numPol>::coo2C(connec[i]));
342 computeQPolygonBarycenter2D(pts,lgth,2,res);
346 computePolygonBarycenter3D<ConnType,numPol>(connec,lgth/2,coords,res);
348 throw INTERP_KERNEL::Exception("Impossible spacedim linked to cell 2D Cell !");
354 res[0]=coords[3*OTT<ConnType,numPol>::coo2C(connec[0])];
355 res[1]=coords[3*OTT<ConnType,numPol>::coo2C(connec[0])+1];
356 res[2]=coords[3*OTT<ConnType,numPol>::coo2C(connec[0])+2];
357 res[0]+=coords[3*OTT<ConnType,numPol>::coo2C(connec[1])];
358 res[1]+=coords[3*OTT<ConnType,numPol>::coo2C(connec[1])+1];
359 res[2]+=coords[3*OTT<ConnType,numPol>::coo2C(connec[1])+2];
360 res[0]+=coords[3*OTT<ConnType,numPol>::coo2C(connec[2])];
361 res[1]+=coords[3*OTT<ConnType,numPol>::coo2C(connec[2])+1];
362 res[2]+=coords[3*OTT<ConnType,numPol>::coo2C(connec[2])+2];
363 res[0]+=coords[3*OTT<ConnType,numPol>::coo2C(connec[3])];
364 res[1]+=coords[3*OTT<ConnType,numPol>::coo2C(connec[3])+1];
365 res[2]+=coords[3*OTT<ConnType,numPol>::coo2C(connec[3])+2];
366 res[0]*=0.25; res[1]*=0.25; res[2]*=0.25;
372 computePolygonBarycenter3D<ConnType,numPol>(connec,lgth-1,coords,tmp);
373 res[0]=(coords[3*OTT<ConnType,numPol>::coo2C(connec[4])]+3.*tmp[0])/4.;
374 res[1]=(coords[3*OTT<ConnType,numPol>::coo2C(connec[4])+1]+3.*tmp[1])/4.;
375 res[2]=(coords[3*OTT<ConnType,numPol>::coo2C(connec[4])+2]+3.*tmp[2])/4.;
380 const ConnType conn[29]={
381 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,
382 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,
383 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,
384 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,
385 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,
386 OTT<ConnType,numPol>::coo2C(connec[0]),OTT<ConnType,numPol>::coo2C(connec[4]),OTT<ConnType,numPol>::coo2C(connec[5]),OTT<ConnType,numPol>::coo2C(connec[1]),
388 barycenterOfPolyhedron<ConnType,numPol>(conn,29,coords,res);
393 const ConnType conn[22]={
394 OTT<ConnType,numPol>::coo2C(connec[0]),OTT<ConnType,numPol>::coo2C(connec[1]),OTT<ConnType,numPol>::coo2C(connec[2]),-1,
395 OTT<ConnType,numPol>::coo2C(connec[3]),OTT<ConnType,numPol>::coo2C(connec[5]),OTT<ConnType,numPol>::coo2C(connec[4]),-1,
396 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,
397 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,
398 OTT<ConnType,numPol>::coo2C(connec[1]),OTT<ConnType,numPol>::coo2C(connec[0]),OTT<ConnType,numPol>::coo2C(connec[3]),OTT<ConnType,numPol>::coo2C(connec[4])
400 barycenterOfPolyhedron<ConnType,numPol>(conn,22,coords,res);
403 case INTERP_KERNEL::NORM_HEXGP12:
405 const ConnType connecHexa12[43]={
406 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,
407 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,
408 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,
409 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,
410 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,
411 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,
412 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,
413 OTT<ConnType,numPol>::coo2C(connec[5]),OTT<ConnType,numPol>::coo2C(connec[11]),OTT<ConnType,numPol>::coo2C(connec[6]),OTT<ConnType,numPol>::coo2C(connec[0])};
414 barycenterOfPolyhedron<ConnType,numPol>(connecHexa12,43,coords,res);
419 barycenterOfPolyhedron<ConnType,numPol>(connec,lgth,coords,res);
423 throw INTERP_KERNEL::Exception("Not recognized cell type to get Barycenter on it !");
427 template<class ConnType, NumberingPolicy numPolConn>
428 void computeBarycenter2(NormalizedCellType type, const ConnType *connec, mcIdType lgth, const double *coords, int spaceDim, double *res)
431 return computeBarycenter<ConnType,numPolConn,3>(type,connec,lgth,coords,res);
433 return computeBarycenter<ConnType,numPolConn,2>(type,connec,lgth,coords,res);
435 return computeBarycenter<ConnType,numPolConn,1>(type,connec,lgth,coords,res);
436 throw INTERP_KERNEL::Exception("Invalid spaceDim specified for compute barycenter : must be 1, 2 or 3");
439 template<int SPACEDIM>
440 void ComputeTriangleHeight(const double *PA, const double *PB, const double *PC, double *res)
442 double AB = getDistanceBtw2Pts<SPACEDIM>(PA,PB);
443 double BC = getDistanceBtw2Pts<SPACEDIM>(PB,PC);
444 double CA = getDistanceBtw2Pts<SPACEDIM>(PC,PA);
445 double perim( (AB+BC+CA)*0.5 );
446 double num( 2*sqrt(perim*(perim-AB)*(perim-BC)*(perim-CA)) );
447 res[0] = num/AB; res[1] = num/BC; res[2] = num/CA;