/** * \file * \copyright * Copyright (c) 2012-2021, OpenGeoSys Community (http://www.opengeosys.org) * Distributed under a Modified BSD License. * See accompanying file LICENSE.txt or * http://www.opengeosys.org/project/license * */ #pragma once #include #include "MathLib/LinAlg/MatrixSpecifications.h" namespace NumLib { class MatrixSpecificationsProvider { public: virtual MathLib::MatrixSpecifications getMatrixSpecifications( const int process_id) const = 0; virtual ~MatrixSpecificationsProvider() = default; }; /*! Manages storage for vectors. * * This interface provides storage management semantics for vectors, which * can be acquired at a certain point in time, be released later on and * be acquired again etc. * * "Released" means that the caller indicates, that he currently does not need * that \c Vector instance, i.e, Either it is not needed anymore for the entire * program run, or it is temporarily not needed, but might be acquired again * later on. Thereby the implementation of this interface can decide, whether * the storage for the specific vector can be freed or reused in the meantime. * * All get-methods of this class come in two variants: One with an \c id argument, * and one without. The latter makes it possible to temporarily release a vector * during the program run and re-acquire it again. The former variant is intended * as a short-cut that simplifies vector acquisition for callers that will use * the same vector throughout all of their lifetime without releasing it * intermediately. * * \attention * The first time a vector is acquired by a method with \c id argument, the \c id * has to be initialized with zero. The respective method then will set the \c id * to the specific \c id of the returned vector. */ class VectorProvider { public: //! Get an uninitialized vector with the given \c id. virtual GlobalVector& getVector(std::size_t& id) = 0; //! Get a copy of \c x. virtual GlobalVector& getVector(GlobalVector const& x) = 0; //! Get a copy of \c x in the storage of the vector with the given \c id. virtual GlobalVector& getVector(GlobalVector const& x, std::size_t& id) = 0; //! Get a vector according to the given specifications. virtual GlobalVector& getVector(MathLib::MatrixSpecifications const& ms) = 0; //! Get a vector according to the given specifications in the storage //! of the vector with the given \c id. virtual GlobalVector& getVector(MathLib::MatrixSpecifications const& ms, std::size_t& id) = 0; //! Release the given vector. //! //! \pre \c x must have been acquired before, i.e., you must not call this //! method twice in a row in the same \c x! virtual void releaseVector(GlobalVector const& x) = 0; virtual ~VectorProvider() = default; }; /*! Manages storage for matrices. * * This the matrix-analog of VectorProvider. The same notes apply to this class. */ class MatrixProvider { public: //! Get an uninitialized matrix with the given \c id. virtual GlobalMatrix& getMatrix(std::size_t& id) = 0; //! Get a matrix according to the given specifications in the storage //! of the matrix with the given \c id. virtual GlobalMatrix& getMatrix(MathLib::MatrixSpecifications const& ms, std::size_t& id) = 0; //! Release the given matrix. //! //! \pre \c A must have been acquired before, i.e., you must not call this //! method twice in a row in the same \c A! virtual void releaseMatrix(GlobalMatrix const& A) = 0; virtual ~MatrixProvider() = default; }; } // namespace NumLib