Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
IMultiReduce.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/* IMultiReduce.h (C) 2000-2016 */
9/* */
10/* Gestion de réductions multiples. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_PARALLEL_IMULTIREDUCE_H
13#define ARCANE_PARALLEL_IMULTIREDUCE_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Array.h"
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21
22ARCANE_BEGIN_NAMESPACE
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
27/*!
28 * \brief Classe gérant une réduction d'une somme de valeur.
29 *
30 * Les instances de cette classe doivent être créés via IMultiReduce::getSumOfReal().
31 * L'utilisateur doit accumuler les valeurs via l'appel à add(). Après exécution
32 * de la réduction via IMultiReduce::execute(), il est possible
33 * de récupérer la valeur réduite via reducedValue().
34 * \sa IMultiReduce
35 */
36class ARCANE_CORE_EXPORT ReduceSumOfRealHelper
37{
38 public:
39
40 ReduceSumOfRealHelper(bool is_strict)
41 : m_reduced_value(0.0), m_is_strict(is_strict)
42 {
43 if (!m_is_strict)
44 m_values.add(0.0);
45 }
46
47 public:
48
49 //! Ajoute la valeur \a v
50 void add(Real v)
51 {
52 if (m_is_strict)
53 m_values.add(v);
54 else
55 m_values[0] += v;
56 }
57
58 //! Supprime les valeurs accumulées.
59 void clear()
60 {
61 m_values.clear();
62 }
63
64 //! Liste des valeurs accumulées.
65 RealConstArrayView values() const { return m_values; }
66
67 //! Valeur réduite
68 Real reducedValue() const { return m_reduced_value; }
69
70 //! Positionne la valeur réduite.
71 void setReducedValue(Real v) { m_reduced_value = v; }
72
73 private:
74 SharedArray<Real> m_values;
75 Real m_reduced_value;
76 bool m_is_strict;
77};
78
79/*---------------------------------------------------------------------------*/
80/*---------------------------------------------------------------------------*/
81/*!
82 * \brief Gestion de réductions multiples.
83 *
84 * Pour l'instant, seule les réductions de type 'somme' sur des réels
85 * est supporté.
86 *
87 * Il est possible de spécifier un mode strict, via setStrict(), qui
88 * permet que ces sommes soient identiques quelles que soit l'ordre
89 * des opérations. Cela nécessite cependant de stocker toutes les valeurs
90 * intermédiaire et donc est couteux en mémoire et non extensible car
91 * un seul processeur se chargera du calcul de la somme.
92 *
93 * Le mode strict doit être spécifié avant la création des réductions.
94 * Le mode strict est automatiquement actif si la variable d'environnement
95 * ARCANE_STRICT_REDUCE est positionnée.
96 */
97class ARCANE_CORE_EXPORT IMultiReduce
98{
99 public:
100
101 virtual ~IMultiReduce(){} //!< Libère les ressources
102
103 public:
104
105 static IMultiReduce* create(IParallelMng* pm);
106
107 public:
108
109 //! Exécute les réductions
110 virtual void execute() =0;
111
112 //! Indique si on utilise le mode strict
113 virtual bool isStrict() const =0;
114
115 //! Positionne le mode strict
116 virtual void setStrict(bool is_strict) =0;
117
118 public:
119
120 /*!
121 * \brief Retourne le gestionnaire de nom \a name.
122 * S'il n'existe pas de gestionnaire de nom \a name il est créé.
123 * L'objet retourné reste la propriété de cette instance et ne doit pas
124 * être détruit explicitement. Il le sera lorsque cette instance sera
125 * détruite.
126 */
127 virtual ReduceSumOfRealHelper* getSumOfReal(const String& name) =0;
128};
129
130/*---------------------------------------------------------------------------*/
131/*---------------------------------------------------------------------------*/
132
133ARCANE_END_NAMESPACE
134
135/*---------------------------------------------------------------------------*/
136/*---------------------------------------------------------------------------*/
137
138#endif
139
Gestion de réductions multiples.
virtual void setStrict(bool is_strict)=0
Positionne le mode strict.
virtual ReduceSumOfRealHelper * getSumOfReal(const String &name)=0
Retourne le gestionnaire de nom name. S'il n'existe pas de gestionnaire de nom name il est créé....
virtual bool isStrict() const =0
Indique si on utilise le mode strict.
virtual ~IMultiReduce()
Libère les ressources.
virtual void execute()=0
Exécute les réductions.
Interface du gestionnaire de parallélisme pour un sous-domaine.
Classe gérant une réduction d'une somme de valeur.
RealConstArrayView values() const
Liste des valeurs accumulées.
Real reducedValue() const
Valeur réduite.
void setReducedValue(Real v)
Positionne la valeur réduite.
void add(Real v)
Ajoute la valeur v.
void clear()
Supprime les valeurs accumulées.
Vue constante d'un tableau de type T.
Vecteur 1D de données avec sémantique par référence.
Chaîne de caractères unicode.