14#include "arcane/utils/ScopedPtr.h"
15#include "arcane/utils/ValueChecker.h"
17#include "arcane/mesh/DynamicMesh.h"
18#include "arcane/mesh/ItemGroupsSynchronize.h"
19#include "arcane/mesh/FaceReorienter.h"
20#include "arcane/mesh/DynamicMeshChecker.h"
23#include "arcane/core/Properties.h"
24#include "arcane/core/ItemPrinter.h"
25#include "arcane/core/TemporaryVariableBuildInfo.h"
26#include "arcane/core/IXmlDocumentHolder.h"
27#include "arcane/core/XmlNodeList.h"
28#include "arcane/core/IIOMng.h"
29#include "arcane/core/IParallelMng.h"
30#include "arcane/core/IParallelReplication.h"
31#include "arcane/core/VariableCollection.h"
45DynamicMeshChecker(IMesh* mesh)
46: TraceAccessor(mesh->traceMng())
59 delete m_var_cells_faces;
60 delete m_var_cells_nodes;
73void DynamicMeshChecker::
76 info(4) <<
"Check mesh coherence.";
77 checkValidConnectivity();
82 if (family->
itemKind()>=NB_ITEM_KIND)
86 mesh_utils::checkMeshProperties(m_mesh,
false,
false,
true);
95 if (!m_var_cells_faces)
98 if (!m_var_cells_nodes)
118 for( Integer z=0; z<
nb_face; ++z )
119 (*m_var_cells_faces)[cell][z] = cell.
face(z).
uniqueId().asInt64();
121 for( Integer z=0; z<
nb_node; ++z )
122 (*m_var_cells_nodes)[cell][z] = cell.
node(z).
uniqueId().asInt64();
125 checkValidMeshFull();
131void DynamicMeshChecker::
134 String func_name(
"DynamicMesh::checkValidMeshFull");
135 info() << func_name <<
" on " << m_mesh->name();
138 debug() <<
" VAR_FACE GROUP=" <<
var_faces.variable()->itemFamily()
139 <<
" NAME=" <<
var_faces.itemGroup().name()
140 <<
" FAMILY_NAME=" <<
var_faces.variable()->itemFamilyName()
141 <<
" GROUP_NAME=" <<
var_faces.variable()->itemGroupName();
145 Int64 uid =
c.null() ? NULL_ITEM_UNIQUE_ID :
c.uniqueId();
152 Int64 uid =
c.null() ? NULL_ITEM_UNIQUE_ID :
c.uniqueId();
154 error() << func_name <<
" bad back cell in face uid=" << face.
uniqueId();
162 Int64 uid =
c.null() ? NULL_ITEM_UNIQUE_ID :
c.uniqueId();
169 Int64 uid =
c.null() ? NULL_ITEM_UNIQUE_ID :
c.uniqueId();
171 error() << func_name <<
" bad front cell in face uid=" << face.
uniqueId();
178 Integer cell_type = cell.
type();
179 if (cell_type == IT_Line2) {
180 error() << func_name <<
" bad cell type in face uid=" << cell.
uniqueId();
187 Integer face_type = face.
type();
188 if (face_type == IT_Vertex) {
189 error() << func_name <<
" bad face type in face uid=" << face.
uniqueId();
212void DynamicMeshChecker::
213checkValidConnectivity()
215 String func_name =
"MeshChecker::checkValidConnectivity";
216 debug() << func_name <<
" check";
225 if (!m_mesh->parentMesh()){
250 ARCANE_FATAL(
"Node uid={0} is connected to the cell uid={1} but the cell"
259 if(!m_mesh->isAmrActivated()){
273 ARCANE_FATAL(
"Edge uid={0} is connected to the cell uid={1} but the cell"
283 if(!m_mesh->isAmrActivated()){
293 ARCANE_FATAL(
"Face uid={0} is connected to the cell uid={1} but the cell"
309 <<
" but the cell (level "<< cell.level()<<
")"
310 <<
" is not connected to the face.";
321 ARCANE_FATAL(
"Bad face face.backCell()!=face.cell(0) face={0} back_cell={1} from_cell={2} cell0={3}",
325 _checkFacesOrientation();
327 if (m_mesh->parentMesh()){
336 error() <<
"Mesh " << m_mesh->name() <<
" : Family " << kind <<
" does not exist in mesh";
344 error() <<
"Mesh " << m_mesh->name() <<
" : Inconsistent suppresssed parent item uid : "
349 error() <<
"Mesh " << m_mesh->name() <<
" : Inconsistent item/parent item uid : " <<
ItemPrinter(item);
356 ARCANE_FATAL(
"Mesh name={0} has {1} (see above)",m_mesh->name(),String::plural(
nerror,
"error"));
372 ARCANE_FATAL(
"Mesh name={0} has parent group consistency {1}\n"
373 "This usually means that parent group was not symmetrically built",
374 m_mesh->name(),String::plural(
nerror,
"error",
false));
377 _checkValidItemOwner(m_mesh->nodeFamily());
378 _checkValidItemOwner(m_mesh->edgeFamily());
379 _checkValidItemOwner(m_mesh->faceFamily());
380 _checkValidItemOwner(m_mesh->cellFamily());
386void DynamicMeshChecker::
387updateAMRFaceOrientation()
389 String func_name =
"MeshChecker::updateAMRFaceOrientation";
400 ARCANE_FATAL(
"Bad face face.backCell()!=face.cell(0) face={0} back_cell={1} from_cell={2} cell0={3}",
404 fr.checkAndChangeOrientationAMR(face);
411void DynamicMeshChecker::
412updateAMRFaceOrientation(ArrayView<Int64> ghost_cell_to_refine)
414 ItemInternalList cells = m_mesh->itemsInternal(IK_Cell) ;
415 UniqueArray<Integer> lids(ghost_cell_to_refine.size()) ;
416 m_mesh->cellFamily()->itemsUniqueIdToLocalId(lids,ghost_cell_to_refine,
true) ;
417 FaceReorienter fr(m_mesh);
418 std::set<Int64> set ;
419 typedef std::pair<std::set<Int64>::iterator,
bool> return_type ;
420 for(Integer i=0, n=lids.size();i<n;++i){
421 Cell icell = cells[lids[i]] ;
422 for( Integer ic=0, nchild=icell.nbHChildren();ic<nchild;++ic){
423 Cell child = icell.hChild(ic) ;
424 for( Face face : child.faces() ){
425 return_type value = set.insert(face.
uniqueId());
427 fr.checkAndChangeOrientationAMR(face);
439void DynamicMeshChecker::
440_checkFacesOrientation()
442 bool is_1d = (m_mesh->dimension()==1);
447 String func_name =
"MeshChecker::_checkFacesOrientation";
480 ARCANE_FATAL(
"Incoherent number of node for 'face' and 'localFace'"
481 " cell={0} face={1} nb_local_node={2} nb_face_node={3}",
485 if (
cell_face.node(z).uniqueId()!=m_work_face_sorted_nodes[z])
486 ARCANE_FATAL(
"Bad unique id for face: cell={0} face={1} cell_node_uid={2} face_node_uid={3}",
494 ARCANE_FATAL(
"Bad orientation for face. Should be front cell: cell={0} face={1} front_cell={2}",
497 ARCANE_FATAL(
"Bad orientation for face. Should be front cell (no front cell) cell={0} face={1}",
505 ARCANE_FATAL(
"Bad orientation for face. Should be back cell: cell={0} face={1} front_cell={2}",
508 ARCANE_FATAL(
"Bad orientation for face. Should be back cell (no back cell) cell={0} face={1}",
519void DynamicMeshChecker::
531 if (!m_mesh->parentMesh()){
539 Int32 owner = item.
owner();
544 for(
Item cell : cells ){
545 if (cell.owner()==owner){
553 ostr() <<
" nb_cell=" << cells.
size();
554 for( Item cell : cells ){
555 ostr() <<
" SubCell i=" << index <<
" cell=" << ItemPrinter(cell);
558 error() <<
"Mesh " << m_mesh->name() <<
" family=" << family->
name()
559 <<
" Item" << ItemPrinter(item) <<
" has no cell with same owner:"
568 Item parent_item = item.
parent();
569 if (parent_item.owner() != item.owner()) {
570 error() <<
"Mesh " << m_mesh->name() <<
" : Inconsistent item/parent item owner : "
571 << ItemPrinter(item) <<
" / " << ItemPrinter(parent_item);
579 String::plural(nerror,
"owner error"));
585void DynamicMeshChecker::
586checkVariablesSynchronization()
592 switch (
var->itemKind()){
612void DynamicMeshChecker::
613checkItemGroupsSynchronization()
640void DynamicMeshChecker::
643 pwarning() <<
"CHECK GHOST CELLS";
644 Integer
sid = m_mesh->meshPartInfo().partRank();
658 info() <<
"WARNING: Cell " <<
ItemPrinter(cell) <<
" should not be a ghost cell";
665void DynamicMeshChecker::
666checkMeshFromReferenceFile()
668 if (!m_compare_reference_file)
676 debug() <<
"Testing the mesh against the initial mesh";
685 mesh_utils::checkMeshConnectivity(m_mesh,
doc_node,
true);
688 warning() <<
"Can't test the subdomain coherence "
689 <<
"against the initial mesh";
696void DynamicMeshChecker::
697checkValidReplication()
699 info() <<
"Checking valid replication";
702 if (!
pr->hasReplication())
748 String message = String::format(
"Bad unique ids for family '{0}'",
758void DynamicMeshChecker::
#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 nbFace() const
Nombre de faces de la maille.
CellConnectedListViewType cells() const
Liste des mailles de l'arête.
Cette fonction/classe réoriente les faces.
Cell frontCell() const
Maille devant la face (maille nulle si aucune)
Cell cell(Int32 i) const
i-ème maille de la face
Int32 nbCell() const
Nombre de mailles de la face (1 ou 2)
CellConnectedListViewType cells() const
Liste des mailles de la face.
Cell backCell() const
Maille derrière la face (maille nulle si aucune)
Interface du gestionnaire des entrées sorties.
Interface d'une famille d'entités.
virtual ItemGroup allItems() const =0
Groupe de toutes les entités.
virtual void checkValid()=0
Vérification de la validité des structures internes (interne)
virtual String name() const =0
Nom de la famille.
virtual IItemFamily * parentFamily() const =0
IItemFamily parent.
virtual eItemKind itemKind() const =0
Genre des entités.
virtual void checkValidConnectivity()=0
Vérification de la validité des structures internes concernant la connectivité.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual IIOMng * ioMng() const =0
Gestionnaire des entrées/sorties.
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
Informations sur la réplication des sous-domaines en parallèle.
Interface d'une variable.
Groupe d'entités de maillage.
Integer size() const
Nombre d'éléments du groupe.
Informations pour synchroniser les groupes entre sous-domaines.
Classe utilitaire pour imprimer les infos sur une entité.
Informations locales sur une face d'une maille.
Infos sur un type d'entité du maillage.
LocalFace localFace(Integer id) const
Connectivité locale de la i-ème face de la maille.
Integer nbLocalFace() const
Nombre de faces de l'entité
Vue sur un vecteur d'entités.
Int32 size() const
Nombre d'éléments du vecteur.
Node node(Int32 i) const
i-ème noeud de l'entité
NodeConnectedListViewType nodes() const
Liste des noeuds de l'entité
Int32 nbNode() const
Nombre de noeuds de l'entité
Classe de base d'un élément de maillage.
const ItemTypeInfo * typeInfo() const
Infos sur le type de l'entité.
bool isOwn() const
true si l'entité est appartient au sous-domaine
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Item parent(Int32 i) const
i-ème parent pour les sous-maillages
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.
CellConnectedListViewType cells() const
Liste des mailles du noeud.
Paramètres nécessaires à la construction d'une variable temporaire.
Vérification de la validité de certaines valeurs.
Paramètres nécessaires à la construction d'une variable.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
bool arcaneIsCheck()
Vrai si on est en mode vérification.
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_Unknown
Entité de maillage de genre inconnu ou non initialisé
@ 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.