OGS
NumLib::SimpleMatrixVectorProvider Class Referencefinal

Detailed Description

Manages storage for matrices and vectors.

This is a simple implementation of the MatrixProvider and VectorProvider interfaces.

It is simple insofar it does not reuse released matrices/vectors, but keeps them in memory until they are acquired again by the user.

Definition at line 22 of file SimpleMatrixVectorProvider.h.

#include <SimpleMatrixVectorProvider.h>

Inheritance diagram for NumLib::SimpleMatrixVectorProvider:
[legend]
Collaboration diagram for NumLib::SimpleMatrixVectorProvider:
[legend]

Public Member Functions

 SimpleMatrixVectorProvider ()=default
 SimpleMatrixVectorProvider (SimpleMatrixVectorProvider const &)=delete
SimpleMatrixVectorProvideroperator= (SimpleMatrixVectorProvider const &)=delete
GlobalVectorgetVector (std::size_t &id) override
 Get an uninitialized vector with the given id.
GlobalVectorgetVector (GlobalVector const &x) override
 Get a copy of x.
GlobalVectorgetVector (GlobalVector const &x, std::size_t &id) override
 Get a copy of x in the storage of the vector with the given id.
GlobalVectorgetVector (MathLib::MatrixSpecifications const &ms) override
 Get a vector according to the given specifications.
GlobalVectorgetVector (MathLib::MatrixSpecifications const &ms, std::size_t &id) override
void releaseVector (GlobalVector const &x) override
GlobalMatrixgetMatrix (std::size_t &id) override
 Get an uninitialized matrix with the given id.
GlobalMatrixgetMatrix (MathLib::MatrixSpecifications const &ms, std::size_t &id) override
void releaseMatrix (GlobalMatrix const &A) override
void clear ()
 ~SimpleMatrixVectorProvider () override
Public Member Functions inherited from NumLib::MatrixProvider
virtual ~MatrixProvider ()=default
Public Member Functions inherited from NumLib::VectorProvider
virtual ~VectorProvider ()=default

Private Member Functions

template<typename... Args>
std::pair< GlobalMatrix *, bool > getMatrix_ (std::size_t &id, Args &&... args)
template<typename... Args>
std::pair< GlobalVector *, bool > getVector_ (std::size_t &id, Args &&... args)
template<typename MatVec, typename... Args>
std::pair< MatVec *, bool > get_ (std::size_t &id, std::map< MatVec *, std::size_t > &used_map, Args &&... args)

Private Attributes

std::size_t _next_id = 1
std::map< GlobalMatrix *, std::size_t > _used_matrices
std::map< GlobalVector *, std::size_t > _used_vectors

Constructor & Destructor Documentation

◆ SimpleMatrixVectorProvider() [1/2]

NumLib::SimpleMatrixVectorProvider::SimpleMatrixVectorProvider ( )
default

◆ SimpleMatrixVectorProvider() [2/2]

NumLib::SimpleMatrixVectorProvider::SimpleMatrixVectorProvider ( SimpleMatrixVectorProvider const & )
delete

◆ ~SimpleMatrixVectorProvider()

NumLib::SimpleMatrixVectorProvider::~SimpleMatrixVectorProvider ( )
override

Definition at line 160 of file SimpleMatrixVectorProvider.cpp.

References clear().

Member Function Documentation

◆ clear()

void NumLib::SimpleMatrixVectorProvider::clear ( )

Definition at line 130 of file SimpleMatrixVectorProvider.cpp.

131{
132 if (!_used_matrices.empty())
133 {
134 WARN(
135 "There are still {:d} global matrices in use."
136 " This might be an indicator of a possible waste of memory.",
137 _used_matrices.size());
138 }
139 if (!_used_vectors.empty())
140 {
141 WARN(
142 "There are still {:d} global vectors in use."
143 " This might be an indicator of a possible waste of memory.",
144 _used_vectors.size());
145 }
146
147 for (auto const& ptr_id : _used_matrices)
148 {
149 delete ptr_id.first;
150 }
151 _used_matrices.clear();
152
153 for (auto const& ptr_id : _used_vectors)
154 {
155 delete ptr_id.first;
156 }
157 _used_vectors.clear();
158}
void WARN(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:34
std::map< GlobalMatrix *, std::size_t > _used_matrices
std::map< GlobalVector *, std::size_t > _used_vectors

References _used_matrices, _used_vectors, and WARN().

Referenced by ~SimpleMatrixVectorProvider().

◆ get_()

template<typename MatVec, typename... Args>
std::pair< MatVec *, bool > NumLib::SimpleMatrixVectorProvider::get_ ( std::size_t & id,
std::map< MatVec *, std::size_t > & used_map,
Args &&... args )
private

Definition at line 18 of file SimpleMatrixVectorProvider.cpp.

20{
21 id = _next_id++;
22 auto res =
23 used_map.emplace(MathLib::MatrixVectorTraits<MatVec>::newInstance(
24 std::forward<Args>(args)...)
25 .release(),
26 id);
27 return {res.first->first, true};
28}

References _next_id.

Referenced by getMatrix_(), and getVector_().

◆ getMatrix() [1/2]

GlobalMatrix & NumLib::SimpleMatrixVectorProvider::getMatrix ( MathLib::MatrixSpecifications const & ms,
std::size_t & id )
overridevirtual

Get a matrix according to the given specifications in the storage of the matrix with the given id.

Implements NumLib::MatrixProvider.

Definition at line 42 of file SimpleMatrixVectorProvider.cpp.

44{
45 return *getMatrix_(id, ms).first;
46 // TODO assert that the returned object always is of the right size
47}
std::pair< GlobalMatrix *, bool > getMatrix_(std::size_t &id, Args &&... args)

References getMatrix_().

◆ getMatrix() [2/2]

GlobalMatrix & NumLib::SimpleMatrixVectorProvider::getMatrix ( std::size_t & id)
overridevirtual

Get an uninitialized matrix with the given id.

Implements NumLib::MatrixProvider.

Definition at line 37 of file SimpleMatrixVectorProvider.cpp.

38{
39 return *getMatrix_(id).first;
40}

References getMatrix_().

◆ getMatrix_()

template<typename... Args>
std::pair< GlobalMatrix *, bool > NumLib::SimpleMatrixVectorProvider::getMatrix_ ( std::size_t & id,
Args &&... args )
private

Definition at line 31 of file SimpleMatrixVectorProvider.cpp.

33{
34 return get_(id, _used_matrices, std::forward<Args>(args)...);
35}
std::pair< MatVec *, bool > get_(std::size_t &id, std::map< MatVec *, std::size_t > &used_map, Args &&... args)

References _used_matrices, and get_().

Referenced by getMatrix(), and getMatrix().

◆ getVector() [1/5]

GlobalVector & NumLib::SimpleMatrixVectorProvider::getVector ( GlobalVector const & x)
overridevirtual

Get a copy of x.

Implements NumLib::VectorProvider.

Definition at line 92 of file SimpleMatrixVectorProvider.cpp.

93{
94 std::size_t id = 0u;
95 auto const& res = getVector_(id, x);
96 if (!res.second)
97 { // no new object has been created
98 LinAlg::copy(x, *res.first);
99 }
100 return *res.first;
101}
std::pair< GlobalVector *, bool > getVector_(std::size_t &id, Args &&... args)
void copy(PETScVector const &x, PETScVector &y)
Definition LinAlg.cpp:30

References MathLib::LinAlg::copy(), and getVector_().

◆ getVector() [2/5]

GlobalVector & NumLib::SimpleMatrixVectorProvider::getVector ( GlobalVector const & x,
std::size_t & id )
overridevirtual

Get a copy of x in the storage of the vector with the given id.

Implements NumLib::VectorProvider.

Definition at line 103 of file SimpleMatrixVectorProvider.cpp.

105{
106 auto const& res = getVector_(id, x);
107 if (!res.second)
108 { // no new object has been created
109 LinAlg::copy(x, *res.first);
110 }
111 return *res.first;
112}

References MathLib::LinAlg::copy(), and getVector_().

◆ getVector() [3/5]

GlobalVector & NumLib::SimpleMatrixVectorProvider::getVector ( MathLib::MatrixSpecifications const & ms)
overridevirtual

Get a vector according to the given specifications.

Implements NumLib::VectorProvider.

Definition at line 77 of file SimpleMatrixVectorProvider.cpp.

79{
80 std::size_t id = 0u;
81 return *getVector_(id, ms).first;
82 // TODO assert that the returned object always is of the right size
83}

References getVector_().

◆ getVector() [4/5]

GlobalVector & NumLib::SimpleMatrixVectorProvider::getVector ( MathLib::MatrixSpecifications const & ms,
std::size_t & id )
overridevirtual

Get a vector according to the given specifications in the storage of the vector with the given id.

Implements NumLib::VectorProvider.

Definition at line 85 of file SimpleMatrixVectorProvider.cpp.

87{
88 return *getVector_(id, ms).first;
89 // TODO assert that the returned object always is of the right size
90}

References getVector_().

◆ getVector() [5/5]

GlobalVector & NumLib::SimpleMatrixVectorProvider::getVector ( std::size_t & id)
overridevirtual

Get an uninitialized vector with the given id.

Implements NumLib::VectorProvider.

Definition at line 72 of file SimpleMatrixVectorProvider.cpp.

73{
74 return *getVector_(id).first;
75}

References getVector_().

◆ getVector_()

template<typename... Args>
std::pair< GlobalVector *, bool > NumLib::SimpleMatrixVectorProvider::getVector_ ( std::size_t & id,
Args &&... args )
private

Definition at line 66 of file SimpleMatrixVectorProvider.cpp.

68{
69 return get_(id, _used_vectors, std::forward<Args>(args)...);
70}

References _used_vectors, and get_().

Referenced by getVector(), getVector(), getVector(), getVector(), and getVector().

◆ operator=()

SimpleMatrixVectorProvider & NumLib::SimpleMatrixVectorProvider::operator= ( SimpleMatrixVectorProvider const & )
delete

◆ releaseMatrix()

void NumLib::SimpleMatrixVectorProvider::releaseMatrix ( GlobalMatrix const & A)
overridevirtual

Release the given matrix.

Precondition
A must have been acquired before, i.e., you must not call this method twice in a row in the same A!

Implements NumLib::MatrixProvider.

Definition at line 49 of file SimpleMatrixVectorProvider.cpp.

50{
51 auto it = _used_matrices.find(const_cast<GlobalMatrix*>(&A));
52 if (it == _used_matrices.end())
53 {
55 "The given matrix has not been found. Cannot release it. "
56 "Aborting.");
57 }
58 else
59 {
60 delete it->first;
61 _used_matrices.erase(it);
62 }
63}
#define OGS_FATAL(...)
Definition Error.h:19
MathLib::EigenMatrix GlobalMatrix

References _used_matrices, and OGS_FATAL.

◆ releaseVector()

void NumLib::SimpleMatrixVectorProvider::releaseVector ( GlobalVector const & x)
overridevirtual

Release the given vector.

Precondition
x must have been acquired before, i.e., you must not call this method twice in a row in the same x!

Implements NumLib::VectorProvider.

Definition at line 114 of file SimpleMatrixVectorProvider.cpp.

115{
116 auto it = _used_vectors.find(const_cast<GlobalVector*>(&x));
117 if (it == _used_vectors.end())
118 {
119 OGS_FATAL(
120 "The given vector has not been found. Cannot release it. "
121 "Aborting.");
122 }
123 else
124 {
125 delete it->first;
126 _used_vectors.erase(it);
127 }
128}
MathLib::EigenVector GlobalVector

References _used_vectors, and OGS_FATAL.

Member Data Documentation

◆ _next_id

std::size_t NumLib::SimpleMatrixVectorProvider::_next_id = 1
private

Definition at line 70 of file SimpleMatrixVectorProvider.h.

Referenced by get_().

◆ _used_matrices

std::map<GlobalMatrix*, std::size_t> NumLib::SimpleMatrixVectorProvider::_used_matrices
private

Definition at line 72 of file SimpleMatrixVectorProvider.h.

Referenced by clear(), getMatrix_(), and releaseMatrix().

◆ _used_vectors

std::map<GlobalVector*, std::size_t> NumLib::SimpleMatrixVectorProvider::_used_vectors
private

Definition at line 74 of file SimpleMatrixVectorProvider.h.

Referenced by clear(), getVector_(), and releaseVector().


The documentation for this class was generated from the following files: