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"
22#include "arcane/MeshUtils.h"
23#include "arcane/ItemPrinter.h"
24#include "arcane/TemporaryVariableBuildInfo.h"
25#include "arcane/IXmlDocumentHolder.h"
26#include "arcane/XmlNodeList.h"
27#include "arcane/IIOMng.h"
28#include "arcane/IParallelMng.h"
29#include "arcane/IParallelReplication.h"
30#include "arcane/VariableCollection.h"
44DynamicMeshChecker(IMesh* mesh)
45: TraceAccessor(mesh->traceMng())
50, m_compare_reference_file(false)
62 delete m_var_cells_faces;
63 delete m_var_cells_nodes;
76void DynamicMeshChecker::
79 info(4) <<
"Check mesh coherence.";
80 checkValidConnectivity();
85 if (family->
itemKind()>=NB_ITEM_KIND)
89 mesh_utils::checkMeshProperties(m_mesh,
false,
false,
true);
98 if (!m_var_cells_faces)
101 if (!m_var_cells_nodes)
121 for( Integer z=0; z<
nb_face; ++z )
122 (*m_var_cells_faces)[cell][z] = cell.
face(z).
uniqueId().asInt64();
124 for( Integer z=0; z<
nb_node; ++z )
125 (*m_var_cells_nodes)[cell][z] = cell.
node(z).
uniqueId().asInt64();
128 checkValidMeshFull();
134void DynamicMeshChecker::
137 String func_name(
"DynamicMesh::checkValidMeshFull");
138 info() << func_name <<
" on " << m_mesh->name();
141 debug() <<
" VAR_FACE GROUP=" <<
var_faces.variable()->itemFamily()
142 <<
" NAME=" <<
var_faces.itemGroup().name()
143 <<
" FAMILY_NAME=" <<
var_faces.variable()->itemFamilyName()
144 <<
" GROUP_NAME=" <<
var_faces.variable()->itemGroupName();
148 Int64 uid =
c.null() ? NULL_ITEM_UNIQUE_ID :
c.uniqueId();
155 Int64 uid =
c.null() ? NULL_ITEM_UNIQUE_ID :
c.uniqueId();
157 error() << func_name <<
" bad back cell in face uid=" << face.
uniqueId();
165 Int64 uid =
c.null() ? NULL_ITEM_UNIQUE_ID :
c.uniqueId();
172 Int64 uid =
c.null() ? NULL_ITEM_UNIQUE_ID :
c.uniqueId();
174 error() << func_name <<
" bad front cell in face uid=" << face.
uniqueId();
183 error() << func_name <<
" bad cell type in face uid=" << cell.
uniqueId();
192 error() << func_name <<
" bad face type in face uid=" << face.
uniqueId();
215void DynamicMeshChecker::
216checkValidConnectivity()
218 String func_name =
"DynamicMesh::checkValidConnectivity";
219 debug() << func_name <<
" check";
228 if (!m_mesh->parentMesh()){
253 ARCANE_FATAL(
"Node uid={0} is connected to the cell uid={1} but the cell"
262 if(!m_mesh->isAmrActivated()){
276 ARCANE_FATAL(
"Edge uid={0} is connected to the cell uid={1} but the cell"
286 if(!m_mesh->isAmrActivated()){
296 ARCANE_FATAL(
"Face uid={0} is connected to the cell uid={1} but the cell"
312 <<
" but the cell (level "<< cell.level()<<
")"
313 <<
" is not connected to the face.";
324 ARCANE_FATAL(
"Bad face face.backCell()!=face.cell(0) face={0} back_cell={1} from_cell={2} cell0={3}",
328 _checkFacesOrientation();
330 if (m_mesh->parentMesh()){
339 error() <<
"Mesh " << m_mesh->name() <<
" : Family " << kind <<
" does not exist in mesh";
347 error() <<
"Mesh " << m_mesh->name() <<
" : Inconsistent suppresssed parent item uid : "
352 error() <<
"Mesh " << m_mesh->name() <<
" : Inconsistent item/parent item uid : " <<
ItemPrinter(item);
359 ARCANE_FATAL(
"Mesh name={0} has {1} (see above)",m_mesh->name(),String::plural(
nerror,
"error"));
375 ARCANE_FATAL(
"Mesh name={0} has parent group consistency {1}\n"
376 "This usually means that parent group was not symmetrically built",
377 m_mesh->name(),String::plural(
nerror,
"error",
false));
380 _checkValidItemOwner(m_mesh->nodeFamily());
381 _checkValidItemOwner(m_mesh->edgeFamily());
382 _checkValidItemOwner(m_mesh->faceFamily());
383 _checkValidItemOwner(m_mesh->cellFamily());
389void DynamicMeshChecker::
390updateAMRFaceOrientation()
392 String func_name =
"DynamicMesh::updateAMRFaceOrientation";
403 ARCANE_FATAL(
"Bad face face.backCell()!=face.cell(0) face={0} back_cell={1} from_cell={2} cell0={3}",
407 fr.checkAndChangeOrientationAMR(face);
414void DynamicMeshChecker::
415updateAMRFaceOrientation(ArrayView<Int64> ghost_cell_to_refine)
418 UniqueArray<Integer> lids(ghost_cell_to_refine.size()) ;
419 m_mesh->cellFamily()->itemsUniqueIdToLocalId(lids,ghost_cell_to_refine,
true) ;
420 FaceReorienter fr(m_mesh);
421 std::set<Int64> set ;
422 typedef std::pair<std::set<Int64>::iterator,
bool> return_type ;
423 for(Integer i=0, n=lids.size();i<n;++i){
424 Cell icell = cells[lids[i]] ;
425 for( Integer ic=0, nchild=icell.nbHChildren();ic<nchild;++ic){
426 Cell child = icell.hChild(ic) ;
427 for( Face face : child.faces() ){
428 return_type value = set.insert(face.
uniqueId());
430 fr.checkAndChangeOrientationAMR(face);
442void DynamicMeshChecker::
443_checkFacesOrientation()
445 bool is_1d = (m_mesh->dimension()==1);
450 String func_name =
"DynamicMesh::_checkFacesOrientation";
483 ARCANE_FATAL(
"Incoherent number of node for 'face' and 'localFace'"
484 " cell={0} face={1} nb_local_node={2} nb_face_node={3}",
488 if (
cell_face.node(z).uniqueId()!=m_work_face_sorted_nodes[z])
489 ARCANE_FATAL(
"Bad unique id for face: cell={0} face={1} cell_node_uid={2} face_node_uid={3}",
497 ARCANE_FATAL(
"Bad orientation for face. Should be front cell: cell={0} face={1} front_cell={2}",
500 ARCANE_FATAL(
"Bad orientation for face. Should be front cell (no front cell) cell={0} face={1}",
508 ARCANE_FATAL(
"Bad orientation for face. Should be back cell: cell={0} face={1} front_cell={2}",
511 ARCANE_FATAL(
"Bad orientation for face. Should be back cell (no back cell) cell={0} face={1}",
522void DynamicMeshChecker::
525 String func_name =
"DynamicMesh::_checkValidItemOwner";
532 if (!m_mesh->parentMesh()){
540 Int32 owner = item.
owner();
543 for(
Item cell : cells ){
544 if (cell.owner()==owner){
552 for( Item cell : cells ){
553 ostr() <<
" SubCell i=" << index <<
" cell=" << ItemPrinter(cell);
556 error() <<
"Mesh " << m_mesh->name() <<
" Item" << ItemPrinter(item) <<
" has no cell with same owner:"
565 Item parent_item = item.
parent();
566 if (parent_item.owner() != item.owner()) {
567 error() <<
"Mesh " << m_mesh->name() <<
" : Inconsistent item/parent item owner : "
568 << ItemPrinter(item) <<
" / " << ItemPrinter(parent_item);
576 String::plural(nerror,
"owner error"));
582void DynamicMeshChecker::
583checkVariablesSynchronization()
589 switch (
var->itemKind()){
609void DynamicMeshChecker::
610checkItemGroupsSynchronization()
637void DynamicMeshChecker::
640 pwarning() <<
"CHECK GHOST CELLS";
641 Integer
sid = m_mesh->meshPartInfo().partRank();
655 info() <<
"WARNING: Cell " <<
ItemPrinter(cell) <<
" should not be a ghost cell";
662void DynamicMeshChecker::
663checkMeshFromReferenceFile()
665 if (!m_compare_reference_file)
673 debug() <<
"Testing the mesh against the initial mesh";
682 mesh_utils::checkMeshConnectivity(m_mesh,
doc_node,
true);
685 warning() <<
"Can't test the subdomain coherence "
686 <<
"against the initial mesh";
693void DynamicMeshChecker::
694checkValidReplication()
696 info() <<
"Checking valid replication";
699 if (!
pr->hasReplication())
745 String message = String::format(
"Bad unique ids for family '{0}'",
755void DynamicMeshChecker::
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
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.
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.
ConstArrayView< ItemInternal * > ItemInternalList
Type de la liste interne des entités.
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.
Int32 Integer
Type représentant un entier.