Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
MeshMaterialSynchronizer.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* MeshMaterialSynchronizer.cc (C) 2000-2024 */
9/* */
10/* Synchronisation des entités des matériaux. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/materials/internal/MeshMaterialSynchronizer.h"
15
16#include "arcane/VariableTypes.h"
17#include "arcane/IParallelMng.h"
18#include "arcane/ItemPrinter.h"
19#include "arcane/IMesh.h"
20
21#include "arcane/materials/CellToAllEnvCellConverter.h"
22#include "arcane/materials/MatItemEnumerator.h"
23#include "arcane/materials/MeshMaterialModifier.h"
24
25#include "arcane/core/ItemGenericInfoListView.h"
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30namespace Arcane::Materials
31{
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34
35MeshMaterialSynchronizer::
36MeshMaterialSynchronizer(IMeshMaterialMng* material_mng)
37: TraceAccessor(material_mng->traceMng())
38, m_material_mng(material_mng)
39{
40 if (Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_ACC_MAT_SYNCHRONIZER", true)) {
41 m_synchronizer = new AcceleratorMeshMaterialSynchronizerImpl(material_mng);
42 info() << "using ACC material synchronizer";
43 }
44 else {
45 m_synchronizer = new LegacyMeshMaterialSynchronizerImpl(material_mng);
46 info() << "using DEFAULT material synchronizer";
47 }
48}
49
50/*---------------------------------------------------------------------------*/
51/*---------------------------------------------------------------------------*/
52
53MeshMaterialSynchronizer::
54~MeshMaterialSynchronizer()
55{
56 delete m_synchronizer;
57}
58
59/*---------------------------------------------------------------------------*/
60/*---------------------------------------------------------------------------*/
61
62bool MeshMaterialSynchronizer::
63synchronizeMaterialsInCells()
64{
65 return m_synchronizer->synchronizeMaterialsInCells();
66}
67
68/*---------------------------------------------------------------------------*/
69/*---------------------------------------------------------------------------*/
75void MeshMaterialSynchronizer::
76checkMaterialsInCells(Integer max_print)
77{
78 /*
79 Pour cela, on utilise une variable aux mailles et on applique
80 l'algorithme suivant pour chaque matériau:
81 - le sous-domaine propriétaire remplit cette variable
82 avec l'indice du matériau
83 - la variable est synchronisée.
84 - chaque sous-domaine vérifie ensuite pour chaque maille
85 que si la variable a pour valeur l'indice du matériau, alors
86 ce matériau est présent.
87 */
88
89 IMesh* mesh = m_material_mng->mesh();
90 if (!mesh->parallelMng()->isParallel())
91 return;
92 m_material_mng->checkValid();
93 info(4) << "CheckMaterialsInCells";
94 VariableCellInt32 indexes(VariableBuildInfo(mesh,"ArcaneMaterialPresenceIndexes"));
95 _checkComponents(indexes,m_material_mng->materialsAsComponents(),max_print);
96 _checkComponents(indexes,m_material_mng->environmentsAsComponents(),max_print);
97}
98
99/*---------------------------------------------------------------------------*/
100/*---------------------------------------------------------------------------*/
101
102void MeshMaterialSynchronizer::
103_checkComponents(VariableCellInt32& indexes,
105 Integer max_print)
106{
107 IMesh* mesh = m_material_mng->mesh();
108 Integer nb_component = components.size();
109 Integer nb_error = 0;
110
111 info() << "Checking components nb=" << nb_component;
112
114
115 for( Integer i=0; i<nb_component; ++i ){
116 indexes.fill(-1);
117 IMeshComponent* c = components[i];
120 indexes[cc.globalCell()] = i;
121 }
122
123 indexes.synchronize();
124
125 ENUMERATE_ALLENVCELL(iallenvcell,m_material_mng,mesh->allCells()){
127 Cell cell = all_env_cell.globalCell();
128 bool has_sync_mat = (indexes[cell]==i);
129 ComponentCell cc = c->findComponentCell(all_env_cell);
130 bool has_component = !cc.null();
132 ++nb_error;
134 error() << "Bad component synchronisation for i=" << i
135 << " name=" << c->name()
136 << " cell_uid=" << cell.uniqueId()
137 << " sync_mat=" << has_sync_mat
138 << " has_component=" << has_component;
139 }
140 }
141 }
142 if (nb_error!=0)
143 ARCANE_FATAL("Bad synchronisation");
144}
145
146/*---------------------------------------------------------------------------*/
147/*---------------------------------------------------------------------------*/
148
149} // End namespace Arcane::Materials
150
151/*---------------------------------------------------------------------------*/
152/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Maille d'un maillage.
Definition Item.h:1178
virtual CellGroup allCells()=0
Groupe de toutes les mailles.
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Definition Item.h:216
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Maille arcane avec info matériaux et milieux.
Représente un composant d'une maille multi-matériau.
Interface d'un composant (matériau ou milieu) d'un maillage.
Paramètres nécessaires à la construction d'une variable.
#define ENUMERATE_ALLENVCELL(iname,...)
Macro pour itérer sur toutes les mailles AllEnvCell d'un groupe.
#define ENUMERATE_COMPONENTCELL(iname, component)
Macro pour itérer sur toutes les mailles d'un composant.
Active toujours les traces dans les parties Arcane concernant les matériaux.