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 PENTA18A_REF[54];
93 static const double PENTA18B_REF[54];
94 static const double HEXA8A_REF[24];
95 static const double HEXA8B_REF[24];
96 static const double HEXA20A_REF[60];
97 static const double HEXA20B_REF[60];
98 static const double HEXA27A_REF[81];
100 static bool IsSatisfy(const std::vector<double>& ref1, const std::vector<double>& ref2);
118 static void Quad4aInit(GaussInfo& obj) { obj.quad4aInit(); }
120 static void Quad4bInit(GaussInfo& obj) { obj.quad4bInit(); }
122 static void Quad4cInit(GaussInfo& obj) { obj.quad4cInit(); }
123 void quad4DegSeg2Init();
124 static void Quad4DegSeg2Init(GaussInfo& obj) { obj.quad4DegSeg2Init(); }
141 static void Penta6aInit(GaussInfo& obj) { obj.penta6aInit(); }
143 static void Penta6bInit(GaussInfo& obj) { obj.penta6bInit(); }
144 void penta6DegTria3aInit();
145 static void Penta6DegTria3aInit(GaussInfo& obj) { obj.penta6DegTria3aInit(); }
146 void penta6DegTria3bInit();
147 static void Penta6DegTria3bInit(GaussInfo& obj) { obj.penta6DegTria3bInit(); }
150 static void Penta15aInit(GaussInfo& obj) { obj.penta15aInit(); }
152 static void Penta15bInit(GaussInfo& obj) { obj.penta15bInit(); }
154 static void Penta18aInit(GaussInfo& obj) { obj.penta18aInit(); }
156 static void Penta18bInit(GaussInfo& obj) { obj.penta18bInit(); }
159 static void Hexa8aInit(GaussInfo& obj) { obj.hexa8aInit(); }
161 static void Hexa8bInit(GaussInfo& obj) { obj.hexa8bInit(); }
162 void hexa8DegQuad4aInit();
163 static void Hexa8DegQuad4aInit(GaussInfo& obj) { obj.hexa8DegQuad4aInit(); }
164 void hexa8DegQuad4bInit();
165 static void Hexa8DegQuad4bInit(GaussInfo& obj) { obj.hexa8DegQuad4bInit(); }
166 void hexa8DegQuad4cInit();
167 static void Hexa8DegQuad4cInit(GaussInfo& obj) { obj.hexa8DegQuad4cInit(); }
173 //INFORMATION from MEDMEM
174 NormalizedCellType _my_geometry; //Cell type
176 int _my_nb_gauss; //Nb of the gauss points for element
177 DataVector _my_gauss_coord; //Gauss coordinates
179 int _my_nb_ref; //Nb of the nodes for element:
185 DataVector _my_reference_coord; //Reference coordinates
188 DataVector _my_local_reference_coord; //Vector to store reference coordinates
189 int _my_local_ref_dim; //Dimension of the local reference coordinates:
192 // (x, y, z) - 3D case
193 int _my_local_nb_ref; //Nb of the local reference coordinates
195 DataVector _my_function_value; //Shape Function values
199 //Class for calculation of the coordinates of the gauss points
204 INTERPKERNEL_EXPORT GaussCoords();
205 INTERPKERNEL_EXPORT ~GaussCoords();
207 INTERPKERNEL_EXPORT void addGaussInfo( NormalizedCellType theGeometry,
209 const double* theGaussCoord,
211 const double* theReferenceCoord,
214 INTERPKERNEL_EXPORT double* calculateCoords( NormalizedCellType theGeometry,
215 const double* theNodeCoords,
216 const int theSpaceDim,
217 const mcIdType* theIndex);
219 INTERPKERNEL_EXPORT void calculateCoords( NormalizedCellType theGeometry,
220 const double* theNodeCoords,
221 const int theSpaceDim,
222 const mcIdType* theIndex,
225 const GaussInfo *getInfoGivenCellType(NormalizedCellType cellType);
226 void calculateCoordsAlg(const GaussInfo *info, const double* theNodeCoords, const int theSpaceDim, const mcIdType *theIndex,
229 typedef std::vector<GaussInfo*> GaussInfoVector;
230 GaussInfoVector _my_gauss_info;
233 #endif //INTERPKERNELGAUSSCOORDS