Arcane  v3.14.10.0
Documentation développeur
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::
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::
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
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) {
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.
Informations locales sur une face d'une maille.
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.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-