Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
MeshMaterialMng.h
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/* MeshMaterialMng.h (C) 2000-2024 */
9/* */
10/* Implémentation de la modification des matériaux et milieux. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_MATERIALS_INTERNAL_MESHMATERIALMNG_H
13#define ARCANE_MATERIALS_INTERNAL_MESHMATERIALMNG_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/TraceAccessor.h"
18#include "arcane/utils/Array.h"
19#include "arcane/utils/Mutex.h"
20
21#include "arcane/core/MeshHandle.h"
22
23#include "arcane/core/materials/IMeshMaterialMng.h"
25#include "arcane/core/materials/internal/IMeshMaterialMngInternal.h"
26
27#include "arcane/accelerator/core/Runner.h"
28#include "arcane/accelerator/core/RunQueuePool.h"
29
30#include "arcane/materials/MeshBlock.h"
31#include "arcane/materials/AllCellToAllEnvCellConverter.h"
32#include "arcane/materials/internal/MeshMaterial.h"
33#include "arcane/materials/internal/MeshEnvironment.h"
34#include "arcane/materials/internal/MeshMaterialSynchronizer.h"
35
36#include <map>
37#include <memory>
38
39/*---------------------------------------------------------------------------*/
40/*---------------------------------------------------------------------------*/
41
42namespace Arcane
43{
44class IVariableMng;
45class Properties;
46class ObserverPool;
47}
48
49/*---------------------------------------------------------------------------*/
50/*---------------------------------------------------------------------------*/
51
52namespace Arcane::Materials
53{
54
55/*---------------------------------------------------------------------------*/
56/*---------------------------------------------------------------------------*/
61: public TraceAccessor
62, public IMeshMaterialMng
63{
64 public:
65
66 friend class MeshMaterialBackup;
67
68 private:
69
72 {
73 public:
74
75 explicit RunnerInfo(Runner& runner);
76
77 public:
78
79 void initializeAsyncPool(Int32 nb_queue);
80
81 public:
82
83 Runner m_runner;
84 RunQueue m_run_queue;
85 Accelerator::RunQueuePool m_async_queue_pool;
86 };
87
90 {
91 public:
92
94 : m_material_mng(mm)
95 {}
96
97 public:
98
100 {
101 return m_material_mng->getAllCellToAllEnvCell();
102 }
104 {
105 return m_material_mng->createAllCellToAllEnvCell();
106 }
108 {
109 return m_material_mng->_variablesIndexer();
110 }
112 {
113 return m_material_mng->_addVariable(var);
114 }
116 {
117 return m_material_mng->_removeVariable(var);
118 }
120 {
121 return m_material_mng->_modifier();
122 }
132 {
133 return m_material_mng->componentItemSharedInfo(level);
134 }
135 RunQueue& runQueue() const override
136 {
137 return m_material_mng->runQueue();
138 }
140 {
141 return m_material_mng->asyncRunQueuePool();
142 }
143 Real additionalCapacityRatio() const override
144 {
145 return m_material_mng->additionalCapacityRatio();
146 }
148 {
149 return m_material_mng->m_is_use_accelerator_for_constituent_item_vector;
150 }
151
152 private:
153
154 MeshMaterialMng* m_material_mng = nullptr;
155 };
156
157 public:
158
160 ~MeshMaterialMng() override;
161
162 public:
163
164 void build();
165
166 public:
167
168 IMesh* mesh() override { return m_mesh_handle.mesh(); }
170
171 public:
172
175 IMeshBlock* createBlock(const MeshBlockBuildInfo& infos) override;
178
179 void endCreate(bool is_continue) override;
180
181 void setDataInitialisationWithZero(bool v) override { m_is_data_initialisation_with_zero = v; }
182 bool isDataInitialisationWithZero() const override { return m_is_data_initialisation_with_zero; }
183
184 void setKeepValuesAfterChange(bool v) override { m_keep_values_after_change = v; }
185 bool isKeepValuesAfterChange() const override { return m_keep_values_after_change; }
186
187 void setMeshModificationNotified(bool v) override { m_is_mesh_modification_notified = v; }
188 bool isMeshModificationNotified() const override { return m_is_mesh_modification_notified; }
189
190 void setModificationFlags(int v) override;
191 int modificationFlags() const override { return m_modification_flags; }
192
195 {
196 return m_is_allocate_scalar_environment_variable_as_material;
197 }
198
199 void setDataCompressorServiceName(const String& name) override;
200 String dataCompressorServiceName() const override { return m_data_compressor_service_name; }
201
202 String name() const override { return m_name; }
203 ConstArrayView<IMeshMaterial*> materials() const override { return m_materials; }
204 ConstArrayView<IMeshComponent*> materialsAsComponents() const override { return m_materials_as_components; }
205 ConstArrayView<IMeshEnvironment*> environments() const override { return m_environments; }
206 ConstArrayView<IMeshComponent*> environmentsAsComponents() const override { return m_environments_as_components; }
207 ConstArrayView<IMeshComponent*> components() const override { return m_components; }
208 ConstArrayView<IMeshBlock*> blocks() const override { return m_blocks; }
209
210 IMeshEnvironment* findEnvironment(const String& name,bool throw_exception=true) override;
211 IMeshBlock* findBlock(const String& name,bool throw_exception=true) override;
212
214
217
218 void dumpInfos(std::ostream& o) override;
219 void dumpCellInfos(Cell cell,std::ostream& o) override;
220
221 void checkValid() override;
222
223 void forceRecompute() override;
224
225 Mutex* variableLock() override
226 {
227 return &m_variable_lock;
228 }
229
230 bool synchronizeMaterialsInCells() override;
231 void checkMaterialsInCells(Integer max_print) override;
232
233 Int64 timestamp() const override { return m_timestamp; }
234
235 ConstArrayView<MeshEnvironment*> trueEnvironments() const { return m_true_environments; }
236 ConstArrayView<MeshMaterial*> trueMaterials() const { return m_true_materials; }
237 Int32 nbVariable() const { return static_cast<Int32>(m_full_name_variable_map.size()); }
238
239 public:
240
241 AllEnvCellVectorView _view(SmallSpan<const Int32> cells_local_id);
242
244 {
245 return this->_view(cells.view().localIds());
246 }
247
249 {
250 return this->_view(cells.localIds());
251 }
252
257
259
260 void recreateFromDump() override;
261
263
264 void setSynchronizeVariableVersion(Integer version) override
265 {
266 m_synchronize_variable_version = version;
267 }
268
269 Integer synchronizeVariableVersion() const override
270 {
271 return m_synchronize_variable_version;
272 }
273
274 bool isInMeshMaterialExchange() const override;
275
277 {
278 return m_variable_factory_mng;
279 }
280
282 {
283 m_is_use_material_value_when_removing_partial_value = v;
284 }
285 bool isUseMaterialValueWhenRemovingPartialValue() const override
286 {
287 return m_is_use_material_value_when_removing_partial_value;
288 }
289
290 public:
291
292 AllEnvData* allEnvData() { return m_all_env_data.get(); }
293 ComponentItemSharedInfo* componentItemSharedInfo(Int32 level) const;
294 void syncVariablesReferences(bool check_resize);
295
296 void incrementTimestamp() { ++m_timestamp; }
297 void dumpInfos2(std::ostream& o);
298
299 const MeshHandle& meshHandle() const { return m_mesh_handle; }
300
302 {
303 m_is_allcell_2_allenvcell = is_enable;
304 if (force_create)
305 createAllCellToAllEnvCell();
306 }
307 bool isCellToAllEnvCellForRunCommand() const override { return m_is_allcell_2_allenvcell; }
308
309 IMeshMaterialMngInternal* _internalApi() const override { return m_internal_api.get(); }
310
311 public:
312
314 Runner& runner() const { return m_runner_info->m_runner; }
315 RunQueue& runQueue() const { return m_runner_info->m_run_queue; }
316 Accelerator::RunQueuePool& asyncRunQueuePool() const { return m_runner_info->m_async_queue_pool; }
317 Real additionalCapacityRatio() const { return m_additional_capacity_ratio; }
319
320 private:
321
322 AllCellToAllEnvCell* getAllCellToAllEnvCell() const { return m_allcell_2_allenvcell; }
323 void createAllCellToAllEnvCell();
324
325 private:
326
328 using FullNameVariableMap= std::map<String,IMeshMaterialVariable*>;
330 using FullNameVariablePair = FullNameVariableMap::value_type;
331
332 using VariableToMaterialVariableMap = std::map<IVariable*,IMeshMaterialVariable*>;
333 using VariableToMaterialVariablePair = VariableToMaterialVariableMap::value_type;
334
335 private:
336
337 MeshHandle m_mesh_handle;
338 std::unique_ptr<InternalApi> m_internal_api;
339 IVariableMng* m_variable_mng = nullptr;
340 String m_name;
341 bool m_is_end_create = false;
342 bool m_is_verbose = false;
343 bool m_keep_values_after_change = true;
344 bool m_is_data_initialisation_with_zero = false;
345 bool m_is_mesh_modification_notified = false;
346 bool m_is_allocate_scalar_environment_variable_as_material = false;
347 bool m_is_use_material_value_when_removing_partial_value = false;
348 int m_modification_flags = 0;
349 Real m_additional_capacity_ratio = 0.05;
350
351 Mutex m_variable_lock;
352
353 std::unique_ptr<MeshMaterialModifierImpl> m_modifier;
354 UniqueArray<MeshMaterialInfo*> m_materials_info;
355 UniqueArray<IMeshMaterial*> m_materials;
356 UniqueArray<IMeshComponent*> m_materials_as_components;
357 UniqueArray<MeshMaterial*> m_true_materials;
358 UniqueArray<IMeshEnvironment*> m_environments;
359 UniqueArray<IMeshComponent*> m_environments_as_components;
360 UniqueArray<IMeshComponent*> m_components;
361 UniqueArray<MeshEnvironment*> m_true_environments;
363 UniqueArray<MeshBlock*> m_true_blocks;
365 UniqueArray<MeshMaterialVariableIndexer*> m_variables_indexer_to_destroy;
366
367 FullNameVariableMap m_full_name_variable_map;
368 VariableToMaterialVariableMap m_var_to_mat_var_map;
369
370 std::unique_ptr<Properties> m_properties;
371 std::unique_ptr<AllEnvData> m_all_env_data;
372 Int64 m_timestamp = 0;
373 std::unique_ptr<IMeshMaterialVariableSynchronizer> m_all_cells_mat_env_synchronizer;
374 std::unique_ptr<IMeshMaterialVariableSynchronizer> m_all_cells_env_only_synchronizer;
375 Integer m_synchronize_variable_version = 1;
376 std::unique_ptr<MeshMaterialExchangeMng> m_exchange_mng;
377 IMeshMaterialVariableFactoryMng* m_variable_factory_mng = nullptr;
378 std::unique_ptr<ObserverPool> m_observer_pool;
379 String m_data_compressor_service_name;
380 MeshMaterialSynchronizer* m_mms = nullptr;
381
382 std::unique_ptr<RunnerInfo> m_runner_info;
383
390 AllCellToAllEnvCell* m_allcell_2_allenvcell = nullptr;
391 bool m_is_allcell_2_allenvcell = false;
392
393 bool m_is_use_accelerator_for_constituent_item_vector = true;
394
395 private:
396
397 void _endUpdate();
398 IMeshMaterialVariable* _findVariableFullyQualified(const String& name);
399 MeshMaterialInfo* _findMaterialInfo(const String& name);
400 MeshEnvironment* _findEnvironment(const String& name);
401 MeshBlock* _findBlock(const String& name);
403 void _addVariableIndexer(MeshMaterialVariableIndexer* var_idx);
404 void _checkEndCreate();
405 void _addVariableUnlocked(IMeshMaterialVariable* var);
406 void _saveInfosInProperties();
407 void _checkCreateProperties();
408 void _onMeshDestroyed();
409 void _unregisterAllVariables();
410 void _addVariable(IMeshMaterialVariable* var);
411 void _removeVariable(IMeshMaterialVariable* var);
412 MeshMaterialModifierImpl* _modifier();
414 {
415 return m_variables_indexer;
416 }
418 {
419 return m_all_cells_mat_env_synchronizer.get();
420 }
422 {
423 return m_all_cells_env_only_synchronizer.get();
424 }
425 void _dumpStats();
426};
427
428/*---------------------------------------------------------------------------*/
429/*---------------------------------------------------------------------------*/
430
431} // End namespace Arcane::Materials
432
433/*---------------------------------------------------------------------------*/
434/*---------------------------------------------------------------------------*/
435
436#endif
Collection de RunQueue.
File d'exécution pour un accélérateur.
Gestionnaire d'exécution pour accélérateur.
Definition core/Runner.h:53
Maille d'un maillage.
Definition Item.h:1178
Interface du gestionnaire de variables.
Interface d'une variable.
Definition IVariable.h:54
Vue sur un tableau typé d'entités.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Table de connectivité des 'Cell' vers leur(s) 'AllEnvCell' destinée à une utilisation sur accélérateu...
Vue sur une liste de mailles avec infos sur les milieux.
Informations sur les valeurs des milieux.
Definition AllEnvData.h:44
Informations partagées sur les 'ComponentItem'.
Interface d'un bloc d'un maillage.
API interne Arcane de 'IMeshMaterialMng'.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
Interface du gestionnaire de fabrique de variables matériaux.
Interface du synchroniseur de variables matériaux.
Interface d'une variable matériau d'un maillage.
Informations pour la création d'un milieu.
Sauvegarde/restoration des valeurs des matériaux et milieux.
Infos d'un matériau d'un maillage.
bool isUseAcceleratorForConstituentItemVector() const override
Indique si on utilise l'API accélérateur pour positionner les valeurs de ConstituentItemVectorImpl.
Real additionalCapacityRatio() const override
Ratio pour la capacité additionnelle à allouer lors du redimensionnement des variables.
AllCellToAllEnvCell * getAllCellToAllEnvCell() const override
Renvoie la table de "connectivité" CellLocalId -> AllEnvCell destinée à être utilisée dans un RUNCOMM...
ComponentItemSharedInfo * componentItemSharedInfo(Int32 level) const override
MeshMaterialModifierImpl * modifier() override
Implémentation du modificateur.
IMeshMaterialVariableSynchronizer * allCellsEnvOnlySynchronizer() override
Synchronizeur pour les variables uniquement milieux sur toutes les mailles.
void removeVariable(IMeshMaterialVariable *var) override
Supprime la variable var.
void createAllCellToAllEnvCell() override
Construit la table de "connectivité" CellLocalId -> AllEnvCell destinée à être utilisée dans un RUNCO...
void addVariable(IMeshMaterialVariable *var) override
Ajoute la variable var.
RunQueue & runQueue() const override
File d'exécution associée.
Accelerator::RunQueuePool & asyncRunQueuePool() const override
Liste de files asynchrones.
IMeshMaterialVariableSynchronizer * allCellsMatEnvSynchronizer() override
Synchronizeur pour les variables matériaux et milieux sur toutes les mailles.
ConstArrayView< MeshMaterialVariableIndexer * > variablesIndexer() override
Liste des infos pour indexer les variables matériaux.
Informations sur la file d'exécution utilisée.
Implémentation d'un gestion des matériaux.
bool isInMeshMaterialExchange() const override
Vrai si on est en train de faire un échange de maillage avec gestion des matériaux.
void removeEnvironmentToBlock(IMeshBlock *block, IMeshEnvironment *env) override
Supprime un milieu à un bloc existant.
IMeshMaterialVariableFactoryMng * variableFactoryMng() const override
Interface de la fabrique de variables.
String dataCompressorServiceName() const override
virtual Nom du service utilisé pour compresser les données
AllEnvCellVectorView view(const CellGroup &cells) final
Vue sur les mailles milieux correspondant au groupe cells.
Int64 m_timestamp
Compteur du nombre de modifications des matériaux.
void setDataCompressorServiceName(const String &name) override
void visitVariables(IFunctorWithArgumentT< IMeshMaterialVariable * > *functor) override
Applique le fonctor functor sur l'ensemble des variables matériaux.
void endCreate(bool is_continue) override
Indique qu'on a fini de créer les milieux.
IMeshBlock * createBlock(const MeshBlockBuildInfo &infos) override
Créé un bloc.
Integer synchronizeVariableVersion() const override
Version de l'implémentation pour la synchronisation des variables matériaux.
bool isKeepValuesAfterChange() const override
Indique si les valeurs des variables sont conservées entre les modifications.
UniqueArray< AllCellToAllEnvCell > m_all_cell_to_all_env_cell
Contient une instance de AllCellToAllEnvCell.
ITraceMng * traceMng() override
Gestionnaire de traces.
FullNameVariableMap::value_type FullNameVariablePair
Paire de la liste des variables par nom complet.
Int64 timestamp() const override
Compteur du nombre de modifications de la liste des matériaux et des milieux.
IMesh * mesh() override
Maillage associé.
IMeshMaterialVariableSynchronizer * _allCellsEnvOnlySynchronizer() override
Synchronizeur pour les variables uniquement milieux sur toutes les mailles.
CellToAllEnvCellConverter cellToAllEnvCellConverter() override
Créée une instance pour convertir de 'Cell' en 'AllEnvCell'.
void addEnvironmentToBlock(IMeshBlock *block, IMeshEnvironment *env) override
Ajoute un milieu à un bloc existant.
void dumpInfos(std::ostream &o) override
Ecrit les infos des matériaux et milieux sur le flot o.
IMeshMaterialVariableSynchronizer * _allCellsMatEnvSynchronizer() override
Synchronizeur pour les variables matériaux et milieux sur toutes les mailles.
MeshMaterialInfo * registerMaterialInfo(const String &name) override
Enregistre les infos du matériau de nom name.
void setMeshModificationNotified(bool v) override
Indique si les milieux et matériaux suivent les changements de topologie dans le maillage.
ConstArrayView< IMeshComponent * > components() const override
Liste de tous les composants.
void setAllocateScalarEnvironmentVariableAsMaterial(bool v) override
Positionne l'option indiquant si les variables scalaires milieux sont allouées sur les matériaux.
ConstArrayView< IMeshMaterial * > materials() const override
Liste des matériaux.
IMeshEnvironment * createEnvironment(const MeshEnvironmentBuildInfo &infos) override
Création d'un milieu.
void recreateFromDump() override
Recréé les infos des matériaux et milieux à partir des infos de la protection.
void enableCellToAllEnvCellForRunCommand(bool is_enable, bool force_create=false) override
Active ou désactive la construction et la mise à jour de la table de "connectivité" CellLocalId -> Al...
int modificationFlags() const override
Flags pour paramêtrer les modifications.
void fillWithUsedVariables(Array< IMeshMaterialVariable * > &variables) override
Remplit le tableau variables avec la liste des variables matériaux utilisés.
ConstArrayView< IMeshComponent * > environmentsAsComponents() const override
Liste des milieux vus comme composants.
ConstArrayView< IMeshEnvironment * > environments() const override
Liste des milieux.
IMeshMaterialVariable * checkVariable(IVariable *global_var) override
Variable aux matériaux associé à la variable global global_var (nullptr si aucune)
void forceRecompute() override
Force le recalcul des informations des matériaux.
void _endUpdate()
Remise à jour des structures suite à une modification des mailles de matériaux ou de milieux.
void setDataInitialisationWithZero(bool v) override
Indique comment initialiser les nouvelles valeurs dans les mailles matériaux et milieux.
void setKeepValuesAfterChange(bool v) override
Positionne la sauvegarde des valeurs entre deux modifications des matériaux.
AllEnvCellVectorView view(CellVectorView cells) final
Vue sur les mailles milieux correspondant au groupe cells.
bool isMeshModificationNotified() const override
Indique si les milieux et matériaux suivent les changements de topologie dans le maillage.
IMeshMaterialMngInternal * _internalApi() const override
API interne à Arcane.
void checkMaterialsInCells(Integer max_print) override
Vérifie que les mailles des matériaux sont cohérentes entre les sous-domaines.
IMeshEnvironment * findEnvironment(const String &name, bool throw_exception=true) override
Retourne le milieux de nom name.
bool isDataInitialisationWithZero() const override
Indique comment initialiser les nouvelles valeurs dans les mailles matériaux et milieux.
Mutex * variableLock() override
Verrou utilisé pour le multi-threading.
void setSynchronizeVariableVersion(Integer version) override
Positionne la version de l'implémentation pour la synchronisation des variables matériaux.
bool synchronizeMaterialsInCells() override
Synchronise les mailles des matériaux.
std::map< String, IMeshMaterialVariable * > FullNameVariableMap
Type de la liste des variables par nom complet.
ConstArrayView< IMeshComponent * > materialsAsComponents() const override
Liste des matériaux vus comme composants.
IMeshMaterialVariable * findVariable(const String &name) override
Variable de nom name ou nullptr si aucune de ce nom existe.
void setUseMaterialValueWhenRemovingPartialValue(bool v) override
Indique si on utilise la valeur matériau ou milieu lorsqu'on transforme une maille partielle en maill...
void dumpCellInfos(Cell cell, std::ostream &o) override
Ecrit les infos de la maille cell sur le flot o.
ConstArrayView< IMeshBlock * > blocks() const override
Liste des blocs.
void checkValid() override
Vérifie la validité des structures internes.
void syncVariablesReferences(bool check_resize)
Met à jour les références des variables.
MeshMaterial * _createMaterial(MeshEnvironment *env, MeshMaterialInfo *infos, const String &name)
Création d'un matériau.
AllEnvCellVectorView view(SmallSpan< const Int32 > cells_local_id) final
Vue sur les mailles milieux correspondant aux mailles de numéro locaux cells_local_id.
bool isAllocateScalarEnvironmentVariableAsMaterial() const override
Indique si les variables scalaires milieux sont allouées sur les matériaux.
String name() const override
Nom du gestionnaire.
IMeshBlock * findBlock(const String &name, bool throw_exception=true) override
Retourne le bloc de nom name.
void setModificationFlags(int v) override
Positionner les flags pour paramêtrer les modifications de matériaux/milieux.
Synchronisation de la liste des matériaux/milieux des entités.
Matériau d'un maillage.
Informations pour la création d'un bloc.
Bloc d'un maillage.
Definition MeshBlock.h:50
Handle sur un maillage.
Definition MeshHandle.h:47
IMesh * mesh() const
Maillage associé.
Interface du gestionnaire de traces.
Chaîne de caractères unicode.
ITraceMng * traceMng() const
Gestionnaire de trace.
Active toujours les traces dans les parties Arcane concernant les matériaux.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-