14#include "arcane/mesh/OneMeshItemAdder.h"
16#include "arcane/utils/NotSupportedException.h"
17#include "arcane/utils/ValueConvert.h"
20#include "arcane/core/MeshToMeshTransposer.h"
21#include "arcane/core/IParallelMng.h"
22#include "arcane/core/ItemPrinter.h"
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"
49 , m_cell_uid(cell_uid)
54 Int64 uniqueId()
const {
return m_cell_uid; }
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; }
65 bool allowBuildFace()
const {
return m_allow_build_face; }
66 bool allowBuildEdge()
const {
return m_allow_build_face; }
74 bool m_allow_build_face;
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())
93 m_work_face_orig_nodes_uid.reserve(100);
105addOneNode(Int64 node_uid,Int32 owner)
157 m_work_face_orig_nodes_uid[z] =
nodes_uid[z];
170 m_node_family.addFaceToNode(node, face);
174 return ItemCompatibility::_itemInternal(face);
180ItemInternal* OneMeshItemAdder::
183 m_work_edge_sorted_nodes.
resize(2);
184 m_work_edge_orig_nodes_uid.
resize(2);
186 for( Integer z=0; z<2; ++z )
187 m_work_edge_orig_nodes_uid[z] = nodes_uid[z];
189 mesh_utils::reorderNodesOfFace(m_work_edge_orig_nodes_uid,m_work_edge_sorted_nodes);
191 bool is_add_edge =
false;
192 ItemInternal* edge = m_edge_family.
findOrAllocOne(edge_uid,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);
211Face OneMeshItemAdder::
212_findInternalFace(Integer i_face,
const FullCellInfo& cell_info,
bool& is_add)
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);
225Face OneMeshItemAdder::
226_findInternalFace(Integer i_face,
const CellInfoProxy& cell_info,
bool& is_add)
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);
233 if (face_internal.null()) {
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}",
245 ItemTypeInfo* face_type = m_item_type_mng->
typeFromId(lf.typeId());
250 return m_face_family.
allocOne(face_unique_id,face_type);
254 return face_internal;
262Edge OneMeshItemAdder::
263_findInternalEdge(Integer i_edge,
const FullCellInfo& cell_info,
264 Int64 first_node,
Int64 second_node,
bool& is_add)
266 ARCANE_UNUSED(first_node);
267 ARCANE_UNUSED(second_node);
269 const Int64 edge_unique_id = cell_info.edgeUniqueId(i_edge);
277Edge OneMeshItemAdder::
278_findInternalEdge(Integer i_edge,
const CellInfoProxy& cell_info,
Int64 first_node,
Int64 second_node,
bool& is_add)
280 ARCANE_UNUSED(i_edge);
282 const ItemInternalMap& nodes_map = m_mesh->nodesMap();
283 Node nbi = nodes_map.
findItem(first_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()");
291 return m_edge_family.
allocOne(edge_unique_id);
295 return edge_internal;
355 ARCANE_ASSERT(m_mesh->
itemFamilyNetwork(),(
"ItemFamilyNetwork is required to call OneMeshItemAdder::addOneItem"));
386 if (connected_family_to_family)
387 connected_family_to_family->
addConnectedItem(ItemLocalId(connected_item_lids[connected_item_index]),ItemLocalId(item));
389 info_index+= nb_connected_item;
393 return ItemCompatibility::_itemInternal(item);
398ItemInternal* OneMeshItemAdder::
399addOneItem2(IItemFamily* family,
400 IItemFamilyModifier* family_modifier,
404 Integer sub_domain_id,
405 Integer nb_connected_family,
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);
414 for (Integer family_index = 0; family_index < nb_connected_family; ++family_index) {
419 if (nb_connected_item == 0)
continue;
420 IItemFamily* connected_family = nullptr ;
423 connected_family = m_mesh->
findItemFamily(family_kind, ParticleFamily::defaultFamilyName(),
false,
false);
426 if(family->name()==GraphDoFs::dualNodeFamilyName())
427 connected_family = m_mesh->
findItemFamily(family_kind, GraphDoFs::linkFamilyName(),
false,
false);
429 connected_family = m_mesh->
findItemFamily(family_kind, GraphDoFs::dualNodeFamilyName(),
false,
false);
432 connected_family = m_mesh->
itemFamily(family_kind);
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);
442 bool is_relation = !(is_dependency && is_deep_connectivity);
446 bool do_fatal = is_relation ? false :
true;
447 connected_family->itemsUniqueIdToLocalId(connected_item_lids,connectivity_info.subView(info_index,nb_connected_item),do_fatal);
449 Integer nb_connected_item_found = nb_connected_item;
452 for (Integer index = 0; index < connected_item_lids.size(); )
454 if (connected_item_lids[index] == NULL_ITEM_LOCAL_ID) {
455 connected_item_lids.remove(index);
456 --nb_connected_item_found;
461 for (Integer connected_item_index = 0; connected_item_index < nb_connected_item_found; ++connected_item_index)
463 if (family_to_connected_family)
466 auto connected_item_lid = ItemLocalId{connected_item_lids[connected_item_index]};
469 if (!family_to_connected_family->hasConnectedItem(ItemLocalId(item),connected_item_lid))
471 family_to_connected_family->addConnectedItem(ItemLocalId(item),connected_item_lid);
476 family_to_connected_family->replaceConnectedItem(ItemLocalId(item),connected_item_index,connected_item_lid);
480 info_index+= nb_connected_item;
483 debug(
Trace::Highest) <<
"[addItems] ADD_ITEM " << ItemPrinter(item) <<
" in " << family->name();
486 return ItemCompatibility::_itemInternal(item);
491void OneMeshItemAdder::
492_printRelations(ItemInternal* item)
494 debug(
Trace::Highest) <<
"[addItems] RELATIONS for " << ItemPrinter(item) <<
" in " << item->family()->name();
495 for (
const auto& relation : m_mesh->itemFamilyNetwork()->getChildRelations(item->family())) {
498 ConnectivityItemVector connected_items(relation);
499 for (
const auto& connected_item : connected_items.connectedItems(ItemLocalId(item))) {
508void OneMeshItemAdder::
509_clearConnectivity(ItemLocalId item, IIncrementalItemConnectivity* connectivity)
512 ConnectivityItemVector accessor(connectivity);
514 connectivity->removeConnectedItem(item,connected_item);
521void OneMeshItemAdder::
522_clearReverseConnectivity(ItemLocalId item, IIncrementalItemConnectivity* connectivity, IIncrementalItemConnectivity* reverse_connectivity)
524 ConnectivityItemVector accessor(connectivity);
526 reverse_connectivity->removeConnectedItem(connected_item,item);
533template<>
void OneMeshItemAdder::
552template<>
void OneMeshItemAdder::
566template<
typename CellInfo>
583 for( Integer i=0, is=
cell_info.nbNode(); i<is; ++i )
585 ARCANE_FATAL(
"trying to add existing cell (uid={0}) with different nodes",
588 return ItemCompatibility::_itemInternal(
inew_cell);
592 const bool is_verbose =
false;
609 ARCANE_FATAL(
"Type '{0}' is not allowed for 'Cell' (cell_uid={1})",
614 ARCANE_FATAL(
"Incoherent dimension for cell uid={0} cell_dim={1} mesh_dim={2} type={3}",
623 if (m_mesh_builder->hasEdge()) {
682 if (m_mesh_builder->hasEdge()) {
698 m_face_family.replaceFrontCellToFace(face,
new_cell);
717 return ItemCompatibility::_itemInternal(
inew_cell);
747 type =
itm->typeFromId(IT_CellLine2);
749 type =
itm->typeFromId(IT_FaceVertex);
784 ARCANE_FATAL(
"Cannot add already existing parent item in submesh");
786 return ItemCompatibility::_itemInternal(
new_item);
794 Integer item_nb_node = 0;
815 if (!m_mesh_builder->hasEdge())
825 for( Integer z=0; z<item_nb_node; ++z )
846 if (type->
typeId() == IT_FaceVertex)
855#ifdef ARCANE_DEBUG_DYNAMIC_MESH
902#ifdef ARCANE_DEBUG_DYNAMIC_MESH
947 m_work_face_orig_nodes_uid[z] =
nodes_uid[
lf.node(z) ];
982#ifdef ARCANE_DEBUG_DYNAMIC_MESH
995 if (m_mesh_builder->hasEdge()) {
1014 return ItemCompatibility::_itemInternal(
new_item);
1022template<
typename CellInfo>
1045template<
typename CellInfo>
1046bool OneMeshItemAdder::
1060 is_reorder = mesh_utils::reorderNodesOfFace(m_work_face_orig_nodes_uid,
#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.
Fonctions utilitaires sur le maillage.
Face face(Int32 i) const
i-ème face de la maille
Int32 nbCell() const
Nombre de mailles de la face (1 ou 2)
bool isSubDomainBoundary() const
Indique si la face est au bord du sous-domaine (i.e nbCell()==1)
bool isSubDomainBoundaryOutside() const
Indique si la face est au bord t orientée vers l'extérieur.
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.
Type d'une entité (Item).
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.
ItemTypeInfo * typeFromId(Integer id) const
Type correspondant au numéro id.
Node node(Int32 i) const
i-ème noeud de l'entité
Classe de base d'un élément de maillage.
impl::MutableItemBase mutableItemBase() const
Partie interne modifiable de l'entité.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
ItemWithNodes toItemWithNodes() const
Converti l'entité en le genre ItemWithNodes.
Cell toCell() const
Converti l'entité en le genre Cell.
eItemKind kind() const
Genre de l'entité
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Face toFace() const
Converti l'entité en le genre Edge.
impl::ItemBase itemBase() const
Partie interne de l'entité.
Int16 type() const
Type de l'entité
Lecteur des fichiers de maillage via la bibliothèque LIMA.
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é.
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.
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.
Integer & nbCell()
Nombre de mailles dans le maillage.
Int32 rank() const
Numéro de ce sous-domaine.
Integer & nbEdge()
Nombre d'arêtes dans le maillage.
void reset()
Remet à zéro la numérotation.
Integer & nbNode()
Nombre de noeuds dans le maillage.
Integer & nbFace()
Nombre de faces dans le maillage.
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.
Classe d'accès aux traces.
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.
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
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.
@ Highest
Niveau le plus élevé
Int32 Integer
Type représentant un entier.