Arcane  v3.14.10.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
19#include "arcane/core/MeshToMeshTransposer.h"
20#include "arcane/core/IParallelMng.h"
21#include "arcane/core/ItemPrinter.h"
22
23#include "arcane/mesh/DynamicMesh.h"
24#include "arcane/mesh/DynamicMeshIncrementalBuilder.h"
25#include "arcane/mesh/ItemTools.h"
26#include "arcane/mesh/ConnectivityNewWithDependenciesTypes.h"
27#include "arcane/mesh/GraphDoFs.h"
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
32namespace Arcane::mesh
33{
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
37
39{
40 public:
41
43 Int64 cell_uid,
44 Int32 sub_domain_id,
46 bool allow_build_face = false)
47 : m_type_info(type_info)
48 , m_cell_uid(cell_uid)
49 , m_info(info)
50 , m_owner(sub_domain_id)
51 , m_allow_build_face(allow_build_face) {}
52
53 Int64 uniqueId() const { return m_cell_uid; }
54 ItemTypeInfo* typeInfo() const { return m_type_info; }
55 Int32 owner() const { return m_owner; }
56 Integer nbNode() const { return m_info.size(); }
57 Integer nbFace() const { return m_type_info->nbLocalFace(); }
58 Integer nbEdge() const { return m_type_info->nbLocalEdge(); }
59 Int64 nodeUniqueId(Integer i_node) const { return m_info[i_node]; }
60 Int32 nodeOwner(Integer) const { return m_owner; }
61 Int32 faceOwner(Integer) const { return m_owner; }
62 Int32 edgeOwner(Integer) const { return m_owner; }
63 ItemTypeInfo::LocalFace localFace(Integer i_face) const { return m_type_info->localFace(i_face); }
64 bool allowBuildFace() const { return m_allow_build_face; }
65 bool allowBuildEdge() const { return m_allow_build_face; }
66
67 private:
68
69 ItemTypeInfo* m_type_info;
70 Int64 m_cell_uid;
72 Int32 m_owner;
73 bool m_allow_build_face;
74};
75
76/*---------------------------------------------------------------------------*/
77/*---------------------------------------------------------------------------*/
78
79OneMeshItemAdder::
81: TraceAccessor(mesh_builder->mesh()->traceMng())
82, m_mesh(mesh_builder->mesh())
83, m_mesh_builder(mesh_builder)
84, m_cell_family(m_mesh->trueCellFamily())
85, m_node_family(m_mesh->trueNodeFamily())
86, m_face_family(m_mesh->trueFaceFamily())
87, m_edge_family(m_mesh->trueEdgeFamily())
88, m_item_type_mng(m_mesh->itemTypeMng())
89, m_mesh_info(m_mesh->meshPartInfo().partRank())
90, m_next_face_uid(0)
91, m_next_edge_uid(0)
92{
94 m_work_face_orig_nodes_uid.reserve(100);
95}
96
97/*---------------------------------------------------------------------------*/
98/*---------------------------------------------------------------------------*/
99
100ItemInternal* OneMeshItemAdder::
101addOneNode(Int64 node_uid,Int32 owner)
102{
103 bool is_add = false;
104 ItemInternal* node = m_node_family.findOrAllocOne(node_uid,is_add);
105 if (is_add) {
107 node->setOwner(owner,owner);
108 }
109 return node;
110}
111
112/*---------------------------------------------------------------------------*/
113/*---------------------------------------------------------------------------*/
122{
124 m_work_face_orig_nodes_uid.resize(a_node_list.size());
125 for( Integer z=0; z<a_node_list.size(); ++z )
126 m_work_face_orig_nodes_uid[z] = a_node_list[z];
127 mesh_utils::reorderNodesOfFace(m_work_face_orig_nodes_uid, m_work_face_sorted_nodes);
128
129 ItemTypeMng* itm = m_mesh->itemTypeMng();
130 ItemInternal *face = m_face_family.allocOne(a_face_uid,itm->typeFromId(a_type));
132
133 for(Integer i_node=0; i_node<a_node_list.size(); ++i_node ){
136 m_node_family.addFaceToNode(current_node_internal, face);
137 }
139 return face;
140}
141
142/*---------------------------------------------------------------------------*/
143/*---------------------------------------------------------------------------*/
144
147{
148 const Integer face_nb_node = nodes_uid.size();
149
151 m_work_face_orig_nodes_uid.resize(face_nb_node);
152 for( Integer z=0; z<face_nb_node; ++z )
153 m_work_face_orig_nodes_uid[z] = nodes_uid[z];
154 mesh_utils::reorderNodesOfFace(m_work_face_orig_nodes_uid,m_work_face_sorted_nodes);
155
156 bool is_add_face = false;
157 Face face = m_face_family.findOrAllocOne(face_uid,type_id,is_add_face);
158
159 // La face n'existe pas
160 if (is_add_face) {
163 for(Integer i_node=0; i_node<face_nb_node; ++i_node ){
164 Node node = addOneNode(m_work_face_sorted_nodes[i_node], m_mesh_info.rank());
165 m_face_family.replaceNode(face,i_node,node);
166 m_node_family.addFaceToNode(node, face);
167 }
168 }
169
170 return ItemCompatibility::_itemInternal(face);
171}
172
173/*---------------------------------------------------------------------------*/
174/*---------------------------------------------------------------------------*/
175
176ItemInternal* OneMeshItemAdder::
177addOneEdge(Int64 edge_uid, Integer sub_domain_id, Int64ConstArrayView nodes_uid)
178{
179 m_work_edge_sorted_nodes.resize(2);
180 m_work_edge_orig_nodes_uid.resize(2);
181
182 for( Integer z=0; z<2; ++z )
183 m_work_edge_orig_nodes_uid[z] = nodes_uid[z];
184 // reorderNodesOfFace se comporte ici correctement pour des arêtes == face en 2D
185 mesh_utils::reorderNodesOfFace(m_work_edge_orig_nodes_uid,m_work_edge_sorted_nodes);
186
187 bool is_add_edge = false;
188 ItemInternal* edge = m_edge_family.findOrAllocOne(edge_uid,is_add_edge);
189
190 // L'arête n'existe pas
191 if (is_add_edge) {
193 edge->setOwner(sub_domain_id,sub_domain_id);
194 for(Integer i_node=0; i_node<2; ++i_node ){
195 ItemInternal *current_node_internal = addOneNode(m_work_edge_sorted_nodes[i_node], m_mesh_info.rank());
196 m_edge_family.replaceNode(ItemLocalId(edge),i_node, ItemLocalId(current_node_internal));
197 m_node_family.addEdgeToNode(current_node_internal, edge);
198 }
199 }
200 return edge;
201}
202
203/*---------------------------------------------------------------------------*/
204/*---------------------------------------------------------------------------*/
205
206template<>
207Face OneMeshItemAdder::
208_findInternalFace(Integer i_face, const FullCellInfo& cell_info, bool& is_add)
209{
210 const Int64 face_unique_id = cell_info.faceUniqueId(i_face);
211 ItemTypeInfo* cell_type_info = cell_info.typeInfo();
212 const ItemTypeInfo::LocalFace& lf = cell_type_info->localFace(i_face);
213 ItemTypeInfo* face_type_info = m_item_type_mng->typeFromId(lf.typeId());
214 return m_face_family.findOrAllocOne(face_unique_id,face_type_info,is_add);
215}
216
217/*---------------------------------------------------------------------------*/
218/*---------------------------------------------------------------------------*/
219
220template<>
221Face OneMeshItemAdder::
222_findInternalFace(Integer i_face, const CellInfoProxy& cell_info, bool& is_add)
223{
224 const ItemInternalMap& nodes_map = m_mesh->nodesMap();
225 ItemTypeInfo* cell_type_info = cell_info.typeInfo();
226 const ItemTypeInfo::LocalFace& lf = cell_type_info->localFace(i_face);
227 Node nbi = nodes_map.findItem(m_work_face_sorted_nodes[0]);
228 Face face_internal = ItemTools::findFaceInNode2(nbi,lf.typeId(),m_work_face_sorted_nodes);
229 if (face_internal.null()) {
230 if (!cell_info.allowBuildFace()){
231 info() << "BadCell uid=" << cell_info.uniqueId();
232 for( Int32 i=0; i<cell_info.nbNode(); ++i )
233 info() << "Cell node I=" << i << " uid=" << cell_info.nodeUniqueId(i);
234 ARCANE_FATAL("On the fly face allocation is not allowed here.\n"
235 " You need to add faces with IMeshModifier::addFaces().\n"
236 " CellUid={0} LocalFace={1} FaceNodes={2}",
237 cell_info.uniqueId(),i_face,m_work_face_sorted_nodes);
238 }
239 ItemTypeInfo* face_type = m_item_type_mng->typeFromId(lf.typeId());
240 const Int64 face_unique_id = m_next_face_uid++;
241 is_add = true;
242 return m_face_family.allocOne(face_unique_id,face_type);
243 }
244 else {
245 is_add = false;
246 return face_internal;
247 }
248}
249
250/*---------------------------------------------------------------------------*/
251/*---------------------------------------------------------------------------*/
252
253template<>
254Edge OneMeshItemAdder::
255_findInternalEdge(Integer i_edge, const FullCellInfo& cell_info,
256 Int64 first_node, Int64 second_node, bool& is_add)
257{
258 ARCANE_UNUSED(first_node);
259 ARCANE_UNUSED(second_node);
260
261 const Int64 edge_unique_id = cell_info.edgeUniqueId(i_edge);
262 return m_edge_family.findOrAllocOne(edge_unique_id,is_add);
263}
264
265/*---------------------------------------------------------------------------*/
266/*---------------------------------------------------------------------------*/
267
268template<>
269Edge OneMeshItemAdder::
270_findInternalEdge(Integer i_edge, const CellInfoProxy& cell_info, Int64 first_node, Int64 second_node, bool& is_add)
271{
272 ARCANE_UNUSED(i_edge);
273
274 const ItemInternalMap& nodes_map = m_mesh->nodesMap();
275 Node nbi = nodes_map.findItem(first_node);
276 Edge edge_internal = ItemTools::findEdgeInNode2(nbi,first_node,second_node);
277 if (edge_internal.null()){
278 if (!cell_info.allowBuildEdge())
279 ARCANE_FATAL("On the fly edge allocation is not allowed here."
280 " You need to add edges before with IMeshModifier::addEdges()");
281 const Int64 edge_unique_id = m_next_edge_uid++;
282 is_add = true;
283 return m_edge_family.allocOne(edge_unique_id);
284 }
285 else {
286 is_add = false;
287 return edge_internal;
288 }
289}
290
291/*---------------------------------------------------------------------------*/
292/*---------------------------------------------------------------------------*/
320
321/*---------------------------------------------------------------------------*/
322/*---------------------------------------------------------------------------*/
333
334/*---------------------------------------------------------------------------*/
335/*---------------------------------------------------------------------------*/
336
337ItemInternal* OneMeshItemAdder::
338addOneItem(IItemFamily* family,
341 Int64 item_uid,
342 Integer item_owner,
343 Integer sub_domain_id,
344 Integer nb_connected_family,
346{
347 ARCANE_ASSERT(m_mesh->itemFamilyNetwork(),("ItemFamilyNetwork is required to call OneMeshItemAdder::addOneItem"));
348 bool is_alloc = true;
349 Item item = family_modifier->findOrAllocOne(item_uid,type_id,m_mesh_info,is_alloc); // don't forget to add print in the class method
351 // Add connectivities if needed
352 Integer info_index = 0;
354 // get connected family
355 eItemKind family_kind = static_cast<eItemKind>(connectivity_info[info_index++]); // another way ?
358 // get connectivities family -> connected_family and reverse
359 String connectivity_name = mesh::connectivityName(family,connected_family);
360 String reverse_connectivity_name = mesh::connectivityName(connected_family,family);
361 bool is_dependency = false;
364 // Clear connectivities for already allocated items (except dependencies since replace is used)
365 if (!is_alloc) {
366 if(!is_dependency) _clearConnectivity(ItemLocalId(item), family_to_connected_family);
368 }
369 // get connected item lids
374 // pre-alloc are done (=> use replace) when a dependency relation ("owning relation") while not when only a relation (use add)
376 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...
377 }
378 if (connected_family_to_family)
379 connected_family_to_family->addConnectedItem(ItemLocalId(connected_item_lids[connected_item_index]),ItemLocalId(item));
380 }
381 info_index+= nb_connected_item;
382 }
383// debug(Trace::Highest) << "[addItems] ADD_ITEM " << ItemPrinter(item) << " in " << family->name();
384 debug(Trace::Highest) << "[addItems] ADD_ITEM " << ItemPrinter(item) << " in " << family->name();
385 return ItemCompatibility::_itemInternal(item);
386}
387
388/*---------------------------------------------------------------------------*/
389
390ItemInternal* OneMeshItemAdder::
391addOneItem2(IItemFamily* family,
392 IItemFamilyModifier* family_modifier,
393 ItemTypeId type_id,
394 Int64 item_uid,
395 Integer item_owner,
396 Integer sub_domain_id,
397 Integer nb_connected_family,
398 Int64ConstArrayView connectivity_info)
399{
400 ARCANE_ASSERT(m_mesh->itemFamilyNetwork(),("ItemFamilyNetwork is required to call OneMeshItemAdder::addOneItem"));
401 bool is_alloc = true;
402 Item item = family_modifier->findOrAllocOne(item_uid,type_id,m_mesh_info,is_alloc); // don't forget to add print in the class method
403 item.mutableItemBase().setOwner(item_owner,sub_domain_id);
404 // Add connectivities if needed
405 Integer info_index = 0;
406 for (Integer family_index = 0; family_index < nb_connected_family; ++family_index) {
407 // Prepare connection
408 // get connected family
409 eItemKind family_kind = static_cast<eItemKind>(connectivity_info[info_index++]); // another way ?
410 Int32 nb_connected_item = CheckedConvert::toInt32(connectivity_info[info_index++]);
411 if (nb_connected_item == 0) continue;
412 IItemFamily* connected_family = nullptr ;
413 switch(family_kind){
414 case IK_Particle:
415 connected_family = m_mesh->findItemFamily(family_kind, ParticleFamily::defaultFamilyName(), false,false);
416 break ;
417 case IK_DoF:
418 if(family->name()==GraphDoFs::dualNodeFamilyName())
419 connected_family = m_mesh->findItemFamily(family_kind, GraphDoFs::linkFamilyName(), false,false);
420 else
421 connected_family = m_mesh->findItemFamily(family_kind, GraphDoFs::dualNodeFamilyName(), false,false);
422 break ;
423 default:
424 connected_family = m_mesh->itemFamily(family_kind);
425 break ;
426 }
427 // get connectivities family -> connected_family and reverse
428 String connectivity_name = mesh::connectivityName(family,connected_family);
429 bool is_dependency = false;
430 IIncrementalItemConnectivity* family_to_connected_family = m_mesh->itemFamilyNetwork()->getConnectivity(family,connected_family,connectivity_name,is_dependency);
431 if (!family_to_connected_family)
432 ARCANE_FATAL("Cannot find connectivity name={0}",connectivity_name);
433 bool is_deep_connectivity = m_mesh->itemFamilyNetwork()->isDeep(family_to_connected_family) ;
434 bool is_relation = !(is_dependency && is_deep_connectivity);
435 // Build connection
436 // get connected item lids
437 Int32UniqueArray connected_item_lids(nb_connected_item);
438 bool do_fatal = is_relation ? false : true; // for relations, connected items may not be present and will be skipped.
439 connected_family->itemsUniqueIdToLocalId(connected_item_lids,connectivity_info.subView(info_index,nb_connected_item),do_fatal);
440 // if connection is relation, connected item not necessarily present: remove absent (ie null) items
441 Integer nb_connected_item_found = nb_connected_item;
442 if (is_relation)
443 {
444 for (Integer index = 0; index < connected_item_lids.size(); )
445 {
446 if (connected_item_lids[index] == NULL_ITEM_LOCAL_ID) {
447 connected_item_lids.remove(index);
448 --nb_connected_item_found;
449 }
450 else ++index;
451 }
452 }
453 for (Integer connected_item_index = 0; connected_item_index < nb_connected_item_found; ++connected_item_index)
454 {
455 if (family_to_connected_family)
456 {
457 // Only strategy : check and add
458 auto connected_item_lid = ItemLocalId{connected_item_lids[connected_item_index]};
459 if (is_relation)
460 {
461 if (!family_to_connected_family->hasConnectedItem(ItemLocalId(item),connected_item_lid))
462 {
463 family_to_connected_family->addConnectedItem(ItemLocalId(item),connected_item_lid);
464 }
465 }
466 else
467 {
468 family_to_connected_family->replaceConnectedItem(ItemLocalId(item),connected_item_index,connected_item_lid);
469 }
470 }
471 }
472 info_index+= nb_connected_item;
473 }
474 if (is_alloc)
475 debug(Trace::Highest) << "[addItems] ADD_ITEM " << ItemPrinter(item) << " in " << family->name();
476 // debug(Trace::Highest) << "[addItems] DEPENDENCIES for " << family->name() << FullItemPrinter(item) ; // debug info
477 // _printRelations(item); // debug info
478 return ItemCompatibility::_itemInternal(item);
479}
480
481/*---------------------------------------------------------------------------*/
482
483void OneMeshItemAdder::
484_printRelations(ItemInternal* item)
485{
486 debug(Trace::Highest) << "[addItems] RELATIONS for " << ItemPrinter(item) << " in " << item->family()->name();
487 for (const auto& relation : m_mesh->itemFamilyNetwork()->getChildRelations(item->family())) {
488// debug(Trace::Highest) << " Relation " << relation->name();
489// debug(Trace::Highest) << " Relation " << relation->nbConnectedItem(ItemLocalId(item));
490 ConnectivityItemVector connected_items(relation);
491 for (const auto& connected_item : connected_items.connectedItems(ItemLocalId(item))) {
492 debug(Trace::Highest) << ItemPrinter(connected_item);
493 }
494 }
495}
496
497/*---------------------------------------------------------------------------*/
498/*---------------------------------------------------------------------------*/
499
500void OneMeshItemAdder::
501_clearConnectivity(ItemLocalId item, IIncrementalItemConnectivity* connectivity)
502{
503
504 ConnectivityItemVector accessor(connectivity);
505 ENUMERATE_ITEM(connected_item, accessor.connectedItems(item)) {
506 connectivity->removeConnectedItem(item,connected_item);
507 }
508}
509
510/*---------------------------------------------------------------------------*/
511/*---------------------------------------------------------------------------*/
512
513void OneMeshItemAdder::
514_clearReverseConnectivity(ItemLocalId item, IIncrementalItemConnectivity* connectivity, IIncrementalItemConnectivity* reverse_connectivity)
515{
516 ConnectivityItemVector accessor(connectivity);
517 ENUMERATE_ITEM(connected_item, accessor.connectedItems(item)) {
518 reverse_connectivity->removeConnectedItem(connected_item,item);
519 }
520}
521
522/*---------------------------------------------------------------------------*/
523/*---------------------------------------------------------------------------*/
524
525template<> void OneMeshItemAdder::
526_AMR_Patch(Cell new_cell, const FullCellInfo& cell_info)
527{
529 if(m_mesh->isAmrActivated()){
530 // FIXME doit-on traiter les mailles de niveau 0
531 //comme celles de niveau superieur
532 if(cell_info.level() != 0){
533 Integer child_rank = cell_info.whichChildAmI();
534 Int64 hParent_uid = cell_info.hParentCellUniqueId();
536 bool is_add;
537 Cell hParent_cell= m_cell_family.findOrAllocOne(hParent_uid,cell_type,is_add);
539 m_cell_family._addChildCellToCell(hParent_cell,child_rank,new_cell);
540 }
541 }
542}
543
544template<> void OneMeshItemAdder::
545_AMR_Patch(Cell cell, const CellInfoProxy& cell_info)
546{
547 ARCANE_UNUSED(cell);
548 ARCANE_UNUSED(cell_info);
549}
550
551/*---------------------------------------------------------------------------*/
552/*---------------------------------------------------------------------------*/
558template<typename CellInfo>
561{
562 bool is_check = arcaneIsCheck();
563
565 ItemTypeId cell_type_id = cell_type_info->itemTypeId();
566 // Regarde si la maille existe déjà (auquel cas on ne fait rien)
568 {
569 bool is_add; // ce flag est toujours correctement positionné via les findOrAllocOne
570 inew_cell = m_cell_family.findOrAllocOne(cell_info.uniqueId(),cell_type_id,is_add);
571 if (!is_add){
572 if (is_check){
574 // Vérifie que les noeuds correspondent bien à ceux existants
575 for( Integer i=0, is=cell_info.nbNode(); i<is; ++i )
576 if (cell_info.nodeUniqueId(i)!=cell2.node(i).uniqueId())
577 ARCANE_FATAL("trying to add existing cell (uid={0}) with different nodes",
578 cell_info.uniqueId());
579 }
580 return ItemCompatibility::_itemInternal(inew_cell);
581 }
582 }
583
584 const bool is_verbose = false;
585
587
588 const Integer cell_nb_face = cell_info.nbFace();
589 const Integer cell_nb_edge = cell_info.nbEdge();
590
592
593 inew_cell.mutableItemBase().setOwner(cell_info.owner(), m_mesh_info.rank());
594 // Vérifie la cohérence entre le type local et la maille créée.
595 if (is_check){
596 if (cell_info.nbNode()!=inew_cell.nbNode())
597 ARCANE_FATAL("Incoherent number of nodes v={0} expected={1}",inew_cell.nbNode(),cell_info.nbNode());
598 if (cell_nb_face!=inew_cell.nbFace())
599 ARCANE_FATAL("Incoherent number of faces v={0} expected={1}",inew_cell.nbFace(),cell_nb_face);
600 if (!cell_type_info->isValidForCell())
601 ARCANE_FATAL("Type '{0}' is not allowed for 'Cell' (cell_uid={1})",
602 cell_type_info->typeName(),cell_info.uniqueId());
603 Int32 cell_dimension = cell_type_info->dimension();
604 Int32 mesh_dimension = m_mesh->dimension();
606 ARCANE_FATAL("Incoherent dimension for cell uid={0} cell_dim={1} mesh_dim={2} type={3}",
608 }
609
611 ItemInternalMap& nodes_map = m_node_family.itemsMap();
612
614
615 if (m_mesh_builder->hasEdge()) {
616 // Ajoute les nouvelles arêtes ci-nécessaire
617 for( Integer i_edge=0; i_edge<cell_nb_edge; ++i_edge ){
618 const ItemTypeInfo::LocalEdge& le = cell_type_info->localEdge(i_edge);
619
620 Int64 first_node = cell_info.nodeUniqueId( le.beginNode() );
621 Int64 second_node = cell_info.nodeUniqueId( le.endNode() );
623 std::swap(first_node,second_node);
624
625 bool is_add = false;
627 if (is_add){
628 if (is_verbose)
629 info() << "Create edge " << edge_internal.uniqueId() << ' ' << edge_internal.localId();
630
631 edge_internal.mutableItemBase().setOwner(cell_info.edgeOwner(i_edge),m_mesh_info.rank());
632 {
635 m_node_family.addEdgeToNode(current_node, edge_internal);
636 }
637 {
640 m_node_family.addEdgeToNode(current_node, edge_internal);
641 }
643 }
644
647 }
648 }
649
650 // Ajoute les nouvelles faces ci-nécessaire
651 for( Integer i_face=0; i_face<cell_nb_face; ++i_face ){
652 const ItemTypeInfo::LocalFace& lf = cell_type_info->localFace(i_face);
653 const Integer face_nb_node = lf.nbNode();
654 const bool is_reorder = _isReorder(i_face, lf, cell_info);
655 // en effet de bord, _isReorder construit aussi m_work_face_sorted_nodes
656
657 bool is_add = false;
658 Face face = _findInternalFace(i_face, cell_info, is_add);
659 if (is_add){
660 if (is_verbose){
661 info() << "Create face " << face.uniqueId() << ' ' << face.localId();
662 info() << "AddCell (uid=" << new_cell.uniqueId() << ": Create face (index=" << i_face
663 << ") uid=" << face.uniqueId()
664 << " lid=" << face.localId();
665 }
667
668 for( Integer i_node=0; i_node<face_nb_node; ++i_node ){
670 m_face_family.replaceNode(face, i_node, current_node);
671 m_node_family.addFaceToNode(current_node, face);
672 }
673
674 if (m_mesh_builder->hasEdge()) {
675 Integer face_nb_edge = lf.nbEdge();
676 for( Integer i_edge=0; i_edge<face_nb_edge; ++i_edge ){
677 Edge current_edge = new_cell.edge( lf.edge(i_edge) );
678 m_face_family.addEdgeToFace(face,current_edge);
679 m_edge_family.addFaceToEdge(current_edge,face);
680 }
681 }
683 }
684 m_cell_family.replaceFace(new_cell,i_face,face);
685
687 if(m_mesh->isAmrActivated()){
688 if (is_reorder){
689 if(face.nbCell() == 2)
690 m_face_family.replaceFrontCellToFace(face,new_cell);
691 else
692 m_face_family.addFrontCellToFace(face,inew_cell);
693 } else{
694 if(face.nbCell() == 2)
695 m_face_family.replaceBackCellToFace(face,new_cell);
696 else
697 m_face_family.addBackCellToFace(face,inew_cell);
698 }
699 } else {
700 if (is_reorder){
701 m_face_family.addFrontCellToFace(face,inew_cell);
702 } else{
703 m_face_family.addBackCellToFace(face,inew_cell);
704 }
705 }
706 }
707
708 _AMR_Patch(inew_cell, cell_info);
709 return ItemCompatibility::_itemInternal(inew_cell);
710}
711
712/*---------------------------------------------------------------------------*/
713/*---------------------------------------------------------------------------*/
732{
733 //bool is_check = arcaneIsCheck();
734 ItemTypeMng* itm = m_mesh->itemTypeMng();
735 eItemKind kind = item.kind();
736 ItemTypeInfo* type = itm->typeFromId(item.type());
737
738 if (item.type() == IT_Line2 && submesh_kind == IK_Cell)
739 type = itm->typeFromId(IT_CellLine2);
740 if (item.type() == IT_Vertex && submesh_kind == IK_Face)
741 type = itm->typeFromId(IT_FaceVertex);
742 ItemTypeId type_id = type->itemTypeId();
743
744 if (MeshToMeshTransposer::kindTranspose(submesh_kind, m_mesh, m_mesh->parentMesh()) != kind)
745 ARCANE_FATAL("Incompatible kind/sub-kind");
746
747 // Regarde si la maille existe déjà
748 bool is_add; // ce flag est toujours correctement positionné via les findOrAllocOne
750
751 switch (submesh_kind) {
752 case IK_Node:
753 new_item = m_node_family.findOrAllocOne(item.uniqueId(),is_add);
755 break;
756 case IK_Edge:
757 new_item = m_edge_family.findOrAllocOne(item.uniqueId(),is_add);
759 break;
760 case IK_Face:
761 new_item = m_face_family.findOrAllocOne(item.uniqueId(),type,is_add);
763 break;
764 case IK_Cell:
765 if (kind == IK_Face && !(item.toFace().isSubDomainBoundary()))
766 ARCANE_FATAL("Bad boundary face");
767 new_item = m_cell_family.findOrAllocOne(item.uniqueId(),type_id,is_add);
769 break;
770 default:
771 throw NotSupportedException(A_FUNCINFO,String::format("Kind {0} not supported", submesh_kind));
772 }
773
774 if (!is_add){
776 ARCANE_FATAL("Cannot add already existing parent item in submesh");
777 else
778 return ItemCompatibility::_itemInternal(new_item);
779 }
780
781 new_item.mutableItemBase().setParent(0,item.localId());
782 new_item.mutableItemBase().setOwner(item.owner(),m_mesh_info.rank());
783
784 // Localise vis-à-vis de l'item à insérer ces sous-items
785 // Par défaut tout à 0, qui correspond aussi au cas submesh_kind==IK_Node
786 Integer item_nb_node = 0;
787 Integer item_nb_face = 0;
788 Integer item_nb_edge = 0;
789
790 switch (submesh_kind) {
791 case IK_Cell:
792 item_nb_face = type->nbLocalFace();
793 item_nb_edge = type->nbLocalEdge();
794 item_nb_node = type->nbLocalNode();
795 break;
796 case IK_Face:
797 item_nb_edge = type->nbLocalEdge();
798 item_nb_node = type->nbLocalNode();
799 break;
800 case IK_Edge:
801 item_nb_node = type->nbLocalNode();
802 default: // les autres sont déjà filtrés avant avec une exception
803 break;
804 }
805
806 // Traitement du cas de désactivation des arêtes
807 if (!m_mesh_builder->hasEdge())
808 item_nb_edge = 0;
809
810#if OLD
811 // Ne fonctionne plus si on désactive les anciennes connectivités
812 if (is_check){
813 for( Integer z=0; z<item_nb_face; ++z )
814 new_item->_setFace(z,NULL_ITEM_ID);
815 for( Integer z=0; z<item_nb_edge; ++z )
816 new_item->_setEdge(z,NULL_ITEM_ID);
817 for( Integer z=0; z<item_nb_node; ++z )
818 new_item->_setNode(z,NULL_ITEM_ID);
819 }
820#endif
821
824 auto* parent_mesh = ARCANE_CHECK_POINTER(dynamic_cast<DynamicMesh*>(m_mesh->parentMesh()));
826
827 // Traitement des nouveaux noeuds
828
829 // Les sommets sont utilisés dans l'ordre de l'item sauf les cellules de sous-maillages surfacique.
830 const bool direct_node_order =
832 && kind == IK_Face
833 && !(item.toFace().isSubDomainBoundaryOutside()));
834
835 Int64UniqueArray nodes_uid(item_nb_node,NULL_ITEM_UNIQUE_ID);
836 for( Integer i_node=0; i_node<item_nb_node; ++i_node ){
838 if (type->typeId() == IT_FaceVertex)
839 parent_item = item;
840 else{
841 Int32 idx = ((direct_node_order) ? i_node : (item_nb_node-1-i_node));
842 parent_item = item.toItemWithNodes().node(idx);
843 }
844 Int64 new_node_uid = nodes_uid[i_node] = parent_item.uniqueId();
845 ItemInternal* node_internal = m_node_family.findOrAllocOne(new_node_uid,is_add);
846 if (is_add){
847#ifdef ARCANE_DEBUG_DYNAMIC_MESH
848 info() << "Création node " << new_node_uid << ' '
849 << node_internal->uniqueId() << ' ' << node_internal->localId();
850#endif /* ARCANE_DEBUG_DYNAMIC_MESH */
851 node_internal->setParent(0,parent_item.localId());
852 node_internal->setOwner(parent_item.owner(),m_mesh_info.rank());
854 }
855
856 // Connection de l'item aux sommets
859 switch (submesh_kind) {
860 case IK_Cell:
861 m_cell_family.replaceNode(new_item_lid,i_node, node_lid);
862 m_node_family.addCellToNode(node_internal, new_item.toCell());
863 break;
864 case IK_Face:
865 m_face_family.replaceNode(new_item_lid,i_node, node_lid);
866 m_node_family.addFaceToNode(node_internal, new_item.toFace());
867 break;
868 case IK_Edge:
869 m_edge_family.replaceNode(new_item_lid,i_node, node_lid);
870 m_node_family.addEdgeToNode(node_internal, new_item.toEdge());
871 break;
872 default: // les autres sont déjà filtrés avant
873 break;
874 }
875 }
876
877 // Traitement des nouvelles arêtes (le filtrage has_edge est déjà pris en compte dans item_nb_edge)
878 for( Integer i_edge=0; i_edge<item_nb_edge; ++i_edge ) {
880
881 Int64 first_node = nodes_uid[ le.beginNode() ];
882 Int64 second_node = nodes_uid[ le.endNode() ];
884 std::swap(first_node,second_node);
885
886 Edge parent_item = item.itemBase().edgeBase(i_edge);
887 if (parent_item.null())
888 ARCANE_FATAL("Cannot find parent edge");
889
890 Int64 new_edge_uid = parent_item.uniqueId();
891
893 if (is_add) {
894#ifdef ARCANE_DEBUG_DYNAMIC_MESH
895 info() << "Création edge " << new_edge_uid << ' '
896 << edge_internal->uniqueId() << ' ' << edge_internal->localId();
897#endif /* ARCANE_DEBUG_DYNAMIC_MESH */
898 edge_internal->setParent(0,parent_item.localId());
899 edge_internal->setOwner(parent_item.owner(),m_mesh_info.rank());
900
901 {
904 m_node_family.addEdgeToNode(current_node, edge_internal);
905 }
906 {
909 m_node_family.addEdgeToNode(current_node, edge_internal);
910 }
912 }
913
914
915 // Connection de l'item aux sommets
916 switch (submesh_kind) {
917 case IK_Cell: {
919 m_edge_family.addCellToEdge(edge_internal, new_item.toCell());
920 } break;
921 case IK_Face: {
923 m_edge_family.addFaceToEdge(edge_internal, new_item.toFace());
924 } break;
925 default: // les autres sont déjà filtrés avant
926 break;
927 }
928 }
929
930 // Traitement des nouvelles faces
931 // item_nb_face matérialise déjà que ce contexte ne se produit qu'avec submesh_kind==IK_Cell
932 for( Integer i_face=0; i_face<item_nb_face; ++i_face ) {
934 Integer face_nb_node = lf.nbNode();
935
937 m_work_face_orig_nodes_uid.resize(face_nb_node);
938 for( Integer z=0; z<face_nb_node; ++z )
939 m_work_face_orig_nodes_uid[z] = nodes_uid[ lf.node(z) ];
940 bool is_reorder = false;
941 if (m_mesh->dimension() == 1) { // is 1d mesh
942 is_reorder = (i_face==1);
943 m_work_face_sorted_nodes[0] = m_work_face_orig_nodes_uid[0];
944 }
945 else
946 is_reorder = mesh_utils::reorderNodesOfFace(m_work_face_orig_nodes_uid,m_work_face_sorted_nodes);
947
948 // find parent item
950 if (kind==IK_Cell) {
951 parent_item = item.toCell().face(i_face);
952 }
953 else if (kind==IK_Face) {
954 if (m_mesh->dimension() == 1) { // is 1d mesh
956 } else {
957 // Algo sans CT_FaceToEdge
961 std::swap(first_node,second_node);
964 }
965 }
966
967 if (parent_item.null())
968 ARCANE_FATAL("Cannot find parent face");
969 Int64 new_face_uid = parent_item.uniqueId();
970 ItemTypeInfo* face_type = itm->typeFromId(lf.typeId());
971
973 if (is_add){
974#ifdef ARCANE_DEBUG_DYNAMIC_MESH
975 info() << "Création face " << new_face_uid << ' '
976 << face_internal->uniqueId() << ' ' << face_internal->localId();
977#endif /* ARCANE_DEBUG_DYNAMIC_MESH */
978 face_internal->setParent(0,parent_item.localId());
979 face_internal->setOwner(parent_item.owner(),m_mesh_info.rank());
980
981 for( Integer i_node=0; i_node<face_nb_node; ++i_node ){
984 m_node_family.addFaceToNode(current_node, face_internal);
985 }
986
987 if (m_mesh_builder->hasEdge()) {
988 Integer face_nb_edge = lf.nbEdge();
989 for( Integer i_edge=0; i_edge<face_nb_edge; ++i_edge ){
990 Int32 edge_idx = lf.edge(i_edge);
991 Edge current_edge = new_item.itemBase().edgeBase(edge_idx);
994 }
995 }
997 }
999 if (is_reorder){
1000 m_face_family.addFrontCellToFace(face_internal,new_item.toCell());
1001 } else{
1002 m_face_family.addBackCellToFace(face_internal,new_item.toCell());
1003 }
1004 }
1005
1006 return ItemCompatibility::_itemInternal(new_item);
1007}
1008
1009/*---------------------------------------------------------------------------*/
1010/*---------------------------------------------------------------------------*/
1014template<typename CellInfo>
1017{
1018 Integer cell_nb_node = cell_info.nbNode();
1019
1020 // Ajoute les nouveaux noeuds si nécessaire
1021 for( Integer i_node=0; i_node<cell_nb_node; ++i_node ){
1022 Int64 node_unique_id = cell_info.nodeUniqueId(i_node);
1023 bool is_add = false;
1024 ItemInternal* node_internal = m_node_family.findOrAllocOne(node_unique_id,is_add);
1025 if (is_add){
1026 ++m_mesh_info.nbNode();
1027 node_internal->setOwner(cell_info.nodeOwner(i_node),m_mesh_info.rank());
1028 }
1029 m_node_family.addCellToNode(node_internal,cell);
1030 m_cell_family.replaceNode(cell,i_node,ItemLocalId(node_internal));
1031 }
1032}
1033
1034/*---------------------------------------------------------------------------*/
1035/*---------------------------------------------------------------------------*/
1036
1037template<typename CellInfo>
1038bool OneMeshItemAdder::
1039_isReorder(Integer i_face, const ItemTypeInfo::LocalFace& lf, const CellInfo& cell_info)
1040{
1041 const Integer face_nb_node = lf.nbNode();
1043 m_work_face_orig_nodes_uid.resize(face_nb_node);
1044 for(Integer i_node=0; i_node < face_nb_node; ++i_node)
1045 m_work_face_orig_nodes_uid[i_node] = cell_info.nodeUniqueId(lf.node(i_node));
1046 bool is_reorder = false;
1047 if (m_mesh->dimension() == 1) { // is 1d mesh
1048 is_reorder = (i_face==1);
1049 m_work_face_sorted_nodes[0] = m_work_face_orig_nodes_uid[0];
1050 }
1051 else
1052 is_reorder = mesh_utils::reorderNodesOfFace(m_work_face_orig_nodes_uid,
1054
1055 return is_reorder;
1056}
1057
1058/*---------------------------------------------------------------------------*/
1059/*---------------------------------------------------------------------------*/
1060
1069
1070/*---------------------------------------------------------------------------*/
1071/*---------------------------------------------------------------------------*/
1072
1073} // End namespace Arcane::mesh
1074
1075/*---------------------------------------------------------------------------*/
1076/*---------------------------------------------------------------------------*/
#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 es associée à un stockage, la connectivité entre les familles source_family et targ...
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:120
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 Dom.h:204
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
Int64UniqueArray 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...)
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:151
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:515
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:638
Int32 Integer
Type représentant un entier.