Arcane  v4.1.9.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
Vector.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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/* Vector.cc (C) 2000-2026 */
9/* */
10/* Vecteur d'algèbre linéraire. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/Array.h"
15#include "arcane/utils/String.h"
16#include "arcane/utils/FatalErrorException.h"
17
18#include "arcane/core/matvec/Vector.h"
19
20/*---------------------------------------------------------------------------*/
21/*---------------------------------------------------------------------------*/
22
23namespace Arcane::MatVec
24{
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29class VectorImpl
30{
31 public:
32
33 VectorImpl(Integer size)
34 : m_values(size)
35 , m_nb_reference(0)
36 {
37 }
38 VectorImpl(Integer size, Real init_value)
39 : m_values(size, init_value)
40 , m_nb_reference(0)
41 {
42 m_values.fill(init_value);
43 }
44 VectorImpl()
45 : m_nb_reference(0)
46 {
47 }
48 VectorImpl(RealConstArrayView v)
49 : m_values(v)
50 , m_nb_reference(0)
51 {
52 }
53 VectorImpl(const VectorImpl& rhs)
54 : m_values(rhs.m_values)
55 , m_nb_reference()
56 {
57 }
58
59 private:
60
61 void operator=(const VectorImpl& rhs);
62
63 public:
64
65 Integer size() const { return m_values.size(); }
66 RealArrayView values() { return m_values; }
67 RealConstArrayView values() const { return m_values; }
68 void dump(std::ostream& o) const
69 {
70 Integer size = m_values.size();
71 o << "(Vector ptr=" << this << " size=" << size << ")\n";
72 for (Integer i = 0; i < size; ++i)
73 o << "[" << i << "]=" << m_values[i] << '\n';
74 //o << ")";
75 }
76 VectorImpl* clone()
77 {
78 return new VectorImpl(m_values);
79 }
80 void copy(const VectorImpl& rhs)
81 {
82 m_values.copy(rhs.m_values);
83 }
84 Real normInf();
85 static Vector readHypre(const String& file_name);
86
87 public:
88
89 void addReference()
90 {
91 ++m_nb_reference;
92 }
93 void removeReference()
94 {
95 --m_nb_reference;
96 if (m_nb_reference == 0)
97 delete this;
98 }
99
100 private:
101
102 UniqueArray<Real> m_values;
103 Integer m_nb_reference = 0;
104};
105
106/*---------------------------------------------------------------------------*/
107/*---------------------------------------------------------------------------*/
108
110Vector()
111: Vector(0)
112{
113}
114
115/*---------------------------------------------------------------------------*/
116/*---------------------------------------------------------------------------*/
117
120: m_impl(new VectorImpl(size))
121{
122 m_impl->addReference();
123}
124
125/*---------------------------------------------------------------------------*/
126/*---------------------------------------------------------------------------*/
127
129Vector(const Vector& v)
130: m_impl(v.m_impl)
131{
132 m_impl->addReference();
133}
134
135/*---------------------------------------------------------------------------*/
136/*---------------------------------------------------------------------------*/
137
139operator=(const Vector& rhs)
140{
141 VectorImpl* vi = rhs.m_impl;
142 vi->addReference();
143 m_impl->removeReference();
144 m_impl = vi;
145 return (*this);
146}
147
148/*---------------------------------------------------------------------------*/
149/*---------------------------------------------------------------------------*/
150
152~Vector()
153{
154 m_impl->removeReference();
155}
156
157/*---------------------------------------------------------------------------*/
158/*---------------------------------------------------------------------------*/
159
161size() const
162{
163 return m_impl->size();
164}
165
166/*---------------------------------------------------------------------------*/
167/*---------------------------------------------------------------------------*/
168
170values()
171{
172 return m_impl->values();
173}
174
175/*---------------------------------------------------------------------------*/
176/*---------------------------------------------------------------------------*/
177
179values() const
180{
181 return m_impl->values();
182}
183
184/*---------------------------------------------------------------------------*/
185/*---------------------------------------------------------------------------*/
186
188copy(const Vector& rhs)
189{
190 return m_impl->copy(*rhs.m_impl);
191}
192
193/*---------------------------------------------------------------------------*/
194/*---------------------------------------------------------------------------*/
195
197dump(std::ostream& o) const
198{
199 m_impl->dump(o);
200}
201
202/*---------------------------------------------------------------------------*/
203/*---------------------------------------------------------------------------*/
204
205Real VectorImpl::
206normInf()
207{
208 Real v = 0.0;
209 Integer size = m_values.size();
210 for (Integer i = 0; i < size; ++i) {
211 Real v2 = math::abs(m_values[i]);
212 if (v2 > v)
213 v = v2;
214 }
215 return v;
216}
217
218/*---------------------------------------------------------------------------*/
219/*---------------------------------------------------------------------------*/
220
221Real Vector::
222normInf()
223{
224 return m_impl->normInf();
225}
226
227/*---------------------------------------------------------------------------*/
228/*---------------------------------------------------------------------------*/
229
231readHypre(const String& file_name)
232{
233 std::ifstream ifile(file_name.localstr());
234 if (!ifile.good())
235 ARCANE_FATAL("Can not read Hypre vector file='{0}'", file_name);
236 Integer xmin = 0;
237 Integer xmax = 0;
238 ifile >> ws >> xmin >> ws >> xmax;
239 Integer nb = (xmax - xmin) + 1;
240 Vector vec(nb);
242 for (Integer i = 0; i < nb; ++i) {
243 Integer column_id = 0;
244 Real v = 0.0;
245 ifile >> ws >> column_id >> ws >> v;
246 values[column_id] = v;
247 }
248 return vec;
249}
250
251/*---------------------------------------------------------------------------*/
252/*---------------------------------------------------------------------------*/
253
254} // namespace Arcane::MatVec
255
256/*---------------------------------------------------------------------------*/
257/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Integer size() const
Nombre d'éléments du vecteur.
Vecteur d'algèbre linéraire.
void dump(std::ostream &o) const
Imprime les valeurs du vecteur.
Definition Vector.cc:197
static Vector readHypre(const String &file_name)
Initialise un vecteur en utilisant un fichier au format Hypre.
Definition Vector.cc:231
const Vector & operator=(const Vector &rhs)
Change la référence du vecteur.
Definition Vector.cc:139
Integer size() const
Nombre d'éléments du vecteur.
Definition Vector.cc:161
~Vector()
Supprime la référence.
Definition Vector.cc:152
VectorImpl * m_impl
Représentation interne du groupe.
RealArrayView values()
Valeurs du vecteur.
Definition Vector.cc:170
Vector()
Créé un vecteur vide.
Definition Vector.cc:110
void copy(const Vector &rhs)
Copie les éléments de rhs dans ce vecteur.
Definition Vector.cc:188
Chaîne de caractères unicode.
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:228
Vecteur 1D de données avec sémantique par valeur (style STL).
Int32 Integer
Type représentant un entier.
double Real
Type représentant un réel.
ArrayView< Real > RealArrayView
Equivalent C d'un tableau à une dimension de réels.
Definition UtilsTypes.h:459
ConstArrayView< Real > RealConstArrayView
Equivalent C d'un tableau à une dimension de réels.
Definition UtilsTypes.h:488