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"
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::
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::
99 m_variable->_copyToBuffer(matvar_indexes,bytes,queue);
105void MeshMaterialVariablePrivate::
109 m_variable->_copyFromBuffer(matvar_indexes,bytes,queue);
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::
162syncReferences(
bool check_resize)
164 m_variable->_syncReferences(check_resize);
170void MeshMaterialVariablePrivate::
173 m_variable->_resizeForIndexer(args);
182MeshMaterialVariable::
185, m_views_as_bytes(
MemoryUtils::getAllocatorForMostlyReadOnlyData())
192MeshMaterialVariable::
193~MeshMaterialVariable()
210 ++m_p->m_nb_reference;
222 if (m_p->m_first_reference){
231 m_p->m_first_reference = ref;
247 if (m_p->m_first_reference==tmp)
248 m_p->m_first_reference = m_p->m_first_reference->nextReference();
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;
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()){
341 bool need_update =
false;
342 Int64 modified_time = m_p->m_modified_times[mat_id];
345 if (mt>modified_time){
353 if (mt>modified_time){
385 return m_p->m_modified_times[id];
429 m_p->m_compute_function = v;
435 return m_p->m_compute_function.get();
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::
490 const Int32 nb_item = matvar_indexes.
size();
491 MutableMemoryView destination_buffer(makeMutableMemoryView(bytes.
data(),one_data_size,nb_item));
492 ConstMultiMemoryView source_view(m_views_as_bytes.view(),one_data_size);
493 source_view.copyToIndexes(destination_buffer,indexes,queue);
499void MeshMaterialVariable::
505 const Int32 nb_item = matvar_indexes.
size();
506 MutableMultiMemoryView destination_view(m_views_as_bytes.view(),one_data_size);
507 ConstMemoryView source_buffer(makeConstMemoryView(bytes.
data(),one_data_size,nb_item));
508 destination_view.copyFromIndexes(source_buffer,indexes,queue);
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];
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.
Fonctions de gestion mémoire et des allocateurs.
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.
Tableau d'items de types quelconques.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Interface du gestionnaire de traces.
Interface d'une variable.
virtual Int64 modifiedTime()=0
Temps auquel la variable a été mise à jour.
static Int64 incrementModifiedTime()
Incrémente le compteur de modification et retourne sa valeur avant modification.
virtual void update()=0
Recalcule la variable si nécessaire.
Arguments des méthodes de copie entre valeurs partielles et globales.
virtual MeshMaterialVariableIndexer * variableIndexer() const =0
Indexeur pour accéder aux variables partielles.
Interface d'un composant (matériau ou milieu) d'un maillage.
virtual Int32 id() const =0
Identifiant du composant.
virtual IMeshComponentInternal * _internalApi()=0
API interne.
virtual ITraceMng * traceMng()=0
Gestionnaire de traces.
Interface de la classe fonctor de recalcul d'une variable.
virtual void execute(IMeshMaterial *mat)=0
Exécute la fonction de calcul.
API interne Arcane de 'IMeshMaterialVariable'.
Interface d'une variable matériau d'un maillage.
virtual Int64 modifiedTime(IMeshMaterial *mat)=0
Temps auquel la variable a été mise à jour.
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.
Classe de base des références aux variables matériaux.
MeshMaterialVariableRef * nextReference()
Référence suivante (ou null) sur variable()
void setNextReference(MeshMaterialVariableRef *v)
Positionne la référence suivante.
MeshMaterialVariableRef * previousReference()
Référence précédente (ou null) sur variable()
void setPreviousReference(MeshMaterialVariableRef *v)
Positionne la référence précédente.
Classe de base des variables matériaux.
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.
IMeshMaterialVariable * variable() const
Variable.
Exception lorsqu'une fonction n'est pas implémentée.
Référence à une instance.
Vue d'un tableau d'éléments de type T.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
Vue d'un tableau d'éléments de type T.
Chaîne de caractères unicode.
Informations sur une dépendance de variable.
IVariable * variable() const
Variable.
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.
Espace de noms pour les fonctions de gestion mémoire et des allocateurs.
ARCANE_DATATYPE_EXPORT Integer dataTypeSize(eDataType type)
Taille du type de donnée type (qui doit être différent de DT_String)
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
std::int32_t Int32
Type entier signé sur 32 bits.