14#include "arcane/materials/internal/MeshMaterialMng.h"
16#include "arcane/utils/TraceAccessor.h"
17#include "arcane/utils/NotImplementedException.h"
18#include "arcane/utils/AutoDestroyUserData.h"
19#include "arcane/utils/IUserDataList.h"
20#include "arcane/utils/OStringStream.h"
21#include "arcane/utils/PlatformUtils.h"
22#include "arcane/utils/ValueConvert.h"
23#include "arcane/utils/CheckedConvert.h"
26#include "arcane/core/IMesh.h"
27#include "arcane/core/IItemFamily.h"
28#include "arcane/core/VariableTypes.h"
29#include "arcane/core/ItemPrinter.h"
30#include "arcane/core/IVariableMng.h"
31#include "arcane/core/Properties.h"
32#include "arcane/core/ObserverPool.h"
33#include "arcane/core/materials/IMeshMaterialVariableFactoryMng.h"
34#include "arcane/core/materials/IMeshMaterialVariable.h"
36#include "arcane/core/materials/internal/IMeshMaterialVariableInternal.h"
37#include "arcane/core/internal/IVariableMngInternal.h"
39#include "arcane/accelerator/core/IAcceleratorMng.h"
41#include "arcane/materials/MeshMaterialInfo.h"
42#include "arcane/materials/MeshEnvironmentBuildInfo.h"
43#include "arcane/materials/CellToAllEnvCellConverter.h"
44#include "arcane/materials/MeshMaterialExchangeMng.h"
45#include "arcane/materials/EnumeratorTracer.h"
46#include "arcane/materials/MeshMaterialVariableFactoryRegisterer.h"
47#include "arcane/materials/internal/AllEnvData.h"
48#include "arcane/materials/internal/MeshMaterialModifierImpl.h"
49#include "arcane/materials/internal/MeshMaterialSynchronizer.h"
50#include "arcane/materials/internal/MeshMaterialVariableSynchronizer.h"
51#include "arcane/materials/internal/ConstituentConnectivityList.h"
52#include "arcane/materials/internal/AllCellToAllEnvCellContainer.h"
86 arcaneCreateMeshMaterialMng(
const MeshHandle& mesh_handle,
const String& name)
88 MeshMaterialMng* mmm =
new MeshMaterialMng(mesh_handle, name);
99MeshMaterialMng::RunnerInfo::
100RunnerInfo(Runner& runner)
104, m_sequential_run_queue(
makeQueue(m_sequential_runner))
106, m_multi_thread_run_queue(
makeQueue(m_multi_thread_runner))
113void MeshMaterialMng::RunnerInfo::
114initializeAsyncPool(Int32 nb_queue)
120 m_async_queue_pool.initialize(m_runner, nb_queue);
122 m_async_queue_pool.setAsync(
true);
128RunQueue MeshMaterialMng::RunnerInfo::
129runQueue(Accelerator::eExecutionPolicy policy)
const
131 if (policy == Accelerator::eExecutionPolicy::None)
133 if (policy == Accelerator::eExecutionPolicy::Sequential)
134 return m_sequential_run_queue;
135 if (policy == Accelerator::eExecutionPolicy::Thread)
136 return m_multi_thread_run_queue;
137 ARCANE_FATAL(
"Invalid value '{0}' for execution policy. Valid values are None, Sequential or Thread", policy);
147MeshMaterialMng(
const MeshHandle& mesh_handle,
const String& name)
149: TraceAccessor(mesh_handle.traceMng())
150, m_mesh_handle(mesh_handle)
151, m_internal_api(std::make_unique<InternalApi>(this))
152, m_variable_mng(mesh_handle.variableMng())
156 m_all_env_data = std::make_unique<AllEnvData>(
this);
157 m_exchange_mng = std::make_unique<MeshMaterialExchangeMng>(
this);
158 m_variable_factory_mng = arcaneCreateMeshMaterialVariableFactoryMng(
this);
159 m_observer_pool = std::make_unique<ObserverPool>();
160 m_observer_pool->addObserver(
this, &MeshMaterialMng::_onMeshDestroyed, mesh_handle.onDestroyObservable());
162 String s = platform::getEnvironmentVariable(
"ARCANE_ALLENVCELL_FOR_RUNCOMMAND");
164 m_is_use_accelerator_envcell_container =
true;
165 m_mms =
new MeshMaterialSynchronizer(
this);
178 delete m_variable_factory_mng;
179 m_exchange_mng.reset();
180 m_all_cells_env_only_synchronizer.reset();
181 m_all_cells_mat_env_synchronizer.reset();
182 m_all_env_data.reset();
183 m_properties.reset();
185 for (MeshMaterial* m : m_true_materials)
187 m_true_materials.clear();
189 for (MeshEnvironment* e : m_true_environments)
191 m_true_environments.clear();
193 for (IMeshBlock* b : m_true_blocks)
196 for (MeshMaterialInfo* mmi : m_materials_info)
199 for (MeshMaterialVariableIndexer* mvi : m_variables_indexer_to_destroy)
203 m_internal_api.reset();
205 m_accelerator_envcell_container.reset();
209 m_runner_info.reset();
218void MeshMaterialMng::
223 auto* x = MeshMaterialVariableFactoryRegisterer::firstRegisterer();
225 m_variable_factory_mng->registerFactory(x->createFactory());
226 x = x->nextRegisterer();
233 if (
auto v = Convert::Type<Real>::tryParseFromEnvironment(
"ARCANE_MATERIALMNG_USE_ACCELERATOR_FOR_CONSTITUENTITEMVECTOR",
true)) {
234 m_is_use_accelerator_for_constituent_item_vector = (v.value() != 0);
240 if (TaskFactory::isActive())
241 m_is_use_accelerator_for_constituent_item_vector =
false;
242 info() <<
"Use accelerator API for 'ConstituentItemVectorImpl' = " << m_is_use_accelerator_for_constituent_item_vector;
247 IAcceleratorMng* acc_mng = m_variable_mng->_internalApi()->acceleratorMng();
250 Runner* default_runner = acc_mng->defaultRunner();
252 bool use_accelerator_runner =
true;
253 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_MATERIALMNG_USE_QUEUE",
true))
254 use_accelerator_runner = (v.value() != 0);
255 if (use_accelerator_runner && default_runner)
256 runner = *default_runner;
259 if (!runner.isInitialized())
260 runner.initialize(Accelerator::eExecutionPolicy::Sequential);
261 m_runner_info = std::make_unique<RunnerInfo>(runner);
263 info() <<
"Use runner '" << this->runner().executionPolicy() <<
"' for MeshMaterialMng name=" << name()
264 <<
" async_queue_size=" << nb_queue;
265 m_runner_info->initializeAsyncPool(nb_queue);
272 RunQueue& q = runQueue();
274 q.setMemoryRessource(eMemoryRessource::Device);
279 int default_flags = 0;
285 int opt_flag_value = 0;
286 String env_name =
"ARCANE_MATERIAL_MODIFICATION_FLAGS";
287 String opt_flag_str = platform::getEnvironmentVariable(env_name);
288 if (!opt_flag_str.null()) {
289 if (builtInGetValue(opt_flag_value, opt_flag_str)) {
290 pwarning() <<
"Invalid value '" << opt_flag_str
291 <<
" 'for environment variable '" << env_name
293 opt_flag_value = default_flags;
297 opt_flag_value = default_flags;
299 m_modification_flags = opt_flag_value;
304 String env_name =
"ARCANE_MATSYNCHRONIZE_VERSION";
305 String env_value = platform::getEnvironmentVariable(env_name);
306 info() <<
"ENV_VALUE=" << env_value;
307 Integer version = m_synchronize_variable_version;
308 if (!env_value.null()) {
309 if (builtInGetValue(version, env_value)) {
310 pwarning() <<
"Invalid value '" << env_value
311 <<
" 'for environment variable '" << env_name
315 m_synchronize_variable_version = version;
317 info() <<
"Set material variable synchronize version to "
318 <<
"'" << m_synchronize_variable_version <<
"'";
323 String env_name =
"ARCANE_MATERIAL_DATA_COMPRESSOR_NAME";
324 String env_value = platform::getEnvironmentVariable(env_name);
325 if (!env_value.null()) {
326 info() <<
"Use service '" << env_value <<
"' for material data compression";
327 m_data_compressor_service_name = env_value;
333 if (
auto v = Convert::Type<Real>::tryParseFromEnvironment(
"ARCANE_MATERIALMNG_ADDITIONAL_CAPACITY_RATIO",
true)) {
335 m_additional_capacity_ratio = v.value();
336 info() <<
"Set additional capacity ratio to " << m_additional_capacity_ratio;
341 m_exchange_mng->build();
346 IItemEnumeratorTracer* item_tracer = IItemEnumeratorTracer::singleton();
348 info() <<
"Adding material enumerator tracing";
349 EnumeratorTracer::_setSingleton(
new EnumeratorTracer(traceMng(), item_tracer->perfCounterRef()));
356void MeshMaterialMng::
357_addVariableIndexer(MeshMaterialVariableIndexer* var_idx)
359 var_idx->setIndex(m_variables_indexer.size());
360 m_variables_indexer.add(var_idx);
371MeshMaterial* MeshMaterialMng::
372_createMaterial(MeshEnvironment* env, MeshMaterialInfo* infos,
const String& name)
375 if (infos->materialMng() !=
this)
376 ARCANE_FATAL(
"Invalid materialMng() for material info");
377 if (env->materialMng() !=
this)
379 Integer var_index = m_variables_indexer.size();
380 Int16 mat_id = CheckedConvert::toInt16(m_materials.size());
381 MeshMaterial* mat =
new MeshMaterial(infos, env, name, mat_id);
382 info() <<
"Create material name=" << name <<
"mat_id=" << mat_id <<
" var_index=" << var_index;
384 m_materials.add(mat);
385 m_materials_as_components.add(mat);
386 m_true_materials.add(mat);
388 _addVariableIndexer(mat->variableIndexer());
395MeshMaterialInfo* MeshMaterialMng::
396registerMaterialInfo(
const String& name)
400 MeshMaterialInfo* old_mmi = _findMaterialInfo(name);
402 ARCANE_FATAL(
"Un matériau de nom '{0}' est déjà enregistré", name);
404 MeshMaterialInfo* mmi =
new MeshMaterialInfo(
this, name);
405 m_materials_info.add(mmi);
418IMeshEnvironment* MeshMaterialMng::
419createEnvironment(
const MeshEnvironmentBuildInfo& infos)
422 Int16 env_index = CheckedConvert::toInt16(m_environments.size());
424 const String& env_name = infos.name();
425 MeshEnvironment* old_me = _findEnvironment(env_name);
427 ARCANE_FATAL(
"Un milieu de nom '{0}' est déjà enregistré", env_name);
429 info() <<
"Creating environment name=" << env_name <<
" index=" << env_index;
431 MeshEnvironment* me =
new MeshEnvironment(
this, env_name, env_index);
433 m_true_environments.add(me);
434 m_environments.add(me);
435 m_environments_as_components.add(me);
438 Integer nb_mat = infos.materials().size();
439 ConstArrayView<MeshEnvironmentBuildInfo::MatInfo> mat_build_infos = infos.materials();
440 for (Integer i = 0; i < nb_mat; ++i) {
441 const MeshEnvironmentBuildInfo::MatInfo& buildinfo = mat_build_infos[i];
442 const String& mat_name = buildinfo.m_name;
443 String new_mat_name = env_name +
"_" + mat_name;
444 MeshMaterialInfo* mat_info = _findMaterialInfo(mat_name);
446 ARCANE_FATAL(
"Aucun matériau de nom '{0}' n'est défini", mat_name);
448 MeshMaterial* mm = _createMaterial(me, mat_info, new_mat_name);
450 mat_info->_addEnvironment(env_name);
456 MeshMaterialVariableIndexer* var_idx =
nullptr;
458 var_idx = me->materials()[0]->_internalApi()->variableIndexer();
461 var_idx =
new MeshMaterialVariableIndexer(traceMng(), me->name());
462 _addVariableIndexer(var_idx);
463 m_variables_indexer_to_destroy.add(var_idx);
465 me->setVariableIndexer(var_idx);
473IMeshBlock* MeshMaterialMng::
474createBlock(
const MeshBlockBuildInfo& infos)
478 Int32 block_index = m_blocks.size();
480 const String& name = infos.name();
481 const MeshBlock* old_mb = _findBlock(name);
483 ARCANE_FATAL(
"Un bloc de nom '{0}' est déjà enregistré", name);
485 info() <<
"Creating block name=" << name <<
" index=" << block_index
486 <<
" nb_env=" << infos.environments().size();
487 Integer nb_env = infos.environments().size();
488 for (Integer i = 0; i < nb_env; ++i)
489 info() <<
" Adding environment name=" << infos.environments()[i]->name() <<
" to block";
492 MeshBlock* mb =
new MeshBlock(
this, block_index, infos);
494 m_true_blocks.add(mb);
503void MeshMaterialMng::
504addEnvironmentToBlock(IMeshBlock* block, IMeshEnvironment* env)
507 mb->addEnvironment(env);
513void MeshMaterialMng::
514removeEnvironmentToBlock(IMeshBlock* block, IMeshEnvironment* env)
517 mb->removeEnvironment(env);
523void MeshMaterialMng::
524endCreate(
bool is_continue)
529 _saveInfosInProperties();
531 info() <<
"END CREATE MATERIAL_MNG is_continue=" << is_continue;
533 m_modifier = std::make_unique<MeshMaterialModifierImpl>(
this);
534 m_modifier->initOptimizationFlags();
536 m_all_env_data->endCreate(is_continue);
538 auto synchronizer = mesh()->cellFamily()->allItemsSynchronizer();
539 m_all_cells_mat_env_synchronizer = std::make_unique<MeshMaterialVariableSynchronizer>(
this, synchronizer, MatVarSpace::MaterialAndEnvironment);
540 m_all_cells_env_only_synchronizer = std::make_unique<MeshMaterialVariableSynchronizer>(
this, synchronizer, MatVarSpace::Environment);
544 Integer nb_component = m_environments_as_components.size() + m_materials_as_components.size();
545 m_components.reserve(nb_component);
546 m_components.addRange(m_environments_as_components);
547 m_components.addRange(m_materials_as_components);
552 for (
const auto& i : m_full_name_variable_map) {
553 IMeshMaterialVariable* mv = i.second;
554 info(4) <<
"BUILD FROM MANAGER name=" << mv->name() <<
" this=" <<
this;
555 mv->buildFromManager(is_continue);
559 m_is_end_create =
true;
567 for (IMeshEnvironment* env : m_environments) {
573 m_exchange_mng->registerFactory();
579void MeshMaterialMng::
580setModificationFlags(
int v)
583 m_modification_flags = v;
584 info() <<
"Setting ModificationFlags to v=" << v;
590void MeshMaterialMng::
591setAllocateScalarEnvironmentVariableAsMaterial(
bool v)
594 m_is_allocate_scalar_environment_variable_as_material = v;
595 info() <<
"Setting AllocateScalarEnvironmentVariableAsMaterial to v=" << v;
601void MeshMaterialMng::
602setDataCompressorServiceName(
const String& name)
604 m_data_compressor_service_name = name;
610MeshMaterialModifierImpl* MeshMaterialMng::
613 return m_modifier.get();
619MeshMaterialInfo* MeshMaterialMng::
620_findMaterialInfo(
const String& name)
622 for (MeshMaterialInfo* mmi : m_materials_info)
623 if (mmi->name() == name)
631IMeshEnvironment* MeshMaterialMng::
632findEnvironment(
const String& name,
bool throw_exception)
634 IMeshEnvironment* env = _findEnvironment(name);
645MeshEnvironment* MeshMaterialMng::
646_findEnvironment(
const String& name)
648 for (MeshEnvironment* env : m_true_environments)
649 if (env->name() == name)
657IMeshBlock* MeshMaterialMng::
658findBlock(
const String& name,
bool throw_exception)
660 IMeshBlock* block = _findBlock(name);
671MeshBlock* MeshMaterialMng::
672_findBlock(
const String& name)
674 for (MeshBlock* b : m_true_blocks)
675 if (b->name() == name)
683void MeshMaterialMng::
695void MeshMaterialMng::
698 m_all_env_data->forceRecompute(
true);
710void MeshMaterialMng::
711syncVariablesReferences(
bool check_resize)
713 for (
const auto& i : m_full_name_variable_map) {
714 IMeshMaterialVariable* mv = i.second;
715 info(4) <<
"SYNC REFERENCES FROM MANAGER name=" << mv->name();
716 mv->_internalApi()->syncReferences(check_resize);
723void MeshMaterialMng::
724visitVariables(IFunctorWithArgumentT<IMeshMaterialVariable*>* functor)
728 for (
const auto& i : m_full_name_variable_map) {
729 IMeshMaterialVariable* mv = i.second;
730 functor->executeFunctor(mv);
737void MeshMaterialMng::
740 const IItemFamily* cell_family = mesh()->cellFamily();
741 ItemGroup all_cells = cell_family->allItems();
742 ConstArrayView<Int16> nb_env_per_cell = m_all_env_data->componentConnectivityList()->cellsNbEnvironment();
744 AllEnvCell all_env_cell = *iallenvcell;
745 Integer cell_nb_env = all_env_cell.nbEnvironment();
746 Cell cell = all_env_cell.globalCell();
747 Int64 cell_uid = cell.uniqueId();
748 if (all_env_cell.level() != LEVEL_ALLENVIRONMENT)
751 if (all_env_cell.globalCell() != cell)
752 ARCANE_FATAL(
"Bad corresponding globalCell() in all_env_item");
753 if (cell_nb_env != nb_env_per_cell[cell.localId()])
754 ARCANE_FATAL(
"Bad value for nb_env direct='{0}' var='{1}'",
755 cell_nb_env, nb_env_per_cell[cell.localId()]);
756 for (Integer z = 0; z < cell_nb_env; ++z) {
757 EnvCell ec = all_env_cell.cell(z);
758 Integer cell_nb_mat = ec.nbMaterial();
759 matimpl::ConstituentItemBase eii = ec.constituentItemBase();
760 if (all_env_cell.constituentItemBase() != eii._superItemBase())
761 ARCANE_FATAL(
"Bad corresponding allEnvItem() in env_item uid={0}", cell_uid);
762 if (eii.globalItemBase() != cell)
763 ARCANE_FATAL(
"Bad corresponding globalItem() in env_item");
764 if (eii.level() != LEVEL_ENVIRONMENT)
765 ARCANE_FATAL(
"Bad level '{0}' for in env_item", eii.level());
768 if (cell_nb_env > 1 && ec._varIndex().arrayIndex() == 0)
769 ARCANE_FATAL(
"Global index for a partial cell env_item={0}", ec);
771 for (Integer k = 0; k < cell_nb_mat; ++k) {
772 MatCell mc = ec.cell(k);
773 matimpl::ConstituentItemBase mci = mc.constituentItemBase();
774 if (eii != mci._superItemBase())
775 ARCANE_FATAL(
"Bad corresponding env_item in mat_item k={0} mc={1}", k, mc);
776 if (mci.globalItemBase() != cell)
777 ARCANE_FATAL(
"Bad corresponding globalItem() in mat_item");
778 if (mci.level() != LEVEL_MATERIAL)
779 ARCANE_FATAL(
"Bad level '{0}' for in mat_item", mci.level());
782 if ((cell_nb_env > 1 || cell_nb_mat > 1) && mc._varIndex().arrayIndex() == 0) {
783 ARCANE_FATAL(
"Global index for a partial cell matitem={0} name={1} nb_mat={2} nb_env={3}",
784 mc, mc.material()->name(), cell_nb_mat, cell_nb_env);
790 for (IMeshEnvironment* env : m_environments) {
798IMeshMaterialVariable* MeshMaterialMng::
799findVariable(
const String& name)
801 IMeshMaterialVariable* v = _findVariableFullyQualified(name);
808 const IVariable* global_var = m_variable_mng->findMeshVariable(mesh(), name);
810 v = _findVariableFullyQualified(global_var->fullName());
821IMeshMaterialVariable* MeshMaterialMng::
822_findVariableFullyQualified(
const String& name)
824 auto i = m_full_name_variable_map.find(name);
825 if (i != m_full_name_variable_map.end())
833IMeshMaterialVariable* MeshMaterialMng::
834checkVariable(IVariable* global_var)
836 auto i = m_var_to_mat_var_map.find(global_var);
837 if (i != m_var_to_mat_var_map.end())
845void MeshMaterialMng::
846fillWithUsedVariables(Array<IMeshMaterialVariable*>& variables)
852 for (
const auto& i : m_full_name_variable_map) {
853 IMeshMaterialVariable* ivar = i.second;
854 if (ivar->globalVariable()->isUsed())
862void MeshMaterialMng::
863_addVariable(IMeshMaterialVariable* var)
866 IVariable* gvar = var->globalVariable();
867 info(4) <<
"MAT_ADD_VAR global_var=" << gvar <<
" var=" << var <<
" this=" <<
this;
868 m_var_to_mat_var_map.insert(std::make_pair(gvar, var));
869 m_full_name_variable_map.insert(std::make_pair(gvar->fullName(), var));
875void MeshMaterialMng::
876_removeVariable(IMeshMaterialVariable* var)
879 IVariable* gvar = var->globalVariable();
880 info(4) <<
"MAT:Remove variable global_var=" << gvar <<
" var=" << var;
881 m_var_to_mat_var_map.erase(gvar);
882 m_full_name_variable_map.erase(gvar->fullName());
888void MeshMaterialMng::
889dumpInfos(std::ostream& o)
891 Integer nb_mat = m_materials.size();
892 Integer nb_env = m_environments.size();
893 Integer nb_var_idx = m_variables_indexer.size();
894 o <<
"-- Infos sur les milieux et matériaux\n";
895 o <<
"-- Nb Materiaux: " << nb_mat <<
'\n';
896 o <<
"-- Nb Milieux: " << nb_env <<
'\n';
897 o <<
"-- Nb Variables partielles: " << nb_var_idx <<
'\n';
899 o <<
"-- Liste des matériaux\n";
900 for (IMeshMaterial* mat : m_materials) {
901 o <<
"-- Materiau name=" << mat->name() <<
'\n';
904 o <<
"-- Liste des milieux\n";
905 for (IMeshEnvironment* me : m_environments) {
906 ConstArrayView<IMeshMaterial*> env_materials = me->materials();
907 const MeshMaterialVariableIndexer* env_var_idx = me->_internalApi()->variableIndexer();
908 Integer nb_env_mat = env_materials.size();
909 o <<
"-- Milieu name=" << me->name()
910 <<
" nb_mat=" << nb_env_mat
911 <<
" nb_cell=" << me->cells().size()
912 <<
" var_idx = " << env_var_idx->index()
913 <<
" ids=" << env_var_idx->matvarIndexes()
915 for (IMeshMaterial* mm : env_materials) {
916 const MeshMaterialVariableIndexer* idx = mm->_internalApi()->variableIndexer();
917 o <<
"-- Materiau\n";
918 o <<
"-- name = " << mm->name() <<
"\n";
919 o <<
"-- nb_cell = " << mm->cells().size() <<
"\n";
920 o <<
"-- var_idx = " << idx->index() <<
"\n";
928void MeshMaterialMng::
929dumpInfos2(std::ostream& o)
931 const ConstituentConnectivityList& constituent_list = *m_all_env_data->componentConnectivityList();
932 ConstArrayView<Int16> nb_env_per_cell = constituent_list.cellsNbEnvironment();
933 Integer nb_mat = m_materials.size();
934 Integer nb_env = m_environments.size();
935 Integer nb_var_idx = m_variables_indexer.size();
936 o <<
"-- Material and Environment infos: nb_env=" << nb_env
937 <<
" nb_mat=" << nb_mat <<
" timestamp=" << m_timestamp
938 <<
" nb_var_idx=" << nb_var_idx
940 Integer nb_cell = mesh()->allCells().size();
944 if (nb_env_per_cell[icell.localId()] <= 1)
947 o <<
" nb_cell=" << nb_cell <<
" nb_pure_env=" << nb_pure_env
948 <<
" nb_partial=" << (nb_cell - nb_pure_env)
949 <<
" percent=" << (100 * nb_pure_env) / nb_cell
953 o <<
"-- Liste des milieux\n";
954 for (MeshEnvironment* me : m_true_environments) {
955 ConstArrayView<IMeshMaterial*> env_materials = me->materials();
956 const MeshMaterialVariableIndexer* env_var_idx = me->variableIndexer();
957 const Int16 env_id = me->componentId();
958 Integer nb_env_mat = env_materials.size();
959 Integer nb_env_cell = me->cells().size();
961 if (nb_env_mat > 1) {
963 if (constituent_list.cellNbMaterial(icell, env_id) <= 1)
968 nb_pure_mat = nb_env_cell;
969 o <<
"-- Env name=" << me->name()
970 <<
" nb_mat=" << nb_env_mat
971 <<
" var_idx=" << env_var_idx->index()
972 <<
" nb_cell=" << nb_env_cell
973 <<
" nb_pure_mat=" << nb_pure_mat;
974 if (nb_env_cell != 0)
975 o <<
" percent=" << (nb_pure_mat * 100) / nb_env_cell;
977 for (Integer j = 0; j < nb_env_mat; ++j) {
978 IMeshMaterial* mm = env_materials[j];
979 const MeshMaterialVariableIndexer* idx = mm->_internalApi()->variableIndexer();
980 o <<
"-- Mat name=" << mm->name()
981 <<
" nb_cell=" << mm->cells().size()
982 <<
" var_idx=" << idx->index()
991bool MeshMaterialMng::
992synchronizeMaterialsInCells()
994 return m_mms->synchronizeMaterialsInCells();
1000void MeshMaterialMng::
1001checkMaterialsInCells(Integer max_print)
1003 m_mms->checkMaterialsInCells(max_print);
1009void MeshMaterialMng::
1010dumpCellInfos(Cell cell, std::ostream& o)
1012 CellToAllEnvCellConverter all_env_cell_converter(
this);
1013 AllEnvCell all_env_cell = all_env_cell_converter[cell];
1014 Cell global_cell = all_env_cell.globalCell();
1015 o <<
"Cell uid=" << ItemPrinter(global_cell) <<
'\n';
1017 o <<
"ENV name=" << (*ienvcell).environment()->name()
1018 <<
" component_idx=" << ComponentItemLocalId(ienvcell) <<
'\n';
1020 o <<
"MAT name=" << (*imatcell).material()->name()
1021 <<
" component_idx=" << ComponentItemLocalId(imatcell) <<
'\n';
1029CellToAllEnvCellConverter MeshMaterialMng::
1030cellToAllEnvCellConverter()
1032 return CellToAllEnvCellConverter(componentItemSharedInfo(LEVEL_ALLENVIRONMENT));
1038void MeshMaterialMng::
1041 if (m_is_end_create)
1042 ARCANE_FATAL(
"Invalid method call because endCreate() has already been called");
1048AllEnvCellVectorView MeshMaterialMng::
1049_view(SmallSpan<const Int32> local_ids)
1051 return AllEnvCellVectorView(local_ids.constSmallView(), componentItemSharedInfo(LEVEL_ALLENVIRONMENT));
1057class MeshMaterialMngFactory
1062 MeshMaterialMngFactory()
1064 IMeshMaterialMng::_internalSetFactory(
this);
1066 ~MeshMaterialMngFactory()
1068 IMeshMaterialMng::_internalSetFactory(
nullptr);
1077 static MeshMaterialMngFactory m_mesh_material_mng_factory;
1086getTrueReference(
const MeshHandle& mesh_handle,
bool is_create)
1091 const char* name =
"MeshMaterialMng_StdMat";
1098 IMeshMaterialMng* mm = arcaneCreateMeshMaterialMng(mesh_handle,
"StdMat");
1099 Ref<IMeshMaterialMng> mm_ref = makeRef(mm);
1100 udlist->
setData(name,
new UserDataType(
new Ref<IMeshMaterialMng>(mm_ref)));
1103 auto adud =
dynamic_cast<UserDataType*
>(ud);
1106 return *(adud->data());
1112bool MeshMaterialMng::
1113isInMeshMaterialExchange()
const
1115 return m_exchange_mng->isInMeshMaterialExchange();
1121void MeshMaterialMng::
1122_checkCreateProperties()
1126 m_properties = std::make_unique<Properties>(*(mesh()->properties()), String(
"MeshMaterialMng_") + name());
1133 const Int32 SERIALIZE_VERSION = 1;
1135void MeshMaterialMng::
1136_saveInfosInProperties()
1138 _checkCreateProperties();
1141 m_properties->set(
"Version", SERIALIZE_VERSION);
1145 UniqueArray<String> material_info_names;
1146 for (MeshMaterialInfo* mat_info : m_materials_info) {
1147 material_info_names.add(mat_info->name());
1149 m_properties->set(
"MaterialInfoNames", material_info_names);
1151 UniqueArray<String> env_names;
1152 UniqueArray<Int32> env_nb_mat;
1153 UniqueArray<String> env_mat_names;
1155 IMeshEnvironment* env = *ienv;
1156 env_names.add(env->name());
1157 info(5) <<
"SAVE ENV_NAME name=" << env->name() <<
" nb_mat=" << env->nbMaterial();
1158 env_nb_mat.add(env->nbMaterial());
1160 const String& name = (*imat)->infos()->name();
1161 info(5) <<
"SAVE MAT_NAME name=" << name;
1162 env_mat_names.add(name);
1165 m_properties->set(
"EnvNames", env_names);
1166 m_properties->set(
"EnvNbMat", env_nb_mat);
1167 m_properties->set(
"EnvMatNames", env_mat_names);
1171 UniqueArray<String> block_names;
1172 UniqueArray<String> block_cell_group_names;
1173 UniqueArray<Int32> block_nb_env;
1174 UniqueArray<String> block_env_names;
1175 for (IMeshBlock* block : m_blocks) {
1176 block_names.add(block->name());
1177 block_cell_group_names.add(block->cells().name());
1178 block_nb_env.add(block->nbEnvironment());
1180 const String& name = (*ienv)->name();
1181 info(5) <<
"SAVE BLOCK ENV_NAME name=" << name;
1182 block_env_names.add(name);
1185 m_properties->set(
"BlockNames", block_names);
1186 m_properties->set(
"BlockCellGroupNames", block_cell_group_names);
1187 m_properties->set(
"BlockNbEnv", block_nb_env);
1188 m_properties->set(
"BlockEnvNames", block_env_names);
1194void MeshMaterialMng::
1197 if (m_is_end_create)
1200 _checkCreateProperties();
1202 info() <<
"Creating material infos from dump";
1205 Int32 v = m_properties->getInt32(
"Version");
1206 if (v != SERIALIZE_VERSION)
1207 ARCANE_FATAL(
"Bad serializer version: trying to read from incompatible checkpoint v={0} expected={1}",
1208 v, SERIALIZE_VERSION);
1210 UniqueArray<String> material_info_names;
1211 m_properties->get(
"MaterialInfoNames", material_info_names);
1212 for (
const String& mat_name : material_info_names)
1213 this->registerMaterialInfo(mat_name);
1215 UniqueArray<String> env_names;
1216 UniqueArray<Int32> env_nb_mat;
1217 UniqueArray<String> env_mat_names;
1218 m_properties->get(
"EnvNames", env_names);
1219 m_properties->get(
"EnvNbMat", env_nb_mat);
1220 m_properties->get(
"EnvMatNames", env_mat_names);
1223 for (Integer ienv = 0, nenv = env_names.size(); ienv < nenv; ++ienv) {
1224 Materials::MeshEnvironmentBuildInfo env_build(env_names[ienv]);
1225 Integer nb_mat = env_nb_mat[ienv];
1226 for (Integer imat = 0; imat < nb_mat; ++imat) {
1227 env_build.addMaterial(env_mat_names[mat_index]);
1230 this->createEnvironment(env_build);
1235 UniqueArray<String> block_names;
1236 UniqueArray<String> block_cell_group_names;
1237 UniqueArray<String> block_env_names;
1238 UniqueArray<Int32> block_nb_env;
1239 m_properties->get(
"BlockNames", block_names);
1240 m_properties->get(
"BlockCellGroupNames", block_cell_group_names);
1241 m_properties->get(
"BlockNbEnv", block_nb_env);
1242 m_properties->get(
"BlockEnvNames", block_env_names);
1243 const IItemFamily* cell_family = mesh()->cellFamily();
1245 for (Integer i = 0, n = block_names.size(); i < n; ++i) {
1246 String name = block_names[i];
1247 String cell_group_name = block_cell_group_names[i];
1248 CellGroup cells = cell_family->findGroup(cell_group_name);
1250 ARCANE_FATAL(
"Can not find cell group '{0}' for block creation",
1252 MeshBlockBuildInfo mbbi(name, cells);
1253 if (!block_nb_env.empty()) {
1254 Integer nb_env = block_nb_env[i];
1255 for (Integer ienv = 0; ienv < nb_env; ++ienv) {
1256 const String& name2 = block_env_names[block_env_index];
1258 IMeshEnvironment* env = findEnvironment(name2,
false);
1260 ARCANE_FATAL(
"Invalid environment name '{0}' for recreating blocks", name2);
1261 mbbi.addEnvironment(env);
1264 this->createBlock(mbbi);
1273void MeshMaterialMng::
1280 m_exchange_mng.reset();
1282 _unregisterAllVariables();
1288void MeshMaterialMng::
1289_unregisterAllVariables()
1294 UniqueArray<MeshMaterialVariableRef*> m_all_refs;
1296 for (
const auto& i : m_full_name_variable_map) {
1297 const IMeshMaterialVariable* var = i.second;
1299 for (MeshMaterialVariableRef::Enumerator iref(var); iref.hasNext(); ++iref) {
1300 MeshMaterialVariableRef* ref = *iref;
1301 m_all_refs.add(ref);
1305 for (MeshMaterialVariableRef* ref : m_all_refs)
1306 ref->unregisterVariable();
1312ComponentItemSharedInfo* MeshMaterialMng::
1313componentItemSharedInfo(Int32 level)
const
1315 ComponentItemInternalData* data = m_all_env_data->componentItemInternalData();
1316 ComponentItemSharedInfo* shared_info =
nullptr;
1317 if (level == LEVEL_MATERIAL)
1318 shared_info = data->matSharedInfo();
1319 else if (level == LEVEL_ENVIRONMENT)
1320 shared_info = data->envSharedInfo();
1321 else if (level == LEVEL_ALLENVIRONMENT)
1322 shared_info = data->allEnvSharedInfo();
1332void MeshMaterialMng::
1335 IEnumeratorTracer* tracer = IEnumeratorTracer::singleton();
1337 tracer->dumpStats();
1340 m_modifier->dumpStats();
1342 for (IMeshEnvironment* env : m_environments) {
1346 if (env->nbMaterial() > 1)
1347 env->_internalApi()->variableIndexer()->dumpStats();
1349 for (IMeshMaterial* mat : m_materials) {
1350 mat->_internalApi()->variableIndexer()->dumpStats();
1357void MeshMaterialMng::
1358createAllCellToAllEnvCell()
1360 if (!m_accelerator_envcell_container) {
1361 m_accelerator_envcell_container = std::make_unique<AllCellToAllEnvCellContainer>(
this);
1362 m_accelerator_envcell_container->initialize();
1369SmallSpan<const Int32> MeshMaterialMng::
1370identitySelectionView()
1374 Int32 max_local_id = m_mesh_handle.mesh()->cellFamily()->maxLocalId();
1376 std::scoped_lock sl(m_indexed_selection_identity_mutex);
1377 Int32 size = m_indexed_selection_identity.size();
1378 if (max_local_id > size) {
1379 m_indexed_selection_identity.resize(max_local_id);
1380 for (Int32 i = size; i < max_local_id; ++i)
1381 m_indexed_selection_identity[i] = i;
1383 return m_indexed_selection_identity.constView();
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions de gestion mémoire et des allocateurs.
UserData s'auto-détruisant une fois détaché.
Interface d'une liste qui gère des données utilisateurs.
virtual void setData(const String &name, IUserData *ud)=0
Positionne le user-data associé au nom name.
virtual IUserData * data(const String &name, bool allow_null=false) const =0
Donnée associée à name.
Interface pour une donnée utilisateur attachée à un autre objet.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
IUserDataList * meshUserDataList() const
Données utilisateurs associées.
Référence à une instance.
ItemGroupT< Cell > CellGroup
Groupe de mailles.
RunQueue makeQueue(const Runner &runner)
Créé une file associée à runner.
eExecutionPolicy
Politique d'exécution pour un Runner.
@ Sequential
Politique d'exécution séquentielle.
@ Thread
Politique d'exécution multi-thread.
bool isAcceleratorPolicy(eExecutionPolicy exec_policy)
Indique si exec_policy correspond à un accélérateur.
Active toujours les traces dans les parties Arcane concernant les matériaux.
bool arcaneIsCheck()
Vrai si on est en mode vérification.
Int32 Integer
Type représentant un entier.
@ Cell
Le maillage est AMR par maille.
Fonctions utilitaires de gestion mémoire.