18#ifndef __B2VECTOR_DENSE_H__
19#define __B2VECTOR_DENSE_H__
21#include "b2linear_algebra_def.H"
24namespace b2000 {
namespace b2linalg {
27 typedef Vincrement_ref base;
28 typedef Vincrement_scale_constref const_base;
33class Vector<T, Vdense> :
public std::vector<T> {
37 Vector(
size_t s) : std::vector<T>(s) {}
39 Vector(
const Vector& v) : std::vector<T>(v) {}
41 template <
typename T1>
42 Vector(
const Vector<T1, Vdense>& v) : std::vector<T>(v.begin(), v.end()) {}
44 template <
typename T1>
45 Vector(
const Vector<T1, Vdense_constref>& v) : std::vector<T>(v.v, v.v + v.s) {}
47 template <
typename T1>
48 Vector(Vector<T1, Vdense_ref>& v) : std::vector<T>(v.v, v.v + v.s) {}
61 Vector(
const Vector<T, Vindex_scale_constref>& v_) : std::vector<T>(v_.s) {
62 for (
size_t i = 0; i != v_.s; ++i) { (*this)[i] = v_.scale * v_.v[v_.index[i]]; }
65 Vector(
const Vector<T, Vindex_constref>& v_) : std::vector<T>(v_.s) {
66 for (
size_t i = 0; i != v_.s; ++i) { (*this)[i] = v_.v[v_.index[i]]; }
69 Vector(
const Vector<T, Vindex_ref>& v_) : std::vector<T>(v_.s) {
70 for (
size_t i = 0; i != v_.s; ++i) { (*this)[i] = v_.v[v_.index[i]]; }
81 bool is_null()
const {
return this == &null; }
83 void set_zero() { std::fill(std::vector<T>::begin(), std::vector<T>::end(), 0); }
90 void reset(
const size_t size) {
92 std::ranges::fill(*
this, T{});
95 template <
typename STORAGE>
96 Vector& operator=(
const Vector<T, STORAGE>& v_) {
97 std::vector<T>::resize(v_.size());
98 Vector<T, Vincrement_ref>(*
this) = v_;
102 template <
typename STORAGE>
103 Vector& operator+=(
const Vector<T, STORAGE>& v_) {
104 Vector<T, Vincrement_ref>(*
this) = *
this + v_;
108 template <
typename STORAGE>
109 Vector& operator-=(
const Vector<T, STORAGE>& v_) {
110 Vector<T, Vincrement_ref>(*
this) = *
this - v_;
114 Vector& operator*=(T scale_) {
115 *
this = *
this * scale_;
119 template <
typename STORAGE>
120 void scale(
const Vector<T, STORAGE>& v_) {
121 if (v_.size() != this->size()) {
122 Exception() <<
"The two vectors do not have the same size." <<
THROW;
124 for (
size_t i = 0; i != this->size(); ++i) { (*this)[i] *= v_[i]; }
127 template <
typename STORAGE>
128 void scale_inv(
const Vector<T, STORAGE>& v_) {
129 if (v_.size() != this->size()) {
130 Exception() <<
"The two vectors do not have the same size." <<
THROW;
132 for (
size_t i = 0; i != this->size(); ++i) { (*this)[i] /= v_[i]; }
135 Vector<T, Vdense_ref> operator()(
const Interval& i) {
136 return Vector<T, Vdense_ref>(i.size(), &(*
this)[i[0]]);
139 Vector<T, Vdense_constref> operator()(
const Interval& i)
const {
140 return Vector<T, Vdense_constref>(i.size(), &(*
this)[i[0]]);
143 Vector<T, Vincrement_ref> operator()(
const Slice& i) {
144 return Vector<T, Vincrement_ref>(i.size(), &(*
this)[i[0]], i.increment());
147 Vector<T, Vincrement_constref> operator()(
const Slice& i)
const {
148 return Vector<T, Vincrement_constref>(i.size(), &(*
this)[i[0]], i.increment());
151 Vector<T, Vindex_ref> operator()(
const Index& i) {
152 return Vector<T, Vindex_ref>(i.size(), &(*
this)[0], &i[0]);
155 Vector<T, Vindex_constref> operator()(
const Index& i)
const {
156 return Vector<T, Vindex_constref>(i.size(), &(*
this)[0], &i[0]);
161 std::vector<T>::size(), T(1) / blas::nrm2(std::vector<T>::size(), &(*
this)[0], 1),
165 T norm2()
const {
return blas::nrm2(std::vector<T>::size(), &(*
this)[0], 1); }
169 for (
size_t i = 0; i != std::vector<T>::size(); ++i) { res = max_abs(res, (*
this)[i]); }
173 void remove(Index& idx) {
174 size_t ii = idx[0] + 1;
175 typename std::vector<T>::iterator oo = std::vector<T>::begin() + idx[0];
176 for (
size_t i = 1; i < idx.size(); ++i) {
177 oo = std::copy(std::vector<T>::begin() + ii, std::vector<T>::begin() + idx[i], oo);
180 oo = std::copy(std::vector<T>::begin() + ii, std::vector<T>::end(), oo);
181 std::vector<T>::erase(oo, std::vector<T>::end());
186 friend logging::Logger& operator<<(logging::Logger& l,
const Vector& v) {
188 l.write(v.size(), &v[0], 1);
197Vector<T, Vdense> Vector<T, Vdense>::null;
199struct Vdense_constref {
200 typedef Vincrement_scale_constref base;
201 typedef Vincrement_scale_constref const_base;
206class Vector<T, Vdense_constref> {
208 Vector() : s(0), v(0) {}
210 Vector(
size_t s_,
const T* v_) : s(s_), v(v_) {}
212 Vector(
const Vector& v_) : s(v_.s), v(v_.v) {}
214 Vector(
const Vector<T, Vdense>& v_) : s(v_.size()), v(&v_[0]) {}
216 Vector(
const Vector<T, Vdense_ref>& v_) : s(v_.s), v(v_.v) {}
218 explicit Vector(
const Matrix<T, Mrectangle_constref>& m_) : s(m_.s1 * m_.s2), v(m_.m) {}
220 bool is_null()
const {
return v == 0; }
222 size_t size()
const {
return s; }
224 const T& operator[](
size_t i)
const {
return v[i]; }
226 T norm2()
const {
return blas::nrm2(s, v, 1); }
230 for (
size_t i = 0; i != s; ++i) { res = max_abs(res, v[i]); }
234 Vector<T, Vdense_constref> operator()(
const Interval& i)
const {
235 return Vector<T, Vdense_constref>(i.size(), &v[i[0]]);
238 Vector<T, Vincrement_constref> operator()(
const Slice& i)
const {
239 return Vector<T, Vincrement_constref>(i.size(), &v[i[0]], i.increment());
242 Vector<T, Vindex_constref> operator()(
const Index& i)
const {
243 return Vector<T, Vindex_constref>(i.size(), &v[0], &i[0]);
248 friend logging::Logger& operator<<(logging::Logger& l,
const Vector& v) {
250 l.write(v.s, v.v, 1);
261Vector<T, Vdense_constref> Vector<T, Vdense_constref>::null;
264 typedef Vincrement_ref base;
265 typedef Vincrement_scale_constref const_base;
270class Vector<T, Vdense_ref> {
272 Vector() : s(0), v(0) {}
274 Vector(
size_t s_, T* v_) : s(s_), v(v_) {}
276 Vector(
const Vector& v_) : s(v_.s), v(v_.v) {}
278 Vector(Vector<T, Vdense>& v_) : s(v_.size()), v(&v_[0]) {}
280 explicit Vector(
const Matrix<T, Mrectangle_ref>& m_) : s(m_.s1 * m_.s2), v(m_.m) {}
282 Vector& operator=(
const Vector& v_) {
283 if (s != v_.s) { Exception() <<
"The two vectors do not have the same size." <<
THROW; }
284 std::copy(v_.v, v_.v + s, v);
288 bool is_null()
const {
return v == 0; }
290 size_t size()
const {
return s; }
292 void set_zero() { std::fill_n(v, s, 0); }
294 template <
typename T1,
typename STORAGE1>
295 Vector& operator=(
const Vector<T1, STORAGE1>& v_) {
296 if (v_.size() != this->size()) {
297 Exception() <<
"The two vectors do not have the same size." <<
THROW;
299 Vector<T, Vincrement_ref>(*
this) = v_;
303 template <
typename STORAGE>
304 Vector& operator+=(
const Vector<T, STORAGE>& v_) {
309 template <
typename STORAGE>
310 Vector& operator-=(
const Vector<T, STORAGE>& v_) {
311 *
this = *
this + (-v_);
315 Vector& operator*=(T scale_) {
316 *
this = *
this * scale_;
320 template <
typename STORAGE>
321 void scale(
const Vector<T, STORAGE>& v_) {
322 if (v_.size() != this->size()) {
323 Exception() <<
"The two vectors do not have the same size." <<
THROW;
325 for (
size_t i = 0; i != this->size(); ++i) { (*this)[i] *= v_[i]; }
328 template <
typename STORAGE>
329 void scale_inv(
const Vector<T, STORAGE>& v_) {
330 if (v_.size() != this->size()) {
331 Exception() <<
"The two vectors do not have the same size." <<
THROW;
333 for (
size_t i = 0; i != this->size(); ++i) { (*this)[i] /= v_[i]; }
335 const T& operator[](
size_t i)
const {
return v[i]; }
337 T& operator[](
size_t i) {
return v[i]; }
339 Vector<T, Vdense_ref> operator()(
const Interval& i) {
340 return Vector<T, Vdense_ref>(i.size(), &v[i[0]]);
343 Vector<T, Vincrement_ref> operator()(
const Slice& i) {
344 return Vector<T, Vincrement_ref>(i.size(), &v[i[0]], i.increment());
347 Vector<T, Vindex_ref> operator()(
const Index& i) {
348 return Vector<T, Vindex_ref>(i.size(), &v[0], &i[0]);
351 T norm2()
const {
return blas::nrm2(s, v, 1); }
355 for (
size_t i = 0; i != s; ++i) { res = max_abs(res, v[i]); }
361 friend logging::Logger& operator<<(logging::Logger& l,
const Vector& v) {
363 l.write(v.s, v.v, 1);
374inline b2000::csda<double> Vector<b2000::csda<double>, Vdense>::norm2()
const {
375 b2000::csda<double> n = 0;
376 for (
auto const& i : *this) { n += std::norm(i); }
381inline b2000::csda<double> Vector<b2000::csda<double>, Vdense_ref>::norm2()
const {
382 b2000::csda<double> n = 0;
383 for (
size_t i = 0; i != size(); ++i) { n += std::norm(v[i]); }
388inline b2000::csda<double> Vector<b2000::csda<double>, Vdense_constref>::norm2()
const {
389 b2000::csda<double> n = 0;
390 for (
size_t i = 0; i != size(); ++i) { n += std::norm(v[i]); }
395Vector<T, Vdense_ref> Vector<T, Vdense_ref>::null;
#define THROW
Definition b2exception.H:198
Contains the base classes for implementing Finite Elements.
Definition b2boundary_condition.H:32