14#include "arcane/mesh/FaceFamily.h"
16#include "arcane/utils/FatalErrorException.h"
17#include "arcane/utils/NotImplementedException.h"
18#include "arcane/utils/String.h"
19#include "arcane/utils/OStringStream.h"
21#include "arcane/mesh/NodeFamily.h"
22#include "arcane/mesh/EdgeFamily.h"
23#include "arcane/mesh/IncrementalItemConnectivity.h"
24#include "arcane/mesh/CompactIncrementalItemConnectivity.h"
25#include "arcane/mesh/ItemConnectivitySelector.h"
26#include "arcane/mesh/AbstractItemFamilyTopologyModifier.h"
27#include "arcane/mesh/ConnectivityNewWithDependenciesTypes.h"
28#include "arcane/mesh/NewWithLegacyConnectivity.h"
29#include "arcane/mesh/FaceReorienter.h"
31#include "arcane/IMesh.h"
32#include "arcane/ITiedInterface.h"
33#include "arcane/TiedFace.h"
34#include "arcane/ItemEnumerator.h"
35#include "arcane/ItemPrinter.h"
36#include "arcane/Connectivity.h"
39#include "arcane/GeometricUtilities.h"
40#include "arcane/SharedVariable.h"
84 _setTopologyModifier(
new TopologyModifier(
this));
108 m_node_connectivity =
dynamic_cast<NewWithLegacyConnectivityType<FaceFamily,NodeFamily>::type*
>(m_mesh->
itemFamilyNetwork()->getConnectivity(
this,
mesh()->nodeFamily(),connectivityName(
this,
mesh()->nodeFamily())));
109 m_edge_connectivity =
dynamic_cast<NewWithLegacyConnectivityType<FaceFamily,EdgeFamily>::type*
>(m_mesh->
itemFamilyNetwork()->getConnectivity(
this,
mesh()->
edgeFamily(),connectivityName(
this,
mesh()->edgeFamily())));
110 m_face_connectivity =
dynamic_cast<NewWithLegacyConnectivityType<FaceFamily,FaceFamily>::type*
>(m_mesh->
itemFamilyNetwork()->getConnectivity(
this,
mesh()->faceFamily(),connectivityName(
this,
mesh()->faceFamily())));
111 m_cell_connectivity =
dynamic_cast<NewWithLegacyConnectivityType<FaceFamily,CellFamily>::type*
>(m_mesh->
itemFamilyNetwork()->getConnectivity(
this,
mesh()->
cellFamily(),connectivityName(
this,
mesh()->cellFamily())));
115 m_node_connectivity =
new NodeConnectivity(
this,
mesh()->nodeFamily(),
"FaceNode");
116 m_edge_connectivity =
new EdgeConnectivity(
this,
mesh()->edgeFamily(),
"FaceEdge");
117 m_face_connectivity =
new FaceConnectivity(
this,
mesh()->faceFamily(),
"FaceFace");
118 m_cell_connectivity =
new CellConnectivity(
this,
mesh()->cellFamily(),
"FaceCell");
120 m_hparent_connectivity =
new HParentConnectivity(
this,
this,
"HParentFace");
121 m_hchild_connectivity =
new HChildConnectivity(
this,
this,
"HChildFace");
123 _addConnectivitySelector(m_node_connectivity);
124 _addConnectivitySelector(m_edge_connectivity);
125 _addConnectivitySelector(m_face_connectivity);
126 _addConnectivitySelector(m_cell_connectivity);
127 _addConnectivitySelector(m_hparent_connectivity);
128 _addConnectivitySelector(m_hchild_connectivity);
130 _buildConnectivitySelectors();
136inline void FaceFamily::
137_createOne(ItemInternal* item,
Int64 uid,ItemTypeInfo* type)
139 m_item_internal_list->faces = _itemsInternal();
140 _allocateInfos(item,uid,type);
141 auto nc = m_node_connectivity->trueCustomConnectivity();
143 nc->addConnectedItems(ItemLocalId(item),type->nbLocalNode());
149inline void FaceFamily::
150_createOne(ItemInternal* item,
Int64 uid,ItemTypeId type_id)
152 _createOne(item,uid,_itemTypeMng()->typeFromId(type_id));
180 _createOne(item,uid,type);
218 _createOne(item,uid,type);
251preAllocate(Integer nb_item)
259 this->_preAllocate(nb_item,
false);
260 m_node_connectivity->trueCustomConnectivity()->reserveMemoryForNbSourceItems(nb_item,
true);
261 if (Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_HasEdge))
262 m_edge_connectivity->trueCustomConnectivity()->reserveMemoryForNbSourceItems(nb_item,
true);
263 m_cell_connectivity->trueCustomConnectivity()->reserveMemoryForNbSourceItems(nb_item,
true);
272 debug() <<
"Creating the list of ghosts faces";
285 m_node_connectivity->replaceItem(face,index,node);
297 m_edge_connectivity->replaceItem(face,index,edge);
309 m_face_connectivity->replaceItem(face,index,
face2);
321 m_cell_connectivity->replaceItem(face,index,cell);
340 auto c = m_cell_connectivity->trueCustomConnectivity();
373 _checkValidSourceTargetItems(face,
new_cell);
383 " This is most probably due to the fact that the face"
384 " is connected to a reverse cell with a negative volume."
406 _checkValidSourceTargetItems(face,
new_cell);
416 " This is most probably due to the fact that the face"
417 " is connected to a reverse cell with a negative volume."
440 ARCANE_ASSERT((face.
nbCell() ==2),(
"Face should have back and front cells"));
452 ARCANE_ASSERT((face.
nbCell() ==2),(
"Face should have back and front cells"));
470 else if(
bcell.isActive())
479 ARCANE_ASSERT((subface.
backCell() != subface.
frontCell()),(
"back front cells error"));
486replaceBackFrontCellsFromParentFace(Cell subcell,Face subface,
489 Cell fscell= subface.frontCell();
490 Cell bscell= subface.backCell();
491 Cell fcell= face.frontCell();
492 Cell bcell= face.backCell();
493 if (fscell.localId()==subcell.localId()) {
494 if(fcell.localId()==cell.localId()) {
495 if(bcell.level()>bscell.level()) {
500 if(fcell.level() > bscell.level()){
506 if (fcell.localId()==cell.localId()){
507 if (bcell.level() > fscell.level()){
508 replaceFrontCellToFace(subface,bcell);
512 if(fcell.level()>fscell.level()){
513 replaceFrontCellToFace(subface,fcell);
523isSubFaceInFace(Face subface,Face face)
const
525 const Real tol= 1e-02;
529 for( Node inode : subface.nodes() ){
530 for( Node inode2 : face.nodes() ){
531 if (inode.uniqueId() == inode2.uniqueId()) {
541 Real3 normal_face = _computeFaceNormal(face,orig_nodes_coords);
542 Real3 normal_subface = _computeFaceNormal(subface,orig_nodes_coords);
544 Real residual = math::abs(ps)-1.;
545 return math::abs(residual) < tol ?
true:
false;
552isChildOnFace(ItemWithNodes child,Face face)
const
555 for( Node inode : face.nodes() ){
556 for( Node inode2 : child.nodes() ){
557 if (inode.uniqueId() == inode2.uniqueId())
568subFaces(Face face,Array<ItemInternal*>& subfaces)
571 const Integer nb_cell= face.nbCell();
574 Cell fcell = face.frontCell();
575 cell = (fcell.hasHChildren()) ? face.frontCell() : face.backCell();
580 for( Integer c=0;c<cell.nbHChildren();c++){
581 Cell child = cell.hChild(c);
582 if (isChildOnFace(child,face)){
586 for( Face subface : child.faces() ){
587 if(isSubFaceInFace(subface,face)){
588 subfaces.add(ItemCompatibility::_itemInternal(subface));
600allSubFaces(Face face,Array<ItemInternal*>& subfaces)
602 subfaces.add(ItemCompatibility::_itemInternal(face));
605 const Integer nb_cell= face.nbCell();
607 Cell fcell= face.frontCell();
608 if(fcell.hasHChildren() && fcell.isOwn())
609 cell = face.frontCell() ;
611 cell = face.backCell();
617 for(Integer c=0;c<cell.nbHChildren();c++){
618 Cell child = cell.hChild(c);
619 if (isChildOnFace(child,face)){
620 for( Face subface : child.faces() ){
621 if(isSubFaceInFace(subface,face)){
622 allSubFaces(subface,subfaces);
633activeSubFaces(Face face,Array<ItemInternal*>& subfaces)
636 const Integer nb_cell= face.nbCell();
639 Cell fcell = face.frontCell();
640 Cell bcell = face.backCell();
641 if(fcell.level() > bcell.level())
642 cell = face.frontCell();
645 cell= face.backCell();
647 cell= face.frontCell();
653 Cell pcell = cell.topHParent();
655 UniqueArray<ItemInternal*> cell_family;
656 activeFamilyTree (cell_family,pcell);
657 for(Integer c=0;c<cell_family.size();c++){
658 Cell child = cell_family[c];
659 if(isChildOnFace(child,face)){
663 for( Face subface : child.faces() ){
664 if(isSubFaceInFace(subface,face)){
665 subfaces.add(ItemCompatibility::_itemInternal(subface));
677familyTree(Array<ItemInternal*>& family,Cell item,
678 const bool reset)
const
680 ARCANE_ASSERT((!item.isSubactive()),(
"The family tree doesn't include subactive items"));
685 family.add(ItemCompatibility::_itemInternal(item));
688 if (!item.isActive())
689 for (Integer c=0, cs=item.nbHChildren(); c<cs; c++){
690 Cell ichild= item.hChild(c);
691 familyTree (family,ichild,
false);
699activeFamilyTree(Array<ItemInternal*>& family,Cell item,
const bool reset)
const
701 ARCANE_ASSERT((!item.isSubactive()),(
"The family tree doesn't include subactive items"));
707 family.add(ItemCompatibility::_itemInternal(item));
709 for (Integer c=0, cs=item.nbHChildren(); c<cs; c++){
710 Cell ichild= item.hChild(c);
712 activeFamilyTree(family,ichild,
false);
721_addParentFaceToFace(Face parent_face, Face child_face)
723 m_hparent_connectivity->addConnectedItem(ItemLocalId(child_face), ItemLocalId(parent_face));
730_addChildFaceToFace(Face parent_face, Face child_face)
732 m_hchild_connectivity->addConnectedItem(ItemLocalId(parent_face), ItemLocalId(child_face));
743 if (!Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_FaceToEdge))
746 _checkValidSourceTargetItems(face,
new_edge);
756 if (!Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_FaceToEdge))
766inline void FaceFamily::
767_removeFace(
Face face)
770 for( Int32 edge : face.edgeIds() )
772 for( Int32 node : face.nodeIds() )
790 for( Integer i=0; i<
nb_node; ++i ){
797 GeometricUtilities::QuadMapping face_mapping;
798 face_mapping.m_pos[0] = cord_face[0];
799 face_mapping.m_pos[1] = cord_face[1];
800 face_mapping.m_pos[2] = cord_face[2];
801 face_mapping.m_pos[3] = cord_face[3];
802 normal_face= face_mapping.normal();
807 Real3 v1 = cord_face[1] - cord_face[0];
808 Real3 v2 = cord_face[2] - cord_face[0];
814 normal_face=cord_face[0]-cord_face[1];
818 default:
ARCANE_FATAL(
"This kind of face is not handled");
829 _checkValidItem(face);
837 ARCANE_FATAL(
"Can not remove cell lid={0} from face uid={1} with no cell connected",
854 for(Integer s=0,ss=
subfaces.size();s<ss;s++){
900 _checkValidItem(face);
913 m_face_connectivity->addConnectedItem(face,
master_face);
933_removeMasterFaceToFace(Face face)
935 m_face_connectivity->removeConnectedItems(face);
943_removeSlaveFacesToFace(Face master_face)
945 m_face_connectivity->removeConnectedItems(master_face);
1000setConnectivity(
const Integer
c)
1002 m_mesh_connectivity =
c;
1003 m_has_face = Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_HasFace);
1005 m_node_prealloc = Connectivity::getPrealloc(m_mesh_connectivity,
IK_Face,
IK_Node);
1006 if (Connectivity::hasConnectivity(m_mesh_connectivity,Connectivity::CT_HasEdge))
1007 m_edge_prealloc = Connectivity::getPrealloc(m_mesh_connectivity,
IK_Face,
IK_Edge);
1008 m_face_connectivity->setPreAllocatedSize(4);
1009 m_cell_prealloc = Connectivity::getPrealloc(m_mesh_connectivity,
IK_Face,
IK_Cell);
1010 m_node_connectivity->setPreAllocatedSize(m_node_prealloc);
1011 m_cell_connectivity->setPreAllocatedSize(m_cell_prealloc);
1012 debug() <<
"Family " <<
name() <<
" prealloc "
1013 << m_node_prealloc <<
" by node, "
1014 << m_edge_prealloc <<
" by edge, "
1015 << m_cell_prealloc <<
" by cell.";
1023reorientFacesIfNeeded()
1027 mesh::FaceReorienter face_reorienter(
mesh());
1029 face_reorienter.checkAndChangeOrientationAMR(*iface);
#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.
Cell frontCell() const
Maille devant la face (maille nulle si aucune)
CellLocalId cellId(Int32 i) const
i-ème maille de la face
Int32 nbCell() const
Nombre de mailles de la face (1 ou 2)
Cell backCell() const
Maille derrière la face (maille nulle si aucune)
virtual void findAndReplaceCell(ItemLocalId item_lid, ItemLocalId old_cell_lid, ItemLocalId new_cell_lid)=0
Remplace une maille d'une entité.
virtual IItemFamily * nodeFamily()=0
Retourne la famille des noeuds.
virtual IItemFamily * edgeFamily()=0
Retourne la famille des arêtes.
virtual IItemFamily * cellFamily()=0
Retourne la famille des mailles.
virtual bool useMeshItemFamilyDependencies() const =0
check if the network itemFamily dependencies is activated
virtual IItemFamilyNetwork * itemFamilyNetwork()=0
Interface du réseau de familles (familles connectées)
Interface d'un classe gérant une semi-conformité du maillage.
virtual TiedInterfaceFaceList tiedFaces() const =0
Liste des informations sur les faces esclaves d'une face maître.
virtual FaceGroup masterInterface() const =0
Groupe contenant les faces maîtres.
bool isSuppressed() const
Vrai si l'entité est supprimée.
Int32 flags() const
Flags de l'entité
@ II_MasterFace
L'entité est une face maître d'une interface.
@ II_HasBackCell
L'entité a une maille derrière.
@ II_SlaveFace
L'entité est une face esclave d'une interface.
@ II_HasFrontCell
L'entité a une maille devant.
Structure interne d'une entité de maillage.
Index d'un Item dans une variable.
Classe utilitaire pour imprimer les infos sur une entité.
Type d'une entité (Item).
Infos sur un type d'entité du maillage.
Node node(Int32 i) const
i-ème noeud de l'entité
Int32 nbNode() const
Nombre de noeuds 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.
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
impl::ItemBase itemBase() const
Partie interne de l'entité.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
void _setFaceBackAndFrontCells(Int32 back_cell_lid, Int32 front_cell_lid)
Pour une face, positionne à la fois la back cell et la front cell.
void addFlags(Int32 added_flags)
Ajoute les flags \added_flags à ceux de l'entité
Classe gérant un vecteur de réel de dimension 3.
Real3 & normalize()
Normalise le triplet.
Face semi-conforme du maillage.
Modification de la topologie des entités d'une famille.
void replaceCell(ItemLocalId item_lid, Integer index, ItemLocalId new_lid) override
Remplace une maille d'une entité.
void replaceEdge(ItemLocalId item_lid, Integer index, ItemLocalId new_lid) override
Remplace une arête d'une entité.
void replaceNode(ItemLocalId item_lid, Integer index, ItemLocalId new_lid) override
Remplace un noeud d'une entité.
void replaceFace(ItemLocalId item_lid, Integer index, ItemLocalId new_lid) override
Remplace une face d'une entité.
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 setBackAndFrontCells(Face face, Int32 back_cell_lid, Int32 front_cell_lid)
Positionne la maille derrière et devant la face.
NodeFamily * m_node_family
Famille des noeuds associée à cette famille.
void removeEdgeFromFace(Face face, Edge edge_to_remove)
Supprime une arête de la face.
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.
void applyTiedInterface(ITiedInterface *interface)
Renseigne les informations liées à l'interface liée interface.
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.
EdgeFamily * m_edge_family
Famille d'arêtes associée à cette famille.
void removeCellFromFace(Face face, ItemLocalId cell_to_remove_lid)
Supprime une maille de la face.
void replaceCell(ItemLocalId face, Integer index, ItemLocalId cell)
Remplace la maille d'index index de la face face avec celle de localId() cell_lid.
void addFrontCellToFace(Face face, Cell new_cell)
Ajoute une maille devant la face.
bool m_check_orientation
Indique s'il faut vérifier l'orientation.
virtual void computeSynchronizeInfos() override
Construit les structures nécessaires à la synchronisation.
void addEdgeToFace(Face face, Edge new_edge)
Ajoute une arête devant la face.
void removeFaceIfNotConnected(Face face)
Supprime la face si elle n'est plus connectée.
void removeTiedInterface(ITiedInterface *interface)
Supprime les informations liées à l'interface liée interface.
void replaceBackCellToFace(Face face, ItemLocalId new_cell)
AMR.
void addBackCellToFace(Face face, Cell new_cell)
Ajoute une maille derrière la face.
void replaceFace(ItemLocalId face, Integer index, ItemLocalId face2)
Remplace la face d'index index de la face face avec celle de localId() face_lid.
IMesh * mesh() const override
Maillage associé
IItemFamilyTopologyModifier * _topologyModifier() override
Interface du modificateur de topologie.
ItemGroup allItems() const override
Groupe de toutes les entités.
void computeSynchronizeInfos() override
Construit les structures nécessaires à la synchronisation.
String name() const override
Nom de la famille.
Classe factorisant des informations sur le maillage.
Vue constante d'un tableau de type T.
Chaîne de caractères unicode.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
Vecteur 1D de données avec sémantique par valeur (style STL).
ARCCORE_HOST_DEVICE Real3 vecMul(Real3 u, Real3 v)
Produit vectoriel de u par v. dans .
ARCCORE_HOST_DEVICE Real dot(Real2 u, Real2 v)
Produit scalaire de u par v dans .
SharedMeshVariableScalarRefT< Node, Real3 > SharedVariableNodeReal3
Grandeur au noeud de type coordonnées.
@ 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_Edge
Entité de maillage de genre arête.
Int32 Integer
Type représentant un entier.