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