Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
IVariable.h
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/* IVariable.h (C) 2000-2024 */
9/* */
10/* Interface de la classe Variable. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_IVARIABLE_H
13#define ARCANE_CORE_IVARIABLE_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Ref.h"
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23namespace Arcane
24{
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29class IModule;
30class IVariableMng;
31class VariableRef;
32class IDataReader;
33class IDataWriter;
34class VariableMng;
35class Module;
36class IVariableComputeFunction;
37class IObservable;
38class IDataOperation;
39class IMemoryAccessTrace;
40class IData;
41class VariableDependInfo;
42class VariableMetaData;
43
44/*---------------------------------------------------------------------------*/
45/*---------------------------------------------------------------------------*/
46/*!
47 \internal
48
49 \brief Interface d'une variable.
50
51 Par défaut, c'est la classe Variable qui implémente cette interface.
52 */
53class ARCANE_CORE_EXPORT IVariable
54{
55 public:
56
57 //! Type des dépendances
59 {
60 DPT_PreviousTime,
61 DPT_CurrentTime
62 };
63
64 public:
65
66 /*!
67 * \brief Propriétés d'une variable.
68 */
69 enum
70 {
71 //! Indique que la variable ne doit pas être sauvegardée.
72 PNoDump = (1 << 0),
73
74 /*!
75 * \brief Indique que la variable n'est pas nécessairement synchronisée.
76 *
77 * Cela signifie qu'il est normal que les valeurs de la variable soient
78 * différentes d'un processeur à l'autre sur les mailles fantômes
79 */
80 PNoNeedSync = (1 << 1),
81
82 //! Indique que la variable est tracée (uniquement en mode trace)
83 PHasTrace = (1 << 2),
84
85 /*! \brief Indique que la valeur de la variable est dépendante du sous-domaine.
86 *
87 * Cela signifie entre autre que la valeur de la variable est différente
88 * dès que le nombre de sous-domaines varie. C'est par exemple le cas
89 * de la variable contenant le numéro du sous-domaine propriétaire d'une entité.
90 */
91 PSubDomainDepend = (1 << 3),
92
93 /*! \brief Indique que la variable est privée au sous-domaine.
94 *
95 * Cela signifie que la variable est dépendante du sous-domaine et notamment
96 * qu'elle n'existe pas forcément sur tout les sous-domaines. Cette
97 * propriété ne peut pas être positionnée pour les variables du maillage.
98 */
99 PSubDomainPrivate = (1 << 4),
100
101 /*! \brief Indique que la valeur de la variable est dépendante de l'exécution
102 *
103 * Les valeurs de ces variables changent entre deux exécutions. C'est par
104 * exemple le cas d'une variable contenant le temps CPU utilisé.
105 */
106 PExecutionDepend = (1 << 5),
107
108 /*! \brief Indique que la variable est privée
109 *
110 * Une variable privée ne peut pas posséder plus d'une référence.
111 * Cette propriété ne peut être positionner que lors de la création de la
112 * variable
113 */
114 PPrivate = (1 << 6),
115
116 /*! \brief Indique que la variable est temporaire
117 *
118 * Une variable temporaire est comme son nom l'indique temporaire. Elle
119 * ne peut pas être sauvée, n'est pas transférée en cas d'équilibrage
120 * du maillage (mais peut être synchronisée) et n'est pas sauvée en
121 * cas de retour arrière.
122 *
123 * Une variable temporaire qui n'est plus utilisée (aucune référence dessus)
124 * peut être désallouée.
125 */
126 PTemporary = (1 << 7),
127
128 /*! \brief Indique que la variable ne doit pas être restaurée.
129 *
130 * Une variable de ce type n'est pas sauvegardée ni restorée en cas
131 * de retour-arrière.
132 */
133 PNoRestore= (1 << 8),
134
135 /*! \brief Indique que la variable ne doit pas être échangée.
136 *
137 * Une variable de ce type n'est pas échangée lors d'un repartitionnement
138 * de maillage par exemple. Cela permet d'éviter l'envoie de données
139 * inutiles si cette variable n'est utilisée que temporairement ou
140 * qu'elle est recalculée dans un des points d'entrée appelé
141 * suite à un repartitionnement.
142 */
143 PNoExchange= (1 << 9),
144
145 /*!
146 * \brief Indique que la variable est persistante.
147 *
148 * Une variable persistante n'est pas détruite s'il n'existe plus de référence dessus.
149 */
150 PPersistant = (1 << 10),
151
152 /*!
153 * \brief Indique que la variable n'a pas forcément la même valeur
154 * entre les réplicas.
155 *
156 * Cela signifie qu'il est normal que les valeurs de la variable soient
157 * différentes sur les mêmes sous-domaines des autres réplicas.
158 */
159 PNoReplicaSync = (1 << 11)
160 };
161
162 public:
163
164 friend class VariableMng;
165
166 public:
167
168 virtual ~IVariable() = default; //!< Libère les ressources
169
170 public:
171
172 //! Sous-domaine associé à la variable (TODO rendre obsolète fin 2023)
173 virtual ISubDomain* subDomain() =0;
174
175 public:
176
177 //! Gestionnaire de variable associé à la variable
178 virtual IVariableMng* variableMng() const =0;
179
180 //! Taille mémoire (en Koctet) utilisée par la variable
181 virtual Real allocatedMemory() const =0;
182
183 //! Nom de la variable
184 virtual String name() const =0;
185
186 //! Nom complet de la variable (avec le préfixe de la famille)
187 virtual String fullName() const =0;
188
189 //! Type de la donnée gérée par la variable (Real, Integer, ...)
190 virtual eDataType dataType() const =0;
191
192 /*! \brief Type des entités du maillage sur lequel repose la variable.
193 *
194 Pour les variables scalaire ou tableau, il n'y a pas de type et la
195 méthode retourne #IK_Unknown.
196 Pour les autres variables, retourne le type de l'élément de
197 maillage (Node, Cell, ...), à savoir:
198 - #IK_Node pour les noeuds
199 - #IK_Edge pour les arêtes
200 - #IK_Face pour les faces
201 - #IK_Cell pour les mailles
202 - #IK_DualNode pour les noeuds duals
203 - #IK_Link pour les liens du graphe
204 - #IK_Particle pour les particules
205 */
206 virtual eItemKind itemKind() const =0;
207
208 /*!
209 \brief Dimension de la variable.
210
211 Les valeurs possibles sont les suivantes:
212 - 0 pour une variable scalaire,.
213 - 1 pour une variable tableau mono-dim ou variable scalaire du maillage.
214 - 2 pour une variable tableau bi-dim ou variable tableau du maillage.
215 */
216 virtual Integer dimension() const =0;
217
218 /*!
219 \brief Indique si la variable est un tableau à taille multiple.
220
221 Cette valeur n'est utile que pour les tableaux 2D ou plus.
222 - 0 pour une variable scalaire ou tableau 2D standard.
223 - 1 pour une variable tableau 2D à taille multiple.
224 - 2 pour une variable tableau 2D ancient format (obsolète).
225 */
226 virtual Integer multiTag() const =0;
227
228 /*!
229 \brief Nombre d'éléments de la variable.
230
231 Les valeurs retournées dépendent de la dimension de la variable:
232 - pour une dimension 0, retourne 1,
233 - pour une dimension 1, retourne le nombre d'éléments du tableau
234 - pour une dimension 2, retourne le nombre total d'éléments en sommant
235 le nombre d'éléments par dimension.
236 */
237 virtual Integer nbElement() const =0;
238
239 //! Retourne les propriétés de la variable
240 virtual int property() const =0;
241
242 //! Indique que les propriétés d'une des références à cette variable ont changé (interne)
244
245 /*! \brief Ajoute une référence à cette variable
246 *
247 * \pre \a var_ref ne doit pas déjà référencer une variable.
248 */
249 virtual void addVariableRef(VariableRef* var_ref) =0;
250
251 /*! \brief Supprime une référence à cette variable
252 *
253 * \pre \a var_ref doit référencer cette variable (un appel à addVariableRef()
254 * doit avoir été effectué sur cette variable).
255 */
256 virtual void removeVariableRef(VariableRef* var_ref) =0;
257
258 //! Première réference (ou null) sur cette variable
259 virtual VariableRef* firstReference() const =0 ;
260
261 //! Nombre de références sur cette variable
262 virtual Integer nbReference() const =0;
263
264 public:
265
266 ARCANE_DEPRECATED_REASON("Y2021: This method is a noop")
267 virtual void setTraceInfo(Integer id,eTraceType tt)=0;
268
269 public:
270
271 /*!
272 \brief Positionne le nombre d'éléments pour une variable tableau.
273
274 Lorsque la variable est du type tableau 1D ou 2D, positionne le nombre
275 d'éléments du tableau à \a new_size. Pour un tableau 2D, c'est le
276 nombre d'éléments de la première dimension qui est modifié.
277
278 Cette opération ne doit pas être appelée pour les variables du maillage
279 car le nombre d'éléments est déterminé automatiquement en fonction du nombre
280 d'entités du groupe sur lequel elle s'appuie. Pour ce type de variable,
281 il faut appeler resizeFromGroup().
282
283 Cette opération synchronise les références (syncReferences()).
284 */
285 virtual void resize(Integer new_size) =0;
286
287 /*!
288 \brief Positionne le nombre d'éléments pour une variable du maillage.
289
290 Réalloue la taille de la variable du maillage à partir du groupe
291 sur laquelle elle s'appuie.
292
293 Cette opération n'a d'effet que pour les variables du maillage.
294 Pour les autres, aucun action n'est effectuée.
295
296 Cette opération synchronise les références (syncReferences()).
297 */
298 virtual void resizeFromGroup() =0;
299
300 /*!
301 * \brief Libère l'éventuelle mémoire supplémentaire allouée pour
302 * les données.
303 *
304 * Cette méthode n'est utilie que pour les variables non scalaires
305 */
306 virtual void shrinkMemory() =0;
307
308 //! Positionne les informations sur l'allocation
309 virtual void setAllocationInfo(const DataAllocationInfo& v) = 0;
310
311 //! Informations sur l'allocation
312 virtual DataAllocationInfo allocationInfo() const = 0;
313
314 public:
315
316 /*!
317 * \brief Initialise la variable sur un groupe.
318 *
319 Initialise la variable avec la valeur \a value pour tous les éléments du
320 groupe \a group.
321
322 Cette opération n'est utilisable qu'avec les variables de maillage.
323
324 \param group_name groupe. Il doit correspondre à un groupe existant
325 du type de la variable (par exemple CellGroup pour une variable au maille).
326 \param value valeur d'initialisation. La chaîne doit pouvoir être convertie
327 en le type de la variable.
328
329 \retval true en cas d'erreur ou si la variable n'est pas une variable du
330 maillage.
331 \retval false si l'initialisation est un succès.
332 */
333 virtual bool initialize(const ItemGroup& group,const String& value) =0;
334
335
336 //! @name Opérations de vérification
337 //@{
338 /*! \brief Vérifie si la variable est bien synchronisée.
339 *
340 * Cette opération ne fonctionne que pour les variables de maillage.
341 *
342 * Un variable est synchronisée lorsque ses valeurs sont les mêmes
343 * sur tous les sous-domaines à la fois sur les éléments propres et
344 * les éléments fantômes.
345 *
346 * Pour chaque élément non synchronisé, un message est affiché.
347 *
348 * \param max_print nombre maximum de messages à afficher.
349 * Si 0, aucun élément n'est affiché. Si positif, affiche au plus
350 * \a max_print élément. Si négatif, tous les éléments sont affichés.
351 *
352 * \return le nombre de valeurs différentes de la référence
353 */
354 virtual Integer checkIfSync(Integer max_print=0) =0;
355
356 /*! \brief Vérifie que la variable est identique à une valeur de référence
357 *
358 * Cette opération vérifie que les valeurs de la variable sont identique
359 * à une valeur de référence qui est lu à partir du lecteur \a reader.
360 *
361 * Pour chaque valeur différente de la référence, un message est affiché.
362 *
363 * \param max_print nombre maximum de messages à afficher.
364 * Si 0, aucun élément n'est affiché. Si positif, affiche au plus
365 * \a max_print élément. Si négatif, tous les éléments sont affichés.
366 * \param compare_ghost si vrai, compare les valeurs à la fois sur les entités
367 * propres et les entités fantômes. Sinon, ne fait la comparaison que sur les
368 * entités propres.
369 *
370 * \return le nombre de valeurs différentes de la référence
371 */
372 virtual Integer checkIfSame(IDataReader* reader,Integer max_print,bool compare_ghost) =0;
373
374 /*!
375 * \brief Vérifie si la variable a les mêmes valeurs sur tous les réplicas.
376 *
377 * Compare les valeurs de la variable avec celle du même sous-domaine
378 * des autres réplicas. Pour chaque élément différent,
379 * un message est affiché.
380 *
381 * Cette méthode est collective sur le même sous-domaine des autres réplica.
382 * Il ne faut donc l'appeler que si la variable existe sur tous les sous-domaines
383 * sinon cela provoque un blocage.
384 *
385 * Cette méthode ne fonctionne que pour les variables sur les types numériques.
386 * Dans ce cas, elle renvoie une exception de type NotSupportedException.
387 *
388 * \param max_print nombre maximum de messages à afficher.
389 * Si 0, aucun élément n'est affiché. Si positif, affiche au plus
390 * \a max_print élément. Si négatif, tous les éléments sont affichés.
391 * Pour chaque élément différent est affiché la valeur minimale et
392 * maximale.
393 *
394 * \return le nombre de valeurs différentes de la référence.
395 */
396 virtual Integer checkIfSameOnAllReplica(Integer max_print=0) =0;
397 //@}
398
399 /*!
400 * \brief Synchronise la variable.
401 *
402 La synchronisation ne peut se faire que sur les variables du maillage.
403 */
404 virtual void synchronize() =0;
405
406 // TODO: à rendre virtuelle pure (décembre 2024)
407 /*!
408 * \brief Synchronise la variable sur une liste d'entités.
409 *
410 * La synchronisation ne peut se faire que sur les variables du maillage.
411 * Seules les entités listées dans \a local_ids seront synchronisées. Attention :
412 * une entité présente dans cette liste sur un sous-domaine doit être présente
413 * dans cette liste pour tout autre sous-domaine qui possède cette entité.
414 */
415 virtual void synchronize(Int32ConstArrayView local_ids);
416
417 /*!
418 * \brief Maillage auquel est associé la variable.
419 *
420 * Cette opération n'est significative que pour les variables sur des
421 * entités du maillage.
422 */
423 ARCCORE_DEPRECATED_2020("Use meshHandle() instead")
424 virtual IMesh* mesh() const =0;
425
426 /*!
427 * \brief Maillage auquel est associé la variable.
428 *
429 * Cette opération n'est significative que pour les variables sur des
430 * entités du maillage.
431 */
432 virtual MeshHandle meshHandle() const =0;
433
434 /*!
435 * \brief Groupe du maillage associé.
436 *
437 * \return le groupe du maillage associé si pour une variable du maillage
438 * ou le groupe nul si la variable n'est pas une variable du maillage.
439 *
440 * Si une variable n'est pas utilisée ou pas encore allouée,
441 * la valeur retournée est le group nul.
442 * Cependant, la variable peut quand même être associée à un groupe.
443 * Dans ce cas, il faut utiliser la fonction itemGroupName() pour
444 * récupérer le nom de ce groupe.
445 */
446 virtual ItemGroup itemGroup() const =0;
447
448 //! Nom du groupe d'entité associée.
449 virtual String itemGroupName() const =0;
450
451 /*!
452 * \brief Famille d'entité associée.
453 *
454 * \return la famille associée à la variable ou 0
455 * si la variable n'a pas de famille.
456 *
457 * Si une variable n'est pas utilisée ou pas encore allouée,
458 * la valeur retournée est nulle.
459 * Cependant, la variable peut quand même être associée à une famille.
460 * Dans ce cas, il faut utiliser la fonction itemFamilyName() pour
461 * récupérer le nom de cette famille.
462 */
463 virtual IItemFamily* itemFamily() const =0;
464
465 //! Nom de la famille associée (nul si aucune).
466 virtual String itemFamilyName() const =0;
467
468 //! Nom du maillage associé (nul si aucun).
469 virtual String meshName() const =0;
470
471 /*!
472 * \brief Créé une instance contenant les meta-données de la variable.
473 *
474 * L'instance retournée doit être détruite par l'appel à l'opérateur delete.
475 */
476 ARCANE_DEPRECATED_REASON("Y2024: Use createMetaDataRef() instead")
477 virtual VariableMetaData* createMetaData() const =0;
478
479 //! Créé une instance contenant les meta-données de la variable.
480 virtual Ref<VariableMetaData> createMetaDataRef() const = 0;
481
482 /*!
483 * \brief Synchronise les références.
484 *
485 * Synchronise les valeurs des références (VariableRef) à cette variable
486 * avec la valeur actuelle de la variable. Cette méthode est appelé
487 * automatiquement lorsqu'une variable scalaire est modifiée ou
488 * le nombre d'éléments d'une variable tableau change.
489 */
490 virtual void syncReferences() =0;
491
492 public:
493
494 /*!
495 * \brief Positionne l'état d'utilisation de la variable
496 *
497 * Si \v est faux, la variable devient inutilisable
498 * et toutes les ressources associées sont libérées.
499 *
500 * Si \v est vrai, la variable est considérée comme utilisée et s'il s'agit
501 * d'une variable du maillage et que setItemGroup() n'a pas été appelé, la
502 * variable est allouée sur le groupe de toutes les entités.
503 */
504 virtual void setUsed(bool v) =0;
505
506 //! Etat d'utilisation de la variable
507 virtual bool isUsed() const =0;
508
509
510 /*!
511 * \brief Indique si la variable est partielle.
512 *
513 * Une variable est partielle lorsqu'elle n'est pas définie sur toutes les
514 * entités d'une famille. Dans ce cas, group()!=itemFamily()->allItems().
515 */
516 virtual bool isPartial() const =0;
517
518 public:
519
520 /*!
521 * \brief Copie les valeurs des entités numéros @a source dans les entités
522 * numéro @a destination
523 *
524 * @note Cette opération est interne à Arcane et doit se faire en
525 * conjonction avec la famille d'entité correspondant à cette
526 * variable.
527 *
528 * @param source liste des @b localId source
529 * @param destination liste des @b localId destination
530 */
531 virtual void copyItemsValues(Int32ConstArrayView source,Int32ConstArrayView destination) =0;
532
533 /*!
534 * \brief Copie les moyennes des valeurs des entités numéros
535 * @a first_source et @a second_source dans les entités numéros
536 * @a destination
537 *
538 * @param first_source liste des @b localId de la 1ère source
539 * @param second_source liste des @b localId de la 2ème source
540 * @param destination liste des @b localId destination
541 */
542 virtual void copyItemsMeanValues(Int32ConstArrayView first_source,
543 Int32ConstArrayView second_source,
544 Int32ConstArrayView destination) = 0;
545
546 /*!
547 * \brief Compacte les valeurs de la variable.
548 *
549 * Cette opération est interne à Arcane et doit se faire en
550 * conjonction avec la famille d'entité correspondant à cette
551 * variable.
552 */
553 virtual void compact(Int32ConstArrayView new_to_old_ids) =0;
554
555 //! pH : EXPERIMENTAL
556 virtual void changeGroupIds(Int32ConstArrayView old_to_new_ids) = 0;
557
558 public:
559
560 //! Données associées à la variable
561 virtual IData* data() =0;
562
563 //! Données associées à la variable
564 virtual const IData* data() const =0;
565
566 //! Fabrique de données associées à la variable
567 virtual IDataFactoryMng* dataFactoryMng() const =0;
568
569 //! @name Opérations de sérialisation
570 //@{
571 /*! Sérialize la variable.
572 *
573 * L'opération \a opération n'est significative qu'en lecture (ISerializer::ModeGet)
574 */
575 virtual void serialize(ISerializer* sbuffer,IDataOperation* operation=0) =0;
576
577 /*!
578 * \brief Sérialize la variable pour les identifiants \a ids.
579 *
580 * La sérialisation dépend de la dimension de la variable.
581 * Pour les variables scalaires (dimension=0), rien n'est fait.
582 * Pour les variables tableaux ou du maillage, \a ids correspond a un tableau
583 * d'indirection de la première dimension.
584 *
585 * L'opération \a opération n'est significative qu'en lecture (ISerializer::ModeGet)
586 */
587 virtual void serialize(ISerializer* sbuffer,Int32ConstArrayView ids,IDataOperation* operation=0) =0;
588
589 /*!
590 * \brief Sauve la variable
591 *
592 * \deprecated A remplacer par le code suivant:
593 * \code
594 * IVariable* var;
595 * var->notifyBeginWrite();
596 * writer->write(var,var->data());
597 * \endcode
598 */
599 virtual ARCANE_DEPRECATED_2018 void write(IDataWriter* writer) =0;
600
601 /*!
602 * Relit la variable.
603 *
604 * \deprecated A remplacer par le code suivant:
605 * \code
606 * IVariable* var;
607 * reader->read(var,var->data());
608 * var->notifyEndRead();
609 * \endcode
610 */
611 virtual ARCANE_DEPRECATED_2018 void read(IDataReader* reader) =0;
612
613 /*!
614 * \brief Notifie de la modification externe de data().
615 *
616 * Signale à l'instance la fin d'une opération de lecture qui a modifié
617 * data(). Cette méthode doit donc être appelée dès qu'on a effectué
618 * une modication de data(). Cette méthode déclenche les observables enregistrés
619 * dans readObservable().
620 */
621 virtual void notifyEndRead() =0;
622
623 /*!
624 * \brief Notifie du début d'écriture de data().
625 *
626 * Cette méthode déclenche les observables enregistrés
627 * dans writeObservable().
628 */
629 virtual void notifyBeginWrite() =0;
630
631 /*!
632 * \brief Observable en écriture.
633 *
634 * Les observateurs enregistrés dans cet observable sont appelés
635 * avant d'écrire la variable (opération write()).
636 */
637 virtual IObservable* writeObservable() =0;
638
639 /*! \brief Observable en lecture.
640 *
641 * Les observateurs enregistrés dans cet observable sont appelés
642 * après avoir lu la variable (opération read).
643 */
644 virtual IObservable* readObservable() =0;
645
646 /*! \brief Observable en redimensionnement.
647 *
648 * Les observateurs enregistrés dans cet observable sont appelés
649 * lorsque le nombre d'éléments de la variable change.
650 * C'est le cas par exemple après un remaillage pour une variable aux mailles
651 */
652 virtual IObservable* onSizeChangedObservable() =0;
653 //@}
654
655 //@{ @name Gestion des tags
656 //! Ajoute le tag \a tagname avev la valeur \a tagvalue
657 virtual void addTag(const String& tagname,const String& tagvalue) =0;
658 /*! \brief Supprime le tag \a tagname
659 *
660 * Si le tag \a tagname n'est pas dans la liste, rien ne se passe.
661 */
662 virtual void removeTag(const String& tagname) =0;
663 //! \a true si la variable possède le tag \a tagname
664 virtual bool hasTag(const String& tagname) =0;
665 //! Valeur du tag \a tagname. La chaîne est nulle si le tag n'existe pas.
666 virtual String tagValue(const String& tagname) =0;
667 //@}
668
669 public:
670
671 //! Imprime les valeurs de la variable sur le flot \a o
672 virtual void print(std::ostream& o) const =0;
673
674 public:
675
676 //! @name Gestion des dépendances
677 //@{
678 /*!
679 * \brief Recalcule la variable si nécessaire
680 *
681 * Par le mécanisme de dépendances, cette opération est appelée récursivement
682 * sur toutes les variables dont dépend l'instance. La fonction de recalcul
683 * computeFunction() est ensuite appelée s'il s'avère qu'une des variables
684 * dont elle dépend a été modifiée plus récemment.
685 *
686 * \pre computeFunction() != 0
687 */
688 virtual void update() =0;
689
690 virtual void update(Real wanted_time) =0;
691
692 /*! \brief Indique que la variable vient d'être mise à jour.
693 *
694 * Pour une gestion correcte des dépendances, il faut que cette propriété
695 * soit appelée toutes les fois où la mise à jour d'une variable a été
696 * effectuée.
697 */
698 virtual void setUpToDate() =0;
699
700 //! Temps auquel la variable a été mise à jour
701 virtual Int64 modifiedTime() =0;
702
703 //! Ajoute \a var à la liste des dépendances
704 virtual void addDepend(IVariable* var,eDependType dt) =0;
705
706 //! Ajoute \a var à la liste des dépendances avec les infos de trace \a tinfo
707 virtual void addDepend(IVariable* var,eDependType dt,const TraceInfo& tinfo) =0;
708
709 /*! \brief Supprime \a var de la liste des dépendances
710 */
711 virtual void removeDepend(IVariable* var) =0;
712
713 /*!
714 * \brief Positionne la fonction de recalcul de la variable.
715 *
716 * La fonction spécifiée \a v doit être allouée via l'opérateur new.
717 * Si une fonction de recalcule existait déjà, elle est détruite
718 * (via l'opérateur delete) et remplacée par celle-ci.
719 */
720 virtual void setComputeFunction(IVariableComputeFunction* v) =0;
721
722 //! Fonction utilisée pour mettre à jour la variable
723 virtual IVariableComputeFunction* computeFunction() =0;
724
725 /*!
726 * \brief Infos de dépendances.
727 *
728 * Remplit le tableau \a infos avec les infos de dépendance.
729 */
730 virtual void dependInfos(Array<VariableDependInfo>& infos) =0;
731 //@}
732
733 public:
734
735 ARCANE_DEPRECATED_REASON("Y2021: This method is a noop")
736 virtual IMemoryAccessTrace* memoryAccessTrace() const =0;
737
738 /*!
739 * \brief Indique que la variable est synchronisée.
740 *
741 * Cette opération est collective.
742 */
743 virtual void setIsSynchronized() =0;
744
745 /*!
746 * \brief Indique que la variable est synchronisée sur le group \a item_group
747 *
748 * Cette opération est collective.
749 */
750 virtual void setIsSynchronized(const ItemGroup& item_group) =0;
751
752 public:
753
754 //! Incrémente le compteur de modification et retourne sa valeur avant modification
755 static Int64 incrementModifiedTime();
756
757 public:
758
759 //! API interne à Arcane
760 virtual IVariableInternal* _internalApi() =0;
761};
762
763/*---------------------------------------------------------------------------*/
764/*---------------------------------------------------------------------------*/
765
766} // End namespace Arcane
767
768/*---------------------------------------------------------------------------*/
769/*---------------------------------------------------------------------------*/
770
771#endif
Déclarations de types sur les entités.
Informations sur l'allocation d'une donnée.
Interface de lecture des données d'une variable.
Definition IDataReader.h:41
Interface d'écriture des données d'une variable.
Definition IDataWriter.h:49
Interface d'une donnée.
Definition IData.h:33
Interface d'une famille d'entités.
Interface d'un observable.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
Interface de la classe fonctor de recalcul d'une variable.
Interface du gestionnaire de variables.
virtual Real allocatedMemory() const =0
Taille mémoire (en Koctet) utilisée par la variable.
virtual eDataType dataType() const =0
Type de la donnée gérée par la variable (Real, Integer, ...)
eDependType
Type des dépendances.
Definition IVariable.h:59
virtual String fullName() const =0
Nom complet de la variable (avec le préfixe de la famille)
virtual int property() const =0
Retourne les propriétés de la variable.
virtual eItemKind itemKind() const =0
Type des entités du maillage sur lequel repose la variable.
virtual Integer nbReference() const =0
Nombre de références sur cette variable.
virtual ~IVariable()=default
Libère les ressources.
virtual Integer dimension() const =0
Dimension de la variable.
virtual void notifyReferencePropertyChanged()=0
Indique que les propriétés d'une des références à cette variable ont changé (interne)
virtual VariableRef * firstReference() const =0
Première réference (ou null) sur cette variable.
virtual Integer multiTag() const =0
Indique si la variable est un tableau à taille multiple.
virtual ISubDomain * subDomain()=0
Sous-domaine associé à la variable (TODO rendre obsolète fin 2023)
virtual Integer nbElement() const =0
Nombre d'éléments de la variable.
virtual void addVariableRef(VariableRef *var_ref)=0
Ajoute une référence à cette variable.
virtual String name() const =0
Nom de la variable.
virtual void removeVariableRef(VariableRef *var_ref)=0
Supprime une référence à cette variable.
virtual IVariableMng * variableMng() const =0
Gestionnaire de variable associé à la variable.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
Handle sur un maillage.
Definition MeshHandle.h:47
Informations sur une dépendance de variable.
Meta-données sur une variable.
Référence à une variable.
Definition VariableRef.h:56
Classe de base des vecteurs 1D de données.
Vue constante d'un tableau de type T.
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
eTraceType
Type de trace possible.
Definition DataTypes.h:184
eItemKind
Genre d'entité de maillage.
eDataType
Type d'une donnée.
Definition DataTypes.h:39