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"
88 arcaneCreateMeshMaterialMng(
const MeshHandle& mesh_handle,
const String& name)
101MeshMaterialMng::RunnerInfo::
102RunnerInfo(Runner& runner)
106, m_sequential_run_queue(
makeQueue(m_sequential_runner))
108, m_multi_thread_run_queue(
makeQueue(m_multi_thread_runner))
115void MeshMaterialMng::RunnerInfo::
116initializeAsyncPool(Int32 nb_queue)
122 m_async_queue_pool.initialize(m_runner, nb_queue);
124 m_async_queue_pool.setAsync(
true);
130RunQueue MeshMaterialMng::RunnerInfo::
131runQueue(Accelerator::eExecutionPolicy policy)
const
133 if (policy == Accelerator::eExecutionPolicy::None)
135 if (policy == Accelerator::eExecutionPolicy::Sequential)
136 return m_sequential_run_queue;
137 if (policy == Accelerator::eExecutionPolicy::Thread)
138 return m_multi_thread_run_queue;
139 ARCANE_FATAL(
"Invalid value '{0}' for execution policy. Valid values are None, Sequential or Thread", policy);
149MeshMaterialMng(
const MeshHandle& mesh_handle,
const String& name)
151: TraceAccessor(mesh_handle.traceMng())
152, m_mesh_handle(mesh_handle)
153, m_internal_api(std::make_unique<InternalApi>(this))
154, m_variable_mng(mesh_handle.variableMng())
158 m_all_env_data = std::make_unique<AllEnvData>(
this);
159 m_exchange_mng = std::make_unique<MeshMaterialExchangeMng>(
this);
160 m_variable_factory_mng = arcaneCreateMeshMaterialVariableFactoryMng(
this);
161 m_observer_pool = std::make_unique<ObserverPool>();
162 m_observer_pool->addObserver(
this, &MeshMaterialMng::_onMeshDestroyed, mesh_handle.onDestroyObservable());
164 String s = platform::getEnvironmentVariable(
"ARCANE_ALLENVCELL_FOR_RUNCOMMAND");
166 m_is_use_accelerator_envcell_container =
true;
167 m_mms =
new MeshMaterialSynchronizer(
this);
180 delete m_variable_factory_mng;
181 m_exchange_mng.reset();
182 m_all_cells_env_only_synchronizer.reset();
183 m_all_cells_mat_env_synchronizer.reset();
184 m_all_env_data.reset();
185 m_properties.reset();
187 for (MeshMaterial* m : m_true_materials)
189 m_true_materials.clear();
191 for (MeshEnvironment* e : m_true_environments)
193 m_true_environments.clear();
195 for (IMeshBlock* b : m_true_blocks)
198 for (MeshMaterialInfo* mmi : m_materials_info)
201 for (MeshMaterialVariableIndexer* mvi : m_variables_indexer_to_destroy)
205 m_internal_api.reset();
207 m_accelerator_envcell_container.reset();
211 m_runner_info.reset();
220void MeshMaterialMng::
225 auto* x = MeshMaterialVariableFactoryRegisterer::firstRegisterer();
227 m_variable_factory_mng->registerFactory(x->createFactory());
228 x = x->nextRegisterer();
235 bool force_enable =
false;
236 if (
const auto v = Convert::Type<Real>::tryParseFromEnvironment(
"ARCANE_MATERIALMNG_USE_ACCELERATOR_FOR_CONSTITUENTITEMVECTOR",
true)) {
237 m_is_use_accelerator_for_constituent_item_vector = (v.value() != 0);
238 force_enable = m_is_use_accelerator_for_constituent_item_vector;
244 if (!force_enable && TaskFactory::isActive())
245 m_is_use_accelerator_for_constituent_item_vector =
false;
246 info() <<
"Use accelerator API for 'ConstituentItemVectorImpl' = " << m_is_use_accelerator_for_constituent_item_vector;
251 IAcceleratorMng* acc_mng = m_variable_mng->_internalApi()->acceleratorMng();
254 Runner* default_runner = acc_mng->defaultRunner();
256 bool use_accelerator_runner =
true;
257 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_MATERIALMNG_USE_QUEUE",
true))
258 use_accelerator_runner = (v.value() != 0);
259 if (use_accelerator_runner && default_runner)
260 runner = *default_runner;
263 if (!runner.isInitialized())
264 runner.initialize(Accelerator::eExecutionPolicy::Sequential);
265 m_runner_info = std::make_unique<RunnerInfo>(runner);
267 info() <<
"Use runner '" << this->runner().executionPolicy() <<
"' for MeshMaterialMng name=" << name()
268 <<
" async_queue_size=" << nb_queue;
269 m_runner_info->initializeAsyncPool(nb_queue);
276 RunQueue& q = runQueue();
278 q.setMemoryRessource(eMemoryRessource::Device);
283 int default_flags = 0;
289 int opt_flag_value = 0;
290 String env_name =
"ARCANE_MATERIAL_MODIFICATION_FLAGS";
291 String opt_flag_str = platform::getEnvironmentVariable(env_name);
292 if (!opt_flag_str.null()) {
293 if (builtInGetValue(opt_flag_value, opt_flag_str)) {
294 pwarning() <<
"Invalid value '" << opt_flag_str
295 <<
" 'for environment variable '" << env_name
297 opt_flag_value = default_flags;
301 opt_flag_value = default_flags;
303 m_modification_flags = opt_flag_value;
308 String env_name =
"ARCANE_MATSYNCHRONIZE_VERSION";
309 String env_value = platform::getEnvironmentVariable(env_name);
310 info() <<
"ENV_VALUE=" << env_value;
311 Integer version = m_synchronize_variable_version;
312 if (!env_value.null()) {
313 if (builtInGetValue(version, env_value)) {
314 pwarning() <<
"Invalid value '" << env_value
315 <<
" 'for environment variable '" << env_name
319 m_synchronize_variable_version = version;
321 info() <<
"Set material variable synchronize version to "
322 <<
"'" << m_synchronize_variable_version <<
"'";
327 String env_name =
"ARCANE_MATERIAL_DATA_COMPRESSOR_NAME";
328 String env_value = platform::getEnvironmentVariable(env_name);
329 if (!env_value.null()) {
330 info() <<
"Use service '" << env_value <<
"' for material data compression";
331 m_data_compressor_service_name = env_value;
337 if (
auto v = Convert::Type<Real>::tryParseFromEnvironment(
"ARCANE_MATERIALMNG_ADDITIONAL_CAPACITY_RATIO",
true)) {
339 m_additional_capacity_ratio = v.value();
340 info() <<
"Set additional capacity ratio to " << m_additional_capacity_ratio;
345 m_exchange_mng->build();
350 IItemEnumeratorTracer* item_tracer = IItemEnumeratorTracer::singleton();
352 info() <<
"Adding material enumerator tracing";
353 EnumeratorTracer::_setSingleton(
new EnumeratorTracer(traceMng(), item_tracer->perfCounterRef()));
360void MeshMaterialMng::
361_addVariableIndexer(MeshMaterialVariableIndexer* var_idx)
363 var_idx->setIndex(m_variables_indexer.size());
364 m_variables_indexer.add(var_idx);
381 ARCANE_FATAL(
"Invalid materialMng() for material info");
384 Integer var_index = m_variables_indexer.size();
385 Int16 mat_id = CheckedConvert::toInt16(m_materials.size());
387 info() <<
"Create material name=" <<
name <<
"mat_id=" << mat_id <<
" var_index=" << var_index;
389 m_materials.add(mat);
390 m_materials_as_components.add(mat);
391 m_true_materials.add(mat);
393 _addVariableIndexer(mat->variableIndexer());
410 m_materials_info.add(mmi);
428 Int16 env_index = CheckedConvert::toInt16(m_environments.size());
433 ARCANE_FATAL(
"Un milieu de nom '{0}' est déjà enregistré", env_name);
435 info() <<
"Creating environment name=" << env_name <<
" index=" << env_index;
439 m_true_environments.add(me);
440 m_environments.add(me);
441 m_environments_as_components.add(me);
446 for (
Integer i = 0; i < nb_mat; ++i) {
448 const String& mat_name = buildinfo.m_name;
449 String new_mat_name = env_name +
"_" + mat_name;
452 ARCANE_FATAL(
"Aucun matériau de nom '{0}' n'est défini", mat_name);
456 mat_info->_addEnvironment(env_name);
464 var_idx = me->
materials()[0]->_internalApi()->variableIndexer();
468 _addVariableIndexer(var_idx);
469 m_variables_indexer_to_destroy.add(var_idx);
471 me->setVariableIndexer(var_idx);
484 Int32 block_index = m_blocks.size();
491 info() <<
"Creating block name=" <<
name <<
" index=" << block_index
494 for (
Integer i = 0; i < nb_env; ++i)
495 info() <<
" Adding environment name=" << infos.
environments()[i]->name() <<
" to block";
500 m_true_blocks.add(mb);
509void MeshMaterialMng::
519void MeshMaterialMng::
529void MeshMaterialMng::
530endCreate(
bool is_continue)
535 _saveInfosInProperties();
537 info() <<
"END CREATE MATERIAL_MNG is_continue=" << is_continue;
539 m_modifier = std::make_unique<MeshMaterialModifierImpl>(
this);
540 m_modifier->initOptimizationFlags();
542 m_all_env_data->endCreate(is_continue);
544 auto synchronizer =
mesh()->cellFamily()->allItemsSynchronizer();
546 m_all_cells_env_only_synchronizer = std::make_unique<MeshMaterialVariableSynchronizer>(
this, synchronizer,
MatVarSpace::Environment);
550 Integer nb_component = m_environments_as_components.size() + m_materials_as_components.size();
551 m_components.reserve(nb_component);
552 m_components.addRange(m_environments_as_components);
553 m_components.addRange(m_materials_as_components);
558 for (
const auto& i : m_full_name_variable_map) {
560 info(4) <<
"BUILD FROM MANAGER name=" << mv->
name() <<
" this=" <<
this;
565 m_is_end_create =
true;
579 m_exchange_mng->registerFactory();
585void MeshMaterialMng::
586setModificationFlags(
int v)
589 m_modification_flags = v;
590 info() <<
"Setting ModificationFlags to v=" << v;
596void MeshMaterialMng::
597setAllocateScalarEnvironmentVariableAsMaterial(
bool v)
600 m_is_allocate_scalar_environment_variable_as_material = v;
601 info() <<
"Setting AllocateScalarEnvironmentVariableAsMaterial to v=" << v;
607void MeshMaterialMng::
608setDataCompressorServiceName(
const String&
name)
610 m_data_compressor_service_name =
name;
619 return m_modifier.get();
626_findMaterialInfo(
const String& name)
629 if (mmi->name() == name)
638findEnvironment(
const String&
name,
bool throw_exception)
652_findEnvironment(
const String& name)
655 if (env->name() == name)
664findBlock(
const String&
name,
bool throw_exception)
678_findBlock(
const String& name)
681 if (b->name() == name)
689void MeshMaterialMng::
702void MeshMaterialMng::
705 m_all_env_data->forceRecompute(
true);
718void MeshMaterialMng::
719syncVariablesReferences(
bool check_resize)
721 for (
const auto& i : m_full_name_variable_map) {
723 info(4) <<
"SYNC REFERENCES FROM MANAGER name=" << mv->
name();
731void MeshMaterialMng::
736 for (
const auto& i : m_full_name_variable_map) {
738 functor->executeFunctor(mv);
745void MeshMaterialMng::
750 ConstArrayView<Int16> nb_env_per_cell = m_all_env_data->componentConnectivityList()->cellsNbEnvironment();
756 if (all_env_cell.
level() != LEVEL_ALLENVIRONMENT)
760 ARCANE_FATAL(
"Bad corresponding globalCell() in all_env_item");
761 if (cell_nb_env != nb_env_per_cell[cell.
localId()])
762 ARCANE_FATAL(
"Bad value for nb_env direct='{0}' var='{1}'",
763 cell_nb_env, nb_env_per_cell[cell.
localId()]);
764 for (
Integer z = 0; z < cell_nb_env; ++z) {
766 Integer cell_nb_mat = ec.nbMaterial();
769 ARCANE_FATAL(
"Bad corresponding allEnvItem() in env_item uid={0}", cell_uid);
771 ARCANE_FATAL(
"Bad corresponding globalItem() in env_item");
772 if (eii.level() != LEVEL_ENVIRONMENT)
773 ARCANE_FATAL(
"Bad level '{0}' for in env_item", eii.level());
777 ARCANE_FATAL(
"Global index for a partial cell env_item={0}", ec);
779 for (
Integer k = 0; k < cell_nb_mat; ++k) {
783 ARCANE_FATAL(
"Bad corresponding env_item in mat_item k={0} mc={1}", k, mc);
785 ARCANE_FATAL(
"Bad corresponding globalItem() in mat_item");
786 if (mci.level() != LEVEL_MATERIAL)
787 ARCANE_FATAL(
"Bad level '{0}' for in mat_item", mci.level());
791 ARCANE_FATAL(
"Global index for a partial cell matitem={0} name={1} nb_mat={2} nb_env={3}",
818 v = _findVariableFullyQualified(global_var->
fullName());
830_findVariableFullyQualified(
const String& name)
832 auto i = m_full_name_variable_map.find(name);
833 if (i != m_full_name_variable_map.end())
844 auto i = m_var_to_mat_var_map.find(global_var);
845 if (i != m_var_to_mat_var_map.end())
853void MeshMaterialMng::
860 for (
const auto& i : m_full_name_variable_map) {
870void MeshMaterialMng::
875 info(4) <<
"MAT_ADD_VAR global_var=" << gvar <<
" var=" << var <<
" this=" <<
this;
876 m_var_to_mat_var_map.insert(std::make_pair(gvar, var));
877 m_full_name_variable_map.insert(std::make_pair(gvar->
fullName(), var));
883void MeshMaterialMng::
888 info(4) <<
"MAT:Remove variable global_var=" << gvar <<
" var=" << var;
889 m_var_to_mat_var_map.erase(gvar);
890 m_full_name_variable_map.erase(gvar->
fullName());
896void MeshMaterialMng::
897dumpInfos(std::ostream& o)
899 Integer nb_mat = m_materials.size();
900 Integer nb_env = m_environments.size();
901 Integer nb_var_idx = m_variables_indexer.size();
902 o <<
"-- Infos sur les milieux et matériaux\n";
903 o <<
"-- Nb Materiaux: " << nb_mat <<
'\n';
904 o <<
"-- Nb Milieux: " << nb_env <<
'\n';
905 o <<
"-- Nb Variables partielles: " << nb_var_idx <<
'\n';
907 o <<
"-- Liste des matériaux\n";
909 o <<
"-- Materiau name=" << mat->name() <<
'\n';
912 o <<
"-- Liste des milieux\n";
917 o <<
"-- Milieu name=" << me->name()
918 <<
" nb_mat=" << nb_env_mat
919 <<
" nb_cell=" << me->cells().size()
920 <<
" var_idx = " << env_var_idx->index()
921 <<
" ids=" << env_var_idx->matvarIndexes()
925 o <<
"-- Materiau\n";
926 o <<
"-- name = " << mm->
name() <<
"\n";
927 o <<
"-- nb_cell = " << mm->cells().size() <<
"\n";
928 o <<
"-- var_idx = " << idx->index() <<
"\n";
937void MeshMaterialMng::
938dumpInfos2(std::ostream& o)
942 Integer nb_mat = m_materials.size();
943 Integer nb_env = m_environments.size();
944 Integer nb_var_idx = m_variables_indexer.size();
945 o <<
"-- Material and Environment infos: nb_env=" << nb_env
946 <<
" nb_mat=" << nb_mat <<
" timestamp=" << m_timestamp
947 <<
" nb_var_idx=" << nb_var_idx
953 if (nb_env_per_cell[icell.localId()] <= 1)
956 o <<
" nb_cell=" << nb_cell <<
" nb_pure_env=" << nb_pure_env
957 <<
" nb_partial=" << (nb_cell - nb_pure_env)
958 <<
" percent=" << (100 * nb_pure_env) / nb_cell
962 o <<
"-- Liste des milieux\n";
963 for (MeshEnvironment* me : m_true_environments) {
964 ConstArrayView<IMeshMaterial*> env_materials = me->materials();
965 const MeshMaterialVariableIndexer* env_var_idx = me->variableIndexer();
966 const Int16 env_id = me->componentId();
967 Integer nb_env_mat = env_materials.size();
968 Integer nb_env_cell = me->cells().size();
969 Integer nb_pure_mat = 0;
970 if (nb_env_mat > 1) {
977 nb_pure_mat = nb_env_cell;
978 o <<
"-- Env name=" << me->name()
979 <<
" nb_mat=" << nb_env_mat
980 <<
" var_idx=" << env_var_idx->index()
981 <<
" nb_cell=" << nb_env_cell
982 <<
" nb_pure_mat=" << nb_pure_mat;
983 if (nb_env_cell != 0)
984 o <<
" percent=" << (nb_pure_mat * 100) / nb_env_cell;
986 for (Integer j = 0; j < nb_env_mat; ++j) {
987 IMeshMaterial* mm = env_materials[j];
988 const MeshMaterialVariableIndexer* idx = mm->_internalApi()->variableIndexer();
989 o <<
"-- Mat name=" << mm->name()
990 <<
" nb_cell=" << mm->cells().size()
991 <<
" var_idx=" << idx->index()
1000bool MeshMaterialMng::
1001synchronizeMaterialsInCells()
1003 return m_mms->synchronizeMaterialsInCells();
1009void MeshMaterialMng::
1010checkMaterialsInCells(
Integer max_print)
1012 m_mms->checkMaterialsInCells(max_print);
1018void MeshMaterialMng::
1019dumpCellInfos(
Cell cell, std::ostream& o)
1022 AllEnvCell all_env_cell = all_env_cell_converter[cell];
1024 o <<
"Cell uid=" <<
ItemPrinter(global_cell) <<
'\n';
1026 o <<
"ENV name=" << (*ienvcell).environment()->name()
1027 <<
" component_idx=" << ComponentItemLocalId(ienvcell) <<
'\n';
1029 o <<
"MAT name=" << (*imatcell).material()->name()
1030 <<
" component_idx=" << ComponentItemLocalId(imatcell) <<
'\n';
1039cellToAllEnvCellConverter()
1047void MeshMaterialMng::
1050 if (m_is_end_create)
1051 ARCANE_FATAL(
"Invalid method call because endCreate() has already been called");
1066class MeshMaterialMngFactory
1071 MeshMaterialMngFactory()
1075 ~MeshMaterialMngFactory()
1086 static MeshMaterialMngFactory m_mesh_material_mng_factory;
1095getTrueReference(
const MeshHandle& mesh_handle,
bool is_create)
1100 const char* name =
"MeshMaterialMng_StdMat";
1107 IMeshMaterialMng* mm = arcaneCreateMeshMaterialMng(mesh_handle,
"StdMat");
1108 Ref<IMeshMaterialMng> mm_ref = makeRef(mm);
1109 udlist->
setData(name,
new UserDataType(
new Ref<IMeshMaterialMng>(mm_ref)));
1112 auto adud =
dynamic_cast<UserDataType*
>(ud);
1115 return *(adud->data());
1121bool MeshMaterialMng::
1122isInMeshMaterialExchange()
const
1124 return m_exchange_mng->isInMeshMaterialExchange();
1130void MeshMaterialMng::
1131_checkCreateProperties()
1135 m_properties = std::make_unique<Properties>(*(
mesh()->properties()),
String(
"MeshMaterialMng_") + name());
1142 const Int32 SERIALIZE_VERSION = 1;
1144void MeshMaterialMng::
1145_saveInfosInProperties()
1147 _checkCreateProperties();
1150 m_properties->set(
"Version", SERIALIZE_VERSION);
1154 UniqueArray<String> material_info_names;
1155 for (MeshMaterialInfo* mat_info : m_materials_info) {
1156 material_info_names.add(mat_info->name());
1158 m_properties->set(
"MaterialInfoNames", material_info_names);
1160 UniqueArray<String> env_names;
1161 UniqueArray<Int32> env_nb_mat;
1162 UniqueArray<String> env_mat_names;
1164 IMeshEnvironment* env = *ienv;
1165 env_names.add(env->name());
1166 info(5) <<
"SAVE ENV_NAME name=" << env->name() <<
" nb_mat=" << env->nbMaterial();
1167 env_nb_mat.add(env->nbMaterial());
1169 const String& name = (*imat)->infos()->name();
1170 info(5) <<
"SAVE MAT_NAME name=" << name;
1171 env_mat_names.add(name);
1174 m_properties->set(
"EnvNames", env_names);
1175 m_properties->set(
"EnvNbMat", env_nb_mat);
1176 m_properties->set(
"EnvMatNames", env_mat_names);
1180 UniqueArray<String> block_names;
1181 UniqueArray<String> block_cell_group_names;
1182 UniqueArray<Int32> block_nb_env;
1183 UniqueArray<String> block_env_names;
1184 for (IMeshBlock* block : m_blocks) {
1185 block_names.add(block->name());
1186 block_cell_group_names.add(block->cells().name());
1187 block_nb_env.add(block->nbEnvironment());
1189 const String& name = (*ienv)->name();
1190 info(5) <<
"SAVE BLOCK ENV_NAME name=" << name;
1191 block_env_names.add(name);
1194 m_properties->set(
"BlockNames", block_names);
1195 m_properties->set(
"BlockCellGroupNames", block_cell_group_names);
1196 m_properties->set(
"BlockNbEnv", block_nb_env);
1197 m_properties->set(
"BlockEnvNames", block_env_names);
1203void MeshMaterialMng::
1206 if (m_is_end_create)
1209 _checkCreateProperties();
1211 info() <<
"Creating material infos from dump";
1214 Int32 v = m_properties->getInt32(
"Version");
1215 if (v != SERIALIZE_VERSION)
1216 ARCANE_FATAL(
"Bad serializer version: trying to read from incompatible checkpoint v={0} expected={1}",
1217 v, SERIALIZE_VERSION);
1220 m_properties->get(
"MaterialInfoNames", material_info_names);
1221 for (
const String& mat_name : material_info_names)
1227 m_properties->get(
"EnvNames", env_names);
1228 m_properties->get(
"EnvNbMat", env_nb_mat);
1229 m_properties->get(
"EnvMatNames", env_mat_names);
1232 for (
Integer ienv = 0, nenv = env_names.
size(); ienv < nenv; ++ienv) {
1234 Integer nb_mat = env_nb_mat[ienv];
1235 for (
Integer imat = 0; imat < nb_mat; ++imat) {
1248 m_properties->get(
"BlockNames", block_names);
1249 m_properties->get(
"BlockCellGroupNames", block_cell_group_names);
1250 m_properties->get(
"BlockNbEnv", block_nb_env);
1251 m_properties->get(
"BlockEnvNames", block_env_names);
1254 for (
Integer i = 0, n = block_names.
size(); i < n; ++i) {
1256 String cell_group_name = block_cell_group_names[i];
1259 ARCANE_FATAL(
"Can not find cell group '{0}' for block creation",
1262 if (!block_nb_env.
empty()) {
1263 Integer nb_env = block_nb_env[i];
1264 for (
Integer ienv = 0; ienv < nb_env; ++ienv) {
1265 const String& name2 = block_env_names[block_env_index];
1269 ARCANE_FATAL(
"Invalid environment name '{0}' for recreating blocks", name2);
1282void MeshMaterialMng::
1289 m_exchange_mng.reset();
1291 _unregisterAllVariables();
1297void MeshMaterialMng::
1298_unregisterAllVariables()
1305 for (
const auto& i : m_full_name_variable_map) {
1310 m_all_refs.
add(ref);
1314 for (MeshMaterialVariableRef* ref : m_all_refs)
1315 ref->unregisterVariable();
1321ComponentItemSharedInfo* MeshMaterialMng::
1322componentItemSharedInfo(Int32 level)
const
1324 ComponentItemInternalData* data = m_all_env_data->componentItemInternalData();
1325 ComponentItemSharedInfo* shared_info =
nullptr;
1326 if (level == LEVEL_MATERIAL)
1327 shared_info = data->matSharedInfo();
1328 else if (level == LEVEL_ENVIRONMENT)
1329 shared_info = data->envSharedInfo();
1330 else if (level == LEVEL_ALLENVIRONMENT)
1331 shared_info = data->allEnvSharedInfo();
1341void MeshMaterialMng::
1344 IEnumeratorTracer* tracer = IEnumeratorTracer::singleton();
1346 tracer->dumpStats();
1349 m_modifier->dumpStats();
1351 for (IMeshEnvironment* env : m_environments) {
1355 if (env->nbMaterial() > 1)
1356 env->_internalApi()->variableIndexer()->dumpStats();
1358 for (IMeshMaterial* mat : m_materials) {
1359 mat->_internalApi()->variableIndexer()->dumpStats();
1366void MeshMaterialMng::
1367createAllCellToAllEnvCell()
1369 if (!m_accelerator_envcell_container) {
1370 m_accelerator_envcell_container = std::make_unique<AllCellToAllEnvCellContainer>(
this);
1371 m_accelerator_envcell_container->initialize();
1378SmallSpan<const Int32> MeshMaterialMng::
1379identitySelectionView()
1383 Int32 max_local_id = m_mesh_handle.mesh()->cellFamily()->maxLocalId();
1385 std::scoped_lock sl(m_indexed_selection_identity_mutex);
1386 Int32 size = m_indexed_selection_identity.size();
1387 if (max_local_id > size) {
1388 m_indexed_selection_identity.resize(max_local_id);
1389 for (Int32 i = size; i < max_local_id; ++i)
1390 m_indexed_selection_identity[i] = i;
1392 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.