Arcane  v3.14.10.0
Documentation utilisateur
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/*---------------------------------------------------------------------------*/
70/*!
71 * \brief Vérifie que les mailles des matériaux sont bien cohérentes entre les
72 * sous-domaines.
73 * Cette méthode est collective
74 */
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,
104 ConstArrayView<IMeshComponent*> components,
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
113 CellToAllEnvCellConverter all_env_cell_converter(m_material_mng);
114
115 for( Integer i=0; i<nb_component; ++i ){
116 indexes.fill(-1);
117 IMeshComponent* c = components[i];
118 ENUMERATE_COMPONENTCELL(iccell,c){
119 ComponentCell cc = *iccell;
120 indexes[cc.globalCell()] = i;
121 }
122
123 indexes.synchronize();
124
125 ENUMERATE_ALLENVCELL(iallenvcell,m_material_mng,mesh->allCells()){
126 AllEnvCell all_env_cell = *iallenvcell;
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();
131 if (has_sync_mat!=has_component){
132 ++nb_error;
133 if (max_print<0 || nb_error<max_print)
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.
#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.
MeshVariableScalarRefT< Cell, Int32 > VariableCellInt32
Grandeur au centre des mailles de type entier 32 bits.
Active toujours les traces dans les parties Arcane concernant les matériaux.
Int32 Integer
Type représentant un entier.