Arcane  4.2.1.0
Developer documentation
Loading...
Searching...
No Matches
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/* Linear algebra vector. */
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#include <fstream>
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane::MatVec
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
31class VectorImpl
32{
33 public:
34
35 VectorImpl(Integer size)
36 : m_values(size)
37 , m_nb_reference(0)
38 {
39 }
40 VectorImpl(Integer size, Real init_value)
41 : m_values(size, init_value)
42 , m_nb_reference(0)
43 {
44 m_values.fill(init_value);
45 }
46 VectorImpl()
47 : m_nb_reference(0)
48 {
49 }
50 VectorImpl(RealConstArrayView v)
51 : m_values(v)
52 , m_nb_reference(0)
53 {
54 }
55 VectorImpl(const VectorImpl& rhs)
56 : m_values(rhs.m_values)
57 , m_nb_reference()
58 {
59 }
60
61 private:
62
63 void operator=(const VectorImpl& rhs);
64
65 public:
66
67 Integer size() const { return m_values.size(); }
68 RealArrayView values() { return m_values; }
69 RealConstArrayView values() const { return m_values; }
70 void dump(std::ostream& o) const
71 {
72 Integer size = m_values.size();
73 o << "(Vector ptr=" << this << " size=" << size << ")\n";
74 for (Integer i = 0; i < size; ++i)
75 o << "[" << i << "]=" << m_values[i] << '\n';
76 //o << ")";
77 }
78 VectorImpl* clone()
79 {
80 return new VectorImpl(m_values);
81 }
82 void copy(const VectorImpl& rhs)
83 {
84 m_values.copy(rhs.m_values);
85 }
86 Real normInf();
87 static Vector readHypre(const String& file_name);
88
89 public:
90
91 void addReference()
92 {
93 ++m_nb_reference;
94 }
95 void removeReference()
96 {
97 --m_nb_reference;
98 if (m_nb_reference == 0)
99 delete this;
100 }
101
102 private:
103
104 UniqueArray<Real> m_values;
105 Integer m_nb_reference = 0;
106};
107
108/*---------------------------------------------------------------------------*/
109/*---------------------------------------------------------------------------*/
110
112Vector()
113: Vector(0)
114{
115}
116
117/*---------------------------------------------------------------------------*/
118/*---------------------------------------------------------------------------*/
119
122: m_impl(new VectorImpl(size))
123{
124 m_impl->addReference();
125}
126
127/*---------------------------------------------------------------------------*/
128/*---------------------------------------------------------------------------*/
129
131Vector(Integer size, Real init_value)
132: m_impl(new VectorImpl(size, init_value))
133{
134 m_impl->addReference();
135}
136
137/*---------------------------------------------------------------------------*/
138/*---------------------------------------------------------------------------*/
139
141Vector(const Vector& v)
142: m_impl(v.m_impl)
143{
144 m_impl->addReference();
145}
146
147/*---------------------------------------------------------------------------*/
148/*---------------------------------------------------------------------------*/
149
151operator=(const Vector& rhs)
152{
153 VectorImpl* vi = rhs.m_impl;
154 vi->addReference();
155 m_impl->removeReference();
156 m_impl = vi;
157 return (*this);
158}
159
160/*---------------------------------------------------------------------------*/
161/*---------------------------------------------------------------------------*/
162
164~Vector()
165{
166 m_impl->removeReference();
167}
168
169/*---------------------------------------------------------------------------*/
170/*---------------------------------------------------------------------------*/
171
173size() const
174{
175 return m_impl->size();
176}
177
178/*---------------------------------------------------------------------------*/
179/*---------------------------------------------------------------------------*/
180
182values()
183{
184 return m_impl->values();
185}
186
187/*---------------------------------------------------------------------------*/
188/*---------------------------------------------------------------------------*/
189
191values() const
192{
193 return m_impl->values();
194}
195
196/*---------------------------------------------------------------------------*/
197/*---------------------------------------------------------------------------*/
198
200copy(const Vector& rhs)
201{
202 return m_impl->copy(*rhs.m_impl);
203}
204
205/*---------------------------------------------------------------------------*/
206/*---------------------------------------------------------------------------*/
207
209dump(std::ostream& o) const
210{
211 m_impl->dump(o);
212}
213
214/*---------------------------------------------------------------------------*/
215/*---------------------------------------------------------------------------*/
216
217Real VectorImpl::
218normInf()
219{
220 Real v = 0.0;
221 Integer size = m_values.size();
222 for (Integer i = 0; i < size; ++i) {
223 Real v2 = math::abs(m_values[i]);
224 if (v2 > v)
225 v = v2;
226 }
227 return v;
228}
229
230/*---------------------------------------------------------------------------*/
231/*---------------------------------------------------------------------------*/
232
233Real Vector::
234normInf()
235{
236 return m_impl->normInf();
237}
238
239/*---------------------------------------------------------------------------*/
240/*---------------------------------------------------------------------------*/
241
243readHypre(const String& file_name)
244{
245 std::ifstream ifile(file_name.localstr());
246 if (!ifile.good())
247 ARCANE_FATAL("Can not read Hypre vector file='{0}'", file_name);
248 Integer xmin = 0;
249 Integer xmax = 0;
250 ifile >> std::ws >> xmin >> std::ws >> xmax;
251 Integer nb = (xmax - xmin) + 1;
252 Vector vec(nb);
254 for (Integer i = 0; i < nb; ++i) {
255 Integer column_id = 0;
256 Real v = 0.0;
257 ifile >> std::ws >> column_id >> std::ws >> v;
258 values[column_id] = v;
259 }
260 return vec;
261}
262
263/*---------------------------------------------------------------------------*/
264/*---------------------------------------------------------------------------*/
265
266} // namespace Arcane::MatVec
267
268/*---------------------------------------------------------------------------*/
269/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
Integer size() const
Number of elements in the vector.
Linear algebra vector.
void dump(std::ostream &o) const
Prints the vector values.
Definition Vector.cc:209
static Vector readHypre(const String &file_name)
Initializes a vector using a Hypre format file.
Definition Vector.cc:243
const Vector & operator=(const Vector &rhs)
Changes the vector reference.
Definition Vector.cc:151
Integer size() const
Number of elements in the vector.
Definition Vector.cc:173
~Vector()
Destroys the reference.
Definition Vector.cc:164
VectorImpl * m_impl
Internal representation of the group.
RealArrayView values()
Vector values.
Definition Vector.cc:182
Vector()
Creates an empty vector.
Definition Vector.cc:112
void copy(const Vector &rhs)
Copies the elements of rhs into this vector.
Definition Vector.cc:200
const char * localstr() const
Returns the conversion of the instance into UTF-8 encoding.
Definition String.cc:229
1D data vector with value semantics (STL style).
Int32 Integer
Type representing an integer.
double Real
Type representing a real number.
ArrayView< Real > RealArrayView
C equivalent of a 1D array of reals.
Definition UtilsTypes.h:453
ConstArrayView< Real > RealConstArrayView
C equivalent of a 1D array of reals.
Definition UtilsTypes.h:482