14#include "arcane/utils/NotImplementedException.h"
15#include "arcane/utils/Real2.h"
16#include "arcane/utils/Real3.h"
17#include "arcane/utils/Real2x2.h"
18#include "arcane/utils/Real3x3.h"
19#include "arcane/utils/ITraceMng.h"
20#include "arcane/utils/CheckedConvert.h"
22#include "arcane/materials/MeshMaterialVariable.h"
23#include "arcane/materials/MaterialVariableBuildInfo.h"
24#include "arcane/materials/MeshMaterialVariableSynchronizerList.h"
25#include "arcane/materials/MatItemEnumerator.h"
26#include "arcane/materials/ComponentItemVectorView.h"
27#include "arcane/materials/internal/MeshMaterialVariablePrivate.h"
29#include "arcane/core/Array2Variable.h"
30#include "arcane/core/VariableRefArray2.h"
31#include "arcane/core/MeshVariable.h"
32#include "arcane/core/ISerializer.h"
33#include "arcane/core/internal/IVariableInternal.h"
35#include "arcane/materials/ItemMaterialVariableBaseT.H"
37#include "arcane/datatype/DataTypeTraits.h"
38#include "arcane/datatype/DataStorageBuildInfo.h"
49template<
typename DataType>
void
50MaterialVariableArrayTraits<DataType>::
51copyTo(SmallSpan2<const DataType> input, SmallSpan<const Int32> input_indexes,
52 SmallSpan2<DataType> output, SmallSpan<const Int32> output_indexes,
53 const RunQueue& queue)
56 Integer nb_value = input_indexes.size();
57 Integer dim2_size = input.dim2Size();
63 auto xo = output[output_indexes[i]];
64 auto xi = input[ input_indexes[i] ];
65 for( Integer j=0; j<dim2_size; ++j )
73template<
typename DataType>
void
74MaterialVariableArrayTraits<DataType>::
75resizeAndFillWithDefault(ValueDataType* data,ContainerType& container,Integer dim1_size)
77 ContainerType& values = data->_internal()->_internalDeprecatedValue();
78 Integer dim2_size = values.dim2Size();
82 container.resize(dim1_size,dim2_size);
88template<
typename DataType>
void
89MaterialVariableArrayTraits<DataType>::
90resizeWithReserve(PrivatePartType* var, Integer dim1_size, Real reserve_ratio)
95 Int32 nb_add =
static_cast<Int32
>(dim1_size * reserve_ratio);
96 var->_internalApi()->resizeWithReserve(dim1_size, nb_add);
102template<
typename DataType>
void
103MaterialVariableArrayTraits<DataType>::
104saveData(IMeshComponent* component,IData* data,
105 Array<ContainerViewType>& cviews)
110 ConstArrayView<Array2View<DataType>> views = cviews;
113 auto* true_data =
dynamic_cast<ValueDataType*
>(data);
115 ContainerType& values = true_data->_internal()->_internalDeprecatedValue();
116 ComponentItemVectorView component_view = component->view();
118 Integer dim2_size = views[0].dim2Size();
119 Integer current_dim1_size = values.dim1Size();
120 Integer added_dim1_size = component_view.nbItem();
121 values.resizeNoInit(current_dim1_size+added_dim1_size,dim2_size);
122 ConstArrayView<MatVarIndex> mvi_indexes = component_view._matvarIndexes();
124 for( Integer i=0, n=mvi_indexes.size(); i<n; ++i ){
125 MatVarIndex mvi = mvi_indexes[i];
126 values[i+current_dim1_size].copy(views[mvi.arrayIndex()][mvi.valueIndex()]);
133template<
typename DataType> ItemMaterialVariableArray<DataType>::
134ItemMaterialVariableArray(
const MaterialVariableBuildInfo& v,PrivatePartType* global_var,
136: BaseClass(v,global_var,global_var_ref,mvs)
143template<
typename DataType>
void
154template<
typename DataType>
void
166template<
typename DataType>
void
171 IItemFamily* family = m_global_variable->itemFamily();
179 Int32 dim2_size = m_global_variable->valueView().dim2Size();
180 bool has_mat = this->space()!=MatVarSpace::Environment;
181 switch(sbuf->
mode()){
182 case ISerializer::ModeReserve:
190 nb_val += envcell.nbMaterial();
193 sbuf->
reserve(m_global_variable->fullName());
195 Int64 nb_basic_value = nb_val * nb_count * dim2_size;
199 case ISerializer::ModePut:
204 values.
addRange(value(ienvcell._varIndex()));
207 values.
addRange(value(imatcell._varIndex()));
214 sbuf->
put(m_global_variable->fullName());
219 case ISerializer::ModeGet:
224 if (m_global_variable->fullName()!=ref_name)
225 ARCANE_FATAL(
"Bad serialization expected={0} found={1}",m_global_variable->fullName(),ref_name);
226 Int32 nb_value = CheckedConvert::toInt32(sbuf->
getInt64());
227 Int32 nb_basic_value = nb_value * nb_count;
228 basic_values.
resize(nb_basic_value);
236 setValue(ienvcell._varIndex(),data_values[index]);
240 setValue(imatcell._varIndex(),data_values[index]);
257template<
typename DataType>
void
269template<
typename DataType>
void
279template<
typename DataType>
void
283 for( PrivatePartType* pvar : m_vars ){
285 Integer dim1_size = pvar->valueView().dim1Size();
286 pvar->directResize(dim1_size,dim2_size);
296 this->syncReferences();
302template<
typename DataType> Int32
303ItemMaterialVariableArray<DataType>::
306 Int32 dim2_size = m_vars[0]->valueView().dim2Size();
307 return (Int32)
sizeof(DataType) * dim2_size;
313template<
typename DataType>
void
314ItemMaterialVariableArray<DataType>::
315_copyToBufferLegacy(SmallSpan<const MatVarIndex> matvar_indexes,Span<std::byte> bytes)
const
318 Integer dim2_size = m_vars[0]->valueView().dim2Size();
322 const Int32 value_size = CheckedConvert::toInt32(bytes.size() / one_data_size);
323 Array2View<DataType> values(
reinterpret_cast<DataType*
>(bytes.data()),value_size,dim2_size);
324 for( Integer z=0; z<value_size; ++z ){
325 values[z].copy(value(matvar_indexes[z]));
332template<
typename DataType>
void
333ItemMaterialVariableArray<DataType>::
334copyToBuffer(ConstArrayView<MatVarIndex> matvar_indexes,ByteArrayView bytes)
const
336 auto* ptr =
reinterpret_cast<std::byte*
>(bytes.data());
337 return _copyToBufferLegacy(matvar_indexes,{ptr,bytes.size()});
343template<
typename DataType>
void
344ItemMaterialVariableArray<DataType>::
345_copyFromBufferLegacy(SmallSpan<const MatVarIndex> matvar_indexes,Span<const std::byte> bytes)
348 Integer dim2_size = m_vars[0]->valueView().dim2Size();
352 const Integer value_size = CheckedConvert::toInt32(bytes.size() / one_data_size);
353 ConstArray2View<DataType> values(
reinterpret_cast<const DataType*
>(bytes.data()),value_size,dim2_size);
354 for( Integer z=0; z<value_size; ++z ){
355 setValue(matvar_indexes[z],values[z]);
362template<
typename DataType>
void
363ItemMaterialVariableArray<DataType>::
364copyFromBuffer(ConstArrayView<MatVarIndex> matvar_indexes,ByteConstArrayView bytes)
366 auto* ptr =
reinterpret_cast<const std::byte*
>(bytes.data());
367 return _copyFromBufferLegacy(matvar_indexes,{ptr,bytes.size()});
376template<
typename ItemType,
typename DataType>
377MeshMaterialVariableArray<ItemType,DataType>::
378MeshMaterialVariableArray(
const MaterialVariableBuildInfo& v,PrivatePartType* global_var,
379 VariableRefType* global_var_ref,MatVarSpace mvs)
380: ItemMaterialVariableArray<DataType>(v,global_var,global_var_ref,mvs)
381, m_true_global_variable_ref(global_var_ref)
388#define ARCANE_INSTANTIATE_MAT(type) \
389 template class ItemMaterialVariableBase< MaterialVariableArrayTraits<type> >;\
390 template class ItemMaterialVariableArray<type>;\
391 template class MeshMaterialVariableArray<Cell,type>;\
392 template class MeshMaterialVariableCommonStaticImpl<MeshMaterialVariableArray<Cell,type>>
394ARCANE_INSTANTIATE_MAT(
Byte);
395ARCANE_INSTANTIATE_MAT(Int16);
396ARCANE_INSTANTIATE_MAT(Int32);
397ARCANE_INSTANTIATE_MAT(Int64);
398ARCANE_INSTANTIATE_MAT(Real);
399ARCANE_INSTANTIATE_MAT(Real2);
400ARCANE_INSTANTIATE_MAT(Real3);
401ARCANE_INSTANTIATE_MAT(Real2x2);
402ARCANE_INSTANTIATE_MAT(Real3x3);
#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_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define RUNCOMMAND_LOOP1(iter_name, x1,...)
Boucle sur accélérateur avec arguments supplémentaires pour les réductions.
Interface d'une famille d'entités.
virtual ItemVectorView view(Int32ConstArrayView local_ids)=0
Vue sur les entités.
Vue sur un vecteur d'entités.
Maille arcane d'un milieu.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
Synchronisation d'une liste de variables matériaux.
void apply()
Effectue la synchronisation.
void add(MeshMaterialVariable *var)
Ajoute la variable var à la liste des variables à synchroniser.
Int64 largeSize() const
Nombre d'éléments du vecteur (en 64 bits)
const T * data() const
Accès à la racine du tableau hors toute protection.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void addRange(ConstReferenceType val, Int64 n)
Ajoute n élément de valeur val à la fin du tableau.
Vue constante d'un tableau de type T.
Interface d'un sérialiseur.
virtual void get(RealArrayView values)=0
Récupère le tableau values.
virtual void reserveSpan(eDataType dt, Int64 n)=0
Réserve de la mémoire pour n valeurs de dt.
virtual void putSpan(Span< const Real > values)
Ajoute le tableau values.
virtual void getSpan(Span< Real > values)
Récupère le tableau values.
virtual Int64 getInt64()=0
Récupère une taille.
virtual void reserve(eDataType dt, Int64 n)=0
Réserve de la mémoire pour n objets de type dt.
virtual eMode mode() const =0
Mode de fonctionnement actuel.
virtual void put(Span< const Real > values)=0
Ajoute le tableau values.
virtual void putInt64(Int64 value)=0
Ajoute l'entier value.
Vue pour un tableau 2D dont la taille est un 'Int32'.
Vue d'un tableau d'éléments de type T.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
RunCommand makeCommand(const RunQueue &run_queue)
Créé une commande associée à la file run_queue.
Active toujours les traces dans les parties Arcane concernant les matériaux.
MatVarSpace
Espace de définition d'une variable matériau.
ARCANE_DATATYPE_EXPORT Integer dataTypeSize(eDataType type)
Taille du type de donnée type (qui doit être différent de DT_String)
unsigned char Byte
Type d'un octet.
eDataType
Type d'une donnée.
@ DT_Int64
Donnée de type entier 64 bits.
Int32 Integer
Type représentant un entier.