Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
MeshMaterialExchangeMng.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 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/* MeshMaterialExchangeMng.cc (C) 2000-2023 */
9/* */
10/* Gestion de l'échange des matériaux entre sous-domaines. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/FunctorUtils.h"
15
16#include "arcane/IItemFamilySerializeStep.h"
17#include "arcane/IMesh.h"
18#include "arcane/IItemFamily.h"
19#include "arcane/IItemFamilyPolicyMng.h"
20#include "arcane/ItemFamilySerializeArgs.h"
21#include "arcane/ISerializer.h"
22
23#include "arcane/materials/MeshMaterialExchangeMng.h"
24#include "arcane/materials/MeshMaterialIndirectModifier.h"
25#include "arcane/materials/IMeshMaterialVariable.h"
26
27#include "arcane/materials/internal/MeshMaterialMng.h"
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
32namespace Arcane::Materials
33{
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
37
39: public TraceAccessor
41{
42 public:
44 : TraceAccessor(family->traceMng()), m_exchange_mng(exchange_mng),
45 m_material_mng(exchange_mng->m_material_mng), m_family(family),
46 m_indirect_modifier(nullptr)
47 {
48 }
50 {
51 info() << "DESTROY SERIALIZE_CELLS_MATERIAL";
52 }
53 public:
54
55 void initialize() override
56 {
57 if (m_exchange_mng->m_is_in_mesh_material_exchange)
58 ARCANE_FATAL("Already in an exchange");
59 m_exchange_mng->m_is_in_mesh_material_exchange = false;
60 // Création du modificateur indirect permettant de remettre à jour les
61 // matériaux après la mise à jour des groupes suite à la suppression
62 // des entités lors de l'échange.
63 // TODO: vérifier si l'utilisation des uniqueId() est nécessaire.
64 m_indirect_modifier = new MeshMaterialIndirectModifier(m_material_mng);
65 m_indirect_modifier->beginUpdate();
66 }
67 void notifyAction(const NotifyActionArgs& args) override
68 {
69 if (args.action()==eAction::AC_BeginReceive){
70 // Avant de désérialiser, met à jour les matériaux car les groupes associés
71 // aux matériaux et milieux ont changé lors de la phase d'échange:
72 // certaines mailles ont été supprimées et d'autres ajoutées.
73 // Normalement après cette phase les matériaux et milieux sont
74 // corrects et les valeurs des variables sont OK pour les mailles
75 // qui étaient présentes dans ce sous-domaine avant l'échange.
76 // Il reste à mettre à jour les valeurs des variables pour
77 // les mailles qui viennent d'être ajoutées. Cela se fait dans
78 // la désérialisation.
79 info() << "NOTIFY_ACTION BEGIN_RECEIVE";
80 m_indirect_modifier->endUpdate();
81 delete m_indirect_modifier;
82 m_indirect_modifier = nullptr;
83 }
84 if (args.action()==eAction::AC_EndReceive){
85 info() << "NOTIFY_ACTION END_RECEIVE";
86 // Maintenant que les valeurs sont bonnes pour les variables, on doit
87 // les sauvegarder car une fois les réceptions terminées il va y avoir
88 // un compactage et pour l'instant cela peut poser des problèmes
89 // car la mise à jour des groupes via les observers n'est pas traitée.
90 // Du coup on remettra tout à jour lors du finalize();
91 m_indirect_modifier = new MeshMaterialIndirectModifier(m_material_mng);
92 m_indirect_modifier->beginUpdate();
93 }
94 }
95 void serialize(const ItemFamilySerializeArgs& args) override
96 {
97 info() << "SERIALIZE_CELLS_MATERIAL rank=" << args.rank()
98 << " n=" << args.localIds().size();
99 ISerializer* sbuf = args.serializer();
100
101 // Sérialise chaque variable
103 info() << "SERIALIZE_MESH_MATERIAL_VARIABLE name=" << mv->name();
104 mv->serialize(sbuf,args.localIds());
105 };
106 functor::apply(m_material_mng,&MeshMaterialMng::visitVariables,serialize_variables_func);
107 }
108 void finalize() override
109 {
110 // Reconstruit toutes les informations sur les groupes avec les bonnes valeurs
111 // des variables.
112 m_indirect_modifier->endUpdate();
113 delete m_indirect_modifier;
114 m_indirect_modifier = nullptr;
115 m_exchange_mng->m_is_in_mesh_material_exchange = false;
116 }
117 ePhase phase() const override { return IItemFamilySerializeStep::PH_Variable; }
118 IItemFamily* family() const override { return m_family; }
119 public:
120 MeshMaterialExchangeMng* m_exchange_mng;
121 MeshMaterialMng* m_material_mng;
122 IItemFamily* m_family;
123 MeshMaterialIndirectModifier* m_indirect_modifier;
124};
125
126/*---------------------------------------------------------------------------*/
127/*---------------------------------------------------------------------------*/
128
131{
132 public:
134 : m_exchange_mng(exchange_mng){}
135 public:
137 {
138 // Ne construit une instance que si on souhaite conserver les valeurs
139 // des milieux et matériaux, sinon il n'y a rien à faire. Le code
140 // utilisateur devra alors appeler IMeshMaterialMng::forceRecompute()
141 // pour mettre à jour les informations des matériaux.
142 if (m_exchange_mng->materialMng()->isKeepValuesAfterChange())
143 return new ExchangeCellStep(m_exchange_mng,family);
144 return nullptr;
145 }
146 public:
147 MeshMaterialExchangeMng* m_exchange_mng;
148};
149
150/*---------------------------------------------------------------------------*/
151/*---------------------------------------------------------------------------*/
152
153MeshMaterialExchangeMng::
154MeshMaterialExchangeMng(MeshMaterialMng* material_mng)
155: TraceAccessor(material_mng->traceMng())
156, m_material_mng(material_mng)
157, m_serialize_cells_factory(nullptr)
158, m_is_in_mesh_material_exchange(false)
159{
160}
161
162/*---------------------------------------------------------------------------*/
163/*---------------------------------------------------------------------------*/
164
165MeshMaterialExchangeMng::
166~MeshMaterialExchangeMng()
167{
168 if (m_serialize_cells_factory){
169 IItemFamily* cell_family = m_material_mng->mesh()->cellFamily();
170 cell_family->policyMng()->removeSerializeStep(m_serialize_cells_factory);
171 delete m_serialize_cells_factory;
172 }
173}
174
175/*---------------------------------------------------------------------------*/
176/*---------------------------------------------------------------------------*/
177
178/*---------------------------------------------------------------------------*/
179/*---------------------------------------------------------------------------*/
180
181void MeshMaterialExchangeMng::
182build()
183{
184}
185
186/*---------------------------------------------------------------------------*/
187/*---------------------------------------------------------------------------*/
194void MeshMaterialExchangeMng::
195registerFactory()
196{
197 if (m_serialize_cells_factory)
198 ARCANE_FATAL("factory already registered");
199 m_serialize_cells_factory = new ExchangeCellFactory(this);
200 IItemFamily* cell_family = m_material_mng->mesh()->cellFamily();
201 cell_family->policyMng()->addSerializeStep(m_serialize_cells_factory);
202}
203
204/*---------------------------------------------------------------------------*/
205/*---------------------------------------------------------------------------*/
206
207IMeshMaterialMng* MeshMaterialExchangeMng::
208materialMng() const
209{
210 return m_material_mng;
211}
212
213/*---------------------------------------------------------------------------*/
214/*---------------------------------------------------------------------------*/
215
216}
217
218/*---------------------------------------------------------------------------*/
219/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fabrique pour créer une étape de la sérialisation des familles d'entités.
Interface d'une étape de la sérialisation des familles d'entités.
@ AC_BeginReceive
Début de la réception des données.
@ AC_EndReceive
Fin de la réception des données.
Interface d'une famille d'entités.
virtual ITraceMng * traceMng() const =0
Gestionnaire de trace associé
virtual IMesh * mesh() const =0
Maillage associé
Arguments des callbacks de sérialisation des familles d'entités.
Int32 rank() const
Rang de la source ou de la destination.
Int32ConstArrayView localIds() const
Indices locaux des entités. En sérialisation, il s'agit des indices locaux des entités envoyées au ra...
ISerializer * serializer() const
Sérialiseur associé
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
virtual bool isKeepValuesAfterChange() const =0
Indique si les valeurs des variables sont conservées entre les modifications.
Interface d'une variable matériau d'un maillage.
IItemFamilySerializeStep * createStep(IItemFamily *family) override
Créé une étape pour la famille family.
void notifyAction(const NotifyActionArgs &args) override
Notifie l'instance qu'on entre dans une certaine phase de l'échange.
ePhase phase() const override
Phase de la sérialisation où cette instance intervient.
IItemFamily * family() const override
Famille associée.
void serialize(const ItemFamilySerializeArgs &args) override
Sérialise dans/depuis buf.
void finalize() override
Effectue les traitements de fin d'échange.
void initialize() override
Initialise l'instance avant le début des échanges.
Objet permettant de modifier indirectement les matériaux ou les milieux.
void endUpdate()
Met à jour les structures après une modification.
Implémentation d'un gestion des matériaux.
void visitVariables(IFunctorWithArgumentT< IMeshMaterialVariable * > *functor) override
Applique le fonctor functor sur l'ensemble des variables matériaux.
Gestion de l'échange des matériaux entre sous-domaines.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
TraceMessage info() const
Flot pour un message d'information.
Active toujours les traces dans les parties Arcane concernant les matériaux.