X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FINTERP_KERNEL%2FVolSurfUser.txx;h=6e15126030f05eab24de16f8e477892ae6790309;hb=b219559763498c4bd10c730cd3d2c62b1eed45db;hp=df90d7ffae1a1ef478ae51181800e74cb710f299;hpb=f1a947b32a36d8dc8e3079b25305bb50e8cb59a0;p=tools%2Fmedcoupling.git diff --git a/src/INTERP_KERNEL/VolSurfUser.txx b/src/INTERP_KERNEL/VolSurfUser.txx index df90d7ffa..6e1512603 100644 --- a/src/INTERP_KERNEL/VolSurfUser.txx +++ b/src/INTERP_KERNEL/VolSurfUser.txx @@ -1,9 +1,9 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D +// Copyright (C) 2007-2019 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -29,23 +29,29 @@ namespace INTERP_KERNEL { template - double computeVolSurfOfCell(NormalizedCellType type, const ConnType *connec, int lgth, const double *coords) + double computeVolSurfOfCell(NormalizedCellType type, const ConnType *connec, mcIdType lgth, const double *coords) { switch(type) { case INTERP_KERNEL::NORM_SEG2 : - case INTERP_KERNEL::NORM_SEG3 : case INTERP_KERNEL::NORM_SEG4 : { - int N1 = OTT::coo2C(connec[0]); - int N2 = OTT::coo2C(connec[1]); + ConnType N1 = OTT::coo2C(connec[0]); + ConnType N2 = OTT::coo2C(connec[1]); return INTERP_KERNEL::calculateLgthForSeg2(coords+(SPACEDIM*N1),coords+(SPACEDIM*N2),SPACEDIM); } + case INTERP_KERNEL::NORM_SEG3 : + { + ConnType beginNode = OTT::coo2C(connec[0]); + ConnType endNode = OTT::coo2C(connec[1]); + ConnType middleNode = OTT::coo2C(connec[2]); + return INTERP_KERNEL::calculateLgthForSeg3(coords+(SPACEDIM*beginNode),coords+(SPACEDIM*endNode),coords+(SPACEDIM*middleNode),SPACEDIM); + } case INTERP_KERNEL::NORM_TRI3 : { - int N1 = OTT::coo2C(connec[0]); - int N2 = OTT::coo2C(connec[1]); - int N3 = OTT::coo2C(connec[2]); + ConnType N1 = OTT::coo2C(connec[0]); + ConnType N2 = OTT::coo2C(connec[1]); + ConnType N3 = OTT::coo2C(connec[2]); return INTERP_KERNEL::calculateAreaForTria(coords+(SPACEDIM*N1), coords+(SPACEDIM*N2), @@ -69,10 +75,10 @@ namespace INTERP_KERNEL break; case INTERP_KERNEL::NORM_QUAD4 : { - int N1 = OTT::coo2C(connec[0]); - int N2 = OTT::coo2C(connec[1]); - int N3 = OTT::coo2C(connec[2]); - int N4 = OTT::coo2C(connec[3]); + ConnType N1 = OTT::coo2C(connec[0]); + ConnType N2 = OTT::coo2C(connec[1]); + ConnType N3 = OTT::coo2C(connec[2]); + ConnType N4 = OTT::coo2C(connec[3]); return INTERP_KERNEL::calculateAreaForQuad(coords+SPACEDIM*N1, coords+SPACEDIM*N2, @@ -115,13 +121,14 @@ namespace INTERP_KERNEL delete [] pts; return val; } + break; case INTERP_KERNEL::NORM_TETRA4 : case INTERP_KERNEL::NORM_TETRA10 : { - int N1 = OTT::coo2C(connec[0]); - int N2 = OTT::coo2C(connec[1]); - int N3 = OTT::coo2C(connec[2]); - int N4 = OTT::coo2C(connec[3]); + ConnType N1 = OTT::coo2C(connec[0]); + ConnType N2 = OTT::coo2C(connec[1]); + ConnType N3 = OTT::coo2C(connec[2]); + ConnType N4 = OTT::coo2C(connec[3]); return INTERP_KERNEL::calculateVolumeForTetra(coords+SPACEDIM*N1, coords+SPACEDIM*N2, @@ -133,11 +140,11 @@ namespace INTERP_KERNEL case INTERP_KERNEL::NORM_PYRA5 : case INTERP_KERNEL::NORM_PYRA13 : { - int N1 = OTT::coo2C(connec[0]); - int N2 = OTT::coo2C(connec[1]); - int N3 = OTT::coo2C(connec[2]); - int N4 = OTT::coo2C(connec[3]); - int N5 = OTT::coo2C(connec[4]); + ConnType N1 = OTT::coo2C(connec[0]); + ConnType N2 = OTT::coo2C(connec[1]); + ConnType N3 = OTT::coo2C(connec[2]); + ConnType N4 = OTT::coo2C(connec[3]); + ConnType N5 = OTT::coo2C(connec[4]); return INTERP_KERNEL::calculateVolumeForPyra(coords+SPACEDIM*N1, coords+SPACEDIM*N2, @@ -149,13 +156,14 @@ namespace INTERP_KERNEL case INTERP_KERNEL::NORM_PENTA6 : case INTERP_KERNEL::NORM_PENTA15 : + case INTERP_KERNEL::NORM_PENTA18 : { - int N1 = OTT::coo2C(connec[0]); - int N2 = OTT::coo2C(connec[1]); - int N3 = OTT::coo2C(connec[2]); - int N4 = OTT::coo2C(connec[3]); - int N5 = OTT::coo2C(connec[4]); - int N6 = OTT::coo2C(connec[5]); + ConnType N1 = OTT::coo2C(connec[0]); + ConnType N2 = OTT::coo2C(connec[1]); + ConnType N3 = OTT::coo2C(connec[2]); + ConnType N4 = OTT::coo2C(connec[3]); + ConnType N5 = OTT::coo2C(connec[4]); + ConnType N6 = OTT::coo2C(connec[5]); return INTERP_KERNEL::calculateVolumeForPenta(coords+SPACEDIM*N1, coords+SPACEDIM*N2, @@ -170,14 +178,14 @@ namespace INTERP_KERNEL case INTERP_KERNEL::NORM_HEXA20 : case INTERP_KERNEL::NORM_HEXA27 : { - int N1 = OTT::coo2C(connec[0]); - int N2 = OTT::coo2C(connec[1]); - int N3 = OTT::coo2C(connec[2]); - int N4 = OTT::coo2C(connec[3]); - int N5 = OTT::coo2C(connec[4]); - int N6 = OTT::coo2C(connec[5]); - int N7 = OTT::coo2C(connec[6]); - int N8 = OTT::coo2C(connec[7]); + ConnType N1 = OTT::coo2C(connec[0]); + ConnType N2 = OTT::coo2C(connec[1]); + ConnType N3 = OTT::coo2C(connec[2]); + ConnType N4 = OTT::coo2C(connec[3]); + ConnType N5 = OTT::coo2C(connec[4]); + ConnType N6 = OTT::coo2C(connec[5]); + ConnType N7 = OTT::coo2C(connec[6]); + ConnType N8 = OTT::coo2C(connec[7]); return INTERP_KERNEL::calculateVolumeForHexa(coords+SPACEDIM*N1, coords+SPACEDIM*N2, @@ -191,7 +199,7 @@ namespace INTERP_KERNEL break; case INTERP_KERNEL::NORM_HEXGP12: { - const int connecHexa12[43]={ + const ConnType connecHexa12[43]={ OTT::coo2C(connec[0]),OTT::coo2C(connec[1]),OTT::coo2C(connec[2]),OTT::coo2C(connec[3]),OTT::coo2C(connec[4]),OTT::coo2C(connec[5]),-1, OTT::coo2C(connec[6]),OTT::coo2C(connec[11]),OTT::coo2C(connec[10]),OTT::coo2C(connec[9]),OTT::coo2C(connec[8]),OTT::coo2C(connec[7]),-1, OTT::coo2C(connec[0]),OTT::coo2C(connec[6]),OTT::coo2C(connec[7]),OTT::coo2C(connec[1]),-1, @@ -213,7 +221,7 @@ namespace INTERP_KERNEL } template - double computeVolSurfOfCell2(NormalizedCellType type, const ConnType *connec, int lgth, const double *coords, int spaceDim) + double computeVolSurfOfCell2(NormalizedCellType type, const ConnType *connec, mcIdType lgth, const double *coords, int spaceDim) { if(spaceDim==3) return computeVolSurfOfCell(type,connec,lgth,coords); @@ -226,12 +234,11 @@ namespace INTERP_KERNEL template - void computeBarycenter(NormalizedCellType type, const ConnType *connec, int lgth, const double *coords, double *res) + void computeBarycenter(NormalizedCellType type, const ConnType *connec, mcIdType lgth, const double *coords, double *res) { switch(type) { case NORM_SEG2: - case NORM_SEG3: case NORM_SEG4: { std::copy(coords+SPACEDIM*OTT::coo2C(connec[0]), @@ -240,8 +247,30 @@ namespace INTERP_KERNEL std::transform(res,res+SPACEDIM,res,std::bind2nd(std::multiplies(),0.5)); break; } + case NORM_SEG3: + { + if(SPACEDIM==2) + { + Edge *ed=Edge::BuildEdgeFrom3Points(coords+2*OTT::coo2C(connec[0]),coords+2*OTT::coo2C(connec[2]),coords+2*OTT::coo2C(connec[1])); + ed->getBarycenter(res); + ed->decrRef(); + } + else if(SPACEDIM==1) + { + *res=(coords[OTT::coo2C(connec[0])]+coords[OTT::coo2C(connec[1])])/2.; + } + else if(SPACEDIM==3) + { + std::copy(coords+SPACEDIM*OTT::coo2C(connec[0]), + coords+SPACEDIM*OTT::coo2C(connec[0]+1),res); + std::transform(res,res+SPACEDIM,coords+SPACEDIM*OTT::coo2C(connec[1]),res,std::plus()); + std::transform(res,res+SPACEDIM,res,std::bind2nd(std::multiplies(),0.5)); + } + else + throw INTERP_KERNEL::Exception("computeBarycenter for SEG3 only SPACEDIM 1,2 or 3 supported !"); + break; + } case NORM_TRI3: - case NORM_TRI6: case NORM_TRI7: { std::copy(coords+SPACEDIM*OTT::coo2C(connec[0]), @@ -251,6 +280,25 @@ namespace INTERP_KERNEL std::transform(res,res+SPACEDIM,res,std::bind2nd(std::multiplies(),1./3.)); break; } + case NORM_TRI6: + { + if(SPACEDIM==2) + { + double *pts[6]; + pts[0] = const_cast(coords+SPACEDIM*OTT::coo2C(connec[0])); + pts[1] = const_cast(coords+SPACEDIM*OTT::coo2C(connec[1])); + pts[2] = const_cast(coords+SPACEDIM*OTT::coo2C(connec[2])); + pts[3] = const_cast(coords+SPACEDIM*OTT::coo2C(connec[3])); + pts[4] = const_cast(coords+SPACEDIM*OTT::coo2C(connec[4])); + pts[5] = const_cast(coords+SPACEDIM*OTT::coo2C(connec[5])); + computeQPolygonBarycenter2D(pts,6,2,res); + } + else if(SPACEDIM==3) + computePolygonBarycenter3D(connec,lgth/2,coords,res); + else + throw INTERP_KERNEL::Exception("Impossible spacedim linked to cell 2D Cell !"); + break; + } case NORM_QUAD4: case NORM_POLYGON: { @@ -265,13 +313,41 @@ namespace INTERP_KERNEL case NORM_QUAD8: { if(SPACEDIM==2) - computePolygonBarycenter2D(connec,lgth/2,coords,res); + { + double *pts[8]; + pts[0] = const_cast(coords+SPACEDIM*OTT::coo2C(connec[0])); + pts[1] = const_cast(coords+SPACEDIM*OTT::coo2C(connec[1])); + pts[2] = const_cast(coords+SPACEDIM*OTT::coo2C(connec[2])); + pts[3] = const_cast(coords+SPACEDIM*OTT::coo2C(connec[3])); + pts[4] = const_cast(coords+SPACEDIM*OTT::coo2C(connec[4])); + pts[5] = const_cast(coords+SPACEDIM*OTT::coo2C(connec[5])); + pts[6] = const_cast(coords+SPACEDIM*OTT::coo2C(connec[6])); + pts[7] = const_cast(coords+SPACEDIM*OTT::coo2C(connec[7])); + computeQPolygonBarycenter2D(pts,8,2,res); + } + else if(SPACEDIM==3) + computePolygonBarycenter3D(connec,lgth/2,coords,res); + else + throw INTERP_KERNEL::Exception("Impossible spacedim linked to cell 2D Cell !"); + break; + } + case INTERP_KERNEL::NORM_QPOLYG : + { + if(SPACEDIM==2) + { + double **pts=new double *[lgth]; + for(int i=0;i(coords+2*OTT::coo2C(connec[i])); + computeQPolygonBarycenter2D(pts,lgth,2,res); + delete [] pts; + } else if(SPACEDIM==3) computePolygonBarycenter3D(connec,lgth/2,coords,res); else throw INTERP_KERNEL::Exception("Impossible spacedim linked to cell 2D Cell !"); break; } + break; case NORM_TETRA4: { res[0]=coords[3*OTT::coo2C(connec[0])]; @@ -300,7 +376,7 @@ namespace INTERP_KERNEL } case NORM_HEXA8: { - const int conn[29]={ + const ConnType conn[29]={ OTT::coo2C(connec[0]),OTT::coo2C(connec[1]),OTT::coo2C(connec[2]),OTT::coo2C(connec[3]),-1, OTT::coo2C(connec[4]),OTT::coo2C(connec[7]),OTT::coo2C(connec[6]),OTT::coo2C(connec[5]),-1, OTT::coo2C(connec[0]),OTT::coo2C(connec[3]),OTT::coo2C(connec[7]),OTT::coo2C(connec[4]),-1, @@ -313,7 +389,7 @@ namespace INTERP_KERNEL } case NORM_PENTA6: { - const int conn[22]={ + const ConnType conn[22]={ OTT::coo2C(connec[0]),OTT::coo2C(connec[1]),OTT::coo2C(connec[2]),-1, OTT::coo2C(connec[3]),OTT::coo2C(connec[5]),OTT::coo2C(connec[4]),-1, OTT::coo2C(connec[0]),OTT::coo2C(connec[2]),OTT::coo2C(connec[5]),OTT::coo2C(connec[3]),-1, @@ -325,7 +401,7 @@ namespace INTERP_KERNEL } case INTERP_KERNEL::NORM_HEXGP12: { - const int connecHexa12[43]={ + const ConnType connecHexa12[43]={ OTT::coo2C(connec[0]),OTT::coo2C(connec[1]),OTT::coo2C(connec[2]),OTT::coo2C(connec[3]),OTT::coo2C(connec[4]),OTT::coo2C(connec[5]),-1, OTT::coo2C(connec[6]),OTT::coo2C(connec[11]),OTT::coo2C(connec[10]),OTT::coo2C(connec[9]),OTT::coo2C(connec[8]),OTT::coo2C(connec[7]),-1, OTT::coo2C(connec[0]),OTT::coo2C(connec[6]),OTT::coo2C(connec[7]),OTT::coo2C(connec[1]),-1, @@ -348,7 +424,7 @@ namespace INTERP_KERNEL } template - void computeBarycenter2(NormalizedCellType type, const ConnType *connec, int lgth, const double *coords, int spaceDim, double *res) + void computeBarycenter2(NormalizedCellType type, const ConnType *connec, mcIdType lgth, const double *coords, int spaceDim, double *res) { if(spaceDim==3) return computeBarycenter(type,connec,lgth,coords,res);