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"
49#include "arcane/accelerator/RunCommandLoop.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::
96copyToBuffer(SmallSpan<const MatVarIndex> matvar_indexes,
97 Span<std::byte> bytes, RunQueue* queue)
const
99 m_variable->_copyToBuffer(matvar_indexes,bytes,queue);
105void MeshMaterialVariablePrivate::
106copyFromBuffer(SmallSpan<const MatVarIndex> matvar_indexes,
107 Span<const std::byte> bytes, RunQueue* queue)
109 m_variable->_copyFromBuffer(matvar_indexes,bytes,queue);
115Ref<IData> MeshMaterialVariablePrivate::
116internalCreateSaveDataRef(Integer nb_value)
118 return m_variable->_internalCreateSaveDataRef(nb_value);
124void MeshMaterialVariablePrivate::
125saveData(IMeshComponent* component,IData* data)
127 m_variable->_saveData(component,data);
133void MeshMaterialVariablePrivate::
134restoreData(IMeshComponent* component,IData* data,Integer data_index,
135 Int32ConstArrayView ids,
bool allow_null_id)
137 m_variable->_restoreData(component,data,data_index,ids,allow_null_id);
143void MeshMaterialVariablePrivate::
144copyBetweenPartialAndGlobal(
const CopyBetweenPartialAndGlobalArgs& args)
146 m_variable->_copyBetweenPartialAndGlobal(args);
152void MeshMaterialVariablePrivate::
153initializeNewItemsWithZero(InitializeWithZeroArgs& args)
155 m_variable->_initializeNewItemsWithZero(args);
161void MeshMaterialVariablePrivate::
162syncReferences(
bool check_resize)
164 m_variable->_syncReferences(check_resize);
170void MeshMaterialVariablePrivate::
171resizeForIndexer(ResizeVariableIndexerArgs& args)
173 m_variable->_resizeForIndexer(args);
182MeshMaterialVariable::
183MeshMaterialVariable(
const MaterialVariableBuildInfo& v,MatVarSpace mvs)
184: m_p(new MeshMaterialVariablePrivate(v,mvs,this))
192MeshMaterialVariable::
193~MeshMaterialVariable()
201void MeshMaterialVariable::
209 Mutex::ScopedLock sl(m_p->materialMng()->variableLock());
210 ++m_p->m_nb_reference;
216void MeshMaterialVariable::
221 ref->setNextReference(m_p->m_first_reference);
222 if (m_p->m_first_reference){
226 _list->setPreviousReference(ref);
229 ref->setPreviousReference(
nullptr);
231 m_p->m_first_reference = ref;
237void MeshMaterialVariable::
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);
282firstReference()
const
284 return m_p->m_first_reference;
303 return m_p->m_refs[index]->variable();
309void MeshMaterialVariable::
310setKeepOnChange(
bool v)
312 m_p->m_keep_on_change = v;
318bool MeshMaterialVariable::
321 return m_p->m_keep_on_change;
327void MeshMaterialVariable::
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){
374void MeshMaterialVariable::
385 return m_p->m_modified_times[id];
388void MeshMaterialVariable::
394void MeshMaterialVariable::
400void MeshMaterialVariable::
407void MeshMaterialVariable::
413void MeshMaterialVariable::
419void MeshMaterialVariable::
426void MeshMaterialVariable::
429 m_p->m_compute_function = v;
435 return m_p->m_compute_function.get();
438void MeshMaterialVariable::
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::
485_copyToBuffer(SmallSpan<const MatVarIndex> matvar_indexes,
486 Span<std::byte> bytes, RunQueue* queue)
const
488 const Integer one_data_size = dataTypeSize();
489 SmallSpan<const Int32> indexes(_toInt32Indexes(matvar_indexes));
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 MemoryUtils::copyWithIndexedSource(destination_buffer,source_view,indexes,queue);
499void MeshMaterialVariable::
500_copyFromBuffer(SmallSpan<const MatVarIndex> matvar_indexes,
501 Span<const std::byte> bytes, RunQueue* queue)
504 SmallSpan<const Int32> indexes(_toInt32Indexes(matvar_indexes));
505 const Int32 nb_item = matvar_indexes.size();
506 MutableMultiMemoryView destination_view(m_views_as_bytes.view(),one_data_size);
508 MemoryUtils::copyWithIndexedDestination(destination_view, 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();
525 ARCANE_CHECK_ACCESSIBLE_POINTER(queue, output.data());
526 ARCANE_CHECK_ACCESSIBLE_POINTER(queue, input.data());
527 ARCANE_CHECK_ACCESSIBLE_POINTER(queue, input_indexes.data());
528 ARCANE_CHECK_ACCESSIBLE_POINTER(queue, output_indexes.data());
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_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fichier contenant les déclarations concernant le modèle de programmation par échange de message.
Fonctions de gestion mémoire et des allocateurs.
#define RUNCOMMAND_LOOP1(iter_name, x1,...)
Boucle 1D sur accélérateur avec arguments supplémentaires.
Classe de base des vecteurs 1D de données.
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.
virtual Int32 id() const =0
Identifiant du composant.
virtual IMeshComponentInternal * _internalApi()=0
API interne.
Interface de la classe fonctor de recalcul d'une variable.
virtual void execute(IMeshMaterial *mat)=0
Exécute la fonction de calcul.
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.
Représente un index sur les variables matériaux et milieux.
Classe de base des références aux variables matériaux.
MeshMaterialVariableRef * nextReference()
Référence suivante (ou null) sur variable()
MeshMaterialVariableRef * previousReference()
Référence précédente (ou null) sur variable()
String name() const override
Nom de la variable.
Informations sur une dépendance de variable.
IMeshMaterialVariable * variable() const
Variable.
Vue d'un tableau d'éléments de type T.
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
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.
MemoryAllocationOptions getAllocatorForMostlyReadOnlyData()
Allocateur par défaut pour les données essentiellement en lecture.
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.
ConstMemoryView makeConstMemoryView(const void *ptr, Int32 datatype_size, Int64 nb_element)
Créé une vue mémoire en lecture seule.
std::int32_t Int32
Type entier signé sur 32 bits.
Fonctions utilitaires de gestion mémoire.