14#include "arcane/utils/Array.h"
15#include "arcane/utils/ITraceMng.h"
17#include "arcane/Timer.h"
18#include "arcane/VariableTypes.h"
19#include "arcane/IParallelMng.h"
20#include "arcane/ISerializer.h"
21#include "arcane/SerializeMessage.h"
22#include "arcane/IItemFamily.h"
24#include "arcane/impl/GetVariablesValuesParallelOperation.h"
37GetVariablesValuesParallelOperation::
38GetVariablesValuesParallelOperation(IParallelMng* pm)
46GetVariablesValuesParallelOperation::
47~GetVariablesValuesParallelOperation()
54IParallelMng* GetVariablesValuesParallelOperation::
57 return m_parallel_mng;
63void GetVariablesValuesParallelOperation::
73 _getVariableValuesSequential(variable,
unique_ids,values);
84 trace->
fatal() <<
"MpiParallelDispatchT::getVariableValues() "
85 <<
"the variable '" << variable.
name() <<
"' is not defined "
89 trace->
fatal() <<
"MpiParallelDispatchT::getVariableValues() "
90 <<
"the arrays 'unique_ids' and 'values' don't have the same "
91 <<
"number of elements (respectively "
94 trace->
fatal() <<
"MpiParallelDispatchT::getVariableValues() "
95 <<
"the arrays 'unique_ids' and 'sub_domains_ids' don't have the same "
96 <<
"number of elements (respectively "
102 for( Integer i=0; i<
nb_item; ++i ){
104 if (
sd==NULL_SUB_DOMAIN_ID)
108 for( Integer i=0; i<
nb_item; ++i ){
121 Integer n =
b->second.m_unique_ids.size();
148 s->
setMode(ISerializer::ModeReserve);
157 s->
setMode(ISerializer::ModePut);
173 for( Integer i=0, is=
messages.size(); i<is; ++i ){
183 s->
setMode(ISerializer::ModeGet);
190 for( Integer z=0; z<nb; ++z ){
198 s2->setMode(ISerializer::ModeReserve);
201 s2->allocateBuffer();
202 s2->setMode(ISerializer::ModePut);
221 s->
setMode(ISerializer::ModeGet);
224 Int32
sender =
sm->destination().value();
228 for( Int64 z=0; z<nb; ++z )
238 Int64 nb =
h.m_unique_ids.largeSize();
241 for( Int64 z=0; z<nb; ++z ){
243 values[indexes[z]] = variable[item];
260 trace->
pinfo() <<
" Incorrect values ref=" <<
ref_values[i] <<
" v=" << values[i];
273void GetVariablesValuesParallelOperation::
282 _getVariableValuesSequential(variable,
unique_ids,values);
289 trace->
fatal() <<
"MpiParallelDispatchT::getVariableValues() "
290 <<
"the variable '" << variable.
name() <<
"' is not defined "
293 if (size!=values.
size())
294 trace->
fatal() <<
"MpiParallelDispatchT::getVariableValues() "
295 <<
"the arrays 'unique_ids' and 'values' don't have the same "
296 <<
"number of elements (respectivemely "
297 << size <<
" and " << values.
size() <<
").";
310 _getVariableValues(variable,
unique_ids,values);
314 for( Integer i=0; i<
nb_phase; ++i ){
315 Integer first = (i*size) /
nb_phase;
316 Integer last = ((i+1)*size) /
nb_phase;
319 Integer n = last - first;
321 trace->
debug() <<
"GetVariableValue: first=" << first <<
" last=" << last <<
" n=" << n
328 trace->
fatal() <<
"MpiParallelMng::getVariableValue() Internal error in size: "
329 <<
" size=" << size <<
" done=" <<
nb_done;
337void GetVariablesValuesParallelOperation::
340 for( Integer i=0, is=
messages.size(); i<is; ++i )
348template<
class Type>
void GetVariablesValuesParallelOperation::
349_getVariableValues(ItemVariableScalarRefT<Type>& variable,
350 Int64ConstArrayView unique_ids,
351 ArrayView<Type> values)
353 IParallelMng* pm = m_parallel_mng;
354 ItemGroup group = variable.itemGroup();
356 IItemFamily* item_family = group.itemFamily();
360 UniqueArray<Int64> dummy_unique_ids;
361 UniqueArray<Real> dummy_values;
362 if (unique_ids.empty()){
363 dummy_unique_ids.resize(1);
364 dummy_values.resize(1);
365 dummy_unique_ids[0] = NULL_ITEM_ID;
366 unique_ids = dummy_unique_ids.view();
367 values = dummy_values.view();
385 Integer all_size = all_unique_ids.size();
387 item_family->itemsUniqueIdToLocalId(all_local_ids,all_unique_ids,
false);
389 ConstArrayView<Type> variable_a(variable.asArray());
390 UniqueArray<Type> all_values(all_size);
392 msg->debug() <<
"MpiParallelMng::_getVariableValues(): size=" << all_size
393 <<
" values_size=" <<
sizeof(
Type)*all_size;
397 Type max_value = std::numeric_limits<Type>::max();
398 ItemInfoListView internal_items(item_family);
400 for( Integer i=0; i<all_size; ++i ){
401 Integer lid = all_local_ids[i];
402 if (lid==NULL_ITEM_ID)
403 all_values[i] = max_value;
405 all_values[i] = (internal_items[lid].isOwn()) ? variable_a[lid] : max_value;
410 pm->
reduce(Parallel::ReduceMin,all_values);
419template<
class Type>
void GetVariablesValuesParallelOperation::
420_getVariableValuesSequential(ItemVariableScalarRefT<Type>& variable,
421 Int64ConstArrayView unique_ids,
422 ArrayView<Type> values)
424 ITraceMng* trace = m_parallel_mng->traceMng();
425 ItemGroup group = variable.itemGroup();
427 trace->fatal() <<
"SequentialParallelDispatchT::getVariableValues() "
428 <<
"the variable '" << variable.name() <<
"' is not defined "
431 IItemFamily* family = group.itemFamily();
432 Integer size = unique_ids.size();
433 if (size!=values.size())
434 trace->fatal() <<
"SequentialParallelDispatchT::getVariableValues() "
435 <<
"the arrays 'unique_ids' and 'values' don't have the same "
436 <<
"number of elements (respectively "
437 << size <<
" and " << values.size() <<
").";
441 family->itemsUniqueIdToLocalId(local_ids,unique_ids);
442 ConstArrayView<Type> variable_a(variable.asArray());
443 for( Integer i=0; i<size; ++i )
444 values[i] = variable_a[local_ids[i]];
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Interface d'une famille d'entités.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual ITimeStats * timeStats() const =0
Gestionnaire de statistiques associé (peut être nul)
virtual void processMessages(ConstArrayView< ISerializeMessage * > messages)=0
Exécute les opérations des messages messages.
virtual void allGatherVariable(ConstArrayView< char > send_buf, Array< char > &recv_buf)=0
Effectue un regroupement sur tous les processeurs.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual void scatterVariable(ConstArrayView< char > send_buf, ArrayView< char > recv_buf, Integer root)=0
Scinde un tableau sur plusieurs processeurs.
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
virtual IItemFamily * itemFamily() const =0
Famille d'entité associée.
Groupe d'entités de maillage.
bool null() const
true is le groupe est le groupe nul
Vue sur une liste pour obtenir des informations sur les entités.
Classe de base d'un élément de maillage.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Message utilisant un SerializeBuffer.
Positionne la phase de l'action en cours d'exécution.
IVariable * variable() const
Variable associée.
String name() const
Nom de la variable.
Vue modifiable d'un tableau d'un type T.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
constexpr const_pointer data() const noexcept
Pointeur sur le début de la vue.
Vue constante d'un tableau de type T.
Exception lorsqu'une erreur fatale est survenue.
Interface d'un sérialiseur.
virtual void allocateBuffer()=0
Alloue la mémoire du sérialiseur.
virtual void reserveSpan(eDataType dt, Int64 n)=0
Réserve de la mémoire pour n valeurs de dt.
virtual void putSpan(Span< const Real > values)
Ajoute le tableau values.
virtual void getSpan(Span< Real > values)
Récupère le tableau values.
virtual Int64 getInt64()=0
Récupère une taille.
virtual void reserve(eDataType dt, Int64 n)=0
Réserve de la mémoire pour n objets de type dt.
virtual void setMode(eMode new_mode)=0
Positionne le fonctionnement actuel.
virtual void putInt64(Int64 value)=0
Ajoute l'entier value.
Interface du gestionnaire de traces.
virtual TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium)=0
Flot pour un message de debug.
virtual TraceMessage pinfo()=0
Flot pour un message d'information parallèle.
virtual TraceMessage info()=0
Flot pour un message d'information.
virtual TraceMessage fatal()=0
Flot pour un message d'erreur fatale.
Interface d'un message de sérialisation entre IMessagePassingMng.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
@ DT_Int64
Donnée de type entier 64 bits.
@ DT_Real
Donnée de type réel.
Int32 Integer
Type représentant un entier.