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"
24#include "arcane/utils/MemoryUtils.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"
76extern "C++" IMeshMaterialVariableFactoryMng*
77arcaneCreateMeshMaterialVariableFactoryMng(IMeshMaterialMng* mm);
85arcaneCreateMeshMaterialMng(
const MeshHandle& mesh_handle,
const String& name)
87 MeshMaterialMng* mmm =
new MeshMaterialMng(mesh_handle,name);
98MeshMaterialMng::RunnerInfo::
99RunnerInfo(Runner& runner)
108void MeshMaterialMng::RunnerInfo::
109initializeAsyncPool(Int32 nb_queue)
115 m_async_queue_pool.initialize(m_runner,nb_queue);
117 m_async_queue_pool.setAsync(
true);
127MeshMaterialMng(
const MeshHandle& mesh_handle,
const String& name)
129: TraceAccessor(mesh_handle.traceMng())
130, m_mesh_handle(mesh_handle)
131, m_internal_api(std::make_unique<InternalApi>(this))
132, m_variable_mng(mesh_handle.variableMng())
134, m_all_cell_to_all_env_cell(MemoryUtils::getDefaultDataAllocator())
136 m_all_env_data = std::make_unique<AllEnvData>(
this);
137 m_exchange_mng = std::make_unique<MeshMaterialExchangeMng>(
this);
138 m_variable_factory_mng = arcaneCreateMeshMaterialVariableFactoryMng(
this);
139 m_observer_pool = std::make_unique<ObserverPool>();
140 m_observer_pool->addObserver(
this,&MeshMaterialMng::_onMeshDestroyed,mesh_handle.onDestroyObservable());
142 String s = platform::getEnvironmentVariable(
"ARCANE_ALLENVCELL_FOR_RUNCOMMAND");
144 m_is_allcell_2_allenvcell =
true;
145 m_mms =
new MeshMaterialSynchronizer(
this);
158 delete m_variable_factory_mng;
159 m_exchange_mng.reset();
160 m_all_cells_env_only_synchronizer.reset();
161 m_all_cells_mat_env_synchronizer.reset();
162 m_all_env_data.reset();
163 m_properties.reset();
165 for( MeshMaterial* m : m_true_materials )
167 m_true_materials.clear();
169 for( MeshEnvironment* e : m_true_environments )
171 m_true_environments.clear();
173 for (IMeshBlock* b : m_true_blocks)
176 for (MeshMaterialInfo* mmi : m_materials_info)
179 for (MeshMaterialVariableIndexer* mvi : m_variables_indexer_to_destroy)
183 m_internal_api.reset();
185 if (m_allcell_2_allenvcell){
186 m_all_cell_to_all_env_cell.clear();
187 m_allcell_2_allenvcell =
nullptr;
192 m_runner_info.reset();
201void MeshMaterialMng::
206 auto* x = MeshMaterialVariableFactoryRegisterer::firstRegisterer();
208 m_variable_factory_mng->registerFactory(x->createFactory());
209 x = x->nextRegisterer();
215 IAcceleratorMng* acc_mng = m_variable_mng->_internalApi()->acceleratorMng();
218 Runner* default_runner = acc_mng->defaultRunner();
220 bool use_accelerator_runner =
true;
221 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_MATERIALMNG_USE_QUEUE",
true))
222 use_accelerator_runner = (v.value()!=0);
223 if (use_accelerator_runner && default_runner)
224 runner = *default_runner;
227 if (!runner.isInitialized())
228 runner.initialize(Accelerator::eExecutionPolicy::Sequential);
229 m_runner_info = std::make_unique<RunnerInfo>(runner);
231 info() <<
"Use runner '" << this->runner().executionPolicy() <<
"' for MeshMaterialMng name=" << name()
232 <<
" async_queue_size=" << nb_queue;
233 m_runner_info->initializeAsyncPool(nb_queue);
240 RunQueue& q = runQueue();
242 q.setMemoryRessource(eMemoryRessource::Device);
247 int default_flags = 0;
253 int opt_flag_value = 0;
254 String env_name =
"ARCANE_MATERIAL_MODIFICATION_FLAGS";
255 String opt_flag_str = platform::getEnvironmentVariable(env_name);
256 if (!opt_flag_str.null()){
257 if (builtInGetValue(opt_flag_value,opt_flag_str)){
258 pwarning() <<
"Invalid value '" << opt_flag_str
259 <<
" 'for environment variable '" << env_name
261 opt_flag_value = default_flags;
265 opt_flag_value = default_flags;
267 m_modification_flags = opt_flag_value;
272 String env_name =
"ARCANE_MATSYNCHRONIZE_VERSION";
273 String env_value = platform::getEnvironmentVariable(env_name);
274 info() <<
"ENV_VALUE=" << env_value;
275 Integer version = m_synchronize_variable_version;
276 if (!env_value.null()){
277 if (builtInGetValue(version,env_value)){
278 pwarning() <<
"Invalid value '" << env_value
279 <<
" 'for environment variable '" << env_name
283 m_synchronize_variable_version = version;
285 info() <<
"Set material variable synchronize version to "
286 <<
"'" << m_synchronize_variable_version <<
"'";
291 String env_name =
"ARCANE_MATERIAL_DATA_COMPRESSOR_NAME";
292 String env_value = platform::getEnvironmentVariable(env_name);
293 if (!env_value.null()){
294 info() <<
"Use service '" << env_value <<
"' for material data compression";
295 m_data_compressor_service_name = env_value;
301 if (
auto v = Convert::Type<Real>::tryParseFromEnvironment(
"ARCANE_MATERIALMNG_ADDITIONAL_CAPACITY_RATIO",
true)){
303 m_additional_capacity_ratio = v.value();
304 info() <<
"Set additional capacity ratio to " << m_additional_capacity_ratio;
312 if (
auto v = Convert::Type<Real>::tryParseFromEnvironment(
"ARCANE_MATERIALMNG_USE_ACCELERATOR_FOR_CONSTITUENTITEMVECTOR",
true)){
313 m_is_use_accelerator_for_constituent_item_vector = (v.value()!=0);
314 info() <<
"Use accelerator APU for 'ConstituentItemVectorImpl' = " << m_is_use_accelerator_for_constituent_item_vector;
318 m_exchange_mng->build();
323 IItemEnumeratorTracer* item_tracer = IItemEnumeratorTracer::singleton();
325 info() <<
"Adding material enumerator tracing";
326 EnumeratorTracer::_setSingleton(
new EnumeratorTracer(traceMng(),item_tracer->perfCounterRef()));
333void MeshMaterialMng::
334_addVariableIndexer(MeshMaterialVariableIndexer* var_idx)
336 var_idx->setIndex(m_variables_indexer.size());
337 m_variables_indexer.add(var_idx);
348MeshMaterial* MeshMaterialMng::
349_createMaterial(MeshEnvironment* env,MeshMaterialInfo* infos,
const String& name)
352 if (infos->materialMng()!=
this)
353 ARCANE_FATAL(
"Invalid materialMng() for material info");
354 if (env->materialMng()!=
this)
356 Integer var_index = m_variables_indexer.size();
357 Int16 mat_id = CheckedConvert::toInt16(m_materials.size());
358 MeshMaterial* mat =
new MeshMaterial(infos,env,name,mat_id);
359 info() <<
"Create material name=" << name <<
"mat_id=" << mat_id <<
" var_index=" << var_index;
361 m_materials.add(mat);
362 m_materials_as_components.add(mat);
363 m_true_materials.add(mat);
365 _addVariableIndexer(mat->variableIndexer());
372MeshMaterialInfo* MeshMaterialMng::
373registerMaterialInfo(
const String& name)
377 MeshMaterialInfo* old_mmi = _findMaterialInfo(name);
379 ARCANE_FATAL(
"Un matériau de nom '{0}' est déjà enregistré",name);
381 MeshMaterialInfo* mmi =
new MeshMaterialInfo(
this,name);
382 m_materials_info.add(mmi);
395IMeshEnvironment* MeshMaterialMng::
396createEnvironment(
const MeshEnvironmentBuildInfo& infos)
399 Int16 env_index = CheckedConvert::toInt16(m_environments.size());
401 const String& env_name = infos.name();
402 MeshEnvironment* old_me = _findEnvironment(env_name);
404 ARCANE_FATAL(
"Un milieu de nom '{0}' est déjà enregistré",env_name);
406 info() <<
"Creating environment name=" << env_name <<
" index=" << env_index;
408 MeshEnvironment* me =
new MeshEnvironment(
this,env_name,env_index);
410 m_true_environments.add(me);
411 m_environments.add(me);
412 m_environments_as_components.add(me);
415 Integer nb_mat = infos.materials().size();
416 for( Integer i=0; i<nb_mat; ++i ){
417 const MeshEnvironmentBuildInfo::MatInfo& buildinfo = infos.materials()[i];
418 const String& mat_name = buildinfo.m_name;
419 String new_mat_name = env_name +
"_" + mat_name;
420 MeshMaterialInfo* mat_info = _findMaterialInfo(mat_name);
422 ARCANE_FATAL(
"Aucun matériau de nom '{0}' n'est défini",mat_name);
424 MeshMaterial* mm = _createMaterial(me,mat_info,new_mat_name);
426 mat_info->_addEnvironment(env_name);
432 MeshMaterialVariableIndexer* var_idx =
nullptr;
434 var_idx = me->materials()[0]->_internalApi()->variableIndexer();
437 var_idx =
new MeshMaterialVariableIndexer(traceMng(),me->name());
438 _addVariableIndexer(var_idx);
439 m_variables_indexer_to_destroy.add(var_idx);
441 me->setVariableIndexer(var_idx);
449IMeshBlock* MeshMaterialMng::
450createBlock(
const MeshBlockBuildInfo& infos)
454 Int32 block_index = m_blocks.size();
456 const String& name = infos.name();
457 const MeshBlock* old_mb = _findBlock(name);
459 ARCANE_FATAL(
"Un bloc de nom '{0}' est déjà enregistré",name);
461 info() <<
"Creating block name=" << name <<
" index=" << block_index
462 <<
" nb_env=" << infos.environments().size();
463 Integer nb_env = infos.environments().size();
464 for( Integer i=0; i<nb_env; ++i )
465 info() <<
" Adding environment name=" << infos.environments()[i]->name() <<
" to block";
468 MeshBlock* mb =
new MeshBlock(
this,block_index,infos);
470 m_true_blocks.add(mb);
479void MeshMaterialMng::
480addEnvironmentToBlock(IMeshBlock* block,IMeshEnvironment* env)
483 mb->addEnvironment(env);
489void MeshMaterialMng::
490removeEnvironmentToBlock(IMeshBlock* block,IMeshEnvironment* env)
493 mb->removeEnvironment(env);
499void MeshMaterialMng::
500endCreate(
bool is_continue)
505 _saveInfosInProperties();
507 info() <<
"END CREATE MATERIAL_MNG is_continue=" << is_continue;
509 m_modifier = std::make_unique<MeshMaterialModifierImpl>(
this);
510 m_modifier->initOptimizationFlags();
512 m_all_env_data->endCreate(is_continue);
514 auto synchronizer = mesh()->cellFamily()->allItemsSynchronizer();
515 m_all_cells_mat_env_synchronizer = std::make_unique<MeshMaterialVariableSynchronizer>(
this,synchronizer,MatVarSpace::MaterialAndEnvironment);
516 m_all_cells_env_only_synchronizer = std::make_unique<MeshMaterialVariableSynchronizer>(
this,synchronizer,MatVarSpace::Environment);
520 Integer nb_component = m_environments_as_components.size() + m_materials_as_components.size();
521 m_components.reserve(nb_component);
522 m_components.addRange(m_environments_as_components);
523 m_components.addRange(m_materials_as_components);
528 for(
const auto& i : m_full_name_variable_map ){
529 IMeshMaterialVariable* mv = i.second;
530 info(4) <<
"BUILD FROM MANAGER name=" << mv->name() <<
" this=" <<
this;
531 mv->buildFromManager(is_continue);
535 m_is_end_create =
true;
543 for( IMeshEnvironment* env : m_environments ){
549 m_exchange_mng->registerFactory();
555void MeshMaterialMng::
556setModificationFlags(
int v)
559 m_modification_flags = v;
560 info() <<
"Setting ModificationFlags to v=" << v;
566void MeshMaterialMng::
567setAllocateScalarEnvironmentVariableAsMaterial(
bool v)
570 m_is_allocate_scalar_environment_variable_as_material = v;
571 info() <<
"Setting AllocateScalarEnvironmentVariableAsMaterial to v=" << v;
577void MeshMaterialMng::
578setDataCompressorServiceName(
const String& name)
580 m_data_compressor_service_name = name;
586MeshMaterialModifierImpl* MeshMaterialMng::
589 return m_modifier.get();
595MeshMaterialInfo* MeshMaterialMng::
596_findMaterialInfo(
const String& name)
598 for( MeshMaterialInfo* mmi : m_materials_info )
599 if (mmi->name()==name)
607IMeshEnvironment* MeshMaterialMng::
608findEnvironment(
const String& name,
bool throw_exception)
610 IMeshEnvironment* env = _findEnvironment(name);
621MeshEnvironment* MeshMaterialMng::
622_findEnvironment(
const String& name)
624 for( MeshEnvironment* env : m_true_environments )
625 if (env->name()==name)
633IMeshBlock* MeshMaterialMng::
634findBlock(
const String& name,
bool throw_exception)
636 IMeshBlock* block = _findBlock(name);
647MeshBlock* MeshMaterialMng::
648_findBlock(
const String& name)
650 for( MeshBlock* b : m_true_blocks )
659void MeshMaterialMng::
671void MeshMaterialMng::
674 m_all_env_data->forceRecompute(
true);
686void MeshMaterialMng::
687syncVariablesReferences(
bool check_resize)
689 for(
const auto& i : m_full_name_variable_map ){
690 IMeshMaterialVariable* mv = i.second;
691 info(4) <<
"SYNC REFERENCES FROM MANAGER name=" << mv->name();
692 mv->_internalApi()->syncReferences(check_resize);
699void MeshMaterialMng::
700visitVariables(IFunctorWithArgumentT<IMeshMaterialVariable*>* functor)
704 for(
const auto& i : m_full_name_variable_map ){
705 IMeshMaterialVariable* mv = i.second;
706 functor->executeFunctor(mv);
713void MeshMaterialMng::
716 const IItemFamily* cell_family = mesh()->cellFamily();
717 ItemGroup all_cells = cell_family->allItems();
718 ConstArrayView<Int16> nb_env_per_cell = m_all_env_data->componentConnectivityList()->cellsNbEnvironment();
720 AllEnvCell all_env_cell = *iallenvcell;
721 Integer cell_nb_env = all_env_cell.nbEnvironment();
722 Cell cell = all_env_cell.globalCell();
723 Int64 cell_uid = cell.uniqueId();
724 if (all_env_cell.level()!=LEVEL_ALLENVIRONMENT)
727 if (all_env_cell.globalCell()!=cell)
728 ARCANE_FATAL(
"Bad corresponding globalCell() in all_env_item");
729 if (cell_nb_env != nb_env_per_cell[cell.localId()])
730 ARCANE_FATAL(
"Bad value for nb_env direct='{0}' var='{1}'",
731 cell_nb_env, nb_env_per_cell[cell.localId()]);
732 for( Integer z=0; z<cell_nb_env; ++z ){
733 EnvCell ec = all_env_cell.cell(z);
734 Integer cell_nb_mat = ec.nbMaterial();
735 matimpl::ConstituentItemBase eii = ec.constituentItemBase();
736 if (all_env_cell.constituentItemBase()!=eii._superItemBase())
737 ARCANE_FATAL(
"Bad corresponding allEnvItem() in env_item uid={0}",cell_uid);
738 if (eii.globalItemBase()!=cell)
739 ARCANE_FATAL(
"Bad corresponding globalItem() in env_item");
740 if (eii.level()!=LEVEL_ENVIRONMENT)
741 ARCANE_FATAL(
"Bad level '{0}' for in env_item",eii.level());
744 if (cell_nb_env>1 && ec._varIndex().arrayIndex()==0)
745 ARCANE_FATAL(
"Global index for a partial cell env_item={0}",ec);
747 for( Integer k=0; k<cell_nb_mat; ++k ){
748 MatCell mc = ec.cell(k);
749 matimpl::ConstituentItemBase mci = mc.constituentItemBase();
750 if (eii!=mci._superItemBase())
752 if (mci.globalItemBase()!=cell)
753 ARCANE_FATAL(
"Bad corresponding globalItem() in mat_item");
754 if (mci.level()!=LEVEL_MATERIAL)
755 ARCANE_FATAL(
"Bad level '{0}' for in mat_item",mci.level());
758 if ((cell_nb_env>1 || cell_nb_mat>1) && mc._varIndex().arrayIndex()==0){
759 ARCANE_FATAL(
"Global index for a partial cell matitem={0} name={1} nb_mat={2} nb_env={3}",
760 mc,mc.material()->name(),cell_nb_mat,cell_nb_env);
766 for( IMeshEnvironment* env : m_environments ){
774IMeshMaterialVariable* MeshMaterialMng::
775findVariable(
const String& name)
777 IMeshMaterialVariable* v = _findVariableFullyQualified(name);
784 const IVariable* global_var = m_variable_mng->findMeshVariable(mesh(),name);
786 v = _findVariableFullyQualified(global_var->fullName());
797IMeshMaterialVariable* MeshMaterialMng::
798_findVariableFullyQualified(
const String& name)
800 auto i = m_full_name_variable_map.find(name);
801 if (i!=m_full_name_variable_map.end())
809IMeshMaterialVariable* MeshMaterialMng::
810checkVariable(IVariable* global_var)
812 auto i = m_var_to_mat_var_map.find(global_var);
813 if (i!=m_var_to_mat_var_map.end())
821void MeshMaterialMng::
822fillWithUsedVariables(Array<IMeshMaterialVariable*>& variables)
828 for(
const auto& i : m_full_name_variable_map ){
829 IMeshMaterialVariable* ivar = i.second;
830 if (ivar->globalVariable()->isUsed())
838void MeshMaterialMng::
839_addVariable(IMeshMaterialVariable* var)
842 IVariable* gvar = var->globalVariable();
843 info(4) <<
"MAT_ADD_VAR global_var=" << gvar <<
" var=" << var <<
" this=" <<
this;
844 m_var_to_mat_var_map.insert(std::make_pair(gvar,var));
845 m_full_name_variable_map.insert(std::make_pair(gvar->fullName(),var));
851void MeshMaterialMng::
852_removeVariable(IMeshMaterialVariable* var)
855 IVariable* gvar = var->globalVariable();
856 info(4) <<
"MAT:Remove variable global_var=" << gvar <<
" var=" << var;
857 m_var_to_mat_var_map.erase(gvar);
858 m_full_name_variable_map.erase(gvar->fullName());
864void MeshMaterialMng::
865dumpInfos(std::ostream& o)
867 Integer nb_mat = m_materials.size();
868 Integer nb_env = m_environments.size();
869 Integer nb_var_idx = m_variables_indexer.size();
870 o <<
"-- Infos sur les milieux et matériaux\n";
871 o <<
"-- Nb Materiaux: " << nb_mat <<
'\n';
872 o <<
"-- Nb Milieux: " << nb_env <<
'\n';
873 o <<
"-- Nb Variables partielles: " << nb_var_idx <<
'\n';
875 o <<
"-- Liste des matériaux\n";
876 for( IMeshMaterial* mat : m_materials ){
877 o <<
"-- Materiau name=" << mat->name() <<
'\n';
880 o <<
"-- Liste des milieux\n";
881 for( IMeshEnvironment* me : m_environments ){
882 ConstArrayView<IMeshMaterial*> env_materials = me->materials();
883 const MeshMaterialVariableIndexer* env_var_idx = me->_internalApi()->variableIndexer();
884 Integer nb_env_mat = env_materials.size();
885 o <<
"-- Milieu name=" << me->name()
886 <<
" nb_mat=" << nb_env_mat
887 <<
" nb_cell=" << me->cells().size()
888 <<
" var_idx = " << env_var_idx->index()
889 <<
" ids=" << env_var_idx->matvarIndexes()
891 for( IMeshMaterial* mm : env_materials ){
892 const MeshMaterialVariableIndexer* idx = mm->_internalApi()->variableIndexer();
893 o <<
"-- Materiau\n";
894 o <<
"-- name = " << mm->name() <<
"\n";
895 o <<
"-- nb_cell = " << mm->cells().size() <<
"\n";
896 o <<
"-- var_idx = " << idx->index() <<
"\n";
904void MeshMaterialMng::
905dumpInfos2(std::ostream& o)
907 const ConstituentConnectivityList& constituent_list = *m_all_env_data->componentConnectivityList();
908 ConstArrayView<Int16> nb_env_per_cell = constituent_list.cellsNbEnvironment();
909 Integer nb_mat = m_materials.size();
910 Integer nb_env = m_environments.size();
911 Integer nb_var_idx = m_variables_indexer.size();
912 o <<
"-- Material and Environment infos: nb_env=" << nb_env
913 <<
" nb_mat=" << nb_mat <<
" timestamp=" << m_timestamp
914 <<
" nb_var_idx=" << nb_var_idx
916 Integer nb_cell = mesh()->allCells().size();
920 if (nb_env_per_cell[icell.localId()] <= 1)
923 o <<
" nb_cell=" << nb_cell <<
" nb_pure_env=" << nb_pure_env
924 <<
" nb_partial=" << (nb_cell-nb_pure_env)
925 <<
" percent=" << (100*nb_pure_env)/nb_cell
929 o <<
"-- Liste des milieux\n";
930 for( MeshEnvironment* me : m_true_environments ){
931 ConstArrayView<IMeshMaterial*> env_materials = me->materials();
932 const MeshMaterialVariableIndexer* env_var_idx = me->variableIndexer();
933 const Int16 env_id = me->componentId();
934 Integer nb_env_mat = env_materials.size();
935 Integer nb_env_cell = me->cells().size();
939 if (constituent_list.cellNbMaterial(icell, env_id) <= 1)
944 nb_pure_mat = nb_env_cell;
945 o <<
"-- Env name=" << me->name()
946 <<
" nb_mat=" << nb_env_mat
947 <<
" var_idx=" << env_var_idx->index()
948 <<
" nb_cell=" << nb_env_cell
949 <<
" nb_pure_mat=" << nb_pure_mat;
951 o <<
" percent=" << (nb_pure_mat*100)/nb_env_cell;
953 for( Integer j=0; j<nb_env_mat; ++j ){
954 IMeshMaterial* mm = env_materials[j];
955 const MeshMaterialVariableIndexer* idx = mm->_internalApi()->variableIndexer();
956 o <<
"-- Mat name=" << mm->name()
957 <<
" nb_cell=" << mm->cells().size()
958 <<
" var_idx=" << idx->index()
967bool MeshMaterialMng::
968synchronizeMaterialsInCells()
970 return m_mms->synchronizeMaterialsInCells();
976void MeshMaterialMng::
977checkMaterialsInCells(Integer max_print)
979 m_mms->checkMaterialsInCells(max_print);
985void MeshMaterialMng::
986dumpCellInfos(Cell cell,std::ostream& o)
988 CellToAllEnvCellConverter all_env_cell_converter(
this);
989 AllEnvCell all_env_cell = all_env_cell_converter[cell];
990 Cell global_cell = all_env_cell.globalCell();
991 o <<
"Cell uid=" << ItemPrinter(global_cell) <<
'\n';
993 o <<
"ENV name=" << (*ienvcell).environment()->name()
994 <<
" component_idx=" << ComponentItemLocalId(ienvcell) <<
'\n';
996 o <<
"MAT name=" << (*imatcell).material()->name()
997 <<
" component_idx=" << ComponentItemLocalId(imatcell) <<
'\n';
1005CellToAllEnvCellConverter MeshMaterialMng::
1006cellToAllEnvCellConverter()
1008 return CellToAllEnvCellConverter(componentItemSharedInfo(LEVEL_ALLENVIRONMENT));
1014void MeshMaterialMng::
1017 if (m_is_end_create)
1018 ARCANE_FATAL(
"Invalid method call because endCreate() has already been called");
1024AllEnvCellVectorView MeshMaterialMng::
1025_view(SmallSpan<const Int32> local_ids)
1027 return AllEnvCellVectorView(local_ids.constSmallView(), componentItemSharedInfo(LEVEL_ALLENVIRONMENT));
1039 IMeshMaterialMng::_internalSetFactory(
this);
1043 IMeshMaterialMng::_internalSetFactory(
nullptr);
1046 Ref<IMeshMaterialMng> getTrueReference(
const MeshHandle& mesh_handle,
bool is_create)
override;
1056Ref<IMeshMaterialMng> MeshMaterialMngFactory::
1057getTrueReference(
const MeshHandle& mesh_handle,
bool is_create)
1062 const char* name =
"MeshMaterialMng_StdMat";
1069 IMeshMaterialMng* mm = arcaneCreateMeshMaterialMng(mesh_handle,
"StdMat");
1070 Ref<IMeshMaterialMng> mm_ref = makeRef(mm);
1071 udlist->
setData(name,
new UserDataType(
new Ref<IMeshMaterialMng>(mm_ref)));
1074 auto adud =
dynamic_cast<UserDataType*
>(ud);
1077 return *(adud->data());
1083bool MeshMaterialMng::
1084isInMeshMaterialExchange()
const
1086 return m_exchange_mng->isInMeshMaterialExchange();
1092void MeshMaterialMng::
1093_checkCreateProperties()
1097 m_properties = std::make_unique<Properties>(*(mesh()->properties()),String(
"MeshMaterialMng_")+name());
1104const Int32 SERIALIZE_VERSION = 1;
1106void MeshMaterialMng::
1107_saveInfosInProperties()
1109 _checkCreateProperties();
1112 m_properties->set(
"Version",SERIALIZE_VERSION);
1116 UniqueArray<String> material_info_names;
1117 for( MeshMaterialInfo* mat_info : m_materials_info ){
1118 material_info_names.add(mat_info->name());
1120 m_properties->set(
"MaterialInfoNames",material_info_names);
1122 UniqueArray<String> env_names;
1123 UniqueArray<Int32> env_nb_mat;
1124 UniqueArray<String> env_mat_names;
1126 IMeshEnvironment* env = *ienv;
1127 env_names.add(env->name());
1128 info(5) <<
"SAVE ENV_NAME name=" << env->name() <<
" nb_mat=" << env->nbMaterial();
1129 env_nb_mat.add(env->nbMaterial());
1131 const String& name = (*imat)->infos()->name();
1132 info(5) <<
"SAVE MAT_NAME name=" << name;
1133 env_mat_names.add(name);
1136 m_properties->set(
"EnvNames",env_names);
1137 m_properties->set(
"EnvNbMat",env_nb_mat);
1138 m_properties->set(
"EnvMatNames",env_mat_names);
1142 UniqueArray<String> block_names;
1143 UniqueArray<String> block_cell_group_names;
1144 UniqueArray<Int32> block_nb_env;
1145 UniqueArray<String> block_env_names;
1146 for( IMeshBlock* block : m_blocks ){
1147 block_names.add(block->name());
1148 block_cell_group_names.add(block->cells().name());
1149 block_nb_env.add(block->nbEnvironment());
1151 const String& name = (*ienv)->name();
1152 info(5) <<
"SAVE BLOCK ENV_NAME name=" << name;
1153 block_env_names.add(name);
1156 m_properties->set(
"BlockNames",block_names);
1157 m_properties->set(
"BlockCellGroupNames",block_cell_group_names);
1158 m_properties->set(
"BlockNbEnv",block_nb_env);
1159 m_properties->set(
"BlockEnvNames",block_env_names);
1165void MeshMaterialMng::
1168 if (m_is_end_create)
1171 _checkCreateProperties();
1173 info() <<
"Creating material infos from dump";
1176 Int32 v = m_properties->getInt32(
"Version");
1177 if (v!=SERIALIZE_VERSION)
1178 ARCANE_FATAL(
"Bad serializer version: trying to read from incompatible checkpoint v={0} expected={1}",
1179 v,SERIALIZE_VERSION);
1181 UniqueArray<String> material_info_names;
1182 m_properties->get(
"MaterialInfoNames",material_info_names);
1183 for(
const String& mat_name : material_info_names )
1184 this->registerMaterialInfo(mat_name);
1186 UniqueArray<String> env_names;
1187 UniqueArray<Int32> env_nb_mat;
1188 UniqueArray<String> env_mat_names;
1189 m_properties->get(
"EnvNames",env_names);
1190 m_properties->get(
"EnvNbMat",env_nb_mat);
1191 m_properties->get(
"EnvMatNames",env_mat_names);
1194 for( Integer ienv=0, nenv=env_names.size(); ienv<nenv; ++ienv ){
1195 Materials::MeshEnvironmentBuildInfo env_build(env_names[ienv]);
1196 Integer nb_mat = env_nb_mat[ienv];
1197 for( Integer imat=0; imat<nb_mat; ++imat ){
1198 env_build.addMaterial(env_mat_names[mat_index]);
1201 this->createEnvironment(env_build);
1206 UniqueArray<String> block_names;
1207 UniqueArray<String> block_cell_group_names;
1208 UniqueArray<String> block_env_names;
1209 UniqueArray<Int32> block_nb_env;
1210 m_properties->get(
"BlockNames",block_names);
1211 m_properties->get(
"BlockCellGroupNames",block_cell_group_names);
1212 m_properties->get(
"BlockNbEnv",block_nb_env);
1213 m_properties->get(
"BlockEnvNames",block_env_names);
1214 const IItemFamily* cell_family = mesh()->cellFamily();
1216 for( Integer i=0, n=block_names.size(); i<n; ++i ){
1217 String name = block_names[i];
1218 String cell_group_name = block_cell_group_names[i];
1219 CellGroup cells = cell_family->findGroup(cell_group_name);
1221 ARCANE_FATAL(
"Can not find cell group '{0}' for block creation",
1223 MeshBlockBuildInfo mbbi(name,cells);
1224 if (!block_nb_env.empty()){
1225 Integer nb_env = block_nb_env[i];
1226 for( Integer ienv=0; ienv<nb_env; ++ienv ){
1227 const String& name2 = block_env_names[block_env_index];
1229 IMeshEnvironment* env = findEnvironment(name2,
false);
1231 ARCANE_FATAL(
"Invalid environment name '{0}' for recreating blocks",name2);
1232 mbbi.addEnvironment(env);
1235 this->createBlock(mbbi);
1244void MeshMaterialMng::
1251 m_exchange_mng.reset();
1253 _unregisterAllVariables();
1259void MeshMaterialMng::
1260_unregisterAllVariables()
1265 UniqueArray<MeshMaterialVariableRef*> m_all_refs;
1267 for(
const auto& i : m_full_name_variable_map ){
1268 const IMeshMaterialVariable* var = i.second;
1270 for( MeshMaterialVariableRef::Enumerator iref(var); iref.hasNext(); ++iref ){
1271 MeshMaterialVariableRef* ref = *iref;
1272 m_all_refs.add(ref);
1276 for( MeshMaterialVariableRef* ref : m_all_refs )
1277 ref->unregisterVariable();
1283ComponentItemSharedInfo* MeshMaterialMng::
1284componentItemSharedInfo(Int32 level)
const
1286 ComponentItemInternalData* data = m_all_env_data->componentItemInternalData();
1287 ComponentItemSharedInfo* shared_info =
nullptr;
1288 if (level == LEVEL_MATERIAL)
1289 shared_info = data->matSharedInfo();
1290 else if (level == LEVEL_ENVIRONMENT)
1291 shared_info = data->envSharedInfo();
1292 else if (level==LEVEL_ALLENVIRONMENT)
1293 shared_info = data->allEnvSharedInfo();
1303void MeshMaterialMng::
1306 IEnumeratorTracer* tracer = IEnumeratorTracer::singleton();
1308 tracer->dumpStats();
1311 m_modifier->dumpStats();
1313 for (IMeshEnvironment* env : m_environments) {
1317 if (env->nbMaterial() > 1)
1318 env->_internalApi()->variableIndexer()->dumpStats();
1320 for (IMeshMaterial* mat : m_materials) {
1321 mat->_internalApi()->variableIndexer()->dumpStats();
1328void MeshMaterialMng::
1329createAllCellToAllEnvCell()
1331 if (!m_allcell_2_allenvcell){
1332 m_all_cell_to_all_env_cell.reserve(1);
1333 m_all_cell_to_all_env_cell.add(AllCellToAllEnvCell(
this));
1334 m_allcell_2_allenvcell = m_all_cell_to_all_env_cell.view().ptrAt(0);
1335 m_allcell_2_allenvcell->initialize();
#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.
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.
IUserDataList * meshUserDataList() const
Données utilisateurs associées.
ItemGroupT< Cell > CellGroup
Groupe de mailles.
RunQueue makeQueue(const Runner &runner)
Créé une file associée à runner.
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.