12#ifndef ARCANE_MATERIALS_COMPONENTSIMD_H
13#define ARCANE_MATERIALS_COMPONENTSIMD_H
23#include "arcane/ArcaneTypes.h"
24#include "arcane/SimdItem.h"
26#include "arcane/materials/MatItem.h"
27#include "arcane/materials/MatItemEnumerator.h"
28#include "arcane/materials/ComponentPartItemVectorView.h"
33#ifdef __INTEL_COMPILER
34# define A_ALIGNED_64 __attribute__((align_value(64)))
43MATERIALS_BEGIN_NAMESPACE
56 SimdMatVarIndex(Int32 array_index,SimdIndexType value_index)
57 : m_value_index(value_index), m_array_index(array_index)
65 Int32 arrayIndex()
const {
return m_array_index; }
68 const SimdIndexType& valueIndex()
const {
return m_value_index; }
72 SimdIndexType m_value_index;
88 :
SimdEnumeratorBase(item_indexes), m_component_part_index(component_part_index), m_component(component)
98 SimdMatVarIndex _varIndex()
const {
return SimdMatVarIndex(m_component_part_index,*_currentSimdIndex()); }
100 operator SimdMatVarIndex()
const
106 Integer m_component_part_index;
113#define ENUMERATE_SIMD_COMPONENTCELL(iname,env) \
114 A_ENUMERATE_COMPONENTCELL(ComponentPartSimdCellEnumerator,iname,env)
119template<
typename Lambda>
void
122 const Lambda& lambda)
127 ENUMERATE_SIMD_COMPONENTCELL(mvi,impure_items){
138 typedef const SimdMatVarIndex& IterType;
142 : m_pure_items(pure_items), m_impure_items(impure_items){}
147 template<
typename Lambda>
150 simple_simd_env_loop(m_pure_items,m_impure_items,lambda);
179#define ENUMERATE_COMPONENTITEM_LAMBDA(iter_type,iter,container)\
180 Arcane::Materials:: LoopFunctor ## iter_type :: create ( (container) ) << [=]( Arcane::Materials:: LoopFunctor ## iter_type :: IterType iter)
204template<
typename ItemType,
typename DataType>
211 typedef A_ALIGNED_64 DataType* DataTypeAlignedPtr;
219 typename SimdTypeTraits<DataType>::SimdType
222 typedef typename SimdTypeTraits<DataType>::SimdType SimdType;
223 return SimdType(m_value[mvi.arrayIndex()].data(),mvi.valueIndex());
241 return this->m_value0[pmvi.valueIndex()];
252 return this->m_value0[idx.valueIndex()];
258 return this->operator[](mc._varIndex());
264 return this->operator[](mc._varIndex());
269 DataTypeAlignedPtr m_value0;
277template<
typename ItemType,
typename DataType>
284 typedef A_ALIGNED_64 DataType* DataTypeAlignedPtr;
311 return this->m_value0[pmvi.valueIndex()];
322 return this->m_value0[idx.valueIndex()];
328 return this->operator[](mc._varIndex());
334 return this->operator[](mc._varIndex());
339 DataTypeAlignedPtr m_value0;
347template<
typename DataType>
348MatItemVariableScalarInViewT<Cell,DataType>
359template<
typename DataType>
360MatItemVariableScalarOutViewT<Cell,DataType>
369MATERIALS_END_NAMESPACE
#define ARCANE_ALIGNAS(value)
Macro pour garantir l'alignement d'une classe sur value octets.
Vue en lecture sur une variable scalaire du maillage. TODO: Faut-il rajouter la gestion des SIMD comm...
Vue en écriture sur une variable scalaire du maillage. TODO: Faut il rajouter la gestion des types SI...
Classe de base des vues sur les variables matériaux.
Enumérateur SIMD sur une sous-partie (pure ou partielle) d'un sous-ensemble des mailles d'un composan...
Vectorisation des entiers en utilisant une émulation.
DataType operator[](ItemIndexType mvi) const
Opérateur d'accès pour l'entité item.
DataType value(ItemIndexType mvi) const
Opérateur d'accès pour l'entité item.
DataType operator[](EnvCellEnumerator mc) const
Valeur partielle de la variable pour l'itérateur mc.
DataType operator[](PureMatVarIndex pmvi) const
Opérateur d'accès pour l'entité item.
DataType operator[](ComponentItemLocalId lid) const
Opérateur d'accès pour l'entité item.
SimdTypeTraits< DataType >::SimdType operator[](const SimdMatVarIndex &mvi) const
Opérateur d'accès vectoriel avec indirection.
DataType operator[](CellComponentCellEnumerator mc) const
Valeur partielle de la variable pour l'itérateur mc.
DataType & value(ItemIndexType mvi) const
Opérateur d'accès pour l'entité item.
DataType & operator[](EnvCellEnumerator mc) const
Valeur partielle de la variable pour l'itérateur mc.
DataType & operator[](ItemIndexType mvi) const
Opérateur d'accès pour l'entité item.
DataType & operator[](CellComponentCellEnumerator mc) const
Valeur partielle de la variable pour l'itérateur mc.
DataType & operator[](ComponentItemLocalId lid) const
Opérateur d'accès pour l'entité item.
SimdSetter< DataType > operator[](const SimdMatVarIndex &mvi) const
Opérateur d'accès vectoriel avec indirection.
Enumérateur sur les constituants d'une maille.
Variable scalaire sur les mailles d'un matériau du maillage. Pour l'instant, cette classe n'est insta...
Index d'un Item matériaux dans une variable.
Vue sur une partie pure ou partielles des entités d'un composant.
IMeshComponent * component() const
Composant associé
Int32ConstArrayView valueIndexes() const
Liste des valueIndex() de la partie.
Enumérateur sur les mailles d'un milieu.
Vecteur sur les entités d'un milieu.
Interface d'un composant (matériau ou milieu) d'un maillage.
Interface d'un milieu d'un maillage.
Interface d'une variable matériau d'un maillage.
Représente un index sur les variables matériaux et milieux.
constexpr __host__ __device__ Int32 arrayIndex() const
Retourne l'indice du tableau de valeur dans la liste des variables.
constexpr __host__ __device__ Int32 valueIndex() const
Retourne l'indice dans le tableau de valeur.
IMeshMaterialVariable * materialVariable() const
Variable matériau associée.
Index d'un Item matériaux pure dans une variable.
Classe de base des énumérateurs vectoriels avec indirection.
Vue modifiable d'un tableau d'un type T.
Vue constante d'un tableau de type T.
auto viewOut(MeshVariableScalarRefT< ItemType, DataType > &var)
Vue en écriture.
auto viewIn(const MeshVariableScalarRefT< ItemType, DataType > &var)
Vue en lecture.
std::ostream & operator<<(std::ostream &ostr, eItemKind item_kind)
Opérateur de sortie sur un flot.