1 // Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
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.
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 // File : MEDMEM_GaussLocalization.cxx
21 // Created : Thu Dec 20 12:26:33 2007
22 // Author : Edward AGAPOV (eap)
24 #include "MEDMEM_GaussLocalization.hxx"
29 #define EXCEPTION(type,msg) \
30 MEDEXCEPTION(LOCALIZED(MEDMEM::STRING(#type)<< msg))
32 namespace // matters used by GAUSS_LOCALIZATION_::makeDefaultLocalization()
34 typedef std::vector<double> TDoubleVector;
35 typedef double* TCoordSlice;
37 //---------------------------------------------------------------
38 //! Shape function definitions
39 //---------------------------------------------------------------
44 TDoubleVector myRefCoord;
46 TShapeFun(TInt theDim = 0, TInt theNbRef = 0)
47 :myDim(theDim),myNbRef(theNbRef),myRefCoord(theNbRef*theDim) {}
49 TInt GetNbRef() const { return myNbRef; }
51 TCoordSlice GetCoord(TInt theRefId) { return &myRefCoord[0] + theRefId * myDim; }
53 //---------------------------------------------------------------
55 * \brief Description of family of integration points
57 //---------------------------------------------------------------
60 int myType; //!< element geometry (EGeometrieElement or med_geometrie_element)
61 TDoubleVector myRefCoords; //!< description of reference points
62 TDoubleVector myCoords; //!< coordinates of Gauss points
63 TDoubleVector myWeights; //!< weights, len(weights)==<nb of gauss points>
66 * \brief Creates definition of gauss points family
67 * \param geomType - element geometry (EGeometrieElement or med_geometrie_element)
68 * \param nbPoints - nb gauss point
69 * \param variant - [1-3] to choose the variant of definition
71 * Throws in case of invalid parameters
72 * variant == 1 refers to "Fonctions de forme et points d'integration
73 * des elements finis" v7.4 by J. PELLET, X. DESROCHES, 15/09/05
74 * variant == 2 refers to the same doc v6.4 by J.P. LEFEBVRE, X. DESROCHES, 03/07/03
75 * variant == 3 refers to the same doc v6.4, second variant for 2D elements
77 TGaussDef(const int geomType, const int nbPoints, const int variant=1);
79 int dim() const { return myType/100; }
80 int nbPoints() const { return myWeights.capacity(); }
83 void add(const double x, const double weight);
84 void add(const double x, const double y, const double weight);
85 void add(const double x, const double y, const double z, const double weight);
86 void setRefCoords(const TShapeFun& aShapeFun) { myRefCoords = aShapeFun.myRefCoord; }
88 struct TSeg2a: TShapeFun {
91 struct TSeg3a: TShapeFun {
94 struct TTria3a: TShapeFun {
97 struct TTria6a: TShapeFun {
100 struct TTria3b: TShapeFun {
103 struct TTria6b: TShapeFun {
106 struct TQuad4a: TShapeFun {
109 struct TQuad8a: TShapeFun {
112 struct TQuad4b: TShapeFun {
115 struct TQuad8b: TShapeFun {
118 struct TTetra4a: TShapeFun {
121 struct TTetra10a: TShapeFun {
124 struct TTetra4b: TShapeFun {
127 struct TTetra10b: TShapeFun {
130 struct THexa8a: TShapeFun {
133 struct THexa20a: TShapeFun {
134 THexa20a(TInt theDim = 3, TInt theNbRef = 20);
136 struct THexa27a: THexa20a {
139 struct THexa8b: TShapeFun {
142 struct THexa20b: TShapeFun {
143 THexa20b(TInt theDim = 3, TInt theNbRef = 20);
145 struct TPenta6a: TShapeFun {
148 struct TPenta6b: TShapeFun {
151 struct TPenta15a: TShapeFun {
154 struct TPenta15b: TShapeFun {
157 struct TPyra5a: TShapeFun {
160 struct TPyra5b: TShapeFun {
163 struct TPyra13a: TShapeFun {
166 struct TPyra13b: TShapeFun {
170 void TGaussDef::add(const double x, const double weight)
173 EXCEPTION( logic_error,"dim() != 1");
174 if ( myWeights.capacity() == myWeights.size() )
175 EXCEPTION( logic_error,"Extra gauss point");
176 myCoords.push_back( x );
177 myWeights.push_back( weight );
179 void TGaussDef::add(const double x, const double y, const double weight)
182 EXCEPTION( logic_error,"dim() != 2");
183 if ( myWeights.capacity() == myWeights.size() )
184 EXCEPTION( logic_error,"Extra gauss point");
185 myCoords.push_back( x );
186 myCoords.push_back( y );
187 myWeights.push_back( weight );
189 void TGaussDef::add(const double x, const double y, const double z, const double weight)
192 EXCEPTION( logic_error,"dim() != 3");
193 if ( myWeights.capacity() == myWeights.size() )
194 EXCEPTION( logic_error,"Extra gauss point");
195 myCoords.push_back( x );
196 myCoords.push_back( y );
197 myCoords.push_back( z );
198 myWeights.push_back( weight );
201 //---------------------------------------------------------------
202 TSeg2a::TSeg2a():TShapeFun(1,2)
204 TInt aNbRef = GetNbRef();
205 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
206 TCoordSlice aCoord = GetCoord(aRefId);
208 case 0: aCoord[0] = -1.0; break;
209 case 1: aCoord[0] = 1.0; break;
213 //---------------------------------------------------------------
214 TSeg3a::TSeg3a():TShapeFun(1,3)
216 TInt aNbRef = GetNbRef();
217 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
218 TCoordSlice aCoord = GetCoord(aRefId);
220 case 0: aCoord[0] = -1.0; break;
221 case 1: aCoord[0] = 1.0; break;
222 case 2: aCoord[0] = 0.0; break;
226 //---------------------------------------------------------------
230 TInt aNbRef = GetNbRef();
231 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
232 TCoordSlice aCoord = GetCoord(aRefId);
234 case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; break;
235 case 1: aCoord[0] = -1.0; aCoord[1] = -1.0; break;
236 case 2: aCoord[0] = 1.0; aCoord[1] = -1.0; break;
240 //---------------------------------------------------------------
241 TTria6a::TTria6a():TShapeFun(2,6)
243 TInt aNbRef = GetNbRef();
244 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
245 TCoordSlice aCoord = GetCoord(aRefId);
247 case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; break;
248 case 1: aCoord[0] = -1.0; aCoord[1] = -1.0; break;
249 case 2: aCoord[0] = 1.0; aCoord[1] = -1.0; break;
251 case 3: aCoord[0] = -1.0; aCoord[1] = 1.0; break;
252 case 4: aCoord[0] = 0.0; aCoord[1] = -1.0; break;
253 case 5: aCoord[0] = 0.0; aCoord[1] = 0.0; break;
257 //---------------------------------------------------------------
261 TInt aNbRef = GetNbRef();
262 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
263 TCoordSlice aCoord = GetCoord(aRefId);
265 case 0: aCoord[0] = 0.0; aCoord[1] = 0.0; break;
266 case 1: aCoord[0] = 1.0; aCoord[1] = 0.0; break;
267 case 2: aCoord[0] = 0.0; aCoord[1] = 1.0; break;
271 //---------------------------------------------------------------
275 TInt aNbRef = GetNbRef();
276 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
277 TCoordSlice aCoord = GetCoord(aRefId);
279 case 0: aCoord[0] = 0.0; aCoord[1] = 0.0; break;
280 case 1: aCoord[0] = 1.0; aCoord[1] = 0.0; break;
281 case 2: aCoord[0] = 0.0; aCoord[1] = 1.0; break;
283 case 3: aCoord[0] = 0.5; aCoord[1] = 0.0; break;
284 case 4: aCoord[0] = 0.5; aCoord[1] = 0.5; break;
285 case 5: aCoord[0] = 0.0; aCoord[1] = 0.5; break;
289 //---------------------------------------------------------------
293 TInt aNbRef = GetNbRef();
294 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
295 TCoordSlice aCoord = GetCoord(aRefId);
297 case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; break;
298 case 1: aCoord[0] = -1.0; aCoord[1] = -1.0; break;
299 case 2: aCoord[0] = 1.0; aCoord[1] = -1.0; break;
300 case 3: aCoord[0] = 1.0; aCoord[1] = 1.0; break;
304 //---------------------------------------------------------------
308 TInt aNbRef = GetNbRef();
309 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
310 TCoordSlice aCoord = GetCoord(aRefId);
312 case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; break;
313 case 1: aCoord[0] = -1.0; aCoord[1] = -1.0; break;
314 case 2: aCoord[0] = 1.0; aCoord[1] = -1.0; break;
315 case 3: aCoord[0] = 1.0; aCoord[1] = 1.0; break;
317 case 4: aCoord[0] = -1.0; aCoord[1] = 0.0; break;
318 case 5: aCoord[0] = 0.0; aCoord[1] = -1.0; break;
319 case 6: aCoord[0] = 1.0; aCoord[1] = 0.0; break;
320 case 7: aCoord[0] = 0.0; aCoord[1] = 1.0; break;
324 //---------------------------------------------------------------
328 TInt aNbRef = GetNbRef();
329 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
330 TCoordSlice aCoord = GetCoord(aRefId);
332 case 0: aCoord[0] = -1.0; aCoord[1] = -1.0; break;
333 case 1: aCoord[0] = 1.0; aCoord[1] = -1.0; break;
334 case 2: aCoord[0] = 1.0; aCoord[1] = 1.0; break;
335 case 3: aCoord[0] = -1.0; aCoord[1] = 1.0; break;
339 //---------------------------------------------------------------
343 TInt aNbRef = GetNbRef();
344 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
345 TCoordSlice aCoord = GetCoord(aRefId);
347 case 0: aCoord[0] = -1.0; aCoord[1] = -1.0; break;
348 case 1: aCoord[0] = 1.0; aCoord[1] = -1.0; break;
349 case 2: aCoord[0] = 1.0; aCoord[1] = 1.0; break;
350 case 3: aCoord[0] = -1.0; aCoord[1] = 1.0; break;
352 case 4: aCoord[0] = 0.0; aCoord[1] = -1.0; break;
353 case 5: aCoord[0] = 1.0; aCoord[1] = 0.0; break;
354 case 6: aCoord[0] = 0.0; aCoord[1] = 1.0; break;
355 case 7: aCoord[0] = -1.0; aCoord[1] = 0.0; break;
359 //---------------------------------------------------------------
360 TTetra4a::TTetra4a():
363 TInt aNbRef = GetNbRef();
364 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
365 TCoordSlice aCoord = GetCoord(aRefId);
367 case 0: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
368 case 1: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
369 case 2: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
370 case 3: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
374 //---------------------------------------------------------------
375 TTetra10a::TTetra10a():
378 TInt aNbRef = GetNbRef();
379 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
380 TCoordSlice aCoord = GetCoord(aRefId);
382 case 0: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
383 case 1: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
384 case 2: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
385 case 3: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
387 case 4: aCoord[0] = 0.0; aCoord[1] = 0.5; aCoord[2] = 0.5; break;
388 case 5: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
389 case 6: aCoord[0] = 0.0; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
391 case 7: aCoord[0] = 0.5; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
392 case 8: aCoord[0] = 0.5; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
393 case 9: aCoord[0] = 0.5; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
397 //---------------------------------------------------------------
398 TTetra4b::TTetra4b():
401 TInt aNbRef = GetNbRef();
402 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
403 TCoordSlice aCoord = GetCoord(aRefId);
405 case 0: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
406 case 2: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
407 case 1: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
408 case 3: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
412 //---------------------------------------------------------------
413 TTetra10b::TTetra10b():
416 TInt aNbRef = GetNbRef();
417 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
418 TCoordSlice aCoord = GetCoord(aRefId);
420 case 0: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
421 case 2: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
422 case 1: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
423 case 3: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
425 case 6: aCoord[0] = 0.0; aCoord[1] = 0.5; aCoord[2] = 0.5; break;
426 case 5: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
427 case 4: aCoord[0] = 0.0; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
429 case 7: aCoord[0] = 0.5; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
430 case 9: aCoord[0] = 0.5; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
431 case 8: aCoord[0] = 0.5; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
435 //---------------------------------------------------------------
439 TInt aNbRef = GetNbRef();
440 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
441 TCoordSlice aCoord = GetCoord(aRefId);
443 case 0: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break;
444 case 1: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break;
445 case 2: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break;
446 case 3: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break;
447 case 4: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break;
448 case 5: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break;
449 case 6: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break;
450 case 7: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break;
454 //---------------------------------------------------------------
455 THexa20a::THexa20a(TInt theDim, TInt theNbRef):
456 TShapeFun(theDim,theNbRef)
458 TInt aNbRef = myRefCoord.size();
459 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
460 TCoordSlice aCoord = GetCoord(aRefId);
462 case 0: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break;
463 case 1: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break;
464 case 2: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break;
465 case 3: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break;
466 case 4: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break;
467 case 5: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break;
468 case 6: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break;
469 case 7: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break;
471 case 8: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break;
472 case 9: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = -1.0; break;
473 case 10: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break;
474 case 11: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = -1.0; break;
475 case 12: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break;
476 case 13: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break;
477 case 14: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
478 case 15: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
479 case 16: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break;
480 case 17: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
481 case 18: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break;
482 case 19: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
486 //---------------------------------------------------------------
487 THexa27a::THexa27a():
490 TInt aNbRef = myRefCoord.size();
491 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
492 TCoordSlice aCoord = GetCoord(aRefId);
494 case 20: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = -1.0; break;
495 case 21: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break;
496 case 22: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
497 case 23: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
498 case 24: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
499 case 25: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
500 case 26: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
504 //---------------------------------------------------------------
508 TInt aNbRef = GetNbRef();
509 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
510 TCoordSlice aCoord = GetCoord(aRefId);
512 case 0: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break;
513 case 3: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break;
514 case 2: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break;
515 case 1: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break;
516 case 4: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break;
517 case 7: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break;
518 case 6: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break;
519 case 5: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break;
523 //---------------------------------------------------------------
524 THexa20b::THexa20b(TInt theDim, TInt theNbRef):
525 TShapeFun(theDim,theNbRef)
527 TInt aNbRef = myRefCoord.size();
528 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
529 TCoordSlice aCoord = GetCoord(aRefId);
531 case 0: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break;
532 case 3: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break;
533 case 2: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break;
534 case 1: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break;
535 case 4: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break;
536 case 7: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break;
537 case 6: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break;
538 case 5: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break;
540 case 11: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break;
541 case 10: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = -1.0; break;
542 case 9: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break;
543 case 8: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = -1.0; break;
544 case 16: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break;
545 case 19: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break;
546 case 18: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
547 case 17: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
548 case 15: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break;
549 case 14: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
550 case 13: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break;
551 case 12: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
555 //---------------------------------------------------------------
556 TPenta6a::TPenta6a():
559 TInt aNbRef = myRefCoord.size();
560 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
561 TCoordSlice aCoord = GetCoord(aRefId);
563 case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
564 case 1: aCoord[0] = -1.0; aCoord[1] = -0.0; aCoord[2] = 1.0; break;
565 case 2: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
566 case 3: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
567 case 4: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
568 case 5: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
572 //---------------------------------------------------------------
573 TPenta6b::TPenta6b():
576 TInt aNbRef = myRefCoord.size();
577 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
578 TCoordSlice aCoord = GetCoord(aRefId);
580 case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
581 case 2: aCoord[0] = -1.0; aCoord[1] = -0.0; aCoord[2] = 1.0; break;
582 case 1: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
583 case 3: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
584 case 5: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
585 case 4: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
589 //---------------------------------------------------------------
590 TPenta15a::TPenta15a():
593 TInt aNbRef = myRefCoord.size();
594 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
595 TCoordSlice aCoord = GetCoord(aRefId);
597 case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
598 case 1: aCoord[0] = -1.0; aCoord[1] = -0.0; aCoord[2] = 1.0; break;
599 case 2: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
600 case 3: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
601 case 4: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
602 case 5: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
604 case 6: aCoord[0] = -1.0; aCoord[1] = 0.5; aCoord[2] = 0.5; break;
605 case 7: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
606 case 8: aCoord[0] = -1.0; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
607 case 9: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
608 case 10: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
609 case 11: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
610 case 12: aCoord[0] = 1.0; aCoord[1] = 0.5; aCoord[2] = 0.5; break;
611 case 13: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
612 case 14: aCoord[0] = 1.0; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
616 //---------------------------------------------------------------
617 TPenta15b::TPenta15b():
620 TInt aNbRef = myRefCoord.size();
621 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
622 TCoordSlice aCoord = GetCoord(aRefId);
624 case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
625 case 2: aCoord[0] = -1.0; aCoord[1] = -0.0; aCoord[2] = 1.0; break;
626 case 1: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
627 case 3: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
628 case 5: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
629 case 4: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
631 case 8: aCoord[0] = -1.0; aCoord[1] = 0.5; aCoord[2] = 0.5; break;
632 case 7: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
633 case 6: aCoord[0] = -1.0; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
634 case 12: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
635 case 14: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
636 case 13: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
637 case 11: aCoord[0] = 1.0; aCoord[1] = 0.5; aCoord[2] = 0.5; break;
638 case 10: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
639 case 9: aCoord[0] = 1.0; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
643 //---------------------------------------------------------------
647 TInt aNbRef = myRefCoord.size();
648 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
649 TCoordSlice aCoord = GetCoord(aRefId);
651 case 0: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
652 case 1: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
653 case 2: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
654 case 3: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break;
655 case 4: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
659 //---------------------------------------------------------------
663 TInt aNbRef = myRefCoord.size();
664 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
665 TCoordSlice aCoord = GetCoord(aRefId);
667 case 0: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
668 case 3: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
669 case 2: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
670 case 1: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break;
671 case 4: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
675 //---------------------------------------------------------------
676 TPyra13a::TPyra13a():
679 TInt aNbRef = myRefCoord.size();
680 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
681 TCoordSlice aCoord = GetCoord(aRefId);
683 case 0: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
684 case 1: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
685 case 2: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
686 case 3: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break;
687 case 4: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
689 case 5: aCoord[0] = 0.5; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
690 case 6: aCoord[0] = -0.5; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
691 case 7: aCoord[0] = -0.5; aCoord[1] = -0.5; aCoord[2] = 0.0; break;
692 case 8: aCoord[0] = 0.5; aCoord[1] = -0.5; aCoord[2] = 0.0; break;
693 case 9: aCoord[0] = 0.5; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
694 case 10: aCoord[0] = 0.0; aCoord[1] = 0.5; aCoord[2] = 0.5; break;
695 case 11: aCoord[0] = -0.5; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
696 case 12: aCoord[0] = 0.0; aCoord[1] = -0.5; aCoord[2] = 0.5; break;
700 //---------------------------------------------------------------
701 TPyra13b::TPyra13b():
704 TInt aNbRef = myRefCoord.size();
705 for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
706 TCoordSlice aCoord = GetCoord(aRefId);
708 case 0: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
709 case 3: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
710 case 2: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
711 case 1: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break;
712 case 4: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
714 case 8: aCoord[0] = 0.5; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
715 case 7: aCoord[0] = -0.5; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
716 case 6: aCoord[0] = -0.5; aCoord[1] = -0.5; aCoord[2] = 0.0; break;
717 case 5: aCoord[0] = 0.5; aCoord[1] = -0.5; aCoord[2] = 0.0; break;
718 case 9: aCoord[0] = 0.5; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
719 case 12: aCoord[0] = 0.0; aCoord[1] = 0.5; aCoord[2] = 0.5; break;
720 case 11: aCoord[0] = -0.5; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
721 case 10: aCoord[0] = 0.0; aCoord[1] = -0.5; aCoord[2] = 0.5; break;
726 * \brief Fill definition of gauss points family
729 TGaussDef::TGaussDef(const int geom, const int nbGauss, const int variant)
732 myCoords .reserve( nbGauss * dim() );
733 myWeights.reserve( nbGauss );
739 if (geom == MED_SEG2) setRefCoords( TSeg2a() );
740 else setRefCoords( TSeg3a() );
743 add( 0.0, 2.0 ); break;
746 const double a = 0.577350269189626;
748 add( -a, 1.0 ); break;
751 const double a = 0.774596669241;
752 const double P1 = 1./1.8;
753 const double P2 = 1./1.125;
759 const double a = 0.339981043584856, b = 0.861136311594053;
760 const double P1 = 0.652145154862546, P2 = 0.347854845137454 ;
764 add( -b, P2 ); break;
767 EXCEPTION( logic_error,"Invalid nb of gauss points for SEG"<<nbGauss);
773 if ( variant == 1 ) {
774 if (geom == MED_TRIA3) setRefCoords( TTria3b() );
775 else setRefCoords( TTria6b() );
778 add( 1/3., 1/3., 1/2. ); break;
781 // what about COT3 ???
782 add( 1/6., 1/6., 1/6. );
783 add( 2/3., 1/6., 1/6. );
784 add( 1/6., 2/3., 1/6. ); break;
787 add( 1/5., 1/5., 25/(24*4.) );
788 add( 3/5., 1/5., 25/(24*4.) );
789 add( 1/5., 3/5., 25/(24*4.) );
790 add( 1/3., 1/3., -27/(24*4.) ); break;
793 const double P1 = 0.11169079483905, P2 = 0.0549758718227661;
794 const double a = 0.445948490915965, b = 0.091576213509771;
800 add( 1-2*a, a, P1 ); break;
803 const double A = 0.470142064105115;
804 const double B = 0.101286507323456;
805 const double P1 = 0.066197076394253;
806 const double P2 = 0.062969590272413;
807 add( 1/3., 1/3., 9/80. );
813 add( B, 1-2*B, P2 ); break;
816 const double A = 0.063089014491502;
817 const double B = 0.249286745170910;
818 const double C = 0.310352451033785;
819 const double D = 0.053145049844816;
820 const double P1 = 0.025422453185103;
821 const double P2 = 0.058393137863189;
822 const double P3 = 0.041425537809187;
834 add( D, 1-C-D, P3 ); break;
837 EXCEPTION( logic_error,"Invalid nb of gauss points for TRIA, variant 1: "
841 else if ( variant == 2 ) {
842 if (geom == MED_TRIA3) setRefCoords( TTria3a() );
843 else setRefCoords( TTria6a() );
846 add( -1/3., -1/3., 2. ); break;
849 add( -2/3., 1/3., 2/3. );
850 add( -2/3., -2/3., 2/3. );
851 add( 1/3., -2/3., 2/3. ); break;
854 const double P1 = 0.11169079483905, P2 = 0.0549758718227661;
855 const double A = 0.445948490915965, B = 0.091576213509771;
856 add( 2*B-1, 1-4*B, 4*P2 );
857 add( 2*B-1, 2*B-1, 4*P2 );
858 add( 1-4*B, 2*B-1, 4*P2 );
859 add( 1-4*A, 2*A-1, 4*P1 );
860 add( 2*A-1, 1-4*A, 4*P1 );
861 add( 2*A-1, 2*A-1, 4*P1 ); break;
864 EXCEPTION( logic_error,"Invalid nb of gauss points for TRIA, variant 2: "
868 else if ( variant == 3 ) {
869 if (geom == MED_TRIA3) setRefCoords( TTria3b() );
870 else setRefCoords( TTria6b() );
873 add( 1/3., 1/3., -27/96 );
874 add( 0.2 , 0.2 , 25/96 );
875 add( 0.6 , 0.2 , 25/96 );
876 add( 0.2 , 0.6 , 25/96 ); break;
879 EXCEPTION( logic_error,"Invalid nb of gauss points for TRIA, variant 3: "
887 if ( variant == 1 ) {
888 if (geom == MED_QUAD4) setRefCoords( TQuad4b() );
889 else setRefCoords( TQuad8b() );
892 add( 0, 0, 4 ); break;
895 const double a = 1/sqrt(3.);
899 add( -a, a, 1 ); break;
902 const double a = 0.774596669241483;
903 add( -a, -a, 25/81. );
904 add( a, -a, 25/81. );
906 add( -a, a, 25/81. );
907 add( 0., -a, 40/81. );
908 add( a, 0., 40/81. );
909 add( 0., a, 40/81. );
910 add( -a, 0., 40/81. );
911 add( 0., 0., 64/81. ); break;
914 EXCEPTION( logic_error,"Invalid nb of gauss points for QUAD, variant 1: "
918 else if ( variant == 2 ) {
919 if (geom == MED_QUAD4) setRefCoords( TQuad4a() );
920 else setRefCoords( TQuad8a() );
923 const double a = 1/sqrt(3.);
927 add( a, a, 1 ); break;
930 const double a = 0.774596669241483;
931 add( -a, a, 25/81. );
932 add( -a, -a, 25/81. );
933 add( a, -a, 25/81. );
935 add( -a, 0., 40/81. );
936 add( 0., -a, 40/81. );
937 add( a, 0., 40/81. );
938 add( 0., a, 40/81. );
939 add( 0., 0., 64/81. ); break;
942 EXCEPTION( logic_error,"Invalid nb of gauss points for QUAD, variant 1: "
946 else if ( variant == 3 ) {
947 if (geom == MED_QUAD4) setRefCoords( TQuad4b() );
948 else setRefCoords( TQuad8b() );
951 const double a = 3/sqrt(3.);
955 add( a, a, 1 ); break;
958 const double a = sqrt(3/5.), c1 = 5/9., c2 = 8/9.;
959 const double c12 = c1*c2, c22 = c2*c2, c1c2 = c1*c2;
968 add( a, a, c12 ); break;
971 EXCEPTION( logic_error,"Invalid nb of gauss points for QUAD, variant 3: "
979 if (geom == MED_TETRA4) setRefCoords( TTetra4a() );
980 else setRefCoords( TTetra10a() );
983 const double a = (5 - sqrt(5.))/20., b = (5 + 3*sqrt(5.))/20.;
984 add( a, a, a, 1/24. );
985 add( a, a, b, 1/24. );
986 add( a, b, a, 1/24. );
987 add( b, a, a, 1/24. ); break;
990 const double a = 0.25, b = 1/6., c = 0.5;
991 add( a, a, a, -2/15. );
992 add( b, b, b, 3/40. );
993 add( b, b, c, 3/40. );
994 add( b, c, b, 3/40. );
995 add( c, b, b, 3/40. ); break;
998 const double a = 0.25;
999 const double b1 = (7 + sqrt(15.))/34., c1 = (13 + 3*sqrt(15.))/34., d = (5 - sqrt(15.))/20.;
1000 const double b2 = (7 - sqrt(15.))/34., c2 = (13 - 3*sqrt(15.))/34., e = (5 + sqrt(15.))/20.;
1001 const double P1 = (2665 - 14*sqrt(15.))/226800.;
1002 const double P2 = (2665 + 14*sqrt(15.))/226800.;
1003 add( a, a, a, 8/405.);//_____
1004 add( b1, b1, b1, P1 );
1005 add( b1, b1, c1, P1 );
1006 add( b1, c1, b1, P1 );
1007 add( c1, b1, b1, P1 );//_____
1008 add( b2, b2, b2, P2 );
1009 add( b2, b2, c2, P2 );
1010 add( b2, c2, b2, P2 );
1011 add( c2, b2, b2, P2 );//_____
1012 add( d, d, e, 5/567.);
1013 add( d, e, d, 5/567.);
1014 add( e, d, d, 5/567.);
1015 add( d, e, e, 5/567.);
1016 add( e, d, e, 5/567.);
1017 add( e, e, d, 5/567.);
1021 EXCEPTION( logic_error,"Invalid nb of gauss points for TETRA: "<<nbGauss);
1027 if (geom == MED_PYRA5) setRefCoords( TPyra5a() );
1028 else setRefCoords( TPyra13a() );
1029 switch ( nbGauss ) {
1031 const double h1 = 0.1531754163448146;
1032 const double h2 = 0.6372983346207416;
1033 add( .5, 0., h1, 2/15. );
1034 add( 0., .5, h1, 2/15. );
1035 add( -.5, 0., h1, 2/15. );
1036 add( 0., -.5, h1, 2/15. );
1037 add( 0., 0., h2, 2/15. ); break;
1040 const double p1 = 0.1024890634400000 ;
1041 const double p2 = 0.1100000000000000 ;
1042 const double p3 = 0.1467104129066667 ;
1043 const double a = 0.5702963741068025 ;
1044 const double h1 = 0.1666666666666666 ;
1045 const double h2 = 0.08063183038464675;
1046 const double h3 = 0.6098484849057127 ;
1047 add( a, 0., h1, p1 );
1048 add( 0., a, h1, p1 );
1049 add( -a, 0., h1, p1 );
1050 add( 0., -a, h1, p1 );
1051 add( 0., 0., h2, p2 );
1052 add( 0., 0., h3, p3 ); break;
1055 const double a1 = 0.788073483;
1056 const double b6 = 0.499369002;
1057 const double b1 = 0.848418011;
1058 const double c8 = 0.478508449;
1059 const double c1 = 0.652816472;
1060 const double d12 = 0.032303742;
1061 const double d1 = 1.106412899;
1062 double z = 1/2., fz = b1/2*(1 - z);
1063 add( 0., 0., z, a1 ); // 1
1064 add( fz, fz, z, b6 ); // 2
1065 add( -fz, fz, z, b6 ); // 3
1066 add( -fz, -fz, z, b6 ); // 4
1067 add( fz, -fz, z, b6 ); // 5
1069 add( 0., 0., z, b6 ); // 6
1071 add( 0., 0., z, b6 ); // 7
1072 z = (1 - c1)/2.; fz = c1*(1 - z);
1073 add( fz, 0., z, c8 ); // 8
1074 add( 0., fz, z, c8 ); // 9
1075 add( -fz, 0., z, c8 ); // 10
1076 add( 0., -fz, z, c8 ); // 11
1077 z = (1 + c1)/2.; fz = c1*(1 - z);
1078 add( fz, 0., z, c8 ); // 12
1079 add( 0., fz, z, c8 ); // 13
1080 add( -fz, 0., z, c8 ); // 14
1081 add( 0., -fz, z, c8 ); // 15
1082 z = (1 - d1)/2., fz = d1/2*(1 - z);
1083 add( fz, fz, z, d12); // 16
1084 add( -fz, fz, z, d12); // 17
1085 add( -fz, -fz, z, d12); // 18
1086 add( fz, -fz, z, d12); // 19
1087 z = 1/2.; fz = d1*(1 - z);
1088 add( fz, 0., z, d12); // 20
1089 add( 0., fz, z, d12); // 21
1090 add( -fz, 0., z, d12); // 22
1091 add( 0., -fz, z, d12); // 23
1092 z = (1 + d1)/2., fz = d1/2*(1 - z);
1093 add( fz, fz, z, d12); // 24
1094 add( -fz, fz, z, d12); // 25
1095 add( -fz, -fz, z, d12); // 26
1096 add( fz, -fz, z, d12); // 27
1100 EXCEPTION( logic_error,"Invalid nb of gauss points for PYRA: "<<nbGauss);
1105 if (geom == MED_PENTA6) setRefCoords( TPenta6a() );
1106 else setRefCoords( TPenta15a() );
1107 switch ( nbGauss ) {
1109 const double a = sqrt(3.)/3.;
1110 add( -a, .5, .5, 1/6. );
1111 add( -a, 0., .5, 1/6. );
1112 add( -a, .5, 0., 1/6. );
1113 add( a, .5, .5, 1/6. );
1114 add( a, 0., .5, 1/6. );
1115 add( a, .5, 0., 1/6. ); break;
1118 const double a = 0.577350269189626;
1119 add( -a, 1/3., 1/3., -27/96. );
1120 add( -a, 0.6, 0.2, 25/96. );
1121 add( -a, 0.2, 0.6, 25/96. );
1122 add( -a, 0.2, 0.2, 25/96. );
1123 add( +a, 1/3., 1/3., -27/96. );
1124 add( +a, 0.6, 0.2, 25/96. );
1125 add( +a, 0.2, 0.6, 25/96. );
1126 add( +a, 0.2, 0.2, 25/96. ); break;
1129 const double d = sqrt(3/5.), c1 = 5/9., c2 = 8/9.; // d <=> alfa
1130 const double a = (6 + sqrt(15.))/21.;
1131 const double b = (6 - sqrt(15.))/21.;
1132 const double P1 = (155 + sqrt(15.))/2400.;
1133 const double P2 = (155 - sqrt(15.))/2400.; //___
1134 add( -d, 1/3., 1/3., c1*9/80. );//___
1135 add( -d, a, a, c1*P1 );
1136 add( -d, 1-2*a, a, c1*P1 );
1137 add( -d, a, 1-2*a, c1*P1 );//___
1138 add( -d, b, b, c1*P2 );
1139 add( -d, 1-2*b, b, c1*P2 );
1140 add( -d, b, 1-2*b, c1*P2 );//___
1141 add( 0., 1/3., 1/3., c2*9/80. );//___
1142 add( 0., a, a, c2*P1 );
1143 add( 0., 1-2*a, a, c2*P1 );
1144 add( 0., a, 1-2*a, c2*P1 );//___
1145 add( 0., b, b, c2*P2 );
1146 add( 0., 1-2*b, b, c2*P2 );
1147 add( 0., b, 1-2*b, c2*P2 );//___
1148 add( d, 1/3., 1/3., c1*9/80. );//___
1149 add( d, a, a, c1*P1 );
1150 add( d, 1-2*a, a, c1*P1 );
1151 add( d, a, 1-2*a, c1*P1 );//___
1152 add( d, b, b, c1*P2 );
1153 add( d, 1-2*b, b, c1*P2 );
1154 add( d, b, 1-2*b, c1*P2 );//___
1158 EXCEPTION( logic_error,"Invalid nb of gauss points for PENTA: " <<nbGauss);
1164 if (geom == MED_HEXA8) setRefCoords( THexa8a() );
1165 else setRefCoords( THexa20a() );
1166 switch ( nbGauss ) {
1168 const double a = sqrt(3.)/3.;
1169 add( -a, -a, -a, 1. );
1170 add( -a, -a, a, 1. );
1171 add( -a, a, -a, 1. );
1172 add( -a, a, a, 1. );
1173 add( a, -a, -a, 1. );
1174 add( a, -a, a, 1. );
1175 add( a, a, -a, 1. );
1176 add( a, a, a, 1. ); break;
1179 const double a = sqrt(3/5.), c1 = 5/9., c2 = 8/9.;
1180 const double c12 = c1*c1, c13 = c1*c1*c1;
1181 const double c22 = c2*c2, c23 = c2*c2*c2;
1182 add( -a, -a, -a, c13 ); // 1
1183 add( -a, -a, 0., c12*c2 ); // 2
1184 add( -a, -a, a, c13 ); // 3
1185 add( -a, 0., -a, c12*c2 ); // 4
1186 add( -a, 0., 0., c1*c22 ); // 5
1187 add( -a, 0., a, c12*c2 ); // 6
1188 add( -a, a, -a, c13 ); // 7
1189 add( -a, a, 0., c12*c2 ); // 8
1190 add( -a, a, a, c13 ); // 9
1191 add( 0., -a, -a, c12*c2 ); // 10
1192 add( 0., -a, 0., c1*c22 ); // 11
1193 add( 0., -a, a, c12*c2 ); // 12
1194 add( 0., 0., -a, c1*c22 ); // 13
1195 add( 0., 0., 0., c23 ); // 14
1196 add( 0., 0., a, c1*c22 ); // 15
1197 add( 0., a, -a, c12*c2 ); // 16
1198 add( 0., a, 0., c1*c22 ); // 17
1199 add( 0., a, a, c12*c2 ); // 18
1200 add( a, -a, -a, c13 ); // 19
1201 add( a, -a, 0., c12*c2 ); // 20
1202 add( a, -a, a, c13 ); // 21
1203 add( a, 0., -a, c12*c2 ); // 22
1204 add( a, 0., 0., c1*c22 ); // 23
1205 add( a, 0., a, c12*c2 ); // 24
1206 add( a, a, -a, c13 ); // 25
1207 add( a, a, 0., c12*c2 ); // 26
1208 add( a, a, a, c13 ); // 27
1212 EXCEPTION( logic_error,"Invalid nb of gauss points for PENTA: " <<nbGauss);
1217 EXCEPTION( logic_error,"unexpected EGeometrieElement: "<< geom);
1220 if ( myWeights.capacity() != myWeights.size() )
1221 EXCEPTION( logic_error,"Not all gauss points defined");
1225 //=======================================================================
1227 * Creates a localization filled with default values. The caller gets pointer ownership
1229 //=======================================================================
1233 GAUSS_LOCALIZATION_*
1234 GAUSS_LOCALIZATION_::makeDefaultLocalization(const string & locName,
1235 medGeometryElement typeGeo,
1236 int nGauss) throw (MEDEXCEPTION)
1238 TGaussDef gaussDef( typeGeo, nGauss, 1 );
1240 GAUSS_LOCALIZATION_ * gsloc =
1241 new GAUSS_LOCALIZATION<FullInterlace> ( locName.c_str(),
1244 &gaussDef.myRefCoords[0],
1245 &gaussDef.myCoords[0],
1246 &gaussDef.myWeights[0] );