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)
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);
376 ARCANE_FATAL(
"Invalid materialMng() for material info");
379 Integer var_index = m_variables_indexer.size();
380 Int16 mat_id = CheckedConvert::toInt16(m_materials.size());
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());
405 m_materials_info.add(mmi);
422 Int16 env_index = CheckedConvert::toInt16(m_environments.size());
427 ARCANE_FATAL(
"Un milieu de nom '{0}' est déjà enregistré", env_name);
429 info() <<
"Creating environment name=" << env_name <<
" index=" << env_index;
433 m_true_environments.add(me);
434 m_environments.add(me);
435 m_environments_as_components.add(me);
440 for (
Integer i = 0; i < nb_mat; ++i) {
442 const String& mat_name = buildinfo.m_name;
443 String new_mat_name = env_name +
"_" + mat_name;
446 ARCANE_FATAL(
"Aucun matériau de nom '{0}' n'est défini", mat_name);
450 mat_info->_addEnvironment(env_name);
458 var_idx = me->
materials()[0]->_internalApi()->variableIndexer();
462 _addVariableIndexer(var_idx);
463 m_variables_indexer_to_destroy.add(var_idx);
465 me->setVariableIndexer(var_idx);
478 Int32 block_index = m_blocks.size();
485 info() <<
"Creating block name=" <<
name <<
" index=" << block_index
488 for (
Integer i = 0; i < nb_env; ++i)
489 info() <<
" Adding environment name=" << infos.
environments()[i]->name() <<
" to block";
494 m_true_blocks.add(mb);
503void MeshMaterialMng::
513void MeshMaterialMng::
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();
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) {
554 info(4) <<
"BUILD FROM MANAGER name=" << mv->
name() <<
" this=" <<
this;
559 m_is_end_create =
true;
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;
613 return m_modifier.get();
620_findMaterialInfo(
const String& name)
623 if (mmi->name() == name)
632findEnvironment(
const String&
name,
bool throw_exception)
646_findEnvironment(
const String& name)
649 if (env->name() == name)
658findBlock(
const String&
name,
bool throw_exception)
672_findBlock(
const String& name)
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) {
715 info(4) <<
"SYNC REFERENCES FROM MANAGER name=" << mv->
name();
723void MeshMaterialMng::
728 for (
const auto& i : m_full_name_variable_map) {
730 functor->executeFunctor(mv);
737void MeshMaterialMng::
742 ConstArrayView<Int16> nb_env_per_cell = m_all_env_data->componentConnectivityList()->cellsNbEnvironment();
748 if (all_env_cell.
level() != LEVEL_ALLENVIRONMENT)
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) {
758 Integer cell_nb_mat = ec.nbMaterial();
761 ARCANE_FATAL(
"Bad corresponding allEnvItem() in env_item uid={0}", cell_uid);
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());
769 ARCANE_FATAL(
"Global index for a partial cell env_item={0}", ec);
771 for (
Integer k = 0; k < cell_nb_mat; ++k) {
775 ARCANE_FATAL(
"Bad corresponding env_item in mat_item k={0} mc={1}", k, mc);
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());
783 ARCANE_FATAL(
"Global index for a partial cell matitem={0} name={1} nb_mat={2} nb_env={3}",
810 v = _findVariableFullyQualified(global_var->
fullName());
822_findVariableFullyQualified(
const String& name)
824 auto i = m_full_name_variable_map.find(name);
825 if (i != m_full_name_variable_map.end())
836 auto i = m_var_to_mat_var_map.find(global_var);
837 if (i != m_var_to_mat_var_map.end())
845void MeshMaterialMng::
852 for (
const auto& i : m_full_name_variable_map) {
862void MeshMaterialMng::
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::
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";
901 o <<
"-- Materiau name=" << mat->name() <<
'\n';
904 o <<
"-- Liste des milieux\n";
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()
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)
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
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();
960 Integer nb_pure_mat = 0;
961 if (nb_env_mat > 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)
1013 AllEnvCell all_env_cell = all_env_cell_converter[cell];
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';
1030cellToAllEnvCellConverter()
1038void MeshMaterialMng::
1041 if (m_is_end_create)
1042 ARCANE_FATAL(
"Invalid method call because endCreate() has already been called");
1057class MeshMaterialMngFactory
1062 MeshMaterialMngFactory()
1066 ~MeshMaterialMngFactory()
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);
1211 m_properties->get(
"MaterialInfoNames", material_info_names);
1212 for (
const String& mat_name : material_info_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) {
1225 Integer nb_mat = env_nb_mat[ienv];
1226 for (
Integer imat = 0; imat < nb_mat; ++imat) {
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);
1245 for (
Integer i = 0, n = block_names.
size(); i < n; ++i) {
1247 String cell_group_name = block_cell_group_names[i];
1250 ARCANE_FATAL(
"Can not find cell group '{0}' for block creation",
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];
1260 ARCANE_FATAL(
"Invalid environment name '{0}' for recreating blocks", name2);
1273void MeshMaterialMng::
1280 m_exchange_mng.reset();
1282 _unregisterAllVariables();
1288void MeshMaterialMng::
1289_unregisterAllVariables()
1296 for (
const auto& i : m_full_name_variable_map) {
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.
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.
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.
Fonctions utilitaires de gestion mémoire.