Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
MeshMaterialTesterModule.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* MeshMaterialTesterModule.cc (C) 2000-2024 */
9/* */
10/* Module de test du gestionnaire des matériaux. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#define ARCANE_TRACE_ENUMERATOR
15
16#include "arcane/utils/List.h"
17#include "arcane/utils/OStringStream.h"
18#include "arcane/utils/ValueChecker.h"
19#include "arcane/utils/SimdOperation.h"
20
21#include "arcane/IUnitTest.h"
22#include "arcane/ITimeLoopMng.h"
23#include "arcane/ITimeLoopService.h"
24#include "arcane/ITimeLoop.h"
25#include "arcane/TimeLoopEntryPointInfo.h"
26#include "arcane/IMesh.h"
27#include "arcane/IItemFamily.h"
28#include "arcane/ItemPrinter.h"
29#include "arcane/IParallelMng.h"
30#include "arcane/IMeshModifier.h"
31#include "arcane/IMeshUtilities.h"
32#include "arcane/IMeshPartitioner.h"
33#include "arcane/VariableDependInfo.h"
34
35#include "arcane/Concurrency.h"
36#include "arcane/VariableView.h"
37
38#include "arcane/materials/IMeshMaterialMng.h"
39#include "arcane/materials/IMeshMaterial.h"
40#include "arcane/materials/IMeshEnvironment.h"
41#include "arcane/materials/IMeshBlock.h"
42#include "arcane/materials/MeshMaterialModifier.h"
43#include "arcane/materials/MeshMaterialVariableRef.h"
44#include "arcane/materials/MeshEnvironmentVariableRef.h"
45#include "arcane/materials/MaterialVariableBuildInfo.h"
46#include "arcane/materials/MeshBlockBuildInfo.h"
47#include "arcane/materials/MeshEnvironmentBuildInfo.h"
48#include "arcane/materials/MeshMaterialVariableDependInfo.h"
49#include "arcane/materials/CellToAllEnvCellConverter.h"
50#include "arcane/materials/MatCellVector.h"
51#include "arcane/materials/EnvCellVector.h"
52#include "arcane/materials/MatConcurrency.h"
53#include "arcane/materials/MeshMaterialIndirectModifier.h"
54#include "arcane/materials/MeshMaterialVariableSynchronizerList.h"
56#include "arcane/materials/MeshMaterialInfo.h"
57
58#include "arcane/tests/ArcaneTestGlobal.h"
59#include "arcane/tests/IMaterialEquationOfState.h"
60#include "arcane/tests/MeshMaterialTester_axl.h"
61
62// Inclut le .cc pour avoir la définition des méthodes templates
63#include "arcane/tests/StdMeshVariables.cc"
64
65#include <functional>
66#include <atomic>
67#include <map>
68
69/*---------------------------------------------------------------------------*/
70/*---------------------------------------------------------------------------*/
71
72namespace ArcaneTest
73{
74
75using namespace Arcane;
76using namespace Arcane::Materials;
77
91
92/*---------------------------------------------------------------------------*/
93/*---------------------------------------------------------------------------*/
98: public ArcaneMeshMaterialTesterObject
99{
100 public:
101
104
105 public:
106
107 static void staticInitialize(ISubDomain* sd);
108
109 public:
110
111 void buildInit() override;
112 void compute() override;
113 void startInit() override;
114 void continueInit() override;
115
116 private:
117
118 IMeshMaterialMng* m_material_mng;
119 VariableCellReal m_density;
120 VariableCellReal m_pressure;
121 MaterialVariableCellReal m_mat_density2;
124 VariableCellInt32 m_present_material;
125 MaterialVariableCellInt32 m_mat_int32;
128 VariableScalarInt64 m_nb_starting_cell; //<! Nombre de mailles au démarrage
129 IMeshMaterial* m_mat1;
130 IMeshMaterial* m_mat2;
131 IMeshBlock* m_block1;
132 UniqueArray<VariableCellReal*> m_density_post_processing;
135 // Si non nul, indique qu'il faut vérifier les valeurs spectral
136 // car on a fait un repartitionnement
137 Integer m_check_spectral_values_iteration;
138 private:
139
140 void _computeDensity();
144 bool is_compute_mat);
145 void _copyPartialToGlobal(IMeshMaterial* mat,VariableCellReal& global_density,
147 void _checkCreation();
148 void _checkCreation2(Integer a,Integer n);
149 void _checkTemporaryVectors(const CellGroup& test_group);
150 void _checkSubViews(const CellGroup& test_group);
151 void _dumpAverageValues();
152 void _dumpNoDumpRealValues();
153
154 void _computeMaterialDepend(IMeshMaterial* mat);
155 void _setDependencies();
156 void _doDependencies();
157 Integer _checkParallelMatItem(MatItemVectorView view,MaterialVariableCellInt64& var);
158 Integer _fillTestVar(ComponentItemVectorView view,MaterialVariableCellInt64& var);
159 Integer _fillTestVar(IMeshMaterial* mat,MaterialVariableCellInt64& var);
160 void _subViewFunctor(ComponentItemVectorView view);
161 void _checkEqual(Integer expected_value,Integer value);
162 template<typename ContainerType> void applyGeneric(const ContainerType& container,MaterialVariableCellReal& var,Real value);
163 void _checkFillArrayFromTo(IMeshMaterial* mat,MaterialVariableCellReal& var);
164 void _checkArrayVariableSynchronize();
165 void _setOrCheckSpectralValues(Int64 iteration,bool is_check);
166 template<typename VarType1,typename VarType2,typename VarType3> void
167 _setOrCheckSpectralValues2(VarType1& var_real,VarType2& var_int32,
168 VarType3& var_scalar_int32,Int64 iteration,bool is_check);
169 void _checkFillPartialValues();
170 void _doSimd();
171 template<typename VarType> void _checkFillPartialValuesHelper(VarType& mat_var);
172 template<typename VarType>
173 void _checkFillPartialValuesWithGlobal(const VarType& var_type,MeshComponentList components);
174 template<typename VarType> void
175 _checkFillPartialValuesWithSuper(const VarType& var_type,MeshComponentList components);
176 template<typename VarType> void
177 _fillVar(VarType& var_type,Real base_value);
178 template<typename VectorType> void
179 _checkVectorCopy(VectorType& var_type);
181 void _initUnitTest();
182 void _applyEos(bool is_init);
183 void _testDumpProperties();
184 void _checkNullComponentItem();
185};
186
187/*---------------------------------------------------------------------------*/
188/*---------------------------------------------------------------------------*/
189
190/*---------------------------------------------------------------------------*/
191/*---------------------------------------------------------------------------*/
192
193MeshMaterialTesterModule::
194MeshMaterialTesterModule(const ModuleBuildInfo& mbi)
195: ArcaneMeshMaterialTesterObject(mbi)
196, m_material_mng(IMeshMaterialMng::getReference(mbi.meshHandle()))
197, m_density(VariableBuildInfo(this,"Density"))
198, m_pressure(VariableBuildInfo(this,"Pressure"))
199, m_mat_density2(VariableBuildInfo(this,"Density",IVariable::PNoDump))
200, m_mat_nodump_real(VariableBuildInfo(this,"NoDumpReal",IVariable::PNoDump))
201, m_present_material(VariableBuildInfo(this,"PresentMaterial"))
202, m_mat_int32(VariableBuildInfo(this,"PresentMaterial"))
203, m_mat_not_used_real(VariableBuildInfo(this,"NotUsedRealVariable"))
204, m_nb_starting_cell(VariableBuildInfo(this,"NbStartingCell"))
205, m_mat1(nullptr)
206, m_mat2(nullptr)
207, m_block1(nullptr)
208, m_mesh_partitioner(nullptr)
209, m_check_spectral_values_iteration(0)
210{
211}
212
213/*---------------------------------------------------------------------------*/
214/*---------------------------------------------------------------------------*/
215
216MeshMaterialTesterModule::
217~MeshMaterialTesterModule()
218{
219 for( VariableCellReal* v : m_density_post_processing )
220 delete v;
221}
222
223/*---------------------------------------------------------------------------*/
224/*---------------------------------------------------------------------------*/
225
226void MeshMaterialTesterModule::
227staticInitialize(ISubDomain* sd)
228{
229 String time_loop_name("MeshMaterialTestLoop");
230
231 ITimeLoopMng* tlm = sd->timeLoopMng();
232 ITimeLoop* time_loop = tlm->createTimeLoop(time_loop_name);
233
234 {
236 clist.add(TimeLoopEntryPointInfo("MeshMaterialTester.buildInit"));
237 time_loop->setEntryPoints(ITimeLoop::WBuild,clist);
238 }
239
240 {
242 clist.add(TimeLoopEntryPointInfo("MeshMaterialTester.startInit"));
243 clist.add(TimeLoopEntryPointInfo("MeshMaterialTester.continueInit"));
244 time_loop->setEntryPoints(ITimeLoop::WInit,clist);
245 }
246
247 {
249 clist.add(TimeLoopEntryPointInfo("MeshMaterialTester.compute"));
250 time_loop->setEntryPoints(ITimeLoop::WComputeLoop,clist);
251 }
252
253 {
255 clist.add("MeshMaterialTester");
256 time_loop->setRequiredModulesName(clist);
257 clist.clear();
258 clist.add("ArcanePostProcessing");
259 clist.add("ArcaneCheckpoint");
260 time_loop->setOptionalModulesName(clist);
261 }
262
263 tlm->registerTimeLoop(time_loop);
264}
265
266/*---------------------------------------------------------------------------*/
267/*---------------------------------------------------------------------------*/
268
269void MeshMaterialTesterModule::
270buildInit()
271{
272 // La création des milieux et des matériaux doit se faire dans un point
273 // d'entrée de type 'build' pour que la liste des variables créés par les
274 // milieux et les matériaux soit accessible dans le post-traitement.
275 info() << "MESH_MATERIAL_TESTER :: buildInit()";
276
278
279 m_material_mng->setModificationFlags(options()->modificationFlags());
280
281 m_material_mng->setMeshModificationNotified(true);
282
283 // En parallèle, test la création de variables milieux aussi sur les matériaux
284 if (parallelMng()->isParallel())
286
287 if (subDomain()->isContinue() && options()->recreateFromDump()){
288 mm->recreateFromDump();
289 }
290 else{
292 // Lit les infos des matériaux du JDD et les enregistre dans le gestionnaire
293 for( Integer i=0,n=options()->material().size(); i<n; ++i ){
294 String mat_name = options()->material[i].name;
295 info() << "Found material name=" << mat_name;
296 materials_info.add(mm->registerMaterialInfo(mat_name));
297 }
298
299 MeshBlockBuildInfo mbbi("BLOCK1",allCells());
301
302 // Créé les milieux
303 for( Integer i=0,n=options()->environment().size(); i<n; ++i ){
304 String env_name = options()->environment[i].name;
305 info() << "Found environment name=" << env_name;
307 for( Integer k=0,kn=options()->environment[i].material.size(); k<kn; ++k ){
308 String mat_name = options()->environment[i].material[k];
309 info() << "Add material " << mat_name << " for environment " << env_name;
310 env_build.addMaterial(mat_name);
311 }
312 IMeshEnvironment* env = mm->createEnvironment(env_build);
313 saved_envs.add(env);
314 // Le bloc ne contient que 2 milieux
315 if (i<2){
316 info() << "Add environment " << env_name << " to block1";
317 mbbi.addEnvironment(env);
318 }
319 }
320
321 // Création du bloc BLOCK1 sur le groupe de toutes les mailles
322 // et contenant les milieux ENV1 et ENV2
323 m_block1 = mm->createBlock(mbbi);
324
325 {
326 // Création d'un deuxième bloc de manière incrémentalle.
327 Integer nb_env = saved_envs.size();
328 if (nb_env>=2){
329 MeshBlockBuildInfo mbbi2("BLOCK2",allCells());
330 mbbi2.addEnvironment(saved_envs[0]);
331 IMeshBlock* block2 = mm->createBlock(mbbi2);
332 Integer nb_env1 = block2->nbEnvironment();
333 mm->addEnvironmentToBlock(block2,saved_envs[1]);
334 info() << "Finished incremental creation of block";
335 Integer nb_env2 = block2->nbEnvironment();
336 if (nb_env2!=(nb_env1+1))
337 ARCANE_FATAL("Bad number of environment");
338 if (block2->environments()[nb_env1]!=saved_envs[1])
339 ARCANE_FATAL("Bad last environment");
340 // Supprime le premier milieu du bloc
341 IMeshEnvironment* first_env = block2->environments()[0];
342 IMeshEnvironment* second_env = block2->environments()[1];
343 mm->removeEnvironmentToBlock(block2,first_env);
344 nb_env2 = block2->nbEnvironment();
345 if (nb_env2!=nb_env1)
346 ARCANE_FATAL("Bad number of environment after remove");
347 if (block2->environments()[0]!=second_env)
348 ARCANE_FATAL("Bad first environment");
349 }
350 }
351
352 mm->endCreate(subDomain()->isContinue());
353
354 info() << "List of materials:";
356 info() << "MAT=" << m->name();
357 for( String s : m->environmentsName() )
358 info() << " In ENV=" << s;
359 }
360 }
361
362 // Récupère deux matériaux de deux milieux différents pour test.
364 Integer nb_env = envs.size();
365 m_mat1 = mm->environments()[0]->materials()[0];
366 if (nb_env>1)
367 m_mat2 = mm->environments()[1]->materials()[0];
368
369 m_global_deltat.assign(1.0);
370
371 for( Integer i=0, n=m_material_mng->materials().size(); i<n; ++i ){
372 IMeshMaterial* mat = m_material_mng->materials()[i];
373 VariableCellReal* var = new VariableCellReal(VariableBuildInfo(defaultMesh(),String("Density_")+mat->name()));
374 m_density_post_processing.add(var);
375 }
376
377 m_mesh_partitioner = options()->loadBalanceService();
379 info() << "Activating load balance test";
380}
381
382/*---------------------------------------------------------------------------*/
383/*---------------------------------------------------------------------------*/
384
385template<typename ContainerType> void MeshMaterialTesterModule::
386applyGeneric(const ContainerType& container,MaterialVariableCellReal& var,Real value)
387{
389 var[igencell] = value;
390 }
391}
392
393/*---------------------------------------------------------------------------*/
394/*---------------------------------------------------------------------------*/
395
396void MeshMaterialTesterModule::
397startInit()
398{
399 m_mat_not_used_real.globalVariable().setUsed(false);
400
401 info() << "MESH_MATERIAL_TESTER :: startInit()";
402 m_material_mng->forceRecompute();
403
404 ValueChecker vc(A_FUNCINFO);
405
406 m_nb_starting_cell.assign(parallelMng()->reduce(Parallel::ReduceSum,ownCells().size()));
407
411 Integer nb_cell = ownCells().size();
412 IParallelMng* pm = parallelMng();
413 Int64 total_nb_cell = pm->reduce(Parallel::ReduceMax,nb_cell);
414 ENUMERATE_CELL(icell,allCells()){
415 Cell cell = *icell;
416 Int64 cell_index = cell.uniqueId();
418 break;
419 if (cell_index<(total_nb_cell/5)){
420 env1_indexes.add(icell.itemLocalId());
421 }
423 mat2_indexes.add(icell.itemLocalId());
424 }
425 if ((cell_index%2)==0)
426 sub_group_indexes.add(icell.itemLocalId());
427 }
428
429 // Ajoute les mailles du milieu 1
430 {
431 Materials::MeshMaterialModifier modifier(m_material_mng);
432 modifier.setDoCopyBetweenPartialAndPure(false);
433 modifier.setDoInitNewItems(false);
434 modifier.setPersistantWorkBuffer(false);
436 // Ajoute les mailles du milieu
437 //modifier.addCells(env,env1_indexes);
441 for( Integer z=0; z<nb_cell; ++z ){
442 bool add_to_mat1 = (z<(nb_cell/2) && z>(nb_cell/4));
443 bool add_to_mat2 = (z>=(nb_cell/2) || z<(nb_cell/3));
444 if (add_to_mat1){
446 }
447 if (add_to_mat2)
449 }
450 // Ajoute les mailles du matériau 1
451 modifier.addCells(m_mat1,mat1_indexes);
452 Integer nb_mat = env->nbMaterial();
453 if (nb_mat>1)
454 // Ajoute les mailles du matériau 2
455 modifier.addCells(env->materials()[1],mat2_indexes);
456 }
457 CellGroup test_group = defaultMesh()->cellFamily()->createGroup("SUB_GROUP_TEST",sub_group_indexes);
458 // Ajoute les mailles du milieu 2
459 if (m_mat2){
460 Materials::MeshMaterialModifier modifier(m_material_mng);
461 //modifier.addCells(m_mat2->environment(),mat2_indexes);
462 modifier.addCells(m_mat2,mat2_indexes);
463 }
464
465 const Integer spectral_size = 5;
470 // NOTE: m_env_empty_int64array ne doit pas avoir de resize
471 // pour pouvoir tester la gestion des variables avec une dim2Size() nulle.
472
473 // TODO tester que les valeurs partielles sont correctes
474 m_mat_density.fillPartialValues(3.0);
475 m_env_int32.fillPartialValues(5);
476 m_mat_int32.fillPartialValues(8);
477
478 info() << "Liste des mailles de test_group";
480 info(6) << "Cell=" << ItemPrinter(*icell);
481 }
482
483 ENUMERATE_CELL(icell,allCells()){
484 m_density[icell] = 1.0;
485 m_mat_density[icell] = 2.0;
486 Integer idx2 = icell.itemLocalId() % spectral_size;
487 m_mat_spectral1[icell][idx2] = 3.0 + (Real)(icell.itemLocalId() * spectral_size);
488 }
489
490 CellGroup mat1_cells = m_mat1->cells();
492 m_density[icell] = 2.0;
493 }
494 {
495 VariableCellReal& gvar = m_mat_density.globalVariable();
496 info() << "GVAR_NAME = " << gvar.name();
498 if (gvar[icell]!=2.0)
499 fatal() << "Bad value for global variable v=" << gvar[icell];
500 }
501 }
502
503 if (m_mat2){
504 CellGroup mat2_cells = m_mat2->cells();
506 m_density[icell] = 1.5;
507 }
508 }
509
510 _checkTemporaryVectors(test_group);
511 _checkSubViews(test_group);
512
513 {
515 m_material_mng->dumpInfos(oss());
516 info() << oss.str();
517 }
518
519 // A supprimer
520 //m_mat_density.updateFromInternal();
521
522 m_present_material.fill(0);
523 m_mat_density.fill(0.0);
525
526 constexpr IMeshMaterial* null_mat = nullptr;
527 constexpr IMeshEnvironment* null_env = nullptr;
528 // Itération sur tous les milieux puis tous les matériaux
529 // et toutes les mailles de ce matériau
530 ENUMERATE_ENV(ienv,m_material_mng){
532 info() << "ENV name=" << env->name();
533 vc.areEqual(env->isEnvironment(),true,"IsEnvEnvOK");
534 vc.areEqual(env->isMaterial(),false,"IsEnvMatOK");
535 vc.areEqual(env->asEnvironment(),env,"ToEnvEnvOK");
536 vc.areEqual(env->asMaterial(),null_mat,"ToEnvMatOK");
539 info() << "MAT name=" << mat->name();
540 vc.areEqual(mat->isEnvironment(),false,"IsMatEnvOK");
541 vc.areEqual(mat->isMaterial(),true,"IsMatMatOK");
542 vc.areEqual(mat->asEnvironment(),null_env,"ToMatEnvOK");
543 vc.areEqual(mat->asMaterial(),mat,"ToMatMatOK");
546 //info() << "Cell name=" << mmcell._varIndex();
547 m_mat_density[mmcell] = 200.0;
550 if (x1._varIndex()!=mmcell._varIndex())
551 ARCANE_FATAL("Bad convertsion MatCell -> ComponentCell");
552 MatCell x2(x1);
553 if (x1._varIndex()!=x2._varIndex())
554 ARCANE_FATAL("Bad convertsion ComponentCell -> MatCell");
555 }
556 }
557 }
558
559 // Idem mais à partir d'un bloc.
560 ENUMERATE_ENV(ienv,m_block1){
562 info() << "BLOCK_ENV name=" << env->name();
565 info() << "BLOCK_MAT name=" << mat->name();
566 }
567 }
568
569 // Idem mais itération sur des milieux sous forme de composants
572 info() << "ENV COMPONENT name=" << cmp->name();
573 }
574
575 // Itération sur les matériaux sous forme de composant.
578 info() << "MAT COMPONENT name=" << cmp->name();
579 }
580
581 // Itération directement avec tous les matériaux du gestionnaire
582 ENUMERATE_MAT(imat,m_material_mng){
584 info() << "MAT name=" << mat->name()
585 << " density_var_name=" << m_mat_density.materialVariable()->materialVariable(mat)->name();
588 m_mat_density[mmcell] = 200.0;
589 }
590 }
591
592
593 if (0){
594 ENUMERATE_ENV(ienv,m_material_mng){
596 info() << "Env name=" << env->name();
599 info() << "EnvCell nb_mat=" << ev.nbMaterial() << " cell_uid=" << ItemPrinter(ev.globalCell())
600 << " component_uid="<< ev.componentUniqueId()
601 << " var_index=" << ev._varIndex();
602 }
603 }
604 }
605
606 if (1){
608 ENUMERATE_FACE(iface,allFaces()){
609 Face face = *iface;
610 Cell back_cell = face.backCell();
611 if (!back_cell.null()){
613 info() << "NB_ENV=" << all_env_back_cell.nbEnvironment();
616 if (x1._varIndex()!=all_env_back_cell._varIndex())
617 ARCANE_FATAL("Bad convertsion AllEnvCell -> ComponentCell");
618 if (x1._varIndex()!=x2._varIndex())
619 ARCANE_FATAL("Bad convertsion ComponentCell -> EnvCell");
620 }
621 }
622 }
623
624 // Itération sur tous les milieux et tous les matériaux d'une maille.
625 ENUMERATE_ALLENVCELL(iallenvcell,m_material_mng,allCells()){
627 Cell global_cell = all_env_cell.globalCell();
629 Real env_density = 0.0;
632 env_density += m_mat_density[imatcell];
633 Int32 idx = mc.materialId();
634 m_present_material[global_cell] = m_present_material[global_cell] | (1<<idx);
635 }
636 m_mat_density[ienvcell] = env_density;
638 }
639 }
640
641 if (1){
642 ENUMERATE_ALLENVCELL(iallenvcell,m_material_mng,allCells()){
644 info() << "Cell uid=" << ItemPrinter(all_env_cell.globalCell()) << " nb_env=" << all_env_cell.nbEnvironment();
647 info() << "Cell nb_mat=" << ec.nbMaterial()
648 << " env=" << ec.environment()->name()
649 << " (id=" << ec.environmentId() << ")";
652 info() << "Cell mat=" << mc.material()->name()
653 << " (id=" << mc.materialId() << ")"
654 << " density=" << m_mat_density[imatcell]
655 << " index=" << mc._varIndex()
656 << " component_uid=" << mc.componentUniqueId();
657 //env_density += m_mat_density[imatcell];
658 }
659 for( ComponentCell mc : ec.subItems()){
660 info() << "Cell mat=" << mc.component()->name()
661 << " (id=" << mc.componentId() << ")"
662 << " density=" << m_mat_density[mc]
663 << " index=" << mc._varIndex()
664 << " component_uid=" << mc.componentUniqueId();
665 //env_density += m_mat_density[imatcell];
666 }
667 //m_mat_density[ienvcell] = env_density;
668 }
669
672 info() << "Cell nb_mat=" << ec.nbSubItem()
673 << " env=" << ec.component()->name()
674 << " (id=" << ec.componentId() << ")";
675 }
676 }
677
678 const bool test_depend = false;
679 // Ne doit pas être exécuté mais juste compilé pour vérifier la syntaxe
680 if (test_depend){
681 m_mat_density.addDependCurrentTime(m_density);
682 m_mat_density.addDependCurrentTime(m_mat_density2);
683 m_mat_density.addDependPreviousTime(m_mat_density2);
684 m_mat_density.removeDepend(m_mat_density2);
685 m_mat_density.setComputeFunction(this,&MeshMaterialTesterModule::startInit);
686 }
687 }
688
689 // Teste la récupération de la valeur de la densité partielle par maille et par matériau ou par milieu
690 if (1){
692
693 ENUMERATE_MAT(imat,m_material_mng){
695 Int32 id = mm->id();
696 ENUMERATE_CELL(icell,allCells()){
697 Cell cell = *icell;
699 Real density = m_mat_density.matValue(all_env_cell,id);
700 info() << "IndirectMatAccess Cell uid=" << cell.uniqueId() << " mat_id=" << id << " density=" << density;
701 }
702 }
703
704 ENUMERATE_ENV(ienv,m_material_mng){
705 IMeshEnvironment* me = *ienv;
706 Int32 id = me->id();
707 ENUMERATE_CELL(icell,allCells()){
708 Cell cell = *icell;
710 Real density = m_mat_density.envValue(all_env_cell,id);
711 info() << "IndirectEnvAccess Cell uid=" << cell.uniqueId() << " env_id=" << id << " density=" << density;
712 }
713 }
714 }
715
717 _setDependencies();
718 _dumpNoDumpRealValues();
719 _initUnitTest();
720
721 _applyEos(true);
722 _testDumpProperties();
723 _checkNullComponentItem();
724}
725
726/*---------------------------------------------------------------------------*/
727/*---------------------------------------------------------------------------*/
728
729void MeshMaterialTesterModule::
730_checkNullComponentItem()
731{
733 info() << "NullEnvCell global_cell_id=" << null_env_cell.globalCell().localId();
734
735 info() << "NullEnvCell var_index =" << null_env_cell._varIndex();
736 //info() << "NullEnvCell component =" << null_env_cell.component();
737 info() << "NullEnvCell component_id =" << null_env_cell.componentId();
738 info() << "NullEnvCell null =" << null_env_cell.null();
739 info() << "NullEnvCell super_cell =" << null_env_cell.superCell();
740 info() << "NullEnvCell level =" << null_env_cell.level();
741 info() << "NullEnvCell nb_sub_item=" << null_env_cell.nbSubItem();
742 info() << "NullEnvCell component_unique_id=" << null_env_cell.componentUniqueId();
743 info() << "NullEnvCell sub_items =" << null_env_cell.subItems();
744
745 info() << "NullEnvCell all_env_cell =" << null_env_cell.allEnvCell().null();
746}
747
748/*---------------------------------------------------------------------------*/
749/*---------------------------------------------------------------------------*/
750
751void MeshMaterialTesterModule::
752_testDumpProperties()
753{
754 IMesh* mesh = defaultMesh();
756 MaterialVariableCellReal v1(VariableBuildInfo(mesh,"VarTestDump0"));
757 Int32 p0 = v0.variable()->property();
758 Int32 p1 = v1.globalVariable().variable()->property();
759 info() << "PROP1 = " << p0 << " " << p1;
760
761 MaterialVariableCellReal v2(VariableBuildInfo(mesh,"VarTestDump1"));
763 Int32 p2 = v2.globalVariable().variable()->property();
764 Int32 p3 = v3.variable()->property();
765 info() << "PROP2 = " << p2 << " " << p3;
766
768 Int32 p4 = v4.globalVariable().variable()->property();
769 info() << "PROP4 = " << p4;
770
771 if (p0!=p1)
772 ARCANE_FATAL("Bad property value p0={0} p1={1}",p0,p1);
773 if (p2!=p3)
774 ARCANE_FATAL("Bad property value p2={0} p3={1}",p2,p3);
775
776 if ((p0 & IVariable::PNoDump)!=0)
777 ARCANE_FATAL("Bad property value p0={0}. Should be Dump",p0);
778 if ((p2 & IVariable::PNoDump)!=0)
779 ARCANE_FATAL("Bad property value p2={0}. Should be Dump",p2);
780}
781
782/*---------------------------------------------------------------------------*/
783/*---------------------------------------------------------------------------*/
788_applyEos(bool is_init)
789{
790 auto* x = options()->additionalEosService();
791 if (!x)
792 return;
793 ENUMERATE_ENV(ienv,m_material_mng){
797 info() << "EOS: mat=" << mat->name();
799 MatCell mc = *icell;
800 info() << " v=" << mc.globalCell().uniqueId();
801 }
802 if (is_init)
803 x->initEOS(mat,m_mat_pressure,m_mat_density,m_mat_internal_energy,m_mat_sound_speed);
804 else
805 x->applyEOS(mat,m_mat_density,m_mat_internal_energy,m_mat_pressure,m_mat_sound_speed);
806 }
807 }
808}
809
810/*---------------------------------------------------------------------------*/
811/*---------------------------------------------------------------------------*/
812
813void MeshMaterialTesterModule::
814_initUnitTest()
815{
816 IUnitTest* unit_test = options()->additionalTestService();
817 if (unit_test)
818 unit_test->initializeTest();
819}
820
821/*---------------------------------------------------------------------------*/
822/*---------------------------------------------------------------------------*/
823
824void MeshMaterialTesterModule::
825continueInit()
826{
827 info() << "MESH_MATERIAL_TESTER :: continueInit()";
828 _setDependencies();
829 _dumpNoDumpRealValues();
830 _initUnitTest();
831}
832
833/*---------------------------------------------------------------------------*/
834/*---------------------------------------------------------------------------*/
835
836void MeshMaterialTesterModule::
837_setDependencies()
838{
839 info() << "SET_DEPENDENCIES";
840
841 m_mat_density.setMaterialComputeFunction(this,&MeshMaterialTesterModule::_computeMaterialDepend);
842 m_mat_density.addMaterialDepend(m_mat_nodump_real);
843 m_mat_density.addMaterialDepend(m_pressure);
844
847 m_mat_density.materialVariable()->dependInfos(infos,mat_infos);
848
849 for( Integer k=0, n=infos.size(); k<n; ++k )
850 info() << "Global depend v=" << infos[k].variable()->fullName();
851
852 for( Integer k=0, n=mat_infos.size(); k<n; ++k )
853 info() << "Material depend v=" << mat_infos[k].variable()->name();
854}
855
856/*---------------------------------------------------------------------------*/
857/*---------------------------------------------------------------------------*/
867{
868 IMeshComponent* component = mat;
869 if (!component)
870 component = env;
871
872 MaterialVariableCellInt32 test_var(MaterialVariableBuildInfo(m_material_mng,"TestComponentPart"));
873 {
874 Int32 index = 15;
876 test_var[iccell] = index;
877 ++index;
878 }
879 }
880
881 Int32 total_full = 0;
882 Int32 total_pure = 0;
883 Int32 total_impure = 0;
885 MatVarIndex mvi = iccell._varIndex();
886 Int32 v = test_var[iccell];
887 if (mvi.arrayIndex()==0)
888 total_pure += v;
889 else
890 total_impure += v;
891 total_full += v;
892 }
893 info() << "COMPONENT=" << component->name() << " TOTAL PURE=" << total_pure << " IMPURE=" << total_impure
894 << " FULL=" << total_full;
895
896 ValueChecker vc(A_FUNCINFO);
897
898 if (mat){
899 {
900 Int32 total = 0;
902 total += test_var[imc];
903 }
904 vc.areEqual(total,total_full,"TotalFull1");
905 }
906 {
907 Int32 total = 0;
910 total += test_var[imc];
911 }
912 vc.areEqual(total,total_impure,"TotalImpure1");
913 }
914 {
915 Int32 total = 0;
917 total += test_var[imc];
918 }
919 vc.areEqual(total,total_pure,"TotalPure1");
920 }
921 {
922 Int32 total = 0;
923 ENUMERATE_COMPONENTITEM(MatPartCell,imc,mat->impureMatItems()){
924 total += test_var[imc];
925 }
926 vc.areEqual(total,total_impure,"TotalImpure2");
927 }
928 {
929 Int32 total = 0;
931 total += test_var[imc];
932 }
933 vc.areEqual(total,total_pure,"TotalPure2");
934 }
935 }
936 if (env){
937 {
938 Int32 total = 0;
939 using MyEnvCell = EnvCell;
941 total += test_var[imc];
942 }
943 vc.areEqual(total,total_full,"TotalFull1");
944 }
945 {
946 Int32 total = 0;
949 total += test_var[imc];
950 }
951 vc.areEqual(total,total_impure,"TotalImpure1");
952 }
953 {
954 Int32 total = 0;
956 total += test_var[imc];
957 }
958 vc.areEqual(total,total_pure,"TotalPure1");
959 }
960 {
961 Int32 total = 0;
962 ENUMERATE_COMPONENTITEM(EnvPartCell,imc,env->impureEnvItems()){
963 total += test_var[imc];
964 }
965 vc.areEqual(total,total_impure,"TotalImpure2");
966 }
967 {
968 Int32 total = 0;
970 total += test_var[imc];
971 }
972 vc.areEqual(total,total_pure,"TotalPure2");
973 }
974 }
975 {
976 Int32 total = 0;
979 total += test_var[imc];
980 }
981 vc.areEqual(total,total_impure,"TotalImpure3");
982 }
983 {
984 Int32 total = 0;
986 total += test_var[imc];
987 }
988 vc.areEqual(total,total_pure,"TotalPure3");
989 }
990}
991
992/*---------------------------------------------------------------------------*/
993/*---------------------------------------------------------------------------*/
994
995void MeshMaterialTesterModule::
996_doDependencies()
997{
998 m_pressure.fill(0.0);
999
1000 ENUMERATE_MAT(imat,m_material_mng){
1002 double v = (double)mat->id();
1004 m_mat_nodump_real.setUpToDate(mat);
1005 m_mat_density.update(mat);
1006 }
1007
1008 // Normalement m_mat_density d'un matériau doit valoir le numéro du matériau
1009 ENUMERATE_MAT(imat,m_material_mng){
1011 double v = (double)mat->id();
1013 if (m_mat_density[imc]!=v)
1014 ARCANE_FATAL("Bad value for mat depend v={0} expected={1}",m_mat_density[imc],v);
1015 }
1017 if (m_mat_density[imc]!=v)
1018 ARCANE_FATAL("Bad value for mat depend v={0} expected={1}",m_mat_density[imc],v);
1019 }
1020 }
1021
1022 // Vérifie que la dépendance sur la variable globale est bien prise en compte
1023 m_pressure.fill(1.0);
1024 m_pressure.setUpToDate();
1025 ENUMERATE_MAT(imat,m_material_mng){
1027 double v0 = (double)mat->id();
1029 m_mat_density.update(mat);
1030 double v = 1.0 + v0;
1032 if (m_mat_density[imc]!=v)
1033 ARCANE_FATAL("Bad value (1) for global depend v={0} expected={1}",m_mat_density[imc],v);
1034 }
1035 ENUMERATE_COMPONENTITEM(MatPartCell,imc,mat,eMatPart::Impure){
1036 if (m_mat_density[imc]!=v)
1037 ARCANE_FATAL("Bad value (2) for global depend v={0} expected={1}",m_mat_density[imc],v);
1038 }
1039 ENUMERATE_COMPONENTITEM(MatPartCell,imc,mat->impureMatItems()){
1040 if (m_mat_density[imc]!=v)
1041 ARCANE_FATAL("Bad value (2) for global depend v={0} expected={1}",m_mat_density[imc],v);
1042 }
1043 }
1044}
1045
1046/*---------------------------------------------------------------------------*/
1047/*---------------------------------------------------------------------------*/
1048
1049void MeshMaterialTesterModule::
1050_computeMaterialDepend(IMeshMaterial* mat)
1051{
1052 info() << "Compute material depend mat=" << mat->name();
1053 Integer index = 0;
1055 MatCell mc = *imc;
1056 Cell cell = mc.globalCell();
1057 m_mat_density[mc] = m_mat_nodump_real[mc] + m_pressure[cell];
1058 if (index<5){
1059 info() << "Cell=" << ItemPrinter(cell) << " density=" << m_mat_density[mc]
1060 << " dump_real=" << m_mat_nodump_real[mc]
1061 << " pressure=" << m_pressure[cell];
1062 ++index;
1063 }
1064 }
1065 m_mat_density.setUpToDate(mat);
1066}
1067
1068/*---------------------------------------------------------------------------*/
1069/*---------------------------------------------------------------------------*/
1070
1071void MeshMaterialTesterModule::
1072_dumpAverageValues()
1073{
1074 info() << "_dumpAverageValues()";
1075 ENUMERATE_ENV(ienv,m_material_mng){
1079 Real sum_density = 0.0;
1081 //MatCell mc = *icell;
1082 sum_density += m_mat_density[imatcell];
1083 }
1084 info() << "SumMat ITER=" << m_global_iteration() << " MAT=" << mat->name()
1085 << " density=" << sum_density;
1086 }
1087 }
1088}
1089
1090/*---------------------------------------------------------------------------*/
1091/*---------------------------------------------------------------------------*/
1092
1093void MeshMaterialTesterModule::
1094_doSimd()
1095{
1096 info() << "_doSimd()";
1097 MaterialVariableCellReal var_tmp(MaterialVariableBuildInfo(m_material_mng,"TestVarTmpReal"));
1098 var_tmp.fill(-1.0);
1099 // TODO: vérifier les valeurs.
1100 ENUMERATE_ENV(ienv,m_material_mng){
1102 auto out_var_tmp = viewOut(var_tmp);
1103 Real value = (Real)(env->id()) * 4.3;
1105 out_var_tmp[ienvcell] = value;
1106 };
1108 if (var_tmp[ienvcell]!=value)
1109 ARCANE_FATAL("Bad value v={0} expected={1}",var_tmp[ienvcell],value);
1110 }
1111 }
1112}
1113
1114/*---------------------------------------------------------------------------*/
1115/*---------------------------------------------------------------------------*/
1116
1117void MeshMaterialTesterModule::
1118_dumpNoDumpRealValues()
1119{
1122 info() << ostr.str();
1123
1125 m_material_mng->fillWithUsedVariables(vars);
1126 info() << "NB_USED_MATERIAL_VAR=" << vars.size();
1127 for( Integer i=0, n=vars.size(); i<n; ++i )
1128 info() << "USED_MATERIAL_VAR name=" << vars[i]->name();
1129}
1130
1131/*---------------------------------------------------------------------------*/
1132/*---------------------------------------------------------------------------*/
1133
1134template<typename VectorType> void MeshMaterialTesterModule::
1135_checkVectorCopy(VectorType& vec_cells)
1136{
1137 ValueChecker vc(A_FUNCINFO);
1138 // Teste la copie.
1139 // Normalement il s'agit d'une copie par référence donc les vues associées
1140 // pointent vers la même zone mémoire.
1141 VectorType vec_cells_copy(vec_cells);
1142 if (!vec_cells_copy.view()._isSamePointerData(vec_cells.view()))
1143 ARCANE_FATAL("Bad copy");
1144
1145 VectorType vec_cells_copy2(vec_cells);
1146 vc.areEqual(vec_cells_copy2.view()._matvarIndexes(),vec_cells.view()._matvarIndexes(),"bad copy 2");
1147
1148 VectorType move_vec_cells(std::move(vec_cells_copy2));
1149 vc.areEqual(move_vec_cells.view()._matvarIndexes().data(),vec_cells.view()._matvarIndexes().data(),"bad move 1");
1150
1151 {
1152 // Teste le clone.
1153 // A la sortie les valeurs des index doivent être les mêmes mais pas les pointeurs.
1154 VectorType clone_vec(vec_cells_copy.clone());
1155 vc.areEqual(clone_vec.view()._matvarIndexes(),vec_cells.view()._matvarIndexes(),"bad clone 1");
1156 if (clone_vec.view()._constituentItemListView() != vec_cells.view()._constituentItemListView())
1157 ARCANE_FATAL("Bad clone 2");
1158 if (clone_vec.view()._matvarIndexes().data()==vec_cells.view()._matvarIndexes().data())
1159 ARCANE_FATAL("bad clone 3");
1160 if (clone_vec.view()._isSamePointerData(vec_cells.view()))
1161 ARCANE_FATAL("bad clone 3");
1162 }
1163}
1164
1165/*---------------------------------------------------------------------------*/
1166/*---------------------------------------------------------------------------*/
1167
1168void MeshMaterialTesterModule::
1169_checkTemporaryVectors(const CellGroup& test_group)
1170{
1171
1172 if (m_mat2){
1175 info() << "SET_DENSITY ON SUB GROUP for material";
1177 MatCell mc = *imatcell;
1178 info() << "REF_IDX MAT1 " << mc._varIndex() << " " << mc.globalCell().uniqueId();
1179 }
1181 MatCell mc = *imatcell;
1182 info() << "REF_IDX MAT2 " << mc._varIndex() << " " << mc.globalCell().uniqueId();
1183 }
1184 info() << "SET_DENSITY";
1186 MatCell mc = *imatcell;
1187 m_mat_density[mc] = 3.2;
1188 info() << "SET_MAT_DENSITY " << mc._varIndex() << " " << mc.globalCell().uniqueId();
1189 }
1190 _checkVectorCopy(mat_cells);
1192 _checkVectorCopy(component_mat_cells);
1193 }
1194
1195 if (m_mat2){
1196 MatCellVector mat_cells(test_group.view(),m_mat1);
1198 info() << "SET_DENSITY ON SUB GROUP for material";
1200 MatCell mc = *imatcell;
1201 info() << "REF_IDX MAT1 " << mc._varIndex() << " " << mc.globalCell().uniqueId();
1202 }
1204 MatCell mc = *imatcell;
1205 info() << "REF_IDX MAT2 " << mc._varIndex() << " " << mc.globalCell().uniqueId();
1206 }
1207 info() << "SET_DENSITY";
1209 MatCell mc = *imatcell;
1210 m_mat_density[mc] = 3.2;
1211 info() << "SET_MAT_DENSITY " << mc._varIndex() << " " << mc.globalCell().uniqueId();
1212 }
1214 MatCell mc = *imatcell;
1215 m_mat_density[mc] = 3.2;
1216 info() << "SET_MAT_DENSITY (VIEW) " << mc._varIndex() << " " << mc.globalCell().uniqueId();
1217 }
1218 }
1219
1220 {
1221 IMeshEnvironment* env1 = m_mat1->environment();
1224 info() << "SET_DENSITY ON SUB GROUP for environment";
1226 EnvCell mc = *ienvcell;
1227 info() << "REF_IDX ENV1 " << mc._varIndex() << " uid=" << mc.globalCell().uniqueId();
1228 }
1229 info() << "SET_DENSITY";
1231 EnvCell mc = *ienvcell;
1232 m_mat_density[ienvcell] = 3.2;
1233 info() << "SET_ENV_DENSITY " << mc._varIndex() << " uid=" << mc.globalCell().uniqueId();
1234 }
1236 EnvCell mc = *ienvcell;
1237 m_mat_density[ienvcell] = 3.2;
1238 info() << "SET_ENV_DENSITY (VIEW)" << mc._varIndex() << " uid=" << mc.globalCell().uniqueId();
1239 }
1240 _checkVectorCopy(env_cells);
1242 _checkVectorCopy(component_env_cells);
1243 }
1244
1245 {
1246 IMeshEnvironment* env1 = m_mat1->environment();
1249 info() << "SET_DENSITY ON SUB GROUP for environment";
1251 EnvCell mc = *ienvcell;
1252 info() << "REF_IDX ENV1 " << mc._varIndex() << " uid=" << mc.globalCell().uniqueId();
1253 }
1254 info() << "SET_DENSITY";
1256 EnvCell mc = *ienvcell;
1257 m_mat_density[ienvcell] = 3.2;
1258 info() << "SET_ENV_DENSITY " << mc._varIndex() << " uid=" << mc.globalCell().uniqueId();
1259 }
1260 }
1261}
1262
1263
1264/*---------------------------------------------------------------------------*/
1265/*---------------------------------------------------------------------------*/
1266
1267void MeshMaterialTesterModule::
1268_checkEqual(Integer expected_value,Integer value)
1269{
1270 if (value!=expected_value){
1271 ARCANE_FATAL("Bad value v={0} expected={1}",value,expected_value);
1272 }
1273}
1274
1275/*---------------------------------------------------------------------------*/
1276/*---------------------------------------------------------------------------*/
1277
1278Integer MeshMaterialTesterModule::
1280{
1281 Integer index = 1;
1282 Integer total = 0;
1284 var[imcell] = index;
1285 total += (Integer)var[imcell];
1286 ++index;
1287 }
1288 return total;
1289}
1290
1291/*---------------------------------------------------------------------------*/
1292/*---------------------------------------------------------------------------*/
1293
1294Integer MeshMaterialTesterModule::
1296{
1297 Integer index = 1;
1298 Integer total = 0;
1300 var[iccell] = index;
1301 total += (Integer)var[iccell];
1302 ++index;
1303 }
1304 return total;
1305}
1306
1307/*---------------------------------------------------------------------------*/
1308/*---------------------------------------------------------------------------*/
1309
1310Integer MeshMaterialTesterModule::
1312{
1313 std::atomic<Integer> new_total;
1314 auto func = [&](MatItemVectorView view)
1315 {
1316 info() << "ParallelLoop with MatItemVectorView size=" << view.nbItem();
1319 }
1320 };
1321
1322 new_total = 0;
1324 return (Integer)new_total;
1325}
1326
1327/*---------------------------------------------------------------------------*/
1328/*---------------------------------------------------------------------------*/
1329
1330void MeshMaterialTesterModule::
1331_checkSubViews(const CellGroup& test_group)
1332{
1333 IMeshEnvironment* env1 = m_mat1->environment();
1335 MatCellVector mat_cells(test_group.view(),m_mat1);
1336
1337 // Vérifie l'utilisation des sous-vues.
1338 {
1340 Integer nb_item = test_group_view.nbItem();
1341 for( Integer i=0; i<20; ++i ){
1342 Integer begin = i * 9;
1343 Integer size = 12;
1344 size = math::min(size,nb_item-begin);
1345 if (size<=0)
1346 break;
1347 ComponentItemVectorView v2 = test_group_view._subView(begin,size);
1350 info() << " ComponentCell c=" << ccell._varIndex();
1351 }
1352 }
1353 }
1354
1355 MaterialVariableCellInt64 mat_test_sub_view(MaterialVariableBuildInfo(m_material_mng,"TestSubViewInt64"));
1358 {
1359 Integer index = 1;
1361 mat_test_sub_view[imcell] = index;
1362 ++index;
1363 }
1364 index = 1;
1366 mat_test_sub_view[iecell] = index;
1367 direct_total += index;
1368 ++index;
1369 }
1372 }
1373 info() << "DIRECT_ENV_TOTAL = " << direct_total
1374 << "DIRECT_MAT_TOTAL = " << direct_mat_total;
1375 }
1376
1377 {
1379 Integer nb_item = test_group_view.nbItem();
1380
1381 for( Integer block_size=1; block_size<20; ++block_size){
1382 Integer new_total = 0;
1383 for( Integer begin=0; begin<nb_item; begin += block_size ){
1384 Integer size = block_size;
1385 size = math::min(size,nb_item-begin);
1386 if (size<=0)
1387 break;
1388 ComponentItemVectorView v2 = test_group_view._subView(begin,size);
1391 }
1392 }
1393 if (new_total!=direct_total){
1394 ARCANE_FATAL("Bad total v={0} expected={1} block_size={2}",
1395 new_total,direct_total,block_size);
1396 }
1397 }
1398 }
1399
1400 // Test en parallèle
1401 {
1403
1404 ParallelLoopOptions options;
1405 options.setGrainSize(10);
1406
1407 Integer nb_item = test_group_view.nbItem();
1408 info() << "ParallelTest with lambda full_size=" << nb_item;
1409
1410 // Test avec ComponentItemVectorView
1411 {
1412 std::atomic<Integer> new_total;
1413 new_total = 0;
1414 auto func = [&](ComponentItemVectorView view)
1415 {
1416 info() << "ParallelLoop with component size=" << view.nbItem();
1419 }
1420 };
1422
1423 if (new_total!=direct_total){
1424 ARCANE_FATAL("Bad total v={0} expected={1}",(Integer)new_total,direct_total);
1425 }
1426 }
1427
1428 // Test avec EnvItemVectorView
1429 {
1431 std::atomic<Integer> new_total;
1432 new_total = 0;
1433 auto func = [&](EnvItemVectorView view)
1434 {
1435 info() << "ParallelLoop with environment size=" << view.nbItem();
1438 }
1439 };
1441
1442 if (new_total!=direct_total){
1443 ARCANE_FATAL("Bad total v={0} expected={1}",(Integer)new_total,direct_total);
1444 }
1445 }
1446
1447 // Test avec MatItemVectorView
1448 {
1450 Integer ref_val = _fillTestVar(mat_view,mat_test_sub_view);
1451 Integer new_val = _checkParallelMatItem(mat_view,mat_test_sub_view);
1452 _checkEqual(ref_val,new_val);
1453 }
1454
1455 // Test avec IMeshMaterial
1456 {
1457 Integer ref_val = _fillTestVar(m_mat1,mat_test_sub_view);
1458 Integer new_val = _checkParallelMatItem(m_mat1->matView(),mat_test_sub_view);
1459 _checkEqual(ref_val,new_val);
1460 }
1461
1462 // Test avec MatItemVectorView vide
1463 {
1466 Integer ref_val = _fillTestVar(mat_view,mat_test_sub_view);
1467 Integer new_val = _checkParallelMatItem(mat_view,mat_test_sub_view);
1468 _checkEqual(ref_val,new_val);
1469 }
1470
1471 }
1472
1473 // Test en parallèle avec un pointeur sur membre
1474 // (teste uniquement cette belle syntaxe que propose le C++ avec std::bind)
1475 {
1477 Integer nb_item = test_group_view.nbItem();
1478 info() << "NB_ITEM=" << nb_item;
1479 auto f0 = std::bind(std::mem_fn(&MeshMaterialTesterModule::_subViewFunctor),this,std::placeholders::_1);
1481 // Syntaxe avec lambda
1483 [&](ComponentItemVectorView view){ this->_subViewFunctor(view); }
1484 );
1485 }
1486}
1487
1488/*---------------------------------------------------------------------------*/
1489/*---------------------------------------------------------------------------*/
1490
1491void MeshMaterialTesterModule::
1492_subViewFunctor(ComponentItemVectorView view)
1493{
1495 }
1496}
1497
1498/*---------------------------------------------------------------------------*/
1499/*---------------------------------------------------------------------------*/
1500
1501void MeshMaterialTesterModule::
1502_checkFillArrayFromTo(IMeshMaterial* mat,MaterialVariableCellReal& var)
1503{
1504 ValueChecker vc(A_FUNCINFO);
1505
1506 {
1507 RealUniqueArray values;
1508 Integer nb_cell = mat->cells().size();
1509 // Récupère les valeurs de \a var dans \a values puis les mets dans
1510 // var_tmp et vérifie que tout est OK.
1511 Integer index = 0;
1512 values.resize(nb_cell);
1513 var.fillToArray(mat,values);
1515 vc.areEqual(var[imatcell],values[index],"Bad value for fillToArray()");
1516 ++index;
1517 }
1518 MaterialVariableCellReal var_tmp(MaterialVariableBuildInfo(m_material_mng,"TestVarTmpReal"));
1519
1520 index = 0;
1521 var_tmp.fillFromArray(mat,values);
1523 vc.areEqual(values[index],var_tmp[imatcell],"Bad value for fillFromArray()");
1524 ++index;
1525 }
1526 }
1527
1528 {
1529 std::map<Int32,MatCell> matvar_indexes;
1530 Int32UniqueArray indexes;
1531 {
1536 matvar_indexes.insert(std::make_pair(iterator_index,*imatcell));
1537 indexes.add(iterator_index);
1538 }
1540 }
1541 info() << "Indexes=" << indexes;
1542 }
1543
1544 // Idem test précédent mais sur un sous-ensemble des valeurs
1545
1546 RealUniqueArray values;
1547 Integer nb_index = indexes.size();
1548 values.resize(nb_index);
1549
1550 var.fillToArray(mat,values,indexes);
1551 for( Integer i=0; i<nb_index; ++i )
1552 vc.areEqual(var[matvar_indexes[i]],values[i],"Bad value for fillToArray() (2)");
1553
1554 MaterialVariableCellReal var_tmp(MaterialVariableBuildInfo(m_material_mng,"TestVarTmpReal2"));
1555
1556 var_tmp.fillFromArray(mat,values,indexes);
1557 for( Integer i=0; i<nb_index; ++i )
1558 vc.areEqual(values[i],var_tmp[matvar_indexes[i]],"Bad value for fillFromArray() (2)");
1559 }
1560}
1561
1562/*---------------------------------------------------------------------------*/
1563/*---------------------------------------------------------------------------*/
1564
1565void MeshMaterialTesterModule::
1566compute()
1567{
1568 IUnitTest* unit_test = options()->additionalTestService();
1569 if (unit_test)
1570 unit_test->executeTest();
1571
1572 // Si non nul, indique qu'il faut vérifier les valeurs suite à un repartitionnement
1573 if (m_check_spectral_values_iteration!=0){
1574 info() << "Check spectral values after loadbalancing";
1575 _setOrCheckSpectralValues(m_check_spectral_values_iteration,true);
1576 m_check_spectral_values_iteration = 0;
1577 }
1578
1579 // Active la variable une itération sur deux pour tester l'activation et désactivation
1580 // au cours du temps.
1581 m_mat_not_used_real.globalVariable().setUsed((m_global_iteration()%2)==0);
1582
1583 _dumpAverageValues();
1584 _doDependencies();
1585 _doSimd();
1586 _testComponentPart(m_mat1,nullptr);
1587 if (m_mat2)
1588 _testComponentPart(m_mat2,nullptr);
1589
1590 ENUMERATE_ENV(ienv,m_material_mng){
1591 _testComponentPart(nullptr,(*ienv));
1592 }
1593
1594 // Teste la création de variable et les accesseurs.
1595 using namespace Materials;
1597 mat_pressure.fill(0.0);
1598
1599 FaceGroup xmin_group = defaultMesh()->faceFamily()->findGroup("XMIN");
1601 Face face = *iface;
1602 Cell c = face.boundaryCell();
1603 Real d = m_density[c];
1604 m_density[c] = d + 1.0;
1605 }
1606
1607 {
1608 // Teste le constructeur de recopie
1610 if (mat_pressure2.materialVariable()!=mat_pressure.materialVariable())
1611 ARCANE_FATAL("Bad clone");
1612 }
1613
1614 {
1615 // Teste le changement de référence.
1616 MaterialVariableCellReal mat_test_refersto(MaterialVariableBuildInfo(m_material_mng,"TestRefersToVar"));
1618 if (mat_test_refersto.materialVariable()!=mat_pressure.materialVariable())
1619 ARCANE_FATAL("Bad refersTo");
1620 Real total = 0.0;
1621 Real total_ref = 0.0;
1623 total += mat_test_refersto[imatcell];
1625 }
1626 if (total!=total_ref)
1627 ARCANE_FATAL("Bad value for total using refersTo");
1628
1629 }
1630
1631 // Teste le ENUMERATE_GENERIC_CELL
1632 {
1633 MatCellVector mat_cells(ownCells(),m_mat1);
1635 MaterialVariableCellReal var(MaterialVariableBuildInfo(m_material_mng,"VarTestGeneric"));
1636 applyGeneric(mcref,var,4.5);
1638 if (var[imatcell]!=4.5)
1639 ARCANE_FATAL("Bad value 1 for TestGeneric");
1640 }
1641 applyGeneric(allCells(),var,3.2);
1642 ENUMERATE_CELL(icell,allCells()){
1643 if (var[icell]!=3.2)
1644 ARCANE_FATAL("Bad value 2 for TestGeneric");
1645 }
1646 applyGeneric(m_mat1,var,7.6);
1648 if (var[imatcell]!=7.6)
1649 ARCANE_FATAL("Bad value 3 for TestGeneric");
1650 }
1651 applyGeneric(m_mat1->environment(),var,4.2);
1653 if (var[imatcell]!=4.2)
1654 ARCANE_FATAL("Bad value 4 for TestGeneric");
1655 }
1656 }
1657
1658 // Teste le remplissage des valeurs partielles.
1659 _checkFillPartialValues();
1660
1661 IMeshMaterialVariable* nv = m_material_mng->findVariable(m_pressure.variable()->fullName());
1662 if (!nv)
1663 fatal() << "Can not find MeshVariable (F1)";
1664
1665 IMeshMaterialVariable* nv2 = m_material_mng->findVariable("Pressure");
1666 if (!nv2)
1667 fatal() << "Can not find MeshVariable (F2)";
1668
1670 MatCell mmc = *imatcell;
1671 MatVarIndex mvi = mmc._varIndex();
1672 info() << "CELL IN MAT1 i=" << imatcell.index() << " vindex=" << mvi.arrayIndex() << " i=" << mvi.valueIndex();
1673 mat_pressure[mmc] += 0.2;
1674 }
1675
1676 if (m_mat2){
1678 MatCell mmc = *imatcell;
1679 MatVarIndex mvi = mmc._varIndex();
1680 info() << "CELL IN MAT2 vindex=" << mvi.arrayIndex() << " i=" << mvi.valueIndex();
1681 //mat_pressure[mmc] -= 0.2;
1682 mat_pressure[imatcell] -= 0.2;
1683 }
1684 }
1685
1686 _checkFillArrayFromTo(m_mat1,mat_pressure);
1687 if (m_mat2)
1688 _checkFillArrayFromTo(m_mat2,mat_pressure);
1689
1690 ENUMERATE_ENV(ienv,m_material_mng){
1693 EnvCell ev = *ienvcell;
1694 MatVarIndex mvi = ev._varIndex();
1695 info() << "CELL IN ENV vindex=" << mvi.arrayIndex() << " i=" << mvi.valueIndex();
1696 mat_pressure[ev] += 3.0;
1697 mat_pressure[ienvcell] += 3.0;
1698 }
1700 ComponentCell cv = *icmpcell;
1701 MatVarIndex mvi = cv._varIndex();
1702 info() << "CELL IN ENV WITH COMPONENT vindex=" << mvi.arrayIndex() << " i=" << mvi.valueIndex();
1703 mat_pressure[cv] += 3.0;
1704 EnvCell env_cell(cv);
1705 if (env_cell._varIndex()!=cv._varIndex())
1706 ARCANE_FATAL("Bad cell");
1707 }
1708 }
1709 _computeDensity();
1710 _checkArrayVariableSynchronize();
1711
1712 for( Integer i=0, n=m_material_mng->materials().size(); i<n; ++i ){
1713 IMeshMaterial* mat = m_material_mng->materials()[i];
1714 m_density_post_processing[i]->copy(m_mat_density.globalVariable());
1715 _copyPartialToGlobal(mat,*m_density_post_processing[i],m_mat_density);
1716 }
1717
1718 // Supprime des mailles pour test
1719 {
1720 info() << "CheckRemove: Cells in MAT1=" << m_mat1->cells().size();
1722 MatCell mmc = *imatcell;
1723 MatVarIndex mvi = mmc._varIndex();
1724 info() << "CheckRemove: CELL IN MAT1 i=" << imatcell.index() << " vindex=" << mvi.arrayIndex() << " i=" << mvi.valueIndex()
1725 << " lid=" << mmc.envCell().globalCell();
1726 }
1727
1728 if (m_mat2)
1729 info() << "Cells in MAT2=" << m_mat2->cells().size();
1730
1732
1733 Int64 last_uid = m_nb_starting_cell() - (m_global_iteration()*30);
1734 info() << "LAST_UID_TO_REMOVE=" << last_uid;
1735
1736 ENUMERATE_CELL(icell,allCells()){
1737 Cell c = *icell;
1738 if (c.uniqueId()>last_uid)
1739 remove_lids.add(c.localId());
1740 }
1741
1742 info() << "Removing cells n=" << remove_lids.size();
1743 mesh()->modifier()->setDynamic(true);
1744 mesh()->modifier()->removeCells(remove_lids);
1745 if (parallelMng()->isParallel()){
1746 // En parallèle, comme on supprime les mailles un peu n'importe comment,
1747 // on supprime les tests tant que le maillage n'est pas à jour.
1748 // TODO: regarder pourquoi le test checkValidMesh() plante.
1749 Integer check_level = mesh()->checkLevel();
1750 mesh()->setCheckLevel(0);
1751 mesh()->modifier()->endUpdate();
1752 {
1753 MeshMaterialIndirectModifier mmim(m_material_mng);
1754 mmim.beginUpdate();
1755 info() << "MESH_MATERIAL_TEST: UpdateGhostLayers";
1756 mesh()->modifier()->updateGhostLayers();
1757 if ((m_global_iteration() % 2)==0){
1758 mmim.endUpdateWithSort();
1759 // TODO: vérifier que tout est trié
1760 }
1761 else
1762 mmim.endUpdate();
1763 }
1764 mesh()->setCheckLevel(check_level);
1765 //mesh()->checkValidMesh();
1766 }
1767 else
1768 mesh()->modifier()->endUpdate();
1769
1770 info() << "End removing cells nb_cell=" << mesh()->nbCell();
1771 }
1772 if (m_mesh_partitioner){
1773 Integer iteration = m_global_iteration();
1774 // Lance un repartitionnement toute les 3 itérations.
1775 if ((iteration%3)==0){
1776 info() << "Registering mesh partition";
1777 subDomain()->timeLoopMng()->registerActionMeshPartition(m_mesh_partitioner);
1778 m_check_spectral_values_iteration = (iteration*2)+1;
1779 _setOrCheckSpectralValues(m_check_spectral_values_iteration,false);
1780 }
1781 }
1782 {
1783 // Initialise la densité et l'energie interne dans les nouvelles mailles.
1784 ENUMERATE_MAT(imat,m_material_mng){
1787 MatCell mc = *icell;
1788 if (m_mat_density[mc] == 0.0)
1789 m_mat_density[mc] = 50.0;
1790 if (m_mat_internal_energy[mc] == 0.0)
1791 m_mat_internal_energy[mc] = 1.0;
1792 }
1793 }
1794 _applyEos(false);
1795 }
1796}
1797
1798/*---------------------------------------------------------------------------*/
1799/*---------------------------------------------------------------------------*/
1800
1801void MeshMaterialTesterModule::
1802_checkFillPartialValues()
1803{
1804 // Teste le remplissage des valeurs partielles par les valeurs globales.
1805 info() << "Check MaterialVariableCellReal";
1806 MaterialVariableCellReal mat_var(MaterialVariableBuildInfo(m_material_mng,"TestFillPartialMat"));
1807 _checkFillPartialValuesHelper(mat_var);
1808
1809 info() << "Check EnvironmentVariableCellReal";
1810 EnvironmentVariableCellReal env_var(MaterialVariableBuildInfo(m_material_mng,"TestFillPartialEnv"));
1811 _checkFillPartialValuesHelper(env_var);
1812 if (m_material_mng->isAllocateScalarEnvironmentVariableAsMaterial()){
1813 MaterialVariableCellReal mat_env_var(MaterialVariableBuildInfo(m_material_mng,"TestFillPartialEnv"));
1814 info() << "Ok for creating Material variable with same name as Environment variable";
1815 }
1816
1817 info() << "Check MaterialVariableCellReal";
1818 MaterialVariableCellArrayReal mat_var2(MaterialVariableBuildInfo(m_material_mng,"TestFillPartialMat2"));
1819 mat_var2.resize(5);
1820 _checkFillPartialValuesHelper(mat_var2);
1821
1822 info() << "Check EnvironmentVariableCellArrayReal";
1823 EnvironmentVariableCellArrayReal env_var2(MaterialVariableBuildInfo(m_material_mng,"TestFillPartialEnv2"));
1824 env_var2.resize(12);
1825 _checkFillPartialValuesHelper(env_var2);
1826}
1827
1828/*---------------------------------------------------------------------------*/
1829/*---------------------------------------------------------------------------*/
1830
1831template<typename VarType> void MeshMaterialTesterModule::
1832_checkFillPartialValuesHelper(VarType& mat_var)
1833{
1834 info() << "Check fillPartialValuesWithGlobalValues()";
1835 _fillVar(mat_var,3.0);
1836 mat_var.materialVariable()->fillPartialValuesWithGlobalValues();
1837 _checkFillPartialValuesWithGlobal(mat_var,m_material_mng->components());
1838
1839 info() << "Check fillPartialValuesWithSuperValues(LEVEL_ALLENVIRONMENT)";
1840 _fillVar(mat_var,7.0);
1841 mat_var.fillPartialValuesWithSuperValues(LEVEL_ALLENVIRONMENT);
1842 _checkFillPartialValuesWithGlobal(mat_var,m_material_mng->components());
1843
1844 info() << "Check fillPartialValuesWithSuperValues(LEVEL_ENVIRONMENT)";
1845 _fillVar(mat_var,-2.0);
1846 mat_var.fillPartialValuesWithSuperValues(LEVEL_ENVIRONMENT);
1847 _checkFillPartialValuesWithSuper(mat_var,m_material_mng->environmentsAsComponents());
1848
1849 info() << "Check fillPartialValuesWithSuperValues(LEVEL_MATERIAl)";
1850 _fillVar(mat_var,-25.0);
1851 mat_var.fillPartialValuesWithSuperValues(LEVEL_MATERIAL);
1852 _checkFillPartialValuesWithSuper(mat_var,m_material_mng->materialsAsComponents());
1853}
1854
1855/*---------------------------------------------------------------------------*/
1856/*---------------------------------------------------------------------------*/
1857
1858namespace
1859{
1860void _setValue(Real& var_ref,Real value)
1861{
1862 var_ref = value;
1863}
1864void _setValue(RealArrayView var_ref,Real value)
1865{
1866 Integer n = var_ref.size();
1867 for( Integer i=0; i<n; ++i ){
1868 var_ref[i] = value*((Real)(i+1));
1869 }
1870}
1871}
1872template<typename VarType> void MeshMaterialTesterModule::
1873_fillVar(VarType& var_type,Real base_value)
1874{
1875 MeshComponentList components = m_material_mng->components();
1876 MatVarSpace var_space = var_type.space();
1877 Int32 index = 0;
1878 ENUMERATE_COMPONENT(ic,components){
1879 IMeshComponent* c = *ic;
1880 if (!c->hasSpace(var_space))
1881 continue;
1883 ++index;
1884 _setValue(var_type[iccell],(base_value + (Real)index));
1885 }
1886 }
1887}
1888
1889/*---------------------------------------------------------------------------*/
1890/*---------------------------------------------------------------------------*/
1891
1892template<typename VarType> void MeshMaterialTesterModule::
1893_checkFillPartialValuesWithGlobal(const VarType& var_type,MeshComponentList components)
1894{
1895 ValueChecker vc(A_FUNCINFO);
1896 MatVarSpace var_space = var_type.space();
1897
1898 ENUMERATE_COMPONENT(ic,components){
1899 IMeshComponent* c = *ic;
1900 if (!c->hasSpace(var_space))
1901 continue;
1903 Cell c = (*iccell).globalCell();
1904 auto ref_value = var_type[c];
1905 auto my_value = var_type[iccell];
1906 vc.areEqual(my_value,ref_value,"Bad fill value with global");
1907 }
1908 }
1909}
1910
1911/*---------------------------------------------------------------------------*/
1912/*---------------------------------------------------------------------------*/
1913
1914template<typename VarType> void MeshMaterialTesterModule::
1915_checkFillPartialValuesWithSuper(const VarType& var_type,MeshComponentList components)
1916{
1917 ValueChecker vc(A_FUNCINFO);
1918 MatVarSpace var_space = var_type.space();
1919
1920 ENUMERATE_COMPONENT(ic,components){
1921 IMeshComponent* c = *ic;
1922 if (!c->hasSpace(var_space))
1923 continue;
1925 ComponentCell c = (*iccell).superCell();
1926 auto ref_value = var_type[c];
1927 auto my_value = var_type[iccell];
1928 vc.areEqual(my_value,ref_value,"Bad fill value with super");
1929 }
1930 }
1931}
1932
1933/*---------------------------------------------------------------------------*/
1934/*---------------------------------------------------------------------------*/
1935
1936template<typename VarType1,typename VarType2,typename VarType3> void MeshMaterialTesterModule::
1937_setOrCheckSpectralValues2(VarType1& var_real,VarType2& var_int32,VarType3& var_scalar_int32,
1938 Int64 iteration,bool is_check)
1939{
1940 typedef std::function<void(Int64,Int64,ComponentItemLocalId)> FunctorType;
1941
1942 Int32 spectral1_dim2 = var_real.globalVariable().arraySize();
1943 Int32 spectral2_dim2 = var_int32.globalVariable().arraySize();
1944 info() << "SET_OR_CHECK size1=" << spectral1_dim2 << " size2=" << spectral2_dim2;
1945 FunctorType set_func = [&](Int64 uid,Int64 iteration,ComponentItemLocalId var_index)
1946 {
1947 Int64 component_idx = var_index.localId().arrayIndex();
1948 Int64 base = uid + iteration + (component_idx+1);
1949 for( Integer i=0; i<spectral1_dim2; ++i )
1950 var_real[var_index][i] = Convert::toReal(2.0 + (Real)(base * spectral1_dim2 + i));
1951 for( Integer i=0; i<spectral2_dim2; ++i )
1952 var_int32[var_index][i] = (Int32)(3 + (base * spectral2_dim2 + i*2 ));
1954 };
1955
1956 ValueChecker vc(A_FUNCINFO);
1957 vc.setThrowOnError(false);
1958
1959 FunctorType check_func = [&](Int64 uid,Int64 iteration,ComponentItemLocalId var_index)
1960 {
1961 Int64 component_idx = var_index.localId().arrayIndex();
1962 Int64 base = uid + iteration + (component_idx+1);
1963 for( Integer i=0; i<spectral1_dim2; ++i ){
1964 Real ref1 = Convert::toReal(2.0 + (Real)(base * spectral1_dim2 + i));
1965 //info() << "CHECK1 var=" << var_real.name() << " idx=" << var_index << " v1=" << ref1 << " v2=" << var_real[var_index][i];
1966 vc.areEqual(ref1,var_real[var_index][i],String::format("spectral1:{0}",var_real.name()));
1967 }
1968 for( Integer i=0; i<spectral2_dim2; ++i ){
1969 Int32 ref2 = (Int32)(3 + (base * spectral2_dim2 + i*2 ));
1970 //info() << "CHECK2 var=" << var_real.name() << " idx=" << var_index << " v1=" << ref2 << " v2=" << var_int32[var_index][i];
1971 vc.areEqual(ref2,var_int32[var_index][i],String::format("spectral2:{0}",var_int32.name()));
1972 }
1973 Int32 ref3 = (Int32)(3 + (base * spectral2_dim2));
1974 vc.areEqual(ref3,var_scalar_int32[var_index],"scalar1");
1975 if (vc.nbError()!=0){
1976 error() << "Error for cell uid=" << uid << " var_index=" << var_index;
1977 vc.throwIfError();
1978 }
1979 };
1980
1981 FunctorType func = (is_check) ? check_func : set_func;
1982
1983 bool has_mat = var_real.materialVariable()->space()!=MatVarSpace::Environment;
1984 ENUMERATE_ALLENVCELL(iallenvcell,m_material_mng,allCells()){
1986 Cell global_cell = all_env_cell.globalCell();
1987 Int64 cell_uid = global_cell.uniqueId();
1989 func(cell_uid,iteration,ienvcell);
1990 if (has_mat){
1992 func(cell_uid,iteration,imatcell);
1993 }
1994 }
1995 }
1996 func(cell_uid,iteration,all_env_cell);
1997 }
1998}
1999
2000/*---------------------------------------------------------------------------*/
2001/*---------------------------------------------------------------------------*/
2002
2003void MeshMaterialTesterModule::
2004_setOrCheckSpectralValues(Int64 iteration,bool is_check)
2005{
2006 _setOrCheckSpectralValues2(m_mat_spectral1,m_mat_spectral2,m_mat_int32,iteration,is_check);
2007 _setOrCheckSpectralValues2(m_env_spectral1,m_env_spectral2,m_env_int32,iteration,is_check);
2008}
2009
2010/*---------------------------------------------------------------------------*/
2011/*---------------------------------------------------------------------------*/
2012
2013void MeshMaterialTesterModule::
2014_checkArrayVariableSynchronize()
2015{
2016 info() << "_checkArrayVariableSynchronize(): SYNCHRONIZE_MATERIALS";
2017 m_material_mng->synchronizeMaterialsInCells();
2018 m_material_mng->checkMaterialsInCells();
2019
2020 Int64 iteration = m_global_iteration();
2021
2022 _setOrCheckSpectralValues(iteration,false);
2023
2024 // On utilise la synchro par liste une itération sur deux.
2025 if ((iteration % 2)==0){
2027 m_mat_spectral1.synchronize(mlist);
2028 m_mat_spectral2.synchronize(mlist);
2029 m_env_spectral1.synchronize(mlist);
2030 m_env_spectral2.synchronize(mlist);
2031 m_mat_int32.synchronize();
2032 m_env_int32.synchronize();
2033 mlist.apply();
2034 }
2035 else{
2036 m_mat_spectral1.synchronize();
2037 m_mat_spectral2.synchronize();
2038 m_env_spectral1.synchronize();
2039 m_env_spectral2.synchronize();
2040 m_mat_int32.synchronize();
2041 m_env_int32.synchronize();
2042 }
2043
2044 _setOrCheckSpectralValues(iteration,true);
2045}
2046
2047/*---------------------------------------------------------------------------*/
2048/*---------------------------------------------------------------------------*/
2049
2050void MeshMaterialTesterModule::
2051_computeDensity()
2052{
2053 VariableCellReal tmp_cell_mat_density(VariableBuildInfo(defaultMesh(),"TmpCellMatDensity"));
2054 VariableNodeReal tmp_node_mat_density(VariableBuildInfo(defaultMesh(),"TmpNodeMatDensity"));
2055
2058 // Calcul les mailles dans lesquelles il faut ajouter ou supprimer des matériaux
2059 {
2060 Materials::MeshMaterialModifier modifier(m_material_mng);
2061 ENUMERATE_ENV(ienv,m_material_mng){
2065 mat_to_add_array.clear();
2066 mat_to_remove_array.clear();
2068 info() << "FILL_DENSITY_INFO ITER=" << m_global_iteration()
2069 << " mat=" << mat->name()
2070 << " nb_to_add=" << mat_to_add_array.size()
2071 << " nb_to_remove=" << mat_to_remove_array.size();
2072
2073 modifier.removeCells(mat,mat_to_remove_array);
2074 modifier.addCells(mat,mat_to_add_array);
2075 }
2076 }
2077 }
2078
2079 // Met à jour les valeurs.
2080 {
2081 ENUMERATE_ENV(ienv,m_material_mng){
2085 }
2086 }
2087 }
2088 // Pour que les synchronisations fonctionnent bien,
2089 // il faut que les matériaux soient les mêmes dans toutes les mailles.
2090 m_material_mng->synchronizeMaterialsInCells();
2091 info() << "Synchronize density";
2092 m_mat_density.synchronize();
2093}
2094
2095/*---------------------------------------------------------------------------*/
2096/*---------------------------------------------------------------------------*/
2097
2098void MeshMaterialTesterModule::
2099_copyPartialToGlobal(IMeshMaterial* mat,VariableCellReal& global_density,
2101{
2103 MatCell mc = *imatcell;
2104 Cell global_cell = mc.globalCell();
2106 }
2107}
2108
2109/*---------------------------------------------------------------------------*/
2110/*---------------------------------------------------------------------------*/
2128 bool is_compute_mat)
2129{
2130 Int32 mat_id = mat->id();
2131 tmp_cell_mat_density.fill(0.0);
2132 tmp_node_mat_density.fill(0.0);
2133 info() << "FILL MAT=" << mat->name();
2134
2135 // Copy dans tmp_cell_mat_density la valeur partielle de la densité pour \a mat
2136 _copyPartialToGlobal(mat,tmp_cell_mat_density,m_mat_density);
2137
2138 // La valeur aux noeuds est la moyenne de la valeur aux mailles autour
2139 ENUMERATE_NODE(inode,allNodes()){
2140 Real v = 0.0;
2141 for( CellLocalId icell : inode->cellIds() )
2143 v /= (Real)inode->nbCell();
2144 v *= 0.8;
2146 }
2147
2148 // Phase1, calcule les mailles où le matériau sera créé ou supprimé.
2149 // Cela se fait en fonction de certaines valeurs (arbitraires) de la densité.
2150 if (is_compute_mat){
2151 ENUMERATE_CELL(icell,allCells()){
2152 Cell cell = *icell;
2154 Real new_density = 0.0;
2155 bool has_material = (m_present_material[cell] & (1<<mat_id));
2156 for( NodeLocalId inode : cell.nodeIds() )
2158 new_density /= (Real)cell.nbNode();
2159 if (new_density>=0.5 && !has_material && current_density==0.0){
2160 mat_to_add_array.add(cell.localId());
2161 info() << "NEW CELL FOR MAT " << mat_id << " uid=" << ItemPrinter(cell) << " new=" << new_density;
2162 }
2164 mat_to_remove_array.add(cell.localId());
2165 info() << "REMOVE CELL FOR MAT " << mat_id << " uid=" << ItemPrinter(cell) << " new=" << new_density
2166 << " old=" << current_density;
2167 }
2169 }
2170 }
2171 else{
2172 // Phase2: met à jour les valeurs maintenant que le matériau a été
2173 // ajouté dans toutes les mailles
2174
2175 ENUMERATE_CELL(icell,allCells()){
2176 Cell cell = *icell;
2177 Real new_density = 0.0;
2178 for( NodeLocalId inode : cell.nodeIds() )
2180 new_density /= (Real)cell.nbNode();
2182 }
2183
2185 MatCell mc = *imatcell;
2186 Cell global_cell = mc.globalCell();
2187 //Real density = tmp_cell_mat_density[global_cell];
2188 //info() << "ASSIGN cell=" << global_cell.uniqueId() << " density=" << density;
2189 m_mat_density[mc] = tmp_cell_mat_density[global_cell];
2190 }
2191 }
2192 {
2193 StdMeshVariables<MeshMaterialVariableTraits> xm(meshHandle(),"Base1","Base2");
2194 }
2195}
2196
2197/*---------------------------------------------------------------------------*/
2198/*---------------------------------------------------------------------------*/
2199
2200void MeshMaterialTesterModule::
2201_checkCreation2(Integer a,Integer n)
2202{
2203 Int64 z = 0;
2204 info() << "I=" << a << " N=" << n;
2205 for( Integer i=0; i<n; ++i ){
2207 z += mat_pressure.materialVariable()->name().length();
2208 }
2209 info() << "Z=" << z;
2210}
2211
2212/*---------------------------------------------------------------------------*/
2213/*---------------------------------------------------------------------------*/
2219{
2220 Integer n = 0;
2221 ParallelLoopOptions options;
2222 options.setGrainSize(20);
2223 arcaneParallelFor(0,1000,options,[&](Integer a,Integer n) { _checkCreation2(a,n); });
2224
2225 info() << "CHECK CREATE N=" << n;
2226
2227 {
2229 mat_pressure.fill(0.0);
2231 MatCell mmc = *imatcell;
2232 mat_pressure[mmc] += 0.2;
2233 }
2234 }
2235}
2236#if 0
2237/*---------------------------------------------------------------------------*/
2238/*---------------------------------------------------------------------------*/
2239
2240void MeshMaterialTesterModule::
2241_checkSynchronize()
2242{
2243 MaterialVariableCellInt32 m_mat_int32;
2246}
2247#endif
2248
2249/*---------------------------------------------------------------------------*/
2250/*---------------------------------------------------------------------------*/
2251
2252namespace
2253{
2254// Exemple pour la documentation. Doit compiler mais ne sera pas exécuté.
2255class Sample
2256: public BasicModule
2257{
2258 public:
2259 Sample(const ModuleBuildInfo& mbi)
2260 : BasicModule(mbi), m_mat_density(MaterialVariableBuildInfo(0,"TestDensity"))
2261 {}
2262 MaterialVariableCellReal m_mat_density;
2263
2265 void _computeDensity(IMeshMaterial* mat)
2266 {
2268 MatCell mc = *imc;
2269 m_mat_density[mc] = 1.0;
2270 }
2271
2272 // Indique que la variable est à jour.
2273 m_mat_density.setUpToDate(mat);
2274 }
2276
2277 void _sample()
2278 {
2281 // Création ou récupération du gestionnaire depuis un maillage.
2284
2286 // Exemple de création de 3 matériaux:
2287 material_mng->registerMaterialInfo("MAT1");
2288 material_mng->registerMaterialInfo("MAT2");
2289 material_mng->registerMaterialInfo("MAT3");
2291
2293 // Création du milieu ENV1 contenant les matériaux MAT1 et MAT2
2295 ebi1.addMaterial("MAT1");
2296 ebi1.addMaterial("MAT2");
2297 IMeshEnvironment* env1 = material_mng->createEnvironment(ebi1);
2298
2299 // Création du milieu ENV2 contenant le matériau MAT2
2301 ebi2.addMaterial("MAT2");
2302 IMeshEnvironment* env2 = material_mng->createEnvironment(ebi2);
2303
2304 // Création du milieu ENV3 contenant les matériaux MAT3 et MAT1
2306 ebi3.addMaterial("MAT3");
2307 ebi3.addMaterial("MAT1");
2308 IMeshEnvironment* env3 = material_mng->createEnvironment(ebi3);
2309
2310 // Création du bloc BLOCK1 sur le groupe de toutes les mailles
2311 // et contenant les milieux ENV1 et ENV2
2312 MeshBlockBuildInfo mb1("BLOCK1",allCells());
2313 mb1.addEnvironment(env1);
2314 mb1.addEnvironment(env2);
2315 IMeshBlock* block = material_mng->createBlock(mb1);
2316
2317 // Indique au gestionnaire que l'initialisation est terminée
2318 material_mng->endCreate();
2320
2322 info() << env1->id(); // Affiche '0'
2323 info() << env1->materials()[0]->id(); // Affiche '0'
2324 info() << env1->materials()[1]->id(); // Affiche '1'
2325 info() << env2->id(); // Affiche '1'
2326 info() << env2->materials()[0]->id(); // Affiche '2'
2327 info() << env3->id(); // Affiche '2'
2328 info() << env3->materials()[0]->id(); // Affiche '3'
2329 info() << env3->materials()[1]->id(); // Affiche '4'
2330 info() << block->id(); // Affiche '0'
2332
2334 {
2335 // Créé l'instance de modification. Les modifications
2336 // seront effectives lors de l'appel au destructeur de
2337 // cette classe.
2339 // Ajoute les mailles du matériau 1 ou 2 en fonction
2340 // de leur localId()
2343 Integer nb_cell = allCells().size();
2344 ENUMERATE_CELL(icell,allCells()){
2345 Int32 local_id = icell.itemLocalId();
2346 Integer z = icell.index();
2347 bool add_to_mat1 = (z<(nb_cell/2) && z>(nb_cell/4));
2348 bool add_to_mat2 = (z>=(nb_cell/2) || z<(nb_cell/3));
2349 if (add_to_mat1)
2350 mat1_indexes.add(local_id);
2351 if (add_to_mat2)
2352 mat2_indexes.add(local_id);
2353 }
2354 // Ajoute les mailles du matériau 1
2355 modifier.addCells(env1->materials()[0],mat1_indexes);
2356 // Ajoute les mailles du matériau 2
2357 modifier.addCells(env1->materials()[1],mat2_indexes);
2358 }
2359 // A partir d'ici, les matériaux sont mis à jour.
2360 info() << env1->materials()[0]->cells().size(); // Nombre de mailles du matériau
2362
2364 IMesh* mesh = defaultMesh();
2369
2371 // Itération sur tous les milieux, puis tous les matériaux et
2372 // toutes les mailles de ce matériau
2378 MatCell mc = *imatcell;
2379 info() << "Cell mat=" << mc.materialId();
2380 }
2381 }
2384 info() << "Cell env=" << mmcell.environmentId();
2385 }
2386 }
2388
2390 // Itération sur tous les mailles des matériaux des milieux d'un bloc.
2391 ENUMERATE_ENV(ienv,block){
2396 MatCell mc = *imatcell;
2397 info() << "Cell mat=" << mc.materialId();
2398 }
2399 }
2400 }
2402
2404 // Itération sur tous les milieux et tous les matériaux d'une maille.
2409 info() << "Cell env=" << env_cell.environmentId();
2411 MatCell mc = *imatcell;
2412 info() << "Cell mat=" << mc.materialId();
2413 }
2414 }
2415 }
2417
2419 // Itération sur tous les milieux et tous les matériaux d'une maille.
2424 info() << "Cell env=" << env_cell.environmentId();
2426 MatCell mc = *imatcell;
2427 info() << "Cell mat=" << mc.materialId();
2428 }
2429 }
2430 }
2432
2433
2435 CellGroup cells;
2436 IMeshMaterial* mat = env1->materials()[0];
2439 mat_density[imatcell] = 2.3;
2440 }
2444 mat_density[imatcell] = 3.1;
2445 }
2447
2449
2450
2452 // Itération sur tous les milieux, puis tous les matériaux et
2453 // toutes les mailles de ce matériau via la ComponentCell
2460 info() << "Cell mat=" << cc.componentId();
2461 mat_density[cc] = 3.1; // Met à jour la densité du matériau
2462 }
2463 }
2466 info() << "Cell env=" << cc.componentId();
2467 mat_density[cc] = 2.5; // Met à jour la densité du milieu
2468 }
2469 }
2471
2472 {
2474 MatCell mc;
2476 // Retourne la maille milieu (EnvCell) du matériau:
2477 ComponentCell cc2 = cc.superCell();
2478 // Itère sur les mailles matériaux du milieu
2480 }
2481
2482 // Retourne la maille AllEnvCell du milieu:
2483 ComponentCell cc3 = cc2.superCell();
2484 // Itère sur les mailles milieu de la maille.
2486 }
2488 }
2489
2490 {
2491 Real init_val = 0.0;
2493 // Initialise la valeur globale
2494 var.globalVariable().fill(init_val);
2496 // Initialise les valeurs milieux
2499 }
2500 // Initialise les valeurs matériaux
2504 }
2505 }
2506 }
2507 }
2508
2509 {
2511 // Positionne la méthode de calcul.
2512 mat_density.setMaterialComputeFunction(this,&Sample::_computeDensity);
2513 // Ajoute dépendance sur une variable matériau
2514 mat_density.addMaterialDepend(mat_pressure);
2515 // Ajoute dépendance sur variables globales
2516 mat_density.addMaterialDepend(defaultMesh()->nodesCoordinates());
2517 mat_density.addMaterialDepend(m_global_time);
2518
2521 // Met à jour la variable sur le matériau \a mat si besoin.
2522 mat_density.update(mat);
2523 }
2525 }
2526
2527 {
2529 // Boucle parallèle sur les mailles du milieu env1
2531 Parallel::Foreach(env->envView(),[&](EnvItemVectorView view)
2532 {
2533 ENUMERATE_ENVCELL(ienvcell,view){
2534 mat_density[ienvcell] = 2.5;
2535 }
2536 });
2537
2538 // Boucle parallèle sur les mailles du premier matériaux de env1
2539 IMeshMaterial* mat = env1->materials()[0];
2540 Parallel::Foreach(mat->matView(),[&](MatItemVectorView view)
2541 {
2542 ENUMERATE_MATCELL(imatcell,view){
2543 mat_density[imatcell] = 2.5;
2544 }
2545 });
2546
2547 // Functor générique sur un matériau ou milieu.
2548 auto func = [&](ComponentItemVectorView view)
2549 {
2551 mat_density[iccell] = 2.5;
2552 }
2553 };
2554 // Application en parallèle de \a func sur le matériau
2555 Parallel::Foreach(mat->view(),func);
2556 // Application en parallèle de \a func sur le milieu
2557 Parallel::Foreach(env->view(),func);
2558
2559 // Application en parallèle de \a func sur le milieu avec options
2560 ParallelLoopOptions options;
2561 Parallel::Foreach(env->view(),options,func);
2563 }
2564
2565 {
2571
2573 Real nr = 1.0;
2574 // Température et volume en lecture seule
2575 auto in_volume = viewIn(mat_volume);
2577 // Pression en écriture
2579
2582 };
2584
2589
2590 // Boucle sur les mailles du milieu \a env
2592 EnvCell c = *ienvcell;
2594 }
2595
2596 // Boucle sur les mailles du milieu \a env_vector
2598 EnvCell c = *ienvcell;
2600 }
2601
2602 // Boucle sur les mailles pures du milieu \a env
2604 EnvCell c = *ienvcell;
2606 }
2607
2608 // Boucle sur les mailles pures du milieu \a env
2610 EnvCell c = *ienvcell;
2612 }
2613
2614 // Boucle sur les mailles impures du milieu \a env
2616 EnvCell c = *ienvcell;
2618 }
2619
2620 // Boucle sur les mailles impures du milieu \a env
2622 EnvCell c = *ienvcell;
2624 }
2625
2627
2630 IMeshMaterial* mat = env1->materials()[0];
2632
2633 // Boucle sur les mailles du matériau \a mat
2635 MatCell c = *imatcell;
2637 }
2638
2639 // Boucle sur les mailles du matériau \a mat_vector
2641 MatCell c = *imatcell;
2643 }
2644
2645 // Boucle sur les mailles pures du matériau \a mat
2647 MatCell c = *imatcell;
2649 }
2650
2651 // Boucle sur les mailles pures du matériau \a mat
2653 MatCell c = *imatcell;
2655 }
2656
2657 // Boucle sur les mailles impures du matériau \a mat
2659 MatCell c = *imatcell;
2661 }
2662
2663 // Boucle sur les mailles impures du matériau \a mat
2665 MatCell c = *imatcell;
2667 }
2669
2671 // Boucle générique sur les mailles du matériau \a mat
2675 }
2676
2677 // Boucle générique sur les mailles du matériau \a mat_vector
2681 }
2682
2683 // Boucle générique sur les mailles pures du matériau \a mat
2687 }
2688
2689 // Boucle générique sur les mailles pures du matériau \a mat
2693 }
2694
2695 // Boucle générique sur les mailles impures du matériau \a mat
2699 }
2700
2701 // Boucle générique sur les mailles impures du matériau \a mat
2705 }
2707
2708
2709 }
2710 }
2711};
2712}
2713
2714/*---------------------------------------------------------------------------*/
2715/*---------------------------------------------------------------------------*/
2716
2717ARCANE_REGISTER_MODULE_MESHMATERIALTESTER(MeshMaterialTesterModule);
2718
2719/*---------------------------------------------------------------------------*/
2720/*---------------------------------------------------------------------------*/
2721
2722} // End namespace ArcaneTest
2723
2724/*---------------------------------------------------------------------------*/
2725/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#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.
#define ENUMERATE_FACE(name, group)
Enumérateur générique d'un groupe de faces.
#define ENUMERATE_CELL(name, group)
Enumérateur générique d'un groupe de mailles.
#define ENUMERATE_NODE(name, group)
Enumérateur générique d'un groupe de noeuds.
Module de test pour la gestion des matériaux et des milieux.
void _applyEos(bool is_init)
Appelle le service d'EOS s'il est disponible.
MaterialVariableCellReal m_mat_nodump_real
Variable pour tester la bonne prise en compte du PNoDump.
void _checkCreation()
Test la création à la volée des variables, avec multi-threading.
MaterialVariableCellReal m_mat_not_used_real
Variable pour tester la bonne prise en compte de setUsed(false)
void _fillDensity(IMeshMaterial *mat, VariableCellReal &tmp_cell_mat_density, VariableNodeReal &tmp_node_mat_density, Int32Array &mat_to_add_array, Int32Array &mat_to_remove_array, bool is_compute_mat)
void _testComponentPart(IMeshMaterial *mat, IMeshEnvironment *env)
Teste les itérateurs par partie.
IMeshPartitioner * m_mesh_partitioner
Partitioner en cas d'équilibrage. Est géré par une option du JDD.
Tableau d'items de types quelconques.
Module basique.
Definition BasicModule.h:45
Maille d'un maillage.
Definition Item.h:1178
Face d'une maille.
Definition Item.h:932
Cell boundaryCell() const
Maille associée à cette face frontière (maille nulle si aucune)
Definition Item.h:1592
Cell backCell() const
Maille derrière la face (maille nulle si aucune)
Definition Item.h:1598
virtual Integer nbCell()=0
Nombre de mailles du maillage.
Interface d'un partitionneur de maillage.
virtual IMeshModifier * modifier()=0
Interface de modification associée.
virtual void setCheckLevel(Integer level)=0
Positionne le niveau de vérification du maillage.
virtual Integer checkLevel() const =0
Niveau actuel de vérification.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
Interface du gestionnaire de la boucle en temps.
Interface d'une boucle en temps.
Definition ITimeLoop.h:41
static const char * WBuild
appelé lors de la lecture du jeu de données
Definition ITimeLoop.h:50
static const char * WComputeLoop
appelé pendant la boucle de calcul
Definition ITimeLoop.h:48
static const char * WInit
appelé pendant l'initialisation, l'initialisation d'une reprise ou d'un nouveau cas
Definition ITimeLoop.h:52
Interface d'un service de test unitaire.
Definition IUnitTest.h:34
Interface d'une variable.
Definition IVariable.h:54
@ PNoDump
Indique que la variable ne doit pas être sauvegardée.
Definition IVariable.h:72
Classe utilitaire pour imprimer les infos sur une entité.
Definition ItemPrinter.h:35
Int32 nbNode() const
Nombre de noeuds de l'entité
Definition Item.h:765
NodeLocalIdView nodeIds() const
Liste des noeuds de l'entité
Definition Item.h:774
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Definition Item.h:210
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Definition Item.h:216
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Maille arcane avec info matériaux et milieux.
void fill(const DataType &value)
Remplit les valeurs partielles et globales de la variable avec la valeur value.
void fillPartialValues(const DataType &value)
Remplit les valeurs partielles de la variable avec la valeur value.
GlobalVariableRefType & globalVariable()
Variable globale associée à cette variable matériau.
Représente un composant d'une maille multi-matériau.
ARCCORE_HOST_DEVICE MatVarIndex _varIndex() const
Index d'un Item matériaux dans une variable.
Vue sur un vecteur sur les entités d'un composant.
Vecteur sur les entités d'un milieu.
Maille arcane d'un milieu.
Vue sur un vecteur sur les entités d'un milieu.
Interface d'un bloc d'un maillage.
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...
Interface d'un composant (matériau ou milieu) d'un maillage.
virtual String name() const =0
Nom du composant.
virtual CellGroup cells() const =0
Groupe des mailles de ce matériau.
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 ComponentPurePartItemVectorView pureItems() const =0
Vue sur la liste des entités pures (associées à la maille globale) du composant.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
virtual ConstArrayView< IMeshMaterial * > materials() const =0
Liste des matériaux.
virtual MeshComponentList materialsAsComponents() const =0
Liste des matériaux vus comme composants.
virtual MeshComponentList components() const =0
Liste de tous les composants.
virtual IMeshMaterialVariable * findVariable(const String &name)=0
Variable de nom name ou nullptr si aucune de ce nom existe.
virtual void setAllocateScalarEnvironmentVariableAsMaterial(bool v)=0
Positionne l'option indiquant si les variables scalaires milieux sont allouées sur les matériaux.
virtual bool isAllocateScalarEnvironmentVariableAsMaterial() const =0
Indique si les variables scalaires milieux sont allouées sur les matériaux.
virtual void dumpInfos(std::ostream &o)=0
Ecrit les infos des matériaux et milieux sur le flot o.
virtual void forceRecompute()=0
Force le recalcul des informations des matériaux.
virtual void checkMaterialsInCells(Integer max_print=10)=0
Vérifie que les mailles des matériaux sont cohérentes entre les sous-domaines.
virtual void setMeshModificationNotified(bool v)=0
Indique si les milieux et matériaux suivent les changements de topologie dans le maillage.
virtual void fillWithUsedVariables(Array< IMeshMaterialVariable * > &variables)=0
Remplit le tableau variables avec la liste des variables matériaux utilisés.
virtual bool synchronizeMaterialsInCells()=0
Synchronise les mailles des matériaux.
virtual MeshComponentList environmentsAsComponents() const =0
Liste des milieux vus comme composants.
virtual void setModificationFlags(int v)=0
Positionner les flags pour paramêtrer les modifications de matériaux/milieux.
static IMeshMaterialMng * getReference(const MeshHandleOrMesh &mesh_handle, bool create=true)
Récupère ou créé la référence associée à mesh.
Interface d'une variable matériau d'un maillage.
virtual void dumpValues(std::ostream &ostr)=0
Affiche les valeurs de la variable sur le flot ostr.
Interface d'un matériau d'un maillage.
virtual IMeshEnvironment * environment() const =0
Milieu auquel appartient ce matériau.
virtual MatItemVectorView matView() const =0
Vue associée à ce matériau.
Vecteur sur les entités d'un matériau.
Représente un matériau d'une maille multi-matériau.
Vue sur un vecteur sur les entités d'un matériau.
Représente un index sur les variables matériaux et milieux.
Informations pour la création d'un milieu.
Objet permettant de modifier indirectement les matériaux ou les milieux.
Infos d'un matériau d'un maillage.
Objet permettant de modifier les matériaux ou les milieux.
IMeshMaterialVariable * materialVariable() const
Variable matériau associée.
void synchronize()
Synchronise les valeurs entre les sous-domaines.
Informations pour la création d'un bloc.
Informations pour construire un module.
Flot de sortie lié à une String.
Options d'exécution d'une boucle parallèle en multi-thread.
void setGrainSize(Integer v)
Positionne la taille (approximative) d'un intervalle d'itération.
Infos d'un point d'entrée d'une boucle en temps.
Vérification de la validité de certaines valeurs.
Paramètres nécessaires à la construction d'une variable.
void assign(const DataType &v)
Affecte à la variable la valeur v.
void setUpToDate()
Indique que la variable vient d'être mise à jour.
Integer size() const
Nombre d'éléments du vecteur.
Vue modifiable d'un tableau d'un type T.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Vue constante d'un tableau de type T.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
#define ENUMERATE_CELL_COMPONENTCELL(iname, component_cell)
Macro pour itérer sur tous les composants d'une maille.
#define ENUMERATE_ENV(ienv, container)
Macro pour itérer sur une liste de milieux.
#define ENUMERATE_ENVCELL(iname, env)
Macro pour itérer sur toutes les mailles d'un milieu.
#define ENUMERATE_COMPONENTITEM(enumerator_class_name, iname,...)
Macro générique pour itérer sur les entités d'un matériau ou d'un milieu.
#define ENUMERATE_CELL_MATCELL(iname, env_cell)
Macro pour itérer sur tous les matériaux d'une maille.
#define ENUMERATE_COMPONENT(icomponent, container)
Macro pour itérer sur une liste de composants.
#define ENUMERATE_GENERIC_CELL(iname, mat_or_env_or_group)
Macro pour itérer de manière générique sur les matériaux, milieux ou les mailles.
#define ENUMERATE_CELL_ENVCELL(iname, all_env_cell)
Macro pour itérer sur tous les milieux d'une maille.
#define ENUMERATE_MATCELL(iname, mat)
Macro pour itérer sur toutes les mailles d'un matériau.
#define ENUMERATE_ALLENVCELL(iname,...)
Macro pour itérer sur toutes les mailles AllEnvCell d'un groupe.
#define ENUMERATE_COMPONENTCELL(iname, component)
Macro pour itérer sur toutes les mailles d'un composant.
#define ENUMERATE_MAT(imat, container)
Macro pour itérer sur une liste de matériaux.
void arcaneParallelFor(Integer i0, Integer size, InstanceType *itype, void(InstanceType::*lambda_function)(Integer i0, Integer size))
Applique en concurrence la fonction lambda lambda_function sur l'intervalle d'itération [i0,...
ARCCORE_HOST_DEVICE Real2 min(Real2 a, Real2 b)
Retourne le minimum de deux Real2.
Definition MathUtils.h:336
ItemGroupT< Cell > CellGroup
Groupe de mailles.
Definition ItemTypes.h:183
MeshVariableScalarRefT< Cell, Real > VariableCellReal
Grandeur au centre des mailles de type réel.
auto viewIn(RunCommand &cmd, const CellMaterialVariableScalarRef< DataType > &var)
Vue en lecture pour les variables materiaux scalaire.
auto viewOut(RunCommand &cmd, CellMaterialVariableScalarRef< DataType > &var)
Vue en écriture pour les variables materiaux scalaire.
Real toReal(Real r)
Converti r en un Real.
Definition Convert.h:87
Active toujours les traces dans les parties Arcane concernant les matériaux.
MatVarSpace
Espace de définition d'une variable matériau.
void Foreach(const ItemVectorView &items_view, const ParallelLoopOptions &options, InstanceType *instance, void(InstanceType::*function)(ItemVectorViewT< ItemType > items))
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
Ensemble des classes assurant la gestion des matériaux et des milieux.