Arcane  v4.1.11.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(Integer size,Real init_value)
130: m_impl(new VectorImpl(size, init_value))
131{
132 m_impl->addReference();
133}
134
135/*---------------------------------------------------------------------------*/
136/*---------------------------------------------------------------------------*/
137
139Vector(const Vector& v)
140: m_impl(v.m_impl)
141{
142 m_impl->addReference();
143}
144
145/*---------------------------------------------------------------------------*/
146/*---------------------------------------------------------------------------*/
147
149operator=(const Vector& rhs)
150{
151 VectorImpl* vi = rhs.m_impl;
152 vi->addReference();
153 m_impl->removeReference();
154 m_impl = vi;
155 return (*this);
156}
157
158/*---------------------------------------------------------------------------*/
159/*---------------------------------------------------------------------------*/
160
162~Vector()
163{
164 m_impl->removeReference();
165}
166
167/*---------------------------------------------------------------------------*/
168/*---------------------------------------------------------------------------*/
169
171size() const
172{
173 return m_impl->size();
174}
175
176/*---------------------------------------------------------------------------*/
177/*---------------------------------------------------------------------------*/
178
180values()
181{
182 return m_impl->values();
183}
184
185/*---------------------------------------------------------------------------*/
186/*---------------------------------------------------------------------------*/
187
189values() const
190{
191 return m_impl->values();
192}
193
194/*---------------------------------------------------------------------------*/
195/*---------------------------------------------------------------------------*/
196
198copy(const Vector& rhs)
199{
200 return m_impl->copy(*rhs.m_impl);
201}
202
203/*---------------------------------------------------------------------------*/
204/*---------------------------------------------------------------------------*/
205
207dump(std::ostream& o) const
208{
209 m_impl->dump(o);
210}
211
212/*---------------------------------------------------------------------------*/
213/*---------------------------------------------------------------------------*/
214
215Real VectorImpl::
216normInf()
217{
218 Real v = 0.0;
219 Integer size = m_values.size();
220 for (Integer i = 0; i < size; ++i) {
221 Real v2 = math::abs(m_values[i]);
222 if (v2 > v)
223 v = v2;
224 }
225 return v;
226}
227
228/*---------------------------------------------------------------------------*/
229/*---------------------------------------------------------------------------*/
230
231Real Vector::
232normInf()
233{
234 return m_impl->normInf();
235}
236
237/*---------------------------------------------------------------------------*/
238/*---------------------------------------------------------------------------*/
239
241readHypre(const String& file_name)
242{
243 std::ifstream ifile(file_name.localstr());
244 if (!ifile.good())
245 ARCANE_FATAL("Can not read Hypre vector file='{0}'", file_name);
246 Integer xmin = 0;
247 Integer xmax = 0;
248 ifile >> ws >> xmin >> ws >> xmax;
249 Integer nb = (xmax - xmin) + 1;
250 Vector vec(nb);
252 for (Integer i = 0; i < nb; ++i) {
253 Integer column_id = 0;
254 Real v = 0.0;
255 ifile >> ws >> column_id >> ws >> v;
256 values[column_id] = v;
257 }
258 return vec;
259}
260
261/*---------------------------------------------------------------------------*/
262/*---------------------------------------------------------------------------*/
263
264} // namespace Arcane::MatVec
265
266/*---------------------------------------------------------------------------*/
267/*---------------------------------------------------------------------------*/
#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:207
static Vector readHypre(const String &file_name)
Initialise un vecteur en utilisant un fichier au format Hypre.
Definition Vector.cc:241
const Vector & operator=(const Vector &rhs)
Change la référence du vecteur.
Definition Vector.cc:149
Integer size() const
Nombre d'éléments du vecteur.
Definition Vector.cc:171
~Vector()
Supprime la référence.
Definition Vector.cc:162
VectorImpl * m_impl
Représentation interne du groupe.
RealArrayView values()
Valeurs du vecteur.
Definition Vector.cc:180
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:198
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