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"
86arcaneCreateMeshMaterialMng(
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())
155 m_all_env_data = std::make_unique<AllEnvData>(
this);
156 m_exchange_mng = std::make_unique<MeshMaterialExchangeMng>(
this);
157 m_variable_factory_mng = arcaneCreateMeshMaterialVariableFactoryMng(
this);
158 m_observer_pool = std::make_unique<ObserverPool>();
159 m_observer_pool->addObserver(
this,&MeshMaterialMng::_onMeshDestroyed,mesh_handle.onDestroyObservable());
161 String s = platform::getEnvironmentVariable(
"ARCANE_ALLENVCELL_FOR_RUNCOMMAND");
163 m_is_use_accelerator_envcell_container =
true;
164 m_mms =
new MeshMaterialSynchronizer(
this);
177 delete m_variable_factory_mng;
178 m_exchange_mng.reset();
179 m_all_cells_env_only_synchronizer.reset();
180 m_all_cells_mat_env_synchronizer.reset();
181 m_all_env_data.reset();
182 m_properties.reset();
184 for( MeshMaterial* m : m_true_materials )
186 m_true_materials.clear();
188 for( MeshEnvironment* e : m_true_environments )
190 m_true_environments.clear();
192 for (IMeshBlock* b : m_true_blocks)
195 for (MeshMaterialInfo* mmi : m_materials_info)
198 for (MeshMaterialVariableIndexer* mvi : m_variables_indexer_to_destroy)
202 m_internal_api.reset();
204 m_accelerator_envcell_container.reset();
208 m_runner_info.reset();
217void MeshMaterialMng::
222 auto* x = MeshMaterialVariableFactoryRegisterer::firstRegisterer();
224 m_variable_factory_mng->registerFactory(x->createFactory());
225 x = x->nextRegisterer();
232 if (
auto v = Convert::Type<Real>::tryParseFromEnvironment(
"ARCANE_MATERIALMNG_USE_ACCELERATOR_FOR_CONSTITUENTITEMVECTOR",
true)){
233 m_is_use_accelerator_for_constituent_item_vector = (v.value()!=0);
239 if (TaskFactory::isActive())
240 m_is_use_accelerator_for_constituent_item_vector =
false;
241 info() <<
"Use accelerator API for 'ConstituentItemVectorImpl' = " << m_is_use_accelerator_for_constituent_item_vector;
246 IAcceleratorMng* acc_mng = m_variable_mng->_internalApi()->acceleratorMng();
249 Runner* default_runner = acc_mng->defaultRunner();
251 bool use_accelerator_runner =
true;
252 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_MATERIALMNG_USE_QUEUE",
true))
253 use_accelerator_runner = (v.value()!=0);
254 if (use_accelerator_runner && default_runner)
255 runner = *default_runner;
258 if (!runner.isInitialized())
259 runner.initialize(Accelerator::eExecutionPolicy::Sequential);
260 m_runner_info = std::make_unique<RunnerInfo>(runner);
262 info() <<
"Use runner '" << this->runner().executionPolicy() <<
"' for MeshMaterialMng name=" << name()
263 <<
" async_queue_size=" << nb_queue;
264 m_runner_info->initializeAsyncPool(nb_queue);
271 RunQueue& q = runQueue();
273 q.setMemoryRessource(eMemoryRessource::Device);
278 int default_flags = 0;
284 int opt_flag_value = 0;
285 String env_name =
"ARCANE_MATERIAL_MODIFICATION_FLAGS";
286 String opt_flag_str = platform::getEnvironmentVariable(env_name);
287 if (!opt_flag_str.null()){
288 if (builtInGetValue(opt_flag_value,opt_flag_str)){
289 pwarning() <<
"Invalid value '" << opt_flag_str
290 <<
" 'for environment variable '" << env_name
292 opt_flag_value = default_flags;
296 opt_flag_value = default_flags;
298 m_modification_flags = opt_flag_value;
303 String env_name =
"ARCANE_MATSYNCHRONIZE_VERSION";
304 String env_value = platform::getEnvironmentVariable(env_name);
305 info() <<
"ENV_VALUE=" << env_value;
306 Integer version = m_synchronize_variable_version;
307 if (!env_value.null()){
308 if (builtInGetValue(version,env_value)){
309 pwarning() <<
"Invalid value '" << env_value
310 <<
" 'for environment variable '" << env_name
314 m_synchronize_variable_version = version;
316 info() <<
"Set material variable synchronize version to "
317 <<
"'" << m_synchronize_variable_version <<
"'";
322 String env_name =
"ARCANE_MATERIAL_DATA_COMPRESSOR_NAME";
323 String env_value = platform::getEnvironmentVariable(env_name);
324 if (!env_value.null()){
325 info() <<
"Use service '" << env_value <<
"' for material data compression";
326 m_data_compressor_service_name = env_value;
332 if (
auto v = Convert::Type<Real>::tryParseFromEnvironment(
"ARCANE_MATERIALMNG_ADDITIONAL_CAPACITY_RATIO",
true)){
334 m_additional_capacity_ratio = v.value();
335 info() <<
"Set additional capacity ratio to " << m_additional_capacity_ratio;
340 m_exchange_mng->build();
345 IItemEnumeratorTracer* item_tracer = IItemEnumeratorTracer::singleton();
347 info() <<
"Adding material enumerator tracing";
348 EnumeratorTracer::_setSingleton(
new EnumeratorTracer(traceMng(),item_tracer->perfCounterRef()));
355void MeshMaterialMng::
356_addVariableIndexer(MeshMaterialVariableIndexer* var_idx)
358 var_idx->setIndex(m_variables_indexer.size());
359 m_variables_indexer.add(var_idx);
370MeshMaterial* MeshMaterialMng::
371_createMaterial(MeshEnvironment* env,MeshMaterialInfo* infos,
const String& name)
374 if (infos->materialMng()!=
this)
375 ARCANE_FATAL(
"Invalid materialMng() for material info");
376 if (env->materialMng()!=
this)
378 Integer var_index = m_variables_indexer.size();
379 Int16 mat_id = CheckedConvert::toInt16(m_materials.size());
380 MeshMaterial* mat =
new MeshMaterial(infos,env,name,mat_id);
381 info() <<
"Create material name=" << name <<
"mat_id=" << mat_id <<
" var_index=" << var_index;
383 m_materials.add(mat);
384 m_materials_as_components.add(mat);
385 m_true_materials.add(mat);
387 _addVariableIndexer(mat->variableIndexer());
394MeshMaterialInfo* MeshMaterialMng::
395registerMaterialInfo(
const String& name)
399 MeshMaterialInfo* old_mmi = _findMaterialInfo(name);
401 ARCANE_FATAL(
"Un matériau de nom '{0}' est déjà enregistré",name);
403 MeshMaterialInfo* mmi =
new MeshMaterialInfo(
this,name);
404 m_materials_info.add(mmi);
417IMeshEnvironment* MeshMaterialMng::
418createEnvironment(
const MeshEnvironmentBuildInfo& infos)
421 Int16 env_index = CheckedConvert::toInt16(m_environments.size());
423 const String& env_name = infos.name();
424 MeshEnvironment* old_me = _findEnvironment(env_name);
426 ARCANE_FATAL(
"Un milieu de nom '{0}' est déjà enregistré",env_name);
428 info() <<
"Creating environment name=" << env_name <<
" index=" << env_index;
430 MeshEnvironment* me =
new MeshEnvironment(
this,env_name,env_index);
432 m_true_environments.add(me);
433 m_environments.add(me);
434 m_environments_as_components.add(me);
437 Integer nb_mat = infos.materials().size();
438 for( Integer i=0; i<nb_mat; ++i ){
439 const MeshEnvironmentBuildInfo::MatInfo& buildinfo = infos.materials()[i];
440 const String& mat_name = buildinfo.m_name;
441 String new_mat_name = env_name +
"_" + mat_name;
442 MeshMaterialInfo* mat_info = _findMaterialInfo(mat_name);
444 ARCANE_FATAL(
"Aucun matériau de nom '{0}' n'est défini",mat_name);
446 MeshMaterial* mm = _createMaterial(me,mat_info,new_mat_name);
448 mat_info->_addEnvironment(env_name);
454 MeshMaterialVariableIndexer* var_idx =
nullptr;
456 var_idx = me->materials()[0]->_internalApi()->variableIndexer();
459 var_idx =
new MeshMaterialVariableIndexer(traceMng(),me->name());
460 _addVariableIndexer(var_idx);
461 m_variables_indexer_to_destroy.add(var_idx);
463 me->setVariableIndexer(var_idx);
471IMeshBlock* MeshMaterialMng::
472createBlock(
const MeshBlockBuildInfo& infos)
476 Int32 block_index = m_blocks.size();
478 const String& name = infos.name();
479 const MeshBlock* old_mb = _findBlock(name);
481 ARCANE_FATAL(
"Un bloc de nom '{0}' est déjà enregistré",name);
483 info() <<
"Creating block name=" << name <<
" index=" << block_index
484 <<
" nb_env=" << infos.environments().size();
485 Integer nb_env = infos.environments().size();
486 for( Integer i=0; i<nb_env; ++i )
487 info() <<
" Adding environment name=" << infos.environments()[i]->name() <<
" to block";
490 MeshBlock* mb =
new MeshBlock(
this,block_index,infos);
492 m_true_blocks.add(mb);
501void MeshMaterialMng::
502addEnvironmentToBlock(IMeshBlock* block,IMeshEnvironment* env)
505 mb->addEnvironment(env);
511void MeshMaterialMng::
512removeEnvironmentToBlock(IMeshBlock* block,IMeshEnvironment* env)
515 mb->removeEnvironment(env);
521void MeshMaterialMng::
522endCreate(
bool is_continue)
527 _saveInfosInProperties();
529 info() <<
"END CREATE MATERIAL_MNG is_continue=" << is_continue;
531 m_modifier = std::make_unique<MeshMaterialModifierImpl>(
this);
532 m_modifier->initOptimizationFlags();
534 m_all_env_data->endCreate(is_continue);
536 auto synchronizer = mesh()->cellFamily()->allItemsSynchronizer();
537 m_all_cells_mat_env_synchronizer = std::make_unique<MeshMaterialVariableSynchronizer>(
this,synchronizer,MatVarSpace::MaterialAndEnvironment);
538 m_all_cells_env_only_synchronizer = std::make_unique<MeshMaterialVariableSynchronizer>(
this,synchronizer,MatVarSpace::Environment);
542 Integer nb_component = m_environments_as_components.size() + m_materials_as_components.size();
543 m_components.reserve(nb_component);
544 m_components.addRange(m_environments_as_components);
545 m_components.addRange(m_materials_as_components);
550 for(
const auto& i : m_full_name_variable_map ){
551 IMeshMaterialVariable* mv = i.second;
552 info(4) <<
"BUILD FROM MANAGER name=" << mv->name() <<
" this=" <<
this;
553 mv->buildFromManager(is_continue);
557 m_is_end_create =
true;
565 for( IMeshEnvironment* env : m_environments ){
571 m_exchange_mng->registerFactory();
577void MeshMaterialMng::
578setModificationFlags(
int v)
581 m_modification_flags = v;
582 info() <<
"Setting ModificationFlags to v=" << v;
588void MeshMaterialMng::
589setAllocateScalarEnvironmentVariableAsMaterial(
bool v)
592 m_is_allocate_scalar_environment_variable_as_material = v;
593 info() <<
"Setting AllocateScalarEnvironmentVariableAsMaterial to v=" << v;
599void MeshMaterialMng::
600setDataCompressorServiceName(
const String& name)
602 m_data_compressor_service_name = name;
608MeshMaterialModifierImpl* MeshMaterialMng::
611 return m_modifier.get();
617MeshMaterialInfo* MeshMaterialMng::
618_findMaterialInfo(
const String& name)
620 for( MeshMaterialInfo* mmi : m_materials_info )
621 if (mmi->name()==name)
629IMeshEnvironment* MeshMaterialMng::
630findEnvironment(
const String& name,
bool throw_exception)
632 IMeshEnvironment* env = _findEnvironment(name);
643MeshEnvironment* MeshMaterialMng::
644_findEnvironment(
const String& name)
646 for( MeshEnvironment* env : m_true_environments )
647 if (env->name()==name)
655IMeshBlock* MeshMaterialMng::
656findBlock(
const String& name,
bool throw_exception)
658 IMeshBlock* block = _findBlock(name);
669MeshBlock* MeshMaterialMng::
670_findBlock(
const String& name)
672 for( MeshBlock* b : m_true_blocks )
681void MeshMaterialMng::
693void MeshMaterialMng::
696 m_all_env_data->forceRecompute(
true);
708void MeshMaterialMng::
709syncVariablesReferences(
bool check_resize)
711 for(
const auto& i : m_full_name_variable_map ){
712 IMeshMaterialVariable* mv = i.second;
713 info(4) <<
"SYNC REFERENCES FROM MANAGER name=" << mv->name();
714 mv->_internalApi()->syncReferences(check_resize);
721void MeshMaterialMng::
722visitVariables(IFunctorWithArgumentT<IMeshMaterialVariable*>* functor)
726 for(
const auto& i : m_full_name_variable_map ){
727 IMeshMaterialVariable* mv = i.second;
728 functor->executeFunctor(mv);
735void MeshMaterialMng::
738 const IItemFamily* cell_family = mesh()->cellFamily();
739 ItemGroup all_cells = cell_family->allItems();
740 ConstArrayView<Int16> nb_env_per_cell = m_all_env_data->componentConnectivityList()->cellsNbEnvironment();
742 AllEnvCell all_env_cell = *iallenvcell;
743 Integer cell_nb_env = all_env_cell.nbEnvironment();
744 Cell cell = all_env_cell.globalCell();
745 Int64 cell_uid = cell.uniqueId();
746 if (all_env_cell.level()!=LEVEL_ALLENVIRONMENT)
749 if (all_env_cell.globalCell()!=cell)
750 ARCANE_FATAL(
"Bad corresponding globalCell() in all_env_item");
751 if (cell_nb_env != nb_env_per_cell[cell.localId()])
752 ARCANE_FATAL(
"Bad value for nb_env direct='{0}' var='{1}'",
753 cell_nb_env, nb_env_per_cell[cell.localId()]);
754 for( Integer z=0; z<cell_nb_env; ++z ){
755 EnvCell ec = all_env_cell.cell(z);
756 Integer cell_nb_mat = ec.nbMaterial();
757 matimpl::ConstituentItemBase eii = ec.constituentItemBase();
758 if (all_env_cell.constituentItemBase()!=eii._superItemBase())
759 ARCANE_FATAL(
"Bad corresponding allEnvItem() in env_item uid={0}",cell_uid);
760 if (eii.globalItemBase()!=cell)
761 ARCANE_FATAL(
"Bad corresponding globalItem() in env_item");
762 if (eii.level()!=LEVEL_ENVIRONMENT)
763 ARCANE_FATAL(
"Bad level '{0}' for in env_item",eii.level());
766 if (cell_nb_env>1 && ec._varIndex().arrayIndex()==0)
767 ARCANE_FATAL(
"Global index for a partial cell env_item={0}",ec);
769 for( Integer k=0; k<cell_nb_mat; ++k ){
770 MatCell mc = ec.cell(k);
771 matimpl::ConstituentItemBase mci = mc.constituentItemBase();
772 if (eii!=mci._superItemBase())
773 ARCANE_FATAL(
"Bad corresponding env_item in mat_item k={0} mc={1}",k,mc);
774 if (mci.globalItemBase()!=cell)
775 ARCANE_FATAL(
"Bad corresponding globalItem() in mat_item");
776 if (mci.level()!=LEVEL_MATERIAL)
777 ARCANE_FATAL(
"Bad level '{0}' for in mat_item",mci.level());
780 if ((cell_nb_env>1 || cell_nb_mat>1) && mc._varIndex().arrayIndex()==0){
781 ARCANE_FATAL(
"Global index for a partial cell matitem={0} name={1} nb_mat={2} nb_env={3}",
782 mc,mc.material()->name(),cell_nb_mat,cell_nb_env);
788 for( IMeshEnvironment* env : m_environments ){
796IMeshMaterialVariable* MeshMaterialMng::
797findVariable(
const String& name)
799 IMeshMaterialVariable* v = _findVariableFullyQualified(name);
806 const IVariable* global_var = m_variable_mng->findMeshVariable(mesh(),name);
808 v = _findVariableFullyQualified(global_var->fullName());
819IMeshMaterialVariable* MeshMaterialMng::
820_findVariableFullyQualified(
const String& name)
822 auto i = m_full_name_variable_map.find(name);
823 if (i!=m_full_name_variable_map.end())
831IMeshMaterialVariable* MeshMaterialMng::
832checkVariable(IVariable* global_var)
834 auto i = m_var_to_mat_var_map.find(global_var);
835 if (i!=m_var_to_mat_var_map.end())
843void MeshMaterialMng::
844fillWithUsedVariables(Array<IMeshMaterialVariable*>& variables)
850 for(
const auto& i : m_full_name_variable_map ){
851 IMeshMaterialVariable* ivar = i.second;
852 if (ivar->globalVariable()->isUsed())
860void MeshMaterialMng::
861_addVariable(IMeshMaterialVariable* var)
864 IVariable* gvar = var->globalVariable();
865 info(4) <<
"MAT_ADD_VAR global_var=" << gvar <<
" var=" << var <<
" this=" <<
this;
866 m_var_to_mat_var_map.insert(std::make_pair(gvar,var));
867 m_full_name_variable_map.insert(std::make_pair(gvar->fullName(),var));
873void MeshMaterialMng::
874_removeVariable(IMeshMaterialVariable* var)
877 IVariable* gvar = var->globalVariable();
878 info(4) <<
"MAT:Remove variable global_var=" << gvar <<
" var=" << var;
879 m_var_to_mat_var_map.erase(gvar);
880 m_full_name_variable_map.erase(gvar->fullName());
886void MeshMaterialMng::
887dumpInfos(std::ostream& o)
889 Integer nb_mat = m_materials.size();
890 Integer nb_env = m_environments.size();
891 Integer nb_var_idx = m_variables_indexer.size();
892 o <<
"-- Infos sur les milieux et matériaux\n";
893 o <<
"-- Nb Materiaux: " << nb_mat <<
'\n';
894 o <<
"-- Nb Milieux: " << nb_env <<
'\n';
895 o <<
"-- Nb Variables partielles: " << nb_var_idx <<
'\n';
897 o <<
"-- Liste des matériaux\n";
898 for( IMeshMaterial* mat : m_materials ){
899 o <<
"-- Materiau name=" << mat->name() <<
'\n';
902 o <<
"-- Liste des milieux\n";
903 for( IMeshEnvironment* me : m_environments ){
904 ConstArrayView<IMeshMaterial*> env_materials = me->materials();
905 const MeshMaterialVariableIndexer* env_var_idx = me->_internalApi()->variableIndexer();
906 Integer nb_env_mat = env_materials.size();
907 o <<
"-- Milieu name=" << me->name()
908 <<
" nb_mat=" << nb_env_mat
909 <<
" nb_cell=" << me->cells().size()
910 <<
" var_idx = " << env_var_idx->index()
911 <<
" ids=" << env_var_idx->matvarIndexes()
913 for( IMeshMaterial* mm : env_materials ){
914 const MeshMaterialVariableIndexer* idx = mm->_internalApi()->variableIndexer();
915 o <<
"-- Materiau\n";
916 o <<
"-- name = " << mm->name() <<
"\n";
917 o <<
"-- nb_cell = " << mm->cells().size() <<
"\n";
918 o <<
"-- var_idx = " << idx->index() <<
"\n";
926void MeshMaterialMng::
927dumpInfos2(std::ostream& o)
929 const ConstituentConnectivityList& constituent_list = *m_all_env_data->componentConnectivityList();
930 ConstArrayView<Int16> nb_env_per_cell = constituent_list.cellsNbEnvironment();
931 Integer nb_mat = m_materials.size();
932 Integer nb_env = m_environments.size();
933 Integer nb_var_idx = m_variables_indexer.size();
934 o <<
"-- Material and Environment infos: nb_env=" << nb_env
935 <<
" nb_mat=" << nb_mat <<
" timestamp=" << m_timestamp
936 <<
" nb_var_idx=" << nb_var_idx
938 Integer nb_cell = mesh()->allCells().size();
942 if (nb_env_per_cell[icell.localId()] <= 1)
945 o <<
" nb_cell=" << nb_cell <<
" nb_pure_env=" << nb_pure_env
946 <<
" nb_partial=" << (nb_cell-nb_pure_env)
947 <<
" percent=" << (100*nb_pure_env)/nb_cell
951 o <<
"-- Liste des milieux\n";
952 for( MeshEnvironment* me : m_true_environments ){
953 ConstArrayView<IMeshMaterial*> env_materials = me->materials();
954 const MeshMaterialVariableIndexer* env_var_idx = me->variableIndexer();
955 const Int16 env_id = me->componentId();
956 Integer nb_env_mat = env_materials.size();
957 Integer nb_env_cell = me->cells().size();
961 if (constituent_list.cellNbMaterial(icell, env_id) <= 1)
966 nb_pure_mat = nb_env_cell;
967 o <<
"-- Env name=" << me->name()
968 <<
" nb_mat=" << nb_env_mat
969 <<
" var_idx=" << env_var_idx->index()
970 <<
" nb_cell=" << nb_env_cell
971 <<
" nb_pure_mat=" << nb_pure_mat;
973 o <<
" percent=" << (nb_pure_mat*100)/nb_env_cell;
975 for( Integer j=0; j<nb_env_mat; ++j ){
976 IMeshMaterial* mm = env_materials[j];
977 const MeshMaterialVariableIndexer* idx = mm->_internalApi()->variableIndexer();
978 o <<
"-- Mat name=" << mm->name()
979 <<
" nb_cell=" << mm->cells().size()
980 <<
" var_idx=" << idx->index()
989bool MeshMaterialMng::
990synchronizeMaterialsInCells()
992 return m_mms->synchronizeMaterialsInCells();
998void MeshMaterialMng::
999checkMaterialsInCells(Integer max_print)
1001 m_mms->checkMaterialsInCells(max_print);
1007void MeshMaterialMng::
1008dumpCellInfos(Cell cell,std::ostream& o)
1010 CellToAllEnvCellConverter all_env_cell_converter(
this);
1011 AllEnvCell all_env_cell = all_env_cell_converter[cell];
1012 Cell global_cell = all_env_cell.globalCell();
1013 o <<
"Cell uid=" << ItemPrinter(global_cell) <<
'\n';
1015 o <<
"ENV name=" << (*ienvcell).environment()->name()
1016 <<
" component_idx=" << ComponentItemLocalId(ienvcell) <<
'\n';
1018 o <<
"MAT name=" << (*imatcell).material()->name()
1019 <<
" component_idx=" << ComponentItemLocalId(imatcell) <<
'\n';
1027CellToAllEnvCellConverter MeshMaterialMng::
1028cellToAllEnvCellConverter()
1030 return CellToAllEnvCellConverter(componentItemSharedInfo(LEVEL_ALLENVIRONMENT));
1036void MeshMaterialMng::
1039 if (m_is_end_create)
1040 ARCANE_FATAL(
"Invalid method call because endCreate() has already been called");
1046AllEnvCellVectorView MeshMaterialMng::
1047_view(SmallSpan<const Int32> local_ids)
1049 return AllEnvCellVectorView(local_ids.constSmallView(), componentItemSharedInfo(LEVEL_ALLENVIRONMENT));
1055class MeshMaterialMngFactory
1059 MeshMaterialMngFactory()
1061 IMeshMaterialMng::_internalSetFactory(
this);
1063 ~MeshMaterialMngFactory()
1065 IMeshMaterialMng::_internalSetFactory(
nullptr);
1070 static MeshMaterialMngFactory m_mesh_material_mng_factory;
1055class MeshMaterialMngFactory {
…};
1079getTrueReference(
const MeshHandle& mesh_handle,
bool is_create)
1084 const char* name =
"MeshMaterialMng_StdMat";
1091 IMeshMaterialMng* mm = arcaneCreateMeshMaterialMng(mesh_handle,
"StdMat");
1092 Ref<IMeshMaterialMng> mm_ref = makeRef(mm);
1093 udlist->
setData(name,
new UserDataType(
new Ref<IMeshMaterialMng>(mm_ref)));
1096 auto adud =
dynamic_cast<UserDataType*
>(ud);
1099 return *(adud->data());
1105bool MeshMaterialMng::
1106isInMeshMaterialExchange()
const
1108 return m_exchange_mng->isInMeshMaterialExchange();
1114void MeshMaterialMng::
1115_checkCreateProperties()
1119 m_properties = std::make_unique<Properties>(*(mesh()->properties()),String(
"MeshMaterialMng_")+name());
1126const Int32 SERIALIZE_VERSION = 1;
1128void MeshMaterialMng::
1129_saveInfosInProperties()
1131 _checkCreateProperties();
1134 m_properties->set(
"Version",SERIALIZE_VERSION);
1138 UniqueArray<String> material_info_names;
1139 for( MeshMaterialInfo* mat_info : m_materials_info ){
1140 material_info_names.add(mat_info->name());
1142 m_properties->set(
"MaterialInfoNames",material_info_names);
1144 UniqueArray<String> env_names;
1145 UniqueArray<Int32> env_nb_mat;
1146 UniqueArray<String> env_mat_names;
1148 IMeshEnvironment* env = *ienv;
1149 env_names.add(env->name());
1150 info(5) <<
"SAVE ENV_NAME name=" << env->name() <<
" nb_mat=" << env->nbMaterial();
1151 env_nb_mat.add(env->nbMaterial());
1153 const String& name = (*imat)->infos()->name();
1154 info(5) <<
"SAVE MAT_NAME name=" << name;
1155 env_mat_names.add(name);
1158 m_properties->set(
"EnvNames",env_names);
1159 m_properties->set(
"EnvNbMat",env_nb_mat);
1160 m_properties->set(
"EnvMatNames",env_mat_names);
1164 UniqueArray<String> block_names;
1165 UniqueArray<String> block_cell_group_names;
1166 UniqueArray<Int32> block_nb_env;
1167 UniqueArray<String> block_env_names;
1168 for( IMeshBlock* block : m_blocks ){
1169 block_names.add(block->name());
1170 block_cell_group_names.add(block->cells().name());
1171 block_nb_env.add(block->nbEnvironment());
1173 const String& name = (*ienv)->name();
1174 info(5) <<
"SAVE BLOCK ENV_NAME name=" << name;
1175 block_env_names.add(name);
1178 m_properties->set(
"BlockNames",block_names);
1179 m_properties->set(
"BlockCellGroupNames",block_cell_group_names);
1180 m_properties->set(
"BlockNbEnv",block_nb_env);
1181 m_properties->set(
"BlockEnvNames",block_env_names);
1187void MeshMaterialMng::
1190 if (m_is_end_create)
1193 _checkCreateProperties();
1195 info() <<
"Creating material infos from dump";
1198 Int32 v = m_properties->getInt32(
"Version");
1199 if (v!=SERIALIZE_VERSION)
1200 ARCANE_FATAL(
"Bad serializer version: trying to read from incompatible checkpoint v={0} expected={1}",
1201 v,SERIALIZE_VERSION);
1203 UniqueArray<String> material_info_names;
1204 m_properties->get(
"MaterialInfoNames",material_info_names);
1205 for(
const String& mat_name : material_info_names )
1206 this->registerMaterialInfo(mat_name);
1208 UniqueArray<String> env_names;
1209 UniqueArray<Int32> env_nb_mat;
1210 UniqueArray<String> env_mat_names;
1211 m_properties->get(
"EnvNames",env_names);
1212 m_properties->get(
"EnvNbMat",env_nb_mat);
1213 m_properties->get(
"EnvMatNames",env_mat_names);
1216 for( Integer ienv=0, nenv=env_names.size(); ienv<nenv; ++ienv ){
1217 Materials::MeshEnvironmentBuildInfo env_build(env_names[ienv]);
1218 Integer nb_mat = env_nb_mat[ienv];
1219 for( Integer imat=0; imat<nb_mat; ++imat ){
1220 env_build.addMaterial(env_mat_names[mat_index]);
1223 this->createEnvironment(env_build);
1228 UniqueArray<String> block_names;
1229 UniqueArray<String> block_cell_group_names;
1230 UniqueArray<String> block_env_names;
1231 UniqueArray<Int32> block_nb_env;
1232 m_properties->get(
"BlockNames",block_names);
1233 m_properties->get(
"BlockCellGroupNames",block_cell_group_names);
1234 m_properties->get(
"BlockNbEnv",block_nb_env);
1235 m_properties->get(
"BlockEnvNames",block_env_names);
1236 const IItemFamily* cell_family = mesh()->cellFamily();
1238 for( Integer i=0, n=block_names.size(); i<n; ++i ){
1239 String name = block_names[i];
1240 String cell_group_name = block_cell_group_names[i];
1241 CellGroup cells = cell_family->findGroup(cell_group_name);
1243 ARCANE_FATAL(
"Can not find cell group '{0}' for block creation",
1245 MeshBlockBuildInfo mbbi(name,cells);
1246 if (!block_nb_env.empty()){
1247 Integer nb_env = block_nb_env[i];
1248 for( Integer ienv=0; ienv<nb_env; ++ienv ){
1249 const String& name2 = block_env_names[block_env_index];
1251 IMeshEnvironment* env = findEnvironment(name2,
false);
1253 ARCANE_FATAL(
"Invalid environment name '{0}' for recreating blocks",name2);
1254 mbbi.addEnvironment(env);
1257 this->createBlock(mbbi);
1266void MeshMaterialMng::
1273 m_exchange_mng.reset();
1275 _unregisterAllVariables();
1281void MeshMaterialMng::
1282_unregisterAllVariables()
1287 UniqueArray<MeshMaterialVariableRef*> m_all_refs;
1289 for(
const auto& i : m_full_name_variable_map ){
1290 const IMeshMaterialVariable* var = i.second;
1292 for( MeshMaterialVariableRef::Enumerator iref(var); iref.hasNext(); ++iref ){
1293 MeshMaterialVariableRef* ref = *iref;
1294 m_all_refs.add(ref);
1298 for( MeshMaterialVariableRef* ref : m_all_refs )
1299 ref->unregisterVariable();
1305ComponentItemSharedInfo* MeshMaterialMng::
1306componentItemSharedInfo(Int32 level)
const
1308 ComponentItemInternalData* data = m_all_env_data->componentItemInternalData();
1309 ComponentItemSharedInfo* shared_info =
nullptr;
1310 if (level == LEVEL_MATERIAL)
1311 shared_info = data->matSharedInfo();
1312 else if (level == LEVEL_ENVIRONMENT)
1313 shared_info = data->envSharedInfo();
1314 else if (level==LEVEL_ALLENVIRONMENT)
1315 shared_info = data->allEnvSharedInfo();
1325void MeshMaterialMng::
1328 IEnumeratorTracer* tracer = IEnumeratorTracer::singleton();
1330 tracer->dumpStats();
1333 m_modifier->dumpStats();
1335 for (IMeshEnvironment* env : m_environments) {
1339 if (env->nbMaterial() > 1)
1340 env->_internalApi()->variableIndexer()->dumpStats();
1342 for (IMeshMaterial* mat : m_materials) {
1343 mat->_internalApi()->variableIndexer()->dumpStats();
1350void MeshMaterialMng::
1351createAllCellToAllEnvCell()
1353 if (!m_accelerator_envcell_container) {
1354 m_accelerator_envcell_container = std::make_unique<AllCellToAllEnvCellContainer>(
this);
1355 m_accelerator_envcell_container->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.
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.