14#define ARCANE_TRACE_ENUMERATOR
16#include "arcane/utils/ValueConvert.h"
17#include "arcane/utils/IProfilingService.h"
18#include "arcane/utils/IMemoryRessourceMng.h"
20#include "arcane/utils/Profiling.h"
21#include "arcane/utils/internal/ProfilingInternal.h"
23#include "arcane/core/VariableTypes.h"
24#include "arcane/core/IMesh.h"
25#include "arcane/core/Item.h"
26#include "arcane/core/ITimeLoopMng.h"
27#include "arcane/core/IParallelMng.h"
30#include "arcane/core/IVariableMng.h"
31#include "arcane/core/ItemInfoListView.h"
32#include "arcane/core/internal/IVariableInternal.h"
33#include "arcane/core/internal/ItemGroupImplInternal.h"
34#include "arcane/core/materials/internal/IMeshMaterialVariableInternal.h"
35#include "arcane/core/materials/internal/IMeshMaterialMngInternal.h"
37#include "arcane/materials/MeshMaterialVariableRef.h"
38#include "arcane/materials/MeshEnvironmentBuildInfo.h"
39#include "arcane/materials/MeshMaterialInfo.h"
40#include "arcane/materials/CellToAllEnvCellConverter.h"
41#include "arcane/materials/MeshMaterialModifier.h"
42#include "arcane/materials/ComponentItemVectorView.h"
44#include "arcane/accelerator/core/IAcceleratorMng.h"
45#include "arcane/accelerator/core/RunCommand.h"
46#include "arcane/accelerator/core/RunQueue.h"
47#include "arcane/accelerator/core/Runner.h"
48#include "arcane/accelerator/core/internal/RunnerInternal.h"
50#include "arcane/accelerator/MaterialVariableViews.h"
54#include "arcane/accelerator/Filter.h"
59#include "arcane/tests/ArcaneTestGlobal.h"
60#include "arcane/tests/MaterialHeatTest_axl.h"
77:
public ArcaneMaterialHeatTestObject
139 return MemoryUtils::getAllocationOptions(
mem);
161 void buildInit()
override;
162 void compute()
override;
163 void startInit()
override;
164 void continueInit()
override;
172 Runner m_sequential_runner;
174 bool m_is_init_with_zero =
false;
175 bool m_is_check_init_new_cells =
false;
179 void _computeCellsCenter();
180 void _buildHeatObjects();
187 void _computeGlobalTemperature();
198 void _changeVariableAllocator();
207MaterialHeatTestModule::
209: ArcaneMaterialHeatTestObject(
mbi)
216 Int32
vv = v.value();
221 m_is_init_with_zero = (
vv == 1 ||
vv == 2);
222 m_is_check_init_new_cells = (
vv == 2 ||
vv == 3);
229MaterialHeatTestModule::
230~MaterialHeatTestModule()
234 m_additional_variables.clear();
240void MaterialHeatTestModule::
243 m_sequential_runner.
initialize(Accelerator::eExecutionPolicy::Sequential);
244 m_queue = *acceleratorMng()->defaultQueue();
250 info() <<
"MaterialHeatTestModule::buildInit()";
252 IMesh* mesh = defaultMesh();
255 int flags = options()->modificationFlags();
257 info() <<
"MaterialHeatTestModule modification_flags=" << flags;
263 if (subDomain()->isContinue()) {
264 mm->recreateFromDump();
269 for (Integer i = 0, n = options()->material().size(); i < n; ++i) {
271 info() <<
"Found material name=" <<
mat_name;
278 for (Integer i = 0, n = options()->environment().size(); i < n; ++i) {
280 info() <<
"Found environment name=" <<
env_name;
282 for (Integer
k = 0,
kn = options()->environment[i].material.size();
k <
kn; ++
k) {
291 mm->endCreate(
false);
293 info() <<
"List of materials:";
295 info() <<
"MAT=" << m->name();
296 for (
String s : m->environmentsName())
297 info() <<
" In ENV=" << s;
306 String var_name =
"MaterialAdditionalVar" + String::fromNumber(i);
308 m_additional_variables.add(v);
318 String var_name =
"MaterialAdditionalArrayVar" + String::fromNumber(i);
320 v->resize(1 + (i % 3));
321 m_additional_variables.add(v);
322 v->globalVariable().fill(i + 5);
323 v->fillPartialValuesWithSuperValues(LEVEL_ALLENVIRONMENT);
331void MaterialHeatTestModule::
335 m_global_deltat.assign(1.0);
338 _computeCellsCenter();
339 MeshUtils::markMeshConnectivitiesAsMostlyReadOnly(defaultMesh(), &m_queue,
true);
340 VariableUtils::markVariableAsMostlyReadOnly(m_cell_center);
341 VariableUtils::markVariableAsMostlyReadOnly(defaultMesh()->nodesCoordinates());
349 info() <<
"Changing allocator to use device memory to '" <<
mem_ressource <<
"'";
372void MaterialHeatTestModule::
373_changeVariableAllocator()
379 if (
var->name().startsWith(
"TimeHistoryMng")) {
381 info() <<
"Change allocator for '" <<
var->fullName() <<
"'";
389void MaterialHeatTestModule::
392 info() <<
"MaterialHeatTestModule::continueInit()";
399void MaterialHeatTestModule::
402 info() <<
"MaterialHeatTestModule::compute()";
403 Int32 iteration = m_global_iteration();
405 _changeVariableAllocator();
408 Runner runner = *acceleratorMng()->defaultRunner();
414 bool is_end = (iteration >= options()->nbIteration());
416 subDomain()->timeLoopMng()->stopComputeLoop(
true);
421 for (
const HeatObject&
ho : m_heat_objects) {
429void MaterialHeatTestModule::
432 RunQueue* queue = acceleratorMng()->defaultQueue();
435 mem = eMemoryRessource::Device;
444 for (
const HeatObject&
ho : m_heat_objects)
448 for (
const HeatObject&
ho : m_heat_objects) {
450 _computeCellsToRemove(
ho,
wa);
451 _computeCellsToAdd(
ho,
wa);
458 for (
const HeatObject&
ho : m_heat_objects) {
465 info() <<
"MAT_MODIF: Remove n=" <<
remove_ids.size() <<
" cells to material=" <<
mat->name();
472 info() <<
"MAT_MODIF: Add n=" <<
add_ids.size() <<
" cells to material=" <<
mat->name();
479 if (options()->verbosityLevel() > 0) {
480 for (
const HeatObject&
ho : m_heat_objects) {
481 _printCellsTemperature(
work_arrays[
ho.index].mat_cells_to_add.constView());
482 _printCellsTemperature(
work_arrays[
ho.index].mat_cells_to_remove.constView());
487 for (
const HeatObject&
ho : m_heat_objects)
491 for (
const HeatObject&
ho : m_heat_objects)
494 for (
const HeatObject&
ho : m_heat_objects) {
498 _computeGlobalTemperature();
522void MaterialHeatTestModule::
523_initNewCells(
const HeatObject&
heat_object, MaterialWorkArray&
wa)
525 RunQueue* queue = this->acceleratorMng()->defaultQueue();
535 const bool do_check = m_is_check_init_new_cells;
548 if (
mvi.arrayIndex() != 0) {
584void MaterialHeatTestModule::
590 RunQueue* queue = this->acceleratorMng()->defaultQueue();
607 ARCANE_FATAL(
"Invalid negative temperature '{0}' cell_lid={1}",
t, (*imatcell).globalCell().localId());
649void MaterialHeatTestModule::
650_computeCellsToAdd(
const HeatObject&
heat_object, MaterialWorkArray&
wa)
672 auto select_functor = [=] ARCCORE_HOST_DEVICE(Int32 index) ->
bool {
706void MaterialHeatTestModule::
707_computeCellsToRemove(
const HeatObject&
heat_object, MaterialWorkArray&
wa)
710 const bool is_verbose =
false;
711 const Real cold_value = 300.0;
717 info() <<
"MAT_BEFORE: " <<
current_mat->matView()._internalLocalIds();
729 Int32 index = iter.index();
746 info() <<
"MAT_AFTER: " <<
current_mat->matView()._internalLocalIds();
752void MaterialHeatTestModule::
774void MaterialHeatTestModule::
801 Real epsilon = 1.0e-12;
806 ARCANE_FATAL(
"Bad value for mat '{0}' ref={1} v={2} diff={3}",
815void MaterialHeatTestModule::
828 m_cell_center[
icell] = center;
835void MaterialHeatTestModule::
838 info() <<
"MaterialHeatTestModule::_buildHeatObjects()";
844 ho.center =
opt->center;
845 ho.velocity =
opt->velocity;
846 ho.radius =
opt->radius;
847 ho.material = _findMaterial(
opt->material);
849 ho.expected_final_temperature =
opt->expectedFinalTemperature;
850 m_heat_objects.add(
ho);
862_findMaterial(
const String& name)
865 if (
mat->name() == name)
867 ARCANE_FATAL(
"No material in environment with name '{0}'", name);
873void MaterialHeatTestModule::
874_computeGlobalTemperature()
900void MaterialHeatTestModule::
911 <<
" mv=" <<
ec._varIndex()
912 <<
" env=" <<
ec.component()->name();
915 <<
" mv=" <<
mc._varIndex()
916 <<
" mat=" <<
mc.component()->name();
925ARCANE_REGISTER_MODULE_MATERIALHEATTEST(MaterialHeatTestModule);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions utilitaires sur le maillage.
Types et fonctions pour gérer les synchronisations sur les accélérateurs.
Types et macros pour gérer les énumérations des entités sur les accélérateurs.
#define RUNCOMMAND_ENUMERATE(ItemTypeName, iter_name, item_group,...)
Macro pour itérer sur accélérateur sur un groupe d'entités.
Types et macros pour gérer les boucles sur les accélérateurs.
#define RUNCOMMAND_LOOP1(iter_name, x1,...)
Boucle sur accélérateur avec arguments supplémentaires pour les réductions.
Types et macros pour gérer les énumérations des matériaux et milieux sur les accélérateurs.
#define RUNCOMMAND_MAT_ENUMERATE(MatItemNameType, iter_name, env_or_mat_vector,...)
Macro pour itérer sur un matériau ou un milieu.
Fonctions utilitaires sur les variables.
Module de test pour la gestion des matériaux et des milieux.
void _addHeat(const HeatObject &heat_object)
Algorithme générique de filtrage sur accélérateur.
Classe pour effectuer une réduction 'somme'.
File d'exécution pour un accélérateur.
bool isAcceleratorPolicy() const
Indique si l'instance est associée à un accélérateur.
void printProfilingInfos(std::ostream &o)
Affiche les informations de profiling.
Gestionnaire d'exécution pour accélérateur.
RunnerInternal * _internalApi()
API interne à Arcane.
void initialize(eExecutionPolicy v)
Initialise l'instance. Cette méthode ne doit être appelée qu'une seule fois.
Vue sur les informations des mailles.
Interface d'un service de profiling.
Interface d'une variable.
Vue sur un tableau typé d'entités.
NodeLocalIdView nodeIds() const
Liste des noeuds de l'entité
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Maille arcane avec info matériaux et milieux.
Conversion de 'Cell' en 'AllEnvCell'.
Maille arcane d'un milieu.
Interface d'un milieu d'un maillage.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
virtual void setDataInitialisationWithZero(bool v)=0
Indique comment initialiser les nouvelles valeurs dans les mailles matériaux et milieux.
virtual void setUseMaterialValueWhenRemovingPartialValue(bool v)=0
Indique si on utilise la valeur matériau ou milieu lorsqu'on transforme une maille partielle en maill...
virtual void forceRecompute()=0
Force le recalcul des informations des matériaux.
virtual void setMeshModificationNotified(bool v)=0
Indique si les milieux et matériaux suivent les changements de topologie dans le maillage.
virtual bool isDataInitialisationWithZero() const =0
Indique comment initialiser les nouvelles valeurs dans les mailles matériaux et milieux.
virtual IMeshMaterialMngInternal * _internalApi() const =0
API interne à Arcane.
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'un matériau d'un maillage.
Représente un matériau d'une maille multi-matériau.
Représente un index sur les variables matériaux et milieux.
Informations pour la création d'un milieu.
Infos d'un matériau d'un maillage.
Objet permettant de modifier les matériaux ou les milieux.
Classe de base des références aux variables matériaux.
Informations pour construire un module.
static void setProfilingLevel(Int32 level)
Positionne le niveau de profilage.
Classe permettant de démarrer et arrêter automatiquement un service.
Classe gérant un vecteur de réel de dimension 3.
Paramètres nécessaires à la construction d'une variable.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void clear()
Supprime les éléments du tableau.
Vue constante d'un tableau de type T.
Options pour configurer les allocations.
Chaîne de caractères unicode.
auto viewInOut(RunCommand &cmd, CellMaterialVariableScalarRef< DataType > &var)
Vue en lecture/écriture pour les variables materiaux scalaire.
RunCommand makeCommand(const RunQueue &run_queue)
Créé une commande associée à la file run_queue.
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.
Active toujours les traces dans les parties Arcane concernant les matériaux.
CellMaterialVariableArrayRef< Int32 > MaterialVariableCellArrayInt32
Variable matériau de type tableau de Int32
CellMaterialVariableScalarRef< Int32 > MaterialVariableCellInt32
Variable matériau de type Int32
constexpr ARCCORE_HOST_DEVICE bool isNearlyEqualWithEpsilon(const _Type &a, const _Type &b, const _Type &epsilon)
Teste si deux valeurs sont à un peu près égales. Pour les types entiers, cette fonction est équivalen...
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
eMemoryRessource
Liste des ressources mémoire disponibles.
bool arcaneIsCheck()
Vrai si on est en mode vérification.
std::int32_t Int32
Type entier signé sur 32 bits.
Caractéristiques de l'objet qui chauffe (disque ou sphère)
Real cold_value
Températeure de refroissement.
Int32 index
Index de cet objet dans la liste globale.
Real expected_final_temperature
Température attendue au temps final.
Real3 center
Centre à t=0.
IMeshMaterial * material
Matériaux qui sera chauffé par cet objet.
Real heat_value
Températeure de chauffage.
Tableau de travail pour la mise à jour des liste de matériaux.
UniqueArray< Int32 > mat_cells_to_add
Liste des mailles à ajouter.
UniqueArray< Real > mat_cells_to_add_value
Liste des valeurs de température dans les mailles à ajouter.
UniqueArray< Int32 > mat_cells_to_remove
Liste des mailles à supprimer.
NumArray< bool, MDDim1 > mat_cells_remove_filter
Filtre des mailles à supprimer.