1 // Copyright (C) 2007-2019 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
20 #ifndef __INTERPKERNELGAUSSCOORDS_HXX__
21 #define __INTERPKERNELGAUSSCOORDS_HXX__
23 #include "INTERPKERNELDefines.hxx"
24 #include "NormalizedUnstructuredMesh.hxx"
25 #include "InterpKernelException.hxx"
26 #include "MCIdType.hxx"
30 namespace INTERP_KERNEL
32 typedef std::vector<double> DataVector;
33 typedef std::vector<int> IndexVector;
35 //Class to store Gauss Points information
39 INTERPKERNEL_EXPORT GaussInfo( NormalizedCellType theGeometry,
40 const DataVector& theGaussCoord,
42 const DataVector& theReferenceCoord,
45 INTERPKERNEL_EXPORT ~GaussInfo();
47 INTERPKERNEL_EXPORT NormalizedCellType getCellType() const;
49 INTERPKERNEL_EXPORT int getGaussCoordDim() const;
50 INTERPKERNEL_EXPORT int getReferenceCoordDim() const;
51 INTERPKERNEL_EXPORT DataVector getGaussCoords() const { return _my_gauss_coord; }
52 INTERPKERNEL_EXPORT DataVector getRefCoords() const { return _my_reference_coord; }
53 INTERPKERNEL_EXPORT NormalizedCellType getGeoType() const { return _my_geometry; }
55 INTERPKERNEL_EXPORT int getNbGauss() const;
56 INTERPKERNEL_EXPORT int getNbRef() const;
58 INTERPKERNEL_EXPORT GaussInfo convertToLinear() const;
60 INTERPKERNEL_EXPORT const double* getFunctionValues( const int theGaussId ) const;
62 INTERPKERNEL_EXPORT void initLocalInfo();
64 INTERPKERNEL_EXPORT static std::vector<double> NormalizeCoordinatesIfNecessary(NormalizedCellType ct, int inputDim, const std::vector<double>& inputArray);
67 static const double SEG2A_REF[2];
68 static const double SEG2B_REF[2];
69 static const double SEG3_REF[3];
70 static const double TRIA3A_REF[6];
71 static const double TRIA3B_REF[6];
72 static const double TRIA6A_REF[12];
73 static const double TRIA6B_REF[12];
74 static const double TRIA7A_REF[14];
75 static const double QUAD4A_REF[8];
76 static const double QUAD4B_REF[8];
77 static const double QUAD8A_REF[16];
78 static const double QUAD8B_REF[16];
79 static const double QUAD9A_REF[18];
80 static const double TETRA4A_REF[12];
81 static const double TETRA4B_REF[12];
82 static const double TETRA10A_REF[30];
83 static const double TETRA10B_REF[30];
84 static const double PYRA5A_REF[15];
85 static const double PYRA5B_REF[15];
86 static const double PYRA13A_REF[39];
87 static const double PYRA13B_REF[39];
88 static const double PENTA6A_REF[18];
89 static const double PENTA6B_REF[18];
90 static const double PENTA15A_REF[45];
91 static const double PENTA15B_REF[45];
92 static const double HEXA8A_REF[24];
93 static const double HEXA8B_REF[24];
94 static const double HEXA20A_REF[60];
95 static const double HEXA20B_REF[60];
96 static const double HEXA27A_REF[81];
98 static bool IsSatisfy(const std::vector<double>& ref1, const std::vector<double>& ref2);
116 static void Quad4aInit(GaussInfo& obj) { obj.quad4aInit(); }
118 static void Quad4bInit(GaussInfo& obj) { obj.quad4bInit(); }
120 static void Quad4cInit(GaussInfo& obj) { obj.quad4cInit(); }
121 void quad4DegSeg2Init();
122 static void Quad4DegSeg2Init(GaussInfo& obj) { obj.quad4DegSeg2Init(); }
139 static void Penta6aInit(GaussInfo& obj) { obj.penta6aInit(); }
141 static void Penta6bInit(GaussInfo& obj) { obj.penta6bInit(); }
142 void penta6DegTria3aInit();
143 static void Penta6DegTria3aInit(GaussInfo& obj) { obj.penta6DegTria3aInit(); }
144 void penta6DegTria3bInit();
145 static void Penta6DegTria3bInit(GaussInfo& obj) { obj.penta6DegTria3bInit(); }
148 static void Penta15aInit(GaussInfo& obj) { obj.penta15aInit(); }
150 static void Penta15bInit(GaussInfo& obj) { obj.penta15bInit(); }
153 static void Hexa8aInit(GaussInfo& obj) { obj.hexa8aInit(); }
155 static void Hexa8bInit(GaussInfo& obj) { obj.hexa8bInit(); }
156 void hexa8DegQuad4aInit();
157 static void Hexa8DegQuad4aInit(GaussInfo& obj) { obj.hexa8DegQuad4aInit(); }
158 void hexa8DegQuad4bInit();
159 static void Hexa8DegQuad4bInit(GaussInfo& obj) { obj.hexa8DegQuad4bInit(); }
160 void hexa8DegQuad4cInit();
161 static void Hexa8DegQuad4cInit(GaussInfo& obj) { obj.hexa8DegQuad4cInit(); }
167 //INFORMATION from MEDMEM
168 NormalizedCellType _my_geometry; //Cell type
170 int _my_nb_gauss; //Nb of the gauss points for element
171 DataVector _my_gauss_coord; //Gauss coordinates
173 int _my_nb_ref; //Nb of the nodes for element:
179 DataVector _my_reference_coord; //Reference coordinates
182 DataVector _my_local_reference_coord; //Vector to store reference coordinates
183 int _my_local_ref_dim; //Dimension of the local reference coordinates:
186 // (x, y, z) - 3D case
187 int _my_local_nb_ref; //Nb of the local reference coordinates
189 DataVector _my_function_value; //Shape Function values
193 //Class for calculation of the coordinates of the gauss points
198 INTERPKERNEL_EXPORT GaussCoords();
199 INTERPKERNEL_EXPORT ~GaussCoords();
201 INTERPKERNEL_EXPORT void addGaussInfo( NormalizedCellType theGeometry,
203 const double* theGaussCoord,
205 const double* theReferenceCoord,
208 INTERPKERNEL_EXPORT double* calculateCoords( NormalizedCellType theGeometry,
209 const double* theNodeCoords,
210 const int theSpaceDim,
211 const mcIdType* theIndex);
213 INTERPKERNEL_EXPORT void calculateCoords( NormalizedCellType theGeometry,
214 const double* theNodeCoords,
215 const int theSpaceDim,
216 const mcIdType* theIndex,
219 const GaussInfo *getInfoGivenCellType(NormalizedCellType cellType);
220 void calculateCoordsAlg(const GaussInfo *info, const double* theNodeCoords, const int theSpaceDim, const mcIdType *theIndex,
223 typedef std::vector<GaussInfo*> GaussInfoVector;
224 GaussInfoVector _my_gauss_info;
227 #endif //INTERPKERNELGAUSSCOORDS