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
53 typedef SimdEnumeratorBase::SimdIndexType SimdIndexType;
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;
83:
public SimdEnumeratorBase
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){}
144 static LoopFunctorEnvPartSimdCell create(
const EnvCellVector& env);
147 template<
typename Lambda>
148 void operator<<(Lambda&& 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)
187class MatVariableViewBase
204template<
typename ItemType,
typename DataType>
205class MatItemVariableScalarInViewT
206:
public MatVariableViewBase
211 typedef A_ALIGNED_64 DataType* DataTypeAlignedPtr;
216 : MatVariableViewBase(var), m_value(v), m_value0(v[0].unguardedBasePointer()){}
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()];
245 DataType
value(ItemIndexType mvi)
const
252 return this->m_value0[idx.valueIndex()];
269 DataTypeAlignedPtr m_value0;
277template<
typename ItemType,
typename DataType>
278class MatItemVariableScalarOutViewT
279:
public MatVariableViewBase
284 typedef A_ALIGNED_64 DataType* DataTypeAlignedPtr;
289 : MatVariableViewBase(var), m_value(v), m_value0(v[0].unguardedBasePointer()){}
311 return this->m_value0[pmvi.valueIndex()];
315 DataType&
value(ItemIndexType mvi)
const
322 return this->m_value0[idx.valueIndex()];
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.
Vue en écriture sur une variable scalaire du maillage.
Vue modifiable d'un tableau d'un type T.
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...
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.
constexpr __host__ __device__ MatVarIndex localId() const
Index générique pour accéder aux valeurs d'une variable.
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.
auto viewOut(MeshVariableScalarRefT< ItemType, DataType > &var)
Vue en écriture.
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
MATERIALS_BEGIN_NAMESPACE class ARCANE_MATERIALS_EXPORT(64) SimdMatVarIndex
Indexeur SIMD sur un composant.
auto viewIn(const MeshVariableScalarRefT< ItemType, DataType > &var)
Vue en lecture.
std::int32_t Int32
Type entier signé sur 32 bits.