14#include "arcane/utils/SimdOperation.h"
16#include "arcane/core/BasicModule.h"
17#include "arcane/core/IMesh.h"
18#include "arcane/core/ITimeLoopMng.h"
19#include "arcane/core/materials/MaterialVariableBuildInfo.h"
20#include "arcane/core/materials/IMeshBlock.h"
24#include "arcane/materials/MeshBlockBuildInfo.h"
25#include "arcane/materials/MeshEnvironmentBuildInfo.h"
26#include "arcane/materials/MatCellVector.h"
27#include "arcane/materials/EnvCellVector.h"
28#include "arcane/materials/MeshMaterialModifier.h"
29#include "arcane/materials/MatConcurrency.h"
47 explicit Sample(
const Arcane::ModuleBuildInfo& mbi)
49 , m_mat_density(Arcane::MaterialVariableBuildInfo(0,
"TestDensity"))
54 void _computeDensity(Arcane::Materials::IMeshMaterial* mat)
57 Arcane::MatCell mc = *imc;
58 m_mat_density[mc] = 1.0;
62 m_mat_density.setUpToDate(mat);
71 Arcane::Materials::IMeshMaterialMng* material_mng =
nullptr;
84 Arcane::Materials::MeshEnvironmentBuildInfo ebi1(
"ENV1");
85 ebi1.addMaterial(
"MAT1");
86 ebi1.addMaterial(
"MAT2");
87 Arcane::Materials::IMeshEnvironment* env1 = material_mng->
createEnvironment(ebi1);
90 Arcane::Materials::MeshEnvironmentBuildInfo ebi2(
"ENV2");
91 ebi2.addMaterial(
"MAT2");
92 Arcane::Materials::IMeshEnvironment* env2 = material_mng->
createEnvironment(ebi2);
95 Arcane::Materials::MeshEnvironmentBuildInfo ebi3(
"ENV3");
96 ebi3.addMaterial(
"MAT3");
97 ebi3.addMaterial(
"MAT1");
98 Arcane::Materials::IMeshEnvironment* env3 = material_mng->
createEnvironment(ebi3);
102 Arcane::Materials::MeshBlockBuildInfo mb1(
"BLOCK1", allCells());
103 mb1.addEnvironment(env1);
104 mb1.addEnvironment(env2);
105 Arcane::Materials::IMeshBlock* block = material_mng->
createBlock(mb1);
112 info() << env1->
id();
115 info() << env2->
id();
117 info() << env3->
id();
120 info() << block->
id();
128 Arcane::Materials::MeshMaterialModifier modifier(material_mng);
131 Arcane::UniqueArray<Arcane::Int32> mat1_indexes;
132 Arcane::UniqueArray<Arcane::Int32> mat2_indexes;
137 bool add_to_mat1 = (z < (nb_cell / 2) && z > (nb_cell / 4));
138 bool add_to_mat2 = (z >= (nb_cell / 2) || z < (nb_cell / 3));
140 mat1_indexes.
add(local_id);
142 mat2_indexes.
add(local_id);
145 modifier.addCells(env1->
materials()[0], mat1_indexes);
147 modifier.addCells(env1->
materials()[1], mat2_indexes);
154 Arcane::IMesh* mesh = defaultMesh();
155 Arcane::Materials::MaterialVariableBuildInfo mvbinfo(material_mng,
"Density");
164 Arcane::Materials::IMeshEnvironment* env = *ienv;
166 Arcane::Materials::IMeshMaterial* mat = *imat;
168 Arcane::Materials::MatCell mc = *imatcell;
173 Arcane::Materials::EnvCell mmcell = *ienvcell;
182 Arcane::Materials::IMeshEnvironment* env = *ienv;
184 Arcane::Materials::IMeshMaterial* mat = *imat;
186 Arcane::Materials::MatCell mc = *imatcell;
196 Arcane::Materials::AllEnvCell all_env_cell = *iallenvcell;
198 Arcane::Materials::EnvCell env_cell = *ienvcell;
201 Arcane::Materials::MatCell mc = *imatcell;
211 Arcane::AllEnvCell all_env_cell = *iallenvcell;
213 Arcane::EnvCell env_cell = *ienvcell;
216 Arcane::MatCell mc = *imatcell;
225 Arcane::Materials::IMeshMaterial* mat = env1->
materials()[0];
226 Arcane::Materials::MatCellVector mat_cells(cells, mat);
228 mat_density[imatcell] = 2.3;
230 Arcane::Materials::IMeshEnvironment* env = env1;
231 Arcane::Materials::EnvCellVector env_cells(cells, env);
233 mat_density[imatcell] = 3.1;
243 Arcane::Materials::IMeshEnvironment* env = *ienv;
245 Arcane::Materials::IMeshMaterial* mat = *imat;
247 Arcane::Materials::ComponentCell cc = *iccell;
249 mat_density[cc] = 3.1;
253 Arcane::Materials::ComponentCell cc = *iccell;
255 mat_density[cc] = 2.5;
262 Arcane::Materials::MatCell mc;
263 Arcane::Materials::ComponentCell cc = mc;
265 Arcane::Materials::ComponentCell cc2 = cc.
superCell();
271 Arcane::Materials::ComponentCell cc3 = cc2.
superCell();
286 var[ienvcell] = init_val;
291 var[imatcell] = init_val;
300 mat_density.setMaterialComputeFunction(
this, &Sample::_computeDensity);
302 mat_density.addMaterialDepend(mat_pressure);
304 mat_density.addMaterialDepend(defaultMesh()->nodesCoordinates());
305 mat_density.addMaterialDepend(m_global_time);
308 Arcane::Materials::IMeshMaterial* mat = *imat;
310 mat_density.update(mat);
318 Arcane::Materials::IMeshEnvironment* env = env1;
320 ENUMERATE_ENVCELL (ienvcell, view) {
321 mat_density[ienvcell] = 2.5;
326 Arcane::Materials::IMeshMaterial* mat = env1->
materials()[0];
328 ENUMERATE_MATCELL (imatcell, view) {
329 mat_density[imatcell] = 2.5;
334 auto func = [&](Arcane::Materials::ComponentItemVectorView view) {
336 mat_density[iccell] = 2.5;
345 Arcane::ParallelLoopOptions options;
360 auto in_volume =
viewIn(mat_volume);
361 auto in_temperature =
viewIn(mat_temperature);
363 auto out_pressure =
viewOut(mat_pressure);
367 out_pressure[scell] = nr * in_temperature[scell] / in_volume[scell];
379 mat_pressure[c] = mat_temperature[ienvcell];
385 mat_pressure[c] = mat_temperature[ienvcell];
391 mat_pressure[c] = mat_temperature[ienvcell];
397 mat_pressure[c] = mat_temperature[ienvcell];
403 mat_pressure[c] = mat_temperature[ienvcell];
409 mat_pressure[c] = mat_temperature[ienvcell];
422 mat_pressure[c] = mat_temperature[imatcell];
428 mat_pressure[c] = mat_temperature[imatcell];
434 mat_pressure[c] = mat_temperature[imatcell];
440 mat_pressure[c] = mat_temperature[imatcell];
446 mat_pressure[c] = mat_temperature[imatcell];
452 mat_pressure[c] = mat_temperature[imatcell];
459 Arcane::Materials::ComponentCell c = *iccell;
460 mat_pressure[c] = mat_temperature[iccell];
465 Arcane::Materials::ComponentCell c = *iccell;
466 mat_pressure[c] = mat_temperature[iccell];
471 Arcane::Materials::ComponentCell c = *iccell;
472 mat_pressure[c] = mat_temperature[iccell];
477 Arcane::Materials::ComponentCell c = *iccell;
478 mat_pressure[c] = mat_temperature[iccell];
483 Arcane::Materials::ComponentCell c = *iccell;
484 mat_pressure[c] = mat_temperature[iccell];
489 Arcane::Materials::ComponentCell c = *iccell;
490 mat_pressure[c] = mat_temperature[iccell];
#define ENUMERATE_COMPONENTITEM_LAMBDA(iter_type, iter, container)
Macro pour itérer sur les entités d'un composant via une fonction lambda du C++11.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
GlobalVariableRefType & globalVariable()
Variable globale associée à cette variable matériau.
__host__ __device__ Int32 componentId() const
Identifiant du composant dans la liste des composants de ce type.
__host__ __device__ ComponentCell superCell() const
Maille de niveau supérieur dans la hiérarchie.
Vecteur sur les entités d'un milieu.
Maille arcane d'un milieu.
__host__ __device__ Int32 environmentId() const
Identifiant du milieu.
virtual Int32 id() const =0
Identifiant du bloc. Il s'agit aussi de l'indice (en commencant par 0) de ce bloc dans la liste des b...
virtual Int32 id() const =0
Identifiant du composant.
virtual ComponentImpurePartItemVectorView impureItems() const =0
Vue sur la liste des entités impures (partielles) partielles du composant.
virtual ComponentItemVectorView view() const =0
Vue associée à ce composant.
virtual ComponentPurePartItemVectorView pureItems() const =0
Vue sur la liste des entités pures (associées à la maille globale) du composant.
Interface d'un milieu d'un maillage.
virtual EnvImpurePartItemVectorView impureEnvItems() const =0
Vue sur la liste des entités impures (partielles) partielles du milieu.
virtual ConstArrayView< IMeshMaterial * > materials()=0
Liste des matériaux de ce milieu.
virtual EnvItemVectorView envView() const =0
Vue associée à ce milieu.
virtual EnvPurePartItemVectorView pureEnvItems() const =0
Vue sur la liste des entités pures (associées à la maille globale) du milieu.
virtual MeshMaterialInfo * registerMaterialInfo(const String &name)=0
Enregistre les infos du matériau de nom name.
virtual void endCreate(bool is_continue=false)=0
Indique qu'on a fini de créer les milieux.
virtual IMeshBlock * createBlock(const MeshBlockBuildInfo &infos)=0
Créé un bloc.
virtual IMeshEnvironment * createEnvironment(const MeshEnvironmentBuildInfo &infos)=0
Créé un milieu avec les infos infos.
static IMeshMaterialMng * getReference(const MeshHandleOrMesh &mesh_handle, bool create=true)
Récupère ou créé la référence associée à mesh.
Interface d'un matériau d'un maillage.
virtual MatImpurePartItemVectorView impureMatItems() const =0
Vue sur la liste des entités impures (partielles) partielles du matériau.
virtual MatItemVectorView matView() const =0
Vue associée à ce matériau.
virtual MatPurePartItemVectorView pureMatItems() const =0
Vue sur la liste des entités pures (associées à la maille globale) du matériau.
Vecteur sur les entités d'un matériau.
Représente un matériau d'une maille multi-matériau.
__host__ __device__ Int32 materialId() const
Identifiant du matériau.
Paramètres nécessaires à la construction d'une variable.
ItemGroupT< Cell > CellGroup
Groupe de mailles.
auto viewOut(const ViewBuildInfo &vbi, CellMaterialVariableScalarRef< DataType > &var)
Vue en écriture pour les variables materiaux scalaire.
auto viewIn(const ViewBuildInfo &vbi, const CellMaterialVariableScalarRef< DataType > &var)
Vue en lecture pour les variables materiaux scalaire.
CellMaterialVariableScalarRef< Real > MaterialVariableCellReal
Variable matériau de type Real
void Foreach(const ItemVectorView &items_view, const ParallelLoopOptions &options, InstanceType *instance, void(InstanceType::*function)(ItemVectorViewT< ItemType > items))
double Real
Type représentant un réel.
std::int32_t Int32
Type entier signé sur 32 bits.