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)
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);
375 ARCANE_FATAL(
"Invalid materialMng() for material info");
378 Integer var_index = m_variables_indexer.size();
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());
404 m_materials_info.add(mmi);
426 ARCANE_FATAL(
"Un milieu de nom '{0}' est déjà enregistré",env_name);
428 info() <<
"Creating environment name=" << env_name <<
" index=" << env_index;
432 m_true_environments.add(me);
433 m_environments.add(me);
434 m_environments_as_components.add(me);
439 for(
Integer i=0; i<nb_mat; ++i ){
441 const String& mat_name = buildinfo.m_name;
442 String new_mat_name = env_name +
"_" + mat_name;
445 ARCANE_FATAL(
"Aucun matériau de nom '{0}' n'est défini",mat_name);
449 mat_info->_addEnvironment(env_name);
457 var_idx = me->
materials()[0]->_internalApi()->variableIndexer();
461 _addVariableIndexer(var_idx);
462 m_variables_indexer_to_destroy.add(var_idx);
464 me->setVariableIndexer(var_idx);
477 Int32 block_index = m_blocks.size();
484 info() <<
"Creating block name=" <<
name <<
" index=" << block_index
487 for(
Integer i=0; i<nb_env; ++i )
488 info() <<
" Adding environment name=" << infos.
environments()[i]->name() <<
" to block";
493 m_true_blocks.add(mb);
502void MeshMaterialMng::
512void MeshMaterialMng::
522void MeshMaterialMng::
523endCreate(
bool is_continue)
528 _saveInfosInProperties();
530 info() <<
"END CREATE MATERIAL_MNG is_continue=" << is_continue;
532 m_modifier = std::make_unique<MeshMaterialModifierImpl>(
this);
533 m_modifier->initOptimizationFlags();
535 m_all_env_data->endCreate(is_continue);
537 auto synchronizer =
mesh()->cellFamily()->allItemsSynchronizer();
539 m_all_cells_env_only_synchronizer = std::make_unique<MeshMaterialVariableSynchronizer>(
this,synchronizer,
MatVarSpace::Environment);
543 Integer nb_component = m_environments_as_components.size() + m_materials_as_components.size();
544 m_components.reserve(nb_component);
545 m_components.addRange(m_environments_as_components);
546 m_components.addRange(m_materials_as_components);
551 for(
const auto& i : m_full_name_variable_map ){
553 info(4) <<
"BUILD FROM MANAGER name=" << mv->
name() <<
" this=" <<
this;
558 m_is_end_create =
true;
572 m_exchange_mng->registerFactory();
578void MeshMaterialMng::
579setModificationFlags(
int v)
582 m_modification_flags = v;
583 info() <<
"Setting ModificationFlags to v=" << v;
589void MeshMaterialMng::
590setAllocateScalarEnvironmentVariableAsMaterial(
bool v)
593 m_is_allocate_scalar_environment_variable_as_material = v;
594 info() <<
"Setting AllocateScalarEnvironmentVariableAsMaterial to v=" << v;
600void MeshMaterialMng::
601setDataCompressorServiceName(
const String&
name)
603 m_data_compressor_service_name =
name;
612 return m_modifier.get();
619_findMaterialInfo(
const String& name)
622 if (mmi->name()==name)
631findEnvironment(
const String&
name,
bool throw_exception)
645_findEnvironment(
const String& name)
648 if (env->name()==name)
657findBlock(
const String&
name,
bool throw_exception)
671_findBlock(
const String& name)
682void MeshMaterialMng::
694void MeshMaterialMng::
697 m_all_env_data->forceRecompute(
true);
709void MeshMaterialMng::
710syncVariablesReferences(
bool check_resize)
712 for(
const auto& i : m_full_name_variable_map ){
714 info(4) <<
"SYNC REFERENCES FROM MANAGER name=" << mv->
name();
722void MeshMaterialMng::
727 for(
const auto& i : m_full_name_variable_map ){
729 functor->executeFunctor(mv);
736void MeshMaterialMng::
741 ConstArrayView<Int16> nb_env_per_cell = m_all_env_data->componentConnectivityList()->cellsNbEnvironment();
747 if (all_env_cell.
level()!=LEVEL_ALLENVIRONMENT)
751 ARCANE_FATAL(
"Bad corresponding globalCell() in all_env_item");
752 if (cell_nb_env != nb_env_per_cell[cell.
localId()])
753 ARCANE_FATAL(
"Bad value for nb_env direct='{0}' var='{1}'",
754 cell_nb_env, nb_env_per_cell[cell.
localId()]);
755 for(
Integer z=0; z<cell_nb_env; ++z ){
757 Integer cell_nb_mat = ec.nbMaterial();
760 ARCANE_FATAL(
"Bad corresponding allEnvItem() in env_item uid={0}",cell_uid);
762 ARCANE_FATAL(
"Bad corresponding globalItem() in env_item");
763 if (eii.level()!=LEVEL_ENVIRONMENT)
764 ARCANE_FATAL(
"Bad level '{0}' for in env_item",eii.level());
768 ARCANE_FATAL(
"Global index for a partial cell env_item={0}",ec);
770 for(
Integer k=0; k<cell_nb_mat; ++k ){
774 ARCANE_FATAL(
"Bad corresponding env_item in mat_item k={0} mc={1}",k,mc);
776 ARCANE_FATAL(
"Bad corresponding globalItem() in mat_item");
777 if (mci.level()!=LEVEL_MATERIAL)
778 ARCANE_FATAL(
"Bad level '{0}' for in mat_item",mci.level());
782 ARCANE_FATAL(
"Global index for a partial cell matitem={0} name={1} nb_mat={2} nb_env={3}",
809 v = _findVariableFullyQualified(global_var->
fullName());
821_findVariableFullyQualified(
const String& name)
823 auto i = m_full_name_variable_map.find(name);
824 if (i!=m_full_name_variable_map.end())
835 auto i = m_var_to_mat_var_map.find(global_var);
836 if (i!=m_var_to_mat_var_map.end())
844void MeshMaterialMng::
851 for(
const auto& i : m_full_name_variable_map ){
861void MeshMaterialMng::
866 info(4) <<
"MAT_ADD_VAR global_var=" << gvar <<
" var=" << var <<
" this=" <<
this;
867 m_var_to_mat_var_map.insert(std::make_pair(gvar,var));
868 m_full_name_variable_map.insert(std::make_pair(gvar->
fullName(),var));
874void MeshMaterialMng::
879 info(4) <<
"MAT:Remove variable global_var=" << gvar <<
" var=" << var;
880 m_var_to_mat_var_map.erase(gvar);
881 m_full_name_variable_map.erase(gvar->
fullName());
887void MeshMaterialMng::
888dumpInfos(std::ostream& o)
890 Integer nb_mat = m_materials.size();
891 Integer nb_env = m_environments.size();
892 Integer nb_var_idx = m_variables_indexer.size();
893 o <<
"-- Infos sur les milieux et matériaux\n";
894 o <<
"-- Nb Materiaux: " << nb_mat <<
'\n';
895 o <<
"-- Nb Milieux: " << nb_env <<
'\n';
896 o <<
"-- Nb Variables partielles: " << nb_var_idx <<
'\n';
898 o <<
"-- Liste des matériaux\n";
900 o <<
"-- Materiau name=" << mat->name() <<
'\n';
903 o <<
"-- Liste des milieux\n";
908 o <<
"-- Milieu name=" << me->name()
909 <<
" nb_mat=" << nb_env_mat
910 <<
" nb_cell=" << me->cells().size()
911 <<
" var_idx = " << env_var_idx->index()
912 <<
" ids=" << env_var_idx->matvarIndexes()
916 o <<
"-- Materiau\n";
917 o <<
"-- name = " << mm->
name() <<
"\n";
918 o <<
"-- nb_cell = " << mm->cells().size() <<
"\n";
919 o <<
"-- var_idx = " << idx->index() <<
"\n";
927void MeshMaterialMng::
928dumpInfos2(std::ostream& o)
932 Integer nb_mat = m_materials.size();
933 Integer nb_env = m_environments.size();
934 Integer nb_var_idx = m_variables_indexer.size();
935 o <<
"-- Material and Environment infos: nb_env=" << nb_env
936 <<
" nb_mat=" << nb_mat <<
" timestamp=" << m_timestamp
937 <<
" nb_var_idx=" << nb_var_idx
943 if (nb_env_per_cell[icell.localId()] <= 1)
946 o <<
" nb_cell=" << nb_cell <<
" nb_pure_env=" << nb_pure_env
947 <<
" nb_partial=" << (nb_cell-nb_pure_env)
948 <<
" percent=" << (100*nb_pure_env)/nb_cell
952 o <<
"-- Liste des milieux\n";
953 for( MeshEnvironment* me : m_true_environments ){
954 ConstArrayView<IMeshMaterial*> env_materials = me->materials();
955 const MeshMaterialVariableIndexer* env_var_idx = me->variableIndexer();
956 const Int16 env_id = me->componentId();
957 Integer nb_env_mat = env_materials.size();
958 Integer nb_env_cell = me->cells().size();
959 Integer nb_pure_mat = 0;
967 nb_pure_mat = nb_env_cell;
968 o <<
"-- Env name=" << me->name()
969 <<
" nb_mat=" << nb_env_mat
970 <<
" var_idx=" << env_var_idx->index()
971 <<
" nb_cell=" << nb_env_cell
972 <<
" nb_pure_mat=" << nb_pure_mat;
974 o <<
" percent=" << (nb_pure_mat*100)/nb_env_cell;
976 for( Integer j=0; j<nb_env_mat; ++j ){
977 IMeshMaterial* mm = env_materials[j];
978 const MeshMaterialVariableIndexer* idx = mm->_internalApi()->variableIndexer();
979 o <<
"-- Mat name=" << mm->name()
980 <<
" nb_cell=" << mm->cells().size()
981 <<
" var_idx=" << idx->index()
990bool MeshMaterialMng::
991synchronizeMaterialsInCells()
993 return m_mms->synchronizeMaterialsInCells();
999void MeshMaterialMng::
1000checkMaterialsInCells(
Integer max_print)
1002 m_mms->checkMaterialsInCells(max_print);
1008void MeshMaterialMng::
1009dumpCellInfos(
Cell cell,std::ostream& o)
1012 AllEnvCell all_env_cell = all_env_cell_converter[cell];
1014 o <<
"Cell uid=" <<
ItemPrinter(global_cell) <<
'\n';
1016 o <<
"ENV name=" << (*ienvcell).environment()->name()
1017 <<
" component_idx=" << ComponentItemLocalId(ienvcell) <<
'\n';
1019 o <<
"MAT name=" << (*imatcell).material()->name()
1020 <<
" component_idx=" << ComponentItemLocalId(imatcell) <<
'\n';
1029cellToAllEnvCellConverter()
1037void MeshMaterialMng::
1040 if (m_is_end_create)
1041 ARCANE_FATAL(
"Invalid method call because endCreate() has already been called");
1056class MeshMaterialMngFactory
1060 MeshMaterialMngFactory()
1064 ~MeshMaterialMngFactory()
1071 static MeshMaterialMngFactory m_mesh_material_mng_factory;
1080getTrueReference(
const MeshHandle& mesh_handle,
bool is_create)
1085 const char* name =
"MeshMaterialMng_StdMat";
1092 IMeshMaterialMng* mm = arcaneCreateMeshMaterialMng(mesh_handle,
"StdMat");
1093 Ref<IMeshMaterialMng> mm_ref = makeRef(mm);
1094 udlist->
setData(name,
new UserDataType(
new Ref<IMeshMaterialMng>(mm_ref)));
1097 auto adud =
dynamic_cast<UserDataType*
>(ud);
1100 return *(adud->data());
1106bool MeshMaterialMng::
1107isInMeshMaterialExchange()
const
1109 return m_exchange_mng->isInMeshMaterialExchange();
1115void MeshMaterialMng::
1116_checkCreateProperties()
1120 m_properties = std::make_unique<Properties>(*(
mesh()->properties()),
String(
"MeshMaterialMng_")+name());
1127const Int32 SERIALIZE_VERSION = 1;
1129void MeshMaterialMng::
1130_saveInfosInProperties()
1132 _checkCreateProperties();
1135 m_properties->set(
"Version",SERIALIZE_VERSION);
1139 UniqueArray<String> material_info_names;
1140 for( MeshMaterialInfo* mat_info : m_materials_info ){
1141 material_info_names.add(mat_info->name());
1143 m_properties->set(
"MaterialInfoNames",material_info_names);
1145 UniqueArray<String> env_names;
1146 UniqueArray<Int32> env_nb_mat;
1147 UniqueArray<String> env_mat_names;
1149 IMeshEnvironment* env = *ienv;
1150 env_names.add(env->name());
1151 info(5) <<
"SAVE ENV_NAME name=" << env->name() <<
" nb_mat=" << env->nbMaterial();
1152 env_nb_mat.add(env->nbMaterial());
1154 const String& name = (*imat)->infos()->name();
1155 info(5) <<
"SAVE MAT_NAME name=" << name;
1156 env_mat_names.add(name);
1159 m_properties->set(
"EnvNames",env_names);
1160 m_properties->set(
"EnvNbMat",env_nb_mat);
1161 m_properties->set(
"EnvMatNames",env_mat_names);
1165 UniqueArray<String> block_names;
1166 UniqueArray<String> block_cell_group_names;
1167 UniqueArray<Int32> block_nb_env;
1168 UniqueArray<String> block_env_names;
1169 for( IMeshBlock* block : m_blocks ){
1170 block_names.add(block->name());
1171 block_cell_group_names.add(block->cells().name());
1172 block_nb_env.add(block->nbEnvironment());
1174 const String& name = (*ienv)->name();
1175 info(5) <<
"SAVE BLOCK ENV_NAME name=" << name;
1176 block_env_names.add(name);
1179 m_properties->set(
"BlockNames",block_names);
1180 m_properties->set(
"BlockCellGroupNames",block_cell_group_names);
1181 m_properties->set(
"BlockNbEnv",block_nb_env);
1182 m_properties->set(
"BlockEnvNames",block_env_names);
1188void MeshMaterialMng::
1191 if (m_is_end_create)
1194 _checkCreateProperties();
1196 info() <<
"Creating material infos from dump";
1199 Int32 v = m_properties->getInt32(
"Version");
1200 if (v!=SERIALIZE_VERSION)
1201 ARCANE_FATAL(
"Bad serializer version: trying to read from incompatible checkpoint v={0} expected={1}",
1202 v,SERIALIZE_VERSION);
1205 m_properties->get(
"MaterialInfoNames",material_info_names);
1206 for(
const String& mat_name : material_info_names )
1212 m_properties->get(
"EnvNames",env_names);
1213 m_properties->get(
"EnvNbMat",env_nb_mat);
1214 m_properties->get(
"EnvMatNames",env_mat_names);
1217 for(
Integer ienv=0, nenv=env_names.
size(); ienv<nenv; ++ienv ){
1219 Integer nb_mat = env_nb_mat[ienv];
1220 for(
Integer imat=0; imat<nb_mat; ++imat ){
1233 m_properties->get(
"BlockNames",block_names);
1234 m_properties->get(
"BlockCellGroupNames",block_cell_group_names);
1235 m_properties->get(
"BlockNbEnv",block_nb_env);
1236 m_properties->get(
"BlockEnvNames",block_env_names);
1239 for(
Integer i=0, n=block_names.
size(); i<n; ++i ){
1241 String cell_group_name = block_cell_group_names[i];
1244 ARCANE_FATAL(
"Can not find cell group '{0}' for block creation",
1247 if (!block_nb_env.
empty()){
1248 Integer nb_env = block_nb_env[i];
1249 for(
Integer ienv=0; ienv<nb_env; ++ienv ){
1250 const String& name2 = block_env_names[block_env_index];
1254 ARCANE_FATAL(
"Invalid environment name '{0}' for recreating blocks",name2);
1267void MeshMaterialMng::
1274 m_exchange_mng.reset();
1276 _unregisterAllVariables();
1282void MeshMaterialMng::
1283_unregisterAllVariables()
1290 for(
const auto& i : m_full_name_variable_map ){
1295 m_all_refs.
add(ref);
1299 for( MeshMaterialVariableRef* ref : m_all_refs )
1300 ref->unregisterVariable();
1306ComponentItemSharedInfo* MeshMaterialMng::
1307componentItemSharedInfo(Int32 level)
const
1309 ComponentItemInternalData* data = m_all_env_data->componentItemInternalData();
1310 ComponentItemSharedInfo* shared_info =
nullptr;
1311 if (level == LEVEL_MATERIAL)
1312 shared_info = data->matSharedInfo();
1313 else if (level == LEVEL_ENVIRONMENT)
1314 shared_info = data->envSharedInfo();
1315 else if (level==LEVEL_ALLENVIRONMENT)
1316 shared_info = data->allEnvSharedInfo();
1326void MeshMaterialMng::
1329 IEnumeratorTracer* tracer = IEnumeratorTracer::singleton();
1331 tracer->dumpStats();
1334 m_modifier->dumpStats();
1336 for (IMeshEnvironment* env : m_environments) {
1340 if (env->nbMaterial() > 1)
1341 env->_internalApi()->variableIndexer()->dumpStats();
1343 for (IMeshMaterial* mat : m_materials) {
1344 mat->_internalApi()->variableIndexer()->dumpStats();
1351void MeshMaterialMng::
1352createAllCellToAllEnvCell()
1354 if (!m_accelerator_envcell_container) {
1355 m_accelerator_envcell_container = std::make_unique<AllCellToAllEnvCellContainer>(
this);
1356 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.
Integer size() const
Nombre d'éléments du vecteur.
bool empty() const
Capacité (nombre d'éléments alloués) du vecteur.
Tableau d'items de types quelconques.
void clear()
Supprime les éléments du tableau.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
UserData s'auto-détruisant une fois détaché.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Interface d'un fonctor avec argument mais sans valeur de retour.
Interface d'une famille d'entités.
virtual ItemGroup findGroup(const String &name) const =0
Recherche un groupe.
virtual ItemGroup allItems() const =0
Groupe de toutes les entités.
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 d'une variable.
virtual String fullName() const =0
Nom complet de la variable (avec le préfixe de la famille)
virtual bool isUsed() const =0
Etat d'utilisation de la variable.
Groupe d'entités de maillage.
ItemVectorView view() const
Vue sur les entités du groupe.
bool null() const
true is le groupe est le groupe nul
Classe utilitaire pour imprimer les infos sur une entité.
Int32ConstArrayView localIds() const
Tableau des numéros locaux des entités.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Vue sur une liste de mailles avec infos sur les milieux.
Maille arcane avec info matériaux et milieux.
__host__ __device__ Int32 nbEnvironment() const
Nombre de milieux présents dans la maille.
EnvCell cell(Int32 i) const
i-ème maille milieu
Conversion de 'Cell' en 'AllEnvCell'.
Gestion des listes de connectivité des constituants.
Int16 cellNbMaterial(CellLocalId cell_id, Int16 env_id)
Nombre de matériaux de la maille cell_id pour le milieu d'indice env_id.
Cell globalCell() const
Maille globale.
__host__ __device__ Int32 level() const
Niveau hiérarchique de l'entité
__host__ __device__ MatVarIndex _varIndex() const
Maille arcane d'un milieu.
__host__ __device__ MatCell cell(Integer i) const
i-ème maille matériau de cette maille
Interface d'un bloc d'un maillage.
virtual String name() const =0
Nom du composant.
Interface d'un milieu d'un maillage.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
static void _internalSetFactory(IFactory *f)
Interface du gestionnaire de fabrique de variables matériaux.
virtual void syncReferences(bool check_resize)=0
Synchronise les références.
Interface d'une variable matériau d'un maillage.
virtual IVariable * globalVariable() const =0
Variable globale sur le maillage associée.
virtual String name() const =0
Nom de la variable.
virtual void buildFromManager(bool is_continue)=0
Construit les infos de la variable. A usage interne à Arcane.
Interface d'un matériau d'un maillage.
Représente un matériau d'une maille multi-matériau.
IMeshMaterial * material() const
Materiau associé
constexpr __host__ __device__ Int32 arrayIndex() const
Retourne l'indice du tableau de valeur dans la liste des variables.
Informations pour la création d'un milieu.
void addMaterial(const String &name)
Ajoute le matériau de nom name au milieu.
ConstArrayView< MatInfo > materials() const
const String & name() const
Nom du milieu.
void build()
Fonctions publiques mais réservées au IMeshMaterialMng.
ConstArrayView< IMeshMaterial * > materials() override
Liste des matériaux de ce milieu.
IMeshMaterialMng * materialMng() override
Gestionnaire associé.
String name() const override
Nom du composant.
Infos d'un matériau d'un maillage.
IMeshMaterialMng * materialMng()
Gestionnaire associé.
Implémentation d'un gestion des matériaux.
AllEnvCellVectorView view(const CellGroup &cells) final
Vue sur les mailles milieux correspondant au groupe cells.
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.
ITraceMng * traceMng() override
Gestionnaire de traces.
IMesh * mesh() override
Maillage associé.
MeshMaterialInfo * registerMaterialInfo(const String &name) override
Enregistre les infos du matériau de nom name.
IMeshEnvironment * createEnvironment(const MeshEnvironmentBuildInfo &infos) override
Création d'un milieu.
void _endUpdate()
Remise à jour des structures suite à une modification des mailles de matériaux ou de milieux.
IMeshEnvironment * findEnvironment(const String &name, bool throw_exception=true) override
Retourne le milieux de nom name.
MeshMaterial * _createMaterial(MeshEnvironment *env, MeshMaterialInfo *infos, const String &name)
Création d'un matériau.
String name() const override
Nom du gestionnaire.
Indexer pour les variables materiaux.
const String & name() const
Nom de l'indexeur.
Classe de base des références aux variables matériaux.
void build()
Fonctions publiques mais réservées au IMeshMaterialMng.
Informations génériques sur une entité d'un constituant.
__host__ __device__ matimpl::ConstituentItemBase _superItemBase() const
Composant supérieur (0 si aucun)
impl::ItemBase globalItemBase() const
Entité globale correspondante.
Informations pour la création d'un bloc.
ConstArrayView< IMeshEnvironment * > environments() const
Liste des milieux du bloc.
void addEnvironment(IMeshEnvironment *env)
Ajoute le milieu env au bloc.
const String & name() const
Nom du bloc.
void removeEnvironment(IMeshEnvironment *env)
Supprime le milieu env au bloc.
void build()
Fonctions publiques mais réservées au IMeshMaterialMng.
void addEnvironment(IMeshEnvironment *env)
Ajoute le milieu env au bloc.
IUserDataList * meshUserDataList() const
Données utilisateurs associées.
Référence à une instance.
Vue d'un tableau d'éléments de type T.
constexpr ConstArrayView< value_type > constSmallView() const
Vue constante sur cette vue.
Chaîne de caractères unicode.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
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.
Int16 toInt16(Int64 v)
Converti un Int64 en un Int16.
Active toujours les traces dans les parties Arcane concernant les matériaux.
@ Environment
Variable ayant des valeurs uniquement sur les milieux.
@ MaterialAndEnvironment
Variable ayant des valeurs sur les milieux et matériaux.
bool arcaneIsCheck()
Vrai si on est en mode vérification.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
std::int16_t Int16
Type entier signé sur 16 bits.
std::int32_t Int32
Type entier signé sur 32 bits.