Arcane  v3.15.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
OneMeshItemAdder.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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/* OneMeshItemAdder.cc (C) 2000-2024 */
9/* */
10/* Ajout des entités une par une. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/mesh/OneMeshItemAdder.h"
15
16#include "arcane/utils/NotSupportedException.h"
17#include "arcane/utils/ValueConvert.h"
18
20#include "arcane/core/MeshToMeshTransposer.h"
21#include "arcane/core/IParallelMng.h"
22#include "arcane/core/ItemPrinter.h"
23
24#include "arcane/mesh/DynamicMesh.h"
25#include "arcane/mesh/DynamicMeshIncrementalBuilder.h"
26#include "arcane/mesh/ItemTools.h"
27#include "arcane/mesh/ConnectivityNewWithDependenciesTypes.h"
28#include "arcane/mesh/GraphDoFs.h"
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
33namespace Arcane::mesh
34{
35
36/*---------------------------------------------------------------------------*/
37/*---------------------------------------------------------------------------*/
38
40{
41 public:
42
44 Int64 cell_uid,
45 Int32 sub_domain_id,
47 bool allow_build_face = false)
48 : m_type_info(type_info)
49 , m_cell_uid(cell_uid)
50 , m_info(info)
51 , m_owner(sub_domain_id)
52 , m_allow_build_face(allow_build_face) {}
53
54 Int64 uniqueId() const { return m_cell_uid; }
55 ItemTypeInfo* typeInfo() const { return m_type_info; }
56 Int32 owner() const { return m_owner; }
57 Integer nbNode() const { return m_info.size(); }
58 Integer nbFace() const { return m_type_info->nbLocalFace(); }
59 Integer nbEdge() const { return m_type_info->nbLocalEdge(); }
60 Int64 nodeUniqueId(Integer i_node) const { return m_info[i_node]; }
61 Int32 nodeOwner(Integer) const { return m_owner; }
62 Int32 faceOwner(Integer) const { return m_owner; }
63 Int32 edgeOwner(Integer) const { return m_owner; }
64 ItemTypeInfo::LocalFace localFace(Integer i_face) const { return m_type_info->localFace(i_face); }
65 bool allowBuildFace() const { return m_allow_build_face; }
66 bool allowBuildEdge() const { return m_allow_build_face; }
67
68 private:
69
70 ItemTypeInfo* m_type_info;
71 Int64 m_cell_uid;
73 Int32 m_owner;
74 bool m_allow_build_face;
75};
76
77/*---------------------------------------------------------------------------*/
78/*---------------------------------------------------------------------------*/
79
80OneMeshItemAdder::
82: TraceAccessor(mesh_builder->mesh()->traceMng())
83, m_mesh(mesh_builder->mesh())
84, m_mesh_builder(mesh_builder)
85, m_cell_family(m_mesh->trueCellFamily())
86, m_node_family(m_mesh->trueNodeFamily())
87, m_face_family(m_mesh->trueFaceFamily())
88, m_edge_family(m_mesh->trueEdgeFamily())
89, m_item_type_mng(m_mesh->itemTypeMng())
90, m_mesh_info(m_mesh->meshPartInfo().partRank())
91{
93 m_work_face_orig_nodes_uid.reserve(100);
94
95 if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_GENERATE_UNIQUE_ID_FROM_NODES", true)){
96 m_use_hash_for_face_unique_id = (v.value()!=0);
97 info() << "Is generate Face uniqueId() from Nodes=" << m_use_hash_for_face_unique_id;
98 }
99}
100
101/*---------------------------------------------------------------------------*/
102/*---------------------------------------------------------------------------*/
103
104ItemInternal* OneMeshItemAdder::
105addOneNode(Int64 node_uid,Int32 owner)
106{
107 bool is_add = false;
108 ItemInternal* node = m_node_family.findOrAllocOne(node_uid,is_add);
109 if (is_add) {
111 node->setOwner(owner,owner);
112 }
113 return node;
114}
115
116/*---------------------------------------------------------------------------*/
117/*---------------------------------------------------------------------------*/
126{
128 m_work_face_orig_nodes_uid.resize(a_node_list.size());
129 for( Integer z=0; z<a_node_list.size(); ++z )
130 m_work_face_orig_nodes_uid[z] = a_node_list[z];
131 mesh_utils::reorderNodesOfFace(m_work_face_orig_nodes_uid, m_work_face_sorted_nodes);
132
133 ItemTypeMng* itm = m_mesh->itemTypeMng();
134 ItemInternal *face = m_face_family.allocOne(a_face_uid,itm->typeFromId(a_type));
136
137 for(Integer i_node=0; i_node<a_node_list.size(); ++i_node ){
140 m_node_family.addFaceToNode(current_node_internal, face);
141 }
143 return face;
144}
145
146/*---------------------------------------------------------------------------*/
147/*---------------------------------------------------------------------------*/
148
151{
152 const Integer face_nb_node = nodes_uid.size();
153
155 m_work_face_orig_nodes_uid.resize(face_nb_node);
156 for( Integer z=0; z<face_nb_node; ++z )
157 m_work_face_orig_nodes_uid[z] = nodes_uid[z];
158 mesh_utils::reorderNodesOfFace(m_work_face_orig_nodes_uid,m_work_face_sorted_nodes);
159
160 bool is_add_face = false;
161 Face face = m_face_family.findOrAllocOne(face_uid,type_id,is_add_face);
162
163 // La face n'existe pas
164 if (is_add_face) {
167 for(Integer i_node=0; i_node<face_nb_node; ++i_node ){
168 Node node = addOneNode(m_work_face_sorted_nodes[i_node], m_mesh_info.rank());
169 m_face_family.replaceNode(face,i_node,node);
170 m_node_family.addFaceToNode(node, face);
171 }
172 }
173
174 return ItemCompatibility::_itemInternal(face);
175}
176
177/*---------------------------------------------------------------------------*/
178/*---------------------------------------------------------------------------*/
179
180ItemInternal* OneMeshItemAdder::
181addOneEdge(Int64 edge_uid, Integer sub_domain_id, Int64ConstArrayView nodes_uid)
182{
183 m_work_edge_sorted_nodes.resize(2);
184 m_work_edge_orig_nodes_uid.resize(2);
185
186 for( Integer z=0; z<2; ++z )
187 m_work_edge_orig_nodes_uid[z] = nodes_uid[z];
188 // reorderNodesOfFace se comporte ici correctement pour des arêtes == face en 2D
189 mesh_utils::reorderNodesOfFace(m_work_edge_orig_nodes_uid,m_work_edge_sorted_nodes);
190
191 bool is_add_edge = false;
192 ItemInternal* edge = m_edge_family.findOrAllocOne(edge_uid,is_add_edge);
193
194 // L'arête n'existe pas
195 if (is_add_edge) {
197 edge->setOwner(sub_domain_id,sub_domain_id);
198 for(Integer i_node=0; i_node<2; ++i_node ){
199 ItemInternal *current_node_internal = addOneNode(m_work_edge_sorted_nodes[i_node], m_mesh_info.rank());
200 m_edge_family.replaceNode(ItemLocalId(edge),i_node, ItemLocalId(current_node_internal));
201 m_node_family.addEdgeToNode(current_node_internal, edge);
202 }
203 }
204 return edge;
205}
206
207/*---------------------------------------------------------------------------*/
208/*---------------------------------------------------------------------------*/
209
210template<>
211Face OneMeshItemAdder::
212_findInternalFace(Integer i_face, const FullCellInfo& cell_info, bool& is_add)
213{
214 const Int64 face_unique_id = cell_info.faceUniqueId(i_face);
215 ItemTypeInfo* cell_type_info = cell_info.typeInfo();
216 const ItemTypeInfo::LocalFace& lf = cell_type_info->localFace(i_face);
217 ItemTypeInfo* face_type_info = m_item_type_mng->typeFromId(lf.typeId());
218 return m_face_family.findOrAllocOne(face_unique_id,face_type_info,is_add);
219}
220
221/*---------------------------------------------------------------------------*/
222/*---------------------------------------------------------------------------*/
223
224template<>
225Face OneMeshItemAdder::
226_findInternalFace(Integer i_face, const CellInfoProxy& cell_info, bool& is_add)
227{
228 const ItemInternalMap& nodes_map = m_mesh->nodesMap();
229 ItemTypeInfo* cell_type_info = cell_info.typeInfo();
230 const ItemTypeInfo::LocalFace& lf = cell_type_info->localFace(i_face);
231 Node nbi = nodes_map.findItem(m_work_face_sorted_nodes[0]);
232 Face face_internal = ItemTools::findFaceInNode2(nbi,lf.typeId(),m_work_face_sorted_nodes);
233 if (face_internal.null()) {
234 // La face n'est pas trouvée. Elle n'existe donc pas dans notre sous-domaine.
235 // Si cela est autorisé, on créée la nouvelle face.
236 if (!cell_info.allowBuildFace() && !m_use_hash_for_face_unique_id){
237 info() << "BadCell uid=" << cell_info.uniqueId();
238 for( Int32 i=0; i<cell_info.nbNode(); ++i )
239 info() << "Cell node I=" << i << " uid=" << cell_info.nodeUniqueId(i);
240 ARCANE_FATAL("On the fly face allocation is not allowed here.\n"
241 " You need to add faces with IMeshModifier::addFaces().\n"
242 " CellUid={0} LocalFace={1} FaceNodes={2}",
243 cell_info.uniqueId(),i_face,m_work_face_sorted_nodes);
244 }
245 ItemTypeInfo* face_type = m_item_type_mng->typeFromId(lf.typeId());
246 Int64 face_unique_id = m_next_face_uid++;
248 face_unique_id = MeshUtils::generateHashUniqueId(m_work_face_sorted_nodes);
249 is_add = true;
250 return m_face_family.allocOne(face_unique_id,face_type);
251 }
252 else {
253 is_add = false;
254 return face_internal;
255 }
256}
257
258/*---------------------------------------------------------------------------*/
259/*---------------------------------------------------------------------------*/
260
261template<>
262Edge OneMeshItemAdder::
263_findInternalEdge(Integer i_edge, const FullCellInfo& cell_info,
264 Int64 first_node, Int64 second_node, bool& is_add)
265{
266 ARCANE_UNUSED(first_node);
267 ARCANE_UNUSED(second_node);
268
269 const Int64 edge_unique_id = cell_info.edgeUniqueId(i_edge);
270 return m_edge_family.findOrAllocOne(edge_unique_id,is_add);
271}
272
273/*---------------------------------------------------------------------------*/
274/*---------------------------------------------------------------------------*/
275
276template<>
277Edge OneMeshItemAdder::
278_findInternalEdge(Integer i_edge, const CellInfoProxy& cell_info, Int64 first_node, Int64 second_node, bool& is_add)
279{
280 ARCANE_UNUSED(i_edge);
281
282 const ItemInternalMap& nodes_map = m_mesh->nodesMap();
283 Node nbi = nodes_map.findItem(first_node);
284 Edge edge_internal = ItemTools::findEdgeInNode2(nbi,first_node,second_node);
285 if (edge_internal.null()){
286 if (!cell_info.allowBuildEdge())
287 ARCANE_FATAL("On the fly edge allocation is not allowed here."
288 " You need to add edges before with IMeshModifier::addEdges()");
289 const Int64 edge_unique_id = m_next_edge_uid++;
290 is_add = true;
291 return m_edge_family.allocOne(edge_unique_id);
292 }
293 else {
294 is_add = false;
295 return edge_internal;
296 }
297}
298
299/*---------------------------------------------------------------------------*/
300/*---------------------------------------------------------------------------*/
328
329/*---------------------------------------------------------------------------*/
330/*---------------------------------------------------------------------------*/
341
342/*---------------------------------------------------------------------------*/
343/*---------------------------------------------------------------------------*/
344
345ItemInternal* OneMeshItemAdder::
346addOneItem(IItemFamily* family,
349 Int64 item_uid,
350 Integer item_owner,
351 Integer sub_domain_id,
352 Integer nb_connected_family,
354{
355 ARCANE_ASSERT(m_mesh->itemFamilyNetwork(),("ItemFamilyNetwork is required to call OneMeshItemAdder::addOneItem"));
356 bool is_alloc = true;
357 Item item = family_modifier->findOrAllocOne(item_uid,type_id,m_mesh_info,is_alloc); // don't forget to add print in the class method
359 // Add connectivities if needed
360 Integer info_index = 0;
362 // get connected family
363 eItemKind family_kind = static_cast<eItemKind>(connectivity_info[info_index++]); // another way ?
366 // get connectivities family -> connected_family and reverse
367 String connectivity_name = mesh::connectivityName(family,connected_family);
368 String reverse_connectivity_name = mesh::connectivityName(connected_family,family);
369 bool is_dependency = false;
372 // Clear connectivities for already allocated items (except dependencies since replace is used)
373 if (!is_alloc) {
374 if(!is_dependency) _clearConnectivity(ItemLocalId(item), family_to_connected_family);
376 }
377 // get connected item lids
382 // pre-alloc are done (=> use replace) when a dependency relation ("owning relation") while not when only a relation (use add)
384 else family_to_connected_family->replaceConnectedItem(ItemLocalId(item),connected_item_index,ItemLocalId(connected_item_lids[connected_item_index])); // does not work with face to edges...
385 }
386 if (connected_family_to_family)
387 connected_family_to_family->addConnectedItem(ItemLocalId(connected_item_lids[connected_item_index]),ItemLocalId(item));
388 }
389 info_index+= nb_connected_item;
390 }
391// debug(Trace::Highest) << "[addItems] ADD_ITEM " << ItemPrinter(item) << " in " << family->name();
392 debug(Trace::Highest) << "[addItems] ADD_ITEM " << ItemPrinter(item) << " in " << family->name();
393 return ItemCompatibility::_itemInternal(item);
394}
395
396/*---------------------------------------------------------------------------*/
397
398ItemInternal* OneMeshItemAdder::
399addOneItem2(IItemFamily* family,
400 IItemFamilyModifier* family_modifier,
401 ItemTypeId type_id,
402 Int64 item_uid,
403 Integer item_owner,
404 Integer sub_domain_id,
405 Integer nb_connected_family,
406 Int64ConstArrayView connectivity_info)
407{
408 ARCANE_ASSERT(m_mesh->itemFamilyNetwork(),("ItemFamilyNetwork is required to call OneMeshItemAdder::addOneItem"));
409 bool is_alloc = true;
410 Item item = family_modifier->findOrAllocOne(item_uid,type_id,m_mesh_info,is_alloc); // don't forget to add print in the class method
411 item.mutableItemBase().setOwner(item_owner,sub_domain_id);
412 // Add connectivities if needed
413 Integer info_index = 0;
414 for (Integer family_index = 0; family_index < nb_connected_family; ++family_index) {
415 // Prepare connection
416 // get connected family
417 eItemKind family_kind = static_cast<eItemKind>(connectivity_info[info_index++]); // another way ?
418 Int32 nb_connected_item = CheckedConvert::toInt32(connectivity_info[info_index++]);
419 if (nb_connected_item == 0) continue;
420 IItemFamily* connected_family = nullptr ;
421 switch(family_kind){
422 case IK_Particle:
423 connected_family = m_mesh->findItemFamily(family_kind, ParticleFamily::defaultFamilyName(), false,false);
424 break ;
425 case IK_DoF:
426 if(family->name()==GraphDoFs::dualNodeFamilyName())
427 connected_family = m_mesh->findItemFamily(family_kind, GraphDoFs::linkFamilyName(), false,false);
428 else
429 connected_family = m_mesh->findItemFamily(family_kind, GraphDoFs::dualNodeFamilyName(), false,false);
430 break ;
431 default:
432 connected_family = m_mesh->itemFamily(family_kind);
433 break ;
434 }
435 // get connectivities family -> connected_family and reverse
436 String connectivity_name = mesh::connectivityName(family,connected_family);
437 bool is_dependency = false;
438 IIncrementalItemConnectivity* family_to_connected_family = m_mesh->itemFamilyNetwork()->getConnectivity(family,connected_family,connectivity_name,is_dependency);
439 if (!family_to_connected_family)
440 ARCANE_FATAL("Cannot find connectivity name={0}",connectivity_name);
441 bool is_deep_connectivity = m_mesh->itemFamilyNetwork()->isDeep(family_to_connected_family) ;
442 bool is_relation = !(is_dependency && is_deep_connectivity);
443 // Build connection
444 // get connected item lids
445 Int32UniqueArray connected_item_lids(nb_connected_item);
446 bool do_fatal = is_relation ? false : true; // for relations, connected items may not be present and will be skipped.
447 connected_family->itemsUniqueIdToLocalId(connected_item_lids,connectivity_info.subView(info_index,nb_connected_item),do_fatal);
448 // if connection is relation, connected item not necessarily present: remove absent (ie null) items
449 Integer nb_connected_item_found = nb_connected_item;
450 if (is_relation)
451 {
452 for (Integer index = 0; index < connected_item_lids.size(); )
453 {
454 if (connected_item_lids[index] == NULL_ITEM_LOCAL_ID) {
455 connected_item_lids.remove(index);
456 --nb_connected_item_found;
457 }
458 else ++index;
459 }
460 }
461 for (Integer connected_item_index = 0; connected_item_index < nb_connected_item_found; ++connected_item_index)
462 {
463 if (family_to_connected_family)
464 {
465 // Only strategy : check and add
466 auto connected_item_lid = ItemLocalId{connected_item_lids[connected_item_index]};
467 if (is_relation)
468 {
469 if (!family_to_connected_family->hasConnectedItem(ItemLocalId(item),connected_item_lid))
470 {
471 family_to_connected_family->addConnectedItem(ItemLocalId(item),connected_item_lid);
472 }
473 }
474 else
475 {
476 family_to_connected_family->replaceConnectedItem(ItemLocalId(item),connected_item_index,connected_item_lid);
477 }
478 }
479 }
480 info_index+= nb_connected_item;
481 }
482 if (is_alloc)
483 debug(Trace::Highest) << "[addItems] ADD_ITEM " << ItemPrinter(item) << " in " << family->name();
484 // debug(Trace::Highest) << "[addItems] DEPENDENCIES for " << family->name() << FullItemPrinter(item) ; // debug info
485 // _printRelations(item); // debug info
486 return ItemCompatibility::_itemInternal(item);
487}
488
489/*---------------------------------------------------------------------------*/
490
491void OneMeshItemAdder::
492_printRelations(ItemInternal* item)
493{
494 debug(Trace::Highest) << "[addItems] RELATIONS for " << ItemPrinter(item) << " in " << item->family()->name();
495 for (const auto& relation : m_mesh->itemFamilyNetwork()->getChildRelations(item->family())) {
496// debug(Trace::Highest) << " Relation " << relation->name();
497// debug(Trace::Highest) << " Relation " << relation->nbConnectedItem(ItemLocalId(item));
498 ConnectivityItemVector connected_items(relation);
499 for (const auto& connected_item : connected_items.connectedItems(ItemLocalId(item))) {
500 debug(Trace::Highest) << ItemPrinter(connected_item);
501 }
502 }
503}
504
505/*---------------------------------------------------------------------------*/
506/*---------------------------------------------------------------------------*/
507
508void OneMeshItemAdder::
509_clearConnectivity(ItemLocalId item, IIncrementalItemConnectivity* connectivity)
510{
511
512 ConnectivityItemVector accessor(connectivity);
513 ENUMERATE_ITEM(connected_item, accessor.connectedItems(item)) {
514 connectivity->removeConnectedItem(item,connected_item);
515 }
516}
517
518/*---------------------------------------------------------------------------*/
519/*---------------------------------------------------------------------------*/
520
521void OneMeshItemAdder::
522_clearReverseConnectivity(ItemLocalId item, IIncrementalItemConnectivity* connectivity, IIncrementalItemConnectivity* reverse_connectivity)
523{
524 ConnectivityItemVector accessor(connectivity);
525 ENUMERATE_ITEM(connected_item, accessor.connectedItems(item)) {
526 reverse_connectivity->removeConnectedItem(connected_item,item);
527 }
528}
529
530/*---------------------------------------------------------------------------*/
531/*---------------------------------------------------------------------------*/
532
533template<> void OneMeshItemAdder::
534_AMR_Patch(Cell new_cell, const FullCellInfo& cell_info)
535{
537 if(m_mesh->isAmrActivated()){
538 // FIXME doit-on traiter les mailles de niveau 0
539 //comme celles de niveau superieur
540 if(cell_info.level() != 0){
541 Integer child_rank = cell_info.whichChildAmI();
542 Int64 hParent_uid = cell_info.hParentCellUniqueId();
544 bool is_add;
545 Cell hParent_cell= m_cell_family.findOrAllocOne(hParent_uid,cell_type,is_add);
547 m_cell_family._addChildCellToCell(hParent_cell,child_rank,new_cell);
548 }
549 }
550}
551
552template<> void OneMeshItemAdder::
553_AMR_Patch(Cell cell, const CellInfoProxy& cell_info)
554{
555 ARCANE_UNUSED(cell);
556 ARCANE_UNUSED(cell_info);
557}
558
559/*---------------------------------------------------------------------------*/
560/*---------------------------------------------------------------------------*/
566template<typename CellInfo>
569{
570 bool is_check = arcaneIsCheck();
571
573 ItemTypeId cell_type_id = cell_type_info->itemTypeId();
574 // Regarde si la maille existe déjà (auquel cas on ne fait rien)
576 {
577 bool is_add; // ce flag est toujours correctement positionné via les findOrAllocOne
578 inew_cell = m_cell_family.findOrAllocOne(cell_info.uniqueId(),cell_type_id,is_add);
579 if (!is_add){
580 if (is_check){
582 // Vérifie que les noeuds correspondent bien à ceux existants
583 for( Integer i=0, is=cell_info.nbNode(); i<is; ++i )
584 if (cell_info.nodeUniqueId(i)!=cell2.node(i).uniqueId())
585 ARCANE_FATAL("trying to add existing cell (uid={0}) with different nodes",
586 cell_info.uniqueId());
587 }
588 return ItemCompatibility::_itemInternal(inew_cell);
589 }
590 }
591
592 const bool is_verbose = false;
593
595
596 const Integer cell_nb_face = cell_info.nbFace();
597 const Integer cell_nb_edge = cell_info.nbEdge();
598
600
601 inew_cell.mutableItemBase().setOwner(cell_info.owner(), m_mesh_info.rank());
602 // Vérifie la cohérence entre le type local et la maille créée.
603 if (is_check){
604 if (cell_info.nbNode()!=inew_cell.nbNode())
605 ARCANE_FATAL("Incoherent number of nodes v={0} expected={1}",inew_cell.nbNode(),cell_info.nbNode());
606 if (cell_nb_face!=inew_cell.nbFace())
607 ARCANE_FATAL("Incoherent number of faces v={0} expected={1}",inew_cell.nbFace(),cell_nb_face);
608 if (!cell_type_info->isValidForCell())
609 ARCANE_FATAL("Type '{0}' is not allowed for 'Cell' (cell_uid={1})",
610 cell_type_info->typeName(),cell_info.uniqueId());
611 Int32 cell_dimension = cell_type_info->dimension();
612 Int32 mesh_dimension = m_mesh->dimension();
614 ARCANE_FATAL("Incoherent dimension for cell uid={0} cell_dim={1} mesh_dim={2} type={3}",
616 }
617
619 ItemInternalMap& nodes_map = m_node_family.itemsMap();
620
622
623 if (m_mesh_builder->hasEdge()) {
624 // Ajoute les nouvelles arêtes ci-nécessaire
625 for( Integer i_edge=0; i_edge<cell_nb_edge; ++i_edge ){
626 const ItemTypeInfo::LocalEdge& le = cell_type_info->localEdge(i_edge);
627
628 Int64 first_node = cell_info.nodeUniqueId( le.beginNode() );
629 Int64 second_node = cell_info.nodeUniqueId( le.endNode() );
631 std::swap(first_node,second_node);
632
633 bool is_add = false;
635 if (is_add){
636 if (is_verbose)
637 info() << "Create edge " << edge_internal.uniqueId() << ' ' << edge_internal.localId();
638
639 edge_internal.mutableItemBase().setOwner(cell_info.edgeOwner(i_edge),m_mesh_info.rank());
640 {
643 m_node_family.addEdgeToNode(current_node, edge_internal);
644 }
645 {
648 m_node_family.addEdgeToNode(current_node, edge_internal);
649 }
651 }
652
655 }
656 }
657
658 // Ajoute les nouvelles faces ci-nécessaire
659 for( Integer i_face=0; i_face<cell_nb_face; ++i_face ){
660 const ItemTypeInfo::LocalFace& lf = cell_type_info->localFace(i_face);
661 const Integer face_nb_node = lf.nbNode();
662 const bool is_reorder = _isReorder(i_face, lf, cell_info);
663 // en effet de bord, _isReorder construit aussi m_work_face_sorted_nodes
664
665 bool is_add = false;
666 Face face = _findInternalFace(i_face, cell_info, is_add);
667 if (is_add){
668 if (is_verbose){
669 info() << "Create face " << face.uniqueId() << ' ' << face.localId();
670 info() << "AddCell (uid=" << new_cell.uniqueId() << ": Create face (index=" << i_face
671 << ") uid=" << face.uniqueId()
672 << " lid=" << face.localId();
673 }
675
676 for( Integer i_node=0; i_node<face_nb_node; ++i_node ){
678 m_face_family.replaceNode(face, i_node, current_node);
679 m_node_family.addFaceToNode(current_node, face);
680 }
681
682 if (m_mesh_builder->hasEdge()) {
683 Integer face_nb_edge = lf.nbEdge();
684 for( Integer i_edge=0; i_edge<face_nb_edge; ++i_edge ){
685 Edge current_edge = new_cell.edge( lf.edge(i_edge) );
686 m_face_family.addEdgeToFace(face,current_edge);
687 m_edge_family.addFaceToEdge(current_edge,face);
688 }
689 }
691 }
692 m_cell_family.replaceFace(new_cell,i_face,face);
693
695 if(m_mesh->isAmrActivated()){
696 if (is_reorder){
697 if(face.nbCell() == 2)
698 m_face_family.replaceFrontCellToFace(face,new_cell);
699 else
700 m_face_family.addFrontCellToFace(face,inew_cell);
701 } else{
702 if(face.nbCell() == 2)
703 m_face_family.replaceBackCellToFace(face,new_cell);
704 else
705 m_face_family.addBackCellToFace(face,inew_cell);
706 }
707 } else {
708 if (is_reorder){
709 m_face_family.addFrontCellToFace(face,inew_cell);
710 } else{
711 m_face_family.addBackCellToFace(face,inew_cell);
712 }
713 }
714 }
715
716 _AMR_Patch(inew_cell, cell_info);
717 return ItemCompatibility::_itemInternal(inew_cell);
718}
719
720/*---------------------------------------------------------------------------*/
721/*---------------------------------------------------------------------------*/
740{
741 //bool is_check = arcaneIsCheck();
742 ItemTypeMng* itm = m_mesh->itemTypeMng();
743 eItemKind kind = item.kind();
744 ItemTypeInfo* type = itm->typeFromId(item.type());
745
746 if (item.type() == IT_Line2 && submesh_kind == IK_Cell)
747 type = itm->typeFromId(IT_CellLine2);
748 if (item.type() == IT_Vertex && submesh_kind == IK_Face)
749 type = itm->typeFromId(IT_FaceVertex);
750 ItemTypeId type_id = type->itemTypeId();
751
752 if (MeshToMeshTransposer::kindTranspose(submesh_kind, m_mesh, m_mesh->parentMesh()) != kind)
753 ARCANE_FATAL("Incompatible kind/sub-kind");
754
755 // Regarde si la maille existe déjà
756 bool is_add; // ce flag est toujours correctement positionné via les findOrAllocOne
758
759 switch (submesh_kind) {
760 case IK_Node:
761 new_item = m_node_family.findOrAllocOne(item.uniqueId(),is_add);
763 break;
764 case IK_Edge:
765 new_item = m_edge_family.findOrAllocOne(item.uniqueId(),is_add);
767 break;
768 case IK_Face:
769 new_item = m_face_family.findOrAllocOne(item.uniqueId(),type,is_add);
771 break;
772 case IK_Cell:
773 if (kind == IK_Face && !(item.toFace().isSubDomainBoundary()))
774 ARCANE_FATAL("Bad boundary face");
775 new_item = m_cell_family.findOrAllocOne(item.uniqueId(),type_id,is_add);
777 break;
778 default:
779 throw NotSupportedException(A_FUNCINFO,String::format("Kind {0} not supported", submesh_kind));
780 }
781
782 if (!is_add){
784 ARCANE_FATAL("Cannot add already existing parent item in submesh");
785 else
786 return ItemCompatibility::_itemInternal(new_item);
787 }
788
789 new_item.mutableItemBase().setParent(0,item.localId());
790 new_item.mutableItemBase().setOwner(item.owner(),m_mesh_info.rank());
791
792 // Localise vis-à-vis de l'item à insérer ces sous-items
793 // Par défaut tout à 0, qui correspond aussi au cas submesh_kind==IK_Node
794 Integer item_nb_node = 0;
795 Integer item_nb_face = 0;
796 Integer item_nb_edge = 0;
797
798 switch (submesh_kind) {
799 case IK_Cell:
800 item_nb_face = type->nbLocalFace();
801 item_nb_edge = type->nbLocalEdge();
802 item_nb_node = type->nbLocalNode();
803 break;
804 case IK_Face:
805 item_nb_edge = type->nbLocalEdge();
806 item_nb_node = type->nbLocalNode();
807 break;
808 case IK_Edge:
809 item_nb_node = type->nbLocalNode();
810 default: // les autres sont déjà filtrés avant avec une exception
811 break;
812 }
813
814 // Traitement du cas de désactivation des arêtes
815 if (!m_mesh_builder->hasEdge())
816 item_nb_edge = 0;
817
818#if OLD
819 // Ne fonctionne plus si on désactive les anciennes connectivités
820 if (is_check){
821 for( Integer z=0; z<item_nb_face; ++z )
822 new_item->_setFace(z,NULL_ITEM_ID);
823 for( Integer z=0; z<item_nb_edge; ++z )
824 new_item->_setEdge(z,NULL_ITEM_ID);
825 for( Integer z=0; z<item_nb_node; ++z )
826 new_item->_setNode(z,NULL_ITEM_ID);
827 }
828#endif
829
832 auto* parent_mesh = ARCANE_CHECK_POINTER(dynamic_cast<DynamicMesh*>(m_mesh->parentMesh()));
834
835 // Traitement des nouveaux noeuds
836
837 // Les sommets sont utilisés dans l'ordre de l'item sauf les cellules de sous-maillages surfacique.
838 const bool direct_node_order =
840 && kind == IK_Face
841 && !(item.toFace().isSubDomainBoundaryOutside()));
842
843 Int64UniqueArray nodes_uid(item_nb_node,NULL_ITEM_UNIQUE_ID);
844 for( Integer i_node=0; i_node<item_nb_node; ++i_node ){
846 if (type->typeId() == IT_FaceVertex)
847 parent_item = item;
848 else{
849 Int32 idx = ((direct_node_order) ? i_node : (item_nb_node-1-i_node));
850 parent_item = item.toItemWithNodes().node(idx);
851 }
852 Int64 new_node_uid = nodes_uid[i_node] = parent_item.uniqueId();
853 ItemInternal* node_internal = m_node_family.findOrAllocOne(new_node_uid,is_add);
854 if (is_add){
855#ifdef ARCANE_DEBUG_DYNAMIC_MESH
856 info() << "Création node " << new_node_uid << ' '
857 << node_internal->uniqueId() << ' ' << node_internal->localId();
858#endif /* ARCANE_DEBUG_DYNAMIC_MESH */
859 node_internal->setParent(0,parent_item.localId());
860 node_internal->setOwner(parent_item.owner(),m_mesh_info.rank());
862 }
863
864 // Connection de l'item aux sommets
867 switch (submesh_kind) {
868 case IK_Cell:
869 m_cell_family.replaceNode(new_item_lid,i_node, node_lid);
870 m_node_family.addCellToNode(node_internal, new_item.toCell());
871 break;
872 case IK_Face:
873 m_face_family.replaceNode(new_item_lid,i_node, node_lid);
874 m_node_family.addFaceToNode(node_internal, new_item.toFace());
875 break;
876 case IK_Edge:
877 m_edge_family.replaceNode(new_item_lid,i_node, node_lid);
878 m_node_family.addEdgeToNode(node_internal, new_item.toEdge());
879 break;
880 default: // les autres sont déjà filtrés avant
881 break;
882 }
883 }
884
885 // Traitement des nouvelles arêtes (le filtrage has_edge est déjà pris en compte dans item_nb_edge)
886 for( Integer i_edge=0; i_edge<item_nb_edge; ++i_edge ) {
888
889 Int64 first_node = nodes_uid[ le.beginNode() ];
890 Int64 second_node = nodes_uid[ le.endNode() ];
892 std::swap(first_node,second_node);
893
894 Edge parent_item = item.itemBase().edgeBase(i_edge);
895 if (parent_item.null())
896 ARCANE_FATAL("Cannot find parent edge");
897
898 Int64 new_edge_uid = parent_item.uniqueId();
899
901 if (is_add) {
902#ifdef ARCANE_DEBUG_DYNAMIC_MESH
903 info() << "Création edge " << new_edge_uid << ' '
904 << edge_internal->uniqueId() << ' ' << edge_internal->localId();
905#endif /* ARCANE_DEBUG_DYNAMIC_MESH */
906 edge_internal->setParent(0,parent_item.localId());
907 edge_internal->setOwner(parent_item.owner(),m_mesh_info.rank());
908
909 {
912 m_node_family.addEdgeToNode(current_node, edge_internal);
913 }
914 {
917 m_node_family.addEdgeToNode(current_node, edge_internal);
918 }
920 }
921
922
923 // Connection de l'item aux sommets
924 switch (submesh_kind) {
925 case IK_Cell: {
927 m_edge_family.addCellToEdge(edge_internal, new_item.toCell());
928 } break;
929 case IK_Face: {
931 m_edge_family.addFaceToEdge(edge_internal, new_item.toFace());
932 } break;
933 default: // les autres sont déjà filtrés avant
934 break;
935 }
936 }
937
938 // Traitement des nouvelles faces
939 // item_nb_face matérialise déjà que ce contexte ne se produit qu'avec submesh_kind==IK_Cell
940 for( Integer i_face=0; i_face<item_nb_face; ++i_face ) {
942 Integer face_nb_node = lf.nbNode();
943
945 m_work_face_orig_nodes_uid.resize(face_nb_node);
946 for( Integer z=0; z<face_nb_node; ++z )
947 m_work_face_orig_nodes_uid[z] = nodes_uid[ lf.node(z) ];
948 bool is_reorder = false;
949 if (m_mesh->dimension() == 1) { // is 1d mesh
950 is_reorder = (i_face==1);
951 m_work_face_sorted_nodes[0] = m_work_face_orig_nodes_uid[0];
952 }
953 else
954 is_reorder = mesh_utils::reorderNodesOfFace(m_work_face_orig_nodes_uid,m_work_face_sorted_nodes);
955
956 // find parent item
958 if (kind==IK_Cell) {
959 parent_item = item.toCell().face(i_face);
960 }
961 else if (kind==IK_Face) {
962 if (m_mesh->dimension() == 1) { // is 1d mesh
964 } else {
965 // Algo sans CT_FaceToEdge
969 std::swap(first_node,second_node);
972 }
973 }
974
975 if (parent_item.null())
976 ARCANE_FATAL("Cannot find parent face");
977 Int64 new_face_uid = parent_item.uniqueId();
978 ItemTypeInfo* face_type = itm->typeFromId(lf.typeId());
979
981 if (is_add){
982#ifdef ARCANE_DEBUG_DYNAMIC_MESH
983 info() << "Création face " << new_face_uid << ' '
984 << face_internal->uniqueId() << ' ' << face_internal->localId();
985#endif /* ARCANE_DEBUG_DYNAMIC_MESH */
986 face_internal->setParent(0,parent_item.localId());
987 face_internal->setOwner(parent_item.owner(),m_mesh_info.rank());
988
989 for( Integer i_node=0; i_node<face_nb_node; ++i_node ){
992 m_node_family.addFaceToNode(current_node, face_internal);
993 }
994
995 if (m_mesh_builder->hasEdge()) {
996 Integer face_nb_edge = lf.nbEdge();
997 for( Integer i_edge=0; i_edge<face_nb_edge; ++i_edge ){
998 Int32 edge_idx = lf.edge(i_edge);
999 Edge current_edge = new_item.itemBase().edgeBase(edge_idx);
1002 }
1003 }
1004 ++m_mesh_info.nbFace();
1005 }
1007 if (is_reorder){
1008 m_face_family.addFrontCellToFace(face_internal,new_item.toCell());
1009 } else{
1010 m_face_family.addBackCellToFace(face_internal,new_item.toCell());
1011 }
1012 }
1013
1014 return ItemCompatibility::_itemInternal(new_item);
1015}
1016
1017/*---------------------------------------------------------------------------*/
1018/*---------------------------------------------------------------------------*/
1022template<typename CellInfo>
1025{
1026 Integer cell_nb_node = cell_info.nbNode();
1027
1028 // Ajoute les nouveaux noeuds si nécessaire
1029 for( Integer i_node=0; i_node<cell_nb_node; ++i_node ){
1030 Int64 node_unique_id = cell_info.nodeUniqueId(i_node);
1031 bool is_add = false;
1032 ItemInternal* node_internal = m_node_family.findOrAllocOne(node_unique_id,is_add);
1033 if (is_add){
1034 ++m_mesh_info.nbNode();
1035 node_internal->setOwner(cell_info.nodeOwner(i_node),m_mesh_info.rank());
1036 }
1037 m_node_family.addCellToNode(node_internal,cell);
1038 m_cell_family.replaceNode(cell,i_node,ItemLocalId(node_internal));
1039 }
1040}
1041
1042/*---------------------------------------------------------------------------*/
1043/*---------------------------------------------------------------------------*/
1044
1045template<typename CellInfo>
1046bool OneMeshItemAdder::
1047_isReorder(Integer i_face, const ItemTypeInfo::LocalFace& lf, const CellInfo& cell_info)
1048{
1049 const Integer face_nb_node = lf.nbNode();
1051 m_work_face_orig_nodes_uid.resize(face_nb_node);
1052 for(Integer i_node=0; i_node < face_nb_node; ++i_node)
1053 m_work_face_orig_nodes_uid[i_node] = cell_info.nodeUniqueId(lf.node(i_node));
1054 bool is_reorder = false;
1055 if (m_mesh->dimension() == 1) { // is 1d mesh
1056 is_reorder = (i_face==1);
1057 m_work_face_sorted_nodes[0] = m_work_face_orig_nodes_uid[0];
1058 }
1059 else
1060 is_reorder = mesh_utils::reorderNodesOfFace(m_work_face_orig_nodes_uid,
1062
1063 return is_reorder;
1064}
1065
1066/*---------------------------------------------------------------------------*/
1067/*---------------------------------------------------------------------------*/
1068
1077
1078/*---------------------------------------------------------------------------*/
1079/*---------------------------------------------------------------------------*/
1080
1081} // End namespace Arcane::mesh
1082
1083/*---------------------------------------------------------------------------*/
1084/*---------------------------------------------------------------------------*/
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ENUMERATE_ITEM(name, group)
Enumérateur générique d'un groupe de noeuds.
Fonctions utilitaires sur le maillage.
Maille d'un maillage.
Definition Item.h:1178
Face face(Int32 i) const
i-ème face de la maille
Definition Item.h:1255
Arête d'une maille.
Definition Item.h:798
Face d'une maille.
Definition Item.h:932
Int32 nbCell() const
Nombre de mailles de la face (1 ou 2)
Definition Item.h:1006
bool isSubDomainBoundary() const
Indique si la face est au bord du sous-domaine (i.e nbCell()==1)
Definition Item.h:1025
bool isSubDomainBoundaryOutside() const
Indique si la face est au bord t orientée vers l'extérieur.
Definition Item.h:1034
Interface pour gérer une connectivité incrémentale.
virtual void addConnectedItem(ItemLocalId source_item, ItemLocalId target_local_id)=0
Ajoute l'entité de localId() target_local_id à la connectivité de source_item.
Interface de modification d'une famille.
virtual IIncrementalItemConnectivity * getStoredConnectivity(IItemFamily *source_family, IItemFamily *target_family, const String &name)=0
Retourne, si elle est associée à un stockage, la connectivité entre les familles source_family et tar...
virtual bool isDeep(IIncrementalItemConnectivity *connectivity)=0
Récupère l'information relative au stockage de la connectivité
virtual IIncrementalItemConnectivity * getConnectivity(IItemFamily *source_family, IItemFamily *target_family, const String &name)=0
Retourne la connectivité entre les familles source_family et target_family de nom name,...
Interface d'une famille d'entités.
virtual String name() const =0
Nom de la famille.
Structure interne d'une entité de maillage.
Index d'un Item dans une variable.
Definition ItemLocalId.h:40
Type d'une entité (Item).
Definition ItemTypeId.h:32
static ItemTypeId fromInteger(Int64 v)
Créé une instance à partir d'un entier.
Informations locales sur une arête d'une maille.
Informations locales sur une face d'une maille.
Infos sur un type d'entité du maillage.
LocalEdge localEdge(Integer id) const
Connectivité locale de la i-ème arête de la maille.
LocalFace localFace(Integer id) const
Connectivité locale de la i-ème face de la maille.
Integer nbLocalEdge() const
Nombre d'arêtes de l'entité
Integer nbLocalNode() const
Nombre de noeuds de l'entité
Integer nbLocalFace() const
Nombre de faces de l'entité
Int16 typeId() const
Numéro du type.
ItemTypeId itemTypeId() const
Numéro du type.
Gestionnaire des types d'entités de maillage.
Definition ItemTypeMng.h:66
ItemTypeInfo * typeFromId(Integer id) const
Type correspondant au numéro id.
Node node(Int32 i) const
i-ème noeud de l'entité
Definition Item.h:768
Classe de base d'un élément de maillage.
Definition Item.h:83
impl::MutableItemBase mutableItemBase() const
Partie interne modifiable de l'entité.
Definition Item.h:365
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Definition Item.h:210
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
Definition Item.h:229
ItemWithNodes toItemWithNodes() const
Converti l'entité en le genre ItemWithNodes.
Definition Item.h:1626
Cell toCell() const
Converti l'entité en le genre Cell.
Definition Item.h:1654
eItemKind kind() const
Genre de l'entité
Definition Item.h:241
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Definition Item.h:216
Face toFace() const
Converti l'entité en le genre Edge.
Definition Item.h:1647
impl::ItemBase itemBase() const
Partie interne de l'entité.
Definition Item.h:354
Int16 type() const
Type de l'entité
Definition Item.h:232
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
static eItemKind kindTranspose(eItemKind kindA, IMesh *meshA, IMesh *meshB)
Transpose le genre kindA du maillage meshA en le genre associé dans meshB.
void setOwner(Integer suid, Int32 current_sub_domain)
Positionne le numéro du sous-domaine propriétaire de l'entité.
Noeud d'un maillage.
Definition Item.h:564
void replaceNode(ItemLocalId cell, Integer index, ItemLocalId node)
Remplace le noeud d'index index de la maille cell avec celui de localId() node.
void _addParentCellToCell(Cell cell, Cell parent_cell)
AMR.
void replaceFace(ItemLocalId cell, Integer index, ItemLocalId face)
Remplace la face d'index index de la maille cell avec celle de localId() face.
void replaceEdge(ItemLocalId cell, Integer index, ItemLocalId edge)
Remplace l'arête d'index index de la maille cell avec celle de localId() edge.
Construction d'un maillage de manière incrémentale.
Implémentation d'un maillage.
Definition DynamicMesh.h:97
bool isAmrActivated() const override
AMR.
IItemFamily * itemFamily(eItemKind ik) override
Retourne la famille d'entité de type ik.
Integer dimension() override
Dimension du maillage (1D, 2D ou 3D).
ItemTypeMng * itemTypeMng() const override
Gestionnaire de types d'entités associé
IItemFamily * findItemFamily(eItemKind ik, const String &name, bool create_if_needed, bool register_modifier_if_created) override
Retourne la famille de nom name.
IItemFamilyNetwork * itemFamilyNetwork() override
Interface du réseau de familles (familles connectées)
IMesh * parentMesh() const override
Accès au maillage parent.
Item findOrAllocOne(Int64 uid, ItemTypeId type_id, MeshInfos &mesh_info, bool &is_alloc) override
Récupère ou alloue une arête de numéro unique uid et de type type.Ajout générique d'item.
void addFaceToEdge(Edge edge, Face new_face)
Ajoute une maille voisine à une arête.
void replaceNode(ItemLocalId edge, Integer index, ItemLocalId node)
Remplace le noeud d'index index de l'arête edge avec celui de localId() node_lid.
Item allocOne(Int64 uid, ItemTypeId type_id, MeshInfos &mesh_info) override
Version appelées dans l'ajout générique d'item.
void addCellToEdge(Edge edge, Cell new_cell)
Ajoute une maille voisine à une arête.
void replaceNode(ItemLocalId face, Integer index, ItemLocalId node)
Remplace le noeud d'index index de la face face avec celui de localId() node_lid.
void replaceEdge(ItemLocalId face, Integer index, ItemLocalId edge)
Remplace l'arête d'index index de la face face avec celle de localId() edge_lid.
Item allocOne(Int64 uid, ItemTypeId type_id, MeshInfos &mesh_info) override
Alloue une face de numéro unique uid et de type type. Ajout générique d'item.
Item findOrAllocOne(Int64 uid, ItemTypeId type_id, MeshInfos &mesh_info, bool &is_alloc) override
Récupère ou alloue une face de numéro unique uid et de type type.
void addFrontCellToFace(Face face, Cell new_cell)
Ajoute une maille devant la face.
void addEdgeToFace(Face face, Edge new_edge)
Ajoute une arête devant la face.
void replaceBackCellToFace(Face face, ItemLocalId new_cell)
AMR.
void addBackCellToFace(Face face, Cell new_cell)
Ajoute une maille derrière la face.
Infos pour créer/sérialiser une maille connaissant les uniqueId() et owner() de toutes ces sous-entit...
Tableau associatif de ItemInternal.
impl::ItemBase findItem(Int64 uid) const
Retourne l'entité de numéro unique uid.
static Edge findEdgeInNode2(Node node, Int64 begin_node, Int64 end_node)
Definition ItemTools.cc:73
static Face findFaceInNode2(Node node, Integer face_type_id, Int64ConstArrayView face_nodes_uid)
Definition ItemTools.cc:44
Integer & nbCell()
Nombre de mailles dans le maillage.
Definition MeshInfos.h:69
Int32 rank() const
Numéro de ce sous-domaine.
Definition MeshInfos.h:53
Integer & nbEdge()
Nombre d'arêtes dans le maillage.
Definition MeshInfos.h:60
void reset()
Remet à zéro la numérotation.
Definition MeshInfos.h:73
Integer & nbNode()
Nombre de noeuds dans le maillage.
Definition MeshInfos.h:56
Integer & nbFace()
Nombre de faces dans le maillage.
Definition MeshInfos.h:64
UniqueArray< Int64 > m_work_face_sorted_nodes
Tableaux de travail.
void _addNodesToCell(Cell cell, const CellInfo &cell_info)
Ajoute les noeuds nodes_uid à la maille cell.
ItemInternal * _addOneCell(const CellInfo &cell_info)
Ajoute une maille.
ItemInternal * addOneCell(ItemTypeId type_id, Int64 cell_uid, Int32 sub_domain_id, Int64ConstArrayView nodes_uid, bool allow_build_face)
Ajoute une maille.
MeshInfos m_mesh_info
Info générale sur le maillage (numéro de sous-domaine, nombre d'items...)
bool m_use_hash_for_face_unique_id
Si vrai, génère les uniqueId() des faces à partir de ceux des noeuds.
Int64 m_next_edge_uid
Numéro du uniqueId() suivant utilisé pour générer les arêtes.
void resetAfterDeallocate()
Remise à zéro des structures pour pouvoir faire à nouveau une allocation.
Int64 m_next_face_uid
Numéro du uniqueId() suivant utilisé pour générer les faces.
ItemInternal * addOneParentItem(const Item &item, const eItemKind submesh_kind, const bool fatal_on_existing_item=true)
Ajoute d'un item parent.
ItemInternal * addOneFace(Int64 a_face_uid, Int64ConstArrayView a_node_list, Integer a_type)
Ajoute une face.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Exception lorsqu'une opération n'est pas supportée.
Chaîne de caractères unicode.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
Int32 toInt32(Int64 v)
Converti un Int64 en un Int32.
bool arcaneIsCheck()
Vrai si on est en mode vérification.
Definition Misc.cc:68
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:552
eItemKind
Genre d'entité de maillage.
@ IK_Particle
Entité de maillage de genre particule.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Face
Entité de maillage de genre face.
@ IK_DoF
Entité de maillage de genre degre de liberte.
@ IK_Edge
Entité de maillage de genre arête.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:691
Int32 Integer
Type représentant un entier.