Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ItemTypeInfoBuilder.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 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/* ItemTypeInfoBuilder.cc (C) 2000-2023 */
9/* */
10/* Constructeur de type d'entité de maillage. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/FatalErrorException.h"
15#include "arcane/utils/TraceInfo.h"
16
17#include "arcane/ArcaneTypes.h"
18#include "arcane/ItemTypeInfoBuilder.h"
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23namespace Arcane
24{
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29void ItemTypeInfoBuilder::
30_checkDimension(Int16 dim)
31{
32 if (dim < 0)
33 return;
34 if (m_dimension < 0)
35 m_dimension = dim;
36 if (m_dimension != dim)
37 ARCANE_FATAL("Incoherent dimension for ItemType: current='{0}' new='{1}'",
38 m_dimension, dim);
39}
40
41/*---------------------------------------------------------------------------*/
42/*---------------------------------------------------------------------------*/
43
44void ItemTypeInfoBuilder::
45setInfos(ItemTypeMng* mng, ItemTypeId type_id, String type_name,
46 Int16 dimension, Integer nb_node, Integer nb_edge, Integer nb_face)
47{
48 m_mng = mng;
49 m_type_id = type_id;
51 m_nb_node = nb_node;
52 m_type_name = type_name;
53 _setNbEdgeAndFace(nb_edge, nb_face);
54}
55
56/*---------------------------------------------------------------------------*/
57/*---------------------------------------------------------------------------*/
58
59void ItemTypeInfoBuilder::
60setInfos(ItemTypeMng* mng, ItemTypeId type_id, String type_name,
61 Integer nb_node, Integer nb_edge, Integer nb_face)
62{
63 setInfos(mng, type_id, type_name, -1, nb_node, nb_edge, nb_face);
64}
65
66/*---------------------------------------------------------------------------*/
67/*---------------------------------------------------------------------------*/
68
69void ItemTypeInfoBuilder::
70setInfos(ItemTypeMng* mng,
71 Integer type_id, String type_name,
72 Integer nb_node, Integer nb_edge, Integer nb_face)
73{
74 setInfos(mng,ItemTypeId::fromInteger(type_id),type_name,nb_node,nb_edge,nb_face);
75}
76
77/*---------------------------------------------------------------------------*/
78/*---------------------------------------------------------------------------*/
79
81addEdge(Integer edge_index,Integer n0,Integer n1,Integer f_left,Integer f_right)
82{
83 Array<Integer>& buf = m_mng->m_ids_buffer;
84 buf[m_first_item_index + edge_index] = buf.size();
85 buf.add(n0);
86 buf.add(n1);
87 buf.add(f_left);
88 buf.add(f_right);
89}
90
91/*---------------------------------------------------------------------------*/
92/*---------------------------------------------------------------------------*/
93
95addFaceVertex(Integer face_index, Integer n0)
96{
97 _checkDimension(1);
98 Array<Integer>& buf = m_mng->m_ids_buffer;
99 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
100 buf.add(IT_FaceVertex);
101 buf.add(1);
102 buf.add(n0);
103 buf.add(0); // no edge
104}
105
106/*---------------------------------------------------------------------------*/
107/*---------------------------------------------------------------------------*/
108
110addFaceLine(Integer face_index, Integer n0, Integer n1)
111{
112 _checkDimension(2);
113 Array<Integer>& buf = m_mng->m_ids_buffer;
114 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
115 buf.add(IT_Line2);
116 buf.add(2);
117 buf.add(n0);
118 buf.add(n1);
119 buf.add(0); // no edge
120}
121
122//! Ajoute une ligne quadratique à la liste des faces (pour les elements 2D)
124addFaceLine3(Integer face_index, Integer n0, Integer n1, Integer n2)
125{
126 _checkDimension(2);
127 Array<Integer>& buf = m_mng->m_ids_buffer;
128 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
129 buf.add(IT_Line3);
130 buf.add(3);
131 buf.add(n0);
132 buf.add(n1);
133 buf.add(n2);
134 buf.add(0); // no edge
135}
136
137/*---------------------------------------------------------------------------*/
138/*---------------------------------------------------------------------------*/
139
141addFaceTriangle(Integer face_index, Integer n0, Integer n1, Integer n2)
142{
143 _checkDimension(3);
144 Array<Integer>& buf = m_mng->m_ids_buffer;
145 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
146 buf.add(IT_Triangle3);
147 buf.add(3);
148 buf.add(n0);
149 buf.add(n1);
150 buf.add(n2);
151 buf.add(3);
152 for (Integer i = 0; i < 3; ++i)
153 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
154}
155
156/*---------------------------------------------------------------------------*/
157/*---------------------------------------------------------------------------*/
158
160addFaceTriangle6(Integer face_index, Integer n0, Integer n1, Integer n2,
161 Integer n3, Integer n4, Integer n5)
162{
163 _checkDimension(3);
164 Array<Integer>& buf = m_mng->m_ids_buffer;
165 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
166 buf.add(IT_Triangle6);
167 buf.add(6);
168 buf.add(n0);
169 buf.add(n1);
170 buf.add(n2);
171 buf.add(n3);
172 buf.add(n4);
173 buf.add(n5);
174 buf.add(3);
175 for (Integer i = 0; i < 3; ++i)
176 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
177}
178
179/*---------------------------------------------------------------------------*/
180/*---------------------------------------------------------------------------*/
181
183addFaceQuad(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3)
184{
185 _checkDimension(3);
186 Array<Integer>& buf = m_mng->m_ids_buffer;
187 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
188 buf.add(IT_Quad4);
189 buf.add(4);
190 buf.add(n0);
191 buf.add(n1);
192 buf.add(n2);
193 buf.add(n3);
194 buf.add(4);
195 for (Integer i = 0; i < 4; ++i)
196 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
197}
198
199/*---------------------------------------------------------------------------*/
200/*---------------------------------------------------------------------------*/
201
203addFaceQuad8(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3,
204 Integer n4, Integer n5, Integer n6, Integer n7)
205{
206 _checkDimension(3);
207 Array<Integer>& buf = m_mng->m_ids_buffer;
208 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
209 buf.add(IT_Quad8);
210 buf.add(8);
211 buf.add(n0);
212 buf.add(n1);
213 buf.add(n2);
214 buf.add(n3);
215 buf.add(n4);
216 buf.add(n5);
217 buf.add(n6);
218 buf.add(n7);
219 buf.add(4);
220 for (Integer i = 0; i < 4; ++i)
221 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
222}
223
224/*---------------------------------------------------------------------------*/
225/*---------------------------------------------------------------------------*/
226
228addFacePentagon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4)
229{
230 _checkDimension(3);
231 Array<Integer>& buf = m_mng->m_ids_buffer;
232 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
233 buf.add(IT_Pentagon5);
234 buf.add(5);
235 buf.add(n0);
236 buf.add(n1);
237 buf.add(n2);
238 buf.add(n3);
239 buf.add(n4);
240 buf.add(5);
241 for (Integer i = 0; i < 5; ++i)
242 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
243}
244
245/*---------------------------------------------------------------------------*/
246/*---------------------------------------------------------------------------*/
247
249addFaceHexagon(Integer face_index, Integer n0, Integer n1, Integer n2,
250 Integer n3, Integer n4, Integer n5)
251{
252 _checkDimension(3);
253 Array<Integer>& buf = m_mng->m_ids_buffer;
254 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
255 buf.add(IT_Hexagon6);
256 buf.add(6);
257 buf.add(n0);
258 buf.add(n1);
259 buf.add(n2);
260 buf.add(n3);
261 buf.add(n4);
262 buf.add(n5);
263 buf.add(6);
264 for (Integer i = 0; i < 6; ++i)
265 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
266}
267
268/*---------------------------------------------------------------------------*/
269/*---------------------------------------------------------------------------*/
270
272addFaceHeptagon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3,
273 Integer n4, Integer n5, Integer n6)
274{
275 _checkDimension(3);
276 Array<Integer>& buf = m_mng->m_ids_buffer;
277 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
278 buf.add(IT_Heptagon7);
279 buf.add(7);
280 buf.add(n0);
281 buf.add(n1);
282 buf.add(n2);
283 buf.add(n3);
284 buf.add(n4);
285 buf.add(n5);
286 buf.add(n6);
287 buf.add(7);
288 for (Integer i = 0; i < 7; ++i)
289 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
290}
291
292/*---------------------------------------------------------------------------*/
293/*---------------------------------------------------------------------------*/
294
296addFaceOctogon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3,
297 Integer n4, Integer n5, Integer n6, Integer n7)
298{
299 _checkDimension(3);
300 Array<Integer>& buf = m_mng->m_ids_buffer;
301 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
302 buf.add(IT_Octogon8);
303 buf.add(8);
304 buf.add(n0);
305 buf.add(n1);
306 buf.add(n2);
307 buf.add(n3);
308 buf.add(n4);
309 buf.add(n5);
310 buf.add(n6);
311 buf.add(n7);
312 buf.add(8);
313 for (Integer i = 0; i < 8; ++i)
314 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
315}
316
317/*---------------------------------------------------------------------------*/
318/*---------------------------------------------------------------------------*/
319
321addFaceGeneric(Integer face_index, Integer type_id, ConstArrayView<Integer> n)
322{
323 // Actuellement cette méthode est uniquement appelée pour les faces 2D donc
324 // l'élément actuel doit être de dimension 3.
325 _checkDimension(3);
326 Array<Integer>& buf = m_mng->m_ids_buffer;
327 buf[m_first_item_index + m_nb_edge + face_index] = buf.size();
328 buf.add(type_id);
329 Integer face_nb_node = n.size();
330 buf.add(face_nb_node);
331 for (Integer i = 0; i < face_nb_node; ++i)
332 buf.add(n[i]);
333 buf.add(face_nb_node); // nb edge; ne traite pas de cas particulier pour n==2
334 for (Integer i = 0; i < face_nb_node; ++i)
335 buf.add(-1); // undef value, filled by ItemTypeInfoBuilder::computeFaceEdgeInfos
336}
337
338/*---------------------------------------------------------------------------*/
339/*---------------------------------------------------------------------------*/
340
343{
344 Integer cell_nb_edge = nbLocalEdge();
345 for(Integer i_face=0;i_face<nbLocalFace();++i_face) {
346 Array<Integer>& buf = m_mng->m_ids_buffer;
347 Integer fi = buf[m_first_item_index + m_nb_edge + i_face];
348 Integer* index = &buf[fi];
349 LocalFace local_face(index);
350 Integer face_nb_node = local_face.nbNode();
351 Integer face_nb_edge = local_face.nbEdge();
352 for(Integer i_edge=0;i_edge<face_nb_edge;++i_edge) {
353 // L'objectif est de trouver l'arête de sommet [i_edge, i_edge+1] dans l'élément
354 Integer beginNode = local_face.node(i_edge);
355 Integer endNode = local_face.node((i_edge+1)%face_nb_edge);
356 Integer face_edge = -1;
357 for(Integer i=0;i<cell_nb_edge;++i) {
358 LocalEdge local_edge = localEdge(i);
359 if ((local_edge.beginNode() == beginNode && local_edge.endNode() == endNode) ||
360 (local_edge.beginNode() == endNode && local_edge.endNode() == beginNode)) {
361 if (face_edge != -1)
362 ARCANE_FATAL("Conflicting item definition : duplicated edge [{0}:{1}] found as edge {2} and {3} of item {4}({5})",
363 beginNode,endNode,face_edge,i,typeName(),typeId());
364 face_edge = i;
365 }
366 }
367 if (face_edge == -1)
368 ARCANE_FATAL("Undefined edge [{0}:{1}] found as edge of item {2}({3})",
369 beginNode,endNode,typeName(),typeId());
370 index[3+face_nb_node+i_edge] = face_edge;
371 ARCANE_ASSERT((face_edge == local_face.edge(i_edge)),("Inconsitent face-edge allocation"));
372 }
373 }
374}
375
376/*---------------------------------------------------------------------------*/
377/*---------------------------------------------------------------------------*/
378
379void ItemTypeInfoBuilder::
380_setNbEdgeAndFace(Integer nb_edge,Integer nb_face)
381{
382 m_nb_face = nb_face;
383 m_nb_edge = nb_edge;
384 Integer total = m_nb_face+m_nb_edge;
385 if (total!=0){
386 Array<Integer>& buf = m_mng->m_ids_buffer;
387 m_first_item_index = buf.size();
388 buf.resize(m_first_item_index + total);
389 }
390}
391
392/*---------------------------------------------------------------------------*/
393/*---------------------------------------------------------------------------*/
394
395} // End namespace Arcane
396
397/*---------------------------------------------------------------------------*/
398/*---------------------------------------------------------------------------*/
399
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Type d'une entité (Item).
Definition ItemTypeId.h:32
static ItemTypeId fromInteger(Int64 v)
Créé une instance à partir d'un entier.
void addFaceHexagon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4, Integer n5)
Ajoute un hexagone à la liste des faces.
void addEdge(Integer edge_index, Integer n0, Integer n1, Integer f_left, Integer f_right)
Ajoute une arête à la liste des arêtes.
void addFacePentagon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4)
Ajoute un pentagone à la liste des faces.
void addFaceHeptagon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4, Integer n5, Integer n6)
Ajoute un heptagone à la liste des faces.
void addFaceQuad8(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4, Integer n5, Integer n6, Integer n7)
Ajoute un quadrilatère quadratique à la liste des faces.
void addFaceLine3(Integer face_index, Integer n0, Integer n1, Integer n2)
Ajoute une ligne quadratique à la liste des faces (pour les elements 2D)
void addFaceOctogon(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4, Integer n5, Integer n6, Integer n7)
Ajoute un heptagone à la liste des faces.
void addFaceGeneric(Integer face_index, Integer type_id, ConstArrayView< Integer > n)
Ajoute une face générique à la liste des faces.
void addFaceVertex(Integer face_index, Integer n0)
Ajoute un sommet à la liste des faces (pour les elements 1D)
void addFaceTriangle(Integer face_index, Integer n0, Integer n1, Integer n2)
Ajoute un triangle à la liste des faces.
void computeFaceEdgeInfos()
Calcule les relations face->arêtes.
void addFaceQuad(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3)
Ajoute un quadrilatère à la liste des faces.
void addFaceLine(Integer face_index, Integer n0, Integer n1)
Ajoute une ligne à la liste des faces (pour les elements 2D)
void addFaceTriangle6(Integer face_index, Integer n0, Integer n1, Integer n2, Integer n3, Integer n4, Integer n5)
Ajoute un triangle quadratique à la liste des faces.
Informations locales sur une arête d'une maille.
Integer endNode() const
Indice local à la maille du sommet extrémité de l'arête.
Integer beginNode() const
Indice local à la maille du sommet origine de l'arête.
Informations locales sur une face d'une maille.
Integer node(Integer i) const
Indice locale dans la maille du i-ème noeud de la face.
Integer nbEdge() const
Nombre d'arête de la face.
Integer edge(Integer i) const
Arête de la face.
Integer nbNode() const
Nombre de noeuds de la face.
LocalEdge localEdge(Integer id) const
Connectivité locale de la i-ème arête de la maille.
Int16 m_dimension
Dimension (-1) si pas initialisé.
Integer nbLocalEdge() const
Nombre d'arêtes de l'entité
Int16 dimension() const
Dimension de l'élément (<0 si inconnu)
String typeName() const
Nom du type.
Integer nbLocalFace() const
Nombre de faces de l'entité
Int16 typeId() const
Numéro du type.
Gestionnaire des types d'entités de maillage.
Definition ItemTypeMng.h:66
UniqueArray< Integer > m_ids_buffer
Tampon d'allocation des données de type.
Integer size() const
Nombre d'éléments du vecteur.
Classe de base des vecteurs 1D de données.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-