14#include "arcane/mesh/CellMerger.h"
16#include "arcane/utils/FatalErrorException.h"
17#include "arcane/utils/StringBuilder.h"
18#include "arcane/utils/TraceInfo.h"
19#include "arcane/utils/CheckedConvert.h"
20#include "arcane/utils/TraceAccessor.h"
22#include "arcane/core/Item.h"
24#include "arcane/core/IItemFamily.h"
25#include "arcane/core/IItemFamilyTopologyModifier.h"
26#include "arcane/core/IMesh.h"
27#include "arcane/core/internal/IItemFamilyInternal.h"
29#include "arcane/mesh/FaceReorienter.h"
51 m_face_reorienter(mesh),
52 m_cell_tm(mesh->
cellFamily()->_internalApi()->topologyModifier()),
53 m_face_tm(mesh->
faceFamily()->_internalApi()->topologyModifier()),
54 m_node_tm(mesh->
nodeFamily()->_internalApi()->topologyModifier())
116 void checkAndChangeFaceOrientation(
Cell cell)
119 for( Integer i=0, n=cell.
nbFace(); i<n; ++i) {
125 FaceReorienter m_face_reorienter;
126 IItemFamilyTopologyModifier* m_cell_tm;
127 IItemFamilyTopologyModifier* m_face_tm;
128 IItemFamilyTopologyModifier* m_node_tm;
143 typedef std::set<Integer> NodesLIDSet;
149 NodesLIDSet m_nodes_lid_set;
159 return m_nodes_lid_set;
200: m_cell_1_local_number(-1)
201, m_cell_2_local_number(-1)
240 m_nodes_lid_set.insert(
i_node->localId());
315 for (LocalIDToLocalNumber::const_iterator
342: m_face_1_common_node_numbers(std::numeric_limits<Integer>::max())
343, m_face_2_common_node_numbers(std::numeric_limits<Integer>::max())
344, m_face_2_exchanged_node_numbers(std::numeric_limits<Integer>::max())
346 ARCANE_ASSERT(
face2.type()==IT_Line2,(
"The cell is not a line"));
414 std::multiset<Integer>::const_iterator i =
node_list.begin();
420 ARCANE_FATAL(
"Unexpected number of nodes on the common face !");
465 return m_cell2_edge_face_list[i];
483 m_cell2_edge_face_list,
488 (
"Incompatible number of 2D faces to merge !"));
536 return m_cell2_edge_face_list[i];
555 (
"Incompatible number of faces to merge !"));
618 std::multiset<Integer>::const_iterator i =
node_list.begin();
627 ARCANE_FATAL(
"Unexpected number of nodes on the common face !");
702 for (LocalIDToLocalNumber::const_iterator
726 (
"Incorrect number of shared vertices"));
731 for (Integer
j=0;
j<2; ++
j) {
749 ARCANE_ASSERT(
face2.type()==IT_Quad4,(
"The cell is not a quadrangle"));
753 (
"Incorrect number of exchange vertices"));
756 for (Integer i = 0; i<2; ++i) {
833 for (LocalIDToLocalNumber::const_iterator
856 (
"Bad number of shared vertices"));
861 for (Integer
j=0;
j<2; ++
j) {
877 ARCANE_ASSERT(
cell2.type()==IT_Quad4,(
"Cell2 is not a IT_Quad4"));
910= { {1,3},{0,2},{1,3},{0,2} };
976 for (LocalIDToLocalNumber::const_iterator
1001 (
"Bad number of shared vertices"));
1010 for (Integer
j=0;
j<3; ++
j) {
1028 ARCANE_ASSERT(
cell2.type() == IT_Hexaedron8,(
"Cell2 is not a IT_Hexaedron8"));
1062m_hexa_node_neighbors[8][3] = { {1,3,4},{0,2,5},{1,3,6},{0,2,7},{0,5,7},{1,4,6},{2,5,7},{3,4,6} };
1071 case Hexahedron:
return "hexahèdre";
1072 case Pyramid:
return "pyramide";
1073 case Pentahedron:
return "pentahèdre";
1074 case Quadrilateral:
return "quadrangle";
1075 case Triangle:
return "triangle";
1076 default:
return "inconnu";
1087 case IT_Hexaedron8: {
1093 case IT_Pentaedron6: {
1097 return Quadrilateral;
1099 case IT_Triangle3: {
1103 return NotMergeable;
1115 case 1:
return Hexahedron;
1116 case 2:
return Pyramid;
1117 case 3:
return Pentahedron;
1118 case 100:
return Quadrilateral;
1119 case 110:
return Triangle;
1150 case NotMergeable: {
1154 ARCANE_FATAL(
"Merge for this kind of cell not implemented\n");
1180 case Quadrilateral: {
1190 case NotMergeable: {
1194 ARCANE_FATAL(
"Merge for this kind of cell not implemented\n");
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Tableau d'items de types quelconques.
Face face(Int32 i) const
i-ème face de la maille
Int32 nbFace() const
Nombre de faces de la maille.
ARCANE_DEPRECATED_260 void checkAndChangeOrientation(ItemInternal *face)
virtual void replaceNode(ItemLocalId item_lid, Integer index, ItemLocalId new_node_lid)=0
Remplace un noeud d'une entité.
virtual void findAndReplaceCell(ItemLocalId item_lid, ItemLocalId old_cell_lid, ItemLocalId new_cell_lid)=0
Remplace une maille d'une entité.
virtual void findAndReplaceFace(ItemLocalId item_lid, ItemLocalId old_face_lid, ItemLocalId new_face_lid)=0
Remplace une face d'une entité.
virtual void replaceFace(ItemLocalId item_lid, Integer index, ItemLocalId new_face_lid)=0
Remplace une face d'une entité.
virtual ITraceMng * traceMng()=0
Gestionnaire de message associé
virtual IItemFamily * nodeFamily()=0
Retourne la famille des noeuds.
virtual IItemFamily * faceFamily()=0
Retourne la famille des faces.
virtual IItemFamily * cellFamily()=0
Retourne la famille des mailles.
Structure interne d'une entité de maillage.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
_Type _getCellType(const Integer &internal_cell_type) const
Détermine le _Type de la maille en fonction de son type "ItemInternal".
String _typeName(const _Type &t) const
Retourne le nom associé à type de maille.
void merge(Cell i_cell_1, Cell i_cell_2)
Effectue la fusion des deux mailles i_cell_1 et i_cell_2.
ItemInternal * getItemInternal(ItemInternal *i_cell_1, ItemInternal *i_cell_2)
Retourne l'ItemInteral utilisé par la maille après fusion.
_Type _promoteType(const _Type &t1, const _Type &t2) const
Cell getCell(Cell i_cell_1, Cell i_cell_2)
Retourne la maille utilisé par la maille après fusion.
Cette fonction-classe a pour but de fusionner deux mailles dont la deuxième est forcément un hexahèdr...
void _setCellsNodeNumbers(Cell cell1, Cell cell2)
static const Integer m_hexa_node_neighbors[8][3]
IntegerUniqueArray m_cell_2_exchanged_node_numbers
IntegerUniqueArray m_cell_1_common_node_numbers
IntegerUniqueArray m_cell_2_common_node_numbers
CellToHexahedronMerger(ItemSwapperUtils *swap_utils, Cell cell1, Cell cell2)
static const Integer m_quad_node_neighbors[4][2]
Liste des noeuds voisins par arête dans un quadrangle.
void _setCellsNodeNumbers(Cell i_cell_1, Cell i_cell_2)
IntegerUniqueArray m_cell_2_exchanged_node_numbers
Numéros dans la maille 2 des sommets qui définiront la maille fusionnée.
IntegerUniqueArray m_cell_2_common_node_numbers
Numéros dans la maille 2 des sommets communs avec la maille 1.
CellToQuadrilateralMerger(ItemSwapperUtils *swap_utils, Cell cell1, Cell cell2)
IntegerUniqueArray m_cell_1_common_node_numbers
Numéros dans la maille 1 des sommets communs avec la maille 2.
Recherche la face commune à deux mailles.
Integer m_cell_2_local_number
Numéro de la face commune dans la maille 2.
Integer cell2LocalNumber() const
Integer m_cell_1_local_number
Numéro de la face commune dans la maille 1.
CommonFaceFinder(Cell i_cell_1, Cell i_cell_2)
const NodesLIDSet & nodesLID() const
Ensemble des localId des sommets en communs.
Integer cell1LocalNumber() const
Cett fonction-classe a pour but de fusionner deux faces dont la deuxième est forcément un quadrangle.
IntegerUniqueArray m_face_2_exchanged_node_numbers
IntegerUniqueArray m_face_2_common_node_numbers
bool _setFacesNodeNumbers(Face i_face_1, Face i_face_2)
static const Integer m_quad_node_neighbors[4][2]
IntegerUniqueArray m_face_1_common_node_numbers
FaceToQuadrilateralMerger(ItemSwapperUtils *swap_utils, Face face1, Face face2)
Fusionne deux faces en 2D (en fait deux arêtes).
Integer m_face_2_exchanged_node_numbers
Integer m_face_2_common_node_numbers
Integer m_face_1_common_node_numbers
void _setFacesNodeNumbers(Face i_face_1, Face i_face_2)
Faces2DMerger(ItemSwapperUtils *swap_utils, Face i_face_1, Face i_face_2)
En dimension 2, recherche des faces communes à deux mailles (Les faces sont en fait des arêtes).
Integer cell1FaceNumber(Integer i) const
Integer cell2FaceNumber(Integer i) const
Integer getNumber() const
IntegerUniqueArray m_cell1_edge_face_list
void _setEdgeFaceList(Cell i_cell, IntegerArray &edge_face_list, Integer common_face_number, const CommonFaceFinder::NodesLIDSet &common_face_nodes)
Faces2DToMergeFinder(Cell cell1, Cell cell2, const CommonFaceFinder &common_face)
Cette fonction-classe recherche les faces à fusionner lors de la fusion de deux mailles.
Integer cell1FaceNumber(Integer i) const
Integer cell2FaceNumber(Integer i) const
Integer getNumber() const
IntegerUniqueArray m_cell1_edge_face_list
void _setEdgeFaceList(Cell i_cell, IntegerArray &edge_face_list, Integer common_face_number, const CommonFaceFinder::NodesLIDSet &common_face_nodes)
FacesToMergeFinder(Cell cell1, Cell cell2, const CommonFaceFinder &common_face)
Classe utilitaire pour échanger des entités entre deux entités.
void swapFaceNodes(Face face_1, Face face_2, Integer face1_node_idx, Integer face2_node_idx)
Échange deux noeuds entre deux faces.
void swapCellFaces(Cell cell1, Cell cell2, Integer cell1_face_idx, Integer cell2_face_idx)
Échange deux faces entre deux mailles.
void swapCellNodes(Cell cell1, Cell cell2, Integer cell1_node_idx, Integer cell2_node_idx)
Échange deux noeuds entre deux mailles.
Integer size() const
Nombre d'éléments du vecteur.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Chaîne de caractères unicode.
Classe d'accès aux traces.
Vecteur 1D de données avec sémantique par valeur (style STL).
Integer toInteger(Real r)
Converti un Int64 en un Integer.