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