14#include "arcane/materials/internal/MeshComponentData.h"
16#include "arcane/utils/FatalErrorException.h"
18#include "arcane/core/IItemFamily.h"
19#include "arcane/core/ItemPrinter.h"
20#include "arcane/core/materials/IMeshMaterialMng.h"
21#include "arcane/core/materials/internal/IMeshMaterialMngInternal.h"
23#include "arcane/materials/internal/MeshMaterialVariableIndexer.h"
24#include "arcane/materials/internal/MeshComponentPartData.h"
36MeshComponentData(IMeshComponent* component,
const String& name,
37 Int16 component_id, ComponentItemSharedInfo* shared_info,
39: TraceAccessor(component->traceMng())
40, m_component(component)
41, m_component_id(component_id)
43, m_constituent_local_id_list(shared_info, String(
"MeshComponentDataIdList")+name)
44, m_recompute_part_data_functor(this, &MeshComponentData::_rebuildPartDataDirect)
47 m_variable_indexer =
new MeshMaterialVariableIndexer(traceMng(), name);
48 m_is_indexer_owner =
true;
59 if (m_is_indexer_owner)
60 delete m_variable_indexer;
69void MeshComponentData::
73 m_part_data->_setConstituentListView(m_constituent_local_id_list.view());
79void MeshComponentData::
80_resizeItemsInternal(Integer nb_item)
82 m_constituent_local_id_list.resize(nb_item);
89void MeshComponentData::
90_setVariableIndexer(MeshMaterialVariableIndexer* indexer)
92 m_variable_indexer = indexer;
93 m_is_indexer_owner =
false;
99void MeshComponentData::
100_setItems(
const ItemGroup& group)
103 if (m_variable_indexer)
104 m_variable_indexer->setCells(group);
110void MeshComponentData::
113 m_part_data =
new MeshComponentPartData(m_component, m_name);
114 m_part_data->setRecomputeFunctor(&m_recompute_part_data_functor);
127void MeshComponentData::
128_changeLocalIdsForInternalList(Int32ConstArrayView old_to_new_ids)
132 ConstArrayView<ConstituentItemIndex> current_internals(m_constituent_local_id_list.localIds());
133 UniqueArray<ConstituentItemIndex> new_internals;
137 for (Integer i = 0, nb = current_internals.size(); i < nb; ++i) {
138 Int32 lid = local_ids[i];
139 Int32 new_lid = old_to_new_ids[lid];
140 if (new_lid != NULL_ITEM_LOCAL_ID) {
141 new_internals.add(current_internals[i]);
142 m_constituent_local_id_list.itemBase(i)._setGlobalItem(ItemLocalId(new_lid));
148 _resizeItemsInternal(new_internals.size());
149 m_constituent_local_id_list.copy(new_internals);
156void MeshComponentData::
157_rebuildPartData(RunQueue& queue)
162 const bool do_lazy_evaluation =
true;
163 if (do_lazy_evaluation)
164 m_part_data->setNeedRecompute();
166 m_part_data->_setFromMatVarIndexes(m_variable_indexer->matvarIndexes(), queue);
172void MeshComponentData::
173_rebuildPartDataDirect()
175 RunQueue& queue = m_component->materialMng()->_internalApi()->runQueue();
176 m_part_data->_setFromMatVarIndexes(m_variable_indexer->matvarIndexes(), queue);
182void MeshComponentData::
188 info(4) <<
"Check valid component name=" << name();
189 m_variable_indexer->checkValid();
193 if (m_items!=m_variable_indexer->cells())
194 ARCANE_FATAL(
"Incoherent group for component name={0} data={1} indexer={2}",
195 name(),m_items.name(),m_variable_indexer->cells().name());
204 IItemFamily* family = m_items.itemFamily();
205 UniqueArray<Int32> presence(family->maxLocalId());
208 presence[iitem.itemLocalId()] = 1;
211 for( Integer i=0, n=indexer_local_ids.size(); i<n; ++i )
212 presence[indexer_local_ids[i]] += 2;
213 ItemInfoListView items_internal = family->itemInfoListView();
215 for( Integer i=0, n=presence.size(); i<n; ++i ){
216 Int32 v = presence[i];
219 Cell cell(items_internal[i]);
221 info(4) <<
"WARNING: Incoherence between group and internals "
222 <<
" component=" << name() <<
" v=" << v
223 <<
" cell=" << ItemPrinter(cell);
226 warning() <<
"WARNING: Incoherence between group and internals "
227 <<
" component=" << name() <<
" nb_error=" << nb_error;
233 ConstArrayView<MatVarIndex> mat_var_indexes(m_variable_indexer->matvarIndexes());
234 Integer nb_val = mat_var_indexes.size();
235 info(4) <<
"CheckValid component_name=" << name()
236 <<
" matvar_indexes=" << mat_var_indexes;
237 info(4) <<
"Cells=" << m_variable_indexer->cells().view().localIds();
238 for( Integer i=0; i<nb_val; ++ i){
239 MatVarIndex component_mvi = m_constituent_local_id_list.variableIndex(i);
240 MatVarIndex mvi = mat_var_indexes[i];
241 if (component_mvi!=mvi)
242 ARCANE_FATAL(
"Bad 'var_index' environment={3} component='{0}' direct='{1}' i={2}",
243 component_mvi,mvi,i,name());
247 m_part_data->checkValid();
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Active toujours les traces dans les parties Arcane concernant les matériaux.
bool arcaneIsCheck()
Vrai si on est en mode vérification.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Int32 Integer
Type représentant un entier.