14#include "arcane/mesh/OneMeshItemAdder.h"
16#include "arcane/utils/NotSupportedException.h"
19#include "arcane/core/MeshToMeshTransposer.h"
20#include "arcane/core/IParallelMng.h"
21#include "arcane/core/ItemPrinter.h"
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"
48 , m_cell_uid(cell_uid)
53 Int64 uniqueId()
const {
return m_cell_uid; }
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; }
64 bool allowBuildFace()
const {
return m_allow_build_face; }
65 bool allowBuildEdge()
const {
return m_allow_build_face; }
73 bool m_allow_build_face;
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())
94 m_work_face_orig_nodes_uid.reserve(100);
101addOneNode(Int64 node_uid,Int32 owner)
153 m_work_face_orig_nodes_uid[z] =
nodes_uid[z];
166 m_node_family.addFaceToNode(node, face);
170 return ItemCompatibility::_itemInternal(face);
176ItemInternal* OneMeshItemAdder::
179 m_work_edge_sorted_nodes.
resize(2);
180 m_work_edge_orig_nodes_uid.
resize(2);
182 for( Integer z=0; z<2; ++z )
183 m_work_edge_orig_nodes_uid[z] = nodes_uid[z];
185 mesh_utils::reorderNodesOfFace(m_work_edge_orig_nodes_uid,m_work_edge_sorted_nodes);
187 bool is_add_edge =
false;
188 ItemInternal* edge = m_edge_family.
findOrAllocOne(edge_uid,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);
207Face OneMeshItemAdder::
208_findInternalFace(Integer i_face,
const FullCellInfo& cell_info,
bool& is_add)
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);
221Face OneMeshItemAdder::
222_findInternalFace(Integer i_face,
const CellInfoProxy& cell_info,
bool& is_add)
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);
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}",
239 ItemTypeInfo* face_type = m_item_type_mng->
typeFromId(lf.typeId());
242 return m_face_family.
allocOne(face_unique_id,face_type);
246 return face_internal;
254Edge OneMeshItemAdder::
255_findInternalEdge(Integer i_edge,
const FullCellInfo& cell_info,
256 Int64 first_node,
Int64 second_node,
bool& is_add)
258 ARCANE_UNUSED(first_node);
259 ARCANE_UNUSED(second_node);
261 const Int64 edge_unique_id = cell_info.edgeUniqueId(i_edge);
269Edge OneMeshItemAdder::
270_findInternalEdge(Integer i_edge,
const CellInfoProxy& cell_info,
Int64 first_node,
Int64 second_node,
bool& is_add)
272 ARCANE_UNUSED(i_edge);
274 const ItemInternalMap& nodes_map = m_mesh->nodesMap();
275 Node nbi = nodes_map.
findItem(first_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()");
283 return m_edge_family.
allocOne(edge_unique_id);
287 return edge_internal;
347 ARCANE_ASSERT(m_mesh->
itemFamilyNetwork(),(
"ItemFamilyNetwork is required to call OneMeshItemAdder::addOneItem"));
378 if (connected_family_to_family)
379 connected_family_to_family->
addConnectedItem(ItemLocalId(connected_item_lids[connected_item_index]),ItemLocalId(item));
381 info_index+= nb_connected_item;
385 return ItemCompatibility::_itemInternal(item);
390ItemInternal* OneMeshItemAdder::
391addOneItem2(IItemFamily* family,
392 IItemFamilyModifier* family_modifier,
396 Integer sub_domain_id,
397 Integer nb_connected_family,
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);
406 for (Integer family_index = 0; family_index < nb_connected_family; ++family_index) {
411 if (nb_connected_item == 0)
continue;
412 IItemFamily* connected_family = nullptr ;
415 connected_family = m_mesh->
findItemFamily(family_kind, ParticleFamily::defaultFamilyName(),
false,
false);
418 if(family->name()==GraphDoFs::dualNodeFamilyName())
419 connected_family = m_mesh->
findItemFamily(family_kind, GraphDoFs::linkFamilyName(),
false,
false);
421 connected_family = m_mesh->
findItemFamily(family_kind, GraphDoFs::dualNodeFamilyName(),
false,
false);
424 connected_family = m_mesh->
itemFamily(family_kind);
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);
434 bool is_relation = !(is_dependency && is_deep_connectivity);
438 bool do_fatal = is_relation ? false :
true;
439 connected_family->itemsUniqueIdToLocalId(connected_item_lids,connectivity_info.subView(info_index,nb_connected_item),do_fatal);
441 Integer nb_connected_item_found = nb_connected_item;
444 for (Integer index = 0; index < connected_item_lids.size(); )
446 if (connected_item_lids[index] == NULL_ITEM_LOCAL_ID) {
447 connected_item_lids.remove(index);
448 --nb_connected_item_found;
453 for (Integer connected_item_index = 0; connected_item_index < nb_connected_item_found; ++connected_item_index)
455 if (family_to_connected_family)
458 auto connected_item_lid = ItemLocalId{connected_item_lids[connected_item_index]};
461 if (!family_to_connected_family->hasConnectedItem(ItemLocalId(item),connected_item_lid))
463 family_to_connected_family->addConnectedItem(ItemLocalId(item),connected_item_lid);
468 family_to_connected_family->replaceConnectedItem(ItemLocalId(item),connected_item_index,connected_item_lid);
472 info_index+= nb_connected_item;
475 debug(
Trace::Highest) <<
"[addItems] ADD_ITEM " << ItemPrinter(item) <<
" in " << family->name();
478 return ItemCompatibility::_itemInternal(item);
483void OneMeshItemAdder::
484_printRelations(ItemInternal* item)
486 debug(
Trace::Highest) <<
"[addItems] RELATIONS for " << ItemPrinter(item) <<
" in " << item->family()->name();
487 for (
const auto& relation : m_mesh->itemFamilyNetwork()->getChildRelations(item->family())) {
490 ConnectivityItemVector connected_items(relation);
491 for (
const auto& connected_item : connected_items.connectedItems(ItemLocalId(item))) {
500void OneMeshItemAdder::
501_clearConnectivity(ItemLocalId item, IIncrementalItemConnectivity* connectivity)
504 ConnectivityItemVector accessor(connectivity);
506 connectivity->removeConnectedItem(item,connected_item);
513void OneMeshItemAdder::
514_clearReverseConnectivity(ItemLocalId item, IIncrementalItemConnectivity* connectivity, IIncrementalItemConnectivity* reverse_connectivity)
516 ConnectivityItemVector accessor(connectivity);
518 reverse_connectivity->removeConnectedItem(connected_item,item);
525template<>
void OneMeshItemAdder::
544template<>
void OneMeshItemAdder::
558template<
typename CellInfo>
575 for( Integer i=0, is=
cell_info.nbNode(); i<is; ++i )
577 ARCANE_FATAL(
"trying to add existing cell (uid={0}) with different nodes",
580 return ItemCompatibility::_itemInternal(
inew_cell);
584 const bool is_verbose =
false;
601 ARCANE_FATAL(
"Type '{0}' is not allowed for 'Cell' (cell_uid={1})",
606 ARCANE_FATAL(
"Incoherent dimension for cell uid={0} cell_dim={1} mesh_dim={2} type={3}",
615 if (m_mesh_builder->hasEdge()) {
674 if (m_mesh_builder->hasEdge()) {
690 m_face_family.replaceFrontCellToFace(face,
new_cell);
709 return ItemCompatibility::_itemInternal(
inew_cell);
739 type =
itm->typeFromId(IT_CellLine2);
741 type =
itm->typeFromId(IT_FaceVertex);
776 ARCANE_FATAL(
"Cannot add already existing parent item in submesh");
778 return ItemCompatibility::_itemInternal(
new_item);
786 Integer item_nb_node = 0;
807 if (!m_mesh_builder->hasEdge())
817 for( Integer z=0; z<item_nb_node; ++z )
838 if (type->
typeId() == IT_FaceVertex)
847#ifdef ARCANE_DEBUG_DYNAMIC_MESH
894#ifdef ARCANE_DEBUG_DYNAMIC_MESH
939 m_work_face_orig_nodes_uid[z] =
nodes_uid[
lf.node(z) ];
974#ifdef ARCANE_DEBUG_DYNAMIC_MESH
987 if (m_mesh_builder->hasEdge()) {
1006 return ItemCompatibility::_itemInternal(
new_item);
1014template<
typename CellInfo>
1037template<
typename CellInfo>
1038bool OneMeshItemAdder::
1052 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 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.
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.
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.
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.