Arcane  v3.15.0.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
95
96/*---------------------------------------------------------------------------*/
97/*---------------------------------------------------------------------------*/
102: public ArcaneMeshMaterialTesterObject
103{
104 public:
105
108
109 public:
110
111 static void staticInitialize(ISubDomain* sd);
112
113 public:
114
115 void buildInit() override;
116 void compute() override;
117 void startInit() override;
118 void continueInit() override;
119
120 private:
121
122 IMeshMaterialMng* m_material_mng;
123 VariableCellReal m_density;
124 VariableCellReal m_pressure;
125 MaterialVariableCellReal m_mat_density2;
128 VariableCellInt32 m_present_material;
129 MaterialVariableCellInt32 m_mat_int32;
132 VariableScalarInt64 m_nb_starting_cell; //<! Nombre de mailles au démarrage
133 IMeshMaterial* m_mat1;
134 IMeshMaterial* m_mat2;
135 IMeshBlock* m_block1;
136 UniqueArray<VariableCellReal*> m_density_post_processing;
139 // Si non nul, indique qu'il faut vérifier les valeurs spectral
140 // car on a fait un repartitionnement
141 Integer m_check_spectral_values_iteration;
142 private:
143
144 void _computeDensity();
148 bool is_compute_mat);
149 void _copyPartialToGlobal(IMeshMaterial* mat,VariableCellReal& global_density,
151 void _checkCreation();
152 void _checkCreation2(Integer a,Integer n);
153 void _checkTemporaryVectors(const CellGroup& test_group);
154 void _checkSubViews(const CellGroup& test_group);
155 void _dumpAverageValues();
156 void _dumpNoDumpRealValues();
157
158 void _computeMaterialDepend(IMeshMaterial* mat);
159 void _setDependencies();
160 void _doDependencies();
161 Integer _checkParallelMatItem(MatItemVectorView view,MaterialVariableCellInt64& var);
162 Integer _fillTestVar(ComponentItemVectorView view,MaterialVariableCellInt64& var);
163 Integer _fillTestVar(IMeshMaterial* mat,MaterialVariableCellInt64& var);
164 void _subViewFunctor(ComponentItemVectorView view);
165 void _checkEqual(Integer expected_value,Integer value);
166 template<typename ContainerType> void applyGeneric(const ContainerType& container,MaterialVariableCellReal& var,Real value);
167 void _checkFillArrayFromTo(IMeshMaterial* mat,MaterialVariableCellReal& var);
168 void _checkArrayVariableSynchronize();
169 void _setOrCheckSpectralValues(Int64 iteration,bool is_check);
170 template<typename VarType1,typename VarType2,typename VarType3> void
171 _setOrCheckSpectralValues2(VarType1& var_real,VarType2& var_int32,
172 VarType3& var_scalar_int32,Int64 iteration,bool is_check);
173 void _checkFillPartialValues();
174 void _doSimd();
175 template<typename VarType> void _checkFillPartialValuesHelper(VarType& mat_var);
176 template<typename VarType>
177 void _checkFillPartialValuesWithGlobal(const VarType& var_type,MeshComponentList components);
178 template<typename VarType> void
179 _checkFillPartialValuesWithSuper(const VarType& var_type,MeshComponentList components);
180 template<typename VarType> void
181 _fillVar(VarType& var_type,Real base_value);
182 template<typename VectorType> void
183 _checkVectorCopy(VectorType& var_type);
185 void _initUnitTest();
186 void _applyEos(bool is_init);
187 void _testDumpProperties();
188 void _checkNullComponentItem();
189};
190
191/*---------------------------------------------------------------------------*/
192/*---------------------------------------------------------------------------*/
193
194/*---------------------------------------------------------------------------*/
195/*---------------------------------------------------------------------------*/
196
197MeshMaterialTesterModule::
198MeshMaterialTesterModule(const ModuleBuildInfo& mbi)
199: ArcaneMeshMaterialTesterObject(mbi)
200, m_material_mng(IMeshMaterialMng::getReference(mbi.meshHandle()))
201, m_density(VariableBuildInfo(this,"Density"))
202, m_pressure(VariableBuildInfo(this,"Pressure"))
203, m_mat_density2(VariableBuildInfo(this,"Density",IVariable::PNoDump))
204, m_mat_nodump_real(VariableBuildInfo(this,"NoDumpReal",IVariable::PNoDump))
205, m_present_material(VariableBuildInfo(this,"PresentMaterial"))
206, m_mat_int32(VariableBuildInfo(this,"PresentMaterial"))
207, m_mat_not_used_real(VariableBuildInfo(this,"NotUsedRealVariable"))
208, m_nb_starting_cell(VariableBuildInfo(this,"NbStartingCell"))
209, m_mat1(nullptr)
210, m_mat2(nullptr)
211, m_block1(nullptr)
212, m_mesh_partitioner(nullptr)
213, m_check_spectral_values_iteration(0)
214{
215}
216
217/*---------------------------------------------------------------------------*/
218/*---------------------------------------------------------------------------*/
219
220MeshMaterialTesterModule::
221~MeshMaterialTesterModule()
222{
223 for( VariableCellReal* v : m_density_post_processing )
224 delete v;
225}
226
227/*---------------------------------------------------------------------------*/
228/*---------------------------------------------------------------------------*/
229
230void MeshMaterialTesterModule::
231staticInitialize(ISubDomain* sd)
232{
233 String time_loop_name("MeshMaterialTestLoop");
234
235 ITimeLoopMng* tlm = sd->timeLoopMng();
236 ITimeLoop* time_loop = tlm->createTimeLoop(time_loop_name);
237
238 {
240 clist.add(TimeLoopEntryPointInfo("MeshMaterialTester.buildInit"));
241 time_loop->setEntryPoints(ITimeLoop::WBuild,clist);
242 }
243
244 {
246 clist.add(TimeLoopEntryPointInfo("MeshMaterialTester.startInit"));
247 clist.add(TimeLoopEntryPointInfo("MeshMaterialTester.continueInit"));
248 time_loop->setEntryPoints(ITimeLoop::WInit,clist);
249 }
250
251 {
253 clist.add(TimeLoopEntryPointInfo("MeshMaterialTester.compute"));
254 time_loop->setEntryPoints(ITimeLoop::WComputeLoop,clist);
255 }
256
257 {
259 clist.add("MeshMaterialTester");
260 time_loop->setRequiredModulesName(clist);
261 clist.clear();
262 clist.add("ArcanePostProcessing");
263 clist.add("ArcaneCheckpoint");
264 time_loop->setOptionalModulesName(clist);
265 }
266
267 tlm->registerTimeLoop(time_loop);
268}
269
270/*---------------------------------------------------------------------------*/
271/*---------------------------------------------------------------------------*/
272
273void MeshMaterialTesterModule::
274buildInit()
275{
276 // La création des milieux et des matériaux doit se faire dans un point
277 // d'entrée de type 'build' pour que la liste des variables créés par les
278 // milieux et les matériaux soit accessible dans le post-traitement.
279 info() << "MESH_MATERIAL_TESTER :: buildInit()";
280
282
283 m_material_mng->setModificationFlags(options()->modificationFlags());
284
285 m_material_mng->setMeshModificationNotified(true);
286
287 // En parallèle, test la création de variables milieux aussi sur les matériaux
288 if (parallelMng()->isParallel())
290
291 if (subDomain()->isContinue() && options()->recreateFromDump()){
292 mm->recreateFromDump();
293 }
294 else{
296 // Lit les infos des matériaux du JDD et les enregistre dans le gestionnaire
297 for( Integer i=0,n=options()->material().size(); i<n; ++i ){
298 String mat_name = options()->material[i].name;
299 info() << "Found material name=" << mat_name;
300 materials_info.add(mm->registerMaterialInfo(mat_name));
301 }
302
303 MeshBlockBuildInfo mbbi("BLOCK1",allCells());
305
306 // Créé les milieux
307 for( Integer i=0,n=options()->environment().size(); i<n; ++i ){
308 String env_name = options()->environment[i].name;
309 info() << "Found environment name=" << env_name;
311 for( Integer k=0,kn=options()->environment[i].material.size(); k<kn; ++k ){
312 String mat_name = options()->environment[i].material[k];
313 info() << "Add material " << mat_name << " for environment " << env_name;
314 env_build.addMaterial(mat_name);
315 }
316 IMeshEnvironment* env = mm->createEnvironment(env_build);
317 saved_envs.add(env);
318 // Le bloc ne contient que 2 milieux
319 if (i<2){
320 info() << "Add environment " << env_name << " to block1";
321 mbbi.addEnvironment(env);
322 }
323 }
324
325 // Création du bloc BLOCK1 sur le groupe de toutes les mailles
326 // et contenant les milieux ENV1 et ENV2
327 m_block1 = mm->createBlock(mbbi);
328
329 {
330 // Création d'un deuxième bloc de manière incrémentalle.
331 Integer nb_env = saved_envs.size();
332 if (nb_env>=2){
333 MeshBlockBuildInfo mbbi2("BLOCK2",allCells());
334 mbbi2.addEnvironment(saved_envs[0]);
335 IMeshBlock* block2 = mm->createBlock(mbbi2);
336 Integer nb_env1 = block2->nbEnvironment();
337 mm->addEnvironmentToBlock(block2,saved_envs[1]);
338 info() << "Finished incremental creation of block";
339 Integer nb_env2 = block2->nbEnvironment();
340 if (nb_env2!=(nb_env1+1))
341 ARCANE_FATAL("Bad number of environment");
342 if (block2->environments()[nb_env1]!=saved_envs[1])
343 ARCANE_FATAL("Bad last environment");
344 // Supprime le premier milieu du bloc
345 IMeshEnvironment* first_env = block2->environments()[0];
346 IMeshEnvironment* second_env = block2->environments()[1];
347 mm->removeEnvironmentToBlock(block2,first_env);
348 nb_env2 = block2->nbEnvironment();
349 if (nb_env2!=nb_env1)
350 ARCANE_FATAL("Bad number of environment after remove");
351 if (block2->environments()[0]!=second_env)
352 ARCANE_FATAL("Bad first environment");
353 }
354 }
355
356 mm->endCreate(subDomain()->isContinue());
357
358 info() << "List of materials:";
360 info() << "MAT=" << m->name();
361 for( String s : m->environmentsName() )
362 info() << " In ENV=" << s;
363 }
364 }
365
366 // Récupère deux matériaux de deux milieux différents pour test.
368 Integer nb_env = envs.size();
369 m_mat1 = mm->environments()[0]->materials()[0];
370 if (nb_env>1)
371 m_mat2 = mm->environments()[1]->materials()[0];
372
373 m_global_deltat.assign(1.0);
374
375 for( Integer i=0, n=m_material_mng->materials().size(); i<n; ++i ){
376 IMeshMaterial* mat = m_material_mng->materials()[i];
377 VariableCellReal* var = new VariableCellReal(VariableBuildInfo(defaultMesh(),String("Density_")+mat->name()));
378 m_density_post_processing.add(var);
379 }
380
381 m_mesh_partitioner = options()->loadBalanceService();
383 info() << "Activating load balance test";
384}
385
386/*---------------------------------------------------------------------------*/
387/*---------------------------------------------------------------------------*/
388
389template<typename ContainerType> void MeshMaterialTesterModule::
390applyGeneric(const ContainerType& container,MaterialVariableCellReal& var,Real value)
391{
393 var[igencell] = value;
394 }
395}
396
397/*---------------------------------------------------------------------------*/
398/*---------------------------------------------------------------------------*/
399
400void MeshMaterialTesterModule::
401startInit()
402{
403 m_mat_not_used_real.globalVariable().setUsed(false);
404
405 info() << "MESH_MATERIAL_TESTER :: startInit()";
406 m_material_mng->forceRecompute();
407
408 ValueChecker vc(A_FUNCINFO);
409
410 m_nb_starting_cell.assign(parallelMng()->reduce(Parallel::ReduceSum,ownCells().size()));
411
415 Integer nb_cell = ownCells().size();
416 IParallelMng* pm = parallelMng();
417 Int64 total_nb_cell = pm->reduce(Parallel::ReduceMax,nb_cell);
418 ENUMERATE_CELL(icell,allCells()){
419 Cell cell = *icell;
420 Int64 cell_index = cell.uniqueId();
422 break;
423 if (cell_index<(total_nb_cell/5)){
424 env1_indexes.add(icell.itemLocalId());
425 }
427 mat2_indexes.add(icell.itemLocalId());
428 }
429 if ((cell_index%2)==0)
430 sub_group_indexes.add(icell.itemLocalId());
431 }
432
433 // Ajoute les mailles du milieu 1
434 {
435 Materials::MeshMaterialModifier modifier(m_material_mng);
436 modifier.setDoCopyBetweenPartialAndPure(false);
437 modifier.setDoInitNewItems(false);
438 modifier.setPersistantWorkBuffer(false);
440 // Ajoute les mailles du milieu
441 //modifier.addCells(env,env1_indexes);
445 for( Integer z=0; z<nb_cell; ++z ){
446 bool add_to_mat1 = (z<(nb_cell/2) && z>(nb_cell/4));
447 bool add_to_mat2 = (z>=(nb_cell/2) || z<(nb_cell/3));
448 if (add_to_mat1){
450 }
451 if (add_to_mat2)
453 }
454 // Ajoute les mailles du matériau 1
455 modifier.addCells(m_mat1,mat1_indexes);
456 Integer nb_mat = env->nbMaterial();
457 if (nb_mat>1)
458 // Ajoute les mailles du matériau 2
459 modifier.addCells(env->materials()[1],mat2_indexes);
460 }
461 CellGroup test_group = defaultMesh()->cellFamily()->createGroup("SUB_GROUP_TEST",sub_group_indexes);
462 // Ajoute les mailles du milieu 2
463 if (m_mat2){
464 Materials::MeshMaterialModifier modifier(m_material_mng);
465 //modifier.addCells(m_mat2->environment(),mat2_indexes);
466 modifier.addCells(m_mat2,mat2_indexes);
467 }
468
469 const Integer spectral_size = 5;
474 // NOTE: m_env_empty_int64array ne doit pas avoir de resize
475 // pour pouvoir tester la gestion des variables avec une dim2Size() nulle.
476
477 // TODO tester que les valeurs partielles sont correctes
478 m_mat_density.fillPartialValues(3.0);
479 m_env_int32.fillPartialValues(5);
480 m_mat_int32.fillPartialValues(8);
481
482 info() << "Liste des mailles de test_group";
484 info(6) << "Cell=" << ItemPrinter(*icell);
485 }
486
487 ENUMERATE_CELL(icell,allCells()){
488 m_density[icell] = 1.0;
489 m_mat_density[icell] = 2.0;
490 Integer idx2 = icell.itemLocalId() % spectral_size;
491 m_mat_spectral1[icell][idx2] = 3.0 + (Real)(icell.itemLocalId() * spectral_size);
492 }
493
494 CellGroup mat1_cells = m_mat1->cells();
496 m_density[icell] = 2.0;
497 }
498 {
499 VariableCellReal& gvar = m_mat_density.globalVariable();
500 info() << "GVAR_NAME = " << gvar.name();
502 if (gvar[icell]!=2.0)
503 fatal() << "Bad value for global variable v=" << gvar[icell];
504 }
505 }
506
507 if (m_mat2){
508 CellGroup mat2_cells = m_mat2->cells();
510 m_density[icell] = 1.5;
511 }
512 }
513
514 _checkTemporaryVectors(test_group);
515 _checkSubViews(test_group);
516
517 {
519 m_material_mng->dumpInfos(oss());
520 info() << oss.str();
521 }
522
523 // A supprimer
524 //m_mat_density.updateFromInternal();
525
526 m_present_material.fill(0);
527 m_mat_density.fill(0.0);
529
530 constexpr IMeshMaterial* null_mat = nullptr;
531 constexpr IMeshEnvironment* null_env = nullptr;
532 // Itération sur tous les milieux puis tous les matériaux
533 // et toutes les mailles de ce matériau
534 ENUMERATE_ENV(ienv,m_material_mng){
536 info() << "ENV name=" << env->name();
537 vc.areEqual(env->isEnvironment(),true,"IsEnvEnvOK");
538 vc.areEqual(env->isMaterial(),false,"IsEnvMatOK");
539 vc.areEqual(env->asEnvironment(),env,"ToEnvEnvOK");
540 vc.areEqual(env->asMaterial(),null_mat,"ToEnvMatOK");
543 info() << "MAT name=" << mat->name();
544 vc.areEqual(mat->isEnvironment(),false,"IsMatEnvOK");
545 vc.areEqual(mat->isMaterial(),true,"IsMatMatOK");
546 vc.areEqual(mat->asEnvironment(),null_env,"ToMatEnvOK");
547 vc.areEqual(mat->asMaterial(),mat,"ToMatMatOK");
550 //info() << "Cell name=" << mmcell._varIndex();
551 m_mat_density[mmcell] = 200.0;
554 if (x1._varIndex()!=mmcell._varIndex())
555 ARCANE_FATAL("Bad convertsion MatCell -> ComponentCell");
556 MatCell x2(x1);
557 if (x1._varIndex()!=x2._varIndex())
558 ARCANE_FATAL("Bad convertsion ComponentCell -> MatCell");
559 }
560 }
561 }
562
563 // Idem mais à partir d'un bloc.
564 ENUMERATE_ENV(ienv,m_block1){
566 info() << "BLOCK_ENV name=" << env->name();
569 info() << "BLOCK_MAT name=" << mat->name();
570 }
571 }
572
573 // Idem mais itération sur des milieux sous forme de composants
576 info() << "ENV COMPONENT name=" << cmp->name();
577 }
578
579 // Itération sur les matériaux sous forme de composant.
582 info() << "MAT COMPONENT name=" << cmp->name();
583 }
584
585 // Itération directement avec tous les matériaux du gestionnaire
586 ENUMERATE_MAT(imat,m_material_mng){
588 info() << "MAT name=" << mat->name()
589 << " density_var_name=" << m_mat_density.materialVariable()->materialVariable(mat)->name();
592 m_mat_density[mmcell] = 200.0;
593 }
594 }
595
596
597 if (0){
598 ENUMERATE_ENV(ienv,m_material_mng){
600 info() << "Env name=" << env->name();
603 info() << "EnvCell nb_mat=" << ev.nbMaterial() << " cell_uid=" << ItemPrinter(ev.globalCell())
604 << " component_uid="<< ev.componentUniqueId()
605 << " var_index=" << ev._varIndex();
606 }
607 }
608 }
609
610 if (1){
612 ENUMERATE_FACE(iface,allFaces()){
613 Face face = *iface;
614 Cell back_cell = face.backCell();
615 if (!back_cell.null()){
617 info() << "NB_ENV=" << all_env_back_cell.nbEnvironment();
620 if (x1._varIndex()!=all_env_back_cell._varIndex())
621 ARCANE_FATAL("Bad convertsion AllEnvCell -> ComponentCell");
622 if (x1._varIndex()!=x2._varIndex())
623 ARCANE_FATAL("Bad convertsion ComponentCell -> EnvCell");
624 }
625 }
626 }
627
628 // Itération sur tous les milieux et tous les matériaux d'une maille.
629 ENUMERATE_ALLENVCELL(iallenvcell,m_material_mng,allCells()){
631 Cell global_cell = all_env_cell.globalCell();
633 Real env_density = 0.0;
636 env_density += m_mat_density[imatcell];
637 Int32 idx = mc.materialId();
638 m_present_material[global_cell] = m_present_material[global_cell] | (1<<idx);
639 }
640 m_mat_density[ienvcell] = env_density;
642 }
643 }
644
645 if (1){
646 ENUMERATE_ALLENVCELL(iallenvcell,m_material_mng,allCells()){
648 info() << "Cell uid=" << ItemPrinter(all_env_cell.globalCell()) << " nb_env=" << all_env_cell.nbEnvironment();
651 info() << "Cell nb_mat=" << ec.nbMaterial()
652 << " env=" << ec.environment()->name()
653 << " (id=" << ec.environmentId() << ")";
656 info() << "Cell mat=" << mc.material()->name()
657 << " (id=" << mc.materialId() << ")"
658 << " density=" << m_mat_density[imatcell]
659 << " index=" << mc._varIndex()
660 << " component_uid=" << mc.componentUniqueId();
661 //env_density += m_mat_density[imatcell];
662 }
663 for( ComponentCell mc : ec.subItems()){
664 info() << "Cell mat=" << mc.component()->name()
665 << " (id=" << mc.componentId() << ")"
666 << " density=" << m_mat_density[mc]
667 << " index=" << mc._varIndex()
668 << " component_uid=" << mc.componentUniqueId();
669 //env_density += m_mat_density[imatcell];
670 }
671 //m_mat_density[ienvcell] = env_density;
672 }
673
676 info() << "Cell nb_mat=" << ec.nbSubItem()
677 << " env=" << ec.component()->name()
678 << " (id=" << ec.componentId() << ")";
679 }
680 }
681
682 const bool test_depend = false;
683 // Ne doit pas être exécuté mais juste compilé pour vérifier la syntaxe
684 if (test_depend){
685 m_mat_density.addDependCurrentTime(m_density);
686 m_mat_density.addDependCurrentTime(m_mat_density2);
687 m_mat_density.addDependPreviousTime(m_mat_density2);
688 m_mat_density.removeDepend(m_mat_density2);
689 m_mat_density.setComputeFunction(this,&MeshMaterialTesterModule::startInit);
690 }
691 }
692
693 // Teste la récupération de la valeur de la densité partielle par maille et par matériau ou par milieu
694 if (1){
696
697 ENUMERATE_MAT(imat,m_material_mng){
699 Int32 id = mm->id();
700 ENUMERATE_CELL(icell,allCells()){
701 Cell cell = *icell;
703 Real density = m_mat_density.matValue(all_env_cell,id);
704 info() << "IndirectMatAccess Cell uid=" << cell.uniqueId() << " mat_id=" << id << " density=" << density;
705 }
706 }
707
708 ENUMERATE_ENV(ienv,m_material_mng){
709 IMeshEnvironment* me = *ienv;
710 Int32 id = me->id();
711 ENUMERATE_CELL(icell,allCells()){
712 Cell cell = *icell;
714 Real density = m_mat_density.envValue(all_env_cell,id);
715 info() << "IndirectEnvAccess Cell uid=" << cell.uniqueId() << " env_id=" << id << " density=" << density;
716 }
717 }
718 }
719
721 _setDependencies();
722 _dumpNoDumpRealValues();
723 _initUnitTest();
724
725 _applyEos(true);
726 _testDumpProperties();
727 _checkNullComponentItem();
728}
729
730/*---------------------------------------------------------------------------*/
731/*---------------------------------------------------------------------------*/
732
733void MeshMaterialTesterModule::
734_checkNullComponentItem()
735{
737 info() << "NullEnvCell global_cell_id=" << null_env_cell.globalCell().localId();
738
739 info() << "NullEnvCell var_index =" << null_env_cell._varIndex();
740 //info() << "NullEnvCell component =" << null_env_cell.component();
741 info() << "NullEnvCell component_id =" << null_env_cell.componentId();
742 info() << "NullEnvCell null =" << null_env_cell.null();
743 info() << "NullEnvCell super_cell =" << null_env_cell.superCell();
744 info() << "NullEnvCell level =" << null_env_cell.level();
745 info() << "NullEnvCell nb_sub_item=" << null_env_cell.nbSubItem();
746 info() << "NullEnvCell component_unique_id=" << null_env_cell.componentUniqueId();
747 //info() << "NullEnvCell sub_items =" << null_env_cell.subItems();
748
749 info() << "NullEnvCell all_env_cell =" << null_env_cell.allEnvCell().null();
750}
751
752/*---------------------------------------------------------------------------*/
753/*---------------------------------------------------------------------------*/
754
755void MeshMaterialTesterModule::
756_testDumpProperties()
757{
758 IMesh* mesh = defaultMesh();
760 MaterialVariableCellReal v1(VariableBuildInfo(mesh,"VarTestDump0"));
761 Int32 p0 = v0.variable()->property();
762 Int32 p1 = v1.globalVariable().variable()->property();
763 info() << "PROP1 = " << p0 << " " << p1;
764
765 MaterialVariableCellReal v2(VariableBuildInfo(mesh,"VarTestDump1"));
767 Int32 p2 = v2.globalVariable().variable()->property();
768 Int32 p3 = v3.variable()->property();
769 info() << "PROP2 = " << p2 << " " << p3;
770
772 Int32 p4 = v4.globalVariable().variable()->property();
773 info() << "PROP4 = " << p4;
774
775 if (p0!=p1)
776 ARCANE_FATAL("Bad property value p0={0} p1={1}",p0,p1);
777 if (p2!=p3)
778 ARCANE_FATAL("Bad property value p2={0} p3={1}",p2,p3);
779
780 if ((p0 & IVariable::PNoDump)!=0)
781 ARCANE_FATAL("Bad property value p0={0}. Should be Dump",p0);
782 if ((p2 & IVariable::PNoDump)!=0)
783 ARCANE_FATAL("Bad property value p2={0}. Should be Dump",p2);
784}
785
786/*---------------------------------------------------------------------------*/
787/*---------------------------------------------------------------------------*/
792_applyEos(bool is_init)
793{
794 auto* x = options()->additionalEosService();
795 if (!x)
796 return;
797 ENUMERATE_ENV(ienv,m_material_mng){
801 info() << "EOS: mat=" << mat->name();
803 MatCell mc = *icell;
804 info() << " v=" << mc.globalCell().uniqueId();
805 }
806 if (is_init)
807 x->initEOS(mat,m_mat_pressure,m_mat_density,m_mat_internal_energy,m_mat_sound_speed);
808 else
809 x->applyEOS(mat,m_mat_density,m_mat_internal_energy,m_mat_pressure,m_mat_sound_speed);
810 }
811 }
812}
813
814/*---------------------------------------------------------------------------*/
815/*---------------------------------------------------------------------------*/
816
817void MeshMaterialTesterModule::
818_initUnitTest()
819{
820 IUnitTest* unit_test = options()->additionalTestService();
821 if (unit_test)
822 unit_test->initializeTest();
823}
824
825/*---------------------------------------------------------------------------*/
826/*---------------------------------------------------------------------------*/
827
828void MeshMaterialTesterModule::
829continueInit()
830{
831 info() << "MESH_MATERIAL_TESTER :: continueInit()";
832 _setDependencies();
833 _dumpNoDumpRealValues();
834 _initUnitTest();
835}
836
837/*---------------------------------------------------------------------------*/
838/*---------------------------------------------------------------------------*/
839
840void MeshMaterialTesterModule::
841_setDependencies()
842{
843 info() << "SET_DEPENDENCIES";
844
845 m_mat_density.setMaterialComputeFunction(this,&MeshMaterialTesterModule::_computeMaterialDepend);
846 m_mat_density.addMaterialDepend(m_mat_nodump_real);
847 m_mat_density.addMaterialDepend(m_pressure);
848
851 m_mat_density.materialVariable()->dependInfos(infos,mat_infos);
852
853 for( Integer k=0, n=infos.size(); k<n; ++k )
854 info() << "Global depend v=" << infos[k].variable()->fullName();
855
856 for( Integer k=0, n=mat_infos.size(); k<n; ++k )
857 info() << "Material depend v=" << mat_infos[k].variable()->name();
858}
859
860/*---------------------------------------------------------------------------*/
861/*---------------------------------------------------------------------------*/
871{
872 IMeshComponent* component = mat;
873 if (!component)
874 component = env;
875
876 MaterialVariableCellInt32 test_var(MaterialVariableBuildInfo(m_material_mng,"TestComponentPart"));
877 {
878 Int32 index = 15;
880 test_var[iccell] = index;
881 ++index;
882 }
883 }
884
885 Int32 total_full = 0;
886 Int32 total_pure = 0;
887 Int32 total_impure = 0;
889 MatVarIndex mvi = iccell._varIndex();
890 Int32 v = test_var[iccell];
891 if (mvi.arrayIndex()==0)
892 total_pure += v;
893 else
894 total_impure += v;
895 total_full += v;
896 }
897 info() << "COMPONENT=" << component->name() << " TOTAL PURE=" << total_pure << " IMPURE=" << total_impure
898 << " FULL=" << total_full;
899
900 ValueChecker vc(A_FUNCINFO);
901
902 if (mat){
903 {
904 Int32 total = 0;
906 total += test_var[imc];
907 }
908 vc.areEqual(total,total_full,"TotalFull1");
909 }
910 {
911 Int32 total = 0;
914 total += test_var[imc];
915 }
916 vc.areEqual(total,total_impure,"TotalImpure1");
917 }
918 {
919 Int32 total = 0;
921 total += test_var[imc];
922 }
923 vc.areEqual(total,total_pure,"TotalPure1");
924 }
925 {
926 Int32 total = 0;
927 ENUMERATE_COMPONENTITEM(MatPartCell,imc,mat->impureMatItems()){
928 total += test_var[imc];
929 }
930 vc.areEqual(total,total_impure,"TotalImpure2");
931 }
932 {
933 Int32 total = 0;
935 total += test_var[imc];
936 }
937 vc.areEqual(total,total_pure,"TotalPure2");
938 }
939 }
940 if (env){
941 {
942 Int32 total = 0;
943 using MyEnvCell = EnvCell;
945 total += test_var[imc];
946 }
947 vc.areEqual(total,total_full,"TotalFull1");
948 }
949 {
950 Int32 total = 0;
953 total += test_var[imc];
954 }
955 vc.areEqual(total,total_impure,"TotalImpure1");
956 }
957 {
958 Int32 total = 0;
960 total += test_var[imc];
961 }
962 vc.areEqual(total,total_pure,"TotalPure1");
963 }
964 {
965 Int32 total = 0;
966 ENUMERATE_COMPONENTITEM(EnvPartCell,imc,env->impureEnvItems()){
967 total += test_var[imc];
968 }
969 vc.areEqual(total,total_impure,"TotalImpure2");
970 }
971 {
972 Int32 total = 0;
974 total += test_var[imc];
975 }
976 vc.areEqual(total,total_pure,"TotalPure2");
977 }
978 }
979 {
980 Int32 total = 0;
983 total += test_var[imc];
984 }
985 vc.areEqual(total,total_impure,"TotalImpure3");
986 }
987 {
988 Int32 total = 0;
990 total += test_var[imc];
991 }
992 vc.areEqual(total,total_pure,"TotalPure3");
993 }
994}
995
996/*---------------------------------------------------------------------------*/
997/*---------------------------------------------------------------------------*/
998
999void MeshMaterialTesterModule::
1000_doDependencies()
1001{
1002 m_pressure.fill(0.0);
1003
1004 ENUMERATE_MAT(imat,m_material_mng){
1006 double v = (double)mat->id();
1008 m_mat_nodump_real.setUpToDate(mat);
1009 m_mat_density.update(mat);
1010 }
1011
1012 // Normalement m_mat_density d'un matériau doit valoir le numéro du matériau
1013 ENUMERATE_MAT(imat,m_material_mng){
1015 double v = (double)mat->id();
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 }
1021 if (m_mat_density[imc]!=v)
1022 ARCANE_FATAL("Bad value for mat depend v={0} expected={1}",m_mat_density[imc],v);
1023 }
1024 }
1025
1026 // Vérifie que la dépendance sur la variable globale est bien prise en compte
1027 m_pressure.fill(1.0);
1028 m_pressure.setUpToDate();
1029 ENUMERATE_MAT(imat,m_material_mng){
1031 double v0 = (double)mat->id();
1033 m_mat_density.update(mat);
1034 double v = 1.0 + v0;
1036 if (m_mat_density[imc]!=v)
1037 ARCANE_FATAL("Bad value (1) for global depend v={0} expected={1}",m_mat_density[imc],v);
1038 }
1039 ENUMERATE_COMPONENTITEM(MatPartCell,imc,mat,eMatPart::Impure){
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 ENUMERATE_COMPONENTITEM(MatPartCell,imc,mat->impureMatItems()){
1044 if (m_mat_density[imc]!=v)
1045 ARCANE_FATAL("Bad value (2) for global depend v={0} expected={1}",m_mat_density[imc],v);
1046 }
1047 }
1048}
1049
1050/*---------------------------------------------------------------------------*/
1051/*---------------------------------------------------------------------------*/
1052
1053void MeshMaterialTesterModule::
1054_computeMaterialDepend(IMeshMaterial* mat)
1055{
1056 info() << "Compute material depend mat=" << mat->name();
1057 Integer index = 0;
1059 MatCell mc = *imc;
1060 Cell cell = mc.globalCell();
1061 m_mat_density[mc] = m_mat_nodump_real[mc] + m_pressure[cell];
1062 if (index<5){
1063 info() << "Cell=" << ItemPrinter(cell) << " density=" << m_mat_density[mc]
1064 << " dump_real=" << m_mat_nodump_real[mc]
1065 << " pressure=" << m_pressure[cell];
1066 ++index;
1067 }
1068 }
1069 m_mat_density.setUpToDate(mat);
1070}
1071
1072/*---------------------------------------------------------------------------*/
1073/*---------------------------------------------------------------------------*/
1074
1075void MeshMaterialTesterModule::
1076_dumpAverageValues()
1077{
1078 info() << "_dumpAverageValues()";
1079 ENUMERATE_ENV(ienv,m_material_mng){
1083 Real sum_density = 0.0;
1085 //MatCell mc = *icell;
1086 sum_density += m_mat_density[imatcell];
1087 }
1088 info() << "SumMat ITER=" << m_global_iteration() << " MAT=" << mat->name()
1089 << " density=" << sum_density;
1090 }
1091 }
1092}
1093
1094/*---------------------------------------------------------------------------*/
1095/*---------------------------------------------------------------------------*/
1096
1097void MeshMaterialTesterModule::
1098_doSimd()
1099{
1100 info() << "_doSimd()";
1101 MaterialVariableCellReal var_tmp(MaterialVariableBuildInfo(m_material_mng,"TestVarTmpReal"));
1102 var_tmp.fill(-1.0);
1103 // TODO: vérifier les valeurs.
1104 ENUMERATE_ENV(ienv,m_material_mng){
1106 auto out_var_tmp = viewOut(var_tmp);
1107 Real value = (Real)(env->id()) * 4.3;
1109 out_var_tmp[ienvcell] = value;
1110 };
1112 if (var_tmp[ienvcell]!=value)
1113 ARCANE_FATAL("Bad value v={0} expected={1}",var_tmp[ienvcell],value);
1114 }
1115 }
1116}
1117
1118/*---------------------------------------------------------------------------*/
1119/*---------------------------------------------------------------------------*/
1120
1121void MeshMaterialTesterModule::
1122_dumpNoDumpRealValues()
1123{
1126 info() << ostr.str();
1127
1129 m_material_mng->fillWithUsedVariables(vars);
1130 info() << "NB_USED_MATERIAL_VAR=" << vars.size();
1131 for( Integer i=0, n=vars.size(); i<n; ++i )
1132 info() << "USED_MATERIAL_VAR name=" << vars[i]->name();
1133}
1134
1135/*---------------------------------------------------------------------------*/
1136/*---------------------------------------------------------------------------*/
1137
1138template<typename VectorType> void MeshMaterialTesterModule::
1139_checkVectorCopy(VectorType& vec_cells)
1140{
1141 ValueChecker vc(A_FUNCINFO);
1142 // Teste la copie.
1143 // Normalement il s'agit d'une copie par référence donc les vues associées
1144 // pointent vers la même zone mémoire.
1145 VectorType vec_cells_copy(vec_cells);
1146 if (!vec_cells_copy.view()._isSamePointerData(vec_cells.view()))
1147 ARCANE_FATAL("Bad copy");
1148
1149 VectorType vec_cells_copy2(vec_cells);
1150 vc.areEqual(vec_cells_copy2.view()._matvarIndexes(),vec_cells.view()._matvarIndexes(),"bad copy 2");
1151
1152 VectorType move_vec_cells(std::move(vec_cells_copy2));
1153 vc.areEqual(move_vec_cells.view()._matvarIndexes().data(),vec_cells.view()._matvarIndexes().data(),"bad move 1");
1154
1155 {
1156 // Teste le clone.
1157 // A la sortie les valeurs des index doivent être les mêmes mais pas les pointeurs.
1158 VectorType clone_vec(vec_cells_copy.clone());
1159 vc.areEqual(clone_vec.view()._matvarIndexes(),vec_cells.view()._matvarIndexes(),"bad clone 1");
1160 if (clone_vec.view()._constituentItemListView() != vec_cells.view()._constituentItemListView())
1161 ARCANE_FATAL("Bad clone 2");
1162 if (clone_vec.view()._matvarIndexes().data()==vec_cells.view()._matvarIndexes().data())
1163 ARCANE_FATAL("bad clone 3");
1164 if (clone_vec.view()._isSamePointerData(vec_cells.view()))
1165 ARCANE_FATAL("bad clone 3");
1166 }
1167}
1168
1169/*---------------------------------------------------------------------------*/
1170/*---------------------------------------------------------------------------*/
1171
1172void MeshMaterialTesterModule::
1173_checkTemporaryVectors(const CellGroup& test_group)
1174{
1175
1176 if (m_mat2){
1179 info() << "SET_DENSITY ON SUB GROUP for material";
1181 MatCell mc = *imatcell;
1182 info() << "REF_IDX MAT1 " << mc._varIndex() << " " << mc.globalCell().uniqueId();
1183 }
1185 MatCell mc = *imatcell;
1186 info() << "REF_IDX MAT2 " << mc._varIndex() << " " << mc.globalCell().uniqueId();
1187 }
1188 info() << "SET_DENSITY";
1190 MatCell mc = *imatcell;
1191 m_mat_density[mc] = 3.2;
1192 info() << "SET_MAT_DENSITY " << mc._varIndex() << " " << mc.globalCell().uniqueId();
1193 }
1194 _checkVectorCopy(mat_cells);
1196 _checkVectorCopy(component_mat_cells);
1197 }
1198
1199 if (m_mat2){
1200 MatCellVector mat_cells(test_group.view(),m_mat1);
1202 info() << "SET_DENSITY ON SUB GROUP for material";
1204 MatCell mc = *imatcell;
1205 info() << "REF_IDX MAT1 " << mc._varIndex() << " " << mc.globalCell().uniqueId();
1206 }
1208 MatCell mc = *imatcell;
1209 info() << "REF_IDX MAT2 " << mc._varIndex() << " " << mc.globalCell().uniqueId();
1210 }
1211 info() << "SET_DENSITY";
1213 MatCell mc = *imatcell;
1214 m_mat_density[mc] = 3.2;
1215 info() << "SET_MAT_DENSITY " << mc._varIndex() << " " << mc.globalCell().uniqueId();
1216 }
1218 MatCell mc = *imatcell;
1219 m_mat_density[mc] = 3.2;
1220 info() << "SET_MAT_DENSITY (VIEW) " << mc._varIndex() << " " << mc.globalCell().uniqueId();
1221 }
1222 }
1223
1224 {
1225 IMeshEnvironment* env1 = m_mat1->environment();
1228 info() << "SET_DENSITY ON SUB GROUP for environment";
1230 EnvCell mc = *ienvcell;
1231 info() << "REF_IDX ENV1 " << mc._varIndex() << " uid=" << mc.globalCell().uniqueId();
1232 }
1233 info() << "SET_DENSITY";
1235 EnvCell mc = *ienvcell;
1236 m_mat_density[ienvcell] = 3.2;
1237 info() << "SET_ENV_DENSITY " << mc._varIndex() << " uid=" << mc.globalCell().uniqueId();
1238 }
1240 EnvCell mc = *ienvcell;
1241 m_mat_density[ienvcell] = 3.2;
1242 info() << "SET_ENV_DENSITY (VIEW)" << mc._varIndex() << " uid=" << mc.globalCell().uniqueId();
1243 }
1244 _checkVectorCopy(env_cells);
1246 _checkVectorCopy(component_env_cells);
1247 }
1248
1249 {
1250 IMeshEnvironment* env1 = m_mat1->environment();
1253 info() << "SET_DENSITY ON SUB GROUP for environment";
1255 EnvCell mc = *ienvcell;
1256 info() << "REF_IDX ENV1 " << mc._varIndex() << " uid=" << mc.globalCell().uniqueId();
1257 }
1258 info() << "SET_DENSITY";
1260 EnvCell mc = *ienvcell;
1261 m_mat_density[ienvcell] = 3.2;
1262 info() << "SET_ENV_DENSITY " << mc._varIndex() << " uid=" << mc.globalCell().uniqueId();
1263 }
1264 }
1265}
1266
1267
1268/*---------------------------------------------------------------------------*/
1269/*---------------------------------------------------------------------------*/
1270
1271void MeshMaterialTesterModule::
1272_checkEqual(Integer expected_value,Integer value)
1273{
1274 if (value!=expected_value){
1275 ARCANE_FATAL("Bad value v={0} expected={1}",value,expected_value);
1276 }
1277}
1278
1279/*---------------------------------------------------------------------------*/
1280/*---------------------------------------------------------------------------*/
1281
1282Integer MeshMaterialTesterModule::
1284{
1285 Integer index = 1;
1286 Integer total = 0;
1288 var[imcell] = index;
1289 total += (Integer)var[imcell];
1290 ++index;
1291 }
1292 return total;
1293}
1294
1295/*---------------------------------------------------------------------------*/
1296/*---------------------------------------------------------------------------*/
1297
1298Integer MeshMaterialTesterModule::
1300{
1301 Integer index = 1;
1302 Integer total = 0;
1304 var[iccell] = index;
1305 total += (Integer)var[iccell];
1306 ++index;
1307 }
1308 return total;
1309}
1310
1311/*---------------------------------------------------------------------------*/
1312/*---------------------------------------------------------------------------*/
1313
1314Integer MeshMaterialTesterModule::
1316{
1317 std::atomic<Integer> new_total;
1318 auto func = [&](MatItemVectorView view)
1319 {
1320 info() << "ParallelLoop with MatItemVectorView size=" << view.nbItem();
1323 }
1324 };
1325
1326 new_total = 0;
1328 return (Integer)new_total;
1329}
1330
1331/*---------------------------------------------------------------------------*/
1332/*---------------------------------------------------------------------------*/
1333
1334void MeshMaterialTesterModule::
1335_checkSubViews(const CellGroup& test_group)
1336{
1337 IMeshEnvironment* env1 = m_mat1->environment();
1339 MatCellVector mat_cells(test_group.view(),m_mat1);
1340
1341 // Vérifie l'utilisation des sous-vues.
1342 {
1344 Integer nb_item = test_group_view.nbItem();
1345 for( Integer i=0; i<20; ++i ){
1346 Integer begin = i * 9;
1347 Integer size = 12;
1348 size = math::min(size,nb_item-begin);
1349 if (size<=0)
1350 break;
1351 ComponentItemVectorView v2 = test_group_view._subView(begin,size);
1354 info() << " ComponentCell c=" << ccell._varIndex();
1355 }
1356 }
1357 }
1358
1359 MaterialVariableCellInt64 mat_test_sub_view(MaterialVariableBuildInfo(m_material_mng,"TestSubViewInt64"));
1362 {
1363 Integer index = 1;
1365 mat_test_sub_view[imcell] = index;
1366 ++index;
1367 }
1368 index = 1;
1370 mat_test_sub_view[iecell] = index;
1371 direct_total += index;
1372 ++index;
1373 }
1376 }
1377 info() << "DIRECT_ENV_TOTAL = " << direct_total
1378 << "DIRECT_MAT_TOTAL = " << direct_mat_total;
1379 }
1380
1381 {
1383 Integer nb_item = test_group_view.nbItem();
1384
1385 for( Integer block_size=1; block_size<20; ++block_size){
1386 Integer new_total = 0;
1387 for( Integer begin=0; begin<nb_item; begin += block_size ){
1388 Integer size = block_size;
1389 size = math::min(size,nb_item-begin);
1390 if (size<=0)
1391 break;
1392 ComponentItemVectorView v2 = test_group_view._subView(begin,size);
1395 }
1396 }
1397 if (new_total!=direct_total){
1398 ARCANE_FATAL("Bad total v={0} expected={1} block_size={2}",
1399 new_total,direct_total,block_size);
1400 }
1401 }
1402 }
1403
1404 // Test en parallèle
1405 {
1407
1408 ParallelLoopOptions options;
1409 options.setGrainSize(10);
1410
1411 Integer nb_item = test_group_view.nbItem();
1412 info() << "ParallelTest with lambda full_size=" << nb_item;
1413
1414 // Test avec ComponentItemVectorView
1415 {
1416 std::atomic<Integer> new_total;
1417 new_total = 0;
1418 auto func = [&](ComponentItemVectorView view)
1419 {
1420 info() << "ParallelLoop with component size=" << view.nbItem();
1423 }
1424 };
1426
1427 if (new_total!=direct_total){
1428 ARCANE_FATAL("Bad total v={0} expected={1}",(Integer)new_total,direct_total);
1429 }
1430 }
1431
1432 // Test avec EnvItemVectorView
1433 {
1435 std::atomic<Integer> new_total;
1436 new_total = 0;
1437 auto func = [&](EnvItemVectorView view)
1438 {
1439 info() << "ParallelLoop with environment size=" << view.nbItem();
1442 }
1443 };
1445
1446 if (new_total!=direct_total){
1447 ARCANE_FATAL("Bad total v={0} expected={1}",(Integer)new_total,direct_total);
1448 }
1449 }
1450
1451 // Test avec MatItemVectorView
1452 {
1454 Integer ref_val = _fillTestVar(mat_view,mat_test_sub_view);
1455 Integer new_val = _checkParallelMatItem(mat_view,mat_test_sub_view);
1456 _checkEqual(ref_val,new_val);
1457 }
1458
1459 // Test avec IMeshMaterial
1460 {
1461 Integer ref_val = _fillTestVar(m_mat1,mat_test_sub_view);
1462 Integer new_val = _checkParallelMatItem(m_mat1->matView(),mat_test_sub_view);
1463 _checkEqual(ref_val,new_val);
1464 }
1465
1466 // Test avec MatItemVectorView vide
1467 {
1470 Integer ref_val = _fillTestVar(mat_view,mat_test_sub_view);
1471 Integer new_val = _checkParallelMatItem(mat_view,mat_test_sub_view);
1472 _checkEqual(ref_val,new_val);
1473 }
1474
1475 }
1476
1477 // Test en parallèle avec un pointeur sur membre
1478 // (teste uniquement cette belle syntaxe que propose le C++ avec std::bind)
1479 {
1481 Integer nb_item = test_group_view.nbItem();
1482 info() << "NB_ITEM=" << nb_item;
1483 auto f0 = std::bind(std::mem_fn(&MeshMaterialTesterModule::_subViewFunctor),this,std::placeholders::_1);
1485 // Syntaxe avec lambda
1487 [&](ComponentItemVectorView view){ this->_subViewFunctor(view); }
1488 );
1489 }
1490}
1491
1492/*---------------------------------------------------------------------------*/
1493/*---------------------------------------------------------------------------*/
1494
1495void MeshMaterialTesterModule::
1496_subViewFunctor(ComponentItemVectorView view)
1497{
1499 }
1500}
1501
1502/*---------------------------------------------------------------------------*/
1503/*---------------------------------------------------------------------------*/
1504
1505void MeshMaterialTesterModule::
1506_checkFillArrayFromTo(IMeshMaterial* mat,MaterialVariableCellReal& var)
1507{
1508 ValueChecker vc(A_FUNCINFO);
1509
1510 {
1511 RealUniqueArray values;
1512 Integer nb_cell = mat->cells().size();
1513 // Récupère les valeurs de \a var dans \a values puis les mets dans
1514 // var_tmp et vérifie que tout est OK.
1515 Integer index = 0;
1516 values.resize(nb_cell);
1517 var.fillToArray(mat,values);
1519 vc.areEqual(var[imatcell],values[index],"Bad value for fillToArray()");
1520 ++index;
1521 }
1522 MaterialVariableCellReal var_tmp(MaterialVariableBuildInfo(m_material_mng,"TestVarTmpReal"));
1523
1524 index = 0;
1525 var_tmp.fillFromArray(mat,values);
1527 vc.areEqual(values[index],var_tmp[imatcell],"Bad value for fillFromArray()");
1528 ++index;
1529 }
1530 }
1531
1532 {
1533 std::map<Int32,MatCell> matvar_indexes;
1534 Int32UniqueArray indexes;
1535 {
1540 matvar_indexes.insert(std::make_pair(iterator_index,*imatcell));
1541 indexes.add(iterator_index);
1542 }
1544 }
1545 info() << "Indexes=" << indexes;
1546 }
1547
1548 // Idem test précédent mais sur un sous-ensemble des valeurs
1549
1550 RealUniqueArray values;
1551 Integer nb_index = indexes.size();
1552 values.resize(nb_index);
1553
1554 var.fillToArray(mat,values,indexes);
1555 for( Integer i=0; i<nb_index; ++i )
1556 vc.areEqual(var[matvar_indexes[i]],values[i],"Bad value for fillToArray() (2)");
1557
1558 MaterialVariableCellReal var_tmp(MaterialVariableBuildInfo(m_material_mng,"TestVarTmpReal2"));
1559
1560 var_tmp.fillFromArray(mat,values,indexes);
1561 for( Integer i=0; i<nb_index; ++i )
1562 vc.areEqual(values[i],var_tmp[matvar_indexes[i]],"Bad value for fillFromArray() (2)");
1563 }
1564}
1565
1566/*---------------------------------------------------------------------------*/
1567/*---------------------------------------------------------------------------*/
1568
1569void MeshMaterialTesterModule::
1570compute()
1571{
1572 IUnitTest* unit_test = options()->additionalTestService();
1573 if (unit_test)
1574 unit_test->executeTest();
1575
1576 // Si non nul, indique qu'il faut vérifier les valeurs suite à un repartitionnement
1577 if (m_check_spectral_values_iteration!=0){
1578 info() << "Check spectral values after loadbalancing";
1579 _setOrCheckSpectralValues(m_check_spectral_values_iteration,true);
1580 m_check_spectral_values_iteration = 0;
1581 }
1582
1583 // Active la variable une itération sur deux pour tester l'activation et désactivation
1584 // au cours du temps.
1585 m_mat_not_used_real.globalVariable().setUsed((m_global_iteration()%2)==0);
1586
1587 _dumpAverageValues();
1588 _doDependencies();
1589 _doSimd();
1590 _testComponentPart(m_mat1,nullptr);
1591 if (m_mat2)
1592 _testComponentPart(m_mat2,nullptr);
1593
1594 ENUMERATE_ENV(ienv,m_material_mng){
1595 _testComponentPart(nullptr,(*ienv));
1596 }
1597
1598 // Teste la création de variable et les accesseurs.
1599 using namespace Materials;
1601 mat_pressure.fill(0.0);
1602
1603 FaceGroup xmin_group = defaultMesh()->faceFamily()->findGroup("XMIN");
1605 Face face = *iface;
1606 Cell c = face.boundaryCell();
1607 Real d = m_density[c];
1608 m_density[c] = d + 1.0;
1609 }
1610
1611 {
1612 // Teste le constructeur de recopie
1614 if (mat_pressure2.materialVariable()!=mat_pressure.materialVariable())
1615 ARCANE_FATAL("Bad clone");
1616 }
1617
1618 {
1619 // Teste le changement de référence.
1620 MaterialVariableCellReal mat_test_refersto(MaterialVariableBuildInfo(m_material_mng,"TestRefersToVar"));
1622 if (mat_test_refersto.materialVariable()!=mat_pressure.materialVariable())
1623 ARCANE_FATAL("Bad refersTo");
1624 Real total = 0.0;
1625 Real total_ref = 0.0;
1627 total += mat_test_refersto[imatcell];
1629 }
1630 if (total!=total_ref)
1631 ARCANE_FATAL("Bad value for total using refersTo");
1632
1633 }
1634
1635 // Teste le ENUMERATE_GENERIC_CELL
1636 {
1637 MatCellVector mat_cells(ownCells(),m_mat1);
1639 MaterialVariableCellReal var(MaterialVariableBuildInfo(m_material_mng,"VarTestGeneric"));
1640 applyGeneric(mcref,var,4.5);
1642 if (var[imatcell]!=4.5)
1643 ARCANE_FATAL("Bad value 1 for TestGeneric");
1644 }
1645 applyGeneric(allCells(),var,3.2);
1646 ENUMERATE_CELL(icell,allCells()){
1647 if (var[icell]!=3.2)
1648 ARCANE_FATAL("Bad value 2 for TestGeneric");
1649 }
1650 applyGeneric(m_mat1,var,7.6);
1652 if (var[imatcell]!=7.6)
1653 ARCANE_FATAL("Bad value 3 for TestGeneric");
1654 }
1655 applyGeneric(m_mat1->environment(),var,4.2);
1657 if (var[imatcell]!=4.2)
1658 ARCANE_FATAL("Bad value 4 for TestGeneric");
1659 }
1660 }
1661
1662 // Teste le remplissage des valeurs partielles.
1663 _checkFillPartialValues();
1664
1665 IMeshMaterialVariable* nv = m_material_mng->findVariable(m_pressure.variable()->fullName());
1666 if (!nv)
1667 fatal() << "Can not find MeshVariable (F1)";
1668
1669 IMeshMaterialVariable* nv2 = m_material_mng->findVariable("Pressure");
1670 if (!nv2)
1671 fatal() << "Can not find MeshVariable (F2)";
1672
1674 MatCell mmc = *imatcell;
1675 MatVarIndex mvi = mmc._varIndex();
1676 info() << "CELL IN MAT1 i=" << imatcell.index() << " vindex=" << mvi.arrayIndex() << " i=" << mvi.valueIndex();
1677 mat_pressure[mmc] += 0.2;
1678 }
1679
1680 if (m_mat2){
1682 MatCell mmc = *imatcell;
1683 MatVarIndex mvi = mmc._varIndex();
1684 info() << "CELL IN MAT2 vindex=" << mvi.arrayIndex() << " i=" << mvi.valueIndex();
1685 //mat_pressure[mmc] -= 0.2;
1686 mat_pressure[imatcell] -= 0.2;
1687 }
1688 }
1689
1690 _checkFillArrayFromTo(m_mat1,mat_pressure);
1691 if (m_mat2)
1692 _checkFillArrayFromTo(m_mat2,mat_pressure);
1693
1694 ENUMERATE_ENV(ienv,m_material_mng){
1697 EnvCell ev = *ienvcell;
1698 MatVarIndex mvi = ev._varIndex();
1699 info() << "CELL IN ENV vindex=" << mvi.arrayIndex() << " i=" << mvi.valueIndex();
1700 mat_pressure[ev] += 3.0;
1701 mat_pressure[ienvcell] += 3.0;
1702 }
1704 ComponentCell cv = *icmpcell;
1705 MatVarIndex mvi = cv._varIndex();
1706 info() << "CELL IN ENV WITH COMPONENT vindex=" << mvi.arrayIndex() << " i=" << mvi.valueIndex();
1707 mat_pressure[cv] += 3.0;
1708 EnvCell env_cell(cv);
1709 if (env_cell._varIndex()!=cv._varIndex())
1710 ARCANE_FATAL("Bad cell");
1711 }
1712 }
1713 _computeDensity();
1714 _checkArrayVariableSynchronize();
1715
1716 for( Integer i=0, n=m_material_mng->materials().size(); i<n; ++i ){
1717 IMeshMaterial* mat = m_material_mng->materials()[i];
1718 m_density_post_processing[i]->copy(m_mat_density.globalVariable());
1719 _copyPartialToGlobal(mat,*m_density_post_processing[i],m_mat_density);
1720 }
1721
1722 // Supprime des mailles pour test
1723 {
1724 info() << "CheckRemove: Cells in MAT1=" << m_mat1->cells().size();
1726 MatCell mmc = *imatcell;
1727 MatVarIndex mvi = mmc._varIndex();
1728 info() << "CheckRemove: CELL IN MAT1 i=" << imatcell.index() << " vindex=" << mvi.arrayIndex() << " i=" << mvi.valueIndex()
1729 << " lid=" << mmc.envCell().globalCell();
1730 }
1731
1732 if (m_mat2)
1733 info() << "Cells in MAT2=" << m_mat2->cells().size();
1734
1736
1737 Int64 last_uid = m_nb_starting_cell() - (m_global_iteration()*30);
1738 info() << "LAST_UID_TO_REMOVE=" << last_uid;
1739
1740 ENUMERATE_CELL(icell,allCells()){
1741 Cell c = *icell;
1742 if (c.uniqueId()>last_uid)
1743 remove_lids.add(c.localId());
1744 }
1745
1746 info() << "Removing cells n=" << remove_lids.size();
1747 mesh()->modifier()->setDynamic(true);
1748 mesh()->modifier()->removeCells(remove_lids);
1749 if (parallelMng()->isParallel()){
1750 // En parallèle, comme on supprime les mailles un peu n'importe comment,
1751 // on supprime les tests tant que le maillage n'est pas à jour.
1752 // TODO: regarder pourquoi le test checkValidMesh() plante.
1753 Integer check_level = mesh()->checkLevel();
1754 mesh()->setCheckLevel(0);
1755 mesh()->modifier()->endUpdate();
1756 {
1757 MeshMaterialIndirectModifier mmim(m_material_mng);
1758 mmim.beginUpdate();
1759 info() << "MESH_MATERIAL_TEST: UpdateGhostLayers";
1760 mesh()->modifier()->updateGhostLayers();
1761 if ((m_global_iteration() % 2)==0){
1762 mmim.endUpdateWithSort();
1763 // TODO: vérifier que tout est trié
1764 }
1765 else
1766 mmim.endUpdate();
1767 }
1768 mesh()->setCheckLevel(check_level);
1769 //mesh()->checkValidMesh();
1770 }
1771 else
1772 mesh()->modifier()->endUpdate();
1773
1774 info() << "End removing cells nb_cell=" << mesh()->nbCell();
1775 }
1776 if (m_mesh_partitioner){
1777 Integer iteration = m_global_iteration();
1778 // Lance un repartitionnement toute les 3 itérations.
1779 if ((iteration%3)==0){
1780 info() << "Registering mesh partition";
1781 subDomain()->timeLoopMng()->registerActionMeshPartition(m_mesh_partitioner);
1782 m_check_spectral_values_iteration = (iteration*2)+1;
1783 _setOrCheckSpectralValues(m_check_spectral_values_iteration,false);
1784 }
1785 }
1786 {
1787 // Initialise la densité et l'energie interne dans les nouvelles mailles.
1788 ENUMERATE_MAT(imat,m_material_mng){
1791 MatCell mc = *icell;
1792 if (m_mat_density[mc] == 0.0)
1793 m_mat_density[mc] = 50.0;
1794 if (m_mat_internal_energy[mc] == 0.0)
1795 m_mat_internal_energy[mc] = 1.0;
1796 }
1797 }
1798 _applyEos(false);
1799 }
1800}
1801
1802/*---------------------------------------------------------------------------*/
1803/*---------------------------------------------------------------------------*/
1804
1805void MeshMaterialTesterModule::
1806_checkFillPartialValues()
1807{
1808 // Teste le remplissage des valeurs partielles par les valeurs globales.
1809 info() << "Check MaterialVariableCellReal";
1810 MaterialVariableCellReal mat_var(MaterialVariableBuildInfo(m_material_mng,"TestFillPartialMat"));
1811 _checkFillPartialValuesHelper(mat_var);
1812
1813 info() << "Check EnvironmentVariableCellReal";
1814 EnvironmentVariableCellReal env_var(MaterialVariableBuildInfo(m_material_mng,"TestFillPartialEnv"));
1815 _checkFillPartialValuesHelper(env_var);
1816 if (m_material_mng->isAllocateScalarEnvironmentVariableAsMaterial()){
1817 MaterialVariableCellReal mat_env_var(MaterialVariableBuildInfo(m_material_mng,"TestFillPartialEnv"));
1818 info() << "Ok for creating Material variable with same name as Environment variable";
1819 }
1820
1821 info() << "Check MaterialVariableCellReal";
1822 MaterialVariableCellArrayReal mat_var2(MaterialVariableBuildInfo(m_material_mng,"TestFillPartialMat2"));
1823 mat_var2.resize(5);
1824 _checkFillPartialValuesHelper(mat_var2);
1825
1826 info() << "Check EnvironmentVariableCellArrayReal";
1827 EnvironmentVariableCellArrayReal env_var2(MaterialVariableBuildInfo(m_material_mng,"TestFillPartialEnv2"));
1828 env_var2.resize(12);
1829 _checkFillPartialValuesHelper(env_var2);
1830}
1831
1832/*---------------------------------------------------------------------------*/
1833/*---------------------------------------------------------------------------*/
1834
1835template<typename VarType> void MeshMaterialTesterModule::
1836_checkFillPartialValuesHelper(VarType& mat_var)
1837{
1838 info() << "Check fillPartialValuesWithGlobalValues()";
1839 _fillVar(mat_var,3.0);
1840 mat_var.materialVariable()->fillPartialValuesWithGlobalValues();
1841 _checkFillPartialValuesWithGlobal(mat_var,m_material_mng->components());
1842
1843 info() << "Check fillPartialValuesWithSuperValues(LEVEL_ALLENVIRONMENT)";
1844 _fillVar(mat_var,7.0);
1845 mat_var.fillPartialValuesWithSuperValues(LEVEL_ALLENVIRONMENT);
1846 _checkFillPartialValuesWithGlobal(mat_var,m_material_mng->components());
1847
1848 info() << "Check fillPartialValuesWithSuperValues(LEVEL_ENVIRONMENT)";
1849 _fillVar(mat_var,-2.0);
1850 mat_var.fillPartialValuesWithSuperValues(LEVEL_ENVIRONMENT);
1851 _checkFillPartialValuesWithSuper(mat_var,m_material_mng->environmentsAsComponents());
1852
1853 info() << "Check fillPartialValuesWithSuperValues(LEVEL_MATERIAl)";
1854 _fillVar(mat_var,-25.0);
1855 mat_var.fillPartialValuesWithSuperValues(LEVEL_MATERIAL);
1856 _checkFillPartialValuesWithSuper(mat_var,m_material_mng->materialsAsComponents());
1857}
1858
1859/*---------------------------------------------------------------------------*/
1860/*---------------------------------------------------------------------------*/
1861
1862namespace
1863{
1864void _setValue(Real& var_ref,Real value)
1865{
1866 var_ref = value;
1867}
1868void _setValue(RealArrayView var_ref,Real value)
1869{
1870 Integer n = var_ref.size();
1871 for( Integer i=0; i<n; ++i ){
1872 var_ref[i] = value*((Real)(i+1));
1873 }
1874}
1875}
1876template<typename VarType> void MeshMaterialTesterModule::
1877_fillVar(VarType& var_type,Real base_value)
1878{
1879 MeshComponentList components = m_material_mng->components();
1880 MatVarSpace var_space = var_type.space();
1881 Int32 index = 0;
1882 ENUMERATE_COMPONENT(ic,components){
1883 IMeshComponent* c = *ic;
1884 if (!c->hasSpace(var_space))
1885 continue;
1887 ++index;
1888 _setValue(var_type[iccell],(base_value + (Real)index));
1889 }
1890 }
1891}
1892
1893/*---------------------------------------------------------------------------*/
1894/*---------------------------------------------------------------------------*/
1895
1896template<typename VarType> void MeshMaterialTesterModule::
1897_checkFillPartialValuesWithGlobal(const VarType& var_type,MeshComponentList components)
1898{
1899 ValueChecker vc(A_FUNCINFO);
1900 MatVarSpace var_space = var_type.space();
1901
1902 ENUMERATE_COMPONENT(ic,components){
1903 IMeshComponent* c = *ic;
1904 if (!c->hasSpace(var_space))
1905 continue;
1907 Cell c = (*iccell).globalCell();
1908 auto ref_value = var_type[c];
1909 auto my_value = var_type[iccell];
1910 vc.areEqual(my_value,ref_value,"Bad fill value with global");
1911 }
1912 }
1913}
1914
1915/*---------------------------------------------------------------------------*/
1916/*---------------------------------------------------------------------------*/
1917
1918template<typename VarType> void MeshMaterialTesterModule::
1919_checkFillPartialValuesWithSuper(const VarType& var_type,MeshComponentList components)
1920{
1921 ValueChecker vc(A_FUNCINFO);
1922 MatVarSpace var_space = var_type.space();
1923
1924 ENUMERATE_COMPONENT(ic,components){
1925 IMeshComponent* c = *ic;
1926 if (!c->hasSpace(var_space))
1927 continue;
1929 ComponentCell c = (*iccell).superCell();
1930 auto ref_value = var_type[c];
1931 auto my_value = var_type[iccell];
1932 vc.areEqual(my_value,ref_value,"Bad fill value with super");
1933 }
1934 }
1935}
1936
1937/*---------------------------------------------------------------------------*/
1938/*---------------------------------------------------------------------------*/
1939
1940template<typename VarType1,typename VarType2,typename VarType3> void MeshMaterialTesterModule::
1941_setOrCheckSpectralValues2(VarType1& var_real,VarType2& var_int32,VarType3& var_scalar_int32,
1942 Int64 iteration,bool is_check)
1943{
1944 typedef std::function<void(Int64,Int64,ComponentItemLocalId)> FunctorType;
1945
1946 Int32 spectral1_dim2 = var_real.globalVariable().arraySize();
1947 Int32 spectral2_dim2 = var_int32.globalVariable().arraySize();
1948 info() << "SET_OR_CHECK size1=" << spectral1_dim2 << " size2=" << spectral2_dim2;
1949 FunctorType set_func = [&](Int64 uid,Int64 iteration,ComponentItemLocalId var_index)
1950 {
1951 Int64 component_idx = var_index.localId().arrayIndex();
1952 Int64 base = uid + iteration + (component_idx+1);
1953 for( Integer i=0; i<spectral1_dim2; ++i )
1954 var_real[var_index][i] = Convert::toReal(2.0 + (Real)(base * spectral1_dim2 + i));
1955 for( Integer i=0; i<spectral2_dim2; ++i )
1956 var_int32[var_index][i] = (Int32)(3 + (base * spectral2_dim2 + i*2 ));
1958 };
1959
1960 ValueChecker vc(A_FUNCINFO);
1961 vc.setThrowOnError(false);
1962
1963 FunctorType check_func = [&](Int64 uid,Int64 iteration,ComponentItemLocalId var_index)
1964 {
1965 Int64 component_idx = var_index.localId().arrayIndex();
1966 Int64 base = uid + iteration + (component_idx+1);
1967 for( Integer i=0; i<spectral1_dim2; ++i ){
1968 Real ref1 = Convert::toReal(2.0 + (Real)(base * spectral1_dim2 + i));
1969 //info() << "CHECK1 var=" << var_real.name() << " idx=" << var_index << " v1=" << ref1 << " v2=" << var_real[var_index][i];
1970 vc.areEqual(ref1,var_real[var_index][i],String::format("spectral1:{0}",var_real.name()));
1971 }
1972 for( Integer i=0; i<spectral2_dim2; ++i ){
1973 Int32 ref2 = (Int32)(3 + (base * spectral2_dim2 + i*2 ));
1974 //info() << "CHECK2 var=" << var_real.name() << " idx=" << var_index << " v1=" << ref2 << " v2=" << var_int32[var_index][i];
1975 vc.areEqual(ref2,var_int32[var_index][i],String::format("spectral2:{0}",var_int32.name()));
1976 }
1977 Int32 ref3 = (Int32)(3 + (base * spectral2_dim2));
1978 vc.areEqual(ref3,var_scalar_int32[var_index],"scalar1");
1979 if (vc.nbError()!=0){
1980 error() << "Error for cell uid=" << uid << " var_index=" << var_index;
1981 vc.throwIfError();
1982 }
1983 };
1984
1985 FunctorType func = (is_check) ? check_func : set_func;
1986
1987 bool has_mat = var_real.materialVariable()->space()!=MatVarSpace::Environment;
1988 ENUMERATE_ALLENVCELL(iallenvcell,m_material_mng,allCells()){
1990 Cell global_cell = all_env_cell.globalCell();
1991 Int64 cell_uid = global_cell.uniqueId();
1993 func(cell_uid,iteration,ienvcell);
1994 if (has_mat){
1996 func(cell_uid,iteration,imatcell);
1997 }
1998 }
1999 }
2000 func(cell_uid,iteration,all_env_cell);
2001 }
2002}
2003
2004/*---------------------------------------------------------------------------*/
2005/*---------------------------------------------------------------------------*/
2006
2007void MeshMaterialTesterModule::
2008_setOrCheckSpectralValues(Int64 iteration,bool is_check)
2009{
2010 _setOrCheckSpectralValues2(m_mat_spectral1,m_mat_spectral2,m_mat_int32,iteration,is_check);
2011 _setOrCheckSpectralValues2(m_env_spectral1,m_env_spectral2,m_env_int32,iteration,is_check);
2012}
2013
2014/*---------------------------------------------------------------------------*/
2015/*---------------------------------------------------------------------------*/
2016
2017void MeshMaterialTesterModule::
2018_checkArrayVariableSynchronize()
2019{
2020 info() << "_checkArrayVariableSynchronize(): SYNCHRONIZE_MATERIALS";
2021 m_material_mng->synchronizeMaterialsInCells();
2022 m_material_mng->checkMaterialsInCells();
2023
2024 Int64 iteration = m_global_iteration();
2025
2026 _setOrCheckSpectralValues(iteration,false);
2027
2028 // On utilise la synchro par liste une itération sur deux.
2029 if ((iteration % 2)==0){
2031 m_mat_spectral1.synchronize(mlist);
2032 m_mat_spectral2.synchronize(mlist);
2033 m_env_spectral1.synchronize(mlist);
2034 m_env_spectral2.synchronize(mlist);
2035 m_mat_int32.synchronize();
2036 m_env_int32.synchronize();
2037 mlist.apply();
2038 }
2039 else{
2040 m_mat_spectral1.synchronize();
2041 m_mat_spectral2.synchronize();
2042 m_env_spectral1.synchronize();
2043 m_env_spectral2.synchronize();
2044 m_mat_int32.synchronize();
2045 m_env_int32.synchronize();
2046 }
2047
2048 _setOrCheckSpectralValues(iteration,true);
2049}
2050
2051/*---------------------------------------------------------------------------*/
2052/*---------------------------------------------------------------------------*/
2053
2054void MeshMaterialTesterModule::
2055_computeDensity()
2056{
2057 VariableCellReal tmp_cell_mat_density(VariableBuildInfo(defaultMesh(),"TmpCellMatDensity"));
2058 VariableNodeReal tmp_node_mat_density(VariableBuildInfo(defaultMesh(),"TmpNodeMatDensity"));
2059
2062 // Calcul les mailles dans lesquelles il faut ajouter ou supprimer des matériaux
2063 {
2064 Materials::MeshMaterialModifier modifier(m_material_mng);
2065 ENUMERATE_ENV(ienv,m_material_mng){
2069 mat_to_add_array.clear();
2070 mat_to_remove_array.clear();
2072 info() << "FILL_DENSITY_INFO ITER=" << m_global_iteration()
2073 << " mat=" << mat->name()
2074 << " nb_to_add=" << mat_to_add_array.size()
2075 << " nb_to_remove=" << mat_to_remove_array.size();
2076
2077 modifier.removeCells(mat,mat_to_remove_array);
2078 modifier.addCells(mat,mat_to_add_array);
2079 }
2080 }
2081 }
2082
2083 // Met à jour les valeurs.
2084 {
2085 ENUMERATE_ENV(ienv,m_material_mng){
2089 }
2090 }
2091 }
2092 // Pour que les synchronisations fonctionnent bien,
2093 // il faut que les matériaux soient les mêmes dans toutes les mailles.
2094 m_material_mng->synchronizeMaterialsInCells();
2095 info() << "Synchronize density";
2096 m_mat_density.synchronize();
2097}
2098
2099/*---------------------------------------------------------------------------*/
2100/*---------------------------------------------------------------------------*/
2101
2102void MeshMaterialTesterModule::
2103_copyPartialToGlobal(IMeshMaterial* mat,VariableCellReal& global_density,
2105{
2107 MatCell mc = *imatcell;
2108 Cell global_cell = mc.globalCell();
2110 }
2111}
2112
2113/*---------------------------------------------------------------------------*/
2114/*---------------------------------------------------------------------------*/
2132 bool is_compute_mat)
2133{
2134 Int32 mat_id = mat->id();
2135 tmp_cell_mat_density.fill(0.0);
2136 tmp_node_mat_density.fill(0.0);
2137 info() << "FILL MAT=" << mat->name();
2138
2139 // Copy dans tmp_cell_mat_density la valeur partielle de la densité pour \a mat
2140 _copyPartialToGlobal(mat,tmp_cell_mat_density,m_mat_density);
2141
2142 // La valeur aux noeuds est la moyenne de la valeur aux mailles autour
2143 ENUMERATE_NODE(inode,allNodes()){
2144 Real v = 0.0;
2145 for( CellLocalId icell : inode->cellIds() )
2147 v /= (Real)inode->nbCell();
2148 v *= 0.8;
2150 }
2151
2152 // Phase1, calcule les mailles où le matériau sera créé ou supprimé.
2153 // Cela se fait en fonction de certaines valeurs (arbitraires) de la densité.
2154 if (is_compute_mat){
2155 ENUMERATE_CELL(icell,allCells()){
2156 Cell cell = *icell;
2158 Real new_density = 0.0;
2159 bool has_material = (m_present_material[cell] & (1<<mat_id));
2160 for( NodeLocalId inode : cell.nodeIds() )
2162 new_density /= (Real)cell.nbNode();
2163 if (new_density>=0.5 && !has_material && current_density==0.0){
2164 mat_to_add_array.add(cell.localId());
2165 info() << "NEW CELL FOR MAT " << mat_id << " uid=" << ItemPrinter(cell) << " new=" << new_density;
2166 }
2168 mat_to_remove_array.add(cell.localId());
2169 info() << "REMOVE CELL FOR MAT " << mat_id << " uid=" << ItemPrinter(cell) << " new=" << new_density
2170 << " old=" << current_density;
2171 }
2173 }
2174 }
2175 else{
2176 // Phase2: met à jour les valeurs maintenant que le matériau a été
2177 // ajouté dans toutes les mailles
2178
2179 ENUMERATE_CELL(icell,allCells()){
2180 Cell cell = *icell;
2181 Real new_density = 0.0;
2182 for( NodeLocalId inode : cell.nodeIds() )
2184 new_density /= (Real)cell.nbNode();
2186 }
2187
2189 MatCell mc = *imatcell;
2190 Cell global_cell = mc.globalCell();
2191 //Real density = tmp_cell_mat_density[global_cell];
2192 //info() << "ASSIGN cell=" << global_cell.uniqueId() << " density=" << density;
2193 m_mat_density[mc] = tmp_cell_mat_density[global_cell];
2194 }
2195 }
2196 {
2197 StdMeshVariables<MeshMaterialVariableTraits> xm(meshHandle(),"Base1","Base2");
2198 }
2199}
2200
2201/*---------------------------------------------------------------------------*/
2202/*---------------------------------------------------------------------------*/
2203
2204void MeshMaterialTesterModule::
2205_checkCreation2(Integer a,Integer n)
2206{
2207 Int64 z = 0;
2208 info() << "I=" << a << " N=" << n;
2209 for( Integer i=0; i<n; ++i ){
2211 z += mat_pressure.materialVariable()->name().length();
2212 }
2213 info() << "Z=" << z;
2214}
2215
2216/*---------------------------------------------------------------------------*/
2217/*---------------------------------------------------------------------------*/
2223{
2224 Integer n = 0;
2225 ParallelLoopOptions options;
2226 options.setGrainSize(20);
2227 arcaneParallelFor(0,1000,options,[&](Integer a,Integer n) { _checkCreation2(a,n); });
2228
2229 info() << "CHECK CREATE N=" << n;
2230
2231 {
2233 mat_pressure.fill(0.0);
2235 MatCell mmc = *imatcell;
2236 mat_pressure[mmc] += 0.2;
2237 }
2238 }
2239}
2240#if 0
2241/*---------------------------------------------------------------------------*/
2242/*---------------------------------------------------------------------------*/
2243
2244void MeshMaterialTesterModule::
2245_checkSynchronize()
2246{
2247 MaterialVariableCellInt32 m_mat_int32;
2250}
2251#endif
2252
2253/*---------------------------------------------------------------------------*/
2254/*---------------------------------------------------------------------------*/
2255
2256namespace
2257{
2258// Exemple pour la documentation. Doit compiler mais ne sera pas exécuté.
2259class Sample
2260: public BasicModule
2261{
2262 public:
2263 Sample(const ModuleBuildInfo& mbi)
2264 : BasicModule(mbi), m_mat_density(MaterialVariableBuildInfo(0,"TestDensity"))
2265 {}
2266 MaterialVariableCellReal m_mat_density;
2267
2269 void _computeDensity(IMeshMaterial* mat)
2270 {
2272 MatCell mc = *imc;
2273 m_mat_density[mc] = 1.0;
2274 }
2275
2276 // Indique que la variable est à jour.
2277 m_mat_density.setUpToDate(mat);
2278 }
2280
2281 void _sample()
2282 {
2285 // Création ou récupération du gestionnaire depuis un maillage.
2288
2290 // Exemple de création de 3 matériaux:
2291 material_mng->registerMaterialInfo("MAT1");
2292 material_mng->registerMaterialInfo("MAT2");
2293 material_mng->registerMaterialInfo("MAT3");
2295
2297 // Création du milieu ENV1 contenant les matériaux MAT1 et MAT2
2299 ebi1.addMaterial("MAT1");
2300 ebi1.addMaterial("MAT2");
2301 IMeshEnvironment* env1 = material_mng->createEnvironment(ebi1);
2302
2303 // Création du milieu ENV2 contenant le matériau MAT2
2305 ebi2.addMaterial("MAT2");
2306 IMeshEnvironment* env2 = material_mng->createEnvironment(ebi2);
2307
2308 // Création du milieu ENV3 contenant les matériaux MAT3 et MAT1
2310 ebi3.addMaterial("MAT3");
2311 ebi3.addMaterial("MAT1");
2312 IMeshEnvironment* env3 = material_mng->createEnvironment(ebi3);
2313
2314 // Création du bloc BLOCK1 sur le groupe de toutes les mailles
2315 // et contenant les milieux ENV1 et ENV2
2316 MeshBlockBuildInfo mb1("BLOCK1",allCells());
2317 mb1.addEnvironment(env1);
2318 mb1.addEnvironment(env2);
2319 IMeshBlock* block = material_mng->createBlock(mb1);
2320
2321 // Indique au gestionnaire que l'initialisation est terminée
2322 material_mng->endCreate();
2324
2326 info() << env1->id(); // Affiche '0'
2327 info() << env1->materials()[0]->id(); // Affiche '0'
2328 info() << env1->materials()[1]->id(); // Affiche '1'
2329 info() << env2->id(); // Affiche '1'
2330 info() << env2->materials()[0]->id(); // Affiche '2'
2331 info() << env3->id(); // Affiche '2'
2332 info() << env3->materials()[0]->id(); // Affiche '3'
2333 info() << env3->materials()[1]->id(); // Affiche '4'
2334 info() << block->id(); // Affiche '0'
2336
2338 {
2339 // Créé l'instance de modification. Les modifications
2340 // seront effectives lors de l'appel au destructeur de
2341 // cette classe.
2343 // Ajoute les mailles du matériau 1 ou 2 en fonction
2344 // de leur localId()
2347 Integer nb_cell = allCells().size();
2348 ENUMERATE_CELL(icell,allCells()){
2349 Int32 local_id = icell.itemLocalId();
2350 Integer z = icell.index();
2351 bool add_to_mat1 = (z<(nb_cell/2) && z>(nb_cell/4));
2352 bool add_to_mat2 = (z>=(nb_cell/2) || z<(nb_cell/3));
2353 if (add_to_mat1)
2354 mat1_indexes.add(local_id);
2355 if (add_to_mat2)
2356 mat2_indexes.add(local_id);
2357 }
2358 // Ajoute les mailles du matériau 1
2359 modifier.addCells(env1->materials()[0],mat1_indexes);
2360 // Ajoute les mailles du matériau 2
2361 modifier.addCells(env1->materials()[1],mat2_indexes);
2362 }
2363 // A partir d'ici, les matériaux sont mis à jour.
2364 info() << env1->materials()[0]->cells().size(); // Nombre de mailles du matériau
2366
2368 IMesh* mesh = defaultMesh();
2373
2375 // Itération sur tous les milieux, puis tous les matériaux et
2376 // toutes les mailles de ce matériau
2382 MatCell mc = *imatcell;
2383 info() << "Cell mat=" << mc.materialId();
2384 }
2385 }
2388 info() << "Cell env=" << mmcell.environmentId();
2389 }
2390 }
2392
2394 // Itération sur tous les mailles des matériaux des milieux d'un bloc.
2395 ENUMERATE_ENV(ienv,block){
2400 MatCell mc = *imatcell;
2401 info() << "Cell mat=" << mc.materialId();
2402 }
2403 }
2404 }
2406
2408 // Itération sur tous les milieux et tous les matériaux d'une maille.
2413 info() << "Cell env=" << env_cell.environmentId();
2415 MatCell mc = *imatcell;
2416 info() << "Cell mat=" << mc.materialId();
2417 }
2418 }
2419 }
2421
2423 // Itération sur tous les milieux et tous les matériaux d'une maille.
2428 info() << "Cell env=" << env_cell.environmentId();
2430 MatCell mc = *imatcell;
2431 info() << "Cell mat=" << mc.materialId();
2432 }
2433 }
2434 }
2436
2437
2439 CellGroup cells;
2440 IMeshMaterial* mat = env1->materials()[0];
2443 mat_density[imatcell] = 2.3;
2444 }
2448 mat_density[imatcell] = 3.1;
2449 }
2451
2453
2454
2456 // Itération sur tous les milieux, puis tous les matériaux et
2457 // toutes les mailles de ce matériau via la ComponentCell
2464 info() << "Cell mat=" << cc.componentId();
2465 mat_density[cc] = 3.1; // Met à jour la densité du matériau
2466 }
2467 }
2470 info() << "Cell env=" << cc.componentId();
2471 mat_density[cc] = 2.5; // Met à jour la densité du milieu
2472 }
2473 }
2475
2476 {
2478 MatCell mc;
2480 // Retourne la maille milieu (EnvCell) du matériau:
2481 ComponentCell cc2 = cc.superCell();
2482 // Itère sur les mailles matériaux du milieu
2484 }
2485
2486 // Retourne la maille AllEnvCell du milieu:
2487 ComponentCell cc3 = cc2.superCell();
2488 // Itère sur les mailles milieu de la maille.
2490 }
2492 }
2493
2494 {
2495 Real init_val = 0.0;
2497 // Initialise la valeur globale
2498 var.globalVariable().fill(init_val);
2500 // Initialise les valeurs milieux
2503 }
2504 // Initialise les valeurs matériaux
2508 }
2509 }
2510 }
2511 }
2512
2513 {
2515 // Positionne la méthode de calcul.
2516 mat_density.setMaterialComputeFunction(this,&Sample::_computeDensity);
2517 // Ajoute dépendance sur une variable matériau
2518 mat_density.addMaterialDepend(mat_pressure);
2519 // Ajoute dépendance sur variables globales
2520 mat_density.addMaterialDepend(defaultMesh()->nodesCoordinates());
2521 mat_density.addMaterialDepend(m_global_time);
2522
2525 // Met à jour la variable sur le matériau \a mat si besoin.
2526 mat_density.update(mat);
2527 }
2529 }
2530
2531 {
2533 // Boucle parallèle sur les mailles du milieu env1
2535 Parallel::Foreach(env->envView(),[&](EnvItemVectorView view)
2536 {
2537 ENUMERATE_ENVCELL(ienvcell,view){
2538 mat_density[ienvcell] = 2.5;
2539 }
2540 });
2541
2542 // Boucle parallèle sur les mailles du premier matériaux de env1
2543 IMeshMaterial* mat = env1->materials()[0];
2544 Parallel::Foreach(mat->matView(),[&](MatItemVectorView view)
2545 {
2546 ENUMERATE_MATCELL(imatcell,view){
2547 mat_density[imatcell] = 2.5;
2548 }
2549 });
2550
2551 // Functor générique sur un matériau ou milieu.
2552 auto func = [&](ComponentItemVectorView view)
2553 {
2555 mat_density[iccell] = 2.5;
2556 }
2557 };
2558 // Application en parallèle de \a func sur le matériau
2559 Parallel::Foreach(mat->view(),func);
2560 // Application en parallèle de \a func sur le milieu
2561 Parallel::Foreach(env->view(),func);
2562
2563 // Application en parallèle de \a func sur le milieu avec options
2564 ParallelLoopOptions options;
2565 Parallel::Foreach(env->view(),options,func);
2567 }
2568
2569 {
2575
2577 Real nr = 1.0;
2578 // Température et volume en lecture seule
2579 auto in_volume = viewIn(mat_volume);
2581 // Pression en écriture
2583
2586 };
2588
2593
2594 // Boucle sur les mailles du milieu \a env
2596 EnvCell c = *ienvcell;
2598 }
2599
2600 // Boucle sur les mailles du milieu \a env_vector
2602 EnvCell c = *ienvcell;
2604 }
2605
2606 // Boucle sur les mailles pures du milieu \a env
2608 EnvCell c = *ienvcell;
2610 }
2611
2612 // Boucle sur les mailles pures du milieu \a env
2614 EnvCell c = *ienvcell;
2616 }
2617
2618 // Boucle sur les mailles impures du milieu \a env
2620 EnvCell c = *ienvcell;
2622 }
2623
2624 // Boucle sur les mailles impures du milieu \a env
2626 EnvCell c = *ienvcell;
2628 }
2629
2631
2634 IMeshMaterial* mat = env1->materials()[0];
2636
2637 // Boucle sur les mailles du matériau \a mat
2639 MatCell c = *imatcell;
2641 }
2642
2643 // Boucle sur les mailles du matériau \a mat_vector
2645 MatCell c = *imatcell;
2647 }
2648
2649 // Boucle sur les mailles pures du matériau \a mat
2651 MatCell c = *imatcell;
2653 }
2654
2655 // Boucle sur les mailles pures du matériau \a mat
2657 MatCell c = *imatcell;
2659 }
2660
2661 // Boucle sur les mailles impures du matériau \a mat
2663 MatCell c = *imatcell;
2665 }
2666
2667 // Boucle sur les mailles impures du matériau \a mat
2669 MatCell c = *imatcell;
2671 }
2673
2675 // Boucle générique sur les mailles du matériau \a mat
2679 }
2680
2681 // Boucle générique sur les mailles du matériau \a mat_vector
2685 }
2686
2687 // Boucle générique sur les mailles pures du matériau \a mat
2691 }
2692
2693 // Boucle générique sur les mailles pures du matériau \a mat
2697 }
2698
2699 // Boucle générique sur les mailles impures du matériau \a mat
2703 }
2704
2705 // Boucle générique sur les mailles impures du matériau \a mat
2709 }
2711
2712
2713 }
2714 }
2715};
2716}
2717
2718/*---------------------------------------------------------------------------*/
2719/*---------------------------------------------------------------------------*/
2720
2721ARCANE_REGISTER_MODULE_MESHMATERIALTESTER(MeshMaterialTesterModule);
2722
2723/*---------------------------------------------------------------------------*/
2724/*---------------------------------------------------------------------------*/
2725
2726} // End namespace ArcaneTest
2727
2728/*---------------------------------------------------------------------------*/
2729/*---------------------------------------------------------------------------*/
#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:149
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.
Vue sur un vecteur sur les entités d'un composant.
Index d'un ConstituentItem dans une variable.
Représente un composant d'une maille multi-matériau.
ARCCORE_HOST_DEVICE MatVarIndex _varIndex() const
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 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.
Real toReal(Real r)
Converti r en un Real.
Definition Convert.h:80
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.