14#include "arcane/materials/MeshMaterialVariable.h"
16#include "arcane/utils/NotImplementedException.h"
17#include "arcane/utils/TraceInfo.h"
18#include "arcane/utils/ITraceMng.h"
19#include "arcane/utils/Real2.h"
20#include "arcane/utils/Real3.h"
21#include "arcane/utils/Real2x2.h"
22#include "arcane/utils/Real3x3.h"
23#include "arcane/utils/Mutex.h"
24#include "arcane/utils/MemoryUtils.h"
25#include "arcane/utils/PlatformUtils.h"
27#include "arcane/core/materials/IMeshMaterial.h"
28#include "arcane/core/materials/ComponentItemVectorView.h"
29#include "arcane/core/Variable.h"
30#include "arcane/core/VariableDependInfo.h"
31#include "arcane/core/MeshVariable.h"
32#include "arcane/core/IItemFamily.h"
33#include "arcane/core/IMesh.h"
34#include "arcane/core/IObserver.h"
35#include "arcane/core/IParallelMng.h"
37#include "arcane/core/materials/internal/IMeshComponentInternal.h"
38#include "arcane/core/materials/internal/IMeshMaterialMngInternal.h"
40#include "arcane/materials/MaterialVariableBuildInfo.h"
41#include "arcane/materials/MatItemEnumerator.h"
42#include "arcane/materials/MeshMaterialVariableRef.h"
43#include "arcane/materials/MeshMaterialVariableDependInfo.h"
44#include "arcane/materials/IMeshMaterialVariableComputeFunction.h"
45#include "arcane/materials/IMeshMaterialVariableSynchronizer.h"
46#include "arcane/materials/internal/MeshMaterialVariablePrivate.h"
47#include "arcane/materials/internal/MeshMaterialVariableIndexer.h"
60MeshMaterialVariablePrivate::
61MeshMaterialVariablePrivate(
const MaterialVariableBuildInfo& v,
MatVarSpace mvs,
62 MeshMaterialVariable* variable)
64, m_material_mng(v.materialMng())
69 if (!platform::getEnvironmentVariable(
"ARCANE_NO_RECURSIVE_DEPEND").null())
70 m_has_recursive_depend =
false;
76MeshMaterialVariablePrivate::
77~MeshMaterialVariablePrivate()
79 if (m_global_variable_changed_observer)
80 std::cerr <<
"WARNING: MeshMaterialVariablePrivate: in destructor: observer is not destroyed\n";
86Int32 MeshMaterialVariablePrivate::
89 return m_variable->dataTypeSize();
95void MeshMaterialVariablePrivate::
105void MeshMaterialVariablePrivate::
116internalCreateSaveDataRef(Integer
nb_value)
118 return m_variable->_internalCreateSaveDataRef(
nb_value);
124void MeshMaterialVariablePrivate::
127 m_variable->_saveData(component,data);
133void MeshMaterialVariablePrivate::
137 m_variable->_restoreData(component,data,data_index,ids,
allow_null_id);
143void MeshMaterialVariablePrivate::
146 m_variable->_copyBetweenPartialAndGlobal(args);
152void MeshMaterialVariablePrivate::
155 m_variable->_initializeNewItemsWithZero(args);
161void MeshMaterialVariablePrivate::
170void MeshMaterialVariablePrivate::
173 m_variable->_resizeForIndexer(args);
182MeshMaterialVariable::
185, m_views_as_bytes(MemoryUtils::getAllocatorForMostlyReadOnlyData())
192MeshMaterialVariable::
193~MeshMaterialVariable()
210 ++m_p->m_nb_reference;
221 ref->setNextReference(m_p->m_first_reference);
222 if (m_p->m_first_reference){
224 if (
_list->previousReference())
225 _list->previousReference()->setNextReference(
ref);
229 ref->setPreviousReference(
nullptr);
231 m_p->m_first_reference =
ref;
243 if (
tmp->previousReference())
244 tmp->previousReference()->setNextReference(
tmp->nextReference());
245 if (
tmp->nextReference())
246 tmp->nextReference()->setPreviousReference(
tmp->previousReference());
247 if (m_p->m_first_reference==
tmp)
248 m_p->m_first_reference = m_p->m_first_reference->
nextReference();
252 ref->setNextReference(
nullptr);
253 ref->setPreviousReference(
nullptr);
255 Int32 nb_ref = --m_p->m_nb_reference;
271 delete m_p->m_global_variable_changed_observer;
272 m_p->m_global_variable_changed_observer =
nullptr;
273 m_p->materialMng()->
_internalApi()->removeVariable(
this);
284 return m_p->m_first_reference;
302 Int32 index =
mat->_internalApi()->variableIndexer()->index() + 1;
303 return m_p->
m_refs[index]->variable();
312 m_p->m_keep_on_change = v;
321 return m_p->m_keep_on_change;
330 if (m_p->hasRecursiveDepend()){
332 vdi.variable()->update();
336 vdi.variable()->update(
mat);
344 Int64
mt =
vdi.variable()->modifiedTime();
352 Int64
mt =
vdi.variable()->modifiedTime(
mat);
377 Int32
id =
mat->id();
384 Int32
id =
mat->id();
454 return m_p->materialMng()->
traceMng();
476 static_assert(
sizeof(
MatVarIndex)==2*
sizeof(Int32),
"Bad size for MatVarIndex");
477 auto*
ptr =
reinterpret_cast<const Int32*
>(indexes.data());
478 return {
ptr, indexes.size()*2 };
484void MeshMaterialVariable::
499void MeshMaterialVariable::
514void MeshMaterialVariable::
515_genericCopyTo(Span<const std::byte> input,
516 SmallSpan<const Int32> input_indexes,
517 Span<std::byte> output,
518 SmallSpan<const Int32> output_indexes,
519 const RunQueue& queue,
Int32 data_type_size)
522 Integer nb_value = input_indexes.size();
529 const Int32 dim2_size = data_type_size;
535 Int32 output_base = output_indexes[i] * dim2_size;
536 Int32 input_base = input_indexes[i] * dim2_size;
537 for (
Int32 j = 0; j < dim2_size; ++j)
538 output[output_base + j] = input[input_base + j];
545IMeshMaterialVariableInternal* MeshMaterialVariable::
548 return m_p->_internalApi();
#define ARCANE_CHECK_ACCESSIBLE_POINTER(queue_or_runner_or_policy, ptr)
Macro qui vérifie en mode check si ptr est accessible pour une RunQueue ou un Runner.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fichier contenant les déclarations concernant le modèle de programmation par échange de message.
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.
File d'exécution pour un accélérateur.
Interface d'une variable.
static Int64 incrementModifiedTime()
Incrémente le compteur de modification et retourne sa valeur avant modification.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Arguments des méthodes de copie entre valeurs partielles et globales.
Interface d'un composant (matériau ou milieu) d'un maillage.
virtual Mutex * variableLock()=0
Verrou utilisé pour le multi-threading.
virtual ITraceMng * traceMng()=0
Gestionnaire de traces.
virtual IMeshMaterialMngInternal * _internalApi() const =0
API interne à Arcane.
Interface de la classe fonctor de recalcul d'une variable.
Interface d'une variable matériau d'un maillage.
Interface d'un matériau d'un maillage.
Arguments des méthodes de copie entre valeurs partielles et globales.
Représente un index sur les variables matériaux et milieux.
Partie privée d'une variable matériau.
UniqueArray< VariableRef * > m_refs
Stocke les références sur les variables tableaux qui servent pour stocker les valeurs par matériau....
UniqueArray< VariableDependInfo > m_depends
Liste des dépendances de cette variable.
UniqueArray< Int64 > m_modified_times
Tag de la dernière modification par matériau.
ScopedPtrT< IMeshMaterialVariableComputeFunction > m_compute_function
Fonction de calcul.
UniqueArray< MeshMaterialVariableDependInfo > m_mat_depends
Liste des dépendances de cette variable.
Classe de base des références aux variables matériaux.
MeshMaterialVariableRef * nextReference()
Référence suivante (ou null) sur variable()
void setUpToDate(IMeshMaterial *mat) override
Indique que la variable vient d'être mise à jour.
MeshMaterialVariableRef * firstReference() const override
void incrementReference()
Int64 modifiedTime(IMeshMaterial *mat) override
Temps auquel la variable a été mise à jour.
void removeVariableRef(MeshMaterialVariableRef *var_ref) override
Supprime une référence à cette variable.
void update(IMeshMaterial *mat) override
Recalcule la variable pour le matériau mat si nécessaire.
void dependInfos(Array< VariableDependInfo > &infos, Array< MeshMaterialVariableDependInfo > &mat_infos) override
Infos de dépendances.
void addVariableRef(MeshMaterialVariableRef *var_ref) override
Ajoute une référence à cette variable.
IMeshMaterialVariableComputeFunction * computeFunction() override
Fonction utilisée pour mettre à jour la variable.
void setKeepOnChange(bool v) override
Indique si on souhaite conserver la valeur de la variable apres un changement de la liste des matéria...
void addDepend(IMeshMaterialVariable *var) override
Ajoute var à la liste des dépendances.
void removeDepend(IMeshMaterialVariable *var) override
Supprime var de la liste des dépendances.
IVariable * materialVariable(IMeshMaterial *mat) override
Variable contenant les valeurs spécifiques du matériau mat.
void setComputeFunction(IMeshMaterialVariableComputeFunction *v) override
Positionne la fonction de recalcule de la variable.
String name() const override
Nom de la variable.
MatVarSpace space() const override
Espace de définition de la variable (matériau+milieu ou milieu uniquement)
static SmallSpan< const Int32 > _toInt32Indexes(SmallSpan< const MatVarIndex > indexes)
Convertit une vue de MatVarIndex en vue de Int32.
bool keepOnChange() const override
Indique si on souhaite conserver la valeur de la variable apres un changement de la liste des matéria...
Arguments des méthodes de copie entre valeurs partielles et globales.
Informations sur une dépendance de variable.
Informations sur une dépendance de variable.
Vue constante d'un tableau de type T.
Interface du gestionnaire de traces.
Exception lorsqu'une fonction n'est pas implémentée.
Chaîne de caractères unicode.
RunCommand makeCommand(const RunQueue &run_queue)
Créé une commande associée à la file run_queue.
Active toujours les traces dans les parties Arcane concernant les matériaux.
MatVarSpace
Espace de définition d'une variable matériau.