Arcane  v4.1.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
GeomShapeView.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* GeomShapeView.cc (C) 2000-2026 */
9/* */
10/* Gestion des formes géométriques 2D et 3D. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/TraceAccessor.h"
15
16#include "arcane/geometry/GeomElement.h"
17#include "arcane/geometry/GeomShapeView.h"
18#include "arcane/geometry/CellConnectivity.h"
19//#include "arcane/geometric/CellGeomList.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane::geometric
25{
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28/*
29 * TODO: Verifier que les IT_* correspondents aux énumérations de GeomType.
30 */
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33
34class GeomShapeConnectivity
35{
36 public:
37
38 GeomShapeConnectivity()
39 {
40 for( int i=0; i<NB_BASIC_ITEM_TYPE; ++i )
41 GeomShapeView::global_cell_connectivity[i] = 0;
42
43 GeomShapeView::global_cell_connectivity[IT_NullType] = &m_null_connectivity;
44 GeomShapeView::global_cell_connectivity[IT_Vertex] = &m_vertex_connectivity;
45 GeomShapeView::global_cell_connectivity[IT_Line2] = &m_line2_connectivity;
46 GeomShapeView::global_cell_connectivity[IT_Triangle3] = &m_triangle3_connectivity;
47 GeomShapeView::global_cell_connectivity[IT_Quad4] = &m_quad4_connectivity;
48 GeomShapeView::global_cell_connectivity[IT_Pentagon5] = &m_pentagon5_connectivity;
49 GeomShapeView::global_cell_connectivity[IT_Hexagon6] = &m_hexagon6_connectivity;
50 GeomShapeView::global_cell_connectivity[IT_Tetraedron4] = &m_tetraedron4_connectivity;
51 GeomShapeView::global_cell_connectivity[IT_Pyramid5] = &m_pyramid5_connectivity;
52 GeomShapeView::global_cell_connectivity[IT_Pentaedron6] = &m_pentaedron6_connectivity;
53 GeomShapeView::global_cell_connectivity[IT_Hexaedron8] = &m_hexaedron8_connectivity;
54 GeomShapeView::global_cell_connectivity[IT_Heptaedron10] = &m_heptaedron10_connectivity;
55 GeomShapeView::global_cell_connectivity[IT_Octaedron12] = &m_octaedron12_connectivity;
56 }
57
58 public:
59 NullConnectivity m_null_connectivity;
60 VertexConnectivity m_vertex_connectivity;
61 Line2Connectivity m_line2_connectivity;
62 Triangle3Connectivity m_triangle3_connectivity;
63 Quad4Connectivity m_quad4_connectivity;
64 Pentagon5Connectivity m_pentagon5_connectivity;
65 Hexagon6Connectivity m_hexagon6_connectivity;
66 Tetraedron4Connectivity m_tetraedron4_connectivity;
67 Pyramid5Connectivity m_pyramid5_connectivity;
68 Pentaedron6Connectivity m_pentaedron6_connectivity;
69 Hexaedron8Connectivity m_hexaedron8_connectivity;
70 Heptaedron10Connectivity m_heptaedron10_connectivity;
71 Octaedron12Connectivity m_octaedron12_connectivity;
72};
73
74/*---------------------------------------------------------------------------*/
75/*---------------------------------------------------------------------------*/
76
77void GeomShapeView::
78initializeConnectivity()
79{
80 if (global_connectivity)
81 return;
82
83 global_connectivity = new GeomShapeConnectivity();
84}
85
86/*---------------------------------------------------------------------------*/
87/*---------------------------------------------------------------------------*/
88
89CellConnectivity* GeomShapeView::global_cell_connectivity[NB_BASIC_ITEM_TYPE];
90GeomShapeConnectivity* GeomShapeView::global_connectivity = 0;
91
92/*---------------------------------------------------------------------------*/
93/*---------------------------------------------------------------------------*/
94
95/*---------------------------------------------------------------------------*/
96/*---------------------------------------------------------------------------*/
97
98class GeomShapeStdBuilder
99: public GeomShapeMutableView
100{
101 public:
102 GeomShapeStdBuilder(const GeomShapeMutableView& gsv)
103 : GeomShapeMutableView(gsv)
104 {
105 }
106 public:
107 void computeNodePositionFromHexa(HexaElementConstView hexa);
108 void computeNodePositionFromQuad(QuadElementConstView quad);
109 private:
110 inline void
111 _addFaceD(Integer fid,Integer id1,Integer id2,Integer id3,Integer id4)
112 {
113 setFace(fid,
114 Real3( 0.25 * ( node(id1).x + node(id2).x + node(id3).x + node(id4).x ),
115 0.25 * ( node(id1).y + node(id2).y + node(id3).y + node(id4).y ),
116 0.25 * ( node(id1).z + node(id2).z + node(id3).z + node(id4).z )));
117 }
118
119 inline void
120 _addFace2D(Integer fid,Integer id1,Integer id2)
121 {
122 setFace(fid,
123 Real3( 0.5 * ( node(id1).x + node(id2).x ),
124 0.5 * ( node(id1).y + node(id2).y ),
125 0.0));
126 }
127};
128
129/*---------------------------------------------------------------------------*/
130/*---------------------------------------------------------------------------*/
131
133initFromHexa(HexaElementConstView hexa,GeomShape& geom_cell)
134{
135 _setNullItem(IT_Hexaedron8);
136
137 GeomShapeStdBuilder s(geom_cell.toMutableView());
139
140 geom_cell._setArray(*this);
141}
142
143/*---------------------------------------------------------------------------*/
144/*---------------------------------------------------------------------------*/
145
147initFromQuad(QuadElementConstView quad,GeomShape& geom_cell)
148{
149 _setNullItem(IT_Quad4);
150
151 GeomShapeStdBuilder s(geom_cell.toMutableView());
153
154 geom_cell._setArray(*this);
155}
156
157/*---------------------------------------------------------------------------*/
158/*----- Définition des sous volumes de contrôle -----------------------------*/
159/*---------------------------------------------------------------------------*/
160/*---------------------------------------------------------------------------*/
161
162/*---------------------------------------------------------------------------*/
163/*--------------- En 2D -----------------------------------------------------*/
164
167{
168 const NodeConnectic & nc = nodeConnectic(id);
169
170 sub_zone.init(node(nodeAssociation(id)),face(nc.face(0)), center(),face(nc.face(1)));
171}
172
173/*---------------------------------------------------------------------------*/
174/*---------------------------------------------------------------------------*/
175
178{
179 switch(i){
180 case 0: sub_zone.init(node(0),face( 0),center(),face(3)); break;
181 case 1: sub_zone.init(node(1),face( 1),center(),face(0)); break;
182 case 2: sub_zone.init(node(2),face( 2),center(),face(1)); break;
183 case 3: sub_zone.init(node(3),face( 3),center(),face(2)); break;
184 }
185}
186
187/*---------------------------------------------------------------------------*/
188/*---------------------------------------------------------------------------*/
189
192{
193 switch(i){
194 case 0: sub_zone.init(node(0),face(0),center(),node(0));break;
195 case 1: sub_zone.init(node(1),face(1),center(),face(0));break;
196 case 2: sub_zone.init(node(2),face(2),center(),face(1));break;
197 case 3: sub_zone.init(node(0),node(0),center(),face(2));break;
198 }
199}
200
201/*---------------------------------------------------------------------------*/
202/*---------------------------------------------------------------------------*/
203
205fillSubZonePentagon5(QuadElementView,Integer)
206{
207 throw NotImplementedException(A_FUNCINFO);
208}
209
210/*---------------------------------------------------------------------------*/
211/*---------------------------------------------------------------------------*/
212
214fillSubZoneHexagon6(QuadElementView,Integer)
215{
216 throw NotImplementedException(A_FUNCINFO);
217}
218
219/*---------------------------------------------------------------------------*/
220/*---------------------------------------------------------------------------*/
221
223fillSubZoneElement(HexaElementView sub_zone,Integer i)
224{
225 const NodeConnectic & nc = nodeConnectic(i);
226
227 sub_zone.init(node(nodeAssociation(i)),
228 edge(nc.edge(0)),face(nc.face(0)),edge(nc.edge(1)),
229 edge(nc.edge(2)),face(nc.face(2)),center(),face(nc.face(1)));
230}
231
232/*---------------------------------------------------------------------------*/
233/*---------------------------------------------------------------------------*/
234
236fillSubZoneHexaedron8(HexaElementView sub_zone,Integer i)
237{
238 switch(i){
239 case 0: sub_zone.init(node(0),edge( 0),face(0),edge( 3),edge( 4),face(2),center(),face(1)); break;
240 case 1: sub_zone.init(node(1),edge( 1),face(0),edge( 0),edge( 5),face(4),center(),face(2)); break;
241 case 2: sub_zone.init(node(2),edge( 2),face(0),edge( 1),edge( 6),face(5),center(),face(4)); break;
242 case 3: sub_zone.init(node(3),edge( 3),face(0),edge( 2),edge( 7),face(1),center(),face(5)); break;
243 case 4: sub_zone.init(node(4),edge(11),face(3),edge( 8),edge( 4),face(1),center(),face(2)); break;
244 case 5: sub_zone.init(node(5),edge( 8),face(3),edge( 9),edge( 5),face(2),center(),face(4)); break;
245 case 6: sub_zone.init(node(6),edge( 9),face(3),edge(10),edge( 6),face(4),center(),face(5)); break;
246 case 7: sub_zone.init(node(7),edge(10),face(3),edge(11),edge( 7),face(5),center(),face(1)); break;
247 }
248}
249
250/*---------------------------------------------------------------------------*/
251/*---------------------------------------------------------------------------*/
252
254fillSubZonePyramid5(HexaElementView sub_zone,Integer i)
255{
256 switch(i){
257 case 0: sub_zone.init(node(0),edge(0),face(0),edge(3),edge(4),face(2),center(),face(1)); break;
258 case 1: sub_zone.init(node(1),edge(1),face(0),edge(0),edge(5),face(3),center(),face(2)); break;
259 case 2: sub_zone.init(node(2),edge(2),face(0),edge(1),edge(6),face(4),center(),face(3)); break;
260 case 3: sub_zone.init(node(3),edge(3),face(0),edge(2),edge(7),face(1),center(),face(4)); break;
261 case 4: sub_zone.init(node(4),node(4),node(4),node(4),edge(4),face(1),center(),face(2)); break;
262 case 5: sub_zone.init(node(4),node(4),node(4),node(4),edge(5),face(2),center(),face(3)); break;
263 case 6: sub_zone.init(node(4),node(4),node(4),node(4),edge(6),face(3),center(),face(4)); break;
264 case 7: sub_zone.init(node(4),node(4),node(4),node(4),edge(7),face(4),center(),face(1)); break;
265 }
266}
267
268/*---------------------------------------------------------------------------*/
269/*---------------------------------------------------------------------------*/
270
272fillSubZonePentaedron6(HexaElementView sub_zone,Integer i)
273{
274 switch(i){
275 case 0: sub_zone.init(node(0),edge(0),face(0),edge(2),edge( 3),face(2),center(),face(1)); break;
276 case 1: sub_zone.init(node(1),edge(1),face(0),edge(0),edge( 4),face(4),center(),face(2)); break;
277 case 2: sub_zone.init(node(2),edge(2),face(0),edge(1),edge( 5),face(1),center(),face(4)); break;
278 case 3: sub_zone.init(node(3),edge(8),face(3),edge(6),edge( 3),face(1),center(),face(2)); break;
279 case 4: sub_zone.init(node(4),edge(6),face(3),edge(7),edge( 4),face(2),center(),face(4)); break;
280 case 5: sub_zone.init(node(5),edge(7),face(3),edge(8),edge( 5),face(4),center(),face(1)); break;
281 }
282}
283
284/*---------------------------------------------------------------------------*/
285/*---------------------------------------------------------------------------*/
286
288fillSubZoneTetraedron4(HexaElementView sub_zone,Integer i)
289{
290 switch(i){
291 case 0: sub_zone.init(node(0),edge(0),face(0),edge( 2),edge(3),face(2),center(),face(1)); break;
292 case 1: sub_zone.init(node(1),edge(1),face(0),edge( 0),edge(4),face(3),center(),face(2)); break;
293 case 2: sub_zone.init(node(2),edge(2),face(0),edge( 1),edge(5),face(1),center(),face(3)); break;
294 case 3: sub_zone.init(node(3),edge(3),face(1),edge( 5),edge(4),face(2),center(),face(3)); break;
295 }
296}
297
298/*---------------------------------------------------------------------------*/
299/*---------------------------------------------------------------------------*/
300
302fillSubZoneHeptaedron10(HexaElementView sub_zone,Integer i)
303{
304 switch(i){
305 case 0: sub_zone.init(node(0),edge( 0),face(0),edge( 4),edge(10),face(2),center(),face(6)); break;
306 case 1: sub_zone.init(node(1),edge( 1),face(0),edge( 0),edge(11),face(3),center(),face(2)); break;
307 case 2: sub_zone.init(node(2),edge( 2),face(0),edge( 1),edge(12),face(4),center(),face(3)); break;
308 case 3: sub_zone.init(node(3),edge( 3),face(0),edge( 2),edge(13),face(5),center(),face(4)); break;
309 case 4: sub_zone.init(node(4),edge( 4),face(0),edge( 3),edge(14),face(6),center(),face(5)); break;
310 case 5: sub_zone.init(node(5),edge( 9),face(1),edge( 5),edge(10),face(6),center(),face(2)); break;
311 case 6: sub_zone.init(node(6),edge( 5),face(1),edge( 6),edge(11),face(2),center(),face(3)); break;
312 case 7: sub_zone.init(node(7),edge( 6),face(1),edge( 7),edge(12),face(3),center(),face(4)); break;
313 case 8: sub_zone.init(node(8),edge( 7),face(1),edge( 8),edge(13),face(4),center(),face(5)); break;
314 case 9: sub_zone.init(node(9),edge( 8),face(1),edge( 9),edge(14),face(5),center(),face(6)); break;
315 }
316}
317
318/*---------------------------------------------------------------------------*/
319/*---------------------------------------------------------------------------*/
320
322fillSubZoneOctaedron12(HexaElementView sub_zone,Integer i)
323{
324 switch(i){
325 case 0: sub_zone.init(node( 0),edge( 0),face(0),edge( 5),edge(12),face(2),center(),face(7)); break;
326 case 1: sub_zone.init(node( 1),edge( 1),face(0),edge( 0),edge(13),face(3),center(),face(2)); break;
327 case 2: sub_zone.init(node( 2),edge( 2),face(0),edge( 1),edge(14),face(4),center(),face(3)); break;
328 case 3: sub_zone.init(node( 3),edge( 3),face(0),edge( 2),edge(15),face(5),center(),face(4)); break;
329 case 4: sub_zone.init(node( 4),edge( 4),face(0),edge( 3),edge(16),face(6),center(),face(5)); break;
330 case 5: sub_zone.init(node( 5),edge( 5),face(0),edge( 4),edge(17),face(7),center(),face(6)); break;
331 case 6: sub_zone.init(node( 6),edge(11),face(1),edge( 6),edge(12),face(7),center(),face(2)); break;
332 case 7: sub_zone.init(node( 7),edge( 6),face(1),edge( 7),edge(13),face(2),center(),face(3)); break;
333 case 8: sub_zone.init(node( 8),edge( 7),face(1),edge( 8),edge(14),face(3),center(),face(4)); break;
334 case 9: sub_zone.init(node( 9),edge( 8),face(1),edge( 9),edge(15),face(4),center(),face(5)); break;
335 case 10: sub_zone.init(node(10),edge( 9),face(1),edge(10),edge(16),face(5),center(),face(6)); break;
336 case 11: sub_zone.init(node(11),edge(10),face(1),edge(11),edge(17),face(6),center(),face(7)); break;
337 }
338}
339
340/*---------------------------------------------------------------------------*/
341/*---------------------------------------------------------------------------*/
342
343/*---------------------------------------------------------------------------*/
344/*---------------------------------------------------------------------------*/
345/*!
346 * \brief En 3D, calcule les psoitions à partir de l'hexaèdre \a hexa.
347 */
349computeNodePositionFromHexa(HexaElementConstView hexa)
350{
351 const Real3 nul_vector = Real3(0.,0.,0.);
352
353 // Calcule la position du centre.
354 Real3 c = nul_vector;
355
356 for( Integer i = 0; i<8; ++i ){
357 setNode(i,hexa[i]);
358 c += node(i);
359 }
360
361 setCenter(0.125 * c);
362
363 // Calcul la position des centres des faces.
364 _addFaceD( 0 , 0 , 3 , 2 , 1 );
365 _addFaceD( 1 , 0 , 4 , 7 , 3 );
366 _addFaceD( 2 , 0 , 1 , 5 , 4 );
367 _addFaceD( 3 , 4 , 5 , 6 , 7 );
368 _addFaceD( 4 , 1 , 2 , 6 , 5 );
369 _addFaceD( 5 , 2 , 3 , 7 , 6 );
370}
371
372/*---------------------------------------------------------------------------*/
373/*---------------------------------------------------------------------------*/
374/*!
375 * \brief En 2D, calcule les positions à partir du quad \a quad.
376 */
378computeNodePositionFromQuad(QuadElementConstView quad)
379{
380 const Real3 nul_vector = Real3(0.,0.,0.);
381
382 // Calcule la position du centre.
383 Real3 c = nul_vector;
384
385 for( Integer i = 0; i<4; ++i )
386 {
387 setNode(i,quad[i]);
388 c += node(i);
389 }
390
391 setCenter(0.25 * c);
392
393 // Calcul la position des centres des faces.
394 _addFace2D( 0 , 0 , 1 );
395 _addFace2D( 1 , 1 , 2 );
396 _addFace2D( 2 , 2 , 3 );
397 _addFace2D( 3 , 3 , 0 );
398}
399
400/*---------------------------------------------------------------------------*/
401/*---------------------------------------------------------------------------*/
402
405{
407
408 view._setNullItem(IT_Hexaedron8);
409
412
413 _setArray(view);
414
415 //view.initFromHexa(hexa,*this);
416 return view;
417}
418
419/*---------------------------------------------------------------------------*/
420/*---------------------------------------------------------------------------*/
421
424{
425 Quad4ShapeView view;
426
427 view._setNullItem(IT_Quad4);
428
431
432 _setArray(view);
433
434 return view;
435}
436
437/*---------------------------------------------------------------------------*/
438/*---------------------------------------------------------------------------*/
439
440} // namespace Arcane::geometric
441
442/*---------------------------------------------------------------------------*/
443/*---------------------------------------------------------------------------*/
Classe gérant un vecteur de réel de dimension 3.
Definition Real3.h:132
void computeNodePositionFromQuad(QuadElementConstView quad)
En 2D, calcule les positions à partir du quad quad.
void computeNodePositionFromHexa(HexaElementConstView hexa)
En 3D, calcule les psoitions à partir de l'hexaèdre hexa.
const Real3 node(Integer i) const
Position du ième noeud de la forme.
void fillSubZoneHexaedron8(Hexaedron8ElementView svc, Integer i)
Remplit svc avec les informations du i-ème sous-volume de contrôle.
void fillSubZoneOctaedron12(Hexaedron8ElementView svc, Integer i)
Remplit svc avec les informations du i-ème sous-volume de contrôle.
const Real3 face(Integer i) const
Position du centre de la ième face de la forme.
void fillSubZoneQuad4(Quad4ElementView svc, Integer i)
Remplit svc avec les informations du i-ème sous-volume de contrôle.
ARCANE_DEPRECATED_122 void initFromHexa(HexaElementConstView hexa, GeomShape &geom_cell)
const Real3 edge(Integer i) const
Position du centre de la i-ème arête de la forme.
ARCANE_DEPRECATED_122 void initFromQuad(QuadElementConstView hexa, GeomShape &geom_cell)
void fillSubZoneHeptaedron10(Hexaedron8ElementView svc, Integer i)
Remplit svc avec les informations du i-ème sous-volume de contrôle.
void fillSubZoneHexagon6(Quad4ElementView svc, Integer i)
Remplit svc avec les informations du i-ème sous-volume de contrôle.
void fillSubZonePentaedron6(Hexaedron8ElementView svc, Integer i)
Remplit svc avec les informations du i-ème sous-volume de contrôle.
void fillSubZoneTriangle3(Quad4ElementView svc, Integer i)
Remplit svc avec les informations du i-ème sous-volume de contrôle.
void fillSubZoneTetraedron4(Hexaedron8ElementView svc, Integer i)
Remplit svc avec les informations du i-ème sous-volume de contrôle.
Face face() const
Face associée (null si aucune)
const Real3 center() const
Position du centre de la forme.
const NodeConnectic & nodeConnectic(Integer i) const
Informations de connectivité aux noeuds.
void fillSubZonePyramid5(Hexaedron8ElementView svc, Integer i)
Remplit svc avec les informations du i-ème sous-volume de contrôle.
void fillSubZonePentagon5(Quad4ElementView svc, Integer i)
Remplit svc avec les informations du i-ème sous-volume de contrôle.
void fillSubZoneElement(HexaElementView hexa, Integer i)
Remplit hexa avec les informations du i-ème sous-volume de contrôle.
Integer nodeAssociation(Integer i) const
Numéro local du sommet associé au sous volume de controle.
Hexaedron8ShapeView initFromHexaedron8(Hexaedron8ElementConstView hexa)
Initialise la forme avec un hexaèdre hexa et retourne une vue dessus.
Quad4ShapeView initFromQuad4(Quad4ElementConstView quad)
Initialise la forme avec un quadrangle quad et retourne une vue dessus.
GeomShapeMutableView toMutableView()
Vue modifiable sur cet instance.
Definition GeomShape.h:62
Informations de connectivité pour les éléments géométriques de type GeomType::Heptaedron10.
Informations de connectivité pour les éléments géométriques de type GeomType::Hexaedron8.
Vue constante sur les éléments géométriques de type GeomType::Hexaedron8.
void init(const Real3 &a0, const Real3 &a1, const Real3 &a2, const Real3 &a3, const Real3 &a4, const Real3 &a5, const Real3 &a6, const Real3 &a7)
Initialise la vue avec les coordonnées passées en argument.
Vue spécifique sur les formes géométriques de type GeomType::Hexaedron8.
Informations de connectivité pour les éléments géométriques de type GeomType::Hexagon6.
Informations de connectivité pour les éléments géométriques de type GeomType::Line2.
Informations de connectivité pour les éléments géométriques de type IT_NullType.
Informations de connectivité pour les éléments géométriques de type GeomType::Octaedron12.
Informations de connectivité pour les éléments géométriques de type GeomType::Pentaedron6.
Informations de connectivité pour les éléments géométriques de type GeomType::Pentagon5.
Informations de connectivité pour les éléments géométriques de type GeomType::Pyramid5.
Informations de connectivité pour les éléments géométriques de type GeomType::Quad4.
Vue constante sur les éléments géométriques de type GeomType::Quad4.
Vue modifiable sur les éléments géométriques de type GeomType::Quad4.
void init(const Real3 &a0, const Real3 &a1, const Real3 &a2, const Real3 &a3)
Initialise la vue avec les coordonnées passées en argument.
Vue spécifique sur les formes géométriques de type GeomType::Quad4.
Informations de connectivité pour les éléments géométriques de type GeomType::Tetraedron4.
Informations de connectivité pour les éléments géométriques de type GeomType::Triangle3.
Informations de connectivité pour les éléments géométriques de type GeomType::Vertex.
Int32 Integer
Type représentant un entier.
Structures de connectique locale des mailles.