Arcane  v3.16.4.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
IParticleExchanger.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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/* IParticleExchanger.h (C) 2000-2025 */
9/* */
10/* Interface d'un échangeur de particules. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_IPARTICLEEXCHANGER_H
13#define ARCANE_CORE_IPARTICLEEXCHANGER_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23namespace Arcane
24{
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28/*!
29 * \brief Interface d'un échangeur de particules.
30 *
31 * Cette classe sert à échanger des particules entre sous-domaines en
32 * plusieurs étapes et est en général utilisée par des codes
33 * de trajectographie. Si l'on souhaite faire un échange en une fois,
34 * il faut utiliser IItemFamily::exchangeItems().
35 *
36 * Avant tout, une instance doit être initialisée avec une famille
37 * de particules via initialize().
38 *
39 * Pour procéder à un échange, il faut d'abord initialiser
40 * l'échange via beginNewExchange() avec comme argument le nombre
41 * de particules du sous-domaine concernées par l'échange.
42 * Il faut ensuite appeler exchangeItems() pour chaque phase
43 * d'échange de particules. A chaque appel à exchangeItems(), il
44 * faut spécifier le nombre de particules ne participant plus
45 * à l'échange. Lorsqu'il n'y a plus de particules concernée,
46 * exchangeItems() return true et l'échange est terminé.
47 * Il est possible de recommencer tout le processus via
48 * un nouvel appel à beginNewExchange().
49 *
50 * Entre deux phases d'un échange, il est possible d'indiquer
51 * que de nouvelles particules vont participer via
52 * addNewParticles()
53 *
54 *
55 */
56class ARCANE_CORE_EXPORT IParticleExchanger
57{
58 public:
59
60 virtual ~IParticleExchanger() = default; //!< Libère les ressources
61
62 public:
63
64 virtual void build() = 0;
65
66 //! Initialize l'échangeur pour la famille \a item_family.
67 virtual void initialize(IItemFamily* item_family) = 0;
68
69 public:
70
71 /*!
72 * \brief Commence un nouvel échange de particules.
73 *
74 * \a nb_particule est le nombre de particules du sous-domaine qui vont
75 * prendre part à un éventuel échange.
76 *
77 * Cette méthode est collective et doit être appelée par tout les sous-domaines.
78 */
79 virtual void beginNewExchange(Integer nb_particle) = 0;
80
81 /*!
82 * \brief Échange des particules entre sous-domaines.
83 *
84 * Cette opération envoie les particules de la famille \a item_family dont les
85 * indices locaux sont donnés par la liste \a local_ids aux sous-domaines
86 * specifiés par \a sub_domains_to_send, et réceptionne de ces mêmes sous-domaines celles
87 * dont ce sous-domaine est propriétaire. Les particules envoyées sont supprimées
88 * de la famille \a item_family et celles recues ajoutées.
89 *
90 * Les variables reposant sur la famille \a item_family sont transférées
91 * en même temps que les particules.
92 *
93 * Cette opération est collective et bloquante.
94 *
95 * Si \a item_group n'est pas nul, il contiendra en retour la liste des
96 * nouvelles entités.
97 *
98 * Si \a wait_functor n'est pas nul, le functor est appelé pendant l'envoie
99 * et la réception des messages. Il est alors possible de faire des opérations.
100 * Les opérations ne doivent pas utiliser de particules, ni des variables sur
101 * les particules de la famille échangée.
102 *
103 * \retval \a true si toutes les phases d'échange sont terminés
104 * \retval \a false sinon
105 *
106 * \todo améliorer la doc
107 */
108 virtual ARCANE_DEPRECATED bool exchangeItems(Integer nb_particle_finish_exchange,
109 Int32ConstArrayView local_ids,
110 Int32ConstArrayView sub_domains_to_send,
111 ItemGroup item_group,
112 IFunctor* wait_functor) = 0;
113
114 /*!
115 * \brief Échange des particules entre sous-domaines.
116 *
117 * Cette opération envoie les particules de la famille \a item_family dont les
118 * indices locaux sont donnés par la liste \a local_ids aux sous-domaines
119 * specifiés par \a sub_domains_to_send, et réceptionne de ces mêmes sous-domaines celles
120 * dont ce sous-domaine est propriétaire. Les particules envoyées sont supprimées
121 * de la famille \a item_family et celles recues ajoutées.
122 *
123 * Les variables reposant sur la famille \a item_family sont transférées
124 * en même temps que les particules.
125 *
126 * Cette opération est collective et bloquante.
127 *
128 * Si \a new_particle_local_ids n'est pas nul, il contiendra en retour
129 * le tableau des indices locaux des nouvelles entités.
130 *
131 * Si \a wait_functor n'est pas nul, le functor est appelé pendant l'envoie
132 * et la réception des messages. Il est alors possible de faire des opérations.
133 * Les opérations ne doivent pas utiliser de particules, ni des variables sur
134 * les particules de la famille échangée.
135 *
136 * \retval \a true si toutes les phases d'échange sont terminés
137 * \retval \a false sinon
138 *
139 * \todo améliorer la doc
140 */
141 virtual bool exchangeItems(Integer nb_particle_finish_exchange,
142 Int32ConstArrayView local_ids,
143 Int32ConstArrayView ranks_to_send,
144 Int32Array* new_particle_local_ids,
145 IFunctor* wait_functor) = 0;
146
147 //! \internal
148 virtual void sendItems(Integer nb_particle_finish_exchange,
149 Int32ConstArrayView local_ids,
150 Int32ConstArrayView sub_domains_to_send) = 0;
151
152 //! \internal
153 virtual bool waitMessages(Integer nb_pending_particle,
154 Int32Array* new_particle_local_ids,
155 IFunctor* functor) = 0;
156
157 /*!
158 * \brief Ajoute \a nb_particle dans l'échange actuel.
159 *
160 * Cette méthode permet d'indiquer que de nouvelles particules
161 * vont participer à l'échanger, par exemple suite à leur création.
162 */
163 virtual void addNewParticles(Integer nb_particle) = 0;
164
165 //! Famille associée.
166 virtual IItemFamily* itemFamily() = 0;
167
168 //! Positionne le niveau de verbosité (0 pour aucune message)
169 virtual void setVerboseLevel(Integer level) = 0;
170
171 //! Niveau de verbosité
172 virtual Integer verboseLevel() const = 0;
173
174 //! Gestion de l'asynchronisme (retourne nullptr si fonctionnalité non disponible)
176};
177
178/*---------------------------------------------------------------------------*/
179/*---------------------------------------------------------------------------*/
180
181} // namespace Arcane
182
183/*---------------------------------------------------------------------------*/
184/*---------------------------------------------------------------------------*/
185
186#endif
Déclarations des types généraux de Arcane.
Déclarations de types sur les entités.
Interface d'un échangeur de particules asynchrone.
Interface d'une famille d'entités.
Definition IItemFamily.h:84
Interface d'un échangeur de particules.
virtual void addNewParticles(Integer nb_particle)=0
Ajoute nb_particle dans l'échange actuel.
virtual void setVerboseLevel(Integer level)=0
Positionne le niveau de verbosité (0 pour aucune message)
virtual Integer verboseLevel() const =0
Niveau de verbosité
virtual IAsyncParticleExchanger * asyncParticleExchanger()=0
Gestion de l'asynchronisme (retourne nullptr si fonctionnalité non disponible)
virtual IItemFamily * itemFamily()=0
Famille associée.
virtual void initialize(IItemFamily *item_family)=0
Initialize l'échangeur pour la famille item_family.
virtual void beginNewExchange(Integer nb_particle)=0
Commence un nouvel échange de particules.
virtual ~IParticleExchanger()=default
Libère les ressources.
virtual ARCANE_DEPRECATED bool exchangeItems(Integer nb_particle_finish_exchange, Int32ConstArrayView local_ids, Int32ConstArrayView sub_domains_to_send, ItemGroup item_group, IFunctor *wait_functor)=0
Échange des particules entre sous-domaines.
virtual bool exchangeItems(Integer nb_particle_finish_exchange, Int32ConstArrayView local_ids, Int32ConstArrayView ranks_to_send, Int32Array *new_particle_local_ids, IFunctor *wait_functor)=0
Échange des particules entre sous-domaines.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:569
Array< Int32 > Int32Array
Tableau dynamique à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:214