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"
21#include "arcane/core/Item.h"
23#include "arcane/core/IItemFamily.h"
24#include "arcane/core/IItemFamilyTopologyModifier.h"
25#include "arcane/core/IMesh.h"
26#include "arcane/core/internal/IItemFamilyInternal.h"
28#include "arcane/mesh/FaceReorienter.h"
49 m_face_reorienter(mesh),
50 m_cell_tm(mesh->
cellFamily()->_internalApi()->topologyModifier()),
51 m_face_tm(mesh->
faceFamily()->_internalApi()->topologyModifier()),
52 m_node_tm(mesh->
nodeFamily()->_internalApi()->topologyModifier())
114 void checkAndChangeFaceOrientation(
Cell cell)
117 for( Integer i=0, n=cell.
nbFace(); i<n; ++i) {
123 FaceReorienter m_face_reorienter;
124 IItemFamilyTopologyModifier* m_cell_tm;
125 IItemFamilyTopologyModifier* m_face_tm;
126 IItemFamilyTopologyModifier* m_node_tm;
141 typedef std::set<Integer> NodesLIDSet;
147 NodesLIDSet m_nodes_lid_set;
157 return m_nodes_lid_set;
198: m_cell_1_local_number(-1)
199, m_cell_2_local_number(-1)
238 m_nodes_lid_set.insert(
i_node->localId());
313 for (LocalIDToLocalNumber::const_iterator
340: m_face_1_common_node_numbers(std::numeric_limits<Integer>::max())
341, m_face_2_common_node_numbers(std::numeric_limits<Integer>::max())
342, m_face_2_exchanged_node_numbers(std::numeric_limits<Integer>::max())
344 ARCANE_ASSERT(
face2.type()==IT_Line2,(
"The cell is not a line"));
412 std::multiset<Integer>::const_iterator i =
node_list.begin();
418 ARCANE_FATAL(
"Unexpected number of nodes on the common face !");
463 return m_cell2_edge_face_list[i];
481 m_cell2_edge_face_list,
486 (
"Incompatible number of 2D faces to merge !"));
534 return m_cell2_edge_face_list[i];
553 (
"Incompatible number of faces to merge !"));
616 std::multiset<Integer>::const_iterator i =
node_list.begin();
625 ARCANE_FATAL(
"Unexpected number of nodes on the common face !");
700 for (LocalIDToLocalNumber::const_iterator
724 (
"Incorrect number of shared vertices"));
729 for (Integer
j=0;
j<2; ++
j) {
747 ARCANE_ASSERT(
face2.type()==IT_Quad4,(
"The cell is not a quadrangle"));
751 (
"Incorrect number of exchange vertices"));
754 for (Integer i = 0; i<2; ++i) {
831 for (LocalIDToLocalNumber::const_iterator
854 (
"Bad number of shared vertices"));
859 for (Integer
j=0;
j<2; ++
j) {
875 ARCANE_ASSERT(
cell2.type()==IT_Quad4,(
"Cell2 is not a IT_Quad4"));
908= { {1,3},{0,2},{1,3},{0,2} };
974 for (LocalIDToLocalNumber::const_iterator
999 (
"Bad number of shared vertices"));
1008 for (Integer
j=0;
j<3; ++
j) {
1026 ARCANE_ASSERT(
cell2.type() == IT_Hexaedron8,(
"Cell2 is not a IT_Hexaedron8"));
1060m_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} };
1069 case Hexahedron:
return "hexahèdre";
1070 case Pyramid:
return "pyramide";
1071 case Pentahedron:
return "pentahèdre";
1072 case Quadrilateral:
return "quadrangle";
1073 case Triangle:
return "triangle";
1074 default:
return "inconnu";
1085 case IT_Hexaedron8: {
1091 case IT_Pentaedron6: {
1095 return Quadrilateral;
1097 case IT_Triangle3: {
1101 return NotMergeable;
1113 case 1:
return Hexahedron;
1114 case 2:
return Pyramid;
1115 case 3:
return Pentahedron;
1116 case 100:
return Quadrilateral;
1117 case 110:
return Triangle;
1148 case NotMergeable: {
1152 ARCANE_FATAL(
"Merge for this kind of cell not implemented\n");
1178 case Quadrilateral: {
1188 case NotMergeable: {
1192 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.